diff --git a/web/routes/temas/color/+page.svelte b/web/routes/temas/color/+page.svelte
index a103745a1..e366a7bc3 100644
--- a/web/routes/temas/color/+page.svelte
+++ b/web/routes/temas/color/+page.svelte
@@ -55,6 +55,34 @@
let theme = $state<'light' | 'dark'>('light')
const SCALE_NAMES = Object.keys(THEME_BASE_LIGHT_COLOR_SCALES)
+
+ // Radix's palette taxonomy — display grouping only (the library itself is flat).
+ // Any scale not listed falls into "Otros" so nothing is ever dropped.
+ const PALETTE_GROUPS: { label: string; names: readonly string[] }[] = [
+ { label: 'Grises (neutros tintados)', names: ['gray', 'mauve', 'slate', 'sage', 'olive', 'sand'] },
+ {
+ label: 'Colores',
+ names: [
+ 'tomato', 'red', 'ruby', 'crimson', 'pink', 'plum', 'purple', 'violet', 'iris',
+ 'indigo', 'blue', 'cyan', 'teal', 'jade', 'green', 'grass', 'brown', 'orange'
+ ]
+ },
+ { label: 'Brillantes (sólido claro)', names: ['amber', 'yellow', 'lime', 'mint', 'sky'] },
+ { label: 'Metales', names: ['gold', 'bronze'] }
+ ]
+ const paletteGroups = (() => {
+ const present = new Set(SCALE_NAMES)
+ const used = new Set()
+ const groups = PALETTE_GROUPS.map((g) => {
+ const names = g.names.filter((n) => present.has(n))
+ names.forEach((n) => used.add(n))
+ return { label: g.label, names }
+ }).filter((g) => g.names.length > 0)
+ const leftover = SCALE_NAMES.filter((n) => !used.has(n))
+ if (leftover.length) groups.push({ label: 'Otros', names: leftover })
+ return groups
+ })()
+
const ROLES = completeColorRoleMap(THEME_BASE_COLOR_ROLES)
const STEPS = COLOR_SCALE_STEPS
const SLOTS = COLOR_ROLE_SLOTS
@@ -335,7 +363,9 @@
paso 9. La paleta la trae el tema; el framework envía estas 31 (valores
Radix exactos, listos para autoría OKLCH). Es la librería fija de
referencia — el seed del builder NO la cambia: deriva los roles (arriba),
- que son escalas generadas nuevas, no miembros de esta lista.
+ que son escalas generadas nuevas, no miembros de esta lista. Agrupada como Radix — los
+ grises tintados (gray/mauve/slate/sage/olive/sand) se parecen porque son
+ casi-neutros (croma ~0.01): cada uno con un tinte de hue mínimo para armonizar con su acento.
@@ -347,20 +377,23 @@
{/each}
- {#each SCALE_NAMES as name}
-
-
{name}
-
- {#each STEPS as s}
-
- {/each}
+ {#each paletteGroups as group}
+
{group.label}
+ {#each group.names as name}
+
+
{name}
+
+ {#each STEPS as s}
+
+ {/each}
+
-
+ {/each}
{/each}
@@ -628,6 +661,13 @@
flex-direction: column;
gap: 3px;
}
+ .palette-group-label {
+ margin-block: var(--space-3) var(--space-1);
+ font-family: var(--font-family-mono, 'Roboto Mono', ui-monospace, monospace);
+ font-size: var(--font-size-xs);
+ font-weight: 600;
+ color: var(--color-content-secondary);
+ }
.scale-row {
display: flex;
align-items: center;