@cdevhub/ngx-tw 0.4.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.
Files changed (209) hide show
  1. package/README.md +78 -15
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
  5. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
  7. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  8. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
  9. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
  11. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
  13. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
  15. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
  17. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
  19. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
  21. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
  23. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
  25. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
  27. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
  29. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
  35. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
  37. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
  41. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
  43. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
  44. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
  45. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  46. package/fesm2022/cdevhub-ngx-tw-dialog-dialog-renderer-DoIhoV3d.mjs +198 -0
  47. package/fesm2022/cdevhub-ngx-tw-dialog-dialog-renderer-DoIhoV3d.mjs.map +1 -0
  48. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
  49. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
  50. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +199 -220
  51. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
  53. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
  55. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
  56. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
  57. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
  59. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
  61. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  62. package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
  63. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
  65. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-item.mjs +18 -3
  67. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
  69. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
  70. package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
  71. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
  73. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
  75. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
  77. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
  79. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
  81. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
  83. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
  85. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
  86. package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
  87. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs +256 -0
  89. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
  90. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
  91. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
  92. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +197 -278
  93. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
  95. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
  97. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
  99. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
  101. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  102. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
  103. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
  105. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
  107. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
  109. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
  111. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
  113. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
  114. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
  115. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
  116. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
  117. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  118. package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
  119. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  120. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
  121. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
  122. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
  123. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  124. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
  125. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  126. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs +616 -0
  127. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
  128. package/fesm2022/cdevhub-ngx-tw-toast.mjs +556 -945
  129. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  130. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
  131. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  132. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
  133. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
  134. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
  135. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
  136. package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
  137. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
  138. package/index.json +1 -1
  139. package/package.json +63 -2
  140. package/theme/_base.css +13 -0
  141. package/theme/_dark.css +110 -36
  142. package/theme/_high-contrast-dark.css +367 -0
  143. package/theme/_high-contrast.css +13 -2
  144. package/theme/_light.css +276 -0
  145. package/theme/_semantic.css +47 -12
  146. package/theme/_typography.css +17 -0
  147. package/theme/index.css +86 -7
  148. package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
  149. package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
  150. package/types/cdevhub-ngx-tw-button.d.ts +1 -0
  151. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
  152. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
  153. package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
  154. package/types/cdevhub-ngx-tw-card.d.ts +11 -3
  155. package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
  156. package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
  157. package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
  158. package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
  159. package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
  160. package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
  161. package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
  162. package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
  163. package/types/cdevhub-ngx-tw-core.d.ts +152 -21
  164. package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
  165. package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
  166. package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
  167. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
  168. package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
  169. package/types/cdevhub-ngx-tw-dialog.d.ts +89 -19
  170. package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
  171. package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
  172. package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
  173. package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
  174. package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
  175. package/types/cdevhub-ngx-tw-input.d.ts +5 -8
  176. package/types/cdevhub-ngx-tw-item.d.ts +2 -0
  177. package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
  178. package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
  179. package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
  180. package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
  181. package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
  182. package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
  183. package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
  184. package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
  185. package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
  186. package/types/cdevhub-ngx-tw-select.d.ts +104 -33
  187. package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
  188. package/types/cdevhub-ngx-tw-sheet.d.ts +96 -21
  189. package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
  190. package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
  191. package/types/cdevhub-ngx-tw-split.d.ts +32 -2
  192. package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
  193. package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
  194. package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
  195. package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
  196. package/types/cdevhub-ngx-tw-table.d.ts +53 -10
  197. package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
  198. package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
  199. package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
  200. package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
  201. package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
  202. package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
  203. package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
  204. package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
  205. package/types/cdevhub-ngx-tw-toast.d.ts +61 -12
  206. package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
  207. package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
  208. package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
  209. package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-split.mjs","sources":["../../../projects/ngx-tw/split/split-pane.ts","../../../projects/ngx-tw/split/split-sizing.ts","../../../projects/ngx-tw/split/split.ts","../../../projects/ngx-tw/split/split-gutter.ts","../../../projects/ngx-tw/split/split-pane-header.ts","../../../projects/ngx-tw/split/cdevhub-ngx-tw-split.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\n/**\n * A single resizable pane inside `<tw-split>`.\n * Declare size constraints here; the parent container drives the actual sizing.\n */\n@Component({\n selector: 'tw-split-pane',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.id]': '_paneId()',\n '[style.flex-basis]': '_basis()',\n '[style.min-width]': '\"0\"',\n '[style.min-height]': '\"0\"',\n '[style.order]': '_index() * 2',\n '[attr.data-split-pane-collapsed]': '_collapsed()',\n class: 'overflow-auto',\n },\n template: `<ng-content />`,\n})\nexport class SplitPaneComponent {\n /** Initial size of this pane in the container's unit. Omit to use even distribution. */\n readonly defaultSize = input<number | undefined>(undefined);\n\n /** Minimum size in the container's unit. The gutter will not move past this. Defaults to `0`. */\n readonly minSize = input(0);\n\n /** Maximum size in the container's unit. The gutter will not move past this. Defaults to `Infinity`. */\n readonly maxSize = input(Infinity);\n\n /** When true, the pane may collapse to `collapsedSize` via snap, keyboard, or API. Defaults to `false`. */\n readonly collapsible = input(false);\n\n /** Size to use when the pane is collapsed. May be `> 0` for rail-style collapse. Defaults to `0`. */\n readonly collapsedSize = input(0);\n\n /**\n * If `> 0`, dragging within `snapSize` units of `collapsedSize` snaps the pane closed.\n * Dragging back out past `snapSize` re-expands it. Defaults to `0` (snap disabled).\n */\n readonly snapSize = input(0);\n\n /**\n * Stable ordering token used by the container when content-projection order and\n * resize math must stay consistent across change detection. Defaults to declaration order.\n */\n readonly order = input<number | undefined>(undefined);\n\n /** Fires when this pane's size changes, in the container's unit. */\n readonly sizeChange = output<number>();\n\n /** Fires when this pane's collapsed state changes. */\n readonly collapsedChange = output<boolean>();\n\n /**\n * @internal\n * Written by the parent SplitComponent to set this pane's current flex-basis.\n * Not part of the public API.\n */\n readonly _basis = signal('');\n\n /**\n * @internal\n * Current size in the container's unit. Written by the parent SplitComponent.\n * Not part of the public API.\n */\n readonly _size = signal(0);\n\n /**\n * @internal\n * Written by the parent SplitComponent to reflect collapsed state on the host.\n * Not part of the public API.\n */\n readonly _collapsed = signal(false);\n\n /**\n * @internal\n * Size recorded immediately before this pane collapses, restored on expand.\n * `null` whenever the pane is not collapsed or no pre-collapse size was captured.\n */\n readonly _preCollapseSize = signal<number | null>(null);\n\n /**\n * @internal\n * Pane's positional index. Drives flex `order` so gutters can interleave via\n * order = index * 2 + 1.\n */\n readonly _index = signal(0);\n\n /**\n * @internal\n * DOM id used by the parent gutter's `aria-controls` reference.\n * Assigned by the parent SplitComponent on content reconciliation.\n */\n readonly _paneId = signal<string | null>(null);\n\n /**\n * @internal — idempotent id assignment. Re-using the existing id when the\n * pane is re-reconciled keeps aria-controls stable across CD. The current\n * id is read via `untracked` so callers running inside an `effect()` don't\n * subscribe to `_paneId` and re-fire when it transitions from `null`.\n */\n _ensureId(componentId: string, index: number): void {\n if (untracked(() => this._paneId()) === null) {\n this._paneId.set(`${componentId}-pane-${index}`);\n }\n }\n}\n","/** Constraints declared by a single pane. */\nexport interface PaneConstraints {\n /** Pane's initial size in the active unit (percent or pixel). `undefined` means \"share whatever's left equally\". */\n defaultSize: number | undefined;\n /** Lower bound applied during initial layout and after every resize. */\n minSize: number;\n /** Upper bound applied during initial layout and after every resize. */\n maxSize: number;\n}\n\nconst EPSILON = 0.01;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Clamps `value` into `[min, max]` without wrapping. */\nexport function clampSize(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Available space for pane content after subtracting gutters.\n * For percent mode this is used only when we need a px reference (e.g., pixel\n * unit sizing or overflow detection); percent sizes are always relative to this\n * space but expressed as 0-100 sums.\n */\nexport function availableSpace(containerPx: number, numPanes: number, gutterSize: number): number {\n return Math.max(0, containerPx - Math.max(0, numPanes - 1) * gutterSize);\n}\n\n/**\n * CSS flex-basis string for a pane.\n *\n * Percent mode: sizes represent percentages of the available space (container\n * minus gutters). Since CSS `%` is relative to the flex container (which\n * includes gutter space), we subtract each pane's proportional share of total\n * gutter space via `calc()`. This requires no knowledge of the container's\n * pixel size at render time.\n *\n * Pixel mode: a simple pixel value.\n */\nexport function computeBasis(\n size: number,\n unit: 'percent' | 'pixel',\n numPanes: number,\n gutterSize: number,\n): string {\n if (unit === 'pixel') return `${size}px`;\n const totalGutterPx = Math.max(0, numPanes - 1) * gutterSize;\n const gutterShare = (size / 100) * totalGutterPx;\n // Round to 4 decimal places so the CSS string is deterministic and readable.\n const pct = +size.toFixed(4);\n const gutter = +gutterShare.toFixed(4);\n return `calc(${pct}% - ${gutter}px)`;\n}\n\n// ── Constraint resolver ───────────────────────────────────────────────────────\n\n/**\n * Resolve initial sizes from pane configs.\n * Priority (§4.2): defaultSize → even distribution.\n * Results are clamped against minSize/maxSize.\n */\nexport function resolveInitialSizes(\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const n = panes.length;\n if (n === 0) return [];\n\n // Pixel mode with unknown container: use declared defaults directly.\n // ResizeObserver will scale them once the real container size is known.\n if (unit === 'pixel' && availablePx <= 0) {\n return panes.map(p => clampSize(p.defaultSize ?? 0, p.minSize, p.maxSize));\n }\n\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n\n const declaredSum = panes.reduce((acc, p) => acc + (p.defaultSize ?? 0), 0);\n const undeclaredCount = panes.filter(p => p.defaultSize === undefined).length;\n const remaining = Math.max(0, totalUnit - declaredSum);\n const undeclaredShare = undeclaredCount > 0 ? remaining / undeclaredCount : 0;\n\n const raw = panes.map(p => p.defaultSize ?? undeclaredShare);\n return redistributeWithConstraints(raw, panes, totalUnit);\n}\n\n/**\n * Clamp sizes against per-pane min/max, redistributing slack proportionally\n * among unclamped panes until the target total is satisfied (§4.2).\n *\n * Iterates up to `n + 1` times — sufficient for any acyclic constraint graph.\n */\nexport function redistributeWithConstraints(\n sizes: number[],\n panes: PaneConstraints[],\n totalUnit: number,\n): number[] {\n const n = sizes.length;\n // Start with all values clamped to their feasible range.\n const result = sizes.map((s, i) => clampSize(s, panes[i].minSize, panes[i].maxSize));\n\n for (let iter = 0; iter <= n; iter++) {\n const currentSum = result.reduce((a, b) => a + b, 0);\n if (Math.abs(currentSum - totalUnit) < EPSILON) break;\n\n // Find panes that can flex in the direction needed to reach the target.\n const flex: number[] = [];\n if (currentSum < totalUnit) {\n for (let i = 0; i < n; i++) {\n if (result[i] < panes[i].maxSize - EPSILON) flex.push(i);\n }\n } else {\n for (let i = 0; i < n; i++) {\n if (result[i] > panes[i].minSize + EPSILON) flex.push(i);\n }\n }\n if (flex.length === 0) break; // constraints infeasible — best-effort result\n\n const flexSet = new Set(flex);\n const fixedSum = result.reduce((acc, s, i) => (flexSet.has(i) ? acc : acc + s), 0);\n const flexTarget = totalUnit - fixedSum;\n const flexCurrent = flex.reduce((acc, i) => acc + result[i], 0);\n\n if (Math.abs(flexCurrent - flexTarget) < EPSILON) break;\n\n if (flexCurrent <= EPSILON) {\n const share = flexTarget / flex.length;\n for (const i of flex) result[i] = clampSize(share, panes[i].minSize, panes[i].maxSize);\n } else {\n const scale = flexTarget / flexCurrent;\n for (const i of flex) result[i] = clampSize(result[i] * scale, panes[i].minSize, panes[i].maxSize);\n }\n }\n\n return result;\n}\n\n// ── Container resize rescaling (§4.3) ─────────────────────────────────────────\n\n/**\n * Rescale sizes after a container resize event.\n *\n * - Percent mode: proportions (percentages) are preserved; re-clamp only.\n * - Pixel mode: scale sizes proportionally to the new available space, then\n * re-clamp.\n *\n * Returns the new sizes and a flag indicating whether any pane was clamped\n * beyond its proportional share (used to decide whether to fire sizesChange).\n */\nexport function rescaleForContainerResize(\n currentSizes: number[],\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n oldAvailablePx: number,\n newAvailablePx: number,\n): { sizes: number[]; clamped: boolean } {\n const n = currentSizes.length;\n if (n === 0) return { sizes: [], clamped: false };\n\n const totalUnit = unit === 'percent' ? 100 : newAvailablePx;\n\n let proposed: number[];\n if (unit === 'percent') {\n proposed = [...currentSizes];\n } else {\n const ratio = oldAvailablePx > EPSILON ? newAvailablePx / oldAvailablePx : 1;\n proposed = currentSizes.map(s => s * ratio);\n }\n\n const clamped = redistributeWithConstraints(proposed, panes, totalUnit);\n const wasClamped = clamped.some((s, i) => Math.abs(s - proposed[i]) > EPSILON);\n return { sizes: clamped, clamped: wasClamped };\n}\n\n// ── Pane add / remove (§4.4) ──────────────────────────────────────────────────\n\n/**\n * Compute sizes after a new pane is inserted at `newPaneIndex`.\n * The new pane enters at its defaultSize (or an equal share if unset);\n * existing panes shrink proportionally to accommodate it.\n */\nexport function redistributeOnPaneAdded(\n currentSizes: number[],\n newPaneIndex: number,\n newPaneConfig: PaneConstraints,\n allPaneConfigs: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const n = allPaneConfigs.length;\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n\n const newSize = clampSize(\n newPaneConfig.defaultSize ?? totalUnit / n,\n newPaneConfig.minSize,\n newPaneConfig.maxSize,\n );\n\n const existingTarget = Math.max(0, totalUnit - newSize);\n const existingSum = currentSizes.reduce((a, b) => a + b, 0);\n\n const scaled =\n existingSum > EPSILON\n ? currentSizes.map(s => (s / existingSum) * existingTarget)\n : currentSizes.map(() => existingTarget / Math.max(1, currentSizes.length));\n\n const result = [...scaled];\n result.splice(newPaneIndex, 0, newSize);\n\n return redistributeWithConstraints(result, allPaneConfigs, totalUnit);\n}\n\n/**\n * Compute sizes after the pane at `removedIndex` is removed.\n * Its space is redistributed proportionally to remaining panes.\n */\nexport function redistributeOnPaneRemoved(\n currentSizes: number[],\n removedIndex: number,\n remainingPaneConfigs: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const remaining = currentSizes.filter((_, i) => i !== removedIndex);\n if (remaining.length === 0) return [];\n\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n const remainingSum = remaining.reduce((a, b) => a + b, 0);\n\n const scaled =\n remainingSum > EPSILON\n ? remaining.map(s => (s / remainingSum) * totalUnit)\n : remaining.map(() => totalUnit / remaining.length);\n\n return redistributeWithConstraints(scaled, remainingPaneConfigs, totalUnit);\n}\n\n// ── Overflow check (§4.2) ─────────────────────────────────────────────────────\n\n/** Returns true when the sum of all minSizes exceeds the available space. */\nexport function hasMinSizeOverflow(\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): boolean {\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n const minSum = panes.reduce((acc, p) => acc + p.minSize, 0);\n return minSum > totalUnit + EPSILON;\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n isDevMode,\n NgZone,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n input,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { tv } from 'tailwind-variants';\nimport type { SplitCollapseEvent, SplitDirection, SplitResizeEvent, SplitUnit } from './split.types';\nimport { SplitPaneComponent } from './split-pane';\nimport {\n availableSpace,\n computeBasis,\n hasMinSizeOverflow,\n redistributeOnPaneAdded,\n redistributeOnPaneRemoved,\n redistributeWithConstraints,\n rescaleForContainerResize,\n resolveInitialSizes,\n type PaneConstraints,\n} from './split-sizing';\n\nlet nextSplitId = 0;\n\nconst splitVariants = tv(\n {\n slots: {\n root: 'flex h-full w-full',\n gutter:\n 'shrink-0 bg-border transition-colors duration-normal motion-reduce:transition-none hover:bg-border-strong focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n direction: {\n horizontal: { root: 'flex-row', gutter: 'cursor-col-resize' },\n vertical: { root: 'flex-col', gutter: 'cursor-row-resize' },\n },\n disabled: {\n true: { gutter: 'opacity-50 pointer-events-none cursor-default' },\n false: {},\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Container component that lays out two or more panes along a single axis and\n * lets the user resize them by dragging the gutters between them.\n *\n * @example\n * ```html\n * <tw-split direction=\"horizontal\" [gutterSize]=\"6\">\n * <tw-split-pane [defaultSize]=\"30\" [minSize]=\"15\">…</tw-split-pane>\n * <tw-split-pane [defaultSize]=\"70\">…</tw-split-pane>\n * </tw-split>\n * ```\n */\n@Component({\n selector: 'tw-split',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': '_rootClass()',\n '[attr.data-split-direction]': 'direction()',\n },\n template: `\n <ng-content />\n @for (i of _gutterIndices(); track i) {\n <div\n role=\"separator\"\n [attr.aria-orientation]=\"direction()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-valuenow]=\"_ariaValueNow(i)\"\n [attr.aria-controls]=\"_ariaControls(i)\"\n [attr.aria-label]=\"_ariaLabel(i)\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [class]=\"_gutterClass()\"\n [style.order]=\"i * 2 + 1\"\n [style.flex-basis.px]=\"gutterSize()\"\n [style.min-width.px]=\"direction() === 'horizontal' ? gutterSize() : 0\"\n [style.min-height.px]=\"direction() === 'vertical' ? gutterSize() : 0\"\n (pointerdown)=\"_onGutterPointerDown($event, i)\"\n (keydown)=\"_onGutterKeydown($event, i)\"\n ></div>\n }\n `,\n})\nexport class SplitComponent {\n /** Axis along which panes are laid out. `'horizontal'` = side-by-side; `'vertical'` = stacked. Defaults to `'horizontal'`. */\n readonly direction = input<SplitDirection>('horizontal');\n\n /** How sizes are expressed and reported. A single unit governs the whole container. Defaults to `'percent'`. */\n readonly unit = input<SplitUnit>('percent');\n\n /** Thickness of each gutter in pixels, perpendicular to the split axis. Defaults to `6`. */\n readonly gutterSize = input(6);\n\n /** When true, all resize interactions are disabled. Gutters are not focusable and do not respond to input. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** How much to move the gutter per arrow-key press, in the container's declared unit. Defaults to `10`. */\n readonly keyboardStep = input(10);\n\n /** Step size for `PageUp` / `PageDown` key presses, in the container's declared unit. Defaults to `50`. */\n readonly keyboardStepLarge = input(50);\n\n /**\n * If non-null, pane sizes are persisted to `localStorage` under this key and restored on init.\n * Defaults to `null` (persistence disabled).\n */\n readonly storageKey = input<string | null>(null);\n\n /**\n * When true, horizontal direction is visually reversed (RTL layout).\n * Defaults to `null`, which means the value is inherited from the nearest ancestor `dir` attribute.\n */\n readonly rtl = input<boolean | null>(null);\n\n /**\n * Fires after any committed resize with the ordered array of current pane sizes.\n * Does **not** fire on every pointer move during drag — only on commit (release, keyboard step, programmatic call).\n */\n readonly sizesChange = output<number[]>();\n\n /** Fires on pointer/touch down or keyboard-initiated resize start. */\n readonly resizeStart = output<SplitResizeEvent>();\n\n /** Fires on pointer/touch up, blur, or keyboard resize commit. */\n readonly resizeEnd = output<SplitResizeEvent>();\n\n /** Fires when a pane collapses or expands via snap, keyboard, or programmatic API. */\n readonly collapseChange = output<SplitCollapseEvent>();\n\n private readonly _elRef = inject(ElementRef);\n private readonly _ngZone = inject(NgZone);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _directionality = inject(Directionality, { optional: true });\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n readonly _panes = contentChildren(SplitPaneComponent);\n\n /** Stable id used to namespace per-pane DOM ids inside this container. */\n private readonly _componentId = `tw-split-${nextSplitId++}`;\n\n /**\n * @internal\n * Container dimension in pixels along the split axis, updated by ResizeObserver.\n * Starts at 0 until the first observation fires.\n */\n readonly _containerSizePx = signal(0);\n\n /**\n * @internal\n * Current pane sizes in the container's declared unit.\n * Percent mode: values sum to 100 (within epsilon).\n * Pixel mode: values are absolute pixel sizes.\n */\n readonly _sizes = signal<number[]>([]);\n\n /** Tracks the live `dir` attribute resolved through CDK Directionality. */\n private readonly _cdkDir = signal<'ltr' | 'rtl'>(this._directionality?.value ?? 'ltr');\n\n /** Resolves the effective RTL state: explicit `rtl` input overrides CDK `dir`. */\n readonly _isRtl = computed(() => this.rtl() ?? this._cdkDir() === 'rtl');\n\n // Previous pane refs — plain field, not a signal, so the pane effect does\n // not re-run just because we wrote this value.\n private _prevPaneRefs: readonly SplitPaneComponent[] | null = null;\n\n /** True until the first pane-list reconciliation has run; gates persistence hydration. */\n private _initialReconciled = false;\n\n /** Resolved class strings from tailwind-variants. */\n private readonly _classes = computed(() =>\n splitVariants({\n direction: this.direction(),\n disabled: this.disabled(),\n }),\n );\n\n readonly _rootClass = computed(() => this._classes().root());\n readonly _gutterClass = computed(() => this._classes().gutter());\n\n /** Indices `0..panes.length - 2` representing the gutter between pane[i] and pane[i+1]. */\n readonly _gutterIndices = computed(() => {\n const n = this._panes().length;\n return n > 0 ? Array.from({ length: n - 1 }, (_, i) => i) : [];\n });\n\n /** @internal — drag state for the active pointer. */\n private _drag: {\n pointerId: number;\n gutterIndex: number;\n startClient: number;\n startSizes: number[];\n target: HTMLElement;\n moveHandler: (e: PointerEvent) => void;\n upHandler: (e: PointerEvent) => void;\n } | null = null;\n\n constructor() {\n // ResizeObserver — runs outside Angular zone to avoid CD on every resize.\n // Guard against environments (e.g. jsdom in tests) where ResizeObserver\n // is not available; those environments call _onContainerResize() directly.\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') return;\n const el = this._elRef.nativeElement as HTMLElement;\n const ro = new ResizeObserver(entries => {\n const rect = entries[0]?.contentRect;\n if (!rect) return;\n const sizePx = this.direction() === 'horizontal' ? rect.width : rect.height;\n this._ngZone.run(() => this._onContainerResize(sizePx));\n });\n ro.observe(el);\n this._destroyRef.onDestroy(() => ro.disconnect());\n });\n\n // Pane-list effect — re-runs whenever the ContentChildren list changes.\n // Container size is read with untracked() so this effect does NOT re-run\n // on container resize (the ResizeObserver handles that path independently).\n effect(() => {\n const panes = this._panes();\n const containerPx = untracked(() => this._containerSizePx());\n this._onPanesChange(panes, containerPx);\n });\n\n // Reflect CDK Directionality changes into the local signal so the computed\n // _isRtl re-evaluates and keyboard / pointer handlers honour live `dir`\n // attribute changes (e.g. when an ancestor flips the page direction).\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 // ── Internal resize handler ─────────────────────────────────────────────────\n\n /**\n * @internal — exposed for testing; do not call from application code.\n * Called by the ResizeObserver when the container's pixel size changes.\n */\n _onContainerResize(newSizePx: number): void {\n const oldSizePx = this._containerSizePx();\n if (Math.abs(newSizePx - oldSizePx) < 0.5) return;\n\n const panes = this._panes();\n const unit = this.unit();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n\n const oldAvailable = availableSpace(oldSizePx, n, gutterSize);\n const newAvailable = availableSpace(newSizePx, n, gutterSize);\n const currentSizes = this._sizes();\n\n const configs = panes.map(toPaneConfig);\n const { sizes, clamped } = rescaleForContainerResize(\n currentSizes,\n configs,\n unit,\n oldAvailable,\n newAvailable,\n );\n\n this._containerSizePx.set(newSizePx);\n this._sizes.set(sizes);\n this._applyToPanes(panes, sizes, unit, n, gutterSize);\n\n // Fire sizesChange only when clamping altered a proportional share (§4.3)\n if (clamped) {\n this._commit(sizes);\n }\n }\n\n // ── Pane-list reconciliation ────────────────────────────────────────────────\n\n /**\n * @internal — exposed for testing; do not call from application code.\n * Called by the contentChildren effect when the pane list changes.\n */\n _onPanesChange(panes: readonly SplitPaneComponent[], containerPx: number): void {\n const unit = this.unit();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n\n // Assign a stable DOM id to each pane so aria-controls on the gutter can\n // reference them. Idempotent — only the first assignment for a given pane\n // sticks; later runs are no-ops.\n for (let i = 0; i < panes.length; i++) {\n panes[i]._ensureId(this._componentId, i);\n }\n\n if (this._prevPaneRefs === null) {\n const restored = this._readPersistedSizes(panes);\n if (restored) {\n this._sizes.set(restored);\n this._applyToPanes(panes, restored, unit, panes.length, gutterSize);\n } else {\n this._initializeSizes(panes, unit, available, gutterSize);\n }\n } else {\n this._reconcilePanes(panes, this._prevPaneRefs, unit, available, gutterSize);\n }\n this._prevPaneRefs = panes;\n this._initialReconciled = true;\n }\n\n private _initializeSizes(\n panes: readonly SplitPaneComponent[],\n unit: SplitUnit,\n available: number,\n gutterSize: number,\n ): void {\n if (panes.length === 0) {\n this._sizes.set([]);\n return;\n }\n const configs = panes.map(toPaneConfig);\n\n if (available > 0 && isDevMode() && hasMinSizeOverflow(configs, unit, available)) {\n console.warn(\n `SplitComponent: sum of minSize values exceeds available space (${available}${unit === 'percent' ? '%' : 'px'}). Panes will overflow.`,\n );\n }\n\n const sizes = resolveInitialSizes(configs, unit, available);\n this._sizes.set(sizes);\n this._applyToPanes(panes, sizes, unit, panes.length, gutterSize);\n }\n\n private _reconcilePanes(\n newPanes: readonly SplitPaneComponent[],\n prevPanes: readonly SplitPaneComponent[],\n unit: SplitUnit,\n available: number,\n gutterSize: number,\n ): void {\n // `_reconcilePanes` runs from inside the contentChildren effect; reading\n // `_sizes` tracked + writing `_sizes.set(newArray)` below would re-fire the\n // effect on every CD tick (new array reference fails Object.is equality).\n const currentSizes = untracked(() => this._sizes());\n let sizes = [...currentSizes];\n\n const prevSet = new Set(prevPanes);\n const newSet = new Set(newPanes);\n const added = newPanes.filter(p => !prevSet.has(p));\n const removed = prevPanes.filter(p => !newSet.has(p));\n\n // Process removals first (working against the prev order)\n let workingPanes: SplitPaneComponent[] = [...prevPanes];\n for (const removedPane of removed) {\n const idx = workingPanes.indexOf(removedPane);\n if (idx === -1) continue;\n workingPanes = workingPanes.filter((_, i) => i !== idx);\n sizes = redistributeOnPaneRemoved(sizes, idx, workingPanes.map(toPaneConfig), unit, available);\n }\n\n // Process additions — `sizes` already represents workingPanes (without the\n // new pane). redistributeOnPaneAdded inserts the new size at newIdx internally.\n for (const addedPane of added) {\n const newIdx = newPanes.indexOf(addedPane);\n workingPanes = [...workingPanes];\n workingPanes.splice(newIdx, 0, addedPane);\n sizes = redistributeOnPaneAdded(\n sizes,\n newIdx,\n toPaneConfig(addedPane),\n workingPanes.map(toPaneConfig),\n unit,\n available,\n );\n }\n\n this._sizes.set(sizes);\n this._applyToPanes(newPanes, sizes, unit, newPanes.length, gutterSize);\n }\n\n // ── Apply sizes to pane DOM ─────────────────────────────────────────────────\n\n private _applyToPanes(\n panes: readonly SplitPaneComponent[],\n sizes: number[],\n unit: SplitUnit,\n numPanes: number,\n gutterSize: number,\n ): void {\n for (let i = 0; i < panes.length; i++) {\n const size = sizes[i] ?? 0;\n // Read the previous size without subscribing — `_applyToPanes` runs from\n // an effect (initial reconciliation) as well as direct calls, and a\n // tracked read combined with the write below would loop the effect\n // indefinitely.\n const prev = untracked(() => panes[i]._size());\n panes[i]._index.set(i);\n panes[i]._basis.set(computeBasis(size, unit, numPanes, gutterSize));\n panes[i]._size.set(size);\n if (Math.abs(prev - size) > 1e-6) {\n panes[i].sizeChange.emit(size);\n }\n }\n }\n\n // ── Public API ──────────────────────────────────────────────────────────────\n\n /**\n * Programmatically set all pane sizes.\n * The array length must equal the current pane count and sizes must be\n * compatible with the declared unit. Throws on mismatch.\n */\n setSizes(sizes: number[]): void {\n const panes = this._panes();\n if (sizes.length !== panes.length) {\n throw new Error(`SplitComponent.setSizes: expected ${panes.length} sizes, got ${sizes.length}`);\n }\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n const totalUnit = unit === 'percent' ? 100 : available;\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(sizes, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, n, gutterSize);\n this._commit(clamped);\n }\n\n /**\n * Collapse the pane at `paneIndex` to its `collapsedSize`.\n * The pane must have `collapsible = true`. Throws if the index is out of range.\n */\n collapse(paneIndex: number): void {\n const panes = this._panes();\n if (paneIndex < 0 || paneIndex >= panes.length) {\n throw new Error(`SplitComponent.collapse: paneIndex ${paneIndex} out of range`);\n }\n const pane = panes[paneIndex];\n if (!pane.collapsible()) {\n throw new Error(\n `SplitComponent.collapse: pane ${paneIndex} is not marked collapsible`,\n );\n }\n if (pane._collapsed()) return;\n\n this._setCollapsed(panes, paneIndex, true, 'programmatic');\n }\n\n /**\n * Restore the pane at `paneIndex` to its pre-collapse size, or its `defaultSize` if none is recorded.\n * Throws if the index is out of range.\n */\n expand(paneIndex: number): void {\n const panes = this._panes();\n if (paneIndex < 0 || paneIndex >= panes.length) {\n throw new Error(`SplitComponent.expand: paneIndex ${paneIndex} out of range`);\n }\n const pane = panes[paneIndex];\n if (!pane._collapsed()) return;\n\n this._setCollapsed(panes, paneIndex, false, 'programmatic');\n }\n\n /**\n * Restore all panes to their declared `defaultSize` values.\n * Clears any persisted sizes if `storageKey` is set.\n */\n reset(): void {\n const panes = this._panes();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n for (const pane of panes) {\n pane._collapsed.set(false);\n pane._preCollapseSize.set(null);\n }\n this._initializeSizes(panes, unit, available, gutterSize);\n if (panes.length > 0) {\n this.sizesChange.emit([...this._sizes()]);\n }\n // Clear persisted sizes after emit so the cleared state is the resting\n // state at the end of reset(). New commits will repopulate the entry.\n this._clearPersistedSizes();\n }\n\n // ── ARIA / pointer / keyboard ───────────────────────────────────────────────\n\n /** @internal — `aria-valuenow` for the gutter between pane i and i+1. Reports the LEFT pane size as a percent. */\n _ariaValueNow(gutterIndex: number): number | null {\n const sizes = this._sizes();\n const size = sizes[gutterIndex];\n if (size === undefined) return null;\n if (this.unit() === 'percent') return Math.round(size);\n const available = availableSpace(\n this._containerSizePx(),\n this._panes().length,\n this.gutterSize(),\n );\n if (available <= 0) return null;\n return Math.round((size / available) * 100);\n }\n\n /** @internal — `aria-controls` references the two adjacent panes' DOM ids. */\n _ariaControls(gutterIndex: number): string | null {\n const panes = this._panes();\n const a = panes[gutterIndex]?._paneId();\n const b = panes[gutterIndex + 1]?._paneId();\n if (!a || !b) return null;\n return `${a} ${b}`;\n }\n\n /** @internal — accessible name fallback for the separator handle. */\n _ariaLabel(gutterIndex: number): string {\n return this.direction() === 'horizontal'\n ? `Resize column ${gutterIndex + 1}`\n : `Resize row ${gutterIndex + 1}`;\n }\n\n /** @internal */\n _onGutterPointerDown(event: PointerEvent, gutterIndex: number): void {\n if (this.disabled() || event.button !== 0) return;\n const target = event.target as HTMLElement;\n target.setPointerCapture(event.pointerId);\n const startClient = this.direction() === 'horizontal' ? event.clientX : event.clientY;\n const startSizes = [...this._sizes()];\n\n const moveHandler = (e: PointerEvent) => this._onGutterPointerMove(e);\n const upHandler = (e: PointerEvent) => this._onGutterPointerUp(e);\n\n target.addEventListener('pointermove', moveHandler);\n target.addEventListener('pointerup', upHandler);\n target.addEventListener('pointercancel', upHandler);\n\n this._drag = {\n pointerId: event.pointerId,\n gutterIndex,\n startClient,\n startSizes,\n target,\n moveHandler,\n upHandler,\n };\n\n this._setNoSelect(true);\n\n this.resizeStart.emit({\n sizes: [...startSizes],\n unit: this.unit(),\n originPaneIndex: gutterIndex,\n cause: event.pointerType === 'touch' ? 'touch' : 'pointer',\n });\n event.preventDefault();\n }\n\n private _onGutterPointerMove(event: PointerEvent): void {\n const drag = this._drag;\n if (!drag) return;\n const horizontal = this.direction() === 'horizontal';\n const current = horizontal ? event.clientX : event.clientY;\n let deltaPx = current - drag.startClient;\n if (deltaPx === 0) return;\n // In RTL horizontal mode the visual delta is inverted from the pane order.\n if (horizontal && this._isRtl()) deltaPx = -deltaPx;\n\n const panes = this._panes();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const available = availableSpace(containerPx, panes.length, this.gutterSize());\n if (available <= 0) return;\n\n const deltaUnit = unit === 'percent' ? (deltaPx / available) * 100 : deltaPx;\n\n // Apply delta to gutterIndex (grows) and gutterIndex+1 (shrinks).\n const next = [...drag.startSizes];\n next[drag.gutterIndex] = drag.startSizes[drag.gutterIndex] + deltaUnit;\n next[drag.gutterIndex + 1] = drag.startSizes[drag.gutterIndex + 1] - deltaUnit;\n\n const totalUnit = unit === 'percent' ? 100 : available;\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(next, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, panes.length, this.gutterSize());\n }\n\n private _onGutterPointerUp(event: PointerEvent): void {\n const drag = this._drag;\n if (!drag) return;\n const target = drag.target;\n try {\n target.releasePointerCapture(drag.pointerId);\n } catch {\n /* pointer already released */\n }\n target.removeEventListener('pointermove', drag.moveHandler);\n target.removeEventListener('pointerup', drag.upHandler);\n target.removeEventListener('pointercancel', drag.upHandler);\n this._drag = null;\n\n this._setNoSelect(false);\n\n const finalSizes = this._sizes();\n\n // Snap-collapse threshold check on the two panes adjacent to the drag.\n this._maybeSnap(drag.gutterIndex);\n\n this._commit(this._sizes());\n this.resizeEnd.emit({\n sizes: [...finalSizes],\n unit: this.unit(),\n originPaneIndex: drag.gutterIndex,\n cause: event.pointerType === 'touch' ? 'touch' : 'pointer',\n });\n }\n\n /** @internal */\n _onGutterKeydown(event: KeyboardEvent, gutterIndex: number): void {\n if (this.disabled()) return;\n const horizontal = this.direction() === 'horizontal';\n const step = this.keyboardStep();\n const stepLarge = this.keyboardStepLarge();\n const rtl = horizontal && this._isRtl();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const available = availableSpace(containerPx, this._panes().length, this.gutterSize());\n const totalUnit = unit === 'percent' ? 100 : available;\n // Use the container's full extent for Home/End so the delta saturates the\n // left pane against its bounds without resorting to Infinity (which would\n // produce NaN once multiplied by the redistribution scaling factor).\n const saturate = totalUnit > 0 ? totalUnit : 1e9;\n\n let delta: number | null = null;\n const cause: SplitResizeEvent['cause'] = 'keyboard';\n let restore = false;\n\n switch (event.key) {\n case 'ArrowLeft':\n if (horizontal) delta = rtl ? step : -step;\n break;\n case 'ArrowRight':\n if (horizontal) delta = rtl ? -step : step;\n break;\n case 'ArrowUp':\n if (!horizontal) delta = -step;\n break;\n case 'ArrowDown':\n if (!horizontal) delta = step;\n break;\n case 'PageUp':\n delta = -stepLarge;\n break;\n case 'PageDown':\n delta = stepLarge;\n break;\n case 'Home':\n delta = -saturate;\n break;\n case 'End':\n delta = saturate;\n break;\n case 'Enter':\n case ' ':\n restore = true;\n break;\n default:\n return;\n }\n\n if (delta === null && !restore) return;\n event.preventDefault();\n\n const panes = this._panes();\n const startSizes = [...this._sizes()];\n\n this.resizeStart.emit({\n sizes: [...startSizes],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n\n if (restore) {\n // Enter / Space toggles collapse on the LEFT pane of the focused gutter\n // when collapsible; otherwise falls back to reset() for keyboard-only recovery.\n const leftPane = panes[gutterIndex];\n if (leftPane?.collapsible()) {\n this._setCollapsed(panes, gutterIndex, !leftPane._collapsed(), 'keyboard');\n this.resizeEnd.emit({\n sizes: [...this._sizes()],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n return;\n }\n this.reset();\n this.resizeEnd.emit({\n sizes: [...this._sizes()],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n return;\n }\n\n const next = [...startSizes];\n next[gutterIndex] = startSizes[gutterIndex] + (delta as number);\n next[gutterIndex + 1] = startSizes[gutterIndex + 1] - (delta as number);\n\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(next, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, panes.length, this.gutterSize());\n this._commit(clamped);\n this.resizeEnd.emit({\n sizes: [...clamped],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n }\n\n // ── Collapse helpers ────────────────────────────────────────────────────────\n\n private _setCollapsed(\n panes: readonly SplitPaneComponent[],\n paneIndex: number,\n collapsed: boolean,\n cause: SplitCollapseEvent['cause'],\n ): void {\n const pane = panes[paneIndex];\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const available = availableSpace(containerPx, panes.length, gutterSize);\n const totalUnit = unit === 'percent' ? 100 : available;\n\n const current = [...this._sizes()];\n // Pick the neighbour that absorbs the size delta: prefer the right pane,\n // fall back to the left pane when collapsing the last pane in the row.\n const partner = paneIndex < panes.length - 1 ? paneIndex + 1 : paneIndex - 1;\n const target = [...current];\n const configs = panes.map(toPaneConfig);\n\n if (collapsed) {\n pane._preCollapseSize.set(current[paneIndex] ?? null);\n const collapsedSize = pane.collapsedSize();\n const delta = current[paneIndex] - collapsedSize;\n target[paneIndex] = collapsedSize;\n if (partner >= 0) target[partner] = current[partner] + delta;\n // Lock the collapsed pane to exactly `collapsedSize` during redistribution\n // so slack does not flow back into it.\n configs[paneIndex] = {\n defaultSize: configs[paneIndex].defaultSize,\n minSize: collapsedSize,\n maxSize: collapsedSize,\n };\n } else {\n const restored =\n pane._preCollapseSize() ?? pane.defaultSize() ?? totalUnit / Math.max(1, panes.length);\n const delta = restored - current[paneIndex];\n target[paneIndex] = restored;\n if (partner >= 0) target[partner] = current[partner] - delta;\n pane._preCollapseSize.set(null);\n }\n\n const next = redistributeWithConstraints(target, configs, totalUnit);\n\n pane._collapsed.set(collapsed);\n pane.collapsedChange.emit(collapsed);\n this._sizes.set(next);\n this._applyToPanes(panes, next, unit, panes.length, gutterSize);\n this._commit(next);\n this.collapseChange.emit({ paneIndex, collapsed, cause });\n }\n\n private _maybeSnap(gutterIndex: number): void {\n const panes = this._panes();\n const sizes = this._sizes();\n for (const i of [gutterIndex, gutterIndex + 1]) {\n const pane = panes[i];\n if (!pane?.collapsible()) continue;\n const snap = pane.snapSize();\n if (snap <= 0) continue;\n const size = sizes[i] ?? 0;\n const collapsed = pane._collapsed();\n const collapsedSize = pane.collapsedSize();\n const distance = Math.abs(size - collapsedSize);\n if (!collapsed && distance <= snap && size > collapsedSize) {\n this._setCollapsed(panes, i, true, 'snap');\n } else if (collapsed && size > collapsedSize + snap) {\n this._setCollapsed(panes, i, false, 'snap');\n }\n }\n }\n\n // ── Persistence ─────────────────────────────────────────────────────────────\n\n private _readPersistedSizes(panes: readonly SplitPaneComponent[]): number[] | null {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length !== panes.length) return null;\n if (!parsed.every((v: unknown) => typeof v === 'number' && Number.isFinite(v))) return null;\n const unit = this.unit();\n const configs = panes.map(toPaneConfig);\n // `_containerSizePx` is read untracked: this method runs inside the\n // contentChildren effect, which already handles container-size changes\n // through the separate ResizeObserver path.\n const containerPx = untracked(() => this._containerSizePx());\n const available = availableSpace(containerPx, panes.length, this.gutterSize());\n const totalUnit = unit === 'percent' ? 100 : available;\n // Re-clamp persisted sizes against current constraints. If totalUnit is 0\n // (pixel mode pre-measurement), fall back to raw values for later rescaling.\n if (totalUnit <= 0) return parsed as number[];\n return redistributeWithConstraints(parsed as number[], configs, totalUnit);\n } catch {\n return null;\n }\n }\n\n private _writePersistedSizes(sizes: number[]): void {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return;\n if (!this._initialReconciled) return;\n try {\n localStorage.setItem(key, JSON.stringify(sizes));\n } catch {\n /* quota / private-browsing — silently skip persistence */\n }\n }\n\n private _clearPersistedSizes(): void {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(key);\n } catch {\n /* swallow */\n }\n }\n\n // ── Commit helper ──────────────────────────────────────────────────────────\n\n private _commit(sizes: number[]): void {\n this.sizesChange.emit([...sizes]);\n this._writePersistedSizes(sizes);\n }\n\n // ── User-select suppression during drag ────────────────────────────────────\n\n private _setNoSelect(active: boolean): void {\n if (!this._isBrowser || typeof document === 'undefined') return;\n document.body.classList.toggle('tw-split-no-select', active);\n }\n}\n\nfunction toPaneConfig(pane: SplitPaneComponent): PaneConstraints {\n return {\n defaultSize: pane.defaultSize(),\n minSize: pane.minSize(),\n maxSize: pane.maxSize(),\n };\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marker directive for a custom gutter projection slot.\n * Attach to content inside `<tw-split>` to provide custom gutter visuals.\n * The container still owns all interaction logic.\n */\n@Directive({\n selector: '[twSplitGutter]',\n})\nexport class SplitGutterDirective {}\n","import { Directive } from '@angular/core';\n\n/**\n * Marker directive for an optional header region inside `<tw-split-pane>`.\n * A parent Dock or Panel component may key off this region; the split pane\n * itself does not apply any styling to it.\n */\n@Directive({\n selector: '[twSplitPaneHeader]',\n})\nexport class SplitPaneHeaderDirective {}\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-split.mjs","sources":["../../../projects/ngx-tw/split/split-pane.ts","../../../projects/ngx-tw/split/split-sizing.ts","../../../projects/ngx-tw/split/split.ts","../../../projects/ngx-tw/split/split-gutter.ts","../../../projects/ngx-tw/split/split-pane-header.ts","../../../projects/ngx-tw/split/cdevhub-ngx-tw-split.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\n/**\n * A single resizable pane inside `<tw-split>`.\n * Declare size constraints here; the parent container drives the actual sizing.\n */\n@Component({\n selector: 'tw-split-pane',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.id]': '_paneId()',\n '[style.flex-basis]': '_basis()',\n '[style.min-width]': '\"0\"',\n '[style.min-height]': '\"0\"',\n '[style.order]': '_index() * 2',\n '[attr.data-split-pane-collapsed]': '_collapsed()',\n class: 'overflow-auto',\n },\n template: `<ng-content />`,\n})\nexport class SplitPaneComponent {\n /** Initial size of this pane in the container's unit. Omit to use even distribution. */\n readonly defaultSize = input<number | undefined>(undefined);\n\n /** Minimum size in the container's unit. The gutter will not move past this. Defaults to `0`. */\n readonly minSize = input(0);\n\n /** Maximum size in the container's unit. The gutter will not move past this. Defaults to `Infinity`. */\n readonly maxSize = input(Infinity);\n\n /** When true, the pane may collapse to `collapsedSize` via snap, keyboard, or API. Defaults to `false`. */\n readonly collapsible = input(false);\n\n /** Size to use when the pane is collapsed. May be `> 0` for rail-style collapse. Defaults to `0`. */\n readonly collapsedSize = input(0);\n\n /**\n * If `> 0`, dragging within `snapSize` units of `collapsedSize` snaps the pane closed.\n * Dragging back out past `snapSize` re-expands it. Defaults to `0` (snap disabled).\n */\n readonly snapSize = input(0);\n\n /**\n * Stable ordering token used by the container when content-projection order and\n * resize math must stay consistent across change detection. Defaults to declaration order.\n */\n readonly order = input<number | undefined>(undefined);\n\n /** Fires when this pane's size changes, in the container's unit. */\n readonly sizeChange = output<number>();\n\n /** Fires when this pane's collapsed state changes. */\n readonly collapsedChange = output<boolean>();\n\n /**\n * @internal\n * Written by the parent SplitComponent to set this pane's current flex-basis.\n * Not part of the public API.\n */\n readonly _basis = signal('');\n\n /**\n * @internal\n * Current size in the container's unit. Written by the parent SplitComponent.\n * Not part of the public API.\n */\n readonly _size = signal(0);\n\n /**\n * @internal\n * Written by the parent SplitComponent to reflect collapsed state on the host.\n * Not part of the public API.\n */\n readonly _collapsed = signal(false);\n\n /**\n * @internal\n * Size recorded immediately before this pane collapses, restored on expand.\n * `null` whenever the pane is not collapsed or no pre-collapse size was captured.\n */\n readonly _preCollapseSize = signal<number | null>(null);\n\n /**\n * @internal\n * Pane's positional index. Drives flex `order` so gutters can interleave via\n * order = index * 2 + 1.\n */\n readonly _index = signal(0);\n\n /**\n * @internal\n * DOM id used by the parent gutter's `aria-controls` reference.\n * Assigned by the parent SplitComponent on content reconciliation.\n */\n readonly _paneId = signal<string | null>(null);\n\n /**\n * @internal — idempotent id assignment. Re-using the existing id when the\n * pane is re-reconciled keeps aria-controls stable across CD. The current\n * id is read via `untracked` so callers running inside an `effect()` don't\n * subscribe to `_paneId` and re-fire when it transitions from `null`.\n */\n _ensureId(componentId: string, index: number): void {\n if (untracked(() => this._paneId()) === null) {\n this._paneId.set(`${componentId}-pane-${index}`);\n }\n }\n}\n","/** Constraints declared by a single pane. */\nexport interface PaneConstraints {\n /** Pane's initial size in the active unit (percent or pixel). `undefined` means \"share whatever's left equally\". */\n defaultSize: number | undefined;\n /** Lower bound applied during initial layout and after every resize. */\n minSize: number;\n /** Upper bound applied during initial layout and after every resize. */\n maxSize: number;\n}\n\nconst EPSILON = 0.01;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Clamps `value` into `[min, max]` without wrapping. */\nexport function clampSize(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Available space for pane content after subtracting gutters.\n * For percent mode this is used only when we need a px reference (e.g., pixel\n * unit sizing or overflow detection); percent sizes are always relative to this\n * space but expressed as 0-100 sums.\n */\nexport function availableSpace(containerPx: number, numPanes: number, gutterSize: number): number {\n return Math.max(0, containerPx - Math.max(0, numPanes - 1) * gutterSize);\n}\n\n/**\n * CSS flex-basis string for a pane.\n *\n * Percent mode: sizes represent percentages of the available space (container\n * minus gutters). Since CSS `%` is relative to the flex container (which\n * includes gutter space), we subtract each pane's proportional share of total\n * gutter space via `calc()`. This requires no knowledge of the container's\n * pixel size at render time.\n *\n * Pixel mode: a simple pixel value.\n */\nexport function computeBasis(\n size: number,\n unit: 'percent' | 'pixel',\n numPanes: number,\n gutterSize: number,\n): string {\n if (unit === 'pixel') return `${size}px`;\n const totalGutterPx = Math.max(0, numPanes - 1) * gutterSize;\n const gutterShare = (size / 100) * totalGutterPx;\n // Round to 4 decimal places so the CSS string is deterministic and readable.\n const pct = +size.toFixed(4);\n const gutter = +gutterShare.toFixed(4);\n return `calc(${pct}% - ${gutter}px)`;\n}\n\n// ── Constraint resolver ───────────────────────────────────────────────────────\n\n/**\n * Resolve initial sizes from pane configs.\n * Priority (§4.2): defaultSize → even distribution.\n * Results are clamped against minSize/maxSize.\n */\nexport function resolveInitialSizes(\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const n = panes.length;\n if (n === 0) return [];\n\n // Pixel mode with unknown container: use declared defaults directly.\n // ResizeObserver will scale them once the real container size is known.\n if (unit === 'pixel' && availablePx <= 0) {\n return panes.map(p => clampSize(p.defaultSize ?? 0, p.minSize, p.maxSize));\n }\n\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n\n const declaredSum = panes.reduce((acc, p) => acc + (p.defaultSize ?? 0), 0);\n const undeclaredCount = panes.filter(p => p.defaultSize === undefined).length;\n const remaining = Math.max(0, totalUnit - declaredSum);\n const undeclaredShare = undeclaredCount > 0 ? remaining / undeclaredCount : 0;\n\n const raw = panes.map(p => p.defaultSize ?? undeclaredShare);\n return redistributeWithConstraints(raw, panes, totalUnit);\n}\n\n/**\n * Clamp sizes against per-pane min/max, redistributing slack proportionally\n * among unclamped panes until the target total is satisfied (§4.2).\n *\n * Iterates up to `n + 1` times — sufficient for any acyclic constraint graph.\n */\nexport function redistributeWithConstraints(\n sizes: number[],\n panes: PaneConstraints[],\n totalUnit: number,\n): number[] {\n const n = sizes.length;\n // Start with all values clamped to their feasible range.\n const result = sizes.map((s, i) => clampSize(s, panes[i].minSize, panes[i].maxSize));\n\n for (let iter = 0; iter <= n; iter++) {\n const currentSum = result.reduce((a, b) => a + b, 0);\n if (Math.abs(currentSum - totalUnit) < EPSILON) break;\n\n // Find panes that can flex in the direction needed to reach the target.\n const flex: number[] = [];\n if (currentSum < totalUnit) {\n for (let i = 0; i < n; i++) {\n if (result[i] < panes[i].maxSize - EPSILON) flex.push(i);\n }\n } else {\n for (let i = 0; i < n; i++) {\n if (result[i] > panes[i].minSize + EPSILON) flex.push(i);\n }\n }\n if (flex.length === 0) break; // constraints infeasible — best-effort result\n\n const flexSet = new Set(flex);\n const fixedSum = result.reduce((acc, s, i) => (flexSet.has(i) ? acc : acc + s), 0);\n const flexTarget = totalUnit - fixedSum;\n const flexCurrent = flex.reduce((acc, i) => acc + result[i], 0);\n\n if (Math.abs(flexCurrent - flexTarget) < EPSILON) break;\n\n if (flexCurrent <= EPSILON) {\n const share = flexTarget / flex.length;\n for (const i of flex) result[i] = clampSize(share, panes[i].minSize, panes[i].maxSize);\n } else {\n const scale = flexTarget / flexCurrent;\n for (const i of flex) result[i] = clampSize(result[i] * scale, panes[i].minSize, panes[i].maxSize);\n }\n }\n\n return result;\n}\n\n// ── Container resize rescaling (§4.3) ─────────────────────────────────────────\n\n/**\n * Rescale sizes after a container resize event.\n *\n * - Percent mode: proportions (percentages) are preserved; re-clamp only.\n * - Pixel mode: scale sizes proportionally to the new available space, then\n * re-clamp.\n *\n * Returns the new sizes and a flag indicating whether any pane was clamped\n * beyond its proportional share (used to decide whether to fire sizesChange).\n */\nexport function rescaleForContainerResize(\n currentSizes: number[],\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n oldAvailablePx: number,\n newAvailablePx: number,\n): { sizes: number[]; clamped: boolean } {\n const n = currentSizes.length;\n if (n === 0) return { sizes: [], clamped: false };\n\n const totalUnit = unit === 'percent' ? 100 : newAvailablePx;\n\n let proposed: number[];\n if (unit === 'percent') {\n proposed = [...currentSizes];\n } else {\n const ratio = oldAvailablePx > EPSILON ? newAvailablePx / oldAvailablePx : 1;\n proposed = currentSizes.map(s => s * ratio);\n }\n\n const clamped = redistributeWithConstraints(proposed, panes, totalUnit);\n const wasClamped = clamped.some((s, i) => Math.abs(s - proposed[i]) > EPSILON);\n return { sizes: clamped, clamped: wasClamped };\n}\n\n// ── Pane add / remove (§4.4) ──────────────────────────────────────────────────\n\n/**\n * Compute sizes after a new pane is inserted at `newPaneIndex`.\n * The new pane enters at its defaultSize (or an equal share if unset);\n * existing panes shrink proportionally to accommodate it.\n */\nexport function redistributeOnPaneAdded(\n currentSizes: number[],\n newPaneIndex: number,\n newPaneConfig: PaneConstraints,\n allPaneConfigs: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const n = allPaneConfigs.length;\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n\n const newSize = clampSize(\n newPaneConfig.defaultSize ?? totalUnit / n,\n newPaneConfig.minSize,\n newPaneConfig.maxSize,\n );\n\n const existingTarget = Math.max(0, totalUnit - newSize);\n const existingSum = currentSizes.reduce((a, b) => a + b, 0);\n\n const scaled =\n existingSum > EPSILON\n ? currentSizes.map(s => (s / existingSum) * existingTarget)\n : currentSizes.map(() => existingTarget / Math.max(1, currentSizes.length));\n\n const result = [...scaled];\n result.splice(newPaneIndex, 0, newSize);\n\n return redistributeWithConstraints(result, allPaneConfigs, totalUnit);\n}\n\n/**\n * Compute sizes after the pane at `removedIndex` is removed.\n * Its space is redistributed proportionally to remaining panes.\n */\nexport function redistributeOnPaneRemoved(\n currentSizes: number[],\n removedIndex: number,\n remainingPaneConfigs: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): number[] {\n const remaining = currentSizes.filter((_, i) => i !== removedIndex);\n if (remaining.length === 0) return [];\n\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n const remainingSum = remaining.reduce((a, b) => a + b, 0);\n\n const scaled =\n remainingSum > EPSILON\n ? remaining.map(s => (s / remainingSum) * totalUnit)\n : remaining.map(() => totalUnit / remaining.length);\n\n return redistributeWithConstraints(scaled, remainingPaneConfigs, totalUnit);\n}\n\n// ── Overflow check (§4.2) ─────────────────────────────────────────────────────\n\n/** Returns true when the sum of all minSizes exceeds the available space. */\nexport function hasMinSizeOverflow(\n panes: PaneConstraints[],\n unit: 'percent' | 'pixel',\n availablePx: number,\n): boolean {\n const totalUnit = unit === 'percent' ? 100 : availablePx;\n const minSum = panes.reduce((acc, p) => acc + p.minSize, 0);\n return minSum > totalUnit + EPSILON;\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n isDevMode,\n NgZone,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n input,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { tv } from 'tailwind-variants';\nimport type { SplitCollapseEvent, SplitDirection, SplitResizeEvent, SplitUnit } from './split.types';\nimport { SplitPaneComponent } from './split-pane';\nimport {\n availableSpace,\n computeBasis,\n hasMinSizeOverflow,\n redistributeOnPaneAdded,\n redistributeOnPaneRemoved,\n redistributeWithConstraints,\n rescaleForContainerResize,\n resolveInitialSizes,\n type PaneConstraints,\n} from './split-sizing';\n\nlet nextSplitId = 0;\n\n/**\n * WCAG 2.2 SC 2.5.8 (Target Size Minimum) floor, in CSS px. A gutter thinner\n * than this pads itself out to the floor with transparent padding — see\n * `_gutterHitPad`.\n */\nconst TARGET_SIZE_MIN_PX = 24;\n\nconst splitVariants = tv(\n {\n slots: {\n root: 'flex h-full w-full',\n // `relative` and `bg-clip-content` are load-bearing for the SC 2.5.8 hit\n // area (see `_gutterHitPad`): the element's border box is padded out to\n // 24px so the pointer target meets the floor, `bg-clip-content` keeps the\n // paint inside the `gutterSize`-thick content box, and `relative` puts\n // the gutter in the positioned-descendant paint phase so its overhang\n // wins hit-testing over the adjacent panes' in-flow content.\n gutter:\n 'relative shrink-0 bg-border bg-clip-content transition-colors duration-normal motion-reduce:transition-none hover:bg-border-strong focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n variants: {\n direction: {\n horizontal: { root: 'flex-row', gutter: 'cursor-col-resize' },\n vertical: { root: 'flex-col', gutter: 'cursor-row-resize' },\n },\n disabled: {\n true: { gutter: 'opacity-50 pointer-events-none cursor-default' },\n false: {},\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n disabled: false,\n },\n },\n { twMerge: true },\n);\n\n/**\n * Container component that lays out two or more panes along a single axis and\n * lets the user resize them by dragging the gutters between them.\n *\n * @example\n * ```html\n * <tw-split direction=\"horizontal\" [gutterSize]=\"6\">\n * <tw-split-pane [defaultSize]=\"30\" [minSize]=\"15\">…</tw-split-pane>\n * <tw-split-pane [defaultSize]=\"70\">…</tw-split-pane>\n * </tw-split>\n * ```\n */\n@Component({\n selector: 'tw-split',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': '_rootClass()',\n '[attr.data-split-direction]': 'direction()',\n },\n template: `\n <ng-content />\n @for (i of _gutterIndices(); track i) {\n <div\n role=\"separator\"\n [attr.aria-orientation]=\"direction()\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-valuenow]=\"_ariaValueNow(i)\"\n [attr.aria-controls]=\"_ariaControls(i)\"\n [attr.aria-label]=\"_ariaLabel(i)\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [class]=\"_gutterClass()\"\n [style.order]=\"i * 2 + 1\"\n [style.flex-basis.px]=\"_gutterBoxPx()\"\n [style.min-width.px]=\"direction() === 'horizontal' ? _gutterBoxPx() : 0\"\n [style.min-height.px]=\"direction() === 'vertical' ? _gutterBoxPx() : 0\"\n [style.padding-left.px]=\"_gutterHitPadX()\"\n [style.padding-right.px]=\"_gutterHitPadX()\"\n [style.padding-top.px]=\"_gutterHitPadY()\"\n [style.padding-bottom.px]=\"_gutterHitPadY()\"\n [style.margin-left.px]=\"-_gutterHitPadX()\"\n [style.margin-right.px]=\"-_gutterHitPadX()\"\n [style.margin-top.px]=\"-_gutterHitPadY()\"\n [style.margin-bottom.px]=\"-_gutterHitPadY()\"\n (pointerdown)=\"_onGutterPointerDown($event, i)\"\n (keydown)=\"_onGutterKeydown($event, i)\"\n ></div>\n }\n `,\n})\nexport class SplitComponent {\n /** Axis along which panes are laid out. `'horizontal'` = side-by-side; `'vertical'` = stacked. Defaults to `'horizontal'`. */\n readonly direction = input<SplitDirection>('horizontal');\n\n /** How sizes are expressed and reported. A single unit governs the whole container. Defaults to `'percent'`. */\n readonly unit = input<SplitUnit>('percent');\n\n /** Painted thickness of each gutter in pixels, perpendicular to the split axis, and the space it takes from the panes. The pointer target is padded out to a 24px minimum independently of this value (WCAG 2.2 SC 2.5.8), so a thin gutter stays thin without becoming hard to grab. Defaults to `6`. */\n readonly gutterSize = input(6);\n\n /** When true, all resize interactions are disabled. Gutters are not focusable and do not respond to input. Defaults to `false`. */\n readonly disabled = input(false);\n\n /** How much to move the gutter per arrow-key press, in the container's declared unit. Defaults to `10`. */\n readonly keyboardStep = input(10);\n\n /** Step size for `PageUp` / `PageDown` key presses, in the container's declared unit. Defaults to `50`. */\n readonly keyboardStepLarge = input(50);\n\n /**\n * If non-null, pane sizes are persisted to `localStorage` under this key and restored on init.\n * Defaults to `null` (persistence disabled).\n */\n readonly storageKey = input<string | null>(null);\n\n /**\n * When true, horizontal direction is visually reversed (RTL layout).\n * Defaults to `null`, which means the value is inherited from the nearest ancestor `dir` attribute.\n */\n readonly rtl = input<boolean | null>(null);\n\n /**\n * Fires after any committed resize with the ordered array of current pane sizes.\n * Does **not** fire on every pointer move during drag — only on commit (release, keyboard step, programmatic call).\n */\n readonly sizesChange = output<number[]>();\n\n /** Fires on pointer/touch down or keyboard-initiated resize start. */\n readonly resizeStart = output<SplitResizeEvent>();\n\n /** Fires on pointer/touch up, blur, or keyboard resize commit. */\n readonly resizeEnd = output<SplitResizeEvent>();\n\n /** Fires when a pane collapses or expands via snap, keyboard, or programmatic API. */\n readonly collapseChange = output<SplitCollapseEvent>();\n\n private readonly _elRef = inject(ElementRef);\n private readonly _ngZone = inject(NgZone);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _directionality = inject(Directionality, { optional: true });\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n readonly _panes = contentChildren(SplitPaneComponent);\n\n /** Stable id used to namespace per-pane DOM ids inside this container. */\n private readonly _componentId = `tw-split-${nextSplitId++}`;\n\n /**\n * @internal\n * Container dimension in pixels along the split axis, updated by ResizeObserver.\n * Starts at 0 until the first observation fires.\n */\n readonly _containerSizePx = signal(0);\n\n /**\n * @internal\n * Current pane sizes in the container's declared unit.\n * Percent mode: values sum to 100 (within epsilon).\n * Pixel mode: values are absolute pixel sizes.\n */\n readonly _sizes = signal<number[]>([]);\n\n /**\n * Live `dir` resolved through CDK `Directionality`. Read straight from\n * `valueSignal` (CDK 22+) so `_isRtl` re-evaluates on a runtime `dir` flip\n * with no manual subscription mirror. Falls back to 'ltr' when the consumer's\n * injector cannot supply the token (`{ optional: true }`).\n */\n private readonly _cdkDir = computed<'ltr' | 'rtl'>(\n () => this._directionality?.valueSignal() ?? 'ltr',\n );\n\n /** Resolves the effective RTL state: explicit `rtl` input overrides CDK `dir`. */\n readonly _isRtl = computed(() => this.rtl() ?? this._cdkDir() === 'rtl');\n\n // Previous pane refs — plain field, not a signal, so the pane effect does\n // not re-run just because we wrote this value.\n private _prevPaneRefs: readonly SplitPaneComponent[] | null = null;\n\n /** True until the first pane-list reconciliation has run; gates persistence hydration. */\n private _initialReconciled = false;\n\n /** Resolved class strings from tailwind-variants. */\n private readonly _classes = computed(() =>\n splitVariants({\n direction: this.direction(),\n disabled: this.disabled(),\n }),\n );\n\n readonly _rootClass = computed(() => this._classes().root());\n readonly _gutterClass = computed(() => this._classes().gutter());\n\n /**\n * @internal\n * Transparent padding added to each side of the gutter so its pointer target\n * reaches the WCAG 2.2 SC 2.5.8 24x24 floor while the painted line stays\n * `gutterSize` thick (the default gutter is 6px — a quarter of the floor).\n *\n * The padding is cancelled by an equal negative margin on the same side, so\n * the gutter's *layout* footprint is still exactly `gutterSize` and the\n * `availableSpace()` math is untouched; only its border box — which is what\n * receives the pointer and what a target-size audit measures — grows. The\n * overhang reaches `_gutterHitPad` px into each neighbouring pane and takes\n * pointer events there (including over a pane's own scrollbar, if it has\n * one); that is the accepted cost of the technique and mirrors how VS Code\n * and every other thin-sash implementation reaches the floor.\n *\n * Zero once `gutterSize` is 24 or more — a gutter that already clears the\n * floor needs no padding and no overhang.\n */\n readonly _gutterHitPad = computed(() =>\n Math.max(0, (TARGET_SIZE_MIN_PX - this.gutterSize()) / 2),\n );\n\n /** @internal Horizontal half of `_gutterHitPad` — non-zero only for a horizontal split, where the gutter is thin across the X axis. Physical (not logical) properties: the padding is symmetric, so RTL needs no separate handling. */\n readonly _gutterHitPadX = computed(() =>\n this.direction() === 'horizontal' ? this._gutterHitPad() : 0,\n );\n\n /** @internal Vertical half of `_gutterHitPad` — non-zero only for a vertical split. */\n readonly _gutterHitPadY = computed(() =>\n this.direction() === 'vertical' ? this._gutterHitPad() : 0,\n );\n\n /** @internal Gutter border-box thickness: `gutterSize` plus the SC 2.5.8 hit padding on both sides, i.e. `max(gutterSize, 24)`. The negative margins give back the padding, so the *layout* footprint stays `gutterSize`. */\n readonly _gutterBoxPx = computed(() => this.gutterSize() + this._gutterHitPad() * 2);\n\n /** Indices `0..panes.length - 2` representing the gutter between pane[i] and pane[i+1]. */\n readonly _gutterIndices = computed(() => {\n const n = this._panes().length;\n return n > 0 ? Array.from({ length: n - 1 }, (_, i) => i) : [];\n });\n\n /** @internal — drag state for the active pointer. */\n private _drag: {\n pointerId: number;\n gutterIndex: number;\n startClient: number;\n startSizes: number[];\n target: HTMLElement;\n moveHandler: (e: PointerEvent) => void;\n upHandler: (e: PointerEvent) => void;\n } | null = null;\n\n constructor() {\n // ResizeObserver — runs outside Angular zone to avoid CD on every resize.\n // Guard against environments (e.g. jsdom in tests) where ResizeObserver\n // is not available; those environments call _onContainerResize() directly.\n afterNextRender(() => {\n if (typeof ResizeObserver === 'undefined') return;\n const el = this._elRef.nativeElement as HTMLElement;\n const ro = new ResizeObserver(entries => {\n const rect = entries[0]?.contentRect;\n if (!rect) return;\n const sizePx = this.direction() === 'horizontal' ? rect.width : rect.height;\n this._ngZone.run(() => this._onContainerResize(sizePx));\n });\n ro.observe(el);\n this._destroyRef.onDestroy(() => ro.disconnect());\n });\n\n // Pane-list effect — re-runs whenever the ContentChildren list changes.\n // Container size is read with untracked() so this effect does NOT re-run\n // on container resize (the ResizeObserver handles that path independently).\n effect(() => {\n const panes = this._panes();\n const containerPx = untracked(() => this._containerSizePx());\n this._onPanesChange(panes, containerPx);\n });\n }\n\n // ── Internal resize handler ─────────────────────────────────────────────────\n\n /**\n * @internal — exposed for testing; do not call from application code.\n * Called by the ResizeObserver when the container's pixel size changes.\n */\n _onContainerResize(newSizePx: number): void {\n const oldSizePx = this._containerSizePx();\n if (Math.abs(newSizePx - oldSizePx) < 0.5) return;\n\n const panes = this._panes();\n const unit = this.unit();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n\n const oldAvailable = availableSpace(oldSizePx, n, gutterSize);\n const newAvailable = availableSpace(newSizePx, n, gutterSize);\n const currentSizes = this._sizes();\n\n const configs = panes.map(toPaneConfig);\n const { sizes, clamped } = rescaleForContainerResize(\n currentSizes,\n configs,\n unit,\n oldAvailable,\n newAvailable,\n );\n\n this._containerSizePx.set(newSizePx);\n this._sizes.set(sizes);\n this._applyToPanes(panes, sizes, unit, n, gutterSize);\n\n // Fire sizesChange only when clamping altered a proportional share (§4.3)\n if (clamped) {\n this._commit(sizes);\n }\n }\n\n // ── Pane-list reconciliation ────────────────────────────────────────────────\n\n /**\n * @internal — exposed for testing; do not call from application code.\n * Called by the contentChildren effect when the pane list changes.\n */\n _onPanesChange(panes: readonly SplitPaneComponent[], containerPx: number): void {\n const unit = this.unit();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n\n // Assign a stable DOM id to each pane so aria-controls on the gutter can\n // reference them. Idempotent — only the first assignment for a given pane\n // sticks; later runs are no-ops.\n for (let i = 0; i < panes.length; i++) {\n panes[i]._ensureId(this._componentId, i);\n }\n\n if (this._prevPaneRefs === null) {\n const restored = this._readPersistedSizes(panes);\n if (restored) {\n this._sizes.set(restored);\n this._applyToPanes(panes, restored, unit, panes.length, gutterSize);\n } else {\n this._initializeSizes(panes, unit, available, gutterSize);\n }\n } else {\n this._reconcilePanes(panes, this._prevPaneRefs, unit, available, gutterSize);\n }\n this._prevPaneRefs = panes;\n this._initialReconciled = true;\n }\n\n private _initializeSizes(\n panes: readonly SplitPaneComponent[],\n unit: SplitUnit,\n available: number,\n gutterSize: number,\n ): void {\n if (panes.length === 0) {\n this._sizes.set([]);\n return;\n }\n const configs = panes.map(toPaneConfig);\n\n if (available > 0 && isDevMode() && hasMinSizeOverflow(configs, unit, available)) {\n console.warn(\n `SplitComponent: sum of minSize values exceeds available space (${available}${unit === 'percent' ? '%' : 'px'}). Panes will overflow.`,\n );\n }\n\n const sizes = resolveInitialSizes(configs, unit, available);\n this._sizes.set(sizes);\n this._applyToPanes(panes, sizes, unit, panes.length, gutterSize);\n }\n\n private _reconcilePanes(\n newPanes: readonly SplitPaneComponent[],\n prevPanes: readonly SplitPaneComponent[],\n unit: SplitUnit,\n available: number,\n gutterSize: number,\n ): void {\n // `_reconcilePanes` runs from inside the contentChildren effect; reading\n // `_sizes` tracked + writing `_sizes.set(newArray)` below would re-fire the\n // effect on every CD tick (new array reference fails Object.is equality).\n const currentSizes = untracked(() => this._sizes());\n let sizes = [...currentSizes];\n\n const prevSet = new Set(prevPanes);\n const newSet = new Set(newPanes);\n const added = newPanes.filter(p => !prevSet.has(p));\n const removed = prevPanes.filter(p => !newSet.has(p));\n\n // Process removals first (working against the prev order)\n let workingPanes: SplitPaneComponent[] = [...prevPanes];\n for (const removedPane of removed) {\n const idx = workingPanes.indexOf(removedPane);\n if (idx === -1) continue;\n workingPanes = workingPanes.filter((_, i) => i !== idx);\n sizes = redistributeOnPaneRemoved(sizes, idx, workingPanes.map(toPaneConfig), unit, available);\n }\n\n // Process additions — `sizes` already represents workingPanes (without the\n // new pane). redistributeOnPaneAdded inserts the new size at newIdx internally.\n for (const addedPane of added) {\n const newIdx = newPanes.indexOf(addedPane);\n workingPanes = [...workingPanes];\n workingPanes.splice(newIdx, 0, addedPane);\n sizes = redistributeOnPaneAdded(\n sizes,\n newIdx,\n toPaneConfig(addedPane),\n workingPanes.map(toPaneConfig),\n unit,\n available,\n );\n }\n\n this._sizes.set(sizes);\n this._applyToPanes(newPanes, sizes, unit, newPanes.length, gutterSize);\n }\n\n // ── Apply sizes to pane DOM ─────────────────────────────────────────────────\n\n private _applyToPanes(\n panes: readonly SplitPaneComponent[],\n sizes: number[],\n unit: SplitUnit,\n numPanes: number,\n gutterSize: number,\n ): void {\n for (let i = 0; i < panes.length; i++) {\n const size = sizes[i] ?? 0;\n // Read the previous size without subscribing — `_applyToPanes` runs from\n // an effect (initial reconciliation) as well as direct calls, and a\n // tracked read combined with the write below would loop the effect\n // indefinitely.\n const prev = untracked(() => panes[i]._size());\n panes[i]._index.set(i);\n panes[i]._basis.set(computeBasis(size, unit, numPanes, gutterSize));\n panes[i]._size.set(size);\n if (Math.abs(prev - size) > 1e-6) {\n panes[i].sizeChange.emit(size);\n }\n }\n }\n\n // ── Public API ──────────────────────────────────────────────────────────────\n\n /**\n * Programmatically set all pane sizes.\n * The array length must equal the current pane count and sizes must be\n * compatible with the declared unit. Throws on mismatch.\n */\n setSizes(sizes: number[]): void {\n const panes = this._panes();\n if (sizes.length !== panes.length) {\n throw new Error(`SplitComponent.setSizes: expected ${panes.length} sizes, got ${sizes.length}`);\n }\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n const totalUnit = unit === 'percent' ? 100 : available;\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(sizes, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, n, gutterSize);\n this._commit(clamped);\n }\n\n /**\n * Collapse the pane at `paneIndex` to its `collapsedSize`.\n * The pane must have `collapsible = true`. Throws if the index is out of range.\n */\n collapse(paneIndex: number): void {\n const panes = this._panes();\n if (paneIndex < 0 || paneIndex >= panes.length) {\n throw new Error(`SplitComponent.collapse: paneIndex ${paneIndex} out of range`);\n }\n const pane = panes[paneIndex];\n if (!pane.collapsible()) {\n throw new Error(\n `SplitComponent.collapse: pane ${paneIndex} is not marked collapsible`,\n );\n }\n if (pane._collapsed()) return;\n\n this._setCollapsed(panes, paneIndex, true, 'programmatic');\n }\n\n /**\n * Restore the pane at `paneIndex` to its pre-collapse size, or its `defaultSize` if none is recorded.\n * Throws if the index is out of range.\n */\n expand(paneIndex: number): void {\n const panes = this._panes();\n if (paneIndex < 0 || paneIndex >= panes.length) {\n throw new Error(`SplitComponent.expand: paneIndex ${paneIndex} out of range`);\n }\n const pane = panes[paneIndex];\n if (!pane._collapsed()) return;\n\n this._setCollapsed(panes, paneIndex, false, 'programmatic');\n }\n\n /**\n * Restore all panes to their declared `defaultSize` values.\n * Clears any persisted sizes if `storageKey` is set.\n */\n reset(): void {\n const panes = this._panes();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const n = panes.length;\n const available = availableSpace(containerPx, n, gutterSize);\n for (const pane of panes) {\n pane._collapsed.set(false);\n pane._preCollapseSize.set(null);\n }\n this._initializeSizes(panes, unit, available, gutterSize);\n if (panes.length > 0) {\n this.sizesChange.emit([...this._sizes()]);\n }\n // Clear persisted sizes after emit so the cleared state is the resting\n // state at the end of reset(). New commits will repopulate the entry.\n this._clearPersistedSizes();\n }\n\n // ── ARIA / pointer / keyboard ───────────────────────────────────────────────\n\n /** @internal — `aria-valuenow` for the gutter between pane i and i+1. Reports the LEFT pane size as a percent. */\n _ariaValueNow(gutterIndex: number): number | null {\n const sizes = this._sizes();\n const size = sizes[gutterIndex];\n if (size === undefined) return null;\n if (this.unit() === 'percent') return Math.round(size);\n const available = availableSpace(\n this._containerSizePx(),\n this._panes().length,\n this.gutterSize(),\n );\n if (available <= 0) return null;\n return Math.round((size / available) * 100);\n }\n\n /** @internal — `aria-controls` references the two adjacent panes' DOM ids. */\n _ariaControls(gutterIndex: number): string | null {\n const panes = this._panes();\n const a = panes[gutterIndex]?._paneId();\n const b = panes[gutterIndex + 1]?._paneId();\n if (!a || !b) return null;\n return `${a} ${b}`;\n }\n\n /** @internal — accessible name fallback for the separator handle. */\n _ariaLabel(gutterIndex: number): string {\n return this.direction() === 'horizontal'\n ? `Resize column ${gutterIndex + 1}`\n : `Resize row ${gutterIndex + 1}`;\n }\n\n /** @internal */\n _onGutterPointerDown(event: PointerEvent, gutterIndex: number): void {\n if (this.disabled() || event.button !== 0) return;\n const target = event.target as HTMLElement;\n target.setPointerCapture(event.pointerId);\n const startClient = this.direction() === 'horizontal' ? event.clientX : event.clientY;\n const startSizes = [...this._sizes()];\n\n const moveHandler = (e: PointerEvent) => this._onGutterPointerMove(e);\n const upHandler = (e: PointerEvent) => this._onGutterPointerUp(e);\n\n target.addEventListener('pointermove', moveHandler);\n target.addEventListener('pointerup', upHandler);\n target.addEventListener('pointercancel', upHandler);\n\n this._drag = {\n pointerId: event.pointerId,\n gutterIndex,\n startClient,\n startSizes,\n target,\n moveHandler,\n upHandler,\n };\n\n this._setNoSelect(true);\n\n this.resizeStart.emit({\n sizes: [...startSizes],\n unit: this.unit(),\n originPaneIndex: gutterIndex,\n cause: event.pointerType === 'touch' ? 'touch' : 'pointer',\n });\n event.preventDefault();\n }\n\n private _onGutterPointerMove(event: PointerEvent): void {\n const drag = this._drag;\n if (!drag) return;\n const horizontal = this.direction() === 'horizontal';\n const current = horizontal ? event.clientX : event.clientY;\n let deltaPx = current - drag.startClient;\n if (deltaPx === 0) return;\n // In RTL horizontal mode the visual delta is inverted from the pane order.\n if (horizontal && this._isRtl()) deltaPx = -deltaPx;\n\n const panes = this._panes();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const available = availableSpace(containerPx, panes.length, this.gutterSize());\n if (available <= 0) return;\n\n const deltaUnit = unit === 'percent' ? (deltaPx / available) * 100 : deltaPx;\n\n // Apply delta to gutterIndex (grows) and gutterIndex+1 (shrinks).\n const next = [...drag.startSizes];\n next[drag.gutterIndex] = drag.startSizes[drag.gutterIndex] + deltaUnit;\n next[drag.gutterIndex + 1] = drag.startSizes[drag.gutterIndex + 1] - deltaUnit;\n\n const totalUnit = unit === 'percent' ? 100 : available;\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(next, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, panes.length, this.gutterSize());\n }\n\n private _onGutterPointerUp(event: PointerEvent): void {\n const drag = this._drag;\n if (!drag) return;\n const target = drag.target;\n try {\n target.releasePointerCapture(drag.pointerId);\n } catch {\n /* pointer already released */\n }\n target.removeEventListener('pointermove', drag.moveHandler);\n target.removeEventListener('pointerup', drag.upHandler);\n target.removeEventListener('pointercancel', drag.upHandler);\n this._drag = null;\n\n this._setNoSelect(false);\n\n const finalSizes = this._sizes();\n\n // Snap-collapse threshold check on the two panes adjacent to the drag.\n this._maybeSnap(drag.gutterIndex);\n\n this._commit(this._sizes());\n this.resizeEnd.emit({\n sizes: [...finalSizes],\n unit: this.unit(),\n originPaneIndex: drag.gutterIndex,\n cause: event.pointerType === 'touch' ? 'touch' : 'pointer',\n });\n }\n\n /** @internal */\n _onGutterKeydown(event: KeyboardEvent, gutterIndex: number): void {\n if (this.disabled()) return;\n const horizontal = this.direction() === 'horizontal';\n const step = this.keyboardStep();\n const stepLarge = this.keyboardStepLarge();\n const rtl = horizontal && this._isRtl();\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const available = availableSpace(containerPx, this._panes().length, this.gutterSize());\n const totalUnit = unit === 'percent' ? 100 : available;\n // Use the container's full extent for Home/End so the delta saturates the\n // left pane against its bounds without resorting to Infinity (which would\n // produce NaN once multiplied by the redistribution scaling factor).\n const saturate = totalUnit > 0 ? totalUnit : 1e9;\n\n let delta: number | null = null;\n const cause: SplitResizeEvent['cause'] = 'keyboard';\n let restore = false;\n\n switch (event.key) {\n case 'ArrowLeft':\n if (horizontal) delta = rtl ? step : -step;\n break;\n case 'ArrowRight':\n if (horizontal) delta = rtl ? -step : step;\n break;\n case 'ArrowUp':\n if (!horizontal) delta = -step;\n break;\n case 'ArrowDown':\n if (!horizontal) delta = step;\n break;\n case 'PageUp':\n delta = -stepLarge;\n break;\n case 'PageDown':\n delta = stepLarge;\n break;\n case 'Home':\n delta = -saturate;\n break;\n case 'End':\n delta = saturate;\n break;\n case 'Enter':\n case ' ':\n restore = true;\n break;\n default:\n return;\n }\n\n if (delta === null && !restore) return;\n event.preventDefault();\n\n const panes = this._panes();\n const startSizes = [...this._sizes()];\n\n this.resizeStart.emit({\n sizes: [...startSizes],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n\n if (restore) {\n // Enter / Space toggles collapse on the LEFT pane of the focused gutter\n // when collapsible; otherwise falls back to reset() for keyboard-only recovery.\n const leftPane = panes[gutterIndex];\n if (leftPane?.collapsible()) {\n this._setCollapsed(panes, gutterIndex, !leftPane._collapsed(), 'keyboard');\n this.resizeEnd.emit({\n sizes: [...this._sizes()],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n return;\n }\n this.reset();\n this.resizeEnd.emit({\n sizes: [...this._sizes()],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n return;\n }\n\n const next = [...startSizes];\n next[gutterIndex] = startSizes[gutterIndex] + (delta as number);\n next[gutterIndex + 1] = startSizes[gutterIndex + 1] - (delta as number);\n\n const configs = panes.map(toPaneConfig);\n const clamped = redistributeWithConstraints(next, configs, totalUnit);\n this._sizes.set(clamped);\n this._applyToPanes(panes, clamped, unit, panes.length, this.gutterSize());\n this._commit(clamped);\n this.resizeEnd.emit({\n sizes: [...clamped],\n unit,\n originPaneIndex: gutterIndex,\n cause,\n });\n }\n\n // ── Collapse helpers ────────────────────────────────────────────────────────\n\n private _setCollapsed(\n panes: readonly SplitPaneComponent[],\n paneIndex: number,\n collapsed: boolean,\n cause: SplitCollapseEvent['cause'],\n ): void {\n const pane = panes[paneIndex];\n const unit = this.unit();\n const containerPx = this._containerSizePx();\n const gutterSize = this.gutterSize();\n const available = availableSpace(containerPx, panes.length, gutterSize);\n const totalUnit = unit === 'percent' ? 100 : available;\n\n const current = [...this._sizes()];\n // Pick the neighbour that absorbs the size delta: prefer the right pane,\n // fall back to the left pane when collapsing the last pane in the row.\n const partner = paneIndex < panes.length - 1 ? paneIndex + 1 : paneIndex - 1;\n const target = [...current];\n const configs = panes.map(toPaneConfig);\n\n if (collapsed) {\n pane._preCollapseSize.set(current[paneIndex] ?? null);\n const collapsedSize = pane.collapsedSize();\n const delta = current[paneIndex] - collapsedSize;\n target[paneIndex] = collapsedSize;\n if (partner >= 0) target[partner] = current[partner] + delta;\n // Lock the collapsed pane to exactly `collapsedSize` during redistribution\n // so slack does not flow back into it.\n configs[paneIndex] = {\n defaultSize: configs[paneIndex].defaultSize,\n minSize: collapsedSize,\n maxSize: collapsedSize,\n };\n } else {\n const restored =\n pane._preCollapseSize() ?? pane.defaultSize() ?? totalUnit / Math.max(1, panes.length);\n const delta = restored - current[paneIndex];\n target[paneIndex] = restored;\n if (partner >= 0) target[partner] = current[partner] - delta;\n pane._preCollapseSize.set(null);\n }\n\n const next = redistributeWithConstraints(target, configs, totalUnit);\n\n pane._collapsed.set(collapsed);\n pane.collapsedChange.emit(collapsed);\n this._sizes.set(next);\n this._applyToPanes(panes, next, unit, panes.length, gutterSize);\n this._commit(next);\n this.collapseChange.emit({ paneIndex, collapsed, cause });\n }\n\n private _maybeSnap(gutterIndex: number): void {\n const panes = this._panes();\n const sizes = this._sizes();\n for (const i of [gutterIndex, gutterIndex + 1]) {\n const pane = panes[i];\n if (!pane?.collapsible()) continue;\n const snap = pane.snapSize();\n if (snap <= 0) continue;\n const size = sizes[i] ?? 0;\n const collapsed = pane._collapsed();\n const collapsedSize = pane.collapsedSize();\n const distance = Math.abs(size - collapsedSize);\n if (!collapsed && distance <= snap && size > collapsedSize) {\n this._setCollapsed(panes, i, true, 'snap');\n } else if (collapsed && size > collapsedSize + snap) {\n this._setCollapsed(panes, i, false, 'snap');\n }\n }\n }\n\n // ── Persistence ─────────────────────────────────────────────────────────────\n\n private _readPersistedSizes(panes: readonly SplitPaneComponent[]): number[] | null {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed) || parsed.length !== panes.length) return null;\n if (!parsed.every((v: unknown) => typeof v === 'number' && Number.isFinite(v))) return null;\n const unit = this.unit();\n const configs = panes.map(toPaneConfig);\n // `_containerSizePx` is read untracked: this method runs inside the\n // contentChildren effect, which already handles container-size changes\n // through the separate ResizeObserver path.\n const containerPx = untracked(() => this._containerSizePx());\n const available = availableSpace(containerPx, panes.length, this.gutterSize());\n const totalUnit = unit === 'percent' ? 100 : available;\n // Re-clamp persisted sizes against current constraints. If totalUnit is 0\n // (pixel mode pre-measurement), fall back to raw values for later rescaling.\n if (totalUnit <= 0) return parsed as number[];\n return redistributeWithConstraints(parsed as number[], configs, totalUnit);\n } catch {\n return null;\n }\n }\n\n private _writePersistedSizes(sizes: number[]): void {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return;\n if (!this._initialReconciled) return;\n try {\n localStorage.setItem(key, JSON.stringify(sizes));\n } catch {\n /* quota / private-browsing — silently skip persistence */\n }\n }\n\n private _clearPersistedSizes(): void {\n const key = this.storageKey();\n if (!key || !this._isBrowser || typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(key);\n } catch {\n /* swallow */\n }\n }\n\n // ── Commit helper ──────────────────────────────────────────────────────────\n\n private _commit(sizes: number[]): void {\n this.sizesChange.emit([...sizes]);\n this._writePersistedSizes(sizes);\n }\n\n // ── User-select suppression during drag ────────────────────────────────────\n\n private _setNoSelect(active: boolean): void {\n if (!this._isBrowser || typeof document === 'undefined') return;\n document.body.classList.toggle('tw-split-no-select', active);\n }\n}\n\nfunction toPaneConfig(pane: SplitPaneComponent): PaneConstraints {\n return {\n defaultSize: pane.defaultSize(),\n minSize: pane.minSize(),\n maxSize: pane.maxSize(),\n };\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marker directive for a custom gutter projection slot.\n * Attach to content inside `<tw-split>` to provide custom gutter visuals.\n * The container still owns all interaction logic.\n */\n@Directive({\n selector: '[twSplitGutter]',\n})\nexport class SplitGutterDirective {}\n","import { Directive } from '@angular/core';\n\n/**\n * Marker directive for an optional header region inside `<tw-split-pane>`.\n * A parent Dock or Panel component may key off this region; the split pane\n * itself does not apply any styling to it.\n */\n@Directive({\n selector: '[twSplitPaneHeader]',\n})\nexport class SplitPaneHeaderDirective {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,9 +1,15 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, input, booleanAttribute, viewChild, signal, inject, Injector, afterRenderEffect, computed, ChangeDetectionStrategy, Component, contentChild } from '@angular/core';
2
+ import { Directive, input, booleanAttribute, viewChild, signal, inject, DestroyRef, afterNextRender, computed, ChangeDetectionStrategy, Component, contentChild } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
4
  import { tv } from 'tailwind-variants';
5
5
  import { SkeletonComponent } from '@cdevhub/ngx-tw/skeleton';
6
6
 
7
+ /** Maps every legacy spelling onto its canonical replacement. */
8
+ const VARIANT_ALIASES = {
9
+ plain: 'ghost',
10
+ outlined: 'outline',
11
+ filled: 'solid',
12
+ };
7
13
  // ── Slot marker directives (DOM projection) ───────────────────────────
8
14
  /** Label slot — short caption ("Revenue", "Active users"). Projected into `<dt>`. */
9
15
  class StatLabelDirective {
@@ -67,12 +73,12 @@ const statTile = tv({
67
73
  },
68
74
  variants: {
69
75
  variant: {
70
- plain: { root: 'bg-transparent' },
71
- outlined: { root: 'bg-surface border border-border rounded-lg' },
76
+ ghost: { root: 'bg-transparent' },
77
+ outline: { root: 'bg-surface border border-border rounded-lg' },
72
78
  elevated: {
73
79
  root: 'bg-surface-raised border border-border rounded-lg shadow hover:shadow-md transition-shadow duration-200 motion-reduce:transition-none',
74
80
  },
75
- filled: { root: 'bg-surface-muted rounded-lg' },
81
+ solid: { root: 'bg-surface-muted rounded-lg' },
76
82
  },
77
83
  size: {
78
84
  xs: {
@@ -121,7 +127,7 @@ const statTile = tv({
121
127
  },
122
128
  },
123
129
  defaultVariants: {
124
- variant: 'outlined',
130
+ variant: 'outline',
125
131
  size: 'md',
126
132
  },
127
133
  }, { twMerge: true });
@@ -236,30 +242,55 @@ class StatDeltaComponent {
236
242
  /** Optional comparison label rendered next to the delta value (e.g. `"vs last week"`, `"since launch"`). Defaults to `undefined`. */
237
243
  comparisonLabel = input(/* @ts-ignore */
238
244
  ...(ngDevMode ? [undefined, { debugName: "comparisonLabel" }] : /* istanbul ignore next */ []));
239
- /** Explicit accessible label. When omitted, the component composes one from `direction` + projected text + `comparisonLabel`. Override when projected content is purely symbolic or already localized. Defaults to `undefined`. */
240
- ariaLabel = input(/* @ts-ignore */
241
- ...(ngDevMode ? [undefined, { debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
245
+ /** Explicit accessible label, mirrored to `aria-label`. When omitted, the component composes one from `direction` + projected text + `comparisonLabel`. Override when projected content is purely symbolic or already localized. Defaults to `undefined`. */
246
+ ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
242
247
  /** @internal */
243
248
  textEl = viewChild('textEl', /* @ts-ignore */
244
249
  ...(ngDevMode ? [{ debugName: "textEl" }] : /* istanbul ignore next */ []));
245
250
  /** @internal */
246
251
  projectedText = signal('', /* @ts-ignore */
247
252
  ...(ngDevMode ? [{ debugName: "projectedText" }] : /* istanbul ignore next */ []));
253
+ destroyRef = inject(DestroyRef);
248
254
  constructor() {
249
- const injector = inject(Injector);
250
- // Read the projected text via the wrapper span's textContent. textContent
251
- // is recursive across projected children, so this resolves the consumer's
252
- // string even when wrapped in arbitrary markup. afterRenderEffect runs
253
- // after each render so projection changes are captured.
254
- afterRenderEffect(() => {
255
+ // Read the projected text via the wrapper span's `textContent`, which is
256
+ // recursive across projected children and therefore resolves the
257
+ // consumer's string even when wrapped in arbitrary markup.
258
+ //
259
+ // A `MutationObserver` — not a render hook, and not `contentChild`:
260
+ //
261
+ // * `contentChild` cannot see through `<ng-content>`; it resolves the
262
+ // *parent's* own content children, not the nodes the consumer projected
263
+ // into this component. `flip-card.ts` uses an observer for exactly this
264
+ // reason and says so.
265
+ // * `afterRenderEffect` does NOT run after every render. It is a reactive
266
+ // effect scheduled into a render phase and re-runs only when a tracked
267
+ // signal producer changes (Angular v22 `AFTER_RENDER_PHASE_EFFECT_NODE`
268
+ // bails on `!this.dirty` / `!consumerPollProducersForChange`).
269
+ // `el.textContent` is not a signal and `textEl` is a static,
270
+ // unconditional `viewChild`, so the earlier hook sampled the text once
271
+ // and froze it: `{{ growth() }}%` going 12 → 34 kept announcing 12.
272
+ // (The previous comment here asserted the opposite; it was wrong.)
273
+ //
274
+ // Scope is broader than flip-card's single-target `childList` because the
275
+ // interesting mutation is a *text* edit on a descendant text node:
276
+ // `characterData` fires on the child node, so `subtree` is load-bearing,
277
+ // and `childList` catches structural swaps inside the projected markup.
278
+ // The observed element is the component's own single wrapper span, so the
279
+ // cost stays bounded, and it disconnects on destroy.
280
+ //
281
+ // No signal cycle: the write feeds `composedAriaLabel` → the *host*'s
282
+ // `[attr.aria-label]`, which is outside `#textEl` and so cannot re-trigger
283
+ // the observer. Identical-value `signal.set` calls are no-ops.
284
+ afterNextRender(() => {
255
285
  const el = this.textEl()?.nativeElement;
256
- if (!el) {
257
- this.projectedText.set('');
286
+ if (!el)
258
287
  return;
259
- }
260
- const text = (el.textContent ?? '').trim();
261
- this.projectedText.set(text);
262
- }, { injector });
288
+ const update = () => this.projectedText.set((el.textContent ?? '').trim());
289
+ update();
290
+ const observer = new MutationObserver(update);
291
+ observer.observe(el, { childList: true, characterData: true, subtree: true });
292
+ this.destroyRef.onDestroy(() => observer.disconnect());
293
+ });
263
294
  }
264
295
  /** @internal */
265
296
  effectiveColor = computed(() => {
@@ -312,7 +343,7 @@ class StatDeltaComponent {
312
343
  comparisonClasses = computed(() => this.variantResult().comparison(), /* @ts-ignore */
313
344
  ...(ngDevMode ? [{ debugName: "comparisonClasses" }] : /* istanbul ignore next */ []));
314
345
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: StatDeltaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
315
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: StatDeltaComponent, isStandalone: true, selector: "tw-stat-delta", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, comparisonLabel: { classPropertyName: "comparisonLabel", publicName: "comparisonLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "img" }, properties: { "class": "rootClasses()", "attr.aria-label": "composedAriaLabel()" } }, viewQueries: [{ propertyName: "textEl", first: true, predicate: ["textEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
346
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: StatDeltaComponent, isStandalone: true, selector: "tw-stat-delta", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, inverted: { classPropertyName: "inverted", publicName: "inverted", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, comparisonLabel: { classPropertyName: "comparisonLabel", publicName: "comparisonLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "img" }, properties: { "class": "rootClasses()", "attr.aria-label": "composedAriaLabel()" } }, viewQueries: [{ propertyName: "textEl", first: true, predicate: ["textEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
316
347
  <svg
317
348
  [class]="iconClasses() + ' ' + iconSizeClass()"
318
349
  viewBox="0 0 16 16"
@@ -368,7 +399,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
368
399
  }
369
400
  `,
370
401
  }]
371
- }], ctorParameters: () => [], propDecorators: { direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], comparisonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparisonLabel", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], textEl: [{ type: i0.ViewChild, args: ['textEl', { isSignal: true }] }] } });
402
+ }], ctorParameters: () => [], propDecorators: { direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], inverted: [{ type: i0.Input, args: [{ isSignal: true, alias: "inverted", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], comparisonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "comparisonLabel", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], textEl: [{ type: i0.ViewChild, args: ['textEl', { isSignal: true }] }] } });
372
403
  // ── Stat tile component ───────────────────────────────────────────────
373
404
  /**
374
405
  * KPI tile — a compact display tile surfacing a single key performance
@@ -389,8 +420,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
389
420
  * consumers can compose their own skeleton charts.
390
421
  */
391
422
  class StatComponent {
392
- /** Surface treatment. `'plain'` removes border and background; `'outlined'` (default) adds a border on the surface token; `'elevated'` adds shadow and uses the raised surface; `'filled'` uses the muted surface with no border. */
393
- variant = input('outlined', /* @ts-ignore */
423
+ /** Surface treatment. `'ghost'` removes border and background; `'outline'` (default) adds a border on the surface token; `'elevated'` adds shadow and uses the raised surface; `'solid'` uses the muted surface with no border. `'plain'`, `'outlined'` and `'filled'` are deprecated aliases for `'ghost'`, `'outline'` and `'solid'` and render identically. */
424
+ variant = input('outline', /* @ts-ignore */
394
425
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
395
426
  /** Density scale — drives padding, internal gaps, value/label typography, and the skeleton placeholder dimensions. Defaults to `'md'`. */
396
427
  size = input('md', /* @ts-ignore */
@@ -451,7 +482,14 @@ class StatComponent {
451
482
  }
452
483
  }, /* @ts-ignore */
453
484
  ...(ngDevMode ? [{ debugName: "loadingValueHeight" }] : /* istanbul ignore next */ []));
454
- variantResult = computed(() => statTile({ variant: this.variant(), size: this.size() }), /* @ts-ignore */
485
+ /** @internal Canonical variant with legacy spellings folded in. */
486
+ resolvedVariant = computed(() => {
487
+ const v = this.variant();
488
+ return (VARIANT_ALIASES[v] ??
489
+ v);
490
+ }, /* @ts-ignore */
491
+ ...(ngDevMode ? [{ debugName: "resolvedVariant" }] : /* istanbul ignore next */ []));
492
+ variantResult = computed(() => statTile({ variant: this.resolvedVariant(), size: this.size() }), /* @ts-ignore */
455
493
  ...(ngDevMode ? [{ debugName: "variantResult" }] : /* istanbul ignore next */ []));
456
494
  rootClasses = computed(() => this.variantResult().root(), /* @ts-ignore */
457
495
  ...(ngDevMode ? [{ debugName: "rootClasses" }] : /* istanbul ignore next */ []));