@cdevhub/ngx-tw 0.2.1 → 0.3.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 (139) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -20
  121. package/theme/index.css +10 -2
  122. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  123. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  124. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  125. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  126. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  127. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  128. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  129. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  130. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  131. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  132. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  133. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  134. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  135. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  136. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  137. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  138. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  139. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -1 +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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"}
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 forwardRef,\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/**\n * Minimal surface a wrapped control reads from its surrounding form-field —\n * presence (via optional injection) plus whether a label is projected — without\n * depending on the concrete {@link FormFieldComponent}. Controls inject\n * {@link TW_FORM_FIELD} typed as this interface so detecting a parent form-field\n * never pins the heavier component class into the control's own bundle.\n */\nexport interface TwFormFieldParent {\n /** Whether a `twLabel` element is projected into the form-field. */\n readonly hasLabel: Signal<boolean>;\n}\n\n/**\n * Injection token exposing the wrapping {@link TwFormFieldParent}. The\n * {@link FormFieldComponent} provides itself under this token; controls inject\n * it with `{ optional: true }` to detect (and read label state from) a parent\n * `tw-form-field` without referencing the concrete component class — keeping the\n * form-field component out of each control's bundle.\n */\nexport const TW_FORM_FIELD = new InjectionToken<TwFormFieldParent>('TW_FORM_FIELD');\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 providers: [\n { provide: TW_FORM_FIELD, useExisting: forwardRef(() => FormFieldComponent) },\n ],\n})\nexport class FormFieldComponent implements AfterContentInit, TwFormFieldParent {\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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"}
@@ -3,7 +3,7 @@ import { provideTwIcons } from '@cdevhub/ngx-tw/icon';
3
3
  /**
4
4
  * Converts a single Lucide icon to the generic `TwIconData` format.
5
5
  *
6
- * Lucide's `LucideIconData` is structurally identical to `TwIconData`.
6
+ * Lucide's icon data is structurally identical to `TwIconData`.
7
7
  * This function exists for type-level conversion and explicit intent.
8
8
  */
9
9
  function fromLucideIcon(icon) {
@@ -17,7 +17,7 @@ function fromLucideIcon(icon) {
17
17
  * @example
18
18
  * ```ts
19
19
  * import { provideTwLucideIcons } from '@cdevhub/ngx-tw/icon/lucide';
20
- * import { ChevronRight, Star, Check } from 'lucide-angular';
20
+ * import { ChevronRight, Star, Check } from 'lucide';
21
21
  *
22
22
  * export const appConfig = {
23
23
  * providers: [provideTwLucideIcons({ ChevronRight, Star, Check })]
@@ -1 +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;;;;"}
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 { provideTwIcons } from '@cdevhub/ngx-tw/icon';\nimport type { TwIconData } from '@cdevhub/ngx-tw/icon';\n\n/**\n * A single Lucide SVG element: `[tagName, attributes]`.\n *\n * Declared structurally rather than imported from a Lucide package on purpose.\n * An `import type … from 'lucide'` here would be emitted into the published\n * `.d.ts`, making a package this library does not depend on a hard requirement\n * for anyone who merely *type-checks* against this entry point. Declaring the\n * shape locally keeps the entry point dependency-free and lets it accept icons\n * from `lucide`, `lucide-angular`, or any other source with the same shape.\n */\nexport type LucideIconNode = readonly [\n tag: string,\n // `undefined` is included because that is how Lucide declares its own\n // `SVGProps` (`Record<string, string | number | undefined>`). Narrowing it\n // to `string | number` makes real Lucide icons fail to assign — the demo\n // build catches this immediately, the unit tests do not.\n attrs: Record<string, string | number | undefined>,\n];\n\n/** Icon data as Lucide emits it: the SVG child elements, without the `<svg>` wrapper. */\nexport type LucideIconData = readonly LucideIconNode[];\n\n/** A map of PascalCase icon names to Lucide icon data, as produced by `import { Star } from 'lucide'`. */\nexport type LucideIcons = Readonly<Record<string, LucideIconData>>;\n\n/**\n * Converts a single Lucide icon to the generic `TwIconData` format.\n *\n * Lucide's icon data 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';\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":";;AA6BA;;;;;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;;ACxDA;;AAEG;;;;"}
@@ -18,10 +18,10 @@ class IconRegistry {
18
18
  get(name) {
19
19
  return this.icons[name] ?? null;
20
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 });
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: IconRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: IconRegistry });
23
23
  }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconRegistry, decorators: [{
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: IconRegistry, decorators: [{
25
25
  type: Injectable
26
26
  }] });
27
27
 
@@ -137,20 +137,26 @@ class IconComponent {
137
137
  registry = inject(IconRegistry);
138
138
  _registrar = inject(TW_ICON_REGISTRAR, { optional: true });
139
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 */ []));
140
+ name = input(/* @ts-ignore */
141
+ ...(ngDevMode ? [undefined, { debugName: "name" }] : /* istanbul ignore next */ []));
141
142
  /** Direct icon data (SVG element tuples). Takes precedence over `name`. Defaults to `undefined`. */
142
- img = input(...(ngDevMode ? [undefined, { debugName: "img" }] : /* istanbul ignore next */ []));
143
+ img = input(/* @ts-ignore */
144
+ ...(ngDevMode ? [undefined, { debugName: "img" }] : /* istanbul ignore next */ []));
143
145
  /** Semantic color. `'current'` inherits from parent text color. Defaults to `'current'`. */
144
- color = input('current', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
146
+ color = input('current', /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
145
148
  /** Icon size. Defaults to `'md'` (20px). */
146
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
149
+ size = input('md', /* @ts-ignore */
150
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
147
151
  /** 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 */ []));
152
+ ariaLabel = input(/* @ts-ignore */
153
+ ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
149
154
  /**
150
155
  * SVG-author configuration: `strokeWidth`, `absoluteStrokeWidth`, `viewBox`.
151
156
  * Unset fields fall back to `{ strokeWidth: 2, absoluteStrokeWidth: false, viewBox: '0 0 24 24' }`.
152
157
  */
153
- svg = input(...(ngDevMode ? [undefined, { debugName: "svg" }] : /* istanbul ignore next */ []));
158
+ svg = input(/* @ts-ignore */
159
+ ...(ngDevMode ? [undefined, { debugName: "svg" }] : /* istanbul ignore next */ []));
154
160
  /** Resolves icon data from `img` (priority) or `name` (registry lookup). */
155
161
  resolvedIcon = computed(() => {
156
162
  const imgData = this.img();
@@ -160,9 +166,11 @@ class IconComponent {
160
166
  if (iconName)
161
167
  return this.registry.get(toPascalCase(iconName)) ?? undefined;
162
168
  return undefined;
163
- }, ...(ngDevMode ? [{ debugName: "resolvedIcon" }] : /* istanbul ignore next */ []));
169
+ }, /* @ts-ignore */
170
+ ...(ngDevMode ? [{ debugName: "resolvedIcon" }] : /* istanbul ignore next */ []));
164
171
  /** Pixel size for the current `size` input. */
165
- sizeInPx = computed(() => ICON_SIZE_PX[this.size()], ...(ngDevMode ? [{ debugName: "sizeInPx" }] : /* istanbul ignore next */ []));
172
+ sizeInPx = computed(() => ICON_SIZE_PX[this.size()], /* @ts-ignore */
173
+ ...(ngDevMode ? [{ debugName: "sizeInPx" }] : /* istanbul ignore next */ []));
166
174
  /** Effective stroke width, accounting for `absoluteStrokeWidth`. */
167
175
  effectiveStrokeWidth = computed(() => {
168
176
  const cfg = this.svg();
@@ -171,11 +179,14 @@ class IconComponent {
171
179
  if (!absolute)
172
180
  return sw;
173
181
  return (sw * 24) / this.sizeInPx();
174
- }, ...(ngDevMode ? [{ debugName: "effectiveStrokeWidth" }] : /* istanbul ignore next */ []));
182
+ }, /* @ts-ignore */
183
+ ...(ngDevMode ? [{ debugName: "effectiveStrokeWidth" }] : /* istanbul ignore next */ []));
175
184
  /** Effective viewBox. */
176
- effectiveViewBox = computed(() => this.svg()?.viewBox ?? DEFAULT_VIEW_BOX, ...(ngDevMode ? [{ debugName: "effectiveViewBox" }] : /* istanbul ignore next */ []));
185
+ effectiveViewBox = computed(() => this.svg()?.viewBox ?? DEFAULT_VIEW_BOX, /* @ts-ignore */
186
+ ...(ngDevMode ? [{ debugName: "effectiveViewBox" }] : /* istanbul ignore next */ []));
177
187
  /** Host class string from tv(). */
178
- classes = computed(() => iconVariants({ color: this.color(), size: this.size() }), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
188
+ classes = computed(() => iconVariants({ color: this.color(), size: this.size() }), /* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
179
190
  /** Tracks the previous render state to avoid unnecessary DOM rebuilds. */
180
191
  prevIconData;
181
192
  prevStrokeWidth;
@@ -254,10 +265,10 @@ class IconComponent {
254
265
  this.prevViewBox = vb;
255
266
  this.prevAriaLabel = label;
256
267
  }
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 });
268
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
269
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", 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
270
  }
260
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconComponent, decorators: [{
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: IconComponent, decorators: [{
261
272
  type: Component,
262
273
  args: [{
263
274
  selector: 'tw-icon',
@@ -1 +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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"}
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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"}