@cdevhub/ngx-tw 0.2.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
  4. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
  6. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
  7. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
  9. package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
  11. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
  13. package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
  15. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
  17. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
  18. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
  20. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
  22. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
  24. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
  26. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
  28. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
  30. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
  32. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
  38. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
  42. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
  44. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
  45. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
  47. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
  49. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
  51. package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
  53. package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
  55. package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
  57. package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
  59. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
  60. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
  61. package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
  62. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
  63. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
  64. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
  65. package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
  66. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
  67. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
  68. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
  69. package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
  70. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
  71. package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
  72. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
  73. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
  74. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
  75. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
  76. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
  77. package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
  78. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
  79. package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
  80. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
  81. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
  82. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
  83. package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
  84. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
  85. package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
  86. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
  87. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
  88. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
  89. package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
  90. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
  91. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
  92. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
  93. package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
  94. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
  95. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
  96. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
  97. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
  98. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
  99. package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
  100. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
  101. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
  102. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
  103. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
  104. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
  105. package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
  106. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
  107. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
  108. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
  109. package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
  110. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
  111. package/package.json +265 -0
  112. package/theme/_base.css +394 -0
  113. package/theme/_dark.css +510 -0
  114. package/theme/_high-contrast.css +290 -0
  115. package/theme/_semantic.css +317 -0
  116. package/theme/_typography.css +9 -0
  117. package/theme/index.css +54 -0
  118. package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
  119. package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
  120. package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
  121. package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
  122. package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
  123. package/types/cdevhub-ngx-tw-button.d.ts +74 -0
  124. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
  125. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
  126. package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
  127. package/types/cdevhub-ngx-tw-card.d.ts +48 -0
  128. package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
  129. package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
  130. package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
  131. package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
  132. package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
  133. package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
  134. package/types/cdevhub-ngx-tw-core.d.ts +719 -0
  135. package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
  136. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
  137. package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
  138. package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
  139. package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
  140. package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
  141. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
  142. package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
  143. package/types/cdevhub-ngx-tw-input.d.ts +110 -0
  144. package/types/cdevhub-ngx-tw-item.d.ts +70 -0
  145. package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
  146. package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
  147. package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
  148. package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
  149. package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
  150. package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
  151. package/types/cdevhub-ngx-tw-select.d.ts +384 -0
  152. package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
  153. package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
  154. package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
  155. package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
  156. package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
  157. package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
  158. package/types/cdevhub-ngx-tw-split.d.ts +265 -0
  159. package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
  160. package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
  161. package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
  162. package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
  163. package/types/cdevhub-ngx-tw-table.d.ts +479 -0
  164. package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
  165. package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
  166. package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
  167. package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
  168. package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
  169. package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
  170. package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
  171. package/types/cdevhub-ngx-tw.d.ts +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-form-field.mjs","sources":["../../../projects/ngx-tw/form-field/form-field.ts","../../../projects/ngx-tw/form-field/form-field.html","../../../projects/ngx-tw/form-field/cdevhub-ngx-tw-form-field.ts"],"sourcesContent":["import {\n type AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n InjectionToken,\n input,\n isDevMode,\n signal,\n type Signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual appearance of the form-field container. */\nexport type FormFieldAppearance = 'outline' | 'filled';\n\n/** Floating label behavior. `'never'` disables floating entirely; the label wrapper is not rendered and the wrapped control's placeholder is always visible. */\nexport type FloatLabel = 'auto' | 'always' | 'never';\n\n/** Subscript (hint/error row) sizing strategy. `'fixed'` always reserves vertical space; `'dynamic'` collapses the row when no hint/error is projected. */\nexport type SubscriptSizing = 'fixed' | 'dynamic';\n\n/**\n * Contract every ngx-tw form-field-compatible control must implement. A\n * concrete control provides itself under {@link TW_FORM_FIELD_CONTROL} so the\n * surrounding `FormFieldComponent` can mirror its state and wire ARIA.\n */\nexport abstract class FormFieldControl<T = unknown> {\n /** Unique id on the control's host element. Used by the form-field label `for` attribute and `aria-describedby` wiring. */\n abstract readonly id: Signal<string>;\n /** Current value of the control. */\n abstract readonly value: Signal<T | null>;\n /** Whether the control currently has focus. Typically driven by CDK `FocusMonitor`. */\n abstract readonly focused: Signal<boolean>;\n /** Whether the control's value is considered empty. Drives the floating-label state. */\n abstract readonly empty: Signal<boolean>;\n /** Whether the control is disabled. */\n abstract readonly disabled: Signal<boolean>;\n /** Whether the control is marked required. */\n abstract readonly required: Signal<boolean>;\n /** Whether the control should be rendered as invalid. Usually derived from `NgControl.invalid` combined with `touched`/`submitted`. */\n abstract readonly errorState: Signal<boolean>;\n /** Active validation errors map keyed by validator name (e.g. `{ required: true, email: true }`). Returns `null` when the control has no validation errors. Drives `[twError match=\"…\"]` filtering inside the form-field. Optional — controls without a backing `NgControl` may omit it. */\n readonly errors?: Signal<Record<string, unknown> | null>;\n /** Optional control-type identifier (e.g. `'input'`, `'select'`). When set, the form-field appends `tw-form-field-type-{controlType}` to its host for styling hooks. */\n abstract readonly controlType?: string;\n /** Optional consumer-supplied `aria-describedby` ids the form-field preserves when merging in hint/error ids. */\n abstract readonly userAriaDescribedBy?: Signal<string | undefined>;\n /** Optional consumer-supplied `aria-labelledby` ids the form-field preserves when merging in the projected label id. Controls that consume label pushdown (non-native triggers) override this. */\n readonly userAriaLabelledby?: Signal<string | undefined>;\n\n /** Called by the form-field to push the merged `aria-describedby` ids back onto the control's host element. */\n abstract setDescribedByIds(ids: string[]): void;\n /** Called when the form-field container is clicked. Concrete controls typically focus their underlying native element or open a panel. */\n abstract onContainerClick(event: MouseEvent): void;\n /**\n * Called by the form-field to push the merged `aria-labelledby` ids onto the control's host element.\n * Default is a no-op — native `<input>` controls rely on the label's `for=` attribute for the canonical association.\n * Non-native controls (combobox triggers, date-pickers, etc.) override this to set the attribute explicitly.\n */\n setLabelledByIds(_ids: string[]): void {\n // Default no-op. Controls override when label pushdown is required for accessibility.\n }\n}\n\n/**\n * Injection token matching {@link FormFieldControl}. Controls register via\n * `providers: [{ provide: TW_FORM_FIELD_CONTROL, useExisting: MyControl }]`.\n */\nexport const TW_FORM_FIELD_CONTROL = new InjectionToken<FormFieldControl<unknown>>(\n 'TW_FORM_FIELD_CONTROL',\n);\n\n// ── Unique ID counters ──\nlet nextLabelId = 0;\nlet nextHintId = 0;\nlet nextErrorId = 0;\n\n// ── tv() config ──\n\nconst formFieldVariants = tv({\n slots: {\n root: 'block text-fg',\n controlWrapper:\n 'relative flex items-stretch gap-2 rounded-md bg-transparent transition-colors duration-normal motion-reduce:transition-none',\n infix: 'relative flex-1 flex items-center min-w-0 [&_input::placeholder]:transition-opacity [&_input::placeholder]:duration-normal [&_textarea::placeholder]:transition-opacity [&_textarea::placeholder]:duration-normal',\n labelWrapper:\n 'absolute pointer-events-none flex items-center max-w-[calc(100%-1.5rem)] transition-[top,left,color,transform] duration-normal motion-reduce:transition-none origin-[top_left]',\n label:\n 'text-fg-muted truncate transition-[font-size,color] duration-normal motion-reduce:transition-none',\n requiredMarker: 'text-error-600 ml-0.5',\n prefix: 'flex items-center shrink-0 text-fg-muted',\n suffix: 'flex items-center shrink-0 text-fg-muted',\n subscriptWrapper: 'mt-1 text-xs flex gap-2',\n hint: 'text-fg-muted',\n error: 'text-error-600 font-medium',\n },\n variants: {\n appearance: {\n outline: {\n controlWrapper: 'border border-border hover:border-border-strong',\n },\n filled: {\n controlWrapper:\n 'bg-surface-muted border-b border-border hover:bg-surface-sunken',\n infix: 'items-end',\n },\n },\n size: {\n xs: {},\n sm: {},\n md: {},\n lg: {},\n xl: {},\n },\n color: {\n primary: {},\n secondary: {},\n accent: {},\n neutral: {},\n info: {},\n success: {},\n warning: {},\n error: {},\n },\n focused: {\n true: {},\n false: {},\n },\n invalid: {\n true: {},\n false: {},\n },\n labelFloated: {\n true: {\n labelWrapper: 'top-1 left-2',\n },\n false: {\n labelWrapper: 'top-1/2 -translate-y-1/2 left-3',\n },\n },\n subscriptReserve: {\n true: { subscriptWrapper: 'min-h-5' },\n false: {},\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none' },\n false: {},\n },\n },\n compoundVariants: [\n // ── Padding × (appearance, size) ──\n { appearance: 'outline', size: 'xs', class: { controlWrapper: 'px-2 py-1' } },\n { appearance: 'outline', size: 'sm', class: { controlWrapper: 'px-3 py-1.5' } },\n { appearance: 'outline', size: 'md', class: { controlWrapper: 'px-3 py-2' } },\n { appearance: 'outline', size: 'lg', class: { controlWrapper: 'px-4 py-2.5' } },\n { appearance: 'outline', size: 'xl', class: { controlWrapper: 'px-5 py-3' } },\n { appearance: 'filled', size: 'xs', class: { controlWrapper: 'px-2 pt-5 pb-1' } },\n { appearance: 'filled', size: 'sm', class: { controlWrapper: 'px-3 pt-5 pb-1.5' } },\n { appearance: 'filled', size: 'md', class: { controlWrapper: 'px-3 pt-6 pb-2' } },\n { appearance: 'filled', size: 'lg', class: { controlWrapper: 'px-4 pt-7 pb-2.5' } },\n { appearance: 'filled', size: 'xl', class: { controlWrapper: 'px-5 pt-8 pb-3' } },\n\n // ── Label font-size × (size, labelFloated) ──\n { size: 'xs', labelFloated: false, class: { label: 'text-xs' } },\n { size: 'xs', labelFloated: true, class: { label: 'text-2xs' } },\n { size: 'sm', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'sm', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'md', labelFloated: false, class: { label: 'text-sm' } },\n { size: 'md', labelFloated: true, class: { label: 'text-xs' } },\n { size: 'lg', labelFloated: false, class: { label: 'text-base' } },\n { size: 'lg', labelFloated: true, class: { label: 'text-sm' } },\n { size: 'xl', labelFloated: false, class: { label: 'text-base' } },\n { size: 'xl', labelFloated: true, class: { label: 'text-sm' } },\n\n // ── Outline + focused → colored border ──\n { appearance: 'outline', focused: true, color: 'primary', class: { controlWrapper: 'border-primary-500' } },\n { appearance: 'outline', focused: true, color: 'secondary', class: { controlWrapper: 'border-secondary-500' } },\n { appearance: 'outline', focused: true, color: 'accent', class: { controlWrapper: 'border-accent-500' } },\n { appearance: 'outline', focused: true, color: 'neutral', class: { controlWrapper: 'border-border-strong' } },\n { appearance: 'outline', focused: true, color: 'info', class: { controlWrapper: 'border-info-500' } },\n { appearance: 'outline', focused: true, color: 'success', class: { controlWrapper: 'border-success-500' } },\n { appearance: 'outline', focused: true, color: 'warning', class: { controlWrapper: 'border-warning-500' } },\n { appearance: 'outline', focused: true, color: 'error', class: { controlWrapper: 'border-error-500' } },\n\n // ── Filled + focused → colored bottom border ──\n { appearance: 'filled', focused: true, color: 'primary', class: { controlWrapper: 'border-b-2 border-primary-500' } },\n { appearance: 'filled', focused: true, color: 'secondary', class: { controlWrapper: 'border-b-2 border-secondary-500' } },\n { appearance: 'filled', focused: true, color: 'accent', class: { controlWrapper: 'border-b-2 border-accent-500' } },\n { appearance: 'filled', focused: true, color: 'neutral', class: { controlWrapper: 'border-b-2 border-border-strong' } },\n { appearance: 'filled', focused: true, color: 'info', class: { controlWrapper: 'border-b-2 border-info-500' } },\n { appearance: 'filled', focused: true, color: 'success', class: { controlWrapper: 'border-b-2 border-success-500' } },\n { appearance: 'filled', focused: true, color: 'warning', class: { controlWrapper: 'border-b-2 border-warning-500' } },\n { appearance: 'filled', focused: true, color: 'error', class: { controlWrapper: 'border-b-2 border-error-500' } },\n\n // ── Floated label + focused → colored label ──\n { labelFloated: true, focused: true, color: 'primary', class: { label: 'text-primary-600' } },\n { labelFloated: true, focused: true, color: 'secondary', class: { label: 'text-secondary-600' } },\n { labelFloated: true, focused: true, color: 'accent', class: { label: 'text-accent-600' } },\n { labelFloated: true, focused: true, color: 'neutral', class: { label: 'text-fg' } },\n { labelFloated: true, focused: true, color: 'info', class: { label: 'text-info-600' } },\n { labelFloated: true, focused: true, color: 'success', class: { label: 'text-success-600' } },\n { labelFloated: true, focused: true, color: 'warning', class: { label: 'text-warning-600' } },\n { labelFloated: true, focused: true, color: 'error', class: { label: 'text-error-600' } },\n\n // ── Outline + floated label → sit centered on the top border with a surface notch ──\n { appearance: 'outline', labelFloated: true, class: { labelWrapper: 'bg-surface px-1 top-0 -translate-y-1/2' } },\n\n // ── Filled + resting label → align vertically with the input baseline (input is items-end inside an asymmetric pt/pb container) ──\n { appearance: 'filled', labelFloated: false, class: { labelWrapper: 'top-[calc(50%+0.5rem)]' } },\n\n // ── Invalid overrides (declared last so twMerge lets them win) ──\n { invalid: true, appearance: 'outline', class: { controlWrapper: 'border-error-500' } },\n { invalid: true, appearance: 'filled', class: { controlWrapper: 'border-b-2 border-error-500' } },\n { invalid: true, labelFloated: true, class: { label: 'text-error-600' } },\n ],\n defaultVariants: {\n appearance: 'outline',\n size: 'md',\n color: 'primary',\n focused: false,\n invalid: false,\n labelFloated: false,\n subscriptReserve: true,\n disabled: false,\n },\n}, {\n twMerge: true,\n});\n\n// ── LabelDirective ──\n\n@Directive({\n selector: '[twLabel]',\n host: {\n '[attr.id]': 'id',\n '[attr.for]': 'controlId()',\n '[class]': 'classes()',\n },\n})\nexport class LabelDirective {\n private readonly formField = inject(FormFieldComponent);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly id = `tw-form-field-label-${nextLabelId++}`;\n\n /** @internal */\n readonly controlId = computed(() => this.formField.control()?.id() ?? null);\n\n /** @internal */\n readonly classes = computed(() => this.formField.labelClasses());\n\n constructor() {\n if (isDevMode()) {\n const tag = this.elementRef.nativeElement.tagName;\n if (tag !== 'LABEL') {\n console.warn(\n `[tw-form-field] twLabel should be applied to a <label> element for the native \\`for\\`/\\`id\\` association to work; got <${tag.toLowerCase()}>. Non-native controls (e.g. tw-select) still receive label pushdown via aria-labelledby.`,\n );\n }\n }\n }\n}\n\n// ── HintDirective ──\n\n@Directive({\n selector: '[twHint]',\n host: {\n '[attr.id]': 'id',\n '[class]': 'classes()',\n },\n})\nexport class HintDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-hint-${nextHintId++}`;\n\n /** Alignment within the subscript row. `'end'` pushes the hint to the right. When unset, the form-field's `hintAlign` input supplies the default. */\n readonly align = input<'start' | 'end' | undefined>(undefined);\n\n /** @internal */\n readonly effectiveAlign = computed(\n () => this.align() ?? this.formField.hintAlign(),\n );\n\n /** @internal */\n readonly classes = computed(() => {\n const base = this.formField.hintClasses();\n return this.effectiveAlign() === 'end' ? `${base} ml-auto` : base;\n });\n}\n\n// ── ErrorDirective ──\n\n@Directive({\n selector: '[twError]',\n host: {\n 'role': 'alert',\n 'aria-live': 'polite',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[class.hidden]': '!shouldShow()',\n },\n})\nexport class ErrorDirective {\n private readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly id = `tw-form-field-error-${nextErrorId++}`;\n\n /** Validation error key this message is bound to (e.g. `'required'`, `'email'`, `'minlength'`). When set, the error renders only while the surrounding control reports that key in its active validation errors. When omitted, the error displays whenever the form-field is in an error state — useful as a generic fallback. */\n readonly match = input<string | undefined>(undefined);\n\n /** @internal Whether this error should display given the control's active error keys. */\n readonly shouldShow = computed(() => {\n const key = this.match();\n if (!key) return true;\n return this.formField.activeErrorKeys().has(key);\n });\n\n /** @internal */\n readonly classes = computed(() => this.formField.errorClasses());\n}\n\n// ── PrefixDirective ──\n\n@Directive({\n selector: '[twPrefix]',\n host: {\n '[class]': 'prefixClasses()',\n },\n})\nexport class PrefixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal Used by the form-field to measure the prefix area and align the resting label after it. */\n readonly elementRef = inject(ElementRef<HTMLElement>);\n\n /** @internal */\n readonly prefixClasses = computed(() => this.formField.prefixClasses());\n}\n\n// ── SuffixDirective ──\n\n@Directive({\n selector: '[twSuffix]',\n host: {\n '[class]': 'suffixClasses()',\n },\n})\nexport class SuffixDirective {\n protected readonly formField = inject(FormFieldComponent);\n\n /** @internal */\n readonly suffixClasses = computed(() => this.formField.suffixClasses());\n}\n\n// ── PrefixIconDirective / SuffixIconDirective ──\n// Opt-in directives that apply a glyph-sized adornment (`size-5 text-fg-muted shrink-0`) so consumers\n// don't pick `size-4` vs `size-5` ad-hoc. Use these for SVG icons; use [twPrefix]/[twSuffix]\n// when the adornment is text (currency, units, kbd hints).\n// They extend Prefix/SuffixDirective so the form-field's content query picks them up as a prefix/suffix\n// when computing the resting-label offset.\n\n@Directive({\n selector: '[twPrefixIcon]',\n host: {\n '[class]': 'prefixClasses()',\n },\n providers: [{ provide: PrefixDirective, useExisting: PrefixIconDirective }],\n})\nexport class PrefixIconDirective extends PrefixDirective {\n /** @internal */\n override readonly prefixClasses = computed(\n () => `${this.formField.prefixClasses()} size-5`,\n );\n}\n\n@Directive({\n selector: '[twSuffixIcon]',\n host: {\n '[class]': 'suffixClasses()',\n },\n providers: [{ provide: SuffixDirective, useExisting: SuffixIconDirective }],\n})\nexport class SuffixIconDirective extends SuffixDirective {\n /** @internal */\n override readonly suffixClasses = computed(\n () => `${this.formField.suffixClasses()} size-5`,\n );\n}\n\n// ── FormFieldComponent ──\n\n@Component({\n selector: 'tw-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.html',\n host: {\n '[class]': 'rootClasses()',\n '(click)': '_onContainerClick($event)',\n },\n})\nexport class FormFieldComponent implements AfterContentInit {\n /** Visual appearance of the field container. `'outline'` draws a full border around the control; `'filled'` uses a filled surface with a bottom border. Defaults to `'outline'`. */\n readonly appearance = input<FormFieldAppearance>('outline');\n\n /** Density of the field container. Maps to the inline-padding scale (`px-2 py-1` xs … `px-5 py-3` xl) and the floating-label font scale. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Floating label behavior. `'auto'` floats when focused or non-empty; `'always'` stays floated; `'never'` disables floating entirely (the label wrapper is not rendered and the wrapped control's placeholder is always visible). Defaults to `'auto'`. */\n readonly floatLabel = input<FloatLabel>('auto');\n\n /** Subscript sizing strategy. `'fixed'` always reserves a 20px row for hints/errors so adjacent fields align; `'dynamic'` collapses the row when no hint/error is projected. Defaults to `'fixed'`. */\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\n\n /** Hides the visual required marker (`*`) even when the wrapped control is required. `aria-required` on the control is unaffected. Defaults to `false`. */\n readonly hideRequiredMarker = input(false);\n\n /** Semantic color for focused/active accents (focused border, floated label). Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Default alignment for a `twHint` element that does not specify its own `align`. Defaults to `'start'`. */\n readonly hintAlign = input<'start' | 'end'>('start');\n\n /** @internal */\n readonly control = contentChild(TW_FORM_FIELD_CONTROL, { descendants: true });\n /** @internal */\n readonly labelChild = contentChild(LabelDirective, { descendants: true });\n /** @internal */\n readonly hintChildren = contentChildren(HintDirective, { descendants: true });\n /** @internal */\n readonly errorChildren = contentChildren(ErrorDirective, { descendants: true });\n /** @internal */\n readonly prefixChildren = contentChildren(PrefixDirective, { descendants: true });\n /** @internal */\n readonly infixRef = viewChild<ElementRef<HTMLElement>>('infix');\n\n /** @internal */\n readonly hasLabel = computed(() => !!this.labelChild());\n /** @internal */\n readonly hasPrefix = computed(() => this.prefixChildren().length > 0);\n\n /** @internal Resting-label left offset in pixels, mirroring the infix's `offsetLeft` so the label sits right after any prefix. */\n private readonly restingLabelOffset = signal(12);\n\n /** @internal */\n readonly isFocused = computed(() => !!this.control()?.focused());\n /** @internal */\n readonly isInvalid = computed(() => !!this.control()?.errorState());\n /** @internal */\n readonly isDisabled = computed(() => !!this.control()?.disabled());\n /** @internal */\n readonly isRequired = computed(() => !!this.control()?.required());\n\n /** @internal Whether the floating label wrapper should render at all. `'never'` opts out entirely. */\n readonly shouldRenderLabelWrapper = computed(\n () => this.hasLabel() && this.floatLabel() !== 'never',\n );\n\n /** @internal */\n readonly shouldLabelFloat = computed(() => {\n const mode = this.floatLabel();\n if (mode === 'never') return false;\n if (mode === 'always') return true;\n const ctrl = this.control();\n if (!ctrl) return false;\n return ctrl.focused() || !ctrl.empty();\n });\n\n /** @internal Inline `left` value for the label wrapper. Floated labels pin to the container edge; resting labels align with the infix's left (after any prefix). */\n readonly labelLeft = computed(() =>\n this.shouldLabelFloat() ? '0.5rem' : `${this.restingLabelOffset()}px`,\n );\n\n /** @internal */\n readonly subscriptMode = computed<'error' | 'hint'>(() =>\n this.isInvalid() && this.errorChildren().length > 0 ? 'error' : 'hint',\n );\n\n /** @internal Set of validation error keys currently active on the bound control (e.g. `Set('required', 'email')`). Empty when the control has no `errors` signal or no active errors. Read by `[twError match=\"…\"]` to decide whether to display. */\n readonly activeErrorKeys = computed<ReadonlySet<string>>(() => {\n const errs = this.control()?.errors?.();\n return new Set(errs ? Object.keys(errs) : []);\n });\n\n /** @internal Whether the subscript row has anything to render right now. */\n readonly hasSubscriptContent = computed(() => {\n if (this.subscriptMode() === 'error') return this.errorChildren().length > 0;\n return this.hintChildren().length > 0;\n });\n\n /** @internal Whether the subscript wrapper renders. In `'fixed'` mode it always renders to reserve vertical space; in `'dynamic'` mode it collapses when empty. */\n readonly shouldRenderSubscript = computed(() => {\n if (this.subscriptSizing() === 'fixed') return true;\n return this.hasSubscriptContent();\n });\n\n private readonly controlTypeClass = computed(() => {\n const type = this.control()?.controlType;\n return type ? `tw-form-field-type-${type}` : '';\n });\n\n private readonly variantResult = computed(() =>\n formFieldVariants({\n appearance: this.appearance(),\n size: this.size(),\n color: this.color(),\n focused: this.isFocused(),\n invalid: this.isInvalid(),\n labelFloated: this.shouldLabelFloat(),\n subscriptReserve: this.subscriptSizing() === 'fixed',\n disabled: this.isDisabled(),\n }),\n );\n\n /** @internal */\n readonly rootClasses = computed(() => {\n const base = this.variantResult().root();\n const type = this.controlTypeClass();\n return type ? `${base} ${type}` : base;\n });\n /** @internal */\n readonly controlWrapperClasses = computed(() => this.variantResult().controlWrapper());\n /** @internal */\n readonly infixClasses = computed(() => {\n const base = this.variantResult().infix();\n // Hide the placeholder while the resting label is occupying the same space.\n // `floatLabel='never'` keeps the placeholder visible regardless of label projection.\n const hidePlaceholder =\n this.shouldRenderLabelWrapper() && !this.shouldLabelFloat();\n return hidePlaceholder\n ? `${base} [&_input::placeholder]:opacity-0 [&_textarea::placeholder]:opacity-0`\n : base;\n });\n /** @internal */\n readonly labelWrapperClasses = computed(() => this.variantResult().labelWrapper());\n /** @internal */\n readonly labelClasses = computed(() => this.variantResult().label());\n /** @internal */\n readonly requiredMarkerClasses = computed(() => this.variantResult().requiredMarker());\n /** @internal */\n readonly prefixClasses = computed(() => this.variantResult().prefix());\n /** @internal */\n readonly suffixClasses = computed(() => this.variantResult().suffix());\n /** @internal */\n readonly subscriptWrapperClasses = computed(() => this.variantResult().subscriptWrapper());\n /** @internal */\n readonly hintClasses = computed(() => this.variantResult().hint());\n /** @internal */\n readonly errorClasses = computed(() => this.variantResult().error());\n\n constructor() {\n // Push merged aria-describedby ids to the control whenever hint/error lists, the subscript mode, or per-error `match` visibility change.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n if (this.subscriptMode() === 'error') {\n for (const e of this.errorChildren()) {\n // Filter by `shouldShow()` so `[twError match=\"…\"]` entries that\n // don't match the active validation keys are not announced.\n if (e.shouldShow()) ids.push(e.id);\n }\n } else {\n for (const h of this.hintChildren()) ids.push(h.id);\n }\n const userIds = ctrl.userAriaDescribedBy?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setDescribedByIds(ids));\n });\n\n // Push merged aria-labelledby ids (projected label id + user-supplied) to the control.\n // Native inputs ignore this in practice (the `for=`/`id` association wins) but non-native\n // triggers (combobox, date-picker) need the explicit attribute for screen readers.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl) return;\n const ids: string[] = [];\n const labelId = this.labelChild()?.id;\n if (labelId && this.shouldRenderLabelWrapper()) ids.push(labelId);\n const userIds = ctrl.userAriaLabelledby?.();\n if (userIds) {\n for (const id of userIds.split(/\\s+/)) {\n if (id) ids.push(id);\n }\n }\n untracked(() => ctrl.setLabelledByIds(ids));\n });\n\n // Dev-mode validation: at most one hint per alignment.\n // Reports via `console.error` instead of `throw` so an authoring mistake\n // surfaces during development without crashing the surrounding effect graph\n // (which would otherwise leave Angular in an unrecoverable error state).\n effect(() => {\n if (!isDevMode()) return;\n const hints = this.hintChildren();\n const startCount = hints.filter((h) => h.effectiveAlign() === 'start').length;\n const endCount = hints.filter((h) => h.effectiveAlign() === 'end').length;\n if (startCount > 1 || endCount > 1) {\n console.error(\n 'tw-form-field: only one twHint per alignment (\"start\" / \"end\") is allowed.',\n );\n }\n });\n\n // Track the infix's left offset so the resting label can sit right after any prefix.\n effect((onCleanup) => {\n const prefixes = this.prefixChildren();\n if (prefixes.length === 0) {\n this.restingLabelOffset.set(12);\n return;\n }\n const infix = this.infixRef()?.nativeElement;\n if (!infix) return;\n const update = (): void => this.restingLabelOffset.set(infix.offsetLeft);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n for (const p of prefixes) {\n ro.observe(p.elementRef.nativeElement);\n }\n ro.observe(infix);\n onCleanup(() => ro.disconnect());\n });\n }\n\n ngAfterContentInit(): void {\n if (isDevMode() && !this.control()) {\n throw new Error(\n 'tw-form-field requires a child control providing TW_FORM_FIELD_CONTROL. ' +\n 'Place a control (e.g. <input twInput />) inside the <tw-form-field>.',\n );\n }\n }\n\n /** @internal */\n _onContainerClick(event: MouseEvent): void {\n this.control()?.onContainerClick(event);\n }\n}\n","<div [class]=\"controlWrapperClasses()\">\n <ng-content select=\"[twPrefix]\" />\n <ng-content select=\"[twPrefixIcon]\" />\n <div #infix [class]=\"infixClasses()\">\n <ng-content />\n </div>\n <ng-content select=\"[twSuffix]\" />\n <ng-content select=\"[twSuffixIcon]\" />\n @if (shouldRenderLabelWrapper()) {\n <div [class]=\"labelWrapperClasses()\" [style.left]=\"labelLeft()\">\n <ng-content select=\"[twLabel]\" />\n @if (!hideRequiredMarker() && isRequired()) {\n <span [class]=\"requiredMarkerClasses()\" aria-hidden=\"true\">*</span>\n }\n </div>\n }\n</div>\n\n@if (shouldRenderSubscript()) {\n <div [class]=\"subscriptWrapperClasses()\">\n @if (subscriptMode() === 'error') {\n <ng-content select=\"[twError]\" />\n } @else {\n <ng-content select=\"[twHint]\" />\n }\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { provideTwIcons } from '@cdevhub/ngx-tw/icon';
2
+
3
+ /**
4
+ * Converts a single Lucide icon to the generic `TwIconData` format.
5
+ *
6
+ * Lucide's `LucideIconData` is structurally identical to `TwIconData`.
7
+ * This function exists for type-level conversion and explicit intent.
8
+ */
9
+ function fromLucideIcon(icon) {
10
+ return icon;
11
+ }
12
+ /**
13
+ * Registers Lucide icons for use with `tw-icon`.
14
+ *
15
+ * Drop-in replacement for `provideTwIcons` that accepts Lucide icon imports directly.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { provideTwLucideIcons } from '@cdevhub/ngx-tw/icon/lucide';
20
+ * import { ChevronRight, Star, Check } from 'lucide-angular';
21
+ *
22
+ * export const appConfig = {
23
+ * providers: [provideTwLucideIcons({ ChevronRight, Star, Check })]
24
+ * };
25
+ * ```
26
+ */
27
+ function provideTwLucideIcons(icons) {
28
+ return provideTwIcons(icons);
29
+ }
30
+
31
+ /**
32
+ * Generated bundle index. Do not edit.
33
+ */
34
+
35
+ export { fromLucideIcon, provideTwLucideIcons };
36
+ //# sourceMappingURL=cdevhub-ngx-tw-icon-lucide.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-icon-lucide.mjs","sources":["../../../projects/ngx-tw/icon/lucide/lucide-adapter.ts","../../../projects/ngx-tw/icon/lucide/cdevhub-ngx-tw-icon-lucide.ts"],"sourcesContent":["import type { Provider } from '@angular/core';\nimport type { LucideIconData, LucideIcons } from 'lucide-angular';\nimport { provideTwIcons } from '@cdevhub/ngx-tw/icon';\nimport type { TwIconData } from '@cdevhub/ngx-tw/icon';\n\n/**\n * Converts a single Lucide icon to the generic `TwIconData` format.\n *\n * Lucide's `LucideIconData` is structurally identical to `TwIconData`.\n * This function exists for type-level conversion and explicit intent.\n */\nexport function fromLucideIcon(icon: LucideIconData): TwIconData {\n return icon as unknown as TwIconData;\n}\n\n/**\n * Registers Lucide icons for use with `tw-icon`.\n *\n * Drop-in replacement for `provideTwIcons` that accepts Lucide icon imports directly.\n *\n * @example\n * ```ts\n * import { provideTwLucideIcons } from '@cdevhub/ngx-tw/icon/lucide';\n * import { ChevronRight, Star, Check } from 'lucide-angular';\n *\n * export const appConfig = {\n * providers: [provideTwLucideIcons({ ChevronRight, Star, Check })]\n * };\n * ```\n */\nexport function provideTwLucideIcons(icons: LucideIcons): Provider[] {\n return provideTwIcons(icons as unknown as Record<string, TwIconData>);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAKA;;;;;AAKG;AACG,SAAU,cAAc,CAAC,IAAoB,EAAA;AACjD,IAAA,OAAO,IAA6B;AACtC;AAEA;;;;;;;;;;;;;;AAcG;AACG,SAAU,oBAAoB,CAAC,KAAkB,EAAA;AACrD,IAAA,OAAO,cAAc,CAAC,KAA8C,CAAC;AACvE;;AChCA;;AAEG;;;;"}
@@ -0,0 +1,278 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, InjectionToken, inject, DOCUMENT, Renderer2, ElementRef, input, computed, effect, isDevMode, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { tv } from 'tailwind-variants';
4
+
5
+ /**
6
+ * Stores icon data (SVG element tuples) for use by `tw-icon`.
7
+ *
8
+ * Not provided in root — use `provideTwIcons()` or `provideTwLucideIcons()`
9
+ * to register icons and supply this service.
10
+ */
11
+ class IconRegistry {
12
+ icons = {};
13
+ /** Merges the given icons into the registry. */
14
+ register(icons) {
15
+ Object.assign(this.icons, icons);
16
+ }
17
+ /** Returns the icon data for the given PascalCase name, or `null` if not registered. */
18
+ get(name) {
19
+ return this.icons[name] ?? null;
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconRegistry });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconRegistry, decorators: [{
25
+ type: Injectable
26
+ }] });
27
+
28
+ /**
29
+ * Multi-provider token whose factories register icons into the `IconRegistry`.
30
+ * Injected by `IconComponent` to trigger factory execution. The token value is never read.
31
+ */
32
+ const TW_ICON_REGISTRAR = new InjectionToken('TwIconRegistrar');
33
+ /**
34
+ * Registers icons for use with `tw-icon`.
35
+ *
36
+ * Returns an array of providers that includes the `IconRegistry` service
37
+ * and a multi-provider factory that merges the given icons into it.
38
+ * Angular deduplicates the class provider, so multiple calls are safe.
39
+ *
40
+ * Works at all injector levels: app root, lazy route, and component.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { provideTwIcons } from '@cdevhub/ngx-tw/icon';
45
+ *
46
+ * const myIcons = {
47
+ * Star: [['polygon', { points: '12 2 15.09 8.26 ...' }]],
48
+ * };
49
+ *
50
+ * export const appConfig = {
51
+ * providers: [provideTwIcons(myIcons)]
52
+ * };
53
+ * ```
54
+ */
55
+ function provideTwIcons(icons) {
56
+ return [
57
+ IconRegistry,
58
+ {
59
+ provide: TW_ICON_REGISTRAR,
60
+ multi: true,
61
+ useFactory: () => inject(IconRegistry).register(icons),
62
+ },
63
+ ];
64
+ }
65
+
66
+ const SVG_NS = 'http://www.w3.org/2000/svg';
67
+ const DEFAULT_STROKE_WIDTH = 2;
68
+ const DEFAULT_ABSOLUTE_STROKE_WIDTH = false;
69
+ const DEFAULT_VIEW_BOX = '0 0 24 24';
70
+ /** Converts a kebab-case icon name to PascalCase for registry lookup. */
71
+ function toPascalCase(str) {
72
+ return str.replace(/(^|[-_\s])([a-z0-9])/g, (_match, _sep, char) => char.toUpperCase());
73
+ }
74
+ /** Pixel sizes for each TwSize value, used as SVG width/height attributes. */
75
+ const ICON_SIZE_PX = {
76
+ xs: 12,
77
+ sm: 16,
78
+ md: 20,
79
+ lg: 24,
80
+ xl: 32,
81
+ };
82
+ const iconVariants = tv({
83
+ base: 'inline-flex items-center justify-center shrink-0 align-middle',
84
+ variants: {
85
+ color: {
86
+ current: '',
87
+ primary: 'text-primary-500',
88
+ secondary: 'text-secondary-500',
89
+ accent: 'text-accent-500',
90
+ neutral: 'text-fg-muted',
91
+ info: 'text-info-500',
92
+ success: 'text-success-500',
93
+ warning: 'text-warning-500',
94
+ error: 'text-error-500',
95
+ },
96
+ size: {
97
+ xs: 'size-3',
98
+ sm: 'size-4',
99
+ md: 'size-5',
100
+ lg: 'size-6',
101
+ xl: 'size-8',
102
+ },
103
+ },
104
+ defaultVariants: {
105
+ color: 'current',
106
+ size: 'md',
107
+ },
108
+ }, {
109
+ twMerge: true,
110
+ });
111
+ /**
112
+ * Renders SVG icons from a registry or from direct icon data.
113
+ *
114
+ * Icons inherit `currentColor` by default. Use the `color` input for semantic
115
+ * color variants that respond to theme changes.
116
+ *
117
+ * Register icons tree-shakably via `provideTwIcons()` (raw SVG data) or
118
+ * `provideTwLucideIcons()` from `ngx-tw/icon/lucide` (Lucide adapter).
119
+ *
120
+ * @example
121
+ * ```html
122
+ * <tw-icon name="star" />
123
+ * <tw-icon name="check" color="success" size="lg" />
124
+ * <tw-icon name="alert-triangle" color="warning" ariaLabel="Warning" />
125
+ * <tw-icon name="star" [svg]="{ strokeWidth: 1.5, absoluteStrokeWidth: true }" />
126
+ * ```
127
+ */
128
+ // IMPORTANT: `ViewEncapsulation.None` is required because the SVG is built
129
+ // imperatively via Renderer2 and appended outside Angular's view boundary —
130
+ // emulated-encapsulation attribute selectors would not match it. The host class
131
+ // list (color/size utilities) must also cascade `currentColor` into the SVG
132
+ // children for `stroke="currentColor"` to resolve correctly.
133
+ class IconComponent {
134
+ doc = inject(DOCUMENT);
135
+ renderer = inject(Renderer2);
136
+ elRef = inject((ElementRef));
137
+ registry = inject(IconRegistry);
138
+ _registrar = inject(TW_ICON_REGISTRAR, { optional: true });
139
+ /** Icon name in kebab-case (e.g. `'chevron-right'`). Resolved via the registry. Defaults to `undefined`. */
140
+ name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : /* istanbul ignore next */ []));
141
+ /** Direct icon data (SVG element tuples). Takes precedence over `name`. Defaults to `undefined`. */
142
+ img = input(...(ngDevMode ? [undefined, { debugName: "img" }] : /* istanbul ignore next */ []));
143
+ /** Semantic color. `'current'` inherits from parent text color. Defaults to `'current'`. */
144
+ color = input('current', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
145
+ /** Icon size. Defaults to `'md'` (20px). */
146
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
147
+ /** Accessible label. When set, removes `aria-hidden` and applies `aria-label` to the SVG. Defaults to `undefined` (icon is decorative, `aria-hidden="true"`). */
148
+ ariaLabel = input(...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
149
+ /**
150
+ * SVG-author configuration: `strokeWidth`, `absoluteStrokeWidth`, `viewBox`.
151
+ * Unset fields fall back to `{ strokeWidth: 2, absoluteStrokeWidth: false, viewBox: '0 0 24 24' }`.
152
+ */
153
+ svg = input(...(ngDevMode ? [undefined, { debugName: "svg" }] : /* istanbul ignore next */ []));
154
+ /** Resolves icon data from `img` (priority) or `name` (registry lookup). */
155
+ resolvedIcon = computed(() => {
156
+ const imgData = this.img();
157
+ if (imgData)
158
+ return imgData;
159
+ const iconName = this.name();
160
+ if (iconName)
161
+ return this.registry.get(toPascalCase(iconName)) ?? undefined;
162
+ return undefined;
163
+ }, ...(ngDevMode ? [{ debugName: "resolvedIcon" }] : /* istanbul ignore next */ []));
164
+ /** Pixel size for the current `size` input. */
165
+ sizeInPx = computed(() => ICON_SIZE_PX[this.size()], ...(ngDevMode ? [{ debugName: "sizeInPx" }] : /* istanbul ignore next */ []));
166
+ /** Effective stroke width, accounting for `absoluteStrokeWidth`. */
167
+ effectiveStrokeWidth = computed(() => {
168
+ const cfg = this.svg();
169
+ const sw = cfg?.strokeWidth ?? DEFAULT_STROKE_WIDTH;
170
+ const absolute = cfg?.absoluteStrokeWidth ?? DEFAULT_ABSOLUTE_STROKE_WIDTH;
171
+ if (!absolute)
172
+ return sw;
173
+ return (sw * 24) / this.sizeInPx();
174
+ }, ...(ngDevMode ? [{ debugName: "effectiveStrokeWidth" }] : /* istanbul ignore next */ []));
175
+ /** Effective viewBox. */
176
+ effectiveViewBox = computed(() => this.svg()?.viewBox ?? DEFAULT_VIEW_BOX, ...(ngDevMode ? [{ debugName: "effectiveViewBox" }] : /* istanbul ignore next */ []));
177
+ /** Host class string from tv(). */
178
+ classes = computed(() => iconVariants({ color: this.color(), size: this.size() }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
179
+ /** Tracks the previous render state to avoid unnecessary DOM rebuilds. */
180
+ prevIconData;
181
+ prevStrokeWidth;
182
+ prevViewBox;
183
+ prevAriaLabel;
184
+ currentSvg = null;
185
+ constructor() {
186
+ effect(() => {
187
+ this.renderSvg();
188
+ });
189
+ }
190
+ renderSvg() {
191
+ const el = this.elRef.nativeElement;
192
+ const data = this.resolvedIcon();
193
+ const sw = this.effectiveStrokeWidth();
194
+ const vb = this.effectiveViewBox();
195
+ const label = this.ariaLabel();
196
+ const iconName = this.name();
197
+ // Dev-mode warning when icon name is provided but not found
198
+ if (isDevMode() && iconName && !data) {
199
+ console.warn(`Icon "${iconName}" not found in registry. Did you forget to register it with provideTwIcons()?`);
200
+ }
201
+ // No icon data — clear and return
202
+ if (!data) {
203
+ if (this.currentSvg) {
204
+ this.renderer.removeChild(el, this.currentSvg);
205
+ this.currentSvg = null;
206
+ this.prevIconData = undefined;
207
+ }
208
+ return;
209
+ }
210
+ // SVG caching: skip DOM rebuild if only color/size changed (handled by host classes)
211
+ if (this.currentSvg &&
212
+ data === this.prevIconData &&
213
+ sw === this.prevStrokeWidth &&
214
+ vb === this.prevViewBox &&
215
+ label === this.prevAriaLabel) {
216
+ return;
217
+ }
218
+ // Remove previous SVG
219
+ if (this.currentSvg) {
220
+ this.renderer.removeChild(el, this.currentSvg);
221
+ }
222
+ const size = this.sizeInPx();
223
+ // Build SVG element
224
+ const svg = this.doc.createElementNS(SVG_NS, 'svg');
225
+ this.renderer.setAttribute(svg, 'xmlns', SVG_NS);
226
+ this.renderer.setAttribute(svg, 'width', String(size));
227
+ this.renderer.setAttribute(svg, 'height', String(size));
228
+ this.renderer.setAttribute(svg, 'viewBox', vb);
229
+ this.renderer.setAttribute(svg, 'fill', 'none');
230
+ this.renderer.setAttribute(svg, 'stroke', 'currentColor');
231
+ this.renderer.setAttribute(svg, 'stroke-width', String(sw));
232
+ this.renderer.setAttribute(svg, 'stroke-linecap', 'round');
233
+ this.renderer.setAttribute(svg, 'stroke-linejoin', 'round');
234
+ if (label) {
235
+ this.renderer.setAttribute(svg, 'role', 'img');
236
+ this.renderer.setAttribute(svg, 'aria-label', label);
237
+ }
238
+ else {
239
+ this.renderer.setAttribute(svg, 'aria-hidden', 'true');
240
+ }
241
+ // Render SVG children from icon data
242
+ for (const [tag, attrs] of data) {
243
+ const child = this.doc.createElementNS(SVG_NS, tag);
244
+ for (const [key, value] of Object.entries(attrs)) {
245
+ this.renderer.setAttribute(child, key, String(value));
246
+ }
247
+ this.renderer.appendChild(svg, child);
248
+ }
249
+ this.renderer.appendChild(el, svg);
250
+ // Update cache
251
+ this.currentSvg = svg;
252
+ this.prevIconData = data;
253
+ this.prevStrokeWidth = sw;
254
+ this.prevViewBox = vb;
255
+ this.prevAriaLabel = label;
256
+ }
257
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.14", type: IconComponent, isStandalone: true, selector: "tw-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 }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, svg: { classPropertyName: "svg", publicName: "svg", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconComponent, decorators: [{
261
+ type: Component,
262
+ args: [{
263
+ selector: 'tw-icon',
264
+ template: '',
265
+ changeDetection: ChangeDetectionStrategy.OnPush,
266
+ encapsulation: ViewEncapsulation.None,
267
+ host: {
268
+ '[class]': 'classes()',
269
+ },
270
+ }]
271
+ }], 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 }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], svg: [{ type: i0.Input, args: [{ isSignal: true, alias: "svg", required: false }] }] } });
272
+
273
+ /**
274
+ * Generated bundle index. Do not edit.
275
+ */
276
+
277
+ export { IconComponent, IconRegistry, TW_ICON_REGISTRAR, provideTwIcons };
278
+ //# sourceMappingURL=cdevhub-ngx-tw-icon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-icon.mjs","sources":["../../../projects/ngx-tw/icon/icon.registry.ts","../../../projects/ngx-tw/icon/icon.providers.ts","../../../projects/ngx-tw/icon/icon.ts","../../../projects/ngx-tw/icon/cdevhub-ngx-tw-icon.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport type { TwIconData, TwIconMap } from './icon.types';\n\n/**\n * Stores icon data (SVG element tuples) for use by `tw-icon`.\n *\n * Not provided in root — use `provideTwIcons()` or `provideTwLucideIcons()`\n * to register icons and supply this service.\n */\n@Injectable()\nexport class IconRegistry {\n private readonly icons: TwIconMap = {};\n\n /** Merges the given icons into the registry. */\n register(icons: TwIconMap): 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): TwIconData | null {\n return this.icons[name] ?? null;\n }\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport type { TwIconMap } from './icon.types';\nimport { IconRegistry } from './icon.registry';\n\n/**\n * Multi-provider token whose factories register icons into the `IconRegistry`.\n * Injected by `IconComponent` to trigger factory execution. The token value is never read.\n */\nexport const TW_ICON_REGISTRAR = new InjectionToken<void[]>('TwIconRegistrar');\n\n/**\n * Registers icons for use with `tw-icon`.\n *\n * Returns an array of providers that includes the `IconRegistry` service\n * and a multi-provider factory that merges the given icons into it.\n * Angular deduplicates the class provider, so multiple calls are safe.\n *\n * Works at all injector levels: app root, lazy route, and component.\n *\n * @example\n * ```ts\n * import { provideTwIcons } from '@cdevhub/ngx-tw/icon';\n *\n * const myIcons = {\n * Star: [['polygon', { points: '12 2 15.09 8.26 ...' }]],\n * };\n *\n * export const appConfig = {\n * providers: [provideTwIcons(myIcons)]\n * };\n * ```\n */\nexport function provideTwIcons(icons: TwIconMap): Provider[] {\n return [\n IconRegistry,\n {\n provide: TW_ICON_REGISTRAR,\n multi: true,\n useFactory: () => inject(IconRegistry).register(icons),\n },\n ];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n Renderer2,\n ViewEncapsulation,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { TW_ICON_REGISTRAR } from './icon.providers';\nimport { IconRegistry } from './icon.registry';\nimport type { TwIconColor, TwIconData, TwIconSvgConfig } from './icon.types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nconst DEFAULT_STROKE_WIDTH = 2;\nconst DEFAULT_ABSOLUTE_STROKE_WIDTH = false;\nconst DEFAULT_VIEW_BOX = '0 0 24 24';\n\n/** Converts a kebab-case icon name to PascalCase for registry lookup. */\nfunction toPascalCase(str: string): string {\n return str.replace(/(^|[-_\\s])([a-z0-9])/g, (_match, _sep, char: string) =>\n char.toUpperCase(),\n );\n}\n\n/** Pixel sizes for each TwSize value, used as SVG width/height attributes. */\nconst ICON_SIZE_PX: Record<TwSize, number> = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n};\n\nconst iconVariants = tv({\n base: 'inline-flex items-center justify-center shrink-0 align-middle',\n variants: {\n color: {\n current: '',\n primary: 'text-primary-500',\n secondary: 'text-secondary-500',\n accent: 'text-accent-500',\n neutral: 'text-fg-muted',\n info: 'text-info-500',\n success: 'text-success-500',\n warning: 'text-warning-500',\n error: 'text-error-500',\n },\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n xl: 'size-8',\n },\n },\n defaultVariants: {\n color: 'current',\n size: 'md',\n },\n}, {\n twMerge: true,\n});\n\n/**\n * Renders SVG icons from a registry or from direct icon data.\n *\n * Icons inherit `currentColor` by default. Use the `color` input for semantic\n * color variants that respond to theme changes.\n *\n * Register icons tree-shakably via `provideTwIcons()` (raw SVG data) or\n * `provideTwLucideIcons()` from `ngx-tw/icon/lucide` (Lucide adapter).\n *\n * @example\n * ```html\n * <tw-icon name=\"star\" />\n * <tw-icon name=\"check\" color=\"success\" size=\"lg\" />\n * <tw-icon name=\"alert-triangle\" color=\"warning\" ariaLabel=\"Warning\" />\n * <tw-icon name=\"star\" [svg]=\"{ strokeWidth: 1.5, absoluteStrokeWidth: true }\" />\n * ```\n */\n// IMPORTANT: `ViewEncapsulation.None` is required because the SVG is built\n// imperatively via Renderer2 and appended outside Angular's view boundary —\n// emulated-encapsulation attribute selectors would not match it. The host class\n// list (color/size utilities) must also cascade `currentColor` into the SVG\n// children for `stroke=\"currentColor\"` to resolve correctly.\n@Component({\n selector: 'tw-icon',\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class]': 'classes()',\n },\n})\nexport class IconComponent {\n private readonly doc = inject(DOCUMENT);\n private readonly renderer = inject(Renderer2);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly registry = inject(IconRegistry);\n private readonly _registrar = inject(TW_ICON_REGISTRAR, { optional: true });\n\n /** Icon name in kebab-case (e.g. `'chevron-right'`). Resolved via the registry. Defaults to `undefined`. */\n readonly name = input<string>();\n\n /** Direct icon data (SVG element tuples). Takes precedence over `name`. Defaults to `undefined`. */\n readonly img = input<TwIconData>();\n\n /** Semantic color. `'current'` inherits from parent text color. Defaults to `'current'`. */\n readonly color = input<TwIconColor>('current');\n\n /** Icon size. Defaults to `'md'` (20px). */\n readonly size = input<TwSize>('md');\n\n /** Accessible label. When set, removes `aria-hidden` and applies `aria-label` to the SVG. Defaults to `undefined` (icon is decorative, `aria-hidden=\"true\"`). */\n readonly ariaLabel = input<string>();\n\n /**\n * SVG-author configuration: `strokeWidth`, `absoluteStrokeWidth`, `viewBox`.\n * Unset fields fall back to `{ strokeWidth: 2, absoluteStrokeWidth: false, viewBox: '0 0 24 24' }`.\n */\n readonly svg = input<TwIconSvgConfig>();\n\n /** Resolves icon data from `img` (priority) or `name` (registry lookup). */\n protected readonly resolvedIcon = computed<TwIconData | undefined>(() => {\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 /** Pixel size for the current `size` input. */\n protected readonly sizeInPx = computed(() => ICON_SIZE_PX[this.size()]);\n\n /** Effective stroke width, accounting for `absoluteStrokeWidth`. */\n protected readonly effectiveStrokeWidth = computed(() => {\n const cfg = this.svg();\n const sw = cfg?.strokeWidth ?? DEFAULT_STROKE_WIDTH;\n const absolute = cfg?.absoluteStrokeWidth ?? DEFAULT_ABSOLUTE_STROKE_WIDTH;\n if (!absolute) return sw;\n return (sw * 24) / this.sizeInPx();\n });\n\n /** Effective viewBox. */\n protected readonly effectiveViewBox = computed(() =>\n this.svg()?.viewBox ?? DEFAULT_VIEW_BOX,\n );\n\n /** Host class string from tv(). */\n readonly classes = computed(() =>\n iconVariants({ color: this.color(), size: this.size() }),\n );\n\n /** Tracks the previous render state to avoid unnecessary DOM rebuilds. */\n private prevIconData: TwIconData | undefined;\n private prevStrokeWidth: number | undefined;\n private prevViewBox: string | undefined;\n private prevAriaLabel: string | undefined;\n private currentSvg: SVGElement | null = null;\n\n constructor() {\n effect(() => {\n this.renderSvg();\n });\n }\n\n private renderSvg(): void {\n const el = this.elRef.nativeElement;\n const data = this.resolvedIcon();\n const sw = this.effectiveStrokeWidth();\n const vb = this.effectiveViewBox();\n const label = this.ariaLabel();\n const iconName = this.name();\n\n // Dev-mode warning when icon name is provided but not found\n if (isDevMode() && iconName && !data) {\n console.warn(\n `Icon \"${iconName}\" not found in registry. Did you forget to register it with provideTwIcons()?`,\n );\n }\n\n // No icon data — clear and return\n if (!data) {\n if (this.currentSvg) {\n this.renderer.removeChild(el, this.currentSvg);\n this.currentSvg = null;\n this.prevIconData = undefined;\n }\n return;\n }\n\n // SVG caching: skip DOM rebuild if only color/size changed (handled by host classes)\n if (\n this.currentSvg &&\n data === this.prevIconData &&\n sw === this.prevStrokeWidth &&\n vb === this.prevViewBox &&\n label === this.prevAriaLabel\n ) {\n return;\n }\n\n // Remove previous SVG\n if (this.currentSvg) {\n this.renderer.removeChild(el, this.currentSvg);\n }\n\n const size = this.sizeInPx();\n\n // Build SVG element\n const svg = this.doc.createElementNS(SVG_NS, 'svg');\n this.renderer.setAttribute(svg, 'xmlns', SVG_NS);\n this.renderer.setAttribute(svg, 'width', String(size));\n this.renderer.setAttribute(svg, 'height', String(size));\n this.renderer.setAttribute(svg, 'viewBox', vb);\n this.renderer.setAttribute(svg, 'fill', 'none');\n this.renderer.setAttribute(svg, 'stroke', 'currentColor');\n this.renderer.setAttribute(svg, 'stroke-width', String(sw));\n this.renderer.setAttribute(svg, 'stroke-linecap', 'round');\n this.renderer.setAttribute(svg, 'stroke-linejoin', 'round');\n\n if (label) {\n this.renderer.setAttribute(svg, 'role', 'img');\n this.renderer.setAttribute(svg, 'aria-label', label);\n } else {\n this.renderer.setAttribute(svg, 'aria-hidden', 'true');\n }\n\n // Render SVG children from icon data\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.renderer.setAttribute(child, key, String(value));\n }\n this.renderer.appendChild(svg, child);\n }\n\n this.renderer.appendChild(el, svg);\n\n // Update cache\n this.currentSvg = svg;\n this.prevIconData = data;\n this.prevStrokeWidth = sw;\n this.prevViewBox = vb;\n this.prevAriaLabel = label;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}