diff --git a/src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md b/src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md index c00ad2bda..344c823a0 100644 --- a/src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md +++ b/src/docs/LIBRO_VARIACIONES_Y_EXTENSIONES.md @@ -155,17 +155,13 @@ Estos verbos están en `src/uix/sema/verbs.ts:SEMA_VERBS` pero NO aparecen en la Hoy ~35 events siguen como warns en `morfo:vocabulary` porque el verbo declarado es canónico pero el `name` no parsea a `{family}-{verb}`. Detrás de los renames cosméticos hay PREGUNTAS DOCTRINALES: -### C.1 "Clear" como concepto +### C.1 "Clear" como concepto — RESUELTO como `commit.reset` -- **10 componentes** usan eventos llamados `commit-clear`: color-picker, date-field, date-picker, date-range-picker, file-upload, range-calendar, tag-group, tags-input, time-picker, time-range-picker. -- **Libro Cap 23 §5** lista para "revocación/cancelación": `cancel, reset, discard, expire`. **`clear` no aparece.** -- **Posibles mapeos**: - - `reset` = volver a estado inicial (date-field con default vuelve al default) - - `discard` = tirar el valor actual (tag-group con tags se queda sin tags) - - `cancel` = revocar operación en curso (no encaja para clear) -- **Pregunta para el libro**: - - (a) ¿Añadir `clear` como verbo canónico distinto de reset/discard? - - (b) ¿Mantener tres verbos y obligar a consumidores a elegir reset vs discard según contexto? +- **Status**: Resuelto por el autor el 2026-05-25. Los 10 componentes ahora emiten `commit-reset` con `verb: 'reset'` canónico del libro. +- **10 componentes** afectados: color-picker, date-field, date-picker, date-range-picker, file-upload, range-calendar, tag-group, tags-input, time-picker, time-range-picker. +- **Libro Cap 23 §5** lista `reset` como verbo canónico ("vuelve a estado inicial"). Encaja para todos los casos del cluster: cada uno está volviendo a estado vacío inicial (no defaults significativos que se descartan). +- **Decisión tomada**: `commit.reset` con name canónico `commit-reset` (sin variant — no hay ambigüedad de múltiples resets en ningún componente del cluster). Verbo `'remove'` mal-declarado en range-calendar también corregido a `'reset'`. +- **Decisión pendiente para el libro**: ninguna. La doctrina del libro literal cubre exactamente el caso. Se podría añadir mención explícita de "clear de un campo" como ejemplo de `commit.reset` en una próxima edición. ### C.2 "Unselect" como concepto diff --git a/src/uix/morfo/components/color-picker.ts b/src/uix/morfo/components/color-picker.ts index 728b3ec70..9c1860757 100644 --- a/src/uix/morfo/components/color-picker.ts +++ b/src/uix/morfo/components/color-picker.ts @@ -98,7 +98,7 @@ export const colorPickerMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/date-field.ts b/src/uix/morfo/components/date-field.ts index 1c2543a42..046726980 100644 --- a/src/uix/morfo/components/date-field.ts +++ b/src/uix/morfo/components/date-field.ts @@ -21,7 +21,7 @@ export const dateFieldMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/date-picker.ts b/src/uix/morfo/components/date-picker.ts index c3a156b8c..6308f347f 100644 --- a/src/uix/morfo/components/date-picker.ts +++ b/src/uix/morfo/components/date-picker.ts @@ -116,7 +116,7 @@ export const datePickerMorfo = { }, { // User cleared the date (explicit clear button or backspace). - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/date-range-picker.ts b/src/uix/morfo/components/date-range-picker.ts index 870544416..841eee6e6 100644 --- a/src/uix/morfo/components/date-range-picker.ts +++ b/src/uix/morfo/components/date-range-picker.ts @@ -122,7 +122,7 @@ export const dateRangePickerMorfo = { }, { // User cleared the range (explicit clear button or backspace). - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/file-upload.ts b/src/uix/morfo/components/file-upload.ts index 40280bdc5..ef7a3a8d8 100644 --- a/src/uix/morfo/components/file-upload.ts +++ b/src/uix/morfo/components/file-upload.ts @@ -53,7 +53,7 @@ export const fileUploadMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/range-calendar.ts b/src/uix/morfo/components/range-calendar.ts index 2a1dcbb88..7b9d1d6c0 100644 --- a/src/uix/morfo/components/range-calendar.ts +++ b/src/uix/morfo/components/range-calendar.ts @@ -34,10 +34,10 @@ export const rangeCalendarMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', - verb: 'remove', + verb: 'reset', target: v.partRef('day'), intent: 'neutral', sequence: 'post' diff --git a/src/uix/morfo/components/tag-group.ts b/src/uix/morfo/components/tag-group.ts index 6cff27b45..4a4732f02 100644 --- a/src/uix/morfo/components/tag-group.ts +++ b/src/uix/morfo/components/tag-group.ts @@ -41,7 +41,7 @@ export const tagGroupMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/tags-input.ts b/src/uix/morfo/components/tags-input.ts index 8998f20f9..72f980b1d 100644 --- a/src/uix/morfo/components/tags-input.ts +++ b/src/uix/morfo/components/tags-input.ts @@ -42,7 +42,7 @@ export const tagsInputMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/time-picker.ts b/src/uix/morfo/components/time-picker.ts index 91b80b8ee..4bd0bb876 100644 --- a/src/uix/morfo/components/time-picker.ts +++ b/src/uix/morfo/components/time-picker.ts @@ -119,7 +119,7 @@ export const timePickerMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/morfo/components/time-range-picker.ts b/src/uix/morfo/components/time-range-picker.ts index 01f2b0554..ee8a23b93 100644 --- a/src/uix/morfo/components/time-range-picker.ts +++ b/src/uix/morfo/components/time-range-picker.ts @@ -120,7 +120,7 @@ export const timeRangePickerMorfo = { } }, { - name: 'commit-clear', + name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', diff --git a/src/uix/sema/components/date-field.ts b/src/uix/sema/components/date-field.ts index 743127ea3..7b8d4bff4 100644 --- a/src/uix/sema/components/date-field.ts +++ b/src/uix/sema/components/date-field.ts @@ -15,7 +15,7 @@ export const dateFieldSema: Sema = { haptic: { kind: 'tap' } }, { - selector: onProvider({ eventName: 'commit-clear' }), + selector: onProvider({ eventName: 'commit-reset' }), sound: soundTuning('form.commit.subtle', { contour: 'descending', pitch: { op: 'add', value: -80 } diff --git a/src/uix/sema/components/file-upload.ts b/src/uix/sema/components/file-upload.ts index f1d5f9fce..8cfd888ce 100644 --- a/src/uix/sema/components/file-upload.ts +++ b/src/uix/sema/components/file-upload.ts @@ -42,7 +42,7 @@ export const fileUploadSema: Sema = { haptic: { kind: 'tap' } }, { - selector: onProvider({ eventName: 'commit-clear' }), + selector: onProvider({ eventName: 'commit-reset' }), sound: soundTuning('form.commit.subtle', { contour: 'descending', pitch: { op: 'add', value: -100 } diff --git a/src/uix/sema/components/tag-group.ts b/src/uix/sema/components/tag-group.ts index 3d9f2b759..1b8b8243d 100644 --- a/src/uix/sema/components/tag-group.ts +++ b/src/uix/sema/components/tag-group.ts @@ -31,7 +31,7 @@ export const tagGroupSema: Sema = { haptic: { kind: 'tap' } }, { - selector: onProvider({ eventName: 'commit-clear' }), + selector: onProvider({ eventName: 'commit-reset' }), sound: soundTuning('form.commit.subtle', { contour: 'descending', pitch: { op: 'add', value: -100 } diff --git a/src/uix/sema/components/tags-input.ts b/src/uix/sema/components/tags-input.ts index d81291b9e..cfa728f2f 100644 --- a/src/uix/sema/components/tags-input.ts +++ b/src/uix/sema/components/tags-input.ts @@ -37,7 +37,7 @@ export const tagsInputSema: Sema = { haptic: { kind: 'tap' } }, { - selector: onProvider({ eventName: 'commit-clear' }), + selector: onProvider({ eventName: 'commit-reset' }), sound: soundTuning('form.commit.subtle', { contour: 'descending', pitch: { op: 'add', value: -100 } diff --git a/src/uix/soma/components/date-field/date-field-provider.svelte.ts b/src/uix/soma/components/date-field/date-field-provider.svelte.ts index 2047774e9..0100ecc0c 100644 --- a/src/uix/soma/components/date-field/date-field-provider.svelte.ts +++ b/src/uix/soma/components/date-field/date-field-provider.svelte.ts @@ -781,7 +781,7 @@ export class DateFieldProvider { } const nextValue = this.opts.value.current?.toString(); if (previousValue !== nextValue) { - void this.runtime.trigger(nextValue === undefined ? 'commit-clear' : 'commit-set'); + void this.runtime.trigger(nextValue === undefined ? 'commit-reset' : 'commit-set'); } } diff --git a/src/uix/soma/components/file-upload/file-upload-provider.svelte.ts b/src/uix/soma/components/file-upload/file-upload-provider.svelte.ts index a7d9d7e87..f77803b54 100644 --- a/src/uix/soma/components/file-upload/file-upload-provider.svelte.ts +++ b/src/uix/soma/components/file-upload/file-upload-provider.svelte.ts @@ -206,7 +206,7 @@ export class FileUploadProvider { if (this.isDisabled) return; this.opts.files.current = []; this.opts.onFilesChange.current?.([]); - void this.runtime.trigger('commit-clear', target ? { fallbackTarget: target } : undefined); + void this.runtime.trigger('commit-reset', target ? { fallbackTarget: target } : undefined); } readonly props = $derived.by(() => diff --git a/src/uix/soma/components/range-calendar/range-calendar-provider.svelte.ts b/src/uix/soma/components/range-calendar/range-calendar-provider.svelte.ts index 62d9bca5a..49e9b4ac4 100644 --- a/src/uix/soma/components/range-calendar/range-calendar-provider.svelte.ts +++ b/src/uix/soma/components/range-calendar/range-calendar-provider.svelte.ts @@ -408,7 +408,7 @@ export class RangeCalendarProvider { this.anchor = undefined; this.previewDate = undefined; this.opts.value.current = { start: undefined, end: undefined }; - void this.runtime.trigger('commit-clear', target ? { fallbackTarget: target } : undefined); + void this.runtime.trigger('commit-reset', target ? { fallbackTarget: target } : undefined); } private clearEndSelection(target?: HTMLElement): void { @@ -421,7 +421,7 @@ export class RangeCalendarProvider { this.anchor = start; this.previewDate = undefined; this.opts.value.current = { start, end: undefined }; - void this.runtime.trigger('commit-clear', target ? { fallbackTarget: target } : undefined); + void this.runtime.trigger('commit-reset', target ? { fallbackTarget: target } : undefined); } private clearStartSelection(target?: HTMLElement): void { @@ -434,7 +434,7 @@ export class RangeCalendarProvider { this.anchor = end; this.previewDate = undefined; this.opts.value.current = { start: undefined, end }; - void this.runtime.trigger('commit-clear', target ? { fallbackTarget: target } : undefined); + void this.runtime.trigger('commit-reset', target ? { fallbackTarget: target } : undefined); } private commit(a: DateValue, b: DateValue, target?: HTMLElement): void { diff --git a/src/uix/soma/components/tag-group/tag-group-provider.svelte.test.ts b/src/uix/soma/components/tag-group/tag-group-provider.svelte.test.ts index a9c679f78..10510ef91 100644 --- a/src/uix/soma/components/tag-group/tag-group-provider.svelte.test.ts +++ b/src/uix/soma/components/tag-group/tag-group-provider.svelte.test.ts @@ -368,7 +368,7 @@ describe('TagGroupProvider', () => { await Promise.resolve(); expect(sem.calls.at(-1)).toMatchObject({ target: root, - name: 'commit-clear', + name: 'commit-reset', family: 'commit', intent: 'neutral' }); diff --git a/src/uix/soma/components/tag-group/tag-group-provider.svelte.ts b/src/uix/soma/components/tag-group/tag-group-provider.svelte.ts index cd1f2a4bd..012326ddf 100644 --- a/src/uix/soma/components/tag-group/tag-group-provider.svelte.ts +++ b/src/uix/soma/components/tag-group/tag-group-provider.svelte.ts @@ -152,7 +152,7 @@ export class TagGroupProvider { if (this.opts.value.current.length === 0) return; this.opts.value.current = []; this.opts.onValueChange.current?.([]); - void this.runtime.trigger('commit-clear', target ? { fallbackTarget: target } : undefined); + void this.runtime.trigger('commit-reset', target ? { fallbackTarget: target } : undefined); } // ── Keyboard ──────────────────────────────────────────────────────────── diff --git a/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts b/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts index 1579ef8fb..f6d5c221f 100644 --- a/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts +++ b/src/uix/soma/components/tags-input/tags-input-provider.svelte.ts @@ -157,7 +157,7 @@ export class TagsInputProvider { if (this.opts.value.current.length === 0) return; this.opts.value.current = []; this.highlightedIndex = -1; - void this.runtime.trigger('commit-clear', { + void this.runtime.trigger('commit-reset', { fallbackTarget: target ?? this.opts.ref?.current ?? undefined }); }