@star-ng/ui 0.0.0-stage → 0.2.0

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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -2
  3. package/fesm2022/star-ng-ui-accordion.mjs +376 -0
  4. package/fesm2022/star-ng-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/star-ng-ui-autocomplete.mjs +786 -0
  6. package/fesm2022/star-ng-ui-autocomplete.mjs.map +1 -0
  7. package/fesm2022/star-ng-ui-avatar.mjs +154 -0
  8. package/fesm2022/star-ng-ui-avatar.mjs.map +1 -0
  9. package/fesm2022/star-ng-ui-badge.mjs +153 -0
  10. package/fesm2022/star-ng-ui-badge.mjs.map +1 -0
  11. package/fesm2022/star-ng-ui-breadcrumb.mjs +199 -0
  12. package/fesm2022/star-ng-ui-breadcrumb.mjs.map +1 -0
  13. package/fesm2022/star-ng-ui-button.mjs +282 -0
  14. package/fesm2022/star-ng-ui-button.mjs.map +1 -0
  15. package/fesm2022/star-ng-ui-card.mjs +112 -0
  16. package/fesm2022/star-ng-ui-card.mjs.map +1 -0
  17. package/fesm2022/star-ng-ui-chart.mjs +1904 -0
  18. package/fesm2022/star-ng-ui-chart.mjs.map +1 -0
  19. package/fesm2022/star-ng-ui-checkbox.mjs +345 -0
  20. package/fesm2022/star-ng-ui-checkbox.mjs.map +1 -0
  21. package/fesm2022/star-ng-ui-core.mjs +484 -0
  22. package/fesm2022/star-ng-ui-core.mjs.map +1 -0
  23. package/fesm2022/star-ng-ui-data-display.mjs +1870 -0
  24. package/fesm2022/star-ng-ui-data-display.mjs.map +1 -0
  25. package/fesm2022/star-ng-ui-date-picker.mjs +2786 -0
  26. package/fesm2022/star-ng-ui-date-picker.mjs.map +1 -0
  27. package/fesm2022/star-ng-ui-dialog.mjs +948 -0
  28. package/fesm2022/star-ng-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/star-ng-ui-drawer.mjs +158 -0
  30. package/fesm2022/star-ng-ui-drawer.mjs.map +1 -0
  31. package/fesm2022/star-ng-ui-editor.mjs +416 -0
  32. package/fesm2022/star-ng-ui-editor.mjs.map +1 -0
  33. package/fesm2022/star-ng-ui-field.mjs +378 -0
  34. package/fesm2022/star-ng-ui-field.mjs.map +1 -0
  35. package/fesm2022/star-ng-ui-file-upload.mjs +762 -0
  36. package/fesm2022/star-ng-ui-file-upload.mjs.map +1 -0
  37. package/fesm2022/star-ng-ui-i18n-de.mjs +179 -0
  38. package/fesm2022/star-ng-ui-i18n-de.mjs.map +1 -0
  39. package/fesm2022/star-ng-ui-i18n-es.mjs +179 -0
  40. package/fesm2022/star-ng-ui-i18n-es.mjs.map +1 -0
  41. package/fesm2022/star-ng-ui-input-group.mjs +188 -0
  42. package/fesm2022/star-ng-ui-input-group.mjs.map +1 -0
  43. package/fesm2022/star-ng-ui-input-mask.mjs +434 -0
  44. package/fesm2022/star-ng-ui-input-mask.mjs.map +1 -0
  45. package/fesm2022/star-ng-ui-input-number.mjs +691 -0
  46. package/fesm2022/star-ng-ui-input-number.mjs.map +1 -0
  47. package/fesm2022/star-ng-ui-input-otp.mjs +343 -0
  48. package/fesm2022/star-ng-ui-input-otp.mjs.map +1 -0
  49. package/fesm2022/star-ng-ui-input-tags.mjs +616 -0
  50. package/fesm2022/star-ng-ui-input-tags.mjs.map +1 -0
  51. package/fesm2022/star-ng-ui-knob.mjs +514 -0
  52. package/fesm2022/star-ng-ui-knob.mjs.map +1 -0
  53. package/fesm2022/star-ng-ui-layout.mjs +608 -0
  54. package/fesm2022/star-ng-ui-layout.mjs.map +1 -0
  55. package/fesm2022/star-ng-ui-listbox.mjs +886 -0
  56. package/fesm2022/star-ng-ui-listbox.mjs.map +1 -0
  57. package/fesm2022/star-ng-ui-media.mjs +833 -0
  58. package/fesm2022/star-ng-ui-media.mjs.map +1 -0
  59. package/fesm2022/star-ng-ui-menu.mjs +1840 -0
  60. package/fesm2022/star-ng-ui-menu.mjs.map +1 -0
  61. package/fesm2022/star-ng-ui-message.mjs +191 -0
  62. package/fesm2022/star-ng-ui-message.mjs.map +1 -0
  63. package/fesm2022/star-ng-ui-paginator.mjs +387 -0
  64. package/fesm2022/star-ng-ui-paginator.mjs.map +1 -0
  65. package/fesm2022/star-ng-ui-panel.mjs +324 -0
  66. package/fesm2022/star-ng-ui-panel.mjs.map +1 -0
  67. package/fesm2022/star-ng-ui-password.mjs +517 -0
  68. package/fesm2022/star-ng-ui-password.mjs.map +1 -0
  69. package/fesm2022/star-ng-ui-popover.mjs +241 -0
  70. package/fesm2022/star-ng-ui-popover.mjs.map +1 -0
  71. package/fesm2022/star-ng-ui-progress-bar.mjs +183 -0
  72. package/fesm2022/star-ng-ui-progress-bar.mjs.map +1 -0
  73. package/fesm2022/star-ng-ui-radio.mjs +411 -0
  74. package/fesm2022/star-ng-ui-radio.mjs.map +1 -0
  75. package/fesm2022/star-ng-ui-rating.mjs +211 -0
  76. package/fesm2022/star-ng-ui-rating.mjs.map +1 -0
  77. package/fesm2022/star-ng-ui-select-button.mjs +613 -0
  78. package/fesm2022/star-ng-ui-select-button.mjs.map +1 -0
  79. package/fesm2022/star-ng-ui-select.mjs +2547 -0
  80. package/fesm2022/star-ng-ui-select.mjs.map +1 -0
  81. package/fesm2022/star-ng-ui-skeleton.mjs +160 -0
  82. package/fesm2022/star-ng-ui-skeleton.mjs.map +1 -0
  83. package/fesm2022/star-ng-ui-slider.mjs +552 -0
  84. package/fesm2022/star-ng-ui-slider.mjs.map +1 -0
  85. package/fesm2022/star-ng-ui-spinner.mjs +148 -0
  86. package/fesm2022/star-ng-ui-spinner.mjs.map +1 -0
  87. package/fesm2022/star-ng-ui-stepper.mjs +360 -0
  88. package/fesm2022/star-ng-ui-stepper.mjs.map +1 -0
  89. package/fesm2022/star-ng-ui-table.mjs +3531 -0
  90. package/fesm2022/star-ng-ui-table.mjs.map +1 -0
  91. package/fesm2022/star-ng-ui-tabs.mjs +464 -0
  92. package/fesm2022/star-ng-ui-tabs.mjs.map +1 -0
  93. package/fesm2022/star-ng-ui-tag.mjs +129 -0
  94. package/fesm2022/star-ng-ui-tag.mjs.map +1 -0
  95. package/fesm2022/star-ng-ui-theme-switch.mjs +105 -0
  96. package/fesm2022/star-ng-ui-theme-switch.mjs.map +1 -0
  97. package/fesm2022/star-ng-ui-theme.mjs +98 -0
  98. package/fesm2022/star-ng-ui-theme.mjs.map +1 -0
  99. package/fesm2022/star-ng-ui-toast.mjs +298 -0
  100. package/fesm2022/star-ng-ui-toast.mjs.map +1 -0
  101. package/fesm2022/star-ng-ui-toggle-switch.mjs +316 -0
  102. package/fesm2022/star-ng-ui-toggle-switch.mjs.map +1 -0
  103. package/fesm2022/star-ng-ui-tooltip.mjs +297 -0
  104. package/fesm2022/star-ng-ui-tooltip.mjs.map +1 -0
  105. package/fesm2022/star-ng-ui-transloco.mjs +40 -0
  106. package/fesm2022/star-ng-ui-transloco.mjs.map +1 -0
  107. package/fesm2022/star-ng-ui-tree.mjs +1446 -0
  108. package/fesm2022/star-ng-ui-tree.mjs.map +1 -0
  109. package/fesm2022/star-ng-ui-utility.mjs +2134 -0
  110. package/fesm2022/star-ng-ui-utility.mjs.map +1 -0
  111. package/fesm2022/star-ng-ui.mjs +51 -0
  112. package/package.json +285 -3
  113. package/styles/_base.scss +70 -0
  114. package/styles/_shared.scss +2 -0
  115. package/styles/_tokens.scss +190 -0
  116. package/styles/controls/_accordion.scss +75 -0
  117. package/styles/controls/_autocomplete.scss +44 -0
  118. package/styles/controls/_avatar.scss +39 -0
  119. package/styles/controls/_breadcrumb.scss +45 -0
  120. package/styles/controls/_button.scss +137 -0
  121. package/styles/controls/_card.scss +38 -0
  122. package/styles/controls/_chart.scss +214 -0
  123. package/styles/controls/_chip.scss +51 -0
  124. package/styles/controls/_choice.scss +153 -0
  125. package/styles/controls/_data-display.scss +124 -0
  126. package/styles/controls/_date-picker.scss +300 -0
  127. package/styles/controls/_dialog.scss +123 -0
  128. package/styles/controls/_drawer.scss +118 -0
  129. package/styles/controls/_editor.scss +74 -0
  130. package/styles/controls/_field.scss +92 -0
  131. package/styles/controls/_file-upload.scss +136 -0
  132. package/styles/controls/_input-group.scss +104 -0
  133. package/styles/controls/_input-mask.scss +46 -0
  134. package/styles/controls/_input-number.scss +125 -0
  135. package/styles/controls/_knob.scss +76 -0
  136. package/styles/controls/_layout.scss +182 -0
  137. package/styles/controls/_listbox.scss +38 -0
  138. package/styles/controls/_media.scss +222 -0
  139. package/styles/controls/_menu.scss +254 -0
  140. package/styles/controls/_message.scss +48 -0
  141. package/styles/controls/_org-chart.scss +128 -0
  142. package/styles/controls/_paginator.scss +59 -0
  143. package/styles/controls/_panel.scss +83 -0
  144. package/styles/controls/_popover.scss +40 -0
  145. package/styles/controls/_progress-bar.scss +74 -0
  146. package/styles/controls/_select-button.scss +61 -0
  147. package/styles/controls/_select.scss +216 -0
  148. package/styles/controls/_skeleton.scss +43 -0
  149. package/styles/controls/_slider.scss +163 -0
  150. package/styles/controls/_spinner.scss +34 -0
  151. package/styles/controls/_stepper.scss +109 -0
  152. package/styles/controls/_table.scss +523 -0
  153. package/styles/controls/_tabs.scss +93 -0
  154. package/styles/controls/_tag.scss +84 -0
  155. package/styles/controls/_toast.scss +141 -0
  156. package/styles/controls/_tooltip.scss +14 -0
  157. package/styles/controls/_tree.scss +113 -0
  158. package/styles/controls/_utility.scss +654 -0
  159. package/styles/star-ng.css +5807 -0
  160. package/styles/star-ng.min.css +1 -0
  161. package/styles/star-ng.scss +50 -0
  162. package/theme/star-theme-first-paint.js +1 -0
  163. package/types/star-ng-ui-accordion.d.ts +82 -0
  164. package/types/star-ng-ui-autocomplete.d.ts +171 -0
  165. package/types/star-ng-ui-avatar.d.ts +43 -0
  166. package/types/star-ng-ui-badge.d.ts +46 -0
  167. package/types/star-ng-ui-breadcrumb.d.ts +39 -0
  168. package/types/star-ng-ui-button.d.ts +79 -0
  169. package/types/star-ng-ui-card.d.ts +29 -0
  170. package/types/star-ng-ui-chart.d.ts +337 -0
  171. package/types/star-ng-ui-checkbox.d.ts +92 -0
  172. package/types/star-ng-ui-core.d.ts +373 -0
  173. package/types/star-ng-ui-data-display.d.ts +438 -0
  174. package/types/star-ng-ui-date-picker.d.ts +701 -0
  175. package/types/star-ng-ui-dialog.d.ts +254 -0
  176. package/types/star-ng-ui-drawer.d.ts +29 -0
  177. package/types/star-ng-ui-editor.d.ts +96 -0
  178. package/types/star-ng-ui-field.d.ts +146 -0
  179. package/types/star-ng-ui-file-upload.d.ts +192 -0
  180. package/types/star-ng-ui-i18n-de.d.ts +7 -0
  181. package/types/star-ng-ui-i18n-es.d.ts +7 -0
  182. package/types/star-ng-ui-input-group.d.ts +58 -0
  183. package/types/star-ng-ui-input-mask.d.ts +126 -0
  184. package/types/star-ng-ui-input-number.d.ts +193 -0
  185. package/types/star-ng-ui-input-otp.d.ts +86 -0
  186. package/types/star-ng-ui-input-tags.d.ts +159 -0
  187. package/types/star-ng-ui-knob.d.ts +121 -0
  188. package/types/star-ng-ui-layout.d.ts +154 -0
  189. package/types/star-ng-ui-listbox.d.ts +170 -0
  190. package/types/star-ng-ui-media.d.ts +161 -0
  191. package/types/star-ng-ui-menu.d.ts +332 -0
  192. package/types/star-ng-ui-message.d.ts +52 -0
  193. package/types/star-ng-ui-paginator.d.ts +85 -0
  194. package/types/star-ng-ui-panel.d.ts +65 -0
  195. package/types/star-ng-ui-password.d.ts +129 -0
  196. package/types/star-ng-ui-popover.d.ts +57 -0
  197. package/types/star-ng-ui-progress-bar.d.ts +49 -0
  198. package/types/star-ng-ui-radio.d.ts +116 -0
  199. package/types/star-ng-ui-rating.d.ts +52 -0
  200. package/types/star-ng-ui-select-button.d.ts +169 -0
  201. package/types/star-ng-ui-select.d.ts +563 -0
  202. package/types/star-ng-ui-skeleton.d.ts +47 -0
  203. package/types/star-ng-ui-slider.d.ts +145 -0
  204. package/types/star-ng-ui-spinner.d.ts +29 -0
  205. package/types/star-ng-ui-stepper.d.ts +89 -0
  206. package/types/star-ng-ui-table.d.ts +885 -0
  207. package/types/star-ng-ui-tabs.d.ts +109 -0
  208. package/types/star-ng-ui-tag.d.ts +35 -0
  209. package/types/star-ng-ui-theme-switch.d.ts +36 -0
  210. package/types/star-ng-ui-theme.d.ts +95 -0
  211. package/types/star-ng-ui-toast.d.ts +84 -0
  212. package/types/star-ng-ui-toggle-switch.d.ts +81 -0
  213. package/types/star-ng-ui-tooltip.d.ts +66 -0
  214. package/types/star-ng-ui-transloco.d.ts +14 -0
  215. package/types/star-ng-ui-tree.d.ts +343 -0
  216. package/types/star-ng-ui-utility.d.ts +533 -0
  217. package/types/star-ng-ui.d.ts +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"star-ng-ui-data-display.mjs","names":[],"sources":["../../../projects/star-ng/data-display/tree-table-model.ts","../../../projects/star-ng/data-display/data-display.ts","../../../projects/star-ng/data-display/org-chart.ts"],"sourcesContent":["// Pure helpers of the windowed tree table: which rows are in the DOM and where the row that a\n// key targets must scroll. They hold no DOM or signal state, so they are unit tested without\n// layout. The row flattening and the key targets come from `@star-ng/ui/tree`. This file is\n// internal and is not exported from the entry point.\nimport { scrollOffsetToReveal } from '@star-ng/ui/tree';\n\n/** The rows in the DOM and the height of the two spacer rows that stand for the others. */\nexport interface RowWindow {\n /** Index of the first rendered row. */\n readonly start: number;\n /** Index after the last rendered row. */\n readonly end: number;\n /** Height in pixels of the rows before `start`. */\n readonly before: number;\n /** Height in pixels of the rows from `end` on. */\n readonly after: number;\n}\n\n/**\n * The window of rows around the scroll position, for rows of one fixed height. `bufferRows` extra\n * rows render before and after the visible ones. `scrollTop` and `viewportSize` are the scroll\n * area of the table (the header is part of both); the window is wider than the visible rows by\n * the height of the sticky header, which keeps the math independent of the header size.\n */\nexport function rowWindow(\n count: number,\n itemSize: number,\n scrollTop: number,\n viewportSize: number,\n bufferRows: number,\n): RowWindow {\n if (count <= 0 || itemSize <= 0) return { start: 0, end: 0, before: 0, after: 0 };\n const visible = Math.ceil(Math.max(0, viewportSize) / itemSize) + 1;\n // A scroll position past the end (the rows got fewer) shows the last rows, like the browser.\n const first = Math.min(\n Math.max(0, Math.floor(Math.max(0, scrollTop) / itemSize)),\n Math.max(0, count - visible),\n );\n const start = Math.max(0, first - bufferRows);\n const end = Math.min(count, first + visible + bufferRows);\n return { start, end, before: start * itemSize, after: (count - end) * itemSize };\n}\n\n/**\n * Scroll position that brings a row fully into view, below the sticky header, with the least\n * movement; null when the row is already fully visible. `headerSize` is the height of the sticky\n * header: it covers the top of the scroll area, so the rows see a viewport that is that much lower.\n */\nexport function revealRowOffset(\n index: number,\n itemSize: number,\n scrollTop: number,\n viewportSize: number,\n headerSize: number,\n): number | null {\n return scrollOffsetToReveal(\n index,\n itemSize,\n scrollTop,\n Math.max(itemSize, viewportSize - headerSize),\n );\n}\n\n/**\n * `aria-rowindex` of the row at an index of the visible rows. The header row is row 1, so the\n * first body row is 2.\n */\nexport function ariaRowIndex(index: number): number {\n return index + 2;\n}\n\n/** `aria-rowcount`: the visible rows and the header row. */\nexport function ariaRowCount(rowCount: number): number {\n return rowCount + 1;\n}\n","import { _IdGenerator } from '@angular/cdk/a11y';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport {\n afterEveryRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n linkedSignal,\n model,\n numberAttribute,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n} from '@angular/core';\nimport {\n optionText,\n readOption,\n STAR_UI_TEXT,\n starInlineKey,\n StarOptionKey,\n} from '@star-ng/ui/core';\nimport { StarPaginator } from '@star-ng/ui/paginator';\nimport {\n flattenVisible,\n navigationTarget,\n parentsOf,\n rowIndexOf,\n StarTreeNode,\n stillFocusable,\n TreeRow,\n} from '@star-ng/ui/tree';\nimport {\n ariaRowCount,\n ariaRowIndex,\n revealRowOffset,\n RowWindow,\n rowWindow,\n} from './tree-table-model';\n\n// ---------------------------------------------------------------- Tree table\n\nexport interface StarTreeTableColumn {\n readonly field: string;\n readonly header: string;\n readonly width?: string;\n readonly align?: 'start' | 'center' | 'end';\n}\n\ntype TreeTableNode = StarTreeNode<Record<string, unknown>>;\ntype TreeTableRow = TreeRow<TreeTableNode>;\n\n/** One rendered row: the row and its `aria-rowindex` (null in the default rendering). */\ninterface TreeTableEntry {\n readonly row: TreeTableRow;\n readonly aria: number | null;\n}\n\n/** Natural height of a tree table row in pixels. */\nconst TREE_TABLE_ROW_HEIGHT = 53;\n/** Rows that render before and after the visible ones in windowed rendering. */\nconst BUFFER_ROWS = 8;\n/** Height of the scroll area before it is measured (the first window of windowed rendering). */\nconst FALLBACK_VIEWPORT = 600;\n\n/**\n * Tree table (PrimeNG `p-treetable`): hierarchical rows with expand / collapse in a table,\n * `role=\"treegrid\"`, Right / Left on a row expand / collapse, Up / Down, Home and End move between\n * rows. Node `data` holds the column values; the first column shows the tree toggle.\n *\n * Large tables: `virtualScroll` with `scrollHeight` and `virtualItemSize` renders only the rows in\n * and near the viewport. It is still one `<table>`: a spacer row above and one below the rendered\n * rows stand for the others, the header is sticky, and every row has the fixed height\n * `virtualItemSize`. Keys, `aria-rowcount`, `aria-rowindex`, `aria-level`, `aria-setsize` and\n * `aria-posinset` work over all open rows, also the ones that are not in the DOM.\n *\n * `<star-tree-table [nodes]=\"budget\" [columns]=\"cols\" [(expanded)]=\"open\" ariaLabel=\"Budget\" />`\n */\n@Component({\n selector: 'star-tree-table',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'star-table star-tree-table',\n '[class.star-table--sticky]': '!!scrollHeight()',\n '[class.star-table--virtual]': 'windowed()',\n '[style.--star-table-row-height.px]': 'windowed() ? virtualItemSize() : null',\n },\n template: `\n <div\n #scroller\n class=\"star-table__scroll\"\n [attr.role]=\"windowed() ? 'group' : null\"\n [attr.aria-label]=\"windowed() ? ariaLabel() : null\"\n [attr.tabindex]=\"windowed() ? (activeRendered() ? -1 : 0) : null\"\n [style.max-height]=\"scrollHeight()\"\n (scroll)=\"syncScroll()\"\n (focus)=\"onScrollerFocus()\"\n (blur)=\"parked = false\"\n (keydown)=\"onScrollerKeydown($event)\"\n >\n <table\n role=\"treegrid\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-rowcount]=\"windowed() ? ariaRowCount(rows().length) : null\"\n >\n <thead #header>\n <tr [attr.aria-rowindex]=\"windowed() ? 1 : null\">\n @for (column of columns(); track column.field) {\n <th\n scope=\"col\"\n [style.width]=\"column.width\"\n [class]=\"'star-table__th star-table__cell--' + (column.align ?? 'start')\"\n >\n {{ column.header }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (window().before > 0) {\n <tr class=\"star-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"columns().length\" [style.height.px]=\"window().before\"></td>\n </tr>\n }\n @for (entry of entries(); track entry.row.node.key) {\n @let row = entry.row;\n <tr\n class=\"star-table__row\"\n [attr.aria-rowindex]=\"entry.aria\"\n [attr.aria-level]=\"row.level\"\n [attr.aria-setsize]=\"row.setSize\"\n [attr.aria-posinset]=\"row.position\"\n [attr.aria-expanded]=\"row.node.children?.length ? isOpen(row.node.key) : null\"\n [attr.tabindex]=\"focusKey() === row.node.key ? 0 : -1\"\n [attr.data-key]=\"row.node.key\"\n (keydown)=\"onKeydown($event, row)\"\n (focusin)=\"onRowFocus($event, row.node.key)\"\n >\n @for (column of columns(); track column.field; let first = $first) {\n <td [class]=\"'star-table__cell--' + (column.align ?? 'start')\">\n @if (first) {\n <span class=\"star-tree-table__first\" [style.--star-tree-level]=\"row.level - 1\">\n @if (row.node.children?.length) {\n <button\n type=\"button\"\n class=\"star-tree__toggle star-tree-table__toggle\"\n tabindex=\"-1\"\n [attr.aria-label]=\"\n isOpen(row.node.key)\n ? text.collapseItem(row.node.label)\n : text.expandItem(row.node.label)\n \"\n (click)=\"toggle(row.node.key)\"\n >\n <i class=\"ph-bold ph-caret-right\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <span class=\"star-tree__toggle star-tree__toggle--leaf\"></span>\n }\n {{ row.node.data?.[column.field] ?? row.node.label }}\n </span>\n } @else {\n {{ row.node.data?.[column.field] }}\n }\n </td>\n }\n </tr>\n }\n @if (window().after > 0) {\n <tr class=\"star-table__spacer\" aria-hidden=\"true\">\n <td [attr.colspan]=\"columns().length\" [style.height.px]=\"window().after\"></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n})\nexport class StarTreeTable {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly doc = inject(DOCUMENT);\n readonly nodes = input<readonly TreeTableNode[]>([]);\n readonly columns = input.required<readonly StarTreeTableColumn[]>();\n readonly expanded = model<readonly string[]>([]);\n readonly ariaLabel = input<string | null>(null);\n /**\n * Maximum height of the table (a CSS length, for example `20rem`). The table scrolls inside it\n * and the header stays at the top.\n */\n readonly scrollHeight = input<string | null>(null);\n /**\n * Windowed rendering for large tables: only the rows in and near the viewport are in the DOM.\n * Needs `scrollHeight`, and every row gets the fixed height `virtualItemSize` with its text on\n * one line. Without `scrollHeight` the table renders all rows as usual.\n */\n readonly virtualScroll = input(false, { transform: booleanAttribute });\n /**\n * Row height in pixels in windowed rendering. The default is the natural height of a row of\n * this table.\n */\n readonly virtualItemSize = input(TREE_TABLE_ROW_HEIGHT, { transform: numberAttribute });\n\n private readonly scroller = viewChild<ElementRef<HTMLElement>>('scroller');\n private readonly header = viewChild<ElementRef<HTMLElement>>('header');\n\n private readonly openKeys = computed(() => new Set(this.expanded()));\n private readonly parents = computed(() => parentsOf(this.nodes()));\n /** The rows whose parents are open, in order. The sibling numbers come from the data. */\n protected readonly rows = computed<TreeTableRow[]>(() =>\n flattenVisible(this.nodes(), this.openKeys()),\n );\n private readonly rowIndex = computed(() => rowIndexOf(this.rows()));\n\n /**\n * The active row (the one with `tabindex` 0). It stays a row after the rows change, and it is\n * kept in state, not read from the DOM: in windowed rendering its element may not exist.\n */\n protected readonly focusKey = linkedSignal<readonly TreeTableRow[], string | null>({\n source: this.rows,\n computation: (rows, previous) =>\n stillFocusable(previous?.value, this.rowIndex(), this.parents(), rows[0]?.node.key ?? null),\n });\n\n // ---- windowed rendering ----\n protected readonly windowed = computed(\n () => this.virtualScroll() && !!this.scrollHeight() && this.virtualItemSize() > 0,\n );\n private readonly scrollTop = signal(0);\n private readonly viewportHeight = signal(0);\n /** The rows that are in the DOM. Without windowed rendering: all of them. */\n protected readonly window = computed<RowWindow>(\n () => {\n if (!this.windowed()) return { start: 0, end: this.rows().length, before: 0, after: 0 };\n return rowWindow(\n this.rows().length,\n this.virtualItemSize(),\n this.scrollTop(),\n this.viewportHeight() || FALLBACK_VIEWPORT,\n BUFFER_ROWS,\n );\n },\n // A scroll of a few pixels does not change the window: skip the work after it.\n {\n equal: (a, b) =>\n a.start === b.start && a.end === b.end && a.before === b.before && a.after === b.after,\n },\n );\n protected readonly entries = computed<TreeTableEntry[]>(() => {\n const rows = this.rows();\n if (!this.windowed()) return rows.map((row) => ({ row, aria: null }));\n const { start, end } = this.window();\n return rows.slice(start, end).map((row, i) => ({ row, aria: ariaRowIndex(start + i) }));\n });\n /** The active row is in the DOM. If it is not, the scroll area takes the Tab stop. */\n protected readonly activeRendered = computed(() => {\n const index = this.rowIndex().get(this.focusKey() ?? '');\n const { start, end } = this.window();\n return index !== undefined && index >= start && index < end;\n });\n protected readonly ariaRowCount = ariaRowCount;\n /** Row to focus as soon as its element exists (it may need scrolling in first). */\n private pendingFocus: string | null = null;\n /** The focus waits on the scroll area because the focused row left the DOM. */\n protected parked = false;\n\n constructor() {\n // The rows or the window change (a scroll, a branch closes, new nodes) and the focused row\n // may leave the DOM. This effect runs before the template updates, while the row is still there.\n effect(() => {\n const window = this.window();\n this.rowIndex();\n untracked(() => {\n if (this.windowed()) this.parkFocus(window);\n });\n });\n // The scroll area changes its height with the rows (up to `scrollHeight`) and with the page.\n effect((onCleanup) => {\n const scroller = this.scroller()?.nativeElement;\n if (!this.windowed() || !scroller || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => this.syncScroll());\n observer.observe(scroller);\n onCleanup(() => observer.disconnect());\n });\n afterEveryRender({ read: () => this.syncScroll() });\n afterEveryRender(() => {\n this.applyPendingFocus();\n if (this.parked) this.restoreParkedFocus();\n });\n if (isDevMode()) {\n effect(() => {\n if (this.virtualScroll() && !this.scrollHeight()) {\n console.warn(\n 'star-tree-table: virtualScroll needs scrollHeight. Without it the table renders all rows.',\n );\n }\n });\n }\n }\n\n protected isOpen(key: string): boolean {\n return this.openKeys().has(key);\n }\n\n toggle(key: string, open = !this.isOpen(key)): void {\n this.expanded.update((keys) => {\n if (!open) return keys.filter((k) => k !== key);\n return keys.includes(key) ? keys : [...keys, key];\n });\n }\n\n /** Reads the scroll position and the height of the scroll area (windowed rendering). */\n protected syncScroll(): void {\n const scroller = this.scroller()?.nativeElement;\n if (!scroller || !this.windowed()) return;\n this.scrollTop.set(scroller.scrollTop);\n if (scroller.clientHeight) this.viewportHeight.set(scroller.clientHeight);\n }\n\n protected onRowFocus(event: FocusEvent, key: string): void {\n this.focusKey.set(key);\n this.pendingFocus = null;\n this.parked = false;\n // A row that the keyboard or a click focuses may sit under the sticky header.\n if (event.target === event.currentTarget && this.windowed()) this.revealRow(key);\n }\n\n /**\n * Moves the focus to a row. The row becomes the active row at once. In windowed rendering the\n * row is scrolled into the window first, and the focus is applied after its element renders.\n */\n private focusRow(key: string | null | undefined): void {\n if (!key) return;\n this.focusKey.set(key);\n this.pendingFocus = key;\n if (this.windowed()) this.revealRow(key);\n queueMicrotask(() => this.applyPendingFocus());\n }\n\n /** Scrolls a row fully into view, below the sticky header, with the least movement. */\n private revealRow(key: string): void {\n const scroller = this.scroller()?.nativeElement;\n const index = this.rowIndex().get(key);\n if (!scroller || index === undefined) return;\n const offset = revealRowOffset(\n index,\n this.virtualItemSize(),\n scroller.scrollTop,\n scroller.clientHeight,\n this.header()?.nativeElement.offsetHeight ?? 0,\n );\n if (offset === null) return;\n scroller.scrollTop = offset;\n this.syncScroll();\n }\n\n private rowElement(key: string): HTMLElement | null {\n return (\n this.scroller()?.nativeElement.querySelector<HTMLElement>(\n `tbody > tr[data-key=\"${CSS.escape(key)}\"]`,\n ) ?? null\n );\n }\n\n private applyPendingFocus(): void {\n const key = this.pendingFocus;\n if (key === null) return;\n if (!this.rowIndex().has(key)) {\n this.pendingFocus = null;\n return;\n }\n const row = this.rowElement(key);\n if (!row) return; // not rendered yet: the next render calls this again\n this.pendingFocus = null;\n row.focus({ preventScroll: this.windowed() });\n }\n\n /**\n * The browser drops the focus to the page body when the focused element leaves the DOM. Before\n * the focused row leaves the window, the focus moves to the scroll area; the keys still work\n * there, and the focus returns to the row when it renders again.\n */\n private parkFocus(window: RowWindow): void {\n const scroller = this.scroller()?.nativeElement;\n const active = this.doc.activeElement;\n if (!scroller || !active || active === scroller || !scroller.contains(active)) return;\n const key = active.closest<HTMLElement>('tbody > tr[data-key]')?.dataset['key'];\n const index = key === undefined ? undefined : this.rowIndex().get(key);\n if (index !== undefined && index >= window.start && index < window.end) return;\n this.parked = true;\n scroller.focus({ preventScroll: true });\n }\n\n private restoreParkedFocus(): void {\n const scroller = this.scroller()?.nativeElement;\n if (!scroller || this.doc.activeElement !== scroller) {\n this.parked = false;\n return;\n }\n const key = this.focusKey();\n if (key === null) return;\n this.rowElement(key)?.focus({ preventScroll: true });\n }\n\n /** Tab into the scroll area (no row has the Tab stop): the focus goes to the active row. */\n protected onScrollerFocus(): void {\n if (this.windowed() && !this.parked) this.focusRow(this.focusKey());\n }\n\n /** Keys on the scroll area itself (the focus is parked there): they act on the active row. */\n protected onScrollerKeydown(event: KeyboardEvent): void {\n if (!this.windowed() || event.target !== event.currentTarget) return;\n const row = this.rows()[this.rowIndex().get(this.focusKey() ?? '') ?? -1];\n if (row) this.onKeydown(event, row);\n }\n\n protected onKeydown(event: KeyboardEvent, row: TreeTableRow): void {\n const rows = this.rows();\n // A key that arrives before the last move has rendered (a held key, a far scroll) continues\n // from the row that the last move aimed at, not from the row that still has the DOM focus.\n const item =\n this.pendingFocus === null\n ? row\n : (rows[this.rowIndex().get(this.pendingFocus) ?? -1] ?? row);\n const index = this.rowIndex().get(item.node.key) ?? -1;\n const hasChildren = !!item.node.children?.length;\n const expanded = hasChildren && this.isOpen(item.node.key);\n // Arrow right opens a branch and Arrow left closes it; the two swap in right-to-left.\n const key = starInlineKey(event);\n const move = (target: string | null) => {\n if (target === null) return;\n event.preventDefault();\n this.focusRow(target);\n };\n switch (key) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'Home':\n case 'End':\n return move(navigationTarget(rows, index, key, { hasChildren, expanded }));\n case 'ArrowRight':\n if (hasChildren) {\n event.preventDefault();\n if (!expanded) this.toggle(item.node.key, true);\n }\n return;\n case 'ArrowLeft':\n event.preventDefault();\n if (expanded) this.toggle(item.node.key, false);\n else move(item.parentKey);\n return;\n }\n }\n}\n\n// ---------------------------------------------------------------- Data view\n\n/** Item template: `<ng-template starDataViewItem let-item let-layout=\"layout\">`. */\n@Directive({ selector: 'ng-template[starDataViewItem]' })\nexport class StarDataViewItem<T = unknown> {\n readonly starDataViewItemOf = input<readonly T[] | null>(null);\n readonly template =\n inject<TemplateRef<{ $implicit: T; layout: 'list' | 'grid'; index: number }>>(TemplateRef);\n static ngTemplateContextGuard<T>(\n _dir: StarDataViewItem<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T; layout: 'list' | 'grid'; index: number } {\n return true;\n }\n}\n\n/**\n * Data view (PrimeNG `p-dataview`): items in a list or a responsive grid, layout switch,\n * client pagination and an empty state. It does not sort: sort the items before you pass them in.\n * You design each item with a template.\n *\n * ```html\n * <star-data-view [items]=\"products\" [(layout)]=\"layout\" paginator [rows]=\"6\">\n * <ng-template starDataViewItem let-p let-layout=\"layout\">…</ng-template>\n * </star-data-view>\n * ```\n */\n@Component({\n selector: 'star-data-view',\n imports: [NgTemplateOutlet, StarPaginator],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-data-view' },\n template: `\n <div class=\"star-data-view__header\">\n <ng-content select=\"[starDataViewHeader]\" />\n <div\n class=\"star-segmented star-segmented--sm\"\n role=\"radiogroup\"\n [attr.aria-label]=\"text.layout\"\n >\n @for (option of layouts; track option.id) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"star-segmented__item\"\n [class.star-segmented__item--on]=\"layout() === option.id\"\n [attr.aria-checked]=\"layout() === option.id\"\n [attr.aria-label]=\"option.label\"\n (click)=\"layout.set(option.id)\"\n >\n <i [class]=\"option.icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n <ul class=\"star-data-view__items\" [class.star-data-view__items--grid]=\"layout() === 'grid'\">\n @for (item of pageItems(); track $index; let i = $index) {\n <li class=\"star-data-view__item\">\n @if (itemTemplate(); as custom) {\n <ng-container\n *ngTemplateOutlet=\"\n custom.template;\n context: { $implicit: item, layout: layout(), index: i }\n \"\n />\n }\n </li>\n } @empty {\n <li class=\"star-table__empty\">\n <i class=\"ph-bold ph-tray\" aria-hidden=\"true\"></i>\n {{ emptyMessage() ?? text.noData }}\n </li>\n }\n </ul>\n @if (paginator() && items().length > rows()) {\n <star-paginator\n [totalRecords]=\"items().length\"\n [(first)]=\"first\"\n [(rows)]=\"rows\"\n [rowsPerPageOptions]=\"[]\"\n />\n }\n `,\n})\nexport class StarDataView<T = unknown> {\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly layouts = [\n { id: 'list' as const, label: this.text.layoutList, icon: 'ph-bold ph-list' },\n { id: 'grid' as const, label: this.text.layoutGrid, icon: 'ph-bold ph-squares-four' },\n ];\n readonly items = input<readonly T[]>([]);\n readonly layout = model<'list' | 'grid'>('list');\n readonly paginator = input(false, { transform: booleanAttribute });\n readonly rows = model(6);\n readonly first = model(0);\n readonly emptyMessage = input<string | null>(null);\n protected readonly itemTemplate = contentChild(StarDataViewItem);\n\n protected readonly pageItems = computed(() =>\n this.paginator() ? this.items().slice(this.first(), this.first() + this.rows()) : this.items(),\n );\n}\n\n// ---------------------------------------------------------------- Order list and pick list\n\n/**\n * Order list (PrimeNG `p-orderlist`): reorder items with buttons or Alt + Arrow keys; the moved\n * item keeps focus and a live region announces its new position.\n * `<star-order-list [(value)]=\"priorities\" optionLabel=\"name\" ariaLabel=\"Queue order\" />`\n */\n@Component({\n selector: 'star-order-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-order-list' },\n template: `\n <div class=\"star-order-list__buttons\" role=\"group\" [attr.aria-label]=\"text.moveSelectedItem\">\n @for (action of actions; track action.id) {\n <button\n type=\"button\"\n class=\"star-select__icon-btn star-order-list__btn\"\n [attr.aria-label]=\"action.label\"\n [disabled]=\"selected() < 0 || !canMove(action.id)\"\n (click)=\"move(action.id)\"\n >\n <i [class]=\"action.icon\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <ul\n class=\"star-listbox star-order-list__list\"\n role=\"listbox\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"hintId\"\n >\n @for (item of value(); track $index; let i = $index) {\n <li\n role=\"option\"\n class=\"star-listbox__option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"selected() === i\"\n [class.star-listbox__option--selected]=\"selected() === i\"\n (click)=\"selected.set(i)\"\n (focus)=\"selected.set(i)\"\n (keydown)=\"onKeydown($event, i)\"\n >\n <i class=\"ph-bold ph-dots-six-vertical star-order-list__grip\" aria-hidden=\"true\"></i>\n {{ labelOf(item) }}\n </li>\n }\n </ul>\n <p class=\"star-sr-only\" [id]=\"hintId\">{{ text.orderListHint }}</p>\n <p class=\"star-sr-only\" aria-live=\"polite\">{{ announcement() }}</p>\n `,\n})\nexport class StarOrderList<T = unknown> {\n protected readonly text = inject(STAR_UI_TEXT);\n protected readonly hintId = inject(_IdGenerator).getId('star-order-hint-');\n readonly value = model<readonly T[]>([]);\n readonly optionLabel = input<StarOptionKey<T> | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n protected readonly selected = signal(-1);\n protected readonly announcement = signal('');\n protected readonly actions = [\n { id: 'top' as const, label: this.text.moveTop, icon: 'ph-bold ph-caret-double-up' },\n { id: 'up' as const, label: this.text.moveUp, icon: 'ph-bold ph-caret-up' },\n { id: 'down' as const, label: this.text.moveDown, icon: 'ph-bold ph-caret-down' },\n { id: 'bottom' as const, label: this.text.moveBottom, icon: 'ph-bold ph-caret-double-down' },\n ];\n\n protected labelOf(item: T): string {\n return optionText(item, this.optionLabel());\n }\n\n protected canMove(direction: 'top' | 'up' | 'down' | 'bottom'): boolean {\n const i = this.selected();\n return direction === 'top' || direction === 'up' ? i > 0 : i < this.value().length - 1;\n }\n\n move(direction: 'top' | 'up' | 'down' | 'bottom'): void {\n const from = this.selected();\n if (from < 0 || !this.canMove(direction)) return;\n const last = this.value().length - 1;\n const to = { top: 0, up: from - 1, down: from + 1, bottom: last }[direction];\n const items = [...this.value()];\n const [item] = items.splice(from, 1);\n items.splice(to, 0, item);\n this.value.set(items);\n this.selected.set(to);\n this.announcement.set(this.text.itemPosition(this.labelOf(item), to + 1, items.length));\n }\n\n protected onKeydown(event: KeyboardEvent, index: number): void {\n const list = (event.currentTarget as HTMLElement).parentElement!;\n const focusAt = (i: number) =>\n queueMicrotask(() => (list.children[i] as HTMLElement | undefined)?.focus());\n if (event.altKey && (event.key === 'ArrowUp' || event.key === 'ArrowDown')) {\n event.preventDefault();\n this.selected.set(index);\n this.move(event.key === 'ArrowUp' ? 'up' : 'down');\n focusAt(this.selected());\n } else if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n event.preventDefault();\n focusAt(\n Math.min(Math.max(index + (event.key === 'ArrowUp' ? -1 : 1), 0), this.value().length - 1),\n );\n }\n }\n}\n\n/**\n * Pick list (PrimeNG `p-picklist`): move items between a source and a target list.\n * Double-click or Enter moves one item; buttons move the selection or everything.\n * `<star-pick-list [(source)]=\"available\" [(target)]=\"assigned\" optionLabel=\"name\" sourceHeader=\"Available\" targetHeader=\"Assigned\" />`\n */\n@Component({\n selector: 'star-pick-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-pick-list' },\n template: `\n @for (side of sides; track side) {\n @let items = side === 'source' ? source() : target();\n <section class=\"star-pick-list__side\" [attr.aria-labelledby]=\"ids[side]\">\n <h3 class=\"star-pick-list__header\" [id]=\"ids[side]\">\n {{\n side === 'source'\n ? (sourceHeader() ?? text.pickListSource)\n : (targetHeader() ?? text.pickListTarget)\n }}\n <span class=\"star-badge star-badge--secondary star-badge--sm\">{{ items.length }}</span>\n </h3>\n <div class=\"star-pick-list__box\">\n <ul\n class=\"star-listbox star-pick-list__list\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"ids[side]\"\n >\n @for (item of items; track $index; let i = $index) {\n <li\n role=\"option\"\n class=\"star-listbox__option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isPicked(side, item)\"\n [class.star-listbox__option--selected]=\"isPicked(side, item)\"\n (click)=\"pick(side, item)\"\n (dblclick)=\"transfer(side, [item])\"\n (keydown.enter)=\"transfer(side, [item])\"\n (keydown.space)=\"$event.preventDefault(); pick(side, item)\"\n >\n {{ labelOf(item) }}\n </li>\n }\n </ul>\n <!-- Outside the listbox: a listbox may contain options and groups only. -->\n @if (!items.length) {\n <div class=\"star-listbox__empty star-pick-list__empty\" role=\"presentation\">\n {{ text.emptyMessage }}\n </div>\n }\n </div>\n </section>\n @if (side === 'source') {\n <div class=\"star-pick-list__buttons\" role=\"group\" [attr.aria-label]=\"text.transfer\">\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.moveSelectedToTarget\"\n [disabled]=\"!picked('source').length\"\n (click)=\"transfer('source', picked('source'))\"\n >\n <i class=\"ph-bold ph-caret-right star-icon-mirror\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.moveAllToTarget\"\n [disabled]=\"!source().length\"\n (click)=\"transfer('source', source())\"\n >\n <i class=\"ph-bold ph-caret-double-right star-icon-mirror\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.moveSelectedToSource\"\n [disabled]=\"!picked('target').length\"\n (click)=\"transfer('target', picked('target'))\"\n >\n <i class=\"ph-bold ph-caret-left star-icon-mirror\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"star-select__icon-btn\"\n [attr.aria-label]=\"text.moveAllToSource\"\n [disabled]=\"!target().length\"\n (click)=\"transfer('target', target())\"\n >\n <i class=\"ph-bold ph-caret-double-left star-icon-mirror\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n }\n `,\n})\nexport class StarPickList<T = unknown> {\n protected readonly text = inject(STAR_UI_TEXT);\n private readonly idGen = inject(_IdGenerator);\n protected readonly ids = {\n source: this.idGen.getId('star-pick-src-'),\n target: this.idGen.getId('star-pick-tgt-'),\n };\n protected readonly sides = ['source', 'target'] as const;\n\n readonly source = model<readonly T[]>([]);\n readonly target = model<readonly T[]>([]);\n readonly optionLabel = input<StarOptionKey<T> | null>(null);\n readonly sourceHeader = input<string | null>(null);\n readonly targetHeader = input<string | null>(null);\n\n private readonly selection = signal<{ source: readonly T[]; target: readonly T[] }>({\n source: [],\n target: [],\n });\n\n protected labelOf(item: T): string {\n return optionText(item, this.optionLabel());\n }\n protected picked(side: 'source' | 'target'): readonly T[] {\n return this.selection()[side];\n }\n protected isPicked(side: 'source' | 'target', item: T): boolean {\n return this.selection()[side].includes(item);\n }\n protected pick(side: 'source' | 'target', item: T): void {\n this.selection.update((sel) => ({\n ...sel,\n [side]: sel[side].includes(item) ? sel[side].filter((i) => i !== item) : [...sel[side], item],\n }));\n }\n\n transfer(from: 'source' | 'target', items: readonly T[]): void {\n if (!items.length) return;\n const moving = new Set(items);\n const [fromModel, toModel] =\n from === 'source' ? [this.source, this.target] : [this.target, this.source];\n fromModel.update((list) => list.filter((item) => !moving.has(item)));\n toModel.update((list) => [...list, ...items]);\n this.selection.update((sel) => ({ ...sel, [from]: [] }));\n }\n\n /** Reads a value with an optional key (exposed for custom templates). */\n read(item: T, key: StarOptionKey<T>): unknown {\n return readOption(item, key);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n contentChild,\n Directive,\n inject,\n input,\n model,\n output,\n TemplateRef,\n} from '@angular/core';\nimport { STAR_UI_TEXT } from '@star-ng/ui/core';\n\nexport interface StarOrgNode<T = unknown> {\n /** Unique id of the node in the chart. */\n readonly key: string;\n readonly label: string;\n /** Second line, for example a role. */\n readonly subtitle?: string;\n readonly data?: T;\n readonly children?: readonly StarOrgNode<T>[];\n}\n\nexport interface StarOrgNodeContext<T> {\n readonly $implicit: StarOrgNode<T>;\n readonly level: number;\n}\n\n/** Custom node content: `<ng-template starOrgNode let-node>…</ng-template>`. */\n@Directive({ selector: 'ng-template[starOrgNode]' })\nexport class StarOrgNodeTemplate<T = unknown> {\n readonly template = inject<TemplateRef<StarOrgNodeContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: StarOrgNodeTemplate<T>,\n _ctx: unknown,\n ): _ctx is StarOrgNodeContext<T> {\n return true;\n }\n}\n\n/**\n * Organization chart (PrimeNG `p-organizationchart`): a hierarchy drawn top-down with\n * connector lines. The markup is a nested list, so assistive technology reads the levels.\n * A node with children has a button that hides or shows its branch.\n *\n * `<star-org-chart ariaLabel=\"Safety team\" [value]=\"team\" [(collapsedKeys)]=\"closed\" selectable />`\n */\n@Component({\n selector: 'star-org-chart',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'star-org' },\n template: `\n <div class=\"star-org__scroll\">\n <ul class=\"star-org__level star-org__level--root\" [attr.aria-label]=\"ariaLabel()\">\n <ng-container *ngTemplateOutlet=\"branch; context: { $implicit: value(), level: 0 }\" />\n </ul>\n </div>\n\n <ng-template #branch let-node let-level=\"level\">\n <li class=\"star-org__branch\">\n <div\n class=\"star-org__node\"\n [class.star-org__node--selected]=\"selectedKey() === node.key\"\n [class.star-org__node--parent]=\"!!node.children?.length && !isCollapsed(node)\"\n >\n @if (selectable()) {\n <button\n type=\"button\"\n class=\"star-org__card star-org__card--button\"\n [attr.aria-pressed]=\"selectedKey() === node.key\"\n (click)=\"select(node)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: node, level }\" />\n </button>\n } @else {\n <div class=\"star-org__card\">\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: node, level }\" />\n </div>\n }\n @if (node.children?.length) {\n <button\n type=\"button\"\n class=\"star-org__toggle\"\n [attr.aria-expanded]=\"!isCollapsed(node)\"\n [attr.aria-label]=\"\n (isCollapsed(node) ? text.expandRow : text.collapseRow) + ': ' + node.label\n \"\n (click)=\"toggle(node)\"\n >\n <i\n class=\"ph-bold\"\n [class.ph-caret-down]=\"isCollapsed(node)\"\n [class.ph-caret-up]=\"!isCollapsed(node)\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n @if (node.children?.length && !isCollapsed(node)) {\n <ul class=\"star-org__level\">\n @for (child of node.children; track child.key) {\n <ng-container\n *ngTemplateOutlet=\"branch; context: { $implicit: child, level: level + 1 }\"\n />\n }\n </ul>\n }\n </li>\n </ng-template>\n\n <ng-template #content let-node let-level=\"level\">\n @if (nodeTemplate(); as custom) {\n <ng-container *ngTemplateOutlet=\"custom.template; context: { $implicit: node, level }\" />\n } @else {\n <span class=\"star-org__label\">{{ node.label }}</span>\n @if (node.subtitle) {\n <span class=\"star-org__subtitle\">{{ node.subtitle }}</span>\n }\n }\n </ng-template>\n `,\n})\nexport class StarOrgChart<T = unknown> {\n protected readonly text = inject(STAR_UI_TEXT);\n\n /** Root node of the chart. */\n readonly value = input.required<StarOrgNode<T>>();\n readonly ariaLabel = input<string | null>(null);\n /** Keys of the nodes whose branch is hidden. Two-way. */\n readonly collapsedKeys = model<readonly string[]>([]);\n /** Nodes are buttons; one node can be selected. */\n readonly selectable = input(false, { transform: (value: boolean | '') => value === '' || value });\n readonly selectedKey = model<string | null>(null);\n readonly nodeSelect = output<StarOrgNode<T>>();\n\n protected readonly nodeTemplate = contentChild(StarOrgNodeTemplate);\n\n protected isCollapsed(node: StarOrgNode<T>): boolean {\n return this.collapsedKeys().includes(node.key);\n }\n\n protected toggle(node: StarOrgNode<T>): void {\n this.collapsedKeys.update((keys) =>\n keys.includes(node.key) ? keys.filter((key) => key !== node.key) : [...keys, node.key],\n );\n }\n\n protected select(node: StarOrgNode<T>): void {\n this.selectedKey.set(node.key);\n this.nodeSelect.emit(node);\n }\n}\n"],"mappings":"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"}