# Pendientes UIX > Backlog vivo. Cada entrada lleva una disposición: **implementar** / > **diferir** / **descartar**. Mantener priorizado por capa afectada y > dependencias. ## Pickers — estado consolidado 2026-05-21 El bloque de trabajo sobre `date-picker` y `date-range-picker` cerró en una pasada larga el mismo día. El contrato canónico es: - **`mode: 'inline' | 'modal'`** — modal bloquea outside-click + Escape. - **`kind: 'date' | 'month' | 'year'`** (Chakra-style) — controla segments del input + view del popover. Derivación vive en el `DateFieldProvider` (soma), no en el snippet del consumer. - **Footer = composición pura** — `` contiene las parts que tú compongas (``, ``, ``). Sin `clearButton`/`cancelButton`/`closeButton` props en root. - **Provider helpers**: `commit()` / `cancel()` (revierte al snapshot capturado en el OPEN edge vía `watch(open)`) / `clear()`. | Item | Disposición | | --- | --- | | Aplicar `mode + Footer` a `date-picker` (single) | **hecho** | | Aplicar `kind` (Chakra date/month/year) a `date-picker` | **hecho** | | `` + `` | **hecho** | | Propagar `kind` a `date-range-picker` (ambos endpoints filtran segments) | **hecho** | | `` + `` (range state machine: start → end → reset, swap automático) | **hecho** | | Promover `Footer/Clear/Cancel/Close` a parts canónicos Eidos (ambos pickers) | **hecho** | | Drop `clearButton/cancelButton/closeButton` root props → composición pura | **hecho** | | Morfo `date-picker` + `date-range-picker`: declarar parts Footer/Clear/Cancel/Close + arquetipo `footer` añadido al vocabulario | **hecho** | | `MonthRangePicker` / `YearRangePicker` como componentes nuevos | **descartar** — cubierto por `` / `kind='year'`. No vale la pena duplicar superficie cuando un prop captura la variante. | | `MonthPicker` / `YearPicker` (single) | **descartar** — idem, `` / `kind='year'`. | | Promover `` / `` a componentes independientes `` / `` con demos aislados | **diferir** — actualmente acoplados al `DatePickerProvider`. Independizarlos requiere refactor del context-lookup. Mantener acoplados hasta que aparezca un caso de uso real fuera del picker. | | Propagar el patrón modal+Footer a `time-picker`, `time-range-picker`, `color-picker`, `combobox`, `select`, `popover` cuando proceda | **implementar** — decidir por componente; muchos no necesitan footer. | | Tests browser del flujo completo (Playwright): inline/modal, kind chip, range state machine, snapshot/cancel, click-outside, Escape | **implementar** — alta cobertura para flujos que ahora dependen de state machine. | | Sema event al bloquear click cuando `mode='modal'` | **diferir** — útil para screen reader feedback. No bloquea. | ## Soma / Popover — bloqueo detectado durante Words | Item | Disposición | | --- | --- | | Auditar `Popover` como componente propio antes de usarlo para `Words.ToolPopover` | **implementar** — el trigger emite `present` en la traza, pero el estado `open` no queda reflejado de forma fiable en DOM y `Content` puede no montarse. En la demo de `Words`, abrir el editor de link desde el `BubbleMenu` produce `TypeError: Cannot read properties of undefined (reading 'wrapperProps')` en `src/uix/soma/components/popover/popover-provider.svelte.ts`. No es una adaptación específica de `Words`; es deuda de `Soma/Popover` y debe resolverse con su propia demo, tests y audit visual. | | Revisar `Portal` sólo si la auditoría de `Popover` lo confirma | **diferir** — no modificar `internal/Portal` como efecto lateral de `Words`; aislar primero si el fallo está en trigger/provider/presence/portal. | | Añadir test browser o harness Svelte para click real de `Popover.Trigger` → `Content` visible | **implementar** — los tests unitarios del provider no cubren el flujo renderizado con `Trigger`, `Portal`, `Content`, `bind:open` y atributos morfo en DOM. | ## Tooltip (warnings pendientes del audit) | Item | Disposición | | --- | --- | | `A-3.6` evento `open`/`close` sin variante `{verb}-X` o `{family}-X` | **diferir** — disclosure puro, el naming actual es semánticamente válido. | | `D-4.3` demo no emite `uix.events.emit(...)` para wirear Play buttons | **implementar** cuando se haga la próxima pasada de demos. | ## Eidos theming — limpieza diferida | Item | Disposición | | --- | --- | | 20 tokens de color muertos (rol `tertiary` completo + `{intent}-active` × 8 + `fulfill-hover`/`loss-hover`/`loss-element`) en `themes/base.ts` + `generated/base.css` | **diferir** — no rompen nada. Validar que `tertiary` no es un hook futuro reservado antes de borrarlo. | | Afinar valores de los tokens xs/xl extrapolados durante el batch de tamaños | **diferir** — la extrapolación proporcional (xs ≈ 75% de sm, xl ≈ 125% de lg) puede no proporcionarse bien en componentes concretos; revisar visualmente y reajustar caso por caso. | | Range view-cell: differentiate visualmente start/end vs in-range (actualmente todos se ven solid primary) — pendiente afinar tinte de `data-in-range` para que sea más sutil que start/end | **implementar** cuando se haga el browser-walk del range-picker. | ## Audit one-by-one (post-sesión) ### Prioridad media - [ ] dialog (verificar visual) ### Prioridad baja — sólo si aparece síntoma visual Lista barrida en el audit script (component:audit 67/67 PASS). Cuando aparezca un disparate visual, se walka el componente con browser y se remedia. No se hace barrido proactivo de nada que ya esté PASS. ## Audit infra | Item | Disposición | | --- | --- | | Audit A-3.6 falla con eventos `open`/`close` válidos de `emerge` | **diferir** — el regex pide `{verb}-X` pero muchos verbs son legítimos solos. Refinar regex para aceptar verbs canónicos. | | Audit no verifica que el demo cierre el popover al hacer click-outside (cuando aplica) | **diferir** — verificación visual queda al browser-walk. | | Translations check: añadir warning cuando un componente declara `texts.label` pero su catálogo no tiene `label` | **implementar** — pequeño, evita drift. | | **Audit R-2.6** — `var(--color-X)` referenciado sin estar declarado en `generated/base.css` | **hecho** (`scripts/component-audit.ts`). Set declarado se calcula al inicio desde `generated/base.css`; cada componente CSS se chequea contra él. | | **Audit D-7.4** — el array de chips de cada control (size, variant, color) enumera el tipo completo declarado en `types.ts` | **hecho** (`scripts/component-audit.ts`). Parsea `{PascalName}{Prop}` exacto, resuelve alias canónicos (`ControlVariant`, `SelectionVariant`, `ChipVariant`, `MarkerVariant`, `TabsVariant`, `ColorRole`+narrowings) vía `SHARED_VARIANT_VOCAB`. | | Nuevo: audit que verifique que ninguna Part Eidos consulta `provider.opts.{boolean}Button.current` (composición pura) | **diferir** — chequeo defensivo, low value. | ## Web · performance del docs site Diagnóstico (2026-05-24): el usuario reporta carga lenta + Chrome marca `[Violation] 'setTimeout' handler took 78ms`. Profiling identifica 4 cuellos de botella reales, ordenados por impacto. Como UIX está en fase de desarrollo del framework, todos quedan como **diferir** hasta entrar en pasada de polish; documentados aquí para no perder el rastro. | Item | Disposición | | --- | --- | | **CSS layout 744 KB render-blocking**: `src/uix/eidos/index.css` `@import`-ea 70+ recipes + `generated/base.css` (213 KB) — total 944 KB. Cada `/uix/*` descarga + parsea todo antes del first paint, la mayoría para componentes que la página no usa. | **diferir** — fix arquitectónico: dejar foundation global (~250 KB: `base.css` + `archetypes.css` + `events.css`) y mover cada recipe `XComponent.css` a un `import` dentro del `.svelte` correspondiente para que Vite lo code-splittee con el JS. Esto requiere migrar la convención del foundation eidos. | | **`ActiveEidos.create({ applyDom: true })` re-genera todo en runtime**: `apply()` (`src/uix/eidos/active-eidos.svelte.ts:361-389`) corre `renderStaticCss()` + `renderThemeCss()` sincrónicamente, itera `THEME_BASE_RECIPE_TOKENS` (2.884 líneas) + color×scale×role×alpha (>1k declaraciones), inyecta 3 `