codexly-ui 0.0.97 → 0.0.99
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 +208 -17
- package/fesm2022/codexly-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/codexly-ui.d.ts +33 -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';
|
|
@@ -11722,9 +11907,10 @@ class ClxMenuItemComponent {
|
|
|
11722
11907
|
return this.nested() ? NAV_ITEM_L2 : NAV_ITEM_L1;
|
|
11723
11908
|
}, ...(ngDevMode ? [{ debugName: "_geom" }] : /* istanbul ignore next */ []));
|
|
11724
11909
|
_iconCls = computed(() => resolveColor(this._resolvedColor()).textSubtle, ...(ngDevMode ? [{ debugName: "_iconCls" }] : /* istanbul ignore next */ []));
|
|
11910
|
+
_idleIconCls = computed(() => resolveColor(this._resolvedColor()).textMuted, ...(ngDevMode ? [{ debugName: "_idleIconCls" }] : /* istanbul ignore next */ []));
|
|
11725
11911
|
_idleCls = computed(() => {
|
|
11726
11912
|
const t = resolveColor(this._resolvedColor());
|
|
11727
|
-
return `${NAV_ITEM_BASE} ${this._geom()} ${
|
|
11913
|
+
return `${NAV_ITEM_BASE} ${this._geom()} ${t.textMuted} ${t.hoverBgMuted}`;
|
|
11728
11914
|
}, ...(ngDevMode ? [{ debugName: "_idleCls" }] : /* istanbul ignore next */ []));
|
|
11729
11915
|
_activeCls = computed(() => {
|
|
11730
11916
|
const t = resolveColor(this._resolvedColor());
|
|
@@ -11744,7 +11930,7 @@ class ClxMenuItemComponent {
|
|
|
11744
11930
|
[class]="rla.isActive ? _activeCls() : _idleCls()"
|
|
11745
11931
|
[title]="collapsed() ? label() : ''">
|
|
11746
11932
|
@if (icon()) {
|
|
11747
|
-
<span clx-icon [name]="icon()" size="sm" [class]="rla.isActive ? _iconCls() :
|
|
11933
|
+
<span clx-icon [name]="icon()" size="sm" [class]="rla.isActive ? _iconCls() : _idleIconCls()"></span>
|
|
11748
11934
|
}
|
|
11749
11935
|
@if (!collapsed()) {
|
|
11750
11936
|
<span class="flex-1 text-left truncate">{{ label() }}</span>
|
|
@@ -11757,7 +11943,7 @@ class ClxMenuItemComponent {
|
|
|
11757
11943
|
[title]="collapsed() ? label() : ''"
|
|
11758
11944
|
(click)="itemClick.emit()">
|
|
11759
11945
|
@if (icon()) {
|
|
11760
|
-
<span clx-icon [name]="icon()" size="sm" [class]="active() ? _iconCls() :
|
|
11946
|
+
<span clx-icon [name]="icon()" size="sm" [class]="active() ? _iconCls() : _idleIconCls()"></span>
|
|
11761
11947
|
}
|
|
11762
11948
|
@if (!collapsed()) {
|
|
11763
11949
|
<span class="flex-1 text-left truncate">{{ label() }}</span>
|
|
@@ -11782,7 +11968,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
11782
11968
|
[class]="rla.isActive ? _activeCls() : _idleCls()"
|
|
11783
11969
|
[title]="collapsed() ? label() : ''">
|
|
11784
11970
|
@if (icon()) {
|
|
11785
|
-
<span clx-icon [name]="icon()" size="sm" [class]="rla.isActive ? _iconCls() :
|
|
11971
|
+
<span clx-icon [name]="icon()" size="sm" [class]="rla.isActive ? _iconCls() : _idleIconCls()"></span>
|
|
11786
11972
|
}
|
|
11787
11973
|
@if (!collapsed()) {
|
|
11788
11974
|
<span class="flex-1 text-left truncate">{{ label() }}</span>
|
|
@@ -11795,7 +11981,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
11795
11981
|
[title]="collapsed() ? label() : ''"
|
|
11796
11982
|
(click)="itemClick.emit()">
|
|
11797
11983
|
@if (icon()) {
|
|
11798
|
-
<span clx-icon [name]="icon()" size="sm" [class]="active() ? _iconCls() :
|
|
11984
|
+
<span clx-icon [name]="icon()" size="sm" [class]="active() ? _iconCls() : _idleIconCls()"></span>
|
|
11799
11985
|
}
|
|
11800
11986
|
@if (!collapsed()) {
|
|
11801
11987
|
<span class="flex-1 text-left truncate">{{ label() }}</span>
|
|
@@ -12002,10 +12188,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12002
12188
|
class ClxNavGroupComponent {
|
|
12003
12189
|
label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
12004
12190
|
collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
|
|
12191
|
+
color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
|
|
12192
|
+
labelClass = computed(() => {
|
|
12193
|
+
const c = this.color();
|
|
12194
|
+
return c ? resolveColor(c).textSubtle : 'text-clx-text-subtle';
|
|
12195
|
+
}, ...(ngDevMode ? [{ debugName: "labelClass" }] : /* istanbul ignore next */ []));
|
|
12005
12196
|
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: `
|
|
12197
|
+
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
12198
|
@if (!collapsed()) {
|
|
12008
|
-
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest
|
|
12199
|
+
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
|
|
12009
12200
|
} @else {
|
|
12010
12201
|
<span class="flex items-center justify-center w-full py-3">
|
|
12011
12202
|
<span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
|
|
@@ -12020,7 +12211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12020
12211
|
standalone: true,
|
|
12021
12212
|
template: `
|
|
12022
12213
|
@if (!collapsed()) {
|
|
12023
|
-
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest
|
|
12214
|
+
<span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
|
|
12024
12215
|
} @else {
|
|
12025
12216
|
<span class="flex items-center justify-center w-full py-3">
|
|
12026
12217
|
<span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
|
|
@@ -12031,7 +12222,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
12031
12222
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
12032
12223
|
host: { class: 'block' },
|
|
12033
12224
|
}]
|
|
12034
|
-
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }] } });
|
|
12225
|
+
}], 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
12226
|
|
|
12036
12227
|
class ClxProfileComponent {
|
|
12037
12228
|
// ── Inputs ──────────────────────────────────────────────────────────────────
|
|
@@ -14873,5 +15064,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
14873
15064
|
* Generated bundle index. Do not edit.
|
|
14874
15065
|
*/
|
|
14875
15066
|
|
|
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 };
|
|
15067
|
+
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
15068
|
//# sourceMappingURL=codexly-ui.mjs.map
|