ngx-com 0.0.21 → 0.1.0

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.
Files changed (114) hide show
  1. package/README.md +137 -33
  2. package/fesm2022/ngx-com-components-alert.mjs +21 -11
  3. package/fesm2022/ngx-com-components-alert.mjs.map +1 -1
  4. package/fesm2022/ngx-com-components-avatar.mjs +9 -7
  5. package/fesm2022/ngx-com-components-avatar.mjs.map +1 -1
  6. package/fesm2022/ngx-com-components-button.mjs +1 -1
  7. package/fesm2022/ngx-com-components-button.mjs.map +1 -1
  8. package/fesm2022/ngx-com-components-calendar.mjs +27 -3112
  9. package/fesm2022/ngx-com-components-calendar.mjs.map +1 -1
  10. package/fesm2022/ngx-com-components-card.mjs +8 -8
  11. package/fesm2022/ngx-com-components-card.mjs.map +1 -1
  12. package/fesm2022/ngx-com-components-carousel.mjs +16 -4
  13. package/fesm2022/ngx-com-components-carousel.mjs.map +1 -1
  14. package/fesm2022/ngx-com-components-checkbox.mjs +1 -1
  15. package/fesm2022/ngx-com-components-checkbox.mjs.map +1 -1
  16. package/fesm2022/ngx-com-components-code-block.mjs +9 -9
  17. package/fesm2022/ngx-com-components-code-block.mjs.map +1 -1
  18. package/fesm2022/ngx-com-components-collapsible.mjs +15 -13
  19. package/fesm2022/ngx-com-components-collapsible.mjs.map +1 -1
  20. package/fesm2022/ngx-com-components-confirm.mjs +4 -4
  21. package/fesm2022/ngx-com-components-confirm.mjs.map +1 -1
  22. package/fesm2022/ngx-com-components-datepicker.mjs +2334 -0
  23. package/fesm2022/ngx-com-components-datepicker.mjs.map +1 -0
  24. package/fesm2022/ngx-com-components-dialog.mjs +47 -45
  25. package/fesm2022/ngx-com-components-dialog.mjs.map +1 -1
  26. package/fesm2022/ngx-com-components-dropdown.mjs +446 -340
  27. package/fesm2022/ngx-com-components-dropdown.mjs.map +1 -1
  28. package/fesm2022/ngx-com-components-empty-state.mjs +5 -3
  29. package/fesm2022/ngx-com-components-empty-state.mjs.map +1 -1
  30. package/fesm2022/ngx-com-components-form-field.mjs +11 -6
  31. package/fesm2022/ngx-com-components-form-field.mjs.map +1 -1
  32. package/fesm2022/ngx-com-components-icon-lucide.mjs +41 -0
  33. package/fesm2022/ngx-com-components-icon-lucide.mjs.map +1 -0
  34. package/fesm2022/ngx-com-components-icon.mjs +89 -61
  35. package/fesm2022/ngx-com-components-icon.mjs.map +1 -1
  36. package/fesm2022/ngx-com-components-item.mjs +14 -4
  37. package/fesm2022/ngx-com-components-item.mjs.map +1 -1
  38. package/fesm2022/ngx-com-components-menu.mjs +61 -69
  39. package/fesm2022/ngx-com-components-menu.mjs.map +1 -1
  40. package/fesm2022/ngx-com-components-native-control.mjs +170 -0
  41. package/fesm2022/ngx-com-components-native-control.mjs.map +1 -0
  42. package/fesm2022/ngx-com-components-paginator.mjs +11 -3
  43. package/fesm2022/ngx-com-components-paginator.mjs.map +1 -1
  44. package/fesm2022/ngx-com-components-popover.mjs +58 -33
  45. package/fesm2022/ngx-com-components-popover.mjs.map +1 -1
  46. package/fesm2022/ngx-com-components-radio.mjs +4 -4
  47. package/fesm2022/ngx-com-components-radio.mjs.map +1 -1
  48. package/fesm2022/ngx-com-components-segmented-control.mjs +6 -4
  49. package/fesm2022/ngx-com-components-segmented-control.mjs.map +1 -1
  50. package/fesm2022/ngx-com-components-sort.mjs +63 -57
  51. package/fesm2022/ngx-com-components-sort.mjs.map +1 -1
  52. package/fesm2022/ngx-com-components-spinner.mjs +6 -6
  53. package/fesm2022/ngx-com-components-spinner.mjs.map +1 -1
  54. package/fesm2022/ngx-com-components-switch.mjs +18 -9
  55. package/fesm2022/ngx-com-components-switch.mjs.map +1 -1
  56. package/fesm2022/ngx-com-components-table.mjs +23 -9
  57. package/fesm2022/ngx-com-components-table.mjs.map +1 -1
  58. package/fesm2022/ngx-com-components-tabs.mjs +81 -58
  59. package/fesm2022/ngx-com-components-tabs.mjs.map +1 -1
  60. package/fesm2022/ngx-com-components-timepicker.mjs +1048 -0
  61. package/fesm2022/ngx-com-components-timepicker.mjs.map +1 -0
  62. package/fesm2022/ngx-com-components-toast.mjs +18 -14
  63. package/fesm2022/ngx-com-components-toast.mjs.map +1 -1
  64. package/fesm2022/ngx-com-components-tooltip.mjs +5 -5
  65. package/fesm2022/ngx-com-components-tooltip.mjs.map +1 -1
  66. package/fesm2022/ngx-com-components.mjs +0 -13
  67. package/fesm2022/ngx-com-components.mjs.map +1 -1
  68. package/fesm2022/ngx-com-tokens.mjs +0 -8
  69. package/fesm2022/ngx-com-tokens.mjs.map +1 -1
  70. package/fesm2022/ngx-com-utils.mjs +13 -1
  71. package/fesm2022/ngx-com-utils.mjs.map +1 -1
  72. package/fesm2022/ngx-com.mjs +1 -1
  73. package/fesm2022/ngx-com.mjs.map +1 -1
  74. package/package.json +51 -8
  75. package/styles/animations.css +38 -0
  76. package/styles/candy.css +121 -0
  77. package/styles/dark.css +159 -0
  78. package/styles/forest.css +117 -0
  79. package/styles/ocean.css +117 -0
  80. package/styles/themes.css +7 -0
  81. package/styles/tokens.css +277 -0
  82. package/styles/utilities.css +16 -0
  83. package/types/ngx-com-components-alert.d.ts +14 -4
  84. package/types/ngx-com-components-avatar.d.ts +2 -0
  85. package/types/ngx-com-components-calendar.d.ts +3 -747
  86. package/types/ngx-com-components-card.d.ts +2 -2
  87. package/types/ngx-com-components-carousel.d.ts +11 -1
  88. package/types/ngx-com-components-code-block.d.ts +4 -4
  89. package/types/ngx-com-components-collapsible.d.ts +10 -2
  90. package/types/ngx-com-components-confirm.d.ts +2 -2
  91. package/types/ngx-com-components-datepicker.d.ts +623 -0
  92. package/types/ngx-com-components-dialog.d.ts +5 -2
  93. package/types/ngx-com-components-dropdown.d.ts +22 -4
  94. package/types/ngx-com-components-empty-state.d.ts +2 -0
  95. package/types/ngx-com-components-form-field.d.ts +4 -1
  96. package/types/ngx-com-components-icon-lucide.d.ts +32 -0
  97. package/types/ngx-com-components-icon.d.ts +49 -35
  98. package/types/ngx-com-components-item.d.ts +12 -2
  99. package/types/ngx-com-components-menu.d.ts +38 -38
  100. package/types/ngx-com-components-native-control.d.ts +99 -0
  101. package/types/ngx-com-components-paginator.d.ts +2 -0
  102. package/types/ngx-com-components-popover.d.ts +19 -12
  103. package/types/ngx-com-components-segmented-control.d.ts +3 -1
  104. package/types/ngx-com-components-sort.d.ts +13 -10
  105. package/types/ngx-com-components-switch.d.ts +7 -2
  106. package/types/ngx-com-components-table.d.ts +16 -2
  107. package/types/ngx-com-components-tabs.d.ts +46 -34
  108. package/types/ngx-com-components-timepicker.d.ts +273 -0
  109. package/types/ngx-com-components-toast.d.ts +4 -2
  110. package/types/ngx-com-components-tooltip.d.ts +1 -1
  111. package/types/ngx-com-components.d.ts +6 -7
  112. package/types/ngx-com-tokens.d.ts +5 -3
  113. package/types/ngx-com-utils.d.ts +11 -1
  114. package/types/ngx-com.d.ts +1 -1
@@ -1,14 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, InjectionToken, inject, input, computed, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
- import * as i1 from 'lucide-angular';
4
- import { LucideAngularModule } from 'lucide-angular';
2
+ import { Injectable, InjectionToken, inject, DOCUMENT, Renderer2, ElementRef, input, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
5
3
  import { cva } from 'class-variance-authority';
6
4
 
7
5
  /**
8
- * Singleton registry for Lucide icons used by `com-icon`.
6
+ * Singleton registry for icons used by `com-icon`.
9
7
  *
10
- * Unlike lucide-angular's `LUCIDE_ICONS` token (which gets shadowed by child injectors),
11
- * this registry lives at root and merges all icons registered via `provideComIcons()`.
8
+ * Stores generic `ComIconData` (SVG element tuples) rather than any
9
+ * vendor-specific format. Use the Lucide adapter (`ngx-com/components/icon/lucide`)
10
+ * or register raw SVG data directly via `provideComIcons`.
12
11
  */
13
12
  class ComIconRegistry {
14
13
  icons = {};
@@ -37,39 +36,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
37
36
  */
38
37
  const COM_ICON_REGISTRAR = new InjectionToken('ComIconRegistrar');
39
38
  /**
40
- * Provides Lucide icons for use with `com-icon`.
39
+ * Provides icons for use with `com-icon`.
40
+ *
41
+ * Accepts generic `ComIconData` (SVG element tuples). For Lucide icons,
42
+ * use `provideComLucideIcons` from `ngx-com/components/icon/lucide` instead.
41
43
  *
42
44
  * Works at **all** injector levels: app root, lazy route, and component.
43
45
  * Icons are merged into the root-level `ComIconRegistry`, so multiple calls
44
46
  * accumulate rather than shadow.
45
47
  *
46
- * @example Root-level (app.config.ts)
48
+ * @example Root-level with raw SVG data
47
49
  * ```ts
48
50
  * import { provideComIcons } from 'ngx-com/components/icon';
49
- * import { ChevronRight, Star, Check, AlertTriangle } from 'lucide-angular';
51
+ *
52
+ * const myIcons = {
53
+ * Star: [['polygon', { points: '12 2 15.09 6.26 ...' }]],
54
+ * };
50
55
  *
51
56
  * export const appConfig = {
52
- * providers: [
53
- * provideComIcons({ ChevronRight, Star, Check, AlertTriangle })
54
- * ]
57
+ * providers: [provideComIcons(myIcons)]
55
58
  * };
56
59
  * ```
57
60
  *
58
- * @example Lazy route adds more icons without losing root icons
61
+ * @example With Lucide adapter (recommended)
59
62
  * ```ts
60
- * // feature.routes.ts
61
- * export const routes: Routes = [{
62
- * path: '',
63
- * providers: [provideComIcons({ Settings, User })],
64
- * component: FeatureComponent,
65
- * }];
66
- * ```
63
+ * import { provideComLucideIcons } from 'ngx-com/components/icon/lucide';
64
+ * import { Star, Check } from 'lucide-angular';
67
65
  *
68
- * @example Component-level registration for tree-shaking
69
- * ```ts
70
- * @Component({
71
- * providers: [provideComIcons({ Trash2, Edit })],
72
- * })
66
+ * export const appConfig = {
67
+ * providers: [provideComLucideIcons({ Star, Check })]
68
+ * };
73
69
  * ```
74
70
  */
75
71
  function provideComIcons(icons) {
@@ -115,36 +111,38 @@ const ICON_SIZE_PX = {
115
111
  '2xl': 40,
116
112
  };
117
113
 
114
+ const SVG_NS = 'http://www.w3.org/2000/svg';
118
115
  /**
119
116
  * Converts a kebab-case or space-separated icon name to PascalCase.
120
- *
121
- * Uses the same regex as lucide-angular for consistency.
122
117
  */
123
118
  function toPascalCase(str) {
124
119
  return str.replace(/(\w)([a-z0-9]*)(_|-|\s*)/g, (_g0, g1, g2) => g1.toUpperCase() + g2.toLowerCase());
125
120
  }
126
121
  /**
127
- * Icon component — renders Lucide icons with CVA-powered color and size variants.
122
+ * Icon component — renders SVG icons with CVA-powered color and size variants.
128
123
  *
129
124
  * Icons inherit `currentColor` by default, making them automatically match
130
125
  * surrounding text. Use the `color` input for semantic color variants that
131
126
  * respond to theme changes.
132
127
  *
128
+ * Icon data is vendor-agnostic — register icons via `provideComIcons` (raw SVG data)
129
+ * or `provideComLucideIcons` from `ngx-com/components/icon/lucide` (Lucide adapter).
130
+ *
133
131
  * @tokens `--color-primary`, `--color-accent`, `--color-warn`, `--color-success`,
134
132
  * `--color-muted-foreground`, `--color-disabled-foreground`,
135
133
  * `--size-icon-xs`, `--size-icon-sm`, `--size-icon-md`,
136
134
  * `--size-icon-lg`, `--size-icon-xl`, `--size-icon-2xl`
137
135
  *
138
- * @example Basic usage (requires icon registration via provideComIcons)
136
+ * @example Basic usage (requires icon registration via provideComLucideIcons)
139
137
  * ```html
140
138
  * <com-icon name="star" />
141
139
  * <com-icon name="check" color="success" size="sm" />
142
140
  * <com-icon name="alert-triangle" color="warn" />
143
141
  * ```
144
142
  *
145
- * @example Direct icon reference (no provider needed)
143
+ * @example Direct icon data (no provider needed)
146
144
  * ```html
147
- * <com-icon [img]="StarIcon" color="accent" size="2xl" />
145
+ * <com-icon [img]="starIconData" color="accent" size="2xl" />
148
146
  * ```
149
147
  *
150
148
  * @example Accessible icon (not decorative)
@@ -160,11 +158,14 @@ function toPascalCase(str) {
160
158
  * ```
161
159
  */
162
160
  class ComIcon {
161
+ doc = inject(DOCUMENT);
162
+ rd = inject(Renderer2);
163
+ elRef = inject((ElementRef));
163
164
  registry = inject(ComIconRegistry);
164
165
  _registrar = inject(COM_ICON_REGISTRAR, { optional: true });
165
- /** Icon name in kebab-case (e.g. 'chevron-right'). Requires provideComIcons registration. */
166
+ /** Icon name in kebab-case (e.g. 'chevron-right'). Requires icon registration. */
166
167
  name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : []));
167
- /** Direct Lucide icon reference. Takes precedence over `name`. */
168
+ /** Direct icon data (SVG element tuples). Takes precedence over `name`. */
168
169
  img = input(...(ngDevMode ? [undefined, { debugName: "img" }] : []));
169
170
  /** Semantic color variant. Defaults to 'current' (inherits from parent). */
170
171
  color = input('current', ...(ngDevMode ? [{ debugName: "color" }] : []));
@@ -187,47 +188,74 @@ class ComIcon {
187
188
  return undefined;
188
189
  }, ...(ngDevMode ? [{ debugName: "resolvedIcon" }] : []));
189
190
  sizeInPx = computed(() => ICON_SIZE_PX[this.size()], ...(ngDevMode ? [{ debugName: "sizeInPx" }] : []));
191
+ effectiveStrokeWidth = computed(() => {
192
+ const sw = this.strokeWidth();
193
+ if (!this.absoluteStrokeWidth())
194
+ return sw;
195
+ return sw * 24 / this.sizeInPx();
196
+ }, ...(ngDevMode ? [{ debugName: "effectiveStrokeWidth" }] : []));
190
197
  hostClasses = computed(() => iconVariants({ color: this.color(), size: this.size() }), ...(ngDevMode ? [{ debugName: "hostClasses" }] : []));
191
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
192
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComIcon, isStandalone: true, selector: "com-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, img: { classPropertyName: "img", publicName: "img", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, absoluteStrokeWidth: { classPropertyName: "absoluteStrokeWidth", publicName: "absoluteStrokeWidth", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
193
- @if (resolvedIcon(); as iconData) {
194
- <lucide-icon
195
- [img]="iconData"
196
- [size]="sizeInPx()"
197
- [strokeWidth]="strokeWidth()"
198
- [absoluteStrokeWidth]="absoluteStrokeWidth()"
199
- color="currentColor"
200
- [attr.aria-label]="ariaLabel() ?? null"
201
- [attr.aria-hidden]="ariaLabel() ? null : 'true'"
202
- />
198
+ constructor() {
199
+ effect(() => {
200
+ this.renderSvg();
201
+ });
203
202
  }
204
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
203
+ /** Builds and inserts the SVG element, or clears the host if no icon data is available. */
204
+ renderSvg() {
205
+ const el = this.elRef.nativeElement;
206
+ const data = this.resolvedIcon();
207
+ const label = this.ariaLabel();
208
+ // Clear previous SVG
209
+ const existing = el.querySelector('svg');
210
+ if (existing) {
211
+ this.rd.removeChild(el, existing);
212
+ }
213
+ if (!data)
214
+ return;
215
+ const size = this.sizeInPx();
216
+ const sw = this.effectiveStrokeWidth();
217
+ // Build SVG element
218
+ const svg = this.doc.createElementNS(SVG_NS, 'svg');
219
+ this.rd.setAttribute(svg, 'xmlns', SVG_NS);
220
+ this.rd.setAttribute(svg, 'width', String(size));
221
+ this.rd.setAttribute(svg, 'height', String(size));
222
+ this.rd.setAttribute(svg, 'viewBox', '0 0 24 24');
223
+ this.rd.setAttribute(svg, 'fill', 'none');
224
+ this.rd.setAttribute(svg, 'stroke', 'currentColor');
225
+ this.rd.setAttribute(svg, 'stroke-width', String(sw));
226
+ this.rd.setAttribute(svg, 'stroke-linecap', 'round');
227
+ this.rd.setAttribute(svg, 'stroke-linejoin', 'round');
228
+ if (label) {
229
+ this.rd.setAttribute(svg, 'aria-label', label);
230
+ }
231
+ else {
232
+ this.rd.setAttribute(svg, 'aria-hidden', 'true');
233
+ }
234
+ // Render SVG children
235
+ for (const [tag, attrs] of data) {
236
+ const child = this.doc.createElementNS(SVG_NS, tag);
237
+ for (const [key, value] of Object.entries(attrs)) {
238
+ this.rd.setAttribute(child, key, String(value));
239
+ }
240
+ this.rd.appendChild(svg, child);
241
+ }
242
+ this.rd.appendChild(el, svg);
243
+ }
244
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComIcon, deps: [], target: i0.ɵɵFactoryTarget.Component });
245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: ComIcon, isStandalone: true, selector: "com-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, img: { classPropertyName: "img", publicName: "img", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, strokeWidth: { classPropertyName: "strokeWidth", publicName: "strokeWidth", isSignal: true, isRequired: false, transformFunction: null }, absoluteStrokeWidth: { classPropertyName: "absoluteStrokeWidth", publicName: "absoluteStrokeWidth", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
205
246
  }
206
247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComIcon, decorators: [{
207
248
  type: Component,
208
249
  args: [{
209
250
  selector: 'com-icon',
210
- template: `
211
- @if (resolvedIcon(); as iconData) {
212
- <lucide-icon
213
- [img]="iconData"
214
- [size]="sizeInPx()"
215
- [strokeWidth]="strokeWidth()"
216
- [absoluteStrokeWidth]="absoluteStrokeWidth()"
217
- color="currentColor"
218
- [attr.aria-label]="ariaLabel() ?? null"
219
- [attr.aria-hidden]="ariaLabel() ? null : 'true'"
220
- />
221
- }
222
- `,
251
+ template: '',
223
252
  host: {
224
253
  '[class]': 'hostClasses()',
225
254
  },
226
- imports: [LucideAngularModule],
227
255
  changeDetection: ChangeDetectionStrategy.OnPush,
228
256
  encapsulation: ViewEncapsulation.None,
229
257
  }]
230
- }], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], img: [{ type: i0.Input, args: [{ isSignal: true, alias: "img", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], absoluteStrokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "absoluteStrokeWidth", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
258
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], img: [{ type: i0.Input, args: [{ isSignal: true, alias: "img", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], strokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "strokeWidth", required: false }] }], absoluteStrokeWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "absoluteStrokeWidth", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
231
259
 
232
260
  /**
233
261
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-icon.mjs","sources":["../../../projects/com/components/icon/icon.registry.ts","../../../projects/com/components/icon/icon.providers.ts","../../../projects/com/components/icon/icon.variants.ts","../../../projects/com/components/icon/icon.component.ts","../../../projects/com/components/icon/ngx-com-components-icon.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport type { LucideIconData, LucideIcons } from 'lucide-angular';\n\n/**\n * Singleton registry for Lucide icons used by `com-icon`.\n *\n * Unlike lucide-angular's `LUCIDE_ICONS` token (which gets shadowed by child injectors),\n * this registry lives at root and merges all icons registered via `provideComIcons()`.\n */\n@Injectable({ providedIn: 'root' })\nexport class ComIconRegistry {\n private readonly icons: LucideIcons = {};\n\n /** Merges the given icons into the registry. */\n register(icons: LucideIcons): void {\n Object.assign(this.icons, icons);\n }\n\n /** Returns the icon data for the given PascalCase name, or `null` if not registered. */\n get(name: string): LucideIconData | null {\n return (this.icons[name] as LucideIconData) ?? null;\n }\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport type { LucideIcons } from 'lucide-angular';\nimport { ComIconRegistry } from './icon.registry';\n\n/**\n * Token injected by `ComIcon` to trigger icon registration factories.\n *\n * Each `provideComIcons()` call adds a `multi` provider whose factory\n * registers icons into the singleton `ComIconRegistry`. The token itself\n * is never read — its purpose is to force Angular's DI to run the factories.\n */\nexport const COM_ICON_REGISTRAR: InjectionToken<void[]> = new InjectionToken<void[]>('ComIconRegistrar');\n\n/**\n * Provides Lucide icons for use with `com-icon`.\n *\n * Works at **all** injector levels: app root, lazy route, and component.\n * Icons are merged into the root-level `ComIconRegistry`, so multiple calls\n * accumulate rather than shadow.\n *\n * @example Root-level (app.config.ts)\n * ```ts\n * import { provideComIcons } from 'ngx-com/components/icon';\n * import { ChevronRight, Star, Check, AlertTriangle } from 'lucide-angular';\n *\n * export const appConfig = {\n * providers: [\n * provideComIcons({ ChevronRight, Star, Check, AlertTriangle })\n * ]\n * };\n * ```\n *\n * @example Lazy route adds more icons without losing root icons\n * ```ts\n * // feature.routes.ts\n * export const routes: Routes = [{\n * path: '',\n * providers: [provideComIcons({ Settings, User })],\n * component: FeatureComponent,\n * }];\n * ```\n *\n * @example Component-level registration for tree-shaking\n * ```ts\n * @Component({\n * providers: [provideComIcons({ Trash2, Edit })],\n * })\n * ```\n */\nexport function provideComIcons(icons: LucideIcons): Provider {\n return {\n provide: COM_ICON_REGISTRAR,\n multi: true,\n useFactory: () => inject(ComIconRegistry).register(icons),\n };\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport type IconColor = 'current' | 'primary' | 'accent' | 'warn' | 'success' | 'muted' | 'disabled';\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport const iconVariants: (props?: { color?: IconColor; size?: IconSize }) => string = cva(\n 'inline-flex items-center justify-center shrink-0 align-middle',\n {\n variants: {\n color: {\n current: '',\n primary: 'text-primary',\n accent: 'text-accent',\n warn: 'text-warn',\n success: 'text-success',\n muted: 'text-muted-foreground',\n disabled: 'text-disabled-foreground',\n },\n size: {\n xs: 'size-icon-xs',\n sm: 'size-icon-sm',\n md: 'size-icon-md',\n lg: 'size-icon-lg',\n xl: 'size-icon-xl',\n '2xl': 'size-icon-2xl',\n },\n },\n defaultVariants: {\n color: 'current',\n size: 'lg',\n },\n }\n);\n\n/** Pixel values matching the CSS tokens — passed to Lucide's numeric [size] prop */\nexport const ICON_SIZE_PX: Record<IconSize, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n '2xl': 40,\n};\n\nexport type IconVariants = VariantProps<typeof iconVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { LucideAngularModule } from 'lucide-angular';\nimport type { LucideIconData } from 'lucide-angular';\nimport { COM_ICON_REGISTRAR } from './icon.providers';\nimport { ComIconRegistry } from './icon.registry';\nimport { iconVariants, ICON_SIZE_PX, type IconColor, type IconSize } from './icon.variants';\n\n/**\n * Converts a kebab-case or space-separated icon name to PascalCase.\n *\n * Uses the same regex as lucide-angular for consistency.\n */\nfunction toPascalCase(str: string): string {\n return str.replace(/(\\w)([a-z0-9]*)(_|-|\\s*)/g, (_g0, g1: string, g2: string) =>\n g1.toUpperCase() + g2.toLowerCase()\n );\n}\n\n/**\n * Icon component — renders Lucide icons with CVA-powered color and size variants.\n *\n * Icons inherit `currentColor` by default, making them automatically match\n * surrounding text. Use the `color` input for semantic color variants that\n * respond to theme changes.\n *\n * @tokens `--color-primary`, `--color-accent`, `--color-warn`, `--color-success`,\n * `--color-muted-foreground`, `--color-disabled-foreground`,\n * `--size-icon-xs`, `--size-icon-sm`, `--size-icon-md`,\n * `--size-icon-lg`, `--size-icon-xl`, `--size-icon-2xl`\n *\n * @example Basic usage (requires icon registration via provideComIcons)\n * ```html\n * <com-icon name=\"star\" />\n * <com-icon name=\"check\" color=\"success\" size=\"sm\" />\n * <com-icon name=\"alert-triangle\" color=\"warn\" />\n * ```\n *\n * @example Direct icon reference (no provider needed)\n * ```html\n * <com-icon [img]=\"StarIcon\" color=\"accent\" size=\"2xl\" />\n * ```\n *\n * @example Accessible icon (not decorative)\n * ```html\n * <com-icon name=\"check\" color=\"success\" ariaLabel=\"Task completed\" />\n * ```\n *\n * @example Inline with text (inherits parent color)\n * ```html\n * <span class=\"text-primary\">\n * <com-icon name=\"star\" size=\"sm\" /> Favorite\n * </span>\n * ```\n */\n@Component({\n selector: 'com-icon',\n template: `\n @if (resolvedIcon(); as iconData) {\n <lucide-icon\n [img]=\"iconData\"\n [size]=\"sizeInPx()\"\n [strokeWidth]=\"strokeWidth()\"\n [absoluteStrokeWidth]=\"absoluteStrokeWidth()\"\n color=\"currentColor\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-hidden]=\"ariaLabel() ? null : 'true'\"\n />\n }\n `,\n host: {\n '[class]': 'hostClasses()',\n },\n imports: [LucideAngularModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class ComIcon {\n private readonly registry = inject(ComIconRegistry);\n private readonly _registrar = inject(COM_ICON_REGISTRAR, { optional: true });\n\n /** Icon name in kebab-case (e.g. 'chevron-right'). Requires provideComIcons registration. */\n readonly name: InputSignal<string | undefined> = input<string>();\n\n /** Direct Lucide icon reference. Takes precedence over `name`. */\n readonly img: InputSignal<LucideIconData | undefined> = input<LucideIconData>();\n\n /** Semantic color variant. Defaults to 'current' (inherits from parent). */\n readonly color: InputSignal<IconColor> = input<IconColor>('current');\n\n /** Size variant. Defaults to 'lg' (24px). */\n readonly size: InputSignal<IconSize> = input<IconSize>('lg');\n\n /** Stroke width. Defaults to 2. */\n readonly strokeWidth: InputSignal<number> = input<number>(2);\n\n /** When true, stroke width doesn't scale with icon size. */\n readonly absoluteStrokeWidth: InputSignal<boolean> = input<boolean>(false);\n\n /** Applies aria-label and removes aria-hidden. Use for meaningful icons. */\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n\n /** Resolves icon data from either `img` (direct ref) or `name` (registry lookup). */\n protected readonly resolvedIcon: Signal<LucideIconData | undefined> = computed(() => {\n const imgData = this.img();\n if (imgData) return imgData;\n\n const iconName = this.name();\n if (iconName) return this.registry.get(toPascalCase(iconName)) ?? undefined;\n\n return undefined;\n });\n\n protected readonly sizeInPx: Signal<number> = computed(() => ICON_SIZE_PX[this.size()]);\n protected readonly hostClasses: Signal<string> = computed(() =>\n iconVariants({ color: this.color(), size: this.size() })\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-icon.mjs","sources":["../../../projects/com/components/icon/icon.registry.ts","../../../projects/com/components/icon/icon.providers.ts","../../../projects/com/components/icon/icon.variants.ts","../../../projects/com/components/icon/icon.component.ts","../../../projects/com/components/icon/ngx-com-components-icon.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport type { ComIconData, ComIconMap } from './icon.types';\n\n/**\n * Singleton registry for icons used by `com-icon`.\n *\n * Stores generic `ComIconData` (SVG element tuples) rather than any\n * vendor-specific format. Use the Lucide adapter (`ngx-com/components/icon/lucide`)\n * or register raw SVG data directly via `provideComIcons`.\n */\n@Injectable({ providedIn: 'root' })\nexport class ComIconRegistry {\n private readonly icons: ComIconMap = {};\n\n /** Merges the given icons into the registry. */\n register(icons: ComIconMap): void {\n Object.assign(this.icons, icons);\n }\n\n /** Returns the icon data for the given PascalCase name, or `null` if not registered. */\n get(name: string): ComIconData | null {\n return this.icons[name] ?? null;\n }\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport type { ComIconMap } from './icon.types';\nimport { ComIconRegistry } from './icon.registry';\n\n/**\n * Token injected by `ComIcon` to trigger icon registration factories.\n *\n * Each `provideComIcons()` call adds a `multi` provider whose factory\n * registers icons into the singleton `ComIconRegistry`. The token itself\n * is never read — its purpose is to force Angular's DI to run the factories.\n */\nexport const COM_ICON_REGISTRAR: InjectionToken<void[]> = new InjectionToken<void[]>('ComIconRegistrar');\n\n/**\n * Provides icons for use with `com-icon`.\n *\n * Accepts generic `ComIconData` (SVG element tuples). For Lucide icons,\n * use `provideComLucideIcons` from `ngx-com/components/icon/lucide` instead.\n *\n * Works at **all** injector levels: app root, lazy route, and component.\n * Icons are merged into the root-level `ComIconRegistry`, so multiple calls\n * accumulate rather than shadow.\n *\n * @example Root-level with raw SVG data\n * ```ts\n * import { provideComIcons } from 'ngx-com/components/icon';\n *\n * const myIcons = {\n * Star: [['polygon', { points: '12 2 15.09 6.26 ...' }]],\n * };\n *\n * export const appConfig = {\n * providers: [provideComIcons(myIcons)]\n * };\n * ```\n *\n * @example With Lucide adapter (recommended)\n * ```ts\n * import { provideComLucideIcons } from 'ngx-com/components/icon/lucide';\n * import { Star, Check } from 'lucide-angular';\n *\n * export const appConfig = {\n * providers: [provideComLucideIcons({ Star, Check })]\n * };\n * ```\n */\nexport function provideComIcons(icons: ComIconMap): Provider {\n return {\n provide: COM_ICON_REGISTRAR,\n multi: true,\n useFactory: () => inject(ComIconRegistry).register(icons),\n };\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport type IconColor = 'current' | 'primary' | 'accent' | 'warn' | 'success' | 'muted' | 'disabled';\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport const iconVariants: (props?: { color?: IconColor; size?: IconSize }) => string = cva(\n 'inline-flex items-center justify-center shrink-0 align-middle',\n {\n variants: {\n color: {\n current: '',\n primary: 'text-primary',\n accent: 'text-accent',\n warn: 'text-warn',\n success: 'text-success',\n muted: 'text-muted-foreground',\n disabled: 'text-disabled-foreground',\n },\n size: {\n xs: 'size-icon-xs',\n sm: 'size-icon-sm',\n md: 'size-icon-md',\n lg: 'size-icon-lg',\n xl: 'size-icon-xl',\n '2xl': 'size-icon-2xl',\n },\n },\n defaultVariants: {\n color: 'current',\n size: 'lg',\n },\n }\n);\n\n/** Pixel values matching the CSS tokens — passed to Lucide's numeric [size] prop */\nexport const ICON_SIZE_PX: Record<IconSize, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n '2xl': 40,\n};\n\nexport type IconVariants = VariantProps<typeof iconVariants>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n Renderer2,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, Signal } from '@angular/core';\nimport { COM_ICON_REGISTRAR } from './icon.providers';\nimport { ComIconRegistry } from './icon.registry';\nimport type { ComIconData } from './icon.types';\nimport { iconVariants, ICON_SIZE_PX, type IconColor, type IconSize } from './icon.variants';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/**\n * Converts a kebab-case or space-separated icon name to PascalCase.\n */\nfunction toPascalCase(str: string): string {\n return str.replace(/(\\w)([a-z0-9]*)(_|-|\\s*)/g, (_g0, g1: string, g2: string) =>\n g1.toUpperCase() + g2.toLowerCase()\n );\n}\n\n/**\n * Icon component — renders SVG icons with CVA-powered color and size variants.\n *\n * Icons inherit `currentColor` by default, making them automatically match\n * surrounding text. Use the `color` input for semantic color variants that\n * respond to theme changes.\n *\n * Icon data is vendor-agnostic — register icons via `provideComIcons` (raw SVG data)\n * or `provideComLucideIcons` from `ngx-com/components/icon/lucide` (Lucide adapter).\n *\n * @tokens `--color-primary`, `--color-accent`, `--color-warn`, `--color-success`,\n * `--color-muted-foreground`, `--color-disabled-foreground`,\n * `--size-icon-xs`, `--size-icon-sm`, `--size-icon-md`,\n * `--size-icon-lg`, `--size-icon-xl`, `--size-icon-2xl`\n *\n * @example Basic usage (requires icon registration via provideComLucideIcons)\n * ```html\n * <com-icon name=\"star\" />\n * <com-icon name=\"check\" color=\"success\" size=\"sm\" />\n * <com-icon name=\"alert-triangle\" color=\"warn\" />\n * ```\n *\n * @example Direct icon data (no provider needed)\n * ```html\n * <com-icon [img]=\"starIconData\" color=\"accent\" size=\"2xl\" />\n * ```\n *\n * @example Accessible icon (not decorative)\n * ```html\n * <com-icon name=\"check\" color=\"success\" ariaLabel=\"Task completed\" />\n * ```\n *\n * @example Inline with text (inherits parent color)\n * ```html\n * <span class=\"text-primary\">\n * <com-icon name=\"star\" size=\"sm\" /> Favorite\n * </span>\n * ```\n */\n@Component({\n selector: 'com-icon',\n template: '',\n host: {\n '[class]': 'hostClasses()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class ComIcon {\n private readonly doc = inject(DOCUMENT);\n private readonly rd = inject(Renderer2);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly registry = inject(ComIconRegistry);\n private readonly _registrar = inject(COM_ICON_REGISTRAR, { optional: true });\n\n /** Icon name in kebab-case (e.g. 'chevron-right'). Requires icon registration. */\n readonly name: InputSignal<string | undefined> = input<string>();\n\n /** Direct icon data (SVG element tuples). Takes precedence over `name`. */\n readonly img: InputSignal<ComIconData | undefined> = input<ComIconData>();\n\n /** Semantic color variant. Defaults to 'current' (inherits from parent). */\n readonly color: InputSignal<IconColor> = input<IconColor>('current');\n\n /** Size variant. Defaults to 'lg' (24px). */\n readonly size: InputSignal<IconSize> = input<IconSize>('lg');\n\n /** Stroke width. Defaults to 2. */\n readonly strokeWidth: InputSignal<number> = input<number>(2);\n\n /** When true, stroke width doesn't scale with icon size. */\n readonly absoluteStrokeWidth: InputSignal<boolean> = input<boolean>(false);\n\n /** Applies aria-label and removes aria-hidden. Use for meaningful icons. */\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n\n /** Resolves icon data from either `img` (direct ref) or `name` (registry lookup). */\n protected readonly resolvedIcon: Signal<ComIconData | undefined> = computed(() => {\n const imgData = this.img();\n if (imgData) return imgData;\n\n const iconName = this.name();\n if (iconName) return this.registry.get(toPascalCase(iconName)) ?? undefined;\n\n return undefined;\n });\n\n protected readonly sizeInPx: Signal<number> = computed(() => ICON_SIZE_PX[this.size()]);\n\n protected readonly effectiveStrokeWidth: Signal<number> = computed(() => {\n const sw = this.strokeWidth();\n if (!this.absoluteStrokeWidth()) return sw;\n return sw * 24 / this.sizeInPx();\n });\n\n protected readonly hostClasses: Signal<string> = computed(() =>\n iconVariants({ color: this.color(), size: this.size() })\n );\n\n constructor() {\n effect(() => {\n this.renderSvg();\n });\n }\n\n /** Builds and inserts the SVG element, or clears the host if no icon data is available. */\n private renderSvg(): void {\n const el = this.elRef.nativeElement;\n const data = this.resolvedIcon();\n const label = this.ariaLabel();\n\n // Clear previous SVG\n const existing = el.querySelector('svg');\n if (existing) {\n this.rd.removeChild(el, existing);\n }\n\n if (!data) return;\n\n const size = this.sizeInPx();\n const sw = this.effectiveStrokeWidth();\n\n // Build SVG element\n const svg = this.doc.createElementNS(SVG_NS, 'svg');\n this.rd.setAttribute(svg, 'xmlns', SVG_NS);\n this.rd.setAttribute(svg, 'width', String(size));\n this.rd.setAttribute(svg, 'height', String(size));\n this.rd.setAttribute(svg, 'viewBox', '0 0 24 24');\n this.rd.setAttribute(svg, 'fill', 'none');\n this.rd.setAttribute(svg, 'stroke', 'currentColor');\n this.rd.setAttribute(svg, 'stroke-width', String(sw));\n this.rd.setAttribute(svg, 'stroke-linecap', 'round');\n this.rd.setAttribute(svg, 'stroke-linejoin', 'round');\n\n if (label) {\n this.rd.setAttribute(svg, 'aria-label', label);\n } else {\n this.rd.setAttribute(svg, 'aria-hidden', 'true');\n }\n\n // Render SVG children\n for (const [tag, attrs] of data) {\n const child = this.doc.createElementNS(SVG_NS, tag);\n for (const [key, value] of Object.entries(attrs)) {\n this.rd.setAttribute(child, key, String(value));\n }\n this.rd.appendChild(svg, child);\n }\n\n this.rd.appendChild(el, svg);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ import { cva } from 'class-variance-authority';
13
13
  * Use this for custom avatars (with images or initials), bare icons,
14
14
  * custom images, or any other leading visual.
15
15
  *
16
+ * @tokens none
17
+ *
16
18
  * @example Custom avatar with image
17
19
  * ```html
18
20
  * <com-item title="Jane Doe" description="jane@example.com">
@@ -52,6 +54,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
52
54
  * rich projected content. Use this when the title needs formatting,
53
55
  * links, or other custom markup.
54
56
  *
57
+ * @tokens none
58
+ *
55
59
  * @example Title with link
56
60
  * ```html
57
61
  * <com-item icon="link">
@@ -78,11 +82,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
78
82
  * Content appears on the same line as the title, immediately after it.
79
83
  * Use this for badges, tags, status indicators, or other inline metadata.
80
84
  *
85
+ * @tokens none
86
+ *
81
87
  * @example Badge suffix
82
88
  * ```html
83
89
  * <com-item title="My BP datasource" description="View and manage configuration">
84
90
  * <ng-template comItemSuffix>
85
- * <span class="inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary">
91
+ * <span class="inline-flex items-center gap-1 rounded-pill border border-primary-border-subtle bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary">
86
92
  * Bluetooth
87
93
  * </span>
88
94
  * </ng-template>
@@ -107,6 +113,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
107
113
  * with rich projected content. Use this when the description needs
108
114
  * formatting, code snippets, or other custom markup.
109
115
  *
116
+ * @tokens none
117
+ *
110
118
  * @example Description with code
111
119
  * ```html
112
120
  * <com-item title="API Key" icon="key">
@@ -135,6 +143,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
135
143
  * action buttons, navigation chevrons, toggles, timestamps, or
136
144
  * any other trailing content.
137
145
  *
146
+ * @tokens none
147
+ *
138
148
  * @example Trailing chevron
139
149
  * ```html
140
150
  * <com-item title="Settings" icon="settings" [interactive]="true">
@@ -185,11 +195,11 @@ const itemVariants = cva(['com-item', 'flex w-full items-center'], {
185
195
  interactive: {
186
196
  true: [
187
197
  'cursor-pointer',
188
- 'rounded-lg',
198
+ 'rounded-card',
189
199
  'px-3',
190
200
  'hover:bg-muted-hover',
191
201
  'active:bg-muted',
192
- 'transition-colors duration-150',
202
+ 'transition-colors duration-normal',
193
203
  'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',
194
204
  ],
195
205
  false: 'cursor-default',
@@ -297,7 +307,7 @@ const ITEM_ICON_SIZES = {
297
307
  * size="lg"
298
308
  * >
299
309
  * <ng-template comItemSuffix>
300
- * <span class="inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary">
310
+ * <span class="inline-flex items-center gap-1 rounded-pill border border-primary-border-subtle bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary">
301
311
  * <com-icon name="bluetooth" size="xs" /> Bluetooth
302
312
  * </span>
303
313
  * </ng-template>
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-com-components-item.mjs","sources":["../../../projects/com/components/item/item.directives.ts","../../../projects/com/components/item/item.variants.ts","../../../projects/com/components/item/item.component.ts","../../../projects/com/components/item/index.ts","../../../projects/com/components/item/ngx-com-components-item.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Marker directive for projecting custom leading content into a com-item.\n *\n * When this directive is present, it completely replaces the default\n * leading visual (which would otherwise be a com-avatar with an icon).\n * Use this for custom avatars (with images or initials), bare icons,\n * custom images, or any other leading visual.\n *\n * @example Custom avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Avatar stack\n * ```html\n * <com-item title=\"3 collaborators\">\n * <ng-template comItemLeading>\n * <div class=\"flex -space-x-2\">\n * <com-avatar name=\"A\" size=\"xs\" variant=\"outline\" />\n * <com-avatar name=\"B\" size=\"xs\" variant=\"outline\" />\n * </div>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemLeading]',\n})\nexport class ComItemLeading {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom title content into a com-item.\n *\n * When this directive is present, it replaces the `title` input with\n * rich projected content. Use this when the title needs formatting,\n * links, or other custom markup.\n *\n * @example Title with link\n * ```html\n * <com-item icon=\"link\">\n * <ng-template comItemTitle>\n * <a href=\"/docs/api\" class=\"hover:underline\">API Documentation</a>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTitle]',\n})\nexport class ComItemTitle {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting inline suffix content after the title.\n *\n * Content appears on the same line as the title, immediately after it.\n * Use this for badges, tags, status indicators, or other inline metadata.\n *\n * @example Badge suffix\n * ```html\n * <com-item title=\"My BP datasource\" description=\"View and manage configuration\">\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemSuffix]',\n})\nexport class ComItemSuffix {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom description content into a com-item.\n *\n * When this directive is present, it replaces the `description` input\n * with rich projected content. Use this when the description needs\n * formatting, code snippets, or other custom markup.\n *\n * @example Description with code\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemDescription]',\n})\nexport class ComItemDescription {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting trailing content into a com-item.\n *\n * Content appears at the far right edge of the item. Use this for\n * action buttons, navigation chevrons, toggles, timestamps, or\n * any other trailing content.\n *\n * @example Trailing chevron\n * ```html\n * <com-item title=\"Settings\" icon=\"settings\" [interactive]=\"true\">\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Trailing action button\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTrailing]',\n})\nexport class ComItemTrailing {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { AvatarSize } from 'ngx-com/components/avatar';\nimport type { IconSize } from 'ngx-com/components/icon';\n\n/** Item size variants. */\nexport type ItemSize = 'sm' | 'md' | 'lg';\n\n/** Item density variants. */\nexport type ItemDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * CVA variants for the item container (host element).\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-hover`, `--color-ring`, `--color-disabled-foreground`\n */\nexport const itemVariants: (props?: {\n size?: ItemSize;\n density?: ItemDensity;\n interactive?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(['com-item', 'flex w-full items-center'], {\n variants: {\n size: {\n sm: 'gap-2.5',\n md: 'gap-3',\n lg: 'gap-3.5',\n },\n density: {\n compact: 'py-1.5',\n default: 'py-2.5',\n comfortable: 'py-4',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'rounded-lg',\n 'px-3',\n 'hover:bg-muted-hover',\n 'active:bg-muted',\n 'transition-colors duration-150',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n ],\n false: 'cursor-default',\n },\n active: {\n true: 'bg-primary-subtle',\n false: '',\n },\n disabled: {\n true: 'text-disabled-foreground pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n interactive: false,\n active: false,\n disabled: false,\n },\n});\n\n/** Title classes keyed by item size. */\nexport const ITEM_TITLE_CLASSES: Record<ItemSize, string> = {\n sm: 'text-sm',\n md: 'text-sm font-medium',\n lg: 'text-xl font-semibold tracking-tight',\n};\n\n/** Description classes keyed by item size. */\nexport const ITEM_DESCRIPTION_CLASSES: Record<ItemSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/** Avatar size mapping keyed by item size. */\nexport const ITEM_AVATAR_SIZES: Record<ItemSize, AvatarSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\n/** Icon size mapping keyed by item size (for icon inside avatar). */\nexport const ITEM_ICON_SIZES: Record<ItemSize, IconSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\nexport type ItemVariants = VariantProps<typeof itemVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComAvatar, ComAvatarCustom } from 'ngx-com/components/avatar';\nimport type { AvatarColor, AvatarSize } from 'ngx-com/components/avatar';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport type { IconSize } from 'ngx-com/components/icon';\nimport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\nimport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\nimport type { ItemSize, ItemDensity } from './item.variants';\n\n/**\n * Item component — a universal compound display element that shows a leading\n * visual alongside a title, an optional description, and optional trailing content.\n *\n * Works in all these contexts:\n * - List rows (device lists, settings menus, search results)\n * - Page/section headers\n * - Dropdown menu items\n * - Table cells\n * - Card headers\n * - Nav items\n *\n * **Anatomy:**\n * ```\n * ┌─────────────────────────────────────────────────────────┐\n * │ ┌───────┐ │\n * │ │com- │ Title text · [inline suffix] [TRAILING] │\n * │ │avatar │ Description text (secondary) │\n * │ └───────┘ │\n * └─────────────────────────────────────────────────────────┘\n * ```\n *\n * Five content zones:\n * 1. **Leading visual** — optional. Default: `com-avatar` with `shape=\"rounded\"` + `variant=\"soft\"`.\n * Override via `comItemLeading` directive.\n * 2. **Title** — primary text. Required (via input or projection).\n * 3. **Inline suffix** — same line as title, after it. For badges, tags, status dots.\n * 4. **Description** — secondary text below title. Optional.\n * 5. **Trailing** — far-right aligned. Actions, chevrons, timestamps.\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-foreground`,\n * `--color-foreground`, `--color-ring`\n *\n * @example Simplest — text only, no icon\n * ```html\n * <com-item title=\"Select all\" />\n * ```\n *\n * @example Icon + title + description (most common)\n * ```html\n * <com-item\n * title=\"Dexcom G7\"\n * description=\"109123c2d2194bffe519b03ceb51730d5064f9de46c54c4e...\"\n * icon=\"smartphone\"\n * />\n * ```\n *\n * @example Icon with different color\n * ```html\n * <com-item title=\"Warning detected\" icon=\"alert-triangle\" iconColor=\"warn\" />\n * <com-item title=\"Active\" icon=\"check-circle\" iconColor=\"accent\" />\n * ```\n *\n * @example Page header with badge suffix (size lg)\n * ```html\n * <com-item\n * title=\"My BP datasource\"\n * description=\"View and manage datasource configuration\"\n * size=\"lg\"\n * >\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary/30 bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * <com-icon name=\"bluetooth\" size=\"xs\" /> Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Custom leading — user avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Interactive list item with trailing chevron\n * ```html\n * <com-item\n * title=\"Bluetooth Settings\"\n * description=\"Manage paired devices\"\n * icon=\"bluetooth\"\n * [interactive]=\"true\"\n * (click)=\"openSettings()\"\n * >\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Compact density — dropdown menu\n * ```html\n * @for (option of options; track option.value) {\n * <com-item\n * [title]=\"option.label\"\n * [icon]=\"option.icon\"\n * density=\"compact\"\n * [interactive]=\"true\"\n * [active]=\"option.value === selected()\"\n * (click)=\"select(option)\"\n * />\n * }\n * ```\n *\n * @example Rich description via projection\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Disabled\n * ```html\n * <com-item\n * title=\"Enterprise Features\"\n * description=\"Available on Enterprise plan\"\n * icon=\"crown\"\n * [disabled]=\"true\"\n * />\n * ```\n */\n@Component({\n selector: 'com-item',\n exportAs: 'comItem',\n template: `\n <!-- Leading visual zone -->\n @if (leadingDirective(); as leading) {\n <ng-container [ngTemplateOutlet]=\"leading.templateRef\" />\n } @else if (icon()) {\n <com-avatar\n [size]=\"avatarSize()\"\n shape=\"rounded\"\n variant=\"soft\"\n [color]=\"resolvedIconColor()\"\n >\n <ng-template comAvatarCustom>\n <com-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </ng-template>\n </com-avatar>\n }\n\n <!-- Text zone -->\n <div class=\"flex min-w-0 flex-1 flex-col justify-center\">\n <!-- Title row -->\n <div class=\"flex items-center gap-1.5\">\n @if (titleDirective(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl.templateRef\" />\n } @else if (title()) {\n <span\n class=\"text-foreground\"\n [class]=\"titleClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ title() }}\n </span>\n }\n @if (suffixDirective(); as suffix) {\n <ng-container [ngTemplateOutlet]=\"suffix.templateRef\" />\n }\n </div>\n\n <!-- Description row -->\n @if (descriptionDirective(); as descTpl) {\n <ng-container [ngTemplateOutlet]=\"descTpl.templateRef\" />\n } @else if (description()) {\n <span\n class=\"text-muted-foreground\"\n [class]=\"descriptionClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ description() }}\n </span>\n }\n </div>\n\n <!-- Trailing zone -->\n @if (trailingDirective(); as trailing) {\n <div class=\"flex shrink-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"trailing.templateRef\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgTemplateOutlet,\n ComAvatar,\n ComAvatarCustom,\n ComIcon,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.role]': 'interactive() ? \"button\" : null',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-label]': 'title() || null',\n '(keydown.enter)': 'onKeyboardActivate($event)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n },\n})\nexport class ComItem {\n // ─── Content Inputs ───\n\n /** Primary text. Required unless using comItemTitle directive. */\n readonly title: InputSignal<string | undefined> = input<string>();\n\n /** Secondary text below the title. */\n readonly description: InputSignal<string | undefined> = input<string>();\n\n /** Lucide icon name — renders inside a com-avatar container. */\n readonly icon: InputSignal<string | undefined> = input<string>();\n\n /** Color variant passed to the leading com-avatar. */\n readonly iconColor: InputSignal<AvatarColor> = input<AvatarColor>('primary');\n\n // ─── CVA Variant Inputs ───\n\n /** Size variant affecting typography and spacing. */\n readonly size: InputSignal<ItemSize> = input<ItemSize>('md');\n\n /** Density variant affecting vertical padding. */\n readonly density: InputSignal<ItemDensity> = input<ItemDensity>('default');\n\n /** Enables hover/active/focus states. */\n readonly interactive: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shows selected/active highlight. */\n readonly active: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Dims and disables pointer events. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Truncates title and description text. */\n readonly truncate: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Content Projection Queries ───\n\n protected readonly leadingDirective: Signal<ComItemLeading | undefined> =\n contentChild(ComItemLeading);\n\n protected readonly titleDirective: Signal<ComItemTitle | undefined> =\n contentChild(ComItemTitle);\n\n protected readonly suffixDirective: Signal<ComItemSuffix | undefined> =\n contentChild(ComItemSuffix);\n\n protected readonly descriptionDirective: Signal<ComItemDescription | undefined> =\n contentChild(ComItemDescription);\n\n protected readonly trailingDirective: Signal<ComItemTrailing | undefined> =\n contentChild(ComItemTrailing);\n\n // ─── Computed Values ───\n\n /** Resolved icon color (handles 'auto' → 'primary' for items since there's no name). */\n protected readonly resolvedIconColor: Signal<AvatarColor> = computed(() => {\n const color = this.iconColor();\n // For items, 'auto' should default to 'primary' since there's no name to hash\n return color === 'auto' ? 'primary' : color;\n });\n\n /** Avatar size mapped from item size. */\n protected readonly avatarSize: Signal<AvatarSize> = computed(\n () => ITEM_AVATAR_SIZES[this.size()]\n );\n\n /** Icon size mapped from item size. */\n protected readonly iconSize: Signal<IconSize> = computed(\n () => ITEM_ICON_SIZES[this.size()]\n );\n\n /** Title typography classes based on size. */\n protected readonly titleClasses: Signal<string> = computed(\n () => ITEM_TITLE_CLASSES[this.size()]\n );\n\n /** Description typography classes based on size. */\n protected readonly descriptionClasses: Signal<string> = computed(\n () => ITEM_DESCRIPTION_CLASSES[this.size()]\n );\n\n /** Host element classes from CVA. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n itemVariants({\n size: this.size(),\n density: this.density(),\n interactive: this.interactive(),\n active: this.active(),\n disabled: this.disabled(),\n })\n );\n\n // ─── Keyboard Accessibility ───\n\n protected onKeyboardActivate(event: Event): void {\n if (this.interactive() && !this.disabled()) {\n event.preventDefault();\n (event.target as HTMLElement).click();\n }\n }\n}\n","// Public API for the item component\n\n// Main component\nexport { ComItem } from './item.component';\n\n// Directives\nexport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\n\n// Variants and utilities\nexport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\n\nexport type {\n ItemSize,\n ItemDensity,\n ItemVariants,\n} from './item.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-com-components-item.mjs","sources":["../../../projects/com/components/item/item.directives.ts","../../../projects/com/components/item/item.variants.ts","../../../projects/com/components/item/item.component.ts","../../../projects/com/components/item/index.ts","../../../projects/com/components/item/ngx-com-components-item.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Marker directive for projecting custom leading content into a com-item.\n *\n * When this directive is present, it completely replaces the default\n * leading visual (which would otherwise be a com-avatar with an icon).\n * Use this for custom avatars (with images or initials), bare icons,\n * custom images, or any other leading visual.\n *\n * @tokens none\n *\n * @example Custom avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Avatar stack\n * ```html\n * <com-item title=\"3 collaborators\">\n * <ng-template comItemLeading>\n * <div class=\"flex -space-x-2\">\n * <com-avatar name=\"A\" size=\"xs\" variant=\"outline\" />\n * <com-avatar name=\"B\" size=\"xs\" variant=\"outline\" />\n * </div>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemLeading]',\n})\nexport class ComItemLeading {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom title content into a com-item.\n *\n * When this directive is present, it replaces the `title` input with\n * rich projected content. Use this when the title needs formatting,\n * links, or other custom markup.\n *\n * @tokens none\n *\n * @example Title with link\n * ```html\n * <com-item icon=\"link\">\n * <ng-template comItemTitle>\n * <a href=\"/docs/api\" class=\"hover:underline\">API Documentation</a>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTitle]',\n})\nexport class ComItemTitle {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting inline suffix content after the title.\n *\n * Content appears on the same line as the title, immediately after it.\n * Use this for badges, tags, status indicators, or other inline metadata.\n *\n * @tokens none\n *\n * @example Badge suffix\n * ```html\n * <com-item title=\"My BP datasource\" description=\"View and manage configuration\">\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary-border-subtle bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemSuffix]',\n})\nexport class ComItemSuffix {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting custom description content into a com-item.\n *\n * When this directive is present, it replaces the `description` input\n * with rich projected content. Use this when the description needs\n * formatting, code snippets, or other custom markup.\n *\n * @tokens none\n *\n * @example Description with code\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemDescription]',\n})\nexport class ComItemDescription {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n\n/**\n * Marker directive for projecting trailing content into a com-item.\n *\n * Content appears at the far right edge of the item. Use this for\n * action buttons, navigation chevrons, toggles, timestamps, or\n * any other trailing content.\n *\n * @tokens none\n *\n * @example Trailing chevron\n * ```html\n * <com-item title=\"Settings\" icon=\"settings\" [interactive]=\"true\">\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Trailing action button\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n */\n@Directive({\n selector: 'ng-template[comItemTrailing]',\n})\nexport class ComItemTrailing {\n readonly templateRef: TemplateRef<void> = inject(TemplateRef);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { AvatarSize } from 'ngx-com/components/avatar';\nimport type { IconSize } from 'ngx-com/components/icon';\n\n/** Item size variants. */\nexport type ItemSize = 'sm' | 'md' | 'lg';\n\n/** Item density variants. */\nexport type ItemDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * CVA variants for the item container (host element).\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-hover`, `--color-ring`, `--color-disabled-foreground`\n */\nexport const itemVariants: (props?: {\n size?: ItemSize;\n density?: ItemDensity;\n interactive?: boolean;\n active?: boolean;\n disabled?: boolean;\n}) => string = cva(['com-item', 'flex w-full items-center'], {\n variants: {\n size: {\n sm: 'gap-2.5',\n md: 'gap-3',\n lg: 'gap-3.5',\n },\n density: {\n compact: 'py-1.5',\n default: 'py-2.5',\n comfortable: 'py-4',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'rounded-card',\n 'px-3',\n 'hover:bg-muted-hover',\n 'active:bg-muted',\n 'transition-colors duration-normal',\n 'focus-visible:outline-[1px] focus-visible:outline-offset-2 focus-visible:outline-ring',\n ],\n false: 'cursor-default',\n },\n active: {\n true: 'bg-primary-subtle',\n false: '',\n },\n disabled: {\n true: 'text-disabled-foreground pointer-events-none',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n density: 'default',\n interactive: false,\n active: false,\n disabled: false,\n },\n});\n\n/** Title classes keyed by item size. */\nexport const ITEM_TITLE_CLASSES: Record<ItemSize, string> = {\n sm: 'text-sm',\n md: 'text-sm font-medium',\n lg: 'text-xl font-semibold tracking-tight',\n};\n\n/** Description classes keyed by item size. */\nexport const ITEM_DESCRIPTION_CLASSES: Record<ItemSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n};\n\n/** Avatar size mapping keyed by item size. */\nexport const ITEM_AVATAR_SIZES: Record<ItemSize, AvatarSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\n/** Icon size mapping keyed by item size (for icon inside avatar). */\nexport const ITEM_ICON_SIZES: Record<ItemSize, IconSize> = {\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n};\n\nexport type ItemVariants = VariantProps<typeof itemVariants>;\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport type { InputSignal, InputSignalWithTransform, Signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ComAvatar, ComAvatarCustom } from 'ngx-com/components/avatar';\nimport type { AvatarColor, AvatarSize } from 'ngx-com/components/avatar';\nimport { ComIcon } from 'ngx-com/components/icon';\nimport type { IconSize } from 'ngx-com/components/icon';\nimport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\nimport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\nimport type { ItemSize, ItemDensity } from './item.variants';\n\n/**\n * Item component — a universal compound display element that shows a leading\n * visual alongside a title, an optional description, and optional trailing content.\n *\n * Works in all these contexts:\n * - List rows (device lists, settings menus, search results)\n * - Page/section headers\n * - Dropdown menu items\n * - Table cells\n * - Card headers\n * - Nav items\n *\n * **Anatomy:**\n * ```\n * ┌─────────────────────────────────────────────────────────┐\n * │ ┌───────┐ │\n * │ │com- │ Title text · [inline suffix] [TRAILING] │\n * │ │avatar │ Description text (secondary) │\n * │ └───────┘ │\n * └─────────────────────────────────────────────────────────┘\n * ```\n *\n * Five content zones:\n * 1. **Leading visual** — optional. Default: `com-avatar` with `shape=\"rounded\"` + `variant=\"soft\"`.\n * Override via `comItemLeading` directive.\n * 2. **Title** — primary text. Required (via input or projection).\n * 3. **Inline suffix** — same line as title, after it. For badges, tags, status dots.\n * 4. **Description** — secondary text below title. Optional.\n * 5. **Trailing** — far-right aligned. Actions, chevrons, timestamps.\n *\n * @tokens `--color-primary-subtle`, `--color-muted`, `--color-muted-foreground`,\n * `--color-foreground`, `--color-ring`\n *\n * @example Simplest — text only, no icon\n * ```html\n * <com-item title=\"Select all\" />\n * ```\n *\n * @example Icon + title + description (most common)\n * ```html\n * <com-item\n * title=\"Dexcom G7\"\n * description=\"109123c2d2194bffe519b03ceb51730d5064f9de46c54c4e...\"\n * icon=\"smartphone\"\n * />\n * ```\n *\n * @example Icon with different color\n * ```html\n * <com-item title=\"Warning detected\" icon=\"alert-triangle\" iconColor=\"warn\" />\n * <com-item title=\"Active\" icon=\"check-circle\" iconColor=\"accent\" />\n * ```\n *\n * @example Page header with badge suffix (size lg)\n * ```html\n * <com-item\n * title=\"My BP datasource\"\n * description=\"View and manage datasource configuration\"\n * size=\"lg\"\n * >\n * <ng-template comItemSuffix>\n * <span class=\"inline-flex items-center gap-1 rounded-pill border border-primary-border-subtle bg-primary-subtle px-2 py-0.5 text-xs font-medium text-primary\">\n * <com-icon name=\"bluetooth\" size=\"xs\" /> Bluetooth\n * </span>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Custom leading — user avatar with image\n * ```html\n * <com-item title=\"Jane Doe\" description=\"jane@example.com\">\n * <ng-template comItemLeading>\n * <com-avatar src=\"/photos/jane.jpg\" name=\"Jane Doe\" size=\"sm\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Interactive list item with trailing chevron\n * ```html\n * <com-item\n * title=\"Bluetooth Settings\"\n * description=\"Manage paired devices\"\n * icon=\"bluetooth\"\n * [interactive]=\"true\"\n * (click)=\"openSettings()\"\n * >\n * <ng-template comItemTrailing>\n * <com-icon name=\"chevron-right\" size=\"sm\" color=\"muted\" />\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Compact density — dropdown menu\n * ```html\n * @for (option of options; track option.value) {\n * <com-item\n * [title]=\"option.label\"\n * [icon]=\"option.icon\"\n * density=\"compact\"\n * [interactive]=\"true\"\n * [active]=\"option.value === selected()\"\n * (click)=\"select(option)\"\n * />\n * }\n * ```\n *\n * @example Rich description via projection\n * ```html\n * <com-item title=\"API Key\" icon=\"key\">\n * <ng-template comItemDescription>\n * <code class=\"text-xs font-mono text-muted-foreground\">sk-abc...xyz</code>\n * <span class=\"text-xs text-muted-foreground\"> · Created 3 days ago</span>\n * </ng-template>\n * <ng-template comItemTrailing>\n * <button class=\"text-sm text-primary hover:text-primary-hover\">Revoke</button>\n * </ng-template>\n * </com-item>\n * ```\n *\n * @example Disabled\n * ```html\n * <com-item\n * title=\"Enterprise Features\"\n * description=\"Available on Enterprise plan\"\n * icon=\"crown\"\n * [disabled]=\"true\"\n * />\n * ```\n */\n@Component({\n selector: 'com-item',\n exportAs: 'comItem',\n template: `\n <!-- Leading visual zone -->\n @if (leadingDirective(); as leading) {\n <ng-container [ngTemplateOutlet]=\"leading.templateRef\" />\n } @else if (icon()) {\n <com-avatar\n [size]=\"avatarSize()\"\n shape=\"rounded\"\n variant=\"soft\"\n [color]=\"resolvedIconColor()\"\n >\n <ng-template comAvatarCustom>\n <com-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </ng-template>\n </com-avatar>\n }\n\n <!-- Text zone -->\n <div class=\"flex min-w-0 flex-1 flex-col justify-center\">\n <!-- Title row -->\n <div class=\"flex items-center gap-1.5\">\n @if (titleDirective(); as titleTpl) {\n <ng-container [ngTemplateOutlet]=\"titleTpl.templateRef\" />\n } @else if (title()) {\n <span\n class=\"text-foreground\"\n [class]=\"titleClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ title() }}\n </span>\n }\n @if (suffixDirective(); as suffix) {\n <ng-container [ngTemplateOutlet]=\"suffix.templateRef\" />\n }\n </div>\n\n <!-- Description row -->\n @if (descriptionDirective(); as descTpl) {\n <ng-container [ngTemplateOutlet]=\"descTpl.templateRef\" />\n } @else if (description()) {\n <span\n class=\"text-muted-foreground\"\n [class]=\"descriptionClasses()\"\n [class.truncate]=\"truncate()\"\n >\n {{ description() }}\n </span>\n }\n </div>\n\n <!-- Trailing zone -->\n @if (trailingDirective(); as trailing) {\n <div class=\"flex shrink-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"trailing.templateRef\" />\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgTemplateOutlet,\n ComAvatar,\n ComAvatarCustom,\n ComIcon,\n ],\n host: {\n '[class]': 'hostClasses()',\n '[attr.role]': 'interactive() ? \"button\" : null',\n '[attr.tabindex]': 'interactive() && !disabled() ? 0 : null',\n '[attr.aria-disabled]': 'disabled() || null',\n '[attr.aria-label]': 'title() || null',\n '(keydown.enter)': 'onKeyboardActivate($event)',\n '(keydown.space)': 'onKeyboardActivate($event)',\n },\n})\nexport class ComItem {\n // ─── Content Inputs ───\n\n /** Primary text. Required unless using comItemTitle directive. */\n readonly title: InputSignal<string | undefined> = input<string>();\n\n /** Secondary text below the title. */\n readonly description: InputSignal<string | undefined> = input<string>();\n\n /** Lucide icon name — renders inside a com-avatar container. */\n readonly icon: InputSignal<string | undefined> = input<string>();\n\n /** Color variant passed to the leading com-avatar. */\n readonly iconColor: InputSignal<AvatarColor> = input<AvatarColor>('primary');\n\n // ─── CVA Variant Inputs ───\n\n /** Size variant affecting typography and spacing. */\n readonly size: InputSignal<ItemSize> = input<ItemSize>('md');\n\n /** Density variant affecting vertical padding. */\n readonly density: InputSignal<ItemDensity> = input<ItemDensity>('default');\n\n /** Enables hover/active/focus states. */\n readonly interactive: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Shows selected/active highlight. */\n readonly active: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Dims and disables pointer events. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Truncates title and description text. */\n readonly truncate: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n\n // ─── Content Projection Queries ───\n\n protected readonly leadingDirective: Signal<ComItemLeading | undefined> =\n contentChild<ComItemLeading>(ComItemLeading);\n\n protected readonly titleDirective: Signal<ComItemTitle | undefined> =\n contentChild<ComItemTitle>(ComItemTitle);\n\n protected readonly suffixDirective: Signal<ComItemSuffix | undefined> =\n contentChild<ComItemSuffix>(ComItemSuffix);\n\n protected readonly descriptionDirective: Signal<ComItemDescription | undefined> =\n contentChild<ComItemDescription>(ComItemDescription);\n\n protected readonly trailingDirective: Signal<ComItemTrailing | undefined> =\n contentChild<ComItemTrailing>(ComItemTrailing);\n\n // ─── Computed Values ───\n\n /** Resolved icon color (handles 'auto' → 'primary' for items since there's no name). */\n protected readonly resolvedIconColor: Signal<AvatarColor> = computed(() => {\n const color = this.iconColor();\n // For items, 'auto' should default to 'primary' since there's no name to hash\n return color === 'auto' ? 'primary' : color;\n });\n\n /** Avatar size mapped from item size. */\n protected readonly avatarSize: Signal<AvatarSize> = computed(\n () => ITEM_AVATAR_SIZES[this.size()]\n );\n\n /** Icon size mapped from item size. */\n protected readonly iconSize: Signal<IconSize> = computed(\n () => ITEM_ICON_SIZES[this.size()]\n );\n\n /** Title typography classes based on size. */\n protected readonly titleClasses: Signal<string> = computed(\n () => ITEM_TITLE_CLASSES[this.size()]\n );\n\n /** Description typography classes based on size. */\n protected readonly descriptionClasses: Signal<string> = computed(\n () => ITEM_DESCRIPTION_CLASSES[this.size()]\n );\n\n /** Host element classes from CVA. */\n protected readonly hostClasses: Signal<string> = computed(() =>\n itemVariants({\n size: this.size(),\n density: this.density(),\n interactive: this.interactive(),\n active: this.active(),\n disabled: this.disabled(),\n })\n );\n\n // ─── Keyboard Accessibility ───\n\n protected onKeyboardActivate(event: Event): void {\n if (this.interactive() && !this.disabled()) {\n event.preventDefault();\n (event.target as HTMLElement).click();\n }\n }\n}\n","// Public API for the item component\n\n// Main component\nexport { ComItem } from './item.component';\n\n// Directives\nexport {\n ComItemLeading,\n ComItemTitle,\n ComItemSuffix,\n ComItemDescription,\n ComItemTrailing,\n} from './item.directives';\n\n// Variants and utilities\nexport {\n itemVariants,\n ITEM_TITLE_CLASSES,\n ITEM_DESCRIPTION_CLASSES,\n ITEM_AVATAR_SIZES,\n ITEM_ICON_SIZES,\n} from './item.variants';\n\nexport type {\n ItemSize,\n ItemDensity,\n ItemVariants,\n} from './item.variants';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}