@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-slider.mjs","sources":["../../src/slider/slider.ts","../../src/slider/slider.html","../../src/slider/ngneers-controls-slider.ts"],"sourcesContent":["import { Component, input, viewChild, ElementRef, computed } from '@angular/core';\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-slider',\n templateUrl: './slider.html',\n imports: [NgnPt, NgnDrag],\n providers: [provideSelf(NgnSlider)],\n host: {\n role: 'slider',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-valuenow]': 'value()',\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\n '[attr.aria-valuetext]': 'valueTextValue()',\n '[tabindex]': 'disabled() ? -1 : 0',\n '(keydown)': 'onKeyDown($event)',\n '(blur)': 'touched.set(true)',\n },\n})\nexport class NgnSlider extends ValueControlBase<'slider', number> {\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\n root: true,\n invalid: () => this.invalid(),\n horizontal: () => !this.vertical(),\n vertical: () => this.vertical(),\n });\n\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\n\n /**\n * The minimum value of the slider.\n * @default 0\n */\n public readonly min = input<number>(0);\n\n /**\n * Whether the slider is oriented vertically instead of horizontally.\n * @default false\n */\n public readonly vertical = input<boolean>(false);\n\n /**\n * The maximum value of the slider.\n * @default 100\n */\n public readonly max = input<number>(100);\n\n /**\n * The increment between selectable values.\n * @default 1\n */\n public readonly step = input<number>(1);\n\n /**\n * The value text representation for accessibility.\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\n */\n public readonly valueText = input<string>();\n\n /**\n * A function that generates the value text representation for accessibility.\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\n */\n public readonly valueTextFn = input<(value: number) => string>();\n\n protected readonly left = computed(() => {\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\n return Math.min(100, Math.max(0, percent));\n });\n\n constructor() {\n super();\n }\n\n protected readonly valueTextValue = computed(() => {\n const valueText = this.valueText();\n if (valueText) {\n return valueText;\n }\n const valueTextFn = this.valueTextFn();\n if (valueTextFn) {\n return valueTextFn(this.value());\n }\n return null;\n });\n\n protected onDragged(delta: NgnDragInfo) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\n this.dragToPosition(cursorPos);\n }\n\n private dragToPosition(cursorPos: number) {\n const trackEl = this._track().nativeElement;\n const trackRect = trackEl.getBoundingClientRect();\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\n const positionInTrack = cursorPos - trackStart;\n const correctedPositionInTrack = this.vertical()\n ? trackLength - positionInTrack\n : positionInTrack;\n const positionPercent = correctedPositionInTrack / trackLength;\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\n const steppedValue =\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\n this.value.set(this.clampValue(steppedValue));\n }\n\n private clampValue(value: number): number {\n return Math.min(this.max(), Math.max(this.min(), value));\n }\n\n protected onDragEnd() {}\n\n protected onKeyDown(event: KeyboardEvent) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n this.value.update(v => this.clampValue(v - this.step()));\n event.preventDefault();\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n this.value.update(v => this.clampValue(v + this.step()));\n event.preventDefault();\n break;\n case 'Home':\n this.value.set(this.min());\n this.onDragEnd();\n event.preventDefault();\n break;\n case 'End':\n this.value.set(this.max());\n this.onDragEnd();\n event.preventDefault();\n break;\n }\n }\n\n protected thumbClicked(event: PointerEvent) {\n event.stopPropagation();\n }\n protected trackClicked(event: PointerEvent) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n const trackEl = this._track().nativeElement;\n const trackRect = trackEl.getBoundingClientRect();\n const clickPosition = this.vertical()\n ? event.clientY - trackRect.top\n : event.clientX - trackRect.left;\n this.dragToPosition(\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\n );\n }\n}\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\n <div\n #thumb\n [ptInt]=\"this\"\n [ptClass]=\"'thumb'\"\n ngnDrag\n (dragged)=\"onDragged($event)\"\n (dragEnd)=\"onDragEnd()\"\n [style.--valuePercent.%]=\"left()\"\n (click)=\"thumbClicked($event)\"\n ></div>\n</div>\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-slider.mjs","sources":["../../src/slider/slider.ts","../../src/slider/slider.html","../../src/slider/ngneers-controls-slider.ts"],"sourcesContent":["import { Component, input, viewChild, ElementRef, computed } from '@angular/core';\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-slider',\n templateUrl: './slider.html',\n imports: [NgnPt, NgnDrag],\n providers: [provideSelf(NgnSlider)],\n host: {\n role: 'slider',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-valuenow]': 'value()',\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\n '[attr.disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-labelledby]': 'labelledBy()',\n '[attr.aria-label]': 'label()',\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\n '[attr.aria-valuetext]': 'valueTextValue()',\n '[tabindex]': 'disabled() ? -1 : 0',\n '(keydown)': 'onKeyDown($event)',\n '(blur)': 'markTouched()',\n },\n})\nexport class NgnSlider extends ValueControlBase<'slider', number> {\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\n root: true,\n invalid: () => this.invalidState(),\n horizontal: () => !this.vertical(),\n vertical: () => this.vertical(),\n });\n\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\n\n /**\n * The minimum value of the slider.\n * @default 0\n */\n public readonly min = input<number>(0);\n\n /**\n * Whether the slider is oriented vertically instead of horizontally.\n * @default false\n */\n public readonly vertical = input<boolean>(false);\n\n /**\n * The maximum value of the slider.\n * @default 100\n */\n public readonly max = input<number>(100);\n\n /**\n * The increment between selectable values.\n * @default 1\n */\n public readonly step = input<number>(1);\n\n /**\n * The value text representation for accessibility.\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\n */\n public readonly valueText = input<string>();\n\n /**\n * A function that generates the value text representation for accessibility.\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\n */\n public readonly valueTextFn = input<(value: number) => string>();\n\n protected readonly left = computed(() => {\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\n return Math.min(100, Math.max(0, percent));\n });\n\n constructor() {\n super();\n }\n\n protected readonly valueTextValue = computed(() => {\n const valueText = this.valueText();\n if (valueText) {\n return valueText;\n }\n const valueTextFn = this.valueTextFn();\n if (valueTextFn) {\n return valueTextFn(this.value());\n }\n return null;\n });\n\n protected onDragged(delta: NgnDragInfo) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\n this.dragToPosition(cursorPos);\n }\n\n private dragToPosition(cursorPos: number) {\n const trackEl = this._track().nativeElement;\n const trackRect = trackEl.getBoundingClientRect();\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\n const positionInTrack = cursorPos - trackStart;\n const correctedPositionInTrack = this.vertical()\n ? trackLength - positionInTrack\n : positionInTrack;\n const positionPercent = correctedPositionInTrack / trackLength;\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\n const steppedValue =\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\n this.value.set(this.clampValue(steppedValue));\n }\n\n private clampValue(value: number): number {\n return Math.min(this.max(), Math.max(this.min(), value));\n }\n\n protected onDragEnd() {}\n\n protected onKeyDown(event: KeyboardEvent) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n this.value.update(v => this.clampValue(v - this.step()));\n event.preventDefault();\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n this.value.update(v => this.clampValue(v + this.step()));\n event.preventDefault();\n break;\n case 'Home':\n this.value.set(this.min());\n this.onDragEnd();\n event.preventDefault();\n break;\n case 'End':\n this.value.set(this.max());\n this.onDragEnd();\n event.preventDefault();\n break;\n }\n }\n\n protected thumbClicked(event: PointerEvent) {\n event.stopPropagation();\n }\n protected trackClicked(event: PointerEvent) {\n if (this.readonly() || this.disabled()) {\n return;\n }\n const trackEl = this._track().nativeElement;\n const trackRect = trackEl.getBoundingClientRect();\n const clickPosition = this.vertical()\n ? event.clientY - trackRect.top\n : event.clientX - trackRect.left;\n this.dragToPosition(\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\n );\n }\n}\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\n <div\n #thumb\n [ptInt]=\"this\"\n [ptClass]=\"'thumb'\"\n ngnDrag\n (dragged)=\"onDragged($event)\"\n (dragEnd)=\"onDragEnd()\"\n [style.--valuePercent.%]=\"left()\"\n (click)=\"thumbClicked($event)\"\n ></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAKA;;AAEG;AAsBG,MAAO,SAAU,SAAQ,gBAAkC,CAAA;AAC5C,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE;AACzE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;QAClC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClC,QAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAChC,KAAA,CAAC;AAEe,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAA6B,OAAO,CAAC;AAEjF;;;AAGG;IACa,GAAG,GAAG,KAAK,CAAS,CAAC;4EAAC;AAEtC;;;AAGG;IACa,QAAQ,GAAG,KAAK,CAAU,KAAK;iFAAC;AAEhD;;;AAGG;IACa,GAAG,GAAG,KAAK,CAAS,GAAG;4EAAC;AAExC;;;AAGG;IACa,IAAI,GAAG,KAAK,CAAS,CAAC;6EAAC;AAEvC;;;AAGG;AACa,IAAA,SAAS,GAAG,KAAK;6FAAU;AAE3C;;;AAGG;AACa,IAAA,WAAW,GAAG,KAAK;+FAA6B;AAE7C,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG;AAC/E,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;6EAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;IACT;AAEmB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;QACtC,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC;AACA,QAAA,OAAO,IAAI;IACb,CAAC;uFAAC;AAEQ,IAAA,SAAS,CAAC,KAAkB,EAAA;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AACrE,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;IAChC;AAEQ,IAAA,cAAc,CAAC,SAAiB,EAAA;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACjD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI;AACnE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK;AACxE,QAAA,MAAM,eAAe,GAAG,SAAS,GAAG,UAAU;AAC9C,QAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,QAAQ;cAC1C,WAAW,GAAG;cACd,eAAe;AACnB,QAAA,MAAM,eAAe,GAAG,wBAAwB,GAAG,WAAW;QAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAClF,QAAA,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACvF,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/C;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D;AAEU,IAAA,SAAS,KAAI;AAEb,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;AACA,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,WAAW;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB;;IAEN;AAEU,IAAA,YAAY,CAAC,KAAmB,EAAA;QACxC,KAAK,CAAC,eAAe,EAAE;IACzB;AACU,IAAA,YAAY,CAAC,KAAmB,EAAA;QACxC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACtC;QACF;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE;AACjD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;AACjC,cAAE,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;cAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI;QAClC,IAAI,CAAC,cAAc,CACjB,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,aAAa,GAAG,SAAS,CAAC,IAAI,GAAG,aAAa,CACjF;IACH;uGA5IW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,eAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,8BAAA,EAAA,eAAA,EAAA,0BAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,4CAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,SAAA,EAjBT,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZrC,qkBAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAkBb,SAAS,EAAA,UAAA,EAAA,CAAA;kBArBrB,SAAS;+BACE,YAAY,EAAA,OAAA,EAEb,CAAC,KAAK,EAAE,OAAO,CAAC,EAAA,SAAA,EACd,CAAC,WAAW,CAAA,SAAA,CAAW,CAAC,EAAA,IAAA,EAC7B;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,OAAO;AAC/B,wBAAA,sBAAsB,EAAE,SAAS;AACjC,wBAAA,sBAAsB,EAAE,4BAA4B;AACpD,wBAAA,iBAAiB,EAAE,wBAAwB;AAC3C,wBAAA,wBAAwB,EAAE,cAAc;AACxC,wBAAA,mBAAmB,EAAE,SAAS;AAC9B,wBAAA,yBAAyB,EAAE,wCAAwC;AACnE,wBAAA,uBAAuB,EAAE,kBAAkB;AAC3C,wBAAA,YAAY,EAAE,qBAAqB;AACnC,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,QAAQ,EAAE,eAAe;AAC1B,qBAAA,EAAA,QAAA,EAAA,qkBAAA,EAAA;8FAUwE,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErClF;;AAEG;;;;"}
@@ -365,6 +365,19 @@ class NgnSplitter extends NgnBase {
365
365
  const panels = this.panels();
366
366
  this.updateDividers(panels);
367
367
  });
368
+ // Measure divider positions in the after-render phase (post-layout) and cache
369
+ // them in a signal. Reading DOM offsets directly in the template binding causes
370
+ // NG0100, since the grid sizes are applied in the same CD cycle and the reflow
371
+ // settles the measured value between the CD and verify passes.
372
+ afterRenderEffect(() => {
373
+ const values = this.measureDividerValues();
374
+ untracked(() => {
375
+ const prev = this._dividerValues();
376
+ if (values.length !== prev.length || values.some((v, i) => v !== prev[i])) {
377
+ this._dividerValues.set(values);
378
+ }
379
+ });
380
+ });
368
381
  registerState({
369
382
  storage: () => this.stateStorage(),
370
383
  key: () => this.stateKey(),
@@ -527,28 +540,46 @@ class NgnSplitter extends NgnBase {
527
540
  }
528
541
  }
529
542
  }
543
+ /** Cached divider positions (percentage) measured post-layout; see the after-render effect in the constructor. */
544
+ _dividerValues = signal([], /* @ts-ignore */
545
+ ...(ngDevMode ? [{ debugName: "_dividerValues" }] : /* istanbul ignore next */ []));
530
546
  /**
531
547
  * The divider's current position as a percentage (0–100) of the total panel
532
548
  * content size, used for `aria-valuenow` on the `role="separator"` handle.
533
- * Reads `gridTemplateSizes()` to stay reactive to resizes, then measures the
534
- * rendered panel sizes on either side of the divider.
549
+ * Reads the cached value measured in the after-render phase.
535
550
  */
536
551
  dividerValueNow(index) {
552
+ return this._dividerValues()[index] ?? 0;
553
+ }
554
+ /**
555
+ * Measures each divider's position as a percentage (0–100) of the total panel
556
+ * content size. Reads `gridTemplateSizes()`, `elementSize()` and `dragContext()`
557
+ * as reactive triggers, then measures the rendered panel sizes.
558
+ */
559
+ measureDividerValues() {
537
560
  // ponytail: DOM-offset heuristic; one CD-frame lag during drag is fine for
538
561
  // an aria value. Swap for an engine-reported px signal if exactness matters.
539
- this.calculator().gridTemplateSizes(); // reactive trigger
540
- const panels = this.calculator().orderedPanels();
562
+ const calculator = this.calculator();
563
+ calculator.gridTemplateSizes(); // reactive trigger
564
+ calculator.dragContext(); // reactive trigger (live update during drag)
565
+ this.elementSize(); // reactive trigger (container resize)
566
+ const panels = calculator.orderedPanels();
541
567
  const horizontal = this.layout() === 'horizontal';
542
- let before = 0;
543
- let total = 0;
544
- panels.forEach((panel, i) => {
568
+ const sizes = panels.map(panel => {
545
569
  const el = panel.element.nativeElement;
546
- const size = horizontal ? el.offsetWidth : el.offsetHeight;
547
- total += size;
548
- if (i <= index)
549
- before += size;
570
+ return horizontal ? el.offsetWidth : el.offsetHeight;
550
571
  });
551
- return total > 0 ? Math.round((before / total) * 100) : 0;
572
+ const total = sizes.reduce((a, b) => a + b, 0);
573
+ if (total <= 0)
574
+ return [];
575
+ // One value per divider: cumulative size up to and including panel i.
576
+ const values = [];
577
+ let before = 0;
578
+ for (let i = 0; i < panels.length - 1; i++) {
579
+ before += sizes[i];
580
+ values.push(Math.round((before / total) * 100));
581
+ }
582
+ return values;
552
583
  }
553
584
  getStepInPx() {
554
585
  const step = this.step();
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-splitter.mjs","sources":["../../src/splitter/panel/splitter-panel.ts","../../src/splitter/panel/splitter-panel.html","../../src/splitter/splitter-calculator.ts","../../src/splitter/utils.ts","../../src/splitter/splitter.ts","../../src/splitter/splitter.html","../../src/splitter/module.ts","../../src/splitter/ngneers-controls-splitter.ts"],"sourcesContent":["import { Component, computed, input, model } from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\nimport { generateElementId } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport type { SplitterPanelSize, SplitterPanelSizeLimit } from '../types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter-panel',\n templateUrl: './splitter-panel.html',\n providers: [provideSelf(NgnSplitterPanel)],\n host: {\n role: 'region',\n '[style.grid-area]': 'gridArea()',\n '[aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n})\nexport class NgnSplitterPanel extends NgnBase<'splitter'> {\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, 'panel');\n private readonly _fallbackAreaName = generateElementId();\n\n /**\n * The name of the panel, used to identify it in the persisted splitter state and in {@link NgnSplitter.panelOrder}.\n * If nullish, a generated fallback name is used.\n */\n public readonly name = input<string | null>();\n /**\n * The size of the panel along the splitter's layout axis. Accepts `fr` or `px` units.\n * @default 1fr\n */\n public readonly size = model<SplitterPanelSize>('1fr');\n /**\n * The minimum size the panel can be resized to.\n * @default 0px\n */\n public readonly minSize = model<SplitterPanelSizeLimit>('0px');\n /**\n * The maximum size the panel can be resized to.\n * @default 100%\n */\n public readonly maxSize = model<SplitterPanelSizeLimit>('100%');\n\n /**\n * Sets the `aria-label` for the panel region.\n */\n public readonly ariaLabel = input<string | null>();\n /**\n * Sets the `aria-labelledby` for the panel region.\n */\n public readonly ariaLabelledBy = input<string | null>();\n\n protected readonly gridArea = computed(() => this.name() ?? this._fallbackAreaName);\n}\n","<ng-content />\n","import { computed, EmbeddedViewRef, signal, type Signal } from '@angular/core';\nimport {\n ResizeEngine,\n type ResizableItem,\n type ResizeDistributionMode,\n type ResizeSize,\n} from '@ngneers/controls/api/resize';\nimport { Logger, throwExp } from '@ngneers/controls/utils';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\nimport type { SplitterLayout } from './types';\n\n/**\n * Type interface for the {@link SplitterCalculator} interface.\n */\nexport interface SplitterCalculatorType {\n new (splitter: NgnSplitter): SplitterCalculator;\n}\n\n/**\n * Represents a calculator for the {@link NgnSplitter} component, handling panel sizes, drag events, and min/max size constraints.\n * This interface defines the methods and properties required for managing the splitter's layout and behavior.\n */\nexport interface SplitterCalculator {\n /**\n * Signal that provides the ordered list of panels in the splitter.\n */\n orderedPanels: Signal<readonly NgnSplitterPanel[]>;\n\n /**\n * Signal that provides the grid template sizes for the splitter (to use in `grid-template-rows` or `grid-template-columns` CSS properties).\n */\n gridTemplateSizes: Signal<string>;\n\n /**\n * Signal that provides the grid template areas for the splitter (to use in `grid-template-areas` CSS property).\n */\n gridTemplateAreas: Signal<string | null>;\n\n /**\n * Signal that provides the current drag context. Returns `null` if no drag is in progress.\n */\n dragContext: Signal<SplitterDragContext | null>;\n\n /**\n * Signal that provides the minimum size of the splitter, calculated based on the panels' min sizes and dividers.\n */\n minSize: Signal<string>;\n\n /**\n * Signal that provides the maximum size of the splitter, calculated based on the panels' max sizes and dividers.\n */\n maxSize: Signal<string>;\n\n /**\n * Starts a drag operation for the specified divider index.\n * @param index The index of the divider to start dragging.\n * @param event The pointer event that initiated the drag.\n */\n startDrag(index: number, event: PointerEvent): void;\n\n /**\n * Handles the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that is being processed during the drag.\n */\n drag(index: number, event: PointerEvent): void;\n\n /**\n * Ends the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that ended the drag.\n * @param isCancel Whether the drag operation was cancelled. If true, the panel sizes will be reset to their original values.\n */\n endDrag(index: number, event: PointerEvent, isCancel: boolean): void;\n\n /**\n * Moves the divider at the specified index by the given pixel delta.\n * @param index The index of the divider to move.\n * @param pxDelta The pixel delta to move the divider by. Positive values move the divider to the right (or down), negative values move it to the left (or up).\n */\n moveDivider(index: number, pxDelta: number): void;\n}\n\n/**\n * Represents the context of a drag operation in the splitter.\n */\nexport type SplitterDragContext = {\n /**\n * The index of the divider being dragged.\n */\n dividerIndex: number;\n /**\n * The ID of the pointer that initiated the drag operation.\n */\n pointerId: number;\n /**\n * The starting position of the pointer when the drag operation started, in pixels.\n */\n startPosition: number;\n};\n\n/**\n * Default implementation of the {@link SplitterCalculator} interface.\n * Delegates all resize math to the generic {@link ResizeEngine}.\n */\nexport class DefaultSplitterCalculator implements SplitterCalculator {\n protected readonly panels: Signal<readonly NgnSplitterPanel[]>;\n protected readonly dividers: Signal<readonly EmbeddedViewRef<unknown>[]>;\n protected readonly panelOrder: Signal<readonly string[] | null | undefined>;\n protected readonly layout: Signal<SplitterLayout>;\n protected readonly splitterSize: Signal<number>;\n\n private readonly _engine: ResizeEngine;\n\n constructor(splitter: NgnSplitter) {\n this.panels = splitter.panels;\n this.dividers = splitter.dividers;\n this.panelOrder = splitter.panelOrder;\n this.layout = splitter.layout;\n this.splitterSize = computed(() =>\n this.layout() === 'vertical' ? splitter.elementSize().height : splitter.elementSize().width\n );\n\n // Create the resize engine with panels mapped as ResizableItems\n this._engine = new ResizeEngine({\n items: computed(() => this.orderedPanels() as unknown as readonly ResizableItem[]),\n containerSize: this.splitterSize,\n gapSizes: this.dividerSizes,\n distributionMode: computed(\n () => (splitter.resizeMode?.() ?? 'adjacent') as ResizeDistributionMode\n ),\n containerConstrained: signal(true), // Splitter is always constrained\n lockSizes: computed(() => splitter.lockSizes?.() ?? false),\n });\n }\n\n public readonly orderedPanels = computed(() => {\n const panels = this.panels();\n const order = this.panelOrder();\n return order\n ? [...panels].sort((a, b) => {\n const aIndex = order.indexOf(a['gridArea']());\n const bIndex = order.indexOf(b['gridArea']());\n if (aIndex === -1 && bIndex === -1) return 0;\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n })\n : panels;\n });\n\n public readonly gridTemplateSizes = computed(() => this._engine.gridTemplateSizes());\n\n public readonly gridTemplateAreas = computed(() => {\n const panels = this.orderedPanels();\n if (panels.length === 0) return null;\n let result = '';\n panels.forEach((panel, i) => {\n if (i > 0) {\n result +=\n this.layout() === 'horizontal' ? ` ngn-divider-${i - 1} ` : ` \"ngn-divider-${i - 1}\" `;\n }\n result += this.layout() === 'horizontal' ? panel['gridArea']() : `\"${panel['gridArea']()}\"`;\n });\n return this.layout() === 'horizontal' ? `\"${result}\"` : result;\n });\n\n public readonly minSize = computed(() => this._engine.minTotalSize());\n\n public readonly maxSize = computed(() => this._engine.maxTotalSize());\n\n public readonly dragContext = signal<SplitterDragContext | null>(null);\n\n protected readonly dividerSizes = computed(() =>\n this.dividers().map(d => {\n const el = d.rootNodes.find(x => x instanceof HTMLElement);\n return el ? (this.layout() === 'horizontal' ? el.offsetWidth : el.offsetHeight) : 0;\n })\n );\n\n public startDrag(index: number, event: PointerEvent) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const startPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n\n this.dragContext.set({\n dividerIndex: index,\n pointerId: event.pointerId,\n startPosition,\n });\n\n this._engine.startDrag(index, startPosition);\n }\n\n public drag(index: number, event: PointerEvent) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n const currentPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n this._engine.drag(index, currentPosition);\n }\n\n public endDrag(index: number, event: PointerEvent, isCancel: boolean) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n this._engine.endDrag(index, isCancel);\n this.dragContext.set(null);\n }\n\n public moveDivider(index: number, pxDelta: number) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const leftPanel =\n panels[index] ??\n throwExp('NgnSplitterCalculator', `Left panel is missing for divider at index ${index}`);\n const rightPanel =\n panels[index + 1] ??\n throwExp('NgnSplitterCalculator', `Right panel is missing for divider at index ${index}`);\n\n if (\n !this._engine.isItemSizeCalculated(leftPanel as unknown as ResizableItem) ||\n !this._engine.isItemSizeCalculated(rightPanel as unknown as ResizableItem)\n ) {\n Logger.warn('Cannot move divider, panel sizes are not calculated');\n return;\n }\n\n this._engine.moveDivider(index, pxDelta);\n }\n\n /**\n * Ensures all panels respect their min/max size constraints.\n * Delegates to the underlying {@link ResizeEngine}.\n */\n public ensureMinMaxSizes() {\n this._engine.ensureMinMaxSizes();\n }\n\n /** @internal — used by tests to seed panel sizes into the engine. */\n public setPanelSize(panel: NgnSplitterPanel, size: string) {\n this._engine.setItemSize(panel as unknown as ResizableItem, size as ResizeSize);\n }\n}\n","import type {\n SplitterPanelSize,\n SplitterPanelSizeLimit,\n SplitterPanelSizeLimitUnit,\n SplitterPanelSizeUnit,\n} from './types';\n\nexport type ExpandedSplitterPanelSize = {\n value: number;\n unit: SplitterPanelSizeUnit;\n};\nexport type ExpandedSplitterPanelSizeLimit = {\n value: number;\n unit: SplitterPanelSizeLimitUnit;\n};\n\nexport function isSplitterPanelSize(value: unknown): value is SplitterPanelSize {\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 getSplitterPanelSizeUnit(value: SplitterPanelSize): SplitterPanelSizeUnit {\n return value.slice(-2) as SplitterPanelSizeUnit;\n}\n\nexport function getSplitterPanelSizeValue(value: SplitterPanelSize): number {\n return parseFloat(value.slice(0, -2));\n}\n\nexport function isSplitterPanelSizeLimit(value: unknown): value is SplitterPanelSize {\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 getSplitterPanelSizeLimitUnit(\n value: SplitterPanelSizeLimit\n): SplitterPanelSizeLimitUnit {\n return value.endsWith('px') ? 'px' : '%';\n}\n\nexport function getSplitterPanelSizeLimitValue(value: SplitterPanelSizeLimit): number {\n return value.endsWith('px') ? parseFloat(value.slice(0, -2)) : parseFloat(value.slice(0, -1));\n}\n\nexport function getSplitterPanelSizeLimitInPx(\n value: SplitterPanelSizeLimit,\n totalSize: number\n): number {\n const unit = getSplitterPanelSizeLimitUnit(value);\n const sizeValue = getSplitterPanelSizeLimitValue(value);\n return unit === 'px' ? sizeValue : (sizeValue / 100) * totalSize;\n}\n\nexport function expandSplitterPanelSize(value: SplitterPanelSize): ExpandedSplitterPanelSize {\n return {\n value: getSplitterPanelSizeValue(value),\n unit: getSplitterPanelSizeUnit(value),\n };\n}\n\nexport function expandSplitterPanelSizeLimit(\n value: SplitterPanelSizeLimit\n): ExpandedSplitterPanelSizeLimit {\n return {\n value: getSplitterPanelSizeLimitValue(value),\n unit: getSplitterPanelSizeLimitUnit(value),\n };\n}\n\nexport function collapseSplitterPanelSize(size: ExpandedSplitterPanelSize): SplitterPanelSize {\n return `${size.value}${size.unit}`;\n}\n\nexport function collapseSplitterPanelSizeLimit(\n size: ExpandedSplitterPanelSizeLimit\n): SplitterPanelSizeLimit {\n return `${size.value}${size.unit}`;\n}\n","import {\n afterRenderEffect,\n Component,\n computed,\n contentChildren,\n EmbeddedViewRef,\n inject,\n input,\n model,\n type OnDestroy,\n output,\n runInInjectionContext,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n elementSizeSignal,\n NGN_CONFIG,\n NgnTemplate,\n templateTypeFn,\n} from '@ngneers/controls/api/ng';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { Logger, NgnError } from '@ngneers/controls/utils';\nimport { type NgnStateStorage, registerState } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { DefaultSplitterCalculator, type SplitterCalculatorType } from './splitter-calculator';\nimport { isSplitterPanelSize } from './utils';\n\nimport type { SplitterLayout, SplitterResizeMode, SplitterState, SplitterStateData } from './types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter',\n templateUrl: './splitter.html',\n imports: [NgnPt, NgnTemplate],\n providers: [provideSelf(NgnSplitter)],\n host: {\n role: 'region',\n '[style.grid-template-columns]': `layout() === 'horizontal' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-rows]': `layout() === 'vertical' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-areas]': 'calculator().gridTemplateAreas()',\n '[style.max-width]': `layout() === 'horizontal' ? calculator().maxSize() : null`,\n '[style.max-height]': `layout() === 'vertical' ? calculator().maxSize() : null`,\n '[style.min-width]': `layout() === 'horizontal' ? calculator().minSize() : null`,\n '[style.min-height]': `layout() === 'vertical' ? calculator().minSize() : null`,\n },\n})\nexport class NgnSplitter extends NgnBase<'splitter'> implements OnDestroy {\n private readonly _viewContainer = inject(ViewContainerRef);\n private readonly _config = inject(NGN_CONFIG);\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, {\n root: true,\n dragging: () => this.isDragging(),\n horizontal: () => this.layout() === 'horizontal',\n vertical: () => this.layout() === 'vertical',\n });\n protected readonly translations = inject(I18n).translations;\n\n /**\n * The layout of the splitter.\n */\n public readonly layout = model.required<SplitterLayout>();\n /**\n * A array of panel names that defines the order of panels.\n * If nullish, the order is determined by the order the panels are defined in the template.\n */\n public readonly panelOrder = model<string[] | null>();\n /**\n * The storage to use for saving the splitter state.\n * @default `session`\n */\n public readonly stateStorage = input<NgnStateStorage>(\n this._config.defaults.splitter.stateStorage\n );\n /**\n * The key to use for saving the splitter state.\n * If nullish, the state will not be saved.\n */\n public readonly stateKey = input<string | null>();\n /**\n * The type of data to save in the splitter state.\n * @default `['layout', 'panelOrder', 'panelSizes']`\n */\n public readonly stateData = input<readonly SplitterStateData[]>([\n 'layout',\n 'panelOrder',\n 'panelSizes',\n ]);\n /**\n * The type of calculator to use for the splitter.\n * @default `DefaultSplitterCalculator`\n */\n public readonly calculatorType = input<SplitterCalculatorType>(DefaultSplitterCalculator);\n /**\n * The resize distribution mode for the splitter.\n * - `'adjacent'`: Only the panels adjacent to the divider are resized.\n * - `'proportional'`: The deficit is distributed proportionally across all panels on the other side.\n * @default adjacent\n */\n public readonly resizeMode = input<SplitterResizeMode>('adjacent');\n /**\n * Whether to lock affected panels to fixed `px` values after a resize completes.\n * When `true`, panels whose size changed are converted from their original unit to `px`.\n * When `false`, panels keep their original units (`fr`, `px`).\n * @default false\n */\n public readonly lockSizes = input<boolean>(false);\n /**\n * The step size for moving the dividers using the keyboard.\n * This can be a pixel value (e.g., '5px') or a percentage value (e.g., '5%').\n * If a percentage is used, it will be calculated based on the size of the splitter element.\n * @default '5px'\n */\n public readonly step = input<`${number}${'%' | 'px'}`>('5px');\n\n /**\n * Event emitted when the splitter state is being saved.\n * This can be used to modify the state before it is saved.\n */\n public readonly stateSaving = output<SplitterState>();\n /**\n * Event emitted when the splitter state is loaded.\n * This can be used to modify the state before it is applied or to perform actions based on the loaded state.\n */\n public readonly stateLoading = output<SplitterState>();\n\n protected readonly dividerTemplateType = templateTypeFn<never, { index: number }>();\n private readonly _dividerTemplate =\n viewChild.required<TemplateRef<typeof this.dividerTemplateType>>('defaultDividerTemplate');\n\n /**\n * The current dividers in the splitter.\n */\n public readonly dividers = signal<EmbeddedViewRef<typeof this.dividerTemplateType>[]>([]);\n /**\n * The current panels in the splitter.\n */\n public readonly panels = contentChildren(NgnSplitterPanel);\n /**\n * The current size of the splitter element.\n */\n public readonly elementSize = elementSizeSignal(this.element);\n\n /**\n * A value indicating whether the splitter is currently being dragged.\n */\n public readonly isDragging = computed(() => this.calculator().dragContext() !== null);\n\n protected readonly calculator = computed(() => {\n const calculatorType = this.calculatorType();\n return untracked(() => runInInjectionContext(this.injector, () => new calculatorType(this)));\n });\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n const panels = this.panels();\n this.updateDividers(panels);\n });\n\n registerState({\n storage: () => this.stateStorage(),\n key: () => this.stateKey(),\n valueFn: this.computeState.bind(this),\n onLoad: this.onStateLoad.bind(this),\n debounce: 100,\n });\n }\n\n public ngOnDestroy(): void {\n // Clean up dividers\n this.dividers().forEach(divider => divider.destroy());\n this.dividers.set([]);\n }\n\n protected onHandlePointerDown(index: number, event: PointerEvent) {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n throw new Error('Event target is not an HTMLElement');\n }\n // Make sure the element is stable before capturing the pointer\n requestAnimationFrame(() => {\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Ignore errors if the element is not capable of capturing the pointer\n }\n });\n\n this.calculator().startDrag(index, event);\n }\n\n protected onHandlePointerMove(index: number, event: PointerEvent) {\n this.calculator().drag(index, event);\n }\n\n protected onHandlePointerUp(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, false);\n }\n\n protected onHandlePointerCancel(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, true);\n }\n\n protected onHandleKeyDown(index: number, event: KeyboardEvent) {\n if (\n (event.key === 'ArrowLeft' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowUp' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, -this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (\n (event.key === 'ArrowRight' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowDown' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'Home') {\n this.calculator().moveDivider(index, Number.NEGATIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'End') {\n this.calculator().moveDivider(index, Number.POSITIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n }\n }\n\n private updateDividers(panels: readonly NgnSplitterPanel[]) {\n this.dividers.update(divider => {\n if (divider.length === panels.length - 1) {\n return divider; // No need to update if the number of dividers matches the number of panels\n } else if (divider.length < panels.length - 1) {\n // Add missing dividers\n const newDividers = [...divider];\n for (let i = divider.length; i < panels.length - 1; i++) {\n newDividers.push(this.createDivider(i));\n }\n return newDividers;\n } else {\n // More dividers than needed, remove the excess\n divider.slice(panels.length - 1).forEach(divider => divider.destroy());\n return divider.slice(0, panels.length - 1);\n }\n });\n\n // Move dividers to the correct positions (skip first panel — no divider before it)\n for (let i = 1; i < panels.length; i++) {\n const panel = panels[i]!;\n const divider = this.dividers()[i - 1];\n if (!divider) {\n throw new NgnError('NgnSplitter', `Divider is missing for panel at index ${i}`);\n }\n this.moveDividerBefore(panel, divider);\n }\n }\n\n private createDivider(index: number) {\n const viewRef = this._viewContainer.createEmbeddedView(this._dividerTemplate(), { index });\n viewRef.detectChanges();\n return viewRef;\n }\n\n private moveDividerBefore(panel: NgnSplitterPanel, divider: EmbeddedViewRef<unknown>) {\n const panelElement = panel.element.nativeElement;\n divider.rootNodes.forEach(node => {\n if (node instanceof HTMLElement) {\n panelElement.parentElement?.insertBefore(node, panelElement);\n }\n });\n }\n\n private computeState(previousState: SplitterState | null) {\n const data = this.stateData();\n const state: SplitterState = {\n layout: data.includes('layout') ? this.layout() : undefined,\n panelOrder: data.includes('panelOrder') ? this.panelOrder() : undefined,\n panelSizes: data.includes('panelSizes')\n ? this.panels().reduce(\n (acc, panel, index) => {\n acc[panel.name() || `ngn-panel-${index}`] = panel.size();\n return acc;\n },\n { ...previousState?.panelSizes }\n )\n : undefined,\n };\n\n this.stateSaving.emit(state);\n\n return state;\n }\n\n private onStateLoad(state: SplitterState | null) {\n if (state) {\n this.ensureValidState(state);\n this.stateLoading.emit(state);\n this.applyFromState(state);\n }\n return state;\n }\n\n private ensureValidState(state: SplitterState): void {\n if (state.layout && state.layout !== 'horizontal' && state.layout !== 'vertical') {\n Logger.warn(`Invalid layout in saved splitter state.`, { state });\n delete state.layout;\n }\n\n if (\n state.panelOrder &&\n (!Array.isArray(state.panelOrder) || state.panelOrder.some(x => typeof x !== 'string'))\n ) {\n Logger.warn(`Invalid panelOrder in saved splitter state.`, { state });\n delete state.panelOrder;\n }\n\n if (\n state.panelSizes &&\n (typeof state.panelSizes !== 'object' ||\n state.panelSizes === null ||\n Object.values(state.panelSizes).some(x => !isSplitterPanelSize(x)))\n ) {\n Logger.warn(`Invalid panelSizes in saved splitter state.`, { state });\n delete state.panelSizes;\n }\n }\n\n private applyFromState(state: SplitterState) {\n if (state.layout && this.stateData().includes('layout')) {\n this.layout.set(state.layout);\n }\n if (state.panelOrder && this.stateData().includes('panelOrder')) {\n this.panelOrder.set(state.panelOrder);\n }\n if (state.panelSizes && this.stateData().includes('panelSizes')) {\n const panels = this.panels();\n for (let i = 0; i < panels.length; i++) {\n const panelName = panels[i]?.name() || `ngn-panel-${i}`;\n if (panelName in state.panelSizes) {\n const panelSize = state.panelSizes[panelName];\n if (!panelSize) {\n continue;\n }\n panels[i]?.size.set(panelSize);\n }\n }\n }\n }\n\n /**\n * The divider's current position as a percentage (0–100) of the total panel\n * content size, used for `aria-valuenow` on the `role=\"separator\"` handle.\n * Reads `gridTemplateSizes()` to stay reactive to resizes, then measures the\n * rendered panel sizes on either side of the divider.\n */\n protected dividerValueNow(index: number): number {\n // ponytail: DOM-offset heuristic; one CD-frame lag during drag is fine for\n // an aria value. Swap for an engine-reported px signal if exactness matters.\n this.calculator().gridTemplateSizes(); // reactive trigger\n const panels = this.calculator().orderedPanels();\n const horizontal = this.layout() === 'horizontal';\n let before = 0;\n let total = 0;\n panels.forEach((panel, i) => {\n const el = panel.element.nativeElement;\n const size = horizontal ? el.offsetWidth : el.offsetHeight;\n total += size;\n if (i <= index) before += size;\n });\n return total > 0 ? Math.round((before / total) * 100) : 0;\n }\n\n private getStepInPx(): number {\n const step = this.step();\n if (step.endsWith('px')) {\n return parseFloat(step.slice(0, -2));\n } else if (step.endsWith('%')) {\n const size =\n this.layout() === 'horizontal' ? this.elementSize().width : this.elementSize().height;\n return (parseFloat(step.slice(0, -1)) / 100) * size;\n } else {\n Logger.warn(`Invalid step value: ${step}.`);\n return 10; // Default step in pixels\n }\n }\n}\n","<ng-content />\n\n<ng-template #defaultDividerTemplate [ngnTemplate]=\"dividerTemplateType\" let-index=\"index\">\n <div\n [style.grid-area]=\"`ngn-divider-${index}`\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n divider: true,\n 'divider-dragging': calculator().dragContext()?.dividerIndex === index,\n }\"\n >\n <button\n role=\"separator\"\n [aria-orientation]=\"layout()\"\n [aria-label]=\"translations['splitter_handleLabel']()\"\n [attr.aria-valuenow]=\"dividerValueNow(index)\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [ptInt]=\"this\"\n [ptClass]=\"'divider-handle'\"\n (pointerdown)=\"onHandlePointerDown(index, $event)\"\n (pointermove)=\"onHandlePointerMove(index, $event)\"\n (pointerup)=\"onHandlePointerUp(index, $event)\"\n (pointercancel)=\"onHandlePointerCancel(index, $event)\"\n (keydown)=\"onHandleKeyDown(index, $event)\"\n ></button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\n// This module is just for grouping the Splitter and SplitterPanel components for convenience.\n// The components are standalone and can be used without this module.\n\n@NgModule({\n imports: [NgnSplitter, NgnSplitterPanel],\n exports: [NgnSplitter, NgnSplitterPanel],\n})\nexport class NgnSplitterModule {}\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-splitter.mjs","sources":["../../src/splitter/panel/splitter-panel.ts","../../src/splitter/panel/splitter-panel.html","../../src/splitter/splitter-calculator.ts","../../src/splitter/utils.ts","../../src/splitter/splitter.ts","../../src/splitter/splitter.html","../../src/splitter/module.ts","../../src/splitter/ngneers-controls-splitter.ts"],"sourcesContent":["import { Component, computed, input, model } from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\nimport { generateElementId } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport type { SplitterPanelSize, SplitterPanelSizeLimit } from '../types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter-panel',\n templateUrl: './splitter-panel.html',\n providers: [provideSelf(NgnSplitterPanel)],\n host: {\n role: 'region',\n '[style.grid-area]': 'gridArea()',\n '[aria-label]': 'ariaLabel()',\n '[attr.aria-labelledby]': 'ariaLabelledBy()',\n },\n})\nexport class NgnSplitterPanel extends NgnBase<'splitter'> {\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, 'panel');\n private readonly _fallbackAreaName = generateElementId();\n\n /**\n * The name of the panel, used to identify it in the persisted splitter state and in {@link NgnSplitter.panelOrder}.\n * If nullish, a generated fallback name is used.\n */\n public readonly name = input<string | null>();\n /**\n * The size of the panel along the splitter's layout axis. Accepts `fr` or `px` units.\n * @default 1fr\n */\n public readonly size = model<SplitterPanelSize>('1fr');\n /**\n * The minimum size the panel can be resized to.\n * @default 0px\n */\n public readonly minSize = model<SplitterPanelSizeLimit>('0px');\n /**\n * The maximum size the panel can be resized to.\n * @default 100%\n */\n public readonly maxSize = model<SplitterPanelSizeLimit>('100%');\n\n /**\n * Sets the `aria-label` for the panel region.\n */\n public readonly ariaLabel = input<string | null>();\n /**\n * Sets the `aria-labelledby` for the panel region.\n */\n public readonly ariaLabelledBy = input<string | null>();\n\n protected readonly gridArea = computed(() => this.name() ?? this._fallbackAreaName);\n}\n","<ng-content />\n","import { computed, EmbeddedViewRef, signal, type Signal } from '@angular/core';\nimport {\n ResizeEngine,\n type ResizableItem,\n type ResizeDistributionMode,\n type ResizeSize,\n} from '@ngneers/controls/api/resize';\nimport { Logger, throwExp } from '@ngneers/controls/utils';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\nimport type { SplitterLayout } from './types';\n\n/**\n * Type interface for the {@link SplitterCalculator} interface.\n */\nexport interface SplitterCalculatorType {\n new (splitter: NgnSplitter): SplitterCalculator;\n}\n\n/**\n * Represents a calculator for the {@link NgnSplitter} component, handling panel sizes, drag events, and min/max size constraints.\n * This interface defines the methods and properties required for managing the splitter's layout and behavior.\n */\nexport interface SplitterCalculator {\n /**\n * Signal that provides the ordered list of panels in the splitter.\n */\n orderedPanels: Signal<readonly NgnSplitterPanel[]>;\n\n /**\n * Signal that provides the grid template sizes for the splitter (to use in `grid-template-rows` or `grid-template-columns` CSS properties).\n */\n gridTemplateSizes: Signal<string>;\n\n /**\n * Signal that provides the grid template areas for the splitter (to use in `grid-template-areas` CSS property).\n */\n gridTemplateAreas: Signal<string | null>;\n\n /**\n * Signal that provides the current drag context. Returns `null` if no drag is in progress.\n */\n dragContext: Signal<SplitterDragContext | null>;\n\n /**\n * Signal that provides the minimum size of the splitter, calculated based on the panels' min sizes and dividers.\n */\n minSize: Signal<string>;\n\n /**\n * Signal that provides the maximum size of the splitter, calculated based on the panels' max sizes and dividers.\n */\n maxSize: Signal<string>;\n\n /**\n * Starts a drag operation for the specified divider index.\n * @param index The index of the divider to start dragging.\n * @param event The pointer event that initiated the drag.\n */\n startDrag(index: number, event: PointerEvent): void;\n\n /**\n * Handles the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that is being processed during the drag.\n */\n drag(index: number, event: PointerEvent): void;\n\n /**\n * Ends the drag operation for the specified divider index.\n * @param index The index of the divider being dragged.\n * @param event The pointer event that ended the drag.\n * @param isCancel Whether the drag operation was cancelled. If true, the panel sizes will be reset to their original values.\n */\n endDrag(index: number, event: PointerEvent, isCancel: boolean): void;\n\n /**\n * Moves the divider at the specified index by the given pixel delta.\n * @param index The index of the divider to move.\n * @param pxDelta The pixel delta to move the divider by. Positive values move the divider to the right (or down), negative values move it to the left (or up).\n */\n moveDivider(index: number, pxDelta: number): void;\n}\n\n/**\n * Represents the context of a drag operation in the splitter.\n */\nexport type SplitterDragContext = {\n /**\n * The index of the divider being dragged.\n */\n dividerIndex: number;\n /**\n * The ID of the pointer that initiated the drag operation.\n */\n pointerId: number;\n /**\n * The starting position of the pointer when the drag operation started, in pixels.\n */\n startPosition: number;\n};\n\n/**\n * Default implementation of the {@link SplitterCalculator} interface.\n * Delegates all resize math to the generic {@link ResizeEngine}.\n */\nexport class DefaultSplitterCalculator implements SplitterCalculator {\n protected readonly panels: Signal<readonly NgnSplitterPanel[]>;\n protected readonly dividers: Signal<readonly EmbeddedViewRef<unknown>[]>;\n protected readonly panelOrder: Signal<readonly string[] | null | undefined>;\n protected readonly layout: Signal<SplitterLayout>;\n protected readonly splitterSize: Signal<number>;\n\n private readonly _engine: ResizeEngine;\n\n constructor(splitter: NgnSplitter) {\n this.panels = splitter.panels;\n this.dividers = splitter.dividers;\n this.panelOrder = splitter.panelOrder;\n this.layout = splitter.layout;\n this.splitterSize = computed(() =>\n this.layout() === 'vertical' ? splitter.elementSize().height : splitter.elementSize().width\n );\n\n // Create the resize engine with panels mapped as ResizableItems\n this._engine = new ResizeEngine({\n items: computed(() => this.orderedPanels() as unknown as readonly ResizableItem[]),\n containerSize: this.splitterSize,\n gapSizes: this.dividerSizes,\n distributionMode: computed(\n () => (splitter.resizeMode?.() ?? 'adjacent') as ResizeDistributionMode\n ),\n containerConstrained: signal(true), // Splitter is always constrained\n lockSizes: computed(() => splitter.lockSizes?.() ?? false),\n });\n }\n\n public readonly orderedPanels = computed(() => {\n const panels = this.panels();\n const order = this.panelOrder();\n return order\n ? [...panels].sort((a, b) => {\n const aIndex = order.indexOf(a['gridArea']());\n const bIndex = order.indexOf(b['gridArea']());\n if (aIndex === -1 && bIndex === -1) return 0;\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n })\n : panels;\n });\n\n public readonly gridTemplateSizes = computed(() => this._engine.gridTemplateSizes());\n\n public readonly gridTemplateAreas = computed(() => {\n const panels = this.orderedPanels();\n if (panels.length === 0) return null;\n let result = '';\n panels.forEach((panel, i) => {\n if (i > 0) {\n result +=\n this.layout() === 'horizontal' ? ` ngn-divider-${i - 1} ` : ` \"ngn-divider-${i - 1}\" `;\n }\n result += this.layout() === 'horizontal' ? panel['gridArea']() : `\"${panel['gridArea']()}\"`;\n });\n return this.layout() === 'horizontal' ? `\"${result}\"` : result;\n });\n\n public readonly minSize = computed(() => this._engine.minTotalSize());\n\n public readonly maxSize = computed(() => this._engine.maxTotalSize());\n\n public readonly dragContext = signal<SplitterDragContext | null>(null);\n\n protected readonly dividerSizes = computed(() =>\n this.dividers().map(d => {\n const el = d.rootNodes.find(x => x instanceof HTMLElement);\n return el ? (this.layout() === 'horizontal' ? el.offsetWidth : el.offsetHeight) : 0;\n })\n );\n\n public startDrag(index: number, event: PointerEvent) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const startPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n\n this.dragContext.set({\n dividerIndex: index,\n pointerId: event.pointerId,\n startPosition,\n });\n\n this._engine.startDrag(index, startPosition);\n }\n\n public drag(index: number, event: PointerEvent) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n const currentPosition = this.layout() === 'horizontal' ? event.clientX : event.clientY;\n this._engine.drag(index, currentPosition);\n }\n\n public endDrag(index: number, event: PointerEvent, isCancel: boolean) {\n const ctx = this.dragContext();\n if (!ctx || ctx.dividerIndex !== index || ctx.pointerId !== event.pointerId) return;\n\n this._engine.endDrag(index, isCancel);\n this.dragContext.set(null);\n }\n\n public moveDivider(index: number, pxDelta: number) {\n const panels = this.orderedPanels();\n if (index < 0 || index >= panels.length - 1) return;\n\n const leftPanel =\n panels[index] ??\n throwExp('NgnSplitterCalculator', `Left panel is missing for divider at index ${index}`);\n const rightPanel =\n panels[index + 1] ??\n throwExp('NgnSplitterCalculator', `Right panel is missing for divider at index ${index}`);\n\n if (\n !this._engine.isItemSizeCalculated(leftPanel as unknown as ResizableItem) ||\n !this._engine.isItemSizeCalculated(rightPanel as unknown as ResizableItem)\n ) {\n Logger.warn('Cannot move divider, panel sizes are not calculated');\n return;\n }\n\n this._engine.moveDivider(index, pxDelta);\n }\n\n /**\n * Ensures all panels respect their min/max size constraints.\n * Delegates to the underlying {@link ResizeEngine}.\n */\n public ensureMinMaxSizes() {\n this._engine.ensureMinMaxSizes();\n }\n\n /** @internal — used by tests to seed panel sizes into the engine. */\n public setPanelSize(panel: NgnSplitterPanel, size: string) {\n this._engine.setItemSize(panel as unknown as ResizableItem, size as ResizeSize);\n }\n}\n","import type {\n SplitterPanelSize,\n SplitterPanelSizeLimit,\n SplitterPanelSizeLimitUnit,\n SplitterPanelSizeUnit,\n} from './types';\n\nexport type ExpandedSplitterPanelSize = {\n value: number;\n unit: SplitterPanelSizeUnit;\n};\nexport type ExpandedSplitterPanelSizeLimit = {\n value: number;\n unit: SplitterPanelSizeLimitUnit;\n};\n\nexport function isSplitterPanelSize(value: unknown): value is SplitterPanelSize {\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 getSplitterPanelSizeUnit(value: SplitterPanelSize): SplitterPanelSizeUnit {\n return value.slice(-2) as SplitterPanelSizeUnit;\n}\n\nexport function getSplitterPanelSizeValue(value: SplitterPanelSize): number {\n return parseFloat(value.slice(0, -2));\n}\n\nexport function isSplitterPanelSizeLimit(value: unknown): value is SplitterPanelSize {\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 getSplitterPanelSizeLimitUnit(\n value: SplitterPanelSizeLimit\n): SplitterPanelSizeLimitUnit {\n return value.endsWith('px') ? 'px' : '%';\n}\n\nexport function getSplitterPanelSizeLimitValue(value: SplitterPanelSizeLimit): number {\n return value.endsWith('px') ? parseFloat(value.slice(0, -2)) : parseFloat(value.slice(0, -1));\n}\n\nexport function getSplitterPanelSizeLimitInPx(\n value: SplitterPanelSizeLimit,\n totalSize: number\n): number {\n const unit = getSplitterPanelSizeLimitUnit(value);\n const sizeValue = getSplitterPanelSizeLimitValue(value);\n return unit === 'px' ? sizeValue : (sizeValue / 100) * totalSize;\n}\n\nexport function expandSplitterPanelSize(value: SplitterPanelSize): ExpandedSplitterPanelSize {\n return {\n value: getSplitterPanelSizeValue(value),\n unit: getSplitterPanelSizeUnit(value),\n };\n}\n\nexport function expandSplitterPanelSizeLimit(\n value: SplitterPanelSizeLimit\n): ExpandedSplitterPanelSizeLimit {\n return {\n value: getSplitterPanelSizeLimitValue(value),\n unit: getSplitterPanelSizeLimitUnit(value),\n };\n}\n\nexport function collapseSplitterPanelSize(size: ExpandedSplitterPanelSize): SplitterPanelSize {\n return `${size.value}${size.unit}`;\n}\n\nexport function collapseSplitterPanelSizeLimit(\n size: ExpandedSplitterPanelSizeLimit\n): SplitterPanelSizeLimit {\n return `${size.value}${size.unit}`;\n}\n","import {\n afterRenderEffect,\n Component,\n computed,\n contentChildren,\n EmbeddedViewRef,\n inject,\n input,\n model,\n type OnDestroy,\n output,\n runInInjectionContext,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n elementSizeSignal,\n NGN_CONFIG,\n NgnTemplate,\n templateTypeFn,\n} from '@ngneers/controls/api/ng';\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\nimport { I18n } from '@ngneers/controls/i18n';\nimport { Logger, NgnError } from '@ngneers/controls/utils';\nimport { type NgnStateStorage, registerState } from '@ngneers/controls/utils-ng';\nimport { splitterControlTemplate } from '@ngneers/controls-themes/templates/splitter';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { DefaultSplitterCalculator, type SplitterCalculatorType } from './splitter-calculator';\nimport { isSplitterPanelSize } from './utils';\n\nimport type { SplitterLayout, SplitterResizeMode, SplitterState, SplitterStateData } from './types';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-splitter',\n templateUrl: './splitter.html',\n imports: [NgnPt, NgnTemplate],\n providers: [provideSelf(NgnSplitter)],\n host: {\n role: 'region',\n '[style.grid-template-columns]': `layout() === 'horizontal' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-rows]': `layout() === 'vertical' ? calculator().gridTemplateSizes() : null`,\n '[style.grid-template-areas]': 'calculator().gridTemplateAreas()',\n '[style.max-width]': `layout() === 'horizontal' ? calculator().maxSize() : null`,\n '[style.max-height]': `layout() === 'vertical' ? calculator().maxSize() : null`,\n '[style.min-width]': `layout() === 'horizontal' ? calculator().minSize() : null`,\n '[style.min-height]': `layout() === 'vertical' ? calculator().minSize() : null`,\n },\n})\nexport class NgnSplitter extends NgnBase<'splitter'> implements OnDestroy {\n private readonly _viewContainer = inject(ViewContainerRef);\n private readonly _config = inject(NGN_CONFIG);\n protected readonly theme = this.injectThemeTemplate(splitterControlTemplate, {\n root: true,\n dragging: () => this.isDragging(),\n horizontal: () => this.layout() === 'horizontal',\n vertical: () => this.layout() === 'vertical',\n });\n protected readonly translations = inject(I18n).translations;\n\n /**\n * The layout of the splitter.\n */\n public readonly layout = model.required<SplitterLayout>();\n /**\n * A array of panel names that defines the order of panels.\n * If nullish, the order is determined by the order the panels are defined in the template.\n */\n public readonly panelOrder = model<string[] | null>();\n /**\n * The storage to use for saving the splitter state.\n * @default `session`\n */\n public readonly stateStorage = input<NgnStateStorage>(\n this._config.defaults.splitter.stateStorage\n );\n /**\n * The key to use for saving the splitter state.\n * If nullish, the state will not be saved.\n */\n public readonly stateKey = input<string | null>();\n /**\n * The type of data to save in the splitter state.\n * @default `['layout', 'panelOrder', 'panelSizes']`\n */\n public readonly stateData = input<readonly SplitterStateData[]>([\n 'layout',\n 'panelOrder',\n 'panelSizes',\n ]);\n /**\n * The type of calculator to use for the splitter.\n * @default `DefaultSplitterCalculator`\n */\n public readonly calculatorType = input<SplitterCalculatorType>(DefaultSplitterCalculator);\n /**\n * The resize distribution mode for the splitter.\n * - `'adjacent'`: Only the panels adjacent to the divider are resized.\n * - `'proportional'`: The deficit is distributed proportionally across all panels on the other side.\n * @default adjacent\n */\n public readonly resizeMode = input<SplitterResizeMode>('adjacent');\n /**\n * Whether to lock affected panels to fixed `px` values after a resize completes.\n * When `true`, panels whose size changed are converted from their original unit to `px`.\n * When `false`, panels keep their original units (`fr`, `px`).\n * @default false\n */\n public readonly lockSizes = input<boolean>(false);\n /**\n * The step size for moving the dividers using the keyboard.\n * This can be a pixel value (e.g., '5px') or a percentage value (e.g., '5%').\n * If a percentage is used, it will be calculated based on the size of the splitter element.\n * @default '5px'\n */\n public readonly step = input<`${number}${'%' | 'px'}`>('5px');\n\n /**\n * Event emitted when the splitter state is being saved.\n * This can be used to modify the state before it is saved.\n */\n public readonly stateSaving = output<SplitterState>();\n /**\n * Event emitted when the splitter state is loaded.\n * This can be used to modify the state before it is applied or to perform actions based on the loaded state.\n */\n public readonly stateLoading = output<SplitterState>();\n\n protected readonly dividerTemplateType = templateTypeFn<never, { index: number }>();\n private readonly _dividerTemplate =\n viewChild.required<TemplateRef<typeof this.dividerTemplateType>>('defaultDividerTemplate');\n\n /**\n * The current dividers in the splitter.\n */\n public readonly dividers = signal<EmbeddedViewRef<typeof this.dividerTemplateType>[]>([]);\n /**\n * The current panels in the splitter.\n */\n public readonly panels = contentChildren(NgnSplitterPanel);\n /**\n * The current size of the splitter element.\n */\n public readonly elementSize = elementSizeSignal(this.element);\n\n /**\n * A value indicating whether the splitter is currently being dragged.\n */\n public readonly isDragging = computed(() => this.calculator().dragContext() !== null);\n\n protected readonly calculator = computed(() => {\n const calculatorType = this.calculatorType();\n return untracked(() => runInInjectionContext(this.injector, () => new calculatorType(this)));\n });\n\n constructor() {\n super();\n\n afterRenderEffect(() => {\n const panels = this.panels();\n this.updateDividers(panels);\n });\n\n // Measure divider positions in the after-render phase (post-layout) and cache\n // them in a signal. Reading DOM offsets directly in the template binding causes\n // NG0100, since the grid sizes are applied in the same CD cycle and the reflow\n // settles the measured value between the CD and verify passes.\n afterRenderEffect(() => {\n const values = this.measureDividerValues();\n untracked(() => {\n const prev = this._dividerValues();\n if (values.length !== prev.length || values.some((v, i) => v !== prev[i])) {\n this._dividerValues.set(values);\n }\n });\n });\n\n registerState({\n storage: () => this.stateStorage(),\n key: () => this.stateKey(),\n valueFn: this.computeState.bind(this),\n onLoad: this.onStateLoad.bind(this),\n debounce: 100,\n });\n }\n\n public ngOnDestroy(): void {\n // Clean up dividers\n this.dividers().forEach(divider => divider.destroy());\n this.dividers.set([]);\n }\n\n protected onHandlePointerDown(index: number, event: PointerEvent) {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n throw new Error('Event target is not an HTMLElement');\n }\n // Make sure the element is stable before capturing the pointer\n requestAnimationFrame(() => {\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Ignore errors if the element is not capable of capturing the pointer\n }\n });\n\n this.calculator().startDrag(index, event);\n }\n\n protected onHandlePointerMove(index: number, event: PointerEvent) {\n this.calculator().drag(index, event);\n }\n\n protected onHandlePointerUp(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, false);\n }\n\n protected onHandlePointerCancel(index: number, event: PointerEvent) {\n this.calculator().endDrag(index, event, true);\n }\n\n protected onHandleKeyDown(index: number, event: KeyboardEvent) {\n if (\n (event.key === 'ArrowLeft' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowUp' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, -this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (\n (event.key === 'ArrowRight' && this.layout() === 'horizontal') ||\n (event.key === 'ArrowDown' && this.layout() === 'vertical')\n ) {\n this.calculator().moveDivider(index, this.getStepInPx());\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'Home') {\n this.calculator().moveDivider(index, Number.NEGATIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n } else if (event.key === 'End') {\n this.calculator().moveDivider(index, Number.POSITIVE_INFINITY);\n event.preventDefault(); // Prevent default scrolling behavior\n }\n }\n\n private updateDividers(panels: readonly NgnSplitterPanel[]) {\n this.dividers.update(divider => {\n if (divider.length === panels.length - 1) {\n return divider; // No need to update if the number of dividers matches the number of panels\n } else if (divider.length < panels.length - 1) {\n // Add missing dividers\n const newDividers = [...divider];\n for (let i = divider.length; i < panels.length - 1; i++) {\n newDividers.push(this.createDivider(i));\n }\n return newDividers;\n } else {\n // More dividers than needed, remove the excess\n divider.slice(panels.length - 1).forEach(divider => divider.destroy());\n return divider.slice(0, panels.length - 1);\n }\n });\n\n // Move dividers to the correct positions (skip first panel — no divider before it)\n for (let i = 1; i < panels.length; i++) {\n const panel = panels[i]!;\n const divider = this.dividers()[i - 1];\n if (!divider) {\n throw new NgnError('NgnSplitter', `Divider is missing for panel at index ${i}`);\n }\n this.moveDividerBefore(panel, divider);\n }\n }\n\n private createDivider(index: number) {\n const viewRef = this._viewContainer.createEmbeddedView(this._dividerTemplate(), { index });\n viewRef.detectChanges();\n return viewRef;\n }\n\n private moveDividerBefore(panel: NgnSplitterPanel, divider: EmbeddedViewRef<unknown>) {\n const panelElement = panel.element.nativeElement;\n divider.rootNodes.forEach(node => {\n if (node instanceof HTMLElement) {\n panelElement.parentElement?.insertBefore(node, panelElement);\n }\n });\n }\n\n private computeState(previousState: SplitterState | null) {\n const data = this.stateData();\n const state: SplitterState = {\n layout: data.includes('layout') ? this.layout() : undefined,\n panelOrder: data.includes('panelOrder') ? this.panelOrder() : undefined,\n panelSizes: data.includes('panelSizes')\n ? this.panels().reduce(\n (acc, panel, index) => {\n acc[panel.name() || `ngn-panel-${index}`] = panel.size();\n return acc;\n },\n { ...previousState?.panelSizes }\n )\n : undefined,\n };\n\n this.stateSaving.emit(state);\n\n return state;\n }\n\n private onStateLoad(state: SplitterState | null) {\n if (state) {\n this.ensureValidState(state);\n this.stateLoading.emit(state);\n this.applyFromState(state);\n }\n return state;\n }\n\n private ensureValidState(state: SplitterState): void {\n if (state.layout && state.layout !== 'horizontal' && state.layout !== 'vertical') {\n Logger.warn(`Invalid layout in saved splitter state.`, { state });\n delete state.layout;\n }\n\n if (\n state.panelOrder &&\n (!Array.isArray(state.panelOrder) || state.panelOrder.some(x => typeof x !== 'string'))\n ) {\n Logger.warn(`Invalid panelOrder in saved splitter state.`, { state });\n delete state.panelOrder;\n }\n\n if (\n state.panelSizes &&\n (typeof state.panelSizes !== 'object' ||\n state.panelSizes === null ||\n Object.values(state.panelSizes).some(x => !isSplitterPanelSize(x)))\n ) {\n Logger.warn(`Invalid panelSizes in saved splitter state.`, { state });\n delete state.panelSizes;\n }\n }\n\n private applyFromState(state: SplitterState) {\n if (state.layout && this.stateData().includes('layout')) {\n this.layout.set(state.layout);\n }\n if (state.panelOrder && this.stateData().includes('panelOrder')) {\n this.panelOrder.set(state.panelOrder);\n }\n if (state.panelSizes && this.stateData().includes('panelSizes')) {\n const panels = this.panels();\n for (let i = 0; i < panels.length; i++) {\n const panelName = panels[i]?.name() || `ngn-panel-${i}`;\n if (panelName in state.panelSizes) {\n const panelSize = state.panelSizes[panelName];\n if (!panelSize) {\n continue;\n }\n panels[i]?.size.set(panelSize);\n }\n }\n }\n }\n\n /** Cached divider positions (percentage) measured post-layout; see the after-render effect in the constructor. */\n private readonly _dividerValues = signal<readonly number[]>([]);\n\n /**\n * The divider's current position as a percentage (0–100) of the total panel\n * content size, used for `aria-valuenow` on the `role=\"separator\"` handle.\n * Reads the cached value measured in the after-render phase.\n */\n protected dividerValueNow(index: number): number {\n return this._dividerValues()[index] ?? 0;\n }\n\n /**\n * Measures each divider's position as a percentage (0–100) of the total panel\n * content size. Reads `gridTemplateSizes()`, `elementSize()` and `dragContext()`\n * as reactive triggers, then measures the rendered panel sizes.\n */\n private measureDividerValues(): number[] {\n // ponytail: DOM-offset heuristic; one CD-frame lag during drag is fine for\n // an aria value. Swap for an engine-reported px signal if exactness matters.\n const calculator = this.calculator();\n calculator.gridTemplateSizes(); // reactive trigger\n calculator.dragContext(); // reactive trigger (live update during drag)\n this.elementSize(); // reactive trigger (container resize)\n const panels = calculator.orderedPanels();\n const horizontal = this.layout() === 'horizontal';\n const sizes = panels.map(panel => {\n const el = panel.element.nativeElement;\n return horizontal ? el.offsetWidth : el.offsetHeight;\n });\n const total = sizes.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n // One value per divider: cumulative size up to and including panel i.\n const values: number[] = [];\n let before = 0;\n for (let i = 0; i < panels.length - 1; i++) {\n before += sizes[i]!;\n values.push(Math.round((before / total) * 100));\n }\n return values;\n }\n\n private getStepInPx(): number {\n const step = this.step();\n if (step.endsWith('px')) {\n return parseFloat(step.slice(0, -2));\n } else if (step.endsWith('%')) {\n const size =\n this.layout() === 'horizontal' ? this.elementSize().width : this.elementSize().height;\n return (parseFloat(step.slice(0, -1)) / 100) * size;\n } else {\n Logger.warn(`Invalid step value: ${step}.`);\n return 10; // Default step in pixels\n }\n }\n}\n","<ng-content />\n\n<ng-template #defaultDividerTemplate [ngnTemplate]=\"dividerTemplateType\" let-index=\"index\">\n <div\n [style.grid-area]=\"`ngn-divider-${index}`\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n divider: true,\n 'divider-dragging': calculator().dragContext()?.dividerIndex === index,\n }\"\n >\n <button\n role=\"separator\"\n [aria-orientation]=\"layout()\"\n [aria-label]=\"translations['splitter_handleLabel']()\"\n [attr.aria-valuenow]=\"dividerValueNow(index)\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [ptInt]=\"this\"\n [ptClass]=\"'divider-handle'\"\n (pointerdown)=\"onHandlePointerDown(index, $event)\"\n (pointermove)=\"onHandlePointerMove(index, $event)\"\n (pointerup)=\"onHandlePointerUp(index, $event)\"\n (pointercancel)=\"onHandlePointerCancel(index, $event)\"\n (keydown)=\"onHandleKeyDown(index, $event)\"\n ></button>\n </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\n\nimport { NgnSplitterPanel } from './panel/splitter-panel';\nimport { NgnSplitter } from './splitter';\n\n// This module is just for grouping the Splitter and SplitterPanel components for convenience.\n// The components are standalone and can be used without this module.\n\n@NgModule({\n imports: [NgnSplitter, NgnSplitterPanel],\n exports: [NgnSplitter, NgnSplitterPanel],\n})\nexport class NgnSplitterModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, model, contentChild, Component, contentChildren, viewChildren, computed, effect } from '@angular/core';
3
+ import { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';
4
+ import { NgnDefer } from '@ngneers/controls/defer';
5
+ import { NgnIcon } from '@ngneers/controls/icon';
6
+ import { NgnRovingItem, NgnRovingGroup } from '@ngneers/controls/roving-focus';
7
+ import { stepperControlTemplate } from '@ngneers/controls-themes/templates/stepper';
8
+
9
+ /**
10
+ * A single step within an `ngn-stepper`. Declares the step's header metadata and
11
+ * projects its content via `<ng-template #content>`.
12
+ * @category control
13
+ */
14
+ class NgnStep extends NgnBase {
15
+ theme = null;
16
+ /** The step's header label. */
17
+ label = input('', /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
19
+ /** Custom marker icon; when unset the 1-based step number is shown. */
20
+ iconStep = input(/* @ts-ignore */
21
+ ...(ngDevMode ? [undefined, { debugName: "iconStep" }] : /* istanbul ignore next */ []));
22
+ /** Marks the step optional (shown as a hint; skippable in linear mode). @default false */
23
+ optional = input(false, { ...(ngDevMode ? { debugName: "optional" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
24
+ /** Disables navigation to this step. @default false */
25
+ disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
26
+ /** Renders the step's marker in an error state. @default false */
27
+ error = input(false, { ...(ngDevMode ? { debugName: "error" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
28
+ /**
29
+ * Whether the step is complete. The app sets this; in linear mode it gates
30
+ * forward navigation past this step. @default false
31
+ */
32
+ completed = model(false, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "completed" }] : /* istanbul ignore next */ []));
34
+ content = contentChild('content', /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
36
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnStep, deps: null, target: i0.ɵɵFactoryTarget.Component });
37
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.5", type: NgnStep, isStandalone: true, selector: "ngn-step", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, iconStep: { classPropertyName: "iconStep", publicName: "iconStep", isSignal: true, isRequired: false, transformFunction: null }, optional: { classPropertyName: "optional", publicName: "optional", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, completed: { classPropertyName: "completed", publicName: "completed", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { completed: "completedChange" }, providers: [provideSelf(NgnStep)], queries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnStep, decorators: [{
40
+ type: Component,
41
+ args: [{
42
+ selector: 'ngn-step',
43
+ template: '',
44
+ providers: [provideSelf(NgnStep)],
45
+ }]
46
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], iconStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconStep", required: false }] }], optional: [{ type: i0.Input, args: [{ isSignal: true, alias: "optional", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], completed: [{ type: i0.Input, args: [{ isSignal: true, alias: "completed", required: false }] }, { type: i0.Output, args: ["completedChange"] }], content: [{ type: i0.ContentChild, args: ['content', { isSignal: true }] }] } });
47
+
48
+ /**
49
+ * @category control
50
+ */
51
+ class NgnStepper extends NgnBase {
52
+ theme = this.injectThemeTemplate(stepperControlTemplate, 'root');
53
+ steps = contentChildren(NgnStep, /* @ts-ignore */
54
+ ...(ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []));
55
+ /** The header buttons' roving items, in step order (one per step; connectors are plain spans). */
56
+ _rovingItems = viewChildren(NgnRovingItem, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "_rovingItems" }] : /* istanbul ignore next */ []));
58
+ /** The active step index (zero-based). @default 0 */
59
+ active = model(0, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
61
+ /** Gate forward navigation on prior steps being `completed`. @default false */
62
+ linear = input(false, { ...(ngDevMode ? { debugName: "linear" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
63
+ /** Lazily render step content (forwarded to `ngn-defer`). @default true */
64
+ lazy = input(true, { ...(ngDevMode ? { debugName: "lazy" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
65
+ /** Keep opened step content in the DOM to preserve state (forwarded to `ngn-defer`). @default true */
66
+ cache = input(true, { ...(ngDevMode ? { debugName: "cache" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
67
+ /**
68
+ * Index of the first step that is not yet completed (the furthest reachable in linear mode).
69
+ * Optional steps are exempt — an incomplete optional step never blocks forward progress.
70
+ */
71
+ _firstIncomplete = computed(() => {
72
+ const steps = this.steps();
73
+ const idx = steps.findIndex(s => !s.completed() && !s.optional());
74
+ return idx === -1 ? steps.length - 1 : idx;
75
+ }, /* @ts-ignore */
76
+ ...(ngDevMode ? [{ debugName: "_firstIncomplete" }] : /* istanbul ignore next */ []));
77
+ constructor() {
78
+ super();
79
+ // Clamp active into range when steps change.
80
+ effect(() => {
81
+ const n = this.steps().length;
82
+ if (n === 0) {
83
+ return;
84
+ }
85
+ const a = this.active();
86
+ if (a > n - 1) {
87
+ this.active.set(n - 1);
88
+ }
89
+ else if (a < 0) {
90
+ this.active.set(0);
91
+ }
92
+ });
93
+ // Keep each header's roving item in sync with its step's NATIVE `disabled` input (not
94
+ // `canGoTo()` gating) — a merely gated step stays arrow-focusable, only a truly disabled
95
+ // step is skipped by keyboard navigation. Mirrors NgnButtonGroup's roving-disabled sync.
96
+ effect(() => {
97
+ const items = this._rovingItems();
98
+ const steps = this.steps();
99
+ items.forEach((item, i) => item.disabled.set(!!steps[i]?.disabled()));
100
+ });
101
+ }
102
+ /** Whether navigation to `index` is currently permitted. */
103
+ canGoTo(index) {
104
+ const steps = this.steps();
105
+ const step = steps[index];
106
+ if (!step || step.disabled()) {
107
+ return false;
108
+ }
109
+ if (!this.linear()) {
110
+ return true;
111
+ }
112
+ // Linear: can go backward freely, or forward up to the first incomplete step.
113
+ return index <= Math.max(this.active(), this._firstIncomplete());
114
+ }
115
+ goTo(index) {
116
+ if (this.canGoTo(index)) {
117
+ this.active.set(index);
118
+ }
119
+ }
120
+ next() {
121
+ this.goTo(this.active() + 1);
122
+ }
123
+ previous() {
124
+ this.goTo(this.active() - 1);
125
+ }
126
+ onHeaderActivate(index) {
127
+ this.goTo(index);
128
+ }
129
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnStepper, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: NgnStepper, isStandalone: true, selector: "ngn-stepper", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, providers: [provideSelf(NgnStepper)], queries: [{ propertyName: "steps", predicate: NgnStep, isSignal: true }], viewQueries: [{ propertyName: "_rovingItems", predicate: NgnRovingItem, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div ngnRovingGroup [ptInt]=\"this\" [ptClass]=\"'header'\" role=\"tablist\">\n @for (step of steps(); track $index; let i = $index; let last = $last) {\n <button\n type=\"button\"\n ngnRovingItem\n role=\"tab\"\n [attr.aria-selected]=\"i === active()\"\n [attr.aria-disabled]=\"!canGoTo(i) ? 'true' : null\"\n [disabled]=\"step.disabled()\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n step: true,\n active: i === active(),\n completed: !!step.completed(),\n error: !!step.error(),\n disabled: step.disabled() || !canGoTo(i),\n }\"\n (click)=\"onHeaderActivate(i)\"\n >\n <span [ptInt]=\"this\" [ptClass]=\"'marker'\">\n @if (step.iconStep(); as icon) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [icon]=\"icon\" />\n } @else if (step.completed() && i !== active()) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [defaultIcon]=\"'stepper-completed'\" />\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'marker-index'\">{{ i + 1 }}</span>\n }\n </span>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n {{ step.label() }}\n @if (step.optional()) {\n <span [ptInt]=\"this\" [ptClass]=\"'optional'\">(optional)</span>\n }\n </span>\n </button>\n @if (!last) {\n <span [ptInt]=\"this\" [ptClass]=\"'connector'\"></span>\n }\n }\n</div>\n\n@for (step of steps(); track $index; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: i === active() }\"\n [hidden]=\"i !== active()\"\n >\n <ngn-defer\n [lazyContent]=\"step.content()\"\n [open]=\"i === active()\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n />\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass", "ptDep"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }, { kind: "directive", type: NgnRovingGroup, selector: "[ngnRovingGroup]", inputs: ["orientation", "rovingMode", "rovingWrap"], outputs: ["activeItemChange"], exportAs: ["ngnRovingGroup"] }, { kind: "directive", type: NgnRovingItem, selector: "[ngnRovingItem]", inputs: ["ngnRovingItem"], exportAs: ["ngnRovingItem"] }] });
131
+ }
132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgnStepper, decorators: [{
133
+ type: Component,
134
+ args: [{ selector: 'ngn-stepper', imports: [NgnPt, NgnDefer, NgnIcon, NgnRovingGroup, NgnRovingItem], providers: [provideSelf(NgnStepper)], template: "<div ngnRovingGroup [ptInt]=\"this\" [ptClass]=\"'header'\" role=\"tablist\">\n @for (step of steps(); track $index; let i = $index; let last = $last) {\n <button\n type=\"button\"\n ngnRovingItem\n role=\"tab\"\n [attr.aria-selected]=\"i === active()\"\n [attr.aria-disabled]=\"!canGoTo(i) ? 'true' : null\"\n [disabled]=\"step.disabled()\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n step: true,\n active: i === active(),\n completed: !!step.completed(),\n error: !!step.error(),\n disabled: step.disabled() || !canGoTo(i),\n }\"\n (click)=\"onHeaderActivate(i)\"\n >\n <span [ptInt]=\"this\" [ptClass]=\"'marker'\">\n @if (step.iconStep(); as icon) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [icon]=\"icon\" />\n } @else if (step.completed() && i !== active()) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [defaultIcon]=\"'stepper-completed'\" />\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'marker-index'\">{{ i + 1 }}</span>\n }\n </span>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n {{ step.label() }}\n @if (step.optional()) {\n <span [ptInt]=\"this\" [ptClass]=\"'optional'\">(optional)</span>\n }\n </span>\n </button>\n @if (!last) {\n <span [ptInt]=\"this\" [ptClass]=\"'connector'\"></span>\n }\n }\n</div>\n\n@for (step of steps(); track $index; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: i === active() }\"\n [hidden]=\"i !== active()\"\n >\n <ngn-defer\n [lazyContent]=\"step.content()\"\n [open]=\"i === active()\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n />\n </div>\n}\n" }]
135
+ }], ctorParameters: () => [], propDecorators: { steps: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgnStep), { isSignal: true }] }], _rovingItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => NgnRovingItem), { isSignal: true }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }, { type: i0.Output, args: ["activeChange"] }], linear: [{ type: i0.Input, args: [{ isSignal: true, alias: "linear", required: false }] }], lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }] } });
136
+
137
+ /**
138
+ * Generated bundle index. Do not edit.
139
+ */
140
+
141
+ export { NgnStep, NgnStepper };
142
+ //# sourceMappingURL=ngneers-controls-stepper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-stepper.mjs","sources":["../../src/stepper/step.ts","../../src/stepper/stepper.ts","../../src/stepper/stepper.html","../../src/stepper/ngneers-controls-stepper.ts"],"sourcesContent":["import {\n booleanAttribute,\n Component,\n contentChild,\n input,\n model,\n TemplateRef,\n} from '@angular/core';\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\n\nimport type { IconType } from '@ngneers/controls-custom-types';\n\n/**\n * A single step within an `ngn-stepper`. Declares the step's header metadata and\n * projects its content via `<ng-template #content>`.\n * @category control\n */\n@Component({\n selector: 'ngn-step',\n template: '',\n providers: [provideSelf(NgnStep)],\n})\nexport class NgnStep extends NgnBase<'stepper'> {\n protected readonly theme = null;\n\n /** The step's header label. */\n public readonly label = input<string>('');\n /** Custom marker icon; when unset the 1-based step number is shown. */\n public readonly iconStep = input<IconType>();\n /** Marks the step optional (shown as a hint; skippable in linear mode). @default false */\n public readonly optional = input(false, { transform: booleanAttribute });\n /** Disables navigation to this step. @default false */\n public readonly disabled = input(false, { transform: booleanAttribute });\n /** Renders the step's marker in an error state. @default false */\n public readonly error = input(false, { transform: booleanAttribute });\n /**\n * Whether the step is complete. The app sets this; in linear mode it gates\n * forward navigation past this step. @default false\n */\n public readonly completed = model(false);\n\n public readonly content = contentChild<TemplateRef<unknown>>('content');\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n contentChildren,\n effect,\n input,\n model,\n viewChildren,\n} from '@angular/core';\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\nimport { NgnDefer } from '@ngneers/controls/defer';\nimport { NgnIcon } from '@ngneers/controls/icon';\nimport { NgnRovingGroup, NgnRovingItem } from '@ngneers/controls/roving-focus';\nimport { stepperControlTemplate } from '@ngneers/controls-themes/templates/stepper';\n\nimport { NgnStep } from './step';\n\n/**\n * @category control\n */\n@Component({\n selector: 'ngn-stepper',\n templateUrl: './stepper.html',\n imports: [NgnPt, NgnDefer, NgnIcon, NgnRovingGroup, NgnRovingItem],\n providers: [provideSelf(NgnStepper)],\n})\nexport class NgnStepper extends NgnBase<'stepper'> {\n protected readonly theme = this.injectThemeTemplate(stepperControlTemplate, 'root');\n\n protected readonly steps = contentChildren(NgnStep);\n\n /** The header buttons' roving items, in step order (one per step; connectors are plain spans). */\n private readonly _rovingItems = viewChildren(NgnRovingItem);\n\n /** The active step index (zero-based). @default 0 */\n public readonly active = model<number>(0);\n /** Gate forward navigation on prior steps being `completed`. @default false */\n public readonly linear = input(false, { transform: booleanAttribute });\n /** Lazily render step content (forwarded to `ngn-defer`). @default true */\n public readonly lazy = input(true, { transform: booleanAttribute });\n /** Keep opened step content in the DOM to preserve state (forwarded to `ngn-defer`). @default true */\n public readonly cache = input(true, { transform: booleanAttribute });\n\n /**\n * Index of the first step that is not yet completed (the furthest reachable in linear mode).\n * Optional steps are exempt — an incomplete optional step never blocks forward progress.\n */\n private readonly _firstIncomplete = computed(() => {\n const steps = this.steps();\n const idx = steps.findIndex(s => !s.completed() && !s.optional());\n return idx === -1 ? steps.length - 1 : idx;\n });\n\n constructor() {\n super();\n // Clamp active into range when steps change.\n effect(() => {\n const n = this.steps().length;\n if (n === 0) {\n return;\n }\n const a = this.active();\n if (a > n - 1) {\n this.active.set(n - 1);\n } else if (a < 0) {\n this.active.set(0);\n }\n });\n\n // Keep each header's roving item in sync with its step's NATIVE `disabled` input (not\n // `canGoTo()` gating) — a merely gated step stays arrow-focusable, only a truly disabled\n // step is skipped by keyboard navigation. Mirrors NgnButtonGroup's roving-disabled sync.\n effect(() => {\n const items = this._rovingItems();\n const steps = this.steps();\n items.forEach((item, i) => item.disabled.set(!!steps[i]?.disabled()));\n });\n }\n\n /** Whether navigation to `index` is currently permitted. */\n public canGoTo(index: number): boolean {\n const steps = this.steps();\n const step = steps[index];\n if (!step || step.disabled()) {\n return false;\n }\n if (!this.linear()) {\n return true;\n }\n // Linear: can go backward freely, or forward up to the first incomplete step.\n return index <= Math.max(this.active(), this._firstIncomplete());\n }\n\n public goTo(index: number): void {\n if (this.canGoTo(index)) {\n this.active.set(index);\n }\n }\n\n public next(): void {\n this.goTo(this.active() + 1);\n }\n\n public previous(): void {\n this.goTo(this.active() - 1);\n }\n\n protected onHeaderActivate(index: number): void {\n this.goTo(index);\n }\n}\n","<div ngnRovingGroup [ptInt]=\"this\" [ptClass]=\"'header'\" role=\"tablist\">\n @for (step of steps(); track $index; let i = $index; let last = $last) {\n <button\n type=\"button\"\n ngnRovingItem\n role=\"tab\"\n [attr.aria-selected]=\"i === active()\"\n [attr.aria-disabled]=\"!canGoTo(i) ? 'true' : null\"\n [disabled]=\"step.disabled()\"\n [ptInt]=\"this\"\n [ptClass]=\"{\n step: true,\n active: i === active(),\n completed: !!step.completed(),\n error: !!step.error(),\n disabled: step.disabled() || !canGoTo(i),\n }\"\n (click)=\"onHeaderActivate(i)\"\n >\n <span [ptInt]=\"this\" [ptClass]=\"'marker'\">\n @if (step.iconStep(); as icon) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [icon]=\"icon\" />\n } @else if (step.completed() && i !== active()) {\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'marker-icon'\" [defaultIcon]=\"'stepper-completed'\" />\n } @else {\n <span [ptInt]=\"this\" [ptClass]=\"'marker-index'\">{{ i + 1 }}</span>\n }\n </span>\n <span [ptInt]=\"this\" [ptClass]=\"'label'\">\n {{ step.label() }}\n @if (step.optional()) {\n <span [ptInt]=\"this\" [ptClass]=\"'optional'\">(optional)</span>\n }\n </span>\n </button>\n @if (!last) {\n <span [ptInt]=\"this\" [ptClass]=\"'connector'\"></span>\n }\n }\n</div>\n\n@for (step of steps(); track $index; let i = $index) {\n <div\n role=\"tabpanel\"\n [ptInt]=\"this\"\n [ptClass]=\"{ content: i === active() }\"\n [hidden]=\"i !== active()\"\n >\n <ngn-defer\n [lazyContent]=\"step.content()\"\n [open]=\"i === active()\"\n [lazy]=\"lazy()\"\n [cache]=\"cache()\"\n />\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}