@ngneers/controls 0.0.1-pre5 → 0.0.1-pre6

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 (120) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +32 -32
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-ng.mjs +19 -19
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
  6. package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
  7. package/fesm2022/ngneers-controls-avatar.mjs +13 -13
  8. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-base.mjs +89 -64
  10. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-breadcrumb.mjs +18 -18
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-button-group.mjs +8 -8
  14. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
  15. package/fesm2022/ngneers-controls-button.mjs +15 -10
  16. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  17. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs → ngneers-controls-calendar-time-Bzlv9Vkn.mjs} +9 -9
  18. package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs.map → ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map} +1 -1
  19. package/fesm2022/ngneers-controls-calendar.mjs +54 -54
  20. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
  22. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-chip.mjs +6 -6
  24. package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
  25. package/fesm2022/ngneers-controls-defer.mjs +10 -10
  26. package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-dialog.mjs +37 -39
  28. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-directives.mjs +45 -39
  30. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-drawer.mjs +28 -28
  32. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-edit-inplace.mjs +15 -15
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-filter.mjs +192 -44
  36. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  37. package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
  38. package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
  39. package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
  40. package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
  41. package/fesm2022/ngneers-controls-i18n.mjs +5 -5
  42. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-icon.mjs +10 -10
  44. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-inplace.mjs +18 -18
  46. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-input-field.mjs +14 -14
  48. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
  50. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-input.mjs +6 -6
  52. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-item-view.mjs +33 -33
  54. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-list-box.mjs +31 -31
  56. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-menu.mjs +32 -32
  58. package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-message.mjs +4 -4
  60. package/fesm2022/ngneers-controls-message.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-paginator.mjs +12 -12
  62. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-popover.mjs +13 -13
  64. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  65. package/fesm2022/ngneers-controls-progress.mjs +16 -16
  66. package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-scroller.mjs +74 -39
  68. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-select-button.mjs +6 -6
  70. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-select.mjs +46 -46
  72. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-slider.mjs +11 -11
  74. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-spinner.mjs +7 -7
  76. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-splitter.mjs +141 -328
  78. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  80. package/fesm2022/ngneers-controls-table.mjs +1520 -80
  81. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  82. package/fesm2022/ngneers-controls-tabs.mjs +40 -39
  83. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  84. package/fesm2022/ngneers-controls-tag.mjs +4 -4
  85. package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
  86. package/fesm2022/ngneers-controls-toast.mjs +18 -18
  87. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-toggle-button.mjs +9 -9
  89. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  90. package/fesm2022/ngneers-controls-tooltip.mjs +36 -36
  91. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  92. package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
  93. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
  94. package/package.json +14 -10
  95. package/types/ngneers-controls-api-ng.d.ts +2 -2
  96. package/types/ngneers-controls-api-resize.d.ts +318 -0
  97. package/types/ngneers-controls-base.d.ts +8 -0
  98. package/types/ngneers-controls-breadcrumb.d.ts +1 -1
  99. package/types/ngneers-controls-button.d.ts +13 -8
  100. package/types/ngneers-controls-calendar.d.ts +5 -1
  101. package/types/ngneers-controls-checkbox.d.ts +1 -1
  102. package/types/ngneers-controls-directives.d.ts +7 -1
  103. package/types/ngneers-controls-drawer.d.ts +4 -0
  104. package/types/ngneers-controls-edit-inplace.d.ts +4 -0
  105. package/types/ngneers-controls-filter.d.ts +53 -4
  106. package/types/ngneers-controls-i18n.d.ts +4 -0
  107. package/types/ngneers-controls-icon.d.ts +1 -1
  108. package/types/ngneers-controls-input-field.d.ts +4 -0
  109. package/types/ngneers-controls-list-box.d.ts +5 -1
  110. package/types/ngneers-controls-menu.d.ts +1 -1
  111. package/types/ngneers-controls-paginator.d.ts +4 -0
  112. package/types/ngneers-controls-popover.d.ts +1 -1
  113. package/types/ngneers-controls-scroller.d.ts +12 -2
  114. package/types/ngneers-controls-select.d.ts +6 -2
  115. package/types/ngneers-controls-spinner.d.ts +1 -1
  116. package/types/ngneers-controls-splitter.d.ts +29 -59
  117. package/types/ngneers-controls-table.d.ts +392 -24
  118. package/types/ngneers-controls-toast.d.ts +1 -1
  119. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
  120. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
@@ -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 {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n viewChild,\r\n ElementRef,\r\n computed,\r\n} from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\r\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-slider',\r\n templateUrl: './slider.html',\r\n imports: [NgnPt, NgnDrag],\r\n providers: [provideSelf(NgnSlider)],\r\n host: {\r\n role: 'slider',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.aria-labelledby]': 'labelledBy()',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\r\n '[attr.aria-valuetext]': 'valueTextValue()',\r\n '[tabindex]': 'disabled() ? -1 : 0',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(blur)': 'touched.set(true)',\r\n },\r\n})\r\nexport class NgnSlider extends ValueControlBase<'slider', number> {\r\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n horizontal: () => !this.vertical(),\r\n vertical: () => this.vertical(),\r\n });\r\n\r\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\r\n\r\n /**\r\n * The minimum value of the slider.\r\n */\r\n public readonly min = input<number>(0);\r\n\r\n /**\r\n * Whether the slider is vertical.\r\n */\r\n public readonly vertical = input<boolean>(false);\r\n\r\n /**\r\n * The maximum value of the slider.\r\n */\r\n public readonly max = input<number>(100);\r\n\r\n /**\r\n * The step increment value.\r\n */\r\n public readonly step = input<number>(1);\r\n\r\n /**\r\n * The value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueText = input<string>();\r\n\r\n /**\r\n * A function that generates the value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueTextFn = input<(value: number) => string>();\r\n\r\n protected readonly left = computed(() => {\r\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\r\n return Math.min(100, Math.max(0, percent));\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected readonly valueTextValue = computed(() => {\r\n const valueText = this.valueText();\r\n if (valueText) {\r\n return valueText;\r\n }\r\n const valueTextFn = this.valueTextFn();\r\n if (valueTextFn) {\r\n return valueTextFn(this.value());\r\n }\r\n return null;\r\n });\r\n\r\n protected onDragged(delta: NgnDragInfo) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\r\n this.dragToPosition(cursorPos);\r\n }\r\n\r\n private dragToPosition(cursorPos: number) {\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\r\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\r\n const positionInTrack = cursorPos - trackStart;\r\n const correctedPositionInTrack = this.vertical()\r\n ? trackLength - positionInTrack\r\n : positionInTrack;\r\n const positionPercent = correctedPositionInTrack / trackLength;\r\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\r\n const steppedValue =\r\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\r\n this.value.set(this.clampValue(steppedValue));\r\n }\r\n\r\n private clampValue(value: number): number {\r\n return Math.min(this.max(), Math.max(this.min(), value));\r\n }\r\n\r\n protected onDragEnd() {}\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n this.value.update(v => this.clampValue(v - this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n this.value.update(v => this.clampValue(v + this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'Home':\r\n this.value.set(this.min());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n case 'End':\r\n this.value.set(this.max());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected thumbClicked(event: PointerEvent) {\r\n event.stopPropagation();\r\n }\r\n protected trackClicked(event: PointerEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const clickPosition = this.vertical()\r\n ? event.clientY - trackRect.top\r\n : event.clientX - trackRect.left;\r\n this.dragToPosition(\r\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\r\n );\r\n }\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\r\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\r\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\r\n <div\r\n #thumb\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'thumb'\"\r\n ngnDrag\r\n (dragged)=\"onDragged($event)\"\r\n (dragEnd)=\"onDragEnd()\"\r\n [style.--valuePercent.%]=\"left()\"\r\n (click)=\"thumbClicked($event)\"\r\n ></div>\r\n</div>\r\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 {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n viewChild,\r\n ElementRef,\r\n computed,\r\n} from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnDrag, type NgnDragInfo } from '@ngneers/controls/directives';\r\nimport { sliderControlTemplate } from '@ngneers/controls-themes/templates/slider';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-slider',\r\n templateUrl: './slider.html',\r\n imports: [NgnPt, NgnDrag],\r\n providers: [provideSelf(NgnSlider)],\r\n host: {\r\n role: 'slider',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n '[attr.aria-valuenow]': 'value()',\r\n '[attr.aria-readonly]': 'readonly() ? \"true\" : null',\r\n '[attr.disabled]': 'disabled() ? \"\" : null',\r\n '[attr.aria-labelledby]': 'labelledBy()',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-orientation]': 'vertical() ? \"vertical\" : \"horizontal\"',\r\n '[attr.aria-valuetext]': 'valueTextValue()',\r\n '[tabindex]': 'disabled() ? -1 : 0',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(blur)': 'touched.set(true)',\r\n },\r\n})\r\nexport class NgnSlider extends ValueControlBase<'slider', number> {\r\n protected readonly theme = this.injectThemeTemplate(sliderControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n horizontal: () => !this.vertical(),\r\n vertical: () => this.vertical(),\r\n });\r\n\r\n private readonly _track = viewChild.required<ElementRef<HTMLDivElement>>('track');\r\n\r\n /**\r\n * The minimum value of the slider.\r\n */\r\n public readonly min = input<number>(0);\r\n\r\n /**\r\n * Whether the slider is vertical.\r\n */\r\n public readonly vertical = input<boolean>(false);\r\n\r\n /**\r\n * The maximum value of the slider.\r\n */\r\n public readonly max = input<number>(100);\r\n\r\n /**\r\n * The step increment value.\r\n */\r\n public readonly step = input<number>(1);\r\n\r\n /**\r\n * The value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueText = input<string>();\r\n\r\n /**\r\n * A function that generates the value text representation for accessibility.\r\n * If both {@link valueText} and {@link valueTextFn} are provided, {@link valueText} takes precedence.\r\n */\r\n public readonly valueTextFn = input<(value: number) => string>();\r\n\r\n protected readonly left = computed(() => {\r\n const percent = ((this.value() - this.min()) / (this.max() - this.min())) * 100;\r\n return Math.min(100, Math.max(0, percent));\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n protected readonly valueTextValue = computed(() => {\r\n const valueText = this.valueText();\r\n if (valueText) {\r\n return valueText;\r\n }\r\n const valueTextFn = this.valueTextFn();\r\n if (valueTextFn) {\r\n return valueTextFn(this.value());\r\n }\r\n return null;\r\n });\r\n\r\n protected onDragged(delta: NgnDragInfo) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const cursorPos = this.vertical() ? delta.absoluteY : delta.absoluteX;\r\n this.dragToPosition(cursorPos);\r\n }\r\n\r\n private dragToPosition(cursorPos: number) {\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const trackStart = this.vertical() ? trackRect.top : trackRect.left;\r\n const trackLength = this.vertical() ? trackRect.height : trackRect.width;\r\n const positionInTrack = cursorPos - trackStart;\r\n const correctedPositionInTrack = this.vertical()\r\n ? trackLength - positionInTrack\r\n : positionInTrack;\r\n const positionPercent = correctedPositionInTrack / trackLength;\r\n const newValueUnstepped = this.min() + positionPercent * (this.max() - this.min());\r\n const steppedValue =\r\n Math.round((newValueUnstepped - this.min()) / this.step()) * this.step() + this.min();\r\n this.value.set(this.clampValue(steppedValue));\r\n }\r\n\r\n private clampValue(value: number): number {\r\n return Math.min(this.max(), Math.max(this.min(), value));\r\n }\r\n\r\n protected onDragEnd() {}\r\n\r\n protected onKeyDown(event: KeyboardEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n case 'ArrowDown':\r\n this.value.update(v => this.clampValue(v - this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n case 'ArrowUp':\r\n this.value.update(v => this.clampValue(v + this.step()));\r\n event.preventDefault();\r\n break;\r\n case 'Home':\r\n this.value.set(this.min());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n case 'End':\r\n this.value.set(this.max());\r\n this.onDragEnd();\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected thumbClicked(event: PointerEvent) {\r\n event.stopPropagation();\r\n }\r\n protected trackClicked(event: PointerEvent) {\r\n if (this.readonly() || this.disabled()) {\r\n return;\r\n }\r\n const trackEl = this._track().nativeElement;\r\n const trackRect = trackEl.getBoundingClientRect();\r\n const clickPosition = this.vertical()\r\n ? event.clientY - trackRect.top\r\n : event.clientX - trackRect.left;\r\n this.dragToPosition(\r\n this.vertical() ? trackRect.top + clickPosition : trackRect.left + clickPosition\r\n );\r\n }\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\r\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\r\n<div #track [ptInt]=\"this\" [ptClass]=\"'track'\" (click)=\"trackClicked($event)\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\" [style.--valuePercent.%]=\"left()\"></div>\r\n <div\r\n #thumb\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'thumb'\"\r\n ngnDrag\r\n (dragged)=\"onDragged($event)\"\r\n (dragEnd)=\"onDragEnd()\"\r\n [style.--valuePercent.%]=\"left()\"\r\n (click)=\"thumbClicked($event)\"\r\n ></div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -13,14 +13,14 @@ class NgnSpinner extends NgnBase {
13
13
  root: true,
14
14
  centered: () => !!this.centered(),
15
15
  });
16
- size = input(64, ...(ngDevMode ? [{ debugName: "size" }] : []));
17
- thickness = input(...(ngDevMode ? [undefined, { debugName: "thickness" }] : []));
18
- centered = input(...(ngDevMode ? [undefined, { debugName: "centered" }] : []));
19
- viewBox = computed(() => `0 0 ${this.size()} ${this.size()}`, ...(ngDevMode ? [{ debugName: "viewBox" }] : []));
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnSpinner, deps: null, target: i0.ɵɵFactoryTarget.Component });
21
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.0", type: NgnSpinner, isStandalone: true, selector: "ngn-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "style.--size": "size()", "style.--thickness": "thickness() || null" } }, providers: [provideSelf(NgnSpinner)], usesInheritance: true, ngImport: i0, template: "<svg [attr.viewBox]=\"viewBox()\" xmlns=\"http://www.w3.org/2000/svg\" [ptInt]=\"this\" [ptClass]=\"'svg'\">\r\n <circle\r\n [attr.cx]=\"size() / 2\"\r\n [attr.cy]=\"size() / 2\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'circle'\"\r\n />\r\n</svg>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16
+ size = input(64, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
17
+ thickness = input(...(ngDevMode ? [undefined, { debugName: "thickness" }] : /* istanbul ignore next */ []));
18
+ centered = input(...(ngDevMode ? [undefined, { debugName: "centered" }] : /* istanbul ignore next */ []));
19
+ viewBox = computed(() => `0 0 ${this.size()} ${this.size()}`, ...(ngDevMode ? [{ debugName: "viewBox" }] : /* istanbul ignore next */ []));
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSpinner, deps: null, target: i0.ɵɵFactoryTarget.Component });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.2", type: NgnSpinner, isStandalone: true, selector: "ngn-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null }, centered: { classPropertyName: "centered", publicName: "centered", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "style.--size": "size()", "style.--thickness": "thickness() || null" } }, providers: [provideSelf(NgnSpinner)], usesInheritance: true, ngImport: i0, template: "<svg [attr.viewBox]=\"viewBox()\" xmlns=\"http://www.w3.org/2000/svg\" [ptInt]=\"this\" [ptClass]=\"'svg'\">\r\n <circle\r\n [attr.cx]=\"size() / 2\"\r\n [attr.cy]=\"size() / 2\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'circle'\"\r\n />\r\n</svg>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
22
22
  }
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnSpinner, decorators: [{
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnSpinner, decorators: [{
24
24
  type: Component,
25
25
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-spinner', imports: [NgnPt], providers: [provideSelf(NgnSpinner)], host: {
26
26
  role: 'status',
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-spinner.mjs","sources":["../../src/spinner/spinner.ts","../../src/spinner/spinner.html","../../src/spinner/spinner-creator.ts","../../src/spinner/ngneers-controls-spinner.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy, computed } from '@angular/core';\r\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { spinnerControlTemplate } from '@ngneers/controls-themes/templates/spinner';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-spinner',\r\n templateUrl: './spinner.html',\r\n imports: [NgnPt],\r\n providers: [provideSelf(NgnSpinner)],\r\n host: {\r\n role: 'status',\r\n '[style.--size]': 'size()',\r\n '[style.--thickness]': 'thickness() || null',\r\n },\r\n})\r\nexport class NgnSpinner extends NgnBase<'spinner'> {\r\n protected readonly theme = this.injectThemeTemplate(spinnerControlTemplate, {\r\n root: true,\r\n centered: () => !!this.centered(),\r\n });\r\n\r\n public readonly size = input<number>(64);\r\n public readonly thickness = input<string>();\r\n public readonly centered = input<boolean>();\r\n\r\n protected readonly viewBox = computed(() => `0 0 ${this.size()} ${this.size()}`);\r\n}\r\n","<svg [attr.viewBox]=\"viewBox()\" xmlns=\"http://www.w3.org/2000/svg\" [ptInt]=\"this\" [ptClass]=\"'svg'\">\r\n <circle\r\n [attr.cx]=\"size() / 2\"\r\n [attr.cy]=\"size() / 2\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'circle'\"\r\n />\r\n</svg>\r\n","import {\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n runInInjectionContext,\r\n type Signal,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { debounceSignal } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnSpinner } from './spinner';\r\n\r\nimport type { CustomColor } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * Creates an instance of the spinner creator.\r\n *\r\n * @param injector The injector to use. Defaults to the current injector.\r\n * @returns The spinner creator.\r\n */\r\nexport function injectSpinnerCreator(injector?: Injector): NgnSpinnerCreator {\r\n if (injector) {\r\n return runInInjectionContext(injector, () => injectSpinnerCreator());\r\n }\r\n return new NgnSpinnerCreator();\r\n}\r\n\r\n/**\r\n * Creates and manages a conditional spinner based on a visibility signal.\r\n * @param isVisible Signal that determines whether the spinner is visible.\r\n * @param options Optional configuration for the spinner.\r\n */\r\nexport function createConditionalSpinner(\r\n isVisible: Signal<boolean>,\r\n options?: {\r\n /**\r\n * Options for the spinner instance.\r\n */\r\n spinnerOptions?: SpinnerOptions;\r\n /**\r\n * Debounce time in milliseconds or a boolean indicating whether to debounce (default is 200ms).\r\n */\r\n debounce?: number | boolean;\r\n /**\r\n * The target element where the spinner will be attached.\r\n * If a string is provided, it will be used as a selector to find the element.\r\n * If omitted, the spinner will be attached to the host element of the current injector.\r\n */\r\n element?: SpinnerTarget;\r\n /**\r\n * The injector to use. If omitted, the current injector will be used.\r\n */\r\n injector?: Injector;\r\n }\r\n) {\r\n if (options?.injector) {\r\n runInInjectionContext(options.injector, () =>\r\n createConditionalSpinner(isVisible, {\r\n ...options,\r\n injector: undefined,\r\n })\r\n );\r\n return;\r\n }\r\n\r\n const debounceMs =\r\n typeof options?.debounce === 'number'\r\n ? options.debounce\r\n : (options?.debounce ?? true)\r\n ? 200\r\n : 0;\r\n\r\n const debouncedVisible = debounceMs ? debounceSignal(isVisible, debounceMs) : isVisible;\r\n\r\n const spinnerCreator = injectSpinnerCreator();\r\n const element = options?.element ?? inject(ElementRef).nativeElement;\r\n let ref: SpinnerRef | undefined;\r\n effect(() => {\r\n const visible = debouncedVisible();\r\n if (visible && !ref) {\r\n ref = spinnerCreator.show(element, options?.spinnerOptions);\r\n } else if (!visible && ref) {\r\n ref.hide();\r\n ref = undefined;\r\n }\r\n });\r\n}\r\n\r\nexport type SpinnerRef = {\r\n /**\r\n * Hides the spinner.\r\n */\r\n hide: () => void;\r\n};\r\n\r\nexport type SpinnerTarget = HTMLElement | ElementRef<HTMLElement> | string;\r\nexport type SpinnerOptions = {\r\n /**\r\n * The color of the spinner.\r\n */\r\n color?: CustomColor;\r\n /**\r\n * The diameter of the spinner in pixels.\r\n * @default 64\r\n */\r\n size?: number;\r\n /**\r\n * The thickness of the spinner's stroke. If not provided,\r\n * a default thickness derived from the size will be used.\r\n * @default undefined\r\n */\r\n thickness?: string;\r\n /**\r\n * Whether the spinner should be centered within its container.\r\n * @default true\r\n */\r\n centered?: boolean;\r\n /**\r\n * Set aria busy attribute on the reference element while the spinner is visible.\r\n * @default true\r\n */\r\n ariaBusy?: boolean;\r\n};\r\n\r\nfunction getElement(target: SpinnerTarget): HTMLElement | null {\r\n if (typeof target === 'string') {\r\n return document.querySelector(target);\r\n } else if (target instanceof ElementRef) {\r\n return target.nativeElement;\r\n } else {\r\n return target;\r\n }\r\n}\r\n\r\nconst DEFAULT_OPTIONS: SpinnerOptions = {\r\n centered: true,\r\n ariaBusy: true,\r\n};\r\n\r\nclass NgnSpinnerCreator {\r\n private readonly _vcr = inject(ViewContainerRef);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private _destroyed = false;\r\n\r\n constructor() {\r\n this._destroyRef.onDestroy(() => {\r\n this._destroyed = true;\r\n });\r\n }\r\n\r\n /**\r\n * Shows a spinner on the specified target element.\r\n * @param target The target element or selector where the spinner will be attached.\r\n * If a string is provided, it will be used as a selector to find the element.\r\n * If the element is not found, the spinner will be retried until it is found.\r\n * @param options Optional configuration for the spinner.\r\n * @returns A reference to the spinner instance.\r\n */\r\n public show(target: SpinnerTarget, options?: SpinnerOptions): SpinnerRef {\r\n options = { ...DEFAULT_OPTIONS, ...options };\r\n const hideCb = {\r\n hide: () => {},\r\n };\r\n this._tryAttach(target, options, hideCb);\r\n return {\r\n hide: () => hideCb.hide(),\r\n };\r\n }\r\n\r\n private _tryAttach(\r\n target: SpinnerTarget,\r\n options: SpinnerOptions,\r\n hideCb: { hide?: () => void }\r\n ) {\r\n if (this._destroyed) {\r\n return;\r\n }\r\n const element = getElement(target);\r\n if (!element) {\r\n setTimeout(() => {\r\n this._tryAttach(target, options, hideCb);\r\n }, 10);\r\n return;\r\n }\r\n const componentRef = this._vcr.createComponent(NgnSpinner);\r\n\r\n const doHide = () => {\r\n componentRef.destroy();\r\n if (options?.ariaBusy) {\r\n element.removeAttribute('aria-busy');\r\n }\r\n delete hideCb.hide;\r\n };\r\n\r\n hideCb.hide = () => {\r\n doHide();\r\n unregisterOnDestroy();\r\n };\r\n element.appendChild(componentRef.location.nativeElement);\r\n if (options.ariaBusy) {\r\n element.setAttribute('aria-busy', 'true');\r\n }\r\n const unregisterOnDestroy = this._destroyRef.onDestroy(() => {\r\n doHide();\r\n });\r\n if (options.color) {\r\n setComponentInput(componentRef, 'color', options.color);\r\n }\r\n if (options.size) {\r\n setComponentInput(componentRef, 'size', options.size);\r\n }\r\n if (options.thickness) {\r\n setComponentInput(componentRef, 'thickness', options.thickness);\r\n }\r\n if (options.centered) {\r\n setComponentInput(componentRef, 'centered', options.centered);\r\n }\r\n }\r\n}\r\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-spinner.mjs","sources":["../../src/spinner/spinner.ts","../../src/spinner/spinner.html","../../src/spinner/spinner-creator.ts","../../src/spinner/ngneers-controls-spinner.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy, computed } from '@angular/core';\r\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { spinnerControlTemplate } from '@ngneers/controls-themes/templates/spinner';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-spinner',\r\n templateUrl: './spinner.html',\r\n imports: [NgnPt],\r\n providers: [provideSelf(NgnSpinner)],\r\n host: {\r\n role: 'status',\r\n '[style.--size]': 'size()',\r\n '[style.--thickness]': 'thickness() || null',\r\n },\r\n})\r\nexport class NgnSpinner extends NgnBase<'spinner'> {\r\n protected readonly theme = this.injectThemeTemplate(spinnerControlTemplate, {\r\n root: true,\r\n centered: () => !!this.centered(),\r\n });\r\n\r\n public readonly size = input<number>(64);\r\n public readonly thickness = input<string>();\r\n public readonly centered = input<boolean>();\r\n\r\n protected readonly viewBox = computed(() => `0 0 ${this.size()} ${this.size()}`);\r\n}\r\n","<svg [attr.viewBox]=\"viewBox()\" xmlns=\"http://www.w3.org/2000/svg\" [ptInt]=\"this\" [ptClass]=\"'svg'\">\r\n <circle\r\n [attr.cx]=\"size() / 2\"\r\n [attr.cy]=\"size() / 2\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'circle'\"\r\n />\r\n</svg>\r\n","import {\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n runInInjectionContext,\r\n type Signal,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { debounceSignal } from '@ngneers/controls/utils-ng';\r\n\r\nimport { NgnSpinner } from './spinner';\r\n\r\nimport type { CustomColor } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * Creates an instance of the spinner creator.\r\n *\r\n * @param injector The injector to use. Defaults to the current injector.\r\n * @returns The spinner creator.\r\n */\r\nexport function injectSpinnerCreator(injector?: Injector): NgnSpinnerCreator {\r\n if (injector) {\r\n return runInInjectionContext(injector, () => injectSpinnerCreator());\r\n }\r\n return new NgnSpinnerCreator();\r\n}\r\n\r\n/**\r\n * Creates and manages a conditional spinner based on a visibility signal.\r\n * @param isVisible Signal that determines whether the spinner is visible.\r\n * @param options Optional configuration for the spinner.\r\n */\r\nexport function createConditionalSpinner(\r\n isVisible: Signal<boolean>,\r\n options?: {\r\n /**\r\n * Options for the spinner instance.\r\n */\r\n spinnerOptions?: SpinnerOptions;\r\n /**\r\n * Debounce time in milliseconds or a boolean indicating whether to debounce (default is 200ms).\r\n */\r\n debounce?: number | boolean;\r\n /**\r\n * The target element where the spinner will be attached.\r\n * If a string is provided, it will be used as a selector to find the element.\r\n * If omitted, the spinner will be attached to the host element of the current injector.\r\n */\r\n element?: SpinnerTarget;\r\n /**\r\n * The injector to use. If omitted, the current injector will be used.\r\n */\r\n injector?: Injector;\r\n }\r\n) {\r\n if (options?.injector) {\r\n runInInjectionContext(options.injector, () =>\r\n createConditionalSpinner(isVisible, {\r\n ...options,\r\n injector: undefined,\r\n })\r\n );\r\n return;\r\n }\r\n\r\n const debounceMs =\r\n typeof options?.debounce === 'number'\r\n ? options.debounce\r\n : (options?.debounce ?? true)\r\n ? 200\r\n : 0;\r\n\r\n const debouncedVisible = debounceMs ? debounceSignal(isVisible, debounceMs) : isVisible;\r\n\r\n const spinnerCreator = injectSpinnerCreator();\r\n const element = options?.element ?? inject(ElementRef).nativeElement;\r\n let ref: SpinnerRef | undefined;\r\n effect(() => {\r\n const visible = debouncedVisible();\r\n if (visible && !ref) {\r\n ref = spinnerCreator.show(element, options?.spinnerOptions);\r\n } else if (!visible && ref) {\r\n ref.hide();\r\n ref = undefined;\r\n }\r\n });\r\n}\r\n\r\nexport type SpinnerRef = {\r\n /**\r\n * Hides the spinner.\r\n */\r\n hide: () => void;\r\n};\r\n\r\nexport type SpinnerTarget = HTMLElement | ElementRef<HTMLElement> | string;\r\nexport type SpinnerOptions = {\r\n /**\r\n * The color of the spinner.\r\n */\r\n color?: CustomColor;\r\n /**\r\n * The diameter of the spinner in pixels.\r\n * @default 64\r\n */\r\n size?: number;\r\n /**\r\n * The thickness of the spinner's stroke. If not provided,\r\n * a default thickness derived from the size will be used.\r\n * @default undefined\r\n */\r\n thickness?: string;\r\n /**\r\n * Whether the spinner should be centered within its container.\r\n * @default true\r\n */\r\n centered?: boolean;\r\n /**\r\n * Set aria busy attribute on the reference element while the spinner is visible.\r\n * @default true\r\n */\r\n ariaBusy?: boolean;\r\n};\r\n\r\nfunction getElement(target: SpinnerTarget): HTMLElement | null {\r\n if (typeof target === 'string') {\r\n return document.querySelector(target);\r\n } else if (target instanceof ElementRef) {\r\n return target.nativeElement;\r\n } else {\r\n return target;\r\n }\r\n}\r\n\r\nconst DEFAULT_OPTIONS: SpinnerOptions = {\r\n centered: true,\r\n ariaBusy: true,\r\n};\r\n\r\nclass NgnSpinnerCreator {\r\n private readonly _vcr = inject(ViewContainerRef);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n private _destroyed = false;\r\n\r\n constructor() {\r\n this._destroyRef.onDestroy(() => {\r\n this._destroyed = true;\r\n });\r\n }\r\n\r\n /**\r\n * Shows a spinner on the specified target element.\r\n * @param target The target element or selector where the spinner will be attached.\r\n * If a string is provided, it will be used as a selector to find the element.\r\n * If the element is not found, the spinner will be retried until it is found.\r\n * @param options Optional configuration for the spinner.\r\n * @returns A reference to the spinner instance.\r\n */\r\n public show(target: SpinnerTarget, options?: SpinnerOptions): SpinnerRef {\r\n options = { ...DEFAULT_OPTIONS, ...options };\r\n const hideCb = {\r\n hide: () => {},\r\n };\r\n this._tryAttach(target, options, hideCb);\r\n return {\r\n hide: () => hideCb.hide(),\r\n };\r\n }\r\n\r\n private _tryAttach(\r\n target: SpinnerTarget,\r\n options: SpinnerOptions,\r\n hideCb: { hide?: () => void }\r\n ) {\r\n if (this._destroyed) {\r\n return;\r\n }\r\n const element = getElement(target);\r\n if (!element) {\r\n setTimeout(() => {\r\n this._tryAttach(target, options, hideCb);\r\n }, 10);\r\n return;\r\n }\r\n const componentRef = this._vcr.createComponent(NgnSpinner);\r\n\r\n const doHide = () => {\r\n componentRef.destroy();\r\n if (options?.ariaBusy) {\r\n element.removeAttribute('aria-busy');\r\n }\r\n delete hideCb.hide;\r\n };\r\n\r\n hideCb.hide = () => {\r\n doHide();\r\n unregisterOnDestroy();\r\n };\r\n element.appendChild(componentRef.location.nativeElement);\r\n if (options.ariaBusy) {\r\n element.setAttribute('aria-busy', 'true');\r\n }\r\n const unregisterOnDestroy = this._destroyRef.onDestroy(() => {\r\n doHide();\r\n });\r\n if (options.color) {\r\n setComponentInput(componentRef, 'color', options.color);\r\n }\r\n if (options.size) {\r\n setComponentInput(componentRef, 'size', options.size);\r\n }\r\n if (options.thickness) {\r\n setComponentInput(componentRef, 'thickness', options.thickness);\r\n }\r\n if (options.centered) {\r\n setComponentInput(componentRef, 'centered', options.centered);\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAIA;;AAEG;AAaG,MAAO,UAAW,SAAQ,OAAkB,CAAA;AAC7B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,EAAE;AAC1E,QAAA,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClC,KAAA,CAAC;AAEc,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;IACxB,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC3B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;AAExB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,8EAAC;uGAVrE,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,UAAA,EAAA,EAAA,cAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,SAAA,EAPV,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZtC,4RASA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQJ,UAAU,EAAA,UAAA,EAAA,CAAA;kBAZtB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,aAAa,EAAA,OAAA,EAEd,CAAC,KAAK,CAAC,EAAA,SAAA,EACL,CAAC,WAAW,CAAA,UAAA,CAAY,CAAC,EAAA,IAAA,EAC9B;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,gBAAgB,EAAE,QAAQ;AAC1B,wBAAA,qBAAqB,EAAE,qBAAqB;AAC7C,qBAAA,EAAA,QAAA,EAAA,4RAAA,EAAA;;;AEAH;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,QAAmB,EAAA;IACtD,IAAI,QAAQ,EAAE;QACZ,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAM,oBAAoB,EAAE,CAAC;IACtE;IACA,OAAO,IAAI,iBAAiB,EAAE;AAChC;AAEA;;;;AAIG;AACG,SAAU,wBAAwB,CACtC,SAA0B,EAC1B,OAmBC,EAAA;AAED,IAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;QACrB,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,MACtC,wBAAwB,CAAC,SAAS,EAAE;AAClC,YAAA,GAAG,OAAO;AACV,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC,CACH;QACD;IACF;AAEA,IAAA,MAAM,UAAU,GACd,OAAO,OAAO,EAAE,QAAQ,KAAK;UACzB,OAAO,CAAC;AACV,UAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI;AAC1B,cAAE;cACA,CAAC;AAET,IAAA,MAAM,gBAAgB,GAAG,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,SAAS;AAEvF,IAAA,MAAM,cAAc,GAAG,oBAAoB,EAAE;AAC7C,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa;AACpE,IAAA,IAAI,GAA2B;IAC/B,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,OAAO,GAAG,gBAAgB,EAAE;AAClC,QAAA,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE;YACnB,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC;QAC7D;AAAO,aAAA,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE;YAC1B,GAAG,CAAC,IAAI,EAAE;YACV,GAAG,GAAG,SAAS;QACjB;AACF,IAAA,CAAC,CAAC;AACJ;AAsCA,SAAS,UAAU,CAAC,MAAqB,EAAA;AACvC,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;IACvC;AAAO,SAAA,IAAI,MAAM,YAAY,UAAU,EAAE;QACvC,OAAO,MAAM,CAAC,aAAa;IAC7B;SAAO;AACL,QAAA,OAAO,MAAM;IACf;AACF;AAEA,MAAM,eAAe,GAAmB;AACtC,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,QAAQ,EAAE,IAAI;CACf;AAED,MAAM,iBAAiB,CAAA;AACJ,IAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,UAAU,GAAG,KAAK;AAE1B,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACxB,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;AAOG;IACI,IAAI,CAAC,MAAqB,EAAE,OAAwB,EAAA;QACzD,OAAO,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE;AAC5C,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,EAAE,CAAC;SACf;QACD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QACxC,OAAO;AACL,YAAA,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE;SAC1B;IACH;AAEQ,IAAA,UAAU,CAChB,MAAqB,EACrB,OAAuB,EACvB,MAA6B,EAAA;AAE7B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB;QACF;AACA,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;YAC1C,CAAC,EAAE,EAAE,CAAC;YACN;QACF;QACA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAK;YAClB,YAAY,CAAC,OAAO,EAAE;AACtB,YAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;AACrB,gBAAA,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC;YACtC;YACA,OAAO,MAAM,CAAC,IAAI;AACpB,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,IAAI,GAAG,MAAK;AACjB,YAAA,MAAM,EAAE;AACR,YAAA,mBAAmB,EAAE;AACvB,QAAA,CAAC;QACD,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC;AACxD,QAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,YAAA,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;QAC3C;QACA,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;AAC1D,YAAA,MAAM,EAAE;AACV,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;QACzD;AACA,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE;YAChB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;QACvD;AACA,QAAA,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;QACjE;AACA,QAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,iBAAiB,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC;QAC/D;IACF;AACD;;AC7ND;;AAEG;;;;"}