codexly-ui 0.0.97 → 0.0.98
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/assets/styles/_fonts.css +3 -84
- package/assets/styles/_globals.css +3 -0
- package/assets/styles/_theme.css +15 -1
- package/fesm2022/codexly-ui.mjs +202 -12
- package/fesm2022/codexly-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/codexly-ui.d.ts +32 -3
- package/assets/fonts/roboto-bold-italic.ttf +0 -0
- package/assets/fonts/roboto-bold.ttf +0 -0
- package/assets/fonts/roboto-italic.ttf +0 -0
- package/assets/fonts/roboto-light-italic.ttf +0 -0
- package/assets/fonts/roboto-light.ttf +0 -0
- package/assets/fonts/roboto-medium-italic.ttf +0 -0
- package/assets/fonts/roboto-medium.ttf +0 -0
- package/assets/fonts/roboto-regular.ttf +0 -0
- package/assets/fonts/roboto-semibold-italic.ttf +0 -0
- package/assets/fonts/roboto-semibold.ttf +0 -0
package/assets/styles/_fonts.css
CHANGED
|
@@ -1,84 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
font-style: normal;
|
|
5
|
-
font-weight: 300;
|
|
6
|
-
font-display: swap;
|
|
7
|
-
src: url('../fonts/roboto-light.ttf') format('truetype');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
@font-face {
|
|
11
|
-
font-family: 'Roboto';
|
|
12
|
-
font-style: italic;
|
|
13
|
-
font-weight: 300;
|
|
14
|
-
font-display: swap;
|
|
15
|
-
src: url('../fonts/roboto-light-italic.ttf') format('truetype');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/* ── Roboto 400 Regular ────────────────────────────────────────────────────── */
|
|
19
|
-
@font-face {
|
|
20
|
-
font-family: 'Roboto';
|
|
21
|
-
font-style: normal;
|
|
22
|
-
font-weight: 400;
|
|
23
|
-
font-display: swap;
|
|
24
|
-
src: url('../fonts/roboto-regular.ttf') format('truetype');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
@font-face {
|
|
28
|
-
font-family: 'Roboto';
|
|
29
|
-
font-style: italic;
|
|
30
|
-
font-weight: 400;
|
|
31
|
-
font-display: swap;
|
|
32
|
-
src: url('../fonts/roboto-italic.ttf') format('truetype');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/* ── Roboto 500 Medium ─────────────────────────────────────────────────────── */
|
|
36
|
-
@font-face {
|
|
37
|
-
font-family: 'Roboto';
|
|
38
|
-
font-style: normal;
|
|
39
|
-
font-weight: 500;
|
|
40
|
-
font-display: swap;
|
|
41
|
-
src: url('../fonts/roboto-medium.ttf') format('truetype');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@font-face {
|
|
45
|
-
font-family: 'Roboto';
|
|
46
|
-
font-style: italic;
|
|
47
|
-
font-weight: 500;
|
|
48
|
-
font-display: swap;
|
|
49
|
-
src: url('../fonts/roboto-medium-italic.ttf') format('truetype');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* ── Roboto 600 SemiBold ───────────────────────────────────────────────────── */
|
|
53
|
-
@font-face {
|
|
54
|
-
font-family: 'Roboto';
|
|
55
|
-
font-style: normal;
|
|
56
|
-
font-weight: 600;
|
|
57
|
-
font-display: swap;
|
|
58
|
-
src: url('../fonts/roboto-semibold.ttf') format('truetype');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
@font-face {
|
|
62
|
-
font-family: 'Roboto';
|
|
63
|
-
font-style: italic;
|
|
64
|
-
font-weight: 600;
|
|
65
|
-
font-display: swap;
|
|
66
|
-
src: url('../fonts/roboto-semibold-italic.ttf') format('truetype');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/* ── Roboto 700 Bold ───────────────────────────────────────────────────────── */
|
|
70
|
-
@font-face {
|
|
71
|
-
font-family: 'Roboto';
|
|
72
|
-
font-style: normal;
|
|
73
|
-
font-weight: 700;
|
|
74
|
-
font-display: swap;
|
|
75
|
-
src: url('../fonts/roboto-bold.ttf') format('truetype');
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@font-face {
|
|
79
|
-
font-family: 'Roboto';
|
|
80
|
-
font-style: italic;
|
|
81
|
-
font-weight: 700;
|
|
82
|
-
font-display: swap;
|
|
83
|
-
src: url('../fonts/roboto-bold-italic.ttf') format('truetype');
|
|
84
|
-
}
|
|
1
|
+
/* Fonts are loaded dynamically by ClxThemeService via <link> injection.
|
|
2
|
+
Roboto is the default — preloaded here so the app renders before JS executes. */
|
|
3
|
+
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/* ── Global font ─────────────────────────────────────────────────────────── */
|
|
2
|
+
*, *::before, *::after { font-family: var(--clx-font-body); }
|
|
3
|
+
|
|
1
4
|
/* ── Backdrop base ───────────────────────────────────────────────────────── */
|
|
2
5
|
.clx-modal-backdrop,
|
|
3
6
|
.clx-alert-backdrop {
|
package/assets/styles/_theme.css
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/* ── Font registrations ───────────────────────────────────────────────────── */
|
|
2
2
|
@theme {
|
|
3
|
-
--font-roboto: 'Roboto', ui-sans-serif, system-ui, sans-serif;
|
|
4
3
|
--font-material-symbols-outlined: 'Material Symbols Outlined';
|
|
5
4
|
}
|
|
6
5
|
|
|
6
|
+
/* ── Font body variable (overridden dynamically by ClxThemeService) ───────── */
|
|
7
|
+
:root {
|
|
8
|
+
--clx-font-body: 'Roboto', ui-sans-serif, system-ui, sans-serif;
|
|
9
|
+
}
|
|
10
|
+
|
|
7
11
|
/* ── Light theme (default) ────────────────────────────────────────────────── */
|
|
8
12
|
:root {
|
|
9
13
|
color-scheme: light;
|
|
@@ -34,6 +38,12 @@
|
|
|
34
38
|
/* ── Scrollbar ── */
|
|
35
39
|
--clx-scrollbar: #cbd5e1; /* slate-300 */
|
|
36
40
|
--clx-scrollbar-hover: #94a3b8; /* slate-400 */
|
|
41
|
+
|
|
42
|
+
/* ── Theme accents (overridden dynamically by ClxThemeService) ── */
|
|
43
|
+
--clx-secondary: #64748b; /* slate-500 */
|
|
44
|
+
--clx-secondary-light: #f1f5f9; /* slate-100 */
|
|
45
|
+
--clx-text-base: #64748b; /* slate-500 */
|
|
46
|
+
--clx-text-base-light: #f1f5f9; /* slate-100 */
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
/* ── Dark theme ───────────────────────────────────────────────────────────── */
|
|
@@ -83,4 +93,8 @@
|
|
|
83
93
|
--color-clx-border-soft: var(--clx-border-soft);
|
|
84
94
|
--color-clx-primary: var(--clx-primary);
|
|
85
95
|
--color-clx-primary-light: var(--clx-primary-light);
|
|
96
|
+
--color-clx-secondary: var(--clx-secondary);
|
|
97
|
+
--color-clx-secondary-light: var(--clx-secondary-light);
|
|
98
|
+
--color-clx-text-base: var(--clx-text-base);
|
|
99
|
+
--color-clx-text-base-light: var(--clx-text-base-light);
|
|
86
100
|
}
|
package/fesm2022/codexly-ui.mjs
CHANGED
|
@@ -165,6 +165,58 @@ const BADGE_SHAPE_FIXED = {
|
|
|
165
165
|
circle: 'rounded-full',
|
|
166
166
|
};
|
|
167
167
|
|
|
168
|
+
const CLX_FONT_CATALOG = [
|
|
169
|
+
{
|
|
170
|
+
label: 'Roboto',
|
|
171
|
+
value: 'Roboto',
|
|
172
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
label: 'Inter',
|
|
176
|
+
value: 'Inter',
|
|
177
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap',
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
label: 'Poppins',
|
|
181
|
+
value: 'Poppins',
|
|
182
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
label: 'Plus Jakarta Sans',
|
|
186
|
+
value: 'Plus Jakarta Sans',
|
|
187
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
label: 'Nunito',
|
|
191
|
+
value: 'Nunito',
|
|
192
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
label: 'DM Sans',
|
|
196
|
+
value: 'DM Sans',
|
|
197
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
label: 'Geist',
|
|
201
|
+
value: 'Geist',
|
|
202
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&display=swap',
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
label: 'Lato',
|
|
206
|
+
value: 'Lato',
|
|
207
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
label: 'Montserrat',
|
|
211
|
+
value: 'Montserrat',
|
|
212
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
label: 'Open Sans',
|
|
216
|
+
value: 'Open Sans',
|
|
217
|
+
googleUrl: 'https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap',
|
|
218
|
+
},
|
|
219
|
+
];
|
|
168
220
|
// ── Tailwind rounded classes per borderRadius token ───────────────────────────
|
|
169
221
|
const CLX_RADIUS_MAP = {
|
|
170
222
|
none: 'rounded-none',
|
|
@@ -194,13 +246,16 @@ function resolveContainerRadius(r) {
|
|
|
194
246
|
// ── Default theme ─────────────────────────────────────────────────────────────
|
|
195
247
|
const CLX_THEME_DEFAULTS = {
|
|
196
248
|
primaryColor: 'indigo',
|
|
249
|
+
secondaryColor: 'slate',
|
|
197
250
|
dangerColor: 'red',
|
|
198
251
|
successColor: 'green',
|
|
199
252
|
warningColor: 'amber',
|
|
200
253
|
neutralColor: 'slate',
|
|
254
|
+
textColor: 'slate',
|
|
201
255
|
borderRadius: 'md',
|
|
202
256
|
defaultSize: 'md',
|
|
203
257
|
defaultShape: 'rounded',
|
|
258
|
+
fontFamily: 'Roboto',
|
|
204
259
|
};
|
|
205
260
|
// ── Injection token ───────────────────────────────────────────────────────────
|
|
206
261
|
const CLX_THEME_CONFIG = new InjectionToken('CLX_THEME_CONFIG', { factory: () => CLX_THEME_DEFAULTS });
|
|
@@ -212,7 +267,107 @@ function provideCodexlyTheme(config) {
|
|
|
212
267
|
};
|
|
213
268
|
}
|
|
214
269
|
|
|
270
|
+
// ── Full Tailwind v4 palette (hex), all colors × all shades ──────────────────
|
|
271
|
+
// Source of truth: official Tailwind CSS v4 color values.
|
|
272
|
+
const CLX_COLOR_PALETTE = {
|
|
273
|
+
red: {
|
|
274
|
+
50: '#fef2f2', 100: '#fee2e2', 200: '#fecaca', 300: '#fca5a5', 400: '#f87171',
|
|
275
|
+
500: '#ef4444', 600: '#dc2626', 700: '#b91c1c', 800: '#991b1b', 900: '#7f1d1d', 950: '#450a0a',
|
|
276
|
+
},
|
|
277
|
+
orange: {
|
|
278
|
+
50: '#fff7ed', 100: '#ffedd5', 200: '#fed7aa', 300: '#fdba74', 400: '#fb923c',
|
|
279
|
+
500: '#f97316', 600: '#ea580c', 700: '#c2410c', 800: '#9a3412', 900: '#7c2d12', 950: '#431407',
|
|
280
|
+
},
|
|
281
|
+
amber: {
|
|
282
|
+
50: '#fffbeb', 100: '#fef3c7', 200: '#fde68a', 300: '#fcd34d', 400: '#fbbf24',
|
|
283
|
+
500: '#f59e0b', 600: '#d97706', 700: '#b45309', 800: '#92400e', 900: '#78350f', 950: '#451a03',
|
|
284
|
+
},
|
|
285
|
+
yellow: {
|
|
286
|
+
50: '#fefce8', 100: '#fef9c3', 200: '#fef08a', 300: '#fde047', 400: '#facc15',
|
|
287
|
+
500: '#eab308', 600: '#ca8a04', 700: '#a16207', 800: '#854d0e', 900: '#713f12', 950: '#422006',
|
|
288
|
+
},
|
|
289
|
+
lime: {
|
|
290
|
+
50: '#f7fee7', 100: '#ecfccb', 200: '#d9f99d', 300: '#bef264', 400: '#a3e635',
|
|
291
|
+
500: '#84cc16', 600: '#65a30d', 700: '#4d7c0f', 800: '#3f6212', 900: '#365314', 950: '#1a2e05',
|
|
292
|
+
},
|
|
293
|
+
green: {
|
|
294
|
+
50: '#f0fdf4', 100: '#dcfce7', 200: '#bbf7d0', 300: '#86efac', 400: '#4ade80',
|
|
295
|
+
500: '#22c55e', 600: '#16a34a', 700: '#15803d', 800: '#166534', 900: '#14532d', 950: '#052e16',
|
|
296
|
+
},
|
|
297
|
+
emerald: {
|
|
298
|
+
50: '#ecfdf5', 100: '#d1fae5', 200: '#a7f3d0', 300: '#6ee7b7', 400: '#34d399',
|
|
299
|
+
500: '#10b981', 600: '#059669', 700: '#047857', 800: '#065f46', 900: '#064e3b', 950: '#022c22',
|
|
300
|
+
},
|
|
301
|
+
teal: {
|
|
302
|
+
50: '#f0fdfa', 100: '#ccfbf1', 200: '#99f6e4', 300: '#5eead4', 400: '#2dd4bf',
|
|
303
|
+
500: '#14b8a6', 600: '#0d9488', 700: '#0f766e', 800: '#115e59', 900: '#134e4a', 950: '#042f2e',
|
|
304
|
+
},
|
|
305
|
+
cyan: {
|
|
306
|
+
50: '#ecfeff', 100: '#cffafe', 200: '#a5f3fc', 300: '#67e8f9', 400: '#22d3ee',
|
|
307
|
+
500: '#06b6d4', 600: '#0891b2', 700: '#0e7490', 800: '#155e75', 900: '#164e63', 950: '#083344',
|
|
308
|
+
},
|
|
309
|
+
sky: {
|
|
310
|
+
50: '#f0f9ff', 100: '#e0f2fe', 200: '#bae6fd', 300: '#7dd3fc', 400: '#38bdf8',
|
|
311
|
+
500: '#0ea5e9', 600: '#0284c7', 700: '#0369a1', 800: '#075985', 900: '#0c4a6e', 950: '#082f49',
|
|
312
|
+
},
|
|
313
|
+
blue: {
|
|
314
|
+
50: '#eff6ff', 100: '#dbeafe', 200: '#bfdbfe', 300: '#93c5fd', 400: '#60a5fa',
|
|
315
|
+
500: '#3b82f6', 600: '#2563eb', 700: '#1d4ed8', 800: '#1e40af', 900: '#1e3a8a', 950: '#172554',
|
|
316
|
+
},
|
|
317
|
+
indigo: {
|
|
318
|
+
50: '#eef2ff', 100: '#e0e7ff', 200: '#c7d2fe', 300: '#a5b4fc', 400: '#818cf8',
|
|
319
|
+
500: '#6366f1', 600: '#4f46e5', 700: '#4338ca', 800: '#3730a3', 900: '#312e81', 950: '#1e1b4b',
|
|
320
|
+
},
|
|
321
|
+
violet: {
|
|
322
|
+
50: '#f5f3ff', 100: '#ede9fe', 200: '#ddd6fe', 300: '#c4b5fd', 400: '#a78bfa',
|
|
323
|
+
500: '#8b5cf6', 600: '#7c3aed', 700: '#6d28d9', 800: '#5b21b6', 900: '#4c1d95', 950: '#2e1065',
|
|
324
|
+
},
|
|
325
|
+
purple: {
|
|
326
|
+
50: '#faf5ff', 100: '#f3e8ff', 200: '#e9d5ff', 300: '#d8b4fe', 400: '#c084fc',
|
|
327
|
+
500: '#a855f7', 600: '#9333ea', 700: '#7e22ce', 800: '#6b21a8', 900: '#581c87', 950: '#3b0764',
|
|
328
|
+
},
|
|
329
|
+
fuchsia: {
|
|
330
|
+
50: '#fdf4ff', 100: '#fae8ff', 200: '#f5d0fe', 300: '#f0abfc', 400: '#e879f9',
|
|
331
|
+
500: '#d946ef', 600: '#c026d3', 700: '#a21caf', 800: '#86198f', 900: '#701a75', 950: '#4a044e',
|
|
332
|
+
},
|
|
333
|
+
pink: {
|
|
334
|
+
50: '#fdf2f8', 100: '#fce7f3', 200: '#fbcfe8', 300: '#f9a8d4', 400: '#f472b6',
|
|
335
|
+
500: '#ec4899', 600: '#db2777', 700: '#be185d', 800: '#9d174d', 900: '#831843', 950: '#500724',
|
|
336
|
+
},
|
|
337
|
+
rose: {
|
|
338
|
+
50: '#fff1f2', 100: '#ffe4e6', 200: '#fecdd3', 300: '#fda4af', 400: '#fb7185',
|
|
339
|
+
500: '#f43f5e', 600: '#e11d48', 700: '#be123c', 800: '#9f1239', 900: '#881337', 950: '#4c0519',
|
|
340
|
+
},
|
|
341
|
+
slate: {
|
|
342
|
+
50: '#f8fafc', 100: '#f1f5f9', 200: '#e2e8f0', 300: '#cbd5e1', 400: '#94a3b8',
|
|
343
|
+
500: '#64748b', 600: '#475569', 700: '#334155', 800: '#1e293b', 900: '#0f172a', 950: '#020617',
|
|
344
|
+
},
|
|
345
|
+
gray: {
|
|
346
|
+
50: '#f9fafb', 100: '#f3f4f6', 200: '#e5e7eb', 300: '#d1d5db', 400: '#9ca3af',
|
|
347
|
+
500: '#6b7280', 600: '#4b5563', 700: '#374151', 800: '#1f2937', 900: '#111827', 950: '#030712',
|
|
348
|
+
},
|
|
349
|
+
zinc: {
|
|
350
|
+
50: '#fafafa', 100: '#f4f4f5', 200: '#e4e4e7', 300: '#d4d4d8', 400: '#a1a1aa',
|
|
351
|
+
500: '#71717a', 600: '#52525b', 700: '#3f3f46', 800: '#27272a', 900: '#18181b', 950: '#09090b',
|
|
352
|
+
},
|
|
353
|
+
neutral: {
|
|
354
|
+
50: '#fafafa', 100: '#f5f5f5', 200: '#e5e5e5', 300: '#d4d4d4', 400: '#a3a3a3',
|
|
355
|
+
500: '#737373', 600: '#525252', 700: '#404040', 800: '#262626', 900: '#171717', 950: '#0a0a0a',
|
|
356
|
+
},
|
|
357
|
+
stone: {
|
|
358
|
+
50: '#fafaf9', 100: '#f5f5f4', 200: '#e7e5e4', 300: '#d6d3d1', 400: '#a8a29e',
|
|
359
|
+
500: '#78716c', 600: '#57534e', 700: '#44403c', 800: '#292524', 900: '#1c1917', 950: '#0c0a09',
|
|
360
|
+
},
|
|
361
|
+
white: { 500: '#ffffff' },
|
|
362
|
+
};
|
|
363
|
+
/** Resolve a hex value for any Tailwind color + shade, with a safe fallback. */
|
|
364
|
+
function resolvePaletteHex(color, shade) {
|
|
365
|
+
const entry = CLX_COLOR_PALETTE[color] ?? CLX_COLOR_PALETTE.indigo;
|
|
366
|
+
return entry[shade] ?? entry[500] ?? CLX_COLOR_PALETTE.indigo[500];
|
|
367
|
+
}
|
|
368
|
+
|
|
215
369
|
const STORAGE_KEY = 'clx-theme-mode';
|
|
370
|
+
const FONT_LINK_ID = 'clx-google-font';
|
|
216
371
|
class ClxThemeService {
|
|
217
372
|
_isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
|
|
218
373
|
_initial = inject(CLX_THEME_CONFIG);
|
|
@@ -229,6 +384,12 @@ class ClxThemeService {
|
|
|
229
384
|
return false;
|
|
230
385
|
return this._sysDark();
|
|
231
386
|
}, ...(ngDevMode ? [{ debugName: "isDark" }] : /* istanbul ignore next */ []));
|
|
387
|
+
/** Color to apply to clx-nav-group labels — falls back to neutralColor */
|
|
388
|
+
sidebarGroupColor = computed(() => this._config().sidebarGroupColor ?? this._config().neutralColor, ...(ngDevMode ? [{ debugName: "sidebarGroupColor" }] : /* istanbul ignore next */ []));
|
|
389
|
+
/** Color to apply to top-level clx-menu — falls back to primaryColor */
|
|
390
|
+
sidebarMenuColor = computed(() => this._config().sidebarMenuColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "sidebarMenuColor" }] : /* istanbul ignore next */ []));
|
|
391
|
+
/** Color to apply to clx-menu-item — falls back to primaryColor */
|
|
392
|
+
sidebarItemColor = computed(() => this._config().sidebarItemColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "sidebarItemColor" }] : /* istanbul ignore next */ []));
|
|
232
393
|
constructor() {
|
|
233
394
|
effect(() => {
|
|
234
395
|
if (!this._isBrowser)
|
|
@@ -238,14 +399,15 @@ class ClxThemeService {
|
|
|
238
399
|
effect(() => {
|
|
239
400
|
if (!this._isBrowser)
|
|
240
401
|
return;
|
|
241
|
-
const
|
|
242
|
-
|
|
402
|
+
const cfg = this._config();
|
|
403
|
+
this._applyColorVar('--clx-primary', '--clx-primary-light', cfg.primaryColor);
|
|
404
|
+
this._applyColorVar('--clx-secondary', '--clx-secondary-light', cfg.secondaryColor);
|
|
405
|
+
this._applyColorVar('--clx-text-base', '--clx-text-base-light', cfg.textColor);
|
|
406
|
+
});
|
|
407
|
+
effect(() => {
|
|
408
|
+
if (!this._isBrowser)
|
|
243
409
|
return;
|
|
244
|
-
|
|
245
|
-
const hex500 = CLX_COLOR_HEX[color] ?? CLX_COLOR_HEX.indigo;
|
|
246
|
-
const hex100 = CLX_COLOR_HEX_100[color] ?? CLX_COLOR_HEX_100.indigo;
|
|
247
|
-
document.documentElement.style.setProperty('--clx-primary', hex500);
|
|
248
|
-
document.documentElement.style.setProperty('--clx-primary-light', hex100);
|
|
410
|
+
this._applyFont(this._config().fontFamily ?? 'Roboto');
|
|
249
411
|
});
|
|
250
412
|
if (this._isBrowser) {
|
|
251
413
|
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
@@ -263,6 +425,29 @@ class ClxThemeService {
|
|
|
263
425
|
toggle() {
|
|
264
426
|
this.setMode(this.isDark() ? 'light' : 'dark');
|
|
265
427
|
}
|
|
428
|
+
_applyColorVar(varName, lightVarName, input) {
|
|
429
|
+
if (!input)
|
|
430
|
+
return;
|
|
431
|
+
const { color, shade } = parseColorInput(input);
|
|
432
|
+
document.documentElement.style.setProperty(varName, resolvePaletteHex(color, shade));
|
|
433
|
+
if (lightVarName) {
|
|
434
|
+
document.documentElement.style.setProperty(lightVarName, resolvePaletteHex(color, 100));
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
_applyFont(family) {
|
|
438
|
+
const option = CLX_FONT_CATALOG.find(f => f.value === family);
|
|
439
|
+
if (!option)
|
|
440
|
+
return;
|
|
441
|
+
let link = document.getElementById(FONT_LINK_ID);
|
|
442
|
+
if (!link) {
|
|
443
|
+
link = document.createElement('link');
|
|
444
|
+
link.id = FONT_LINK_ID;
|
|
445
|
+
link.rel = 'stylesheet';
|
|
446
|
+
document.head.appendChild(link);
|
|
447
|
+
}
|
|
448
|
+
link.href = option.googleUrl;
|
|
449
|
+
document.documentElement.style.setProperty('--clx-font-body', `'${family}', ui-sans-serif, system-ui, sans-serif`);
|
|
450
|
+
}
|
|
266
451
|
_loadMode() {
|
|
267
452
|
if (!this._isBrowser)
|
|
268
453
|
return 'system';
|
|
@@ -12002,10 +12187,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12002
12187
|
class ClxNavGroupComponent {
|
|
12003
12188
|
label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
12004
12189
|
collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
|
|
12190
|
+
color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
12191
|
+
labelClass = computed(() => {
|
|
12192
|
+
const c = this.color();
|
|
12193
|
+
return c ? resolveColor(c).textSubtle : 'text-clx-text-subtle';
|
|
12194
|
+
}, ...(ngDevMode ? [{ debugName: "labelClass" }] : /* istanbul ignore next */ []));
|
|
12005
12195
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxNavGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
12006
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxNavGroupComponent, isStandalone: true, selector: "clx-nav-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: `
|
|
12196
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxNavGroupComponent, isStandalone: true, selector: "clx-nav-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: `
|
|
12007
12197
|
@if (!collapsed()) {
|
|
12008
|
-
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest
|
|
12198
|
+
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
|
|
12009
12199
|
} @else {
|
|
12010
12200
|
<span class="flex items-center justify-center w-full py-3">
|
|
12011
12201
|
<span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
|
|
@@ -12020,7 +12210,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12020
12210
|
standalone: true,
|
|
12021
12211
|
template: `
|
|
12022
12212
|
@if (!collapsed()) {
|
|
12023
|
-
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest
|
|
12213
|
+
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
|
|
12024
12214
|
} @else {
|
|
12025
12215
|
<span class="flex items-center justify-center w-full py-3">
|
|
12026
12216
|
<span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
|
|
@@ -12031,7 +12221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12031
12221
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
12032
12222
|
host: { class: 'block' },
|
|
12033
12223
|
}]
|
|
12034
|
-
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }] } });
|
|
12224
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }] } });
|
|
12035
12225
|
|
|
12036
12226
|
class ClxProfileComponent {
|
|
12037
12227
|
// ── Inputs ──────────────────────────────────────────────────────────────────
|
|
@@ -14873,5 +15063,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
14873
15063
|
* Generated bundle index. Do not edit.
|
|
14874
15064
|
*/
|
|
14875
15065
|
|
|
14876
|
-
export { CLX_ADDON_BORDER, CLX_ADDON_TEXT, CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_BG_ADDON, CLX_BG_DISABLED, CLX_BG_ICON_WRAP, CLX_BG_SECTION, CLX_BG_SURFACE, CLX_BORDER_DEFAULT, CLX_BORDER_DISABLED, CLX_BORDER_MEDIUM, CLX_COLOR_HEX, CLX_COLOR_HEX_100, CLX_COLOR_MAP, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_OPTION_DISABLED, CLX_PLACEHOLDER, CLX_RADIO_GROUP, CLX_RADIUS_MAP, CLX_TEXT_BODY, CLX_TEXT_DISABLED, CLX_TEXT_HEADING, CLX_TEXT_HINT, CLX_TEXT_IDLE, CLX_TEXT_INPUT, CLX_TEXT_LABEL, CLX_TEXT_OPTION, CLX_TEXT_SUBTITLE, CLX_TEXT_TITLE, CLX_THEME_CONFIG, CLX_THEME_DEFAULTS, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxChartComponent, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxModalComponent, ClxModalService, ClxNavGroupComponent, ClxNumberComponent, ClxPageEmptyComponent, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableComponent, ClxTabsComponent, ClxTagComponent, ClxTextareaComponent, ClxThemeService, ClxTimelineComponent, ClxTimelineItemComponent, ClxTimepickerComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, TIMEPICKER_SIZE_MAP, parseColorInput, provideCodexlyTheme, resolveColor, resolveContainerRadius, resolveRadius };
|
|
15066
|
+
export { CLX_ADDON_BORDER, CLX_ADDON_TEXT, CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_BG_ADDON, CLX_BG_DISABLED, CLX_BG_ICON_WRAP, CLX_BG_SECTION, CLX_BG_SURFACE, CLX_BORDER_DEFAULT, CLX_BORDER_DISABLED, CLX_BORDER_MEDIUM, CLX_COLOR_HEX, CLX_COLOR_HEX_100, CLX_COLOR_MAP, CLX_FONT_CATALOG, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_OPTION_DISABLED, CLX_PLACEHOLDER, CLX_RADIO_GROUP, CLX_RADIUS_MAP, CLX_TEXT_BODY, CLX_TEXT_DISABLED, CLX_TEXT_HEADING, CLX_TEXT_HINT, CLX_TEXT_IDLE, CLX_TEXT_INPUT, CLX_TEXT_LABEL, CLX_TEXT_OPTION, CLX_TEXT_SUBTITLE, CLX_TEXT_TITLE, CLX_THEME_CONFIG, CLX_THEME_DEFAULTS, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxChartComponent, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxModalComponent, ClxModalService, ClxNavGroupComponent, ClxNumberComponent, ClxPageEmptyComponent, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableComponent, ClxTabsComponent, ClxTagComponent, ClxTextareaComponent, ClxThemeService, ClxTimelineComponent, ClxTimelineItemComponent, ClxTimepickerComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, TIMEPICKER_SIZE_MAP, parseColorInput, provideCodexlyTheme, resolveColor, resolveContainerRadius, resolveRadius };
|
|
14877
15067
|
//# sourceMappingURL=codexly-ui.mjs.map
|