refactor(pickers): collapse close-* into polymorphic close on 5 picker morfos

Mirror of the dialog/drawer/popover refactor (book §5.3) applied to the
picker family:

- color-picker
- date-picker
- date-range-picker (incl. close-range-commit cause)
- time-picker
- time-range-picker

Each had 4 close-* events with per-event prewrite; collapsed to a single
polymorphic `close` event:

  semantic: {
    family: 'emerge', verb: 'close', target: v.partRef('calendar'|'clock'|'content'),
    sequence: 'pre', persistence: 'transient',
    allowedFamilies: ['emerge', 'commit', 'signal']
  }

**Behaviour preserved**: the picker providers don't currently fire any
`runtime.trigger('close*')` — they just toggle `opts.open = false` and
let the popover unmount. The previous `close-*` events were declared but
inert (only consumed by schema validator + compiler tests). Refactor is
doctrinal alignment, not behavioural change.

**Sema cascade**: only color-picker has a sema pack and it did not
reference any close-* event (only handle-pick / handle-drag /
commit-set). Zero cascade updates needed.

**Test fixtures**: compile.test.ts + runtime.svelte.test.ts already
migrated to the synthetic `prewriteFixtureMorfo` in the core commit,
so this refactor doesn't break them.

After this commit the only morfo with the pre-polymorphic per-event
prewrite shape is the synthetic test fixture itself — every production
morfo is on the polymorphic close.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
active-uix
dev 5 months ago
parent 9f5fbfdb71
commit 8dce794ab4

@ -31,66 +31,24 @@ export const colorPickerMorfo = {
} }
}, },
{ {
name: 'close-commit', // Polymorphic close (book §5.3) — mirror of Dialog / Drawer /
semantic: { // Popover. Provider-set `data-last-action` ('committed' /
family: 'commit', // 'cancelled' / 'dismissed' / 'dismissed-outside') discriminates
verb: 'save', // the cause; the picker shell's commit/cancel/clear handle uses
target: v.partRef('content'), // `runtime.trigger('close', { semantic })` if it ever fires
sequence: 'post', // these events (today the provider just sets `opts.open =
intent: 'fulfill' // false` and lets the popover unmount). Persistence transient —
}, // the popover disappears.
regime: 'lock', name: 'close',
prewrite: [{ part: v.partRef('content'), attr: 'data-last-action', value: 'committed' }],
commits: {
part: v.partRef('content'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-cancel',
semantic: { semantic: {
family: 'emerge', family: 'emerge',
verb: 'close', verb: 'close',
target: v.partRef('content'), target: v.partRef('content'),
sequence: 'pre' sequence: 'pre',
}, persistence: 'transient',
regime: 'lock', allowedFamilies: ['emerge', 'commit', 'signal']
prewrite: [{ part: v.partRef('content'), attr: 'data-last-action', value: 'cancelled' }],
commits: {
part: v.partRef('content'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('content'),
sequence: 'pre'
},
regime: 'lock',
prewrite: [{ part: v.partRef('content'), attr: 'data-last-action', value: 'dismissed' }],
commits: {
part: v.partRef('content'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss-outside',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('content'),
sequence: 'pre'
}, },
regime: 'lock', regime: 'lock',
prewrite: [
{ part: v.partRef('content'), attr: 'data-last-action', value: 'dismissed-outside' }
],
commits: { commits: {
part: v.partRef('content'), part: v.partRef('content'),
attr: 'data-state', attr: 'data-state',

@ -40,75 +40,23 @@ export const datePickerMorfo = {
} }
}, },
{ {
// The user committed a date and the popover closed. // Polymorphic close (book §5.3) — mirror of color-picker /
// `fulfill` because the picker's job — pick a date — is done. // dialog. Provider-set `data-last-action` ('committed' /
name: 'close-commit', // 'cancelled' / 'dismissed' / 'dismissed-outside') discriminates
semantic: { // the cause. Today's date-picker provider just toggles
family: 'commit', // `opts.open`; if it ever explicitly calls
verb: 'save', // `runtime.trigger('close', { semantic })`, the polymorphic
target: v.partRef('calendar'), // shape is ready.
sequence: 'post', name: 'close',
intent: 'fulfill'
},
regime: 'lock',
prewrite: [{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'committed' }],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Explicit cancel from a Save/Cancel button (modal mode).
name: 'close-cancel',
semantic: { semantic: {
family: 'emerge', family: 'emerge',
verb: 'close', verb: 'close',
target: v.partRef('calendar'), target: v.partRef('calendar'),
sequence: 'pre' sequence: 'pre',
}, persistence: 'transient',
regime: 'lock', allowedFamilies: ['emerge', 'commit', 'signal']
prewrite: [{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'cancelled' }],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Escape key.
name: 'close-dismiss',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('calendar'),
sequence: 'pre'
},
regime: 'lock',
prewrite: [{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'dismissed' }],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Click outside the popover.
name: 'close-dismiss-outside',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('calendar'),
sequence: 'pre'
}, },
regime: 'lock', regime: 'lock',
prewrite: [
{
part: v.partRef('calendar'),
attr: 'data-last-action',
value: 'dismissed-outside'
}
],
commits: { commits: {
part: v.partRef('calendar'), part: v.partRef('calendar'),
attr: 'data-state', attr: 'data-state',

@ -40,81 +40,20 @@ export const dateRangePickerMorfo = {
} }
}, },
{ {
// The user committed a complete range and the popover closed. // Polymorphic close (book §5.3). Provider-set `data-last-action`
// `fulfill` because the picker's job — pick a complete range — is done. // values: 'range-committed' (Save when range complete) /
name: 'close-range-commit', // 'cancelled' (Cancel button) / 'dismissed' (Escape) /
semantic: { // 'dismissed-outside' (click outside).
family: 'commit', name: 'close',
verb: 'save',
target: v.partRef('calendar'),
sequence: 'post',
intent: 'fulfill'
},
regime: 'lock',
prewrite: [
{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'range-committed' }
],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Explicit cancel from a Save/Cancel button (modal mode).
name: 'close-cancel',
semantic: { semantic: {
family: 'emerge', family: 'emerge',
verb: 'close', verb: 'close',
target: v.partRef('calendar'), target: v.partRef('calendar'),
sequence: 'pre' sequence: 'pre',
}, persistence: 'transient',
regime: 'lock', allowedFamilies: ['emerge', 'commit', 'signal']
prewrite: [
{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'cancelled' }
],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Escape key.
name: 'close-dismiss',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('calendar'),
sequence: 'pre'
},
regime: 'lock',
prewrite: [
{ part: v.partRef('calendar'), attr: 'data-last-action', value: 'dismissed' }
],
commits: {
part: v.partRef('calendar'),
attr: 'data-state',
value: 'closed'
}
},
{
// Click outside the popover.
name: 'close-dismiss-outside',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('calendar'),
sequence: 'pre'
}, },
regime: 'lock', regime: 'lock',
prewrite: [
{
part: v.partRef('calendar'),
attr: 'data-last-action',
value: 'dismissed-outside'
}
],
commits: { commits: {
part: v.partRef('calendar'), part: v.partRef('calendar'),
attr: 'data-state', attr: 'data-state',

@ -49,70 +49,19 @@ export const timePickerMorfo = {
} }
}, },
{ {
name: 'close-commit', // Polymorphic close (book §5.3). Provider-set `data-last-action`
semantic: { // ('committed' / 'cancelled' / 'dismissed' / 'dismissed-outside')
family: 'commit', // discriminates the cause.
verb: 'save', name: 'close',
target: v.partRef('clock'),
sequence: 'post',
intent: 'fulfill'
},
regime: 'lock',
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'committed' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-cancel',
semantic: { semantic: {
family: 'emerge', family: 'emerge',
verb: 'close', verb: 'close',
target: v.partRef('clock'), target: v.partRef('clock'),
sequence: 'pre' sequence: 'pre',
}, persistence: 'transient',
regime: 'lock', allowedFamilies: ['emerge', 'commit', 'signal']
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'cancelled' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('clock'),
sequence: 'pre'
},
regime: 'lock',
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'dismissed' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss-outside',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('clock'),
sequence: 'pre'
}, },
regime: 'lock', regime: 'lock',
prewrite: [
{
part: v.partRef('clock'),
attr: 'data-last-action',
value: 'dismissed-outside'
}
],
commits: { commits: {
part: v.partRef('clock'), part: v.partRef('clock'),
attr: 'data-state', attr: 'data-state',

@ -50,70 +50,18 @@ export const timeRangePickerMorfo = {
} }
}, },
{ {
name: 'close-commit', // Polymorphic close (book §5.3). Provider-set `data-last-action`
semantic: { // ('committed' / 'cancelled' / 'dismissed' / 'dismissed-outside').
family: 'commit', name: 'close',
verb: 'save',
target: v.partRef('clock'),
sequence: 'post',
intent: 'fulfill'
},
regime: 'lock',
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'committed' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-cancel',
semantic: { semantic: {
family: 'emerge', family: 'emerge',
verb: 'close', verb: 'close',
target: v.partRef('clock'), target: v.partRef('clock'),
sequence: 'pre' sequence: 'pre',
}, persistence: 'transient',
regime: 'lock', allowedFamilies: ['emerge', 'commit', 'signal']
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'cancelled' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('clock'),
sequence: 'pre'
},
regime: 'lock',
prewrite: [{ part: v.partRef('clock'), attr: 'data-last-action', value: 'dismissed' }],
commits: {
part: v.partRef('clock'),
attr: 'data-state',
value: 'closed'
}
},
{
name: 'close-dismiss-outside',
semantic: {
family: 'emerge',
verb: 'dismiss',
target: v.partRef('clock'),
sequence: 'pre'
}, },
regime: 'lock', regime: 'lock',
prewrite: [
{
part: v.partRef('clock'),
attr: 'data-last-action',
value: 'dismissed-outside'
}
],
commits: { commits: {
part: v.partRef('clock'), part: v.partRef('clock'),
attr: 'data-state', attr: 'data-state',

Loading…
Cancel
Save

Powered by TurnKey Linux.