@ngneers/controls 0.0.1-next.0 → 0.0.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/fesm2022/ngneers-controls-api-ng.mjs +11 -18
  2. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-resize.mjs +7 -0
  4. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-badge.mjs +160 -0
  6. package/fesm2022/ngneers-controls-badge.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-base.mjs +85 -8
  8. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  9. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs → ngneers-controls-calendar-time-paM6WVpV.mjs} +2 -2
  10. package/fesm2022/{ngneers-controls-calendar-time-CJT5AFlA.mjs.map → ngneers-controls-calendar-time-paM6WVpV.mjs.map} +1 -1
  11. package/fesm2022/ngneers-controls-calendar.mjs +13 -6
  12. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-checkbox.mjs +3 -3
  14. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-color-picker.mjs +336 -0
  16. package/fesm2022/ngneers-controls-color-picker.mjs.map +1 -0
  17. package/fesm2022/ngneers-controls-default-icons.mjs +5 -0
  18. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -1
  19. package/fesm2022/ngneers-controls-directives.mjs +64 -7
  20. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -5
  22. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-errors.mjs +203 -148
  24. package/fesm2022/ngneers-controls-errors.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-filter.mjs +2 -2
  26. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-hint.mjs +18 -1
  28. package/fesm2022/ngneers-controls-hint.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-i18n-translations-de.mjs +17 -0
  30. package/fesm2022/ngneers-controls-i18n-translations-de.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-i18n-translations-en.mjs +19 -0
  32. package/fesm2022/ngneers-controls-i18n-translations-en.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-icon.mjs +23 -6
  34. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-input-field.mjs +18 -2
  36. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  37. package/fesm2022/ngneers-controls-input.mjs +49 -9
  38. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  39. package/fesm2022/ngneers-controls-list-box.mjs +2 -2
  40. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  41. package/fesm2022/ngneers-controls-mask-input.mjs +4 -1
  42. package/fesm2022/ngneers-controls-mask-input.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-number-input.mjs +4 -4
  44. package/fesm2022/ngneers-controls-number-input.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-otp.mjs +263 -0
  46. package/fesm2022/ngneers-controls-otp.mjs.map +1 -0
  47. package/fesm2022/ngneers-controls-paginator.mjs +36 -9
  48. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-radio.mjs +4 -4
  50. package/fesm2022/ngneers-controls-radio.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-rating.mjs +180 -0
  52. package/fesm2022/ngneers-controls-rating.mjs.map +1 -0
  53. package/fesm2022/ngneers-controls-scroll-shadow.mjs +33 -7
  54. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-scroller.mjs +4 -2
  56. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-select-button.mjs +2 -1
  58. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-select.mjs +24 -4
  60. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-slider.mjs +3 -3
  62. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-splitter.mjs +43 -12
  64. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-stepper.mjs +142 -0
  66. package/fesm2022/ngneers-controls-stepper.mjs.map +1 -0
  67. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  68. package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-table.mjs +282 -15
  70. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-tabs.mjs +2 -2
  72. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-toggle-button.mjs +3 -3
  74. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-tooltip.mjs +16 -28
  76. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-tree.mjs +2 -2
  78. package/fesm2022/ngneers-controls-tree.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-utils.mjs +138 -1
  80. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  81. package/package.json +22 -2
  82. package/types/ngneers-controls-api-ng.d.ts +12 -9
  83. package/types/ngneers-controls-badge.d.ts +67 -0
  84. package/types/ngneers-controls-base.d.ts +61 -4
  85. package/types/ngneers-controls-breadcrumb.d.ts +17 -0
  86. package/types/ngneers-controls-calendar.d.ts +24 -6
  87. package/types/ngneers-controls-chip.d.ts +17 -0
  88. package/types/ngneers-controls-color-picker.d.ts +119 -0
  89. package/types/ngneers-controls-dialog.d.ts +17 -0
  90. package/types/ngneers-controls-directives.d.ts +31 -2
  91. package/types/ngneers-controls-drawer.d.ts +17 -0
  92. package/types/ngneers-controls-edit-inplace.d.ts +23 -0
  93. package/types/ngneers-controls-errors.d.ts +105 -16
  94. package/types/ngneers-controls-filter.d.ts +30 -13
  95. package/types/ngneers-controls-hint.d.ts +8 -1
  96. package/types/ngneers-controls-i18n-translations-de.d.ts +17 -0
  97. package/types/ngneers-controls-i18n-translations-en.d.ts +17 -0
  98. package/types/ngneers-controls-i18n.d.ts +17 -0
  99. package/types/ngneers-controls-icon.d.ts +2 -2
  100. package/types/ngneers-controls-input-field.d.ts +28 -2
  101. package/types/ngneers-controls-input.d.ts +35 -3
  102. package/types/ngneers-controls-list-box.d.ts +17 -0
  103. package/types/ngneers-controls-mask-input.d.ts +17 -0
  104. package/types/ngneers-controls-otp.d.ts +262 -0
  105. package/types/ngneers-controls-paginator.d.ts +34 -3
  106. package/types/ngneers-controls-rating.d.ts +69 -0
  107. package/types/ngneers-controls-scroll-shadow.d.ts +11 -2
  108. package/types/ngneers-controls-scroller.d.ts +3 -1
  109. package/types/ngneers-controls-select.d.ts +30 -3
  110. package/types/ngneers-controls-snackbar.d.ts +17 -0
  111. package/types/ngneers-controls-splitter.d.ts +26 -2
  112. package/types/ngneers-controls-state.d.ts +2 -2
  113. package/types/ngneers-controls-stepper.d.ts +68 -0
  114. package/types/ngneers-controls-table.d.ts +276 -169
  115. package/types/ngneers-controls-toast.d.ts +17 -0
  116. package/types/ngneers-controls-tooltip.d.ts +0 -1
  117. package/types/ngneers-controls-tree.d.ts +17 -0
  118. package/types/ngneers-controls-upload.d.ts +17 -0
  119. package/types/ngneers-controls-utils.d.ts +27 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-api-resize.mjs","sources":["../../src/api/resize/utils.ts","../../src/api/resize/resize-engine.ts","../../src/api/resize/ngneers-controls-api-resize.ts"],"sourcesContent":["import type {\n ExpandedResizeLimit,\n ExpandedResizeSize,\n ResizeLimit,\n ResizeLimitUnit,\n ResizeSize,\n ResizeSizeUnit,\n} from './types';\n\n// --- Size parsing ---\n\nexport function isResizeSize(value: unknown): value is ResizeSize {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|fr|%)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getResizeSizeUnit(value: ResizeSize): ResizeSizeUnit {\n if (value.endsWith('px')) return 'px';\n if (value.endsWith('fr')) return 'fr';\n return '%';\n}\n\nexport function getResizeSizeValue(value: ResizeSize): number {\n const unit = getResizeSizeUnit(value);\n return parseFloat(value.slice(0, -unit.length));\n}\n\nexport function expandResizeSize(value: ResizeSize): ExpandedResizeSize {\n return {\n value: getResizeSizeValue(value),\n unit: getResizeSizeUnit(value),\n };\n}\n\nexport function collapseResizeSize(size: ExpandedResizeSize): ResizeSize {\n return `${size.value}${size.unit}`;\n}\n\n// --- Limit parsing ---\n\nexport function isResizeLimit(value: unknown): value is ResizeLimit {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|%)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getResizeLimitUnit(value: ResizeLimit): ResizeLimitUnit {\n return value.endsWith('px') ? 'px' : '%';\n}\n\nexport function getResizeLimitValue(value: ResizeLimit): number {\n return value.endsWith('px') ? parseFloat(value.slice(0, -2)) : parseFloat(value.slice(0, -1));\n}\n\nexport function getResizeLimitInPx(value: ResizeLimit, containerSize: number): number {\n const unit = getResizeLimitUnit(value);\n const sizeValue = getResizeLimitValue(value);\n return unit === 'px' ? sizeValue : (sizeValue / 100) * containerSize;\n}\n\nexport function expandResizeLimit(value: ResizeLimit): ExpandedResizeLimit {\n return {\n value: getResizeLimitValue(value),\n unit: getResizeLimitUnit(value),\n };\n}\n\nexport function collapseResizeLimit(size: ExpandedResizeLimit): ResizeLimit {\n return `${size.value}${size.unit}`;\n}\n\n// --- Pixel resolution ---\n\n/**\n * Resolves a size to its pixel equivalent given the current fraction factors and container size.\n */\nexport function resolveSizeToPx(\n size: ExpandedResizeSize,\n pxPerFr: number,\n containerSize: number\n): number {\n switch (size.unit) {\n case 'px':\n return size.value;\n case 'fr':\n return pxPerFr * size.value;\n case '%':\n return (size.value / 100) * containerSize;\n }\n}\n\n/**\n * Converts a pixel delta to the appropriate value delta for the given unit.\n */\nexport function pxDeltaToUnitDelta(\n pxDelta: number,\n unit: ResizeSizeUnit,\n frPerPx: number,\n percentPerPx: number\n): number {\n switch (unit) {\n case 'px':\n return pxDelta;\n case 'fr':\n return pxDelta * frPerPx;\n case '%':\n return pxDelta * percentPerPx;\n }\n}\n","import { afterRenderEffect, computed, signal, type Signal, untracked } from '@angular/core';\n\nimport {\n expandResizeLimit,\n expandResizeSize,\n getResizeLimitInPx,\n getResizeLimitUnit,\n getResizeLimitValue,\n pxDeltaToUnitDelta,\n resolveSizeToPx,\n} from './utils';\n\nimport type {\n ExpandedResizeLimit,\n ResizableItem,\n ResizeDragContext,\n ResizeDragContextItem,\n ResizeEngineConfig,\n ResizeFractionFactors,\n ResizeSize,\n} from './types';\n\nconst LAST_CALC_SIZE_SYMBOL = Symbol('lastCalcSize');\n\n/** A {@link ResizableItem} carrying the engine's last-written size under a private symbol. */\ntype ItemWithLastCalcSize = ResizableItem & { [LAST_CALC_SIZE_SYMBOL]?: ResizeSize };\n\n/**\n * A generic, control-agnostic resize engine for CSS grid layouts.\n *\n * Handles drag-based resizing of a list of {@link ResizableItem}s with support for:\n * - **Size units**: `px`, `fr`, `%`\n * - **Distribution modes**:\n * - `adjacent` — transfers space between the two items neighbouring the divider (zero-sum).\n * - `proportional` — only the dragged item changes to `px`; other items keep their `fr`/`%`\n * units and CSS grid redistributes the remaining space. Optionally locks the resized item\n * to `px` via {@link ResizeEngineConfig.lockSizes}.\n * - `push` — the dragged item grows/shrinks independently; the container total changes\n * (requires `containerConstrained = false`).\n * - **Commit modes** (for `adjacent`/`push`): `preserve`, `bakeAll`, `bakeAffected`\n * - **Min-size floor** ({@link ResizeEngineConfig.minItemSizePx}): an absolute `px` floor\n * enforced even when a relative min-size resolves smaller. In `proportional` mode, emitted\n * as CSS `minmax(floor, size)` so the grid natively prevents columns from shrinking below it.\n *\n * Consumers (splitter, table) provide items and configuration via signals.\n * The engine outputs a ready-to-use `grid-template-columns`/`grid-template-rows` string\n * via {@link gridTemplateSizes}.\n */\nexport class ResizeEngine {\n private readonly items: Signal<readonly ResizableItem[]>;\n private readonly containerSize: Signal<number>;\n private readonly gapSizes: Signal<readonly number[]>;\n private readonly distributionMode: ResizeEngineConfig['distributionMode'];\n private readonly containerConstrained: ResizeEngineConfig['containerConstrained'];\n private readonly lockSizes: Signal<boolean>;\n private readonly minItemSizePx: number;\n private readonly resolveItemSizes?: () => number[];\n\n constructor(config: ResizeEngineConfig) {\n this.items = config.items;\n this.containerSize = config.containerSize;\n this.gapSizes = config.gapSizes;\n this.distributionMode = config.distributionMode;\n this.containerConstrained = config.containerConstrained;\n this.lockSizes = config.lockSizes ?? signal(false);\n this.minItemSizePx = config.minItemSizePx ?? 0;\n this.resolveItemSizes = config.resolveItemSizes;\n\n // Signal fires when any item size is not calculated (external change detected)\n const hasUncalculatedSizes = computed(\n () => this.items().some(item => !this.isItemSizeCalculated(item)),\n { equal: (_, b) => b === false }\n ) as Signal<void>;\n\n // Ensure min/max limits are respected on external changes and container resize\n afterRenderEffect(() => {\n hasUncalculatedSizes();\n this.containerSize();\n untracked(() => {\n // Skip during active drag — sizes are managed by the drag handler\n if (this.dragContext()) return;\n this.ensureMinMaxSizes();\n });\n });\n }\n\n // --- Public signals ---\n\n /** The active drag state, or `null` when idle. */\n public readonly dragContext = signal<ResizeDragContext | null>(null);\n\n /** Whether a drag operation is currently in progress. */\n public readonly isDragging = computed(() => this.dragContext() !== null);\n\n /**\n * Whether any completed (non-cancelled) drag has occurred in this engine's lifetime.\n *\n * Used by `push` mode to defer resolving `fr`/`%` → `px` until the first drag.\n * Before the first drag, original units are preserved so CSS grid can distribute\n * space without rounding-induced overflow.\n */\n public readonly hasBeenResized = signal(false);\n\n /**\n * CSS grid template string with item sizes interleaved with gap sizes.\n *\n * Example output: `\"100px 4px minmax(50px, 2fr) 4px minmax(50px, 1fr)\"`.\n *\n * **Output strategy per distribution mode:**\n * - `adjacent` — resolves all sizes to `px`. CSS grid cannot constrain adjacent\n * resizing correctly with `fr` units.\n * - `proportional` — keeps `fr`/`%` as-is, wrapped in `minmax(floor, size)` when\n * {@link minItemSizePx} > 0. This lets CSS grid redistribute remaining space\n * while enforcing the minimum floor natively. Locked (`px`) columns pass through.\n * - `push` — keeps original units until the first completed drag, then resolves\n * everything to `px` so the total can exceed the container and trigger scrolling.\n */\n public readonly gridTemplateSizes = computed(() => {\n const items = this.items();\n const gaps = this.gapSizes();\n\n if (items.length === 0) return 'none';\n\n const containerSize = this.containerSize();\n const constrained = this.containerConstrained();\n const mode = this.distributionMode();\n\n // Resolve strategy:\n // - adjacent (constrained): resolve ALL to px — CSS grid can't constrain adjacent resizing with fr.\n // - push (unconstrained): keep original units until first movement bakes to px, then resolve for scrolling.\n // - proportional: NEVER resolve fr→px. Use minmax(floor, size) so CSS grid handles min widths\n // natively, both during and after drag. This allows columns that still have room to shrink\n // while already-at-minimum columns stay at the floor.\n const shouldResolve =\n containerSize > 0 &&\n ((constrained && mode === 'adjacent') || (!constrained && this.hasBeenResized()));\n const useMinmax = mode === 'proportional' && this.minItemSizePx > 0;\n const frFactors = shouldResolve ? this.getCurrentFractionFactors() : null;\n\n const result: string[] = [];\n for (let i = 0; i < items.length; i++) {\n const size = items[i]!.size();\n const expanded = expandResizeSize(size);\n if (shouldResolve && expanded.unit !== 'px') {\n result.push(`${resolveSizeToPx(expanded, frFactors!.pxPerFr, containerSize)}px`);\n } else if (useMinmax && expanded.unit !== 'px') {\n result.push(`minmax(${this.minItemSizePx}px, ${size})`);\n } else {\n result.push(size);\n }\n if (i < gaps.length) {\n result.push(`${gaps[i] || 0}px`);\n }\n }\n return result.join(' ');\n });\n\n /**\n * The total gap size in pixels.\n */\n public readonly totalGapSize = computed(() =>\n this.gapSizes().reduce((acc, size) => acc + size, 0)\n );\n\n /**\n * Aggregated item sizes by unit.\n */\n private readonly totalItemSizes = computed(() =>\n this.items().reduce(\n (acc, item) => {\n const { unit, value } = expandResizeSize(item.size());\n acc[unit] += value;\n return acc;\n },\n { px: 0, fr: 0, '%': 0 }\n )\n );\n\n /**\n * Minimum total size of all items combined (as a CSS calc expression).\n */\n public readonly minTotalSize = computed(() => this.computeLimitTotalSize('minSize'));\n\n /**\n * Maximum total size of all items combined (as a CSS calc expression).\n */\n public readonly maxTotalSize = computed(() => this.computeLimitTotalSize('maxSize'));\n\n // --- Drag operations ---\n\n /**\n * Begins a drag at the given divider. Original sizes are saved for reverting\n * on no-op clicks or cancellation. In push mode, baking to `px` is deferred\n * to the first {@link drag} call to avoid a visual shift on mousedown.\n */\n public startDrag(dividerIndex: number, startPositionPx: number): void {\n const items = this.items();\n if (dividerIndex < 0 || items.length < 2 || dividerIndex >= items.length) return;\n\n const preBakeSizes = items.map(item => item.size());\n\n this.dragContext.set({\n dividerIndex,\n startPosition: startPositionPx,\n preBakeSizes,\n items: items.map(item => this.createContextItem(item)),\n fractionFactors: this.getCurrentFractionFactors(),\n percentPerPx: this.getCurrentPercentPerPx(),\n baked: this.containerConstrained(),\n });\n }\n\n /** Updates item sizes during an active drag based on the current pointer position. */\n public drag(dividerIndex: number, currentPositionPx: number): void {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== dividerIndex) return;\n\n // In push mode, bake all items to px on the first movement so non-dragged\n // items keep their absolute widths. Deferred from startDrag to avoid a\n // visual column shift on mousedown (CSS Grid fr→px rounding mismatch).\n if (!ctx.baked) {\n this.bakeAllItemsToPx();\n ctx.items = this.items().map(item => this.createContextItem(item));\n ctx.fractionFactors = this.getCurrentFractionFactors();\n ctx.percentPerPx = this.getCurrentPercentPerPx();\n ctx.baked = true;\n }\n\n const pxDelta = currentPositionPx - ctx.startPosition;\n this.applyDelta(dividerIndex, pxDelta, ctx.items, ctx.fractionFactors, ctx.percentPerPx);\n }\n\n /**\n * Ends a drag. If cancelled or no movement occurred, sizes revert to their\n * pre-drag values (including undoing any push-mode baking). Otherwise,\n * post-drag finalization runs (commit mode or proportional locking).\n */\n public endDrag(dividerIndex: number, cancel: boolean): void {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== dividerIndex) return;\n const hasMoved = ctx.items.some(ci => {\n const current = expandResizeSize(ci.item.size());\n return current.value !== ci.startSize.value || current.unit !== ci.startSize.unit;\n });\n\n if (cancel || !hasMoved) {\n // Reset to pre-bake sizes (restores original fr/% units on no-op clicks)\n ctx.items.forEach((ci, i) => ci.item.size.set(ctx.preBakeSizes[i]!));\n } else {\n this.finalizeResize(ctx);\n this.hasBeenResized.set(true);\n }\n\n this.dragContext.set(null);\n }\n\n /**\n * Applies a single instantaneous move (e.g. keyboard step) at the given divider.\n * Requires that the relevant items already have engine-calculated sizes.\n */\n public moveDivider(dividerIndex: number, pxDelta: number): void {\n const items = this.items();\n if (dividerIndex < 0 || items.length < 2 || dividerIndex >= items.length) return;\n\n // Check that relevant items have calculated sizes\n if (!this.isItemSizeCalculated(items[dividerIndex]!)) return;\n if (dividerIndex < items.length - 1 && !this.isItemSizeCalculated(items[dividerIndex + 1]!))\n return;\n\n const contextItems = items.map(item => this.createContextItem(item));\n this.applyDelta(\n dividerIndex,\n pxDelta,\n contextItems,\n this.getCurrentFractionFactors(),\n this.getCurrentPercentPerPx()\n );\n }\n\n /**\n * Clamps all items to their min/max constraints, respecting {@link minItemSizePx}.\n *\n * Called automatically via `afterRenderEffect` when item sizes change externally\n * or the container resizes. Skipped during an active drag (sizes are managed\n * by the drag handler). For `fr`-sized items, clamping is done iteratively\n * with redistribution to maintain total fraction balance.\n */\n public ensureMinMaxSizes(): void {\n const items = this.items();\n if (items.length === 0) return;\n\n const containerSize = this.containerSize();\n const itemSizes = items.map(item => {\n const expanded = expandResizeSize(item.size());\n return {\n item,\n size: { unit: expanded.unit, value: expanded.value },\n minSizePx: Math.max(this.minItemSizePx, getResizeLimitInPx(item.minSize(), containerSize)),\n maxSizePx: getResizeLimitInPx(item.maxSize(), containerSize),\n };\n });\n\n // Clamp px and % items\n for (const entry of itemSizes) {\n if (entry.size.unit === 'px') {\n entry.size.value = clamp(entry.size.value, entry.minSizePx, entry.maxSizePx);\n } else if (entry.size.unit === '%') {\n const pxValue = (entry.size.value / 100) * containerSize;\n if (pxValue < entry.minSizePx) {\n entry.size.value = (entry.minSizePx / containerSize) * 100;\n } else if (pxValue > entry.maxSizePx) {\n entry.size.value = (entry.maxSizePx / containerSize) * 100;\n }\n }\n }\n\n // Calculate fraction factors for fr-sized items\n const totalPx = itemSizes.reduce(\n (acc, { size }) => (size.unit === 'px' ? acc + size.value : acc),\n 0\n );\n const totalPercent = itemSizes.reduce(\n (acc, { size }) => (size.unit === '%' ? acc + size.value : acc),\n 0\n );\n const totalFr = itemSizes.reduce(\n (acc, { size }) => (size.unit === 'fr' ? acc + size.value : acc),\n 0\n );\n\n const frArea =\n containerSize - this.totalGapSize() - totalPx - (totalPercent / 100) * containerSize;\n const frPerPx = totalFr / (frArea || 1);\n const pxPerFr = (frArea || 1) / (totalFr || 1);\n\n // Iteratively clamp fr-sized items and redistribute\n let frPanelsWithoutClamping = itemSizes.filter(p => p.size.unit === 'fr');\n let frToDistribute: number | undefined = undefined;\n while (frPanelsWithoutClamping.length > 0 && frToDistribute !== 0) {\n const frToAddPerPanel = frToDistribute ? frToDistribute / frPanelsWithoutClamping.length : 0;\n const next: typeof itemSizes = [];\n let currentTotalFrSize = totalFr;\n for (const p of frPanelsWithoutClamping) {\n const minSizeFr = p.minSizePx * frPerPx;\n const maxSizeFr = p.maxSizePx * frPerPx;\n p.size.value += frToAddPerPanel;\n if (p.size.value < minSizeFr) {\n currentTotalFrSize = currentTotalFrSize - p.size.value + minSizeFr;\n p.size.value = minSizeFr;\n } else if (p.size.value > maxSizeFr) {\n currentTotalFrSize = currentTotalFrSize - p.size.value + maxSizeFr;\n p.size.value = maxSizeFr;\n } else {\n next.push(p);\n }\n }\n frToDistribute = totalFr - currentTotalFrSize;\n if (Math.abs(frToDistribute * pxPerFr) < 1) {\n frToDistribute = 0;\n }\n frPanelsWithoutClamping = next;\n }\n\n // Write back\n for (const { item, size } of itemSizes) {\n this.setItemSize(item, `${size.value}${size.unit}`);\n }\n }\n\n // --- Item size tracking ---\n\n /**\n * Sets the item's size and marks it as engine-calculated via an internal symbol.\n * This mark is used by {@link isItemSizeCalculated} to detect external size changes.\n */\n public setItemSize(item: ResizableItem, size: ResizeSize): void {\n item.size.set(size);\n (item as ItemWithLastCalcSize)[LAST_CALC_SIZE_SYMBOL] = size;\n }\n\n /**\n * Returns `true` if the item's current size matches the last value written by the engine.\n * Returns `false` if the size was changed externally (e.g. by an input binding or state restore).\n */\n public isItemSizeCalculated(item: ResizableItem): boolean {\n return (item as ItemWithLastCalcSize)[LAST_CALC_SIZE_SYMBOL] === item.size();\n }\n\n // --- Private: delta application ---\n\n /**\n * Routes a px delta to the appropriate distribution strategy.\n *\n * For last-item edge resizing (dividerIndex === items.length - 1), the delta is\n * remapped to the previous divider with negated direction. This allows the last\n * column's handle in push mode to resize it directly.\n */\n private applyDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const mode = this.distributionMode();\n\n // Right-edge resize of the last item: remap to the previous divider with negated delta.\n const isLastItemEdge = dividerIndex === items.length - 1;\n const effectiveDividerIndex = isLastItemEdge ? dividerIndex - 1 : dividerIndex;\n const effectiveDelta = isLastItemEdge ? -pxDelta : pxDelta;\n\n if (mode === 'push' && !this.containerConstrained()) {\n this.applyPushDelta(dividerIndex, pxDelta, items, fractionFactors, percentPerPx);\n } else if (mode === 'proportional') {\n this.applyProportionalDelta(effectiveDividerIndex, effectiveDelta, items, fractionFactors);\n } else {\n this.applyAdjacentDelta(\n effectiveDividerIndex,\n effectiveDelta,\n items,\n fractionFactors,\n percentPerPx\n );\n }\n }\n\n /**\n * Adjacent mode: transfers the delta between the two items neighbouring the divider.\n *\n * Grows the left item and shrinks the right item (or vice versa). When an item\n * hits its min/max constraint, the unapplied remainder cascades to the next item\n * in that direction. A second pass resolves any asymmetry between left and right.\n * The total container width is always preserved (zero-sum).\n */\n private applyAdjacentDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const containerSize = this.containerSize();\n const appliedPanelDeltas: number[] = Array(items.length).fill(0);\n\n const recursion = (pxDelta: number, itemIndex: number, itemIndexIncrement: number): number => {\n if (itemIndex >= items.length || itemIndex < 0) return 0;\n const ci = items[itemIndex]!;\n\n const startPx = resolveSizeToPx(ci.startSize, fractionFactors.pxPerFr, containerSize);\n const newPx = startPx + pxDelta;\n const limitPx = getLimitPxForDelta(ci, pxDelta, containerSize, this.minItemSizePx);\n const unappliedDelta =\n pxDelta < 0\n ? limitPx > newPx\n ? -(limitPx - newPx)\n : 0\n : limitPx < newPx\n ? newPx - limitPx\n : 0;\n\n const appliedDelta = pxDelta - unappliedDelta;\n appliedPanelDeltas[itemIndex] = appliedDelta;\n\n return unappliedDelta === 0\n ? pxDelta\n : appliedDelta +\n recursion(unappliedDelta, itemIndex + itemIndexIncrement, itemIndexIncrement);\n };\n\n let appliedLeft = recursion(pxDelta, dividerIndex, -1);\n let appliedRight = -recursion(-pxDelta, dividerIndex + 1, 1);\n\n if (appliedLeft !== pxDelta || appliedRight !== pxDelta) {\n const resolvedDelta =\n pxDelta < 0 ? Math.max(appliedLeft, appliedRight) : Math.min(appliedLeft, appliedRight);\n appliedPanelDeltas.fill(0);\n appliedLeft = recursion(resolvedDelta, dividerIndex, -1);\n appliedRight = -recursion(-resolvedDelta, dividerIndex + 1, 1);\n\n if (appliedLeft !== resolvedDelta || appliedRight !== resolvedDelta) {\n return;\n }\n }\n\n this.commitItemDeltas(items, appliedPanelDeltas, fractionFactors, percentPerPx);\n }\n\n /**\n * Proportional mode: only the item at `dividerIndex` changes size (set to absolute `px`).\n * All other items keep their original units (`fr`, `%`), and CSS grid's `minmax(floor, size)`\n * naturally redistributes the remaining space — columns with room shrink while those\n * already at the floor stay put.\n *\n * Growth is capped so the total never overflows the container: each other `fr` column\n * needs at least {@link minItemSizePx}, and locked `px` columns keep their size.\n *\n * After the drag ends, {@link applyProportionalLocking} determines whether the\n * resized column stays as `px` (locked) or is converted back to `fr` (dynamic).\n */\n private applyProportionalDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors\n ): void {\n const containerSize = this.containerSize();\n const floor = this.minItemSizePx;\n const item = items[dividerIndex]!;\n const startPx = resolveSizeToPx(item.startSize, fractionFactors.pxPerFr, containerSize);\n\n // Clamp to own min/max\n let newPx = clampToLimits(startPx + pxDelta, item, containerSize, floor);\n\n // Cap so the total doesn't overflow. With minmax(floor, Xfr), each other\n // column needs at least `floor` px. Locked px columns keep their size.\n if (floor > 0) {\n const totalGaps = this.totalGapSize();\n let otherLockedPx = 0;\n let otherFrCount = 0;\n for (let i = 0; i < items.length; i++) {\n if (i === dividerIndex) continue;\n const { unit, value } = expandResizeSize(items[i]!.item.size());\n if (unit === 'px') {\n otherLockedPx += value;\n } else {\n otherFrCount++;\n }\n }\n newPx = Math.min(newPx, containerSize - totalGaps - otherLockedPx - otherFrCount * floor);\n }\n\n this.setItemSize(item.item, `${Math.max(0, newPx)}px`);\n }\n\n /**\n * Push mode: only the dragged item changes size. All other items stay at their\n * baked `px` values (set during {@link startDrag}). The container total changes,\n * causing horizontal overflow/scrolling. Only valid when `containerConstrained` is `false`.\n */\n private applyPushDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const containerSize = this.containerSize();\n const appliedPanelDeltas: number[] = Array(items.length).fill(0);\n const item = items[dividerIndex]!;\n const startPx = resolveSizeToPx(item.startSize, fractionFactors.pxPerFr, containerSize);\n\n appliedPanelDeltas[dividerIndex] =\n clampToLimits(startPx + pxDelta, item, containerSize, this.minItemSizePx) - startPx;\n\n this.commitItemDeltas(items, appliedPanelDeltas, fractionFactors, percentPerPx);\n }\n\n // --- Private: post-drag finalization ---\n\n /**\n * Post-drag finalization. Behaviour depends on {@link lockSizes} and the distribution mode.\n *\n * When `lockSizes` is `false`:\n * - `adjacent` / `push` — no-op; items keep their original units.\n * - `proportional` — the resized column is converted back to `fr` so it stays dynamic.\n *\n * When `lockSizes` is `true`:\n * - `adjacent` / `push` — items whose size changed are converted to absolute `px`.\n * - `proportional` — no-op; the resized column is already `px` from the drag.\n */\n private finalizeResize(ctx: ResizeDragContext): void {\n const lock = this.lockSizes();\n\n if (this.distributionMode() === 'proportional') {\n if (!lock) this.unlockProportionalColumn(ctx);\n return;\n }\n\n // Adjacent / push: lock affected items to px when enabled\n if (!lock) return;\n\n const containerSize = this.containerSize();\n const fractionFactors = this.getCurrentFractionFactors();\n\n for (const ci of ctx.items) {\n const currentSize = expandResizeSize(ci.item.size());\n const sizeChanged =\n currentSize.value !== ci.startSize.value || currentSize.unit !== ci.startSize.unit;\n if (sizeChanged) {\n const pxValue = resolveSizeToPx(currentSize, fractionFactors.pxPerFr, containerSize);\n this.setItemSize(ci.item, `${Math.max(0, pxValue)}px`);\n }\n }\n }\n\n /**\n * Converts the resized column back to `fr` after a proportional drag so it\n * continues to flex with the container. Computes a new `fr` value that would\n * resolve to the same pixel width given the current container and other `fr` columns.\n */\n private unlockProportionalColumn(ctx: ResizeDragContext): void {\n const items = ctx.items;\n const containerSize = this.containerSize();\n const resizedItem = items[ctx.dividerIndex]!;\n const resizedPx = expandResizeSize(resizedItem.item.size()).value;\n\n // Sum up all other fr values (from pre-bake, since they weren't changed)\n let otherFrTotal = 0;\n let otherPxTotal = 0;\n for (let i = 0; i < items.length; i++) {\n if (i === ctx.dividerIndex) continue;\n const preBake = expandResizeSize(ctx.preBakeSizes[i]!);\n if (preBake.unit === 'fr') {\n otherFrTotal += preBake.value;\n } else if (preBake.unit === 'px') {\n otherPxTotal += preBake.value;\n }\n }\n\n const availableForFr = containerSize - this.totalGapSize() - otherPxTotal;\n\n if (otherFrTotal > 0 && availableForFr > resizedPx) {\n // Solve: newFr / otherFrTotal = resizedPx / (availableForFr - resizedPx)\n const newFr = (resizedPx * otherFrTotal) / (availableForFr - resizedPx);\n this.setItemSize(resizedItem.item, `${Math.max(0, +newFr.toFixed(4))}fr`);\n }\n // If we can't compute a valid fr (edge case), leave as px\n }\n\n // --- Private: helpers ---\n\n private createContextItem(item: ResizableItem): ResizeDragContextItem {\n return {\n item,\n startSize: expandResizeSize(item.size()),\n minSize: expandResizeLimit(item.minSize()),\n maxSize: expandResizeLimit(item.maxSize()),\n };\n }\n\n private getCurrentFractionFactors(): ResizeFractionFactors {\n const totals = this.totalItemSizes();\n const cs = this.containerSize();\n const percentPx = (totals['%'] / 100) * cs;\n const frArea = cs - this.totalGapSize() - totals.px - percentPx || 1;\n const totalFr = totals.fr || 1;\n return {\n frPerPx: totalFr / frArea,\n pxPerFr: frArea / totalFr,\n };\n }\n\n private getCurrentPercentPerPx(): number {\n return 100 / (this.containerSize() || 1);\n }\n\n /**\n * Bakes all non-px items to absolute px values. Used by push mode on first drag movement.\n * Prefers DOM-measured sizes (via {@link resolveItemSizes}) over JS-computed conversions\n * to avoid sub-pixel mismatches with CSS Grid's internal track sizing.\n */\n private bakeAllItemsToPx(): void {\n const items = this.items();\n const measured = this.resolveItemSizes?.();\n\n if (measured && measured.length === items.length) {\n for (let i = 0; i < items.length; i++) {\n this.setItemSize(items[i]!, `${measured[i]!}px`);\n }\n } else {\n const frFactors = this.getCurrentFractionFactors();\n const containerSize = this.containerSize();\n for (const item of items) {\n const size = expandResizeSize(item.size());\n if (size.unit !== 'px') {\n this.setItemSize(item, `${resolveSizeToPx(size, frFactors.pxPerFr, containerSize)}px`);\n }\n }\n }\n }\n\n /**\n * Writes computed px deltas back to items, converting to each item's original unit.\n */\n private commitItemDeltas(\n items: ResizeDragContextItem[],\n appliedPanelDeltas: number[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n items.forEach((ci, i) => {\n const pxDelta = appliedPanelDeltas[i] || 0;\n const unitDelta = pxDeltaToUnitDelta(\n pxDelta,\n ci.startSize.unit,\n fractionFactors.frPerPx,\n percentPerPx\n );\n const newValue = ci.startSize.value + unitDelta;\n this.setItemSize(ci.item, `${Math.max(0, newValue)}${ci.startSize.unit}`);\n });\n }\n\n /**\n * Builds a CSS `calc()` expression summing all items' min or max limits.\n * Items already in `px` contribute their current size; `fr`/`%` items contribute\n * their `minSize`/`maxSize` limit. Used by {@link minTotalSize} and {@link maxTotalSize}.\n */\n private computeLimitTotalSize(limitProp: 'minSize' | 'maxSize'): string {\n const { px, '%': pc } = this.items().reduce(\n (acc, item) => {\n const { unit, value } = expandResizeSize(item.size());\n if (unit === 'px') {\n acc.px += value;\n } else {\n const limitStr = item[limitProp]();\n acc[getResizeLimitUnit(limitStr)] += getResizeLimitValue(limitStr);\n }\n return acc;\n },\n { px: 0, '%': 0 }\n );\n return `calc(${px + this.totalGapSize()}px + ${pc}%)`;\n }\n}\n\n// --- Module-level helpers ---\n\n/** Clamps a value between min and max. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/** Resolves an expanded limit to px. */\nfunction limitToPx(limit: ExpandedResizeLimit, containerSize: number): number {\n return limit.unit === 'px' ? limit.value : (limit.value / 100) * containerSize;\n}\n\n/**\n * Resolves a min limit to px, enforcing the given absolute floor.\n * Even if a relative limit (e.g. `5%`) resolves to less than the floor, the floor wins.\n */\nfunction minLimitToPx(limit: ExpandedResizeLimit, containerSize: number, floorPx: number): number {\n return Math.max(floorPx, limitToPx(limit, containerSize));\n}\n\n/** Clamps a px value to the item's min/max limits (with floor on min). */\nfunction clampToLimits(\n px: number,\n ci: ResizeDragContextItem,\n containerSize: number,\n floorPx: number\n): number {\n return clamp(\n px,\n minLimitToPx(ci.minSize, containerSize, floorPx),\n limitToPx(ci.maxSize, containerSize)\n );\n}\n\n/**\n * Returns the relevant limit (min or max) in px for the direction of a delta.\n * Negative delta → min limit (with floor), positive delta → max limit.\n */\nfunction getLimitPxForDelta(\n ci: ResizeDragContextItem,\n pxDelta: number,\n containerSize: number,\n floorPx: number\n): number {\n return pxDelta < 0\n ? minLimitToPx(ci.minSize, containerSize, floorPx)\n : limitToPx(ci.maxSize, containerSize);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-api-resize.mjs","sources":["../../src/api/resize/utils.ts","../../src/api/resize/resize-engine.ts","../../src/api/resize/ngneers-controls-api-resize.ts"],"sourcesContent":["import type {\n ExpandedResizeLimit,\n ExpandedResizeSize,\n ResizeLimit,\n ResizeLimitUnit,\n ResizeSize,\n ResizeSizeUnit,\n} from './types';\n\n// --- Size parsing ---\n\nexport function isResizeSize(value: unknown): value is ResizeSize {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|fr|%)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getResizeSizeUnit(value: ResizeSize): ResizeSizeUnit {\n if (value.endsWith('px')) return 'px';\n if (value.endsWith('fr')) return 'fr';\n return '%';\n}\n\nexport function getResizeSizeValue(value: ResizeSize): number {\n const unit = getResizeSizeUnit(value);\n return parseFloat(value.slice(0, -unit.length));\n}\n\nexport function expandResizeSize(value: ResizeSize): ExpandedResizeSize {\n return {\n value: getResizeSizeValue(value),\n unit: getResizeSizeUnit(value),\n };\n}\n\nexport function collapseResizeSize(size: ExpandedResizeSize): ResizeSize {\n return `${size.value}${size.unit}`;\n}\n\n// --- Limit parsing ---\n\nexport function isResizeLimit(value: unknown): value is ResizeLimit {\n if (typeof value !== 'string') return false;\n const m = value.match(/^(.+)(px|%)$/);\n if (!m || !m[1]) return false;\n if (isNaN(parseFloat(m[1]))) return false;\n return true;\n}\n\nexport function getResizeLimitUnit(value: ResizeLimit): ResizeLimitUnit {\n return value.endsWith('px') ? 'px' : '%';\n}\n\nexport function getResizeLimitValue(value: ResizeLimit): number {\n return value.endsWith('px') ? parseFloat(value.slice(0, -2)) : parseFloat(value.slice(0, -1));\n}\n\nexport function getResizeLimitInPx(value: ResizeLimit, containerSize: number): number {\n const unit = getResizeLimitUnit(value);\n const sizeValue = getResizeLimitValue(value);\n return unit === 'px' ? sizeValue : (sizeValue / 100) * containerSize;\n}\n\nexport function expandResizeLimit(value: ResizeLimit): ExpandedResizeLimit {\n return {\n value: getResizeLimitValue(value),\n unit: getResizeLimitUnit(value),\n };\n}\n\nexport function collapseResizeLimit(size: ExpandedResizeLimit): ResizeLimit {\n return `${size.value}${size.unit}`;\n}\n\n// --- Pixel resolution ---\n\n/**\n * Resolves a size to its pixel equivalent given the current fraction factors and container size.\n */\nexport function resolveSizeToPx(\n size: ExpandedResizeSize,\n pxPerFr: number,\n containerSize: number\n): number {\n switch (size.unit) {\n case 'px':\n return size.value;\n case 'fr':\n return pxPerFr * size.value;\n case '%':\n return (size.value / 100) * containerSize;\n }\n}\n\n/**\n * Converts a pixel delta to the appropriate value delta for the given unit.\n */\nexport function pxDeltaToUnitDelta(\n pxDelta: number,\n unit: ResizeSizeUnit,\n frPerPx: number,\n percentPerPx: number\n): number {\n switch (unit) {\n case 'px':\n return pxDelta;\n case 'fr':\n return pxDelta * frPerPx;\n case '%':\n return pxDelta * percentPerPx;\n }\n}\n","import { afterRenderEffect, computed, signal, type Signal, untracked } from '@angular/core';\n\nimport {\n expandResizeLimit,\n expandResizeSize,\n getResizeLimitInPx,\n getResizeLimitUnit,\n getResizeLimitValue,\n pxDeltaToUnitDelta,\n resolveSizeToPx,\n} from './utils';\n\nimport type {\n ExpandedResizeLimit,\n ResizableItem,\n ResizeDragContext,\n ResizeDragContextItem,\n ResizeEngineConfig,\n ResizeFractionFactors,\n ResizeSize,\n} from './types';\n\nconst LAST_CALC_SIZE_SYMBOL = Symbol('lastCalcSize');\n\n/** A {@link ResizableItem} carrying the engine's last-written size under a private symbol. */\ntype ItemWithLastCalcSize = ResizableItem & { [LAST_CALC_SIZE_SYMBOL]?: ResizeSize };\n\n/**\n * A generic, control-agnostic resize engine for CSS grid layouts.\n *\n * Handles drag-based resizing of a list of {@link ResizableItem}s with support for:\n * - **Size units**: `px`, `fr`, `%`\n * - **Distribution modes**:\n * - `adjacent` — transfers space between the two items neighbouring the divider (zero-sum).\n * - `proportional` — only the dragged item changes to `px`; other items keep their `fr`/`%`\n * units and CSS grid redistributes the remaining space. Optionally locks the resized item\n * to `px` via {@link ResizeEngineConfig.lockSizes}.\n * - `push` — the dragged item grows/shrinks independently; the container total changes\n * (requires `containerConstrained = false`).\n * - **Commit modes** (for `adjacent`/`push`): `preserve`, `bakeAll`, `bakeAffected`\n * - **Min-size floor** ({@link ResizeEngineConfig.minItemSizePx}): an absolute `px` floor\n * enforced even when a relative min-size resolves smaller. In `proportional` mode, emitted\n * as CSS `minmax(floor, size)` so the grid natively prevents columns from shrinking below it.\n *\n * Consumers (splitter, table) provide items and configuration via signals.\n * The engine outputs a ready-to-use `grid-template-columns`/`grid-template-rows` string\n * via {@link gridTemplateSizes}.\n */\nexport class ResizeEngine {\n private readonly items: Signal<readonly ResizableItem[]>;\n private readonly containerSize: Signal<number>;\n private readonly gapSizes: Signal<readonly number[]>;\n private readonly distributionMode: ResizeEngineConfig['distributionMode'];\n private readonly containerConstrained: ResizeEngineConfig['containerConstrained'];\n private readonly lockSizes: Signal<boolean>;\n private readonly minItemSizePx: number;\n private readonly resolveItemSizes?: () => number[];\n\n constructor(config: ResizeEngineConfig) {\n this.items = config.items;\n this.containerSize = config.containerSize;\n this.gapSizes = config.gapSizes;\n this.distributionMode = config.distributionMode;\n this.containerConstrained = config.containerConstrained;\n this.lockSizes = config.lockSizes ?? signal(false);\n this.minItemSizePx = config.minItemSizePx ?? 0;\n this.resolveItemSizes = config.resolveItemSizes;\n\n // Signal fires when any item size is not calculated (external change detected)\n const hasUncalculatedSizes = computed(\n () => this.items().some(item => !this.isItemSizeCalculated(item)),\n { equal: (_, b) => b === false }\n ) as Signal<void>;\n\n // Ensure min/max limits are respected on external changes and container resize\n afterRenderEffect(() => {\n hasUncalculatedSizes();\n this.containerSize();\n untracked(() => {\n // Skip during active drag — sizes are managed by the drag handler\n if (this.dragContext()) return;\n this.ensureMinMaxSizes();\n });\n });\n }\n\n // --- Public signals ---\n\n /** The active drag state, or `null` when idle. */\n public readonly dragContext = signal<ResizeDragContext | null>(null);\n\n /** Whether a drag operation is currently in progress. */\n public readonly isDragging = computed(() => this.dragContext() !== null);\n\n /**\n * Whether any completed (non-cancelled) drag has occurred in this engine's lifetime.\n *\n * Used by `push` mode to defer resolving `fr`/`%` → `px` until the first drag.\n * Before the first drag, original units are preserved so CSS grid can distribute\n * space without rounding-induced overflow.\n */\n public readonly hasBeenResized = signal(false);\n\n /**\n * CSS grid template string with item sizes interleaved with gap sizes.\n *\n * Example output: `\"100px 4px minmax(50px, 2fr) 4px minmax(50px, 1fr)\"`.\n *\n * **Output strategy per distribution mode:**\n * - `adjacent` — resolves all sizes to `px`. CSS grid cannot constrain adjacent\n * resizing correctly with `fr` units.\n * - `proportional` — keeps `fr`/`%` as-is, wrapped in `minmax(floor, size)` when\n * {@link minItemSizePx} > 0. This lets CSS grid redistribute remaining space\n * while enforcing the minimum floor natively. Locked (`px`) columns pass through.\n * - `push` — keeps original units until the first completed drag, then resolves\n * everything to `px` so the total can exceed the container and trigger scrolling.\n */\n public readonly gridTemplateSizes = computed(() => {\n const items = this.items();\n const gaps = this.gapSizes();\n\n if (items.length === 0) return 'none';\n\n const containerSize = this.containerSize();\n const constrained = this.containerConstrained();\n const mode = this.distributionMode();\n\n // Resolve strategy:\n // - adjacent (constrained): resolve ALL to px — CSS grid can't constrain adjacent resizing with fr.\n // - push (unconstrained): keep original units until first movement bakes to px, then resolve for scrolling.\n // - proportional: NEVER resolve fr→px. Use minmax(floor, size) so CSS grid handles min widths\n // natively, both during and after drag. This allows columns that still have room to shrink\n // while already-at-minimum columns stay at the floor.\n const shouldResolve =\n containerSize > 0 &&\n ((constrained && mode === 'adjacent') || (!constrained && this.hasBeenResized()));\n const useMinmax = mode === 'proportional' && this.minItemSizePx > 0;\n const frFactors = shouldResolve ? this.getCurrentFractionFactors() : null;\n\n const result: string[] = [];\n for (let i = 0; i < items.length; i++) {\n const size = items[i]!.size();\n const expanded = expandResizeSize(size);\n if (shouldResolve && expanded.unit !== 'px') {\n result.push(`${resolveSizeToPx(expanded, frFactors!.pxPerFr, containerSize)}px`);\n } else if (useMinmax && expanded.unit !== 'px') {\n result.push(`minmax(${this.minItemSizePx}px, ${size})`);\n } else {\n result.push(size);\n }\n if (i < gaps.length) {\n result.push(`${gaps[i] || 0}px`);\n }\n }\n return result.join(' ');\n });\n\n /**\n * The total gap size in pixels.\n */\n public readonly totalGapSize = computed(() =>\n this.gapSizes().reduce((acc, size) => acc + size, 0)\n );\n\n /**\n * Aggregated item sizes by unit.\n */\n private readonly totalItemSizes = computed(() =>\n this.items().reduce(\n (acc, item) => {\n const { unit, value } = expandResizeSize(item.size());\n acc[unit] += value;\n return acc;\n },\n { px: 0, fr: 0, '%': 0 }\n )\n );\n\n /**\n * Minimum total size of all items combined (as a CSS calc expression).\n */\n public readonly minTotalSize = computed(() => this.computeLimitTotalSize('minSize'));\n\n /**\n * Maximum total size of all items combined (as a CSS calc expression).\n */\n public readonly maxTotalSize = computed(() => this.computeLimitTotalSize('maxSize'));\n\n // --- Drag operations ---\n\n /**\n * Begins a drag at the given divider. Original sizes are saved for reverting\n * on no-op clicks or cancellation. In push mode, baking to `px` is deferred\n * to the first {@link drag} call to avoid a visual shift on mousedown.\n */\n public startDrag(dividerIndex: number, startPositionPx: number): void {\n const items = this.items();\n if (dividerIndex < 0 || items.length < 2 || dividerIndex >= items.length) return;\n\n const preBakeSizes = items.map(item => item.size());\n\n this.dragContext.set({\n dividerIndex,\n startPosition: startPositionPx,\n preBakeSizes,\n items: items.map(item => this.createContextItem(item)),\n fractionFactors: this.getCurrentFractionFactors(),\n percentPerPx: this.getCurrentPercentPerPx(),\n baked: this.containerConstrained(),\n });\n }\n\n /** Updates item sizes during an active drag based on the current pointer position. */\n public drag(dividerIndex: number, currentPositionPx: number): void {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== dividerIndex) return;\n\n // In push mode, bake all items to px on the first movement so non-dragged\n // items keep their absolute widths. Deferred from startDrag to avoid a\n // visual column shift on mousedown (CSS Grid fr→px rounding mismatch).\n if (!ctx.baked) {\n this.bakeAllItemsToPx();\n ctx.items = this.items().map(item => this.createContextItem(item));\n ctx.fractionFactors = this.getCurrentFractionFactors();\n ctx.percentPerPx = this.getCurrentPercentPerPx();\n ctx.baked = true;\n }\n\n const pxDelta = currentPositionPx - ctx.startPosition;\n this.applyDelta(dividerIndex, pxDelta, ctx.items, ctx.fractionFactors, ctx.percentPerPx);\n }\n\n /**\n * Ends a drag. If cancelled or no movement occurred, sizes revert to their\n * pre-drag values (including undoing any push-mode baking). Otherwise,\n * post-drag finalization runs (commit mode or proportional locking).\n */\n public endDrag(dividerIndex: number, cancel: boolean): void {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== dividerIndex) return;\n const hasMoved = ctx.items.some(ci => {\n const current = expandResizeSize(ci.item.size());\n return current.value !== ci.startSize.value || current.unit !== ci.startSize.unit;\n });\n\n if (cancel || !hasMoved) {\n // Reset to pre-bake sizes (restores original fr/% units on no-op clicks)\n ctx.items.forEach((ci, i) => ci.item.size.set(ctx.preBakeSizes[i]!));\n } else {\n this.finalizeResize(ctx);\n this.hasBeenResized.set(true);\n }\n\n this.dragContext.set(null);\n }\n\n /**\n * Applies a single instantaneous move (e.g. keyboard step) at the given divider.\n * Requires that the relevant items already have engine-calculated sizes.\n */\n public moveDivider(dividerIndex: number, pxDelta: number): void {\n const items = this.items();\n if (dividerIndex < 0 || items.length < 2 || dividerIndex >= items.length) return;\n\n // Check that relevant items have calculated sizes\n if (!this.isItemSizeCalculated(items[dividerIndex]!)) return;\n if (dividerIndex < items.length - 1 && !this.isItemSizeCalculated(items[dividerIndex + 1]!))\n return;\n\n const contextItems = items.map(item => this.createContextItem(item));\n this.applyDelta(\n dividerIndex,\n pxDelta,\n contextItems,\n this.getCurrentFractionFactors(),\n this.getCurrentPercentPerPx()\n );\n }\n\n /**\n * Clamps all items to their min/max constraints, respecting {@link minItemSizePx}.\n *\n * Called automatically via `afterRenderEffect` when item sizes change externally\n * or the container resizes. Skipped during an active drag (sizes are managed\n * by the drag handler). For `fr`-sized items, clamping is done iteratively\n * with redistribution to maintain total fraction balance.\n */\n public ensureMinMaxSizes(): void {\n const items = this.items();\n if (items.length === 0) return;\n\n const containerSize = this.containerSize();\n // Container not measured yet (e.g. the splitter is mounted inside a hidden tab, so its\n // ResizeObserver reports 0). The fr clamping below divides by the available fr area, which\n // is degenerate at size 0 and would collapse fr items to `0fr` — a value then written back\n // and persisted, so the pane stays at 0 even after the container becomes visible. Nothing\n // meaningful to clamp until we have a real size; `gridTemplateSizes` guards the same way.\n if (containerSize <= 0) return;\n\n const itemSizes = items.map(item => {\n const expanded = expandResizeSize(item.size());\n return {\n item,\n size: { unit: expanded.unit, value: expanded.value },\n minSizePx: Math.max(this.minItemSizePx, getResizeLimitInPx(item.minSize(), containerSize)),\n maxSizePx: getResizeLimitInPx(item.maxSize(), containerSize),\n };\n });\n\n // Clamp px and % items\n for (const entry of itemSizes) {\n if (entry.size.unit === 'px') {\n entry.size.value = clamp(entry.size.value, entry.minSizePx, entry.maxSizePx);\n } else if (entry.size.unit === '%') {\n const pxValue = (entry.size.value / 100) * containerSize;\n if (pxValue < entry.minSizePx) {\n entry.size.value = (entry.minSizePx / containerSize) * 100;\n } else if (pxValue > entry.maxSizePx) {\n entry.size.value = (entry.maxSizePx / containerSize) * 100;\n }\n }\n }\n\n // Calculate fraction factors for fr-sized items\n const totalPx = itemSizes.reduce(\n (acc, { size }) => (size.unit === 'px' ? acc + size.value : acc),\n 0\n );\n const totalPercent = itemSizes.reduce(\n (acc, { size }) => (size.unit === '%' ? acc + size.value : acc),\n 0\n );\n const totalFr = itemSizes.reduce(\n (acc, { size }) => (size.unit === 'fr' ? acc + size.value : acc),\n 0\n );\n\n const frArea =\n containerSize - this.totalGapSize() - totalPx - (totalPercent / 100) * containerSize;\n const frPerPx = totalFr / (frArea || 1);\n const pxPerFr = (frArea || 1) / (totalFr || 1);\n\n // Iteratively clamp fr-sized items and redistribute\n let frPanelsWithoutClamping = itemSizes.filter(p => p.size.unit === 'fr');\n let frToDistribute: number | undefined = undefined;\n while (frPanelsWithoutClamping.length > 0 && frToDistribute !== 0) {\n const frToAddPerPanel = frToDistribute ? frToDistribute / frPanelsWithoutClamping.length : 0;\n const next: typeof itemSizes = [];\n let currentTotalFrSize = totalFr;\n for (const p of frPanelsWithoutClamping) {\n const minSizeFr = p.minSizePx * frPerPx;\n const maxSizeFr = p.maxSizePx * frPerPx;\n p.size.value += frToAddPerPanel;\n if (p.size.value < minSizeFr) {\n currentTotalFrSize = currentTotalFrSize - p.size.value + minSizeFr;\n p.size.value = minSizeFr;\n } else if (p.size.value > maxSizeFr) {\n currentTotalFrSize = currentTotalFrSize - p.size.value + maxSizeFr;\n p.size.value = maxSizeFr;\n } else {\n next.push(p);\n }\n }\n frToDistribute = totalFr - currentTotalFrSize;\n if (Math.abs(frToDistribute * pxPerFr) < 1) {\n frToDistribute = 0;\n }\n frPanelsWithoutClamping = next;\n }\n\n // Write back\n for (const { item, size } of itemSizes) {\n this.setItemSize(item, `${size.value}${size.unit}`);\n }\n }\n\n // --- Item size tracking ---\n\n /**\n * Sets the item's size and marks it as engine-calculated via an internal symbol.\n * This mark is used by {@link isItemSizeCalculated} to detect external size changes.\n */\n public setItemSize(item: ResizableItem, size: ResizeSize): void {\n item.size.set(size);\n (item as ItemWithLastCalcSize)[LAST_CALC_SIZE_SYMBOL] = size;\n }\n\n /**\n * Returns `true` if the item's current size matches the last value written by the engine.\n * Returns `false` if the size was changed externally (e.g. by an input binding or state restore).\n */\n public isItemSizeCalculated(item: ResizableItem): boolean {\n return (item as ItemWithLastCalcSize)[LAST_CALC_SIZE_SYMBOL] === item.size();\n }\n\n // --- Private: delta application ---\n\n /**\n * Routes a px delta to the appropriate distribution strategy.\n *\n * For last-item edge resizing (dividerIndex === items.length - 1), the delta is\n * remapped to the previous divider with negated direction. This allows the last\n * column's handle in push mode to resize it directly.\n */\n private applyDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const mode = this.distributionMode();\n\n // Right-edge resize of the last item: remap to the previous divider with negated delta.\n const isLastItemEdge = dividerIndex === items.length - 1;\n const effectiveDividerIndex = isLastItemEdge ? dividerIndex - 1 : dividerIndex;\n const effectiveDelta = isLastItemEdge ? -pxDelta : pxDelta;\n\n if (mode === 'push' && !this.containerConstrained()) {\n this.applyPushDelta(dividerIndex, pxDelta, items, fractionFactors, percentPerPx);\n } else if (mode === 'proportional') {\n this.applyProportionalDelta(effectiveDividerIndex, effectiveDelta, items, fractionFactors);\n } else {\n this.applyAdjacentDelta(\n effectiveDividerIndex,\n effectiveDelta,\n items,\n fractionFactors,\n percentPerPx\n );\n }\n }\n\n /**\n * Adjacent mode: transfers the delta between the two items neighbouring the divider.\n *\n * Grows the left item and shrinks the right item (or vice versa). When an item\n * hits its min/max constraint, the unapplied remainder cascades to the next item\n * in that direction. A second pass resolves any asymmetry between left and right.\n * The total container width is always preserved (zero-sum).\n */\n private applyAdjacentDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const containerSize = this.containerSize();\n const appliedPanelDeltas: number[] = Array(items.length).fill(0);\n\n const recursion = (pxDelta: number, itemIndex: number, itemIndexIncrement: number): number => {\n if (itemIndex >= items.length || itemIndex < 0) return 0;\n const ci = items[itemIndex]!;\n\n const startPx = resolveSizeToPx(ci.startSize, fractionFactors.pxPerFr, containerSize);\n const newPx = startPx + pxDelta;\n const limitPx = getLimitPxForDelta(ci, pxDelta, containerSize, this.minItemSizePx);\n const unappliedDelta =\n pxDelta < 0\n ? limitPx > newPx\n ? -(limitPx - newPx)\n : 0\n : limitPx < newPx\n ? newPx - limitPx\n : 0;\n\n const appliedDelta = pxDelta - unappliedDelta;\n appliedPanelDeltas[itemIndex] = appliedDelta;\n\n return unappliedDelta === 0\n ? pxDelta\n : appliedDelta +\n recursion(unappliedDelta, itemIndex + itemIndexIncrement, itemIndexIncrement);\n };\n\n let appliedLeft = recursion(pxDelta, dividerIndex, -1);\n let appliedRight = -recursion(-pxDelta, dividerIndex + 1, 1);\n\n if (appliedLeft !== pxDelta || appliedRight !== pxDelta) {\n const resolvedDelta =\n pxDelta < 0 ? Math.max(appliedLeft, appliedRight) : Math.min(appliedLeft, appliedRight);\n appliedPanelDeltas.fill(0);\n appliedLeft = recursion(resolvedDelta, dividerIndex, -1);\n appliedRight = -recursion(-resolvedDelta, dividerIndex + 1, 1);\n\n if (appliedLeft !== resolvedDelta || appliedRight !== resolvedDelta) {\n return;\n }\n }\n\n this.commitItemDeltas(items, appliedPanelDeltas, fractionFactors, percentPerPx);\n }\n\n /**\n * Proportional mode: only the item at `dividerIndex` changes size (set to absolute `px`).\n * All other items keep their original units (`fr`, `%`), and CSS grid's `minmax(floor, size)`\n * naturally redistributes the remaining space — columns with room shrink while those\n * already at the floor stay put.\n *\n * Growth is capped so the total never overflows the container: each other `fr` column\n * needs at least {@link minItemSizePx}, and locked `px` columns keep their size.\n *\n * After the drag ends, {@link applyProportionalLocking} determines whether the\n * resized column stays as `px` (locked) or is converted back to `fr` (dynamic).\n */\n private applyProportionalDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors\n ): void {\n const containerSize = this.containerSize();\n const floor = this.minItemSizePx;\n const item = items[dividerIndex]!;\n const startPx = resolveSizeToPx(item.startSize, fractionFactors.pxPerFr, containerSize);\n\n // Clamp to own min/max\n let newPx = clampToLimits(startPx + pxDelta, item, containerSize, floor);\n\n // Cap so the total doesn't overflow. With minmax(floor, Xfr), each other\n // column needs at least `floor` px. Locked px columns keep their size.\n if (floor > 0) {\n const totalGaps = this.totalGapSize();\n let otherLockedPx = 0;\n let otherFrCount = 0;\n for (let i = 0; i < items.length; i++) {\n if (i === dividerIndex) continue;\n const { unit, value } = expandResizeSize(items[i]!.item.size());\n if (unit === 'px') {\n otherLockedPx += value;\n } else {\n otherFrCount++;\n }\n }\n newPx = Math.min(newPx, containerSize - totalGaps - otherLockedPx - otherFrCount * floor);\n }\n\n this.setItemSize(item.item, `${Math.max(0, newPx)}px`);\n }\n\n /**\n * Push mode: only the dragged item changes size. All other items stay at their\n * baked `px` values (set during {@link startDrag}). The container total changes,\n * causing horizontal overflow/scrolling. Only valid when `containerConstrained` is `false`.\n */\n private applyPushDelta(\n dividerIndex: number,\n pxDelta: number,\n items: ResizeDragContextItem[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n const containerSize = this.containerSize();\n const appliedPanelDeltas: number[] = Array(items.length).fill(0);\n const item = items[dividerIndex]!;\n const startPx = resolveSizeToPx(item.startSize, fractionFactors.pxPerFr, containerSize);\n\n appliedPanelDeltas[dividerIndex] =\n clampToLimits(startPx + pxDelta, item, containerSize, this.minItemSizePx) - startPx;\n\n this.commitItemDeltas(items, appliedPanelDeltas, fractionFactors, percentPerPx);\n }\n\n // --- Private: post-drag finalization ---\n\n /**\n * Post-drag finalization. Behaviour depends on {@link lockSizes} and the distribution mode.\n *\n * When `lockSizes` is `false`:\n * - `adjacent` / `push` — no-op; items keep their original units.\n * - `proportional` — the resized column is converted back to `fr` so it stays dynamic.\n *\n * When `lockSizes` is `true`:\n * - `adjacent` / `push` — items whose size changed are converted to absolute `px`.\n * - `proportional` — no-op; the resized column is already `px` from the drag.\n */\n private finalizeResize(ctx: ResizeDragContext): void {\n const lock = this.lockSizes();\n\n if (this.distributionMode() === 'proportional') {\n if (!lock) this.unlockProportionalColumn(ctx);\n return;\n }\n\n // Adjacent / push: lock affected items to px when enabled\n if (!lock) return;\n\n const containerSize = this.containerSize();\n const fractionFactors = this.getCurrentFractionFactors();\n\n for (const ci of ctx.items) {\n const currentSize = expandResizeSize(ci.item.size());\n const sizeChanged =\n currentSize.value !== ci.startSize.value || currentSize.unit !== ci.startSize.unit;\n if (sizeChanged) {\n const pxValue = resolveSizeToPx(currentSize, fractionFactors.pxPerFr, containerSize);\n this.setItemSize(ci.item, `${Math.max(0, pxValue)}px`);\n }\n }\n }\n\n /**\n * Converts the resized column back to `fr` after a proportional drag so it\n * continues to flex with the container. Computes a new `fr` value that would\n * resolve to the same pixel width given the current container and other `fr` columns.\n */\n private unlockProportionalColumn(ctx: ResizeDragContext): void {\n const items = ctx.items;\n const containerSize = this.containerSize();\n const resizedItem = items[ctx.dividerIndex]!;\n const resizedPx = expandResizeSize(resizedItem.item.size()).value;\n\n // Sum up all other fr values (from pre-bake, since they weren't changed)\n let otherFrTotal = 0;\n let otherPxTotal = 0;\n for (let i = 0; i < items.length; i++) {\n if (i === ctx.dividerIndex) continue;\n const preBake = expandResizeSize(ctx.preBakeSizes[i]!);\n if (preBake.unit === 'fr') {\n otherFrTotal += preBake.value;\n } else if (preBake.unit === 'px') {\n otherPxTotal += preBake.value;\n }\n }\n\n const availableForFr = containerSize - this.totalGapSize() - otherPxTotal;\n\n if (otherFrTotal > 0 && availableForFr > resizedPx) {\n // Solve: newFr / otherFrTotal = resizedPx / (availableForFr - resizedPx)\n const newFr = (resizedPx * otherFrTotal) / (availableForFr - resizedPx);\n this.setItemSize(resizedItem.item, `${Math.max(0, +newFr.toFixed(4))}fr`);\n }\n // If we can't compute a valid fr (edge case), leave as px\n }\n\n // --- Private: helpers ---\n\n private createContextItem(item: ResizableItem): ResizeDragContextItem {\n return {\n item,\n startSize: expandResizeSize(item.size()),\n minSize: expandResizeLimit(item.minSize()),\n maxSize: expandResizeLimit(item.maxSize()),\n };\n }\n\n private getCurrentFractionFactors(): ResizeFractionFactors {\n const totals = this.totalItemSizes();\n const cs = this.containerSize();\n const percentPx = (totals['%'] / 100) * cs;\n const frArea = cs - this.totalGapSize() - totals.px - percentPx || 1;\n const totalFr = totals.fr || 1;\n return {\n frPerPx: totalFr / frArea,\n pxPerFr: frArea / totalFr,\n };\n }\n\n private getCurrentPercentPerPx(): number {\n return 100 / (this.containerSize() || 1);\n }\n\n /**\n * Bakes all non-px items to absolute px values. Used by push mode on first drag movement.\n * Prefers DOM-measured sizes (via {@link resolveItemSizes}) over JS-computed conversions\n * to avoid sub-pixel mismatches with CSS Grid's internal track sizing.\n */\n private bakeAllItemsToPx(): void {\n const items = this.items();\n const measured = this.resolveItemSizes?.();\n\n if (measured && measured.length === items.length) {\n for (let i = 0; i < items.length; i++) {\n this.setItemSize(items[i]!, `${measured[i]!}px`);\n }\n } else {\n const frFactors = this.getCurrentFractionFactors();\n const containerSize = this.containerSize();\n for (const item of items) {\n const size = expandResizeSize(item.size());\n if (size.unit !== 'px') {\n this.setItemSize(item, `${resolveSizeToPx(size, frFactors.pxPerFr, containerSize)}px`);\n }\n }\n }\n }\n\n /**\n * Writes computed px deltas back to items, converting to each item's original unit.\n */\n private commitItemDeltas(\n items: ResizeDragContextItem[],\n appliedPanelDeltas: number[],\n fractionFactors: ResizeFractionFactors,\n percentPerPx: number\n ): void {\n items.forEach((ci, i) => {\n const pxDelta = appliedPanelDeltas[i] || 0;\n const unitDelta = pxDeltaToUnitDelta(\n pxDelta,\n ci.startSize.unit,\n fractionFactors.frPerPx,\n percentPerPx\n );\n const newValue = ci.startSize.value + unitDelta;\n this.setItemSize(ci.item, `${Math.max(0, newValue)}${ci.startSize.unit}`);\n });\n }\n\n /**\n * Builds a CSS `calc()` expression summing all items' min or max limits.\n * Items already in `px` contribute their current size; `fr`/`%` items contribute\n * their `minSize`/`maxSize` limit. Used by {@link minTotalSize} and {@link maxTotalSize}.\n */\n private computeLimitTotalSize(limitProp: 'minSize' | 'maxSize'): string {\n const { px, '%': pc } = this.items().reduce(\n (acc, item) => {\n const { unit, value } = expandResizeSize(item.size());\n if (unit === 'px') {\n acc.px += value;\n } else {\n const limitStr = item[limitProp]();\n acc[getResizeLimitUnit(limitStr)] += getResizeLimitValue(limitStr);\n }\n return acc;\n },\n { px: 0, '%': 0 }\n );\n return `calc(${px + this.totalGapSize()}px + ${pc}%)`;\n }\n}\n\n// --- Module-level helpers ---\n\n/** Clamps a value between min and max. */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/** Resolves an expanded limit to px. */\nfunction limitToPx(limit: ExpandedResizeLimit, containerSize: number): number {\n return limit.unit === 'px' ? limit.value : (limit.value / 100) * containerSize;\n}\n\n/**\n * Resolves a min limit to px, enforcing the given absolute floor.\n * Even if a relative limit (e.g. `5%`) resolves to less than the floor, the floor wins.\n */\nfunction minLimitToPx(limit: ExpandedResizeLimit, containerSize: number, floorPx: number): number {\n return Math.max(floorPx, limitToPx(limit, containerSize));\n}\n\n/** Clamps a px value to the item's min/max limits (with floor on min). */\nfunction clampToLimits(\n px: number,\n ci: ResizeDragContextItem,\n containerSize: number,\n floorPx: number\n): number {\n return clamp(\n px,\n minLimitToPx(ci.minSize, containerSize, floorPx),\n limitToPx(ci.maxSize, containerSize)\n );\n}\n\n/**\n * Returns the relevant limit (min or max) in px for the direction of a delta.\n * Negative delta → min limit (with floor), positive delta → max limit.\n */\nfunction getLimitPxForDelta(\n ci: ResizeDragContextItem,\n pxDelta: number,\n containerSize: number,\n floorPx: number\n): number {\n return pxDelta < 0\n ? minLimitToPx(ci.minSize, containerSize, floorPx)\n : limitToPx(ci.maxSize, containerSize);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, computed, Component, inject, ViewContainerRef, ElementRef, DestroyRef, booleanAttribute, afterNextRender, effect, Directive } from '@angular/core';
3
+ import { Platform, setComponentInput } from '@ngneers/controls/api/ng';
4
+ import { NgnBase, provideSelf } from '@ngneers/controls/base';
5
+ import { badgeControlTemplate } from '@ngneers/controls-themes/templates/badge';
6
+
7
+ /**
8
+ * @internal
9
+ * The overlay element rendered by the {@link NgnBadge} directive. Not intended
10
+ * to be used directly in templates.
11
+ * @category control
12
+ */
13
+ class NgnBadgeIndicator extends NgnBase {
14
+ theme = this.injectThemeTemplate(badgeControlTemplate, {
15
+ root: true,
16
+ dot: () => this.dot(),
17
+ circular: () => this.circular(),
18
+ 'top-end': () => this.position() === 'top-end',
19
+ 'top-start': () => this.position() === 'top-start',
20
+ 'bottom-end': () => this.position() === 'bottom-end',
21
+ 'bottom-start': () => this.position() === 'bottom-start',
22
+ });
23
+ /** The rendered badge text (already max-clamped by the directive). */
24
+ text = input('', /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
26
+ /** Whether to render as a dot (no text). @default false */
27
+ dot = input(false, /* @ts-ignore */
28
+ ...(ngDevMode ? [{ debugName: "dot" }] : /* istanbul ignore next */ []));
29
+ /** Which corner the badge sits in. @default top-end */
30
+ position = input('top-end', /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
32
+ /** Position on a circular anchor's edge (~45°) instead of the box corner. @default false */
33
+ circular = input(false, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "circular" }] : /* istanbul ignore next */ []));
35
+ /** CSS color value or `var(...)` reference for the badge fill. */
36
+ bgColor = input(/* @ts-ignore */
37
+ ...(ngDevMode ? [undefined, { debugName: "bgColor" }] : /* istanbul ignore next */ []));
38
+ display = computed(() => (this.dot() ? '' : this.text()), /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "display" }] : /* istanbul ignore next */ []));
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnBadgeIndicator, deps: null, target: i0.ɵɵFactoryTarget.Component });
41
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.5", type: NgnBadgeIndicator, isStandalone: true, selector: "ngn-badge-indicator", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, dot: { classPropertyName: "dot", publicName: "dot", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, circular: { classPropertyName: "circular", publicName: "circular", isSignal: true, isRequired: false, transformFunction: null }, bgColor: { classPropertyName: "bgColor", publicName: "bgColor", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, properties: { "style.--ngn-badge-color": "bgColor() || null" } }, providers: [provideSelf(NgnBadgeIndicator)], usesInheritance: true, ngImport: i0, template: "{{ display() }}\n" });
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnBadgeIndicator, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'ngn-badge-indicator', providers: [provideSelf(NgnBadgeIndicator)], host: {
46
+ 'aria-hidden': 'true',
47
+ '[style.--ngn-badge-color]': 'bgColor() || null',
48
+ }, template: "{{ display() }}\n" }]
49
+ }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], dot: [{ type: i0.Input, args: [{ isSignal: true, alias: "dot", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], circular: [{ type: i0.Input, args: [{ isSignal: true, alias: "circular", required: false }] }], bgColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "bgColor", required: false }] }] } });
50
+
51
+ /**
52
+ * Overlays a small badge (count, text, or dot) onto its host element — an icon,
53
+ * button, or avatar. The badge is injected as an absolutely-positioned overlay,
54
+ * so the host is made `position: relative` when it is currently static.
55
+ */
56
+ class NgnBadge {
57
+ _vcr = inject(ViewContainerRef);
58
+ _host = inject(ElementRef).nativeElement;
59
+ _destroyRef = inject(DestroyRef);
60
+ _ref;
61
+ /** Badge content. A number is clamped by {@link max}; empty hides the badge unless {@link dot}. */
62
+ value = input(undefined, { ...(ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {}), alias: 'ngnBadge' });
63
+ /** Clamp a numeric {@link value} to `"{max}+"` when it exceeds this. */
64
+ max = input(undefined, { ...(ngDevMode ? { debugName: "max" } : /* istanbul ignore next */ {}), alias: 'ngnBadgeMax' });
65
+ /** Render a dot with no text, ignoring {@link value}. @default false */
66
+ dot = input(false, { ...(ngDevMode ? { debugName: "dot" } : /* istanbul ignore next */ {}), transform: booleanAttribute, alias: 'ngnBadgeDot' });
67
+ /** Show the badge even when {@link value} is `0`. @default false */
68
+ showZero = input(false, { ...(ngDevMode ? { debugName: "showZero" } : /* istanbul ignore next */ {}), transform: booleanAttribute,
69
+ alias: 'ngnBadgeShowZero' });
70
+ /** Which corner the badge sits in. @default top-end */
71
+ position = input('top-end', { ...(ngDevMode ? { debugName: "position" } : /* istanbul ignore next */ {}), alias: 'ngnBadgePosition' });
72
+ /** CSS color value (hex/rgb) or `var(...)` reference for the badge fill. */
73
+ color = input(undefined, { ...(ngDevMode ? { debugName: "color" } : /* istanbul ignore next */ {}), alias: 'ngnBadgeColor' });
74
+ /** Hide the badge without removing the host. @default false */
75
+ hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute, alias: 'ngnBadgeHidden' });
76
+ /** Anchor on a circular host's edge (~45°) instead of the box corner (e.g. avatars). @default false */
77
+ circular = input(false, { ...(ngDevMode ? { debugName: "circular" } : /* istanbul ignore next */ {}), transform: booleanAttribute,
78
+ alias: 'ngnBadgeCircular' });
79
+ _platform = inject(Platform);
80
+ constructor() {
81
+ // Ensure the host can anchor the absolutely-positioned indicator. This must run in
82
+ // `afterNextRender` (browser-only, never during SSR): in the constructor the host is
83
+ // not yet connected, so `getComputedStyle(host).position` returns '' (not 'static')
84
+ // and the guard would silently skip — leaving the badge to position against the
85
+ // viewport instead of the host.
86
+ afterNextRender(() => {
87
+ if (getComputedStyle(this._host).position === 'static') {
88
+ this._host.style.position = 'relative';
89
+ }
90
+ });
91
+ effect(() => {
92
+ // Create the indicator browser-only. It is injected via `ViewContainerRef` and then
93
+ // moved into the host DOM; doing that during SSR serializes a dehydrated view whose
94
+ // anchor no longer matches the moved node, crashing hydration ("Expecting instance of
95
+ // DOM Element"). The badge is decorative (aria-hidden), so it appears on hydration.
96
+ if (!this._platform.isBrowser) {
97
+ return;
98
+ }
99
+ const text = this.resolveText();
100
+ const visible = !this.hidden() && (this.dot() || text !== null);
101
+ if (!visible) {
102
+ this.teardown();
103
+ return;
104
+ }
105
+ if (!this._ref) {
106
+ this._ref = this._vcr.createComponent(NgnBadgeIndicator);
107
+ this._host.appendChild(this._ref.location.nativeElement);
108
+ }
109
+ setComponentInput(this._ref, 'text', text ?? '');
110
+ setComponentInput(this._ref, 'dot', this.dot());
111
+ setComponentInput(this._ref, 'position', this.position());
112
+ setComponentInput(this._ref, 'circular', this.circular());
113
+ setComponentInput(this._ref, 'bgColor', this.color());
114
+ });
115
+ this._destroyRef.onDestroy(() => this.teardown());
116
+ }
117
+ /** Returns the string to render, or `null` when the badge should not show. */
118
+ resolveText() {
119
+ if (this.dot()) {
120
+ return '';
121
+ }
122
+ const value = this.value();
123
+ if (value === undefined || value === null || value === '') {
124
+ return null;
125
+ }
126
+ if (typeof value === 'number') {
127
+ if (value === 0 && !this.showZero()) {
128
+ return null;
129
+ }
130
+ const max = this.max();
131
+ if (max !== undefined && value > max) {
132
+ return `${max}+`;
133
+ }
134
+ return String(value);
135
+ }
136
+ return value;
137
+ }
138
+ teardown() {
139
+ if (this._ref) {
140
+ this._ref.destroy();
141
+ this._ref = undefined;
142
+ }
143
+ }
144
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnBadge, deps: [], target: i0.ɵɵFactoryTarget.Directive });
145
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgnBadge, isStandalone: true, selector: "[ngnBadge], [ngnBadgeDot]", inputs: { value: { classPropertyName: "value", publicName: "ngnBadge", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "ngnBadgeMax", isSignal: true, isRequired: false, transformFunction: null }, dot: { classPropertyName: "dot", publicName: "ngnBadgeDot", isSignal: true, isRequired: false, transformFunction: null }, showZero: { classPropertyName: "showZero", publicName: "ngnBadgeShowZero", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "ngnBadgePosition", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "ngnBadgeColor", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "ngnBadgeHidden", isSignal: true, isRequired: false, transformFunction: null }, circular: { classPropertyName: "circular", publicName: "ngnBadgeCircular", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnBadge, decorators: [{
148
+ type: Directive,
149
+ args: [{
150
+ // Also match `[ngnBadgeDot]` so dot mode works standalone (no value/`ngnBadge` needed).
151
+ selector: '[ngnBadge], [ngnBadgeDot]',
152
+ }]
153
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadge", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeMax", required: false }] }], dot: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeDot", required: false }] }], showZero: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeShowZero", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgePosition", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeColor", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeHidden", required: false }] }], circular: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnBadgeCircular", required: false }] }] } });
154
+
155
+ /**
156
+ * Generated bundle index. Do not edit.
157
+ */
158
+
159
+ export { NgnBadge, NgnBadgeIndicator };
160
+ //# sourceMappingURL=ngneers-controls-badge.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-badge.mjs","sources":["../../src/badge/badge-indicator.ts","../../src/badge/badge-indicator.html","../../src/badge/badge.ts","../../src/badge/ngneers-controls-badge.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\nimport { badgeControlTemplate } from '@ngneers/controls-themes/templates/badge';\n\n/** One of the four corners the badge indicator can sit in. */\nexport type BadgePosition = 'top-end' | 'top-start' | 'bottom-end' | 'bottom-start';\n\n/**\n * @internal\n * The overlay element rendered by the {@link NgnBadge} directive. Not intended\n * to be used directly in templates.\n * @category control\n */\n@Component({\n selector: 'ngn-badge-indicator',\n templateUrl: './badge-indicator.html',\n providers: [provideSelf(NgnBadgeIndicator)],\n host: {\n 'aria-hidden': 'true',\n '[style.--ngn-badge-color]': 'bgColor() || null',\n },\n})\nexport class NgnBadgeIndicator extends NgnBase<'badge'> {\n protected readonly theme = this.injectThemeTemplate(badgeControlTemplate, {\n root: true,\n dot: () => this.dot(),\n circular: () => this.circular(),\n 'top-end': () => this.position() === 'top-end',\n 'top-start': () => this.position() === 'top-start',\n 'bottom-end': () => this.position() === 'bottom-end',\n 'bottom-start': () => this.position() === 'bottom-start',\n });\n\n /** The rendered badge text (already max-clamped by the directive). */\n public readonly text = input<string>('');\n /** Whether to render as a dot (no text). @default false */\n public readonly dot = input<boolean>(false);\n /** Which corner the badge sits in. @default top-end */\n public readonly position = input<BadgePosition>('top-end');\n /** Position on a circular anchor's edge (~45°) instead of the box corner. @default false */\n public readonly circular = input<boolean>(false);\n /** CSS color value or `var(...)` reference for the badge fill. */\n public readonly bgColor = input<string>();\n\n protected readonly display = computed(() => (this.dot() ? '' : this.text()));\n}\n","{{ display() }}\n","import {\n afterNextRender,\n booleanAttribute,\n ComponentRef,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\nimport { Platform, setComponentInput } from '@ngneers/controls/api/ng';\n\nimport { NgnBadgeIndicator, type BadgePosition } from './badge-indicator';\n\n/**\n * Overlays a small badge (count, text, or dot) onto its host element — an icon,\n * button, or avatar. The badge is injected as an absolutely-positioned overlay,\n * so the host is made `position: relative` when it is currently static.\n */\n@Directive({\n // Also match `[ngnBadgeDot]` so dot mode works standalone (no value/`ngnBadge` needed).\n selector: '[ngnBadge], [ngnBadgeDot]',\n})\nexport class NgnBadge {\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly _destroyRef = inject(DestroyRef);\n private _ref?: ComponentRef<NgnBadgeIndicator>;\n\n /** Badge content. A number is clamped by {@link max}; empty hides the badge unless {@link dot}. */\n public readonly value = input<number | string | undefined>(undefined, { alias: 'ngnBadge' });\n /** Clamp a numeric {@link value} to `\"{max}+\"` when it exceeds this. */\n public readonly max = input<number | undefined>(undefined, { alias: 'ngnBadgeMax' });\n /** Render a dot with no text, ignoring {@link value}. @default false */\n public readonly dot = input(false, { transform: booleanAttribute, alias: 'ngnBadgeDot' });\n /** Show the badge even when {@link value} is `0`. @default false */\n public readonly showZero = input(false, {\n transform: booleanAttribute,\n alias: 'ngnBadgeShowZero',\n });\n /** Which corner the badge sits in. @default top-end */\n public readonly position = input<BadgePosition>('top-end', { alias: 'ngnBadgePosition' });\n /** CSS color value (hex/rgb) or `var(...)` reference for the badge fill. */\n public readonly color = input<string | undefined>(undefined, { alias: 'ngnBadgeColor' });\n /** Hide the badge without removing the host. @default false */\n public readonly hidden = input(false, { transform: booleanAttribute, alias: 'ngnBadgeHidden' });\n /** Anchor on a circular host's edge (~45°) instead of the box corner (e.g. avatars). @default false */\n public readonly circular = input(false, {\n transform: booleanAttribute,\n alias: 'ngnBadgeCircular',\n });\n\n private readonly _platform = inject(Platform);\n\n constructor() {\n // Ensure the host can anchor the absolutely-positioned indicator. This must run in\n // `afterNextRender` (browser-only, never during SSR): in the constructor the host is\n // not yet connected, so `getComputedStyle(host).position` returns '' (not 'static')\n // and the guard would silently skip — leaving the badge to position against the\n // viewport instead of the host.\n afterNextRender(() => {\n if (getComputedStyle(this._host).position === 'static') {\n this._host.style.position = 'relative';\n }\n });\n\n effect(() => {\n // Create the indicator browser-only. It is injected via `ViewContainerRef` and then\n // moved into the host DOM; doing that during SSR serializes a dehydrated view whose\n // anchor no longer matches the moved node, crashing hydration (\"Expecting instance of\n // DOM Element\"). The badge is decorative (aria-hidden), so it appears on hydration.\n if (!this._platform.isBrowser) {\n return;\n }\n const text = this.resolveText();\n const visible = !this.hidden() && (this.dot() || text !== null);\n\n if (!visible) {\n this.teardown();\n return;\n }\n if (!this._ref) {\n this._ref = this._vcr.createComponent(NgnBadgeIndicator);\n this._host.appendChild(this._ref.location.nativeElement);\n }\n setComponentInput(this._ref, 'text', text ?? '');\n setComponentInput(this._ref, 'dot', this.dot());\n setComponentInput(this._ref, 'position', this.position());\n setComponentInput(this._ref, 'circular', this.circular());\n setComponentInput(this._ref, 'bgColor', this.color());\n });\n\n this._destroyRef.onDestroy(() => this.teardown());\n }\n\n /** Returns the string to render, or `null` when the badge should not show. */\n private resolveText(): string | null {\n if (this.dot()) {\n return '';\n }\n const value = this.value();\n if (value === undefined || value === null || value === '') {\n return null;\n }\n if (typeof value === 'number') {\n if (value === 0 && !this.showZero()) {\n return null;\n }\n const max = this.max();\n if (max !== undefined && value > max) {\n return `${max}+`;\n }\n return String(value);\n }\n return value;\n }\n\n private teardown(): void {\n if (this._ref) {\n this._ref.destroy();\n this._ref = undefined;\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}