@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 +4 -0
- package/app.config.ts +15 -0
- package/package.json +1 -1
- package/plugins/colors.ts +75 -11
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
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
|
|
7
|
-
* `
|
|
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
|
-
*
|
|
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
|
-
*
|
|
14
|
-
*
|
|
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
|
-
|
|
22
|
+
const darkTone = appConfig.innertia?.darkTone as DarkTone | undefined
|
|
23
|
+
|
|
24
|
+
const css: string[] = []
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|