@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,601 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, ViewEncapsulation, afterRenderEffect, booleanAttribute, computed, effect, inject, input, model, output, signal } from "@angular/core";
3
+ import { VdButton } from "@vadem/ui/button";
4
+ import { vdUniqueId } from "@vadem/ui/field";
5
+ import { VdIcon } from "@vadem/ui/icon";
6
+ import { vdTexts } from "@vadem/ui/locale";
7
+ function vdReorderValid(items) {
8
+ const ids = /* @__PURE__ */ new Set();
9
+ for (const item of items) {
10
+ if (typeof item.id !== "string" || !item.id.trim() || ids.has(item.id)) return false;
11
+ ids.add(item.id);
12
+ }
13
+ return true;
14
+ }
15
+ function vdReorderMove(items, from, to) {
16
+ if (!Number.isInteger(from) || !Number.isInteger(to) || from < 0 || to < 0 || from >= items.length || to >= items.length || from === to) return items;
17
+ const next = [...items];
18
+ const [item] = next.splice(from, 1);
19
+ next.splice(to, 0, item);
20
+ return next;
21
+ }
22
+ function vdReorderTarget(y, rows) {
23
+ if (!Number.isFinite(y) || !rows.length) return -1;
24
+ const index = rows.findIndex((row) => y < row.bottom);
25
+ return index < 0 ? rows.length - 1 : index;
26
+ }
27
+ var VdReorderList = class VdReorderList {
28
+ items = model([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
29
+ disabled = input(false, {
30
+ ...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
31
+ transform: booleanAttribute
32
+ });
33
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
34
+ instructions = input(...ngDevMode ? [void 0, { debugName: "instructions" }] : /* istanbul ignore next */ []);
35
+ upText = input(...ngDevMode ? [void 0, { debugName: "upText" }] : /* istanbul ignore next */ []);
36
+ downText = input(...ngDevMode ? [void 0, { debugName: "downText" }] : /* istanbul ignore next */ []);
37
+ emptyText = input(...ngDevMode ? [void 0, { debugName: "emptyText" }] : /* istanbul ignore next */ []);
38
+ invalidText = input(...ngDevMode ? [void 0, { debugName: "invalidText" }] : /* istanbul ignore next */ []);
39
+ movedText = input(...ngDevMode ? [void 0, { debugName: "movedText" }] : /* istanbul ignore next */ []);
40
+ canceledText = input(...ngDevMode ? [void 0, { debugName: "canceledText" }] : /* istanbul ignore next */ []);
41
+ reordered = output();
42
+ t = vdTexts("reorderList", {
43
+ label: this.label,
44
+ instructions: this.instructions,
45
+ upText: this.upText,
46
+ downText: this.downText,
47
+ emptyText: this.emptyText,
48
+ invalidText: this.invalidText,
49
+ movedText: this.movedText,
50
+ canceledText: this.canceledText
51
+ });
52
+ valid = computed(() => vdReorderValid(this.items()), ...ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []);
53
+ instructionsId = vdUniqueId("vd-reorder-instructions");
54
+ draggingId = signal(null, ...ngDevMode ? [{ debugName: "draggingId" }] : /* istanbul ignore next */ []);
55
+ drop = signal(null, ...ngDevMode ? [{ debugName: "drop" }] : /* istanbul ignore next */ []);
56
+ messages = signal([], ...ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []);
57
+ host = inject(ElementRef).nativeElement;
58
+ drag = null;
59
+ focus = null;
60
+ serial = 0;
61
+ constructor() {
62
+ effect(() => {
63
+ const items = this.items(), disabled = this.disabled(), valid = this.valid();
64
+ if (this.drag && (disabled || !valid || items !== this.drag.items)) this.finish(true);
65
+ const active = this.host.ownerDocument.activeElement;
66
+ const row = active && this.host.contains(active) ? active.closest("[data-reorder-id]") : null;
67
+ this.focus = row && active ? {
68
+ element: active,
69
+ id: row.dataset["reorderId"],
70
+ index: Number(row.dataset["index"]),
71
+ action: active.dataset["action"]
72
+ } : null;
73
+ });
74
+ afterRenderEffect(() => {
75
+ this.items();
76
+ this.disabled();
77
+ this.valid();
78
+ const focus = this.focus;
79
+ this.focus = null;
80
+ if (!focus) return;
81
+ const active = this.host.ownerDocument.activeElement;
82
+ if (active === focus.element && !focus.element.matches(":disabled")) {
83
+ if (focus.action) focus.element.scrollIntoView({
84
+ block: "nearest",
85
+ inline: "nearest",
86
+ behavior: "instant"
87
+ });
88
+ return;
89
+ }
90
+ if (active && active !== this.host.ownerDocument.body && active !== focus.element) return;
91
+ const rows = this.rows();
92
+ const row = rows.find((row) => row.dataset["reorderId"] === focus.id) ?? rows[Math.min(focus.index, rows.length - 1)];
93
+ const buttons = row ? Array.from(row.querySelectorAll("button:not(:disabled)")) : [];
94
+ const target = (focus.action ? buttons.find((button) => button.dataset["action"] === focus.action) ?? buttons[0] : null) ?? (this.disabled() ? null : row) ?? this.list();
95
+ target?.focus({ preventScroll: true });
96
+ if (focus.action) target?.scrollIntoView({
97
+ block: "nearest",
98
+ inline: "nearest",
99
+ behavior: "instant"
100
+ });
101
+ });
102
+ inject(DestroyRef).onDestroy(() => this.finish(false));
103
+ }
104
+ move(id, delta) {
105
+ if (this.disabled() || !this.valid() || this.drag) return;
106
+ const from = this.items().findIndex((item) => item.id === id);
107
+ this.commit(from, from + delta, "buttons");
108
+ }
109
+ commit(from, to, method) {
110
+ const items = this.items(), next = vdReorderMove(items, from, to);
111
+ if (next === items) return;
112
+ const item = items[from];
113
+ this.items.set(next);
114
+ this.announce(this.t().movedText(item.label, to + 1, items.length));
115
+ this.reordered.emit({
116
+ id: item.id,
117
+ fromIndex: from,
118
+ toIndex: to,
119
+ method
120
+ });
121
+ }
122
+ start(event, id) {
123
+ if (!event.isPrimary || event.button !== 0 || this.disabled() || !this.valid() || this.items().length < 2 || this.drag) return;
124
+ const handle = event.currentTarget;
125
+ if (typeof handle.setPointerCapture !== "function") return;
126
+ try {
127
+ handle.setPointerCapture(event.pointerId);
128
+ } catch {
129
+ return;
130
+ }
131
+ event.preventDefault();
132
+ const row = handle.closest("[data-reorder-id]");
133
+ if (row && !row.contains(this.host.ownerDocument.activeElement)) row.focus({ preventScroll: true });
134
+ const from = this.items().findIndex((item) => item.id === id);
135
+ this.drag = {
136
+ pointer: event.pointerId,
137
+ handle,
138
+ items: this.items(),
139
+ id,
140
+ from,
141
+ x: event.clientX,
142
+ y: event.clientY,
143
+ active: false,
144
+ to: from
145
+ };
146
+ }
147
+ pointerMove(event) {
148
+ const drag = this.drag;
149
+ if (!drag || drag.pointer !== event.pointerId) return;
150
+ if (event.buttons === 0 || this.disabled() || this.items() !== drag.items) {
151
+ this.finish(true);
152
+ return;
153
+ }
154
+ if (!drag.active && Math.hypot(event.clientX - drag.x, event.clientY - drag.y) < 4) return;
155
+ drag.active = true;
156
+ this.draggingId.set(drag.id);
157
+ drag.to = this.target(event.clientX, event.clientY);
158
+ this.drop.set(drag.to < 0 || drag.to === drag.from ? null : {
159
+ id: drag.items[drag.to].id,
160
+ edge: drag.to > drag.from ? "after" : "before"
161
+ });
162
+ }
163
+ end(event) {
164
+ const drag = this.drag;
165
+ if (!drag || drag.pointer !== event.pointerId) return;
166
+ const to = this.target(event.clientX, event.clientY);
167
+ const commit = drag.active && to >= 0 && !this.disabled() && this.items() === drag.items;
168
+ this.finish(!commit);
169
+ if (commit) this.commit(drag.from, to, "pointer");
170
+ }
171
+ pointerCancel(event) {
172
+ if (event.pointerId === this.drag?.pointer) this.finish(true);
173
+ }
174
+ key(event) {
175
+ if (!this.drag || event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;
176
+ if (event.key === "Escape" || event.key === "Tab") {
177
+ if (event.key === "Escape") {
178
+ event.preventDefault();
179
+ event.stopPropagation();
180
+ }
181
+ this.finish(true);
182
+ }
183
+ }
184
+ target(x, y) {
185
+ const list = this.list();
186
+ if (!list) return -1;
187
+ const rect = list.getBoundingClientRect();
188
+ if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) return -1;
189
+ return vdReorderTarget(y, this.rows().map((row) => row.getBoundingClientRect()));
190
+ }
191
+ finish(announce) {
192
+ const drag = this.drag;
193
+ this.drag = null;
194
+ this.draggingId.set(null);
195
+ this.drop.set(null);
196
+ if (!drag) return;
197
+ if (drag.handle.hasPointerCapture?.(drag.pointer)) drag.handle.releasePointerCapture(drag.pointer);
198
+ if (announce && drag.active) this.announce(this.t().canceledText(drag.items[drag.from].label));
199
+ }
200
+ announce(text) {
201
+ this.messages.set([{
202
+ serial: ++this.serial,
203
+ text
204
+ }]);
205
+ }
206
+ list() {
207
+ return this.host.querySelector("ol");
208
+ }
209
+ rows() {
210
+ return Array.from(this.host.querySelectorAll("[data-reorder-id]"));
211
+ }
212
+ static ɵfac = i0.ɵɵngDeclareFactory({
213
+ minVersion: "12.0.0",
214
+ version: "22.2.1",
215
+ ngImport: i0,
216
+ type: VdReorderList,
217
+ deps: [],
218
+ target: i0.ɵɵFactoryTarget.Component
219
+ });
220
+ static ɵcmp = i0.ɵɵngDeclareComponent({
221
+ minVersion: "17.0.0",
222
+ version: "22.2.1",
223
+ type: VdReorderList,
224
+ isStandalone: true,
225
+ selector: "vd-reorder-list",
226
+ inputs: {
227
+ items: {
228
+ classPropertyName: "items",
229
+ publicName: "items",
230
+ isSignal: true,
231
+ isRequired: false,
232
+ transformFunction: null
233
+ },
234
+ disabled: {
235
+ classPropertyName: "disabled",
236
+ publicName: "disabled",
237
+ isSignal: true,
238
+ isRequired: false,
239
+ transformFunction: null
240
+ },
241
+ label: {
242
+ classPropertyName: "label",
243
+ publicName: "label",
244
+ isSignal: true,
245
+ isRequired: false,
246
+ transformFunction: null
247
+ },
248
+ instructions: {
249
+ classPropertyName: "instructions",
250
+ publicName: "instructions",
251
+ isSignal: true,
252
+ isRequired: false,
253
+ transformFunction: null
254
+ },
255
+ upText: {
256
+ classPropertyName: "upText",
257
+ publicName: "upText",
258
+ isSignal: true,
259
+ isRequired: false,
260
+ transformFunction: null
261
+ },
262
+ downText: {
263
+ classPropertyName: "downText",
264
+ publicName: "downText",
265
+ isSignal: true,
266
+ isRequired: false,
267
+ transformFunction: null
268
+ },
269
+ emptyText: {
270
+ classPropertyName: "emptyText",
271
+ publicName: "emptyText",
272
+ isSignal: true,
273
+ isRequired: false,
274
+ transformFunction: null
275
+ },
276
+ invalidText: {
277
+ classPropertyName: "invalidText",
278
+ publicName: "invalidText",
279
+ isSignal: true,
280
+ isRequired: false,
281
+ transformFunction: null
282
+ },
283
+ movedText: {
284
+ classPropertyName: "movedText",
285
+ publicName: "movedText",
286
+ isSignal: true,
287
+ isRequired: false,
288
+ transformFunction: null
289
+ },
290
+ canceledText: {
291
+ classPropertyName: "canceledText",
292
+ publicName: "canceledText",
293
+ isSignal: true,
294
+ isRequired: false,
295
+ transformFunction: null
296
+ }
297
+ },
298
+ outputs: {
299
+ items: "itemsChange",
300
+ reordered: "reordered"
301
+ },
302
+ host: {
303
+ listeners: { "keydown": "key($event)" },
304
+ properties: { "attr.data-state": "!valid() ? \"invalid\" : !items().length ? \"empty\" : disabled() ? \"disabled\" : draggingId() ? \"dragging\" : \"idle\"" },
305
+ classAttribute: "vd-reorder-list"
306
+ },
307
+ ngImport: i0,
308
+ template: `
309
+ <p class="vd-visually-hidden" [id]="instructionsId">{{ t().instructions }}</p>
310
+ <ol
311
+ class="vd-reorder-list__list"
312
+ role="list"
313
+ tabindex="-1"
314
+ [attr.aria-label]="t().label"
315
+ [attr.aria-describedby]="instructionsId"
316
+ >
317
+ @if (!valid()) {
318
+ <li class="vd-reorder-list__empty">{{ t().invalidText }}</li>
319
+ } @else {
320
+ @for (item of items(); track item.id; let index = $index) {
321
+ <li
322
+ class="vd-reorder-list__item"
323
+ tabindex="-1"
324
+ [attr.data-reorder-id]="item.id"
325
+ [attr.data-index]="index"
326
+ [attr.data-dragging]="draggingId() === item.id ? '' : null"
327
+ [attr.data-drop]="drop()?.id === item.id ? drop()?.edge : null"
328
+ >
329
+ <span
330
+ class="vd-reorder-list__grip"
331
+ [attr.data-disabled]="disabled() || items().length < 2 ? '' : null"
332
+ aria-hidden="true"
333
+ (pointerdown)="start($event, item.id)"
334
+ (pointermove)="pointerMove($event)"
335
+ (pointerup)="end($event)"
336
+ (pointercancel)="pointerCancel($event)"
337
+ (lostpointercapture)="pointerCancel($event)"
338
+ ><vd-icon name="arrow-up-down"
339
+ /></span>
340
+ <div class="vd-reorder-list__body">
341
+ <div class="vd-reorder-list__title">
342
+ <span class="vd-reorder-list__position" aria-hidden="true">{{ index + 1 }}</span
343
+ ><bdi>{{ item.label }}</bdi>
344
+ </div>
345
+ @if (item.description) {
346
+ <p class="vd-reorder-list__description">{{ item.description }}</p>
347
+ }
348
+ </div>
349
+ <div class="vd-reorder-list__actions">
350
+ <button
351
+ vdButton
352
+ variant="ghost"
353
+ size="sm"
354
+ type="button"
355
+ data-action="up"
356
+ [disabled]="disabled() || index === 0"
357
+ [attr.aria-label]="t().upText + ': ' + item.label"
358
+ (click)="move(item.id, -1)"
359
+ >
360
+ <vd-icon name="arrow-up" slot="start" />{{ t().upText }}
361
+ </button>
362
+ <button
363
+ vdButton
364
+ variant="ghost"
365
+ size="sm"
366
+ type="button"
367
+ data-action="down"
368
+ [disabled]="disabled() || index === items().length - 1"
369
+ [attr.aria-label]="t().downText + ': ' + item.label"
370
+ (click)="move(item.id, 1)"
371
+ >
372
+ <vd-icon name="arrow-down" slot="start" />{{ t().downText }}
373
+ </button>
374
+ </div>
375
+ </li>
376
+ } @empty {
377
+ <li class="vd-reorder-list__empty">{{ t().emptyText }}</li>
378
+ }
379
+ }
380
+ </ol>
381
+ <p class="vd-visually-hidden" role="status" aria-atomic="true">
382
+ @for (message of messages(); track message.serial) {
383
+ <span>{{ message.text }}</span>
384
+ }
385
+ </p>
386
+ `,
387
+ isInline: true,
388
+ dependencies: [{
389
+ kind: "component",
390
+ type: VdButton,
391
+ selector: "button[vdButton], a[vdButton]",
392
+ inputs: [
393
+ "variant",
394
+ "size",
395
+ "disabled",
396
+ "loading",
397
+ "iconOnly",
398
+ "type"
399
+ ]
400
+ }, {
401
+ kind: "component",
402
+ type: VdIcon,
403
+ selector: "vd-icon",
404
+ inputs: ["name", "label"]
405
+ }],
406
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
407
+ encapsulation: i0.ViewEncapsulation.None
408
+ });
409
+ };
410
+ i0.ɵɵngDeclareClassMetadata({
411
+ minVersion: "12.0.0",
412
+ version: "22.2.1",
413
+ ngImport: i0,
414
+ type: VdReorderList,
415
+ decorators: [{
416
+ type: Component,
417
+ args: [{
418
+ selector: "vd-reorder-list",
419
+ imports: [VdButton, VdIcon],
420
+ template: `
421
+ <p class="vd-visually-hidden" [id]="instructionsId">{{ t().instructions }}</p>
422
+ <ol
423
+ class="vd-reorder-list__list"
424
+ role="list"
425
+ tabindex="-1"
426
+ [attr.aria-label]="t().label"
427
+ [attr.aria-describedby]="instructionsId"
428
+ >
429
+ @if (!valid()) {
430
+ <li class="vd-reorder-list__empty">{{ t().invalidText }}</li>
431
+ } @else {
432
+ @for (item of items(); track item.id; let index = $index) {
433
+ <li
434
+ class="vd-reorder-list__item"
435
+ tabindex="-1"
436
+ [attr.data-reorder-id]="item.id"
437
+ [attr.data-index]="index"
438
+ [attr.data-dragging]="draggingId() === item.id ? '' : null"
439
+ [attr.data-drop]="drop()?.id === item.id ? drop()?.edge : null"
440
+ >
441
+ <span
442
+ class="vd-reorder-list__grip"
443
+ [attr.data-disabled]="disabled() || items().length < 2 ? '' : null"
444
+ aria-hidden="true"
445
+ (pointerdown)="start($event, item.id)"
446
+ (pointermove)="pointerMove($event)"
447
+ (pointerup)="end($event)"
448
+ (pointercancel)="pointerCancel($event)"
449
+ (lostpointercapture)="pointerCancel($event)"
450
+ ><vd-icon name="arrow-up-down"
451
+ /></span>
452
+ <div class="vd-reorder-list__body">
453
+ <div class="vd-reorder-list__title">
454
+ <span class="vd-reorder-list__position" aria-hidden="true">{{ index + 1 }}</span
455
+ ><bdi>{{ item.label }}</bdi>
456
+ </div>
457
+ @if (item.description) {
458
+ <p class="vd-reorder-list__description">{{ item.description }}</p>
459
+ }
460
+ </div>
461
+ <div class="vd-reorder-list__actions">
462
+ <button
463
+ vdButton
464
+ variant="ghost"
465
+ size="sm"
466
+ type="button"
467
+ data-action="up"
468
+ [disabled]="disabled() || index === 0"
469
+ [attr.aria-label]="t().upText + ': ' + item.label"
470
+ (click)="move(item.id, -1)"
471
+ >
472
+ <vd-icon name="arrow-up" slot="start" />{{ t().upText }}
473
+ </button>
474
+ <button
475
+ vdButton
476
+ variant="ghost"
477
+ size="sm"
478
+ type="button"
479
+ data-action="down"
480
+ [disabled]="disabled() || index === items().length - 1"
481
+ [attr.aria-label]="t().downText + ': ' + item.label"
482
+ (click)="move(item.id, 1)"
483
+ >
484
+ <vd-icon name="arrow-down" slot="start" />{{ t().downText }}
485
+ </button>
486
+ </div>
487
+ </li>
488
+ } @empty {
489
+ <li class="vd-reorder-list__empty">{{ t().emptyText }}</li>
490
+ }
491
+ }
492
+ </ol>
493
+ <p class="vd-visually-hidden" role="status" aria-atomic="true">
494
+ @for (message of messages(); track message.serial) {
495
+ <span>{{ message.text }}</span>
496
+ }
497
+ </p>
498
+ `,
499
+ host: {
500
+ class: "vd-reorder-list",
501
+ "[attr.data-state]": "!valid() ? \"invalid\" : !items().length ? \"empty\" : disabled() ? \"disabled\" : draggingId() ? \"dragging\" : \"idle\"",
502
+ "(keydown)": "key($event)"
503
+ },
504
+ changeDetection: ChangeDetectionStrategy.OnPush,
505
+ encapsulation: ViewEncapsulation.None
506
+ }]
507
+ }],
508
+ ctorParameters: () => [],
509
+ propDecorators: {
510
+ items: [{
511
+ type: i0.Input,
512
+ args: [{
513
+ isSignal: true,
514
+ alias: "items",
515
+ required: false
516
+ }]
517
+ }, {
518
+ type: i0.Output,
519
+ args: ["itemsChange"]
520
+ }],
521
+ disabled: [{
522
+ type: i0.Input,
523
+ args: [{
524
+ isSignal: true,
525
+ alias: "disabled",
526
+ required: false
527
+ }]
528
+ }],
529
+ label: [{
530
+ type: i0.Input,
531
+ args: [{
532
+ isSignal: true,
533
+ alias: "label",
534
+ required: false
535
+ }]
536
+ }],
537
+ instructions: [{
538
+ type: i0.Input,
539
+ args: [{
540
+ isSignal: true,
541
+ alias: "instructions",
542
+ required: false
543
+ }]
544
+ }],
545
+ upText: [{
546
+ type: i0.Input,
547
+ args: [{
548
+ isSignal: true,
549
+ alias: "upText",
550
+ required: false
551
+ }]
552
+ }],
553
+ downText: [{
554
+ type: i0.Input,
555
+ args: [{
556
+ isSignal: true,
557
+ alias: "downText",
558
+ required: false
559
+ }]
560
+ }],
561
+ emptyText: [{
562
+ type: i0.Input,
563
+ args: [{
564
+ isSignal: true,
565
+ alias: "emptyText",
566
+ required: false
567
+ }]
568
+ }],
569
+ invalidText: [{
570
+ type: i0.Input,
571
+ args: [{
572
+ isSignal: true,
573
+ alias: "invalidText",
574
+ required: false
575
+ }]
576
+ }],
577
+ movedText: [{
578
+ type: i0.Input,
579
+ args: [{
580
+ isSignal: true,
581
+ alias: "movedText",
582
+ required: false
583
+ }]
584
+ }],
585
+ canceledText: [{
586
+ type: i0.Input,
587
+ args: [{
588
+ isSignal: true,
589
+ alias: "canceledText",
590
+ required: false
591
+ }]
592
+ }],
593
+ reordered: [{
594
+ type: i0.Output,
595
+ args: ["reordered"]
596
+ }]
597
+ }
598
+ });
599
+ export { VdReorderList };
600
+
601
+ //# sourceMappingURL=vadem-ui-reorder-list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-reorder-list.mjs","names":[],"sources":["../../../projects/ui/reorder-list/src/core/reorder-list.ts","../../../projects/ui/reorder-list/src/reorder-list.ts"],"sourcesContent":["export function vdReorderValid(items: readonly { id: string }[]): boolean {\n const ids = new Set<string>();\n for (const item of items) {\n if (typeof item.id !== 'string' || !item.id.trim() || ids.has(item.id)) return false;\n ids.add(item.id);\n }\n return true;\n}\n\nexport function vdReorderMove<T>(items: readonly T[], from: number, to: number): readonly T[] {\n if (\n !Number.isInteger(from) ||\n !Number.isInteger(to) ||\n from < 0 ||\n to < 0 ||\n from >= items.length ||\n to >= items.length ||\n from === to\n )\n return items;\n const next = [...items];\n const [item] = next.splice(from, 1);\n next.splice(to, 0, item);\n return next;\n}\n\n/** Existing stationary row rectangles; gaps resolve to the following row. */\nexport function vdReorderTarget(\n y: number,\n rows: readonly { top: number; bottom: number }[],\n): number {\n if (!Number.isFinite(y) || !rows.length) return -1;\n const index = rows.findIndex((row) => y < row.bottom);\n return index < 0 ? rows.length - 1 : index;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { VdButton } from '@vadem/ui/button';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { vdTexts } from '@vadem/ui/locale';\nimport { vdReorderMove, vdReorderTarget, vdReorderValid } from './core/reorder-list';\n\nexport interface VdReorderListItem {\n readonly id: string;\n readonly label: string;\n readonly description?: string;\n}\nexport interface VdReorderListChange {\n readonly id: string;\n readonly fromIndex: number;\n readonly toIndex: number;\n readonly method: 'buttons' | 'pointer';\n}\ninterface Drag {\n pointer: number;\n handle: HTMLElement;\n items: readonly VdReorderListItem[];\n id: string;\n from: number;\n x: number;\n y: number;\n active: boolean;\n to: number;\n}\ninterface Focus {\n element: HTMLElement;\n id: string;\n index: number;\n action: string | undefined;\n}\n\n@Component({\n selector: 'vd-reorder-list',\n imports: [VdButton, VdIcon],\n template: `\n <p class=\"vd-visually-hidden\" [id]=\"instructionsId\">{{ t().instructions }}</p>\n <ol\n class=\"vd-reorder-list__list\"\n role=\"list\"\n tabindex=\"-1\"\n [attr.aria-label]=\"t().label\"\n [attr.aria-describedby]=\"instructionsId\"\n >\n @if (!valid()) {\n <li class=\"vd-reorder-list__empty\">{{ t().invalidText }}</li>\n } @else {\n @for (item of items(); track item.id; let index = $index) {\n <li\n class=\"vd-reorder-list__item\"\n tabindex=\"-1\"\n [attr.data-reorder-id]=\"item.id\"\n [attr.data-index]=\"index\"\n [attr.data-dragging]=\"draggingId() === item.id ? '' : null\"\n [attr.data-drop]=\"drop()?.id === item.id ? drop()?.edge : null\"\n >\n <span\n class=\"vd-reorder-list__grip\"\n [attr.data-disabled]=\"disabled() || items().length < 2 ? '' : null\"\n aria-hidden=\"true\"\n (pointerdown)=\"start($event, item.id)\"\n (pointermove)=\"pointerMove($event)\"\n (pointerup)=\"end($event)\"\n (pointercancel)=\"pointerCancel($event)\"\n (lostpointercapture)=\"pointerCancel($event)\"\n ><vd-icon name=\"arrow-up-down\"\n /></span>\n <div class=\"vd-reorder-list__body\">\n <div class=\"vd-reorder-list__title\">\n <span class=\"vd-reorder-list__position\" aria-hidden=\"true\">{{ index + 1 }}</span\n ><bdi>{{ item.label }}</bdi>\n </div>\n @if (item.description) {\n <p class=\"vd-reorder-list__description\">{{ item.description }}</p>\n }\n </div>\n <div class=\"vd-reorder-list__actions\">\n <button\n vdButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n data-action=\"up\"\n [disabled]=\"disabled() || index === 0\"\n [attr.aria-label]=\"t().upText + ': ' + item.label\"\n (click)=\"move(item.id, -1)\"\n >\n <vd-icon name=\"arrow-up\" slot=\"start\" />{{ t().upText }}\n </button>\n <button\n vdButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n data-action=\"down\"\n [disabled]=\"disabled() || index === items().length - 1\"\n [attr.aria-label]=\"t().downText + ': ' + item.label\"\n (click)=\"move(item.id, 1)\"\n >\n <vd-icon name=\"arrow-down\" slot=\"start\" />{{ t().downText }}\n </button>\n </div>\n </li>\n } @empty {\n <li class=\"vd-reorder-list__empty\">{{ t().emptyText }}</li>\n }\n }\n </ol>\n <p class=\"vd-visually-hidden\" role=\"status\" aria-atomic=\"true\">\n @for (message of messages(); track message.serial) {\n <span>{{ message.text }}</span>\n }\n </p>\n `,\n host: {\n class: 'vd-reorder-list',\n '[attr.data-state]':\n '!valid() ? \"invalid\" : !items().length ? \"empty\" : disabled() ? \"disabled\" : draggingId() ? \"dragging\" : \"idle\"',\n '(keydown)': 'key($event)',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdReorderList {\n readonly items = model<readonly VdReorderListItem[]>([]);\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly label = input<string>();\n readonly instructions = input<string>();\n readonly upText = input<string>();\n readonly downText = input<string>();\n readonly emptyText = input<string>();\n readonly invalidText = input<string>();\n readonly movedText = input<(label: string, position: number, total: number) => string>();\n readonly canceledText = input<(label: string) => string>();\n readonly reordered = output<VdReorderListChange>();\n protected readonly t = vdTexts('reorderList', {\n label: this.label,\n instructions: this.instructions,\n upText: this.upText,\n downText: this.downText,\n emptyText: this.emptyText,\n invalidText: this.invalidText,\n movedText: this.movedText,\n canceledText: this.canceledText,\n });\n protected readonly valid = computed(() => vdReorderValid(this.items()));\n protected readonly instructionsId = vdUniqueId('vd-reorder-instructions');\n protected readonly draggingId = signal<string | null>(null);\n protected readonly drop = signal<{ id: string; edge: 'before' | 'after' } | null>(null);\n protected readonly messages = signal<readonly { serial: number; text: string }[]>([]);\n private readonly host: HTMLElement = inject(ElementRef).nativeElement;\n private drag: Drag | null = null;\n private focus: Focus | null = null;\n private serial = 0;\n\n constructor() {\n effect(() => {\n const items = this.items(),\n disabled = this.disabled(),\n valid = this.valid();\n if (this.drag && (disabled || !valid || items !== this.drag.items)) this.finish(true);\n const active = this.host.ownerDocument.activeElement as HTMLElement | null;\n const row =\n active && this.host.contains(active)\n ? active.closest<HTMLElement>('[data-reorder-id]')\n : null;\n this.focus =\n row && active\n ? {\n element: active,\n id: row.dataset['reorderId']!,\n index: Number(row.dataset['index']),\n action: active.dataset['action'],\n }\n : null;\n });\n afterRenderEffect(() => {\n this.items();\n this.disabled();\n this.valid();\n const focus = this.focus;\n this.focus = null;\n if (!focus) return;\n const active = this.host.ownerDocument.activeElement;\n if (active === focus.element && !focus.element.matches(':disabled')) {\n if (focus.action)\n focus.element.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'instant',\n });\n return;\n }\n if (active && active !== this.host.ownerDocument.body && active !== focus.element) return;\n const rows = this.rows();\n const row =\n rows.find((row) => row.dataset['reorderId'] === focus.id) ??\n rows[Math.min(focus.index, rows.length - 1)];\n const buttons = row\n ? Array.from(row.querySelectorAll<HTMLButtonElement>('button:not(:disabled)'))\n : [];\n const action = focus.action\n ? (buttons.find((button) => button.dataset['action'] === focus.action) ?? buttons[0])\n : null;\n const target = action ?? (this.disabled() ? null : row) ?? this.list();\n target?.focus({ preventScroll: true });\n if (focus.action)\n target?.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'instant' });\n });\n inject(DestroyRef).onDestroy(() => this.finish(false));\n }\n protected move(id: string, delta: number): void {\n if (this.disabled() || !this.valid() || this.drag) return;\n const from = this.items().findIndex((item) => item.id === id);\n this.commit(from, from + delta, 'buttons');\n }\n private commit(from: number, to: number, method: VdReorderListChange['method']): void {\n const items = this.items(),\n next = vdReorderMove(items, from, to);\n if (next === items) return;\n const item = items[from];\n this.items.set(next);\n this.announce(this.t().movedText(item.label, to + 1, items.length));\n this.reordered.emit({ id: item.id, fromIndex: from, toIndex: to, method });\n }\n protected start(event: PointerEvent, id: string): void {\n if (\n !event.isPrimary ||\n event.button !== 0 ||\n this.disabled() ||\n !this.valid() ||\n this.items().length < 2 ||\n this.drag\n )\n return;\n const handle = event.currentTarget as HTMLElement;\n if (typeof handle.setPointerCapture !== 'function') return;\n try {\n handle.setPointerCapture(event.pointerId);\n } catch {\n return;\n }\n event.preventDefault();\n const row = handle.closest<HTMLElement>('[data-reorder-id]');\n if (row && !row.contains(this.host.ownerDocument.activeElement))\n row.focus({ preventScroll: true });\n const from = this.items().findIndex((item) => item.id === id);\n this.drag = {\n pointer: event.pointerId,\n handle,\n items: this.items(),\n id,\n from,\n x: event.clientX,\n y: event.clientY,\n active: false,\n to: from,\n };\n }\n protected pointerMove(event: PointerEvent): void {\n const drag = this.drag;\n if (!drag || drag.pointer !== event.pointerId) return;\n if (event.buttons === 0 || this.disabled() || this.items() !== drag.items) {\n this.finish(true);\n return;\n }\n if (!drag.active && Math.hypot(event.clientX - drag.x, event.clientY - drag.y) < 4) return;\n drag.active = true;\n this.draggingId.set(drag.id);\n drag.to = this.target(event.clientX, event.clientY);\n this.drop.set(\n drag.to < 0 || drag.to === drag.from\n ? null\n : { id: drag.items[drag.to].id, edge: drag.to > drag.from ? 'after' : 'before' },\n );\n }\n protected end(event: PointerEvent): void {\n const drag = this.drag;\n if (!drag || drag.pointer !== event.pointerId) return;\n const to = this.target(event.clientX, event.clientY);\n const commit = drag.active && to >= 0 && !this.disabled() && this.items() === drag.items;\n this.finish(!commit);\n if (commit) this.commit(drag.from, to, 'pointer');\n }\n protected pointerCancel(event: PointerEvent): void {\n if (event.pointerId === this.drag?.pointer) this.finish(true);\n }\n protected key(event: KeyboardEvent): void {\n if (!this.drag || event.isComposing || event.altKey || event.ctrlKey || event.metaKey) return;\n if (event.key === 'Escape' || event.key === 'Tab') {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n }\n this.finish(true);\n }\n }\n private target(x: number, y: number): number {\n const list = this.list();\n if (!list) return -1;\n const rect = list.getBoundingClientRect();\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) return -1;\n return vdReorderTarget(\n y,\n this.rows().map((row) => row.getBoundingClientRect()),\n );\n }\n private finish(announce: boolean): void {\n const drag = this.drag;\n this.drag = null;\n this.draggingId.set(null);\n this.drop.set(null);\n if (!drag) return;\n if (drag.handle.hasPointerCapture?.(drag.pointer))\n drag.handle.releasePointerCapture(drag.pointer);\n if (announce && drag.active) this.announce(this.t().canceledText(drag.items[drag.from].label));\n }\n private announce(text: string): void {\n this.messages.set([{ serial: ++this.serial, text }]);\n }\n private list(): HTMLOListElement | null {\n return this.host.querySelector('ol');\n }\n private rows(): HTMLElement[] {\n return Array.from(this.host.querySelectorAll<HTMLElement>('[data-reorder-id]'));\n }\n}\n"],"mappings":"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"}