@ngneers/controls 0.0.1-pre1 → 0.0.1-pre3

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/fesm2022/ngneers-controls-accordion.mjs +194 -0
  3. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
  4. package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
  5. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
  6. package/fesm2022/ngneers-controls-api.mjs +256 -227
  7. package/fesm2022/ngneers-controls-api.mjs.map +1 -1
  8. package/fesm2022/ngneers-controls-avatar.mjs +70 -0
  9. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
  10. package/fesm2022/ngneers-controls-base.mjs +397 -0
  11. package/fesm2022/ngneers-controls-base.mjs.map +1 -0
  12. package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
  13. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
  14. package/fesm2022/ngneers-controls-button-group.mjs +51 -0
  15. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
  16. package/fesm2022/ngneers-controls-button.mjs +62 -0
  17. package/fesm2022/ngneers-controls-button.mjs.map +1 -0
  18. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
  19. package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
  20. package/fesm2022/ngneers-controls-calendar.mjs +468 -0
  21. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
  22. package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
  23. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
  24. package/fesm2022/ngneers-controls-chip.mjs +52 -0
  25. package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
  26. package/fesm2022/ngneers-controls-defer.mjs +43 -0
  27. package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
  28. package/fesm2022/ngneers-controls-dialog.mjs +329 -33
  29. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  30. package/fesm2022/ngneers-controls-directives.mjs +443 -0
  31. package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
  32. package/fesm2022/ngneers-controls-drawer.mjs +232 -0
  33. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
  35. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
  36. package/fesm2022/ngneers-controls-filter.mjs +516 -0
  37. package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
  38. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
  39. package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
  40. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
  41. package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
  42. package/fesm2022/ngneers-controls-i18n.mjs +57 -0
  43. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
  44. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
  45. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
  46. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
  47. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
  48. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
  49. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
  50. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
  51. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
  52. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
  53. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
  54. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
  55. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
  56. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
  57. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
  58. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
  59. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
  60. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
  61. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
  62. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
  63. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
  64. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
  65. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
  66. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
  67. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
  68. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
  69. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
  70. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
  71. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
  72. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
  73. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
  74. package/fesm2022/ngneers-controls-icon.mjs +60 -18
  75. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  76. package/fesm2022/ngneers-controls-inplace.mjs +107 -0
  77. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
  78. package/fesm2022/ngneers-controls-input-field.mjs +141 -0
  79. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
  80. package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
  81. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
  82. package/fesm2022/ngneers-controls-input.mjs +69 -0
  83. package/fesm2022/ngneers-controls-input.mjs.map +1 -0
  84. package/fesm2022/ngneers-controls-item-view.mjs +441 -0
  85. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
  86. package/fesm2022/ngneers-controls-list-box.mjs +157 -53
  87. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  88. package/fesm2022/ngneers-controls-menu.mjs +332 -0
  89. package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
  90. package/fesm2022/ngneers-controls-message.mjs +29 -0
  91. package/fesm2022/ngneers-controls-message.mjs.map +1 -0
  92. package/fesm2022/ngneers-controls-paginator.mjs +111 -0
  93. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
  94. package/fesm2022/ngneers-controls-popover.mjs +129 -40
  95. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  96. package/fesm2022/ngneers-controls-progress.mjs +82 -0
  97. package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
  98. package/fesm2022/ngneers-controls-scroller.mjs +162 -78
  99. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  100. package/fesm2022/ngneers-controls-select-button.mjs +55 -0
  101. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
  102. package/fesm2022/ngneers-controls-select.mjs +313 -103
  103. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  104. package/fesm2022/ngneers-controls-slider.mjs +155 -0
  105. package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
  106. package/fesm2022/ngneers-controls-spinner.mjs +169 -0
  107. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
  108. package/fesm2022/ngneers-controls-splitter.mjs +717 -0
  109. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
  110. package/fesm2022/ngneers-controls-switch.mjs +39 -0
  111. package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
  112. package/fesm2022/ngneers-controls-table.mjs +379 -0
  113. package/fesm2022/ngneers-controls-table.mjs.map +1 -0
  114. package/fesm2022/ngneers-controls-tabs.mjs +287 -0
  115. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
  116. package/fesm2022/ngneers-controls-tag.mjs +29 -0
  117. package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
  118. package/fesm2022/ngneers-controls-toast.mjs +184 -0
  119. package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
  120. package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
  121. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
  122. package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
  123. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
  124. package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
  125. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
  126. package/fesm2022/ngneers-controls-utils.mjs +217 -60
  127. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  128. package/fesm2022/ngneers-controls.mjs.map +1 -1
  129. package/package.json +167 -32
  130. package/types/ngneers-controls-accordion.d.ts +114 -0
  131. package/types/ngneers-controls-api-ng.d.ts +291 -0
  132. package/types/ngneers-controls-api.d.ts +99 -0
  133. package/types/ngneers-controls-avatar.d.ts +50 -0
  134. package/types/ngneers-controls-base.d.ts +166 -0
  135. package/types/ngneers-controls-breadcrumb.d.ts +86 -0
  136. package/types/ngneers-controls-button-group.d.ts +30 -0
  137. package/types/ngneers-controls-button.d.ts +34 -0
  138. package/types/ngneers-controls-calendar.d.ts +275 -0
  139. package/types/ngneers-controls-checkbox.d.ts +38 -0
  140. package/types/ngneers-controls-chip.d.ts +37 -0
  141. package/types/ngneers-controls-defer.d.ts +22 -0
  142. package/types/ngneers-controls-dialog.d.ts +218 -0
  143. package/types/ngneers-controls-directives.d.ts +146 -0
  144. package/types/ngneers-controls-drawer.d.ts +220 -0
  145. package/types/ngneers-controls-edit-inplace.d.ts +182 -0
  146. package/types/ngneers-controls-filter.d.ts +304 -0
  147. package/types/ngneers-controls-i18n.d.ts +108 -0
  148. package/types/ngneers-controls-icon.d.ts +74 -0
  149. package/types/ngneers-controls-inplace.d.ts +95 -0
  150. package/types/ngneers-controls-input-field.d.ts +159 -0
  151. package/types/ngneers-controls-input-mask.d.ts +83 -0
  152. package/types/ngneers-controls-input.d.ts +27 -0
  153. package/types/ngneers-controls-item-view.d.ts +211 -0
  154. package/types/ngneers-controls-list-box.d.ts +216 -0
  155. package/types/ngneers-controls-menu.d.ts +178 -0
  156. package/types/ngneers-controls-message.d.ts +19 -0
  157. package/types/ngneers-controls-paginator.d.ts +162 -0
  158. package/types/ngneers-controls-popover.d.ts +101 -0
  159. package/types/ngneers-controls-progress.d.ts +44 -0
  160. package/types/ngneers-controls-scroller.d.ts +137 -0
  161. package/types/ngneers-controls-select-button.d.ts +37 -0
  162. package/types/ngneers-controls-select.d.ts +314 -0
  163. package/types/ngneers-controls-slider.d.ts +53 -0
  164. package/types/ngneers-controls-spinner.d.ts +105 -0
  165. package/types/ngneers-controls-splitter.d.ts +391 -0
  166. package/types/ngneers-controls-switch.d.ts +18 -0
  167. package/types/ngneers-controls-table.d.ts +157 -0
  168. package/types/ngneers-controls-tabs.d.ts +106 -0
  169. package/types/ngneers-controls-tag.d.ts +19 -0
  170. package/types/ngneers-controls-toast.d.ts +70 -0
  171. package/types/ngneers-controls-toggle-button.d.ts +46 -0
  172. package/types/ngneers-controls-tooltip.d.ts +188 -0
  173. package/types/ngneers-controls-utils-ng.d.ts +57 -0
  174. package/types/ngneers-controls-utils.d.ts +130 -0
  175. package/api/index.d.ts +0 -134
  176. package/custom-types/index.d.ts +0 -7
  177. package/dialog/index.d.ts +0 -43
  178. package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
  179. package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
  180. package/fesm2022/ngneers-controls-form-field.mjs +0 -33
  181. package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
  182. package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
  183. package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
  184. package/fesm2022/ngneers-controls-text-field.mjs +0 -23
  185. package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
  186. package/form-field/index.d.ts +0 -19
  187. package/icon/index.d.ts +0 -30
  188. package/lazy-cacher/index.d.ts +0 -14
  189. package/list-box/index.d.ts +0 -58
  190. package/popover/index.d.ts +0 -41
  191. package/scroller/index.d.ts +0 -95
  192. package/select/index.d.ts +0 -86
  193. package/text-field/index.d.ts +0 -10
  194. package/utils/index.d.ts +0 -36
  195. /package/{index.d.ts → types/ngneers-controls.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-table.mjs","sources":["../../src/table/table-templates.ts","../../src/table/table.ts","../../src/table/table.html","../../src/table/table-cell.ts","../../src/table/table-header-cell.ts","../../src/table/table-header-row.ts","../../src/table/table-row.ts","../../src/table/module.ts","../../src/table/table-filterable-column.ts","../../src/table/table-sortable-column.ts","../../src/table/ngneers-controls-table.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, contentChild, TemplateRef } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { FormattedTableRow } from './types';\r\n\r\n@Component({\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport abstract class NgnTableTemplates<T extends object> extends NgnBase<'table'> {\r\n private readonly _headerTemplate = contentChild<TemplateRef<unknown>>('header');\r\n private readonly _bodyTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.body>>('body');\r\n\r\n protected readonly headerTemplate = this._headerTemplate;\r\n protected readonly bodyTemplate = this._bodyTemplate;\r\n\r\n /**\r\n * Types for the calendar templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n /**\r\n * Type of the template variable for the body template.\r\n */\r\n body: { $implicit: FormattedTableRow<T> };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, input, model, signal } from '@angular/core';\r\nimport { executeMultiFilter } from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnPaginator, type PaginationState } from '@ngneers/controls/paginator';\r\nimport { NgnScroller } from '@ngneers/controls/scroller';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTableTemplates } from './table-templates';\r\n\r\nimport type { NgnTableTh } from './table-header-cell';\r\nimport type { FormattedTableRow } from './types';\r\nimport type { NgnFilterConfig } from '@ngneers/controls/filter';\r\nimport type { AllKeysOfUnion } from '@ngneers/controls/utils';\r\n\r\n@Component({\r\n selector: 'ngn-table',\r\n templateUrl: './table.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgTemplateOutlet, NgnScroller, NgnPaginator, NgnTemplate, NgnPt],\r\n providers: [provideSelf(NgnTable)],\r\n host: {\r\n tabindex: '0',\r\n },\r\n})\r\nexport class NgnTable<T extends object, K extends keyof T> extends NgnTableTemplates<T> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate, {\r\n root: true,\r\n virtual: () => this.virtual(),\r\n });\r\n private readonly _registeredHeaderCells = signal<NgnTableTh[]>([]);\r\n\r\n public readonly rows = input.required<readonly T[]>();\r\n public readonly rowHeight = input<number>();\r\n public readonly fieldId = input.required<K>();\r\n public readonly virtual = input<boolean>(false);\r\n public readonly virtualPadding = input<number>(2);\r\n public readonly striped = input<boolean>(false);\r\n public readonly paginator = input<boolean>(false);\r\n protected readonly trackById = (item: T): unknown => item[this.fieldId()];\r\n public readonly sort = model<{\r\n column: Extract<AllKeysOfUnion<T>, string>;\r\n direction: 'asc' | 'desc';\r\n } | null>(null);\r\n public readonly filters = model<\r\n | {\r\n [key in Extract<AllKeysOfUnion<T>, string>]?: NgnFilterConfig;\r\n }\r\n | null\r\n >(null);\r\n protected readonly pageState = signal<PaginationState | null>(null);\r\n\r\n protected readonly formattedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const rows = this._sortedRows();\r\n return rows.map((data, index) => ({\r\n kind: 'data' as const,\r\n id: data[this.fieldId()] as T[keyof T] & (string | number),\r\n data,\r\n index,\r\n }));\r\n });\r\n\r\n protected readonly pagedRows = computed<FormattedTableRow<T>[]>(() => {\r\n const paginator = this.paginator();\r\n if (!paginator) {\r\n return this.formattedRows();\r\n }\r\n const pageState = this.pageState();\r\n if (!pageState) {\r\n return [];\r\n }\r\n return this.formattedRows().slice(\r\n pageState.slice.skip,\r\n pageState.slice.take + pageState.slice.skip\r\n );\r\n });\r\n\r\n private readonly _filteredRows = computed<readonly T[]>(() => {\r\n const filters = this.filters();\r\n const rows = this.rows();\r\n if (!filters) {\r\n return rows;\r\n }\r\n return executeMultiFilter(rows, filters);\r\n });\r\n\r\n private readonly _sortedRows = computed<readonly T[]>(() => {\r\n const rows = this._filteredRows();\r\n const sort = this.sort();\r\n if (!sort) {\r\n return rows;\r\n }\r\n const { column, direction } = sort;\r\n // @jasc @todo outsource sorting & allow custom sort functions\r\n return rows.toSorted((a, b) => {\r\n const aValue = a[column];\r\n const bValue = b[column];\r\n if (aValue == null && bValue != null) {\r\n return direction === 'asc' ? -1 : 1;\r\n }\r\n if (aValue != null && bValue == null) {\r\n return direction === 'asc' ? 1 : -1;\r\n }\r\n if (aValue == null && bValue == null) {\r\n return 0;\r\n }\r\n return typeof aValue === 'number' && typeof bValue === 'number'\r\n ? direction === 'asc'\r\n ? (aValue as number) - (bValue as number)\r\n : (bValue as number) - (aValue as number)\r\n : direction === 'asc'\r\n ? String(aValue).localeCompare(String(bValue))\r\n : String(bValue).localeCompare(String(aValue));\r\n });\r\n });\r\n\r\n protected readonly columnCount = computed(() => this._registeredHeaderCells().length);\r\n\r\n protected pageChanged(event: PaginationState) {\r\n this.pageState.set(event);\r\n }\r\n\r\n public column<V extends AllKeysOfUnion<T> & string>(column: V): V {\r\n return column;\r\n }\r\n\r\n public registerHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => [...cells, cell]);\r\n }\r\n\r\n public unregisterHeaderCell(cell: NgnTableTh): void {\r\n this._registeredHeaderCells.update(cells => cells.filter(c => c !== cell));\r\n }\r\n}\r\n","<table\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ table: true, striped: striped() }\"\r\n [attr.aria-rowcount]=\"rows().length\"\r\n [style.--ngn-table-column-count]=\"columnCount()\"\r\n [style.--ngn-table-row-height.px]=\"rowHeight()\"\r\n>\r\n <thead [ptInt]=\"this\" [ptClass]=\"'head'\">\r\n <ng-container [ngTemplateOutlet]=\"headerTemplate()\"></ng-container>\r\n </thead>\r\n\r\n <tbody\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'body'\"\r\n ngn-scroller\r\n #scroller\r\n [virtual]=\"virtual()\"\r\n [items]=\"pagedRows()\"\r\n [fieldId]=\"'id'\"\r\n [itemHeight]=\"rowHeight() || 0\"\r\n [virtualPadding]=\"virtualPadding()\"\r\n [style.--ngn-table-item-start-index]=\"scroller.itemStartIndex()\"\r\n >\r\n <ng-template #item [ngnTemplate]=\"scroller.templateTypes.item\" let-item let-index=\"index\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"bodyTemplate()\"\r\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\r\n ></ng-container>\r\n </ng-template>\r\n </tbody>\r\n</table>\r\n@if (paginator()) {\r\n <ngn-paginator [totalItems]=\"rows().length\" (value)=\"pageChanged($event)\" />\r\n}\r\n","import { Directive, signal } from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\n@Directive({\r\n selector: '[ngnTableTd]',\r\n host: { '[style.--ngn-table-column-index]': 'columnIndex()' },\r\n})\r\nexport class NgnTableTd extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n\r\n protected readonly columnIndex = signal(0);\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n const parent = this.element.nativeElement.parentElement?.children;\r\n if (parent) {\r\n const index = Array.from(parent).findIndex(child => child === this.element.nativeElement);\r\n this.columnIndex.set(index + 1);\r\n }\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n type OnInit,\r\n Renderer2,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstance, NgnBase } from '@ngneers/controls/base';\r\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\n\r\n@Directive({ selector: '[ngnTableTh]' })\r\nexport class NgnTableTh extends NgnBase<'table'> implements OnDestroy, OnInit {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n private _table?: NgnTable<any, any>;\r\n\r\n public readonly ngnTableTh = input.required<string>();\r\n\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n\r\n const element = inject(Renderer2).createElement('div');\r\n element.classList.add(this.theme.class('spacer'));\r\n inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.appendChild(element);\r\n }\r\n\r\n public ngOnInit(): void {\r\n const table = getNearestNgnInstance(this.element.nativeElement, NgnTable<any, any>);\r\n if (!table) {\r\n throw new NgnError('ngnTableTh', 'ngnTableTh must be used within an NgnTable component');\r\n }\r\n this._table = table;\r\n this._table.registerHeaderCell(this);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._table?.unregisterHeaderCell(this);\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('cell'), true);\r\n }\r\n}\r\n","import { Directive } from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\n@Directive({ selector: '[ngnTableHeadTr]', host: { '[attr.aria-rowindex]': '1' } })\r\nexport class NgnTableHeadTr extends NgnBase<'table'> {\r\n protected readonly theme = this.injectThemeTemplate(tableControlTemplate);\r\n constructor() {\r\n super();\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this.element.nativeElement, this.theme.class('row'), true);\r\n }\r\n}\r\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\r\nimport { injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\nimport { setInputSignalValue } from '@ngneers/controls/utils-ng';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport type { FormattedTableRow } from './types';\r\n\r\n@Directive({\r\n selector: '[ngnTableBodyTr]',\r\n host: {\r\n '[attr.aria-rowindex]': 'ngnTableBodyTr().index + 2',\r\n '[style.--ngn-table-row-index]': 'ngnTableBodyTr().index + 2',\r\n '[class]': `theme.classes({'even': ngnTableBodyTr().index % 2 === 0})`,\r\n },\r\n})\r\nexport class NgnTableBodyTr<T> extends NgnScrollerItem {\r\n public readonly ngnTableBodyTr = input.required<FormattedTableRow<T>>();\r\n public override readonly ngnScrollerItem = input<object>({});\r\n private readonly _element = inject(ElementRef<HTMLElement>);\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n const row = this.ngnTableBodyTr();\r\n setInputSignalValue(this.ngnScrollerItem, row);\r\n });\r\n this.prepareDom();\r\n }\r\n\r\n private prepareDom() {\r\n toggleClass(this._element.nativeElement, this.theme.class('row'), true);\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTd } from './table-cell';\r\nimport { NgnTableTh } from './table-header-cell';\r\nimport { NgnTableHeadTr } from './table-header-row';\r\nimport { NgnTableBodyTr } from './table-row';\r\n\r\n@NgModule({\r\n imports: [NgnTable, NgnTableBodyTr, NgnTableTd, NgnTableTh, NgnTableHeadTr],\r\n exports: [NgnTable, NgnTableBodyTr, NgnTableTd, NgnTableTh, NgnTableHeadTr],\r\n})\r\nexport class NgnTableModule {}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnActionButton } from '@ngneers/controls/button';\r\nimport { NgnFilter, type NgnFilterDataType } from '@ngneers/controls/filter';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\nimport type { NgnActionButtonConfig } from '@ngneers/controls/api';\r\n\r\n@Directive({\r\n selector: '[ngnTableFilterableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'filterable-column': true, 'filtered-column': !!filter() })`,\r\n },\r\n})\r\nexport class NgnTableFilterableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n public readonly ngnTableFilterableColumn = input();\r\n\r\n private readonly _ngnActionButton: ComponentRef<NgnActionButton<null>>;\r\n private readonly _ngnFilter: ComponentRef<NgnFilter>;\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n private readonly _rows = computed(() => {\r\n return this._table()?.rows() || [];\r\n });\r\n protected readonly filter = computed(() => {\r\n const tableFilter = this._table()?.filters()?.[this._columnId()];\r\n return tableFilter;\r\n });\r\n\r\n public readonly ngnTableFilterableColumnType = input.required<NgnFilterDataType>();\r\n public readonly ngnTableFilterableColumnItems = input<string[] | null | undefined>();\r\n\r\n constructor() {\r\n this._ngnActionButton = inject(ViewContainerRef).createComponent(NgnActionButton<null>);\r\n this._ngnFilter = inject(ViewContainerRef).createComponent(NgnFilter);\r\n this._element.nativeElement.appendChild(this._ngnActionButton.location.nativeElement);\r\n this._element.nativeElement.appendChild(this._ngnFilter.location.nativeElement);\r\n this._ngnActionButton.location.nativeElement.classList.add(this.theme.class('filter-control'));\r\n\r\n setComponentInput(this._ngnActionButton, 'kind', 'icon');\r\n setComponentInput(this._ngnFilter, 'anchor', this._ngnActionButton.location.nativeElement);\r\n setComponentInput(this._ngnFilter, 'mode', 'headless');\r\n setComponentInput(this._ngnFilter, 'allowMultiple', true);\r\n\r\n const cfg = computed(\r\n () =>\r\n <NgnActionButtonConfig<null>>{\r\n label: 'Filter',\r\n value: null,\r\n kind: 'icon',\r\n defaultIcon: this.filter() ? 'filter_solid' : 'filter',\r\n action: event => {\r\n event.stopPropagation();\r\n this._ngnFilter.instance.show();\r\n },\r\n }\r\n );\r\n\r\n effect(() => {\r\n setComponentInput(this._ngnActionButton, 'config', cfg());\r\n });\r\n effect(() => {\r\n setComponentInput(\r\n this._ngnFilter,\r\n 'data',\r\n this._rows().map(row => row[this._columnId()])\r\n );\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'dataType', this.ngnTableFilterableColumnType());\r\n });\r\n effect(() => {\r\n setComponentInput(this._ngnFilter, 'listOptions', this.ngnTableFilterableColumnItems());\r\n });\r\n this._ngnFilter.instance.filterChange.subscribe(cfg => {\r\n const table = this._table();\r\n const currentFilters = table?.filters() || {};\r\n table?.filters.set({ ...currentFilters, [this._columnId()]: cfg ?? undefined });\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnActionButton.destroy();\r\n this._ngnFilter.destroy();\r\n }\r\n}\r\n","import {\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n Type,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { injectThemeTemplate, setComponentInput } from '@ngneers/controls/api/ng';\r\nimport { getNearestNgnInstanceSig } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { tableControlTemplate } from '@ngneers/controls-themes/templates/table';\r\n\r\nimport { NgnTable } from './table';\r\nimport { NgnTableTh } from './table-header-cell';\r\n\r\n@Directive({\r\n selector: '[ngnTableSortableColumn]',\r\n host: {\r\n '[class]': `theme.classes({'sortable-column': true, 'sorted-column': !!sort() })`,\r\n '(click)': `toggleSort()`,\r\n },\r\n})\r\nexport class NgnTableSortableColumn implements OnDestroy {\r\n protected readonly theme = injectThemeTemplate(tableControlTemplate);\r\n private readonly _element = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n public readonly ngnTableSortableColumn = input();\r\n\r\n private readonly _table = getNearestNgnInstanceSig<Type<NgnTable<any, any>>>(\r\n this._element.nativeElement,\r\n NgnTable\r\n );\r\n protected readonly sort = computed(() => {\r\n const tableSort = this._table()?.sort();\r\n if (tableSort?.column === this.columnId()) {\r\n return tableSort.direction;\r\n }\r\n return null;\r\n });\r\n\r\n private readonly columnId = inject(NgnTableTh).ngnTableTh;\r\n\r\n private readonly _ngnIcon: ComponentRef<NgnIcon>;\r\n\r\n constructor() {\r\n this._ngnIcon = inject(ViewContainerRef).createComponent(NgnIcon);\r\n this._element.nativeElement.appendChild(this._ngnIcon.location.nativeElement);\r\n this._ngnIcon.location.nativeElement.classList.add(this.theme.class('sort-control'));\r\n\r\n effect(() => {\r\n const sort = this.sort();\r\n setComponentInput(\r\n this._ngnIcon,\r\n 'defaultIcon',\r\n sort === 'asc' ? 'sort_down' : sort === 'desc' ? 'sort_up' : 'sort'\r\n );\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._ngnIcon.destroy();\r\n }\r\n\r\n protected toggleSort(): void {\r\n const currentSort = this.sort();\r\n const table = this._table();\r\n table?.sort.set(\r\n currentSort === null\r\n ? { column: this.columnId(), direction: 'asc' }\r\n : currentSort === 'asc'\r\n ? { column: this.columnId(), direction: 'desc' }\r\n : null\r\n );\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAUM,MAAgB,iBAAoC,SAAQ,OAAgB,CAAA;AAC/D,IAAA,eAAe,GAAG,YAAY,CAAuB,QAAQ,2DAAC;AAC9D,IAAA,aAAa,GAC5B,YAAY,CAA8C,MAAM,yDAAC;AAEhD,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe;AACrC,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa;AAEpD;;AAEG;IACa,aAAa,GAAG,eAAe,EAK3C;uGAhBgB,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,8TAH3B,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGQ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,EAAE;oBACZ,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;AAEuE,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,QAAQ,0EAElB,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACa9D,MAAO,QAA8C,SAAQ,iBAAoB,CAAA;AAClE,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,EAAE;AACxE,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE;AAC9B,KAAA,CAAC;AACe,IAAA,sBAAsB,GAAG,MAAM,CAAe,EAAE,kEAAC;AAElD,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAgB;IACrC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC3B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAK;AAC7B,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,mDAAC;AAC/B,IAAA,cAAc,GAAG,KAAK,CAAS,CAAC,0DAAC;AACjC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,mDAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AAC9B,IAAA,SAAS,GAAG,CAAC,IAAO,KAAc,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACzD,IAAA,IAAI,GAAG,KAAK,CAGlB,IAAI,gDAAC;AACC,IAAA,OAAO,GAAG,KAAK,CAK7B,IAAI,mDAAC;AACY,IAAA,SAAS,GAAG,MAAM,CAAyB,IAAI,qDAAC;AAEhD,IAAA,aAAa,GAAG,QAAQ,CAAyB,MAAK;AACvE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM;AAChC,YAAA,IAAI,EAAE,MAAe;AACrB,YAAA,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAmC;YAC1D,IAAI;YACJ,KAAK;AACN,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,yDAAC;AAEiB,IAAA,SAAS,GAAG,QAAQ,CAAyB,MAAK;AACnE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE;QAC7B;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,EAAE;QACX;QACA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAC/B,SAAS,CAAC,KAAK,CAAC,IAAI,EACpB,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAC5C;AACH,IAAA,CAAC,qDAAC;AAEe,IAAA,aAAa,GAAG,QAAQ,CAAe,MAAK;AAC3D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;AAC1C,IAAA,CAAC,yDAAC;AAEe,IAAA,WAAW,GAAG,QAAQ,CAAe,MAAK;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI;;QAElC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC5B,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AACxB,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;AACpC,gBAAA,OAAO,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;YACrC;YACA,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;AACpC,gBAAA,OAAO,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC;YACA,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE;AACpC,gBAAA,OAAO,CAAC;YACV;YACA,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK;kBACnD,SAAS,KAAK;sBACX,MAAiB,GAAI;sBACrB,MAAiB,GAAI;kBACxB,SAAS,KAAK;AACd,sBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;AAC7C,sBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACpD,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,uDAAC;AAEiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC,MAAM,uDAAC;AAE3E,IAAA,WAAW,CAAC,KAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IAC3B;AAEO,IAAA,MAAM,CAAuC,MAAS,EAAA;AAC3D,QAAA,OAAO,MAAM;IACf;AAEO,IAAA,kBAAkB,CAAC,IAAgB,EAAA;AACxC,QAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/D;AAEO,IAAA,oBAAoB,CAAC,IAAgB,EAAA;QAC1C,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5E;uGA3GW,QAAQ,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,qyCALR,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBpC,spCAkCA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdY,gBAAgB,oJAAE,WAAW,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,8FAAE,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAM9D,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAVpB,SAAS;+BACE,WAAW,EAAA,eAAA,EAEJ,uBAAuB,CAAC,MAAM,WACtC,CAAC,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,aAC/D,CAAC,WAAW,CAAA,QAAA,CAAU,CAAC,EAAA,IAAA,EAC5B;AACJ,wBAAA,QAAQ,EAAE,GAAG;AACd,qBAAA,EAAA,QAAA,EAAA,spCAAA,EAAA;;;AEfG,MAAO,UAAW,SAAQ,OAAgB,CAAA;AAC3B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;AAEtD,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,uDAAC;AAE1C,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,UAAU,EAAE;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,QAAQ;QACjE,IAAI,MAAM,EAAE;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YACzF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IACzE;uGAjBW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBAJtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,IAAI,EAAE,EAAE,kCAAkC,EAAE,eAAe,EAAE;AAC9D,iBAAA;;;ACQK,MAAO,UAAW,SAAQ,OAAgB,CAAA;AAC3B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;AACjE,IAAA,MAAM;AAEE,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAU;AAErD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,UAAU,EAAE;QAEjB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;AACtD,QAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAA0B,UAAU,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC;IAChF;IAEO,QAAQ,GAAA;AACb,QAAA,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAE,QAAkB,EAAC;QACnF,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,sDAAsD,CAAC;QAC1F;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC;IACtC;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC;IACzC;IAEQ,UAAU,GAAA;AAChB,QAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IACzE;uGA9BW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB,SAAS;mBAAC,EAAE,QAAQ,EAAE,cAAc,EAAE;;;ACTjC,MAAO,cAAe,SAAQ,OAAgB,CAAA;AAC/B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;AACzE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,UAAU,GAAA;AAChB,QAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACxE;uGATW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,GAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,SAAS;mBAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE;;;ACY5E,MAAO,cAAkB,SAAQ,eAAe,CAAA;AACpC,IAAA,cAAc,GAAG,KAAK,CAAC,QAAQ,yDAAwB;AAC9C,IAAA,eAAe,GAAG,KAAK,CAAS,EAAE,2DAAC;AAC3C,IAAA,QAAQ,GAAG,MAAM,EAAC,UAAuB,EAAC;AACxC,IAAA,KAAK,GAAG,mBAAmB,CAAC,oBAAoB,CAAC;AAEpE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE;AACjC,YAAA,mBAAmB,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC;AAChD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,UAAU,GAAA;AAChB,QAAA,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IACzE;uGAjBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,4BAAA,EAAA,OAAA,EAAA,2DAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAR1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,sBAAsB,EAAE,4BAA4B;AACpD,wBAAA,+BAA+B,EAAE,4BAA4B;AAC7D,wBAAA,SAAS,EAAE,CAAA,yDAAA,CAA2D;AACvE,qBAAA;AACF,iBAAA;;;MCJY,cAAc,CAAA;uGAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHf,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAA,EAAA,OAAA,EAAA,CAChE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAA,EAAA,CAAA;AAE/D,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHf,QAAQ,CAAA,EAAA,CAAA;;2FAGP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAJ1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;oBAC3E,OAAO,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC;AAC5E,iBAAA;;;MCkBY,wBAAwB,CAAA;AAChB,IAAA,KAAK,GAAG,mBAAmB,CAAC,oBAAoB,CAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAA0B,UAAU,CAAC;AACtD,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU;IAE1C,wBAAwB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAE;AAEjC,IAAA,gBAAgB;AAChB,IAAA,UAAU;IAEV,MAAM,GAAG,wBAAwB,CAChD,IAAI,CAAC,QAAQ,CAAC,aAAa,EAC3B,QAAQ,CACT;AACgB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACrC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;AACpC,IAAA,CAAC,iDAAC;AACiB,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;AAChE,QAAA,OAAO,WAAW;AACpB,IAAA,CAAC,kDAAC;AAEc,IAAA,4BAA4B,GAAG,KAAK,CAAC,QAAQ,uEAAqB;IAClE,6BAA6B,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,+BAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA+B;AAEpF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,EAAC,eAAqB,EAAC;AACvF,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC;AACrF,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAE9F,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC;AACxD,QAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1F,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;QACtD,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC;AAEzD,QAAA,MAAM,GAAG,GAAG,QAAQ,CAClB,OAC+B;AAC3B,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,cAAc,GAAG,QAAQ;YACtD,MAAM,EAAE,KAAK,IAAG;gBACd,KAAK,CAAC,eAAe,EAAE;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE;YACjC,CAAC;AACF,SAAA,CAAA,+CACJ;QAED,MAAM,CAAC,MAAK;YACV,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3D,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;YACV,iBAAiB,CACf,IAAI,CAAC,UAAU,EACf,MAAM,EACN,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAC/C;AACH,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,4BAA4B,EAAE,CAAC;AACrF,QAAA,CAAC,CAAC;QACF,MAAM,CAAC,MAAK;AACV,YAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,CAAC,6BAA6B,EAAE,CAAC;AACzF,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAG;AACpD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;YAC3B,MAAM,cAAc,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;YAC7C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;AACjF,QAAA,CAAC,CAAC;IACJ;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;IAC3B;uGA7EW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,4BAAA,EAAA,EAAA,iBAAA,EAAA,8BAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,6BAAA,EAAA,EAAA,iBAAA,EAAA,+BAAA,EAAA,UAAA,EAAA,+BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,4EAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,CAAA,0EAAA,CAA4E;AACxF,qBAAA;AACF,iBAAA;;;MCDY,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,mBAAmB,CAAC,oBAAoB,CAAC;AACnD,IAAA,QAAQ,GAAG,MAAM,CAA0B,UAAU,CAAC;IAEvD,sBAAsB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAE;IAE/B,MAAM,GAAG,wBAAwB,CAChD,IAAI,CAAC,QAAQ,CAAC,aAAa,EAC3B,QAAQ,CACT;AACkB,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE;QACvC,IAAI,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE;YACzC,OAAO,SAAS,CAAC,SAAS;QAC5B;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,gDAAC;AAEe,IAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU;AAExC,IAAA,QAAQ;AAEzB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;AACjE,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEpF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,iBAAiB,CACf,IAAI,CAAC,QAAQ,EACb,aAAa,EACb,IAAI,KAAK,KAAK,GAAG,WAAW,GAAG,IAAI,KAAK,MAAM,GAAG,SAAS,GAAG,MAAM,CACpE;AACH,QAAA,CAAC,CAAC;IACJ;IAEO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;IACzB;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,KAAK,EAAE,IAAI,CAAC,GAAG,CACb,WAAW,KAAK;AACd,cAAE,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK;cAC3C,WAAW,KAAK;AAChB,kBAAE,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM;kBAC5C,IAAI,CACX;IACH;uGAnDW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,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,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,sEAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,CAAA,oEAAA,CAAsE;AACjF,wBAAA,SAAS,EAAE,CAAA,YAAA,CAAc;AAC1B,qBAAA;AACF,iBAAA;;;AC1BD;;AAEG;;;;"}
@@ -0,0 +1,287 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { input, signal, contentChild, afterRenderEffect, ChangeDetectionStrategy, Component, computed, Directive, booleanAttribute, model, contentChildren, viewChild, ElementRef, viewChildren, effect } from '@angular/core';
4
+ import { elementSizeSignal, elementsSizesSignal } from '@ngneers/controls/api/ng';
5
+ import { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';
6
+ import { NgnDefer } from '@ngneers/controls/defer';
7
+ import { NgnScrollAmount, NgnDragScroll } from '@ngneers/controls/directives';
8
+ import { NgnIcon } from '@ngneers/controls/icon';
9
+ import { NgnError } from '@ngneers/controls/utils';
10
+ import { generateElementId } from '@ngneers/controls/utils-ng';
11
+ import { tabsControlTemplate } from '@ngneers/controls-themes/templates/tabs';
12
+
13
+ /**
14
+ * @category control
15
+ */
16
+ class NgnTab extends NgnBase {
17
+ theme = null;
18
+ /**
19
+ * The unique identifier for the tab.
20
+ */
21
+ tabId = input.required(...(ngDevMode ? [{ debugName: "tabId" }] : []));
22
+ /**
23
+ * Useful for accessing the {@link tabId} in a safe way, without worrying about timing.
24
+ */
25
+ safeTabId = signal(null, ...(ngDevMode ? [{ debugName: "safeTabId" }] : []));
26
+ content = contentChild('content', ...(ngDevMode ? [{ debugName: "content" }] : []));
27
+ header = contentChild('header', ...(ngDevMode ? [{ debugName: "header" }] : []));
28
+ constructor() {
29
+ super();
30
+ afterRenderEffect(() => {
31
+ this.safeTabId.set(this.tabId());
32
+ });
33
+ }
34
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTab, deps: [], target: i0.ɵɵFactoryTarget.Component });
35
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.0", type: NgnTab, isStandalone: true, selector: "ngn-tab", inputs: { tabId: { classPropertyName: "tabId", publicName: "tabId", isSignal: true, isRequired: true, transformFunction: null } }, providers: [provideSelf(NgnTab)], queries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true, isSignal: true }, { propertyName: "header", first: true, predicate: ["header"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTab, decorators: [{
38
+ type: Component,
39
+ args: [{
40
+ selector: 'ngn-tab',
41
+ imports: [],
42
+ template: '',
43
+ changeDetection: ChangeDetectionStrategy.OnPush,
44
+ providers: [provideSelf(NgnTab)],
45
+ }]
46
+ }], ctorParameters: () => [], propDecorators: { tabId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabId", required: true }] }], content: [{ type: i0.ContentChild, args: ['content', { isSignal: true }] }], header: [{ type: i0.ContentChild, args: ['header', { isSignal: true }] }] } });
47
+
48
+ class TabsTemplates extends NgnBase {
49
+ // Header left template
50
+ _userHeaderLeftTemplate = contentChild('headerLeft', ...(ngDevMode ? [{ debugName: "_userHeaderLeftTemplate" }] : []));
51
+ /**
52
+ * Set a custom template for the left side of the tabs header.
53
+ * Can also be set using an `<ng-template>` element with `#headerLeft` template reference variable.
54
+ */
55
+ templateHeaderLeft = input(null, ...(ngDevMode ? [{ debugName: "templateHeaderLeft" }] : []));
56
+ headerLeftTemplate = computed(() => this._userHeaderLeftTemplate() ?? this.templateHeaderLeft(), ...(ngDevMode ? [{ debugName: "headerLeftTemplate" }] : []));
57
+ // Header right template
58
+ _userHeaderRightTemplate = contentChild('headerRight', ...(ngDevMode ? [{ debugName: "_userHeaderRightTemplate" }] : []));
59
+ /**
60
+ * Set a custom template for the right side of the tabs header.
61
+ * Can also be set using an `<ng-template>` element with `#headerRight` template reference variable.
62
+ */
63
+ templateHeaderRight = input(null, ...(ngDevMode ? [{ debugName: "templateHeaderRight" }] : []));
64
+ headerRightTemplate = computed(() => this._userHeaderRightTemplate() ?? this.templateHeaderRight(), ...(ngDevMode ? [{ debugName: "headerRightTemplate" }] : []));
65
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TabsTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
66
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.1.0", type: TabsTemplates, isStandalone: true, inputs: { templateHeaderLeft: { classPropertyName: "templateHeaderLeft", publicName: "templateHeaderLeft", isSignal: true, isRequired: false, transformFunction: null }, templateHeaderRight: { classPropertyName: "templateHeaderRight", publicName: "templateHeaderRight", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userHeaderLeftTemplate", first: true, predicate: ["headerLeft"], descendants: true, isSignal: true }, { propertyName: "_userHeaderRightTemplate", first: true, predicate: ["headerRight"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: TabsTemplates, decorators: [{
69
+ type: Directive
70
+ }], propDecorators: { _userHeaderLeftTemplate: [{ type: i0.ContentChild, args: ['headerLeft', { isSignal: true }] }], templateHeaderLeft: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateHeaderLeft", required: false }] }], _userHeaderRightTemplate: [{ type: i0.ContentChild, args: ['headerRight', { isSignal: true }] }], templateHeaderRight: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateHeaderRight", required: false }] }] } });
71
+
72
+ const PADDING_FOR_STICKY_ELEMENTS = 15;
73
+ /**
74
+ * @category control
75
+ */
76
+ class NgnTabs extends TabsTemplates {
77
+ theme = this.injectThemeTemplate(tabsControlTemplate, 'root');
78
+ /**
79
+ * Whether to lazy load the tab contents when they become visible.
80
+ */
81
+ lazy = input(false, { ...(ngDevMode ? { debugName: "lazy" } : {}), transform: booleanAttribute });
82
+ /**
83
+ * Whether to cache the tab contents. Only applies to {@link lazy} loaded tabs.
84
+ */
85
+ cache = input(false, { ...(ngDevMode ? { debugName: "cache" } : {}), transform: booleanAttribute });
86
+ /**
87
+ * Get or set the active tab ID.
88
+ */
89
+ activeTab = model('', ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
90
+ /**
91
+ * Icon for the left scroll button.
92
+ */
93
+ iconScrollLeft = input(...(ngDevMode ? [undefined, { debugName: "iconScrollLeft" }] : []));
94
+ /**
95
+ * Icon for the right scroll button.
96
+ */
97
+ iconScrollRight = input(...(ngDevMode ? [undefined, { debugName: "iconScrollRight" }] : []));
98
+ isFirstRender = signal(true, ...(ngDevMode ? [{ debugName: "isFirstRender" }] : []));
99
+ elementId = generateElementId();
100
+ indicatorWidth = signal(0, ...(ngDevMode ? [{ debugName: "indicatorWidth" }] : []));
101
+ indicatorLeft = signal(0, ...(ngDevMode ? [{ debugName: "indicatorLeft" }] : []));
102
+ _tabs = contentChildren(NgnTab, ...(ngDevMode ? [{ debugName: "_tabs" }] : []));
103
+ _tabList = viewChild.required('tabList', {
104
+ read: (ElementRef),
105
+ });
106
+ _tabListScrollDirective = viewChild.required('tabList', {
107
+ read: NgnScrollAmount,
108
+ });
109
+ _tabListScroll = computed(() => this._tabListScrollDirective().scrollLeft(), ...(ngDevMode ? [{ debugName: "_tabListScroll" }] : []));
110
+ _tabListSize = elementSizeSignal(this._tabList);
111
+ _renderedTabHeaders = viewChildren('tabHeader', ...(ngDevMode ? [{ debugName: "_renderedTabHeaders" }] : []));
112
+ _headerElements = computed(() => this._renderedTabHeaders().map(header => header.nativeElement), ...(ngDevMode ? [{ debugName: "_headerElements" }] : []));
113
+ _headerSizes = elementsSizesSignal(this._headerElements);
114
+ headers = computed(() => this._tabs().map(tab => ({
115
+ id: tab.tabId(),
116
+ template: tab.header(),
117
+ })), ...(ngDevMode ? [{ debugName: "headers" }] : []));
118
+ contents = computed(() => this._tabs().map(tab => ({
119
+ id: tab.tabId(),
120
+ template: tab.content(),
121
+ })), ...(ngDevMode ? [{ debugName: "contents" }] : []));
122
+ _totalTabsWidth = computed(() => {
123
+ return this._headerSizes().reduce((sum, size) => sum + size.width, 0);
124
+ }, ...(ngDevMode ? [{ debugName: "_totalTabsWidth" }] : []));
125
+ tabsOverflowingRight = computed(() => {
126
+ const tabListWidth = this._tabListSize().width;
127
+ const tabListScrollWidth = this._tabList().nativeElement.scrollWidth - 0.5; // to avoid rounding issues
128
+ const scrollAmount = this._tabListScroll();
129
+ const _totalHeadersWidth = this._totalTabsWidth(); // retrigger calculation
130
+ return tabListScrollWidth - scrollAmount > tabListWidth;
131
+ }, ...(ngDevMode ? [{ debugName: "tabsOverflowingRight" }] : []));
132
+ tabsOverflowingLeft = computed(() => this._tabListScroll() > 0, ...(ngDevMode ? [{ debugName: "tabsOverflowingLeft" }] : []));
133
+ constructor() {
134
+ super();
135
+ afterRenderEffect(() => {
136
+ if (!this.activeTab() || !this._tabs().find(tab => tab.safeTabId() === this.activeTab())) {
137
+ this.activeTab.set(this._tabs()[0]?.tabId() ?? '');
138
+ }
139
+ });
140
+ effect(() => {
141
+ const activeTabIndex = this._tabs().findIndex(tab => tab.safeTabId() === this.activeTab());
142
+ const headersizes = this._headerSizes();
143
+ const headerSizesBeforeActive = headersizes
144
+ .slice(0, activeTabIndex)
145
+ .map(size => size.width)
146
+ .reduce((partialSum, a) => partialSum + a, 0);
147
+ this.indicatorWidth.set(headersizes[activeTabIndex]?.width ?? 0);
148
+ this.indicatorLeft.set(headerSizesBeforeActive);
149
+ });
150
+ }
151
+ ngAfterViewInit() {
152
+ if (!this.activeTab()) {
153
+ this.activeTab.set(this._tabs()[0]?.tabId() ?? '');
154
+ }
155
+ setTimeout(() => {
156
+ this.isFirstRender.set(false);
157
+ });
158
+ }
159
+ selectTab(tabId) {
160
+ this.activeTab.set(tabId);
161
+ this.ensureTabHeaderIsScrolledIntoView(this._tabs().findIndex(tab => tab.safeTabId() === tabId));
162
+ }
163
+ handleTabKeyPress(event, tabId) {
164
+ if (event.key === 'Enter' || event.key === ' ') {
165
+ event.preventDefault();
166
+ this.selectTab(tabId);
167
+ return;
168
+ }
169
+ if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {
170
+ event.preventDefault();
171
+ const focussedTabElement = this._headerElements().findIndex(element => element === document.activeElement);
172
+ const indexOfCurrentTab = focussedTabElement !== -1
173
+ ? focussedTabElement
174
+ : this._tabs().findIndex(tab => tab.safeTabId() === tabId);
175
+ if (indexOfCurrentTab === -1) {
176
+ return;
177
+ }
178
+ const nextIndex = event.key === 'ArrowRight' ? indexOfCurrentTab + 1 : indexOfCurrentTab - 1;
179
+ // overflow
180
+ const safeNextIndex = (nextIndex + this._tabs().length) % this._tabs().length;
181
+ this.ensureTabHeaderIsScrolledIntoView(safeNextIndex);
182
+ const tabElement = document.getElementById(`${this.elementId}_tab_${this._tabs()[safeNextIndex]?.safeTabId()}`);
183
+ if (tabElement) {
184
+ tabElement.focus();
185
+ }
186
+ }
187
+ }
188
+ ensureTabHeaderIsScrolledIntoView(index) {
189
+ const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } = this.getCutOffTabHeaders();
190
+ const tablistElement = this._tabList().nativeElement;
191
+ if (index <= leftCutOffTabHeaderIndex) {
192
+ const newScrollLeft = this.calculateHeaderSliceWidth(0, index) - PADDING_FOR_STICKY_ELEMENTS;
193
+ setTimeout(() => {
194
+ tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });
195
+ });
196
+ }
197
+ else if (index >= rightCutOffTabHeaderIndex && rightCutOffTabHeaderIndex >= 0) {
198
+ const rightCutOffHeader = this._headerSizes()[rightCutOffTabHeaderIndex];
199
+ if (!rightCutOffHeader) {
200
+ throw new NgnError('NgnTabs', `Right cut off header is undefined for index ${rightCutOffTabHeaderIndex}`);
201
+ }
202
+ const newScrollLeft = this.calculateHeaderSliceWidth(0, index) -
203
+ this._tabListSize().width +
204
+ rightCutOffHeader.width +
205
+ PADDING_FOR_STICKY_ELEMENTS;
206
+ setTimeout(() => {
207
+ tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });
208
+ });
209
+ }
210
+ }
211
+ calculateHeaderSliceWidth(fromIndex, toIndex) {
212
+ const headers = this._headerSizes().map(s => s.width);
213
+ return headers.slice(fromIndex, toIndex).reduce((a, b) => a + b, 0);
214
+ }
215
+ getCutOffTabHeaders() {
216
+ const headers = this._headerSizes().map(s => s.width);
217
+ const tabListElement = this._tabList().nativeElement;
218
+ const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding
219
+ const scrollAmount = this._tabListScroll();
220
+ let leftCutOffTabHeaderIndex = -1;
221
+ let rightCutOffTabHeaderIndex = -1;
222
+ let cumulativeWidth = PADDING_FOR_STICKY_ELEMENTS; // account for left padding
223
+ headers.forEach(header => {
224
+ for (let i = 0; i < headers.length; i++) {
225
+ const headerStart = cumulativeWidth;
226
+ const headerEnd = cumulativeWidth + header;
227
+ cumulativeWidth = headerEnd;
228
+ if (leftCutOffTabHeaderIndex === -1 && headerEnd > scrollAmount) {
229
+ leftCutOffTabHeaderIndex = i;
230
+ }
231
+ if (rightCutOffTabHeaderIndex === -1 &&
232
+ headerStart < scrollAmount + tabListWidth &&
233
+ headerEnd > scrollAmount + tabListWidth) {
234
+ rightCutOffTabHeaderIndex = i;
235
+ }
236
+ }
237
+ });
238
+ return {
239
+ left: leftCutOffTabHeaderIndex,
240
+ right: rightCutOffTabHeaderIndex,
241
+ };
242
+ }
243
+ scrollHeaders(direction) {
244
+ const tabListElement = this._tabList().nativeElement;
245
+ const headers = this._headerSizes().map(s => s.width);
246
+ const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding
247
+ const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } = this.getCutOffTabHeaders();
248
+ if (direction === 'right') {
249
+ const newScrollAmount = this.calculateHeaderSliceWidth(0, rightCutOffTabHeaderIndex);
250
+ const scrollAmountFixed = newScrollAmount >= tabListElement.scrollWidth
251
+ ? newScrollAmount
252
+ : newScrollAmount - PADDING_FOR_STICKY_ELEMENTS;
253
+ tabListElement.scrollTo({ left: scrollAmountFixed, behavior: 'smooth' });
254
+ }
255
+ else {
256
+ let usedUpSpace = 0;
257
+ let indexOfFirstVisibleTab = leftCutOffTabHeaderIndex;
258
+ while (usedUpSpace < tabListWidth - PADDING_FOR_STICKY_ELEMENTS * 2 &&
259
+ indexOfFirstVisibleTab >= 0) {
260
+ usedUpSpace += headers[indexOfFirstVisibleTab] ?? 0;
261
+ indexOfFirstVisibleTab--;
262
+ }
263
+ const scrollTo = indexOfFirstVisibleTab < 0
264
+ ? 0
265
+ : headers.slice(0, indexOfFirstVisibleTab + 2).reduce((a, b) => a + b, 0) -
266
+ PADDING_FOR_STICKY_ELEMENTS;
267
+ tabListElement.scrollTo({ left: scrollTo, behavior: 'smooth' });
268
+ }
269
+ }
270
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTabs, deps: [], target: i0.ɵɵFactoryTarget.Component });
271
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnTabs, isStandalone: true, selector: "ngn-tabs", inputs: { lazy: { classPropertyName: "lazy", publicName: "lazy", isSignal: true, isRequired: false, transformFunction: null }, cache: { classPropertyName: "cache", publicName: "cache", isSignal: true, isRequired: false, transformFunction: null }, activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null }, iconScrollLeft: { classPropertyName: "iconScrollLeft", publicName: "iconScrollLeft", isSignal: true, isRequired: false, transformFunction: null }, iconScrollRight: { classPropertyName: "iconScrollRight", publicName: "iconScrollRight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeTab: "activeTabChange" }, providers: [provideSelf(NgnTabs)], queries: [{ propertyName: "_tabs", predicate: NgnTab, isSignal: true }], viewQueries: [{ propertyName: "_tabList", first: true, predicate: ["tabList"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_tabListScrollDirective", first: true, predicate: ["tabList"], descendants: true, read: NgnScrollAmount, isSignal: true }, { propertyName: "_renderedTabHeaders", predicate: ["tabHeader"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\r\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\r\n <div\r\n ngnScrollAmount\r\n ngnDragScroll\r\n #tabList\r\n role=\"tablist\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'headers'\"\r\n [id]=\"elementId + '_tablist'\"\r\n >\r\n @if (tabsOverflowingLeft()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-left'\"\r\n (click)=\"scrollHeaders('left')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'chevron_left'\" />\r\n </button>\r\n }\r\n\r\n @for (header of headers(); track header.id; let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n [aria-selected]=\"header.id === activeTab()\"\r\n [id]=\"elementId + '_tab_' + header.id\"\r\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\r\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\r\n (keydown)=\"handleTabKeyPress($event, header.id)\"\r\n #tabHeader\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n header: true,\r\n 'header-active': header.id === activeTab(),\r\n }\"\r\n (click)=\"selectTab(header.id)\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\r\n </button>\r\n }\r\n @if (tabsOverflowingRight()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-right'\"\r\n (click)=\"scrollHeaders('right')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'chevron_right'\" />\r\n </button>\r\n }\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'header-active-indicator'\"\r\n [style.width.px]=\"indicatorWidth()\"\r\n [style.left.px]=\"indicatorLeft()\"\r\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\r\n ></div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\r\n</div>\r\n@for (content of contents(); track content.id; let i = $index) {\r\n <div\r\n role=\"tabpanel\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ content: content.id === activeTab() }\"\r\n [id]=\"elementId + '_tabpanel_' + content.id\"\r\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"content.template\"\r\n [open]=\"content.id === activeTab()\"\r\n [cache]=\"cache()\"\r\n [lazy]=\"lazy()\"\r\n />\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }, { kind: "directive", type: NgnScrollAmount, selector: "[ngnScrollAmount]" }, { kind: "directive", type: NgnDragScroll, selector: "[ngnDragScroll]" }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTabs, decorators: [{
274
+ type: Component,
275
+ args: [{ selector: 'ngn-tabs', imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon], changeDetection: ChangeDetectionStrategy.OnPush, providers: [provideSelf(NgnTabs)], template: "<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\r\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\r\n <div\r\n ngnScrollAmount\r\n ngnDragScroll\r\n #tabList\r\n role=\"tablist\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'headers'\"\r\n [id]=\"elementId + '_tablist'\"\r\n >\r\n @if (tabsOverflowingLeft()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-left'\"\r\n (click)=\"scrollHeaders('left')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'chevron_left'\" />\r\n </button>\r\n }\r\n\r\n @for (header of headers(); track header.id; let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n [aria-selected]=\"header.id === activeTab()\"\r\n [id]=\"elementId + '_tab_' + header.id\"\r\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\r\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\r\n (keydown)=\"handleTabKeyPress($event, header.id)\"\r\n #tabHeader\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n header: true,\r\n 'header-active': header.id === activeTab(),\r\n }\"\r\n (click)=\"selectTab(header.id)\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\r\n </button>\r\n }\r\n @if (tabsOverflowingRight()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-right'\"\r\n (click)=\"scrollHeaders('right')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'chevron_right'\" />\r\n </button>\r\n }\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'header-active-indicator'\"\r\n [style.width.px]=\"indicatorWidth()\"\r\n [style.left.px]=\"indicatorLeft()\"\r\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\r\n ></div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\r\n</div>\r\n@for (content of contents(); track content.id; let i = $index) {\r\n <div\r\n role=\"tabpanel\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ content: content.id === activeTab() }\"\r\n [id]=\"elementId + '_tabpanel_' + content.id\"\r\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"content.template\"\r\n [open]=\"content.id === activeTab()\"\r\n [cache]=\"cache()\"\r\n [lazy]=\"lazy()\"\r\n />\r\n </div>\r\n}\r\n" }]
276
+ }], ctorParameters: () => [], propDecorators: { lazy: [{ type: i0.Input, args: [{ isSignal: true, alias: "lazy", required: false }] }], cache: [{ type: i0.Input, args: [{ isSignal: true, alias: "cache", required: false }] }], activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: false }] }, { type: i0.Output, args: ["activeTabChange"] }], iconScrollLeft: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconScrollLeft", required: false }] }], iconScrollRight: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconScrollRight", required: false }] }], _tabs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => NgnTab), { isSignal: true }] }], _tabList: [{ type: i0.ViewChild, args: ['tabList', { ...{
277
+ read: (ElementRef),
278
+ }, isSignal: true }] }], _tabListScrollDirective: [{ type: i0.ViewChild, args: ['tabList', { ...{
279
+ read: NgnScrollAmount,
280
+ }, isSignal: true }] }], _renderedTabHeaders: [{ type: i0.ViewChildren, args: ['tabHeader', { isSignal: true }] }] } });
281
+
282
+ /**
283
+ * Generated bundle index. Do not edit.
284
+ */
285
+
286
+ export { NgnTab, NgnTabs };
287
+ //# sourceMappingURL=ngneers-controls-tabs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-tabs.mjs","sources":["../../src/tabs/tab.ts","../../src/tabs/tabs-templates.ts","../../src/tabs/tabs.ts","../../src/tabs/tabs.html","../../src/tabs/ngneers-controls-tabs.ts"],"sourcesContent":["import {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChild,\r\n input,\r\n signal,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { NgnBase, provideSelf } from '@ngneers/controls/base';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n selector: 'ngn-tab',\r\n imports: [],\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [provideSelf(NgnTab)],\r\n})\r\nexport class NgnTab extends NgnBase<'tabs'> {\r\n protected readonly theme = null;\r\n /**\r\n * The unique identifier for the tab.\r\n */\r\n public readonly tabId = input.required<string>();\r\n\r\n /**\r\n * Useful for accessing the {@link tabId} in a safe way, without worrying about timing.\r\n */\r\n public readonly safeTabId = signal<string | null>(null);\r\n\r\n public readonly content = contentChild<TemplateRef<unknown>>('content');\r\n public readonly header = contentChild<TemplateRef<unknown>>('header');\r\n\r\n constructor() {\r\n super();\r\n\r\n afterRenderEffect(() => {\r\n this.safeTabId.set(this.tabId());\r\n });\r\n }\r\n}\r\n","import { computed, contentChild, Directive, input, TemplateRef } from '@angular/core';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\n@Directive()\r\nexport abstract class TabsTemplates extends NgnBase<'tabs'> {\r\n // Header left template\r\n private readonly _userHeaderLeftTemplate = contentChild<TemplateRef<unknown>>('headerLeft');\r\n /**\r\n * Set a custom template for the left side of the tabs header.\r\n * Can also be set using an `<ng-template>` element with `#headerLeft` template reference variable.\r\n */\r\n public readonly templateHeaderLeft = input<TemplateRef<unknown> | null>(null);\r\n protected readonly headerLeftTemplate = computed(\r\n () => this._userHeaderLeftTemplate() ?? this.templateHeaderLeft()\r\n );\r\n\r\n // Header right template\r\n private readonly _userHeaderRightTemplate = contentChild<TemplateRef<unknown>>('headerRight');\r\n /**\r\n * Set a custom template for the right side of the tabs header.\r\n * Can also be set using an `<ng-template>` element with `#headerRight` template reference variable.\r\n */\r\n public readonly templateHeaderRight = input<TemplateRef<unknown> | null>(null);\r\n protected readonly headerRightTemplate = computed(\r\n () => this._userHeaderRightTemplate() ?? this.templateHeaderRight()\r\n );\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n type AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n effect,\r\n ElementRef,\r\n input,\r\n model,\r\n signal,\r\n viewChild,\r\n viewChildren,\r\n} from '@angular/core';\r\nimport { elementSizeSignal, elementsSizesSignal } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { NgnDragScroll, NgnScrollAmount } from '@ngneers/controls/directives';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { NgnError } from '@ngneers/controls/utils';\r\nimport { generateElementId } from '@ngneers/controls/utils-ng';\r\nimport { tabsControlTemplate } from '@ngneers/controls-themes/templates/tabs';\r\n\r\nimport { NgnTab } from './tab';\r\nimport { TabsTemplates } from './tabs-templates';\r\n\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\nconst PADDING_FOR_STICKY_ELEMENTS = 15;\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n selector: 'ngn-tabs',\r\n imports: [NgTemplateOutlet, NgnPt, NgnDefer, NgnScrollAmount, NgnDragScroll, NgnIcon],\r\n templateUrl: './tabs.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [provideSelf(NgnTabs)],\r\n})\r\nexport class NgnTabs extends TabsTemplates implements AfterViewInit {\r\n protected readonly theme = this.injectThemeTemplate(tabsControlTemplate, 'root');\r\n /**\r\n * Whether to lazy load the tab contents when they become visible.\r\n */\r\n public readonly lazy = input(false, { transform: booleanAttribute });\r\n /**\r\n * Whether to cache the tab contents. Only applies to {@link lazy} loaded tabs.\r\n */\r\n public readonly cache = input(false, { transform: booleanAttribute });\r\n /**\r\n * Get or set the active tab ID.\r\n */\r\n public readonly activeTab = model<string>('');\r\n /**\r\n * Icon for the left scroll button.\r\n */\r\n public readonly iconScrollLeft = input<IconType>();\r\n /**\r\n * Icon for the right scroll button.\r\n */\r\n public readonly iconScrollRight = input<IconType>();\r\n\r\n protected readonly isFirstRender = signal(true);\r\n\r\n protected readonly elementId = generateElementId();\r\n protected readonly indicatorWidth = signal(0);\r\n protected readonly indicatorLeft = signal(0);\r\n\r\n private readonly _tabs = contentChildren(NgnTab);\r\n private readonly _tabList = viewChild.required<unknown, ElementRef<HTMLDivElement>>('tabList', {\r\n read: ElementRef<HTMLDivElement>,\r\n });\r\n private readonly _tabListScrollDirective = viewChild.required('tabList', {\r\n read: NgnScrollAmount,\r\n });\r\n private readonly _tabListScroll = computed(() => this._tabListScrollDirective().scrollLeft());\r\n private readonly _tabListSize = elementSizeSignal(this._tabList);\r\n\r\n private readonly _renderedTabHeaders = viewChildren<ElementRef<HTMLButtonElement>>('tabHeader');\r\n private readonly _headerElements = computed(() =>\r\n this._renderedTabHeaders().map(header => header.nativeElement)\r\n );\r\n private readonly _headerSizes = elementsSizesSignal(this._headerElements);\r\n\r\n protected readonly headers = computed(() =>\r\n this._tabs().map(tab => ({\r\n id: tab.tabId(),\r\n template: tab.header(),\r\n }))\r\n );\r\n\r\n protected readonly contents = computed(() =>\r\n this._tabs().map(tab => ({\r\n id: tab.tabId(),\r\n template: tab.content(),\r\n }))\r\n );\r\n\r\n private readonly _totalTabsWidth = computed(() => {\r\n return this._headerSizes().reduce((sum, size) => sum + size.width, 0);\r\n });\r\n\r\n protected readonly tabsOverflowingRight = computed(() => {\r\n const tabListWidth = this._tabListSize().width;\r\n const tabListScrollWidth = this._tabList().nativeElement.scrollWidth - 0.5; // to avoid rounding issues\r\n const scrollAmount = this._tabListScroll();\r\n const _totalHeadersWidth = this._totalTabsWidth(); // retrigger calculation\r\n\r\n return tabListScrollWidth - scrollAmount > tabListWidth;\r\n });\r\n\r\n protected readonly tabsOverflowingLeft = computed(() => this._tabListScroll() > 0);\r\n\r\n constructor() {\r\n super();\r\n\r\n afterRenderEffect(() => {\r\n if (!this.activeTab() || !this._tabs().find(tab => tab.safeTabId() === this.activeTab())) {\r\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\r\n }\r\n });\r\n\r\n effect(() => {\r\n const activeTabIndex = this._tabs().findIndex(tab => tab.safeTabId() === this.activeTab());\r\n\r\n const headersizes = this._headerSizes();\r\n const headerSizesBeforeActive = headersizes\r\n .slice(0, activeTabIndex)\r\n .map(size => size.width)\r\n .reduce((partialSum, a) => partialSum + a, 0);\r\n\r\n this.indicatorWidth.set(headersizes[activeTabIndex]?.width ?? 0);\r\n this.indicatorLeft.set(headerSizesBeforeActive);\r\n });\r\n }\r\n\r\n public ngAfterViewInit() {\r\n if (!this.activeTab()) {\r\n this.activeTab.set(this._tabs()[0]?.tabId() ?? '');\r\n }\r\n setTimeout(() => {\r\n this.isFirstRender.set(false);\r\n });\r\n }\r\n\r\n protected selectTab(tabId: string) {\r\n this.activeTab.set(tabId);\r\n this.ensureTabHeaderIsScrolledIntoView(\r\n this._tabs().findIndex(tab => tab.safeTabId() === tabId)\r\n );\r\n }\r\n\r\n protected handleTabKeyPress(event: KeyboardEvent, tabId: string) {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.selectTab(tabId);\r\n return;\r\n }\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\r\n event.preventDefault();\r\n\r\n const focussedTabElement = this._headerElements().findIndex(\r\n element => element === document.activeElement\r\n );\r\n\r\n const indexOfCurrentTab =\r\n focussedTabElement !== -1\r\n ? focussedTabElement\r\n : this._tabs().findIndex(tab => tab.safeTabId() === tabId);\r\n if (indexOfCurrentTab === -1) {\r\n return;\r\n }\r\n\r\n const nextIndex = event.key === 'ArrowRight' ? indexOfCurrentTab + 1 : indexOfCurrentTab - 1;\r\n // overflow\r\n const safeNextIndex = (nextIndex + this._tabs().length) % this._tabs().length;\r\n\r\n this.ensureTabHeaderIsScrolledIntoView(safeNextIndex);\r\n\r\n const tabElement = document.getElementById(\r\n `${this.elementId}_tab_${this._tabs()[safeNextIndex]?.safeTabId()}`\r\n ) as HTMLElement;\r\n if (tabElement) {\r\n tabElement.focus();\r\n }\r\n }\r\n }\r\n\r\n private ensureTabHeaderIsScrolledIntoView(index: number) {\r\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\r\n this.getCutOffTabHeaders();\r\n const tablistElement = this._tabList().nativeElement;\r\n if (index <= leftCutOffTabHeaderIndex) {\r\n const newScrollLeft = this.calculateHeaderSliceWidth(0, index) - PADDING_FOR_STICKY_ELEMENTS;\r\n setTimeout(() => {\r\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\r\n });\r\n } else if (index >= rightCutOffTabHeaderIndex && rightCutOffTabHeaderIndex >= 0) {\r\n const rightCutOffHeader = this._headerSizes()[rightCutOffTabHeaderIndex];\r\n if (!rightCutOffHeader) {\r\n throw new NgnError(\r\n 'NgnTabs',\r\n `Right cut off header is undefined for index ${rightCutOffTabHeaderIndex}`\r\n );\r\n }\r\n const newScrollLeft =\r\n this.calculateHeaderSliceWidth(0, index) -\r\n this._tabListSize().width +\r\n rightCutOffHeader.width +\r\n PADDING_FOR_STICKY_ELEMENTS;\r\n setTimeout(() => {\r\n tablistElement.scrollTo({ left: newScrollLeft, behavior: 'smooth' });\r\n });\r\n }\r\n }\r\n\r\n private calculateHeaderSliceWidth(fromIndex: number, toIndex: number) {\r\n const headers = this._headerSizes().map(s => s.width);\r\n return headers.slice(fromIndex, toIndex).reduce((a, b) => a + b, 0);\r\n }\r\n\r\n private getCutOffTabHeaders() {\r\n const headers = this._headerSizes().map(s => s.width);\r\n const tabListElement = this._tabList().nativeElement;\r\n\r\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\r\n\r\n const scrollAmount = this._tabListScroll();\r\n let leftCutOffTabHeaderIndex = -1;\r\n let rightCutOffTabHeaderIndex = -1;\r\n let cumulativeWidth = PADDING_FOR_STICKY_ELEMENTS; // account for left padding\r\n\r\n headers.forEach(header => {\r\n for (let i = 0; i < headers.length; i++) {\r\n const headerStart = cumulativeWidth;\r\n const headerEnd = cumulativeWidth + header;\r\n cumulativeWidth = headerEnd;\r\n\r\n if (leftCutOffTabHeaderIndex === -1 && headerEnd > scrollAmount) {\r\n leftCutOffTabHeaderIndex = i;\r\n }\r\n if (\r\n rightCutOffTabHeaderIndex === -1 &&\r\n headerStart < scrollAmount + tabListWidth &&\r\n headerEnd > scrollAmount + tabListWidth\r\n ) {\r\n rightCutOffTabHeaderIndex = i;\r\n }\r\n }\r\n });\r\n return {\r\n left: leftCutOffTabHeaderIndex,\r\n right: rightCutOffTabHeaderIndex,\r\n };\r\n }\r\n\r\n protected scrollHeaders(direction: 'left' | 'right') {\r\n const tabListElement = this._tabList().nativeElement;\r\n const headers = this._headerSizes().map(s => s.width);\r\n\r\n const tabListWidth = tabListElement.clientWidth - PADDING_FOR_STICKY_ELEMENTS; // account for right padding\r\n\r\n const { left: leftCutOffTabHeaderIndex, right: rightCutOffTabHeaderIndex } =\r\n this.getCutOffTabHeaders();\r\n\r\n if (direction === 'right') {\r\n const newScrollAmount = this.calculateHeaderSliceWidth(0, rightCutOffTabHeaderIndex);\r\n\r\n const scrollAmountFixed =\r\n newScrollAmount >= tabListElement.scrollWidth\r\n ? newScrollAmount\r\n : newScrollAmount - PADDING_FOR_STICKY_ELEMENTS;\r\n tabListElement.scrollTo({ left: scrollAmountFixed, behavior: 'smooth' });\r\n } else {\r\n let usedUpSpace = 0;\r\n let indexOfFirstVisibleTab = leftCutOffTabHeaderIndex;\r\n while (\r\n usedUpSpace < tabListWidth - PADDING_FOR_STICKY_ELEMENTS * 2 &&\r\n indexOfFirstVisibleTab >= 0\r\n ) {\r\n usedUpSpace += headers[indexOfFirstVisibleTab] ?? 0;\r\n indexOfFirstVisibleTab--;\r\n }\r\n\r\n const scrollTo =\r\n indexOfFirstVisibleTab < 0\r\n ? 0\r\n : headers.slice(0, indexOfFirstVisibleTab + 2).reduce((a, b) => a + b, 0) -\r\n PADDING_FOR_STICKY_ELEMENTS;\r\n\r\n tabListElement.scrollTo({ left: scrollTo, behavior: 'smooth' });\r\n }\r\n }\r\n}\r\n","<div [ptInt]=\"this\" [ptClass]=\"'headers-container'\">\r\n <ng-container [ngTemplateOutlet]=\"headerLeftTemplate()\" />\r\n <div\r\n ngnScrollAmount\r\n ngnDragScroll\r\n #tabList\r\n role=\"tablist\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'headers'\"\r\n [id]=\"elementId + '_tablist'\"\r\n >\r\n @if (tabsOverflowingLeft()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-left'\"\r\n (click)=\"scrollHeaders('left')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollLeft()\" [defaultIcon]=\"'chevron_left'\" />\r\n </button>\r\n }\r\n\r\n @for (header of headers(); track header.id; let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n [aria-selected]=\"header.id === activeTab()\"\r\n [id]=\"elementId + '_tab_' + header.id\"\r\n [attr.aria-controls]=\"elementId + '_tabpanel_' + header.id\"\r\n [tabindex]=\"header.id === activeTab() ? 0 : -1\"\r\n (keydown)=\"handleTabKeyPress($event, header.id)\"\r\n #tabHeader\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n header: true,\r\n 'header-active': header.id === activeTab(),\r\n }\"\r\n (click)=\"selectTab(header.id)\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"header.template\"></ng-container>\r\n </button>\r\n }\r\n @if (tabsOverflowingRight()) {\r\n <button\r\n tabindex=\"-1\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroll-right'\"\r\n (click)=\"scrollHeaders('right')\"\r\n >\r\n <ngn-icon [icon]=\"iconScrollRight()\" [defaultIcon]=\"'chevron_right'\" />\r\n </button>\r\n }\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'header-active-indicator'\"\r\n [style.width.px]=\"indicatorWidth()\"\r\n [style.left.px]=\"indicatorLeft()\"\r\n [style.transitionDuration.ms]=\"isFirstRender() ? 0 : undefined\"\r\n ></div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"headerRightTemplate()\" />\r\n</div>\r\n@for (content of contents(); track content.id; let i = $index) {\r\n <div\r\n role=\"tabpanel\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ content: content.id === activeTab() }\"\r\n [id]=\"elementId + '_tabpanel_' + content.id\"\r\n [attr.aria-labelledby]=\"elementId + '_tab_' + content.id\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"content.template\"\r\n [open]=\"content.id === activeTab()\"\r\n [cache]=\"cache()\"\r\n [lazy]=\"lazy()\"\r\n />\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
4
+ import { NgnIcon } from '@ngneers/controls/icon';
5
+ import { tagControlTemplate } from '@ngneers/controls-themes/templates/tag';
6
+
7
+ /**
8
+ * @category control
9
+ */
10
+ class NgnTag extends NgnBase {
11
+ theme = this.injectThemeTemplate(tagControlTemplate, 'root');
12
+ /**
13
+ * Set an icon to display before the text.
14
+ */
15
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTag, deps: null, target: i0.ɵɵFactoryTarget.Component });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.0", type: NgnTag, isStandalone: true, selector: "ngn-tag", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnTag)], usesInheritance: true, ngImport: i0, template: "@if (icon()) {\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"icon()\" />\r\n}\r\n<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ng-content />\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnIcon, selector: "ngn-icon", inputs: ["defaultIcon", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnTag, decorators: [{
20
+ type: Component,
21
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-tag', imports: [NgnPt, NgnIcon], providers: [provideSelf(NgnTag)], template: "@if (icon()) {\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"icon()\" />\r\n}\r\n<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ng-content />\r\n</div>\r\n" }]
22
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }] } });
23
+
24
+ /**
25
+ * Generated bundle index. Do not edit.
26
+ */
27
+
28
+ export { NgnTag };
29
+ //# sourceMappingURL=ngneers-controls-tag.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngneers-controls-tag.mjs","sources":["../../src/tag/tag.ts","../../src/tag/tag.html","../../src/tag/ngneers-controls-tag.ts"],"sourcesContent":["import { Component, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { tagControlTemplate } from '@ngneers/controls-themes/templates/tag';\r\n\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-tag',\r\n templateUrl: './tag.html',\r\n imports: [NgnPt, NgnIcon],\r\n providers: [provideSelf(NgnTag)],\r\n})\r\nexport class NgnTag extends NgnBase<'tag'> {\r\n protected readonly theme = this.injectThemeTemplate(tagControlTemplate, 'root');\r\n\r\n /**\r\n * Set an icon to display before the text.\r\n */\r\n public readonly icon = input<IconType>();\r\n}\r\n","@if (icon()) {\r\n <ngn-icon [ptInt]=\"this\" [ptClass]=\"'icon'\" [icon]=\"icon()\" />\r\n}\r\n<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ng-content />\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAOA;;AAEG;AAQG,MAAO,MAAO,SAAQ,OAAc,CAAA;IACrB,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC;AAE/E;;AAEG;IACa,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAY;uGAN7B,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFN,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECflC,mLAMA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGb,MAAM,EAAA,UAAA,EAAA,CAAA;kBAPlB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,SAAS,WAEV,CAAC,KAAK,EAAE,OAAO,CAAC,EAAA,SAAA,EACd,CAAC,WAAW,QAAQ,CAAC,EAAA,QAAA,EAAA,mLAAA,EAAA;;;AEflC;;AAEG;;;;"}