@cdevhub/ngx-tw 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +264 -49
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
- package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
- package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
- package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
- package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
- package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
- package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
- package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
- package/package.json +45 -20
- package/theme/index.css +10 -2
- package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
- package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
- package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
- package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
- package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
- package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
- package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
- package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
- package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
- package/types/cdevhub-ngx-tw-table.d.ts +30 -1
- package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
- package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
- package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
- package/types/cdevhub-ngx-tw.d.ts +7 -0
|
@@ -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":";;;;;;AASA;;;AAGG;MAeU,kBAAkB,CAAA;;AAEpB,IAAA,WAAW,GAAG,KAAK,CAAqB,SAAS,kFAAC;;AAGlD,IAAA,OAAO,GAAG,KAAK,CAAC,CAAC,8EAAC;;AAGlB,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,8EAAC;;AAGzB,IAAA,WAAW,GAAG,KAAK,CAAC,KAAK,kFAAC;;AAG1B,IAAA,aAAa,GAAG,KAAK,CAAC,CAAC,oFAAC;AAEjC;;;AAGG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAC,CAAC,+EAAC;AAE5B;;;AAGG;AACM,IAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,4EAAC;;IAG5C,UAAU,GAAG,MAAM,EAAU;;IAG7B,eAAe,GAAG,MAAM,EAAW;AAE5C;;;;AAIG;AACM,IAAA,MAAM,GAAG,MAAM,CAAC,EAAE,6EAAC;AAE5B;;;;AAIG;AACM,IAAA,KAAK,GAAG,MAAM,CAAC,CAAC,4EAAC;AAE1B;;;;AAIG;AACM,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAEnC;;;;AAIG;AACM,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,uFAAC;AAEvD;;;;AAIG;AACM,IAAA,MAAM,GAAG,MAAM,CAAC,CAAC,6EAAC;AAE3B;;;;AAIG;AACM,IAAA,OAAO,GAAG,MAAM,CAAgB,IAAI,8EAAC;AAE9C;;;;;AAKG;IACH,SAAS,CAAC,WAAmB,EAAE,KAAa,EAAA;AAC1C,QAAA,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,WAAW,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAC;QAClD;IACF;wGAtFW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,szCAFnB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,WAAW,EAAE,WAAW;AACxB,wBAAA,oBAAoB,EAAE,UAAU;AAChC,wBAAA,mBAAmB,EAAE,KAAK;AAC1B,wBAAA,oBAAoB,EAAE,KAAK;AAC3B,wBAAA,eAAe,EAAE,cAAc;AAC/B,wBAAA,kCAAkC,EAAE,cAAc;AAClD,wBAAA,KAAK,EAAE,eAAe;AACvB,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;AChBD,MAAM,OAAO,GAAG,IAAI;AAEpB;AAEA;SACgB,SAAS,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AAC/D,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;AAC5C;AAEA;;;;;AAKG;SACa,cAAc,CAAC,WAAmB,EAAE,QAAgB,EAAE,UAAkB,EAAA;IACtF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;AAC1E;AAEA;;;;;;;;;;AAUG;AACG,SAAU,YAAY,CAC1B,IAAY,EACZ,IAAyB,EACzB,QAAgB,EAChB,UAAkB,EAAA;IAElB,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAI;AACxC,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,UAAU;IAC5D,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,aAAa;;IAEhD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,IAAA,OAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,IAAA,EAAO,MAAM,KAAK;AACtC;AAEA;AAEA;;;;AAIG;SACa,mBAAmB,CACjC,KAAwB,EACxB,IAAyB,EACzB,WAAmB,EAAA;AAEnB,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;IACtB,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;;;IAItB,IAAI,IAAI,KAAK,OAAO,IAAI,WAAW,IAAI,CAAC,EAAE;QACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5E;AAEA,IAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,WAAW;IAExD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3E,IAAA,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,MAAM;AAC7E,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;AACtD,IAAA,MAAM,eAAe,GAAG,eAAe,GAAG,CAAC,GAAG,SAAS,GAAG,eAAe,GAAG,CAAC;AAE7E,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,eAAe,CAAC;IAC5D,OAAO,2BAA2B,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC;AAC3D;AAEA;;;;;AAKG;SACa,2BAA2B,CACzC,KAAe,EACf,KAAwB,EACxB,SAAiB,EAAA;AAEjB,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;;AAEtB,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAEpF,IAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE;AACpC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,OAAO;YAAE;;QAGhD,MAAM,IAAI,GAAa,EAAE;AACzB,QAAA,IAAI,UAAU,GAAG,SAAS,EAAE;AAC1B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,gBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D;QACF;aAAO;AACL,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,gBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D;QACF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,MAAM;AAE7B,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAClF,QAAA,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,OAAO;YAAE;AAElD,QAAA,IAAI,WAAW,IAAI,OAAO,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC,MAAM;YACtC,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACxF;aAAO;AACL,YAAA,MAAM,KAAK,GAAG,UAAU,GAAG,WAAW;YACtC,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACpG;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;AAEA;;;;;;;;;AASG;AACG,SAAU,yBAAyB,CACvC,YAAsB,EACtB,KAAwB,EACxB,IAAyB,EACzB,cAAsB,EACtB,cAAsB,EAAA;AAEtB,IAAA,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM;IAC7B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AAEjD,IAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,cAAc;AAE3D,IAAA,IAAI,QAAkB;AACtB,IAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,QAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC;IAC9B;SAAO;AACL,QAAA,MAAM,KAAK,GAAG,cAAc,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,GAAG,CAAC;AAC5E,QAAA,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAC7C;IAEA,MAAM,OAAO,GAAG,2BAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAC9E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE;AAChD;AAEA;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CACrC,YAAsB,EACtB,YAAoB,EACpB,aAA8B,EAC9B,cAAiC,EACjC,IAAyB,EACzB,WAAmB,EAAA;AAEnB,IAAA,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM;AAC/B,IAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,WAAW;IAExD,MAAM,OAAO,GAAG,SAAS,CACvB,aAAa,CAAC,WAAW,IAAI,SAAS,GAAG,CAAC,EAC1C,aAAa,CAAC,OAAO,EACrB,aAAa,CAAC,OAAO,CACtB;AAED,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;AACvD,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAE3D,IAAA,MAAM,MAAM,GACV,WAAW,GAAG;AACZ,UAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,IAAI,cAAc;UACxD,YAAY,CAAC,GAAG,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;AAE/E,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC;IAEvC,OAAO,2BAA2B,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC;AACvE;AAEA;;;AAGG;AACG,SAAU,yBAAyB,CACvC,YAAsB,EACtB,YAAoB,EACpB,oBAAuC,EACvC,IAAyB,EACzB,WAAmB,EAAA;AAEnB,IAAA,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC;AACnE,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;AAErC,IAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,WAAW;AACxD,IAAA,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAEzD,IAAA,MAAM,MAAM,GACV,YAAY,GAAG;AACb,UAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,SAAS;AACnD,UAAE,SAAS,CAAC,GAAG,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;IAEvD,OAAO,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,CAAC;AAC7E;AAEA;AAEA;SACgB,kBAAkB,CAChC,KAAwB,EACxB,IAAyB,EACzB,WAAmB,EAAA;AAEnB,IAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,WAAW;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3D,IAAA,OAAO,MAAM,GAAG,SAAS,GAAG,OAAO;AACrC;;ACtNA,IAAI,WAAW,GAAG,CAAC;AAEnB,MAAM,aAAa,GAAG,EAAE,CACtB;AACE,IAAA,KAAK,EAAE;AACL,QAAA,IAAI,EAAE,oBAAoB;AAC1B,QAAA,MAAM,EACJ,oMAAoM;AACvM,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,SAAS,EAAE;YACT,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE;YAC7D,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE;AAC5D,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,EAAE,MAAM,EAAE,+CAA+C,EAAE;AACjE,YAAA,KAAK,EAAE,EAAE;AACV,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;AAED;;;;;;;;;;;AAWG;MAgCU,cAAc,CAAA;;AAEhB,IAAA,SAAS,GAAG,KAAK,CAAiB,YAAY,gFAAC;;AAG/C,IAAA,IAAI,GAAG,KAAK,CAAY,SAAS,2EAAC;;AAGlC,IAAA,UAAU,GAAG,KAAK,CAAC,CAAC,iFAAC;;AAGrB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;;AAGvB,IAAA,YAAY,GAAG,KAAK,CAAC,EAAE,mFAAC;;AAGxB,IAAA,iBAAiB,GAAG,KAAK,CAAC,EAAE,wFAAC;AAEtC;;;AAGG;AACM,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;AAEhD;;;AAGG;AACM,IAAA,GAAG,GAAG,KAAK,CAAiB,IAAI,0EAAC;AAE1C;;;AAGG;IACM,WAAW,GAAG,MAAM,EAAY;;IAGhC,WAAW,GAAG,MAAM,EAAoB;;IAGxC,SAAS,GAAG,MAAM,EAAoB;;IAGtC,cAAc,GAAG,MAAM,EAAsB;AAErC,IAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;AAC3B,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AACxB,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;IAChC,eAAe,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5D,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAE3D,IAAA,MAAM,GAAG,eAAe,CAAC,kBAAkB,6EAAC;;AAGpC,IAAA,YAAY,GAAG,CAAA,SAAA,EAAY,WAAW,EAAE,EAAE;AAE3D;;;;AAIG;AACM,IAAA,gBAAgB,GAAG,MAAM,CAAC,CAAC,uFAAC;AAErC;;;;;AAKG;AACM,IAAA,MAAM,GAAG,MAAM,CAAW,EAAE,6EAAC;;IAGrB,OAAO,GAAG,MAAM,CAAgB,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAG7E,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,6EAAC;;;IAIhE,aAAa,GAAyC,IAAI;;IAG1D,kBAAkB,GAAG,KAAK;;AAGjB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MACnC,aAAa,CAAC;AACZ,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC1B,KAAA,CAAC,+EACH;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,iFAAC;AACnD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,mFAAC;;AAGvD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM;AAC9B,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;AAChE,IAAA,CAAC,qFAAC;;IAGM,KAAK,GAQF,IAAI;AAEf,IAAA,WAAA,GAAA;;;;QAIE,eAAe,CAAC,MAAK;YACnB,IAAI,OAAO,cAAc,KAAK,WAAW;gBAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAA4B;AACnD,YAAA,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,OAAO,IAAG;gBACtC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW;AACpC,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBACX,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;AAC3E,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACzD,YAAA,CAAC,CAAC;AACF,YAAA,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;AACnD,QAAA,CAAC,CAAC;;;;QAKF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,YAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5D,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC;AACzC,QAAA,CAAC,CAAC;;;;AAKF,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAG;AACxD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACrD;IACF;;AAIA;;;AAGG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,GAAG;YAAE;AAE3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QAEtB,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC;QAC7D,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;QAElC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;AACvC,QAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,yBAAyB,CAClD,YAAY,EACZ,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,YAAY,CACb;AAED,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC;;QAGrD,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB;IACF;;AAIA;;;AAGG;IACH,cAAc,CAAC,KAAoC,EAAE,WAAmB,EAAA;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QACtB,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,UAAU,CAAC;;;;AAK5D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1C;AAEA,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzB,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;YACrE;iBAAO;gBACL,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;YAC3D;QACF;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;QAC9E;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;IAChC;AAEQ,IAAA,gBAAgB,CACtB,KAAoC,EACpC,IAAe,EACf,SAAiB,EACjB,UAAkB,EAAA;AAElB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB;QACF;QACA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;AAEvC,QAAA,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,EAAE,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;AAChF,YAAA,OAAO,CAAC,IAAI,CACV,kEAAkE,SAAS,CAAA,EAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAA,uBAAA,CAAyB,CACvI;QACH;QAEA,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC;AAC3D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;IAClE;IAEQ,eAAe,CACrB,QAAuC,EACvC,SAAwC,EACxC,IAAe,EACf,SAAiB,EACjB,UAAkB,EAAA;;;;AAKlB,QAAA,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;AACnD,QAAA,IAAI,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC;AAE7B,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAChC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAGrD,QAAA,IAAI,YAAY,GAAyB,CAAC,GAAG,SAAS,CAAC;AACvD,QAAA,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE;YACjC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;YAC7C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE;AAChB,YAAA,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;AACvD,YAAA,KAAK,GAAG,yBAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;QAChG;;;AAIA,QAAA,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE;YAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;AAC1C,YAAA,YAAY,GAAG,CAAC,GAAG,YAAY,CAAC;YAChC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC;YACzC,KAAK,GAAG,uBAAuB,CAC7B,KAAK,EACL,MAAM,EACN,YAAY,CAAC,SAAS,CAAC,EACvB,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAC9B,IAAI,EACJ,SAAS,CACV;QACH;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IACxE;;IAIQ,aAAa,CACnB,KAAoC,EACpC,KAAe,EACf,IAAe,EACf,QAAgB,EAChB,UAAkB,EAAA;AAElB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;;;;;AAK1B,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9C,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACtB,YAAA,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACnE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACxB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE;gBAChC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC;QACF;IACF;;AAIA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,KAAe,EAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;AACjC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kCAAA,EAAqC,KAAK,CAAC,MAAM,CAAA,YAAA,EAAe,KAAK,CAAC,MAAM,CAAA,CAAE,CAAC;QACjG;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QACtB,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,UAAU,CAAC;AAC5D,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,SAAS;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,MAAM,OAAO,GAAG,2BAA2B,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;AACtE,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACvB;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,SAAiB,EAAA;AACxB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,CAAA,aAAA,CAAe,CAAC;QACjF;AACA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,CAAA,0BAAA,CAA4B,CACvE;QACH;QACA,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QAEvB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC;IAC5D;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,SAAiB,EAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE;AAC9C,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAA,aAAA,CAAe,CAAC;QAC/E;AACA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE;QAExB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC;IAC7D;AAEA;;;AAGG;IACH,KAAK,GAAA;AACH,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;QACtB,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,EAAE,UAAU,CAAC;AAC5D,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC;QACA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC;AACzD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3C;;;QAGA,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;;AAKA,IAAA,aAAa,CAAC,WAAmB,EAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,cAAc,CAC9B,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EACpB,IAAI,CAAC,UAAU,EAAE,CAClB;QACD,IAAI,SAAS,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;AAC/B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC;IAC7C;;AAGA,IAAA,aAAa,CAAC,WAAmB,EAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE;QACvC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE;AAC3C,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACzB,QAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;IACpB;;AAGA,IAAA,UAAU,CAAC,WAAmB,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK;AAC1B,cAAE,CAAA,cAAA,EAAiB,WAAW,GAAG,CAAC,CAAA;AAClC,cAAE,CAAA,WAAA,EAAc,WAAW,GAAG,CAAC,EAAE;IACrC;;IAGA,oBAAoB,CAAC,KAAmB,EAAE,WAAmB,EAAA;QAC3D,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AAC3C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;QACrF,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAErC,QAAA,MAAM,WAAW,GAAG,CAAC,CAAe,KAAK,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACrE,QAAA,MAAM,SAAS,GAAG,CAAC,CAAe,KAAK,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAEjE,QAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC;AACnD,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;AAC/C,QAAA,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,SAAS,CAAC;QAEnD,IAAI,CAAC,KAAK,GAAG;YACX,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,WAAW;YACX,WAAW;YACX,UAAU;YACV,MAAM;YACN,WAAW;YACX,SAAS;SACV;AAED,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC;AACtB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,eAAe,EAAE,WAAW;AAC5B,YAAA,KAAK,EAAE,KAAK,CAAC,WAAW,KAAK,OAAO,GAAG,OAAO,GAAG,SAAS;AAC3D,SAAA,CAAC;QACF,KAAK,CAAC,cAAc,EAAE;IACxB;AAEQ,IAAA,oBAAoB,CAAC,KAAmB,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY;AACpD,QAAA,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAC1D,QAAA,IAAI,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,WAAW;QACxC,IAAI,OAAO,KAAK,CAAC;YAAE;;AAEnB,QAAA,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,GAAG,CAAC,OAAO;AAEnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9E,IAAI,SAAS,IAAI,CAAC;YAAE;AAEpB,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,CAAC,OAAO,GAAG,SAAS,IAAI,GAAG,GAAG,OAAO;;QAG5E,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS;QACtE,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,SAAS;AAE9E,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,SAAS;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;AACrE,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3E;AAEQ,IAAA,kBAAkB,CAAC,KAAmB,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C;AAAE,QAAA,MAAM;;QAER;QACA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;QAC3D,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QACvD,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AAEjB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAExB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE;;AAGhC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAEjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,YAAA,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC;AACtB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,eAAe,EAAE,IAAI,CAAC,WAAW;AACjC,YAAA,KAAK,EAAE,KAAK,CAAC,WAAW,KAAK,OAAO,GAAG,OAAO,GAAG,SAAS;AAC3D,SAAA,CAAC;IACJ;;IAGA,gBAAgB,CAAC,KAAoB,EAAE,WAAmB,EAAA;QACxD,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC1C,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AACtF,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,SAAS;;;;AAItD,QAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG;QAEhD,IAAI,KAAK,GAAkB,IAAI;QAC/B,MAAM,KAAK,GAA8B,UAAU;QACnD,IAAI,OAAO,GAAG,KAAK;AAEnB,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,UAAU;oBAAE,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI;gBAC1C;AACF,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,UAAU;oBAAE,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI;gBAC1C;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,UAAU;oBAAE,KAAK,GAAG,CAAC,IAAI;gBAC9B;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,UAAU;oBAAE,KAAK,GAAG,IAAI;gBAC7B;AACF,YAAA,KAAK,QAAQ;gBACX,KAAK,GAAG,CAAC,SAAS;gBAClB;AACF,YAAA,KAAK,UAAU;gBACb,KAAK,GAAG,SAAS;gBACjB;AACF,YAAA,KAAK,MAAM;gBACT,KAAK,GAAG,CAAC,QAAQ;gBACjB;AACF,YAAA,KAAK,KAAK;gBACR,KAAK,GAAG,QAAQ;gBAChB;AACF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;gBACN,OAAO,GAAG,IAAI;gBACd;AACF,YAAA;gBACE;;AAGJ,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO;YAAE;QAChC,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAErC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC;YACtB,IAAI;AACJ,YAAA,eAAe,EAAE,WAAW;YAC5B,KAAK;AACN,SAAA,CAAC;QAEF,IAAI,OAAO,EAAE;;;AAGX,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC;AACnC,YAAA,IAAI,QAAQ,EAAE,WAAW,EAAE,EAAE;AAC3B,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC;AAC1E,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,oBAAA,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;oBACzB,IAAI;AACJ,oBAAA,eAAe,EAAE,WAAW;oBAC5B,KAAK;AACN,iBAAA,CAAC;gBACF;YACF;YACA,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,gBAAA,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI;AACJ,gBAAA,eAAe,EAAE,WAAW;gBAC5B,KAAK;AACN,aAAA,CAAC;YACF;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,GAAI,KAAgB;AAC/D,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,GAAI,KAAgB;QAEvE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;AACrE,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AACzE,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,YAAA,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;YACnB,IAAI;AACJ,YAAA,eAAe,EAAE,WAAW;YAC5B,KAAK;AACN,SAAA,CAAC;IACJ;;AAIQ,IAAA,aAAa,CACnB,KAAoC,EACpC,SAAiB,EACjB,SAAkB,EAClB,KAAkC,EAAA;AAElC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;AACvE,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,SAAS;QAEtD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;;;QAGlC,MAAM,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC;AAC5E,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAEvC,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACrD,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,aAAa;AAChD,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,aAAa;YACjC,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK;;;YAG5D,OAAO,CAAC,SAAS,CAAC,GAAG;AACnB,gBAAA,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW;AAC3C,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,OAAO,EAAE,aAAa;aACvB;QACH;aAAO;YACL,MAAM,QAAQ,GACZ,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;YACxF,MAAM,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;AAC3C,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ;YAC5B,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK;AAC5D,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC;QAEA,MAAM,IAAI,GAAG,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;AAEpE,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;AAC/D,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC3D;AAEQ,IAAA,UAAU,CAAC,WAAmB,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;QAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE;AAC9C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;gBAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC5B,IAAI,IAAI,IAAI,CAAC;gBAAE;YACf,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;AACnC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,aAAa,CAAC;YAC/C,IAAI,CAAC,SAAS,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG,aAAa,EAAE;gBAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC;YAC5C;iBAAO,IAAI,SAAS,IAAI,IAAI,GAAG,aAAa,GAAG,IAAI,EAAE;gBACnD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC;YAC7C;QACF;IACF;;AAIQ,IAAA,mBAAmB,CAAC,KAAoC,EAAA;AAC9D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,YAAY,KAAK,WAAW;AAAE,YAAA,OAAO,IAAI;AAChF,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;AACrC,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,IAAI;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;YACzE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAU,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC3F,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;;;;AAIvC,YAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5D,YAAA,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9E,YAAA,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,GAAG,GAAG,GAAG,SAAS;;;YAGtD,IAAI,SAAS,IAAI,CAAC;AAAE,gBAAA,OAAO,MAAkB;YAC7C,OAAO,2BAA2B,CAAC,MAAkB,EAAE,OAAO,EAAE,SAAS,CAAC;QAC5E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,oBAAoB,CAAC,KAAe,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE;QACrE,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE;AAC9B,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;QAC7B,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE;AACrE,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B;AAAE,QAAA,MAAM;;QAER;IACF;;AAIQ,IAAA,OAAO,CAAC,KAAe,EAAA;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClC;;AAIQ,IAAA,YAAY,CAAC,MAAe,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC;IAC9D;wGApwBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,cAAA,EAAA,2BAAA,EAAA,aAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAoDS,kBAAkB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5E1C;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,cAAc,EAAA,UAAA,EAAA,CAAA;kBA/B1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,UAAU;oBACpB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,cAAc;AACzB,wBAAA,6BAA6B,EAAE,aAAa;AAC7C,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA;AACF,iBAAA;wnCAqDmC,kBAAkB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAmtBtD,SAAS,YAAY,CAAC,IAAwB,EAAA;IAC5C,OAAO;AACL,QAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;KACxB;AACH;;ACp3BA;;;;AAIG;MAIU,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC5B,iBAAA;;;ACPD;;;;AAIG;MAIU,wBAAwB,CAAA;wGAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAChC,iBAAA;;;ACTD;;AAEG;;;;"}
|
|
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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"}
|