@cdevhub/ngx-tw 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +18 -3
- 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 +110 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +276 -0
- package/theme/_semantic.css +47 -12
- 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-timeline.mjs","sources":["../../../projects/ngx-tw/timeline/timeline.ts","../../../projects/ngx-tw/timeline/cdevhub-ngx-tw-timeline.ts"],"sourcesContent":["import {\n type AfterContentInit,\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n type ElementRef,\n type EnvironmentProviders,\n inject,\n InjectionToken,\n input,\n makeEnvironmentProviders,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwOrientation, TwSize } from '@cdevhub/ngx-tw/core';\n\n// `ngDevMode` is a globalThis flag set by Angular's build tooling — true in dev,\n// `false` in production builds. The `typeof` guard keeps the warning path safe\n// in environments (SSR, ad-hoc test harnesses) where the global is undeclared.\ndeclare const ngDevMode: boolean | undefined;\n\n/** Marker geometry of a `tw-timeline-item`. */\nexport type TimelineMarker = 'dot' | 'circle';\n\n/** Semantic state of a `tw-timeline-item`. Drives marker fill, ring, and trailing-connector color. */\nexport type TimelineState = 'reached' | 'pending' | 'current' | 'error';\n\n/** Vertical layout strategy of a `tw-timeline`. Ignored for `orientation: 'horizontal'`. */\nexport type TimelineAlign = 'left' | 'right' | 'alternate' | 'split';\n\n/** Connector line style. */\nexport type TimelineLineStyle = 'solid' | 'dashed';\n\n/** Visibility policy for the horizontal-overflow chevron buttons. */\nexport type TimelineScrollControls = 'auto' | 'always' | 'never';\n\n/** Localisable labels for the horizontal-overflow chevron buttons on `tw-timeline`. */\nexport interface TwTimelineScrollLabels {\n /** Accessible label for the previous-scroll chevron. Used as `aria-label`. Defaults to `'Scroll to previous events'`. */\n scrollPrevious: string;\n /** Accessible label for the next-scroll chevron. Used as `aria-label`. Defaults to `'Scroll to next events'`. */\n scrollNext: string;\n}\n\n/** Default English labels used when `TW_TIMELINE_SCROLL_LABELS` is not provided. */\nexport const DEFAULT_TW_TIMELINE_SCROLL_LABELS: TwTimelineScrollLabels = {\n scrollPrevious: 'Scroll to previous events',\n scrollNext: 'Scroll to next events',\n};\n\n/**\n * Injection token carrying localisable `aria-label` strings for the timeline's\n * horizontal-overflow chevron buttons. The container uses these labels exclusively\n * on the prev/next buttons; they do not affect any other rendered text.\n *\n * Provide via `provideTwTimelineScrollLabels({ ... })` at the root or feature level.\n * If both keys are present they override the English defaults; if only one is present\n * the other falls back to the English default.\n *\n * First concrete token under the `TW_TIMELINE_I18N` reservation in\n * `docs/requirements/timeline.requirements.md` § 11.2.\n */\nexport const TW_TIMELINE_SCROLL_LABELS = new InjectionToken<Partial<TwTimelineScrollLabels>>(\n 'TW_TIMELINE_SCROLL_LABELS',\n);\n\n/**\n * Configures the localised labels used by `tw-timeline` overflow chevrons.\n * Add to `bootstrapApplication`'s `providers` (or any feature/route provider array).\n *\n * @example\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * provideTwTimelineScrollLabels({\n * scrollPrevious: 'Vorherige Ereignisse',\n * scrollNext: 'Nächste Ereignisse',\n * }),\n * ],\n * });\n * ```\n */\nexport function provideTwTimelineScrollLabels(\n labels: Partial<TwTimelineScrollLabels>,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: TW_TIMELINE_SCROLL_LABELS, useValue: labels },\n ]);\n}\n\n// ── tv() config ──\n\nconst timelineVariants = tv(\n {\n slots: {\n // Container host.\n root: 'flex w-full',\n // Item host.\n item: 'relative flex min-w-0',\n // The marker column (vertical) or marker row (horizontal). Carries the bubble plus\n // its leading + trailing connector segments.\n markerSide: 'relative flex shrink-0',\n // The bubble itself. Color × state styling is applied via static lookup, not tv().\n marker:\n 'relative z-[1] inline-flex items-center justify-center shrink-0 rounded-full transition-[color,background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none',\n // Connector segments. Geometry comes from compound variants; color is applied via static lookup.\n connectorLeading: 'shrink-0',\n connectorTrailing: 'shrink-0',\n // Body wrapper next to the marker. min-w-0 so flex children can truncate.\n body: 'relative min-w-0 flex flex-col',\n // Opposite wrapper for align=\"alternate\" / align=\"split\". Same min-width constraints as body.\n opposite: 'min-w-0 flex flex-col',\n // Auto-number / single-glyph slot inside a circle marker.\n number: 'leading-none font-semibold',\n // Timestamp element (whether <time> or <span>).\n timestamp: 'text-fg-muted',\n },\n variants: {\n orientation: {\n vertical: {\n root: 'flex-col',\n // `items-stretch` (the flex default) lets the marker column stretch to\n // the body's full height — required for the trailing connector to\n // physically reach the next item's marker.\n item: 'flex-row',\n markerSide: 'flex-col items-center',\n },\n horizontal: {\n // `relative` anchors the absolutely-positioned chevron buttons. The\n // `overflow-x-auto` lives on the inner viewport (see template) so the\n // chevrons stay fixed against the host while content scrolls.\n root: 'flex-row items-start relative',\n // Grid-row participation: each item spans both rows of the viewport's\n // `grid-template-rows: minmax(0, 1fr) auto`. `grid-rows-subgrid`\n // inherits the parent grid's row tracks so every item's marker-side\n // lands on a shared row-2 baseline regardless of body height in row 1.\n // Without this, per-item body-height variance pushes each marker to a\n // different y-coordinate and the horizontal connector breaks across\n // item boundaries. Row placement (body → row 1, markerSide → row 2)\n // is applied via the horizontal compoundVariant below.\n item: 'grid grid-rows-subgrid row-span-2 items-center text-center',\n markerSide: 'flex-row items-center w-full',\n body: 'items-center',\n },\n },\n size: {\n // The trailing `pb-*` on body provides inter-item visual separation in\n // vertical orientation. The trailing connector lives inside the marker\n // column and stretches through this padding to touch the next item's\n // marker — items butt against each other with no container `gap-*` so\n // the line stays continuous.\n xs: { item: 'gap-3', body: 'text-xs gap-1 pb-3', timestamp: 'text-2xs', number: 'text-2xs' },\n sm: { item: 'gap-4', body: 'text-sm gap-1 pb-4', timestamp: 'text-xs', number: 'text-xs' },\n md: { item: 'gap-5', body: 'text-sm gap-1.5 pb-6', timestamp: 'text-xs', number: 'text-xs' },\n lg: { item: 'gap-6', body: 'text-sm gap-1.5 pb-8', timestamp: 'text-xs', number: 'text-sm' },\n // `xl` density holds at text-sm — `text-base` is reserved for the codified\n // tw-item lg exception and does not apply to timeline (per requirements § 4.3).\n xl: { item: 'gap-8', body: 'text-sm gap-2 pb-10', timestamp: 'text-xs', number: 'text-sm' },\n },\n marker: {\n dot: {},\n circle: {},\n },\n lineStyle: {\n solid: {},\n dashed: {\n // Dashed connectors replace the solid bg fill with a CSS border. The base\n // `connectorLeading`/`connectorTrailing` classes still apply; `bg-transparent`\n // is forced so twMerge doesn't end up with both a `bg-*` and a `border-*` fill.\n connectorLeading: 'border-dashed bg-transparent',\n connectorTrailing: 'border-dashed bg-transparent',\n },\n },\n state: {\n // The `state` axis exists in `tv()` only to control the auto-number's text\n // color step — color × state combinations on the marker itself are applied\n // via static lookup tables (Tailwind v4 cannot resolve interpolated class names).\n reached: { number: 'text-fg' },\n pending: { number: 'text-fg-muted' },\n current: { number: 'text-fg' },\n error: { number: 'text-fg' },\n },\n },\n compoundVariants: [\n // ── Horizontal item min-width per density. Values chosen so a marker\n // plus ~16–24 chars of body text fit without truncation at each step;\n // the lower bound is the diameter of the corresponding circle marker\n // (size-6 → 24px) plus a comfortable ~120px text gutter, scaling up to\n // leave room for richer descriptions at xl. Once any item's content\n // exceeds the floor the items expand naturally; the inner scroll\n // viewport handles overflow beyond the host's width.\n { orientation: 'horizontal', size: 'xs', class: { item: 'min-w-32' } },\n { orientation: 'horizontal', size: 'sm', class: { item: 'min-w-36' } },\n { orientation: 'horizontal', size: 'md', class: { item: 'min-w-40' } },\n { orientation: 'horizontal', size: 'lg', class: { item: 'min-w-44' } },\n { orientation: 'horizontal', size: 'xl', class: { item: 'min-w-48' } },\n\n // Subgrid row placement (horizontal only). Body occupies row 1 with\n // `self-end` so short bodies hang at the row's bottom edge — sitting\n // close to the marker row directly below — instead of floating at the\n // top and opening a visible gap. Marker-side occupies the shared row 2.\n {\n orientation: 'horizontal',\n class: { body: 'row-start-1 self-end', markerSide: 'row-start-2' },\n },\n\n // ── Marker geometry per size × marker variant (requirements § 4.3) ──\n // Diameter is orientation-agnostic.\n { marker: 'dot', size: 'xs', class: { marker: 'size-2' } },\n { marker: 'dot', size: 'sm', class: { marker: 'size-2.5' } },\n { marker: 'dot', size: 'md', class: { marker: 'size-3' } },\n { marker: 'dot', size: 'lg', class: { marker: 'size-3' } },\n { marker: 'dot', size: 'xl', class: { marker: 'size-3' } },\n { marker: 'circle', size: 'xs', class: { marker: 'size-6' } },\n { marker: 'circle', size: 'sm', class: { marker: 'size-7' } },\n { marker: 'circle', size: 'md', class: { marker: 'size-8' } },\n { marker: 'circle', size: 'lg', class: { marker: 'size-10' } },\n { marker: 'circle', size: 'xl', class: { marker: 'size-12' } },\n\n // Vertical-only: `mt-*` nudges the small dot down so its vertical center\n // aligns with the title's first-line optical center (text sits to the\n // side of the marker in vertical layout). Circle markers are large\n // enough that no nudge is needed — the bubble visually wraps the title's\n // first line. In horizontal layout the dot must NOT carry margin-top:\n // the marker-side is `flex-row items-center` and the connector segments\n // sit on the same vertical axis, so margin-top would push the dot below\n // the connector line.\n { orientation: 'vertical', marker: 'dot', size: 'xs', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'sm', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'md', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'lg', class: { marker: 'mt-2' } },\n { orientation: 'vertical', marker: 'dot', size: 'xl', class: { marker: 'mt-2' } },\n\n // ── Vertical connector geometry: thin line that runs through the marker column.\n // `flex-1` stretches the segment to fill the gap between adjacent markers.\n {\n orientation: 'vertical',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-px flex-1', connectorTrailing: 'w-px flex-1' },\n },\n {\n orientation: 'vertical',\n lineStyle: 'dashed',\n class: { connectorLeading: 'border-l flex-1 min-h-2', connectorTrailing: 'border-l flex-1 min-h-2' },\n },\n {\n orientation: 'vertical',\n size: 'lg',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-0.5', connectorTrailing: 'w-0.5' },\n },\n {\n orientation: 'vertical',\n size: 'xl',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-0.5', connectorTrailing: 'w-0.5' },\n },\n\n // ── Horizontal connector geometry ──\n {\n orientation: 'horizontal',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-px flex-1', connectorTrailing: 'h-px flex-1' },\n },\n {\n orientation: 'horizontal',\n lineStyle: 'dashed',\n class: { connectorLeading: 'border-t flex-1 min-w-2', connectorTrailing: 'border-t flex-1 min-w-2' },\n },\n {\n orientation: 'horizontal',\n size: 'lg',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-0.5', connectorTrailing: 'h-0.5' },\n },\n {\n orientation: 'horizontal',\n size: 'xl',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-0.5', connectorTrailing: 'h-0.5' },\n },\n ],\n defaultVariants: {\n orientation: 'vertical',\n size: 'md',\n marker: 'dot',\n state: 'reached',\n lineStyle: 'solid',\n },\n },\n { twMerge: true },\n);\n\n// ── Static color × state class lookups ──\n// Tailwind v4 only resolves statically-written class names. Per the stepper\n// precedent (`INDICATOR_ACTIVE`, `INDICATOR_COMPLETED`, `CONNECTOR_REACHED`),\n// all color × state combinations are enumerated as exhaustive maps.\n\nconst MARKER_PENDING = 'bg-surface border-2 border-border text-fg-muted';\nconst MARKER_ERROR =\n 'bg-error-solid text-error-solid-fg border border-error-border-strong';\n\nconst MARKER_REACHED: 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 MARKER_CURRENT: Record<TwColor, string> = {\n primary:\n 'bg-primary-solid text-primary-solid-fg border border-primary-border-strong ring-4 ring-primary-soft',\n secondary:\n 'bg-secondary-solid text-secondary-solid-fg border border-secondary-border-strong ring-4 ring-secondary-soft',\n accent:\n 'bg-accent-solid text-accent-solid-fg border border-accent-border-strong ring-4 ring-accent-soft',\n neutral:\n '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:\n 'bg-success-solid text-success-solid-fg border border-success-border-strong ring-4 ring-success-soft',\n warning:\n '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\n// When marker='circle' AND a `[twTimelineMarker]` slot is projected, the bubble\n// switches to a SOFT background so the projected glyph/avatar reads against a\n// tinted surface rather than competing with a solid fill.\nconst MARKER_REACHED_SOFT: Record<TwColor, string> = {\n primary: 'bg-primary-soft text-primary-fg border border-primary-border-strong',\n secondary: 'bg-secondary-soft text-secondary-fg border border-secondary-border-strong',\n accent: 'bg-accent-soft text-accent-fg border border-accent-border-strong',\n neutral: 'bg-surface-muted text-fg border border-border',\n info: 'bg-info-soft text-info-fg border border-info-border-strong',\n success: 'bg-success-soft text-success-fg border border-success-border-strong',\n warning: 'bg-warning-soft text-warning-fg border border-warning-border-strong',\n error: 'bg-error-soft text-error-fg border border-error-border-strong',\n};\n\nconst MARKER_CURRENT_SOFT: Record<TwColor, string> = {\n primary:\n 'bg-primary-soft text-primary-fg border border-primary-border-strong ring-4 ring-primary-soft',\n secondary:\n 'bg-secondary-soft text-secondary-fg border border-secondary-border-strong ring-4 ring-secondary-soft',\n accent:\n 'bg-accent-soft text-accent-fg border border-accent-border-strong ring-4 ring-accent-soft',\n neutral: 'bg-surface-muted text-fg border border-border ring-4 ring-border',\n info: 'bg-info-soft text-info-fg border border-info-border-strong ring-4 ring-info-soft',\n success:\n 'bg-success-soft text-success-fg border border-success-border-strong ring-4 ring-success-soft',\n warning:\n 'bg-warning-soft text-warning-fg border border-warning-border-strong ring-4 ring-warning-soft',\n error: 'bg-error-soft text-error-fg border border-error-border-strong ring-4 ring-error-soft',\n};\n\n// ── Connector color ──\n// The trailing connector takes its color from the item the connector leaves;\n// the leading connector takes its color from the *previous* item so a single\n// physical line between two items reads as one consistent color.\n\nconst CONNECTOR_DEFAULT = 'bg-border';\nconst CONNECTOR_ERROR = 'bg-error-border-strong';\nconst CONNECTOR_DASHED_DEFAULT = 'border-border';\nconst CONNECTOR_DASHED_ERROR = 'border-error-border-strong';\n\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\nconst CONNECTOR_DASHED_REACHED: Record<TwColor, string> = {\n primary: 'border-primary-border-strong',\n secondary: 'border-secondary-border-strong',\n accent: 'border-accent-border-strong',\n neutral: 'border-neutral-border-strong',\n info: 'border-info-border-strong',\n success: 'border-success-border-strong',\n warning: 'border-warning-border-strong',\n error: 'border-error-border-strong',\n};\n\nfunction resolveMarkerClasses(\n state: TimelineState,\n color: TwColor,\n hasMarkerSlot: boolean,\n): string {\n switch (state) {\n case 'pending':\n return MARKER_PENDING;\n case 'error':\n return MARKER_ERROR;\n case 'reached':\n return hasMarkerSlot ? MARKER_REACHED_SOFT[color] : MARKER_REACHED[color];\n case 'current':\n return hasMarkerSlot ? MARKER_CURRENT_SOFT[color] : MARKER_CURRENT[color];\n }\n}\n\nfunction resolveConnectorClasses(\n state: TimelineState,\n color: TwColor,\n lineStyle: TimelineLineStyle,\n): string {\n // 'current' and 'pending' both render the neutral default — a connector that\n // leaves a 'current' item points into territory that has not been reached yet.\n if (lineStyle === 'dashed') {\n if (state === 'error') return CONNECTOR_DASHED_ERROR;\n if (state === 'reached') return CONNECTOR_DASHED_REACHED[color];\n return CONNECTOR_DASHED_DEFAULT;\n }\n if (state === 'error') return CONNECTOR_ERROR;\n if (state === 'reached') return CONNECTOR_REACHED[color];\n return CONNECTOR_DEFAULT;\n}\n\n// ── Horizontal viewport class string ──\n// CSS grid (not flex-row): rows are minmax(0, 1fr) / auto. Row 1 absorbs every\n// item's body, row 2 carries the marker-side. Items participate via\n// `grid-rows-subgrid row-span-2`, so every marker lands on a shared row-2\n// baseline regardless of body-height variance — fixing the prior flex layout\n// where shorter bodies pushed their marker bubble off the connector row.\n//\n// `auto-cols-max` is load-bearing: columns size to max-content so the grid's\n// scrollWidth can exceed clientWidth and the chevron-overflow contract\n// (docs/prompts/tw-timeline-horizontal-overflow.md) keeps working. DO NOT\n// switch to `auto-cols-fr` or `auto-cols-[1fr]` — those collapse scrollWidth\n// to clientWidth, the overflow check fails permanently, and the chevrons\n// never enable. The per-density min-w-* on each item still establishes the\n// floor.\nconst HORIZONTAL_VIEWPORT_CLASSES =\n 'tw-scrollbar-none grid grid-flow-col auto-cols-max ' +\n '[grid-template-rows:minmax(0,1fr)_auto] ' +\n 'overflow-x-auto scroll-smooth motion-reduce:scroll-auto w-full';\n\n// ── Chevron button class string ──\n// Shared by both overflow chevron buttons. Positioned absolutely against the\n// timeline host (which carries `relative` in horizontal orientation via the\n// tv() config) so `left-0` / `right-0` anchor correctly.\n// `top-1/2 -translate-y-1/2` centres the button vertically — a pragmatic\n// approximation for the canonical horizontal layout where the marker row sits\n// roughly mid-host. `size-8` matches the canonical \"square interactive target\"\n// md size; the inner chevron glyph is `size-4` (glyph-icon sub-scale).\n// The disabled hover overrides suppress the hover state when disabled, otherwise\n// twMerge would unify them.\nconst CHEVRON_CLASSES =\n 'absolute top-1/2 -translate-y-1/2 z-10 inline-flex items-center justify-center ' +\n 'size-8 rounded-full bg-surface-raised border border-border shadow-sm ' +\n 'text-fg-muted hover:text-fg hover:bg-surface-muted ' +\n 'transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 ' +\n 'disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-surface-raised disabled:hover:text-fg-muted';\n\n// ── Slot directives ──\n\n/**\n * Marker-slot directive. Apply on any element projected inside a `<tw-timeline-item>`\n * to render that element inside the marker bubble (only when `marker=\"circle\"`).\n *\n * @example\n * ```html\n * <tw-timeline-item marker=\"circle\" color=\"success\">\n * <tw-icon twTimelineMarker name=\"check\" />\n * <p class=\"text-sm\">Done</p>\n * </tw-timeline-item>\n * ```\n */\n@Directive({\n selector: '[twTimelineMarker]',\n})\nexport class TimelineMarkerDirective {}\n\n/**\n * Timestamp-slot directive. Replaces the rendered `timestamp` / `dateTime`\n * output. Use for relative-time components (\"2 hours ago\").\n */\n@Directive({\n selector: '[twTimelineTimestamp]',\n})\nexport class TimelineTimestampDirective {}\n\n/**\n * Opposite-slot directive. Renders on the side opposite the body in\n * `align=\"alternate\"` / `align=\"split\"` (vertical orientation only).\n */\n@Directive({\n selector: '[twTimelineOpposite]',\n})\nexport class TimelineOppositeDirective {}\n\n// ── TimelineComponent ──\n\n/**\n * Presentational chronological-sequence layout primitive. Renders a list of\n * `<tw-timeline-item>` children connected by a line that runs through their\n * markers. The container owns orientation, alignment, density, and line-style\n * decisions; items style their own marker, state, and connector colors.\n *\n * **Not interactive.** Unlike `tw-stepper`, the timeline does not install a\n * keyboard map, does not own panels, does not trap focus, and item hosts are\n * not focusable. Consumers needing row-level activation project an\n * interactive primitive (`<tw-item interactive>`, `<button>`, an anchor) inside\n * the default slot.\n */\n@Component({\n selector: 'tw-timeline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n role: 'list',\n '[class]': 'rootClasses()',\n '[attr.aria-orientation]':\n 'orientation() === \"horizontal\" ? \"horizontal\" : null',\n },\n // The projected items live inside a single `<ng-template #itemsTpl>` and are\n // outletted into either the horizontal viewport or the vertical pass-through.\n // Placing two `<ng-content />` slots directly inside `@if/@else` would drop\n // the projection — Angular resolves content projection at component creation\n // and only the first matching slot fills, even if the `@if` flips later.\n // Wrapping in an `<ng-template>` defers the `<ng-content />` materialisation\n // to the outlet's view-instantiation, which works correctly across flips.\n template: `\n <ng-template #itemsTpl>\n <ng-content />\n </ng-template>\n\n @if (orientation() === 'horizontal') {\n <button\n type=\"button\"\n [class]=\"prevChevronClasses()\"\n [attr.aria-label]=\"scrollLabels().scrollPrevious\"\n [attr.aria-hidden]=\"_prevButtonHidden() ? 'true' : null\"\n [disabled]=\"_prevButtonDisabled()\"\n (click)=\"_scrollPrev()\"\n >\n @if (_isRtl()) {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n } @else {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n }\n </button>\n <div\n #scrollViewport\n [class]=\"horizontalViewportClasses\"\n (scroll)=\"_onScroll()\"\n >\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" />\n </div>\n <button\n type=\"button\"\n [class]=\"nextChevronClasses()\"\n [attr.aria-label]=\"scrollLabels().scrollNext\"\n [attr.aria-hidden]=\"_nextButtonHidden() ? 'true' : null\"\n [disabled]=\"_nextButtonDisabled()\"\n (click)=\"_scrollNext()\"\n >\n @if (_isRtl()) {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n } @else {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n }\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" />\n }\n `,\n})\nexport class TimelineComponent {\n /** Axis along which items are laid out. `'vertical'` stacks items top-to-bottom; `'horizontal'` lays them out left-to-right (RTL-aware). Defaults to `'vertical'`. */\n readonly orientation = input<TwOrientation>('vertical');\n\n /** Vertical layout strategy. `'left'` / `'right'` place the marker on that side; `'alternate'` centers the marker and flips the body left ↔ right per item; `'split'` centers the marker with body on the right and the opposite slot on the left. Ignored when orientation is `'horizontal'`. Defaults to `'left'`. */\n readonly align = input<TimelineAlign>('left');\n\n /** Density and typography scale. Controls marker diameter, gap between items, and body typography step. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Connector line style applied to every gap between items. Defaults to `'solid'`. */\n readonly lineStyle = input<TimelineLineStyle>('solid');\n\n /**\n * Visibility policy for the horizontal-overflow chevron buttons. `'auto'`\n * shows them only when the inner scroll region can scroll in that direction;\n * `'always'` renders both regardless of scroll state (disabled when at an\n * edge); `'never'` hides them entirely (consumer manages overflow\n * externally). Ignored when orientation is `'vertical'`. Defaults to\n * `'auto'`.\n *\n * Counts as the 5th container input, justified by the \"Overflow-control axis\n * on layout primitives\" cap exception: a layout primitive whose primary axes\n * (orientation, alignment, size, line/style) already saturate ≤ 4 inputs MAY\n * add a single additional input that toggles overflow-navigation\n * affordances when overflow is a real concern for at least one axis value.\n * The added input MUST be a single tri-state and MUST be inert on axis\n * values where overflow cannot occur (here: `orientation === 'vertical'`).\n */\n readonly scrollControls = input<TimelineScrollControls>('auto');\n\n /** @internal Static class string for the horizontal scroll viewport — see `HORIZONTAL_VIEWPORT_CLASSES`. */\n protected readonly horizontalViewportClasses = HORIZONTAL_VIEWPORT_CLASSES;\n\n /** @internal Projected `tw-timeline-item` children in DOM order. */\n readonly items = contentChildren(TimelineItemComponent, { descendants: false });\n\n // ── Horizontal scroll / chevron wiring ──\n\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _directionality = inject(Directionality, { optional: true });\n private readonly _viewportRef = viewChild<ElementRef<HTMLDivElement>>('scrollViewport');\n private readonly _scrollLabelsOverride = inject(TW_TIMELINE_SCROLL_LABELS, {\n optional: true,\n });\n\n /** @internal Live `dir` from CDK `Directionality`. */\n private readonly _cdkDir = signal<'ltr' | 'rtl'>(this._directionality?.value ?? 'ltr');\n\n /** @internal True when the host renders inside a `dir=\"rtl\"` ancestor. */\n readonly _isRtl = computed(() => this._cdkDir() === 'rtl');\n\n /**\n * @internal Defaults to `false` until the first measurement runs in\n * `afterNextRender`. This avoids a one-frame \"enabled-then-disabled\" flash\n * where the buttons appear live before the scroll state has been read.\n */\n readonly _canScrollPrev = signal(false);\n readonly _canScrollNext = signal(false);\n\n /** @internal Resolved label record. Falls back to English defaults for any missing key. */\n readonly scrollLabels = computed<TwTimelineScrollLabels>(() => ({\n ...DEFAULT_TW_TIMELINE_SCROLL_LABELS,\n ...(this._scrollLabelsOverride ?? {}),\n }));\n\n /** @internal True when the prev button should be aria-hidden + visually suppressed. */\n readonly _prevButtonHidden = computed(() => {\n const policy = this.scrollControls();\n if (policy === 'never') return true;\n if (policy === 'always') return false;\n return !this._canScrollPrev();\n });\n\n /** @internal True when the next button should be aria-hidden + visually suppressed. */\n readonly _nextButtonHidden = computed(() => {\n const policy = this.scrollControls();\n if (policy === 'never') return true;\n if (policy === 'always') return false;\n return !this._canScrollNext();\n });\n\n /** @internal Native `disabled` attribute. Always true for hidden buttons (defensive); also true for `'always'` policy when can't scroll. */\n readonly _prevButtonDisabled = computed(\n () => this._prevButtonHidden() || !this._canScrollPrev(),\n );\n readonly _nextButtonDisabled = computed(\n () => this._nextButtonHidden() || !this._canScrollNext(),\n );\n\n /**\n * @internal Final class string for the prev chevron — combines the shared\n * `CHEVRON_CLASSES`, the directional anchor (`left-0` in LTR, `right-0` in\n * RTL), and the visibility variant driven by `scrollControls`.\n */\n readonly prevChevronClasses = computed(() => this._chevronClasses('prev'));\n readonly nextChevronClasses = computed(() => this._chevronClasses('next'));\n\n private _chevronClasses(side: 'prev' | 'next'): string {\n const isRtl = this._isRtl();\n // In LTR the prev arrow anchors to the host's left, next to the right.\n // RTL flips: prev anchors right, next anchors left. The arrow glyph also\n // flips (handled in the template).\n const anchor =\n side === 'prev' ? (isRtl ? 'right-0' : 'left-0') : isRtl ? 'left-0' : 'right-0';\n const policy = this.scrollControls();\n const hidden = side === 'prev' ? this._prevButtonHidden() : this._nextButtonHidden();\n // `'never'` → wholly hidden (no layout space, ignored by AT).\n // `'auto'` + can't scroll that way → invisible but still occupies space\n // (prevents the chevron from popping into view and shifting layout when\n // scroll becomes possible mid-interaction).\n // `'always'` → always visible; native `disabled` styling handles edges.\n let visibility = '';\n if (policy === 'never') visibility = 'hidden';\n else if (policy === 'auto' && hidden) visibility = 'invisible';\n return `${CHEVRON_CLASSES} ${anchor} ${visibility}`.trim();\n }\n\n private _resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n // The viewport materialises on the first frame after horizontal\n // orientation is committed; afterNextRender hooks into that point.\n afterNextRender(() => this._setupScrollDetection());\n\n this._destroyRef.onDestroy(() => {\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n });\n\n if (this._directionality) {\n const sub = this._directionality.change.subscribe((value) => {\n this._cdkDir.set(value);\n });\n this._destroyRef.onDestroy(() => sub.unsubscribe());\n }\n }\n\n private _setupScrollDetection(): void {\n // Vertical orientation never renders the viewport — nothing to do.\n if (this.orientation() !== 'horizontal') return;\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n\n this._updateScrollState();\n\n // ResizeObserver fires when items are appended/removed (the viewport's\n // scrollWidth changes), so a separate items-change effect is not needed.\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => this._updateScrollState());\n this._resizeObserver.observe(el);\n }\n }\n\n /** @internal Wired to the viewport's `(scroll)` event. */\n _onScroll(): void {\n this._updateScrollState();\n }\n\n private _updateScrollState(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n // `> 1` thresholds handle sub-pixel scroll positions on retina displays —\n // smooth-scroll landings can settle at scrollLeft = 0.5 and would flicker\n // an enabled/disabled boundary without the guard.\n this._canScrollPrev.set(el.scrollLeft > 1);\n this._canScrollNext.set(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }\n\n /** Page-scroll amount: 75% of the visible width, leaving ~25% overlap for context. */\n private _pageScrollAmount(): number {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return 0;\n return Math.floor(el.clientWidth * 0.75);\n }\n\n /** @internal Click handler for the prev chevron. */\n _scrollPrev(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n // In RTL \"previous\" (the visual left button) maps to a positive scrollLeft\n // delta; in LTR it's a negative delta toward 0.\n const direction = this._isRtl() ? 1 : -1;\n el.scrollBy({ left: direction * this._pageScrollAmount(), behavior: 'smooth' });\n }\n\n /** @internal Click handler for the next chevron. */\n _scrollNext(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n const direction = this._isRtl() ? -1 : 1;\n el.scrollBy({ left: direction * this._pageScrollAmount(), behavior: 'smooth' });\n }\n\n private readonly variantResult = computed(() =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n\n /** @internal Item slot classes shared with `TimelineItemComponent`. */\n readonly itemSlotClasses = computed(() => this.variantResult().item());\n readonly markerSideSlotClasses = computed(() => this.variantResult().markerSide());\n readonly markerSlotClasses = computed(() => this.variantResult().marker());\n readonly connectorLeadingSlotClasses = computed(() =>\n this.variantResult().connectorLeading(),\n );\n readonly connectorTrailingSlotClasses = computed(() =>\n this.variantResult().connectorTrailing(),\n );\n readonly bodySlotClasses = computed(() => this.variantResult().body());\n readonly oppositeSlotClasses = computed(() => this.variantResult().opposite());\n readonly numberSlotClasses = computed(() => this.variantResult().number());\n readonly timestampSlotClasses = computed(() => this.variantResult().timestamp());\n\n /** @internal Variant builder reused by items so per-item state can recompose without rebuilding the base tv() result. */\n readonly itemMarkerVariant = (\n state: TimelineState,\n marker: TimelineMarker,\n ): string =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n marker,\n state,\n }).marker();\n\n /** @internal Variant builder for the auto-number slot (state drives text color). */\n readonly itemNumberVariant = (state: TimelineState): string =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n state,\n }).number();\n}\n\n// ── TimelineItemComponent ──\n\n/**\n * A single event in a `tw-timeline`. Renders a marker (dot or circle) plus\n * content. Connectors leading into and out of the marker are emitted by this\n * component and conditionally elided when the item is first or last in the\n * timeline. The item is not focusable — row activation belongs to projected\n * interactive children.\n */\n@Component({\n selector: 'tw-timeline-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'listitem',\n '[class]': 'itemClasses()',\n '[attr.aria-current]': 'state() === \"current\" ? \"step\" : null',\n '[animate.enter]': 'enterAnimationClass()',\n },\n template: `\n <div [class]=\"markerSideClasses()\">\n @if (renderLeadingConnector()) {\n <span [class]=\"leadingConnectorClasses()\" aria-hidden=\"true\"></span>\n }\n <div [class]=\"markerClasses()\" aria-hidden=\"true\">\n @if (marker() === 'circle') {\n @if (hasMarkerSlot()) {\n <ng-content select=\"[twTimelineMarker]\" />\n } @else if (state() === 'error') {\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 } @else {\n <span [class]=\"numberClasses()\">{{ index() + 1 }}</span>\n }\n }\n </div>\n @if (renderTrailingConnector()) {\n <span [class]=\"trailingConnectorClasses()\" aria-hidden=\"true\"></span>\n }\n </div>\n <div [class]=\"bodyClasses()\">\n @if (stateLabel(); as label) {\n <span class=\"sr-only\">{{ label }}</span>\n }\n <ng-content />\n @if (hasTimestampSlot()) {\n <ng-content select=\"[twTimelineTimestamp]\" />\n } @else if (timestamp() !== null) {\n @let dt = resolvedDateTime();\n @if (dt !== null) {\n <time [attr.datetime]=\"dt\" [class]=\"timestampClasses()\">{{ formattedTimestamp() }}</time>\n } @else {\n <span [class]=\"timestampClasses()\">{{ formattedTimestamp() }}</span>\n }\n }\n </div>\n @if (hasOppositeColumn()) {\n <div [class]=\"oppositeClasses()\">\n <ng-content select=\"[twTimelineOpposite]\" />\n </div>\n }\n `,\n})\nexport class TimelineItemComponent implements AfterContentInit {\n /** Semantic color for the marker fill and the trailing connector when the item is in a reached state. Ignored when state is `'error'` (which forces the error palette). Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Marker geometry. `'dot'` is a small filled circle. `'circle'` is a larger ring that may contain a projected icon, avatar, or an auto-computed 1-based index. Defaults to `'dot'`. */\n readonly marker = input<TimelineMarker>('dot');\n\n /** Semantic state of the event. Drives marker fill, ring, and trailing-connector color, and applies `aria-current=\"step\"` when `'current'`. Defaults to `'reached'`. */\n readonly state = input<TimelineState>('reached');\n\n /** Timestamp shown in the timestamp slot. A `Date` is formatted via `Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' })`; a string is rendered verbatim; `null` omits the timestamp element. Overridden by projected `[twTimelineTimestamp]` content when present. Defaults to `null`. */\n readonly timestamp = input<string | Date | null>(null);\n\n /** Machine-readable ISO 8601 datetime for the rendered `<time datetime=\"…\">` attribute. Derived from `timestamp` when it is a `Date` and this input is `null`; required (explicit) when `timestamp` is a string and machine-readability is desired. When `null` with a string timestamp, the timestamp renders as a `<span>` instead. Defaults to `null`. */\n readonly dateTime = input<string | null>(null);\n\n /** @internal Direct parent timeline. A `tw-timeline-item` outside a `tw-timeline` is a programmer error — the DI failure throws naturally. */\n readonly timeline = inject(TimelineComponent);\n\n /** @internal */\n readonly markerSlot = contentChild(TimelineMarkerDirective);\n /** @internal */\n readonly timestampSlot = contentChild(TimelineTimestampDirective);\n /** @internal */\n readonly oppositeSlot = contentChild(TimelineOppositeDirective);\n\n readonly hasMarkerSlot = computed(() => !!this.markerSlot());\n readonly hasTimestampSlot = computed(() => !!this.timestampSlot());\n readonly hasOppositeSlot = computed(() => !!this.oppositeSlot());\n\n /** @internal 0-based index in the parent timeline's content. -1 until contentChildren materialises. */\n readonly index = computed(() => this.timeline.items().indexOf(this));\n\n readonly isFirst = computed(() => this.index() === 0);\n\n readonly isLast = computed(() => {\n const idx = this.index();\n if (idx < 0) return false;\n return idx === this.timeline.items().length - 1;\n });\n\n /**\n * Leading-connector visibility. In vertical orientation the marker sits at\n * the top of the body and only the trailing segment is rendered. In\n * horizontal orientation the marker must stay centered in its row even at\n * the ends of the timeline, so the leading segment is always rendered — as a\n * coloured line for non-first items, as an invisible spacer for the first.\n */\n readonly renderLeadingConnector = computed(\n () => this.timeline.orientation() === 'horizontal',\n );\n\n /**\n * Trailing-connector visibility. Rendered for every item in horizontal\n * orientation (as a spacer on the last item) so all markers stay centered.\n * In vertical orientation it is suppressed on the last item — the timeline\n * ends with the marker, no trailing segment.\n */\n readonly renderTrailingConnector = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return true;\n return !this.isLast();\n });\n\n /** @internal `error` state forces the error palette regardless of the color input. */\n readonly resolvedColor = computed<TwColor>(() =>\n this.state() === 'error' ? 'error' : this.color(),\n );\n\n /** @internal Previous item's state (drives the leading connector color so a line between two items reads as one color). */\n readonly previousState = computed<TimelineState>(() => {\n const idx = this.index();\n if (idx <= 0) return 'reached';\n const prev = this.timeline.items()[idx - 1];\n return prev.state();\n });\n\n /** @internal Previous item's resolved color, for the same reason as `previousState`. */\n readonly previousColor = computed<TwColor>(() => {\n const idx = this.index();\n if (idx <= 0) return 'primary';\n const prev = this.timeline.items()[idx - 1];\n return prev.resolvedColor();\n });\n\n readonly stateLabel = computed<string | null>(() => {\n switch (this.state()) {\n case 'pending':\n return 'Pending: ';\n case 'current':\n return 'Current: ';\n case 'error':\n return 'Error: ';\n default:\n return null;\n }\n });\n\n readonly formattedTimestamp = computed<string>(() => {\n const ts = this.timestamp();\n if (ts === null) return '';\n if (ts instanceof Date) {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(ts);\n }\n return ts;\n });\n\n readonly resolvedDateTime = computed<string | null>(() => {\n const dt = this.dateTime();\n if (dt !== null) return dt;\n const ts = this.timestamp();\n if (ts instanceof Date) return ts.toISOString();\n return null;\n });\n\n /** @internal True when the layout needs a third (opposite) column. */\n readonly hasOppositeColumn = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return false;\n const align = this.timeline.align();\n return align === 'alternate' || align === 'split';\n });\n\n /** @internal Order of the marker side wrapper. Always center column (2) in three-column layouts; in two-column vertical layouts the order varies. Horizontal layouts use CSS grid placement (`row-start-*`) instead, so flex-order utilities are noise — return ''. */\n private readonly markerOrderClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n const align = this.timeline.align();\n if (this.hasOppositeColumn()) return 'order-2';\n if (align === 'right') return 'order-2';\n return 'order-1';\n });\n\n /** @internal Order of the body wrapper. Alternate flips body left/right per item. Horizontal layouts use CSS grid placement (`row-start-*`) instead, so flex-order utilities are noise — return ''. */\n private readonly bodyOrderClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n const align = this.timeline.align();\n if (align === 'right') return 'order-1';\n if (align === 'alternate' && this.index() % 2 === 1) return 'order-1';\n if (this.hasOppositeColumn()) return 'order-3';\n return 'order-2';\n });\n\n /** @internal Order of the opposite wrapper. Always left of the marker except on odd-indexed alternate items. */\n private readonly oppositeOrderClass = computed(() => {\n const align = this.timeline.align();\n if (align === 'alternate' && this.index() % 2 === 1) return 'order-3';\n return 'order-1';\n });\n\n /** @internal Width affordance for the marker side. Vertical needs a fixed-ish column; horizontal needs to span the row. */\n private readonly markerSideSizeClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n // Pin the column to the marker's own width so siblings stay aligned even\n // when items render slightly different bubble content.\n switch (this.timeline.size()) {\n case 'xs':\n return 'w-6';\n case 'sm':\n return 'w-7';\n case 'md':\n return 'w-8';\n case 'lg':\n return 'w-10';\n case 'xl':\n return 'w-12';\n }\n });\n\n /** @internal Width affordance for the body in alternate/split layouts so the marker stays centered. */\n private readonly bodyFlexClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n if (this.hasOppositeColumn()) return 'flex-1';\n return 'flex-1';\n });\n\n /** @internal Width affordance for the opposite column (mirrors the body to keep the marker centered). */\n private readonly oppositeFlexClass = computed(() => 'flex-1');\n\n // ── Composed class outputs ──\n\n readonly itemClasses = computed(() => this.timeline.itemSlotClasses());\n\n readonly markerSideClasses = computed(\n () =>\n `${this.timeline.markerSideSlotClasses()} ${this.markerSideSizeClass()} ${this.markerOrderClass()}`,\n );\n\n readonly markerClasses = computed(\n () =>\n `${this.timeline.itemMarkerVariant(this.state(), this.marker())} ${resolveMarkerClasses(\n this.state(),\n this.resolvedColor(),\n this.hasMarkerSlot(),\n )}`,\n );\n\n readonly leadingConnectorClasses = computed(() => {\n const base = this.timeline.connectorLeadingSlotClasses();\n // The first horizontal item gets an invisible spacer — same geometry,\n // no colour fill — so the marker still anchors to the row's centre.\n if (this.isFirst()) return base;\n return `${base} ${resolveConnectorClasses(\n this.previousState(),\n this.previousColor(),\n this.timeline.lineStyle(),\n )}`;\n });\n\n readonly trailingConnectorClasses = computed(() => {\n const base = this.timeline.connectorTrailingSlotClasses();\n // The last horizontal item also gets an invisible spacer; in vertical\n // orientation the trailing connector is not rendered at all for the last\n // item (the marker sits at the body top, nothing to bridge below).\n if (this.isLast() && this.timeline.orientation() === 'horizontal') {\n return base;\n }\n return `${base} ${resolveConnectorClasses(\n this.state(),\n this.resolvedColor(),\n this.timeline.lineStyle(),\n )}`;\n });\n\n readonly bodyClasses = computed(() => {\n const base = `${this.timeline.bodySlotClasses()} ${this.bodyFlexClass()} ${this.bodyOrderClass()}`;\n // The per-size `pb-*` on the body slot exists only to space adjacent\n // vertical items. Horizontal layouts and the final vertical item don't\n // need it — strip with `!pb-0` so the trailing tone wins (twMerge keeps\n // the last padding-bottom utility and `!` settles tied specificity).\n if (this.timeline.orientation() === 'horizontal') {\n return `${base} !pb-0`;\n }\n if (this.isLast()) {\n return `${base} !pb-0`;\n }\n return base;\n });\n\n readonly oppositeClasses = computed(\n () =>\n `${this.timeline.oppositeSlotClasses()} ${this.oppositeFlexClass()} ${this.oppositeOrderClass()}`,\n );\n\n readonly numberClasses = computed(() => this.timeline.itemNumberVariant(this.state()));\n\n readonly timestampClasses = computed(() => this.timeline.timestampSlotClasses());\n\n readonly enterAnimationClass = computed(() =>\n this.timeline.orientation() === 'horizontal'\n ? 'timeline-item-enter-horizontal'\n : 'timeline-item-enter',\n );\n\n ngAfterContentInit(): void {\n // One-shot dev warning when a [twTimelineMarker] slot is projected onto a\n // marker=\"dot\" item. Runs in ngAfterContentInit because contentChild signals\n // are not yet populated during ngOnInit. Not an effect — the warning should\n // fire once at mount, not re-fire on every input change. Production builds\n // skip the warning entirely because ngDevMode is statically `false`.\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (this.marker() === 'dot' && this.hasMarkerSlot()) {\n console.warn(\n '[tw-timeline-item] [twTimelineMarker] content is ignored when marker=\"dot\". ' +\n 'Set marker=\"circle\" to render projected marker content.',\n );\n }\n }\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-timeline.mjs","sources":["../../../projects/ngx-tw/timeline/timeline.ts","../../../projects/ngx-tw/timeline/cdevhub-ngx-tw-timeline.ts"],"sourcesContent":["import {\n type AfterContentInit,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n type ElementRef,\n type EnvironmentProviders,\n inject,\n InjectionToken,\n input,\n makeEnvironmentProviders,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { tv } from 'tailwind-variants';\nimport type { TwColor, TwOrientation, TwSize } from '@cdevhub/ngx-tw/core';\n\n// `ngDevMode` is a globalThis flag set by Angular's build tooling — true in dev,\n// `false` in production builds. The `typeof` guard keeps the warning path safe\n// in environments (SSR, ad-hoc test harnesses) where the global is undeclared.\ndeclare const ngDevMode: boolean | undefined;\n\n/** Marker geometry of a `tw-timeline-item`. */\nexport type TimelineMarker = 'dot' | 'circle';\n\n/** Semantic state of a `tw-timeline-item`. Drives marker fill, ring, and trailing-connector color. */\nexport type TimelineState = 'reached' | 'pending' | 'current' | 'error';\n\n/** Vertical layout strategy of a `tw-timeline`. Ignored for `orientation: 'horizontal'`. */\nexport type TimelineAlign = 'left' | 'right' | 'alternate' | 'split';\n\n/** Connector line style. */\nexport type TimelineLineStyle = 'solid' | 'dashed';\n\n/** Visibility policy for the horizontal-overflow chevron buttons. */\nexport type TimelineScrollControls = 'auto' | 'always' | 'never';\n\n/**\n * Localisable labels for the horizontal-overflow chevron buttons on\n * `tw-timeline`.\n *\n * Every member is optional. This interface only ever reaches consumers through\n * `provideTwTimelineScrollLabels(labels: Partial<TwTimelineScrollLabels>)`, and\n * unset keys fall back to {@link DEFAULT_TW_TIMELINE_SCROLL_LABELS} — so a\n * consumer who annotates a complete literal must not be forced to restate keys\n * they do not override, and adding a label in a future minor must not break\n * them on a non-major release. `scrollRegion` was already optional for exactly\n * this reason when it was added after the interface shipped; making the other\n * two optional is the structural version of the same fix, so the next added\n * label does not reproduce the break.\n */\nexport interface TwTimelineScrollLabels {\n /** Accessible label for the previous-scroll chevron. Used as `aria-label`. Defaults to `'Scroll to previous events'`. */\n scrollPrevious?: string;\n /** Accessible label for the next-scroll chevron. Used as `aria-label`. Defaults to `'Scroll to next events'`. */\n scrollNext?: string;\n /** Accessible label for the horizontal scroll viewport, which is a keyboard-focusable scrollable region. Defaults to `'Timeline events'`. */\n scrollRegion?: string;\n}\n\n/**\n * Default English labels used when `TW_TIMELINE_SCROLL_LABELS` is not provided.\n * Typed `Required<TwTimelineScrollLabels>` so readers keep a non-optional\n * `string` for every key even though the interface itself is all-optional.\n */\nexport const DEFAULT_TW_TIMELINE_SCROLL_LABELS: Required<TwTimelineScrollLabels> = {\n scrollPrevious: 'Scroll to previous events',\n scrollNext: 'Scroll to next events',\n scrollRegion: 'Timeline events',\n};\n\n/**\n * Injection token carrying localisable `aria-label` strings for the timeline's\n * horizontal-overflow affordances — the prev/next chevron buttons and the\n * scrollable viewport between them. They do not affect any other rendered text.\n *\n * Provide via `provideTwTimelineScrollLabels({ ... })` at the root or feature level.\n * If both keys are present they override the English defaults; if only one is present\n * the other falls back to the English default.\n *\n * First concrete token under the `TW_TIMELINE_I18N` reservation in\n * `docs/requirements/timeline.requirements.md` § 11.2.\n */\nexport const TW_TIMELINE_SCROLL_LABELS = new InjectionToken<Partial<TwTimelineScrollLabels>>(\n 'TW_TIMELINE_SCROLL_LABELS',\n);\n\n/**\n * Configures the localised labels used by `tw-timeline` overflow chevrons.\n * Add to `bootstrapApplication`'s `providers` (or any feature/route provider array).\n *\n * @example\n * ```ts\n * bootstrapApplication(App, {\n * providers: [\n * provideTwTimelineScrollLabels({\n * scrollPrevious: 'Vorherige Ereignisse',\n * scrollNext: 'Nächste Ereignisse',\n * }),\n * ],\n * });\n * ```\n */\nexport function provideTwTimelineScrollLabels(\n labels: Partial<TwTimelineScrollLabels>,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: TW_TIMELINE_SCROLL_LABELS, useValue: labels },\n ]);\n}\n\n// ── tv() config ──\n\nconst timelineVariants = tv(\n {\n slots: {\n // Container host.\n root: 'flex w-full',\n // Item host.\n item: 'relative flex min-w-0',\n // The marker column (vertical) or marker row (horizontal). Carries the bubble plus\n // its leading + trailing connector segments.\n markerSide: 'relative flex shrink-0',\n // The bubble itself. Color × state styling is applied via static lookup, not tv().\n marker:\n 'relative z-[1] inline-flex items-center justify-center shrink-0 rounded-full transition-[color,background-color,border-color,box-shadow] duration-200 motion-reduce:transition-none',\n // Connector segments. Geometry comes from compound variants; color is applied via static lookup.\n connectorLeading: 'shrink-0',\n connectorTrailing: 'shrink-0',\n // Body wrapper next to the marker. min-w-0 so flex children can truncate.\n body: 'relative min-w-0 flex flex-col',\n // Opposite wrapper for align=\"alternate\" / align=\"split\". Same min-width constraints as body.\n opposite: 'min-w-0 flex flex-col',\n // Auto-number / single-glyph slot inside a circle marker.\n number: 'leading-none font-semibold',\n // Timestamp element (whether <time> or <span>).\n timestamp: 'text-fg-muted',\n },\n variants: {\n orientation: {\n vertical: {\n root: 'flex-col',\n // `items-stretch` (the flex default) lets the marker column stretch to\n // the body's full height — required for the trailing connector to\n // physically reach the next item's marker.\n item: 'flex-row',\n markerSide: 'flex-col items-center',\n },\n horizontal: {\n // `relative` anchors the absolutely-positioned chevron buttons. The\n // `overflow-x-auto` lives on the inner viewport (see template) so the\n // chevrons stay fixed against the host while content scrolls.\n root: 'flex-row items-start relative',\n // Grid-row participation: each item spans both rows of the viewport's\n // `grid-template-rows: minmax(0, 1fr) auto`. `grid-rows-subgrid`\n // inherits the parent grid's row tracks so every item's marker-side\n // lands on a shared row-2 baseline regardless of body height in row 1.\n // Without this, per-item body-height variance pushes each marker to a\n // different y-coordinate and the horizontal connector breaks across\n // item boundaries. Row placement (body → row 1, markerSide → row 2)\n // is applied via the horizontal compoundVariant below.\n item: 'grid grid-rows-subgrid row-span-2 items-center text-center',\n markerSide: 'flex-row items-center w-full',\n body: 'items-center',\n },\n },\n size: {\n // The trailing `pb-*` on body provides inter-item visual separation in\n // vertical orientation. The trailing connector lives inside the marker\n // column and stretches through this padding to touch the next item's\n // marker — items butt against each other with no container `gap-*` so\n // the line stays continuous.\n //\n // `item: gap-*` is NOT that vertical separation — it is the gutter\n // between the marker column and the body (a column gap in vertical\n // orientation, the subgrid row gap in horizontal). It runs past\n // CLAUDE.md's `gap-3` ceiling because that scale governs spacing\n // *inside* an element (icon↔label, button groups) against a fixed\n // ~16–20px glyph, whereas this gutter is measured against a marker\n // column that itself scales `w-6`→`w-12`. Held at `gap-3`, an `xl`\n // 48px bubble sits 12px from its text — the body reads as welded to\n // the marker and every step above `md` becomes visually identical.\n // The gutter therefore tracks the column: 12/16/20/24/32px.\n xs: { item: 'gap-3', body: 'text-xs gap-1 pb-3', timestamp: 'text-2xs', number: 'text-2xs' },\n sm: { item: 'gap-4', body: 'text-sm gap-1 pb-4', timestamp: 'text-xs', number: 'text-xs' },\n md: { item: 'gap-5', body: 'text-sm gap-1.5 pb-6', timestamp: 'text-xs', number: 'text-xs' },\n lg: { item: 'gap-6', body: 'text-sm gap-1.5 pb-8', timestamp: 'text-xs', number: 'text-sm' },\n // `xl` density holds at text-sm — `text-base` is reserved for the codified\n // tw-item lg exception and does not apply to timeline (per requirements § 4.3).\n xl: { item: 'gap-8', body: 'text-sm gap-2 pb-10', timestamp: 'text-xs', number: 'text-sm' },\n },\n marker: {\n dot: {},\n circle: {},\n },\n lineStyle: {\n solid: {},\n dashed: {\n // Dashed connectors replace the solid bg fill with a CSS border. The base\n // `connectorLeading`/`connectorTrailing` classes still apply; `bg-transparent`\n // is forced so twMerge doesn't end up with both a `bg-*` and a `border-*` fill.\n connectorLeading: 'border-dashed bg-transparent',\n connectorTrailing: 'border-dashed bg-transparent',\n },\n },\n state: {\n // The `state` axis exists in `tv()` only to control the auto-number's text\n // color step — color × state combinations on the marker itself are applied\n // via static lookup tables (Tailwind v4 cannot resolve interpolated class names).\n reached: { number: 'text-fg' },\n pending: { number: 'text-fg-muted' },\n current: { number: 'text-fg' },\n error: { number: 'text-fg' },\n },\n },\n compoundVariants: [\n // ── Horizontal item min-width per density. Values chosen so a marker\n // plus ~16–24 chars of body text fit without truncation at each step;\n // the lower bound is the diameter of the corresponding circle marker\n // (size-6 → 24px) plus a comfortable ~120px text gutter, scaling up to\n // leave room for richer descriptions at xl. Once any item's content\n // exceeds the floor the items expand naturally; the inner scroll\n // viewport handles overflow beyond the host's width.\n { orientation: 'horizontal', size: 'xs', class: { item: 'min-w-32' } },\n { orientation: 'horizontal', size: 'sm', class: { item: 'min-w-36' } },\n { orientation: 'horizontal', size: 'md', class: { item: 'min-w-40' } },\n { orientation: 'horizontal', size: 'lg', class: { item: 'min-w-44' } },\n { orientation: 'horizontal', size: 'xl', class: { item: 'min-w-48' } },\n\n // Subgrid row placement (horizontal only). Body occupies row 1 with\n // `self-end` so short bodies hang at the row's bottom edge — sitting\n // close to the marker row directly below — instead of floating at the\n // top and opening a visible gap. Marker-side occupies the shared row 2.\n {\n orientation: 'horizontal',\n class: { body: 'row-start-1 self-end', markerSide: 'row-start-2' },\n },\n\n // ── Marker geometry per size × marker variant (requirements § 4.3) ──\n // Diameter is orientation-agnostic.\n { marker: 'dot', size: 'xs', class: { marker: 'size-2' } },\n { marker: 'dot', size: 'sm', class: { marker: 'size-2.5' } },\n { marker: 'dot', size: 'md', class: { marker: 'size-3' } },\n { marker: 'dot', size: 'lg', class: { marker: 'size-3' } },\n { marker: 'dot', size: 'xl', class: { marker: 'size-3' } },\n { marker: 'circle', size: 'xs', class: { marker: 'size-6' } },\n { marker: 'circle', size: 'sm', class: { marker: 'size-7' } },\n { marker: 'circle', size: 'md', class: { marker: 'size-8' } },\n // `size-10` / `size-12` sit above the glyph scale's `size-10` ceiling and\n // outside the square-interactive scale (which stops at `size-9`), and\n // neither scale governs here: the circle marker is a *container* — it\n // wraps a projected `[twTimelineMarker]` icon/avatar or the auto-number —\n // and the item host is never focusable, so it is not a hit target either.\n // A container has to out-measure its contents: `<tw-icon size=\"lg\">` is\n // `size-6` (24px) and `size=\"xl\"` is `size-8` (32px), so capping the bubble\n // at the `size-9` (36px) hit-target ceiling would leave a 6px rim at `lg`\n // and a 2px rim at `xl` — the glyph reads as cropped and the ring/border\n // states have nowhere to render. `size-10` / `size-12` hold a constant 8px\n // inset at both steps instead.\n { marker: 'circle', size: 'lg', class: { marker: 'size-10' } },\n { marker: 'circle', size: 'xl', class: { marker: 'size-12' } },\n\n // Vertical-only: `mt-*` nudges the small dot down so its vertical center\n // aligns with the title's first-line optical center (text sits to the\n // side of the marker in vertical layout). Circle markers are large\n // enough that no nudge is needed — the bubble visually wraps the title's\n // first line. In horizontal layout the dot must NOT carry margin-top:\n // the marker-side is `flex-row items-center` and the connector segments\n // sit on the same vertical axis, so margin-top would push the dot below\n // the connector line.\n { orientation: 'vertical', marker: 'dot', size: 'xs', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'sm', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'md', class: { marker: 'mt-1.5' } },\n { orientation: 'vertical', marker: 'dot', size: 'lg', class: { marker: 'mt-2' } },\n { orientation: 'vertical', marker: 'dot', size: 'xl', class: { marker: 'mt-2' } },\n\n // ── Vertical connector geometry: thin line that runs through the marker column.\n // `flex-1` stretches the segment to fill the gap between adjacent markers.\n {\n orientation: 'vertical',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-px flex-1', connectorTrailing: 'w-px flex-1' },\n },\n {\n orientation: 'vertical',\n lineStyle: 'dashed',\n class: { connectorLeading: 'border-l flex-1 min-h-2', connectorTrailing: 'border-l flex-1 min-h-2' },\n },\n {\n orientation: 'vertical',\n size: 'lg',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-0.5', connectorTrailing: 'w-0.5' },\n },\n {\n orientation: 'vertical',\n size: 'xl',\n lineStyle: 'solid',\n class: { connectorLeading: 'w-0.5', connectorTrailing: 'w-0.5' },\n },\n\n // ── Horizontal connector geometry ──\n {\n orientation: 'horizontal',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-px flex-1', connectorTrailing: 'h-px flex-1' },\n },\n {\n orientation: 'horizontal',\n lineStyle: 'dashed',\n class: { connectorLeading: 'border-t flex-1 min-w-2', connectorTrailing: 'border-t flex-1 min-w-2' },\n },\n {\n orientation: 'horizontal',\n size: 'lg',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-0.5', connectorTrailing: 'h-0.5' },\n },\n {\n orientation: 'horizontal',\n size: 'xl',\n lineStyle: 'solid',\n class: { connectorLeading: 'h-0.5', connectorTrailing: 'h-0.5' },\n },\n ],\n defaultVariants: {\n orientation: 'vertical',\n size: 'md',\n marker: 'dot',\n state: 'reached',\n lineStyle: 'solid',\n },\n },\n { twMerge: true },\n);\n\n// ── Static color × state class lookups ──\n// Tailwind v4 only resolves statically-written class names. Per the stepper\n// precedent (`INDICATOR_ACTIVE`, `INDICATOR_COMPLETED`, `CONNECTOR_REACHED`),\n// all color × state combinations are enumerated as exhaustive maps.\n\nconst MARKER_PENDING = 'bg-surface border-2 border-border text-fg-muted';\nconst MARKER_ERROR =\n 'bg-error-solid text-error-solid-fg border border-error-border-strong';\n\nconst MARKER_REACHED: 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 MARKER_CURRENT: Record<TwColor, string> = {\n primary:\n 'bg-primary-solid text-primary-solid-fg border border-primary-border-strong ring-4 ring-primary-soft',\n secondary:\n 'bg-secondary-solid text-secondary-solid-fg border border-secondary-border-strong ring-4 ring-secondary-soft',\n accent:\n 'bg-accent-solid text-accent-solid-fg border border-accent-border-strong ring-4 ring-accent-soft',\n neutral:\n '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:\n 'bg-success-solid text-success-solid-fg border border-success-border-strong ring-4 ring-success-soft',\n warning:\n '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\n// When marker='circle' AND a `[twTimelineMarker]` slot is projected, the bubble\n// switches to a SOFT background so the projected glyph/avatar reads against a\n// tinted surface rather than competing with a solid fill.\nconst MARKER_REACHED_SOFT: Record<TwColor, string> = {\n primary: 'bg-primary-soft text-primary-fg border border-primary-border-strong',\n secondary: 'bg-secondary-soft text-secondary-fg border border-secondary-border-strong',\n accent: 'bg-accent-soft text-accent-fg border border-accent-border-strong',\n neutral: 'bg-surface-muted text-fg border border-border',\n info: 'bg-info-soft text-info-fg border border-info-border-strong',\n success: 'bg-success-soft text-success-fg border border-success-border-strong',\n warning: 'bg-warning-soft text-warning-fg border border-warning-border-strong',\n error: 'bg-error-soft text-error-fg border border-error-border-strong',\n};\n\nconst MARKER_CURRENT_SOFT: Record<TwColor, string> = {\n primary:\n 'bg-primary-soft text-primary-fg border border-primary-border-strong ring-4 ring-primary-soft',\n secondary:\n 'bg-secondary-soft text-secondary-fg border border-secondary-border-strong ring-4 ring-secondary-soft',\n accent:\n 'bg-accent-soft text-accent-fg border border-accent-border-strong ring-4 ring-accent-soft',\n neutral: 'bg-surface-muted text-fg border border-border ring-4 ring-border',\n info: 'bg-info-soft text-info-fg border border-info-border-strong ring-4 ring-info-soft',\n success:\n 'bg-success-soft text-success-fg border border-success-border-strong ring-4 ring-success-soft',\n warning:\n 'bg-warning-soft text-warning-fg border border-warning-border-strong ring-4 ring-warning-soft',\n error: 'bg-error-soft text-error-fg border border-error-border-strong ring-4 ring-error-soft',\n};\n\n// ── Connector color ──\n// The trailing connector takes its color from the item the connector leaves;\n// the leading connector takes its color from the *previous* item so a single\n// physical line between two items reads as one consistent color.\n\nconst CONNECTOR_DEFAULT = 'bg-border';\nconst CONNECTOR_ERROR = 'bg-error-border-strong';\nconst CONNECTOR_DASHED_DEFAULT = 'border-border';\nconst CONNECTOR_DASHED_ERROR = 'border-error-border-strong';\n\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\nconst CONNECTOR_DASHED_REACHED: Record<TwColor, string> = {\n primary: 'border-primary-border-strong',\n secondary: 'border-secondary-border-strong',\n accent: 'border-accent-border-strong',\n neutral: 'border-neutral-border-strong',\n info: 'border-info-border-strong',\n success: 'border-success-border-strong',\n warning: 'border-warning-border-strong',\n error: 'border-error-border-strong',\n};\n\nfunction resolveMarkerClasses(\n state: TimelineState,\n color: TwColor,\n hasMarkerSlot: boolean,\n): string {\n switch (state) {\n case 'pending':\n return MARKER_PENDING;\n case 'error':\n return MARKER_ERROR;\n case 'reached':\n return hasMarkerSlot ? MARKER_REACHED_SOFT[color] : MARKER_REACHED[color];\n case 'current':\n return hasMarkerSlot ? MARKER_CURRENT_SOFT[color] : MARKER_CURRENT[color];\n }\n}\n\nfunction resolveConnectorClasses(\n state: TimelineState,\n color: TwColor,\n lineStyle: TimelineLineStyle,\n): string {\n // 'current' and 'pending' both render the neutral default — a connector that\n // leaves a 'current' item points into territory that has not been reached yet.\n if (lineStyle === 'dashed') {\n if (state === 'error') return CONNECTOR_DASHED_ERROR;\n if (state === 'reached') return CONNECTOR_DASHED_REACHED[color];\n return CONNECTOR_DASHED_DEFAULT;\n }\n if (state === 'error') return CONNECTOR_ERROR;\n if (state === 'reached') return CONNECTOR_REACHED[color];\n return CONNECTOR_DEFAULT;\n}\n\n// ── Horizontal viewport class string ──\n// CSS grid (not flex-row): rows are minmax(0, 1fr) / auto. Row 1 absorbs every\n// item's body, row 2 carries the marker-side. Items participate via\n// `grid-rows-subgrid row-span-2`, so every marker lands on a shared row-2\n// baseline regardless of body-height variance — fixing the prior flex layout\n// where shorter bodies pushed their marker bubble off the connector row.\n//\n// `auto-cols-max` is load-bearing: columns size to max-content so the grid's\n// scrollWidth can exceed clientWidth and the chevron-overflow contract\n// (docs/prompts/tw-timeline-horizontal-overflow.md) keeps working. DO NOT\n// switch to `auto-cols-fr` or `auto-cols-[1fr]` — those collapse scrollWidth\n// to clientWidth, the overflow check fails permanently, and the chevrons\n// never enable. The per-density min-w-* on each item still establishes the\n// floor.\n// The viewport carries `tabindex=\"0\"` so keyboard-only users can reach and\n// arrow-scroll it (axe: scrollable-region-focusable), which makes it a\n// focusable element and therefore obliges it to carry the canonical focus ring.\nconst HORIZONTAL_VIEWPORT_CLASSES =\n 'tw-scrollbar-none grid grid-flow-col auto-cols-max ' +\n '[grid-template-rows:minmax(0,1fr)_auto] ' +\n 'overflow-x-auto scroll-smooth motion-reduce:scroll-auto w-full ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500';\n\n// ── Chevron button class string ──\n// Shared by both overflow chevron buttons. Positioned absolutely against the\n// timeline host (which carries `relative` in horizontal orientation via the\n// tv() config) so `left-0` / `right-0` anchor correctly.\n// `top-1/2 -translate-y-1/2` centres the button vertically — a pragmatic\n// approximation for the canonical horizontal layout where the marker row sits\n// roughly mid-host. `size-8` matches the canonical \"square interactive target\"\n// md size; the inner chevron glyph is `size-4` (glyph-icon sub-scale).\n// The disabled hover overrides suppress the hover state when disabled, otherwise\n// twMerge would unify them.\nconst CHEVRON_CLASSES =\n 'absolute top-1/2 -translate-y-1/2 z-10 inline-flex items-center justify-center ' +\n 'size-8 rounded-full bg-surface-raised border border-border shadow-sm ' +\n 'text-fg-muted hover:text-fg hover:bg-surface-muted ' +\n 'transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 ' +\n 'disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-surface-raised disabled:hover:text-fg-muted';\n\n// ── Slot directives ──\n\n/**\n * Marker-slot directive. Apply on any element projected inside a `<tw-timeline-item>`\n * to render that element inside the marker bubble (only when `marker=\"circle\"`).\n *\n * @example\n * ```html\n * <tw-timeline-item marker=\"circle\" color=\"success\">\n * <tw-icon twTimelineMarker name=\"check\" />\n * <p class=\"text-sm\">Done</p>\n * </tw-timeline-item>\n * ```\n */\n@Directive({\n selector: '[twTimelineMarker]',\n})\nexport class TimelineMarkerDirective {}\n\n/**\n * Timestamp-slot directive. Replaces the rendered `timestamp` / `dateTime`\n * output. Use for relative-time components (\"2 hours ago\").\n */\n@Directive({\n selector: '[twTimelineTimestamp]',\n})\nexport class TimelineTimestampDirective {}\n\n/**\n * Opposite-slot directive. Renders on the side opposite the body in\n * `align=\"alternate\"` / `align=\"split\"` (vertical orientation only).\n */\n@Directive({\n selector: '[twTimelineOpposite]',\n})\nexport class TimelineOppositeDirective {}\n\n// ── TimelineComponent ──\n\n/**\n * Presentational chronological-sequence layout primitive. Renders a list of\n * `<tw-timeline-item>` children connected by a line that runs through their\n * markers. The container owns orientation, alignment, density, and line-style\n * decisions; items style their own marker, state, and connector colors.\n *\n * **Not interactive.** Unlike `tw-stepper`, the timeline does not install a\n * keyboard map, does not own panels, does not trap focus, and item hosts are\n * not focusable. Consumers needing row-level activation project an\n * interactive primitive (`<tw-item interactive>`, `<button>`, an anchor) inside\n * the default slot.\n */\n@Component({\n selector: 'tw-timeline',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet],\n host: {\n // The `list` role lives on the host only in vertical orientation, where the\n // projected `tw-timeline-item` elements (role=\"listitem\") are its direct\n // children. In horizontal orientation the host also owns the two scroll\n // chevrons, which are not `listitem`s — a `list` here would own children its\n // role forbids (axe: aria-required-children). The role moves to the scroll\n // viewport instead, which does contain exactly the items.\n //\n // `aria-orientation` is deliberately absent: `list` does not support it\n // (axe: aria-allowed-attr), and the axis is a purely visual decision that\n // carries no meaning for assistive tech.\n '[attr.role]': 'orientation() === \"horizontal\" ? null : \"list\"',\n '[class]': 'rootClasses()',\n },\n // The projected items live inside a single `<ng-template #itemsTpl>` and are\n // outletted into either the horizontal viewport or the vertical pass-through.\n // Placing two `<ng-content />` slots directly inside `@if/@else` would drop\n // the projection — Angular resolves content projection at component creation\n // and only the first matching slot fills, even if the `@if` flips later.\n // Wrapping in an `<ng-template>` defers the `<ng-content />` materialisation\n // to the outlet's view-instantiation, which works correctly across flips.\n template: `\n <ng-template #itemsTpl>\n <ng-content />\n </ng-template>\n\n @if (orientation() === 'horizontal') {\n <button\n type=\"button\"\n [class]=\"prevChevronClasses()\"\n [attr.aria-label]=\"scrollLabels().scrollPrevious\"\n [attr.aria-hidden]=\"_prevButtonHidden() ? 'true' : null\"\n [disabled]=\"_prevButtonDisabled()\"\n (click)=\"_scrollPrev()\"\n >\n @if (_isRtl()) {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n } @else {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n }\n </button>\n <div\n #scrollViewport\n role=\"list\"\n tabindex=\"0\"\n [attr.aria-label]=\"scrollLabels().scrollRegion\"\n [class]=\"horizontalViewportClasses\"\n (scroll)=\"_onScroll()\"\n >\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" />\n </div>\n <button\n type=\"button\"\n [class]=\"nextChevronClasses()\"\n [attr.aria-label]=\"scrollLabels().scrollNext\"\n [attr.aria-hidden]=\"_nextButtonHidden() ? 'true' : null\"\n [disabled]=\"_nextButtonDisabled()\"\n (click)=\"_scrollNext()\"\n >\n @if (_isRtl()) {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n } @else {\n <svg class=\"size-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n }\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" />\n }\n `,\n})\nexport class TimelineComponent {\n /** Axis along which items are laid out. `'vertical'` stacks items top-to-bottom; `'horizontal'` lays them out left-to-right (RTL-aware). Defaults to `'vertical'`. */\n readonly orientation = input<TwOrientation>('vertical');\n\n /** Vertical layout strategy. `'left'` / `'right'` place the marker on that side; `'alternate'` centers the marker and flips the body left ↔ right per item; `'split'` centers the marker with body on the right and the opposite slot on the left. Ignored when orientation is `'horizontal'`. Defaults to `'left'`. */\n readonly align = input<TimelineAlign>('left');\n\n /** Density and typography scale. Controls marker diameter, gap between items, and body typography step. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /** Connector line style applied to every gap between items. Defaults to `'solid'`. */\n readonly lineStyle = input<TimelineLineStyle>('solid');\n\n /**\n * Visibility policy for the horizontal-overflow chevron buttons. `'auto'`\n * shows them only when the inner scroll region can scroll in that direction;\n * `'always'` renders both regardless of scroll state (disabled when at an\n * edge); `'never'` hides them entirely (consumer manages overflow\n * externally). Ignored when orientation is `'vertical'`. Defaults to\n * `'auto'`.\n *\n * Counts as the 5th container input, justified by the \"Overflow-control axis\n * on layout primitives\" cap exception: a layout primitive whose primary axes\n * (orientation, alignment, size, line/style) already saturate ≤ 4 inputs MAY\n * add a single additional input that toggles overflow-navigation\n * affordances when overflow is a real concern for at least one axis value.\n * The added input MUST be a single tri-state and MUST be inert on axis\n * values where overflow cannot occur (here: `orientation === 'vertical'`).\n */\n readonly scrollControls = input<TimelineScrollControls>('auto');\n\n /** @internal Static class string for the horizontal scroll viewport — see `HORIZONTAL_VIEWPORT_CLASSES`. */\n protected readonly horizontalViewportClasses = HORIZONTAL_VIEWPORT_CLASSES;\n\n /** @internal Projected `tw-timeline-item` children in DOM order. */\n readonly items = contentChildren(TimelineItemComponent, { descendants: false });\n\n // ── Horizontal scroll / chevron wiring ──\n\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _directionality = inject(Directionality, { optional: true });\n private readonly _viewportRef = viewChild<ElementRef<HTMLDivElement>>('scrollViewport');\n private readonly _scrollLabelsOverride = inject(TW_TIMELINE_SCROLL_LABELS, {\n optional: true,\n });\n\n /**\n * @internal Live `dir` from CDK `Directionality`. Read straight from\n * `valueSignal` (CDK 22+) so `_isRtl` re-evaluates on a runtime `dir` flip\n * with no manual subscription mirror.\n */\n private readonly _cdkDir = computed<'ltr' | 'rtl'>(\n () => this._directionality?.valueSignal() ?? 'ltr',\n );\n\n /** @internal True when the host renders inside a `dir=\"rtl\"` ancestor. */\n readonly _isRtl = computed(() => this._cdkDir() === 'rtl');\n\n /**\n * @internal Defaults to `false` until the first measurement runs in the\n * `afterRenderEffect` in the constructor. This avoids a one-frame\n * \"enabled-then-disabled\" flash where the buttons appear live before the\n * scroll state has been read.\n */\n readonly _canScrollPrev = signal(false);\n readonly _canScrollNext = signal(false);\n\n /** @internal Resolved label record. Falls back to English defaults for any missing key. */\n readonly scrollLabels = computed<Required<TwTimelineScrollLabels>>(() => {\n // Drop explicitly-undefined keys before merging. A plain spread would let\n // `{ scrollRegion: undefined }` overwrite the default with undefined,\n // which reaches the template as a null `aria-label` and silently strips\n // the scroll region's accessible name. `Required<>` then guarantees the\n // template a string for every label.\n const override = Object.fromEntries(\n Object.entries(this._scrollLabelsOverride ?? {}).filter(([, v]) => v !== undefined),\n );\n return { ...DEFAULT_TW_TIMELINE_SCROLL_LABELS, ...override } as Required<TwTimelineScrollLabels>;\n });\n\n /** @internal True when the prev button should be aria-hidden + visually suppressed. */\n readonly _prevButtonHidden = computed(() => {\n const policy = this.scrollControls();\n if (policy === 'never') return true;\n if (policy === 'always') return false;\n return !this._canScrollPrev();\n });\n\n /** @internal True when the next button should be aria-hidden + visually suppressed. */\n readonly _nextButtonHidden = computed(() => {\n const policy = this.scrollControls();\n if (policy === 'never') return true;\n if (policy === 'always') return false;\n return !this._canScrollNext();\n });\n\n /** @internal Native `disabled` attribute. Always true for hidden buttons (defensive); also true for `'always'` policy when can't scroll. */\n readonly _prevButtonDisabled = computed(\n () => this._prevButtonHidden() || !this._canScrollPrev(),\n );\n readonly _nextButtonDisabled = computed(\n () => this._nextButtonHidden() || !this._canScrollNext(),\n );\n\n /**\n * @internal Final class string for the prev chevron — combines the shared\n * `CHEVRON_CLASSES`, the directional anchor (`left-0` in LTR, `right-0` in\n * RTL), and the visibility variant driven by `scrollControls`.\n */\n readonly prevChevronClasses = computed(() => this._chevronClasses('prev'));\n readonly nextChevronClasses = computed(() => this._chevronClasses('next'));\n\n private _chevronClasses(side: 'prev' | 'next'): string {\n const isRtl = this._isRtl();\n // In LTR the prev arrow anchors to the host's left, next to the right.\n // RTL flips: prev anchors right, next anchors left. The arrow glyph also\n // flips (handled in the template).\n const anchor =\n side === 'prev' ? (isRtl ? 'right-0' : 'left-0') : isRtl ? 'left-0' : 'right-0';\n const policy = this.scrollControls();\n const hidden = side === 'prev' ? this._prevButtonHidden() : this._nextButtonHidden();\n // `'never'` → wholly hidden (no layout space, ignored by AT).\n // `'auto'` + can't scroll that way → invisible but still occupies space\n // (prevents the chevron from popping into view and shifting layout when\n // scroll becomes possible mid-interaction).\n // `'always'` → always visible; native `disabled` styling handles edges.\n let visibility = '';\n if (policy === 'never') visibility = 'hidden';\n else if (policy === 'auto' && hidden) visibility = 'invisible';\n return `${CHEVRON_CLASSES} ${anchor} ${visibility}`.trim();\n }\n\n private _resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n // The horizontal viewport is gated behind `@if (orientation() ===\n // 'horizontal')`, so scroll detection has to re-run whenever orientation\n // is (re)committed — not just once at mount. The previous\n // `afterNextRender(() => this._setupScrollDetection())` fired a single\n // time, and `_setupScrollDetection()` early-returns when the orientation\n // is vertical: a timeline mounted vertical and later flipped to horizontal\n // (`[orientation]=\"isWide() ? 'horizontal' : 'vertical'\"`) never got a\n // ResizeObserver and never measured, so `_canScrollPrev`/`_canScrollNext`\n // stayed `false` and both chevrons were permanently invisible AND\n // disabled. Same bug class `carousel.ts` records having already fixed.\n //\n // `afterRenderEffect` is the right primitive rather than `effect()`: the\n // work is a DOM *measurement* that must observe the embedded view holding\n // the viewport, and a plain `effect()` runs before this cycle's embedded\n // views are refreshed. Tracking `_viewportRef()` as well as `orientation()`\n // makes it self-healing — if the view query has not resolved on the pass\n // that commits `'horizontal'`, the effect re-runs when it does.\n //\n // The body is wrapped in `untracked()` so the tracked region is exactly\n // `{ orientation, _viewportRef }`: `_setupScrollDetection()` writes\n // `_canScrollPrev`/`_canScrollNext`, and reading them here would be a\n // read-write cycle of the shape CLAUDE.md bans.\n afterRenderEffect(() => {\n this.orientation();\n this._viewportRef();\n untracked(() => this._setupScrollDetection());\n });\n\n this._destroyRef.onDestroy(() => {\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n });\n }\n\n private _setupScrollDetection(): void {\n // Re-entrant: this runs on every orientation/viewport change, so drop any\n // observer bound to the previous (now detached) viewport element first.\n // Done before the early return so flipping back to vertical also releases\n // it. `_destroyRef.onDestroy` still owns the final teardown.\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n\n // Vertical orientation never renders the viewport — nothing to do.\n if (this.orientation() !== 'horizontal') return;\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n\n this._updateScrollState();\n\n // ResizeObserver fires when items are appended/removed (the viewport's\n // scrollWidth changes), so a separate items-change effect is not needed.\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => this._updateScrollState());\n this._resizeObserver.observe(el);\n }\n }\n\n /** @internal Wired to the viewport's `(scroll)` event. */\n _onScroll(): void {\n this._updateScrollState();\n }\n\n private _updateScrollState(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n // `> 1` thresholds handle sub-pixel scroll positions on retina displays —\n // smooth-scroll landings can settle at scrollLeft = 0.5 and would flicker\n // an enabled/disabled boundary without the guard.\n this._canScrollPrev.set(el.scrollLeft > 1);\n this._canScrollNext.set(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }\n\n /** Page-scroll amount: 75% of the visible width, leaving ~25% overlap for context. */\n private _pageScrollAmount(): number {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return 0;\n return Math.floor(el.clientWidth * 0.75);\n }\n\n /** @internal Click handler for the prev chevron. */\n _scrollPrev(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n // In RTL \"previous\" (the visual left button) maps to a positive scrollLeft\n // delta; in LTR it's a negative delta toward 0.\n const direction = this._isRtl() ? 1 : -1;\n el.scrollBy({ left: direction * this._pageScrollAmount(), behavior: 'smooth' });\n }\n\n /** @internal Click handler for the next chevron. */\n _scrollNext(): void {\n const el = this._viewportRef()?.nativeElement;\n if (!el) return;\n const direction = this._isRtl() ? -1 : 1;\n el.scrollBy({ left: direction * this._pageScrollAmount(), behavior: 'smooth' });\n }\n\n private readonly variantResult = computed(() =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n }),\n );\n\n readonly rootClasses = computed(() => this.variantResult().root());\n\n /** @internal Item slot classes shared with `TimelineItemComponent`. */\n readonly itemSlotClasses = computed(() => this.variantResult().item());\n readonly markerSideSlotClasses = computed(() => this.variantResult().markerSide());\n readonly markerSlotClasses = computed(() => this.variantResult().marker());\n readonly connectorLeadingSlotClasses = computed(() =>\n this.variantResult().connectorLeading(),\n );\n readonly connectorTrailingSlotClasses = computed(() =>\n this.variantResult().connectorTrailing(),\n );\n readonly bodySlotClasses = computed(() => this.variantResult().body());\n readonly oppositeSlotClasses = computed(() => this.variantResult().opposite());\n readonly numberSlotClasses = computed(() => this.variantResult().number());\n readonly timestampSlotClasses = computed(() => this.variantResult().timestamp());\n\n /** @internal Variant builder reused by items so per-item state can recompose without rebuilding the base tv() result. */\n readonly itemMarkerVariant = (\n state: TimelineState,\n marker: TimelineMarker,\n ): string =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n marker,\n state,\n }).marker();\n\n /** @internal Variant builder for the auto-number slot (state drives text color). */\n readonly itemNumberVariant = (state: TimelineState): string =>\n timelineVariants({\n orientation: this.orientation(),\n size: this.size(),\n lineStyle: this.lineStyle(),\n state,\n }).number();\n}\n\n// ── TimelineItemComponent ──\n\n/**\n * A single event in a `tw-timeline`. Renders a marker (dot or circle) plus\n * content. Connectors leading into and out of the marker are emitted by this\n * component and conditionally elided when the item is first or last in the\n * timeline. The item is not focusable — row activation belongs to projected\n * interactive children.\n */\n@Component({\n selector: 'tw-timeline-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'listitem',\n '[class]': 'itemClasses()',\n '[attr.aria-current]': 'state() === \"current\" ? \"step\" : null',\n '[animate.enter]': 'enterAnimationClass()',\n },\n template: `\n <div [class]=\"markerSideClasses()\">\n @if (renderLeadingConnector()) {\n <span [class]=\"leadingConnectorClasses()\" aria-hidden=\"true\"></span>\n }\n <div [class]=\"markerClasses()\" aria-hidden=\"true\">\n @if (marker() === 'circle') {\n @if (hasMarkerSlot()) {\n <ng-content select=\"[twTimelineMarker]\" />\n } @else if (state() === 'error') {\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 } @else {\n <span [class]=\"numberClasses()\">{{ index() + 1 }}</span>\n }\n }\n </div>\n @if (renderTrailingConnector()) {\n <span [class]=\"trailingConnectorClasses()\" aria-hidden=\"true\"></span>\n }\n </div>\n <div [class]=\"bodyClasses()\">\n @if (stateLabel(); as label) {\n <span class=\"sr-only\">{{ label }}</span>\n }\n <ng-content />\n @if (hasTimestampSlot()) {\n <ng-content select=\"[twTimelineTimestamp]\" />\n } @else if (timestamp() !== null) {\n @let dt = resolvedDateTime();\n @if (dt !== null) {\n <time [attr.datetime]=\"dt\" [class]=\"timestampClasses()\">{{ formattedTimestamp() }}</time>\n } @else {\n <span [class]=\"timestampClasses()\">{{ formattedTimestamp() }}</span>\n }\n }\n </div>\n @if (hasOppositeColumn()) {\n <div [class]=\"oppositeClasses()\">\n <ng-content select=\"[twTimelineOpposite]\" />\n </div>\n }\n `,\n})\nexport class TimelineItemComponent implements AfterContentInit {\n /** Semantic color for the marker fill and the trailing connector when the item is in a reached state. Ignored when state is `'error'` (which forces the error palette). Defaults to `'primary'`. */\n readonly color = input<TwColor>('primary');\n\n /** Marker geometry. `'dot'` is a small filled circle. `'circle'` is a larger ring that may contain a projected icon, avatar, or an auto-computed 1-based index. Defaults to `'dot'`. */\n readonly marker = input<TimelineMarker>('dot');\n\n /** Semantic state of the event. Drives marker fill, ring, and trailing-connector color, and applies `aria-current=\"step\"` when `'current'`. Defaults to `'reached'`. */\n readonly state = input<TimelineState>('reached');\n\n /** Timestamp shown in the timestamp slot. A `Date` is formatted via `Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' })`; a string is rendered verbatim; `null` omits the timestamp element. Overridden by projected `[twTimelineTimestamp]` content when present. Defaults to `null`. */\n readonly timestamp = input<string | Date | null>(null);\n\n /** Machine-readable ISO 8601 datetime for the rendered `<time datetime=\"…\">` attribute. Derived from `timestamp` when it is a `Date` and this input is `null`; required (explicit) when `timestamp` is a string and machine-readability is desired. When `null` with a string timestamp, the timestamp renders as a `<span>` instead. Defaults to `null`. */\n readonly dateTime = input<string | null>(null);\n\n /** @internal Direct parent timeline. A `tw-timeline-item` outside a `tw-timeline` is a programmer error — the DI failure throws naturally. */\n readonly timeline = inject(TimelineComponent);\n\n /** @internal */\n readonly markerSlot = contentChild(TimelineMarkerDirective);\n /** @internal */\n readonly timestampSlot = contentChild(TimelineTimestampDirective);\n /** @internal */\n readonly oppositeSlot = contentChild(TimelineOppositeDirective);\n\n readonly hasMarkerSlot = computed(() => !!this.markerSlot());\n readonly hasTimestampSlot = computed(() => !!this.timestampSlot());\n readonly hasOppositeSlot = computed(() => !!this.oppositeSlot());\n\n /** @internal 0-based index in the parent timeline's content. -1 until contentChildren materialises. */\n readonly index = computed(() => this.timeline.items().indexOf(this));\n\n readonly isFirst = computed(() => this.index() === 0);\n\n readonly isLast = computed(() => {\n const idx = this.index();\n if (idx < 0) return false;\n return idx === this.timeline.items().length - 1;\n });\n\n /**\n * Leading-connector visibility. In vertical orientation the marker sits at\n * the top of the body and only the trailing segment is rendered. In\n * horizontal orientation the marker must stay centered in its row even at\n * the ends of the timeline, so the leading segment is always rendered — as a\n * coloured line for non-first items, as an invisible spacer for the first.\n */\n readonly renderLeadingConnector = computed(\n () => this.timeline.orientation() === 'horizontal',\n );\n\n /**\n * Trailing-connector visibility. Rendered for every item in horizontal\n * orientation (as a spacer on the last item) so all markers stay centered.\n * In vertical orientation it is suppressed on the last item — the timeline\n * ends with the marker, no trailing segment.\n */\n readonly renderTrailingConnector = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return true;\n return !this.isLast();\n });\n\n /** @internal `error` state forces the error palette regardless of the color input. */\n readonly resolvedColor = computed<TwColor>(() =>\n this.state() === 'error' ? 'error' : this.color(),\n );\n\n /** @internal Previous item's state (drives the leading connector color so a line between two items reads as one color). */\n readonly previousState = computed<TimelineState>(() => {\n const idx = this.index();\n if (idx <= 0) return 'reached';\n const prev = this.timeline.items()[idx - 1];\n return prev.state();\n });\n\n /** @internal Previous item's resolved color, for the same reason as `previousState`. */\n readonly previousColor = computed<TwColor>(() => {\n const idx = this.index();\n if (idx <= 0) return 'primary';\n const prev = this.timeline.items()[idx - 1];\n return prev.resolvedColor();\n });\n\n readonly stateLabel = computed<string | null>(() => {\n switch (this.state()) {\n case 'pending':\n return 'Pending: ';\n case 'current':\n return 'Current: ';\n case 'error':\n return 'Error: ';\n default:\n return null;\n }\n });\n\n readonly formattedTimestamp = computed<string>(() => {\n const ts = this.timestamp();\n if (ts === null) return '';\n if (ts instanceof Date) {\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(ts);\n }\n return ts;\n });\n\n readonly resolvedDateTime = computed<string | null>(() => {\n const dt = this.dateTime();\n if (dt !== null) return dt;\n const ts = this.timestamp();\n if (ts instanceof Date) return ts.toISOString();\n return null;\n });\n\n /** @internal True when the layout needs a third (opposite) column. */\n readonly hasOppositeColumn = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return false;\n const align = this.timeline.align();\n return align === 'alternate' || align === 'split';\n });\n\n /** @internal Order of the marker side wrapper. Always center column (2) in three-column layouts; in two-column vertical layouts the order varies. Horizontal layouts use CSS grid placement (`row-start-*`) instead, so flex-order utilities are noise — return ''. */\n private readonly markerOrderClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n const align = this.timeline.align();\n if (this.hasOppositeColumn()) return 'order-2';\n if (align === 'right') return 'order-2';\n return 'order-1';\n });\n\n /** @internal Order of the body wrapper. Alternate flips body left/right per item. Horizontal layouts use CSS grid placement (`row-start-*`) instead, so flex-order utilities are noise — return ''. */\n private readonly bodyOrderClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n const align = this.timeline.align();\n if (align === 'right') return 'order-1';\n if (align === 'alternate' && this.index() % 2 === 1) return 'order-1';\n if (this.hasOppositeColumn()) return 'order-3';\n return 'order-2';\n });\n\n /** @internal Order of the opposite wrapper. Always left of the marker except on odd-indexed alternate items. */\n private readonly oppositeOrderClass = computed(() => {\n const align = this.timeline.align();\n if (align === 'alternate' && this.index() % 2 === 1) return 'order-3';\n return 'order-1';\n });\n\n /** @internal Width affordance for the marker side. Vertical needs a fixed-ish column; horizontal needs to span the row. */\n private readonly markerSideSizeClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n // Pin the column to the marker's own width so siblings stay aligned even\n // when items render slightly different bubble content. These mirror the\n // circle-marker diameters one-for-one (`size-6`…`size-12` above) — the\n // `w-10`/`w-12` steps are off-scale for the same reason the bubbles are,\n // and diverging here would knock every marker off the connector's axis.\n switch (this.timeline.size()) {\n case 'xs':\n return 'w-6';\n case 'sm':\n return 'w-7';\n case 'md':\n return 'w-8';\n case 'lg':\n return 'w-10';\n case 'xl':\n return 'w-12';\n }\n });\n\n /** @internal Width affordance for the body in alternate/split layouts so the marker stays centered. */\n private readonly bodyFlexClass = computed(() => {\n if (this.timeline.orientation() === 'horizontal') return '';\n if (this.hasOppositeColumn()) return 'flex-1';\n return 'flex-1';\n });\n\n /** @internal Width affordance for the opposite column (mirrors the body to keep the marker centered). */\n private readonly oppositeFlexClass = computed(() => 'flex-1');\n\n // ── Composed class outputs ──\n\n readonly itemClasses = computed(() => this.timeline.itemSlotClasses());\n\n readonly markerSideClasses = computed(\n () =>\n `${this.timeline.markerSideSlotClasses()} ${this.markerSideSizeClass()} ${this.markerOrderClass()}`,\n );\n\n readonly markerClasses = computed(\n () =>\n `${this.timeline.itemMarkerVariant(this.state(), this.marker())} ${resolveMarkerClasses(\n this.state(),\n this.resolvedColor(),\n this.hasMarkerSlot(),\n )}`,\n );\n\n readonly leadingConnectorClasses = computed(() => {\n const base = this.timeline.connectorLeadingSlotClasses();\n // The first horizontal item gets an invisible spacer — same geometry,\n // no colour fill — so the marker still anchors to the row's centre.\n if (this.isFirst()) return base;\n return `${base} ${resolveConnectorClasses(\n this.previousState(),\n this.previousColor(),\n this.timeline.lineStyle(),\n )}`;\n });\n\n readonly trailingConnectorClasses = computed(() => {\n const base = this.timeline.connectorTrailingSlotClasses();\n // The last horizontal item also gets an invisible spacer; in vertical\n // orientation the trailing connector is not rendered at all for the last\n // item (the marker sits at the body top, nothing to bridge below).\n if (this.isLast() && this.timeline.orientation() === 'horizontal') {\n return base;\n }\n return `${base} ${resolveConnectorClasses(\n this.state(),\n this.resolvedColor(),\n this.timeline.lineStyle(),\n )}`;\n });\n\n readonly bodyClasses = computed(() => {\n const base = `${this.timeline.bodySlotClasses()} ${this.bodyFlexClass()} ${this.bodyOrderClass()}`;\n // The per-size `pb-*` on the body slot exists only to space adjacent\n // vertical items. Horizontal layouts and the final vertical item don't\n // need it — strip with `!pb-0` so the trailing tone wins (twMerge keeps\n // the last padding-bottom utility and `!` settles tied specificity).\n if (this.timeline.orientation() === 'horizontal') {\n return `${base} !pb-0`;\n }\n if (this.isLast()) {\n return `${base} !pb-0`;\n }\n return base;\n });\n\n readonly oppositeClasses = computed(\n () =>\n `${this.timeline.oppositeSlotClasses()} ${this.oppositeFlexClass()} ${this.oppositeOrderClass()}`,\n );\n\n readonly numberClasses = computed(() => this.timeline.itemNumberVariant(this.state()));\n\n readonly timestampClasses = computed(() => this.timeline.timestampSlotClasses());\n\n readonly enterAnimationClass = computed(() =>\n this.timeline.orientation() === 'horizontal'\n ? 'timeline-item-enter-horizontal'\n : 'timeline-item-enter',\n );\n\n ngAfterContentInit(): void {\n // One-shot dev warning when a [twTimelineMarker] slot is projected onto a\n // marker=\"dot\" item. Runs in ngAfterContentInit because contentChild signals\n // are not yet populated during ngOnInit. Not an effect — the warning should\n // fire once at mount, not re-fire on every input change. Production builds\n // skip the warning entirely because ngDevMode is statically `false`.\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (this.marker() === 'dot' && this.hasMarkerSlot()) {\n console.warn(\n '[tw-timeline-item] [twTimelineMarker] content is ignored when marker=\"dot\". ' +\n 'Set marker=\"circle\" to render projected marker content.',\n );\n }\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|