@cdevhub/ngx-tw 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +111 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +332 -0
- package/theme/_semantic.css +60 -26
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdevhub-ngx-tw-tree.mjs","sources":["../../../projects/ngx-tw/tree/tree.ts","../../../projects/ngx-tw/tree/cdevhub-ngx-tw-tree.ts"],"sourcesContent":["/*\n * tw-tree — hierarchical, keyboard-navigable tree-view wrapping Angular CDK's\n * `CdkTree` (children-accessor model). CDK owns flattening, the expansion model,\n * ARIA wiring (`role=\"tree\"`/`\"treeitem\"`, `aria-level`/`-setsize`/`-posinset`/\n * `-expanded`) and roving-tabindex keyboard navigation; this component owns the\n * row wrapper, per-level indentation, optional connector lines, optional\n * (consumer-rendered) selection, and a typed per-node template context.\n *\n * Architecture decisions (verified against @angular/cdk 21.2.x source):\n * - Children-accessor render path only. `treeControl` / `FlatTreeControl` /\n * `NestedTreeControl` are @deprecated in CDK v21 and are NOT used. Flat\n * `cdk-tree-node` + a single `*cdkTreeNodeDef` (not `cdkNestedTreeNode`).\n * - `[isExpandable]` MUST be bound per node. Without a `treeControl`,\n * `CdkTreeNode._isExpandable()` returns the `isExpandable` *input* (default\n * `false`); unbound, branches get no `aria-expanded`, `expand()/collapse()`\n * no-op, and arrow-key expansion is dead. We bind it from `hasChildren(node)`.\n * - `CdkTreeNode.isLeafNode` is unusable here: with no `treeControl` its getter\n * short-circuits the optional-chain to `undefined` and returns `false` for\n * EVERY node (silently — no throw). We compute `hasChildren` ourselves.\n * - Selection is OURS, not CDK tree's (CDK's model is expansion-only). It lives\n * in a `signal<ReadonlySet<unknown>>` of node keys — a signal (not CDK's\n * `SelectionModel`) so it integrates with OnPush + `computed()` without\n * bridging an RxJS `changed` stream. NOT a form control (no CVA).\n * - Expansion is bidirectionally synced with the `expandedKeys` model:\n * model→CDK via a guarded `effect()` (CDK's `select`/`deselect` are\n * idempotent → settles in one tick); CDK→model via each node's\n * `(expandedChange)` output with compare-before-write (no signal cycle).\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n type TrackByFunction,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { type CdkTree, CdkTreeModule } from '@angular/cdk/tree';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** Tri-state selection status of a tree node. */\nexport type TwTreeSelectionState = 'checked' | 'unchecked' | 'indeterminate';\n\n/** Configuration for node selection behavior. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTreeSelectionConfig {\n /** Selection mode. `'single'` is scalar (one node, no cascade/indeterminate); `'multiple'` supports cascade + tri-state. `'none'` disables selection. Defaults to `'none'`. */\n mode: 'none' | 'single' | 'multiple';\n /** In `'multiple'` mode, selecting a branch selects all its leaf descendants and a branch renders `'indeterminate'` when only some are selected. Ignored in `'single'`/`'none'`. Defaults to `true`. */\n cascade?: boolean;\n /** Pre-selected node keys (matched via `trackBy`). In cascade mode these are leaf-node keys. Defaults to `[]`. */\n initialKeys?: readonly unknown[];\n}\n\n/** Display configuration for the tree. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTreeDisplayConfig {\n /** Row vertical density. Defaults to `'md'`. */\n size?: TwSize;\n /** Indentation per level, in pixels. Defaults to `16`. */\n indent?: number;\n /** Render connecting guide lines down the indent gutter. Defaults to `false`. */\n showLines?: boolean;\n}\n\n/** Context surfaced to a `*twTreeNode` template. Generic over the node type `T`. */\nexport interface TwTreeNodeContext<T> {\n /** The node data (implicit `let-node`). */\n $implicit: T;\n /** The node data, aliased for readability. */\n node: T;\n /** Zero-based depth of the node. */\n level: number;\n /** Whether the node is currently expanded. Always `false` for leaf nodes. */\n expanded: boolean;\n /** Whether the node has children (is a branch, not a leaf). */\n hasChildren: boolean;\n /** Tri-state selection status of this node. `'unchecked'` when selection is disabled. */\n selectionState: TwTreeSelectionState;\n /** Toggles this node's expand/collapse state. No-op on leaf nodes. */\n toggle: () => void;\n /** Expands this node. No-op on leaf nodes or when already expanded. */\n expand: () => void;\n /** Collapses this node. No-op when already collapsed. */\n collapse: () => void;\n /** Toggles this node's selection (cascades in `'multiple'` mode with `cascade` on). No-op when selection is disabled. */\n toggleSelection: () => void;\n}\n\n// ── Resolved-default constants ───────────────────────────────────────\n\nconst SELECTION_DEFAULTS: Required<TwTreeSelectionConfig> = {\n mode: 'none',\n cascade: true,\n initialKeys: [],\n};\n\nconst DISPLAY_DEFAULTS: Required<TwTreeDisplayConfig> = {\n size: 'md',\n indent: 16,\n showLines: false,\n};\n\n// ── tv() config ──────────────────────────────────────────────────────\n//\n// Indentation is rendered with one spacer span per ancestor level (width =\n// `indent` px) rather than a single inline `padding-left`: this avoids an\n// inline-style-vs-class left-padding conflict and lets `showLines` draw a\n// per-level vertical guide (`border-s` on each stretched spacer) instead of a\n// single root rail. `items-stretch` on the row makes spacers span the full row\n// height so guides connect across stacked rows; the content wrapper re-centers\n// the projected template vertically.\n\nconst treeVariants = tv(\n {\n slots: {\n root: 'block',\n node: 'group/node flex items-stretch rounded-md cursor-pointer select-none text-sm text-fg pe-2 transition-colors duration-200 motion-reduce:transition-none hover:bg-surface-muted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n spacer: 'shrink-0 self-stretch',\n content: 'flex items-center gap-1.5 min-w-0 flex-1',\n },\n variants: {\n size: {\n xs: { content: 'py-0' },\n sm: { content: 'py-0.5' },\n md: { content: 'py-1' },\n lg: { content: 'py-1.5' },\n xl: { content: 'py-2' },\n },\n selected: {\n true: { node: 'bg-primary-50 text-primary-700 hover:bg-primary-50' },\n false: {},\n },\n lines: {\n true: { spacer: 'border-s border-border' },\n false: {},\n },\n },\n defaultVariants: {\n size: 'md',\n selected: false,\n lines: false,\n },\n },\n { twMerge: true },\n);\n\n// ── TreeNodeDefDirective ─────────────────────────────────────────────\n//\n// Pure TemplateRef carrier for the consumer's per-node template. Mirrors\n// table's `CellDefDirective`: a typed context + `ngTemplateContextGuard` so\n// `let-node` / `let-expanded=\"expanded\"` etc. type-check inside the template.\n\n/** Structural directive (`*twTreeNode=\"let node\"`) declaring the per-node template. Typed as `TwTreeNodeContext<T>`. */\n@Directive({ selector: '[twTreeNode]' })\nexport class TreeNodeDefDirective<T = unknown> {\n /** @internal Consumer-projected per-node template. */\n readonly template = inject(TemplateRef<TwTreeNodeContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: TreeNodeDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwTreeNodeContext<T> {\n return true;\n }\n}\n\n// ── TreeComponent ────────────────────────────────────────────────────\n\n/**\n * A hierarchical, keyboard-navigable tree-view wrapping `@angular/cdk/tree`\n * (children-accessor model). Consumers supply the per-node template via the\n * `*twTreeNode` structural directive and receive a typed context exposing the\n * node, its depth/expansion/children flags, its selection state, and action\n * functions (`toggle`, `expand`, `collapse`, `toggleSelection`).\n *\n * Selection is optional and managed internally (`'none' | 'single' | 'multiple'`).\n * In `'multiple'` mode with `cascade`, selecting a branch selects all its leaf\n * descendants and the branch reports `'indeterminate'` when partially selected.\n * This is NOT a form control — selection is exposed via the `selectionChange`\n * output and the public `toggleSelection` / `selectionState` methods.\n */\n@Component({\n selector: 'tw-tree',\n exportAs: 'twTree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CdkTreeModule, NgTemplateOutlet],\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <cdk-tree\n #cdkTreeRef\n role=\"tree\"\n [dataSource]=\"dataArray()\"\n [childrenAccessor]=\"cdkChildrenAccessor\"\n [trackBy]=\"cdkTrackBy\"\n [expansionKey]=\"cdkExpansionKey\"\n >\n <cdk-tree-node\n *cdkTreeNodeDef=\"let node\"\n #treeNode=\"cdkTreeNode\"\n [class]=\"nodeClasses(node)\"\n [isExpandable]=\"hasChildren(node)\"\n [attr.aria-selected]=\"ariaSelected(node)\"\n [attr.aria-checked]=\"ariaChecked(node)\"\n (activation)=\"toggleSelection(node)\"\n (expandedChange)=\"onCdkExpandedChange(node, $event)\"\n >\n @for (marker of indentMarkers(treeNode.level); track $index) {\n <span [class]=\"spacerClasses()\" [style.width.px]=\"indentWidth()\"></span>\n }\n <span [class]=\"contentClasses()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()?.template ?? null\"\n [ngTemplateOutletContext]=\"buildContext(node, treeNode.level)\"\n />\n </span>\n </cdk-tree-node>\n </cdk-tree>\n `,\n})\nexport class TreeComponent<T = unknown> {\n // ── Inputs (5 — at the cap, do not add more) ──\n\n /** Root nodes of the tree. Each node's children are resolved via `childrenAccessor`. Defaults to `[]`. */\n readonly data = input<readonly T[]>([]);\n\n /** Resolves a node's direct children; return an empty array for leaf nodes. Required. */\n readonly childrenAccessor = input.required<(node: T) => readonly T[]>();\n\n /** Identifies a node across data changes and keys both expansion and selection state. When unset, node identity is used. */\n readonly trackBy = input<(node: T) => unknown>();\n\n /** Node-selection behavior — `mode`, `cascade`, `initialKeys`. Accepts a partial; unset keys fall back to the defaults. Defaults to selection disabled. */\n readonly selection = input<Partial<TwTreeSelectionConfig>>({});\n\n /** Display configuration — `size`, `indent`, `showLines`. Accepts a partial; unset keys fall back to the defaults. */\n readonly display = input<Partial<TwTreeDisplayConfig>>({});\n\n // ── Model (two-way) ──\n\n /** Two-way bound list of expansion key values (resolved via `trackBy`) for currently-expanded nodes. Set a new array on every change; do not mutate in place. Changes when a node is expanded or collapsed. Defaults to `[]` (all collapsed). */\n readonly expandedKeys = model<readonly unknown[]>([]);\n\n // ── Outputs ──\n\n /** Fires after the selection changes by user interaction. Payload is every node whose `selectionState` is `'checked'` (selected leaves plus fully-checked branches in cascade mode). */\n readonly selectionChange = output<readonly T[]>();\n\n /** Fires after a node is expanded or collapsed by user interaction. Payload identifies the node and its new expansion state. */\n readonly expandedChange = output<{ node: T; expanded: boolean }>();\n\n // ── Content / view queries ──\n\n /** @internal Consumer-projected per-node template (`*twTreeNode`). */\n readonly nodeTemplate = contentChild(TreeNodeDefDirective<T>);\n\n /** @internal The CDK tree inside our view. */\n private readonly cdkTree = viewChild.required<CdkTree<T>>('cdkTreeRef');\n\n // ── Internal selection state ──\n\n /** @internal Selected node keys. In cascade mode this holds leaf keys only; branch state is derived. */\n private readonly selectedKeys = signal<ReadonlySet<unknown>>(new Set());\n\n /** @internal One-shot guard so `initialKeys` seeds selection exactly once. */\n private seeded = false;\n\n // ── Resolved config ──\n\n /** @internal Resolved selection configuration. */\n private readonly resolvedSelection = computed<Required<TwTreeSelectionConfig>>(() => ({\n ...SELECTION_DEFAULTS,\n ...this.selection(),\n }));\n\n /** @internal Resolved display configuration. */\n private readonly resolvedDisplay = computed<Required<TwTreeDisplayConfig>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n /** @internal Indentation width in px per level. */\n readonly indentWidth = computed(() => this.resolvedDisplay().indent);\n\n /** @internal Snapshot of the root nodes as a mutable array (CDK's `dataSource` rejects `readonly T[]`). */\n readonly dataArray = computed<T[]>(() => [...this.data()]);\n\n // ── Variant class outputs ──\n\n private readonly variants = computed(() =>\n treeVariants({\n size: this.resolvedDisplay().size,\n lines: this.resolvedDisplay().showLines,\n }),\n );\n\n readonly rootClasses = computed(() => this.variants().root());\n readonly spacerClasses = computed(() => this.variants().spacer());\n readonly contentClasses = computed(() => this.variants().content());\n\n constructor() {\n // Seed selection from `initialKeys` exactly once — the first time selection\n // is enabled (`mode !== 'none'`), so the seed survives a config that arrives\n // after the initial change-detection pass. Reads `selection()` (tracked) and\n // writes `selectedKeys` (untracked, and never track-read here) → no cycle.\n effect(() => {\n const config = this.resolvedSelection();\n if (this.seeded || config.mode === 'none') return;\n this.seeded = true;\n untracked(() => this.selectedKeys.set(new Set(config.initialKeys)));\n });\n\n // model → CDK expansion sync. Reads `expandedKeys()` / `data()` /\n // `childrenAccessor()` (tracked) and writes ONLY to CDK's expansion model\n // (`expand`/`collapse` are idempotent — they `select`/`deselect` a key and\n // no-op when unchanged), never to a tracked signal → settles in one tick.\n effect(() => {\n const tree = this.cdkTree();\n const wanted = new Set(this.expandedKeys());\n const all = this.flattenAll();\n if (!tree) return;\n untracked(() => {\n for (const node of all) {\n const key = this.keyOf(node);\n const isOpen = tree.isExpanded(node);\n if (wanted.has(key) && !isOpen) tree.expand(node);\n else if (!wanted.has(key) && isOpen) tree.collapse(node);\n }\n });\n });\n }\n\n // ── Key + traversal helpers ──\n\n /** @internal Resolves a node's identity key via `trackBy`, falling back to the node itself. */\n private keyOf(node: T): unknown {\n const tb = this.trackBy();\n return tb ? tb(node) : node;\n }\n\n /** @internal Direct children of a node (always a fresh mutable array). */\n private childrenOf(node: T): readonly T[] {\n return this.childrenAccessor()(node);\n }\n\n /** Whether the node has at least one child (is a branch). */\n hasChildren(node: T): boolean {\n return this.childrenOf(node).length > 0;\n }\n\n /** @internal Depth-first list of every node in the tree (under collapsed parents too). */\n private flattenAll(): T[] {\n const out: T[] = [];\n const walk = (nodes: readonly T[]): void => {\n for (const n of nodes) {\n out.push(n);\n walk(this.childrenOf(n));\n }\n };\n walk(this.data());\n return out;\n }\n\n /** @internal All leaf descendants of a node (the node itself if it is a leaf). */\n private leavesOf(node: T): T[] {\n const out: T[] = [];\n const walk = (n: T): void => {\n const children = this.childrenOf(n);\n if (children.length === 0) {\n out.push(n);\n return;\n }\n for (const child of children) walk(child);\n };\n walk(node);\n return out;\n }\n\n // ── Template helpers ──\n\n /** @internal Array of length `level` used to render per-level indent spacers. */\n indentMarkers(level: number): readonly number[] {\n return level > 0 ? Array.from({ length: level }) : [];\n }\n\n /** @internal Per-node row classes (incorporates the selected state). */\n nodeClasses(node: T): string {\n return treeVariants({\n size: this.resolvedDisplay().size,\n lines: this.resolvedDisplay().showLines,\n selected: this.selectionState(node) === 'checked',\n }).node();\n }\n\n /** @internal Builds the typed context handed to the consumer's `*twTreeNode` template. */\n buildContext(node: T, level: number): TwTreeNodeContext<T> {\n return {\n $implicit: node,\n node,\n level,\n expanded: this.isExpanded(node),\n hasChildren: this.hasChildren(node),\n selectionState: this.selectionState(node),\n toggle: () => this.toggle(node),\n expand: () => this.expand(node),\n collapse: () => this.collapse(node),\n toggleSelection: () => this.toggleSelection(node),\n };\n }\n\n /**\n * @internal `aria-selected` for `'single'` mode (boolean selection), or `null`\n * otherwise. Multiple mode uses `aria-checked` instead so the tri-state\n * `'mixed'` value is exposed to assistive tech on the focusable treeitem.\n */\n ariaSelected(node: T): 'true' | 'false' | null {\n if (this.resolvedSelection().mode !== 'single') return null;\n return this.selectionState(node) === 'checked' ? 'true' : 'false';\n }\n\n /**\n * @internal Tri-state `aria-checked` for `'multiple'` mode (`'mixed'` for a\n * partially-selected branch), or `null` otherwise. APG exposes checkbox-tree\n * selection on the treeitem via `aria-checked`; `aria-selected` cannot carry\n * the indeterminate state.\n */\n ariaChecked(node: T): 'true' | 'false' | 'mixed' | null {\n if (this.resolvedSelection().mode !== 'multiple') return null;\n const state = this.selectionState(node);\n if (state === 'checked') return 'true';\n if (state === 'indeterminate') return 'mixed';\n return 'false';\n }\n\n // ── CDK boundary adapters (stable arrow fields) ──\n\n /** @internal Adapts the consumer's `readonly`-returning accessor to CDK's mutable-array contract. */\n readonly cdkChildrenAccessor = (node: T): T[] => [...this.childrenOf(node)];\n\n /** @internal CDK row-tracking function keyed via `trackBy`. */\n readonly cdkTrackBy: TrackByFunction<T> = (_index, node) => this.keyOf(node);\n\n /** @internal Keys CDK's expansion model via `trackBy`. */\n readonly cdkExpansionKey = (node: T): unknown => this.keyOf(node);\n\n // ── Expansion ──\n\n /** Whether the node is currently expanded. */\n isExpanded(node: T): boolean {\n return this.cdkTree().isExpanded(node);\n }\n\n /** Expands the node if collapsed. Emits `expandedChange` and updates `expandedKeys` via the CDK callback. */\n expand(node: T): void {\n this.cdkTree().expand(node);\n }\n\n /** Collapses the node if expanded. Emits `expandedChange` and updates `expandedKeys` via the CDK callback. */\n collapse(node: T): void {\n this.cdkTree().collapse(node);\n }\n\n /** Toggles the node's expand/collapse state. No-op on leaf nodes. */\n toggle(node: T): void {\n if (!this.hasChildren(node)) return;\n this.cdkTree().toggle(node);\n }\n\n /**\n * @internal Bridges CDK's per-node `(expandedChange)` to the `expandedKeys`\n * model. Compare-before-write: only mutates the model and emits when the\n * key's membership actually changes, so the model→CDK effect cannot loop.\n */\n onCdkExpandedChange(node: T, expanded: boolean): void {\n const key = this.keyOf(node);\n const current = new Set(this.expandedKeys());\n const has = current.has(key);\n if (expanded && !has) {\n current.add(key);\n this.expandedKeys.set([...current]);\n this.expandedChange.emit({ node, expanded: true });\n } else if (!expanded && has) {\n current.delete(key);\n this.expandedKeys.set([...current]);\n this.expandedChange.emit({ node, expanded: false });\n }\n }\n\n // ── Selection ──\n\n /**\n * Returns the tri-state selection status of a node. `'unchecked'` when\n * selection is disabled.\n *\n * For cascade branches this walks the node's leaf descendants on each call and\n * is invoked a few times per node per change-detection pass (row class, ARIA,\n * context). This assumes small-to-medium trees; the component has no\n * virtualization and is not tuned for very large data sets.\n */\n selectionState(node: T): TwTreeSelectionState {\n const mode = this.resolvedSelection().mode;\n if (mode === 'none') return 'unchecked';\n\n const selected = this.selectedKeys();\n if (mode === 'single') {\n return selected.has(this.keyOf(node)) ? 'checked' : 'unchecked';\n }\n\n // multiple\n if (!this.resolvedSelection().cascade || !this.hasChildren(node)) {\n return selected.has(this.keyOf(node)) ? 'checked' : 'unchecked';\n }\n\n // cascade branch: derive from leaf descendants\n const leaves = this.leavesOf(node);\n if (leaves.length === 0) return 'unchecked';\n let selectedCount = 0;\n for (const leaf of leaves) {\n if (selected.has(this.keyOf(leaf))) selectedCount++;\n }\n if (selectedCount === 0) return 'unchecked';\n if (selectedCount === leaves.length) return 'checked';\n return 'indeterminate';\n }\n\n /** Toggles selection for a node (cascades to leaf descendants in `'multiple'` mode with `cascade` on). No-op when `selection.mode === 'none'`. */\n toggleSelection(node: T): void {\n const config = this.resolvedSelection();\n if (config.mode === 'none') return;\n\n const next = new Set(this.selectedKeys());\n const key = this.keyOf(node);\n\n if (config.mode === 'single') {\n const wasSelected = next.has(key);\n next.clear();\n if (!wasSelected) next.add(key);\n } else if (!config.cascade || !this.hasChildren(node)) {\n if (next.has(key)) next.delete(key);\n else next.add(key);\n } else {\n // cascade branch: select all leaf descendants unless already fully checked\n const fullyChecked = this.selectionState(node) === 'checked';\n for (const leaf of this.leavesOf(node)) {\n const leafKey = this.keyOf(leaf);\n if (fullyChecked) next.delete(leafKey);\n else next.add(leafKey);\n }\n }\n\n this.selectedKeys.set(next);\n this.selectionChange.emit(this.selectedNodes());\n }\n\n /** @internal Every node currently reporting `selectionState() === 'checked'`. */\n private selectedNodes(): readonly T[] {\n if (this.resolvedSelection().mode === 'none') return [];\n return this.flattenAll().filter((node) => this.selectionState(node) === 'checked');\n }\n}\n\n// ── TreeNodeToggleDirective ──────────────────────────────────────────\n//\n// Optional low-ceremony toggle: `<button twTreeNodeToggle [twTreeNodeToggle]=\"node\">`.\n// It injects the host `TreeComponent` (an ancestor at the consumer's declaration\n// site) and calls `tree.toggle(node)` on click. It deliberately does NOT extend\n// CDK's `CdkTreeNodeToggle`, which injects `CdkTreeNode` — that node lives inside\n// TreeComponent's own view and is unreachable from a projected `*twTreeNode`\n// template (DI resolves at the declaration site, not the insertion site). For\n// most cases the context `toggle()` function is simpler.\n\n/** Attribute directive (`[twTreeNodeToggle]=\"node\"`) that toggles the given node's expansion on click. */\n@Directive({\n selector: '[twTreeNodeToggle]',\n host: {\n '(click)': 'onClick($event)',\n },\n})\nexport class TreeNodeToggleDirective<T = unknown> {\n private readonly tree = inject(TreeComponent<T>);\n\n /** The node whose expansion this control toggles. */\n readonly node = input.required<T>({ alias: 'twTreeNodeToggle' });\n\n /** @internal Toggles the node and stops the click from bubbling to row activation. */\n onClick(event: Event): void {\n event.stopPropagation();\n this.tree.toggle(this.node());\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-tree.mjs","sources":["../../../projects/ngx-tw/tree/tree.ts","../../../projects/ngx-tw/tree/cdevhub-ngx-tw-tree.ts"],"sourcesContent":["/*\n * tw-tree — hierarchical, keyboard-navigable tree-view wrapping Angular CDK's\n * `CdkTree` (children-accessor model). CDK owns flattening, the expansion model,\n * ARIA wiring (`role=\"tree\"`/`\"treeitem\"`, `aria-level`/`-setsize`/`-posinset`/\n * `-expanded`) and roving-tabindex keyboard navigation; this component owns the\n * row wrapper, per-level indentation, optional connector lines, optional\n * (consumer-rendered) selection, and a typed per-node template context.\n *\n * Architecture decisions (verified against @angular/cdk 21.2.x source):\n * - Children-accessor render path only. `treeControl` / `FlatTreeControl` /\n * `NestedTreeControl` are @deprecated in CDK v21 and are NOT used. Flat\n * `cdk-tree-node` + a single `*cdkTreeNodeDef` (not `cdkNestedTreeNode`).\n * - `[isExpandable]` MUST be bound per node. Without a `treeControl`,\n * `CdkTreeNode._isExpandable()` returns the `isExpandable` *input* (default\n * `false`); unbound, branches get no `aria-expanded`, `expand()/collapse()`\n * no-op, and arrow-key expansion is dead. We bind it from `hasChildren(node)`.\n * - `CdkTreeNode.isLeafNode` is unusable here: with no `treeControl` its getter\n * short-circuits the optional-chain to `undefined` and returns `false` for\n * EVERY node (silently — no throw). We compute `hasChildren` ourselves.\n * - Selection is OURS, not CDK tree's (CDK's model is expansion-only). It lives\n * in a `signal<ReadonlySet<unknown>>` of node keys — a signal (not CDK's\n * `SelectionModel`) so it integrates with OnPush + `computed()` without\n * bridging an RxJS `changed` stream. NOT a form control (no CVA).\n * - Expansion is bidirectionally synced with the `expandedKeys` model:\n * model→CDK via a guarded `effect()` (CDK's `select`/`deselect` are\n * idempotent → settles in one tick), plus a one-shot `afterNextRender()`\n * replay because CDK's expansion model does not exist yet on the effect's\n * first run and `CdkTree.expand()` no-ops silently until it does; CDK→model\n * via each node's `(expandedChange)` output with compare-before-write (no\n * signal cycle).\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n type TrackByFunction,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { type CdkTree, CdkTreeModule } from '@angular/cdk/tree';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** Tri-state selection status of a tree node. */\nexport type TwTreeSelectionState = 'checked' | 'unchecked' | 'indeterminate';\n\n/** Configuration for node selection behavior. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTreeSelectionConfig {\n /** Selection mode. `'single'` is scalar (one node, no cascade/indeterminate); `'multiple'` supports cascade + tri-state. `'none'` disables selection. Defaults to `'none'`. */\n mode: 'none' | 'single' | 'multiple';\n /** In `'multiple'` mode, selecting a branch selects all its leaf descendants and a branch renders `'indeterminate'` when only some are selected. Ignored in `'single'`/`'none'`. Defaults to `true`. */\n cascade?: boolean;\n /** Pre-selected node keys (matched via `trackBy`). In cascade mode these are leaf-node keys. Defaults to `[]`. */\n initialKeys?: readonly unknown[];\n}\n\n/** Display configuration for the tree. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTreeDisplayConfig {\n /** Row vertical density. Defaults to `'md'`. */\n size?: TwSize;\n /** Indentation per level, in pixels. Defaults to `16`. */\n indent?: number;\n /** Render connecting guide lines down the indent gutter. Defaults to `false`. */\n showLines?: boolean;\n}\n\n/** Context surfaced to a `*twTreeNode` template. Generic over the node type `T`. */\nexport interface TwTreeNodeContext<T> {\n /** The node data (implicit `let-node`). */\n $implicit: T;\n /** The node data, aliased for readability. */\n node: T;\n /** Zero-based depth of the node. */\n level: number;\n /** Whether the node is currently expanded. Always `false` for leaf nodes. */\n expanded: boolean;\n /** Whether the node has children (is a branch, not a leaf). */\n hasChildren: boolean;\n /** Tri-state selection status of this node. `'unchecked'` when selection is disabled. */\n selectionState: TwTreeSelectionState;\n /** Toggles this node's expand/collapse state. No-op on leaf nodes. */\n toggle: () => void;\n /** Expands this node. No-op on leaf nodes or when already expanded. */\n expand: () => void;\n /** Collapses this node. No-op when already collapsed. */\n collapse: () => void;\n /** Toggles this node's selection (cascades in `'multiple'` mode with `cascade` on). No-op when selection is disabled. */\n toggleSelection: () => void;\n}\n\n// ── Resolved-default constants ───────────────────────────────────────\n\nconst SELECTION_DEFAULTS: Required<TwTreeSelectionConfig> = {\n mode: 'none',\n cascade: true,\n initialKeys: [],\n};\n\nconst DISPLAY_DEFAULTS: Required<TwTreeDisplayConfig> = {\n size: 'md',\n indent: 16,\n showLines: false,\n};\n\n// ── tv() config ──────────────────────────────────────────────────────\n//\n// Indentation is rendered with one spacer span per ancestor level (width =\n// `indent` px) rather than a single inline `padding-left`: this avoids an\n// inline-style-vs-class left-padding conflict and lets `showLines` draw a\n// per-level vertical guide (`border-s` on each stretched spacer) instead of a\n// single root rail. `items-stretch` on the row makes spacers span the full row\n// height so guides connect across stacked rows; the content wrapper re-centers\n// the projected template vertically.\n\nconst treeVariants = tv(\n {\n slots: {\n root: 'block',\n node: 'group/node flex items-stretch rounded-md cursor-pointer select-none text-sm text-fg pe-2 transition-colors duration-200 motion-reduce:transition-none hover:bg-surface-muted focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n spacer: 'shrink-0 self-stretch',\n content: 'flex items-center gap-1.5 min-w-0 flex-1',\n },\n variants: {\n // Tree nodes are on the `min-h-*` list (docs/vertical-rhythm.md §2), not\n // the pinned one: a consumer's node template may wrap onto a second line,\n // so the row must stay free to grow. The floor lands on the control scale\n // (24 / 32 / 36 / 44 / 48) exactly as `menu`'s rows do, and `py-*` is kept\n // as it was — it sets the breathing room around a wrapped row, where the\n // floor no longer binds.\n //\n // The row is also the pointer target: it carries `(activation)` and the\n // `treeitem` role, and it was the *only* member of that cohort shipping no\n // floor at all, so at `xs` it measured one `text-sm` line box — 20px,\n // under the WCAG 2.2 SC 2.5.8 24px minimum. The floor fixes the rhythm\n // gap and the target-size defect with one value.\n //\n // Resting heights the floor binds against (text-sm line box = 20px):\n // xs → py-0 (0) + 20 = 20 → 24 (`min-h-6`)\n // sm → py-0.5 (4) + 20 = 24 → 32 (`min-h-8`)\n // md → py-1 (8) + 20 = 28 → 36 (`min-h-9`)\n // lg → py-1.5 (12) + 20 = 32 → 44 (`min-h-11`)\n // xl → py-2 (16) + 20 = 36 → 48 (`min-h-12`)\n size: {\n xs: { node: 'min-h-6', content: 'py-0' },\n sm: { node: 'min-h-8', content: 'py-0.5' },\n md: { node: 'min-h-9', content: 'py-1' },\n lg: { node: 'min-h-11', content: 'py-1.5' },\n xl: { node: 'min-h-12', content: 'py-2' },\n },\n selected: {\n true: { node: 'bg-primary-50 text-primary-700 hover:bg-primary-50' },\n false: {},\n },\n lines: {\n true: { spacer: 'border-s border-border' },\n false: {},\n },\n },\n defaultVariants: {\n size: 'md',\n selected: false,\n lines: false,\n },\n },\n { twMerge: true },\n);\n\n// ── TreeNodeDefDirective ─────────────────────────────────────────────\n//\n// Pure TemplateRef carrier for the consumer's per-node template. Mirrors\n// table's `CellDefDirective`: a typed context + `ngTemplateContextGuard` so\n// `let-node` / `let-expanded=\"expanded\"` etc. type-check inside the template.\n\n/** Structural directive (`*twTreeNode=\"let node\"`) declaring the per-node template. Typed as `TwTreeNodeContext<T>`. */\n@Directive({ selector: '[twTreeNode]' })\nexport class TreeNodeDefDirective<T = unknown> {\n /** @internal Consumer-projected per-node template. */\n readonly template = inject(TemplateRef<TwTreeNodeContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: TreeNodeDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwTreeNodeContext<T> {\n return true;\n }\n}\n\n// ── TreeComponent ────────────────────────────────────────────────────\n\n/**\n * A hierarchical, keyboard-navigable tree-view wrapping `@angular/cdk/tree`\n * (children-accessor model). Consumers supply the per-node template via the\n * `*twTreeNode` structural directive and receive a typed context exposing the\n * node, its depth/expansion/children flags, its selection state, and action\n * functions (`toggle`, `expand`, `collapse`, `toggleSelection`).\n *\n * Selection is optional and managed internally (`'none' | 'single' | 'multiple'`).\n * In `'multiple'` mode with `cascade`, selecting a branch selects all its leaf\n * descendants and the branch reports `'indeterminate'` when partially selected.\n * This is NOT a form control — selection is exposed via the `selectionChange`\n * output and the public `toggleSelection` / `selectionState` methods.\n */\n@Component({\n selector: 'tw-tree',\n exportAs: 'twTree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CdkTreeModule, NgTemplateOutlet],\n host: {\n '[class]': 'rootClasses()',\n },\n template: `\n <cdk-tree\n #cdkTreeRef\n role=\"tree\"\n [dataSource]=\"dataArray()\"\n [childrenAccessor]=\"cdkChildrenAccessor\"\n [trackBy]=\"cdkTrackBy\"\n [expansionKey]=\"cdkExpansionKey\"\n >\n <cdk-tree-node\n *cdkTreeNodeDef=\"let node\"\n #treeNode=\"cdkTreeNode\"\n [class]=\"nodeClasses(node)\"\n [isExpandable]=\"hasChildren(node)\"\n [attr.aria-selected]=\"ariaSelected(node)\"\n [attr.aria-checked]=\"ariaChecked(node)\"\n (activation)=\"toggleSelection(node)\"\n (expandedChange)=\"onCdkExpandedChange(node, $event)\"\n >\n @for (marker of indentMarkers(treeNode.level); track $index) {\n <span [class]=\"spacerClasses()\" [style.width.px]=\"indentWidth()\"></span>\n }\n <span [class]=\"contentClasses()\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()?.template ?? null\"\n [ngTemplateOutletContext]=\"buildContext(node, treeNode.level)\"\n />\n </span>\n </cdk-tree-node>\n </cdk-tree>\n `,\n})\nexport class TreeComponent<T = unknown> {\n // ── Inputs (5 — at the cap, do not add more) ──\n\n /** Root nodes of the tree. Each node's children are resolved via `childrenAccessor`. Defaults to `[]`. */\n readonly data = input<readonly T[]>([]);\n\n /** Resolves a node's direct children; return an empty array for leaf nodes. Required. */\n readonly childrenAccessor = input.required<(node: T) => readonly T[]>();\n\n /** Identifies a node across data changes and keys both expansion and selection state. When unset, node identity is used. */\n readonly trackBy = input<(node: T) => unknown>();\n\n /** Node-selection behavior — `mode`, `cascade`, `initialKeys`. Accepts a partial; unset keys fall back to the defaults. Defaults to selection disabled. */\n readonly selection = input<Partial<TwTreeSelectionConfig>>({});\n\n /** Display configuration — `size`, `indent`, `showLines`. Accepts a partial; unset keys fall back to the defaults. */\n readonly display = input<Partial<TwTreeDisplayConfig>>({});\n\n // ── Model (two-way) ──\n\n /** Two-way bound list of expansion key values (resolved via `trackBy`) for currently-expanded nodes. Set a new array on every change; do not mutate in place. Changes when a node is expanded or collapsed. Defaults to `[]` (all collapsed). */\n readonly expandedKeys = model<readonly unknown[]>([]);\n\n // ── Outputs ──\n\n /** Fires after the selection changes by user interaction. Payload is every node whose `selectionState` is `'checked'` (selected leaves plus fully-checked branches in cascade mode). */\n readonly selectionChange = output<readonly T[]>();\n\n /** Fires after a node is expanded or collapsed by user interaction. Payload identifies the node and its new expansion state. */\n readonly expandedChange = output<{ node: T; expanded: boolean }>();\n\n // ── Content / view queries ──\n\n /** @internal Consumer-projected per-node template (`*twTreeNode`). */\n readonly nodeTemplate = contentChild(TreeNodeDefDirective<T>);\n\n /** @internal The CDK tree inside our view. */\n private readonly cdkTree = viewChild.required<CdkTree<T>>('cdkTreeRef');\n\n // ── Internal selection state ──\n\n /** @internal Selected node keys. In cascade mode this holds leaf keys only; branch state is derived. */\n private readonly selectedKeys = signal<ReadonlySet<unknown>>(new Set());\n\n /** @internal One-shot guard so `initialKeys` seeds selection exactly once. */\n private seeded = false;\n\n // ── Resolved config ──\n\n /** @internal Resolved selection configuration. */\n private readonly resolvedSelection = computed<Required<TwTreeSelectionConfig>>(() => ({\n ...SELECTION_DEFAULTS,\n ...this.selection(),\n }));\n\n /** @internal Resolved display configuration. */\n private readonly resolvedDisplay = computed<Required<TwTreeDisplayConfig>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n /** @internal Indentation width in px per level. */\n readonly indentWidth = computed(() => this.resolvedDisplay().indent);\n\n /** @internal Snapshot of the root nodes as a mutable array (CDK's `dataSource` rejects `readonly T[]`). */\n readonly dataArray = computed<T[]>(() => [...this.data()]);\n\n // ── Variant class outputs ──\n\n private readonly variants = computed(() =>\n treeVariants({\n size: this.resolvedDisplay().size,\n lines: this.resolvedDisplay().showLines,\n }),\n );\n\n readonly rootClasses = computed(() => this.variants().root());\n readonly spacerClasses = computed(() => this.variants().spacer());\n readonly contentClasses = computed(() => this.variants().content());\n\n constructor() {\n // Seed selection from `initialKeys` exactly once — the first time selection\n // is enabled (`mode !== 'none'`), so the seed survives a config that arrives\n // after the initial change-detection pass. Reads `selection()` (tracked) and\n // writes `selectedKeys` (untracked, and never track-read here) → no cycle.\n effect(() => {\n const config = this.resolvedSelection();\n if (this.seeded || config.mode === 'none') return;\n this.seeded = true;\n untracked(() => this.selectedKeys.set(new Set(config.initialKeys)));\n });\n\n // model → CDK expansion sync. Reads `expandedKeys()` / `data()` /\n // `childrenAccessor()` (tracked) and writes ONLY to CDK's expansion model\n // (`expand`/`collapse` are idempotent — they `select`/`deselect` a key and\n // no-op when unchanged), never to a tracked signal → settles in one tick.\n effect(() => {\n const tree = this.cdkTree();\n const wanted = new Set(this.expandedKeys());\n const all = this.flattenAll();\n if (!tree) return;\n untracked(() => this.applyExpansion(tree, wanted, all));\n });\n\n // The effect above runs for the first time BEFORE `cdk-tree`'s `dataSource`\n // binding is applied — and CDK creates its expansion model lazily, at that\n // binding. Until the model exists, `CdkTree.expand()` falls through both of\n // its branches (`if (this.treeControl) … else if (this._expansionModel) …`)\n // and does nothing, with no error. So an `expandedKeys` value that was\n // already populated at mount was dropped on the floor, and the effect never\n // re-ran to correct it because none of its inputs had changed: the tree\n // rendered fully collapsed for the rest of its life. Re-apply once the first\n // render has happened, by which point the model exists.\n //\n // `applyExpansion` is idempotent (it compares against `tree.isExpanded`), so\n // this is a no-op in every case where the effect already succeeded, and\n // `onCdkExpandedChange` compares before writing, so no spurious\n // `expandedChange` is emitted.\n // No `if (!tree)` guard here, deliberately: `cdkTree` is a `viewChild.required`,\n // which throws rather than returning undefined, and this hook only runs after a\n // render — so the query is always resolved. Angular disposes render hooks with\n // the component's injector, so a tree destroyed before its first render never\n // reaches this at all (both cases are asserted in `tree.spec.ts`).\n afterNextRender(() => {\n this.applyExpansion(this.cdkTree(), new Set(this.expandedKeys()), this.flattenAll());\n });\n }\n\n /**\n * @internal Drives CDK's expansion model to match `wanted`. Idempotent — every\n * node is compared against `tree.isExpanded` before being touched.\n */\n private applyExpansion(\n tree: CdkTree<T>,\n wanted: ReadonlySet<unknown>,\n all: readonly T[],\n ): void {\n for (const node of all) {\n const key = this.keyOf(node);\n const isOpen = tree.isExpanded(node);\n if (wanted.has(key) && !isOpen) tree.expand(node);\n else if (!wanted.has(key) && isOpen) tree.collapse(node);\n }\n }\n\n // ── Key + traversal helpers ──\n\n /** @internal Resolves a node's identity key via `trackBy`, falling back to the node itself. */\n private keyOf(node: T): unknown {\n const tb = this.trackBy();\n return tb ? tb(node) : node;\n }\n\n /** @internal Direct children of a node (always a fresh mutable array). */\n private childrenOf(node: T): readonly T[] {\n return this.childrenAccessor()(node);\n }\n\n /** Whether the node has at least one child (is a branch). */\n hasChildren(node: T): boolean {\n return this.childrenOf(node).length > 0;\n }\n\n /** @internal Depth-first list of every node in the tree (under collapsed parents too). */\n private flattenAll(): T[] {\n const out: T[] = [];\n const walk = (nodes: readonly T[]): void => {\n for (const n of nodes) {\n out.push(n);\n walk(this.childrenOf(n));\n }\n };\n walk(this.data());\n return out;\n }\n\n /** @internal All leaf descendants of a node (the node itself if it is a leaf). */\n private leavesOf(node: T): T[] {\n const out: T[] = [];\n const walk = (n: T): void => {\n const children = this.childrenOf(n);\n if (children.length === 0) {\n out.push(n);\n return;\n }\n for (const child of children) walk(child);\n };\n walk(node);\n return out;\n }\n\n // ── Template helpers ──\n\n /** @internal Array of length `level` used to render per-level indent spacers. */\n indentMarkers(level: number): readonly number[] {\n return level > 0 ? Array.from({ length: level }) : [];\n }\n\n /** @internal Per-node row classes (incorporates the selected state). */\n nodeClasses(node: T): string {\n return treeVariants({\n size: this.resolvedDisplay().size,\n lines: this.resolvedDisplay().showLines,\n selected: this.selectionState(node) === 'checked',\n }).node();\n }\n\n /** @internal Builds the typed context handed to the consumer's `*twTreeNode` template. */\n buildContext(node: T, level: number): TwTreeNodeContext<T> {\n return {\n $implicit: node,\n node,\n level,\n expanded: this.isExpanded(node),\n hasChildren: this.hasChildren(node),\n selectionState: this.selectionState(node),\n toggle: () => this.toggle(node),\n expand: () => this.expand(node),\n collapse: () => this.collapse(node),\n toggleSelection: () => this.toggleSelection(node),\n };\n }\n\n /**\n * @internal `aria-selected` for `'single'` mode (boolean selection), or `null`\n * otherwise. Multiple mode uses `aria-checked` instead so the tri-state\n * `'mixed'` value is exposed to assistive tech on the focusable treeitem.\n */\n ariaSelected(node: T): 'true' | 'false' | null {\n if (this.resolvedSelection().mode !== 'single') return null;\n return this.selectionState(node) === 'checked' ? 'true' : 'false';\n }\n\n /**\n * @internal Tri-state `aria-checked` for `'multiple'` mode (`'mixed'` for a\n * partially-selected branch), or `null` otherwise. APG exposes checkbox-tree\n * selection on the treeitem via `aria-checked`; `aria-selected` cannot carry\n * the indeterminate state.\n */\n ariaChecked(node: T): 'true' | 'false' | 'mixed' | null {\n if (this.resolvedSelection().mode !== 'multiple') return null;\n const state = this.selectionState(node);\n if (state === 'checked') return 'true';\n if (state === 'indeterminate') return 'mixed';\n return 'false';\n }\n\n // ── CDK boundary adapters (stable arrow fields) ──\n\n /** @internal Adapts the consumer's `readonly`-returning accessor to CDK's mutable-array contract. */\n readonly cdkChildrenAccessor = (node: T): T[] => [...this.childrenOf(node)];\n\n /** @internal CDK row-tracking function keyed via `trackBy`. */\n readonly cdkTrackBy: TrackByFunction<T> = (_index, node) => this.keyOf(node);\n\n /** @internal Keys CDK's expansion model via `trackBy`. */\n readonly cdkExpansionKey = (node: T): unknown => this.keyOf(node);\n\n // ── Expansion ──\n\n /** Whether the node is currently expanded. */\n isExpanded(node: T): boolean {\n return this.cdkTree().isExpanded(node);\n }\n\n /** Expands the node if collapsed. Emits `expandedChange` and updates `expandedKeys` via the CDK callback. */\n expand(node: T): void {\n this.cdkTree().expand(node);\n }\n\n /** Collapses the node if expanded. Emits `expandedChange` and updates `expandedKeys` via the CDK callback. */\n collapse(node: T): void {\n this.cdkTree().collapse(node);\n }\n\n /** Toggles the node's expand/collapse state. No-op on leaf nodes. */\n toggle(node: T): void {\n if (!this.hasChildren(node)) return;\n this.cdkTree().toggle(node);\n }\n\n /**\n * @internal Bridges CDK's per-node `(expandedChange)` to the `expandedKeys`\n * model. Compare-before-write: only mutates the model and emits when the\n * key's membership actually changes, so the model→CDK effect cannot loop.\n */\n onCdkExpandedChange(node: T, expanded: boolean): void {\n const key = this.keyOf(node);\n const current = new Set(this.expandedKeys());\n const has = current.has(key);\n if (expanded && !has) {\n current.add(key);\n this.expandedKeys.set([...current]);\n this.expandedChange.emit({ node, expanded: true });\n } else if (!expanded && has) {\n current.delete(key);\n this.expandedKeys.set([...current]);\n this.expandedChange.emit({ node, expanded: false });\n }\n }\n\n // ── Selection ──\n\n /**\n * Returns the tri-state selection status of a node. `'unchecked'` when\n * selection is disabled.\n *\n * For cascade branches this walks the node's leaf descendants on each call and\n * is invoked a few times per node per change-detection pass (row class, ARIA,\n * context). This assumes small-to-medium trees; the component has no\n * virtualization and is not tuned for very large data sets.\n */\n selectionState(node: T): TwTreeSelectionState {\n const mode = this.resolvedSelection().mode;\n if (mode === 'none') return 'unchecked';\n\n const selected = this.selectedKeys();\n if (mode === 'single') {\n return selected.has(this.keyOf(node)) ? 'checked' : 'unchecked';\n }\n\n // multiple\n if (!this.resolvedSelection().cascade || !this.hasChildren(node)) {\n return selected.has(this.keyOf(node)) ? 'checked' : 'unchecked';\n }\n\n // cascade branch: derive from leaf descendants\n const leaves = this.leavesOf(node);\n if (leaves.length === 0) return 'unchecked';\n let selectedCount = 0;\n for (const leaf of leaves) {\n if (selected.has(this.keyOf(leaf))) selectedCount++;\n }\n if (selectedCount === 0) return 'unchecked';\n if (selectedCount === leaves.length) return 'checked';\n return 'indeterminate';\n }\n\n /** Toggles selection for a node (cascades to leaf descendants in `'multiple'` mode with `cascade` on). No-op when `selection.mode === 'none'`. */\n toggleSelection(node: T): void {\n const config = this.resolvedSelection();\n if (config.mode === 'none') return;\n\n const next = new Set(this.selectedKeys());\n const key = this.keyOf(node);\n\n if (config.mode === 'single') {\n const wasSelected = next.has(key);\n next.clear();\n if (!wasSelected) next.add(key);\n } else if (!config.cascade || !this.hasChildren(node)) {\n if (next.has(key)) next.delete(key);\n else next.add(key);\n } else {\n // cascade branch: select all leaf descendants unless already fully checked\n const fullyChecked = this.selectionState(node) === 'checked';\n for (const leaf of this.leavesOf(node)) {\n const leafKey = this.keyOf(leaf);\n if (fullyChecked) next.delete(leafKey);\n else next.add(leafKey);\n }\n }\n\n this.selectedKeys.set(next);\n this.selectionChange.emit(this.selectedNodes());\n }\n\n /** @internal Every node currently reporting `selectionState() === 'checked'`. */\n private selectedNodes(): readonly T[] {\n if (this.resolvedSelection().mode === 'none') return [];\n return this.flattenAll().filter((node) => this.selectionState(node) === 'checked');\n }\n}\n\n// ── TreeNodeToggleDirective ──────────────────────────────────────────\n//\n// Optional low-ceremony toggle: `<button twTreeNodeToggle [twTreeNodeToggle]=\"node\">`.\n// It injects the host `TreeComponent` (an ancestor at the consumer's declaration\n// site) and calls `tree.toggle(node)` on click. It deliberately does NOT extend\n// CDK's `CdkTreeNodeToggle`, which injects `CdkTreeNode` — that node lives inside\n// TreeComponent's own view and is unreachable from a projected `*twTreeNode`\n// template (DI resolves at the declaration site, not the insertion site). For\n// most cases the context `toggle()` function is simpler.\n\n/** Attribute directive (`[twTreeNodeToggle]=\"node\"`) that toggles the given node's expansion on click. */\n@Directive({\n selector: '[twTreeNodeToggle]',\n host: {\n '(click)': 'onClick($event)',\n },\n})\nexport class TreeNodeToggleDirective<T = unknown> {\n private readonly tree = inject(TreeComponent<T>);\n\n /** The node whose expansion this control toggles. Alias: `twTreeNodeToggle`. */\n readonly node = input.required<T>({ alias: 'twTreeNodeToggle' });\n\n /** @internal Toggles the node and stops the click from bubbling to row activation. */\n onClick(event: Event): void {\n event.stopPropagation();\n this.tree.toggle(this.node());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|