docs(CONTINUE): refresh for next session — Button + canonical demos done; #118 #120 open

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

@ -1,68 +1,86 @@
# Continue tomorrow # Continue tomorrow
Fecha de corte: 2026-05-22. Rama: `active-uix`. Fecha de corte: 2026-05-23. Rama: `active-uix`.
## Resumen del día ## Resumen del día
Auditoría + mejoras a 6 componentes form (select, field, editable, number-field, search-field, combobox). Sprint de demos canonical-depth + Button component + picker recipe polish.
Commits clave: `ffdb4804` → `df948aa3`. Todos los componentes pasaron `svelte-check` 0/0 al cerrar. Commit clave: `a804c392` (49 archivos, +11034/-1365). `svelte-check`: 0/0.
## Pendiente / en curso **Hecho:**
### 1. Normalización del width del popover (task #105, prioridad alta) - **Demos rebuilt a canonical depth (9):** context-menu, dropdown-menu, pin-input,
alert-dialog, toggle-group, color-field, time-field, time-picker, time-range-picker,
color-picker, month-grid, year-grid. Cada demo con per-part Morfo contracts iterando
raw morfo, reference parity tables (Radix/bits-ui/ark-ui/Chakra/Mantine/react-aria),
keyboard + ARIA contract tables, composition controls.
**Hecho:** - **Nuevo `<Button>` (eidos):** morfo + soma + sema + eidos + demo canonical.
- `src/uix/eidos/components/popover/popover.css` emite `min-inline-size: var(--floating-anchor-width, auto)` como default → popover ≥ anchor para TODOS los popover-based. 6 variants (solid/soft/surface/outline/ghost/plain), 8 colors, 5 sizes,
- `sideOffset` unificado a 6 en soma popover-content y en los 5 pickers (date / date-range / time / time-range / color). loading state + Spinner, icon/endIcon snippets, asChild Slot pattern.
Sema `commit-action` con intent fromProp.
**Pendiente:** los pickers anclan al chevron trigger (~14px), no al input wrapper (~448px). Por eso `--floating-anchor-width` resuelve a 14px y el `min-inline-size` no actúa visible. - **PickerShell refactor:** Clear/Cancel/Close ahora usan `<Button size="xs">`.
Afecta 5 pickers (date / date-range / time / time-range / color). CSS chrome
redundante eliminada de picker-shell.css; layout mantenido (gap, margin auto).
**Patrón verificado vs Ark / Radix / shadcn / React Aria:** - **Time picker polish:** popover condensado (min 18→14 / 32→28rem), per-channel
- Select / Combobox → anchor = trigger button (ya correcto). accent (hour=primary, minute=secondary, second=neutral, end variant muted),
- Pickers compuestos (date/time/color + range) → anchor = **input wrapper** (falta). ruler OFF por defecto, hour ruler limpio (0/6/12/18/23 sin "21/23" pegados).
**Implementación (Approach A, soma-side):** - **Color picker polish:** typography token `--_color-picker-trigger-font-size`
- En cada picker provider (`src/uix/soma/components/{date,time,color}-picker/*-provider.svelte.ts`), exponer `inputRef`. escala con `data-size` (10/12/14px); `autoFormat` default true (popover
- El `*-input.svelte` wrapper registra `provider.inputRef.current = el` en mount. FormatSelect driving Trigger ValueText). Composition toggles para Hue / Alpha /
- Donde el popover hace `FloatingContent.use({ customAnchor: ... })`, usar `inputRef.current` si existe, sino `triggerRef.current`. ChannelInput / FormatSelect / EyeDropper / Swatches / Label / ValueText.
Area recipe `[data-x-channel='hue']` → rainbow horizontal con overlays
adaptados al y-channel; auto-switch a `{x: hue, y: saturation}` cuando el
Hue slider está oculto.
**Verificación:** abrir popover, comprobar que `getComputedStyle(wrapper).getPropertyValue('--floating-anchor-width')` == ancho del input wrapper, no del chevron. - **Bug fix:** ValueText eidos wrapper creaba un children snippet implícito
vacío que bloqueaba el fallback de soma. Fix con split condicional
`{#if children}` que aplica a cualquier wrapper con soma fallback.
### 2. Combobox multi mode con tags inline - **Date field segment affordance:** cursor + hover bg + active ring via
`--_date-field-accent-element` token añadido a las 8 color cascades.
Decisión del usuario: patrón Material UI Autocomplete — items seleccionados como pills DENTRO del input, caret al final. ## Pendiente / en curso
**Pendiente:** ### 1. Task #118 — Shared check/radio indicator recipe
- Añadir `Combobox.SelectedTags` part al morfo (kebab `selected-tags`, archetype `group`, optional).
- Soma: `ComboboxSelectedTagsProvider` que renderiza un pill por value con X para eliminar.
- Eidos: wrapper + CSS — tags + `<input>` en flex container con `flex-wrap`.
- Backspace en input vacío ya elimina último tag (commit C4 del audit, ya en main).
- Demo: ejemplo en multi mode.
**Notas técnicas:** **Problema:** los recipes `[data-checkbox][data-state='checked']`,
- El `$effect` actual del provider sync inputValue al label SOLO en single mode. Para multi NO se debe tocar inputValue (filter activo). `[data-context-menu-checkbox-item][data-state='checked']::before` y
- Mi patch anterior de "stamp labels on close" en multi fue **revertido**. El sync queda en cargo de SelectedTags. `[data-dropdown-menu-checkbox-item][data-state='checked']::before` redibujan
los indicadores (palomita rounded square / círculo radio) en bloques separados.
### 3. SearchField como Combobox-like **Plan:**
- Crear un partial / sub-recipe compartido (e.g. `src/uix/eidos/lib/recipes/indicator.css` o sub-mixin en base.ts) con la geometría del check / radio dot.
- Importar desde checkbox.css, context-menu.css, dropdown-menu.css.
- Verificar también `Select.OptionIndicator` y `RadioGroup.Indicator` si aplican.
Decisión del usuario: SearchField debe tener layer flotante con results clickables. **No fusionar los componentes** — Checkbox / MenuCheckboxItem / MenuRadioItem son primitivas ARIA distintas (`role="checkbox"` vs `role="menuitemcheckbox"` vs `role="menuitemradio"`) con keyboard models distintos. Solo unificar el indicador visual.
**Opciones:** ### 2. Task #120 — Refactor restantes consumidores a `<Button>`
- **A** (elegida): añadir `SearchField.Results` part con popover propio (items clickables emiten `commit-select`).
- B (descartada): documentar y reusar Combobox.
Pendiente. **Hecho:** PickerShell.Clear/Cancel/Close (5 pickers).
### 4. Combobox: revisar effect de single-mode label sync al mezclar con tags inline **Pendiente:**
- `DropdownMenu.Trigger` — actualmente raw `<button>` reset.
- `AlertDialog.Action` + `AlertDialog.Cancel` — recipe bespoke con cascade `[data-color='risk'|'threat']` auto-coloring. Verificar que el cambio a `<Button intent="...">` mantenga el cascade visual.
- `Combobox.ClearButton` — pequeño icon button.
- `SearchField.Clear` — pequeño icon button.
**Decisión consciente NO refactorizar:**
- `NumberField` stepper buttons → mantienen comportamiento bespoke (hold-to-repeat increment).
### 3. Indicator refactor + Button consumer refactor son independientes
El `$effect` en `combobox-provider.svelte.ts` (líneas ~145) sync inputValue al label en single mode. Al añadir SelectedTags (item 2), verificar que no haya loops en multi. Pueden hacerse en cualquier orden. Task #118 toca recipe (CSS only). Task #120 toca svelte (cambia consumidor + drop CSS chrome redundante).
## Estado actual del working tree (sin commit aún) ### 4. Notas de scope / verificación
- `src/uix/eidos/components/popover/popover.css` — `--_popover-min-width` añadido. - Cada refactor: verificar visual en cada consumidor (date-picker, alert-dialog, etc.) — no asumir que el cambio no impacta layout.
- `src/uix/eidos/components/{date,date-range,time,time-range,color}-picker/*-content.svelte` — sideOffset = 6. - `svelte-check --threshold error` debe quedar 0/0 después de cada commit.
- `src/uix/soma/components/popover/components/popover-content.svelte` — default sideOffset = 6. - Demo de cada consumidor debe re-verificarse después del refactor.
- `src/uix/soma/components/combobox/combobox-provider.svelte.ts` — revertido patch multi-on-close + comentario "Multi mode renders selections as inline tags via a separate Combobox.SelectedTags part" como recordatorio.
## Comandos útiles ## Comandos útiles
@ -70,4 +88,9 @@ El `$effect` en `combobox-provider.svelte.ts` (líneas ~145) sync inputValue al
cd G:/dev/svelte/vicen cd G:/dev/svelte/vicen
npx svelte-check --threshold error # 0/0 expected npx svelte-check --threshold error # 0/0 expected
npm run dev # via .claude/launch.json "dev" npm run dev # via .claude/launch.json "dev"
npm run generate:eidos-css # if recipe tokens change
``` ```
## Estado del working tree
Limpio. Branch `active-uix` +17 ahead de `gita/active-uix` antes del push de hoy.

Loading…
Cancel
Save

Powered by TurnKey Linux.