@ -10,9 +10,9 @@
- **Medido** : 2026-08-23 · **162 recetas** con CSS + **8 componentes sin receta** = 170 fichas, el árbol entero de `eidos/components/`
- **La pregunta** : ¿cuánto de la apariencia de cada componente puede cambiar un tema **sin tocar el sistema ni la receta** ?
- **Alcance global** : **6 7%** — 3049 de 4572 knobs pasan por un token público del componente
- **Reparto** : público 3049 · privado 317 · global 813 · literal 393 · sistema transversal 509 · excepción firmada 138 _(los dos últimos, fuera del ratio)_
- **Sin token público propio** : 24 · **alcance < 20 %** : 12 · **alcance 100 %** : 28 · **con eje `size`** : 57
- **Alcance global** : **6 8%** — 3062 de 4507 knobs pasan por un token público del componente
- **Reparto** : público 3062 · privado 315 · global 783 · literal 347 · sistema transversal 509 · excepción firmada 177 _(los dos últimos, fuera del ratio)_
- **Sin token público propio** : 23 · **alcance < 20 %** : 12 · **alcance 100 %** : 36 · **con eje `size`** : 55
## Cómo se lee
@ -86,20 +86,20 @@ theming §6.7 lo pone delante (`hover-bg`). Las fichas proponen la forma
| 11 | [natural-time-picker ](./natural-time-picker.md ) | 20 | 74% | 77 | 62 |
| 12 | [sidebar ](./sidebar.md ) | 19 | 55% | 45 | 50 |
| 13 | [mockup ](./mockup.md ) | 18 | 38% | 29 | 0 |
| 14 | [radio-group](./radio-group.md ) | 17 | 77% | 75 | 61 |
| 15 | [popover](./popover.md ) | 16 | 67% | 51 | 46 |
| 16 | [form](./form.md ) | 15 | 71% | 52 | 54 |
| 17 | [tag-group](./tag-group.md ) | 15 | 65% | 46 | 91 |
| 18 | [file-upload](./file-upload.md ) | 14 | 76% | 61 | 98 |
| 19 | [c ombobox](./combobox.md ) | 13 | 85% | 97 | 106 |
| 20 | [password-field](./password-field.md ) | 13 | 62% | 35 | 3 0 |
| 14 | [popover](./popover.md ) | 16 | 67% | 51 | 46 |
| 15 | [tag-group](./tag-group.md ) | 15 | 65% | 46 | 91 |
| 16 | [combobox](./combobox.md ) | 13 | 85% | 97 | 106 |
| 17 | [password-field](./password-field.md ) | 13 | 62% | 35 | 30 |
| 18 | [range-calendar](./range-calendar.md ) | 13 | 0% | 98 | 0 |
| 19 | [c hat-message](./chat-message.md ) | 12 | 84% | 84 | 75 |
| 20 | [month-grid](./month-grid.md ) | 12 | 0% | 61 | 0 |
## Sin ningún token público propio (24 )
## Sin ningún token público propio (23 )
Ni una clave pública en `lib/recipes/base.ts` — alguno tiene privados forward
(`_palette-*`), que no son contrato: un tema no puede nombrarlos.
[`alert-dialog` ](./alert-dialog.md ) · [`aspect-ratio` ](./aspect-ratio.md ) · [`auto-grid` ](./auto-grid.md ) · [` avatar`](./avatar.md ) · [` cascade`](./cascade.md ) · [`css-field` ](./css-field.md ) · [`date-picker` ](./date-picker.md ) · [`display` ](./display.md ) · [`field-langs` ](./field-langs.md ) · [`heading` ](./heading.md ) · [`highlight` ](./highlight.md ) · [`mask-field` ](./mask-field.md ) · [`mockup` ](./mockup.md ) · [`month-grid` ](./month-grid.md ) · [`motion` ](./motion.md ) · [`number-field` ](./number-field.md ) · [`palabras` ](./palabras.md ) · [`range-calendar` ](./range-calendar.md ) · [`stack` ](./stack.md ) · [`text` ](./text.md ) · [`text-blur` ](./text-blur.md ) · [`text-scramble` ](./text-scramble.md ) · [`wrap` ](./wrap.md ) · [`year-grid` ](./year-grid.md )
[`alert-dialog` ](./alert-dialog.md ) · [`aspect-ratio` ](./aspect-ratio.md ) · [`auto-grid` ](./auto-grid.md ) · [` cascade`](./cascade.md ) · [`css-field` ](./css-field.md ) · [`date-picker` ](./date-picker.md ) · [`display` ](./display.md ) · [`field-langs` ](./field-langs.md ) · [`heading` ](./heading.md ) · [`highlight` ](./highlight.md ) · [`mask-field` ](./mask-field.md ) · [`mockup` ](./mockup.md ) · [`month-grid` ](./month-grid.md ) · [`motion` ](./motion.md ) · [`number-field` ](./number-field.md ) · [`palabras` ](./palabras.md ) · [`range-calendar` ](./range-calendar.md ) · [`stack` ](./stack.md ) · [`text` ](./text.md ) · [`text-blur` ](./text-blur.md ) · [`text-scramble` ](./text-scramble.md ) · [`wrap` ](./wrap.md ) · [`year-grid` ](./year-grid.md )
## Tabla completa (162 recetas, por alcance ascendente)
@ -147,47 +147,36 @@ La columna «contrato» cuenta las claves **públicas** del bloque del component
| [virtual-list ](./virtual-list.md ) | 67% | 13 | 8 | 0 | 0 | 4 | 1 | 12 | – |
| [separator ](./separator.md ) | 67% | 6 | 4 | 0 | 0 | 2 | 0 | 3 | – |
| [listbox ](./listbox.md ) | 68% | 37 | 23 | 9 | 1 | 1 | 3 | 21 | – |
| [color-swatch ](./color-swatch.md ) | 70% | 10 | 7 | 0 | 3 | 0 | 0 | 12 | y |
| [s-text-virtual-list ](./s-text-virtual-list.md ) | 70% | 10 | 7 | 0 | 3 | 0 | 0 | 9 | – |
| [form ](./form.md ) | 71% | 52 | 36 | 8 | 5 | 2 | 1 | 54 | y |
| [image-picker ](./image-picker.md ) | 71% | 20 | 12 | 0 | 1 | 4 | 3 | 13 | – |
| [search-field ](./search-field.md ) | 71% | 15 | 10 | 0 | 0 | 4 | 1 | 17 | y |
| [skip-link ](./skip-link.md ) | 71% | 8 | 5 | 0 | 0 | 2 | 1 | 8 | – |
| [checkbox ](./checkbox.md ) | 72% | 30 | 21 | 8 | 0 | 0 | 1 | 47 | y |
| [virtual-grid ](./virtual-grid.md ) | 73% | 12 | 8 | 0 | 0 | 3 | 1 | 12 | – |
| [natural-time-picker ](./natural-time-picker.md ) | 74% | 77 | 56 | 0 | 14 | 6 | 1 | 62 | y |
| [color-picker ](./color-picker.md ) | 75% | 82 | 59 | 7 | 2 | 11 | 3 | 71 | y |
| [editable ](./editable.md ) | 75% | 44 | 30 | 7 | 1 | 2 | 4 | 56 | y |
| [avatar ](./avatar.md ) | 75% | 36 | 27 | 3 | 0 | 6 | 0 | 0 | y |
| [tooltip ](./tooltip.md ) | 75% | 21 | 15 | 5 | 0 | 0 | 1 | 23 | y |
| [badge ](./badge.md ) | 75% | 20 | 15 | 5 | 0 | 0 | 0 | 71 | y |
| [meter ](./meter.md ) | 75% | 12 | 9 | 1 | 2 | 0 | 0 | 28 | y |
| [switch ](./switch.md ) | 76% | 22 | 16 | 4 | 1 | 0 | 1 | 51 | y |
| [file-upload ](./file-upload.md ) | 76% | 61 | 45 | 9 | 1 | 4 | 2 | 98 | y |
| [timeline ](./timeline.md ) | 77% | 47 | 36 | 10 | 0 | 1 | 0 | 45 | y |
| [carousel ](./carousel.md ) | 77% | 35 | 23 | 2 | 0 | 5 | 5 | 27 | – |
| [radio-group ](./radio-group.md ) | 77% | 75 | 56 | 10 | 7 | 0 | 2 | 61 | y |
| [chat-log ](./chat-log.md ) | 77% | 42 | 30 | 0 | 4 | 5 | 3 | 31 | – |
| [card ](./card.md ) | 78% | 37 | 28 | 8 | 0 | 0 | 1 | 97 | y |
| [card ](./card.md ) | 78% | 37 | 28 | 8 | 0 | 0 | 1 | 98 | y |
| [knob ](./knob.md ) | 78% | 26 | 18 | 1 | 1 | 3 | 3 | 33 | – |
| [stepper ](./stepper.md ) | 79% | 60 | 44 | 11 | 0 | 1 | 4 | 69 | y |
| [callout ](./callout.md ) | 79% | 14 | 11 | 3 | 0 | 0 | 0 | 34 | – |
| [chat-composer ](./chat-composer.md ) | 79% | 44 | 31 | 0 | 3 | 5 | 5 | 31 | – |
| [aura ](./aura.md ) | 80% | 35 | 28 | 0 | 1 | 6 | 0 | 37 | y |
| [textarea ](./textarea.md ) | 80% | 28 | 20 | 2 | 0 | 3 | 3 | 37 | – |
| [ra ting-group](./rating-group.md ) | 80% | 16 | 12 | 0 | 1 | 2 | 1 | 25 | y |
| [toggle](./toggle.md ) | 81% | 28 | 22 | 1 | 1 | 3 | 1 | 119 | y |
| [ra dio-group](./radio-group.md ) | 81% | 59 | 46 | 10 | 1 | 0 | 2 | 69 | – |
| [switch](./switch.md ) | 81% | 22 | 17 | 4 | 0 | 0 | 1 | 52 | y |
| [code-block ](./code-block.md ) | 81% | 27 | 22 | 2 | 3 | 0 | 0 | 20 | – |
| [editable ](./editable.md ) | 82% | 42 | 31 | 7 | 0 | 0 | 4 | 56 | y |
| [metrics ](./metrics.md ) | 82% | 50 | 41 | 5 | 0 | 4 | 0 | 72 | y |
| [prose ](./prose.md ) | 83% | 53 | 44 | 0 | 0 | 9 | 0 | 37 | y |
| [select](./select.md ) | 83% | 72 | 54 | 5 | 3 | 3 | 7 | 101 | y |
| [file-upload](./file-upload.md ) | 83% | 56 | 45 | 9 | 0 | 0 | 2 | 98 | y |
| [float-panel ](./float-panel.md ) | 84% | 53 | 41 | 3 | 0 | 5 | 4 | 40 | – |
| [calendar ](./calendar.md ) | 84% | 71 | 57 | 7 | 0 | 4 | 3 | 74 | – |
| [onion-menu ](./onion-menu.md ) | 84% | 22 | 16 | 0 | 1 | 2 | 3 | 19 | – |
| [chat-message ](./chat-message.md ) | 84% | 84 | 65 | 0 | 6 | 6 | 7 | 75 | y |
| [grid-list ](./grid-list.md ) | 85% | 31 | 22 | 2 | 1 | 1 | 5 | 38 | – |
| [combobox ](./combobox.md ) | 85% | 97 | 76 | 4 | 3 | 6 | 8 | 106 | – |
| [waveform ](./waveform.md ) | 86% | 7 | 6 | 0 | 1 | 0 | 0 | 11 | y |
| [form ](./form.md ) | 86% | 51 | 43 | 7 | 0 | 0 | 1 | 64 | y |
| [table ](./table.md ) | 86% | 46 | 37 | 3 | 0 | 3 | 3 | 45 | – |
| [context-menu ](./context-menu.md ) | 87% | 33 | 26 | 0 | 1 | 3 | 3 | 28 | – |
| [progress ](./progress.md ) | 87% | 30 | 26 | 2 | 2 | 0 | 0 | 43 | y |
@ -202,6 +191,8 @@ La columna «contrato» cuenta las claves **públicas** del bloque del component
| [drag-drop ](./drag-drop.md ) | 89% | 16 | 8 | 1 | 0 | 0 | 7 | 9 | – |
| [chat-typing ](./chat-typing.md ) | 89% | 9 | 8 | 0 | 1 | 0 | 0 | 7 | – |
| [chart ](./chart.md ) | 89% | 95 | 81 | 0 | 0 | 10 | 4 | 45 | – |
| [calendar ](./calendar.md ) | 89% | 67 | 57 | 7 | 0 | 0 | 3 | 74 | – |
| [avatar ](./avatar.md ) | 90% | 30 | 27 | 3 | 0 | 0 | 0 | 88 | y |
| [card-group ](./card-group.md ) | 90% | 22 | 18 | 0 | 0 | 2 | 2 | 20 | – |
| [collapsible ](./collapsible.md ) | 90% | 12 | 9 | 0 | 1 | 0 | 2 | 11 | – |
| [result ](./result.md ) | 90% | 21 | 19 | 0 | 0 | 2 | 0 | 27 | – |
@ -209,6 +200,7 @@ La columna «contrato» cuenta las claves **públicas** del bloque del component
| [toolbar ](./toolbar.md ) | 91% | 35 | 30 | 2 | 0 | 1 | 2 | 54 | y |
| [feed ](./feed.md ) | 91% | 34 | 30 | 1 | 1 | 1 | 1 | 50 | – |
| [button ](./button.md ) | 91% | 23 | 20 | 2 | 0 | 0 | 1 | 106 | y |
| [select ](./select.md ) | 92% | 69 | 57 | 5 | 0 | 0 | 7 | 103 | y |
| [tree-view ](./tree-view.md ) | 92% | 28 | 24 | 1 | 0 | 1 | 2 | 46 | – |
| [gradient-builder ](./gradient-builder.md ) | 93% | 60 | 52 | 0 | 1 | 3 | 4 | 72 | – |
| [color-field ](./color-field.md ) | 93% | 15 | 14 | 0 | 1 | 0 | 0 | 26 | y |
@ -225,11 +217,14 @@ La columna «contrato» cuenta las claves **públicas** del bloque del component
| [toast ](./toast.md ) | 98% | 46 | 45 | 0 | 0 | 1 | 0 | 85 | – |
| [command ](./command.md ) | 98% | 52 | 49 | 0 | 0 | 1 | 2 | 57 | – |
| [field ](./field.md ) | 98% | 64 | 58 | 1 | 0 | 0 | 5 | 68 | y |
| [chat-composer ](./chat-composer.md ) | 100% | 39 | 34 | 0 | 0 | 0 | 5 | 33 | – |
| [chat-log ](./chat-log.md ) | 100% | 37 | 34 | 0 | 0 | 0 | 3 | 35 | – |
| [navigation-menu ](./navigation-menu.md ) | 100% | 37 | 33 | 0 | 0 | 0 | 4 | 44 | – |
| [heading ](./heading.md ) | — | 36 | 0 | 0 | 0 | 0 | 36 | 0 | – |
| [s-text ](./s-text.md ) | 100% | 30 | 2 | 0 | 0 | 0 | 28 | 3 | – |
| [emoji-picker ](./emoji-picker.md ) | 100% | 26 | 22 | 0 | 0 | 0 | 4 | 21 | – |
| [pagination ](./pagination.md ) | 100% | 26 | 24 | 0 | 0 | 0 | 2 | 34 | y |
| [toggle ](./toggle.md ) | 100% | 25 | 24 | 0 | 0 | 0 | 1 | 126 | y |
| [text ](./text.md ) | — | 24 | 0 | 0 | 0 | 0 | 24 | 0 | – |
| [breadcrumb ](./breadcrumb.md ) | 100% | 23 | 20 | 0 | 0 | 0 | 3 | 28 | y |
| [chat-list ](./chat-list.md ) | 100% | 18 | 18 | 0 | 0 | 0 | 0 | 18 | – |
@ -237,18 +232,23 @@ La columna «contrato» cuenta las claves **públicas** del bloque del component
| [splitter ](./splitter.md ) | 100% | 18 | 17 | 0 | 0 | 0 | 1 | 15 | – |
| [empty-state ](./empty-state.md ) | 100% | 17 | 17 | 0 | 0 | 0 | 0 | 26 | y |
| [link-preview ](./link-preview.md ) | 100% | 17 | 14 | 0 | 0 | 0 | 3 | 35 | – |
| [image-picker ](./image-picker.md ) | 100% | 16 | 13 | 0 | 0 | 0 | 3 | 14 | – |
| [rating-group ](./rating-group.md ) | 100% | 14 | 13 | 0 | 0 | 0 | 1 | 29 | – |
| [code ](./code.md ) | 100% | 13 | 7 | 0 | 0 | 0 | 6 | 6 | – |
| [anchor-nav ](./anchor-nav.md ) | 100% | 12 | 11 | 0 | 0 | 0 | 1 | 12 | – |
| [date-field ](./date-field.md ) | 100% | 11 | 11 | 0 | 0 | 0 | 0 | 21 | y |
| [search-field ](./search-field.md ) | 100% | 11 | 10 | 0 | 0 | 0 | 1 | 17 | y |
| [time-field ](./time-field.md ) | 100% | 11 | 11 | 0 | 0 | 0 | 0 | 21 | y |
| [text-gradient ](./text-gradient.md ) | 100% | 10 | 10 | 0 | 0 | 0 | 0 | 7 | – |
| [banner ](./banner.md ) | 100% | 9 | 9 | 0 | 0 | 0 | 0 | 53 | y |
| [box ](./box.md ) | 100% | 9 | 9 | 0 | 0 | 0 | 0 | 43 | – |
| [label ](./label.md ) | 100% | 8 | 2 | 0 | 0 | 0 | 6 | 2 | – |
| [text-focus ](./text-focus.md ) | 100% | 8 | 8 | 0 | 0 | 0 | 0 | 8 | – |
| [color-swatch ](./color-swatch.md ) | 100% | 7 | 7 | 0 | 0 | 0 | 0 | 14 | y |
| [date-range-field ](./date-range-field.md ) | 100% | 7 | 6 | 0 | 0 | 0 | 1 | 7 | – |
| [time-range-field ](./time-range-field.md ) | 100% | 7 | 6 | 0 | 0 | 0 | 1 | 7 | – |
| [display ](./display.md ) | — | 6 | 0 | 0 | 0 | 0 | 6 | 0 | – |
| [skip-link ](./skip-link.md ) | 100% | 6 | 5 | 0 | 0 | 0 | 1 | 8 | – |
| [text-circular ](./text-circular.md ) | 100% | 6 | 6 | 0 | 0 | 0 | 0 | 6 | – |
| [barcode ](./barcode.md ) | 100% | 5 | 5 | 0 | 0 | 0 | 0 | 7 | – |
| [qr-code ](./qr-code.md ) | 100% | 3 | 3 | 0 | 0 | 0 | 0 | 10 | – |