docs(eidos): floating-gap canon (THEMING §36) + audit hand-off 2026-06-22

THEMING.md: new §36 documenting the token-driven floating gap (@property
--floating-gap, the menu/panel archetypes, the conditional stamp, why offset not
margin). Footer date -> 2026-06-22.

COMPONENT_COHERENCE_AUDIT.md: status line + a "hand-off 2026-06-22" section
recording this session's work (action components, 1:1 menu font, 2A radius, the
gap canon) plus the suggested order for next session (color-picker popover bug
task_5d1a10ec, selects faults, focus-ring 5A, field-bg 5D, composition lots).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
active-uix
dev 4 months ago
parent d229447a33
commit ec8428218f

@ -4,7 +4,7 @@ type: audit
date: 2026-06-16 date: 2026-06-16
scope: src/uix/eidos/components/* (excl. words · palabras · chronos) scope: src/uix/eidos/components/* (excl. words · palabras · chronos)
method: grep + Read dirigidos (sin agentes, por instrucción del usuario) method: grep + Read dirigidos (sin agentes, por instrucción del usuario)
status: FASE 1 (catálogo) — completa. FASE 2 (remediación) pendiente de lotes. status: FASE 1 completa. FASE 2 en curso — ver "hand-off 2026-06-22" (al final). Hechos: action components (fab/onion-menu/button-group/split-button), font 1:1 en menús, 2A radius bypass, gap canónico trigger→panel. CONTINUAR mañana por el bug popover color-picker (task_5d1a10ec).
--- ---
# Auditoría de coherencia de componentes — eidos # Auditoría de coherencia de componentes — eidos
@ -483,6 +483,54 @@ abrir/cerrar + el scroll viven en soma; el styling en `combobox.css`).
--- ---
## Estado de ejecución — hand-off 2026-06-22 (CONTINUAR AQUÍ MAÑANA)
Sesión larga; varios cierres + el gap canónico. Para retomar:
### Hecho esta sesión
- **Action components shipped** (`c00bac13`): fab, onion-menu, button-group,
split-button (eran untracked). Hardcodes → recipes; pasan el contract test (solo
palabras queda, excluida). fab = escala off-ladder Material en recipe (las
escalas canónicas no la expresan — decisión del user); onion trigger lift/shadow
→ `var(--fab-*)`; split-button → DropdownMenu `customAnchor`. Memoria
`project_action_components_2026-06-22`.
- **Font 1:1 en menús** (`7cf30287`): el sweep de campos (md=16) se saltó dos
menús + un picker trigger compactos (md→sm). Arreglados: **menubar**,
**navigation-menu**, **color-picker trigger** (era doble-compacto md→xs) → 1:1.
⚠️ El grep `font-size: var(--font-size-sm)` **sobre-cuenta** (matchea variantes
sm/lg correctas): combobox/command/textarea YA eran 1:1 — la nota "combobox
md=sm" de §5E / faults está STALE. Verificar el bloque DEFAULT md (`[data-X] {`
sin data-size), no el grep crudo. Font de PANEL de pickers + label de menu-dial =
contenido plano (sin eje de size), quedan compactos.
- **2A radius bypass CERRADO** (mismo commit): grid-list `0.2rem`→`--radius-sm`;
navigation-menu indicador `1px`→`--radius-full`. (button `9999px` ya estaba;
cropper `0 0 0 9999px` es el hack de máscara, NO tocar.)
- **Gap canónico trigger→panel** (`1590684c` foundation+piloto + `d229447a`
cascade): el `sideOffset` de floating-ui es un número (no acepta token), así que
cada flotante hardcodeaba el suyo (0/4/6/8). Solución: `@property --floating-gap`
que el posicionador compartido lee como OFFSET (token-driven + arrow-safe; NO el
margin de split-button, que despegaría la flecha). Tokens: menu 0 / panel
`--space-1-5`. Stamp CONDICIONAL (`sideOffset===undefined ? arquetipo : undefined`)
— el override del consumidor gana. Memoria `project_floating_gap_canon_2026-06-22`;
doc en THEMING.md.
### Pendiente (orden sugerido)
1. **🔴 Bug popover color-picker** (task chip `task_5d1a10ec`) — EMPEZAR AQUÍ.
Paddings no canonizados + scroll horizontal + los sliders/area solapan el padding
del content (de ahí el scroll). Reportado por el usuario.
2. **Faults de los selects** (sección arriba): combobox (7 faults) → search-field →
select → barrido langs cero-hardcodes.
3. **DIM 5A focus-ring** (🔴 headline): unificar ~18 `box-shadow` focus → `outline`
+ `outline-offset`; cierra el a11y de forced-colors.
4. **DIM 5D fondo de fields**: editable/tags-input raised→default (verificar si
deliberado). El fantasma de textarea (`--color-surface`) YA está arreglado
(`--color-surface-default`) — esa parte de §5D está stale.
5. **DIM 1 composición**: Lote A (Button-consumer: closes dialog/drawer/popover/
banner/toast → IconButton+SvgX; calendar/range prev/next) · Lote B (6 selects
nativos → `<Select>`).
---
## Apéndice — precedentes / plantillas a reutilizar ## Apéndice — precedentes / plantillas a reutilizar
- **Button-consumer**: `components/carousel/carousel-prev-trigger.svelte`. - **Button-consumer**: `components/carousel/carousel-prev-trigger.svelte`.

@ -2237,8 +2237,39 @@ literal que iguala un paso de escala DEBE consumir el token; nada de "intenciona
escala global al podar el `0.5/1.5`), `ring-thickness 3..10px`, `track-width`, escala global al podar el `0.5/1.5`), `ring-thickness 3..10px`, `track-width`,
`content-width`, offsets — escalas locales coherentes, no literales sueltos. `content-width`, offsets — escalas locales coherentes, no literales sueltos.
## 36. Gap canónico trigger→panel — offset token-driven (2026-06-22)
El `sideOffset` de Floating UI es un **número JS** — no acepta `var(--token)`. Por
eso cada flotante hardcodeaba su gap (0/4/6/8, incoherente). Canon:
- **`@property --floating-gap`** `<length>` — registrada para que JS resuelva el px
vía `getComputedStyle` (las custom props **sin registrar** devuelven el `var(...)`
literal, no el valor). Tokens por arquetipo: `--floating-gap-menu: 0` ·
`--floating-gap-panel: var(--space-1-5)`. Regla foundation
`[data-floating-gap='menu'|'panel'] { --floating-gap: … }`. Todo emitido en
`render-css.ts`.
- **El posicionador compartido** (`soma/layers/floating/floating.svelte.ts`) lee el
`--floating-gap` resuelto del content (en el rAF del watch de `contentRef`) y lo
usa como `offset` de Floating UI (fallback al `sideOffset` numérico). Es el
**OFFSET, no un margin CSS**: la flecha viaja con él (un margin la despegaría del
ancla en popover/tooltip). Por eso NO se reutilizó el `data-canonical-gap` de
split-button (margin — solo válido sin flecha).
- **Stamp condicional** en el content eidos:
`data-floating-gap={rest.sideOffset === undefined ? 'panel'|'menu' : undefined}`
(como split-button). Un `sideOffset` puesto por el consumidor **gana**; solo el
default cae al token. Los 5 pickers default `sideOffset=undefined` para seguir el
token del panel (componen `PopoverContent`).
| Arquetipo | Componentes | Gap |
|---|---|---|
| `menu` (flush) | dropdown · context · sub-menus · menubar · select · navigation-menu | `--floating-gap-menu` (0) |
| `panel` | popover · combobox · link-preview · 5 pickers (vía `PopoverContent`) | `--floating-gap-panel` (`--space-1-5`) |
Fuera: `command` (dialog/inline, no anclado a trigger), `onion-menu` (radial). Para
retunear el gap de un tema: override `--floating-gap-menu` / `--floating-gap-panel`.
--- ---
**Última revisión**: 2026-06-16. Si algo en este doc no coincide con **Última revisión**: 2026-06-22. Si algo en este doc no coincide con
el código, el código gana — pero abre un issue para que actualicemos el código, el código gana — pero abre un issue para que actualicemos
el doc. el doc.

Loading…
Cancel
Save

Powered by TurnKey Linux.