@cdevhub/ngx-tw 0.5.0 → 0.6.1
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.
- package/README.md +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +111 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +332 -0
- package/theme/_semantic.css +60 -26
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-stat.mjs","sources":["../../../projects/ngx-tw/stat/stat.ts","../../../projects/ngx-tw/stat/cdevhub-ngx-tw-stat.ts"],"sourcesContent":["import {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n type ElementRef,\n inject,\n input,\n Injector,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { SkeletonComponent } from '@cdevhub/ngx-tw/skeleton';\n\n/** Surface treatment for the stat tile. */\nexport type StatVariant = 'plain' | 'outlined' | 'elevated' | 'filled';\n\n/** Direction of trend conveyed by the delta indicator. */\nexport type StatDeltaDirection = 'up' | 'down' | 'neutral';\n\n/** Display style of the trend delta. */\nexport type StatDeltaVariant = 'badge' | 'inline' | 'icon-only';\n\n// ── Slot marker directives (DOM projection) ───────────────────────────\n\n/** Label slot — short caption (\"Revenue\", \"Active users\"). Projected into `<dt>`. */\n@Directive({ selector: '[twStatLabel]' })\nexport class StatLabelDirective {}\n\n/** Value slot — the dominant numeric/text element. Projected into `<dd>`. */\n@Directive({ selector: '[twStatValue]' })\nexport class StatValueDirective {}\n\n/** Description slot — optional secondary text under the value. Projected into a second `<dd>`. */\n@Directive({ selector: '[twStatDescription]' })\nexport class StatDescriptionDirective {}\n\n/** Icon slot — optional leading icon. Triggers the icon-leading layout. */\n@Directive({ selector: '[twStatIcon]' })\nexport class StatIconDirective {}\n\n/** Footer slot — optional auxiliary region (sparklines, tags, metadata). Always renders, even during loading. */\n@Directive({ selector: '[twStatFooter]' })\nexport class StatFooterDirective {}\n\n// ── Stat tile tv() config ─────────────────────────────────────────────\n\nconst statTile = tv(\n {\n slots: {\n root: 'block text-fg',\n iconFlex: 'flex items-start gap-3',\n iconWrapper: 'shrink-0 text-fg-muted',\n contentStack: 'min-w-0 flex-1',\n dl: 'flex flex-col',\n label: 'text-fg-muted font-medium',\n valueRow: 'flex items-baseline gap-2 flex-wrap',\n value: 'text-fg block tabular-nums font-semibold',\n description: 'text-fg-muted',\n delta: 'inline-flex items-center',\n footer: 'mt-3 pt-3 border-t border-border',\n },\n variants: {\n variant: {\n plain: { root: 'bg-transparent' },\n outlined: { root: 'bg-surface border border-border rounded-lg' },\n elevated: {\n root: 'bg-surface-raised border border-border rounded-lg shadow hover:shadow-md transition-shadow duration-200 motion-reduce:transition-none',\n },\n filled: { root: 'bg-surface-muted rounded-lg' },\n },\n size: {\n xs: {\n root: 'p-2',\n dl: 'gap-1',\n label: 'text-2xs',\n value: 'text-xs',\n description: 'text-2xs',\n delta: 'mt-1',\n },\n sm: {\n root: 'p-3',\n dl: 'gap-1',\n label: 'text-xs',\n value: 'text-sm',\n description: 'text-xs',\n delta: 'mt-1',\n },\n md: {\n root: 'p-4',\n dl: 'gap-1.5',\n label: 'text-xs',\n value: 'text-base',\n description: 'text-xs',\n delta: 'mt-1',\n },\n // lg/xl `value` uses `text-base` per the KPI-value carve-out\n // (CLAUDE.md typography). The dominant numeric needs to outrank the\n // `text-sm` label/description in visual hierarchy.\n lg: {\n root: 'p-6',\n dl: 'gap-2',\n label: 'text-sm',\n value: 'text-base font-bold',\n description: 'text-sm',\n delta: 'mt-2',\n },\n xl: {\n root: 'p-8',\n dl: 'gap-2',\n label: 'text-sm',\n value: 'text-base font-extrabold',\n description: 'text-sm',\n delta: 'mt-2',\n },\n },\n },\n defaultVariants: {\n variant: 'outlined',\n size: 'md',\n },\n },\n { twMerge: true },\n);\n\n// ── Delta tv() config ─────────────────────────────────────────────────\n\nconst statDelta = tv(\n {\n slots: {\n root: 'relative inline-flex items-center gap-1 font-medium tabular-nums',\n icon: 'shrink-0',\n text: 'inline-flex items-center',\n comparison: 'text-fg-muted',\n },\n variants: {\n variant: {\n badge: {\n root: 'px-2 py-0.5 rounded-md text-xs',\n },\n inline: {\n root: 'text-xs',\n },\n 'icon-only': {\n // size-6 (24px) — square interactive-target scale at xs density per\n // CLAUDE.md icon sub-scale; here it just centres the chevron.\n root: 'justify-center size-6 rounded-md',\n // Text and comparison stay in the DOM so the composed aria-label\n // still picks them up; `sr-only` removes them visually.\n text: 'sr-only',\n comparison: 'sr-only',\n },\n },\n effectiveColor: {\n success: {},\n error: {},\n neutral: {},\n },\n },\n compoundVariants: [\n // ===== badge (soft chip) =====\n {\n variant: 'badge',\n effectiveColor: 'success',\n class: { root: 'bg-success-soft text-success-soft-fg' },\n },\n {\n variant: 'badge',\n effectiveColor: 'error',\n class: { root: 'bg-error-soft text-error-soft-fg' },\n },\n // Neutral pinned explicitly to surface/fg tokens (advisor: never use\n // `text-neutral-700` or template through neutral via -soft-fg chain).\n {\n variant: 'badge',\n effectiveColor: 'neutral',\n class: { root: 'bg-surface-muted text-fg-muted' },\n },\n\n // ===== inline (no chip) =====\n {\n variant: 'inline',\n effectiveColor: 'success',\n class: { root: 'text-success-700' },\n },\n {\n variant: 'inline',\n effectiveColor: 'error',\n class: { root: 'text-error-700' },\n },\n {\n variant: 'inline',\n effectiveColor: 'neutral',\n class: { root: 'text-fg-muted' },\n },\n\n // ===== icon-only =====\n {\n variant: 'icon-only',\n effectiveColor: 'success',\n class: { root: 'bg-success-soft text-success-soft-fg' },\n },\n {\n variant: 'icon-only',\n effectiveColor: 'error',\n class: { root: 'bg-error-soft text-error-soft-fg' },\n },\n {\n variant: 'icon-only',\n effectiveColor: 'neutral',\n class: { root: 'bg-surface-muted text-fg-muted' },\n },\n ],\n defaultVariants: {\n variant: 'badge',\n effectiveColor: 'neutral',\n },\n },\n { twMerge: true },\n);\n\n// ── Stat delta component ──────────────────────────────────────────────\n\n/**\n * Compact trend indicator — direction + projected delta text + optional\n * comparison label. Usable standalone or projected into a `<tw-stat>` tile.\n *\n * Sentiment is conveyed by both icon direction and color; consumers running\n * \"lower is better\" metrics (bounce rate, latency, churn) set `inverted` to\n * swap the success/error color mapping without changing the literal direction\n * or the announced verb.\n */\n@Component({\n selector: 'tw-stat-delta',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'img',\n '[class]': 'rootClasses()',\n '[attr.aria-label]': 'composedAriaLabel()',\n },\n template: `\n <svg\n [class]=\"iconClasses() + ' ' + iconSizeClass()\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n @switch (direction()) {\n @case ('up') { <path d=\"M4 10l4-4 4 4\" /> }\n @case ('down') { <path d=\"M4 6l4 4 4-4\" /> }\n @default { <path d=\"M3 8h10\" /> }\n }\n </svg>\n <span #textEl [class]=\"textClasses()\"><ng-content /></span>\n @if (comparisonLabel(); as comp) {\n <span [class]=\"comparisonClasses()\">{{ comp }}</span>\n }\n `,\n})\nexport class StatDeltaComponent {\n /** Direction of change. `'up'` renders an up-chevron and (by default) the `success` color; `'down'` renders a down-chevron and the `error` color; `'neutral'` renders a horizontal-line glyph and the neutral color. Defaults to `'neutral'`. */\n readonly direction = input<StatDeltaDirection>('neutral');\n\n /** When true, swaps success/error semantics so `down` reads as success and `up` reads as error — use for metrics where lower is better (bounce rate, error rate, latency, churn). `neutral` direction is unaffected. Defaults to `false`. */\n readonly inverted = input(false, { transform: booleanAttribute });\n\n /** Display style. `'badge'` (default) wraps the delta in a pill chip; `'inline'` is icon + text only with no chip; `'icon-only'` shows just the chevron for ultra-dense layouts. */\n readonly variant = input<StatDeltaVariant>('badge');\n\n /** Optional comparison label rendered next to the delta value (e.g. `\"vs last week\"`, `\"since launch\"`). Defaults to `undefined`. */\n readonly comparisonLabel = input<string>();\n\n /** Explicit accessible label. When omitted, the component composes one from `direction` + projected text + `comparisonLabel`. Override when projected content is purely symbolic or already localized. Defaults to `undefined`. */\n readonly ariaLabel = input<string>();\n\n /** @internal */\n protected readonly textEl = viewChild<ElementRef<HTMLElement>>('textEl');\n\n /** @internal */\n protected readonly projectedText = signal('');\n\n constructor() {\n const injector = inject(Injector);\n // Read the projected text via the wrapper span's textContent. textContent\n // is recursive across projected children, so this resolves the consumer's\n // string even when wrapped in arbitrary markup. afterRenderEffect runs\n // after each render so projection changes are captured.\n afterRenderEffect(\n () => {\n const el = this.textEl()?.nativeElement;\n if (!el) {\n this.projectedText.set('');\n return;\n }\n const text = (el.textContent ?? '').trim();\n this.projectedText.set(text);\n },\n { injector },\n );\n }\n\n /** @internal */\n protected readonly effectiveColor = computed<'success' | 'error' | 'neutral'>(() => {\n const dir = this.direction();\n if (dir === 'neutral') return 'neutral';\n const inv = this.inverted();\n if (dir === 'up') return inv ? 'error' : 'success';\n return inv ? 'success' : 'error';\n });\n\n /** @internal */\n protected readonly iconSizeClass = computed(() => {\n // Glyph sub-scale: size-3 (12px) at the badge/inline xs/sm density,\n // size-4 (16px) at md+. The delta lives inside text-xs, so size-3 holds.\n // Larger contexts (md / lg / xl on the parent tile) get size-4.\n return this.variant() === 'icon-only' ? 'size-4' : 'size-3';\n });\n\n /** @internal */\n protected readonly composedAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const dir = this.direction();\n const verb = dir === 'up' ? 'increased' : dir === 'down' ? 'decreased' : 'unchanged';\n const text = this.projectedText();\n const comp = this.comparisonLabel();\n const parts: string[] = [];\n if (text) {\n parts.push(`${verb} by ${text}`);\n } else {\n parts.push(verb);\n }\n if (comp) parts.push(comp);\n return parts.join(' ');\n });\n\n private readonly variantResult = computed(() =>\n statDelta({ variant: this.variant(), effectiveColor: this.effectiveColor() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly iconClasses = computed(() => this.variantResult().icon());\n protected readonly textClasses = computed(() => this.variantResult().text());\n protected readonly comparisonClasses = computed(() => this.variantResult().comparison());\n}\n\n// ── Stat tile component ───────────────────────────────────────────────\n\n/**\n * KPI tile — a compact display tile surfacing a single key performance\n * indicator with an optional trend delta. Composes a `<dl>` / `<dt>` / `<dd>`\n * definition list internally so the label-to-value pairing is announced\n * naturally by assistive technology.\n *\n * Slots:\n * - `[twStatLabel]` — caption (rendered as `<dt>`).\n * - `[twStatValue]` — dominant value (rendered as `<dd>`).\n * - `[twStatDescription]` — optional secondary text (second `<dd>`).\n * - `[twStatIcon]` — optional leading icon (switches to icon-leading layout).\n * - `[twStatFooter]` — optional auxiliary region (sparklines, tags).\n * - `<tw-stat-delta>` — projected trend indicator alongside the value.\n *\n * Loading state replaces label/value/delta with `<tw-skeleton>` placeholders\n * sized to match the density. Footer always renders during loading so\n * consumers can compose their own skeleton charts.\n */\n@Component({\n selector: 'tw-stat',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SkeletonComponent, NgTemplateOutlet],\n host: {\n '[class]': 'rootClasses()',\n // Permanent live region — `aria-busy` toggle alone signals state change\n // so assistive tech announces the resolved content on loading→loaded\n // without the live region being torn down mid-transition.\n 'aria-live': 'polite',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n },\n template: `\n @if (iconLeading()) {\n <div [class]=\"iconFlexClasses()\">\n <div [class]=\"iconWrapperClasses()\">\n <ng-content select=\"[twStatIcon]\" />\n </div>\n <div [class]=\"contentStackClasses()\">\n <ng-container [ngTemplateOutlet]=\"dlBlock\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"dlBlock\" />\n }\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[twStatFooter]\" />\n </div>\n }\n\n <ng-template #dlBlock>\n <dl [class]=\"dlClasses()\">\n @if (loading()) {\n <dt [class]=\"labelClasses()\">\n <tw-skeleton width=\"40%\" height=\"0.75rem\" />\n </dt>\n } @else if (hasLabel()) {\n <dt [class]=\"labelClasses()\">\n <ng-content select=\"[twStatLabel]\" />\n </dt>\n }\n\n <dd [class]=\"valueRowClasses()\">\n @if (loading()) {\n <tw-skeleton [width]=\"loadingValueWidth()\" [height]=\"loadingValueHeight()\" />\n } @else if (hasValue()) {\n <span [class]=\"valueClasses()\">\n <ng-content select=\"[twStatValue]\" />\n </span>\n }\n\n @if (loading()) {\n <span [class]=\"deltaClasses()\">\n <tw-skeleton width=\"3rem\" height=\"1.25rem\" />\n </span>\n } @else if (hasDelta()) {\n <span [class]=\"deltaClasses()\">\n <ng-content select=\"tw-stat-delta\" />\n </span>\n }\n </dd>\n\n @if (!loading() && hasDescription()) {\n <dd [class]=\"descriptionClasses()\">\n <ng-content select=\"[twStatDescription]\" />\n </dd>\n }\n </dl>\n </ng-template>\n `,\n})\nexport class StatComponent {\n /** Surface treatment. `'plain'` removes border and background; `'outlined'` (default) adds a border on the surface token; `'elevated'` adds shadow and uses the raised surface; `'filled'` uses the muted surface with no border. */\n readonly variant = input<StatVariant>('outlined');\n\n /** Density scale — drives padding, internal gaps, value/label typography, and the skeleton placeholder dimensions. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, replaces label, value, and delta regions with `<tw-skeleton>` placeholders and toggles `aria-busy=\"true\"` on the host. Projected footer content still renders. Defaults to `false`. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** @internal */\n protected readonly labelSlot = contentChild(StatLabelDirective);\n /** @internal */\n protected readonly valueSlot = contentChild(StatValueDirective);\n /** @internal */\n protected readonly descriptionSlot = contentChild(StatDescriptionDirective);\n /** @internal */\n protected readonly iconSlot = contentChild(StatIconDirective);\n /** @internal */\n protected readonly footerSlot = contentChild(StatFooterDirective);\n /** @internal */\n protected readonly deltaSlot = contentChild(StatDeltaComponent);\n\n protected readonly hasLabel = computed(() => !!this.labelSlot());\n protected readonly hasValue = computed(() => !!this.valueSlot());\n protected readonly hasDescription = computed(() => !!this.descriptionSlot());\n protected readonly hasIcon = computed(() => !!this.iconSlot());\n protected readonly hasFooter = computed(() => !!this.footerSlot());\n protected readonly hasDelta = computed(() => !!this.deltaSlot());\n\n protected readonly iconLeading = computed(() => this.hasIcon());\n\n /** Skeleton width during loading state — scales with the size axis. */\n protected readonly loadingValueWidth = computed(() => {\n switch (this.size()) {\n case 'xs': return '4rem';\n case 'sm': return '5rem';\n case 'md': return '6rem';\n case 'lg': return '8rem';\n case 'xl': return '10rem';\n }\n });\n\n /** Skeleton height during loading state — matches the value font size. */\n protected readonly loadingValueHeight = computed(() => {\n switch (this.size()) {\n case 'xs': return '0.75rem';\n case 'sm': return '0.875rem';\n case 'md': return '1rem';\n case 'lg': return '1rem';\n case 'xl': return '1rem';\n }\n });\n\n private readonly variantResult = computed(() =>\n statTile({ variant: this.variant(), size: this.size() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly iconFlexClasses = computed(() => this.variantResult().iconFlex());\n protected readonly iconWrapperClasses = computed(() => this.variantResult().iconWrapper());\n protected readonly contentStackClasses = computed(() => this.variantResult().contentStack());\n protected readonly dlClasses = computed(() => this.variantResult().dl());\n protected readonly labelClasses = computed(() => this.variantResult().label());\n protected readonly valueRowClasses = computed(() => this.variantResult().valueRow());\n protected readonly valueClasses = computed(() => this.variantResult().value());\n protected readonly descriptionClasses = computed(() => this.variantResult().description());\n protected readonly deltaClasses = computed(() => this.variantResult().delta());\n protected readonly footerClasses = computed(() => this.variantResult().footer());\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-stat.mjs","sources":["../../../projects/ngx-tw/stat/stat.ts","../../../projects/ngx-tw/stat/cdevhub-ngx-tw-stat.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n Directive,\n type ElementRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { SkeletonComponent } from '@cdevhub/ngx-tw/skeleton';\n\n/** Surface treatment for the stat tile. */\nexport type StatVariant = 'ghost' | 'outline' | 'elevated' | 'solid' | StatVariantLegacy;\n\n/**\n * Legacy `variant` spellings, kept so existing templates keep compiling.\n * @deprecated `'plain'` aliases `'ghost'`, `'outlined'` aliases `'outline'`\n * and `'filled'` aliases `'solid'`. Each renders identically to its\n * replacement and will be removed in the next major.\n */\nexport type StatVariantLegacy = 'plain' | 'outlined' | 'filled';\n\n/** Canonical `variant` spellings — the set `tv()` actually keys on. */\ntype StatVariantCanonical = Exclude<StatVariant, StatVariantLegacy>;\n\n/** Maps every legacy spelling onto its canonical replacement. */\nconst VARIANT_ALIASES: Readonly<Record<StatVariantLegacy, StatVariantCanonical>> = {\n plain: 'ghost',\n outlined: 'outline',\n filled: 'solid',\n};\n\n/** Direction of trend conveyed by the delta indicator. */\nexport type StatDeltaDirection = 'up' | 'down' | 'neutral';\n\n/** Display style of the trend delta. */\nexport type StatDeltaVariant = 'badge' | 'inline' | 'icon-only';\n\n// ── Slot marker directives (DOM projection) ───────────────────────────\n\n/** Label slot — short caption (\"Revenue\", \"Active users\"). Projected into `<dt>`. */\n@Directive({ selector: '[twStatLabel]' })\nexport class StatLabelDirective {}\n\n/** Value slot — the dominant numeric/text element. Projected into `<dd>`. */\n@Directive({ selector: '[twStatValue]' })\nexport class StatValueDirective {}\n\n/** Description slot — optional secondary text under the value. Projected into a second `<dd>`. */\n@Directive({ selector: '[twStatDescription]' })\nexport class StatDescriptionDirective {}\n\n/** Icon slot — optional leading icon. Triggers the icon-leading layout. */\n@Directive({ selector: '[twStatIcon]' })\nexport class StatIconDirective {}\n\n/** Footer slot — optional auxiliary region (sparklines, tags, metadata). Always renders, even during loading. */\n@Directive({ selector: '[twStatFooter]' })\nexport class StatFooterDirective {}\n\n// ── Stat tile tv() config ─────────────────────────────────────────────\n\nconst statTile = tv(\n {\n slots: {\n root: 'block text-fg',\n iconFlex: 'flex items-start gap-3',\n iconWrapper: 'shrink-0 text-fg-muted',\n contentStack: 'min-w-0 flex-1',\n dl: 'flex flex-col',\n label: 'text-fg-muted font-medium',\n valueRow: 'flex items-baseline gap-2 flex-wrap',\n value: 'text-fg block tabular-nums font-semibold',\n description: 'text-fg-muted',\n delta: 'inline-flex items-center',\n footer: 'mt-3 pt-3 border-t border-border',\n },\n variants: {\n variant: {\n ghost: { root: 'bg-transparent' },\n outline: { root: 'bg-surface border border-border rounded-lg' },\n elevated: {\n root: 'bg-surface-raised border border-border rounded-lg shadow hover:shadow-md transition-shadow duration-200 motion-reduce:transition-none',\n },\n solid: { root: 'bg-surface-muted rounded-lg' },\n },\n size: {\n xs: {\n root: 'p-2',\n dl: 'gap-1',\n label: 'text-2xs',\n value: 'text-xs',\n description: 'text-2xs',\n delta: 'mt-1',\n },\n sm: {\n root: 'p-3',\n dl: 'gap-1',\n label: 'text-xs',\n value: 'text-sm',\n description: 'text-xs',\n delta: 'mt-1',\n },\n md: {\n root: 'p-4',\n dl: 'gap-1.5',\n label: 'text-xs',\n value: 'text-base',\n description: 'text-xs',\n delta: 'mt-1',\n },\n // lg/xl `value` uses `text-base` per the KPI-value carve-out\n // (CLAUDE.md typography). The dominant numeric needs to outrank the\n // `text-sm` label/description in visual hierarchy.\n lg: {\n root: 'p-6',\n dl: 'gap-2',\n label: 'text-sm',\n value: 'text-base font-bold',\n description: 'text-sm',\n delta: 'mt-2',\n },\n xl: {\n root: 'p-8',\n dl: 'gap-2',\n label: 'text-sm',\n value: 'text-base font-extrabold',\n description: 'text-sm',\n delta: 'mt-2',\n },\n },\n },\n defaultVariants: {\n variant: 'outline',\n size: 'md',\n },\n },\n { twMerge: true },\n);\n\n// ── Delta tv() config ─────────────────────────────────────────────────\n\nconst statDelta = tv(\n {\n slots: {\n root: 'relative inline-flex items-center gap-1 font-medium tabular-nums',\n icon: 'shrink-0',\n text: 'inline-flex items-center',\n comparison: 'text-fg-muted',\n },\n variants: {\n variant: {\n badge: {\n root: 'px-2 py-0.5 rounded-md text-xs',\n },\n inline: {\n root: 'text-xs',\n },\n 'icon-only': {\n // size-6 (24px) — square interactive-target scale at xs density per\n // CLAUDE.md icon sub-scale; here it just centres the chevron.\n root: 'justify-center size-6 rounded-md',\n // Text and comparison stay in the DOM so the composed aria-label\n // still picks them up; `sr-only` removes them visually.\n text: 'sr-only',\n comparison: 'sr-only',\n },\n },\n effectiveColor: {\n success: {},\n error: {},\n neutral: {},\n },\n },\n compoundVariants: [\n // ===== badge (soft chip) =====\n {\n variant: 'badge',\n effectiveColor: 'success',\n class: { root: 'bg-success-soft text-success-soft-fg' },\n },\n {\n variant: 'badge',\n effectiveColor: 'error',\n class: { root: 'bg-error-soft text-error-soft-fg' },\n },\n // Neutral pinned explicitly to surface/fg tokens (advisor: never use\n // `text-neutral-700` or template through neutral via -soft-fg chain).\n {\n variant: 'badge',\n effectiveColor: 'neutral',\n class: { root: 'bg-surface-muted text-fg-muted' },\n },\n\n // ===== inline (no chip) =====\n {\n variant: 'inline',\n effectiveColor: 'success',\n class: { root: 'text-success-700' },\n },\n {\n variant: 'inline',\n effectiveColor: 'error',\n class: { root: 'text-error-700' },\n },\n {\n variant: 'inline',\n effectiveColor: 'neutral',\n class: { root: 'text-fg-muted' },\n },\n\n // ===== icon-only =====\n {\n variant: 'icon-only',\n effectiveColor: 'success',\n class: { root: 'bg-success-soft text-success-soft-fg' },\n },\n {\n variant: 'icon-only',\n effectiveColor: 'error',\n class: { root: 'bg-error-soft text-error-soft-fg' },\n },\n {\n variant: 'icon-only',\n effectiveColor: 'neutral',\n class: { root: 'bg-surface-muted text-fg-muted' },\n },\n ],\n defaultVariants: {\n variant: 'badge',\n effectiveColor: 'neutral',\n },\n },\n { twMerge: true },\n);\n\n// ── Stat delta component ──────────────────────────────────────────────\n\n/**\n * Compact trend indicator — direction + projected delta text + optional\n * comparison label. Usable standalone or projected into a `<tw-stat>` tile.\n *\n * Sentiment is conveyed by both icon direction and color; consumers running\n * \"lower is better\" metrics (bounce rate, latency, churn) set `inverted` to\n * swap the success/error color mapping without changing the literal direction\n * or the announced verb.\n */\n@Component({\n selector: 'tw-stat-delta',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'img',\n '[class]': 'rootClasses()',\n '[attr.aria-label]': 'composedAriaLabel()',\n },\n template: `\n <svg\n [class]=\"iconClasses() + ' ' + iconSizeClass()\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n @switch (direction()) {\n @case ('up') { <path d=\"M4 10l4-4 4 4\" /> }\n @case ('down') { <path d=\"M4 6l4 4 4-4\" /> }\n @default { <path d=\"M3 8h10\" /> }\n }\n </svg>\n <span #textEl [class]=\"textClasses()\"><ng-content /></span>\n @if (comparisonLabel(); as comp) {\n <span [class]=\"comparisonClasses()\">{{ comp }}</span>\n }\n `,\n})\nexport class StatDeltaComponent {\n /** Direction of change. `'up'` renders an up-chevron and (by default) the `success` color; `'down'` renders a down-chevron and the `error` color; `'neutral'` renders a horizontal-line glyph and the neutral color. Defaults to `'neutral'`. */\n readonly direction = input<StatDeltaDirection>('neutral');\n\n /** When true, swaps success/error semantics so `down` reads as success and `up` reads as error — use for metrics where lower is better (bounce rate, error rate, latency, churn). `neutral` direction is unaffected. Defaults to `false`. */\n readonly inverted = input(false, { transform: booleanAttribute });\n\n /** Display style. `'badge'` (default) wraps the delta in a pill chip; `'inline'` is icon + text only with no chip; `'icon-only'` shows just the chevron for ultra-dense layouts. */\n readonly variant = input<StatDeltaVariant>('badge');\n\n /** Optional comparison label rendered next to the delta value (e.g. `\"vs last week\"`, `\"since launch\"`). Defaults to `undefined`. */\n readonly comparisonLabel = input<string>();\n\n /** Explicit accessible label, mirrored to `aria-label`. When omitted, the component composes one from `direction` + projected text + `comparisonLabel`. Override when projected content is purely symbolic or already localized. Defaults to `undefined`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** @internal */\n protected readonly textEl = viewChild<ElementRef<HTMLElement>>('textEl');\n\n /** @internal */\n protected readonly projectedText = signal('');\n\n private readonly destroyRef = inject(DestroyRef);\n\n constructor() {\n // Read the projected text via the wrapper span's `textContent`, which is\n // recursive across projected children and therefore resolves the\n // consumer's string even when wrapped in arbitrary markup.\n //\n // A `MutationObserver` — not a render hook, and not `contentChild`:\n //\n // * `contentChild` cannot see through `<ng-content>`; it resolves the\n // *parent's* own content children, not the nodes the consumer projected\n // into this component. `flip-card.ts` uses an observer for exactly this\n // reason and says so.\n // * `afterRenderEffect` does NOT run after every render. It is a reactive\n // effect scheduled into a render phase and re-runs only when a tracked\n // signal producer changes (Angular v22 `AFTER_RENDER_PHASE_EFFECT_NODE`\n // bails on `!this.dirty` / `!consumerPollProducersForChange`).\n // `el.textContent` is not a signal and `textEl` is a static,\n // unconditional `viewChild`, so the earlier hook sampled the text once\n // and froze it: `{{ growth() }}%` going 12 → 34 kept announcing 12.\n // (The previous comment here asserted the opposite; it was wrong.)\n //\n // Scope is broader than flip-card's single-target `childList` because the\n // interesting mutation is a *text* edit on a descendant text node:\n // `characterData` fires on the child node, so `subtree` is load-bearing,\n // and `childList` catches structural swaps inside the projected markup.\n // The observed element is the component's own single wrapper span, so the\n // cost stays bounded, and it disconnects on destroy.\n //\n // No signal cycle: the write feeds `composedAriaLabel` → the *host*'s\n // `[attr.aria-label]`, which is outside `#textEl` and so cannot re-trigger\n // the observer. Identical-value `signal.set` calls are no-ops.\n afterNextRender(() => {\n const el = this.textEl()?.nativeElement;\n if (!el) return;\n const update = () => this.projectedText.set((el.textContent ?? '').trim());\n update();\n const observer = new MutationObserver(update);\n observer.observe(el, { childList: true, characterData: true, subtree: true });\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n /** @internal */\n protected readonly effectiveColor = computed<'success' | 'error' | 'neutral'>(() => {\n const dir = this.direction();\n if (dir === 'neutral') return 'neutral';\n const inv = this.inverted();\n if (dir === 'up') return inv ? 'error' : 'success';\n return inv ? 'success' : 'error';\n });\n\n /** @internal */\n protected readonly iconSizeClass = computed(() => {\n // Glyph sub-scale: size-3 (12px) at the badge/inline xs/sm density,\n // size-4 (16px) at md+. The delta lives inside text-xs, so size-3 holds.\n // Larger contexts (md / lg / xl on the parent tile) get size-4.\n return this.variant() === 'icon-only' ? 'size-4' : 'size-3';\n });\n\n /** @internal */\n protected readonly composedAriaLabel = computed(() => {\n const explicit = this.ariaLabel();\n if (explicit) return explicit;\n const dir = this.direction();\n const verb = dir === 'up' ? 'increased' : dir === 'down' ? 'decreased' : 'unchanged';\n const text = this.projectedText();\n const comp = this.comparisonLabel();\n const parts: string[] = [];\n if (text) {\n parts.push(`${verb} by ${text}`);\n } else {\n parts.push(verb);\n }\n if (comp) parts.push(comp);\n return parts.join(' ');\n });\n\n private readonly variantResult = computed(() =>\n statDelta({ variant: this.variant(), effectiveColor: this.effectiveColor() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly iconClasses = computed(() => this.variantResult().icon());\n protected readonly textClasses = computed(() => this.variantResult().text());\n protected readonly comparisonClasses = computed(() => this.variantResult().comparison());\n}\n\n// ── Stat tile component ───────────────────────────────────────────────\n\n/**\n * KPI tile — a compact display tile surfacing a single key performance\n * indicator with an optional trend delta. Composes a `<dl>` / `<dt>` / `<dd>`\n * definition list internally so the label-to-value pairing is announced\n * naturally by assistive technology.\n *\n * Slots:\n * - `[twStatLabel]` — caption (rendered as `<dt>`).\n * - `[twStatValue]` — dominant value (rendered as `<dd>`).\n * - `[twStatDescription]` — optional secondary text (second `<dd>`).\n * - `[twStatIcon]` — optional leading icon (switches to icon-leading layout).\n * - `[twStatFooter]` — optional auxiliary region (sparklines, tags).\n * - `<tw-stat-delta>` — projected trend indicator alongside the value.\n *\n * Loading state replaces label/value/delta with `<tw-skeleton>` placeholders\n * sized to match the density. Footer always renders during loading so\n * consumers can compose their own skeleton charts.\n */\n@Component({\n selector: 'tw-stat',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SkeletonComponent, NgTemplateOutlet],\n host: {\n '[class]': 'rootClasses()',\n // Permanent live region — `aria-busy` toggle alone signals state change\n // so assistive tech announces the resolved content on loading→loaded\n // without the live region being torn down mid-transition.\n 'aria-live': 'polite',\n '[attr.aria-busy]': 'loading() ? \"true\" : null',\n },\n template: `\n @if (iconLeading()) {\n <div [class]=\"iconFlexClasses()\">\n <div [class]=\"iconWrapperClasses()\">\n <ng-content select=\"[twStatIcon]\" />\n </div>\n <div [class]=\"contentStackClasses()\">\n <ng-container [ngTemplateOutlet]=\"dlBlock\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"dlBlock\" />\n }\n\n @if (hasFooter()) {\n <div [class]=\"footerClasses()\">\n <ng-content select=\"[twStatFooter]\" />\n </div>\n }\n\n <ng-template #dlBlock>\n <dl [class]=\"dlClasses()\">\n @if (loading()) {\n <dt [class]=\"labelClasses()\">\n <tw-skeleton width=\"40%\" height=\"0.75rem\" />\n </dt>\n } @else if (hasLabel()) {\n <dt [class]=\"labelClasses()\">\n <ng-content select=\"[twStatLabel]\" />\n </dt>\n }\n\n <dd [class]=\"valueRowClasses()\">\n @if (loading()) {\n <tw-skeleton [width]=\"loadingValueWidth()\" [height]=\"loadingValueHeight()\" />\n } @else if (hasValue()) {\n <span [class]=\"valueClasses()\">\n <ng-content select=\"[twStatValue]\" />\n </span>\n }\n\n @if (loading()) {\n <span [class]=\"deltaClasses()\">\n <tw-skeleton width=\"3rem\" height=\"1.25rem\" />\n </span>\n } @else if (hasDelta()) {\n <span [class]=\"deltaClasses()\">\n <ng-content select=\"tw-stat-delta\" />\n </span>\n }\n </dd>\n\n @if (!loading() && hasDescription()) {\n <dd [class]=\"descriptionClasses()\">\n <ng-content select=\"[twStatDescription]\" />\n </dd>\n }\n </dl>\n </ng-template>\n `,\n})\nexport class StatComponent {\n /** Surface treatment. `'ghost'` removes border and background; `'outline'` (default) adds a border on the surface token; `'elevated'` adds shadow and uses the raised surface; `'solid'` uses the muted surface with no border. `'plain'`, `'outlined'` and `'filled'` are deprecated aliases for `'ghost'`, `'outline'` and `'solid'` and render identically. */\n readonly variant = input<StatVariant>('outline');\n\n /** Density scale — drives padding, internal gaps, value/label typography, and the skeleton placeholder dimensions. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** When true, replaces label, value, and delta regions with `<tw-skeleton>` placeholders and toggles `aria-busy=\"true\"` on the host. Projected footer content still renders. Defaults to `false`. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** @internal */\n protected readonly labelSlot = contentChild(StatLabelDirective);\n /** @internal */\n protected readonly valueSlot = contentChild(StatValueDirective);\n /** @internal */\n protected readonly descriptionSlot = contentChild(StatDescriptionDirective);\n /** @internal */\n protected readonly iconSlot = contentChild(StatIconDirective);\n /** @internal */\n protected readonly footerSlot = contentChild(StatFooterDirective);\n /** @internal */\n protected readonly deltaSlot = contentChild(StatDeltaComponent);\n\n protected readonly hasLabel = computed(() => !!this.labelSlot());\n protected readonly hasValue = computed(() => !!this.valueSlot());\n protected readonly hasDescription = computed(() => !!this.descriptionSlot());\n protected readonly hasIcon = computed(() => !!this.iconSlot());\n protected readonly hasFooter = computed(() => !!this.footerSlot());\n protected readonly hasDelta = computed(() => !!this.deltaSlot());\n\n protected readonly iconLeading = computed(() => this.hasIcon());\n\n /** Skeleton width during loading state — scales with the size axis. */\n protected readonly loadingValueWidth = computed(() => {\n switch (this.size()) {\n case 'xs': return '4rem';\n case 'sm': return '5rem';\n case 'md': return '6rem';\n case 'lg': return '8rem';\n case 'xl': return '10rem';\n }\n });\n\n /** Skeleton height during loading state — matches the value font size. */\n protected readonly loadingValueHeight = computed(() => {\n switch (this.size()) {\n case 'xs': return '0.75rem';\n case 'sm': return '0.875rem';\n case 'md': return '1rem';\n case 'lg': return '1rem';\n case 'xl': return '1rem';\n }\n });\n\n /** @internal Canonical variant with legacy spellings folded in. */\n private readonly resolvedVariant = computed<StatVariantCanonical>(() => {\n const v = this.variant();\n return (\n (VARIANT_ALIASES as Record<string, StatVariantCanonical | undefined>)[v] ??\n (v as StatVariantCanonical)\n );\n });\n\n private readonly variantResult = computed(() =>\n statTile({ variant: this.resolvedVariant(), size: this.size() }),\n );\n\n protected readonly rootClasses = computed(() => this.variantResult().root());\n protected readonly iconFlexClasses = computed(() => this.variantResult().iconFlex());\n protected readonly iconWrapperClasses = computed(() => this.variantResult().iconWrapper());\n protected readonly contentStackClasses = computed(() => this.variantResult().contentStack());\n protected readonly dlClasses = computed(() => this.variantResult().dl());\n protected readonly labelClasses = computed(() => this.variantResult().label());\n protected readonly valueRowClasses = computed(() => this.variantResult().valueRow());\n protected readonly valueClasses = computed(() => this.variantResult().value());\n protected readonly descriptionClasses = computed(() => this.variantResult().description());\n protected readonly deltaClasses = computed(() => this.variantResult().delta());\n protected readonly footerClasses = computed(() => this.variantResult().footer());\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -261,14 +261,10 @@ class StepperComponent extends CdkStepper {
|
|
|
261
261
|
/** Controls indicator size and label typography. Defaults to `'md'`. */
|
|
262
262
|
size = input('md', /* @ts-ignore */
|
|
263
263
|
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
264
|
-
/** When true, steps with `hasError` render error styling, icon, and `aria-invalid`. Defaults to `true
|
|
265
|
-
// TRUE-default: error states must be visible by default — silently swallowing
|
|
266
|
-
// a stepped flow's failure state is a UX regression. Consumers opt out per step.
|
|
264
|
+
/** When true, steps with `hasError` render error styling, icon, and `aria-invalid`. Defaults to `true` — error states must be visible by default, since silently swallowing a stepped flow's failure state is a UX regression; the special case is opting out per step. */
|
|
267
265
|
showError = input(true, /* @ts-ignore */
|
|
268
266
|
...(ngDevMode ? [{ debugName: "showError" }] : /* istanbul ignore next */ []));
|
|
269
|
-
/** When true, clicking a navigable step header selects it. Set to `false` to only allow advancement via `twStepperNext` / `twStepperPrevious`. Defaults to `true
|
|
270
|
-
// TRUE-default: free-navigation is the standard stepper UX; restricted flows
|
|
271
|
-
// (e.g. wizards that must complete in order) explicitly opt out.
|
|
267
|
+
/** When true, clicking a navigable step header selects it. Set to `false` to only allow advancement via `twStepperNext` / `twStepperPrevious`. Defaults to `true` — free navigation is the standard stepper UX; the special case is a restricted flow such as a wizard that must complete in order. */
|
|
272
268
|
headerInteractive = input(true, /* @ts-ignore */
|
|
273
269
|
...(ngDevMode ? [{ debugName: "headerInteractive" }] : /* istanbul ignore next */ []));
|
|
274
270
|
_liveAnnouncer = inject(LiveAnnouncer);
|
|
@@ -298,6 +294,36 @@ class StepperComponent extends CdkStepper {
|
|
|
298
294
|
get orientation() {
|
|
299
295
|
return super.orientation;
|
|
300
296
|
}
|
|
297
|
+
// ── ARIA shape ──
|
|
298
|
+
//
|
|
299
|
+
// Horizontal renders the WAI-ARIA tabs pattern (tablist / tab / tabpanel,
|
|
300
|
+
// with the panel outside the strip). Vertical renders the panel INSIDE the
|
|
301
|
+
// strip, and a tablist may own nothing but tabs — axe fails that with
|
|
302
|
+
// "Element has children which are not allowed: [role=tabpanel]" — so the
|
|
303
|
+
// vertical strip is exposed as a stack of disclosure buttons instead
|
|
304
|
+
// (plain button + aria-expanded, panel as a named group).
|
|
305
|
+
/** @internal Whether the header strip is exposed as a WAI-ARIA tablist. True for horizontal orientation only. */
|
|
306
|
+
usesTabPattern = computed(() => this._orientationSignal() === 'horizontal', /* @ts-ignore */
|
|
307
|
+
...(ngDevMode ? [{ debugName: "usesTabPattern" }] : /* istanbul ignore next */ []));
|
|
308
|
+
/** @internal Whether a step renders its panel inline beneath its own header (vertical orientation, selected step, step has content). */
|
|
309
|
+
hasInlinePanel(step, index) {
|
|
310
|
+
return (this._orientationSignal() === 'vertical' &&
|
|
311
|
+
this._selectedIndexSignal() === index &&
|
|
312
|
+
!!step.content);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* @internal Id the step header's `aria-controls` points at, or `null`.
|
|
316
|
+
*
|
|
317
|
+
* Vertical headers only claim control of a panel that is actually in the
|
|
318
|
+
* DOM: an `aria-expanded="true"` button pointing at a missing id is an
|
|
319
|
+
* invalid reference, whereas the collapsed steps simply carry no
|
|
320
|
+
* `aria-controls` at all.
|
|
321
|
+
*/
|
|
322
|
+
controlledPanelId(step, index) {
|
|
323
|
+
if (this.usesTabPattern())
|
|
324
|
+
return this._getStepContentId(index);
|
|
325
|
+
return this.hasInlinePanel(step, index) ? this._getStepContentId(index) : null;
|
|
326
|
+
}
|
|
301
327
|
_variantResult = computed(() => stepperVariants({
|
|
302
328
|
variant: this.variant(),
|
|
303
329
|
size: this.size(),
|
|
@@ -444,6 +470,7 @@ class StepperComponent extends CdkStepper {
|
|
|
444
470
|
this._onKeydown(event);
|
|
445
471
|
this.syncFocusIndex();
|
|
446
472
|
}
|
|
473
|
+
/** @internal Selects a step from a header click. Ignored when `headerInteractive` is false or the step is not navigable. */
|
|
447
474
|
onHeaderClick(step, index) {
|
|
448
475
|
if (!this.headerInteractive())
|
|
449
476
|
return;
|
|
@@ -461,13 +488,13 @@ class StepperComponent extends CdkStepper {
|
|
|
461
488
|
return step.hasError;
|
|
462
489
|
}
|
|
463
490
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: StepperComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
464
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: StepperComponent, isStandalone: true, selector: "tw-stepper", inputs: { variant: { classPropertyName: "variant", publicName: "variant", 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 }, showError: { classPropertyName: "showError", publicName: "showError", isSignal: true, isRequired: false, transformFunction: null }, headerInteractive: { classPropertyName: "headerInteractive", publicName: "headerInteractive", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "rootClasses()" } }, providers: [{ provide: CdkStepper, useExisting: StepperComponent }], viewQueries: [{ propertyName: "_stepHeader", predicate: CdkStepHeader, descendants: true }], exportAs: ["twStepper"], usesInheritance: true, ngImport: i0, template: "<!-- Header strip + inline panels (vertical) / header-only (horizontal) -->\n<!-- WAI-ARIA tablist
|
|
491
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: StepperComponent, isStandalone: true, selector: "tw-stepper", inputs: { variant: { classPropertyName: "variant", publicName: "variant", 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 }, showError: { classPropertyName: "showError", publicName: "showError", isSignal: true, isRequired: false, transformFunction: null }, headerInteractive: { classPropertyName: "headerInteractive", publicName: "headerInteractive", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "rootClasses()" } }, providers: [{ provide: CdkStepper, useExisting: StepperComponent }], viewQueries: [{ propertyName: "_stepHeader", predicate: CdkStepHeader, descendants: true }], exportAs: ["twStepper"], usesInheritance: true, ngImport: i0, template: "<!-- Header strip + inline panels (vertical) / header-only (horizontal) -->\n<!-- Two ARIA shapes share this template, selected by orientation:\n\n horizontal \u2014 WAI-ARIA tabs. The strip is a tablist, each header is a tab,\n and the single panel renders BELOW the strip, outside it, as the pattern\n requires.\n\n vertical \u2014 disclosure buttons. The panel renders inline under its own\n header, i.e. inside the strip. A tablist may own nothing but tabs, so the\n tab roles fail there: axe reports \"Element has children which are not\n allowed: [role=tabpanel]\" on the strip. A stack of expand/collapse\n sections is what the vertical layout actually is, so the strip drops its\n role, each header stays a plain button carrying aria-expanded, and the\n inline panel is a named group.\n\n In both shapes the strip only relays keydown to CdkStepper's\n FocusKeyManager \u2014 it never takes focus itself; the headers do. -->\n<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n<div\n [class]=\"headerClasses()\"\n [attr.role]=\"usesTabPattern() ? 'tablist' : null\"\n [attr.aria-orientation]=\"usesTabPattern() ? orientationValue() : null\"\n (keydown)=\"onTablistKeydown($event)\"\n>\n @for (step of twSteps; track $index; let i = $index; let last = $last) {\n <div [class]=\"stepItemClasses()\">\n <!-- Step header button. `role` is bound, not static: CdkStepHeader sets\n `role=\"tab\"` as a host attribute, and only an attribute binding can\n override it for the vertical disclosure shape. -->\n <button\n type=\"button\"\n cdkStepHeader\n [attr.role]=\"usesTabPattern() ? 'tab' : 'button'\"\n [attr.tabindex]=\"focusIndexValue() === i ? 0 : -1\"\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]=\"controlledPanelId(step, i)\"\n [attr.aria-selected]=\"usesTabPattern() ? selectedIndexValue() === i : null\"\n [attr.aria-expanded]=\"usesTabPattern() ? null : hasInlinePanel(step, 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. It sits\n inside the header strip, so it is a named group, not a tabpanel \u2014\n see the ARIA note at the top of this file. -->\n @if (hasInlinePanel(step, i)) {\n <div\n role=\"group\"\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", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkStepHeader, selector: "[cdkStepHeader]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
465
492
|
}
|
|
466
493
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: StepperComponent, decorators: [{
|
|
467
494
|
type: Component,
|
|
468
495
|
args: [{ selector: 'tw-stepper', exportAs: 'twStepper', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, CdkStepHeader], providers: [{ provide: CdkStepper, useExisting: StepperComponent }], host: {
|
|
469
496
|
'[class]': 'rootClasses()',
|
|
470
|
-
}, template: "<!-- Header strip + inline panels (vertical) / header-only (horizontal) -->\n<!-- WAI-ARIA tablist
|
|
497
|
+
}, template: "<!-- Header strip + inline panels (vertical) / header-only (horizontal) -->\n<!-- Two ARIA shapes share this template, selected by orientation:\n\n horizontal \u2014 WAI-ARIA tabs. The strip is a tablist, each header is a tab,\n and the single panel renders BELOW the strip, outside it, as the pattern\n requires.\n\n vertical \u2014 disclosure buttons. The panel renders inline under its own\n header, i.e. inside the strip. A tablist may own nothing but tabs, so the\n tab roles fail there: axe reports \"Element has children which are not\n allowed: [role=tabpanel]\" on the strip. A stack of expand/collapse\n sections is what the vertical layout actually is, so the strip drops its\n role, each header stays a plain button carrying aria-expanded, and the\n inline panel is a named group.\n\n In both shapes the strip only relays keydown to CdkStepper's\n FocusKeyManager \u2014 it never takes focus itself; the headers do. -->\n<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n<div\n [class]=\"headerClasses()\"\n [attr.role]=\"usesTabPattern() ? 'tablist' : null\"\n [attr.aria-orientation]=\"usesTabPattern() ? orientationValue() : null\"\n (keydown)=\"onTablistKeydown($event)\"\n>\n @for (step of twSteps; track $index; let i = $index; let last = $last) {\n <div [class]=\"stepItemClasses()\">\n <!-- Step header button. `role` is bound, not static: CdkStepHeader sets\n `role=\"tab\"` as a host attribute, and only an attribute binding can\n override it for the vertical disclosure shape. -->\n <button\n type=\"button\"\n cdkStepHeader\n [attr.role]=\"usesTabPattern() ? 'tab' : 'button'\"\n [attr.tabindex]=\"focusIndexValue() === i ? 0 : -1\"\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]=\"controlledPanelId(step, i)\"\n [attr.aria-selected]=\"usesTabPattern() ? selectedIndexValue() === i : null\"\n [attr.aria-expanded]=\"usesTabPattern() ? null : hasInlinePanel(step, 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. It sits\n inside the header strip, so it is a named group, not a tabpanel \u2014\n see the ARIA note at the top of this file. -->\n @if (hasInlinePanel(step, i)) {\n <div\n role=\"group\"\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" }]
|
|
471
498
|
}], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], showError: [{ type: i0.Input, args: [{ isSignal: true, alias: "showError", required: false }] }], headerInteractive: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerInteractive", required: false }] }], _stepHeader: [{
|
|
472
499
|
type: ViewChildren,
|
|
473
500
|
args: [CdkStepHeader]
|
|
@@ -1 +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 QueryList,\n ViewChildren,\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 this.syncFocusIndex();\n\n this.selectionChange\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: StepperSelectionEvent) => {\n this.syncFocusIndex();\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 /**\n * @internal Re-declares CdkStepper's `_stepHeader` query as a **view** query.\n *\n * CdkStepper declares it as `@ContentChildren`, which assumes the host\n * projects its own headers. `tw-stepper` renders the header strip inside its\n * own template instead, so the base query matched nothing: `_sortedHeaders`\n * stayed empty, the FocusKeyManager had zero items, and arrow-key navigation\n * silently did nothing at all. Angular Material overrides the same query for\n * the same reason.\n *\n * Decorator form, not `viewChildren()`, because CdkStepper subscribes to\n * `_stepHeader.changes` — a QueryList API that signal queries do not expose.\n */\n @ViewChildren(CdkStepHeader) override _stepHeader = new QueryList<CdkStepHeader>();\n\n /**\n * @internal Which step header currently holds the single tab stop.\n *\n * Mirrors CdkStepper's `_getFocusIndex()` into a signal because that method\n * reads `_keyManager.activeItemIndex`, a plain property — and CdkStepper's\n * `_onKeydown` does not call `_stateChanged()` on the arrow-key path, so an\n * OnPush template binding straight to `_getFocusIndex()` would render the\n * roving tabindex once and then go stale the moment the user arrows.\n */\n readonly focusIndexValue = signal(0);\n\n /** @internal Re-reads the CDK key manager's active item into `focusIndexValue`. */\n private syncFocusIndex(): void {\n this.focusIndexValue.set(this._getFocusIndex() ?? this.selectedIndex);\n }\n\n /** @internal Relays tablist keydown to CdkStepper, then republishes the tab stop. */\n onTablistKeydown(event: KeyboardEvent): void {\n this._onKeydown(event);\n this.syncFocusIndex();\n }\n\n onHeaderClick(step: StepComponent, index: number): void {\n if (!this.headerInteractive()) return;\n if (!step.isNavigable()) return;\n this.selectedIndex = index;\n this.syncFocusIndex();\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<!-- WAI-ARIA tablist pattern: the tablist relays keydown to the FocusKeyManager\n but does not itself receive focus — each step header is the focus target. -->\n<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n<div\n [class]=\"headerClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientationValue()\"\n (keydown)=\"onTablistKeydown($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 [attr.tabindex]=\"focusIndexValue() === i ? 0 : -1\"\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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"}
|
|
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 QueryList,\n ViewChildren,\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` — error states must be visible by default, since silently swallowing a stepped flow's failure state is a UX regression; the special case is opting 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` — free navigation is the standard stepper UX; the special case is a restricted flow such as a wizard that must complete in order. */\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 // ── ARIA shape ──\n //\n // Horizontal renders the WAI-ARIA tabs pattern (tablist / tab / tabpanel,\n // with the panel outside the strip). Vertical renders the panel INSIDE the\n // strip, and a tablist may own nothing but tabs — axe fails that with\n // \"Element has children which are not allowed: [role=tabpanel]\" — so the\n // vertical strip is exposed as a stack of disclosure buttons instead\n // (plain button + aria-expanded, panel as a named group).\n\n /** @internal Whether the header strip is exposed as a WAI-ARIA tablist. True for horizontal orientation only. */\n readonly usesTabPattern = computed(() => this._orientationSignal() === 'horizontal');\n\n /** @internal Whether a step renders its panel inline beneath its own header (vertical orientation, selected step, step has content). */\n hasInlinePanel(step: StepComponent, index: number): boolean {\n return (\n this._orientationSignal() === 'vertical' &&\n this._selectedIndexSignal() === index &&\n !!step.content\n );\n }\n\n /**\n * @internal Id the step header's `aria-controls` points at, or `null`.\n *\n * Vertical headers only claim control of a panel that is actually in the\n * DOM: an `aria-expanded=\"true\"` button pointing at a missing id is an\n * invalid reference, whereas the collapsed steps simply carry no\n * `aria-controls` at all.\n */\n controlledPanelId(step: StepComponent, index: number): string | null {\n if (this.usesTabPattern()) return this._getStepContentId(index);\n return this.hasInlinePanel(step, index) ? this._getStepContentId(index) : null;\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 this.syncFocusIndex();\n\n this.selectionChange\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((event: StepperSelectionEvent) => {\n this.syncFocusIndex();\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 /**\n * @internal Re-declares CdkStepper's `_stepHeader` query as a **view** query.\n *\n * CdkStepper declares it as `@ContentChildren`, which assumes the host\n * projects its own headers. `tw-stepper` renders the header strip inside its\n * own template instead, so the base query matched nothing: `_sortedHeaders`\n * stayed empty, the FocusKeyManager had zero items, and arrow-key navigation\n * silently did nothing at all. Angular Material overrides the same query for\n * the same reason.\n *\n * Decorator form, not `viewChildren()`, because CdkStepper subscribes to\n * `_stepHeader.changes` — a QueryList API that signal queries do not expose.\n */\n @ViewChildren(CdkStepHeader) override _stepHeader = new QueryList<CdkStepHeader>();\n\n /**\n * @internal Which step header currently holds the single tab stop.\n *\n * Mirrors CdkStepper's `_getFocusIndex()` into a signal because that method\n * reads `_keyManager.activeItemIndex`, a plain property — and CdkStepper's\n * `_onKeydown` does not call `_stateChanged()` on the arrow-key path, so an\n * OnPush template binding straight to `_getFocusIndex()` would render the\n * roving tabindex once and then go stale the moment the user arrows.\n */\n readonly focusIndexValue = signal(0);\n\n /** @internal Re-reads the CDK key manager's active item into `focusIndexValue`. */\n private syncFocusIndex(): void {\n this.focusIndexValue.set(this._getFocusIndex() ?? this.selectedIndex);\n }\n\n /** @internal Relays tablist keydown to CdkStepper, then republishes the tab stop. */\n onTablistKeydown(event: KeyboardEvent): void {\n this._onKeydown(event);\n this.syncFocusIndex();\n }\n\n /** @internal Selects a step from a header click. Ignored when `headerInteractive` is false or the step is not navigable. */\n onHeaderClick(step: StepComponent, index: number): void {\n if (!this.headerInteractive()) return;\n if (!step.isNavigable()) return;\n this.selectedIndex = index;\n this.syncFocusIndex();\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<!-- Two ARIA shapes share this template, selected by orientation:\n\n horizontal — WAI-ARIA tabs. The strip is a tablist, each header is a tab,\n and the single panel renders BELOW the strip, outside it, as the pattern\n requires.\n\n vertical — disclosure buttons. The panel renders inline under its own\n header, i.e. inside the strip. A tablist may own nothing but tabs, so the\n tab roles fail there: axe reports \"Element has children which are not\n allowed: [role=tabpanel]\" on the strip. A stack of expand/collapse\n sections is what the vertical layout actually is, so the strip drops its\n role, each header stays a plain button carrying aria-expanded, and the\n inline panel is a named group.\n\n In both shapes the strip only relays keydown to CdkStepper's\n FocusKeyManager — it never takes focus itself; the headers do. -->\n<!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n<div\n [class]=\"headerClasses()\"\n [attr.role]=\"usesTabPattern() ? 'tablist' : null\"\n [attr.aria-orientation]=\"usesTabPattern() ? orientationValue() : null\"\n (keydown)=\"onTablistKeydown($event)\"\n>\n @for (step of twSteps; track $index; let i = $index; let last = $last) {\n <div [class]=\"stepItemClasses()\">\n <!-- Step header button. `role` is bound, not static: CdkStepHeader sets\n `role=\"tab\"` as a host attribute, and only an attribute binding can\n override it for the vertical disclosure shape. -->\n <button\n type=\"button\"\n cdkStepHeader\n [attr.role]=\"usesTabPattern() ? 'tab' : 'button'\"\n [attr.tabindex]=\"focusIndexValue() === i ? 0 : -1\"\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]=\"controlledPanelId(step, i)\"\n [attr.aria-selected]=\"usesTabPattern() ? selectedIndexValue() === i : null\"\n [attr.aria-expanded]=\"usesTabPattern() ? null : hasInlinePanel(step, 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. It sits\n inside the header strip, so it is a named group, not a tabpanel —\n see the ARIA note at the top of this file. -->\n @if (hasInlinePanel(step, i)) {\n <div\n role=\"group\"\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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"}
|