@vadem/ui 0.0.0-stage → 0.0.1

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 (289) hide show
  1. package/LICENSE-lucide.txt +43 -0
  2. package/README.md +19 -2
  3. package/fesm2022/vadem-ui-accordion.mjs +139 -0
  4. package/fesm2022/vadem-ui-accordion.mjs.map +1 -0
  5. package/fesm2022/vadem-ui-active-filters.mjs +355 -0
  6. package/fesm2022/vadem-ui-active-filters.mjs.map +1 -0
  7. package/fesm2022/vadem-ui-alert-dialog.mjs +433 -0
  8. package/fesm2022/vadem-ui-alert-dialog.mjs.map +1 -0
  9. package/fesm2022/vadem-ui-alert.mjs +266 -0
  10. package/fesm2022/vadem-ui-alert.mjs.map +1 -0
  11. package/fesm2022/vadem-ui-autocomplete.mjs +715 -0
  12. package/fesm2022/vadem-ui-autocomplete.mjs.map +1 -0
  13. package/fesm2022/vadem-ui-avatar.mjs +219 -0
  14. package/fesm2022/vadem-ui-avatar.mjs.map +1 -0
  15. package/fesm2022/vadem-ui-badge.mjs +86 -0
  16. package/fesm2022/vadem-ui-badge.mjs.map +1 -0
  17. package/fesm2022/vadem-ui-breadcrumbs.mjs +61 -0
  18. package/fesm2022/vadem-ui-breadcrumbs.mjs.map +1 -0
  19. package/fesm2022/vadem-ui-button.mjs +220 -0
  20. package/fesm2022/vadem-ui-button.mjs.map +1 -0
  21. package/fesm2022/vadem-ui-calendar.mjs +1314 -0
  22. package/fesm2022/vadem-ui-calendar.mjs.map +1 -0
  23. package/fesm2022/vadem-ui-card.mjs +271 -0
  24. package/fesm2022/vadem-ui-card.mjs.map +1 -0
  25. package/fesm2022/vadem-ui-character-count.mjs +269 -0
  26. package/fesm2022/vadem-ui-character-count.mjs.map +1 -0
  27. package/fesm2022/vadem-ui-chart.mjs +1984 -0
  28. package/fesm2022/vadem-ui-chart.mjs.map +1 -0
  29. package/fesm2022/vadem-ui-checkbox.mjs +67 -0
  30. package/fesm2022/vadem-ui-checkbox.mjs.map +1 -0
  31. package/fesm2022/vadem-ui-color-picker.mjs +815 -0
  32. package/fesm2022/vadem-ui-color-picker.mjs.map +1 -0
  33. package/fesm2022/vadem-ui-command.mjs +735 -0
  34. package/fesm2022/vadem-ui-command.mjs.map +1 -0
  35. package/fesm2022/vadem-ui-copy-button.mjs +375 -0
  36. package/fesm2022/vadem-ui-copy-button.mjs.map +1 -0
  37. package/fesm2022/vadem-ui-date-range-picker.mjs +1011 -0
  38. package/fesm2022/vadem-ui-date-range-picker.mjs.map +1 -0
  39. package/fesm2022/vadem-ui-description-list.mjs +59 -0
  40. package/fesm2022/vadem-ui-description-list.mjs.map +1 -0
  41. package/fesm2022/vadem-ui-dialog.mjs +587 -0
  42. package/fesm2022/vadem-ui-dialog.mjs.map +1 -0
  43. package/fesm2022/vadem-ui-dropzone.mjs +176 -0
  44. package/fesm2022/vadem-ui-dropzone.mjs.map +1 -0
  45. package/fesm2022/vadem-ui-editable-text.mjs +641 -0
  46. package/fesm2022/vadem-ui-editable-text.mjs.map +1 -0
  47. package/fesm2022/vadem-ui-empty-state.mjs +175 -0
  48. package/fesm2022/vadem-ui-empty-state.mjs.map +1 -0
  49. package/fesm2022/vadem-ui-expandable-text.mjs +244 -0
  50. package/fesm2022/vadem-ui-expandable-text.mjs.map +1 -0
  51. package/fesm2022/vadem-ui-field.mjs +583 -0
  52. package/fesm2022/vadem-ui-field.mjs.map +1 -0
  53. package/fesm2022/vadem-ui-file-preview.mjs +532 -0
  54. package/fesm2022/vadem-ui-file-preview.mjs.map +1 -0
  55. package/fesm2022/vadem-ui-file-size.mjs +83 -0
  56. package/fesm2022/vadem-ui-file-size.mjs.map +1 -0
  57. package/fesm2022/vadem-ui-form-error-summary.mjs +201 -0
  58. package/fesm2022/vadem-ui-form-error-summary.mjs.map +1 -0
  59. package/fesm2022/vadem-ui-icon.mjs +303 -0
  60. package/fesm2022/vadem-ui-icon.mjs.map +1 -0
  61. package/fesm2022/vadem-ui-input.mjs +120 -0
  62. package/fesm2022/vadem-ui-input.mjs.map +1 -0
  63. package/fesm2022/vadem-ui-kbd.mjs +286 -0
  64. package/fesm2022/vadem-ui-kbd.mjs.map +1 -0
  65. package/fesm2022/vadem-ui-keyboard.mjs +105 -0
  66. package/fesm2022/vadem-ui-keyboard.mjs.map +1 -0
  67. package/fesm2022/vadem-ui-locale.mjs +443 -0
  68. package/fesm2022/vadem-ui-locale.mjs.map +1 -0
  69. package/fesm2022/vadem-ui-menu.mjs +637 -0
  70. package/fesm2022/vadem-ui-menu.mjs.map +1 -0
  71. package/fesm2022/vadem-ui-navigation-list.mjs +130 -0
  72. package/fesm2022/vadem-ui-navigation-list.mjs.map +1 -0
  73. package/fesm2022/vadem-ui-number-input.mjs +264 -0
  74. package/fesm2022/vadem-ui-number-input.mjs.map +1 -0
  75. package/fesm2022/vadem-ui-otp-input.mjs +86 -0
  76. package/fesm2022/vadem-ui-otp-input.mjs.map +1 -0
  77. package/fesm2022/vadem-ui-pagination.mjs +353 -0
  78. package/fesm2022/vadem-ui-pagination.mjs.map +1 -0
  79. package/fesm2022/vadem-ui-password-input.mjs +213 -0
  80. package/fesm2022/vadem-ui-password-input.mjs.map +1 -0
  81. package/fesm2022/vadem-ui-popover.mjs +178 -0
  82. package/fesm2022/vadem-ui-popover.mjs.map +1 -0
  83. package/fesm2022/vadem-ui-progress.mjs +331 -0
  84. package/fesm2022/vadem-ui-progress.mjs.map +1 -0
  85. package/fesm2022/vadem-ui-radio.mjs +39 -0
  86. package/fesm2022/vadem-ui-radio.mjs.map +1 -0
  87. package/fesm2022/vadem-ui-range-slider.mjs +561 -0
  88. package/fesm2022/vadem-ui-range-slider.mjs.map +1 -0
  89. package/fesm2022/vadem-ui-rating.mjs +404 -0
  90. package/fesm2022/vadem-ui-rating.mjs.map +1 -0
  91. package/fesm2022/vadem-ui-relative-time.mjs +217 -0
  92. package/fesm2022/vadem-ui-relative-time.mjs.map +1 -0
  93. package/fesm2022/vadem-ui-reorder-list.mjs +601 -0
  94. package/fesm2022/vadem-ui-reorder-list.mjs.map +1 -0
  95. package/fesm2022/vadem-ui-scroll-area.mjs +65 -0
  96. package/fesm2022/vadem-ui-scroll-area.mjs.map +1 -0
  97. package/fesm2022/vadem-ui-search-input.mjs +307 -0
  98. package/fesm2022/vadem-ui-search-input.mjs.map +1 -0
  99. package/fesm2022/vadem-ui-segmented.mjs +297 -0
  100. package/fesm2022/vadem-ui-segmented.mjs.map +1 -0
  101. package/fesm2022/vadem-ui-select.mjs +1462 -0
  102. package/fesm2022/vadem-ui-select.mjs.map +1 -0
  103. package/fesm2022/vadem-ui-sidebar.mjs +493 -0
  104. package/fesm2022/vadem-ui-sidebar.mjs.map +1 -0
  105. package/fesm2022/vadem-ui-skeleton.mjs +106 -0
  106. package/fesm2022/vadem-ui-skeleton.mjs.map +1 -0
  107. package/fesm2022/vadem-ui-slider.mjs +60 -0
  108. package/fesm2022/vadem-ui-slider.mjs.map +1 -0
  109. package/fesm2022/vadem-ui-splitter.mjs +438 -0
  110. package/fesm2022/vadem-ui-splitter.mjs.map +1 -0
  111. package/fesm2022/vadem-ui-stat.mjs +369 -0
  112. package/fesm2022/vadem-ui-stat.mjs.map +1 -0
  113. package/fesm2022/vadem-ui-stepper.mjs +483 -0
  114. package/fesm2022/vadem-ui-stepper.mjs.map +1 -0
  115. package/fesm2022/vadem-ui-switch.mjs +45 -0
  116. package/fesm2022/vadem-ui-switch.mjs.map +1 -0
  117. package/fesm2022/vadem-ui-table.mjs +593 -0
  118. package/fesm2022/vadem-ui-table.mjs.map +1 -0
  119. package/fesm2022/vadem-ui-tabs.mjs +405 -0
  120. package/fesm2022/vadem-ui-tabs.mjs.map +1 -0
  121. package/fesm2022/vadem-ui-tag-input.mjs +685 -0
  122. package/fesm2022/vadem-ui-tag-input.mjs.map +1 -0
  123. package/fesm2022/vadem-ui-text-highlight.mjs +126 -0
  124. package/fesm2022/vadem-ui-text-highlight.mjs.map +1 -0
  125. package/fesm2022/vadem-ui-time-input.mjs +430 -0
  126. package/fesm2022/vadem-ui-time-input.mjs.map +1 -0
  127. package/fesm2022/vadem-ui-timeline.mjs +313 -0
  128. package/fesm2022/vadem-ui-timeline.mjs.map +1 -0
  129. package/fesm2022/vadem-ui-toast.mjs +397 -0
  130. package/fesm2022/vadem-ui-toast.mjs.map +1 -0
  131. package/fesm2022/vadem-ui-toolbar.mjs +396 -0
  132. package/fesm2022/vadem-ui-toolbar.mjs.map +1 -0
  133. package/fesm2022/vadem-ui-tooltip.mjs +218 -0
  134. package/fesm2022/vadem-ui-tooltip.mjs.map +1 -0
  135. package/fesm2022/vadem-ui-tree.mjs +551 -0
  136. package/fesm2022/vadem-ui-tree.mjs.map +1 -0
  137. package/fesm2022/vadem-ui-upload-list.mjs +408 -0
  138. package/fesm2022/vadem-ui-upload-list.mjs.map +1 -0
  139. package/fesm2022/vadem-ui.mjs +4 -0
  140. package/fesm2022/vadem-ui.mjs.map +1 -0
  141. package/fonts/jetbrains-mono/OFL.txt +93 -0
  142. package/fonts/jetbrains-mono/jetbrains-mono-cyrillic.woff2 +0 -0
  143. package/fonts/jetbrains-mono/jetbrains-mono-latin.woff2 +0 -0
  144. package/fonts/manrope/OFL.txt +93 -0
  145. package/fonts/manrope/manrope-cyrillic.woff2 +0 -0
  146. package/fonts/manrope/manrope-latin.woff2 +0 -0
  147. package/package.json +306 -3
  148. package/styles/base.css +160 -0
  149. package/styles/components/accordion.css +130 -0
  150. package/styles/components/active-filters.css +42 -0
  151. package/styles/components/alert-dialog.css +34 -0
  152. package/styles/components/alert.css +159 -0
  153. package/styles/components/autocomplete.css +97 -0
  154. package/styles/components/avatar.css +90 -0
  155. package/styles/components/badge.css +91 -0
  156. package/styles/components/breadcrumbs.css +94 -0
  157. package/styles/components/button.css +174 -0
  158. package/styles/components/calendar.css +186 -0
  159. package/styles/components/card.css +206 -0
  160. package/styles/components/character-count.css +41 -0
  161. package/styles/components/chart.css +308 -0
  162. package/styles/components/checkbox.css +115 -0
  163. package/styles/components/color-picker.css +158 -0
  164. package/styles/components/command.css +175 -0
  165. package/styles/components/copy-button.css +58 -0
  166. package/styles/components/date-range-picker.css +153 -0
  167. package/styles/components/description-list.css +69 -0
  168. package/styles/components/dialog.css +334 -0
  169. package/styles/components/dropzone.css +89 -0
  170. package/styles/components/editable-text.css +58 -0
  171. package/styles/components/empty-state.css +72 -0
  172. package/styles/components/expandable-text.css +24 -0
  173. package/styles/components/field.css +148 -0
  174. package/styles/components/file-preview.css +65 -0
  175. package/styles/components/form-error-summary.css +71 -0
  176. package/styles/components/icon.css +38 -0
  177. package/styles/components/index.css +80 -0
  178. package/styles/components/input.css +171 -0
  179. package/styles/components/kbd.css +42 -0
  180. package/styles/components/menu.css +168 -0
  181. package/styles/components/multi-select.css +156 -0
  182. package/styles/components/navigation-list.css +147 -0
  183. package/styles/components/number-input.css +33 -0
  184. package/styles/components/otp-input.css +26 -0
  185. package/styles/components/pagination.css +127 -0
  186. package/styles/components/password-input.css +20 -0
  187. package/styles/components/popover.css +93 -0
  188. package/styles/components/progress-ring.css +112 -0
  189. package/styles/components/progress.css +162 -0
  190. package/styles/components/radio.css +117 -0
  191. package/styles/components/range-slider.css +158 -0
  192. package/styles/components/rating.css +100 -0
  193. package/styles/components/reorder-list.css +143 -0
  194. package/styles/components/scroll-area.css +39 -0
  195. package/styles/components/search-input.css +25 -0
  196. package/styles/components/segmented.css +136 -0
  197. package/styles/components/select.css +257 -0
  198. package/styles/components/sidebar.css +105 -0
  199. package/styles/components/skeleton.css +83 -0
  200. package/styles/components/slider.css +132 -0
  201. package/styles/components/splitter.css +83 -0
  202. package/styles/components/stat.css +62 -0
  203. package/styles/components/stepper.css +236 -0
  204. package/styles/components/switch.css +107 -0
  205. package/styles/components/table.css +195 -0
  206. package/styles/components/tabs.css +198 -0
  207. package/styles/components/tag-input.css +138 -0
  208. package/styles/components/text-highlight.css +22 -0
  209. package/styles/components/time-input.css +96 -0
  210. package/styles/components/timeline.css +182 -0
  211. package/styles/components/toast.css +146 -0
  212. package/styles/components/toolbar.css +72 -0
  213. package/styles/components/tooltip.css +93 -0
  214. package/styles/components/tree.css +88 -0
  215. package/styles/components/upload-list.css +113 -0
  216. package/styles/fonts.css +67 -0
  217. package/styles/index.css +14 -0
  218. package/styles/reset.css +57 -0
  219. package/styles/tokens/primitives.css +364 -0
  220. package/styles/tokens/semantic.css +233 -0
  221. package/types/vadem-ui-accordion.d.ts +43 -0
  222. package/types/vadem-ui-active-filters.d.ts +73 -0
  223. package/types/vadem-ui-alert-dialog.d.ts +87 -0
  224. package/types/vadem-ui-alert.d.ts +64 -0
  225. package/types/vadem-ui-autocomplete.d.ts +156 -0
  226. package/types/vadem-ui-avatar.d.ts +59 -0
  227. package/types/vadem-ui-badge.d.ts +25 -0
  228. package/types/vadem-ui-breadcrumbs.d.ts +22 -0
  229. package/types/vadem-ui-button.d.ts +52 -0
  230. package/types/vadem-ui-calendar.d.ts +327 -0
  231. package/types/vadem-ui-card.d.ts +58 -0
  232. package/types/vadem-ui-character-count.d.ts +71 -0
  233. package/types/vadem-ui-chart.d.ts +452 -0
  234. package/types/vadem-ui-checkbox.d.ts +20 -0
  235. package/types/vadem-ui-color-picker.d.ts +171 -0
  236. package/types/vadem-ui-command.d.ts +145 -0
  237. package/types/vadem-ui-copy-button.d.ts +90 -0
  238. package/types/vadem-ui-date-range-picker.d.ts +216 -0
  239. package/types/vadem-ui-description-list.d.ts +15 -0
  240. package/types/vadem-ui-dialog.d.ts +174 -0
  241. package/types/vadem-ui-dropzone.d.ts +73 -0
  242. package/types/vadem-ui-editable-text.d.ts +141 -0
  243. package/types/vadem-ui-empty-state.d.ts +34 -0
  244. package/types/vadem-ui-expandable-text.d.ts +52 -0
  245. package/types/vadem-ui-field.d.ts +180 -0
  246. package/types/vadem-ui-file-preview.d.ts +108 -0
  247. package/types/vadem-ui-file-size.d.ts +18 -0
  248. package/types/vadem-ui-form-error-summary.d.ts +46 -0
  249. package/types/vadem-ui-icon.d.ts +152 -0
  250. package/types/vadem-ui-input.d.ts +31 -0
  251. package/types/vadem-ui-kbd.d.ts +66 -0
  252. package/types/vadem-ui-keyboard.d.ts +61 -0
  253. package/types/vadem-ui-locale.d.ts +241 -0
  254. package/types/vadem-ui-menu.d.ts +132 -0
  255. package/types/vadem-ui-navigation-list.d.ts +28 -0
  256. package/types/vadem-ui-number-input.d.ts +39 -0
  257. package/types/vadem-ui-otp-input.d.ts +15 -0
  258. package/types/vadem-ui-pagination.d.ts +96 -0
  259. package/types/vadem-ui-password-input.d.ts +36 -0
  260. package/types/vadem-ui-popover.d.ts +48 -0
  261. package/types/vadem-ui-progress.d.ts +95 -0
  262. package/types/vadem-ui-radio.d.ts +11 -0
  263. package/types/vadem-ui-range-slider.d.ts +136 -0
  264. package/types/vadem-ui-rating.d.ts +95 -0
  265. package/types/vadem-ui-relative-time.d.ts +58 -0
  266. package/types/vadem-ui-reorder-list.d.ts +120 -0
  267. package/types/vadem-ui-scroll-area.d.ts +13 -0
  268. package/types/vadem-ui-search-input.d.ts +58 -0
  269. package/types/vadem-ui-segmented.d.ts +76 -0
  270. package/types/vadem-ui-select.d.ts +303 -0
  271. package/types/vadem-ui-sidebar.d.ts +70 -0
  272. package/types/vadem-ui-skeleton.d.ts +28 -0
  273. package/types/vadem-ui-slider.d.ts +17 -0
  274. package/types/vadem-ui-splitter.d.ts +99 -0
  275. package/types/vadem-ui-stat.d.ts +101 -0
  276. package/types/vadem-ui-stepper.d.ts +108 -0
  277. package/types/vadem-ui-switch.d.ts +10 -0
  278. package/types/vadem-ui-table.d.ts +172 -0
  279. package/types/vadem-ui-tabs.d.ts +101 -0
  280. package/types/vadem-ui-tag-input.d.ts +170 -0
  281. package/types/vadem-ui-text-highlight.d.ts +27 -0
  282. package/types/vadem-ui-time-input.d.ts +47 -0
  283. package/types/vadem-ui-timeline.d.ts +54 -0
  284. package/types/vadem-ui-toast.d.ts +104 -0
  285. package/types/vadem-ui-toolbar.d.ts +80 -0
  286. package/types/vadem-ui-tooltip.d.ts +71 -0
  287. package/types/vadem-ui-tree.d.ts +123 -0
  288. package/types/vadem-ui-upload-list.d.ts +70 -0
  289. package/types/vadem-ui.d.ts +1 -0
@@ -0,0 +1,593 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Directive, ViewEncapsulation, booleanAttribute, computed, inject, input, model } from "@angular/core";
3
+ import { VdIcon } from "@vadem/ui/icon";
4
+ function vdNextSort(current, key) {
5
+ if (current?.key !== key) return {
6
+ key,
7
+ direction: "ascending"
8
+ };
9
+ return {
10
+ key,
11
+ direction: current.direction === "ascending" ? "descending" : "ascending"
12
+ };
13
+ }
14
+ function vdSortRows(rows, sort, options = {}) {
15
+ if (!sort) return [...rows];
16
+ const read = options.accessor ?? ((row, key) => row[key]);
17
+ const collator = new Intl.Collator(options.locale, {
18
+ numeric: true,
19
+ sensitivity: "base"
20
+ });
21
+ const sign = sort.direction === "ascending" ? 1 : -1;
22
+ const isEmpty = (v) => v === null || v === void 0 || v === "";
23
+ return rows.map((row, index) => ({
24
+ row,
25
+ index,
26
+ value: read(row, sort.key)
27
+ })).sort((a, b) => {
28
+ const aEmpty = isEmpty(a.value);
29
+ const bEmpty = isEmpty(b.value);
30
+ if (aEmpty || bEmpty) return aEmpty === bEmpty ? a.index - b.index : aEmpty ? 1 : -1;
31
+ const result = compare(a.value, b.value, collator);
32
+ return result === 0 ? a.index - b.index : result * sign;
33
+ }).map((entry) => entry.row);
34
+ }
35
+ function compare(a, b, collator) {
36
+ if (typeof a === "number" && typeof b === "number") return a - b;
37
+ if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();
38
+ if (typeof a === "boolean" && typeof b === "boolean") return Number(a) - Number(b);
39
+ return collator.compare(String(a), String(b));
40
+ }
41
+ var VdTable = class VdTable {
42
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
43
+ stickyHeader = input(false, {
44
+ ...ngDevMode ? { debugName: "stickyHeader" } : /* istanbul ignore next */ {},
45
+ transform: booleanAttribute
46
+ });
47
+ sort = model(null, ...ngDevMode ? [{ debugName: "sort" }] : /* istanbul ignore next */ []);
48
+ toggleSort(key) {
49
+ this.sort.set(vdNextSort(this.sort(), key));
50
+ }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({
52
+ minVersion: "12.0.0",
53
+ version: "22.2.1",
54
+ ngImport: i0,
55
+ type: VdTable,
56
+ deps: [],
57
+ target: i0.ɵɵFactoryTarget.Directive
58
+ });
59
+ static ɵdir = i0.ɵɵngDeclareDirective({
60
+ minVersion: "17.1.0",
61
+ version: "22.2.1",
62
+ type: VdTable,
63
+ isStandalone: true,
64
+ selector: "table[vdTable]",
65
+ inputs: {
66
+ size: {
67
+ classPropertyName: "size",
68
+ publicName: "size",
69
+ isSignal: true,
70
+ isRequired: false,
71
+ transformFunction: null
72
+ },
73
+ stickyHeader: {
74
+ classPropertyName: "stickyHeader",
75
+ publicName: "stickyHeader",
76
+ isSignal: true,
77
+ isRequired: false,
78
+ transformFunction: null
79
+ },
80
+ sort: {
81
+ classPropertyName: "sort",
82
+ publicName: "sort",
83
+ isSignal: true,
84
+ isRequired: false,
85
+ transformFunction: null
86
+ }
87
+ },
88
+ outputs: { sort: "sortChange" },
89
+ host: {
90
+ properties: {
91
+ "attr.data-size": "size()",
92
+ "attr.data-sticky-header": "stickyHeader() ? \"\" : null"
93
+ },
94
+ classAttribute: "vd-table"
95
+ },
96
+ exportAs: ["vdTable"],
97
+ ngImport: i0
98
+ });
99
+ };
100
+ i0.ɵɵngDeclareClassMetadata({
101
+ minVersion: "12.0.0",
102
+ version: "22.2.1",
103
+ ngImport: i0,
104
+ type: VdTable,
105
+ decorators: [{
106
+ type: Directive,
107
+ args: [{
108
+ selector: "table[vdTable]",
109
+ exportAs: "vdTable",
110
+ host: {
111
+ class: "vd-table",
112
+ "[attr.data-size]": "size()",
113
+ "[attr.data-sticky-header]": "stickyHeader() ? \"\" : null"
114
+ }
115
+ }]
116
+ }],
117
+ propDecorators: {
118
+ size: [{
119
+ type: i0.Input,
120
+ args: [{
121
+ isSignal: true,
122
+ alias: "size",
123
+ required: false
124
+ }]
125
+ }],
126
+ stickyHeader: [{
127
+ type: i0.Input,
128
+ args: [{
129
+ isSignal: true,
130
+ alias: "stickyHeader",
131
+ required: false
132
+ }]
133
+ }],
134
+ sort: [{
135
+ type: i0.Input,
136
+ args: [{
137
+ isSignal: true,
138
+ alias: "sort",
139
+ required: false
140
+ }]
141
+ }, {
142
+ type: i0.Output,
143
+ args: ["sortChange"]
144
+ }]
145
+ }
146
+ });
147
+ var VdSortHeader = class VdSortHeader {
148
+ vdSortHeader = input.required(...ngDevMode ? [{ debugName: "vdSortHeader" }] : /* istanbul ignore next */ []);
149
+ table = inject(VdTable);
150
+ direction = computed(() => {
151
+ const sort = this.table.sort();
152
+ return sort?.key === this.vdSortHeader() ? sort.direction : null;
153
+ }, ...ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []);
154
+ icon = computed(() => {
155
+ const d = this.direction();
156
+ return d === "ascending" ? "arrow-up" : d === "descending" ? "arrow-down" : "arrow-up-down";
157
+ }, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
158
+ static ɵfac = i0.ɵɵngDeclareFactory({
159
+ minVersion: "12.0.0",
160
+ version: "22.2.1",
161
+ ngImport: i0,
162
+ type: VdSortHeader,
163
+ deps: [],
164
+ target: i0.ɵɵFactoryTarget.Component
165
+ });
166
+ static ɵcmp = i0.ɵɵngDeclareComponent({
167
+ minVersion: "17.1.0",
168
+ version: "22.2.1",
169
+ type: VdSortHeader,
170
+ isStandalone: true,
171
+ selector: "th[vdSortHeader]",
172
+ inputs: { vdSortHeader: {
173
+ classPropertyName: "vdSortHeader",
174
+ publicName: "vdSortHeader",
175
+ isSignal: true,
176
+ isRequired: true,
177
+ transformFunction: null
178
+ } },
179
+ host: { properties: {
180
+ "attr.aria-sort": "direction()",
181
+ "attr.data-sorted": "direction() ? \"\" : null"
182
+ } },
183
+ ngImport: i0,
184
+ template: `
185
+ <button type="button" class="vd-table__sort" (click)="table.toggleSort(vdSortHeader())">
186
+ <span><ng-content /></span>
187
+ <vd-icon class="vd-table__sort-icon" [name]="icon()" />
188
+ </button>
189
+ `,
190
+ isInline: true,
191
+ dependencies: [{
192
+ kind: "component",
193
+ type: VdIcon,
194
+ selector: "vd-icon",
195
+ inputs: ["name", "label"]
196
+ }],
197
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
198
+ encapsulation: i0.ViewEncapsulation.None
199
+ });
200
+ };
201
+ i0.ɵɵngDeclareClassMetadata({
202
+ minVersion: "12.0.0",
203
+ version: "22.2.1",
204
+ ngImport: i0,
205
+ type: VdSortHeader,
206
+ decorators: [{
207
+ type: Component,
208
+ args: [{
209
+ selector: "th[vdSortHeader]",
210
+ imports: [VdIcon],
211
+ template: `
212
+ <button type="button" class="vd-table__sort" (click)="table.toggleSort(vdSortHeader())">
213
+ <span><ng-content /></span>
214
+ <vd-icon class="vd-table__sort-icon" [name]="icon()" />
215
+ </button>
216
+ `,
217
+ host: {
218
+ "[attr.aria-sort]": "direction()",
219
+ "[attr.data-sorted]": "direction() ? \"\" : null"
220
+ },
221
+ changeDetection: ChangeDetectionStrategy.OnPush,
222
+ encapsulation: ViewEncapsulation.None
223
+ }]
224
+ }],
225
+ propDecorators: { vdSortHeader: [{
226
+ type: i0.Input,
227
+ args: [{
228
+ isSignal: true,
229
+ alias: "vdSortHeader",
230
+ required: true
231
+ }]
232
+ }] }
233
+ });
234
+ var VdRow = class VdRow {
235
+ selected = input(false, {
236
+ ...ngDevMode ? { debugName: "selected" } : /* istanbul ignore next */ {},
237
+ transform: booleanAttribute
238
+ });
239
+ static ɵfac = i0.ɵɵngDeclareFactory({
240
+ minVersion: "12.0.0",
241
+ version: "22.2.1",
242
+ ngImport: i0,
243
+ type: VdRow,
244
+ deps: [],
245
+ target: i0.ɵɵFactoryTarget.Directive
246
+ });
247
+ static ɵdir = i0.ɵɵngDeclareDirective({
248
+ minVersion: "17.1.0",
249
+ version: "22.2.1",
250
+ type: VdRow,
251
+ isStandalone: true,
252
+ selector: "tr[vdRow]",
253
+ inputs: { selected: {
254
+ classPropertyName: "selected",
255
+ publicName: "selected",
256
+ isSignal: true,
257
+ isRequired: false,
258
+ transformFunction: null
259
+ } },
260
+ host: { properties: { "attr.data-selected": "selected() ? \"\" : null" } },
261
+ ngImport: i0
262
+ });
263
+ };
264
+ i0.ɵɵngDeclareClassMetadata({
265
+ minVersion: "12.0.0",
266
+ version: "22.2.1",
267
+ ngImport: i0,
268
+ type: VdRow,
269
+ decorators: [{
270
+ type: Directive,
271
+ args: [{
272
+ selector: "tr[vdRow]",
273
+ host: { "[attr.data-selected]": "selected() ? \"\" : null" }
274
+ }]
275
+ }],
276
+ propDecorators: { selected: [{
277
+ type: i0.Input,
278
+ args: [{
279
+ isSignal: true,
280
+ alias: "selected",
281
+ required: false
282
+ }]
283
+ }] }
284
+ });
285
+ var VdTableEmpty = class VdTableEmpty {
286
+ static ɵfac = i0.ɵɵngDeclareFactory({
287
+ minVersion: "12.0.0",
288
+ version: "22.2.1",
289
+ ngImport: i0,
290
+ type: VdTableEmpty,
291
+ deps: [],
292
+ target: i0.ɵɵFactoryTarget.Directive
293
+ });
294
+ static ɵdir = i0.ɵɵngDeclareDirective({
295
+ minVersion: "14.0.0",
296
+ version: "22.2.1",
297
+ type: VdTableEmpty,
298
+ isStandalone: true,
299
+ selector: "td[vdTableEmpty]",
300
+ host: { classAttribute: "vd-table__empty" },
301
+ ngImport: i0
302
+ });
303
+ };
304
+ i0.ɵɵngDeclareClassMetadata({
305
+ minVersion: "12.0.0",
306
+ version: "22.2.1",
307
+ ngImport: i0,
308
+ type: VdTableEmpty,
309
+ decorators: [{
310
+ type: Directive,
311
+ args: [{
312
+ selector: "td[vdTableEmpty]",
313
+ host: { class: "vd-table__empty" }
314
+ }]
315
+ }]
316
+ });
317
+ var VdTableScroll = class VdTableScroll {
318
+ static ɵfac = i0.ɵɵngDeclareFactory({
319
+ minVersion: "12.0.0",
320
+ version: "22.2.1",
321
+ ngImport: i0,
322
+ type: VdTableScroll,
323
+ deps: [],
324
+ target: i0.ɵɵFactoryTarget.Directive
325
+ });
326
+ static ɵdir = i0.ɵɵngDeclareDirective({
327
+ minVersion: "14.0.0",
328
+ version: "22.2.1",
329
+ type: VdTableScroll,
330
+ isStandalone: true,
331
+ selector: "[vdTableScroll]",
332
+ host: {
333
+ attributes: {
334
+ "role": "region",
335
+ "tabindex": "0"
336
+ },
337
+ classAttribute: "vd-table-scroll"
338
+ },
339
+ ngImport: i0
340
+ });
341
+ };
342
+ i0.ɵɵngDeclareClassMetadata({
343
+ minVersion: "12.0.0",
344
+ version: "22.2.1",
345
+ ngImport: i0,
346
+ type: VdTableScroll,
347
+ decorators: [{
348
+ type: Directive,
349
+ args: [{
350
+ selector: "[vdTableScroll]",
351
+ host: {
352
+ class: "vd-table-scroll",
353
+ role: "region",
354
+ tabindex: "0"
355
+ }
356
+ }]
357
+ }]
358
+ });
359
+ const VD_TABLE = [
360
+ VdTable,
361
+ VdSortHeader,
362
+ VdRow,
363
+ VdTableEmpty,
364
+ VdTableScroll
365
+ ];
366
+ function vdSelectTableRows(selected, ids, checked) {
367
+ const next = new Set(selected);
368
+ for (const id of ids) if (checked) next.add(id);
369
+ else next.delete(id);
370
+ return next;
371
+ }
372
+ function vdVisibleTableColumns(columns, hidden) {
373
+ const visible = columns.filter((column) => column.required || !hidden.has(column.key));
374
+ return visible.length || !columns.length ? visible : [columns[0]];
375
+ }
376
+ var VdDataTable = class VdDataTable {
377
+ rowIds = input([], ...ngDevMode ? [{ debugName: "rowIds" }] : /* istanbul ignore next */ []);
378
+ columns = input([], ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
379
+ columnOffset = input(0, ...ngDevMode ? [{ debugName: "columnOffset" }] : /* istanbul ignore next */ []);
380
+ selected = model(/* @__PURE__ */ new Set(), ...ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []);
381
+ hiddenColumns = model(/* @__PURE__ */ new Set(), ...ngDevMode ? [{ debugName: "hiddenColumns" }] : /* istanbul ignore next */ []);
382
+ visibleColumns = computed(() => vdVisibleTableColumns(this.columns(), this.hiddenColumns()), ...ngDevMode ? [{ debugName: "visibleColumns" }] : /* istanbul ignore next */ []);
383
+ columnCount = computed(() => this.columns().length + this.columnOffset(), ...ngDevMode ? [{ debugName: "columnCount" }] : /* istanbul ignore next */ []);
384
+ allSelected = computed(() => this.rowIds().length > 0 && this.rowIds().every((id) => this.selected().has(id)), ...ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []);
385
+ someSelected = computed(() => !this.allSelected() && this.rowIds().some((id) => this.selected().has(id)), ...ngDevMode ? [{ debugName: "someSelected" }] : /* istanbul ignore next */ []);
386
+ setSelected(id, checked) {
387
+ if (this.rowIds().includes(id)) this.selected.set(vdSelectTableRows(this.selected(), [id], checked));
388
+ }
389
+ selectAll(checked) {
390
+ if (this.rowIds().length) this.selected.set(vdSelectTableRows(this.selected(), this.rowIds(), checked));
391
+ }
392
+ clearSelection() {
393
+ this.selected.set(/* @__PURE__ */ new Set());
394
+ }
395
+ isColumnVisible(key) {
396
+ return this.visibleColumns().some((column) => column.key === key);
397
+ }
398
+ canHideColumn(key) {
399
+ const column = this.columns().find((column) => column.key === key);
400
+ return !!column && !column.required && (!this.isColumnVisible(key) || this.visibleColumns().length > 1);
401
+ }
402
+ setColumnVisible(key, visible) {
403
+ if (!this.columns().some((column) => column.key === key) || !visible && !this.canHideColumn(key)) return;
404
+ const next = new Set(this.columns().filter((column) => !this.isColumnVisible(column.key)).map((column) => column.key));
405
+ if (visible) next.delete(key);
406
+ else next.add(key);
407
+ this.hiddenColumns.set(next);
408
+ }
409
+ resetColumns() {
410
+ this.hiddenColumns.set(/* @__PURE__ */ new Set());
411
+ }
412
+ static ɵfac = i0.ɵɵngDeclareFactory({
413
+ minVersion: "12.0.0",
414
+ version: "22.2.1",
415
+ ngImport: i0,
416
+ type: VdDataTable,
417
+ deps: [],
418
+ target: i0.ɵɵFactoryTarget.Directive
419
+ });
420
+ static ɵdir = i0.ɵɵngDeclareDirective({
421
+ minVersion: "17.1.0",
422
+ version: "22.2.1",
423
+ type: VdDataTable,
424
+ isStandalone: true,
425
+ selector: "[vdDataTable]",
426
+ inputs: {
427
+ rowIds: {
428
+ classPropertyName: "rowIds",
429
+ publicName: "rowIds",
430
+ isSignal: true,
431
+ isRequired: false,
432
+ transformFunction: null
433
+ },
434
+ columns: {
435
+ classPropertyName: "columns",
436
+ publicName: "columns",
437
+ isSignal: true,
438
+ isRequired: false,
439
+ transformFunction: null
440
+ },
441
+ columnOffset: {
442
+ classPropertyName: "columnOffset",
443
+ publicName: "columnOffset",
444
+ isSignal: true,
445
+ isRequired: false,
446
+ transformFunction: null
447
+ },
448
+ selected: {
449
+ classPropertyName: "selected",
450
+ publicName: "selected",
451
+ isSignal: true,
452
+ isRequired: false,
453
+ transformFunction: null
454
+ },
455
+ hiddenColumns: {
456
+ classPropertyName: "hiddenColumns",
457
+ publicName: "hiddenColumns",
458
+ isSignal: true,
459
+ isRequired: false,
460
+ transformFunction: null
461
+ }
462
+ },
463
+ outputs: {
464
+ selected: "selectedChange",
465
+ hiddenColumns: "hiddenColumnsChange"
466
+ },
467
+ exportAs: ["vdDataTable"],
468
+ ngImport: i0
469
+ });
470
+ };
471
+ i0.ɵɵngDeclareClassMetadata({
472
+ minVersion: "12.0.0",
473
+ version: "22.2.1",
474
+ ngImport: i0,
475
+ type: VdDataTable,
476
+ decorators: [{
477
+ type: Directive,
478
+ args: [{
479
+ selector: "[vdDataTable]",
480
+ exportAs: "vdDataTable"
481
+ }]
482
+ }],
483
+ propDecorators: {
484
+ rowIds: [{
485
+ type: i0.Input,
486
+ args: [{
487
+ isSignal: true,
488
+ alias: "rowIds",
489
+ required: false
490
+ }]
491
+ }],
492
+ columns: [{
493
+ type: i0.Input,
494
+ args: [{
495
+ isSignal: true,
496
+ alias: "columns",
497
+ required: false
498
+ }]
499
+ }],
500
+ columnOffset: [{
501
+ type: i0.Input,
502
+ args: [{
503
+ isSignal: true,
504
+ alias: "columnOffset",
505
+ required: false
506
+ }]
507
+ }],
508
+ selected: [{
509
+ type: i0.Input,
510
+ args: [{
511
+ isSignal: true,
512
+ alias: "selected",
513
+ required: false
514
+ }]
515
+ }, {
516
+ type: i0.Output,
517
+ args: ["selectedChange"]
518
+ }],
519
+ hiddenColumns: [{
520
+ type: i0.Input,
521
+ args: [{
522
+ isSignal: true,
523
+ alias: "hiddenColumns",
524
+ required: false
525
+ }]
526
+ }, {
527
+ type: i0.Output,
528
+ args: ["hiddenColumnsChange"]
529
+ }]
530
+ }
531
+ });
532
+ var VdTableColumn = class VdTableColumn {
533
+ vdTableColumn = input.required(...ngDevMode ? [{ debugName: "vdTableColumn" }] : /* istanbul ignore next */ []);
534
+ table = inject(VdDataTable);
535
+ index = computed(() => {
536
+ const index = this.table.columns().findIndex((column) => column.key === this.vdTableColumn());
537
+ return index < 0 ? null : index + 1 + this.table.columnOffset();
538
+ }, ...ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []);
539
+ static ɵfac = i0.ɵɵngDeclareFactory({
540
+ minVersion: "12.0.0",
541
+ version: "22.2.1",
542
+ ngImport: i0,
543
+ type: VdTableColumn,
544
+ deps: [],
545
+ target: i0.ɵɵFactoryTarget.Directive
546
+ });
547
+ static ɵdir = i0.ɵɵngDeclareDirective({
548
+ minVersion: "17.1.0",
549
+ version: "22.2.1",
550
+ type: VdTableColumn,
551
+ isStandalone: true,
552
+ selector: "th[vdTableColumn], td[vdTableColumn]",
553
+ inputs: { vdTableColumn: {
554
+ classPropertyName: "vdTableColumn",
555
+ publicName: "vdTableColumn",
556
+ isSignal: true,
557
+ isRequired: true,
558
+ transformFunction: null
559
+ } },
560
+ host: { properties: {
561
+ "hidden": "!table.isColumnVisible(vdTableColumn())",
562
+ "attr.aria-colindex": "index()"
563
+ } },
564
+ ngImport: i0
565
+ });
566
+ };
567
+ i0.ɵɵngDeclareClassMetadata({
568
+ minVersion: "12.0.0",
569
+ version: "22.2.1",
570
+ ngImport: i0,
571
+ type: VdTableColumn,
572
+ decorators: [{
573
+ type: Directive,
574
+ args: [{
575
+ selector: "th[vdTableColumn], td[vdTableColumn]",
576
+ host: {
577
+ "[hidden]": "!table.isColumnVisible(vdTableColumn())",
578
+ "[attr.aria-colindex]": "index()"
579
+ }
580
+ }]
581
+ }],
582
+ propDecorators: { vdTableColumn: [{
583
+ type: i0.Input,
584
+ args: [{
585
+ isSignal: true,
586
+ alias: "vdTableColumn",
587
+ required: true
588
+ }]
589
+ }] }
590
+ });
591
+ export { VD_TABLE, VdDataTable, VdRow, VdSortHeader, VdTable, VdTableColumn, VdTableEmpty, VdTableScroll, vdNextSort, vdSortRows };
592
+
593
+ //# sourceMappingURL=vadem-ui-table.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-table.mjs","names":[],"sources":["../../../projects/ui/table/src/core/sort.ts","../../../projects/ui/table/src/table.ts","../../../projects/ui/table/src/core/data-table.ts","../../../projects/ui/table/src/data-table.ts"],"sourcesContent":["export type VdSortDirection = 'ascending' | 'descending';\n\n/** Current sort of a table: which column and which way. `null` = source order. */\nexport interface VdSort {\n key: string;\n direction: VdSortDirection;\n}\n\n/** Next state when a column header is activated: a new column starts ascending, the same one flips. */\nexport function vdNextSort(current: VdSort | null, key: string): VdSort {\n if (current?.key !== key) return { key, direction: 'ascending' };\n return { key, direction: current.direction === 'ascending' ? 'descending' : 'ascending' };\n}\n\nexport interface VdSortOptions<T> {\n /** Value to compare for a column; defaults to `row[key]`. */\n accessor?: (row: T, key: string) => unknown;\n /** Locale for text comparison (e.g. 'uk'); defaults to the runtime locale. */\n locale?: string;\n}\n\n/**\n * Returns a sorted copy (stable). Numbers and dates compare by value, text with `Intl.Collator`\n * (case- and accent-aware, numeric: \"file 2\" < \"file 10\"). Empty values (null, undefined, '')\n * always go last, in both directions.\n */\nexport function vdSortRows<T>(\n rows: readonly T[],\n sort: VdSort | null,\n options: VdSortOptions<T> = {},\n): T[] {\n if (!sort) return [...rows];\n const read = options.accessor ?? ((row: T, key: string) => (row as Record<string, unknown>)[key]);\n const collator = new Intl.Collator(options.locale, { numeric: true, sensitivity: 'base' });\n const sign = sort.direction === 'ascending' ? 1 : -1;\n const isEmpty = (v: unknown) => v === null || v === undefined || v === '';\n\n return rows\n .map((row, index) => ({ row, index, value: read(row, sort.key) }))\n .sort((a, b) => {\n const aEmpty = isEmpty(a.value);\n const bEmpty = isEmpty(b.value);\n if (aEmpty || bEmpty) return aEmpty === bEmpty ? a.index - b.index : aEmpty ? 1 : -1;\n const result = compare(a.value, b.value, collator);\n return result === 0 ? a.index - b.index : result * sign;\n })\n .map((entry) => entry.row);\n}\n\nfunction compare(a: unknown, b: unknown, collator: Intl.Collator): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n if (typeof a === 'boolean' && typeof b === 'boolean') return Number(a) - Number(b);\n return collator.compare(String(a), String(b));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VdSort, vdNextSort } from './core/sort';\n\nexport type VdTableSize = 'sm' | 'md';\n\n/**\n * Styles a native `<table>` and owns its sort state. Rows are rendered (and sorted, e.g. with\n * `vdSortRows`) by the consumer. Spec: specs/table.md\n */\n@Directive({\n selector: 'table[vdTable]',\n exportAs: 'vdTable',\n host: {\n class: 'vd-table',\n '[attr.data-size]': 'size()',\n '[attr.data-sticky-header]': 'stickyHeader() ? \"\" : null',\n },\n})\nexport class VdTable {\n readonly size = input<VdTableSize>('md');\n /** Header stays visible while a `vdTableScroll` container scrolls vertically. */\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n /** Current sort (two-way). `null` = source order. */\n readonly sort = model<VdSort | null>(null);\n\n toggleSort(key: string): void {\n this.sort.set(vdNextSort(this.sort(), key));\n }\n}\n\n/**\n * Sortable column header (APG sortable table): a button inside the `th`, `aria-sort` on the\n * sorted column only.\n */\n@Component({\n // Attribute selector: the native `th` keeps its table semantics.\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'th[vdSortHeader]',\n imports: [VdIcon],\n template: `\n <button type=\"button\" class=\"vd-table__sort\" (click)=\"table.toggleSort(vdSortHeader())\">\n <span><ng-content /></span>\n <vd-icon class=\"vd-table__sort-icon\" [name]=\"icon()\" />\n </button>\n `,\n host: {\n '[attr.aria-sort]': 'direction()',\n '[attr.data-sorted]': 'direction() ? \"\" : null',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdSortHeader {\n /** Sort key for this column. */\n readonly vdSortHeader = input.required<string>();\n\n protected readonly table = inject(VdTable);\n protected readonly direction = computed(() => {\n const sort = this.table.sort();\n return sort?.key === this.vdSortHeader() ? sort.direction : null;\n });\n protected readonly icon = computed(() => {\n const d = this.direction();\n return d === 'ascending' ? 'arrow-up' : d === 'descending' ? 'arrow-down' : 'arrow-up-down';\n });\n}\n\n/** A body row; `selected` only styles it - the row's checkbox carries the state for AT. */\n@Directive({\n selector: 'tr[vdRow]',\n host: { '[attr.data-selected]': 'selected() ? \"\" : null' },\n})\nexport class VdRow {\n readonly selected = input(false, { transform: booleanAttribute });\n}\n\n/** Full-width cell for the empty / no-results state: `<td vdTableEmpty colspan=\"5\">`. */\n@Directive({ selector: 'td[vdTableEmpty]', host: { class: 'vd-table__empty' } })\nexport class VdTableEmpty {}\n\n/**\n * Scroll container for wide or tall tables. Focusable so keyboard users can scroll it;\n * give it a name (`aria-label` or `aria-labelledby` the caption).\n */\n@Directive({\n selector: '[vdTableScroll]',\n host: { class: 'vd-table-scroll', role: 'region', tabindex: '0' },\n})\nexport class VdTableScroll {}\n\nexport const VD_TABLE = [VdTable, VdSortHeader, VdRow, VdTableEmpty, VdTableScroll] as const;\n","export type VdTableRowId = string | number;\nexport interface VdTableColumnDefinition {\n key: string;\n required?: boolean;\n}\n\n/** Return a new selection while preserving IDs outside the current page. */\nexport function vdSelectTableRows(\n selected: ReadonlySet<VdTableRowId>,\n ids: readonly VdTableRowId[],\n checked: boolean,\n): Set<VdTableRowId> {\n const next = new Set(selected);\n for (const id of ids) {\n if (checked) next.add(id);\n else next.delete(id);\n }\n return next;\n}\n\n/** Required columns and at least one column remain visible even with invalid external state. */\nexport function vdVisibleTableColumns(\n columns: readonly VdTableColumnDefinition[],\n hidden: ReadonlySet<string>,\n): readonly VdTableColumnDefinition[] {\n const visible = columns.filter((column) => column.required || !hidden.has(column.key));\n return visible.length || !columns.length ? visible : [columns[0]];\n}\n","import { computed, Directive, inject, input, model } from '@angular/core';\nimport {\n vdSelectTableRows,\n vdVisibleTableColumns,\n VdTableColumnDefinition,\n VdTableRowId,\n} from './core/data-table';\n\n/** Opt-in state for a consumer-rendered native Table. */\n@Directive({ selector: '[vdDataTable]', exportAs: 'vdDataTable' })\nexport class VdDataTable {\n readonly rowIds = input<readonly VdTableRowId[]>([]);\n readonly columns = input<readonly VdTableColumnDefinition[]>([]);\n readonly columnOffset = input(0);\n readonly selected = model<ReadonlySet<VdTableRowId>>(new Set());\n readonly hiddenColumns = model<ReadonlySet<string>>(new Set());\n readonly visibleColumns = computed(() =>\n vdVisibleTableColumns(this.columns(), this.hiddenColumns()),\n );\n readonly columnCount = computed(() => this.columns().length + this.columnOffset());\n readonly allSelected = computed(\n () => this.rowIds().length > 0 && this.rowIds().every((id) => this.selected().has(id)),\n );\n readonly someSelected = computed(\n () => !this.allSelected() && this.rowIds().some((id) => this.selected().has(id)),\n );\n\n setSelected(id: VdTableRowId, checked: boolean): void {\n if (this.rowIds().includes(id))\n this.selected.set(vdSelectTableRows(this.selected(), [id], checked));\n }\n\n selectAll(checked: boolean): void {\n if (this.rowIds().length)\n this.selected.set(vdSelectTableRows(this.selected(), this.rowIds(), checked));\n }\n\n clearSelection(): void {\n this.selected.set(new Set());\n }\n\n isColumnVisible(key: string): boolean {\n return this.visibleColumns().some((column) => column.key === key);\n }\n\n canHideColumn(key: string): boolean {\n const column = this.columns().find((column) => column.key === key);\n return (\n !!column &&\n !column.required &&\n (!this.isColumnVisible(key) || this.visibleColumns().length > 1)\n );\n }\n\n setColumnVisible(key: string, visible: boolean): void {\n if (\n !this.columns().some((column) => column.key === key) ||\n (!visible && !this.canHideColumn(key))\n )\n return;\n // Normalize external invalid state before applying the action.\n const next = new Set(\n this.columns()\n .filter((column) => !this.isColumnVisible(column.key))\n .map((column) => column.key),\n );\n if (visible) next.delete(key);\n else next.add(key);\n this.hiddenColumns.set(next);\n }\n\n resetColumns(): void {\n this.hiddenColumns.set(new Set());\n }\n}\n\n@Directive({\n selector: 'th[vdTableColumn], td[vdTableColumn]',\n host: {\n '[hidden]': '!table.isColumnVisible(vdTableColumn())',\n '[attr.aria-colindex]': 'index()',\n },\n})\nexport class VdTableColumn {\n readonly vdTableColumn = input.required<string>();\n protected readonly table = inject(VdDataTable);\n protected readonly index = computed(() => {\n const index = this.table.columns().findIndex((column) => column.key === this.vdTableColumn());\n return index < 0 ? null : index + 1 + this.table.columnOffset();\n });\n}\n"],"mappings":"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"}