@neural-ui/core 1.6.1 → 1.6.3

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 (202) hide show
  1. package/accordion/package.json +4 -0
  2. package/alert/package.json +4 -0
  3. package/autocomplete/package.json +4 -0
  4. package/avatar/package.json +4 -0
  5. package/badge/package.json +4 -0
  6. package/block-ui/package.json +4 -0
  7. package/breadcrumb/package.json +4 -0
  8. package/button/package.json +4 -0
  9. package/calendar/package.json +4 -0
  10. package/card/package.json +4 -0
  11. package/chart/package.json +4 -0
  12. package/checkbox/package.json +4 -0
  13. package/chip/package.json +4 -0
  14. package/code-block/package.json +4 -0
  15. package/color-picker/package.json +4 -0
  16. package/command-palette/package.json +4 -0
  17. package/confirm-dialog/package.json +4 -0
  18. package/context-menu/package.json +4 -0
  19. package/dashboard-grid/package.json +4 -0
  20. package/date-input/package.json +4 -0
  21. package/divider/package.json +4 -0
  22. package/empty-state/package.json +4 -0
  23. package/fesm2022/neural-ui-core-accordion.mjs +7 -11
  24. package/fesm2022/neural-ui-core-accordion.mjs.map +1 -1
  25. package/fesm2022/neural-ui-core-alert.mjs +14 -25
  26. package/fesm2022/neural-ui-core-alert.mjs.map +1 -1
  27. package/fesm2022/neural-ui-core-autocomplete.mjs +28 -53
  28. package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -1
  29. package/fesm2022/neural-ui-core-avatar.mjs +13 -23
  30. package/fesm2022/neural-ui-core-avatar.mjs.map +1 -1
  31. package/fesm2022/neural-ui-core-badge.mjs +9 -15
  32. package/fesm2022/neural-ui-core-badge.mjs.map +1 -1
  33. package/fesm2022/neural-ui-core-block-ui.mjs +11 -16
  34. package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -1
  35. package/fesm2022/neural-ui-core-breadcrumb.mjs +6 -8
  36. package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -1
  37. package/fesm2022/neural-ui-core-button.mjs +16 -29
  38. package/fesm2022/neural-ui-core-button.mjs.map +1 -1
  39. package/fesm2022/neural-ui-core-calendar.mjs +20 -37
  40. package/fesm2022/neural-ui-core-calendar.mjs.map +1 -1
  41. package/fesm2022/neural-ui-core-card.mjs +8 -13
  42. package/fesm2022/neural-ui-core-card.mjs.map +1 -1
  43. package/fesm2022/neural-ui-core-chart.mjs +24 -45
  44. package/fesm2022/neural-ui-core-chart.mjs.map +1 -1
  45. package/fesm2022/neural-ui-core-checkbox.mjs +9 -15
  46. package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -1
  47. package/fesm2022/neural-ui-core-chip.mjs +13 -23
  48. package/fesm2022/neural-ui-core-chip.mjs.map +1 -1
  49. package/fesm2022/neural-ui-core-code-block.mjs +17 -31
  50. package/fesm2022/neural-ui-core-code-block.mjs.map +1 -1
  51. package/fesm2022/neural-ui-core-color-picker.mjs +11 -19
  52. package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -1
  53. package/fesm2022/neural-ui-core-command-palette.mjs +11 -16
  54. package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -1
  55. package/fesm2022/neural-ui-core-confirm-dialog.mjs +6 -6
  56. package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -1
  57. package/fesm2022/neural-ui-core-context-menu.mjs +9 -12
  58. package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -1
  59. package/fesm2022/neural-ui-core-dashboard-grid.mjs +7 -11
  60. package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -1
  61. package/fesm2022/neural-ui-core-date-input.mjs +57 -111
  62. package/fesm2022/neural-ui-core-date-input.mjs.map +1 -1
  63. package/fesm2022/neural-ui-core-divider.mjs +5 -7
  64. package/fesm2022/neural-ui-core-divider.mjs.map +1 -1
  65. package/fesm2022/neural-ui-core-empty-state.mjs +8 -13
  66. package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -1
  67. package/fesm2022/neural-ui-core-filter-bar.mjs +11 -19
  68. package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -1
  69. package/fesm2022/neural-ui-core-icon.mjs +7 -11
  70. package/fesm2022/neural-ui-core-icon.mjs.map +1 -1
  71. package/fesm2022/neural-ui-core-image-gallery.mjs +13 -23
  72. package/fesm2022/neural-ui-core-image-gallery.mjs.map +1 -1
  73. package/fesm2022/neural-ui-core-image-viewer.mjs +14 -22
  74. package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -1
  75. package/fesm2022/neural-ui-core-input-otp.mjs +11 -19
  76. package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -1
  77. package/fesm2022/neural-ui-core-input.mjs +35 -67
  78. package/fesm2022/neural-ui-core-input.mjs.map +1 -1
  79. package/fesm2022/neural-ui-core-kanban.mjs +9 -15
  80. package/fesm2022/neural-ui-core-kanban.mjs.map +1 -1
  81. package/fesm2022/neural-ui-core-knob.mjs +22 -41
  82. package/fesm2022/neural-ui-core-knob.mjs.map +1 -1
  83. package/fesm2022/neural-ui-core-meter-group.mjs +13 -23
  84. package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -1
  85. package/fesm2022/neural-ui-core-modal.mjs +11 -16
  86. package/fesm2022/neural-ui-core-modal.mjs.map +1 -1
  87. package/fesm2022/neural-ui-core-multiselect.mjs +39 -72
  88. package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -1
  89. package/fesm2022/neural-ui-core-nav.mjs +13 -22
  90. package/fesm2022/neural-ui-core-nav.mjs.map +1 -1
  91. package/fesm2022/neural-ui-core-notification-center.mjs +9 -12
  92. package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -1
  93. package/fesm2022/neural-ui-core-number-input.mjs +19 -35
  94. package/fesm2022/neural-ui-core-number-input.mjs.map +1 -1
  95. package/fesm2022/neural-ui-core-pagination.mjs +9 -15
  96. package/fesm2022/neural-ui-core-pagination.mjs.map +1 -1
  97. package/fesm2022/neural-ui-core-popover.mjs +14 -22
  98. package/fesm2022/neural-ui-core-popover.mjs.map +1 -1
  99. package/fesm2022/neural-ui-core-progress-bar.mjs +11 -19
  100. package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -1
  101. package/fesm2022/neural-ui-core-radio.mjs +15 -24
  102. package/fesm2022/neural-ui-core-radio.mjs.map +1 -1
  103. package/fesm2022/neural-ui-core-rating.mjs +8 -13
  104. package/fesm2022/neural-ui-core-rating.mjs.map +1 -1
  105. package/fesm2022/neural-ui-core-rich-text-editor.mjs +28 -53
  106. package/fesm2022/neural-ui-core-rich-text-editor.mjs.map +1 -1
  107. package/fesm2022/neural-ui-core-scheduler-gantt.mjs +22 -41
  108. package/fesm2022/neural-ui-core-scheduler-gantt.mjs.map +1 -1
  109. package/fesm2022/neural-ui-core-select.mjs +43 -77
  110. package/fesm2022/neural-ui-core-select.mjs.map +1 -1
  111. package/fesm2022/neural-ui-core-sidebar.mjs +12 -21
  112. package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -1
  113. package/fesm2022/neural-ui-core-skeleton.mjs +7 -11
  114. package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -1
  115. package/fesm2022/neural-ui-core-slider.mjs +13 -23
  116. package/fesm2022/neural-ui-core-slider.mjs.map +1 -1
  117. package/fesm2022/neural-ui-core-spinner.mjs +10 -17
  118. package/fesm2022/neural-ui-core-spinner.mjs.map +1 -1
  119. package/fesm2022/neural-ui-core-split-button.mjs +15 -27
  120. package/fesm2022/neural-ui-core-split-button.mjs.map +1 -1
  121. package/fesm2022/neural-ui-core-splitter.mjs +6 -9
  122. package/fesm2022/neural-ui-core-splitter.mjs.map +1 -1
  123. package/fesm2022/neural-ui-core-stats-card.mjs +11 -19
  124. package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -1
  125. package/fesm2022/neural-ui-core-stepper.mjs +8 -13
  126. package/fesm2022/neural-ui-core-stepper.mjs.map +1 -1
  127. package/fesm2022/neural-ui-core-switch.mjs +9 -15
  128. package/fesm2022/neural-ui-core-switch.mjs.map +1 -1
  129. package/fesm2022/neural-ui-core-table.mjs +124 -242
  130. package/fesm2022/neural-ui-core-table.mjs.map +1 -1
  131. package/fesm2022/neural-ui-core-tabs.mjs +18 -30
  132. package/fesm2022/neural-ui-core-tabs.mjs.map +1 -1
  133. package/fesm2022/neural-ui-core-textarea.mjs +23 -43
  134. package/fesm2022/neural-ui-core-textarea.mjs.map +1 -1
  135. package/fesm2022/neural-ui-core-timeline-grid.mjs +12 -21
  136. package/fesm2022/neural-ui-core-timeline-grid.mjs.map +1 -1
  137. package/fesm2022/neural-ui-core-timeline.mjs +4 -5
  138. package/fesm2022/neural-ui-core-timeline.mjs.map +1 -1
  139. package/fesm2022/neural-ui-core-toast.mjs +8 -10
  140. package/fesm2022/neural-ui-core-toast.mjs.map +1 -1
  141. package/fesm2022/neural-ui-core-toggle-button-group.mjs +10 -17
  142. package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -1
  143. package/fesm2022/neural-ui-core-toolbar.mjs +8 -13
  144. package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -1
  145. package/fesm2022/neural-ui-core-tooltip.mjs +11 -16
  146. package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -1
  147. package/fesm2022/neural-ui-core-tree-table.mjs +30 -57
  148. package/fesm2022/neural-ui-core-tree-table.mjs.map +1 -1
  149. package/fesm2022/neural-ui-core-tree.mjs +17 -31
  150. package/fesm2022/neural-ui-core-tree.mjs.map +1 -1
  151. package/fesm2022/neural-ui-core-uploader.mjs +47 -91
  152. package/fesm2022/neural-ui-core-uploader.mjs.map +1 -1
  153. package/fesm2022/neural-ui-core-url-state.mjs +5 -7
  154. package/fesm2022/neural-ui-core-url-state.mjs.map +1 -1
  155. package/fesm2022/neural-ui-core-virtual-list.mjs +19 -32
  156. package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -1
  157. package/filter-bar/package.json +4 -0
  158. package/icon/package.json +4 -0
  159. package/image-gallery/package.json +4 -0
  160. package/image-viewer/package.json +4 -0
  161. package/input/package.json +4 -0
  162. package/input-otp/package.json +4 -0
  163. package/kanban/package.json +4 -0
  164. package/knob/package.json +4 -0
  165. package/meter-group/package.json +4 -0
  166. package/modal/package.json +4 -0
  167. package/multiselect/package.json +4 -0
  168. package/nav/package.json +4 -0
  169. package/notification-center/package.json +4 -0
  170. package/number-input/package.json +4 -0
  171. package/package.json +6 -6
  172. package/pagination/package.json +4 -0
  173. package/popover/package.json +4 -0
  174. package/progress-bar/package.json +4 -0
  175. package/radio/package.json +4 -0
  176. package/rating/package.json +4 -0
  177. package/rich-text-editor/package.json +4 -0
  178. package/scheduler-gantt/package.json +4 -0
  179. package/select/package.json +4 -0
  180. package/sidebar/package.json +4 -0
  181. package/skeleton/package.json +4 -0
  182. package/slider/package.json +4 -0
  183. package/spinner/package.json +4 -0
  184. package/split-button/package.json +4 -0
  185. package/splitter/package.json +4 -0
  186. package/stats-card/package.json +4 -0
  187. package/stepper/package.json +4 -0
  188. package/switch/package.json +4 -0
  189. package/table/package.json +4 -0
  190. package/tabs/package.json +4 -0
  191. package/textarea/package.json +4 -0
  192. package/timeline/package.json +4 -0
  193. package/timeline-grid/package.json +4 -0
  194. package/toast/package.json +4 -0
  195. package/toggle-button-group/package.json +4 -0
  196. package/toolbar/package.json +4 -0
  197. package/tooltip/package.json +4 -0
  198. package/tree/package.json +4 -0
  199. package/tree-table/package.json +4 -0
  200. package/uploader/package.json +4 -0
  201. package/url-state/package.json +4 -0
  202. package/virtual-list/package.json +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-uploader.mjs","sources":["../../../../projects/ui-core/uploader/neu-uploader.component.ts","../../../../projects/ui-core/uploader/neural-ui-core-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';\nimport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nexport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nlet _neuUploaderIdSeq = 0;\n\n@Component({\n selector: 'neu-uploader',\n imports: [NeuButtonComponent, NeuProgressBarComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuUploaderComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-uploader-host',\n '[class.neu-uploader-host--sm]': 'size() === \"sm\"',\n '[class.neu-uploader-host--lg]': 'size() === \"lg\"',\n },\n template: `\n @if (label()) {\n <label class=\"neu-uploader__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <input\n #fileInput\n class=\"neu-uploader__native-input\"\n [id]=\"inputId()\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n (change)=\"onNativeInputChange($event)\"\n />\n\n <div\n class=\"neu-uploader\"\n [class.neu-uploader--disabled]=\"isDisabledFinal()\"\n [class.neu-uploader--drag-over]=\"isDragOver()\"\n [class.neu-uploader--error]=\"hasError()\"\n [class.neu-uploader--has-files]=\"fileItems().length > 0\"\n [class.neu-uploader--picker-only]=\"!dropzone()\"\n >\n @if (dropzone()) {\n <div\n class=\"neu-uploader__dropzone\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"neu-uploader__empty-icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div class=\"neu-uploader__copy\">\n <p class=\"neu-uploader__headline\">{{ headlineText() }}</p>\n <p class=\"neu-uploader__description\">{{ descriptionText() }}</p>\n </div>\n\n <div class=\"neu-uploader__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n {{ chooseLabel() }}\n </button>\n @if (fileItems().length > 0) {\n <button\n neu-button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n (click)=\"clearFiles($event)\"\n >\n {{ clearLabel() }}\n </button>\n }\n </div>\n </div>\n } @else {\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n icon=\"lucideUpload\"\n class=\"neu-uploader__picker-trigger\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"pickerButtonAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n >\n @if (showPickerText() && chooseLabel()) {\n {{ chooseLabel() }}\n }\n </button>\n }\n\n @if (shouldShowProgress()) {\n <div class=\"neu-uploader__progress\">\n <neu-progress-bar\n [value]=\"progress() ?? 0\"\n [label]=\"progressLabel()\"\n [showValue]=\"true\"\n size=\"sm\"\n />\n </div>\n }\n\n @if (fileItems().length > 0) {\n <div class=\"neu-uploader__summary\">\n <span>{{ summaryText() }}</span>\n @if (maxFiles() !== null) {\n <span>{{ fileItems().length }}/{{ maxFiles() }}</span>\n }\n </div>\n\n <ul class=\"neu-uploader__list\" [attr.aria-label]=\"listAriaLabel()\">\n @for (item of fileItems(); track item.id) {\n <li class=\"neu-uploader__item\">\n <div class=\"neu-uploader__item-main\">\n <span class=\"neu-uploader__item-name\">{{ item.name }}</span>\n <span class=\"neu-uploader__item-meta\">{{ formatBytes(item.size) }}</span>\n </div>\n <button\n class=\"neu-uploader__remove\"\n type=\"button\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"removeAriaLabel() + ' ' + item.name\"\n (click)=\"removeFile(item.id, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n\n @if (hasError()) {\n <p class=\"neu-uploader__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n {{ displayErrorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-uploader__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-uploader.component.scss',\n})\nexport class NeuUploaderComponent implements ControlValueAccessor {\n readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n label = input<string>('');\n hint = input<string>('');\n errorMessage = input<string>('');\n placeholder = input<string>('Drag files here or select them from your device.');\n pickerDescription = input<string>('Use the button below to choose files from your device.');\n dropzoneLabel = input<string>('Drop files here to add them');\n chooseLabel = input<string>('Choose files');\n clearLabel = input<string>('Clear');\n progressLabel = input<string>('Upload in progress');\n showPickerText = input<boolean>(false);\n showProgress = input<boolean>(true);\n listAriaLabel = input<string>('Selected files');\n removeAriaLabel = input<string>('Remove file');\n acceptedTypesLabel = input<string>('Allowed types');\n maxFileSizeTextLabel = input<string>('Max size');\n fileCountSingularLabel = input<string>('file');\n fileCountPluralLabel = input<string>('files');\n emptySelectionMessage = input<string>('No file was selected.');\n invalidTypeMessage = input<string>('File {{fileName}} does not match the allowed file types.');\n maxFileSizeMessage = input<string>('File {{fileName}} exceeds the allowed maximum size.');\n duplicateFileMessage = input<string>('File {{fileName}} has already been selected.');\n maxFilesMessage = input<string>('You can only select up to {{maxFiles}} files.');\n accept = input<string>('');\n multiple = input<boolean>(true);\n dropzone = input<boolean>(true);\n disabled = input<boolean>(false);\n size = input<NeuUploaderSize>('md');\n maxFiles = input<number | null>(null);\n maxFileSize = input<number | null>(null);\n progress = input<number | null>(null);\n\n readonly filesSelected = output<File[]>();\n readonly fileRemoved = output<File>();\n readonly filesRejected = output<NeuUploaderError[]>();\n readonly cleared = output<void>();\n\n readonly inputId = input<string>(`neu-uploader-${++_neuUploaderIdSeq}`);\n\n protected readonly isDragOver = signal(false);\n protected readonly internalErrors = signal<NeuUploaderError[]>([]);\n protected readonly fileItems = signal<NeuUploaderFileItem[]>([]);\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled());\n readonly hasError = computed(() => !!this.displayErrorMessage());\n readonly shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null);\n readonly pickerButtonAriaLabel = computed(() =>\n this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(),\n );\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this.inputId()}-error`;\n }\n return this.hint() ? `${this.inputId()}-hint` : null;\n });\n readonly headlineText = computed(() =>\n this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(),\n );\n readonly descriptionText = computed(() => {\n const parts: string[] = [this.dropzone() ? this.placeholder() : this.pickerDescription()];\n if (this.accept()) {\n parts.push(`${this.acceptedTypesLabel()}: ${this.accept()}`);\n }\n if (this.maxFileSize() !== null) {\n parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);\n }\n return parts.join(' · ');\n });\n readonly summaryText = computed(() => {\n const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);\n const fileCount = this.fileItems().length;\n return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;\n });\n readonly displayErrorMessage = computed(() => {\n if (this.errorMessage()) {\n return this.errorMessage();\n }\n const [first] = this.internalErrors();\n return first?.message ?? '';\n });\n\n writeValue(value: File[] | File | null | undefined): void {\n if (!value) {\n this.fileItems.set([]);\n return;\n }\n\n const files = Array.isArray(value) ? value : [value];\n this.fileItems.set(files.map((file) => this.toItem(file)));\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n openFilePicker(): void {\n if (this.isDisabledFinal()) {\n return;\n }\n\n this.onTouched();\n this.fileInput().nativeElement.click();\n }\n\n onDropzoneKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.openFilePicker();\n }\n\n onNativeInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.consumeFiles(input.files);\n input.value = '';\n }\n\n onDragOver(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n if (!this.dropzone()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n this.consumeFiles(event.dataTransfer?.files ?? null);\n }\n\n removeFile(id: string, event?: Event): void {\n event?.stopPropagation();\n const current = this.fileItems();\n const match = current.find((item) => item.id === id);\n if (!match) {\n return;\n }\n\n const next = current.filter((item) => item.id !== id);\n this.fileItems.set(next);\n this.internalErrors.set([]);\n this.emitValue(next);\n this.fileRemoved.emit(match.file);\n this.onTouched();\n }\n\n clearFiles(event?: Event): void {\n event?.stopPropagation();\n this.fileItems.set([]);\n this.internalErrors.set([]);\n this.fileInput().nativeElement.value = '';\n this.emitValue([]);\n this.cleared.emit();\n this.onTouched();\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B';\n }\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const base = 1024;\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n const size = bytes / Math.pow(base, exponent);\n return `${size.toFixed(size >= 10 || exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }\n\n private consumeFiles(list: FileList | null): void {\n if (!list || list.length === 0) {\n this.reportErrors([\n {\n code: 'empty-selection',\n message: this.emptySelectionMessage(),\n },\n ]);\n return;\n }\n\n this.onTouched();\n const incoming = Array.from(list);\n const current = this.fileItems();\n const nextItems = this.multiple() ? [...current] : [];\n const errors: NeuUploaderError[] = [];\n const existingIds = new Set(nextItems.map((item) => item.id));\n\n for (const file of incoming) {\n if (!this.isAcceptedType(file)) {\n errors.push({\n code: 'accept',\n file,\n message: this.interpolate(this.invalidTypeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFileSize() !== null && file.size > (this.maxFileSize() ?? 0)) {\n errors.push({\n code: 'max-file-size',\n file,\n message: this.interpolate(this.maxFileSizeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n const item = this.toItem(file);\n if (existingIds.has(item.id)) {\n errors.push({\n code: 'duplicate',\n file,\n message: this.interpolate(this.duplicateFileMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFiles() !== null && nextItems.length >= (this.maxFiles() ?? 0)) {\n errors.push({\n code: 'max-files',\n file,\n message: this.interpolate(this.maxFilesMessage(), {\n maxFiles: String(this.maxFiles() ?? 0),\n }),\n });\n continue;\n }\n\n nextItems.push(item);\n existingIds.add(item.id);\n\n if (!this.multiple()) {\n break;\n }\n }\n\n this.fileItems.set(nextItems);\n this.internalErrors.set(errors);\n this.emitValue(nextItems);\n this.filesSelected.emit(nextItems.map((item) => item.file));\n\n if (errors.length > 0) {\n this.filesRejected.emit(errors);\n }\n }\n\n private emitValue(items: NeuUploaderFileItem[]): void {\n this.onChange(items.map((item) => item.file));\n }\n\n private toItem(file: File): NeuUploaderFileItem {\n return {\n id: this.fileSignature(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n progress: this.progress(),\n };\n }\n\n private fileSignature(file: File): string {\n return `${file.name}__${file.size}__${file.lastModified}`;\n }\n\n private reportErrors(errors: NeuUploaderError[]): void {\n this.internalErrors.set(errors);\n this.filesRejected.emit(errors);\n }\n\n private interpolate(template: string, values: Record<string, string>): string {\n return Object.entries(values).reduce(\n (result, [key, value]) => result.replaceAll(`{{${key}}}`, value),\n template,\n );\n }\n\n private isAcceptedType(file: File): boolean {\n const accept = this.accept().trim();\n if (!accept) {\n return true;\n }\n\n const acceptedTypes = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n\n return acceptedTypes.some((rule) => {\n if (rule.startsWith('.')) {\n return fileName.endsWith(rule);\n }\n\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === rule;\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-uploader.mjs","sources":["../../../../projects/ui-core/uploader/neu-uploader.component.ts","../../../../projects/ui-core/uploader/neural-ui-core-uploader.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NeuButtonComponent } from '@neural-ui/core/button';\nimport { NeuProgressBarComponent } from '@neural-ui/core/progress-bar';\nimport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nexport type { NeuUploaderError, NeuUploaderFileItem, NeuUploaderSize } from './neu-uploader.types';\n\nlet _neuUploaderIdSeq = 0;\n\n@Component({\n selector: 'neu-uploader',\n imports: [NeuButtonComponent, NeuProgressBarComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NeuUploaderComponent),\n multi: true,\n },\n ],\n host: {\n class: 'neu-uploader-host',\n '[class.neu-uploader-host--sm]': 'size() === \"sm\"',\n '[class.neu-uploader-host--lg]': 'size() === \"lg\"',\n },\n template: `\n @if (label()) {\n <label class=\"neu-uploader__label\" [for]=\"inputId()\">{{ label() }}</label>\n }\n\n <input\n #fileInput\n class=\"neu-uploader__native-input\"\n [id]=\"inputId()\"\n type=\"file\"\n [attr.accept]=\"accept() || null\"\n [attr.multiple]=\"multiple() ? '' : null\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"hasError() ? 'true' : null\"\n (change)=\"onNativeInputChange($event)\"\n />\n\n <div\n class=\"neu-uploader\"\n [class.neu-uploader--disabled]=\"isDisabledFinal()\"\n [class.neu-uploader--drag-over]=\"isDragOver()\"\n [class.neu-uploader--error]=\"hasError()\"\n [class.neu-uploader--has-files]=\"fileItems().length > 0\"\n [class.neu-uploader--picker-only]=\"!dropzone()\"\n >\n @if (dropzone()) {\n <div\n class=\"neu-uploader__dropzone\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div class=\"neu-uploader__empty-icon\" aria-hidden=\"true\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n </div>\n\n <div class=\"neu-uploader__copy\">\n <p class=\"neu-uploader__headline\">{{ headlineText() }}</p>\n <p class=\"neu-uploader__description\">{{ descriptionText() }}</p>\n </div>\n\n <div class=\"neu-uploader__actions\">\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n (click)=\"openFilePicker(); $event.stopPropagation()\"\n >\n {{ chooseLabel() }}\n </button>\n @if (fileItems().length > 0) {\n <button\n neu-button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n (click)=\"clearFiles($event)\"\n >\n {{ clearLabel() }}\n </button>\n }\n </div>\n </div>\n } @else {\n <button\n neu-button\n type=\"button\"\n variant=\"primary\"\n size=\"sm\"\n icon=\"lucideUpload\"\n class=\"neu-uploader__picker-trigger\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"pickerButtonAriaLabel()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n >\n @if (showPickerText() && chooseLabel()) {\n {{ chooseLabel() }}\n }\n </button>\n }\n\n @if (shouldShowProgress()) {\n <div class=\"neu-uploader__progress\">\n <neu-progress-bar\n [value]=\"progress() ?? 0\"\n [label]=\"progressLabel()\"\n [showValue]=\"true\"\n size=\"sm\"\n />\n </div>\n }\n\n @if (fileItems().length > 0) {\n <div class=\"neu-uploader__summary\">\n <span>{{ summaryText() }}</span>\n @if (maxFiles() !== null) {\n <span>{{ fileItems().length }}/{{ maxFiles() }}</span>\n }\n </div>\n\n <ul class=\"neu-uploader__list\" [attr.aria-label]=\"listAriaLabel()\">\n @for (item of fileItems(); track item.id) {\n <li class=\"neu-uploader__item\">\n <div class=\"neu-uploader__item-main\">\n <span class=\"neu-uploader__item-name\">{{ item.name }}</span>\n <span class=\"neu-uploader__item-meta\">{{ formatBytes(item.size) }}</span>\n </div>\n <button\n class=\"neu-uploader__remove\"\n type=\"button\"\n [disabled]=\"isDisabledFinal()\"\n [attr.aria-label]=\"removeAriaLabel() + ' ' + item.name\"\n (click)=\"removeFile(item.id, $event)\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n\n @if (hasError()) {\n <p class=\"neu-uploader__error\" [id]=\"inputId() + '-error'\" role=\"alert\">\n {{ displayErrorMessage() }}\n </p>\n } @else if (hint()) {\n <p class=\"neu-uploader__hint\" [id]=\"inputId() + '-hint'\">{{ hint() }}</p>\n }\n `,\n styleUrl: './neu-uploader.component.scss',\n})\nexport class NeuUploaderComponent implements ControlValueAccessor {\n readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\n\n label = input<string>('');\n hint = input<string>('');\n errorMessage = input<string>('');\n placeholder = input<string>('Drag files here or select them from your device.');\n pickerDescription = input<string>('Use the button below to choose files from your device.');\n dropzoneLabel = input<string>('Drop files here to add them');\n chooseLabel = input<string>('Choose files');\n clearLabel = input<string>('Clear');\n progressLabel = input<string>('Upload in progress');\n showPickerText = input<boolean>(false);\n showProgress = input<boolean>(true);\n listAriaLabel = input<string>('Selected files');\n removeAriaLabel = input<string>('Remove file');\n acceptedTypesLabel = input<string>('Allowed types');\n maxFileSizeTextLabel = input<string>('Max size');\n fileCountSingularLabel = input<string>('file');\n fileCountPluralLabel = input<string>('files');\n emptySelectionMessage = input<string>('No file was selected.');\n invalidTypeMessage = input<string>('File {{fileName}} does not match the allowed file types.');\n maxFileSizeMessage = input<string>('File {{fileName}} exceeds the allowed maximum size.');\n duplicateFileMessage = input<string>('File {{fileName}} has already been selected.');\n maxFilesMessage = input<string>('You can only select up to {{maxFiles}} files.');\n accept = input<string>('');\n multiple = input<boolean>(true);\n dropzone = input<boolean>(true);\n disabled = input<boolean>(false);\n size = input<NeuUploaderSize>('md');\n maxFiles = input<number | null>(null);\n maxFileSize = input<number | null>(null);\n progress = input<number | null>(null);\n\n readonly filesSelected = output<File[]>();\n readonly fileRemoved = output<File>();\n readonly filesRejected = output<NeuUploaderError[]>();\n readonly cleared = output<void>();\n\n readonly inputId = input<string>(`neu-uploader-${++_neuUploaderIdSeq}`);\n\n protected readonly isDragOver = signal(false);\n protected readonly internalErrors = signal<NeuUploaderError[]>([]);\n protected readonly fileItems = signal<NeuUploaderFileItem[]>([]);\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: File[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n readonly isDisabledFinal = computed(() => this.disabled() || this.cvaDisabled());\n readonly hasError = computed(() => !!this.displayErrorMessage());\n readonly shouldShowProgress = computed(() => this.showProgress() && this.progress() !== null);\n readonly pickerButtonAriaLabel = computed(() =>\n this.showPickerText() && this.chooseLabel() ? null : this.chooseLabel(),\n );\n readonly describedBy = computed(() => {\n if (this.hasError()) {\n return `${this.inputId()}-error`;\n }\n return this.hint() ? `${this.inputId()}-hint` : null;\n });\n readonly headlineText = computed(() =>\n this.isDragOver() && this.dropzone() ? this.dropzoneLabel() : this.chooseLabel(),\n );\n readonly descriptionText = computed(() => {\n const parts: string[] = [this.dropzone() ? this.placeholder() : this.pickerDescription()];\n if (this.accept()) {\n parts.push(`${this.acceptedTypesLabel()}: ${this.accept()}`);\n }\n if (this.maxFileSize() !== null) {\n parts.push(`${this.maxFileSizeTextLabel()}: ${this.formatBytes(this.maxFileSize() ?? 0)}`);\n }\n return parts.join(' · ');\n });\n readonly summaryText = computed(() => {\n const totalSize = this.fileItems().reduce((acc, item) => acc + item.size, 0);\n const fileCount = this.fileItems().length;\n return `${fileCount} ${fileCount === 1 ? this.fileCountSingularLabel() : this.fileCountPluralLabel()} · ${this.formatBytes(totalSize)}`;\n });\n readonly displayErrorMessage = computed(() => {\n if (this.errorMessage()) {\n return this.errorMessage();\n }\n const [first] = this.internalErrors();\n return first?.message ?? '';\n });\n\n writeValue(value: File[] | File | null | undefined): void {\n if (!value) {\n this.fileItems.set([]);\n return;\n }\n\n const files = Array.isArray(value) ? value : [value];\n this.fileItems.set(files.map((file) => this.toItem(file)));\n }\n\n registerOnChange(fn: (value: File[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n\n openFilePicker(): void {\n if (this.isDisabledFinal()) {\n return;\n }\n\n this.onTouched();\n this.fileInput().nativeElement.click();\n }\n\n onDropzoneKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.openFilePicker();\n }\n\n onNativeInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.consumeFiles(input.files);\n input.value = '';\n }\n\n onDragOver(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(true);\n }\n\n onDragLeave(event: DragEvent): void {\n if (!this.dropzone()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n }\n\n onDrop(event: DragEvent): void {\n if (!this.dropzone() || this.isDisabledFinal()) {\n return;\n }\n event.preventDefault();\n this.isDragOver.set(false);\n this.consumeFiles(event.dataTransfer?.files ?? null);\n }\n\n removeFile(id: string, event?: Event): void {\n event?.stopPropagation();\n const current = this.fileItems();\n const match = current.find((item) => item.id === id);\n if (!match) {\n return;\n }\n\n const next = current.filter((item) => item.id !== id);\n this.fileItems.set(next);\n this.internalErrors.set([]);\n this.emitValue(next);\n this.fileRemoved.emit(match.file);\n this.onTouched();\n }\n\n clearFiles(event?: Event): void {\n event?.stopPropagation();\n this.fileItems.set([]);\n this.internalErrors.set([]);\n this.fileInput().nativeElement.value = '';\n this.emitValue([]);\n this.cleared.emit();\n this.onTouched();\n }\n\n formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B';\n }\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const base = 1024;\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n const size = bytes / Math.pow(base, exponent);\n return `${size.toFixed(size >= 10 || exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n }\n\n private consumeFiles(list: FileList | null): void {\n if (!list || list.length === 0) {\n this.reportErrors([\n {\n code: 'empty-selection',\n message: this.emptySelectionMessage(),\n },\n ]);\n return;\n }\n\n this.onTouched();\n const incoming = Array.from(list);\n const current = this.fileItems();\n const nextItems = this.multiple() ? [...current] : [];\n const errors: NeuUploaderError[] = [];\n const existingIds = new Set(nextItems.map((item) => item.id));\n\n for (const file of incoming) {\n if (!this.isAcceptedType(file)) {\n errors.push({\n code: 'accept',\n file,\n message: this.interpolate(this.invalidTypeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFileSize() !== null && file.size > (this.maxFileSize() ?? 0)) {\n errors.push({\n code: 'max-file-size',\n file,\n message: this.interpolate(this.maxFileSizeMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n const item = this.toItem(file);\n if (existingIds.has(item.id)) {\n errors.push({\n code: 'duplicate',\n file,\n message: this.interpolate(this.duplicateFileMessage(), { fileName: file.name }),\n });\n continue;\n }\n\n if (this.maxFiles() !== null && nextItems.length >= (this.maxFiles() ?? 0)) {\n errors.push({\n code: 'max-files',\n file,\n message: this.interpolate(this.maxFilesMessage(), {\n maxFiles: String(this.maxFiles() ?? 0),\n }),\n });\n continue;\n }\n\n nextItems.push(item);\n existingIds.add(item.id);\n\n if (!this.multiple()) {\n break;\n }\n }\n\n this.fileItems.set(nextItems);\n this.internalErrors.set(errors);\n this.emitValue(nextItems);\n this.filesSelected.emit(nextItems.map((item) => item.file));\n\n if (errors.length > 0) {\n this.filesRejected.emit(errors);\n }\n }\n\n private emitValue(items: NeuUploaderFileItem[]): void {\n this.onChange(items.map((item) => item.file));\n }\n\n private toItem(file: File): NeuUploaderFileItem {\n return {\n id: this.fileSignature(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n progress: this.progress(),\n };\n }\n\n private fileSignature(file: File): string {\n return `${file.name}__${file.size}__${file.lastModified}`;\n }\n\n private reportErrors(errors: NeuUploaderError[]): void {\n this.internalErrors.set(errors);\n this.filesRejected.emit(errors);\n }\n\n private interpolate(template: string, values: Record<string, string>): string {\n return Object.entries(values).reduce(\n (result, [key, value]) => result.replaceAll(`{{${key}}}`, value),\n template,\n );\n }\n\n private isAcceptedType(file: File): boolean {\n const accept = this.accept().trim();\n if (!accept) {\n return true;\n }\n\n const acceptedTypes = accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean);\n\n const fileName = file.name.toLowerCase();\n const mimeType = file.type.toLowerCase();\n\n return acceptedTypes.some((rule) => {\n if (rule.startsWith('.')) {\n return fileName.endsWith(rule);\n }\n\n if (rule.endsWith('/*')) {\n const prefix = rule.slice(0, -1);\n return mimeType.startsWith(prefix);\n }\n\n return mimeType === rule;\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;AAmBA,IAAI,iBAAiB,GAAG,CAAC;MAkLZ,oBAAoB,CAAA;AACtB,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA+B,WAAW,CAAC;AAElF,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;AACxB,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;AAChC,IAAA,WAAW,GAAG,KAAK,CAAS,kDAAkD,kFAAC;AAC/E,IAAA,iBAAiB,GAAG,KAAK,CAAS,wDAAwD,wFAAC;AAC3F,IAAA,aAAa,GAAG,KAAK,CAAS,6BAA6B,oFAAC;AAC5D,IAAA,WAAW,GAAG,KAAK,CAAS,cAAc,kFAAC;AAC3C,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,iFAAC;AACnC,IAAA,aAAa,GAAG,KAAK,CAAS,oBAAoB,oFAAC;AACnD,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,qFAAC;AACtC,IAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;AACnC,IAAA,aAAa,GAAG,KAAK,CAAS,gBAAgB,oFAAC;AAC/C,IAAA,eAAe,GAAG,KAAK,CAAS,aAAa,sFAAC;AAC9C,IAAA,kBAAkB,GAAG,KAAK,CAAS,eAAe,yFAAC;AACnD,IAAA,oBAAoB,GAAG,KAAK,CAAS,UAAU,2FAAC;AAChD,IAAA,sBAAsB,GAAG,KAAK,CAAS,MAAM,6FAAC;AAC9C,IAAA,oBAAoB,GAAG,KAAK,CAAS,OAAO,2FAAC;AAC7C,IAAA,qBAAqB,GAAG,KAAK,CAAS,uBAAuB,4FAAC;AAC9D,IAAA,kBAAkB,GAAG,KAAK,CAAS,0DAA0D,yFAAC;AAC9F,IAAA,kBAAkB,GAAG,KAAK,CAAS,qDAAqD,yFAAC;AACzF,IAAA,oBAAoB,GAAG,KAAK,CAAS,8CAA8C,2FAAC;AACpF,IAAA,eAAe,GAAG,KAAK,CAAS,+CAA+C,sFAAC;AAChF,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAC1B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAkB,IAAI,2EAAC;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACxC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;IAE5B,aAAa,GAAG,MAAM,EAAU;IAChC,WAAW,GAAG,MAAM,EAAQ;IAC5B,aAAa,GAAG,MAAM,EAAsB;IAC5C,OAAO,GAAG,MAAM,EAAQ;IAExB,OAAO,GAAG,KAAK,CAAS,CAAA,aAAA,EAAgB,EAAE,iBAAiB,CAAA,CAAE,8EAAC;AAEpD,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAC1B,IAAA,cAAc,GAAG,MAAM,CAAqB,EAAE,qFAAC;AAC/C,IAAA,SAAS,GAAG,MAAM,CAAwB,EAAE,gFAAC;AAE/C,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AACpC,IAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAE/B,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sFAAC;AACvE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,+EAAC;AACvD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,yFAAC;IACpF,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxE;AACQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ;QAClC;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,CAAA,KAAA,CAAO,GAAG,IAAI;AACtD,IAAA,CAAC,kFAAC;AACO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,mFACjF;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACvC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzF,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,CAAC;QAC9D;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA,CAAE,CAAC;QAC5F;AACA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,IAAA,CAAC,sFAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM;AACzC,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,KAAK,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA,CAAE;AACzI,IAAA,CAAC,kFAAC;AACO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;QAC5B;QACA,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,QAAA,OAAO,KAAK,EAAE,OAAO,IAAI,EAAE;AAC7B,IAAA,CAAC,0FAAC;AAEF,IAAA,UAAU,CAAC,KAAuC,EAAA;QAChD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACxC;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,mBAAmB,CAAC,KAAY,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9B,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC9C;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,WAAW,CAAC,KAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC9C;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC;IACtD;IAEA,UAAU,CAAC,EAAU,EAAE,KAAa,EAAA;QAClC,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE;YACV;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI;AACjB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACzF,QAAA,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC7C,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAC,CAAA,CAAE;IACnF;AAEQ,IAAA,YAAY,CAAC,IAAqB,EAAA;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,YAAY,CAAC;AAChB,gBAAA;AACE,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACtC,iBAAA;AACF,aAAA,CAAC;YACF;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;QAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE;QACrD,MAAM,MAAM,GAAuB,EAAE;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;AAE7D,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;gBAC9B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,QAAQ;oBACd,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9E,iBAAA,CAAC;gBACF;YACF;YAEA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE;gBACxE,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,eAAe;oBACrB,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9E,iBAAA,CAAC;gBACF;YACF;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAC5B,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,WAAW;oBACjB,IAAI;AACJ,oBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAChF,iBAAA,CAAC;gBACF;YACF;YAEA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE;gBAC1E,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,WAAW;oBACjB,IAAI;oBACJ,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;wBAChD,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;qBACvC,CAAC;AACH,iBAAA,CAAC;gBACF;YACF;AAEA,YAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACpB,YAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAExB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACpB;YACF;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3D,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC;IACF;AAEQ,IAAA,SAAS,CAAC,KAA4B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C;AAEQ,IAAA,MAAM,CAAC,IAAU,EAAA;QACvB,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAC5B,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;SAC1B;IACH;AAEQ,IAAA,aAAa,CAAC,IAAU,EAAA;AAC9B,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,CAAC,YAAY,EAAE;IAC3D;AAEQ,IAAA,YAAY,CAAC,MAA0B,EAAA;AAC7C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;IAEQ,WAAW,CAAC,QAAgB,EAAE,MAA8B,EAAA;AAClE,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAClC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC,EAChE,QAAQ,CACT;IACH;AAEQ,IAAA,cAAc,CAAC,IAAU,EAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,aAAa,GAAG;aACnB,KAAK,CAAC,GAAG;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;aACvC,MAAM,CAAC,OAAO,CAAC;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAExC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;AACjC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACxB,gBAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC;AAEA,YAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,gBAAA,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC;YAEA,OAAO,QAAQ,KAAK,IAAI;AAC1B,QAAA,CAAC,CAAC;IACJ;wGArUW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,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,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,6BAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,mBAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,SAAA,EA3KpB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAMS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,g4KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA3KS,kBAAkB,wMAAE,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FA8K1C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhLhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,EAAA,aAAA,EACvC,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC1B,wBAAA,+BAA+B,EAAE,iBAAiB;AAClD,wBAAA,+BAA+B,EAAE,iBAAiB;qBACnD,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4JT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,g4KAAA,CAAA,EAAA;uEAIqE,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,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,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,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,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,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,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,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,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,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,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,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,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,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,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACtMnF;;AAEG;;;;"}
@@ -23,8 +23,7 @@ class NeuUrlStateService {
23
23
  _pendingParams = {};
24
24
  _pendingReplaceUrl = true;
25
25
  _batchScheduled = false;
26
- _pendingParamsState = signal({}, /* @ts-ignore */
27
- ...(ngDevMode ? [{ debugName: "_pendingParamsState" }] : /* istanbul ignore next */ []));
26
+ _pendingParamsState = signal({}, ...(ngDevMode ? [{ debugName: "_pendingParamsState" }] : /* istanbul ignore next */ []));
28
27
  _routerParams;
29
28
  /**
30
29
  * Signal con el mapa completo de queryParams actual.
@@ -53,8 +52,7 @@ class NeuUrlStateService {
53
52
  mergedParams[key] = value;
54
53
  }
55
54
  return mergedParams;
56
- }, /* @ts-ignore */
57
- ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
55
+ }, ...(ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []));
58
56
  }
59
57
  /**
60
58
  * Devuelve un Signal reactivo con el valor del parámetro indicado.
@@ -162,10 +160,10 @@ class NeuUrlStateService {
162
160
  replaceUrl,
163
161
  });
164
162
  }
165
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, deps: [{ token: i0.Injector }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
166
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, providedIn: 'root' });
163
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuUrlStateService, deps: [{ token: i0.Injector }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
164
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuUrlStateService, providedIn: 'root' });
167
165
  }
168
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuUrlStateService, decorators: [{
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuUrlStateService, decorators: [{
169
167
  type: Injectable,
170
168
  args: [{ providedIn: 'root' }]
171
169
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }] });
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n private _pendingParams: Record<string, string | null> = {};\n private _pendingReplaceUrl = true;\n private _batchScheduled = false;\n private readonly _pendingParamsState = signal<Record<string, string | null>>({});\n private readonly _routerParams: Signal<Params>;\n\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this._routerParams = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n\n this.params = computed(() => {\n const currentParams = this._routerParams();\n const pendingParams = this._pendingParamsState();\n if (Object.keys(pendingParams).length === 0) {\n return currentParams;\n }\n\n const mergedParams: Params = { ...currentParams };\n for (const [key, value] of Object.entries(pendingParams)) {\n if (value === null) {\n delete mergedParams[key];\n continue;\n }\n mergedParams[key] = value;\n }\n\n return mergedParams;\n });\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n this._pendingParams[key] = value;\n this._pendingParamsState.set({ ...this._pendingParams });\n this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;\n this._schedulePendingNavigation();\n }\n\n private _schedulePendingNavigation(): void {\n if (this._batchScheduled) {\n return;\n }\n\n this._batchScheduled = true;\n queueMicrotask(() => {\n const pending = this._consumePendingNavigation();\n if (!pending) {\n return;\n }\n\n void this.router\n .navigate([], {\n queryParams: pending.params,\n queryParamsHandling: 'merge',\n replaceUrl: pending.replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(pending.params));\n });\n }\n\n private _consumePendingNavigation(): {\n params: Record<string, string | null>;\n replaceUrl: boolean;\n } | null {\n const hasPendingParams = Object.keys(this._pendingParams).length > 0;\n const replaceUrl = this._pendingReplaceUrl;\n const params = { ...this._pendingParams };\n\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n\n if (!hasPendingParams) {\n return null;\n }\n\n return { params, replaceUrl };\n }\n\n private _resetPendingNavigation(): void {\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n }\n\n private _finalizePendingNavigation(flushedParams: Record<string, string | null>): void {\n const currentVisiblePending = { ...this._pendingParamsState() };\n let changed = false;\n\n for (const [key, value] of Object.entries(flushedParams)) {\n if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {\n continue;\n }\n\n if (currentVisiblePending[key] === value) {\n delete currentVisiblePending[key];\n changed = true;\n }\n }\n\n if (changed) {\n this._pendingParamsState.set(currentVisiblePending);\n }\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n const pending = this._consumePendingNavigation();\n const mergedParams = pending ? { ...pending.params, ...params } : params;\n this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });\n void this.router\n .navigate([], {\n queryParams: mergedParams,\n queryParamsHandling: 'merge',\n replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(mergedParams));\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n this._resetPendingNavigation();\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-url-state.mjs","sources":["../../../../projects/ui-core/url-state/neu-url-state.service.ts","../../../../projects/ui-core/url-state/neural-ui-core-url-state.ts"],"sourcesContent":["import { Injectable, Injector, Signal, computed, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map, startWith } from 'rxjs/operators';\n\n/**\n * NeuUrlStateService — El Sistema Nervioso de NeuralUI\n *\n * Sincroniza el estado de la UI con los QueryParams de la URL.\n * Completamente reactivo via Angular Signals.\n *\n * Uso:\n * const urlState = inject(NeuUrlStateService);\n * const page = urlState.getParam('page'); // Signal<string | null>\n * urlState.setParam('menu', 'open'); // Actualiza ?menu=open\n * urlState.patchParams({ page: '2', q: 'filter' }); // Actualiza múltiples\n */\n@Injectable({ providedIn: 'root' })\nexport class NeuUrlStateService {\n private _pendingParams: Record<string, string | null> = {};\n private _pendingReplaceUrl = true;\n private _batchScheduled = false;\n private readonly _pendingParamsState = signal<Record<string, string | null>>({});\n private readonly _routerParams: Signal<Params>;\n\n /**\n * Signal con el mapa completo de queryParams actual.\n * Se actualiza automáticamente en cada NavigationEnd.\n */\n readonly params: Signal<Params>;\n\n constructor(\n private readonly injector: Injector,\n private readonly router: Router,\n ) {\n this._routerParams = toSignal(\n this.router.events.pipe(\n filter((e): e is NavigationEnd => e instanceof NavigationEnd),\n startWith(null as null),\n map(() => this.router.parseUrl(this.router.url).queryParams as Params),\n ),\n {\n initialValue: this.router.parseUrl(this.router.url).queryParams as Params,\n injector: this.injector,\n },\n );\n\n this.params = computed(() => {\n const currentParams = this._routerParams();\n const pendingParams = this._pendingParamsState();\n if (Object.keys(pendingParams).length === 0) {\n return currentParams;\n }\n\n const mergedParams: Params = { ...currentParams };\n for (const [key, value] of Object.entries(pendingParams)) {\n if (value === null) {\n delete mergedParams[key];\n continue;\n }\n mergedParams[key] = value;\n }\n\n return mergedParams;\n });\n }\n\n /**\n * Devuelve un Signal reactivo con el valor del parámetro indicado.\n * Memorizar el resultado: no llamar en bucle pues crea un computed nuevo c/vez.\n *\n * @example\n * readonly menuOpen = computed(() => this.urlState.getParam('menu')() === 'open');\n */\n getParam(key: string): Signal<string | null> {\n return computed(() => (this.params()[key] as string | undefined) ?? null);\n }\n\n /**\n * Establece un único queryParam en la URL.\n *\n * @param key Nombre del parámetro\n * @param value Valor. Pasar `null` para eliminarlo de la URL.\n * @param replaceUrl Si true (default) usa replaceState — no ensucia el historial.\n * Pasar false para acciones que el usuario debe poder deshacer con Atrás.\n */\n setParam(key: string, value: string | null, replaceUrl = true): void {\n this._pendingParams[key] = value;\n this._pendingParamsState.set({ ...this._pendingParams });\n this._pendingReplaceUrl = this._pendingReplaceUrl && replaceUrl;\n this._schedulePendingNavigation();\n }\n\n private _schedulePendingNavigation(): void {\n if (this._batchScheduled) {\n return;\n }\n\n this._batchScheduled = true;\n queueMicrotask(() => {\n const pending = this._consumePendingNavigation();\n if (!pending) {\n return;\n }\n\n void this.router\n .navigate([], {\n queryParams: pending.params,\n queryParamsHandling: 'merge',\n replaceUrl: pending.replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(pending.params));\n });\n }\n\n private _consumePendingNavigation(): {\n params: Record<string, string | null>;\n replaceUrl: boolean;\n } | null {\n const hasPendingParams = Object.keys(this._pendingParams).length > 0;\n const replaceUrl = this._pendingReplaceUrl;\n const params = { ...this._pendingParams };\n\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n\n if (!hasPendingParams) {\n return null;\n }\n\n return { params, replaceUrl };\n }\n\n private _resetPendingNavigation(): void {\n this._pendingParams = {};\n this._pendingParamsState.set({});\n this._pendingReplaceUrl = true;\n this._batchScheduled = false;\n }\n\n private _finalizePendingNavigation(flushedParams: Record<string, string | null>): void {\n const currentVisiblePending = { ...this._pendingParamsState() };\n let changed = false;\n\n for (const [key, value] of Object.entries(flushedParams)) {\n if (Object.prototype.hasOwnProperty.call(this._pendingParams, key)) {\n continue;\n }\n\n if (currentVisiblePending[key] === value) {\n delete currentVisiblePending[key];\n changed = true;\n }\n }\n\n if (changed) {\n this._pendingParamsState.set(currentVisiblePending);\n }\n }\n\n /**\n * Actualiza múltiples queryParams en una sola navegación.\n *\n * @example\n * urlState.patchParams({ page: '1', q: 'Angular' });\n */\n patchParams(params: Record<string, string | null>, replaceUrl = true): void {\n const pending = this._consumePendingNavigation();\n const mergedParams = pending ? { ...pending.params, ...params } : params;\n this._pendingParamsState.set({ ...this._pendingParamsState(), ...mergedParams });\n void this.router\n .navigate([], {\n queryParams: mergedParams,\n queryParamsHandling: 'merge',\n replaceUrl: pending ? pending.replaceUrl && replaceUrl : replaceUrl,\n })\n .finally(() => this._finalizePendingNavigation(mergedParams));\n }\n\n /**\n * Elimina todos los queryParams de la URL de una vez.\n */\n clearParams(replaceUrl = true): void {\n this._resetPendingNavigation();\n void this.router.navigate([], {\n queryParams: {},\n replaceUrl,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -5,20 +5,14 @@ import { ScrollingModule, CdkVirtualScrollViewport } from '@angular/cdk/scrollin
5
5
  import { NgTemplateOutlet } from '@angular/common';
6
6
 
7
7
  class NeuVirtualListRowComponent {
8
- item = input.required(/* @ts-ignore */
9
- ...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
10
- index = input.required(/* @ts-ignore */
11
- ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
12
- itemSize = input.required(/* @ts-ignore */
13
- ...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
14
- label = input.required(/* @ts-ignore */
15
- ...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
16
- template = input(null, /* @ts-ignore */
17
- ...(ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []));
18
- context = computed(() => ({ $implicit: this.item(), index: this.index() }), /* @ts-ignore */
19
- ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuVirtualListRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuVirtualListRowComponent, isStandalone: true, selector: "neu-virtual-list-row", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
8
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : /* istanbul ignore next */ []));
9
+ index = input.required(...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
10
+ itemSize = input.required(...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
11
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
12
+ template = input(null, ...(ngDevMode ? [{ debugName: "template" }] : /* istanbul ignore next */ []));
13
+ context = computed(() => ({ $implicit: this.item(), index: this.index() }), ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
14
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuVirtualListRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuVirtualListRowComponent, isStandalone: true, selector: "neu-virtual-list-row", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, template: { classPropertyName: "template", publicName: "template", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
22
16
  @if (template(); as projectedTemplate) {
23
17
  <ng-container [ngTemplateOutlet]="projectedTemplate" [ngTemplateOutletContext]="context()" />
24
18
  } @else {
@@ -28,7 +22,7 @@ class NeuVirtualListRowComponent {
28
22
  }
29
23
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30
24
  }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuVirtualListRowComponent, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuVirtualListRowComponent, decorators: [{
32
26
  type: Component,
33
27
  args: [{
34
28
  selector: 'neu-virtual-list-row',
@@ -73,27 +67,20 @@ class NeuVirtualListComponent {
73
67
  this._viewport?.checkViewportSize();
74
68
  }
75
69
  /** Array de ítems / Item array */
76
- items = input([], /* @ts-ignore */
77
- ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
70
+ items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
78
71
  /** Altura de cada fila en px / Row height in px */
79
- itemSize = input(48, /* @ts-ignore */
80
- ...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
72
+ itemSize = input(48, ...(ngDevMode ? [{ debugName: "itemSize" }] : /* istanbul ignore next */ []));
81
73
  /** Número de filas visibles / Visible row count (sets container height) */
82
- visibleRows = input(10, /* @ts-ignore */
83
- ...(ngDevMode ? [{ debugName: "visibleRows" }] : /* istanbul ignore next */ []));
74
+ visibleRows = input(10, ...(ngDevMode ? [{ debugName: "visibleRows" }] : /* istanbul ignore next */ []));
84
75
  /** Texto cuando la lista está vacía / Empty state text */
85
- emptyLabel = input('Sin resultados', /* @ts-ignore */
86
- ...(ngDevMode ? [{ debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
76
+ emptyLabel = input('Sin resultados', ...(ngDevMode ? [{ debugName: "emptyLabel" }] : /* istanbul ignore next */ []));
87
77
  /** Función de tracking / Tracking function */
88
- trackBy = input((i) => i, /* @ts-ignore */
89
- ...(ngDevMode ? [{ debugName: "trackBy" }] : /* istanbul ignore next */ []));
78
+ trackBy = input((i) => i, ...(ngDevMode ? [{ debugName: "trackBy" }] : /* istanbul ignore next */ []));
90
79
  /** Emitido al hacer click en un ítem / Emitted on item click */
91
80
  itemClick = output();
92
81
  itemTemplate = null;
93
- _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`, /* @ts-ignore */
94
- ...(ngDevMode ? [{ debugName: "_containerHeight" }] : /* istanbul ignore next */ []));
95
- _isEmpty = computed(() => this.items().length === 0, /* @ts-ignore */
96
- ...(ngDevMode ? [{ debugName: "_isEmpty" }] : /* istanbul ignore next */ []));
82
+ _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`, ...(ngDevMode ? [{ debugName: "_containerHeight" }] : /* istanbul ignore next */ []));
83
+ _isEmpty = computed(() => this.items().length === 0, ...(ngDevMode ? [{ debugName: "_isEmpty" }] : /* istanbul ignore next */ []));
97
84
  _trackBy = (index, item) => this.trackBy()(index, item);
98
85
  _itemTemplateOrDefault(fallback) {
99
86
  return this.itemTemplate ?? fallback;
@@ -104,8 +91,8 @@ class NeuVirtualListComponent {
104
91
  _defaultItemLabel(item) {
105
92
  return String(item);
106
93
  }
107
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NeuVirtualListComponent, isStandalone: true, selector: "neu-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, visibleRows: { classPropertyName: "visibleRows", publicName: "visibleRows", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "style.height": "_containerHeight()" }, classAttribute: "neu-virtual-list" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: `
94
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: NeuVirtualListComponent, isStandalone: true, selector: "neu-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, visibleRows: { classPropertyName: "visibleRows", publicName: "visibleRows", isSignal: true, isRequired: false, transformFunction: null }, emptyLabel: { classPropertyName: "emptyLabel", publicName: "emptyLabel", isSignal: true, isRequired: false, transformFunction: null }, trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "style.height": "_containerHeight()" }, classAttribute: "neu-virtual-list" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: `
109
96
  <cdk-virtual-scroll-viewport
110
97
  class="neu-virtual-list__viewport"
111
98
  [itemSize]="itemSize()"
@@ -127,7 +114,7 @@ class NeuVirtualListComponent {
127
114
  }
128
115
  `, isInline: true, styles: [".neu-virtual-list{display:block;overflow:hidden}.neu-virtual-list__viewport{width:100%;overflow-y:auto}.neu-virtual-list__item-default{display:flex;align-items:center;padding:0 12px;border-bottom:1px solid var(--neu-border);font-size:.875rem;color:var(--neu-text)}.neu-virtual-list__empty{display:flex;align-items:center;justify-content:center;padding:32px;color:var(--neu-text-muted);font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: NeuVirtualListRowComponent, selector: "neu-virtual-list-row", inputs: ["item", "index", "itemSize", "label", "template"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
129
116
  }
130
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NeuVirtualListComponent, decorators: [{
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: NeuVirtualListComponent, decorators: [{
131
118
  type: Component,
132
119
  args: [{ selector: 'neu-virtual-list', imports: [ScrollingModule, NeuVirtualListRowComponent], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
133
120
  class: 'neu-virtual-list',
@@ -1 +1 @@
1
- {"version":3,"file":"neural-ui-core-virtual-list.mjs","sources":["../../../../projects/ui-core/virtual-list/neu-virtual-list.component.ts","../../../../projects/ui-core/virtual-list/neural-ui-core-virtual-list.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'neu-virtual-list-row',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (template(); as projectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"projectedTemplate\" [ngTemplateOutletContext]=\"context()\" />\n } @else {\n <div class=\"neu-virtual-list__item-default\" [style.height.px]=\"itemSize()\">\n {{ label() }}\n </div>\n }\n `,\n})\nexport class NeuVirtualListRowComponent {\n readonly item = input.required<unknown>();\n readonly index = input.required<number>();\n readonly itemSize = input.required<number>();\n readonly label = input.required<string>();\n readonly template = input<TemplateRef<{ $implicit: unknown; index: number }> | null>(null);\n\n readonly context = computed(() => ({ $implicit: this.item(), index: this.index() }));\n}\n\n/**\n * NeuralUI VirtualList\n *\n * Wrapper sobre CDK VirtualScrollViewport para listas de miles de ítems.\n * Proyecta contenido mediante `ng-template` con let-item.\n *\n * Uso:\n * <neu-virtual-list [items]=\"bigArray\" [itemSize]=\"40\">\n * <ng-template neuVirtualItem let-item>\n * <div class=\"my-row\">{{ item.name }}</div>\n * </ng-template>\n * </neu-virtual-list>\n */\n@Component({\n selector: 'neu-virtual-list',\n imports: [ScrollingModule, NeuVirtualListRowComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-virtual-list',\n '[style.height]': '_containerHeight()',\n },\n template: `\n <cdk-virtual-scroll-viewport\n class=\"neu-virtual-list__viewport\"\n [itemSize]=\"itemSize()\"\n [style.height]=\"_containerHeight()\"\n tabindex=\"0\"\n >\n <ng-container *cdkVirtualFor=\"let item of items(); let index = index; trackBy: _trackBy\">\n <neu-virtual-list-row\n [item]=\"item\"\n [index]=\"index\"\n [itemSize]=\"itemSize()\"\n [label]=\"_defaultItemLabel(item)\"\n [template]=\"itemTemplate\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n @if (_isEmpty()) {\n <div class=\"neu-virtual-list__empty\" role=\"status\">{{ emptyLabel() }}</div>\n }\n `,\n styleUrl: './neu-virtual-list.component.scss',\n})\nexport class NeuVirtualListComponent<T = unknown> implements AfterViewInit {\n /** Referencia al viewport CDK — para forzar remeasure tras render / CDK viewport ref — to force remeasure after render */\n @ViewChild(CdkVirtualScrollViewport) private readonly _viewport?: CdkVirtualScrollViewport;\n\n constructor() {\n // Fuerza checkViewportSize() tras el primer paint completo (necesario en modo zoneless)\n // Forces checkViewportSize() after the first full paint (needed in zoneless mode)\n afterNextRender(() => this._viewport?.checkViewportSize());\n }\n\n ngAfterViewInit(): void {\n // Segundo intento de medición sincrona por si afterNextRender no cubre todos los casos\n // Second synchronous measurement pass as a fallback\n this._viewport?.checkViewportSize();\n }\n /** Array de ítems / Item array */\n readonly items = input<T[]>([]);\n\n /** Altura de cada fila en px / Row height in px */\n readonly itemSize = input<number>(48);\n\n /** Número de filas visibles / Visible row count (sets container height) */\n readonly visibleRows = input<number>(10);\n\n /** Texto cuando la lista está vacía / Empty state text */\n readonly emptyLabel = input<string>('Sin resultados');\n\n /** Función de tracking / Tracking function */\n readonly trackBy = input<(index: number, item: T) => unknown>((i) => i);\n\n /** Emitido al hacer click en un ítem / Emitted on item click */\n readonly itemClick = output<{ item: T; index: number }>();\n\n @ContentChild(TemplateRef) itemTemplate: TemplateRef<{ $implicit: T; index: number }> | null =\n null;\n\n readonly _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`);\n readonly _isEmpty = computed(() => this.items().length === 0);\n\n _trackBy = (index: number, item: T) => this.trackBy()(index, item);\n\n protected _itemTemplateOrDefault(\n fallback: TemplateRef<{ $implicit: T; index: number }>,\n ): TemplateRef<{ $implicit: T; index: number }> {\n return this.itemTemplate ?? fallback;\n }\n\n protected _itemContext(item: T, index: number): { $implicit: T; index: number } {\n return { $implicit: item, index };\n }\n\n protected _defaultItemLabel(item: T): string {\n return String(item);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"neural-ui-core-virtual-list.mjs","sources":["../../../../projects/ui-core/virtual-list/neu-virtual-list.component.ts","../../../../projects/ui-core/virtual-list/neural-ui-core-virtual-list.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'neu-virtual-list-row',\n standalone: true,\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (template(); as projectedTemplate) {\n <ng-container [ngTemplateOutlet]=\"projectedTemplate\" [ngTemplateOutletContext]=\"context()\" />\n } @else {\n <div class=\"neu-virtual-list__item-default\" [style.height.px]=\"itemSize()\">\n {{ label() }}\n </div>\n }\n `,\n})\nexport class NeuVirtualListRowComponent {\n readonly item = input.required<unknown>();\n readonly index = input.required<number>();\n readonly itemSize = input.required<number>();\n readonly label = input.required<string>();\n readonly template = input<TemplateRef<{ $implicit: unknown; index: number }> | null>(null);\n\n readonly context = computed(() => ({ $implicit: this.item(), index: this.index() }));\n}\n\n/**\n * NeuralUI VirtualList\n *\n * Wrapper sobre CDK VirtualScrollViewport para listas de miles de ítems.\n * Proyecta contenido mediante `ng-template` con let-item.\n *\n * Uso:\n * <neu-virtual-list [items]=\"bigArray\" [itemSize]=\"40\">\n * <ng-template neuVirtualItem let-item>\n * <div class=\"my-row\">{{ item.name }}</div>\n * </ng-template>\n * </neu-virtual-list>\n */\n@Component({\n selector: 'neu-virtual-list',\n imports: [ScrollingModule, NeuVirtualListRowComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'neu-virtual-list',\n '[style.height]': '_containerHeight()',\n },\n template: `\n <cdk-virtual-scroll-viewport\n class=\"neu-virtual-list__viewport\"\n [itemSize]=\"itemSize()\"\n [style.height]=\"_containerHeight()\"\n tabindex=\"0\"\n >\n <ng-container *cdkVirtualFor=\"let item of items(); let index = index; trackBy: _trackBy\">\n <neu-virtual-list-row\n [item]=\"item\"\n [index]=\"index\"\n [itemSize]=\"itemSize()\"\n [label]=\"_defaultItemLabel(item)\"\n [template]=\"itemTemplate\"\n />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n @if (_isEmpty()) {\n <div class=\"neu-virtual-list__empty\" role=\"status\">{{ emptyLabel() }}</div>\n }\n `,\n styleUrl: './neu-virtual-list.component.scss',\n})\nexport class NeuVirtualListComponent<T = unknown> implements AfterViewInit {\n /** Referencia al viewport CDK — para forzar remeasure tras render / CDK viewport ref — to force remeasure after render */\n @ViewChild(CdkVirtualScrollViewport) private readonly _viewport?: CdkVirtualScrollViewport;\n\n constructor() {\n // Fuerza checkViewportSize() tras el primer paint completo (necesario en modo zoneless)\n // Forces checkViewportSize() after the first full paint (needed in zoneless mode)\n afterNextRender(() => this._viewport?.checkViewportSize());\n }\n\n ngAfterViewInit(): void {\n // Segundo intento de medición sincrona por si afterNextRender no cubre todos los casos\n // Second synchronous measurement pass as a fallback\n this._viewport?.checkViewportSize();\n }\n /** Array de ítems / Item array */\n readonly items = input<T[]>([]);\n\n /** Altura de cada fila en px / Row height in px */\n readonly itemSize = input<number>(48);\n\n /** Número de filas visibles / Visible row count (sets container height) */\n readonly visibleRows = input<number>(10);\n\n /** Texto cuando la lista está vacía / Empty state text */\n readonly emptyLabel = input<string>('Sin resultados');\n\n /** Función de tracking / Tracking function */\n readonly trackBy = input<(index: number, item: T) => unknown>((i) => i);\n\n /** Emitido al hacer click en un ítem / Emitted on item click */\n readonly itemClick = output<{ item: T; index: number }>();\n\n @ContentChild(TemplateRef) itemTemplate: TemplateRef<{ $implicit: T; index: number }> | null =\n null;\n\n readonly _containerHeight = computed(() => `${this.itemSize() * this.visibleRows()}px`);\n readonly _isEmpty = computed(() => this.items().length === 0);\n\n _trackBy = (index: number, item: T) => this.trackBy()(index, item);\n\n protected _itemTemplateOrDefault(\n fallback: TemplateRef<{ $implicit: T; index: number }>,\n ): TemplateRef<{ $implicit: T; index: number }> {\n return this.itemTemplate ?? fallback;\n }\n\n protected _itemContext(item: T, index: number): { $implicit: T; index: number } {\n return { $implicit: item, index };\n }\n\n protected _defaultItemLabel(item: T): string {\n return String(item);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-filter-bar.mjs",
3
+ "typings": "../types/neural-ui-core-filter-bar.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-icon.mjs",
3
+ "typings": "../types/neural-ui-core-icon.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-image-gallery.mjs",
3
+ "typings": "../types/neural-ui-core-image-gallery.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-image-viewer.mjs",
3
+ "typings": "../types/neural-ui-core-image-viewer.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-input.mjs",
3
+ "typings": "../types/neural-ui-core-input.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-input-otp.mjs",
3
+ "typings": "../types/neural-ui-core-input-otp.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-kanban.mjs",
3
+ "typings": "../types/neural-ui-core-kanban.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-knob.mjs",
3
+ "typings": "../types/neural-ui-core-knob.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-meter-group.mjs",
3
+ "typings": "../types/neural-ui-core-meter-group.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-modal.mjs",
3
+ "typings": "../types/neural-ui-core-modal.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-multiselect.mjs",
3
+ "typings": "../types/neural-ui-core-multiselect.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-nav.mjs",
3
+ "typings": "../types/neural-ui-core-nav.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-notification-center.mjs",
3
+ "typings": "../types/neural-ui-core-notification-center.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-number-input.mjs",
3
+ "typings": "../types/neural-ui-core-number-input.d.ts"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neural-ui/core",
3
- "version": "1.6.1",
3
+ "version": "1.6.3",
4
4
  "description": "Modern Angular UI component library built with signals, standalone components, and OnPush change detection.",
5
5
  "author": "PedroMorenoTrujillo",
6
6
  "keywords": [
@@ -14,11 +14,11 @@
14
14
  ],
15
15
  "license": "MIT",
16
16
  "peerDependencies": {
17
- "@angular/cdk": ">=19.0.0 <23.0.0",
18
- "@angular/common": ">=19.0.0 <23.0.0",
19
- "@angular/core": ">=19.0.0 <23.0.0",
20
- "@angular/forms": ">=19.0.0 <23.0.0",
21
- "@angular/router": ">=19.0.0 <23.0.0",
17
+ "@angular/cdk": ">=19.0.0 <22.0.0",
18
+ "@angular/common": ">=19.0.0 <22.0.0",
19
+ "@angular/core": ">=19.0.0 <22.0.0",
20
+ "@angular/forms": ">=19.0.0 <22.0.0",
21
+ "@angular/router": ">=19.0.0 <22.0.0",
22
22
  "@ng-icons/core": ">=33.0.0",
23
23
  "@ng-icons/lucide": ">=33.0.0",
24
24
  "apexcharts": ">=5.0.0",
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-pagination.mjs",
3
+ "typings": "../types/neural-ui-core-pagination.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-popover.mjs",
3
+ "typings": "../types/neural-ui-core-popover.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-progress-bar.mjs",
3
+ "typings": "../types/neural-ui-core-progress-bar.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-radio.mjs",
3
+ "typings": "../types/neural-ui-core-radio.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-rating.mjs",
3
+ "typings": "../types/neural-ui-core-rating.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-rich-text-editor.mjs",
3
+ "typings": "../types/neural-ui-core-rich-text-editor.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/neural-ui-core-scheduler-gantt.mjs",
3
+ "typings": "../types/neural-ui-core-scheduler-gantt.d.ts"
4
+ }