# Continue tomorrow Fecha de corte: 2026-05-23 (segunda mitad). Rama: `active-uix`. ## Resumen del día Segundo sprint sobre la rama: **Tasks #118 + #120 + #127 completadas**. Patrón canonical para consumers de ` {/if} {/snippet} ``` Nota: si el wrapper tiene un prop llamado `child`, **renombra en destructure a `outerChild`** — el `{#snippet child}` shadow infinite-loops si no. **Regla 4 — Contracts cross-layer.** Si el dialog/popover/menu padre tiene estado evaluativo (intent, color, status) que el Button hijo debe heredar, el soma provider del Button-like part lo expone via `child({ props, ... })` mediante `WithChildNoChildrenSnippetProps` para que `children` siga siendo un Snippet plano: ```ts // soma types.ts export type FooButtonProps = WithChildNoChildrenSnippetProps< { id?: string }, { intent: 'neutral' | 'risk' | 'threat' } // extra snippet props >; // soma provider.svelte.ts readonly dialogIntent = $derived.by(() => this.dialog.opts.intent.current); // soma component {@render child({ props: mergedProps, intent: state.dialogIntent })} ``` **Regla 5 — CSS recipe local solo para comportamiento.** Después del refactor, la recipe local solo debe contener selectores específicos del componente (`[data-foo][data-empty] [data-foo-clear]`, `data-state='open'` transitions). Chrome general (border, padding, focus ring, hover) es de Button. **Regla 6 — Verificación obligatoria:** svelte-check 0 errores + browser visual confirm (`mcp__Claude_Preview__preview_eval` con `getComputedStyle`). ## Pendiente ### Sin tareas explícitas Sprint cerrado limpio. Próximos posibles candidatos (no urgentes): - **NumberField stepper buttons** → decisión consciente de NO refactorizar (mantienen comportamiento bespoke `hold-to-repeat`). Re-evaluar si se necesita variant/size unification. - **Dialog.Trigger / Popover.Trigger / Drawer.Trigger** → mismo refactor que DropdownMenu.Trigger podría aplicar. No estaban en el scope #120. - **Select.Trigger / Combobox.Trigger** → form controls; podrían adoptar `