You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/src/uix/eidos/components/toolbar/toolbar.css

168 lines
5.7 KiB

[data-toolbar] {
--_toolbar-gap: var(--toolbar-gap-md);
--_toolbar-padding-inline: var(--toolbar-padding-inline-md);
--_toolbar-padding-block: var(--toolbar-padding-block-md);
--_toolbar-control-height: var(--toolbar-control-height-md);
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress) Re-audit of the whole component catalog at pilot depth (91 fichas + the checkpoint verdicts in docs/audit/components/) and the executed fix packages. - P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts (role=application removed ×4, aria-selected off the Day, drp translationRef, field data-state prune, pin-input commit-set, media-player renames), 13 new sema packs + 12 morfos family-default → pack. - P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar); onValueCommit terminal-callback norm (pin-input/search/password/textarea + date/time/color-field add); typed validation reason + onInvalid (tags-input, css-field); index/onIndexChange (carousel); deselectable; openDelay/ groupSkipDelay; allowCustomValue; defaultValue prune. - P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel); touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual, 44 AAA). S6 (Field composition) + S8 (calendar-surface) pending. Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline); morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched components; per-component vitest suites green. Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md Excluded (broken by the N1 rename, left broken per user decision, not staged): words/**, palabras/**, chronos, web/routes/alpha/**. Reconciliation pending: the touch-rows ::before for checkbox/switch reverses changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed markers to a labeled-row/Field task — flagged for the user in the handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
--_toolbar-control-padding-inline: var(--toolbar-control-padding-inline-md);
--_toolbar-control-gap: var(--toolbar-control-gap-md);
--_toolbar-font-size: var(--toolbar-font-size-md);
--_toolbar-bg: var(--toolbar-bg);
--_toolbar-border: var(--toolbar-border);
--_toolbar-shadow: var(--toolbar-shadow);
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: var(--_toolbar-gap);
min-inline-size: 0;
padding-block: var(--_toolbar-padding-block);
padding-inline: var(--_toolbar-padding-inline);
border: var(--toolbar-border-width) solid var(--_toolbar-border);
border-radius: var(--toolbar-radius);
background: var(--_toolbar-bg);
box-shadow: var(--_toolbar-shadow);
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y sus 793 referencias en 101 ficheros; no toca un solo valor. claves renombradas 269 en 66 componentes referencias 793 en 101 ficheros censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56 sin contrato — IDÉNTICO, como debe ser un rename --names antes/después 269 desviadas → 0 Qué NO entra, y por qué: 47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador detrás POR CONSTRUCCIÓN (`primary-solid-hover`) 13 exentas firmadas `--focus-ring-*` es familia del sistema; el color de `aura` es un sustantivo; `stop-color` ES una parte de gradient-builder 47 hovers neutros por VALOR: migran a la capa de estado (§38 + R-4.3), no se renombran — firma 3 6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background: reescribir un registro fechado lo vuelve mentira El clasificador vive en el censo (`--names`), no en un script suelto, para que el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba (`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo promovía al frente CUALQUIER valor declarado por el morfo, y así `--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en `--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo promociona el vocabulario interactivo cerrado, y lo contextual —`below`, `loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de regresión están en la muta-prueba. También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`: es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una migración que no le toca; se clasifica por el VALOR. Verificación (§7.4, artefacto por paso): diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados reapuntados a los nombres nuevos (`__names-verify-diff`) computed tag-group · field · tabs: 6.467 valores en 23 estados, 0 diffs — y comprobado en el navegador que sirve el CSS nuevo, para que ese 0 no sea el de una copia cacheada huérfanos 0 en código suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`). `recipe-css-contract` verde: es el guard que caza el `var()` sin fallback a un nombre que ya no se emite, o sea el fallo exacto de un rename a medias component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto check 0 errores en ficheros tocados (los 73 globales son de otras sesiones de la rama; se atribuye por fichero) rtl:check 0 · docs:check 0 formato el renombrado no alarga ninguna línea: ningún fichero tiene más líneas de 100 chars que antes, así que no se pasa prettier — hacerlo reformateaba 300 ficheros de deriva ajena Entra aquí la corrección del repaso de los 7 ya hechos: `gradient-builder.checker-color` → `checker-fg` (el damero de transparencia; ahí `color` era slot). Sus `stop-color-*` no se tocan. Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran antes (firma 3, ya firmada), o el guard necesita una exención greppable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
color: var(--toolbar-fg);
font-family: var(--toolbar-font-family);
font-size: var(--_toolbar-font-size);
line-height: var(--toolbar-line-height);
}
eidos: theming fixes + size/variant parity batch + docs - theme: add surface.muted + content.muted to color contract (neutral-3 + neutral-10). Plugs 17 broken --color-content-muted and 3 broken --color-surface-muted references in recipes/components. - form.css: fix --color-neutral-element-hover typo → --color-neutral-hover. - archetypes.css + events.css: replace raw hsl/rgba indigo with color-mix(var(--color-primary-solid) …) — no raw colors left in eidos. - combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme. - sizes: 20 components expand from sm/md/lg to xs..xl (form controls, text inputs, progress/meter, field/form) or xs..lg (nav controls: breadcrumb, pagination, tag-group, toolbar). Composite panels keep sm/md/lg deliberately. - variants: field + toolbar drop arbitrary ControlVariant narrowings; both expose all 3 (surface | outline | ghost) with new outline CSS. - pagination demo: disambiguate siblingCount/boundaryCount as "per side" in label + API table (Radix/MUI convention). - docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity) + §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) + §12.8 (size category cheatsheet) added. eidos/README + active_architecture.md sync texts/migration nomenclature. - PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión. Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
[data-toolbar][data-size='xs'] {
--_toolbar-gap: var(--toolbar-gap-xs);
--_toolbar-padding-inline: var(--toolbar-padding-inline-xs);
--_toolbar-padding-block: var(--toolbar-padding-block-xs);
--_toolbar-control-height: var(--toolbar-control-height-xs);
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress) Re-audit of the whole component catalog at pilot depth (91 fichas + the checkpoint verdicts in docs/audit/components/) and the executed fix packages. - P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts (role=application removed ×4, aria-selected off the Day, drp translationRef, field data-state prune, pin-input commit-set, media-player renames), 13 new sema packs + 12 morfos family-default → pack. - P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar); onValueCommit terminal-callback norm (pin-input/search/password/textarea + date/time/color-field add); typed validation reason + onInvalid (tags-input, css-field); index/onIndexChange (carousel); deselectable; openDelay/ groupSkipDelay; allowCustomValue; defaultValue prune. - P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel); touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual, 44 AAA). S6 (Field composition) + S8 (calendar-surface) pending. Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline); morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched components; per-component vitest suites green. Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md Excluded (broken by the N1 rename, left broken per user decision, not staged): words/**, palabras/**, chronos, web/routes/alpha/**. Reconciliation pending: the touch-rows ::before for checkbox/switch reverses changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed markers to a labeled-row/Field task — flagged for the user in the handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
--_toolbar-control-padding-inline: var(--toolbar-control-padding-inline-xs);
eidos: theming fixes + size/variant parity batch + docs - theme: add surface.muted + content.muted to color contract (neutral-3 + neutral-10). Plugs 17 broken --color-content-muted and 3 broken --color-surface-muted references in recipes/components. - form.css: fix --color-neutral-element-hover typo → --color-neutral-hover. - archetypes.css + events.css: replace raw hsl/rgba indigo with color-mix(var(--color-primary-solid) …) — no raw colors left in eidos. - combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme. - sizes: 20 components expand from sm/md/lg to xs..xl (form controls, text inputs, progress/meter, field/form) or xs..lg (nav controls: breadcrumb, pagination, tag-group, toolbar). Composite panels keep sm/md/lg deliberately. - variants: field + toolbar drop arbitrary ControlVariant narrowings; both expose all 3 (surface | outline | ghost) with new outline CSS. - pagination demo: disambiguate siblingCount/boundaryCount as "per side" in label + API table (Radix/MUI convention). - docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity) + §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) + §12.8 (size category cheatsheet) added. eidos/README + active_architecture.md sync texts/migration nomenclature. - PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión. Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
--_toolbar-control-gap: var(--toolbar-control-gap-xs);
--_toolbar-font-size: var(--toolbar-font-size-xs);
}
[data-toolbar][data-size='sm'] {
--_toolbar-gap: var(--toolbar-gap-sm);
--_toolbar-padding-inline: var(--toolbar-padding-inline-sm);
--_toolbar-padding-block: var(--toolbar-padding-block-sm);
--_toolbar-control-height: var(--toolbar-control-height-sm);
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress) Re-audit of the whole component catalog at pilot depth (91 fichas + the checkpoint verdicts in docs/audit/components/) and the executed fix packages. - P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts (role=application removed ×4, aria-selected off the Day, drp translationRef, field data-state prune, pin-input commit-set, media-player renames), 13 new sema packs + 12 morfos family-default → pack. - P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar); onValueCommit terminal-callback norm (pin-input/search/password/textarea + date/time/color-field add); typed validation reason + onInvalid (tags-input, css-field); index/onIndexChange (carousel); deselectable; openDelay/ groupSkipDelay; allowCustomValue; defaultValue prune. - P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel); touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual, 44 AAA). S6 (Field composition) + S8 (calendar-surface) pending. Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline); morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched components; per-component vitest suites green. Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md Excluded (broken by the N1 rename, left broken per user decision, not staged): words/**, palabras/**, chronos, web/routes/alpha/**. Reconciliation pending: the touch-rows ::before for checkbox/switch reverses changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed markers to a labeled-row/Field task — flagged for the user in the handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
--_toolbar-control-padding-inline: var(--toolbar-control-padding-inline-sm);
--_toolbar-control-gap: var(--toolbar-control-gap-sm);
--_toolbar-font-size: var(--toolbar-font-size-sm);
}
[data-toolbar][data-size='lg'] {
--_toolbar-gap: var(--toolbar-gap-lg);
--_toolbar-padding-inline: var(--toolbar-padding-inline-lg);
--_toolbar-padding-block: var(--toolbar-padding-block-lg);
--_toolbar-control-height: var(--toolbar-control-height-lg);
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress) Re-audit of the whole component catalog at pilot depth (91 fichas + the checkpoint verdicts in docs/audit/components/) and the executed fix packages. - P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts (role=application removed ×4, aria-selected off the Day, drp translationRef, field data-state prune, pin-input commit-set, media-player renames), 13 new sema packs + 12 morfos family-default → pack. - P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar); onValueCommit terminal-callback norm (pin-input/search/password/textarea + date/time/color-field add); typed validation reason + onInvalid (tags-input, css-field); index/onIndexChange (carousel); deselectable; openDelay/ groupSkipDelay; allowCustomValue; defaultValue prune. - P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel); touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual, 44 AAA). S6 (Field composition) + S8 (calendar-surface) pending. Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline); morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched components; per-component vitest suites green. Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md Excluded (broken by the N1 rename, left broken per user decision, not staged): words/**, palabras/**, chronos, web/routes/alpha/**. Reconciliation pending: the touch-rows ::before for checkbox/switch reverses changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed markers to a labeled-row/Field task — flagged for the user in the handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
--_toolbar-control-padding-inline: var(--toolbar-control-padding-inline-lg);
--_toolbar-control-gap: var(--toolbar-control-gap-lg);
--_toolbar-font-size: var(--toolbar-font-size-lg);
}
eidos: theming fixes + size/variant parity batch + docs - theme: add surface.muted + content.muted to color contract (neutral-3 + neutral-10). Plugs 17 broken --color-content-muted and 3 broken --color-surface-muted references in recipes/components. - form.css: fix --color-neutral-element-hover typo → --color-neutral-hover. - archetypes.css + events.css: replace raw hsl/rgba indigo with color-mix(var(--color-primary-solid) …) — no raw colors left in eidos. - combobox dark scrollbar: unscope ::-webkit-scrollbar rules in uix.css and duplicate --uix-line on :root + :root[data-mode='dark'] so portaled overlays (Combobox listbox, Popover, Dialog, Drawer) inherit the theme. - sizes: 20 components expand from sm/md/lg to xs..xl (form controls, text inputs, progress/meter, field/form) or xs..lg (nav controls: breadcrumb, pagination, tag-group, toolbar). Composite panels keep sm/md/lg deliberately. - variants: field + toolbar drop arbitrary ControlVariant narrowings; both expose all 3 (surface | outline | ghost) with new outline CSS. - pagination demo: disambiguate siblingCount/boundaryCount as "per side" in label + API table (Radix/MUI convention). - docs: CHECKLIST §C-2.6 (contract token presence) + §D-7.4 (chip parity) + §D-7.5 (size category) added. DEMO_AUTHORING §12.7 (chip parity) + §12.8 (size category cheatsheet) added. eidos/README + active_architecture.md sync texts/migration nomenclature. - PENDIENTES.md: normas N-1..N-5 implantadas en esta sesión. Verification: 88/88 eidos tests, 0 type errors, 67/67 component:audit PASS. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 months ago
/* outline: transparent fill, border + shadow stay visible. */
[data-toolbar][data-variant='outline'] {
--_toolbar-bg: transparent;
--_toolbar-shadow: none;
}
[data-toolbar][data-variant='ghost'] {
--_toolbar-bg: transparent;
--_toolbar-border: transparent;
--_toolbar-shadow: none;
}
[data-toolbar][data-orientation='vertical'] {
flex-direction: column;
align-items: stretch;
}
[data-toolbar-group] {
display: inline-flex;
align-items: center;
gap: var(--toolbar-group-gap);
min-inline-size: 0;
}
[data-toolbar-group][data-orientation='vertical'] {
flex-direction: column;
align-items: stretch;
}
uix(toolbar): la acción principal de un cluster ya puede decir su rango — y el gesto ya suena `Toolbar.Button` tipaba contra el ButtonProps de SOMA ({id, disabled}): sin variant, sin color, sin size. Un cluster de acciones donde UNA es la principal no tenía cómo decirlo desde dentro, y la demo del app-shell dejaba «Nueva» FUERA del toolbar como workaround documentado (A-112). La ficha ofrecía dos salidas y mi primera recomendación fue la equivocada — declarar el toolbar deliberadamente uniforme y consagrar el workaround. El autor la tumbó, con razón: el eidos toolbar-button.svelte era un PASSTHROUGH que dejaba el <button> nativo de soma, exactamente la clase de bug que dialog-trigger (2026-06-19) y card-group-title (2026-06-27) ya pagaron, y el precedente correcto no es menubar-trigger sino Form.Submit. Dos datos que el primer análisis no tenía: - El botón era MUDO. El morfo del toolbar sólo declara commit-toggle (el group-item), así que pulsar una acción no emitía nada. Medido tras el cambio: click → contact-activate estampado en el nodo + 8 nodos de audio, donde antes 0. - La uniformidad la dan los DEFAULTS, no la ausencia del eje: ghost/neutral y el size del toolbar por contexto de eidos (toolbar/context.ts, calcado del precedente ButtonGroup y con su misma razón: la receta del Button lee data-size EN el nodo, un descendant selector no llega). El tipo estrecha a SelectionVariant (solid | outline | ghost). La forma es el Button consumer pattern entero: composición vía child de soma (con el rename outerChild contra la recursión), y la receta CEDE el nodo — cero cromo de botón en toolbar.css (regla 5); Link y GroupItem siguen siendo superficie de la barra y los pinta ella. Antes de ceder, las dos recetas sobre un mismo nodo producían un híbrido medido en el que solid/primary NO pintaba. La doctrina que faltaba queda escrita en guides/component-guide.md §4: dos clases de parte con forma de botón en una barra. ACCIÓN en barra (Toolbar. Button, Form.Submit, Dialog.Trigger) compone el Button; control de SUPERFICIE de barra (Menubar.Trigger: File, Edit) lo pinta la barra. El test: ¿significa lo mismo fuera de la barra? Esa distinción vivía en un comentario de menubar-trigger; el comentario ahora apunta a la doctrina. Verificado en navegador (Playwright, servidor limpio): el nodo ES el Button del canon (data-button + data-variant), solid/primary pinta (fondo primary, tinta blanca), paridad exacta con el GroupItem por construcción — mismo bundle --size-*: 36px/36px en md, 30px/30px en sm, con la herencia del size del toolbar medida en vivo al cambiarlo. La demo del app-shell mueve «Nueva» AL INTERIOR del cluster (workaround retirado, gap del block cerrado en su README) y la demo del toolbar gana la acción «New» con controles vivos action variant / action color. Gates: svelte-check 72/62 (base 73/62, sin regresión) · vitest eidos+blocks 470/471 (el rojo es skin-media-player, ajeno y documentado en el handoff) · blocks:check 0 errores / 19 blocks · docs:check 0/0. Los avisos de prettier de los dos README ya fallaban en HEAD. ⚠️ El árbol compartido tiene ya encima trabajo NUEVO de otra sesión (navigation-menu, PLAN-sidebar, book-deviations): este commit lleva sólo los 14 ficheros del eje A-112, verificados por lista. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2 months ago
/* No [data-toolbar-button] chrome here: `Toolbar.Button` composes the canon
<Button>, which owns its variant/hover/focus/disabled paint (A-112 — Button
consumer pattern, rule 5). The bar paints only the controls that are ITS
surface: Link and GroupItem. */
[data-toolbar-link],
[data-toolbar-group-item] {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
gap: var(--_toolbar-control-gap);
min-inline-size: var(--_toolbar-control-height);
block-size: var(--_toolbar-control-height);
feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress) Re-audit of the whole component catalog at pilot depth (91 fichas + the checkpoint verdicts in docs/audit/components/) and the executed fix packages. - P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 + API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d, component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts (role=application removed ×4, aria-selected off the Day, drp translationRef, field data-state prune, pin-input commit-set, media-player renames), 13 new sema packs + 12 morfos family-default → pack. - P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar); onValueCommit terminal-callback norm (pin-input/search/password/textarea + date/time/color-field add); typed validation reason + onInvalid (tags-input, css-field); index/onIndexChange (carousel); deselectable; openDelay/ groupSkipDelay; allowCustomValue; defaultValue prune. - P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel); touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual, 44 AAA). S6 (Field composition) + S8 (calendar-surface) pending. Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline); morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched components; per-component vitest suites green. Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md Excluded (broken by the N1 rename, left broken per user decision, not staged): words/**, palabras/**, chronos, web/routes/alpha/**. Reconciliation pending: the touch-rows ::before for checkbox/switch reverses changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed markers to a labeled-row/Field task — flagged for the user in the handoff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
padding-inline: var(--_toolbar-control-padding-inline);
border: var(--toolbar-control-border-width) solid var(--toolbar-control-border);
border-radius: var(--toolbar-control-radius);
background: var(--toolbar-control-bg);
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y sus 793 referencias en 101 ficheros; no toca un solo valor. claves renombradas 269 en 66 componentes referencias 793 en 101 ficheros censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56 sin contrato — IDÉNTICO, como debe ser un rename --names antes/después 269 desviadas → 0 Qué NO entra, y por qué: 47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador detrás POR CONSTRUCCIÓN (`primary-solid-hover`) 13 exentas firmadas `--focus-ring-*` es familia del sistema; el color de `aura` es un sustantivo; `stop-color` ES una parte de gradient-builder 47 hovers neutros por VALOR: migran a la capa de estado (§38 + R-4.3), no se renombran — firma 3 6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background: reescribir un registro fechado lo vuelve mentira El clasificador vive en el censo (`--names`), no en un script suelto, para que el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba (`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo promovía al frente CUALQUIER valor declarado por el morfo, y así `--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en `--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo promociona el vocabulario interactivo cerrado, y lo contextual —`below`, `loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de regresión están en la muta-prueba. También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`: es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una migración que no le toca; se clasifica por el VALOR. Verificación (§7.4, artefacto por paso): diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados reapuntados a los nombres nuevos (`__names-verify-diff`) computed tag-group · field · tabs: 6.467 valores en 23 estados, 0 diffs — y comprobado en el navegador que sirve el CSS nuevo, para que ese 0 no sea el de una copia cacheada huérfanos 0 en código suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`). `recipe-css-contract` verde: es el guard que caza el `var()` sin fallback a un nombre que ya no se emite, o sea el fallo exacto de un rename a medias component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto check 0 errores en ficheros tocados (los 73 globales son de otras sesiones de la rama; se atribuye por fichero) rtl:check 0 · docs:check 0 formato el renombrado no alarga ninguna línea: ningún fichero tiene más líneas de 100 chars que antes, así que no se pasa prettier — hacerlo reformateaba 300 ficheros de deriva ajena Entra aquí la corrección del repaso de los 7 ya hechos: `gradient-builder.checker-color` → `checker-fg` (el damero de transparencia; ahí `color` era slot). Sus `stop-color-*` no se tocan. Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran antes (firma 3, ya firmada), o el guard necesita una exención greppable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
color: var(--toolbar-control-fg);
font: inherit;
text-decoration: none;
white-space: nowrap;
cursor: pointer;
outline: none;
transition:
background var(--toolbar-transition-duration) var(--toolbar-transition-ease),
border-color var(--toolbar-transition-duration) var(--toolbar-transition-ease),
color var(--toolbar-transition-duration) var(--toolbar-transition-ease),
box-shadow var(--toolbar-transition-duration) var(--toolbar-transition-ease);
}
[data-toolbar-link]:hover,
[data-toolbar-group-item]:hover:not([data-disabled]) {
fix(eidos): la capa de estado es un VELO — 38 hovers que no lo eran, al idioma El codemod de ayer apartó 47 knobs «en cola de migración a la capa de estado». Al empezar esa migración se ve que sólo SEIS lo estaban: el velo de §38 es `background-image: linear-gradient(var(--state-hover), var(--state-hover))` y no alcanza nada más. De los otros 41, veintidós mueven un BORDE y diecinueve mueven la TINTA — ninguno es la capa de estado por muy neutro que sea su valor. Eran deuda de nombre, y yo los había excluido del renombrado. El clasificador tenía media prueba: miraba el VALOR (¿neutro o con valencia?) y no la PROPIEDAD. Ahora exige las dos, siguiendo un salto por privado (`--_switch-track-bg-hover`) y entre componentes (la familia calendar presta `--calendar-control-*` a month-grid, range-calendar y year-grid, y por eso esos cuatro no aparecían consumidos en su propia receta). renombres 38 en 22 componentes · 113 referencias en 30 ficheros cola real 6 (checkbox · date-range-picker ×2 · scroll-area · splitter · switch) — los únicos que pintan fondo censo 162 · 5.203 · 1.841 (37 %) · 56 — IDÉNTICO --names 38 → 0 desviadas diff generated 38 renombres 1:1 · 0 cambios de valor computed field · tabs contra la línea base ORIGINAL (anterior a las dos pasadas): 4.031 valores, 16 estados, 0 diffs huérfanos 0 · formato sin regresión · audit 163 PASS · rtl 0 · docs 0 · suite 434 pasan (1 rojo conocido) · check 0 errores en ficheros tocados La muta-prueba se reescribió contra el catálogo vivo — asertaba nombres que el codemod ya había renombrado — y gana los casos que faltaban: un knob de borde neutro es `modifier`, uno de tinta neutro es `both`, y sólo los de fondo son `state-layer`. Queda una pregunta que §38 no contesta y que NO he decidido: si un hover de borde o de tinta POR COMPONENTE debe existir siquiera. R-4.3 guarda `background*` en `:hover`, nada más. Ahora al menos se llaman como deben mientras se decide. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
border-color: var(--toolbar-hover-control-border);
background-image: linear-gradient(var(--state-hover), var(--state-hover));
fix(eidos): la capa de estado es un VELO — 38 hovers que no lo eran, al idioma El codemod de ayer apartó 47 knobs «en cola de migración a la capa de estado». Al empezar esa migración se ve que sólo SEIS lo estaban: el velo de §38 es `background-image: linear-gradient(var(--state-hover), var(--state-hover))` y no alcanza nada más. De los otros 41, veintidós mueven un BORDE y diecinueve mueven la TINTA — ninguno es la capa de estado por muy neutro que sea su valor. Eran deuda de nombre, y yo los había excluido del renombrado. El clasificador tenía media prueba: miraba el VALOR (¿neutro o con valencia?) y no la PROPIEDAD. Ahora exige las dos, siguiendo un salto por privado (`--_switch-track-bg-hover`) y entre componentes (la familia calendar presta `--calendar-control-*` a month-grid, range-calendar y year-grid, y por eso esos cuatro no aparecían consumidos en su propia receta). renombres 38 en 22 componentes · 113 referencias en 30 ficheros cola real 6 (checkbox · date-range-picker ×2 · scroll-area · splitter · switch) — los únicos que pintan fondo censo 162 · 5.203 · 1.841 (37 %) · 56 — IDÉNTICO --names 38 → 0 desviadas diff generated 38 renombres 1:1 · 0 cambios de valor computed field · tabs contra la línea base ORIGINAL (anterior a las dos pasadas): 4.031 valores, 16 estados, 0 diffs huérfanos 0 · formato sin regresión · audit 163 PASS · rtl 0 · docs 0 · suite 434 pasan (1 rojo conocido) · check 0 errores en ficheros tocados La muta-prueba se reescribió contra el catálogo vivo — asertaba nombres que el codemod ya había renombrado — y gana los casos que faltaban: un knob de borde neutro es `modifier`, uno de tinta neutro es `both`, y sólo los de fondo son `state-layer`. Queda una pregunta que §38 no contesta y que NO he decidido: si un hover de borde o de tinta POR COMPONENTE debe existir siquiera. R-4.3 guarda `background*` en `:hover`, nada más. Ahora al menos se llaman como deben mientras se decide. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
color: var(--toolbar-hover-control-fg);
}
[data-toolbar-link]:focus-visible,
[data-toolbar-group-item]:focus-visible {
fix(eidos): component-coherence audit FASE 2 — focus-ring, fields, segments, langs, API nits Bundles the uncommitted audit work on this branch (active-uix): - DIM 5A: focus-ring unified to `outline` across the control/field set (kills ~18 box-shadow rings; closes forced-colors a11y). NOTE: spin-field + drawer-close orphan-token loose ends from this migration still trip the eidos contract test — to clean when that migration settles. - DIM 5D: field/input backgrounds homogenized to surface-default; list-surface padding recalibrated 2/4/6/8/10; menu-dial internal vars privatized. - DIM 5E: date/time/color-field + date-range-picker segments delegate the active state to the shared field-segment-state layer; the input transition is reduced to `background` only so the focus border no longer flickers on keyboard increment (border-color is now instant; the ring is an outline). - Langs (cero-hardcodes): IconButton-cascade wrappers (carousel/combobox/ tree-grid/table/search-field/banner) + onion-menu + cropper + time-picker day-period now route aria-labels through morfo langs instead of hardcoded English (the hardcode was overriding soma's already-resolved label). Fixes 2 contract divergences (combobox Clear->Clear value, table toggle label). - DIM 5B: code-block/kbd variants aliased to ControlVariant (no duplicate literals); image-picker default size sm->md. Excludes words/palabras/chronos and the metrics/demos tracks (separate work). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4 months ago
outline: var(--focus-ring-width) solid var(--focus-ring-color);
outline-offset: 0;
}
[data-toolbar-group-item][data-state='on'] {
refactor(eidos): el catálogo habla un idioma — 269 claves al vocabulario firmado D-TH.6, ejecutada. El slot de tinta pasa a `fg` y el modificador interactivo se pone delante, que es lo que theming §6.7 r7 documentaba sin guard desde que se escribió. Value-preserving: renombra la clave en `recipes/base.ts` y sus 793 referencias en 101 ficheros; no toca un solo valor. claves renombradas 269 en 66 componentes referencias 793 en 101 ficheros censo antes/después 162 recetas · 5.203 knobs · 1.841 públicos (37 %) · 56 sin contrato — IDÉNTICO, como debe ser un rename --names antes/después 269 desviadas → 0 Qué NO entra, y por qué: 47 `{rol}-{slot-de-rol}` canónicas: COLOR_ROLE_SLOTS pone el modificador detrás POR CONSTRUCCIÓN (`primary-solid-hover`) 13 exentas firmadas `--focus-ring-*` es familia del sistema; el color de `aura` es un sustantivo; `stop-color` ES una parte de gradient-builder 47 hovers neutros por VALOR: migran a la capa de estado (§38 + R-4.3), no se renombran — firma 3 6 ocurrencias en historia changelog, errores-toxico, PLAN-affix/background: reescribir un registro fechado lo vuelve mentira El clasificador vive en el censo (`--names`), no en un script suelto, para que el guard R-5.3 consuma la MISMA gramática que el codemod. Su muta-prueba (`__names-mutatest.ts`, 27 casos) es lo que hizo el trabajo: cazó que yo promovía al frente CUALQUIER valor declarado por el morfo, y así `--sidebar-width-icon` (la anchura del raíl colapsado) se convertía en `--sidebar-icon-width` (la anchura de un icono), que es otra cosa. La firma dice «delante lo interactivo, detrás lo dimensional y contextual»: ahora sólo promociona el vocabulario interactivo cerrado, y lo contextual —`below`, `loaded`, `vertical`, `icon`— se queda donde estaba. Los cinco casos de regresión están en la muta-prueba. También cazó que `dropdown-menu.item-bg-hover` lee `var(--color-primary-element)`: es un hover CON VALENCIA (el palette swap de recipe-contract §2), no el hover bespoke que §38 deprecó. Clasificar por el nombre lo habría metido en una migración que no le toca; se clasifica por el VALOR. Verificación (§7.4, artefacto por paso): diff de generated/ 269 renombres 1:1 · 0 cambios de valor · 22 privados reapuntados a los nombres nuevos (`__names-verify-diff`) computed tag-group · field · tabs: 6.467 valores en 23 estados, 0 diffs — y comprobado en el navegador que sirve el CSS nuevo, para que ese 0 no sea el de una copia cacheada huérfanos 0 en código suite eidos 434 pasan · 1 rojo, el conocido (`skin-media-player`). `recipe-css-contract` verde: es el guard que caza el `var()` sin fallback a un nombre que ya no se emite, o sea el fallo exacto de un rename a medias component:audit 163 PASS · 3 NEEDS-WORK, los tres SIN TOCAR por esto check 0 errores en ficheros tocados (los 73 globales son de otras sesiones de la rama; se atribuye por fichero) rtl:check 0 · docs:check 0 formato el renombrado no alarga ninguna línea: ningún fichero tiene más líneas de 100 chars que antes, así que no se pasa prettier — hacerlo reformateaba 300 ficheros de deriva ajena Entra aquí la corrección del repaso de los 7 ya hechos: `gradient-builder.checker-color` → `checker-fg` (el damero de transparencia; ahí `color` era slot). Sus `stop-color-*` no se tocan. Queda para el paso siguiente: R-5.3 no puede graduar a `error` directo mientras los 47 hovers neutros sigan hablando el idioma viejo — o migran antes (firma 3, ya firmada), o el guard necesita una exención greppable. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
border-color: var(--toolbar-active-control-border);
background: var(--toolbar-active-control-bg);
color: var(--toolbar-active-control-fg);
}
[data-toolbar-group][data-disabled],
[data-toolbar-group-item][data-disabled] {
cursor: default;
opacity: var(--toolbar-disabled-opacity);
}
[data-toolbar-separator] {
flex: 0 0 auto;
border-radius: var(--toolbar-separator-radius);
background: var(--toolbar-separator-bg);
}
[data-toolbar-separator][data-orientation='vertical'] {
inline-size: var(--toolbar-separator-thickness);
align-self: stretch;
min-block-size: var(--toolbar-separator-length);
}
[data-toolbar-separator][data-orientation='horizontal'] {
block-size: var(--toolbar-separator-thickness);
uix(toolbar): temable — 91 % → 94 % CERRADO, y ceder el cromo del botón SALE GRATIS Cero claves acuñadas, y eso es el resultado: el censo daba `global 0` — la receta ya lee su propio contrato en cada declaración, con el eje `size` resuelto por el TSC a través de siete privados que sólo reapuntan claves públicas por talla. Lo que quedaba fuera del alcance eran tres cosas CLASIFICADAS, no tres deudas. La mitad del trabajo de este eje es adjudicar. 1. Los DOS privados son CONMUTADORES por variante, medidos variante a variante sobre el nodo real: `--_toolbar-bg` vale `var(--toolbar-bg)` (oklch(0.9821 0 0)) en `surface` y `transparent` en `outline` y `ghost`; `--_toolbar-shadow` vale `var(--toolbar-shadow)` y `none` en las mismas. Ese segundo valor es la IDENTIDAD de la variante, no un knob: una barra `ghost` ES la que no tiene relleno ni sombra, y un público encima dejaría que un tema la rellenara y matara la variante en silencio. Se quedan privados (clase «conmutador» de F2-B, sexto caso tras textarea, spinner, skeleton, code y label). Ni escala por talla ni puente THM-2: esta barra no tiene paleta. 2. El único literal es una IDENTIDAD y ahora está FIRMADO: el `inline-size: 100%` del separador horizontal abarca el eje transversal de la barra — el mismo trabajo que `align-self: stretch` hace en el gemelo vertical (medido: 112 px sobre un contenedor de 126 px). Su grosor y su suelo sí son tokens. Con su anotación `/* literal: */` sale del ratio. 3. LA CASCADA DEL COMPONENTE COMPUESTO NO LE CUESTA UNA SOLA CLAVE, y es la lección. `Toolbar.Button` compone el `<Button>` canónico, así que sus nodos llevan `data-button` Y `data-toolbar-button`, y `[data-button]` casa con la misma especificidad (0,1,0) pero se emite DESPUÉS. La diferencia con `form` —que conserva 24 declaraciones que Button anula— es que esta receta YA CEDIÓ el cromo del botón (A-112) y no escribe ni una regla `[data-toolbar-button]`. Medido ANTES de tocar nada: 51/54 vivos, y ninguna de las tres silenciosas era del botón. Las claves `control-*` visten el Link y el GroupItem, que sí son superficie de la barra. Censo: 35 → 34 knobs · público 30 · privado 2 · literal 1 → 0 · excepción 0 → 1 · sistema 2 · 91 % → 94 %. Contrato 54 claves, intacto. Global del catálogo 68 %, sin bajar. Diff de computed: VACÍO — 2.464 valores en 7 estados sobre 11 nodos (la barra, sus tres botones compuestos, dos separadores, el grupo, sus tres items y el enlace). Capturas 2× antes/después: idénticas. Centinela R-5.4: 52/54, dos adjudicadas, cero muertas sin razón. - `transition-duration` / `transition-ease` SON la transición que el guard congela para poder leer todo lo demás. Medidas sin congelar sobre el Link real, que transiciona CUATRO propiedades: `0.12s ×4 → 4.321s ×4` y `cubic-bezier(0.4, 0, 0.2, 1) ×4 → steps(3) ×4`. Al ledger con esa razón. - `disabled-opacity` NO se adjudica: se ARREGLA. El guard enciende ahora el interruptor «group disabled» de la demo, y comprobado que no tapa nada — la regla de hover es `[data-toolbar-link]:hover, [data-toolbar-group-item]:hover:not([data-disabled])` y el Link no pertenece al grupo, así que conserva las dos claves de hover. Corrido antes y después del control: 51/54 → 52/54, el conjunto muerto encoge en uno y no gana ninguno. Guards: censo `--only` 94 % · `component-audit --only toolbar` PASS · `eidos-lint toolbar` 16 morfo-backed / 5 eidos-only / 0 invalid · `vitest run src/uix/eidos` 35/36 ficheros (el rojo es `skin-media-player`, el conocido) · `rtl:check` 0 · `docs:check` 0 · `check` COMPLETED sin un solo error atribuible a este componente · prettier: la anotación `/* literal: */` sobrevive en la MISMA línea y mi bloque del README queda limpio; los 12 hunks de deriva del README y los 12 de la demo son PREEXISTENTES en HEAD y no se tocan. Artefactos de documentación del protocolo: README con su `## Talla y tema` derivada del contrato (los nueve ejes + la clasificación de los privados), pestaña `Tokens` en la demo (54 claves resueltas en vivo, verificada en navegador) y veredicto §5 de la ficha. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2 months ago
inline-size: 100%; /* literal: identity — spans the bar's cross axis, the same job `align-self: stretch` does on the vertical twin. Its thickness and its floor ARE tokens. */
min-inline-size: var(--toolbar-separator-length);
}
@media (prefers-reduced-motion: reduce) {
[data-toolbar-link],
[data-toolbar-group-item] {
transition: none;
}
}

Powered by TurnKey Linux.