fix(theming): form cede el cromo de submit/reset al Button que componen

El bloque de accion de form.css vestia CUATRO nodos con las mismas 23 claves:
submit/reset (que COMPONEN el Button canonico - ahi muertas Y contradictorias:
declaraban un boton solido de tinta blanca mientras se pintaba surface verde,
discrepando en silencio desde siempre) y array-add/array-remove, <button>
PELADOS donde las 23 son su UNICO cromo y estan 23/23 VIVAS (medido montandolos
a la fuerza: la demo nunca los monta).

Ejecuta la doctrina YA FIRMADA que nombra a Form.Submit por su nombre
(component-guide.md:126-146, consumer pattern rule 5) - la opcion de escalar a
(0,2,0) queda descartada por escrito: si se quiere el submit solido, el camino
es <Form.Submit variant="solid">, no ganar la cascada.

- El bloque de accion apunta ya SOLO a los dos botones del array; mueren 4
  reglas y se estrechan 5 grupos. Los 4 privados THM-2 de submit/reset fuera
  (nadie los consumia): el diff del generado son EXACTAMENTE 14 lineas (su
  suelo y su forward). Las 23 publicas SE QUEDAN.
- Ceder submit/reset: 0 px sobre 79.296 valores (16 escenarios, V1) + sonda
  0/834 con CONTROL POSITIVO (el CSSOM vivo no contiene una sola regla de
  submit/reset ni un --_form-palette-*). El cromo del array, intacto contra
  los valores pre-firma; su eje de talla sigue llegando por herencia.
- Centinela 22/64 exit 0, identico conjunto: solo cambia la RAZON de las 23
  ("rama array que la demo no monta") - la anterior era falsa a medias (los
  botones del array NO llevan data-button) y el "24" era un error triplicado
  (ficha, README, ledger): son 23.
- CONTINUE: la firma del compuesto EJECUTADA; gradient-picker (36) y
  emoji-picker (3) des-RANCIADOS - ejecutados el 2026-08-20/23, hoy 0
  adjudicaciones por compuesto (verificado; ademas su mecanismo era OTRO:
  especificidad de popover.css, no orden de emision).
- next-features 13: DOS expedientes nuevos destapados y NO ejecutados aqui:
  los botones del array deben COMPONER el Button (soma+morfo, clase A-112,
  y son perceptualmente mudos) - y el eje size de form NO llega a sus
  acciones (<Form size="xs"> renderiza acciones md; solo sobrevive el
  row-gap).

Verificacion: V1 (verificador independiente, informe recuperado de disco tras
interrupcion) + ejecutor con gates completos (vitest 442+1 ajeno - check 0
atribuibles - docs-check 0/0 - eidos-lint 0 invalid).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
alpha-0.1-background
dev 2 months ago
parent 2daa683fa4
commit df3a4d054b

@ -135,8 +135,8 @@ tinta es `fg` (theming §6.7 r7, firmado el 2026-08-20). Renombrado antes de
commitear. El guard de nombres funciona — es el vocabulario DIMENSIONAL el que commitear. El guard de nombres funciona — es el vocabulario DIMENSIONAL el que
no cubre (ver `badge`, hoy mismo). no cubre (ver `badge`, hoy mismo).
⚠⚠ **VEINTICUATRO claves del contrato NO PINTAN, y es una cascada, no un valor.** ⚠⚠ **VEINTITRÉS claves del contrato NO PINTAN sobre `submit`/`reset`, y es una
`[data-form-submit]`, `[data-form-reset]` y los dos botones del array llevan cascada, no un valor.** `[data-form-submit]` y `[data-form-reset]` llevan
también `data-button` porque COMPONEN el `Button` canónico, y `[data-button]` también `data-button` porque COMPONEN el `Button` canónico, y `[data-button]`
casa con la MISMA especificidad (0,1,0) pero carga DESPUÉS: gana `button.css`. casa con la MISMA especificidad (0,1,0) pero carga DESPUÉS: gana `button.css`.
Medido propiedad a propiedad sobre el nodo real —altura, `padding-inline`, Medido propiedad a propiedad sobre el nodo real —altura, `padding-inline`,
@ -144,10 +144,24 @@ tamaño y peso de letra, interlineado, hueco, radio, grosor de borde, el par de
transición y la opacidad deshabilitada—: **ninguna se mueve**. Es el defecto que transición y la opacidad deshabilitada—: **ninguna se mueve**. Es el defecto que
`gradient-picker` documentó (36 de sus 45 claves) y que `emoji-picker` encontró `gradient-picker` documentó (36 de sus 45 claves) y que `emoji-picker` encontró
hoy en su trigger. Allí la respuesta fue RETIRAR las declaraciones muertas; aquí hoy en su trigger. Allí la respuesta fue RETIRAR las declaraciones muertas; aquí
son **24 claves públicas**, y retirar eso es una decisión del autor, no del que son **23 claves públicas**, y retirar eso es una decisión del autor, no del que
ejecuta. Quedan **adjudicadas por PATRÓN** en el ledger (una razón ejecuta. Quedan **adjudicadas por PATRÓN** en el ledger (una razón
arquitectónica escrita una vez) y anotadas para firma. arquitectónica escrita una vez) y anotadas para firma.
> **Nota 2026-08-24 — la firma llegó, y la frase de arriba era falsa a medias.**
> Los DOS botones del array (`array-add` / `array-remove`) **no** llevan
> `data-button`: `form-auto-fields.svelte` los renderiza como `<button>`
> PELADOS, sin componer nada. Sobre ellos las 23 claves están **vivas** — 23 de
> 23 medidas alcanzando en las cinco tallas. Muertas lo estaban sólo sobre
> `submit`/`reset`. Firmada la **opción 1**: el bloque de acción de `form.css`
> apunta ya SÓLO a los dos botones del array, `submit`/`reset` ceden todo su
> cromo al `Button` compuesto (coste medido **0 px** sobre 79.296 valores en 16
> escenarios) y los cuatro privados `_palette-*` THM-2 mueren con ellos. Las 23
> claves públicas SE QUEDAN y su adjudicación pasa de «SUPERSEDED» a «rama que
> la demo no monta», la misma clase que sus once vecinas de AutoFields. Queda
> abierto en `next-features` §13 que esos dos botones compongan también el
> `Button` canónico (toca soma y morfo, clase A-112).
**Las adjudicaciones restantes son ramas que la demo no monta**: el layout **Las adjudicaciones restantes son ramas que la demo no monta**: el layout
`grid` (forzado alcanza — y ojo, su `grid-template-columns` sólo CAMBIA si el `grid` (forzado alcanza — y ojo, su `grid-template-columns` sólo CAMBIA si el
valor altera el número de columnas: con 90px pasa de una columna de 502px a valor altera el número de columnas: con 90px pasa de una columna de 502px a

@ -1889,6 +1889,33 @@ Lo que `chart` destapó (2026-08-22):
escribirlo). Misma familia que el hueco de `mask-image` de `background`. escribirlo). Misma familia que el hueco de `mask-image` de `background`.
Añadirlo a `PROPS` obliga a re-verificar los componentes con ledger, así que Añadirlo a `PROPS` obliga a re-verificar los componentes con ledger, así que
queda anotado. queda anotado.
- **Los dos botones del array de `Form.AutoFields` deberían COMPONER el `Button`
canónico** (destapado por la firma de `form` del 2026-08-24, que los dejó como
únicos dueños del bloque de acción de la receta).
`soma/components/form/components/form-auto-fields.svelte:562-568` y `:583-591`
los renderiza como `<button>`
PELADOS, sin snippet `child` que ofrecer, así que hoy su cromo entero lo
escribe `form.css` a mano: 23 claves públicas duplicando lo que `button.css`
ya sabe pintar (medidas vivas, 23 de 23 en las cinco tallas — no es código
muerto, es cromo re-implementado). Y son además **perceptualmente MUDOS**: el
morfo de `form` declara tres eventos y los tres apuntan al `provider`, así que
ninguno de los dos emite nada. Toca **soma** (componer el `Button`) y **morfo**
(darles evento) — es la clase **A-112**, el precedente `Toolbar.Button`. Al
cerrarlo, las 23 claves se retiran: el censo de `form` bajaría 64 → 41. Ceder
sin componer no es opción — medido, caen al `<button>` del UA (89,52×36 →
68,61×21 px, borde `outset`, Arial 13,33 px, eje de talla colapsado a 21 px).
- **El eje `size` de `form` NO LLEGA a sus acciones** (medido 2026-08-24 con el
control `size` REAL de la demo, sin tocar atributos): un `<Form size="xs">`
renderiza `Form.Submit` con `data-size="md"` — 36 px de alto y 16 px de letra
**en las cinco tallas**. La causa está en el código, no en la cascada:
`eidos/components/form/form-submit.svelte:20` y `form-reset.svelte:15`
declaran `size = 'md'` por defecto y **nada les pasa la talla del
formulario**; `form.svelte:16-19`
estampa `data-size` en el provider y no hay contexto que lo propague — el
reverso exacto de `toolbar/context.ts`, que es lo que A-112 introdujo con el
precedente `ButtonGroup`. Del eje `size` de `form` sólo sobrevive hoy el hueco
entre filas (`row-gap` 12/16/20/24/28 px). **Mueve píxel en xs/sm/lg/xl** ⇒
firma. Es independiente de la cascada: existía ganase quien ganase.
**Deps**: ninguna. Son mejoras del instrumental del eje, ejecutables cuando **Deps**: ninguna. Son mejoras del instrumental del eje, ejecutables cuando

@ -102,10 +102,16 @@ guarda `active-eidos-config.test.ts` · ledger `scripts/theming-sentinel-excepti
firma B′**: era la pregunta hermana de §12.9 y se resolvió con la misma firma B′**: era la pregunta hermana de §12.9 y se resolvió con la misma
herramienta, `:where()`. Todo (doctrina, contrato, emisor, guarda, ledger) herramienta, `:where()`. Todo (doctrina, contrato, emisor, guarda, ledger)
está en §«FIRMA B′ EJECUTADA» de aquí arriba. **No queda nada que firmar.** está en §«FIRMA B′ EJECUTADA» de aquí arriba. **No queda nada que firmar.**
2. **El componente COMPUESTO contra la receta que lo compone** — `form` (23), 2. ~~**El componente COMPUESTO contra la receta que lo compone**~~ — **✅
`gradient-picker` (36), `emoji-picker` (3). **Salida barata ya probada**: FIRMADA Y EJECUTADA 2026-08-24**: el bloque de acción de `form.css` apunta
`toolbar` cede el cromo al `Button` y no pierde ni una clave, porque su ya sólo a los dos botones del array de AutoFields, `submit`/`reset` ceden
receta no escribe la regla. todo su cromo al `Button` que componen (0 diffs medidos) y mueren sus
cuatro forwards `_palette-*`; las 23 públicas se quedan, re-adjudicadas
como rama que la demo no monta. `gradient-picker` (36) y `emoji-picker` (3)
**ya estaban ejecutados** (2026-08-20 y 2026-08-23, verificado el
2026-08-24: hoy ninguno adjudica una sola clave por supersesión del
compuesto). **Salida barata ya probada**: `toolbar` cede el cromo al
`Button` y no pierde ni una clave, porque su receta no escribe la regla.
**Se ENSANCHA a la TINTA (verificado 2026-08-24)**: la misma firma §5.2 del **Se ENSANCHA a la TINTA (verificado 2026-08-24)**: la misma firma §5.2 del
harness cubre ya el `color` de `code`. Medido por CDP harness cubre ya el `color` de `code`. Medido por CDP
(`getMatchedStylesForNode`): sobre `[data-code]` **sólo DOS reglas declaran (`getMatchedStylesForNode`): sobre `[data-code]` **sólo DOS reglas declaran

@ -521,6 +521,41 @@ excepción abre la mano para MEDIR, no para contabilizar.
## 8. Registro ## 8. Registro
- 2026-08-24 — **FIRMA: el bloque de acción de `form` apuntaba a las partes
EQUIVOCADAS.** `form.css:85-190` metía cuatro nodos en el mismo grupo:
`[data-form-submit]`, `[data-form-reset]` y los dos botones del array de
AutoFields. Los dos primeros COMPONEN el `Button` canónico —llevan
`data-button`, que casa a la misma especificidad (0,1,0) y carga después—, así
que ni una de las 23 claves les llegaba; `docs/guides/component-guide.md:126-146`
ya prohíbe esa regla **nombrando a `Form.Submit`** (consumer pattern rule 5).
Los otros dos, en cambio, son `<button>` PELADOS que no componen nada
(`form-auto-fields.svelte:563-568` y `:584-591`) y este bloque es todo el
cromo que tienen. El grupo pasa a apuntar **sólo a ellos**; `submit`/`reset`
ceden, y con ellos mueren los cuatro forwards `_palette-*` THM-2
(`base.ts`, `parts: ['submit','reset']`) que nadie consumía ya.
**Los números**: ceder cuesta **CERO** — 0 diffs en la sonda compartida (834
valores × 7 pasos, los cuatro nodos de la demo) sobre la medición previa del
verificador, que ya daba 0 sobre **79.296 valores en 16 escenarios** (5 tallas
× 5 variantes × 3 colores × hover × foco × disabled). Contrato **64 públicas
→ 64**, privados **4 → 0**. Centinela `form` **22/64** con 42 adjudicadas,
exit 0, idéntico antes y después: sólo cambia la RAZÓN de las 23. Del generado
desaparecen exactamente las 14 líneas de las cuatro claves (el suelo
`:where([data-form-submit], [data-form-reset])` y su forward); `palette.css`
no se mueve.
**Lo que enseñó**: (1) **una adjudicación por patrón puede ser cierta en el
número y falsa en la razón.** El ledger decía «SUPERSEDED por el `Button`
compuesto» de las 23 y afirmaba que «los dos botones del array llevan también
`data-button`». No lo llevan. Las 23 no estaban muertas: estaban **vivas sobre
las partes equivocadas del grupo** — 23 de 23 alcanzan al montar los botones
del array, en las cinco tallas. Retirarlas, que es lo que la razón vieja
invitaba a hacer, habría dejado dos botones reales en el `<button>` del UA
(89,52×36 → 68,61×21 px, borde `outset`, Arial 13,33). Una razón escrita para
un grupo de selectores hay que comprobarla **selector por selector**. (2) La
cifra correcta era **23**, no 24: tres documentos la habían copiado mal y sólo
el handoff la tenía bien.
- 2026-08-24 — **FIRMA: `file-upload` deja de BARRER DESCENDIENTES.** Su receta - 2026-08-24 — **FIRMA: `file-upload` deja de BARRER DESCENDIENTES.** Su receta
escribía `[data-file-upload] [data-disabled]` (0,2,0) —única ocurrencia de escribía `[data-file-upload] [data-disabled]` (0,2,0) —única ocurrencia de
«combinador descendiente hacia un atributo de estado desnudo» en las **171** «combinador descendiente hacia un atributo de estado desnudo» en las **171**

@ -1502,7 +1502,7 @@ export const SENTINEL_PATTERN_EXCEPTIONS: Array<{
component: 'form', component: 'form',
pattern: /^(action-|transition-|disabled-opacity$)/, pattern: /^(action-|transition-|disabled-opacity$)/,
reason: reason:
'SUPERSEDED by the composed Button: [data-form-submit] & co. also carry `data-button`, and `[data-button]` matches at the SAME specificity (0,1,0) but loads LATER, so button.css paints the whole action chrome. Measured 2026-08-23, eight properties one by one — height, padding-inline, font-size, font-weight, line-height, gap, radius, border-width — plus the transition pair and the disabled opacity: NOT ONE of them moves. Same defect gradient-picker documented (36 of its 45 keys) and emoji-picker found in its trigger; the answer there was to retire the dead declarations, and here that is 24 public keys — a decision for the author, so they are adjudicated meanwhile (next-features 13)' 'BRANCH THE DEMO DOES NOT MOUNT: since the firma of 2026-08-24 these 23 public keys paint ONE pair of nodes — [data-form-auto-fields-array-add] and [data-form-auto-fields-array-remove], the bare `<button>`s of the AutoFields array (form-auto-fields.svelte). The demo boots its `auto` mode over an object schema, which renders group + field and no array, so the guard never sees them. They are NOT dead: measured 2026-08-24 with both buttons mounted inside the real <form>, 23 of 23 reach across the five sizes (action-height-* 26/30/36/44/52px -> 333px, action-padding-inline-md 14 -> 77px, action-font-size-md 14 -> 41px, action-radius 6 -> 19px, action-border-width 1 -> 7px, action-gap 8 -> 37px, the transition pair 0.12s -> 11.5s on four properties, disabled-opacity on the disabled remove). The submit/reset half of the old group — where these keys really were superseded by the composed <Button> — was ceded in that firma at a measured cost of ZERO pixels, and its four `_palette-*` forwards went with it. What is left open is the array pair composing the canonical <Button> too, which is soma + morfo work (next-features 13)'
}, },
{ {
component: 'editable', component: 'editable',

@ -82,9 +82,9 @@ are part of the recipe. They do not create new semantic events.
## Talla y tema ## Talla y tema
**64 claves públicas** en `lib/recipes/base.ts` + cuatro forwards de paleta THM-2 **64 claves públicas** en `lib/recipes/base.ts` y **ningún privado de receta**
(`_palette-*`, partes `submit` y `reset`). La pestaña **Tokens** de su demo las desde la firma del 2026-08-24. La pestaña **Tokens** de su demo las resuelve en
resuelve en vivo. vivo.
Lo que entró el **2026-08-23** (71 % → 86 %), diez claves que iban a los Lo que entró el **2026-08-23** (71 % → 86 %), diez claves que iban a los
primitivos a pelo: el resumen de errores (`error-summary-{bg,fg,border}`), el primitivos a pelo: el resumen de errores (`error-summary-{bg,fg,border}`), el
@ -93,22 +93,32 @@ de AutoFields (`auto-fields-{array-bg,item-bg,border}`), las dos del widget
(`widget-{bg,border}`) y el subrayado a media tinta de los enlaces del resumen (`widget-{bg,border}`) y el subrayado a media tinta de los enlaces del resumen
(`link-underline-fg`, el par del `-offset` que ya existía). (`link-underline-fg`, el par del `-offset` que ya existía).
⚠⚠ **VEINTICUATRO claves del contrato NO PINTAN, y no es deuda de valor: es una ⚠⚠ **VEINTITRÉS claves del contrato NO PINTABAN sobre `submit`/`reset`, y no era
cascada.** `[data-form-submit]`, `[data-form-reset]` y los dos botones del array deuda de valor: era una cascada.** `[data-form-submit]` y `[data-form-reset]`
llevan también `data-button` porque COMPONEN el `Button` canónico, y llevan también `data-button` porque COMPONEN el `Button` canónico, y
`[data-button]` casa con la MISMA especificidad (0,1,0) pero carga DESPUÉS: gana `[data-button]` casa con la MISMA especificidad (0,1,0) pero carga DESPUÉS: gana
`button.css`. Medido propiedad a propiedad —altura, padding-inline, tamaño y `button.css`. Medido propiedad a propiedad —altura, padding-inline, tamaño y
peso de letra, interlineado, hueco, radio, grosor de borde, el par de transición peso de letra, interlineado, hueco, radio, grosor de borde, el par de transición
y la opacidad deshabilitada—: **ninguna se mueve**. Es el defecto que y la opacidad deshabilitada—: **ninguna se movía**. Es el defecto que
`gradient-picker` documentó (36 de sus 45 claves) y que `emoji-picker` encontró `gradient-picker` documentó (36 de sus 45 claves) y que `emoji-picker` encontró
en su trigger; allí la respuesta fue RETIRAR las declaraciones muertas, y aquí en su trigger; allí la respuesta fue RETIRAR las declaraciones muertas.
eso son 24 claves públicas — una decisión que firma el autor, así que de momento
quedan adjudicadas en el ledger y anotadas. **Firmado el 2026-08-24 — y los dos botones del array NO llevaban `data-button`.**
`form-auto-fields.svelte` renderiza `array-add` y `array-remove` como `<button>`
PELADOS, sin componer nada: sobre ELLOS las 23 claves están vivas (23 de 23
medidas alcanzando en las cinco tallas). Así que el bloque de acción de
`form.css` apunta ya sólo a esos dos, `submit`/`reset` ceden todo su cromo al
`Button` compuesto —coste medido **0 px** sobre 79.296 valores en 16
escenarios— y los cuatro forwards `_palette-*` THM-2 murieron con ellos. Las 23
claves públicas se quedan, adjudicadas ahora como **rama que la demo no monta**
(el modo `auto` renderiza `group` + `field`, nunca un `array`), la misma clase
que sus once vecinas de AutoFields. Que esos dos botones compongan también el
`Button` canónico queda abierto en `next-features` §13 — toca soma y morfo.
**Lo que queda fuera por doctrina**: los tres privados del panel **Lo que queda fuera por doctrina**: los tres privados del panel
(`--_form-padding` / `-bg` / `-shadow`) son un CONMUTADOR (dos fuentes: la (`--_form-padding` / `-bg` / `-shadow`) son un CONMUTADOR (dos fuentes: la
variante `plain` y la `panel`), y los cuatro `--_form-action-*` leen el forward variante `plain` y la `panel`), y los `--_form-action-*` son el eje de talla
de paleta THM-2, que no se acuña. heredado del provider, no valores acuñables.
## Comparativa ## Comparativa

@ -82,8 +82,19 @@
border-color: var(--_form-invalid-accent); border-color: var(--_form-invalid-accent);
} }
[data-form-submit], /* The action chrome is the AutoFields array's, and ONLY its.
[data-form-reset], `form-auto-fields.svelte` renders `array-add` / `array-remove` as bare
`<button>`s composing nothing, so what follows is the only chrome those two
nodes have — the size axis reaches them by INHERITING `--_form-action-*`
from the provider above.
`Form.Submit` / `Form.Reset` are deliberately absent: they compose the
canonical `<Button>` through its `child` snippet, and
`docs/guides/component-guide.md:126-146` names `Form.Submit` when it states
consumer pattern rule 5 — the composer's recipe paints NO chrome on the
composed node. They used to ride in every rule of this block and never won
a pixel: `[data-button]` matches at the same specificity (0,1,0) and loads
later. Signed 2026-08-24; ceding measured at ZERO diffs on both nodes over
79,296 computed values across 16 scenarios. */
[data-form-auto-fields-array-add], [data-form-auto-fields-array-add],
[data-form-auto-fields-array-remove] { [data-form-auto-fields-array-remove] {
--_form-action-bg: var(--color-neutral-element); --_form-action-bg: var(--color-neutral-element);
@ -115,50 +126,7 @@
color var(--form-transition-duration) var(--form-transition-ease); color var(--form-transition-duration) var(--form-transition-ease);
} }
[data-form-submit][data-size='xs'], /* The remove button is the quiet one of the pair. */
[data-form-reset][data-size='xs'] {
--_form-action-height: var(--form-action-height-xs);
--_form-action-padding-inline: var(--form-action-padding-inline-xs);
--_form-action-font-size: var(--form-action-font-size-xs);
}
[data-form-submit][data-size='sm'],
[data-form-reset][data-size='sm'] {
--_form-action-height: var(--form-action-height-sm);
--_form-action-padding-inline: var(--form-action-padding-inline-sm);
--_form-action-font-size: var(--form-action-font-size-sm);
}
[data-form-submit][data-size='lg'],
[data-form-reset][data-size='lg'] {
--_form-action-height: var(--form-action-height-lg);
--_form-action-padding-inline: var(--form-action-padding-inline-lg);
--_form-action-font-size: var(--form-action-font-size-lg);
}
/* Colour comes from the shared palette forward (`--_form-palette-*`, parts
`submit` + `reset`): any role / 33 scale / custom value fills the solid
action look. `'neutral'` never stamps `data-color` — the base action
defaults above (element bg + text ink) ARE the neutral. */
[data-form-submit][data-color],
[data-form-submit][data-color-custom],
[data-form-reset][data-color],
[data-form-reset][data-color-custom] {
--_form-action-bg: var(--_form-palette-solid);
--_form-action-bg-hover: var(--_form-palette-solid-hover);
--_form-action-border: var(--_form-palette-border);
--_form-action-color: var(--_form-palette-contrast);
}
[data-form-submit][data-variant='outline'],
[data-form-reset][data-variant='outline'] {
--_form-action-bg: transparent;
--_form-action-bg-hover: color-mix(in srgb, var(--_form-action-border) 10%, transparent);
--_form-action-color: var(--_form-action-border);
}
[data-form-submit][data-variant='ghost'],
[data-form-reset][data-variant='ghost'],
[data-form-auto-fields-array-remove] { [data-form-auto-fields-array-remove] {
--_form-action-bg: transparent; --_form-action-bg: transparent;
--_form-action-bg-hover: color-mix(in srgb, var(--color-neutral-track) 70%, transparent); --_form-action-bg-hover: color-mix(in srgb, var(--color-neutral-track) 70%, transparent);
@ -166,23 +134,17 @@
--_form-action-color: var(--color-content-subtle); --_form-action-color: var(--color-content-subtle);
} }
[data-form-submit]:not(:disabled):hover,
[data-form-reset]:not(:disabled):hover,
[data-form-auto-fields-array-add]:not(:disabled):hover, [data-form-auto-fields-array-add]:not(:disabled):hover,
[data-form-auto-fields-array-remove]:not(:disabled):hover { [data-form-auto-fields-array-remove]:not(:disabled):hover {
background: var(--_form-action-bg-hover); background: var(--_form-action-bg-hover);
} }
[data-form-submit]:focus-visible,
[data-form-reset]:focus-visible,
[data-form-auto-fields-array-add]:focus-visible, [data-form-auto-fields-array-add]:focus-visible,
[data-form-auto-fields-array-remove]:focus-visible { [data-form-auto-fields-array-remove]:focus-visible {
outline: var(--focus-ring-width) solid var(--focus-ring-color); outline: var(--focus-ring-width) solid var(--focus-ring-color);
outline-offset: var(--focus-ring-offset); outline-offset: var(--focus-ring-offset);
} }
[data-form-submit]:disabled,
[data-form-reset]:disabled,
[data-form-auto-fields-array-add]:disabled, [data-form-auto-fields-array-add]:disabled,
[data-form-auto-fields-array-remove]:disabled { [data-form-auto-fields-array-remove]:disabled {
cursor: not-allowed; cursor: not-allowed;

@ -6033,20 +6033,6 @@
--_field-palette-text: var(--palette-text, var(--color-primary-text)); --_field-palette-text: var(--palette-text, var(--color-primary-text));
} }
:where([data-form-submit], [data-form-reset]) {
--_form-palette-solid: var(--color-primary-solid);
--_form-palette-solid-hover: var(--color-primary-solid-hover);
--_form-palette-border: var(--color-primary-border);
--_form-palette-contrast: var(--color-primary-contrast);
}
[data-form-submit]:where([data-color], [data-color-custom]), [data-form-reset]:where([data-color], [data-color-custom]) {
--_form-palette-border: var(--palette-border, var(--color-primary-border));
--_form-palette-solid: var(--palette-solid, var(--color-primary-solid));
--_form-palette-solid-hover: var(--palette-solid-hover, var(--color-primary-solid-hover));
--_form-palette-contrast: var(--palette-contrast, var(--color-primary-contrast));
}
:where([data-image]) { :where([data-image]) {
--_image-palette-track: var(--color-primary-track); --_image-palette-track: var(--color-primary-track);
} }

@ -1393,25 +1393,10 @@ export const THEME_BASE_RECIPE_TOKENS = defineRecipes({
'action-gap': 'var(--space-2)', 'action-gap': 'var(--space-2)',
'action-radius': 'var(--radius-md)', 'action-radius': 'var(--radius-md)',
'action-border-width': 'var(--border-width)', 'action-border-width': 'var(--border-width)',
// Action palette forward (THM-2) — submit/reset tint through the shared // `_palette-*` forwards (THM-2) removed: Form.Submit/Form.Reset compose
// layer (roles + 33 scales + custom). Host = primary (submit's stamped // the canonical <Button>, so their tint lives in button.css. The
// default); `'neutral'` stamps nothing and keeps the base action look. // `action-*` keys above stay — they are the chrome of the AutoFields
'_palette-solid': { // array buttons, which compose nothing.
parts: ['submit', 'reset'],
declarations: [{ value: 'var(--color-primary-solid)', scope: 'host' }]
},
'_palette-solid-hover': {
parts: ['submit', 'reset'],
declarations: [{ value: 'var(--color-primary-solid-hover)', scope: 'host' }]
},
'_palette-border': {
parts: ['submit', 'reset'],
declarations: [{ value: 'var(--color-primary-border)', scope: 'host' }]
},
'_palette-contrast': {
parts: ['submit', 'reset'],
declarations: [{ value: 'var(--color-primary-contrast)', scope: 'host' }]
},
'error-summary-padding': 'var(--space-3)', 'error-summary-padding': 'var(--space-3)',
'error-summary-border-width': 'var(--border-width)', 'error-summary-border-width': 'var(--border-width)',
'error-summary-radius': 'var(--radius-md)', 'error-summary-radius': 'var(--radius-md)',

Loading…
Cancel
Save

Powered by TurnKey Linux.