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.
@@ -1,84 +1,3 @@
1
- /* ── Roboto 300 Light ──────────────────────────────────────────────────────── */
2
- @font-face {
3
- font-family: 'Roboto';
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 {
@@ -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
  }
@@ -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 primaryColor = this._config().primaryColor;
242
- if (!primaryColor)
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
- const { color } = parseColorInput(primaryColor);
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()} ${NAV_ITEM_IDLE} ${t.hoverBgMuted}`;
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() : 'text-clx-text-subtle'"></span>
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() : 'text-clx-text-subtle'"></span>
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() : 'text-clx-text-subtle'"></span>
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() : 'text-clx-text-subtle'"></span>
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 text-clx-text-subtle select-none">{{ label() }}</span>
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 text-clx-text-subtle select-none">{{ label() }}</span>
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