@vadem/ui 0.0.0-stage → 0.0.2

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 +93 -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 +657 -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 +329 -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 +134 -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 @@
1
+ {"version":3,"file":"vadem-ui-menu.mjs","names":[],"sources":["../../../projects/ui/menu/src/core/menu-controller.ts","../../../projects/ui/menu/src/menu.ts","../../../projects/ui/menu/src/context-menu.ts"],"sourcesContent":["/**\n * Framework-agnostic menu button (APG): trigger + `popover=\"auto\"` menu. Focus moves into the\n * menu (roving focus over items), arrows loop, typeahead jumps, activation or Escape closes and\n * returns focus to the trigger, Tab closes and lets focus move on.\n */\nimport { VdTypeahead, vdListTarget } from '@vadem/ui/keyboard';\n\nexport interface VdMenuControllerOptions {\n /** Items in DOM order (role=\"menuitem\", including disabled ones). */\n items(): HTMLElement[];\n onOpenChange?(open: boolean): void;\n /** Where focus returns on close; defaults to the trigger (context menus return to the opener). */\n returnFocusTo?(): HTMLElement | null;\n}\n\nconst ITEM = '[role=\"menuitem\"]';\n\nfunction isDisabled(el: HTMLElement): boolean {\n return el.getAttribute('aria-disabled') === 'true' || (el as HTMLButtonElement).disabled;\n}\n\nexport class VdMenuController {\n private readonly typeahead = new VdTypeahead();\n private returnFocus = false;\n /** Light dismiss closes on pointerdown over the trigger; the click must not reopen. */\n private wasOpen = false;\n\n constructor(\n private readonly trigger: HTMLElement,\n private readonly menu: HTMLElement,\n private readonly options: VdMenuControllerOptions,\n ) {\n trigger.addEventListener('pointerdown', this.onTriggerPointerDown);\n trigger.addEventListener('click', this.onTriggerClick);\n trigger.addEventListener('keydown', this.onTriggerKeydown);\n menu.addEventListener('keydown', this.onMenuKeydown);\n menu.addEventListener('click', this.onMenuClick);\n menu.addEventListener('pointermove', this.onPointerMove);\n menu.addEventListener('toggle', this.onToggle);\n }\n\n get isOpen(): boolean {\n return this.menu.matches(':popover-open');\n }\n\n open(focus: 'first' | 'last' = 'first'): void {\n if (!this.isOpen) {\n this.menu.showPopover({ source: this.trigger } as ShowPopoverOptions);\n this.options.onOpenChange?.(true);\n }\n const items = this.enabledItems();\n (focus === 'first' ? items[0] : items[items.length - 1])?.focus();\n }\n\n close(returnFocus: boolean): void {\n this.returnFocus = returnFocus;\n if (this.isOpen) this.menu.hidePopover();\n }\n\n destroy(): void {\n this.trigger.removeEventListener('pointerdown', this.onTriggerPointerDown);\n this.trigger.removeEventListener('click', this.onTriggerClick);\n this.trigger.removeEventListener('keydown', this.onTriggerKeydown);\n this.menu.removeEventListener('keydown', this.onMenuKeydown);\n this.menu.removeEventListener('click', this.onMenuClick);\n this.menu.removeEventListener('pointermove', this.onPointerMove);\n this.menu.removeEventListener('toggle', this.onToggle);\n }\n\n private enabledItems(): HTMLElement[] {\n return this.options.items().filter((i) => !isDisabled(i));\n }\n\n private readonly onTriggerPointerDown = () => {\n this.wasOpen = this.isOpen;\n };\n\n private readonly onTriggerClick = (event: MouseEvent) => {\n if (this.wasOpen || this.isOpen) {\n this.wasOpen = false;\n this.close(false);\n return;\n }\n // Enter/Space are handled in keydown (and prevented), so this is a pointer click.\n this.open('first');\n event.preventDefault();\n };\n\n private readonly onTriggerKeydown = (event: KeyboardEvent) => {\n const { key } = event;\n if (key === 'ArrowDown' || key === 'Enter' || key === ' ') {\n event.preventDefault();\n this.open('first');\n } else if (key === 'ArrowUp') {\n event.preventDefault();\n this.open('last');\n }\n };\n\n private readonly onMenuKeydown = (event: KeyboardEvent) => {\n const items = this.options.items();\n const current = items.indexOf(event.target as HTMLElement);\n const { key } = event;\n\n if (key === 'Escape') {\n event.preventDefault();\n this.close(true);\n return;\n }\n if (key === 'Tab') {\n this.close(false);\n return;\n }\n const target = vdListTarget(key, current, items.map(isDisabled), { loop: true, pageSize: 10 });\n if (target !== null) {\n event.preventDefault();\n items[target]?.focus();\n return;\n }\n if (VdTypeahead.accepts(event)) {\n const idx = this.typeahead.match(\n key,\n items.map((i) => i.textContent?.trim() ?? ''),\n items.map(isDisabled),\n current,\n );\n if (idx !== null) items[idx]?.focus();\n }\n };\n\n private readonly onMenuClick = (event: MouseEvent) => {\n const item = (event.target as Element).closest<HTMLElement>(ITEM);\n if (!item || !this.menu.contains(item)) return;\n if (isDisabled(item)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n // Item handlers already ran (bubbling reached the menu): close and restore focus.\n this.close(true);\n };\n\n /** Pointer and keyboard share one \"current\" item: hovering focuses it. */\n private readonly onPointerMove = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return;\n const item = (event.target as Element).closest<HTMLElement>(ITEM);\n if (item && !isDisabled(item) && item !== this.menu.ownerDocument.activeElement) item.focus();\n };\n\n private readonly onToggle = (event: Event) => {\n if ((event as ToggleEvent).newState !== 'closed') return;\n this.typeahead.reset();\n this.options.onOpenChange?.(false);\n if (this.returnFocus) (this.options.returnFocusTo?.() ?? this.trigger).focus();\n this.returnFocus = false;\n };\n}\n","import {\n DestroyRef,\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { VdMenuController } from './core/menu-controller';\n\n/** Menu panel: a `popover=\"auto\"` with `role=\"menu\"`. Open it with `vdMenuTrigger`. */\n@Directive({\n selector: '[vdMenu]',\n exportAs: 'vdMenu',\n host: {\n class: 'vd-menu',\n role: 'menu',\n popover: 'auto',\n tabindex: '-1',\n '[id]': 'id',\n '[attr.aria-labelledby]': 'labelledBy()',\n },\n})\nexport class VdMenu {\n readonly id = vdUniqueId('vd-menu');\n readonly el: HTMLElement = inject(ElementRef).nativeElement;\n readonly labelledBy = signal<string | null>(null);\n\n items(): HTMLElement[] {\n return Array.from(this.el.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\n }\n}\n\n/** Opens a `vdMenu`. Use on a button (works with `vdButton`). Spec: specs/menu.md */\n@Directive({\n selector: 'button[vdMenuTrigger]',\n host: {\n 'aria-haspopup': 'menu',\n '[attr.aria-expanded]': 'open()',\n '[attr.aria-controls]': 'vdMenuTrigger().id',\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n },\n})\nexport class VdMenuTrigger {\n readonly vdMenuTrigger = input.required<VdMenu>();\n protected readonly open = signal(false);\n private readonly el: HTMLButtonElement = inject(ElementRef).nativeElement;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const menu = this.vdMenuTrigger();\n if (!this.el.id) this.el.id = vdUniqueId('vd-menu-trigger');\n menu.labelledBy.set(this.el.id);\n const name = `--${menu.id}`;\n this.el.style.setProperty('anchor-name', name);\n menu.el.style.setProperty('position-anchor', name);\n const controller = new VdMenuController(this.el, menu.el, {\n items: () => menu.items(),\n onOpenChange: (open) => this.open.set(open),\n });\n destroyRef.onDestroy(() => controller.destroy());\n });\n }\n}\n\nexport type VdMenuItemVariant = 'default' | 'danger';\n\n@Directive({\n selector: 'button[vdMenuItem], a[vdMenuItem]',\n host: {\n class: 'vd-menu__item',\n role: 'menuitem',\n tabindex: '-1',\n '[attr.type]': 'isButton ? \"button\" : null',\n '[attr.data-variant]': 'variant()',\n '[attr.aria-disabled]': 'disabled() || null',\n },\n})\nexport class VdMenuItem {\n readonly variant = input<VdMenuItemVariant>('default');\n /** Disabled items stay in the menu (discoverable) but are skipped and inert. */\n readonly disabled = input(false, { transform: booleanAttribute });\n protected readonly isButton =\n (inject(ElementRef).nativeElement as HTMLElement).tagName === 'BUTTON';\n}\n\n@Directive({\n selector: '[vdMenuSeparator]',\n host: { class: 'vd-menu__separator', role: 'separator' },\n})\nexport class VdMenuSeparator {}\n\n/** Group heading inside a menu (mono eyebrow). Presentational. */\n@Directive({\n selector: '[vdMenuLabel]',\n host: { class: 'vd-menu__label', role: 'presentation' },\n})\nexport class VdMenuLabel {}\n\nexport const VD_MENU = [VdMenu, VdMenuTrigger, VdMenuItem, VdMenuSeparator, VdMenuLabel] as const;\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';\nimport { vdUniqueId } from '@vadem/ui/field';\nimport { vdTexts } from '@vadem/ui/locale';\nimport { VdMenuController } from './core/menu-controller';\nimport type { VdMenu } from './menu';\n\n/** Touch hold that opens the menu where `contextmenu` does not fire (iOS Safari). */\nconst LONG_PRESS_MS = 500;\nconst LONG_PRESS_SLOP = 10;\n\n/** One controller and one virtual anchor per menu, shared by every region that opens it. */\ninterface Shared {\n anchor: HTMLElement;\n controller: VdMenuController;\n opener: HTMLElement | null;\n users: number;\n}\nconst shared = new WeakMap<HTMLElement, Shared>();\n\nfunction acquire(menu: VdMenu, doc: Document): Shared {\n let entry = shared.get(menu.el);\n if (!entry) {\n const anchor = doc.createElement('span');\n anchor.className = 'vd-context-menu__anchor';\n anchor.setAttribute('aria-hidden', 'true');\n const name = `--${vdUniqueId('vd-context-anchor')}`;\n anchor.style.setProperty('anchor-name', name);\n menu.el.style.setProperty('position-anchor', name);\n // Next to the menu, so it shares any dialog's top layer and inert state.\n (menu.el.parentElement ?? doc.body).appendChild(anchor);\n const created: Shared = {\n anchor,\n opener: null,\n users: 0,\n controller: new VdMenuController(anchor, menu.el, {\n items: () => menu.items(),\n returnFocusTo: () => created.opener,\n }),\n };\n entry = created;\n shared.set(menu.el, entry);\n }\n entry.users++;\n return entry;\n}\n\nfunction release(menu: VdMenu): void {\n const entry = shared.get(menu.el);\n if (!entry || --entry.users > 0) return;\n entry.controller.destroy();\n entry.anchor.remove();\n shared.delete(menu.el);\n}\n\n/**\n * Opens a `vdMenu` at the pointer on right-click / long-press, or at the focused element on\n * the ContextMenu key and Shift+F10. Spec: specs/menu.md\n */\n@Directive({\n selector: '[vdContextMenu]',\n host: {\n class: 'vd-context-menu-target',\n '(contextmenu)': 'onContextMenu($event)',\n '(keydown)': 'onKeydown($event)',\n '(pointerdown)': 'onPointerDown($event)',\n },\n})\nexport class VdContextMenu {\n readonly vdContextMenu = input.required<VdMenu>();\n /** Accessible name of the menu while this region opened it. */\n readonly label = input<string>();\n /** Fires before the menu opens, so the consumer can point it at this region's item. */\n readonly opened = output<void>();\n\n protected readonly t = vdTexts('contextMenu', { label: this.label });\n private readonly el: HTMLElement = inject(ElementRef).nativeElement;\n private readonly doc = inject(DOCUMENT);\n private entry: Shared | null = null;\n private pendingPointerOpen: ((event: PointerEvent) => void) | null = null;\n private pressTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n clearTimeout(this.pressTimer);\n this.cancelPointerOpen();\n if (this.entry) release(this.vdContextMenu());\n });\n }\n\n protected onContextMenu(event: MouseEvent): void {\n // Shift+right-click keeps the browser's own menu (copy, inspect) available.\n if (event.shiftKey && event.button === 2) return;\n event.preventDefault();\n this.cancelPointerOpen();\n const { clientX: x, clientY: y } = event;\n const origin = event.target as HTMLElement;\n // Some engines dispatch contextmenu before right-button release. Opening an\n // auto popover then lets that same pointerup immediately light-dismiss it.\n if (event.buttons & 2) {\n this.pendingPointerOpen = (release) => {\n if (release.button !== 2) return;\n this.cancelPointerOpen();\n if (origin.isConnected) this.openAt(x, y, origin);\n };\n this.doc.addEventListener('pointerup', this.pendingPointerOpen);\n this.doc.addEventListener('pointercancel', this.cancelPointerOpen);\n } else {\n this.openAt(x, y, origin);\n }\n }\n\n private readonly cancelPointerOpen = (): void => {\n if (this.pendingPointerOpen) {\n this.doc.removeEventListener('pointerup', this.pendingPointerOpen);\n this.pendingPointerOpen = null;\n }\n this.doc.removeEventListener('pointercancel', this.cancelPointerOpen);\n };\n\n protected onKeydown(event: KeyboardEvent): void {\n const keyboardMenu = event.key === 'ContextMenu' || (event.shiftKey && event.key === 'F10');\n if (!keyboardMenu) return;\n event.preventDefault();\n const target = (event.target as HTMLElement) ?? this.el;\n const rect = target.getBoundingClientRect();\n const rtl = this.doc.defaultView?.getComputedStyle(target).direction === 'rtl';\n this.openAt(rtl ? rect.right : rect.left, rect.bottom, target);\n }\n\n protected onPointerDown(event: PointerEvent): void {\n if (event.pointerType !== 'touch') return;\n const { clientX: x, clientY: y } = event;\n const target = event.target as HTMLElement;\n const cancel = (e?: PointerEvent) => {\n if (\n e &&\n e.type === 'pointermove' &&\n Math.hypot(e.clientX - x, e.clientY - y) < LONG_PRESS_SLOP\n )\n return;\n clearTimeout(this.pressTimer);\n this.el.removeEventListener('pointermove', cancel);\n this.el.removeEventListener('pointerup', cancel);\n this.el.removeEventListener('pointercancel', cancel);\n };\n this.el.addEventListener('pointermove', cancel);\n this.el.addEventListener('pointerup', cancel);\n this.el.addEventListener('pointercancel', cancel);\n clearTimeout(this.pressTimer);\n this.pressTimer = setTimeout(() => {\n cancel();\n this.openAt(x, y, target);\n }, LONG_PRESS_MS);\n }\n\n private openAt(x: number, y: number, origin: HTMLElement): void {\n const menu = this.vdContextMenu();\n this.entry ??= acquire(menu, this.doc);\n // Android also fires contextmenu after a long press; one opening is enough.\n if (this.entry.controller.isOpen && this.entry.opener === this.focusable(origin)) return;\n this.opened.emit();\n this.entry.opener = this.focusable(origin);\n this.place(this.entry.anchor, x, y);\n menu.el.setAttribute('aria-label', this.t().label);\n menu.labelledBy.set(null);\n this.entry.controller.close(false);\n this.entry.controller.open('first');\n }\n\n /**\n * Puts the zero-size anchor at viewport point (x, y). An ancestor with a transform, filter or\n * container query becomes the fixed containing block, so the first guess is measured and\n * corrected by the difference. Insets stay logical: in RTL inline-start grows leftwards.\n */\n private place(anchor: HTMLElement, x: number, y: number): void {\n const rtl = this.doc.defaultView?.getComputedStyle(anchor).direction === 'rtl';\n let inline = rtl ? this.doc.documentElement.clientWidth - x : x;\n let block = y;\n const set = () => {\n anchor.style.setProperty('--vd-context-x', `${inline}px`);\n anchor.style.setProperty('--vd-context-y', `${block}px`);\n };\n set();\n const rect = anchor.getBoundingClientRect();\n inline += rtl ? rect.left - x : x - rect.left;\n block += y - rect.top;\n set();\n }\n\n /** Focus returns to the nearest focusable element of this region, or the region itself. */\n private focusable(origin: HTMLElement): HTMLElement {\n const candidate = origin.closest<HTMLElement>(\n 'a[href], button, input, select, textarea, [tabindex]',\n );\n return candidate && this.el.contains(candidate) ? candidate : this.el;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Directive, input } from "@angular/core";
3
+ import { vdTexts } from "@vadem/ui/locale";
4
+ var VdNavigationList = class VdNavigationList {
5
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
6
+ t = vdTexts("navigationList", { label: this.label });
7
+ static ɵfac = i0.ɵɵngDeclareFactory({
8
+ minVersion: "12.0.0",
9
+ version: "22.2.1",
10
+ ngImport: i0,
11
+ type: VdNavigationList,
12
+ deps: [],
13
+ target: i0.ɵɵFactoryTarget.Directive
14
+ });
15
+ static ɵdir = i0.ɵɵngDeclareDirective({
16
+ minVersion: "17.1.0",
17
+ version: "22.2.1",
18
+ type: VdNavigationList,
19
+ isStandalone: true,
20
+ selector: "nav[vdNavigationList]",
21
+ inputs: { label: {
22
+ classPropertyName: "label",
23
+ publicName: "label",
24
+ isSignal: true,
25
+ isRequired: false,
26
+ transformFunction: null
27
+ } },
28
+ host: {
29
+ properties: { "attr.aria-label": "t().label" },
30
+ classAttribute: "vd-navigation-list"
31
+ },
32
+ ngImport: i0
33
+ });
34
+ };
35
+ i0.ɵɵngDeclareClassMetadata({
36
+ minVersion: "12.0.0",
37
+ version: "22.2.1",
38
+ ngImport: i0,
39
+ type: VdNavigationList,
40
+ decorators: [{
41
+ type: Directive,
42
+ args: [{
43
+ selector: "nav[vdNavigationList]",
44
+ host: {
45
+ class: "vd-navigation-list",
46
+ "[attr.aria-label]": "t().label"
47
+ }
48
+ }]
49
+ }],
50
+ propDecorators: { label: [{
51
+ type: i0.Input,
52
+ args: [{
53
+ isSignal: true,
54
+ alias: "label",
55
+ required: false
56
+ }]
57
+ }] }
58
+ });
59
+ var VdNavigationLink = class VdNavigationLink {
60
+ static ɵfac = i0.ɵɵngDeclareFactory({
61
+ minVersion: "12.0.0",
62
+ version: "22.2.1",
63
+ ngImport: i0,
64
+ type: VdNavigationLink,
65
+ deps: [],
66
+ target: i0.ɵɵFactoryTarget.Directive
67
+ });
68
+ static ɵdir = i0.ɵɵngDeclareDirective({
69
+ minVersion: "14.0.0",
70
+ version: "22.2.1",
71
+ type: VdNavigationLink,
72
+ isStandalone: true,
73
+ selector: "a[vdNavigationLink]",
74
+ host: { classAttribute: "vd-navigation-link" },
75
+ ngImport: i0
76
+ });
77
+ };
78
+ i0.ɵɵngDeclareClassMetadata({
79
+ minVersion: "12.0.0",
80
+ version: "22.2.1",
81
+ ngImport: i0,
82
+ type: VdNavigationLink,
83
+ decorators: [{
84
+ type: Directive,
85
+ args: [{
86
+ selector: "a[vdNavigationLink]",
87
+ host: { class: "vd-navigation-link" }
88
+ }]
89
+ }]
90
+ });
91
+ var VdNavigationLabel = class VdNavigationLabel {
92
+ static ɵfac = i0.ɵɵngDeclareFactory({
93
+ minVersion: "12.0.0",
94
+ version: "22.2.1",
95
+ ngImport: i0,
96
+ type: VdNavigationLabel,
97
+ deps: [],
98
+ target: i0.ɵɵFactoryTarget.Directive
99
+ });
100
+ static ɵdir = i0.ɵɵngDeclareDirective({
101
+ minVersion: "14.0.0",
102
+ version: "22.2.1",
103
+ type: VdNavigationLabel,
104
+ isStandalone: true,
105
+ selector: "[vdNavigationLabel]",
106
+ host: { classAttribute: "vd-navigation-label" },
107
+ ngImport: i0
108
+ });
109
+ };
110
+ i0.ɵɵngDeclareClassMetadata({
111
+ minVersion: "12.0.0",
112
+ version: "22.2.1",
113
+ ngImport: i0,
114
+ type: VdNavigationLabel,
115
+ decorators: [{
116
+ type: Directive,
117
+ args: [{
118
+ selector: "[vdNavigationLabel]",
119
+ host: { class: "vd-navigation-label" }
120
+ }]
121
+ }]
122
+ });
123
+ const VD_NAVIGATION_LIST = [
124
+ VdNavigationList,
125
+ VdNavigationLink,
126
+ VdNavigationLabel
127
+ ];
128
+ export { VD_NAVIGATION_LIST, VdNavigationLabel, VdNavigationLink, VdNavigationList };
129
+
130
+ //# sourceMappingURL=vadem-ui-navigation-list.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-navigation-list.mjs","names":[],"sources":["../../../projects/ui/navigation-list/src/navigation-list.ts"],"sourcesContent":["import { Directive, input } from '@angular/core';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** Native navigation landmark; applications supply groups, links and current state. */\n@Directive({\n selector: 'nav[vdNavigationList]',\n host: { class: 'vd-navigation-list', '[attr.aria-label]': 't().label' },\n})\nexport class VdNavigationList {\n readonly label = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('navigationList', { label: this.label });\n}\n\n/** Keeps href, router integration, keyboard and modified-click behavior native. */\n@Directive({ selector: 'a[vdNavigationLink]', host: { class: 'vd-navigation-link' } })\nexport class VdNavigationLink {}\n\n/** Preserves the consumer's heading level and section labelling. */\n@Directive({ selector: '[vdNavigationLabel]', host: { class: 'vd-navigation-label' } })\nexport class VdNavigationLabel {}\n\nexport const VD_NAVIGATION_LIST = [VdNavigationList, VdNavigationLink, VdNavigationLabel] as const;\n"],"mappings":";;;AAQA,IAAa,mBAAb,MAAa,iBAAgB;CAClB,QAAQ,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEb,IAAI,QAAQ,kBAAkB,EAAE,OAAO,KAAK,MAAK,CAAE;CAH3D,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,OAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,mBAAA,YAAA;GAAA,gBAAA;EAAA;EAAA,UAAA;CAAA,CAAA;;AAAhB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAJ5B,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IAAE,OAAO;IAAsB,qBAAqB;GAAW;EACtE,CAAA;;;;;;;;;;;AASD,IAAa,mBAAb,MAAa,iBAAgB;CAAhB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAgB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,qBAAA;EAAA,UAAA;CAAA,CAAA;;AAAhB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA;EAD5B,MAAA;EAAU,MAAA,CAAA;GAAE,UAAU;GAAuB,MAAM,EAAE,OAAO,qBAAoB;EAAE,CAAE;;;AAKrF,IAAa,oBAAb,MAAa,kBAAiB;CAAjB,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAiB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAjB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAiB,cAAA;EAAA,UAAA;EAAA,MAAA,EAAA,gBAAA,sBAAA;EAAA,UAAA;CAAA,CAAA;;AAAjB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAiB,YAAA,CAAA;EAD7B,MAAA;EAAU,MAAA,CAAA;GAAE,UAAU;GAAuB,MAAM,EAAE,OAAO,sBAAqB;EAAE,CAAE;;;AAGtF,MAAa,qBAAqB;CAAC;CAAkB;CAAkB;AAAiB"}
@@ -0,0 +1,264 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Directive, ElementRef, ViewEncapsulation, afterEveryRender, computed, contentChild, inject, input, signal } from "@angular/core";
3
+ import { VdIcon } from "@vadem/ui/icon";
4
+ import { VdInput } from "@vadem/ui/input";
5
+ import { vdTexts } from "@vadem/ui/locale";
6
+ function vdNumberStepValue(input, direction) {
7
+ if (input.type !== "number" || input.disabled || input.readOnly || input.validity.badInput) return null;
8
+ const probe = input.cloneNode();
9
+ probe.value = input.value;
10
+ try {
11
+ if (direction === 1) probe.stepUp();
12
+ else probe.stepDown();
13
+ } catch {
14
+ return null;
15
+ }
16
+ if (probe.value === input.value || !Number.isFinite(probe.valueAsNumber)) return null;
17
+ if (Number.isFinite(input.valueAsNumber) && (probe.valueAsNumber - input.valueAsNumber) * direction <= 0) return null;
18
+ return probe.value;
19
+ }
20
+ var VdNumberInput = class VdNumberInput extends VdInput {
21
+ el = inject(ElementRef).nativeElement;
22
+ snapshot = signal(null, ...ngDevMode ? [{ debugName: "snapshot" }] : /* istanbul ignore next */ []);
23
+ locked = computed(() => {
24
+ this.snapshot();
25
+ return this.snapshot() === null || this.el.disabled || this.el.readOnly;
26
+ }, ...ngDevMode ? [{ debugName: "locked" }] : /* istanbul ignore next */ []);
27
+ canDecrease = computed(() => this.snapshot() !== null && vdNumberStepValue(this.el, -1) !== null, ...ngDevMode ? [{ debugName: "canDecrease" }] : /* istanbul ignore next */ []);
28
+ canIncrease = computed(() => this.snapshot() !== null && vdNumberStepValue(this.el, 1) !== null, ...ngDevMode ? [{ debugName: "canIncrease" }] : /* istanbul ignore next */ []);
29
+ constructor() {
30
+ super();
31
+ afterEveryRender(() => this.refresh());
32
+ }
33
+ refresh() {
34
+ this.snapshot.set(JSON.stringify([
35
+ this.el.type,
36
+ this.el.value,
37
+ this.el.getAttribute("value"),
38
+ this.el.min,
39
+ this.el.max,
40
+ this.el.step,
41
+ this.el.disabled,
42
+ this.el.readOnly,
43
+ this.el.validity.badInput
44
+ ]));
45
+ }
46
+ step(direction) {
47
+ const value = vdNumberStepValue(this.el, direction);
48
+ if (value === null) return;
49
+ this.el.value = value;
50
+ this.refresh();
51
+ this.el.dispatchEvent(new Event("input", { bubbles: true }));
52
+ this.el.dispatchEvent(new Event("change", { bubbles: true }));
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({
55
+ minVersion: "12.0.0",
56
+ version: "22.2.1",
57
+ ngImport: i0,
58
+ type: VdNumberInput,
59
+ deps: [],
60
+ target: i0.ɵɵFactoryTarget.Directive
61
+ });
62
+ static ɵdir = i0.ɵɵngDeclareDirective({
63
+ minVersion: "14.0.0",
64
+ version: "22.2.1",
65
+ type: VdNumberInput,
66
+ isStandalone: true,
67
+ selector: "input[type=number][vdNumberInput]",
68
+ host: {
69
+ listeners: {
70
+ "input": "refresh()",
71
+ "change": "refresh()"
72
+ },
73
+ classAttribute: "vd-number-input__input"
74
+ },
75
+ exportAs: ["vdNumberInput"],
76
+ usesInheritance: true,
77
+ ngImport: i0
78
+ });
79
+ };
80
+ i0.ɵɵngDeclareClassMetadata({
81
+ minVersion: "12.0.0",
82
+ version: "22.2.1",
83
+ ngImport: i0,
84
+ type: VdNumberInput,
85
+ decorators: [{
86
+ type: Directive,
87
+ args: [{
88
+ selector: "input[type=number][vdNumberInput]",
89
+ exportAs: "vdNumberInput",
90
+ host: {
91
+ class: "vd-number-input__input",
92
+ "(input)": "refresh()",
93
+ "(change)": "refresh()"
94
+ }
95
+ }]
96
+ }],
97
+ ctorParameters: () => []
98
+ });
99
+ var VdNumberInputGroup = class VdNumberInputGroup {
100
+ decreaseLabel = input(...ngDevMode ? [void 0, { debugName: "decreaseLabel" }] : /* istanbul ignore next */ []);
101
+ increaseLabel = input(...ngDevMode ? [void 0, { debugName: "increaseLabel" }] : /* istanbul ignore next */ []);
102
+ t = vdTexts("numberInput", {
103
+ decreaseLabel: this.decreaseLabel,
104
+ increaseLabel: this.increaseLabel
105
+ });
106
+ control = contentChild(VdNumberInput, ...ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []);
107
+ static ɵfac = i0.ɵɵngDeclareFactory({
108
+ minVersion: "12.0.0",
109
+ version: "22.2.1",
110
+ ngImport: i0,
111
+ type: VdNumberInputGroup,
112
+ deps: [],
113
+ target: i0.ɵɵFactoryTarget.Component
114
+ });
115
+ static ɵcmp = i0.ɵɵngDeclareComponent({
116
+ minVersion: "17.2.0",
117
+ version: "22.2.1",
118
+ type: VdNumberInputGroup,
119
+ isStandalone: true,
120
+ selector: "vd-number-input",
121
+ inputs: {
122
+ decreaseLabel: {
123
+ classPropertyName: "decreaseLabel",
124
+ publicName: "decreaseLabel",
125
+ isSignal: true,
126
+ isRequired: false,
127
+ transformFunction: null
128
+ },
129
+ increaseLabel: {
130
+ classPropertyName: "increaseLabel",
131
+ publicName: "increaseLabel",
132
+ isSignal: true,
133
+ isRequired: false,
134
+ transformFunction: null
135
+ }
136
+ },
137
+ host: { classAttribute: "vd-input-group vd-number-input" },
138
+ queries: [{
139
+ propertyName: "control",
140
+ first: true,
141
+ predicate: VdNumberInput,
142
+ descendants: true,
143
+ isSignal: true
144
+ }],
145
+ ngImport: i0,
146
+ template: `
147
+ <button
148
+ class="vd-button"
149
+ data-icon-only
150
+ type="button"
151
+ data-variant="ghost"
152
+ slot="start"
153
+ [attr.data-size]="control()?.size() ?? 'md'"
154
+ [attr.aria-label]="t().decreaseLabel"
155
+ [attr.aria-controls]="control()?.id() ?? null"
156
+ [disabled]="control()?.locked() ?? true"
157
+ [attr.aria-disabled]="control()?.canDecrease() ? null : 'true'"
158
+ (click)="control()?.step(-1)"
159
+ >
160
+ <vd-icon name="minus" />
161
+ </button>
162
+ <ng-content select="input[vdNumberInput]" />
163
+ <button
164
+ class="vd-button"
165
+ data-icon-only
166
+ type="button"
167
+ data-variant="ghost"
168
+ slot="end"
169
+ [attr.data-size]="control()?.size() ?? 'md'"
170
+ [attr.aria-label]="t().increaseLabel"
171
+ [attr.aria-controls]="control()?.id() ?? null"
172
+ [disabled]="control()?.locked() ?? true"
173
+ [attr.aria-disabled]="control()?.canIncrease() ? null : 'true'"
174
+ (click)="control()?.step(1)"
175
+ >
176
+ <vd-icon name="plus" />
177
+ </button>
178
+ `,
179
+ isInline: true,
180
+ dependencies: [{
181
+ kind: "component",
182
+ type: VdIcon,
183
+ selector: "vd-icon",
184
+ inputs: ["name", "label"]
185
+ }],
186
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
187
+ encapsulation: i0.ViewEncapsulation.None
188
+ });
189
+ };
190
+ i0.ɵɵngDeclareClassMetadata({
191
+ minVersion: "12.0.0",
192
+ version: "22.2.1",
193
+ ngImport: i0,
194
+ type: VdNumberInputGroup,
195
+ decorators: [{
196
+ type: Component,
197
+ args: [{
198
+ selector: "vd-number-input",
199
+ imports: [VdIcon],
200
+ template: `
201
+ <button
202
+ class="vd-button"
203
+ data-icon-only
204
+ type="button"
205
+ data-variant="ghost"
206
+ slot="start"
207
+ [attr.data-size]="control()?.size() ?? 'md'"
208
+ [attr.aria-label]="t().decreaseLabel"
209
+ [attr.aria-controls]="control()?.id() ?? null"
210
+ [disabled]="control()?.locked() ?? true"
211
+ [attr.aria-disabled]="control()?.canDecrease() ? null : 'true'"
212
+ (click)="control()?.step(-1)"
213
+ >
214
+ <vd-icon name="minus" />
215
+ </button>
216
+ <ng-content select="input[vdNumberInput]" />
217
+ <button
218
+ class="vd-button"
219
+ data-icon-only
220
+ type="button"
221
+ data-variant="ghost"
222
+ slot="end"
223
+ [attr.data-size]="control()?.size() ?? 'md'"
224
+ [attr.aria-label]="t().increaseLabel"
225
+ [attr.aria-controls]="control()?.id() ?? null"
226
+ [disabled]="control()?.locked() ?? true"
227
+ [attr.aria-disabled]="control()?.canIncrease() ? null : 'true'"
228
+ (click)="control()?.step(1)"
229
+ >
230
+ <vd-icon name="plus" />
231
+ </button>
232
+ `,
233
+ host: { class: "vd-input-group vd-number-input" },
234
+ changeDetection: ChangeDetectionStrategy.OnPush,
235
+ encapsulation: ViewEncapsulation.None
236
+ }]
237
+ }],
238
+ propDecorators: {
239
+ decreaseLabel: [{
240
+ type: i0.Input,
241
+ args: [{
242
+ isSignal: true,
243
+ alias: "decreaseLabel",
244
+ required: false
245
+ }]
246
+ }],
247
+ increaseLabel: [{
248
+ type: i0.Input,
249
+ args: [{
250
+ isSignal: true,
251
+ alias: "increaseLabel",
252
+ required: false
253
+ }]
254
+ }],
255
+ control: [{
256
+ type: i0.ContentChild,
257
+ args: [i0.forwardRef(() => VdNumberInput), { isSignal: true }]
258
+ }]
259
+ }
260
+ });
261
+ const VD_NUMBER_INPUT = [VdNumberInputGroup, VdNumberInput];
262
+ export { VD_NUMBER_INPUT, VdNumberInput, VdNumberInputGroup };
263
+
264
+ //# sourceMappingURL=vadem-ui-number-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-number-input.mjs","names":[],"sources":["../../../projects/ui/number-input/src/core/number-input.ts","../../../projects/ui/number-input/src/number-input.ts"],"sourcesContent":["/** Probe native decimal alignment/bounds without mutating the real form field. */\nexport function vdNumberStepValue(input: HTMLInputElement, direction: -1 | 1): string | null {\n if (input.type !== 'number' || input.disabled || input.readOnly || input.validity.badInput)\n return null;\n const probe = input.cloneNode() as HTMLInputElement;\n probe.value = input.value;\n try {\n if (direction === 1) probe.stepUp();\n else probe.stepDown();\n } catch {\n // Native stepping is unavailable for step=\"any\".\n return null;\n }\n if (probe.value === input.value || !Number.isFinite(probe.valueAsNumber)) return null;\n if (\n Number.isFinite(input.valueAsNumber) &&\n (probe.valueAsNumber - input.valueAsNumber) * direction <= 0\n )\n return null;\n return probe.value;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n ViewEncapsulation,\n afterEveryRender,\n computed,\n contentChild,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { VdIcon } from '@vadem/ui/icon';\nimport { VdInput } from '@vadem/ui/input';\nimport { vdNumberStepValue } from './core/number-input';\nimport { vdTexts } from '@vadem/ui/locale';\n\n/** Numeric native Input: the platform/forms accessor remains the source of value. */\n@Directive({\n selector: 'input[type=number][vdNumberInput]',\n exportAs: 'vdNumberInput',\n host: { class: 'vd-number-input__input', '(input)': 'refresh()', '(change)': 'refresh()' },\n})\nexport class VdNumberInput extends VdInput {\n private readonly el: HTMLInputElement = inject(ElementRef).nativeElement;\n private readonly snapshot = signal<string | null>(null);\n readonly locked = computed(() => {\n this.snapshot();\n return this.snapshot() === null || this.el.disabled || this.el.readOnly;\n });\n readonly canDecrease = computed(\n () => this.snapshot() !== null && vdNumberStepValue(this.el, -1) !== null,\n );\n readonly canIncrease = computed(\n () => this.snapshot() !== null && vdNumberStepValue(this.el, 1) !== null,\n );\n\n constructor() {\n super();\n // Browser-only. Equality of the serialized snapshot prevents render feedback loops.\n afterEveryRender(() => this.refresh());\n }\n\n refresh(): void {\n this.snapshot.set(\n JSON.stringify([\n this.el.type,\n this.el.value,\n this.el.getAttribute('value'),\n this.el.min,\n this.el.max,\n this.el.step,\n this.el.disabled,\n this.el.readOnly,\n this.el.validity.badInput,\n ]),\n );\n }\n\n step(direction: -1 | 1): void {\n const value = vdNumberStepValue(this.el, direction);\n if (value === null) return;\n this.el.value = value;\n this.refresh();\n this.el.dispatchEvent(new Event('input', { bubbles: true }));\n this.el.dispatchEvent(new Event('change', { bubbles: true }));\n }\n}\n\n@Component({\n selector: 'vd-number-input',\n imports: [VdIcon],\n template: `\n <button\n class=\"vd-button\"\n data-icon-only\n type=\"button\"\n data-variant=\"ghost\"\n slot=\"start\"\n [attr.data-size]=\"control()?.size() ?? 'md'\"\n [attr.aria-label]=\"t().decreaseLabel\"\n [attr.aria-controls]=\"control()?.id() ?? null\"\n [disabled]=\"control()?.locked() ?? true\"\n [attr.aria-disabled]=\"control()?.canDecrease() ? null : 'true'\"\n (click)=\"control()?.step(-1)\"\n >\n <vd-icon name=\"minus\" />\n </button>\n <ng-content select=\"input[vdNumberInput]\" />\n <button\n class=\"vd-button\"\n data-icon-only\n type=\"button\"\n data-variant=\"ghost\"\n slot=\"end\"\n [attr.data-size]=\"control()?.size() ?? 'md'\"\n [attr.aria-label]=\"t().increaseLabel\"\n [attr.aria-controls]=\"control()?.id() ?? null\"\n [disabled]=\"control()?.locked() ?? true\"\n [attr.aria-disabled]=\"control()?.canIncrease() ? null : 'true'\"\n (click)=\"control()?.step(1)\"\n >\n <vd-icon name=\"plus\" />\n </button>\n `,\n host: { class: 'vd-input-group vd-number-input' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class VdNumberInputGroup {\n readonly decreaseLabel = input<string>();\n readonly increaseLabel = input<string>();\n /** Text inputs resolved against the active VD_LOCALE. */\n protected readonly t = vdTexts('numberInput', {\n decreaseLabel: this.decreaseLabel,\n increaseLabel: this.increaseLabel,\n });\n protected readonly control = contentChild(VdNumberInput);\n}\n\nexport const VD_NUMBER_INPUT = [VdNumberInputGroup, VdNumberInput] as const;\n"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import * as i0 from "@angular/core";
2
+ import { Directive, computed, input, numberAttribute } from "@angular/core";
3
+ import { VdInput } from "@vadem/ui/input";
4
+ var VdOtpInput = class VdOtpInput extends VdInput {
5
+ length = input(6, {
6
+ ...ngDevMode ? { debugName: "length" } : /* istanbul ignore next */ {},
7
+ transform: numberAttribute
8
+ });
9
+ codeLength = computed(() => {
10
+ const length = this.length();
11
+ return Number.isFinite(length) ? Math.min(12, Math.max(1, Math.trunc(length))) : 6;
12
+ }, ...ngDevMode ? [{ debugName: "codeLength" }] : /* istanbul ignore next */ []);
13
+ static ɵfac = i0.ɵɵngDeclareFactory({
14
+ minVersion: "12.0.0",
15
+ version: "22.2.1",
16
+ ngImport: i0,
17
+ type: VdOtpInput,
18
+ deps: null,
19
+ target: i0.ɵɵFactoryTarget.Directive
20
+ });
21
+ static ɵdir = i0.ɵɵngDeclareDirective({
22
+ minVersion: "17.1.0",
23
+ version: "22.2.1",
24
+ type: VdOtpInput,
25
+ isStandalone: true,
26
+ selector: "input[vdOtpInput]",
27
+ inputs: { length: {
28
+ classPropertyName: "length",
29
+ publicName: "length",
30
+ isSignal: true,
31
+ isRequired: false,
32
+ transformFunction: null
33
+ } },
34
+ host: {
35
+ attributes: {
36
+ "type": "text",
37
+ "inputmode": "numeric",
38
+ "autocomplete": "one-time-code",
39
+ "spellcheck": "false",
40
+ "dir": "ltr"
41
+ },
42
+ properties: {
43
+ "attr.maxlength": "codeLength()",
44
+ "attr.pattern": "\"[0-9]{\" + codeLength() + \"}\"",
45
+ "style.--vd-otp-input-length": "codeLength()"
46
+ },
47
+ classAttribute: "vd-otp-input"
48
+ },
49
+ usesInheritance: true,
50
+ ngImport: i0
51
+ });
52
+ };
53
+ i0.ɵɵngDeclareClassMetadata({
54
+ minVersion: "12.0.0",
55
+ version: "22.2.1",
56
+ ngImport: i0,
57
+ type: VdOtpInput,
58
+ decorators: [{
59
+ type: Directive,
60
+ args: [{
61
+ selector: "input[vdOtpInput]",
62
+ host: {
63
+ class: "vd-otp-input",
64
+ type: "text",
65
+ inputmode: "numeric",
66
+ autocomplete: "one-time-code",
67
+ spellcheck: "false",
68
+ dir: "ltr",
69
+ "[attr.maxlength]": "codeLength()",
70
+ "[attr.pattern]": "\"[0-9]{\" + codeLength() + \"}\"",
71
+ "[style.--vd-otp-input-length]": "codeLength()"
72
+ }
73
+ }]
74
+ }],
75
+ propDecorators: { length: [{
76
+ type: i0.Input,
77
+ args: [{
78
+ isSignal: true,
79
+ alias: "length",
80
+ required: false
81
+ }]
82
+ }] }
83
+ });
84
+ export { VdOtpInput };
85
+
86
+ //# sourceMappingURL=vadem-ui-otp-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadem-ui-otp-input.mjs","names":[],"sources":["../../../projects/ui/otp-input/src/otp-input.ts"],"sourcesContent":["import { computed, Directive, input, numberAttribute } from '@angular/core';\nimport { VdInput } from '@vadem/ui/input';\n\n/** One native code field: editing, clipboard, autofill and value accessors remain native. */\n@Directive({\n selector: 'input[vdOtpInput]',\n host: {\n class: 'vd-otp-input',\n type: 'text',\n inputmode: 'numeric',\n autocomplete: 'one-time-code',\n spellcheck: 'false',\n dir: 'ltr',\n '[attr.maxlength]': 'codeLength()',\n '[attr.pattern]': '\"[0-9]{\" + codeLength() + \"}\"',\n '[style.--vd-otp-input-length]': 'codeLength()',\n },\n})\nexport class VdOtpInput extends VdInput {\n readonly length = input(6, { transform: numberAttribute });\n protected readonly codeLength = computed(() => {\n const length = this.length();\n return Number.isFinite(length) ? Math.min(12, Math.max(1, Math.trunc(length))) : 6;\n });\n}\n"],"mappings":";;;AAkBA,IAAa,aAAb,MAAa,mBAAmB,QAAO;CAC5B,SAAS,MAAM,GAAC;EAAA,GAAA,YAAA,EAAA,WAAA,SAAA,+BAAA,CAAA;EAAI,WAAW;CAAe,CAAA;CACpC,aAAa,eAAc;EAC5C,MAAM,SAAS,KAAK,OAAM;EAC1B,OAAO,OAAO,SAAS,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,IAAI;CACnF,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CALS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA,EAAA,QAAA;GAAA,mBAAA;GAAA,YAAA;GAAA,UAAA;GAAA,YAAA;GAAA,mBAAA;EAAA,EAAA;EAAA,MAAA;GAAA,YAAA;IAAA,QAAA;IAAA,aAAA;IAAA,gBAAA;IAAA,cAAA;IAAA,OAAA;GAAA;GAAA,YAAA;IAAA,kBAAA;IAAA,gBAAA;IAAA,+BAAA;GAAA;GAAA,gBAAA;EAAA;EAAA,iBAAA;EAAA,UAAA;CAAA,CAAA;;AAAV,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EAdtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,OAAO;IACP,MAAM;IACN,WAAW;IACX,cAAc;IACd,YAAY;IACZ,KAAK;IACL,oBAAoB;IACpB,kBAAkB;IAClB,iCAAiC;GAClC;EACF,CAAA"}