@edc-motor/ui 0.5.8 → 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edc-motor/ui",
3
- "version": "0.5.8",
3
+ "version": "0.5.10",
4
4
  "description": "EdC Motor — componentes públicos Vue 3 + tokens SCSS para webs de juegos de mesa (paquete fuente: lo compila el consumidor con Vite)",
5
5
  "license": "GPL-3.0-only",
6
6
  "type": "module",
package/scss/_theme.scss CHANGED
@@ -43,6 +43,21 @@
43
43
  // va atenuada — en claro admiten más presencia que en oscuro.
44
44
  --block-tint: 20%;
45
45
  --page-bg-opacity: 0.2;
46
+
47
+ // Fondos DINÁMICOS de bloque (presets token:* del campo común
48
+ // `background`): tres grises translúcidos por GRADOS de intensidad sobre
49
+ // la misma base neutra que el «Gris» de la paleta (slate #64748B =
50
+ // rgb(100 116 139)), con grados FIJOS por token y POR TEMA — el medio
51
+ // (--neutral) equivale EXACTO al gris estático de la paleta al
52
+ // --block-tint del tema (20% claro / 12% oscuro), el suave contrasta
53
+ // menos y el fuerte más. El acento translúcido (--accent-soft) es el
54
+ // cuarto preset. BlockShell los resuelve como cualquier token
55
+ // (var(--<nombre>)) y ya llegan translúcidos: la imagen de fondo de la
56
+ // página se ve a través, en claro y en oscuro.
57
+ --neutral-soft: rgb(100 116 139 / 10%);
58
+ --neutral: rgb(100 116 139 / 20%);
59
+ --neutral-strong: rgb(100 116 139 / 32%);
60
+ --accent-soft: color-mix(in srgb, var(--accent-500) 20%, transparent);
46
61
  }
47
62
 
48
63
  [data-theme="dark"] {
@@ -71,4 +86,11 @@
71
86
 
72
87
  --block-tint: 12%;
73
88
  --page-bg-opacity: 0.1;
89
+
90
+ // Grises dinámicos de bloque en oscuro: mismos tokens, grados propios —
91
+ // el medio calca el gris estático (#64748B al --block-tint oscuro, 12%).
92
+ --neutral-soft: rgb(100 116 139 / 7%);
93
+ --neutral: rgb(100 116 139 / 12%);
94
+ --neutral-strong: rgb(100 116 139 / 22%);
95
+ --accent-soft: color-mix(in srgb, var(--accent-500) 16%, transparent);
74
96
  }
@@ -2,10 +2,16 @@
2
2
  import { computed, type CSSProperties } from 'vue'
3
3
 
4
4
  // Envoltorio común de todos los bloques públicos: aplica los campos comunes
5
- // (align, width, background) que el motor añade a cada tipo. El color de
6
- // fondo NO se aplica opaco: es un tinte semitransparente (--block-tint,
5
+ // (align, width, background) que el motor añade a cada tipo. Un hex de la
6
+ // paleta NO se aplica opaco: es un tinte semitransparente (--block-tint,
7
7
  // distinto por tema, patrón CDL) para que la imagen de fondo de la página se
8
- // vea a través. La anchura del CONTENIDO (full/wide/narrow) va por clase.
8
+ // vea a través. Los presets DINÁMICOS (`token:*`) se resuelven a su custom
9
+ // property TAL CUAL (var(--<nombre>), sin el mix del tinte): los presets
10
+ // actuales (token:neutral-soft/neutral/neutral-strong y token:accent-soft)
11
+ // ya SON translúcidos en _theme.scss — grados fijos por token y por tema
12
+ // sobre la base neutra slate — y los tokens antiguos aún guardados
13
+ // (token:surface*/accent-500) siguen siendo el color OPACO del tema, como
14
+ // cuando se guardaron. La anchura del CONTENIDO va por clase.
9
15
  const props = defineProps<{ settings: Record<string, unknown> }>()
10
16
 
11
17
  const width = computed(() => `block--w-${(props.settings.width as string) || 'wide'}`)
@@ -20,13 +26,16 @@ const headingAlign = (key: 'title_align' | 'subtitle_align', prefix: string) =>
20
26
  }
21
27
 
22
28
  // El color de fondo puede ser un hex fijo o un preset DINÁMICO del tema
23
- // serializado como `token:<nombre>` (p. ej. token:surface): se resuelve a
24
- // su custom property (var(--surface)) color-mix admite varsy así el
25
- // tinte sigue al tema claro/oscuro. El nombre se sanea a [a-z0-9-] (el
26
- // value viene del admin, pero un token roto no debe inyectar CSS).
29
+ // serializado como `token:<nombre>` (p. ej. token:neutral): se resuelve a
30
+ // su custom property (var(--neutral)) SIN el mix del tinteel grado de
31
+ // transparencia de cada token lo fija el TEMA (_theme.scss), no el
32
+ // --block-tint del hex libre. El nombre se sanea a [a-z0-9-] (el value
33
+ // viene del admin, pero un token roto no debe inyectar CSS).
27
34
  const TOKEN_PREFIX = 'token:'
28
- function resolveColor(value: string): string {
29
- if (!value.startsWith(TOKEN_PREFIX)) return value
35
+ function isToken(value: string): boolean {
36
+ return value.startsWith(TOKEN_PREFIX)
37
+ }
38
+ function resolveToken(value: string): string {
30
39
  return `var(--${value.slice(TOKEN_PREFIX.length).replace(/[^a-z0-9-]/gi, '')})`
31
40
  }
32
41
 
@@ -35,11 +44,13 @@ function resolveColor(value: string): string {
35
44
  // izquierda del justificado en estrecho, DC-03 ampliado).
36
45
  const style = computed<CSSProperties>(() => {
37
46
  const background = props.settings.background as string | undefined
38
- return {
39
- '--block-bg': background
40
- ? `color-mix(in srgb, ${resolveColor(background)} var(--block-tint, 15%), transparent)`
41
- : 'transparent',
47
+ let bg = 'transparent'
48
+ if (background) {
49
+ bg = isToken(background)
50
+ ? resolveToken(background)
51
+ : `color-mix(in srgb, ${background} var(--block-tint, 15%), transparent)`
42
52
  }
53
+ return { '--block-bg': bg }
43
54
  })
44
55
  </script>
45
56