@innertia-solutions/innertia-nuxt 0.1.2 → 0.1.3

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/README.md CHANGED
@@ -24,6 +24,10 @@ export default defineNuxtConfig({
24
24
  innertia: {
25
25
  mode: 'saas', // 'saas' (default) | 'app'
26
26
 
27
+ branding: { name: 'MyApp', version: '1.0.0' },
28
+ colors: { primary: 'violet', secondary: 'slate' },
29
+ darkTone: 'slate', // 'neutral' (default) | 'slate' | 'gray' | 'zinc' | 'stone'
30
+
27
31
  apps: {
28
32
  backoffice: {
29
33
  path: '/backoffice',
package/app.config.ts CHANGED
@@ -42,6 +42,18 @@ export default defineAppConfig({
42
42
  secondary: 'slate' as ColorOption,
43
43
  },
44
44
 
45
+ /**
46
+ * Tono neutral usado en modo dark (backgrounds, borders, surfaces).
47
+ * Cambia el "feel" del modo oscuro sin tocar el color de marca.
48
+ *
49
+ * - 'neutral' (default) → gris puro, neutral
50
+ * - 'slate' → gris con leve tinte azul (más frío)
51
+ * - 'gray' → gris levemente más cálido que slate
52
+ * - 'zinc' → gris cálido
53
+ * - 'stone' → gris muy cálido (con tinte tierra)
54
+ */
55
+ darkTone: 'neutral' as DarkTone,
56
+
45
57
  /**
46
58
  * Contenido del panel marketing del layout `auth`. Si no se declara, el panel queda vacío.
47
59
  */
@@ -108,6 +120,9 @@ export type AppMobileMode = 'allow' | 'block' | 'redirect'
108
120
  export type ColorScale = Partial<Record<50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950, string>>
109
121
  export type ColorOption = string | ColorScale
110
122
 
123
+ /** Tono neutral usado en modo dark — debe ser una paleta gris de Tailwind. */
124
+ export type DarkTone = 'neutral' | 'slate' | 'gray' | 'zinc' | 'stone'
125
+
111
126
  /** Proveedor OAuth — slug del provider (matchea con backend SocialAuthController). */
112
127
  export type OAuthProvider = 'google' | 'microsoft' | 'apple' | 'github'
113
128
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@innertia-solutions/innertia-nuxt",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Innertia Solutions — Nuxt layer unificada: core, auth, multitenancy, theme y app contexts",
5
5
  "keywords": [
6
6
  "nuxt",
package/plugins/colors.ts CHANGED
@@ -1,32 +1,39 @@
1
- import type { ColorOption, ColorScale } from '../app.config'
1
+ import type { ColorOption, ColorScale, DarkTone } from '../app.config'
2
2
 
3
3
  const SCALE_LEVELS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const
4
4
 
5
5
  /**
6
- * Aplica las CSS vars `--primary-{50..950}` y `--secondary-{50..950}` desde
7
- * `appConfig.innertia.colors`. Funciona en SSR (inyecta <style> en head) y cliente.
6
+ * Aplica las CSS vars de theming desde `appConfig.innertia`:
7
+ * - `colors.primary` y `colors.secondary` --primary-{50..950}, --secondary-{50..950}
8
+ * - `darkTone` → reemplaza el neutral default en modo dark (backgrounds, borders, surfaces)
8
9
  *
9
- * Acepta:
10
+ * Funciona en SSR (inyecta <style> en head) y cliente.
11
+ *
12
+ * colors acepta:
10
13
  * - Nombre Tailwind: 'violet' → mapea a var(--color-violet-50..950)
11
14
  * - Scale custom: { 50: '#f5f3ff', ..., 950: '#2e1065' }
12
15
  *
13
- * También deriva las vars semánticas `--primary`, `--primary-hover`, `--primary-foreground`,
14
- * etc., usando el nivel 600 (default) o el más cercano en una scale custom.
16
+ * darkTone acepta:
17
+ * 'neutral' | 'slate' | 'gray' | 'zinc' | 'stone'
15
18
  */
16
19
  export default defineNuxtPlugin(() => {
17
20
  const appConfig = useAppConfig()
18
21
  const colors = appConfig.innertia?.colors as { primary?: ColorOption; secondary?: ColorOption } | undefined
19
- if (!colors) return
22
+ const darkTone = appConfig.innertia?.darkTone as DarkTone | undefined
23
+
24
+ const css: string[] = []
20
25
 
21
- const css = buildColorCSS(colors)
22
- if (!css) return
26
+ if (colors) css.push(buildColorCSS(colors))
27
+ // Solo aplicar override si el producto eligió algo distinto del default
28
+ if (darkTone && darkTone !== 'neutral') css.push(buildDarkToneCSS(darkTone))
29
+
30
+ if (css.length === 0) return
23
31
 
24
32
  useHead({
25
33
  style: [
26
34
  {
27
- // Marcamos como innertia para poder identificarla en debug
28
35
  id: 'innertia-colors',
29
- children: css,
36
+ children: css.join('\n'),
30
37
  },
31
38
  ],
32
39
  })
@@ -46,6 +53,63 @@ function buildColorCSS(colors: { primary?: ColorOption; secondary?: ColorOption
46
53
  return lines.join('\n')
47
54
  }
48
55
 
56
+ /**
57
+ * Genera overrides para modo dark reemplazando el `neutral` default por el tono elegido.
58
+ * Cubre backgrounds, foregrounds, borders, layers, surfaces y cards — todos los lugares
59
+ * donde el theme.css base usa `--color-neutral-*` en `.dark`.
60
+ *
61
+ * Por especificidad, `.dark` aquí gana sobre `.dark` en theme.css porque se inyecta
62
+ * después en el head (last-declared wins).
63
+ */
64
+ function buildDarkToneCSS(tone: DarkTone): string {
65
+ return `.dark {
66
+ --background: var(--color-${tone}-800);
67
+ --background-1: var(--color-${tone}-900);
68
+ --background-2: var(--color-${tone}-900);
69
+ --background-plain: var(--color-${tone}-950);
70
+ --foreground: var(--color-${tone}-200);
71
+ --foreground-inverse: var(--color-white);
72
+ --inverse: var(--color-${tone}-950);
73
+ --border: var(--color-${tone}-700);
74
+ --border-line-1: var(--color-${tone}-800);
75
+ --border-line-2: var(--color-${tone}-700);
76
+ --border-line-3: var(--color-${tone}-600);
77
+ --layer: var(--color-${tone}-800);
78
+ --layer-line: var(--color-${tone}-700);
79
+ --layer-hover: var(--color-${tone}-700);
80
+ --layer-focus: var(--color-${tone}-700);
81
+ --layer-active: var(--color-${tone}-700);
82
+ --surface: var(--color-${tone}-700);
83
+ --surface-1: var(--color-${tone}-600);
84
+ --surface-2: var(--color-${tone}-500);
85
+ --surface-3: var(--color-${tone}-600);
86
+ --muted: var(--color-${tone}-700);
87
+ --muted-foreground: var(--color-${tone}-400);
88
+ --muted-foreground-1: var(--color-${tone}-300);
89
+ --muted-hover: var(--color-${tone}-600);
90
+ --card: var(--color-${tone}-800);
91
+ --card-line: var(--color-${tone}-700);
92
+ --card-divider: var(--color-${tone}-700);
93
+ --card-header: var(--color-${tone}-700);
94
+ --card-footer: var(--color-${tone}-700);
95
+ --dropdown: var(--color-${tone}-800);
96
+ --dropdown-line: var(--color-${tone}-700);
97
+ --dropdown-divider: var(--color-${tone}-700);
98
+ --dropdown-item-hover: var(--color-${tone}-700);
99
+ --dropdown-item-foreground: var(--color-${tone}-200);
100
+ --tooltip: var(--color-${tone}-100);
101
+ --tooltip-foreground: var(--color-${tone}-900);
102
+ --navbar: var(--color-${tone}-900);
103
+ --navbar-line: var(--color-${tone}-800);
104
+ --navbar-divider: var(--color-${tone}-800);
105
+ --navbar-nav-foreground: var(--color-${tone}-300);
106
+ --navbar-nav-hover: var(--color-${tone}-800);
107
+ --navbar-nav-active: var(--color-${tone}-700);
108
+ --sidebar: var(--color-${tone}-900);
109
+ --sidebar-line: var(--color-${tone}-800);
110
+ }`
111
+ }
112
+
49
113
  function buildRoleVars(role: 'primary' | 'secondary', value: ColorOption): string[] {
50
114
  const out: string[] = []
51
115