@cdevhub/ngx-tw 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +134 -0
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +108 -0
  4. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -0
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs +240 -0
  6. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -0
  7. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +287 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -0
  9. package/fesm2022/cdevhub-ngx-tw-badge.mjs +332 -0
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -0
  11. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +452 -0
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -0
  13. package/fesm2022/cdevhub-ngx-tw-button.mjs +227 -0
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -0
  15. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +417 -0
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -0
  17. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +232 -0
  18. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -0
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +4482 -0
  20. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -0
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs +157 -0
  22. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -0
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +1454 -0
  24. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -0
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +593 -0
  26. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -0
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +228 -0
  28. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -0
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +510 -0
  30. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -0
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +1721 -0
  32. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +721 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -0
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs +861 -0
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -0
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +1558 -0
  38. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +1833 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -0
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +693 -0
  42. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -0
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +331 -0
  44. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -0
  45. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +289 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -0
  47. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +572 -0
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -0
  49. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +36 -0
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -0
  51. package/fesm2022/cdevhub-ngx-tw-icon.mjs +278 -0
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -0
  53. package/fesm2022/cdevhub-ngx-tw-input.mjs +355 -0
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -0
  55. package/fesm2022/cdevhub-ngx-tw-item.mjs +241 -0
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -0
  57. package/fesm2022/cdevhub-ngx-tw-menu.mjs +433 -0
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -0
  59. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +691 -0
  60. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -0
  61. package/fesm2022/cdevhub-ngx-tw-popover.mjs +678 -0
  62. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -0
  63. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +335 -0
  64. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -0
  65. package/fesm2022/cdevhub-ngx-tw-radio.mjs +708 -0
  66. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -0
  67. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +319 -0
  68. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -0
  69. package/fesm2022/cdevhub-ngx-tw-select.mjs +1722 -0
  70. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -0
  71. package/fesm2022/cdevhub-ngx-tw-separator.mjs +115 -0
  72. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -0
  73. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +768 -0
  74. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -0
  75. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +149 -0
  76. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -0
  77. package/fesm2022/cdevhub-ngx-tw-slider.mjs +1147 -0
  78. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -0
  79. package/fesm2022/cdevhub-ngx-tw-sort.mjs +346 -0
  80. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -0
  81. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +186 -0
  82. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -0
  83. package/fesm2022/cdevhub-ngx-tw-split.mjs +1082 -0
  84. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -0
  85. package/fesm2022/cdevhub-ngx-tw-stat.mjs +579 -0
  86. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -0
  87. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +443 -0
  88. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -0
  89. package/fesm2022/cdevhub-ngx-tw-switch.mjs +391 -0
  90. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -0
  91. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +315 -0
  92. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -0
  93. package/fesm2022/cdevhub-ngx-tw-table.mjs +994 -0
  94. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -0
  95. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +508 -0
  96. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -0
  97. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +147 -0
  98. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -0
  99. package/fesm2022/cdevhub-ngx-tw-theme.mjs +178 -0
  100. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -0
  101. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +1344 -0
  102. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -0
  103. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +1136 -0
  104. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -0
  105. package/fesm2022/cdevhub-ngx-tw-toast.mjs +1311 -0
  106. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -0
  107. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +533 -0
  108. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -0
  109. package/fesm2022/cdevhub-ngx-tw.mjs +61 -0
  110. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -0
  111. package/package.json +265 -0
  112. package/theme/_base.css +394 -0
  113. package/theme/_dark.css +510 -0
  114. package/theme/_high-contrast.css +290 -0
  115. package/theme/_semantic.css +317 -0
  116. package/theme/_typography.css +9 -0
  117. package/theme/index.css +54 -0
  118. package/types/cdevhub-ngx-tw-accordion.d.ts +48 -0
  119. package/types/cdevhub-ngx-tw-alert.d.ts +67 -0
  120. package/types/cdevhub-ngx-tw-avatar.d.ts +79 -0
  121. package/types/cdevhub-ngx-tw-badge.d.ts +94 -0
  122. package/types/cdevhub-ngx-tw-breadcrumbs.d.ts +227 -0
  123. package/types/cdevhub-ngx-tw-button.d.ts +74 -0
  124. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +200 -0
  125. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +113 -0
  126. package/types/cdevhub-ngx-tw-calendar.d.ts +1704 -0
  127. package/types/cdevhub-ngx-tw-card.d.ts +48 -0
  128. package/types/cdevhub-ngx-tw-carousel.d.ts +406 -0
  129. package/types/cdevhub-ngx-tw-checkbox.d.ts +136 -0
  130. package/types/cdevhub-ngx-tw-code-block.d.ts +93 -0
  131. package/types/cdevhub-ngx-tw-collapsible.d.ts +151 -0
  132. package/types/cdevhub-ngx-tw-combobox.d.ts +389 -0
  133. package/types/cdevhub-ngx-tw-command-palette.d.ts +215 -0
  134. package/types/cdevhub-ngx-tw-core.d.ts +719 -0
  135. package/types/cdevhub-ngx-tw-date-picker.d.ts +317 -0
  136. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +313 -0
  137. package/types/cdevhub-ngx-tw-dialog.d.ts +303 -0
  138. package/types/cdevhub-ngx-tw-empty-state.d.ts +104 -0
  139. package/types/cdevhub-ngx-tw-flip-card.d.ts +95 -0
  140. package/types/cdevhub-ngx-tw-form-field.d.ts +210 -0
  141. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +29 -0
  142. package/types/cdevhub-ngx-tw-icon.d.ts +134 -0
  143. package/types/cdevhub-ngx-tw-input.d.ts +110 -0
  144. package/types/cdevhub-ngx-tw-item.d.ts +70 -0
  145. package/types/cdevhub-ngx-tw-menu.d.ts +99 -0
  146. package/types/cdevhub-ngx-tw-paginator.d.ts +305 -0
  147. package/types/cdevhub-ngx-tw-popover.d.ts +157 -0
  148. package/types/cdevhub-ngx-tw-progress-bar.d.ts +100 -0
  149. package/types/cdevhub-ngx-tw-radio.d.ts +174 -0
  150. package/types/cdevhub-ngx-tw-segmented-control.d.ts +66 -0
  151. package/types/cdevhub-ngx-tw-select.d.ts +384 -0
  152. package/types/cdevhub-ngx-tw-separator.d.ts +28 -0
  153. package/types/cdevhub-ngx-tw-sheet.d.ts +335 -0
  154. package/types/cdevhub-ngx-tw-skeleton.d.ts +52 -0
  155. package/types/cdevhub-ngx-tw-slider.d.ts +258 -0
  156. package/types/cdevhub-ngx-tw-sort.d.ts +136 -0
  157. package/types/cdevhub-ngx-tw-spinner.d.ts +50 -0
  158. package/types/cdevhub-ngx-tw-split.d.ts +265 -0
  159. package/types/cdevhub-ngx-tw-stat.d.ts +140 -0
  160. package/types/cdevhub-ngx-tw-stepper.d.ts +127 -0
  161. package/types/cdevhub-ngx-tw-switch.d.ts +88 -0
  162. package/types/cdevhub-ngx-tw-tab-nav.d.ts +107 -0
  163. package/types/cdevhub-ngx-tw-table.d.ts +479 -0
  164. package/types/cdevhub-ngx-tw-tabs.d.ts +121 -0
  165. package/types/cdevhub-ngx-tw-textarea.d.ts +62 -0
  166. package/types/cdevhub-ngx-tw-theme.d.ts +106 -0
  167. package/types/cdevhub-ngx-tw-time-picker.d.ts +303 -0
  168. package/types/cdevhub-ngx-tw-timeline.d.ts +278 -0
  169. package/types/cdevhub-ngx-tw-toast.d.ts +388 -0
  170. package/types/cdevhub-ngx-tw-tooltip.d.ts +95 -0
  171. package/types/cdevhub-ngx-tw.d.ts +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-stepper.mjs","sources":["../../../projects/ngx-tw/stepper/stepper.ts","../../../projects/ngx-tw/stepper/stepper.html","../../../projects/ngx-tw/stepper/cdevhub-ngx-tw-stepper.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n Directive,\n inject,\n input,\n signal,\n TemplateRef,\n type AfterViewInit,\n type Provider,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport {\n CdkStep,\n CdkStepHeader,\n CdkStepLabel,\n CdkStepper,\n CdkStepperNext,\n CdkStepperPrevious,\n STEP_STATE,\n STEPPER_GLOBAL_OPTIONS,\n type StepperOptions,\n type StepperOrientation,\n type StepperSelectionEvent,\n type StepState,\n} from '@angular/cdk/stepper';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Visual style of the step indicator strip. */\nexport type StepperVariant = 'default' | 'dot' | 'simple';\n\n/** Context passed to custom `*twStepperIcon` templates. */\nexport interface StepperIconContext {\n $implicit: { index: number; active: boolean };\n}\n\n// ── tv() config ──\n\nconst stepperVariants = tv(\n {\n slots: {\n root: 'flex',\n header: 'flex',\n stepItem: 'flex',\n stepHeader:\n 'group relative inline-flex items-center gap-2 cursor-pointer transition-colors duration-normal motion-reduce:transition-none rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 disabled:cursor-not-allowed',\n stepIndicator:\n 'inline-flex items-center justify-center shrink-0 rounded-full font-medium transition-[color,background-color,border-color,box-shadow] duration-normal motion-reduce:transition-none',\n stepNumber: 'leading-none',\n stepIconSlot: 'inline-flex items-center justify-center',\n stepLabelWrapper: 'flex flex-col min-w-0 text-left',\n stepLabel: 'leading-tight',\n stepDescription: 'text-xs text-fg-muted leading-tight mt-0.5',\n stepOptionalHint: 'text-xs text-fg-subtle ml-1 font-normal',\n stepConnector:\n 'shrink-0 transition-colors duration-normal motion-reduce:transition-none',\n stepPanel: 'min-w-0',\n },\n variants: {\n variant: {\n default: {},\n dot: {\n stepNumber: 'hidden',\n stepIconSlot: 'hidden',\n },\n simple: {\n stepLabelWrapper: 'sr-only',\n },\n },\n size: {\n xs: {\n stepIndicator: 'size-6 text-xs',\n stepLabel: 'text-xs',\n },\n sm: {\n stepIndicator: 'size-7 text-xs',\n stepLabel: 'text-sm',\n },\n md: {\n stepIndicator: 'size-8 text-sm',\n stepLabel: 'text-sm',\n },\n // lg/xl step labels use `text-base` per the trigger font-size scale\n // (CLAUDE.md typography). Steps are interactive trigger elements.\n lg: {\n stepIndicator: 'size-10 text-base',\n stepLabel: 'text-base',\n },\n xl: {\n stepIndicator: 'size-12 text-base',\n stepLabel: 'text-base',\n },\n },\n orientation: {\n horizontal: {\n root: 'flex-col w-full',\n header: 'flex-row items-center w-full',\n stepItem: 'flex-row items-center flex-1 last:flex-none',\n stepConnector: 'flex-1 h-px mx-2',\n stepLabelWrapper: 'ml-2',\n stepPanel:\n 'mt-4 rounded-lg outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 motion-reduce:transition-none',\n },\n vertical: {\n root: 'flex-col',\n header: 'flex-col items-stretch',\n stepItem: 'flex-col items-start w-full',\n stepConnector: 'w-px min-h-6 ml-4 my-1 flex-1',\n stepLabelWrapper: 'ml-3',\n stepPanel:\n 'ml-11 mt-2 mb-4 rounded-lg outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 motion-reduce:transition-none',\n },\n },\n },\n compoundVariants: [\n // Dot variant indicator sizing\n { variant: 'dot', size: 'xs', class: { stepIndicator: 'size-2' } },\n { variant: 'dot', size: 'sm', class: { stepIndicator: 'size-2.5' } },\n { variant: 'dot', size: 'md', class: { stepIndicator: 'size-2.5' } },\n { variant: 'dot', size: 'lg', class: { stepIndicator: 'size-3' } },\n { variant: 'dot', size: 'xl', class: { stepIndicator: 'size-3' } },\n\n // Thicker connectors for lg / xl\n {\n orientation: 'horizontal',\n size: 'lg',\n class: { stepConnector: 'h-0.5' },\n },\n {\n orientation: 'horizontal',\n size: 'xl',\n class: { stepConnector: 'h-0.5' },\n },\n { orientation: 'vertical', size: 'lg', class: { stepConnector: 'w-0.5' } },\n { orientation: 'vertical', size: 'xl', class: { stepConnector: 'w-0.5' } },\n ],\n defaultVariants: {\n variant: 'default',\n size: 'md',\n orientation: 'horizontal',\n },\n },\n { twMerge: true },\n);\n\n// ── Static class lookups (Tailwind v4 requires statically-written class strings) ──\n\ntype StepStyleState = 'pending' | 'active' | 'completed' | 'error' | 'disabled';\n\nconst INDICATOR_PENDING =\n 'bg-surface-muted text-fg-muted border border-border';\nconst INDICATOR_DISABLED =\n 'bg-surface-muted text-fg-subtle border border-border opacity-60';\nconst INDICATOR_ERROR =\n 'bg-error-solid text-error-solid-fg border border-error-border-strong';\n\n// Slot tokens own light/dark contrast — no `dark:`, no shade picks.\n// The active-state ring uses `{role}-soft` (low-chroma in light, deep-tinted in\n// dark) so the halo reads consistently against the surface in both modes.\nconst INDICATOR_ACTIVE: Record<TwColor, string> = {\n primary: 'bg-primary-solid text-primary-solid-fg border border-primary-border-strong ring-4 ring-primary-soft',\n secondary: 'bg-secondary-solid text-secondary-solid-fg border border-secondary-border-strong ring-4 ring-secondary-soft',\n accent: 'bg-accent-solid text-accent-solid-fg border border-accent-border-strong ring-4 ring-accent-soft',\n neutral: 'bg-neutral-solid text-neutral-solid-fg border border-neutral-border-strong ring-4 ring-neutral-soft',\n info: 'bg-info-solid text-info-solid-fg border border-info-border-strong ring-4 ring-info-soft',\n success: 'bg-success-solid text-success-solid-fg border border-success-border-strong ring-4 ring-success-soft',\n warning: 'bg-warning-solid text-warning-solid-fg border border-warning-border-strong ring-4 ring-warning-soft',\n error: 'bg-error-solid text-error-solid-fg border border-error-border-strong ring-4 ring-error-soft',\n};\n\nconst INDICATOR_COMPLETED: Record<TwColor, string> = {\n primary: 'bg-primary-solid text-primary-solid-fg border border-primary-border-strong',\n secondary: 'bg-secondary-solid text-secondary-solid-fg border border-secondary-border-strong',\n accent: 'bg-accent-solid text-accent-solid-fg border border-accent-border-strong',\n neutral: 'bg-neutral-solid text-neutral-solid-fg border border-neutral-border-strong',\n info: 'bg-info-solid text-info-solid-fg border border-info-border-strong',\n success: 'bg-success-solid text-success-solid-fg border border-success-border-strong',\n warning: 'bg-warning-solid text-warning-solid-fg border border-warning-border-strong',\n error: 'bg-error-solid text-error-solid-fg border border-error-border-strong',\n};\n\nconst LABEL_PENDING = 'text-fg-muted';\nconst LABEL_COMPLETED = 'text-fg';\nconst LABEL_DISABLED = 'text-fg-subtle';\nconst LABEL_ERROR = 'text-error-fg font-semibold';\n\nconst LABEL_ACTIVE: Record<TwColor, string> = {\n primary: 'text-primary-fg font-semibold',\n secondary: 'text-secondary-fg font-semibold',\n accent: 'text-accent-fg font-semibold',\n neutral: 'text-fg font-semibold',\n info: 'text-info-fg font-semibold',\n success: 'text-success-fg font-semibold',\n warning: 'text-warning-fg font-semibold',\n error: 'text-error-fg font-semibold',\n};\n\nconst CONNECTOR_DEFAULT = 'bg-border';\nconst CONNECTOR_ERROR = 'bg-error-border-strong';\nconst CONNECTOR_REACHED: Record<TwColor, string> = {\n primary: 'bg-primary-border-strong',\n secondary: 'bg-secondary-border-strong',\n accent: 'bg-accent-border-strong',\n neutral: 'bg-neutral-border-strong',\n info: 'bg-info-border-strong',\n success: 'bg-success-border-strong',\n warning: 'bg-warning-border-strong',\n error: 'bg-error-border-strong',\n};\n\nfunction resolveIndicatorClasses(state: StepStyleState, color: TwColor): string {\n switch (state) {\n case 'pending':\n return INDICATOR_PENDING;\n case 'disabled':\n return INDICATOR_DISABLED;\n case 'error':\n return INDICATOR_ERROR;\n case 'active':\n return INDICATOR_ACTIVE[color];\n case 'completed':\n return INDICATOR_COMPLETED[color];\n }\n}\n\nfunction resolveLabelClasses(state: StepStyleState, color: TwColor): string {\n switch (state) {\n case 'pending':\n return LABEL_PENDING;\n case 'completed':\n return LABEL_COMPLETED;\n case 'disabled':\n return LABEL_DISABLED;\n case 'error':\n return LABEL_ERROR;\n case 'active':\n return LABEL_ACTIVE[color];\n }\n}\n\nfunction resolveConnectorClasses(state: StepStyleState, color: TwColor): string {\n if (state === 'error') return CONNECTOR_ERROR;\n if (state === 'completed' || state === 'active') return CONNECTOR_REACHED[color];\n return CONNECTOR_DEFAULT;\n}\n\n// ── StepperIconDirective ──\n\n/**\n * Structural-style directive on an `<ng-template>` that replaces the default\n * indicator icon for a given step state.\n */\n@Directive({\n selector: 'ng-template[twStepperIcon]',\n})\nexport class StepperIconDirective {\n /** Step state this template overrides. Matches CDK's `StepState` values (`'number' | 'edit' | 'done' | 'error'`). */\n readonly state = input<StepState | undefined>(undefined);\n\n /** @internal */\n readonly templateRef = inject(TemplateRef<StepperIconContext>);\n}\n\n// ── StepLabelDirective ──\n\n/**\n * Structural-style directive on an `<ng-template>` used as a custom step header\n * label. Consumers write `<ng-template twStepLabel>…</ng-template>` inside `<tw-step>`.\n */\n@Directive({\n selector: 'ng-template[twStepLabel]',\n providers: [{ provide: CdkStepLabel, useExisting: StepLabelDirective }],\n})\nexport class StepLabelDirective extends CdkStepLabel {}\n\n// ── StepComponent ──\n\n@Component({\n selector: 'tw-step',\n template: '<ng-template><ng-content/></ng-template>',\n exportAs: 'twStep',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: CdkStep, useExisting: StepComponent }],\n})\nexport class StepComponent extends CdkStep {\n /** Optional descriptive text shown under the step label in the `'default'` variant. */\n readonly description = input('');\n\n /** @internal Custom indicator icon templates (one per state) projected into this step. */\n readonly iconTemplates = contentChildren(StepperIconDirective);\n}\n\n// ── StepperComponent ──\n\n@Component({\n selector: 'tw-stepper',\n templateUrl: './stepper.html',\n exportAs: 'twStepper',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, CdkStepHeader],\n providers: [{ provide: CdkStepper, useExisting: StepperComponent }],\n host: {\n '[class]': 'rootClasses()',\n },\n})\nexport class StepperComponent extends CdkStepper implements AfterViewInit {\n /** Visual style of the indicator strip. `'default'` = numbered circles, `'dot'` = compact filled dots, `'simple'` = indicators only (labels hidden visually). Defaults to `'default'`. */\n readonly variant = input<StepperVariant>('default');\n\n /** Semantic color for active and completed indicators and connectors. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls indicator size and label typography. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, steps with `hasError` render error styling, icon, and `aria-invalid`. Defaults to `true`. */\n // TRUE-default: error states must be visible by default — silently swallowing\n // a stepped flow's failure state is a UX regression. Consumers opt out per step.\n readonly showError = input(true);\n\n /** When true, clicking a navigable step header selects it. Set to `false` to only allow advancement via `twStepperNext` / `twStepperPrevious`. Defaults to `true`. */\n // TRUE-default: free-navigation is the standard stepper UX; restricted flows\n // (e.g. wizards that must complete in order) explicitly opt out.\n readonly headerInteractive = input(true);\n\n private readonly _liveAnnouncer = inject(LiveAnnouncer);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _globalOptions = inject(STEPPER_GLOBAL_OPTIONS, { optional: true });\n\n /**\n * CdkStepper exposes its state via class properties (selectedIndex,\n * previousIndex, orientation), not signals. We mirror those into signals so\n * templates can react via @if/@for and OnPush change detection works without\n * manual `markForCheck`. Sync happens in the property setters and lifecycle\n * hooks below — keep these mirrors in lock-step with the CDK fields.\n */\n private readonly _orientationSignal = signal<StepperOrientation>('horizontal');\n private readonly _selectedIndexSignal = signal(0);\n private readonly _previousIndexSignal = signal(0);\n\n /** @internal Reactive mirror of CDK's `orientation` input. */\n readonly orientationValue = this._orientationSignal.asReadonly();\n\n /** @internal Reactive mirror of CDK's `selectedIndex`. */\n readonly selectedIndexValue = this._selectedIndexSignal.asReadonly();\n\n override set orientation(value: StepperOrientation) {\n super.orientation = value;\n this._orientationSignal.set(value);\n }\n override get orientation(): StepperOrientation {\n return super.orientation;\n }\n\n private readonly _variantResult = computed(() =>\n stepperVariants({\n variant: this.variant(),\n size: this.size(),\n orientation: this._orientationSignal(),\n }),\n );\n\n readonly rootClasses = computed(() => this._variantResult().root());\n readonly headerClasses = computed(() => this._variantResult().header());\n readonly stepItemClasses = computed(() => this._variantResult().stepItem());\n readonly stepHeaderClasses = computed(() => this._variantResult().stepHeader());\n readonly stepIndicatorBaseClasses = computed(() => this._variantResult().stepIndicator());\n readonly stepNumberClasses = computed(() => this._variantResult().stepNumber());\n readonly stepIconSlotClasses = computed(() => this._variantResult().stepIconSlot());\n readonly stepLabelWrapperClasses = computed(() => this._variantResult().stepLabelWrapper());\n readonly stepLabelBaseClasses = computed(() => this._variantResult().stepLabel());\n readonly stepDescriptionClasses = computed(() => this._variantResult().stepDescription());\n readonly stepOptionalHintClasses = computed(() => this._variantResult().stepOptionalHint());\n readonly stepConnectorBaseClasses = computed(() => this._variantResult().stepConnector());\n readonly stepPanelClasses = computed(() => this._variantResult().stepPanel());\n\n readonly panelAnimationClass = computed(() => {\n if (this._orientationSignal() === 'vertical') return null;\n return this._selectedIndexSignal() >= this._previousIndexSignal()\n ? 'step-panel-enter-forward'\n : 'step-panel-enter-backward';\n });\n\n override ngAfterViewInit(): void {\n super.ngAfterViewInit();\n this._orientationSignal.set(this.orientation);\n this._selectedIndexSignal.set(this.selectedIndex);\n this._previousIndexSignal.set(this.selectedIndex);\n\n this.selectionChange\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: StepperSelectionEvent) => {\n this._previousIndexSignal.set(event.previouslySelectedIndex);\n this._selectedIndexSignal.set(event.selectedIndex);\n this._orientationSignal.set(this.orientation);\n\n const total = this.steps.length;\n const label =\n event.selectedStep.label || `Step ${event.selectedIndex + 1}`;\n this._liveAnnouncer.announce(\n `${label}, step ${event.selectedIndex + 1} of ${total}`,\n );\n });\n }\n\n /** @internal Typed view of projected steps. */\n get twSteps(): readonly StepComponent[] {\n return this.steps.toArray() as StepComponent[];\n }\n\n /** @internal Resolves the visual state of a step for color/theming purposes. */\n getStepStyleState(step: StepComponent, index: number): StepStyleState {\n if (this.shouldRenderError(step)) return 'error';\n if (index === this._selectedIndexSignal()) return 'active';\n const itype = step.indicatorType();\n if (itype === STEP_STATE.DONE || itype === STEP_STATE.EDIT) return 'completed';\n if (this.linear && !step.isNavigable()) return 'disabled';\n return 'pending';\n }\n\n /** @internal */\n getIndicatorClass(step: StepComponent, index: number): string {\n const state = this.getStepStyleState(step, index);\n return `${this.stepIndicatorBaseClasses()} ${resolveIndicatorClasses(state, this.color())}`;\n }\n\n /** @internal */\n getLabelClass(step: StepComponent, index: number): string {\n const state = this.getStepStyleState(step, index);\n return `${this.stepLabelBaseClasses()} ${resolveLabelClasses(state, this.color())}`;\n }\n\n /** @internal */\n getConnectorClass(step: StepComponent, index: number): string {\n const state = this.getStepStyleState(step, index);\n return `${this.stepConnectorBaseClasses()} ${resolveConnectorClasses(state, this.color())}`;\n }\n\n /** @internal Resolves which indicator glyph to render for a step. */\n getIndicatorType(step: StepComponent): StepState {\n if (this.shouldRenderError(step)) return STEP_STATE.ERROR as StepState;\n return step.indicatorType() as StepState;\n }\n\n /** @internal Looks up a consumer-supplied custom template for a given indicator state. */\n resolveIconTemplate(\n step: StepComponent,\n state: StepState,\n ): TemplateRef<StepperIconContext> | null {\n const templates = step.iconTemplates();\n const match = templates.find((t) => t.state() === state);\n return match ? match.templateRef : null;\n }\n\n /** @internal Context supplied to custom icon templates. */\n iconContext(index: number): StepperIconContext {\n return {\n $implicit: {\n index,\n active: index === this._selectedIndexSignal(),\n },\n };\n }\n\n /** @internal Click handler for the step header button. */\n onHeaderClick(step: StepComponent, index: number): void {\n if (!this.headerInteractive()) return;\n if (!step.isNavigable()) return;\n this.selectedIndex = index;\n }\n\n /** @internal Whether the stepper should render the error state for a step. */\n shouldRenderError(step: StepComponent): boolean {\n if (!this.showError()) return false;\n if (this._globalOptions?.showError === false) return false;\n return step.hasError;\n }\n}\n\n// ── Next / Previous directives (hostDirectives over CDK) ──\n\n@Directive({\n selector: 'button[twStepperNext]',\n hostDirectives: [{ directive: CdkStepperNext, inputs: ['type'] }],\n})\nexport class StepperNextDirective {}\n\n@Directive({\n selector: 'button[twStepperPrevious]',\n hostDirectives: [{ directive: CdkStepperPrevious, inputs: ['type'] }],\n})\nexport class StepperPreviousDirective {}\n\n// ── Provider helper ──\n\n/** Provides app-wide stepper defaults via `STEPPER_GLOBAL_OPTIONS`. */\nexport function provideTwStepperOptions(options: StepperOptions): Provider[] {\n return [{ provide: STEPPER_GLOBAL_OPTIONS, useValue: options }];\n}\n","<!-- Header strip + inline panels (vertical) / header-only (horizontal) -->\n<div\n [class]=\"headerClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationValue()\"\n (keydown)=\"_onKeydown($event)\"\n>\n @for (step of twSteps; track $index; let i = $index; let last = $last) {\n <div [class]=\"stepItemClasses()\">\n <!-- Step header button -->\n <button\n type=\"button\"\n cdkStepHeader\n role=\"tab\"\n [class]=\"stepHeaderClasses()\"\n [class.pointer-events-none]=\"!headerInteractive() || !step.isNavigable()\"\n [class.opacity-60]=\"!step.isNavigable()\"\n [id]=\"_getStepLabelId(i)\"\n [attr.aria-controls]=\"_getStepContentId(i)\"\n [attr.aria-selected]=\"selectedIndexValue() === i\"\n [attr.aria-current]=\"selectedIndexValue() === i ? 'step' : null\"\n [attr.aria-disabled]=\"!step.isNavigable() || null\"\n [attr.aria-invalid]=\"shouldRenderError(step) || null\"\n [attr.aria-label]=\"step.ariaLabel || null\"\n [attr.aria-labelledby]=\"step.ariaLabelledby || null\"\n (click)=\"onHeaderClick(step, i)\"\n >\n <!-- Indicator (number / icon / dot) -->\n <span [class]=\"getIndicatorClass(step, i)\">\n @let indicatorType = getIndicatorType(step);\n @let customIcon = resolveIconTemplate(step, indicatorType);\n\n @if (customIcon) {\n <span [class]=\"stepIconSlotClasses()\">\n <ng-container\n [ngTemplateOutlet]=\"customIcon\"\n [ngTemplateOutletContext]=\"iconContext(i)\"\n />\n </span>\n } @else {\n @switch (indicatorType) {\n @case ('number') {\n <span [class]=\"stepNumberClasses()\">{{ i + 1 }}</span>\n }\n @case ('done') {\n <span [class]=\"stepIconSlotClasses()\">\n <svg\n class=\"size-3/5 shrink-0\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 0 1 .143 1.052l-8 10.5a.75.75 0 0 1-1.127.075l-4.5-4.5a.75.75 0 0 1 1.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 0 1 1.05-.143Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n @case ('edit') {\n <span [class]=\"stepIconSlotClasses()\">\n <svg\n class=\"size-3/5 shrink-0\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M13.586 3.586a2 2 0 1 1 2.828 2.828l-.793.793-2.828-2.828.793-.793Zm-2.207 2.207 2.828 2.828-7.07 7.071a2 2 0 0 1-.83.5l-3.086.926a.5.5 0 0 1-.62-.621l.926-3.086a2 2 0 0 1 .5-.83l7.352-7.788Z\"\n />\n </svg>\n </span>\n }\n @case ('error') {\n <span [class]=\"stepIconSlotClasses()\">\n <svg\n class=\"size-3/5 shrink-0\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v4.5a.75.75 0 0 0 1.5 0v-4.5ZM10 15a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n }\n }\n </span>\n\n <!-- Label + description -->\n <span [class]=\"stepLabelWrapperClasses()\">\n <span [class]=\"getLabelClass(step, i)\">\n @if (step.stepLabel) {\n <ng-container [ngTemplateOutlet]=\"step.stepLabel.template\" />\n } @else {\n {{ step.label }}\n }\n @if (step.optional && !step.completed) {\n <span [class]=\"stepOptionalHintClasses()\">(Optional)</span>\n }\n </span>\n\n @if (step.description() && variant() === 'default') {\n <span [class]=\"stepDescriptionClasses()\">{{ step.description() }}</span>\n }\n\n @if (shouldRenderError(step) && step.errorMessage) {\n <span class=\"sr-only\">{{ step.errorMessage }}</span>\n }\n </span>\n </button>\n\n <!-- Connector (between step i and i+1) -->\n @if (!last) {\n <span\n [class]=\"getConnectorClass(step, i)\"\n aria-hidden=\"true\"\n ></span>\n }\n\n <!-- Vertical: panel is rendered inline under each selected step -->\n @if (orientationValue() === 'vertical' && selectedIndexValue() === i && step.content) {\n <div\n role=\"tabpanel\"\n [id]=\"_getStepContentId(i)\"\n [attr.aria-labelledby]=\"_getStepLabelId(i)\"\n [class]=\"stepPanelClasses()\"\n tabindex=\"0\"\n >\n <ng-container [ngTemplateOutlet]=\"step.content\" />\n </div>\n }\n </div>\n }\n</div>\n\n<!-- Horizontal: single panel rendered below the strip -->\n@if (orientationValue() === 'horizontal') {\n @let activeStep = twSteps[selectedIndexValue()];\n @if (activeStep && activeStep.content) {\n <div\n role=\"tabpanel\"\n [id]=\"_getStepContentId(selectedIndexValue())\"\n [attr.aria-labelledby]=\"_getStepLabelId(selectedIndexValue())\"\n [class]=\"stepPanelClasses()\"\n [animate.enter]=\"panelAnimationClass()\"\n tabindex=\"0\"\n >\n <ng-container [ngTemplateOutlet]=\"activeStep.content\" />\n </div>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,391 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, model, output, inject, ElementRef, DestroyRef, signal, afterNextRender, isDevMode, computed, linkedSignal, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NgControl, NgForm, FormGroupDirective } from '@angular/forms';
4
+ import { FocusMonitor } from '@angular/cdk/a11y';
5
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
+ import { merge } from 'rxjs';
7
+ import { tv } from 'tailwind-variants';
8
+ import { TW_ERROR_STATE_MATCHER } from '@cdevhub/ngx-tw/core';
9
+
10
+ // ── tv() config ──────────────────────────────────────────────────
11
+ const switchVariants = tv({
12
+ slots: {
13
+ root: 'inline-flex items-center gap-3 cursor-pointer select-none rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',
14
+ switchEl: 'relative inline-flex items-center shrink-0',
15
+ track: 'relative inline-flex items-center rounded-full border border-transparent transition-colors duration-normal motion-reduce:transition-none',
16
+ thumb: 'absolute left-0.5 inline-flex items-center justify-center bg-surface rounded-full shadow-sm transition-transform duration-normal motion-reduce:transition-none',
17
+ iconWrap: 'absolute inset-0 flex items-center justify-between px-1 pointer-events-none empty:hidden',
18
+ labelWrap: 'flex flex-col min-w-0 empty:hidden',
19
+ label: 'font-medium text-fg empty:hidden',
20
+ description: 'text-fg-muted empty:hidden',
21
+ },
22
+ variants: {
23
+ size: {
24
+ xs: {
25
+ track: 'h-4 w-7',
26
+ thumb: 'size-3 data-[checked=true]:translate-x-3',
27
+ label: 'text-xs',
28
+ description: 'text-2xs',
29
+ },
30
+ sm: {
31
+ track: 'h-5 w-9',
32
+ thumb: 'size-4 data-[checked=true]:translate-x-4',
33
+ label: 'text-sm',
34
+ description: 'text-xs',
35
+ },
36
+ md: {
37
+ track: 'h-6 w-11',
38
+ thumb: 'size-5 data-[checked=true]:translate-x-5',
39
+ label: 'text-sm',
40
+ description: 'text-xs',
41
+ },
42
+ lg: {
43
+ track: 'h-7 w-12',
44
+ thumb: 'size-6 data-[checked=true]:translate-x-5',
45
+ label: 'text-base',
46
+ description: 'text-sm',
47
+ },
48
+ xl: {
49
+ track: 'h-8 w-14',
50
+ thumb: 'size-7 data-[checked=true]:translate-x-6',
51
+ label: 'text-base',
52
+ description: 'text-sm',
53
+ },
54
+ },
55
+ labelPosition: {
56
+ before: { root: 'flex-row-reverse' },
57
+ after: { root: 'flex-row' },
58
+ },
59
+ checked: {
60
+ true: { track: '' },
61
+ false: { track: 'bg-surface-muted' },
62
+ },
63
+ disabled: {
64
+ true: { root: 'opacity-50 pointer-events-none cursor-not-allowed' },
65
+ false: { root: '' },
66
+ },
67
+ errorState: {
68
+ true: { label: 'text-error-700', description: 'text-error-600' },
69
+ false: { label: '', description: '' },
70
+ },
71
+ },
72
+ compoundVariants: [
73
+ // Error state on an off (unchecked) switch repaints the rail with the error color.
74
+ // The on (checked) track is dominated by CHECKED_TRACK[color]; consumers wanting an
75
+ // error appearance on a checked switch should set `color="error"` directly.
76
+ {
77
+ errorState: true,
78
+ checked: false,
79
+ class: { track: 'bg-error-100 ring-1 ring-inset ring-error-300' },
80
+ },
81
+ ],
82
+ defaultVariants: {
83
+ size: 'md',
84
+ labelPosition: 'after',
85
+ checked: false,
86
+ disabled: false,
87
+ errorState: false,
88
+ },
89
+ }, { twMerge: true });
90
+ // ── Static checked-state color lookups (statically written for Tailwind v4 scanning) ──
91
+ const CHECKED_TRACK = {
92
+ primary: 'bg-primary-600',
93
+ secondary: 'bg-secondary-600',
94
+ accent: 'bg-accent-600',
95
+ neutral: 'bg-fg',
96
+ info: 'bg-info-600',
97
+ success: 'bg-success-600',
98
+ warning: 'bg-warning-500',
99
+ error: 'bg-error-600',
100
+ };
101
+ const CHECKED_ICON_COLOR = {
102
+ primary: 'text-on-primary',
103
+ secondary: 'text-on-secondary',
104
+ accent: 'text-on-accent',
105
+ neutral: 'text-on-neutral',
106
+ info: 'text-on-info',
107
+ success: 'text-on-success',
108
+ warning: 'text-on-warning',
109
+ error: 'text-on-error',
110
+ };
111
+ let nextId = 0;
112
+ // ── SwitchComponent ──────────────────────────────────────────────
113
+ class SwitchComponent {
114
+ /** Sets the semantic color for the active (checked) track. Defaults to `'primary'`. */
115
+ color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
116
+ /** Controls the overall scale of the track, thumb, and label typography. Defaults to `'md'`. */
117
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
118
+ /** When true, prevents interaction and applies muted styling. Defaults to `false`. */
119
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
120
+ /** When true, sets `aria-required="true"` so assistive tech announces the control as required. Defaults to `false`. */
121
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
122
+ /** Optional inline label rendered next to the switch. Use default content projection for rich label content instead. */
123
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
124
+ /** Optional secondary description rendered under the label. Use `[slot="description"]` content projection for rich content instead. */
125
+ description = input(undefined, ...(ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []));
126
+ /** Position of the label/description relative to the switch. Defaults to `'after'`. */
127
+ labelPosition = input('after', ...(ngDevMode ? [{ debugName: "labelPosition" }] : /* istanbul ignore next */ []));
128
+ /** Optional name attribute, mirrored to the host for form association. */
129
+ name = input(undefined, ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
130
+ /** Accessible name when no visible label is provided. Mirrored to `aria-label`. */
131
+ ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
132
+ /** ID of an external element that labels the switch. Mirrored to `aria-labelledby`. */
133
+ ariaLabelledby = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
134
+ /** ID of an external element that describes the switch. Mirrored to `aria-describedby`. */
135
+ ariaDescribedby = input(undefined, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
136
+ /** Two-way bound checked state. Updates when the user toggles via click or Space. */
137
+ checked = model(false, ...(ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []));
138
+ /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the switch uses the `TW_ERROR_STATE_MATCHER` token's value. */
139
+ errorStateMatcher = input(undefined, ...(ngDevMode ? [{ debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
140
+ /** Fires after the checked state changes from a user interaction. Does not fire when the value is updated programmatically via `writeValue`. */
141
+ change = output();
142
+ focusMonitor = inject(FocusMonitor);
143
+ elementRef = inject((ElementRef));
144
+ destroyRef = inject(DestroyRef);
145
+ ngControl = inject(NgControl, { optional: true, self: true });
146
+ parentForm = inject(NgForm, { optional: true });
147
+ parentFormGroup = inject(FormGroupDirective, { optional: true });
148
+ defaultMatcher = inject(TW_ERROR_STATE_MATCHER);
149
+ onChange = () => { };
150
+ onTouched = () => { };
151
+ cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
152
+ _ngControlRev = signal(0, ...(ngDevMode ? [{ debugName: "_ngControlRev" }] : /* istanbul ignore next */ []));
153
+ _formSubmitRev = signal(0, ...(ngDevMode ? [{ debugName: "_formSubmitRev" }] : /* istanbul ignore next */ []));
154
+ uid = nextId++;
155
+ hostId = `tw-switch-${this.uid}`;
156
+ labelId = `${this.hostId}-label`;
157
+ descriptionId = `${this.hostId}-description`;
158
+ constructor() {
159
+ // Material-style CVA wiring: declare ourselves as the value accessor on any
160
+ // host-level `NgControl` (FormControlDirective, NgModel, etc.). This avoids
161
+ // the circular-DI that a static `NG_VALUE_ACCESSOR` provider would create
162
+ // because `NgControl` is injected with `self: true` on the same element.
163
+ if (this.ngControl) {
164
+ this.ngControl.valueAccessor = this;
165
+ }
166
+ afterNextRender(() => {
167
+ if (isDevMode() && !this.hasAccessibleNameHint()) {
168
+ console.warn('[tw-switch] The switch has no accessible name. Provide a `label` input, project label content, or set `aria-label` / `aria-labelledby`.');
169
+ }
170
+ });
171
+ }
172
+ isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
173
+ /** Whether the switch is in an error state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */
174
+ errorState = computed(() => {
175
+ this._ngControlRev();
176
+ this._formSubmitRev();
177
+ const matcher = this.errorStateMatcher() ?? this.defaultMatcher;
178
+ const form = this.parentFormGroup ??
179
+ this.parentForm;
180
+ return matcher.isErrorState(this.ngControl?.control ?? null, form);
181
+ }, ...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
182
+ internalChecked = linkedSignal(() => this.checked(), ...(ngDevMode ? [{ debugName: "internalChecked" }] : /* istanbul ignore next */ []));
183
+ effectiveAriaLabelledby = computed(() => {
184
+ const external = this.ariaLabelledby();
185
+ if (external)
186
+ return external;
187
+ if (this.ariaLabel())
188
+ return undefined;
189
+ return this.labelId;
190
+ }, ...(ngDevMode ? [{ debugName: "effectiveAriaLabelledby" }] : /* istanbul ignore next */ []));
191
+ effectiveAriaDescribedby = computed(() => {
192
+ const external = this.ariaDescribedby();
193
+ if (external)
194
+ return external;
195
+ return this.descriptionId;
196
+ }, ...(ngDevMode ? [{ debugName: "effectiveAriaDescribedby" }] : /* istanbul ignore next */ []));
197
+ variantResult = computed(() => switchVariants({
198
+ size: this.size(),
199
+ labelPosition: this.labelPosition(),
200
+ checked: this.internalChecked(),
201
+ disabled: this.isDisabled(),
202
+ errorState: this.errorState(),
203
+ }), ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
204
+ rootClasses = computed(() => this.variantResult().root(), ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));
205
+ switchClasses = computed(() => this.variantResult().switchEl(), ...(ngDevMode ? [{ debugName: "switchClasses" }] : /* istanbul ignore next */ []));
206
+ labelWrapClasses = computed(() => this.variantResult().labelWrap(), ...(ngDevMode ? [{ debugName: "labelWrapClasses" }] : /* istanbul ignore next */ []));
207
+ labelClasses = computed(() => this.variantResult().label(), ...(ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []));
208
+ descriptionClasses = computed(() => this.variantResult().description(), ...(ngDevMode ? [{ debugName: "descriptionClasses" }] : /* istanbul ignore next */ []));
209
+ iconWrapClasses = computed(() => this.variantResult().iconWrap(), ...(ngDevMode ? [{ debugName: "iconWrapClasses" }] : /* istanbul ignore next */ []));
210
+ thumbClasses = computed(() => this.variantResult().thumb(), ...(ngDevMode ? [{ debugName: "thumbClasses" }] : /* istanbul ignore next */ []));
211
+ trackClasses = computed(() => {
212
+ const base = this.variantResult().track();
213
+ return this.internalChecked() ? `${base} ${CHECKED_TRACK[this.color()]}` : base;
214
+ }, ...(ngDevMode ? [{ debugName: "trackClasses" }] : /* istanbul ignore next */ []));
215
+ onIconClasses = computed(() => {
216
+ const base = 'inline-flex items-center justify-center transition-opacity duration-normal motion-reduce:transition-none empty:hidden';
217
+ const visibility = this.internalChecked() ? 'opacity-100' : 'opacity-0';
218
+ const color = this.internalChecked() ? CHECKED_ICON_COLOR[this.color()] : 'text-fg-muted';
219
+ return `${base} ${visibility} ${color}`;
220
+ }, ...(ngDevMode ? [{ debugName: "onIconClasses" }] : /* istanbul ignore next */ []));
221
+ offIconClasses = computed(() => {
222
+ const base = 'inline-flex items-center justify-center transition-opacity duration-normal motion-reduce:transition-none text-fg-muted empty:hidden';
223
+ const visibility = this.internalChecked() ? 'opacity-0' : 'opacity-100';
224
+ return `${base} ${visibility}`;
225
+ }, ...(ngDevMode ? [{ debugName: "offIconClasses" }] : /* istanbul ignore next */ []));
226
+ // ── Interactions ──────────────────────────────────────────
227
+ /** Toggles the checked state. No-op when disabled. */
228
+ toggle() {
229
+ if (this.isDisabled())
230
+ return;
231
+ const next = !this.internalChecked();
232
+ this.internalChecked.set(next);
233
+ this.checked.set(next);
234
+ this.onChange(next);
235
+ this.onTouched();
236
+ this.change.emit(next);
237
+ }
238
+ /** Handles keyboard activation. Space toggles the switch — matches the ARIA `switch` role pattern (Enter is intentionally NOT handled, mirroring `<tw-checkbox>`). */
239
+ onKeydown(event) {
240
+ if (this.isDisabled())
241
+ return;
242
+ if (event.key === ' ' || event.key === 'Spacebar') {
243
+ event.preventDefault();
244
+ this.toggle();
245
+ }
246
+ }
247
+ /** @internal Called on host blur to notify forms the control has been touched and recompute errorState. */
248
+ onBlur() {
249
+ this.onTouched();
250
+ this._ngControlRev.update((n) => n + 1);
251
+ }
252
+ // ── ControlValueAccessor ──────────────────────────────────
253
+ writeValue(value) {
254
+ const next = !!value;
255
+ this.internalChecked.set(next);
256
+ this.checked.set(next);
257
+ }
258
+ registerOnChange(fn) {
259
+ this.onChange = fn;
260
+ }
261
+ registerOnTouched(fn) {
262
+ this.onTouched = fn;
263
+ }
264
+ setDisabledState(isDisabled) {
265
+ this.cvaDisabled.set(isDisabled);
266
+ }
267
+ // ── Lifecycle ─────────────────────────────────────────────
268
+ ngOnInit() {
269
+ this.focusMonitor.monitor(this.elementRef);
270
+ this.destroyRef.onDestroy(() => {
271
+ this.focusMonitor.stopMonitoring(this.elementRef);
272
+ });
273
+ // NgControl's `control` is set by the parent FormControl* directive before
274
+ // children's `ngOnInit`. Subscribe here so errorState reacts to status/value
275
+ // changes on the bound control.
276
+ const ctrl = this.ngControl?.control;
277
+ if (ctrl) {
278
+ const streams = [ctrl.statusChanges, ctrl.valueChanges].filter((s) => !!s);
279
+ if (streams.length) {
280
+ merge(...streams)
281
+ .pipe(takeUntilDestroyed(this.destroyRef))
282
+ .subscribe(() => this._ngControlRev.update((n) => n + 1));
283
+ }
284
+ }
285
+ const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;
286
+ if (submit) {
287
+ submit
288
+ .pipe(takeUntilDestroyed(this.destroyRef))
289
+ .subscribe(() => this._formSubmitRev.update((n) => n + 1));
290
+ }
291
+ }
292
+ hasAccessibleNameHint() {
293
+ if (this.label() || this.ariaLabel() || this.ariaLabelledby())
294
+ return true;
295
+ const host = this.elementRef.nativeElement;
296
+ return host.textContent !== null && host.textContent.trim().length > 0;
297
+ }
298
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
299
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: SwitchComponent, isStandalone: true, selector: "tw-switch", inputs: { color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, labelPosition: { classPropertyName: "labelPosition", publicName: "labelPosition", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange", change: "change" }, host: { attributes: { "role": "switch" }, listeners: { "click": "toggle()", "keydown": "onKeydown($event)", "blur": "onBlur()" }, properties: { "id": "hostId", "class": "rootClasses()", "attr.data-checked": "internalChecked()", "attr.aria-checked": "internalChecked()", "attr.aria-disabled": "isDisabled() || null", "attr.aria-invalid": "errorState() || null", "attr.aria-required": "required() || null", "attr.aria-label": "ariaLabel() || null", "attr.aria-labelledby": "effectiveAriaLabelledby() || null", "attr.aria-describedby": "effectiveAriaDescribedby() || null", "attr.tabindex": "isDisabled() ? -1 : 0", "attr.name": "name() || null" } }, ngImport: i0, template: `
300
+ <span [class]="switchClasses()">
301
+ <span [class]="trackClasses()">
302
+ <span [class]="iconWrapClasses()">
303
+ <span [class]="offIconClasses()">
304
+ <ng-content select="[slot='off-icon']" />
305
+ </span>
306
+ <span [class]="onIconClasses()">
307
+ <ng-content select="[slot='on-icon']" />
308
+ </span>
309
+ </span>
310
+ <span [class]="thumbClasses()" [attr.data-checked]="internalChecked()"></span>
311
+ </span>
312
+ </span>
313
+
314
+ <span [class]="labelWrapClasses()">
315
+ <span [id]="labelId" [class]="labelClasses()">
316
+ <ng-content />
317
+ @if (label()) {
318
+ {{ label() }}
319
+ }
320
+ </span>
321
+ <span [id]="descriptionId" [class]="descriptionClasses()">
322
+ <ng-content select="[slot='description']" />
323
+ @if (description()) {
324
+ {{ description() }}
325
+ }
326
+ </span>
327
+ </span>
328
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
329
+ }
330
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SwitchComponent, decorators: [{
331
+ type: Component,
332
+ args: [{
333
+ selector: 'tw-switch',
334
+ changeDetection: ChangeDetectionStrategy.OnPush,
335
+ template: `
336
+ <span [class]="switchClasses()">
337
+ <span [class]="trackClasses()">
338
+ <span [class]="iconWrapClasses()">
339
+ <span [class]="offIconClasses()">
340
+ <ng-content select="[slot='off-icon']" />
341
+ </span>
342
+ <span [class]="onIconClasses()">
343
+ <ng-content select="[slot='on-icon']" />
344
+ </span>
345
+ </span>
346
+ <span [class]="thumbClasses()" [attr.data-checked]="internalChecked()"></span>
347
+ </span>
348
+ </span>
349
+
350
+ <span [class]="labelWrapClasses()">
351
+ <span [id]="labelId" [class]="labelClasses()">
352
+ <ng-content />
353
+ @if (label()) {
354
+ {{ label() }}
355
+ }
356
+ </span>
357
+ <span [id]="descriptionId" [class]="descriptionClasses()">
358
+ <ng-content select="[slot='description']" />
359
+ @if (description()) {
360
+ {{ description() }}
361
+ }
362
+ </span>
363
+ </span>
364
+ `,
365
+ host: {
366
+ 'role': 'switch',
367
+ '[id]': 'hostId',
368
+ '[class]': 'rootClasses()',
369
+ '[attr.data-checked]': 'internalChecked()',
370
+ '[attr.aria-checked]': 'internalChecked()',
371
+ '[attr.aria-disabled]': 'isDisabled() || null',
372
+ '[attr.aria-invalid]': 'errorState() || null',
373
+ '[attr.aria-required]': 'required() || null',
374
+ '[attr.aria-label]': 'ariaLabel() || null',
375
+ '[attr.aria-labelledby]': 'effectiveAriaLabelledby() || null',
376
+ '[attr.aria-describedby]': 'effectiveAriaDescribedby() || null',
377
+ '[attr.tabindex]': 'isDisabled() ? -1 : 0',
378
+ '[attr.name]': 'name() || null',
379
+ '(click)': 'toggle()',
380
+ '(keydown)': 'onKeydown($event)',
381
+ '(blur)': 'onBlur()',
382
+ },
383
+ }]
384
+ }], ctorParameters: () => [], propDecorators: { color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], labelPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPosition", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], change: [{ type: i0.Output, args: ["change"] }] } });
385
+
386
+ /**
387
+ * Generated bundle index. Do not edit.
388
+ */
389
+
390
+ export { SwitchComponent };
391
+ //# sourceMappingURL=cdevhub-ngx-tw-switch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdevhub-ngx-tw-switch.mjs","sources":["../../../projects/ngx-tw/switch/switch.ts","../../../projects/ngx-tw/switch/cdevhub-ngx-tw-switch.ts"],"sourcesContent":["import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n isDevMode,\n linkedSignal,\n model,\n type OnInit,\n output,\n signal,\n type Signal,\n} from '@angular/core';\nimport {\n type ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n} from '@angular/forms';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { tv } from 'tailwind-variants';\nimport {\n type ErrorStateMatcher,\n TW_ERROR_STATE_MATCHER,\n type TwColor,\n type TwFormSubmitted,\n type TwSize,\n} from '@cdevhub/ngx-tw/core';\n\n/** Position of the label relative to the switch control. */\nexport type SwitchLabelPosition = 'before' | 'after';\n\n// ── tv() config ──────────────────────────────────────────────────\n\nconst switchVariants = tv(\n {\n slots: {\n root: 'inline-flex items-center gap-3 cursor-pointer select-none rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n switchEl: 'relative inline-flex items-center shrink-0',\n track:\n 'relative inline-flex items-center rounded-full border border-transparent transition-colors duration-normal motion-reduce:transition-none',\n thumb:\n 'absolute left-0.5 inline-flex items-center justify-center bg-surface rounded-full shadow-sm transition-transform duration-normal motion-reduce:transition-none',\n iconWrap:\n 'absolute inset-0 flex items-center justify-between px-1 pointer-events-none empty:hidden',\n labelWrap: 'flex flex-col min-w-0 empty:hidden',\n label: 'font-medium text-fg empty:hidden',\n description: 'text-fg-muted empty:hidden',\n },\n variants: {\n size: {\n xs: {\n track: 'h-4 w-7',\n thumb: 'size-3 data-[checked=true]:translate-x-3',\n label: 'text-xs',\n description: 'text-2xs',\n },\n sm: {\n track: 'h-5 w-9',\n thumb: 'size-4 data-[checked=true]:translate-x-4',\n label: 'text-sm',\n description: 'text-xs',\n },\n md: {\n track: 'h-6 w-11',\n thumb: 'size-5 data-[checked=true]:translate-x-5',\n label: 'text-sm',\n description: 'text-xs',\n },\n lg: {\n track: 'h-7 w-12',\n thumb: 'size-6 data-[checked=true]:translate-x-5',\n label: 'text-base',\n description: 'text-sm',\n },\n xl: {\n track: 'h-8 w-14',\n thumb: 'size-7 data-[checked=true]:translate-x-6',\n label: 'text-base',\n description: 'text-sm',\n },\n },\n labelPosition: {\n before: { root: 'flex-row-reverse' },\n after: { root: 'flex-row' },\n },\n checked: {\n true: { track: '' },\n false: { track: 'bg-surface-muted' },\n },\n disabled: {\n true: { root: 'opacity-50 pointer-events-none cursor-not-allowed' },\n false: { root: '' },\n },\n errorState: {\n true: { label: 'text-error-700', description: 'text-error-600' },\n false: { label: '', description: '' },\n },\n },\n compoundVariants: [\n // Error state on an off (unchecked) switch repaints the rail with the error color.\n // The on (checked) track is dominated by CHECKED_TRACK[color]; consumers wanting an\n // error appearance on a checked switch should set `color=\"error\"` directly.\n {\n errorState: true,\n checked: false,\n class: { track: 'bg-error-100 ring-1 ring-inset ring-error-300' },\n },\n ],\n defaultVariants: {\n size: 'md',\n labelPosition: 'after',\n checked: false,\n disabled: false,\n errorState: false,\n },\n },\n { twMerge: true },\n);\n\n// ── Static checked-state color lookups (statically written for Tailwind v4 scanning) ──\n\nconst CHECKED_TRACK: Record<TwColor, string> = {\n primary: 'bg-primary-600',\n secondary: 'bg-secondary-600',\n accent: 'bg-accent-600',\n neutral: 'bg-fg',\n info: 'bg-info-600',\n success: 'bg-success-600',\n warning: 'bg-warning-500',\n error: 'bg-error-600',\n};\n\nconst CHECKED_ICON_COLOR: Record<TwColor, string> = {\n primary: 'text-on-primary',\n secondary: 'text-on-secondary',\n accent: 'text-on-accent',\n neutral: 'text-on-neutral',\n info: 'text-on-info',\n success: 'text-on-success',\n warning: 'text-on-warning',\n error: 'text-on-error',\n};\n\nlet nextId = 0;\n\n// ── SwitchComponent ──────────────────────────────────────────────\n\n@Component({\n selector: 'tw-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <span [class]=\"switchClasses()\">\n <span [class]=\"trackClasses()\">\n <span [class]=\"iconWrapClasses()\">\n <span [class]=\"offIconClasses()\">\n <ng-content select=\"[slot='off-icon']\" />\n </span>\n <span [class]=\"onIconClasses()\">\n <ng-content select=\"[slot='on-icon']\" />\n </span>\n </span>\n <span [class]=\"thumbClasses()\" [attr.data-checked]=\"internalChecked()\"></span>\n </span>\n </span>\n\n <span [class]=\"labelWrapClasses()\">\n <span [id]=\"labelId\" [class]=\"labelClasses()\">\n <ng-content />\n @if (label()) {\n {{ label() }}\n }\n </span>\n <span [id]=\"descriptionId\" [class]=\"descriptionClasses()\">\n <ng-content select=\"[slot='description']\" />\n @if (description()) {\n {{ description() }}\n }\n </span>\n </span>\n `,\n host: {\n 'role': 'switch',\n '[id]': 'hostId',\n '[class]': 'rootClasses()',\n '[attr.data-checked]': 'internalChecked()',\n '[attr.aria-checked]': 'internalChecked()',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.aria-invalid]': 'errorState() || null',\n '[attr.aria-required]': 'required() || null',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.aria-labelledby]': 'effectiveAriaLabelledby() || null',\n '[attr.aria-describedby]': 'effectiveAriaDescribedby() || null',\n '[attr.tabindex]': 'isDisabled() ? -1 : 0',\n '[attr.name]': 'name() || null',\n '(click)': 'toggle()',\n '(keydown)': 'onKeydown($event)',\n '(blur)': 'onBlur()',\n },\n})\nexport class SwitchComponent implements ControlValueAccessor, OnInit {\n /** Sets the semantic color for the active (checked) track. Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Controls the overall scale of the track, thumb, and label typography. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, prevents interaction and applies muted styling. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** When true, sets `aria-required=\"true\"` so assistive tech announces the control as required. Defaults to `false`. */\n readonly required = input(false);\n\n /** Optional inline label rendered next to the switch. Use default content projection for rich label content instead. */\n readonly label = input<string | undefined>(undefined);\n\n /** Optional secondary description rendered under the label. Use `[slot=\"description\"]` content projection for rich content instead. */\n readonly description = input<string | undefined>(undefined);\n\n /** Position of the label/description relative to the switch. Defaults to `'after'`. */\n readonly labelPosition = input<SwitchLabelPosition>('after');\n\n /** Optional name attribute, mirrored to the host for form association. */\n readonly name = input<string | undefined>(undefined);\n\n /** Accessible name when no visible label is provided. Mirrored to `aria-label`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** ID of an external element that labels the switch. Mirrored to `aria-labelledby`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n /** ID of an external element that describes the switch. Mirrored to `aria-describedby`. */\n readonly ariaDescribedby = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n /** Two-way bound checked state. Updates when the user toggles via click or Space. */\n readonly checked = model(false);\n\n /** Per-instance override of the {@link ErrorStateMatcher}. When omitted, the switch uses the `TW_ERROR_STATE_MATCHER` token's value. */\n readonly errorStateMatcher = input<ErrorStateMatcher | undefined>(undefined);\n\n /** Fires after the checked state changes from a user interaction. Does not fire when the value is updated programmatically via `writeValue`. */\n readonly change = output<boolean>();\n\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly ngControl = inject(NgControl, { optional: true, self: true });\n private readonly parentForm = inject(NgForm, { optional: true });\n private readonly parentFormGroup = inject(FormGroupDirective, { optional: true });\n private readonly defaultMatcher = inject(TW_ERROR_STATE_MATCHER);\n\n private onChange: (value: boolean) => void = () => {};\n private onTouched: () => void = () => {};\n private readonly cvaDisabled = signal(false);\n private readonly _ngControlRev = signal(0);\n private readonly _formSubmitRev = signal(0);\n\n private readonly uid = nextId++;\n readonly hostId = `tw-switch-${this.uid}`;\n readonly labelId = `${this.hostId}-label`;\n readonly descriptionId = `${this.hostId}-description`;\n\n constructor() {\n // Material-style CVA wiring: declare ourselves as the value accessor on any\n // host-level `NgControl` (FormControlDirective, NgModel, etc.). This avoids\n // the circular-DI that a static `NG_VALUE_ACCESSOR` provider would create\n // because `NgControl` is injected with `self: true` on the same element.\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n afterNextRender(() => {\n if (isDevMode() && !this.hasAccessibleNameHint()) {\n console.warn(\n '[tw-switch] The switch has no accessible name. Provide a `label` input, project label content, or set `aria-label` / `aria-labelledby`.',\n );\n }\n });\n }\n\n readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n /** Whether the switch is in an error state per the configured `ErrorStateMatcher`. Reads the bound `NgControl.invalid` through the matcher. */\n readonly errorState: Signal<boolean> = computed(() => {\n this._ngControlRev();\n this._formSubmitRev();\n const matcher = this.errorStateMatcher() ?? this.defaultMatcher;\n const form: TwFormSubmitted | null =\n (this.parentFormGroup as TwFormSubmitted | null) ??\n (this.parentForm as TwFormSubmitted | null);\n return matcher.isErrorState(this.ngControl?.control ?? null, form);\n });\n\n readonly internalChecked = linkedSignal(() => this.checked());\n\n readonly effectiveAriaLabelledby = computed(() => {\n const external = this.ariaLabelledby();\n if (external) return external;\n if (this.ariaLabel()) return undefined;\n return this.labelId;\n });\n\n readonly effectiveAriaDescribedby = computed(() => {\n const external = this.ariaDescribedby();\n if (external) return external;\n return this.descriptionId;\n });\n\n private readonly variantResult = computed(() =>\n switchVariants({\n size: this.size(),\n labelPosition: this.labelPosition(),\n checked: this.internalChecked(),\n disabled: this.isDisabled(),\n errorState: this.errorState(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n readonly switchClasses = computed(() => this.variantResult().switchEl());\n readonly labelWrapClasses = computed(() => this.variantResult().labelWrap());\n readonly labelClasses = computed(() => this.variantResult().label());\n readonly descriptionClasses = computed(() => this.variantResult().description());\n readonly iconWrapClasses = computed(() => this.variantResult().iconWrap());\n readonly thumbClasses = computed(() => this.variantResult().thumb());\n\n readonly trackClasses = computed(() => {\n const base = this.variantResult().track();\n return this.internalChecked() ? `${base} ${CHECKED_TRACK[this.color()]}` : base;\n });\n\n readonly onIconClasses = computed(() => {\n const base =\n 'inline-flex items-center justify-center transition-opacity duration-normal motion-reduce:transition-none empty:hidden';\n const visibility = this.internalChecked() ? 'opacity-100' : 'opacity-0';\n const color = this.internalChecked() ? CHECKED_ICON_COLOR[this.color()] : 'text-fg-muted';\n return `${base} ${visibility} ${color}`;\n });\n\n readonly offIconClasses = computed(() => {\n const base =\n 'inline-flex items-center justify-center transition-opacity duration-normal motion-reduce:transition-none text-fg-muted empty:hidden';\n const visibility = this.internalChecked() ? 'opacity-0' : 'opacity-100';\n return `${base} ${visibility}`;\n });\n\n // ── Interactions ──────────────────────────────────────────\n\n /** Toggles the checked state. No-op when disabled. */\n toggle(): void {\n if (this.isDisabled()) return;\n const next = !this.internalChecked();\n this.internalChecked.set(next);\n this.checked.set(next);\n this.onChange(next);\n this.onTouched();\n this.change.emit(next);\n }\n\n /** Handles keyboard activation. Space toggles the switch — matches the ARIA `switch` role pattern (Enter is intentionally NOT handled, mirroring `<tw-checkbox>`). */\n onKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (event.key === ' ' || event.key === 'Spacebar') {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /** @internal Called on host blur to notify forms the control has been touched and recompute errorState. */\n onBlur(): void {\n this.onTouched();\n this._ngControlRev.update((n) => n + 1);\n }\n\n // ── ControlValueAccessor ──────────────────────────────────\n\n writeValue(value: boolean | null | undefined): void {\n const next = !!value;\n this.internalChecked.set(next);\n this.checked.set(next);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n // ── Lifecycle ─────────────────────────────────────────────\n\n ngOnInit(): void {\n this.focusMonitor.monitor(this.elementRef);\n this.destroyRef.onDestroy(() => {\n this.focusMonitor.stopMonitoring(this.elementRef);\n });\n\n // NgControl's `control` is set by the parent FormControl* directive before\n // children's `ngOnInit`. Subscribe here so errorState reacts to status/value\n // changes on the bound control.\n const ctrl = this.ngControl?.control;\n if (ctrl) {\n const streams = [ctrl.statusChanges, ctrl.valueChanges].filter(\n (s): s is NonNullable<typeof s> => !!s,\n );\n if (streams.length) {\n merge(...streams)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._ngControlRev.update((n) => n + 1));\n }\n }\n\n const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;\n if (submit) {\n submit\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this._formSubmitRev.update((n) => n + 1));\n }\n }\n\n private hasAccessibleNameHint(): boolean {\n if (this.label() || this.ariaLabel() || this.ariaLabelledby()) return true;\n const host = this.elementRef.nativeElement;\n return host.textContent !== null && host.textContent.trim().length > 0;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}