vectis-ui 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/components/VAccordion/VAccordion.css +1 -1
  2. package/dist/components/VAccordion/VAccordion.d.ts +6 -5
  3. package/dist/components/VAccordion/VAccordion.js.map +1 -1
  4. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/VAccordion/VAccordionItem.css +1 -1
  6. package/dist/components/VAccordion/VAccordionItem.d.ts +1 -1
  7. package/dist/components/VAccordion/VAccordionItem.js.map +1 -1
  8. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/VAlert/VAlert.css +2 -0
  10. package/dist/components/VAlert/VAlert.d.ts +73 -0
  11. package/dist/components/VAlert/VAlert.js +9 -0
  12. package/dist/components/VAlert/VAlert.js.map +1 -0
  13. package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js +96 -0
  14. package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  15. package/dist/components/VAvatar/VAvatar.d.ts +2 -2
  16. package/dist/components/VAvatar/VAvatarGroup.d.ts +1 -1
  17. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +8 -8
  18. package/dist/components/VBadge/VBadge.d.ts +3 -3
  19. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +9 -9
  20. package/dist/components/VButton/VButton.d.ts +4 -4
  21. package/dist/components/VButton/VButtonGroup.css +1 -1
  22. package/dist/components/VButton/VButtonGroup.d.ts +2 -2
  23. package/dist/components/VButton/VButtonGroup.js.map +1 -1
  24. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/VCalendar/VCalendar.css +1 -1
  26. package/dist/components/VCalendar/VCalendar.d.ts +7 -1
  27. package/dist/components/VCalendar/VCalendar.js.map +1 -1
  28. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +20 -18
  29. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/VCalendar/VCalendarEvent.js.map +1 -1
  31. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/VCalendar/VCalendarMonth.css +1 -1
  33. package/dist/components/VCalendar/VCalendarMonth.d.ts +2 -2
  34. package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
  35. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/VCalendar/VCalendarTimeGrid.css +1 -1
  37. package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +3 -3
  38. package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
  39. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/VCalendar/VCalendarYear.css +1 -1
  41. package/dist/components/VCalendar/VCalendarYear.js.map +1 -1
  42. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/VCalendar/gesture.d.ts +1 -16
  44. package/dist/components/VCalendar/gesture.js +1 -1
  45. package/dist/components/VCalendar/gesture.js.map +1 -1
  46. package/dist/components/VCalendar/types.d.ts +2 -0
  47. package/dist/components/VCard/VCard.css +2 -0
  48. package/dist/components/VCard/VCard.d.ts +87 -0
  49. package/dist/components/VCard/VCard.js +9 -0
  50. package/dist/components/VCard/VCard.js.map +1 -0
  51. package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js +103 -0
  52. package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/VCarousel/VCarousel.d.ts +1 -1
  54. package/dist/components/VCarousel/VCarousel.js.map +1 -1
  55. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +18 -18
  56. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/components/VCheckbox/VCheckMark.css +2 -0
  58. package/dist/components/VCheckbox/VCheckMark.js +9 -0
  59. package/dist/components/VCheckbox/VCheckMark.js.map +1 -0
  60. package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js +33 -0
  61. package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/VCheckbox/VCheckbox.css +1 -1
  63. package/dist/components/VCheckbox/VCheckbox.d.ts +8 -3
  64. package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
  65. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +54 -69
  66. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/components/VChip/VChip.d.ts +6 -6
  68. package/dist/components/VChip/VChip.js.map +1 -1
  69. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +26 -26
  70. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/VColorInput/VColorInput.css +2 -0
  72. package/dist/components/VColorInput/VColorInput.d.ts +113 -0
  73. package/dist/components/VColorInput/VColorInput.js +9 -0
  74. package/dist/components/VColorInput/VColorInput.js.map +1 -0
  75. package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js +230 -0
  76. package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  77. package/dist/components/VColorPicker/VColorPicker.css +2 -0
  78. package/dist/components/VColorPicker/VColorPicker.d.ts +67 -0
  79. package/dist/components/VColorPicker/VColorPicker.js +9 -0
  80. package/dist/components/VColorPicker/VColorPicker.js.map +1 -0
  81. package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js +390 -0
  82. package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/VColorPicker/color.d.ts +42 -0
  84. package/dist/components/VColorPicker/color.js +158 -0
  85. package/dist/components/VColorPicker/color.js.map +1 -0
  86. package/dist/components/VCombobox/VCombobox.css +1 -1
  87. package/dist/components/VCombobox/VCombobox.d.ts +46 -60
  88. package/dist/components/VCombobox/VCombobox.js.map +1 -1
  89. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +271 -372
  90. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  91. package/dist/components/VCommandPalette/VCommandPalette.css +2 -0
  92. package/dist/components/VCommandPalette/VCommandPalette.d.ts +163 -0
  93. package/dist/components/VCommandPalette/VCommandPalette.js +9 -0
  94. package/dist/components/VCommandPalette/VCommandPalette.js.map +1 -0
  95. package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js +321 -0
  96. package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js.map +1 -0
  97. package/dist/components/VCommandPalette/VCommandPaletteItem.css +2 -0
  98. package/dist/components/VCommandPalette/VCommandPaletteItem.d.ts +38 -0
  99. package/dist/components/VCommandPalette/VCommandPaletteItem.js +9 -0
  100. package/dist/components/VCommandPalette/VCommandPaletteItem.js.map +1 -0
  101. package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js +69 -0
  102. package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  103. package/dist/components/VContextMenu/VContextMenu.css +2 -0
  104. package/dist/components/VContextMenu/VContextMenu.d.ts +66 -0
  105. package/dist/components/VContextMenu/VContextMenu.js +9 -0
  106. package/dist/components/VContextMenu/VContextMenu.js.map +1 -0
  107. package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js +148 -0
  108. package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  109. package/dist/components/VDataTable/VDataTable.css +1 -1
  110. package/dist/components/VDataTable/VDataTable.d.ts +41 -16
  111. package/dist/components/VDataTable/VDataTable.js.map +1 -1
  112. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +307 -194
  113. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  114. package/dist/components/VDateInput/VDateInput.d.ts +27 -7
  115. package/dist/components/VDateInput/VDateInput.js.map +1 -1
  116. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +170 -162
  117. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/VDatePicker/VDatePicker.d.ts +3 -3
  119. package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
  120. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +228 -227
  121. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/VDatePicker/keyboard.d.ts +7 -7
  123. package/dist/components/VDatePicker/keyboard.js +8 -6
  124. package/dist/components/VDatePicker/keyboard.js.map +1 -1
  125. package/dist/components/VDatePicker/names.js +16 -20
  126. package/dist/components/VDatePicker/names.js.map +1 -1
  127. package/dist/components/VDialog/VDialog.d.ts +2 -4
  128. package/dist/components/VDialog/VDialog.js.map +1 -1
  129. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +46 -77
  130. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  131. package/dist/components/VDrawer/VDrawer.css +2 -0
  132. package/dist/components/VDrawer/VDrawer.d.ts +102 -0
  133. package/dist/components/VDrawer/VDrawer.js +9 -0
  134. package/dist/components/VDrawer/VDrawer.js.map +1 -0
  135. package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js +128 -0
  136. package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  137. package/dist/components/VEmptyState/VEmptyState.css +2 -0
  138. package/dist/components/VEmptyState/VEmptyState.d.ts +43 -0
  139. package/dist/components/VEmptyState/VEmptyState.js +9 -0
  140. package/dist/components/VEmptyState/VEmptyState.js.map +1 -0
  141. package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js +48 -0
  142. package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  143. package/dist/components/VField/VField.css +2 -0
  144. package/dist/components/VField/VField.d.ts +84 -0
  145. package/dist/components/VField/VField.js +9 -0
  146. package/dist/components/VField/VField.js.map +1 -0
  147. package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js +99 -0
  148. package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  149. package/dist/components/VField/VFieldAnnouncer.d.ts +7 -0
  150. package/dist/components/VField/VFieldAnnouncer.js +7 -0
  151. package/dist/components/VField/VFieldAnnouncer.js.map +1 -0
  152. package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js +19 -0
  153. package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  154. package/dist/components/VField/VFieldMessage.d.ts +11 -0
  155. package/dist/components/VField/VFieldMessage.js +7 -0
  156. package/dist/components/VField/VFieldMessage.js.map +1 -0
  157. package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js +32 -0
  158. package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  159. package/dist/components/VFieldset/VFieldset.css +2 -0
  160. package/dist/components/VFieldset/VFieldset.d.ts +52 -0
  161. package/dist/components/VFieldset/VFieldset.js +9 -0
  162. package/dist/components/VFieldset/VFieldset.js.map +1 -0
  163. package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js +63 -0
  164. package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -0
  165. package/dist/components/VFileInput/VFileInput.css +1 -1
  166. package/dist/components/VFileInput/VFileInput.d.ts +31 -7
  167. package/dist/components/VFileInput/VFileInput.js.map +1 -1
  168. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +168 -161
  169. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/VFilePicker/VFilePicker.d.ts +4 -4
  171. package/dist/components/VHotkeys/VHotkeys.css +1 -1
  172. package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
  173. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +27 -30
  174. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/components/VHotkeys/platform.d.ts +2 -0
  176. package/dist/components/VHotkeys/platform.js +24 -5
  177. package/dist/components/VHotkeys/platform.js.map +1 -1
  178. package/dist/components/VHoverCard/VHoverCard.css +2 -0
  179. package/dist/components/VHoverCard/VHoverCard.d.ts +62 -0
  180. package/dist/components/VHoverCard/VHoverCard.js +9 -0
  181. package/dist/components/VHoverCard/VHoverCard.js.map +1 -0
  182. package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js +97 -0
  183. package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  184. package/dist/components/VIcon/icons/add.d.ts +5 -0
  185. package/dist/components/VIcon/icons/add.js +9 -0
  186. package/dist/components/VIcon/icons/add.js.map +1 -0
  187. package/dist/components/VIcon/icons/colorize.d.ts +5 -0
  188. package/dist/components/VIcon/icons/colorize.js +9 -0
  189. package/dist/components/VIcon/icons/colorize.js.map +1 -0
  190. package/dist/components/VIcon/icons/inbox.d.ts +5 -0
  191. package/dist/components/VIcon/icons/inbox.js +9 -0
  192. package/dist/components/VIcon/icons/inbox.js.map +1 -0
  193. package/dist/components/VIcon/icons/index.d.ts +42 -2
  194. package/dist/components/VIcon/icons/index.js +88 -72
  195. package/dist/components/VIcon/icons/index.js.map +1 -1
  196. package/dist/components/VIcon/icons/names.d.ts +2 -2
  197. package/dist/components/VIcon/icons/names.js +1 -1
  198. package/dist/components/VIcon/icons/names.js.map +1 -1
  199. package/dist/components/VIcon/icons/open_in_new.d.ts +5 -0
  200. package/dist/components/VIcon/icons/open_in_new.js +9 -0
  201. package/dist/components/VIcon/icons/open_in_new.js.map +1 -0
  202. package/dist/components/VIcon/icons/priority_high.d.ts +5 -0
  203. package/dist/components/VIcon/icons/priority_high.js +9 -0
  204. package/dist/components/VIcon/icons/priority_high.js.map +1 -0
  205. package/dist/components/VIcon/icons/remove.d.ts +5 -0
  206. package/dist/components/VIcon/icons/remove.js +9 -0
  207. package/dist/components/VIcon/icons/remove.js.map +1 -0
  208. package/dist/components/VIcon/icons/search_off.d.ts +5 -0
  209. package/dist/components/VIcon/icons/search_off.js +9 -0
  210. package/dist/components/VIcon/icons/search_off.js.map +1 -0
  211. package/dist/components/VIcon/icons/star.d.ts +5 -0
  212. package/dist/components/VIcon/icons/star.js +9 -0
  213. package/dist/components/VIcon/icons/star.js.map +1 -0
  214. package/dist/components/VIconButton/VIconButton.d.ts +4 -4
  215. package/dist/components/VInput/VInput.css +1 -1
  216. package/dist/components/VInput/VInput.d.ts +51 -2
  217. package/dist/components/VInput/VInput.js.map +1 -1
  218. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +129 -106
  219. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/components/VInput/VInputGroup.css +1 -1
  221. package/dist/components/VInput/VInputGroup.d.ts +20 -0
  222. package/dist/components/VInput/VInputGroup.js.map +1 -1
  223. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js +50 -51
  224. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/components/VInputOTP/VInputOTP.css +1 -1
  226. package/dist/components/VInputOTP/VInputOTP.d.ts +27 -4
  227. package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
  228. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +131 -113
  229. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/VLink/VLink.css +2 -0
  231. package/dist/components/VLink/VLink.d.ts +53 -0
  232. package/dist/components/VLink/VLink.js +9 -0
  233. package/dist/components/VLink/VLink.js.map +1 -0
  234. package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js +58 -0
  235. package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js.map +1 -0
  236. package/dist/components/VListbox/VListboxChevron.css +2 -0
  237. package/dist/components/VListbox/VListboxChevron.d.ts +12 -0
  238. package/dist/components/VListbox/VListboxChevron.js +9 -0
  239. package/dist/components/VListbox/VListboxChevron.js.map +1 -0
  240. package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js +25 -0
  241. package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js.map +1 -0
  242. package/dist/components/VListbox/VListboxGroup.css +2 -0
  243. package/dist/components/VListbox/VListboxGroup.d.ts +27 -0
  244. package/dist/components/VListbox/VListboxGroup.js +9 -0
  245. package/dist/components/VListbox/VListboxGroup.js.map +1 -0
  246. package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  247. package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/VListbox/VListboxOption.css +2 -0
  249. package/dist/components/{VCombobox/VComboboxOption.d.ts → VListbox/VListboxOption.d.ts} +4 -4
  250. package/dist/components/VListbox/VListboxOption.js +9 -0
  251. package/dist/components/VListbox/VListboxOption.js.map +1 -0
  252. package/dist/components/{VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js} +6 -6
  253. package/dist/components/VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
  254. package/dist/components/VListbox/VListboxPanel.css +2 -0
  255. package/dist/components/VListbox/VListboxPanel.d.ts +59 -0
  256. package/dist/components/VListbox/VListboxPanel.js +9 -0
  257. package/dist/components/VListbox/VListboxPanel.js.map +1 -0
  258. package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js +123 -0
  259. package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  260. package/dist/components/VListbox/VListboxSeparator.css +2 -0
  261. package/dist/components/VListbox/VListboxSeparator.d.ts +3 -0
  262. package/dist/components/VListbox/VListboxSeparator.js +9 -0
  263. package/dist/components/VListbox/VListboxSeparator.js.map +1 -0
  264. package/dist/components/{VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js} +4 -4
  265. package/dist/components/VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  266. package/dist/components/VListbox/VListboxValues.css +2 -0
  267. package/dist/components/VListbox/VListboxValues.d.ts +52 -0
  268. package/dist/components/VListbox/VListboxValues.js +9 -0
  269. package/dist/components/VListbox/VListboxValues.js.map +1 -0
  270. package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js +103 -0
  271. package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js.map +1 -0
  272. package/dist/components/VMenu/VMenu.d.ts +1 -1
  273. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +9 -9
  274. package/dist/components/VMenu/VMenuItem.d.ts +1 -1
  275. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +16 -16
  276. package/dist/components/VMenu/VMenuPanel.d.ts +2 -2
  277. package/dist/components/VMenu/VMenuPanel.js.map +1 -1
  278. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +7 -7
  279. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/components/VMeter/VMeter.css +2 -0
  281. package/dist/components/VMeter/VMeter.d.ts +77 -0
  282. package/dist/components/VMeter/VMeter.js +9 -0
  283. package/dist/components/VMeter/VMeter.js.map +1 -0
  284. package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js +113 -0
  285. package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js.map +1 -0
  286. package/dist/components/VNumberInput/VNumberInput.css +2 -0
  287. package/dist/components/VNumberInput/VNumberInput.d.ts +114 -0
  288. package/dist/components/VNumberInput/VNumberInput.js +9 -0
  289. package/dist/components/VNumberInput/VNumberInput.js.map +1 -0
  290. package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js +251 -0
  291. package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  292. package/dist/components/VNumberInput/number.d.ts +30 -0
  293. package/dist/components/VNumberInput/number.js +38 -0
  294. package/dist/components/VNumberInput/number.js.map +1 -0
  295. package/dist/components/VPagination/VPagination.d.ts +1 -1
  296. package/dist/components/VPagination/VPagination.js.map +1 -1
  297. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +77 -77
  298. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  299. package/dist/components/VProgressCircular/VProgressCircular.d.ts +2 -2
  300. package/dist/components/VProgressLinear/VProgressLinear.css +1 -1
  301. package/dist/components/VProgressLinear/VProgressLinear.d.ts +10 -7
  302. package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
  303. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +52 -34
  304. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  305. package/dist/components/VRadio/VRadio.d.ts +8 -3
  306. package/dist/components/VRadio/VRadio.js.map +1 -1
  307. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +52 -46
  308. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  309. package/dist/components/VRating/VRating.css +2 -0
  310. package/dist/components/VRating/VRating.d.ts +92 -0
  311. package/dist/components/VRating/VRating.js +9 -0
  312. package/dist/components/VRating/VRating.js.map +1 -0
  313. package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js +158 -0
  314. package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js.map +1 -0
  315. package/dist/components/VResizable/VResizable.css +2 -0
  316. package/dist/components/VResizable/VResizable.d.ts +50 -0
  317. package/dist/components/VResizable/VResizable.js +9 -0
  318. package/dist/components/VResizable/VResizable.js.map +1 -0
  319. package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js +225 -0
  320. package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  321. package/dist/components/VResizable/VResizablePanel.css +2 -0
  322. package/dist/components/VResizable/VResizablePanel.d.ts +60 -0
  323. package/dist/components/VResizable/VResizablePanel.js +9 -0
  324. package/dist/components/VResizable/VResizablePanel.js.map +1 -0
  325. package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js +83 -0
  326. package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  327. package/dist/components/VResizable/context.d.ts +24 -0
  328. package/dist/components/VResizable/context.js +6 -0
  329. package/dist/components/VResizable/context.js.map +1 -0
  330. package/dist/components/VResizable/layout.d.ts +28 -0
  331. package/dist/components/VResizable/layout.js +41 -0
  332. package/dist/components/VResizable/layout.js.map +1 -0
  333. package/dist/components/VSelect/VSelect.css +2 -0
  334. package/dist/components/VSelect/VSelect.d.ts +193 -0
  335. package/dist/components/VSelect/VSelect.js +9 -0
  336. package/dist/components/VSelect/VSelect.js.map +1 -0
  337. package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js +418 -0
  338. package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js.map +1 -0
  339. package/dist/components/VSeparator/VSeparator.js.map +1 -1
  340. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  341. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +8 -8
  342. package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +2 -2
  343. package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
  344. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +3 -3
  345. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  346. package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +3 -3
  347. package/dist/components/VSlider/VSlider.css +1 -1
  348. package/dist/components/VSlider/VSlider.d.ts +34 -8
  349. package/dist/components/VSlider/VSlider.js.map +1 -1
  350. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +236 -215
  351. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  352. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +4 -4
  353. package/dist/components/VSnackbar/state.js.map +1 -1
  354. package/dist/components/VSplitButton/VSplitButton.css +2 -0
  355. package/dist/components/VSplitButton/VSplitButton.d.ts +114 -0
  356. package/dist/components/VSplitButton/VSplitButton.js +9 -0
  357. package/dist/components/VSplitButton/VSplitButton.js.map +1 -0
  358. package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js +148 -0
  359. package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  360. package/dist/components/VStepper/VStepper.css +2 -0
  361. package/dist/components/VStepper/VStepper.d.ts +73 -0
  362. package/dist/components/VStepper/VStepper.js +9 -0
  363. package/dist/components/VStepper/VStepper.js.map +1 -0
  364. package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js +96 -0
  365. package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js.map +1 -0
  366. package/dist/components/VSwitch/VSwitch.d.ts +8 -3
  367. package/dist/components/VSwitch/VSwitch.js.map +1 -1
  368. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +53 -47
  369. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  370. package/dist/components/VTabs/VTab.css +1 -1
  371. package/dist/components/VTabs/VTab.d.ts +1 -1
  372. package/dist/components/VTabs/VTab.js.map +1 -1
  373. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  374. package/dist/components/VTabs/VTabs.css +1 -1
  375. package/dist/components/VTabs/VTabs.d.ts +13 -5
  376. package/dist/components/VTabs/VTabs.js.map +1 -1
  377. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +20 -20
  378. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  379. package/dist/components/VTextarea/VTextarea.css +1 -1
  380. package/dist/components/VTextarea/VTextarea.d.ts +22 -2
  381. package/dist/components/VTextarea/VTextarea.js.map +1 -1
  382. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +108 -100
  383. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  384. package/dist/components/VTimeInput/VTimeInput.d.ts +27 -7
  385. package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
  386. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +187 -171
  387. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  388. package/dist/components/VTimePicker/VTimePicker.d.ts +2 -2
  389. package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
  390. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +16 -16
  391. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  392. package/dist/components/VTimeline/VTimeline.css +2 -0
  393. package/dist/components/VTimeline/VTimeline.d.ts +59 -0
  394. package/dist/components/VTimeline/VTimeline.js +9 -0
  395. package/dist/components/VTimeline/VTimeline.js.map +1 -0
  396. package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js +53 -0
  397. package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  398. package/dist/components/VTimeline/VTimelineItem.css +2 -0
  399. package/dist/components/VTimeline/VTimelineItem.d.ts +48 -0
  400. package/dist/components/VTimeline/VTimelineItem.js +9 -0
  401. package/dist/components/VTimeline/VTimelineItem.js.map +1 -0
  402. package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js +70 -0
  403. package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  404. package/dist/components/VTimeline/context.d.ts +11 -0
  405. package/dist/components/VTimeline/context.js +6 -0
  406. package/dist/components/VTimeline/context.js.map +1 -0
  407. package/dist/components/VTimeline/datetime.d.ts +8 -0
  408. package/dist/components/VTimeline/datetime.js +36 -0
  409. package/dist/components/VTimeline/datetime.js.map +1 -0
  410. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +8 -8
  411. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +12 -12
  412. package/dist/components/VToggle/VToggle.d.ts +4 -4
  413. package/dist/components/VToggle/VToggle.js.map +1 -1
  414. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +1 -1
  415. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  416. package/dist/components/VToggle/VToggleItem.d.ts +1 -1
  417. package/dist/components/VTooltip/VTooltip.d.ts +8 -2
  418. package/dist/components/VTooltip/VTooltip.js.map +1 -1
  419. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +45 -43
  420. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  421. package/dist/components/VTreeView/VTreeView.css +2 -0
  422. package/dist/components/VTreeView/VTreeView.d.ts +112 -0
  423. package/dist/components/VTreeView/VTreeView.js +9 -0
  424. package/dist/components/VTreeView/VTreeView.js.map +1 -0
  425. package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js +317 -0
  426. package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  427. package/dist/components/VTypography/VTypography.d.ts +1 -1
  428. package/dist/components/VVirtualList/VVirtualList.css +2 -0
  429. package/dist/components/VVirtualList/VVirtualList.d.ts +78 -0
  430. package/dist/components/VVirtualList/VVirtualList.js +9 -0
  431. package/dist/components/VVirtualList/VVirtualList.js.map +1 -0
  432. package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js +114 -0
  433. package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  434. package/dist/composables/useChoice.d.ts +28 -0
  435. package/dist/composables/useChoice.js +28 -0
  436. package/dist/composables/useChoice.js.map +1 -0
  437. package/dist/composables/useDebouncedSearch.d.ts +17 -0
  438. package/dist/composables/useDebouncedSearch.js +18 -0
  439. package/dist/composables/useDebouncedSearch.js.map +1 -0
  440. package/dist/composables/useEscapeDismiss.d.ts +8 -0
  441. package/dist/composables/useEscapeDismiss.js +16 -0
  442. package/dist/composables/useEscapeDismiss.js.map +1 -0
  443. package/dist/composables/useFieldIds.d.ts +2 -1
  444. package/dist/composables/useFieldIds.js +7 -6
  445. package/dist/composables/useFieldIds.js.map +1 -1
  446. package/dist/composables/useFieldPanel.d.ts +1 -0
  447. package/dist/composables/useFieldPanel.js +52 -42
  448. package/dist/composables/useFieldPanel.js.map +1 -1
  449. package/dist/composables/useFileField.d.ts +1 -3
  450. package/dist/composables/useFileField.js +48 -50
  451. package/dist/composables/useFileField.js.map +1 -1
  452. package/dist/composables/useHotkeyListener.d.ts +17 -0
  453. package/dist/composables/useHotkeyListener.js +29 -0
  454. package/dist/composables/useHotkeyListener.js.map +1 -0
  455. package/dist/composables/useIconClickHandlers.d.ts +2 -10
  456. package/dist/composables/useIconClickHandlers.js +1 -1
  457. package/dist/composables/useIconClickHandlers.js.map +1 -1
  458. package/dist/{components/VCombobox/infiniteScroll.d.ts → composables/useInfiniteScroll.d.ts} +6 -0
  459. package/dist/{components/VCombobox/infiniteScroll.js → composables/useInfiniteScroll.js} +9 -9
  460. package/dist/composables/useInfiniteScroll.js.map +1 -0
  461. package/dist/composables/useListbox.d.ts +132 -0
  462. package/dist/composables/useListbox.js +227 -0
  463. package/dist/composables/useListbox.js.map +1 -0
  464. package/dist/composables/useModalDialog.d.ts +28 -0
  465. package/dist/composables/useModalDialog.js +60 -0
  466. package/dist/composables/useModalDialog.js.map +1 -0
  467. package/dist/composables/useRootAttrs.d.ts +2 -3
  468. package/dist/composables/useRootAttrs.js.map +1 -1
  469. package/dist/composables/useTypeahead.d.ts +13 -0
  470. package/dist/composables/useTypeahead.js +23 -0
  471. package/dist/composables/useTypeahead.js.map +1 -0
  472. package/dist/composables/useVirtualList.d.ts +46 -0
  473. package/dist/composables/useVirtualList.js +145 -0
  474. package/dist/composables/useVirtualList.js.map +1 -0
  475. package/dist/i18n/en.js +50 -0
  476. package/dist/i18n/en.js.map +1 -1
  477. package/dist/i18n/fr.js +50 -0
  478. package/dist/i18n/fr.js.map +1 -1
  479. package/dist/i18n/state.d.ts +1 -1
  480. package/dist/i18n/state.js +17 -6
  481. package/dist/i18n/state.js.map +1 -1
  482. package/dist/i18n/types.d.ts +103 -2
  483. package/dist/icons.js +45 -37
  484. package/dist/index.d.ts +49 -3
  485. package/dist/index.js +80 -56
  486. package/dist/styles.css +1 -1
  487. package/dist/tokens/index.d.ts +43 -0
  488. package/dist/tokens/semantic.d.ts +42 -0
  489. package/dist/tokens/semantic.js +43 -1
  490. package/dist/tokens/semantic.js.map +1 -1
  491. package/dist/tokens/themes/dark.d.ts +1 -0
  492. package/dist/tokens/themes/dark.js +1 -0
  493. package/dist/tokens/themes/dark.js.map +1 -1
  494. package/dist/tokens.json +215 -1
  495. package/dist/types.d.ts +57 -4
  496. package/dist/utils/arrowNav.js.map +1 -1
  497. package/dist/utils/attrs.d.ts +9 -0
  498. package/dist/utils/attrs.js +14 -0
  499. package/dist/utils/attrs.js.map +1 -0
  500. package/dist/utils/date.d.ts +1 -0
  501. package/dist/utils/date.js +5 -4
  502. package/dist/utils/date.js.map +1 -1
  503. package/package.json +1 -1
  504. package/dist/components/VCombobox/VComboboxGroup.css +0 -2
  505. package/dist/components/VCombobox/VComboboxGroup.d.ts +0 -17
  506. package/dist/components/VCombobox/VComboboxGroup.js +0 -9
  507. package/dist/components/VCombobox/VComboboxGroup.js.map +0 -1
  508. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +0 -21
  509. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +0 -1
  510. package/dist/components/VCombobox/VComboboxOption.css +0 -2
  511. package/dist/components/VCombobox/VComboboxOption.js +0 -9
  512. package/dist/components/VCombobox/VComboboxOption.js.map +0 -1
  513. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +0 -1
  514. package/dist/components/VCombobox/VComboboxSeparator.css +0 -2
  515. package/dist/components/VCombobox/VComboboxSeparator.js +0 -9
  516. package/dist/components/VCombobox/VComboboxSeparator.js.map +0 -1
  517. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +0 -1
  518. package/dist/components/VCombobox/infiniteScroll.js.map +0 -1
  519. /package/dist/components/{VCombobox/VComboboxSeparator.d.ts → VCheckbox/VCheckMark.d.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-meter{--meter-thickness:var(--vectis-control-size-meter-thickness-md);--meter-fill:var(--tone-bg-solid);--meter-track:var(--tone-border-soft);gap:var(--vectis-space-1);min-inline-size:0;font-family:var(--vectis-text-family);flex-direction:column;display:flex}.v-meter[data-custom]{--meter-track:color-mix(in oklab, var(--custom-color), var(--vectis-color-surface) 70%)}.v-meter[data-size=sm]{--meter-thickness:var(--vectis-control-size-meter-thickness-sm)}.v-meter[data-size=lg]{--meter-thickness:var(--vectis-control-size-meter-thickness-lg)}.v-meter-header{align-items:baseline;column-gap:var(--vectis-space-2);flex-wrap:wrap;display:flex}.v-meter-label{color:var(--vectis-color-text);font-size:var(--vectis-text-label-size);font-weight:var(--vectis-text-label-weight);line-height:var(--vectis-text-label-leading)}.v-meter-value{color:var(--vectis-color-text-muted);font-size:var(--vectis-text-body-md-size);font-weight:var(--vectis-text-body-md-weight);line-height:var(--vectis-text-body-md-leading);font-variant-numeric:tabular-nums;margin-inline-start:auto}.v-meter[data-size=sm] .v-meter-label,.v-meter[data-size=sm] .v-meter-value{font-size:var(--vectis-text-caption-size);font-weight:var(--vectis-text-caption-weight);line-height:var(--vectis-text-caption-leading)}.v-meter-track{gap:var(--vectis-control-size-meter-segment-gap);block-size:var(--meter-thickness);display:flex}.v-meter-segment{border-radius:var(--vectis-radius-pill);background:var(--meter-track);flex:1 1 0;position:relative}.v-meter-fill{inline-size:calc(100% * var(--meter-segment-fill));border-radius:inherit;background:var(--meter-fill);transition:inline-size var(--vectis-duration-base) var(--vectis-ease-default), background-color var(--vectis-duration-base) var(--vectis-ease-default);position:absolute;inset-block:0;inset-inline-start:0}@media (prefers-reduced-motion:reduce){.v-meter-fill{transition:none}}@media (forced-colors:active){.v-meter-segment{forced-color-adjust:none;box-shadow:inset 0 0 0 var(--vectis-control-border-width) CanvasText;background:canvas}.v-meter-fill{background:highlight}}}
@@ -0,0 +1,77 @@
1
+ /** The colour of the fill, which replaces the one chosen from `low`, `high` and `optimum`. */
2
+ export type MeterTone = 'accent' | 'neutral' | 'success' | 'warning' | 'danger';
3
+ /** The thickness of the bar, 4, 8 or 12 pixels, and the size of the text above it. */
4
+ export type MeterSize = 'sm' | 'md' | 'lg';
5
+ interface MeterProps {
6
+ /** The measurement. Anything outside the range is brought back into it. */
7
+ value?: number;
8
+ /** The lower bound of the range. */
9
+ min?: number;
10
+ /** The upper bound of the range. A bound below `min` is raised to it. */
11
+ max?: number;
12
+ /**
13
+ * The upper end of the low part of the range. With `high` and `optimum`, it decides whether
14
+ * the value is good, average or poor, which colours the bar.
15
+ */
16
+ low?: number;
17
+ /** The lower end of the high part of the range. */
18
+ high?: number;
19
+ /**
20
+ * The best value. In the low part, low values are good; in the high part, high values are;
21
+ * between `low` and `high`, the middle is good and both ends are average.
22
+ */
23
+ optimum?: number;
24
+ /**
25
+ * What is measured, shown above the bar and naming it for screen readers. Without it, the bar
26
+ * is named from the design system dictionary; an `aria-label` or `aria-labelledby` of your own
27
+ * takes precedence.
28
+ */
29
+ label?: string;
30
+ /** Hides the label visually. It still names the bar for screen readers. */
31
+ hideLabel?: boolean;
32
+ /**
33
+ * The value as written above the bar and read by screen readers, such as "7.2 GB of 10 GB" or
34
+ * "Strong". It replaces the formatted value.
35
+ */
36
+ valueText?: string;
37
+ /**
38
+ * Formats the value for the current locale, such as a unit or a currency. Without it, the
39
+ * value is written as a percentage of the range.
40
+ */
41
+ formatOptions?: Intl.NumberFormatOptions;
42
+ /** Hides the value visually. Screen readers still read it from the bar. */
43
+ hideValue?: boolean;
44
+ /**
45
+ * The colour of the fill. Without it, the region of the value picks one when `low`, `high` or
46
+ * `optimum` is set: success, warning or danger; otherwise the accent.
47
+ */
48
+ tone?: MeterTone;
49
+ /**
50
+ * A colour of your own (hex, CSS name or `oklch()`), which replaces the tone. The track is
51
+ * derived from it against the theme.
52
+ */
53
+ color?: string;
54
+ /** Splits the bar into this many equal parts, for a strength or a battery level. */
55
+ segments?: number;
56
+ /** The thickness of the bar and the size of the text above it. */
57
+ size?: MeterSize;
58
+ }
59
+ declare const __VLS_export: import('vue').DefineComponent<MeterProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<MeterProps> & Readonly<{}>, {
60
+ label: string;
61
+ value: number;
62
+ size: MeterSize;
63
+ tone: MeterTone;
64
+ color: string;
65
+ hideLabel: boolean;
66
+ min: number;
67
+ max: number;
68
+ formatOptions: Intl.NumberFormatOptions;
69
+ valueText: string;
70
+ segments: number;
71
+ low: number;
72
+ high: number;
73
+ optimum: number;
74
+ hideValue: boolean;
75
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
76
+ declare const _default: typeof __VLS_export;
77
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import './VMeter.css';
2
+ import e from "./VMeter.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VMeter/VMeter.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VMeter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VMeter.js","names":[],"sources":["../../../src/components/VMeter/VMeter.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @a11y\n/**\n * A measurement within a known range, drawn in CSS under the `meter` role. The native `<meter>`\n * is styled only through vendor pseudo-elements, which need one rule set per engine, does not\n * transition its fill in Firefox and cannot be split into segments; the role carries the same\n * semantics. As with the native element, `low`, `high` and `optimum` place the value in a\n * region, which picks the tone.\n */\nimport { computed, useId } from 'vue'\n\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useLocale, useMessages } from '../../i18n/state'\nimport { customColorStyle } from '../../utils/css'\nimport { clamp } from '../../utils/number'\n\n/** The colour of the fill, which replaces the one chosen from `low`, `high` and `optimum`. */\nexport type MeterTone = 'accent' | 'neutral' | 'success' | 'warning' | 'danger'\n\n/** The thickness of the bar, 4, 8 or 12 pixels, and the size of the text above it. */\nexport type MeterSize = 'sm' | 'md' | 'lg'\n\ninterface MeterProps {\n /** The measurement. Anything outside the range is brought back into it. */\n value?: number\n /** The lower bound of the range. */\n min?: number\n /** The upper bound of the range. A bound below `min` is raised to it. */\n max?: number\n /**\n * The upper end of the low part of the range. With `high` and `optimum`, it decides whether\n * the value is good, average or poor, which colours the bar.\n */\n low?: number\n /** The lower end of the high part of the range. */\n high?: number\n /**\n * The best value. In the low part, low values are good; in the high part, high values are;\n * between `low` and `high`, the middle is good and both ends are average.\n */\n optimum?: number\n /**\n * What is measured, shown above the bar and naming it for screen readers. Without it, the bar\n * is named from the design system dictionary; an `aria-label` or `aria-labelledby` of your own\n * takes precedence.\n */\n label?: string\n /** Hides the label visually. It still names the bar for screen readers. */\n hideLabel?: boolean\n /**\n * The value as written above the bar and read by screen readers, such as \"7.2 GB of 10 GB\" or\n * \"Strong\". It replaces the formatted value.\n */\n valueText?: string\n /**\n * Formats the value for the current locale, such as a unit or a currency. Without it, the\n * value is written as a percentage of the range.\n */\n formatOptions?: Intl.NumberFormatOptions\n /** Hides the value visually. Screen readers still read it from the bar. */\n hideValue?: boolean\n /**\n * The colour of the fill. Without it, the region of the value picks one when `low`, `high` or\n * `optimum` is set: success, warning or danger; otherwise the accent.\n */\n tone?: MeterTone\n /**\n * A colour of your own (hex, CSS name or `oklch()`), which replaces the tone. The track is\n * derived from it against the theme.\n */\n color?: string\n /** Splits the bar into this many equal parts, for a strength or a battery level. */\n segments?: number\n /** The thickness of the bar and the size of the text above it. */\n size?: MeterSize\n}\n\n// The root only lays out the text and the bar: the consumer's ARIA and other attributes belong\n// on the element carrying the role.\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<MeterProps>(), {\n value: 0,\n min: 0,\n max: 100,\n low: undefined,\n high: undefined,\n optimum: undefined,\n label: undefined,\n hideLabel: false,\n valueText: undefined,\n formatOptions: undefined,\n hideValue: false,\n // Deliberately undefined: the region of the value then picks the tone.\n tone: undefined,\n color: undefined,\n segments: 1,\n size: 'md',\n})\n\nconst { attrs, rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst locale = useLocale()\nconst labelId = useId()\n\n/* The normalization of the HTML `<meter>`: the bounds first, then each point brought into\n them, `high` never below `low`. A value that is not a number reads as the minimum. */\nconst range = computed(() => {\n const min = Number.isFinite(props.min) ? props.min : 0\n const max = Number.isFinite(props.max) ? Math.max(props.max, min) : Math.max(100, min)\n const fit = (point: number | undefined, from: number, fallback: number) =>\n point === undefined || Number.isNaN(point) ? fallback : clamp(point, from, max)\n const low = fit(props.low, min, min)\n return {\n min,\n max,\n value: fit(props.value, min, min),\n low,\n high: fit(props.high, low, max),\n optimum: fit(props.optimum, min, (min + max) / 2),\n }\n})\n\nconst fraction = computed(() => {\n const { min, max, value } = range.value\n return max > min ? (value - min) / (max - min) : 0\n})\n\n// @core\n// The regions of the HTML `<meter>`, with the boundaries Chromium draws: the part holding the\n// optimum is good, the part next to it average, and the far part, when the optimum sits beyond\n// `low` or `high`, poor.\nconst level = computed<'optimum' | 'suboptimal' | 'poor'>(() => {\n const { value, low, high, optimum } = range.value\n if (optimum >= low && optimum <= high)\n return value >= low && value <= high ? 'optimum' : 'suboptimal'\n if (optimum < low) return value < low ? 'optimum' : value <= high ? 'suboptimal' : 'poor'\n return value > high ? 'optimum' : value >= low ? 'suboptimal' : 'poor'\n})\n\nconst LEVEL_TONES = { optimum: 'success', suboptimal: 'warning', poor: 'danger' } as const\n\nconst resolvedTone = computed<MeterTone>(() => {\n if (props.tone) return props.tone\n const graded = props.low !== undefined || props.high !== undefined || props.optimum !== undefined\n return graded ? LEVEL_TONES[level.value] : 'accent'\n})\n\nconst text = computed(() => {\n if (props.valueText !== undefined) return props.valueText\n if (props.formatOptions)\n return new Intl.NumberFormat(locale.value, props.formatOptions).format(range.value.value)\n return m.value.progress.percent(Math.round(fraction.value * 100))\n})\n\nconst segmentCount = computed(() =>\n Number.isFinite(props.segments) ? Math.max(1, Math.floor(props.segments)) : 1,\n)\n\n/** How much of segment `index` is filled, from 0 to 1. */\nconst segmentFill = (index: number) => clamp(fraction.value * segmentCount.value - index, 0, 1)\n\n// @a11y\n// A visible label names the bar by reference, unless the consumer named it themselves; without\n// one, the dictionary does.\nconst ariaLabel = useAriaLabel(() => (props.label ? undefined : m.value.meter.label))\nconst labelledBy = computed(() =>\n props.label && attrs['aria-label'] == null && attrs['aria-labelledby'] == null\n ? labelId\n : undefined,\n)\n</script>\n\n<template>\n <div\n class=\"v-meter v-tone\"\n :class=\"rootClass\"\n :style=\"[customColorStyle(color), rootStyle]\"\n :data-tone=\"resolvedTone\"\n :data-custom=\"color !== undefined ? '' : undefined\"\n :data-level=\"level\"\n :data-size=\"size\"\n >\n <div v-if=\"(label && !hideLabel) || !hideValue\" class=\"v-meter-header\">\n <span v-if=\"label && !hideLabel\" :id=\"labelId\" class=\"v-meter-label\">{{ label }}</span>\n <!-- Read from the bar's `aria-valuetext`, so hidden here to avoid reading it twice. -->\n <span v-if=\"!hideValue\" class=\"v-meter-value\" aria-hidden=\"true\">{{ text }}</span>\n </div>\n <span v-if=\"label && hideLabel\" :id=\"labelId\" class=\"v-visually-hidden\">{{ label }}</span>\n <div\n class=\"v-meter-track\"\n role=\"meter\"\n :aria-valuenow=\"range.value\"\n :aria-valuemin=\"range.min\"\n :aria-valuemax=\"range.max\"\n :aria-valuetext=\"text\"\n :aria-labelledby=\"labelledBy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"forwardedAttrs\"\n >\n <span\n v-for=\"segment in segmentCount\"\n :key=\"segment\"\n class=\"v-meter-segment\"\n :style=\"{ '--meter-segment-fill': String(segmentFill(segment - 1)) }\"\n >\n <span class=\"v-meter-fill\" />\n </span>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-meter {\n --meter-thickness: var(--vectis-control-size-meter-thickness-md);\n /*\n * Fill and track come from the shared tone table. The track takes the soft border rather than\n * the soft background: the empty part must stay visible, since the reading is a proportion.\n */\n --meter-fill: var(--tone-bg-solid);\n --meter-track: var(--tone-border-soft);\n display: flex;\n flex-direction: column;\n gap: var(--vectis-space-1);\n min-inline-size: 0;\n font-family: var(--vectis-text-family);\n }\n\n /* The custom-colour row of the tone table defines no soft border; the tone's would show. */\n .v-meter[data-custom] {\n --meter-track: color-mix(in oklab, var(--custom-color), var(--vectis-color-surface) 70%);\n }\n\n .v-meter[data-size='sm'] {\n --meter-thickness: var(--vectis-control-size-meter-thickness-sm);\n }\n\n .v-meter[data-size='lg'] {\n --meter-thickness: var(--vectis-control-size-meter-thickness-lg);\n }\n\n .v-meter-header {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n column-gap: var(--vectis-space-2);\n }\n\n .v-meter-label {\n color: var(--vectis-color-text);\n font-size: var(--vectis-text-label-size);\n font-weight: var(--vectis-text-label-weight);\n line-height: var(--vectis-text-label-leading);\n }\n\n /* Pushed to the end even without a label before it. */\n .v-meter-value {\n margin-inline-start: auto;\n color: var(--vectis-color-text-muted);\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n font-variant-numeric: tabular-nums;\n }\n\n .v-meter[data-size='sm'] .v-meter-label,\n .v-meter[data-size='sm'] .v-meter-value {\n font-size: var(--vectis-text-caption-size);\n font-weight: var(--vectis-text-caption-weight);\n line-height: var(--vectis-text-caption-leading);\n }\n\n .v-meter-track {\n display: flex;\n gap: var(--vectis-control-size-meter-segment-gap);\n block-size: var(--meter-thickness);\n }\n\n .v-meter-segment {\n position: relative;\n flex: 1 1 0;\n border-radius: var(--vectis-radius-pill);\n background: var(--meter-track);\n }\n\n .v-meter-fill {\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n inline-size: calc(100% * var(--meter-segment-fill));\n border-radius: inherit;\n background: var(--meter-fill);\n /* A logical length rather than a scale, which would have to be undone in right to left. */\n transition:\n inline-size var(--vectis-duration-base) var(--vectis-ease-default),\n background-color var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-meter-fill {\n transition: none;\n }\n }\n\n @media (forced-colors: active) {\n .v-meter-segment {\n forced-color-adjust: none;\n background: Canvas;\n box-shadow: inset 0 0 0 var(--vectis-control-border-width) CanvasText;\n }\n\n .v-meter-fill {\n background: Highlight;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { useLocale as e, useMessages as t } from "../../i18n/state.js";
2
+ import { customColorStyle as n } from "../../utils/css.js";
3
+ import { clamp as r } from "../../utils/number.js";
4
+ import { useAriaLabel as i } from "../../composables/useAriaLabel.js";
5
+ import { useRootAttrs as a } from "../../composables/useRootAttrs.js";
6
+ import { Fragment as o, computed as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, defineComponent as d, mergeProps as f, normalizeClass as p, normalizeStyle as m, openBlock as h, renderList as g, toDisplayString as _, unref as v, useId as y } from "vue";
7
+ //#region src/components/VMeter/VMeter.vue?vue&type=script&setup=true&lang.ts
8
+ var b = [
9
+ "data-tone",
10
+ "data-custom",
11
+ "data-level",
12
+ "data-size"
13
+ ], x = {
14
+ key: 0,
15
+ class: "v-meter-header"
16
+ }, S = ["id"], C = {
17
+ key: 1,
18
+ class: "v-meter-value",
19
+ "aria-hidden": "true"
20
+ }, w = ["id"], T = [
21
+ "aria-valuenow",
22
+ "aria-valuemin",
23
+ "aria-valuemax",
24
+ "aria-valuetext",
25
+ "aria-labelledby",
26
+ "aria-label"
27
+ ], E = /*@__PURE__*/ d({
28
+ inheritAttrs: !1,
29
+ __name: "VMeter",
30
+ props: {
31
+ value: { default: 0 },
32
+ min: { default: 0 },
33
+ max: { default: 100 },
34
+ low: { default: void 0 },
35
+ high: { default: void 0 },
36
+ optimum: { default: void 0 },
37
+ label: { default: void 0 },
38
+ hideLabel: {
39
+ type: Boolean,
40
+ default: !1
41
+ },
42
+ valueText: { default: void 0 },
43
+ formatOptions: { default: void 0 },
44
+ hideValue: {
45
+ type: Boolean,
46
+ default: !1
47
+ },
48
+ tone: { default: void 0 },
49
+ color: { default: void 0 },
50
+ segments: { default: 1 },
51
+ size: { default: "md" }
52
+ },
53
+ setup(d) {
54
+ let E = d, { attrs: D, rootClass: O, rootStyle: k, forwardedAttrs: A } = a(), j = t(), M = e(), N = y(), P = s(() => {
55
+ let e = Number.isFinite(E.min) ? E.min : 0, t = Number.isFinite(E.max) ? Math.max(E.max, e) : Math.max(100, e), n = (e, n, i) => e === void 0 || Number.isNaN(e) ? i : r(e, n, t), i = n(E.low, e, e);
56
+ return {
57
+ min: e,
58
+ max: t,
59
+ value: n(E.value, e, e),
60
+ low: i,
61
+ high: n(E.high, i, t),
62
+ optimum: n(E.optimum, e, (e + t) / 2)
63
+ };
64
+ }), F = s(() => {
65
+ let { min: e, max: t, value: n } = P.value;
66
+ return t > e ? (n - e) / (t - e) : 0;
67
+ }), I = s(() => {
68
+ let { value: e, low: t, high: n, optimum: r } = P.value;
69
+ return r >= t && r <= n ? e >= t && e <= n ? "optimum" : "suboptimal" : r < t ? e < t ? "optimum" : e <= n ? "suboptimal" : "poor" : e > n ? "optimum" : e >= t ? "suboptimal" : "poor";
70
+ }), L = {
71
+ optimum: "success",
72
+ suboptimal: "warning",
73
+ poor: "danger"
74
+ }, R = s(() => E.tone ? E.tone : E.low !== void 0 || E.high !== void 0 || E.optimum !== void 0 ? L[I.value] : "accent"), z = s(() => E.valueText === void 0 ? E.formatOptions ? new Intl.NumberFormat(M.value, E.formatOptions).format(P.value.value) : j.value.progress.percent(Math.round(F.value * 100)) : E.valueText), B = s(() => Number.isFinite(E.segments) ? Math.max(1, Math.floor(E.segments)) : 1), V = (e) => r(F.value * B.value - e, 0, 1), H = i(() => E.label ? void 0 : j.value.meter.label), U = s(() => E.label && D["aria-label"] == null && D["aria-labelledby"] == null ? N : void 0);
75
+ return (e, t) => (h(), l("div", {
76
+ class: p(["v-meter v-tone", v(O)]),
77
+ style: m([v(n)(d.color), v(k)]),
78
+ "data-tone": R.value,
79
+ "data-custom": d.color === void 0 ? void 0 : "",
80
+ "data-level": I.value,
81
+ "data-size": d.size
82
+ }, [
83
+ d.label && !d.hideLabel || !d.hideValue ? (h(), l("div", x, [d.label && !d.hideLabel ? (h(), l("span", {
84
+ key: 0,
85
+ id: v(N),
86
+ class: "v-meter-label"
87
+ }, _(d.label), 9, S)) : c("", !0), d.hideValue ? c("", !0) : (h(), l("span", C, _(z.value), 1))])) : c("", !0),
88
+ d.label && d.hideLabel ? (h(), l("span", {
89
+ key: 1,
90
+ id: v(N),
91
+ class: "v-visually-hidden"
92
+ }, _(d.label), 9, w)) : c("", !0),
93
+ u("div", f({
94
+ class: "v-meter-track",
95
+ role: "meter",
96
+ "aria-valuenow": P.value.value,
97
+ "aria-valuemin": P.value.min,
98
+ "aria-valuemax": P.value.max,
99
+ "aria-valuetext": z.value,
100
+ "aria-labelledby": U.value,
101
+ "aria-label": v(H)
102
+ }, v(A)), [(h(!0), l(o, null, g(B.value, (e) => (h(), l("span", {
103
+ key: e,
104
+ class: "v-meter-segment",
105
+ style: m({ "--meter-segment-fill": String(V(e - 1)) })
106
+ }, [...t[0] ||= [u("span", { class: "v-meter-fill" }, null, -1)]], 4))), 128))], 16, T)
107
+ ], 14, b));
108
+ }
109
+ });
110
+ //#endregion
111
+ export { E as default };
112
+
113
+ //# sourceMappingURL=VMeter.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VMeter.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VMeter/VMeter.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @a11y\n/**\n * A measurement within a known range, drawn in CSS under the `meter` role. The native `<meter>`\n * is styled only through vendor pseudo-elements, which need one rule set per engine, does not\n * transition its fill in Firefox and cannot be split into segments; the role carries the same\n * semantics. As with the native element, `low`, `high` and `optimum` place the value in a\n * region, which picks the tone.\n */\nimport { computed, useId } from 'vue'\n\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useLocale, useMessages } from '../../i18n/state'\nimport { customColorStyle } from '../../utils/css'\nimport { clamp } from '../../utils/number'\n\n/** The colour of the fill, which replaces the one chosen from `low`, `high` and `optimum`. */\nexport type MeterTone = 'accent' | 'neutral' | 'success' | 'warning' | 'danger'\n\n/** The thickness of the bar, 4, 8 or 12 pixels, and the size of the text above it. */\nexport type MeterSize = 'sm' | 'md' | 'lg'\n\ninterface MeterProps {\n /** The measurement. Anything outside the range is brought back into it. */\n value?: number\n /** The lower bound of the range. */\n min?: number\n /** The upper bound of the range. A bound below `min` is raised to it. */\n max?: number\n /**\n * The upper end of the low part of the range. With `high` and `optimum`, it decides whether\n * the value is good, average or poor, which colours the bar.\n */\n low?: number\n /** The lower end of the high part of the range. */\n high?: number\n /**\n * The best value. In the low part, low values are good; in the high part, high values are;\n * between `low` and `high`, the middle is good and both ends are average.\n */\n optimum?: number\n /**\n * What is measured, shown above the bar and naming it for screen readers. Without it, the bar\n * is named from the design system dictionary; an `aria-label` or `aria-labelledby` of your own\n * takes precedence.\n */\n label?: string\n /** Hides the label visually. It still names the bar for screen readers. */\n hideLabel?: boolean\n /**\n * The value as written above the bar and read by screen readers, such as \"7.2 GB of 10 GB\" or\n * \"Strong\". It replaces the formatted value.\n */\n valueText?: string\n /**\n * Formats the value for the current locale, such as a unit or a currency. Without it, the\n * value is written as a percentage of the range.\n */\n formatOptions?: Intl.NumberFormatOptions\n /** Hides the value visually. Screen readers still read it from the bar. */\n hideValue?: boolean\n /**\n * The colour of the fill. Without it, the region of the value picks one when `low`, `high` or\n * `optimum` is set: success, warning or danger; otherwise the accent.\n */\n tone?: MeterTone\n /**\n * A colour of your own (hex, CSS name or `oklch()`), which replaces the tone. The track is\n * derived from it against the theme.\n */\n color?: string\n /** Splits the bar into this many equal parts, for a strength or a battery level. */\n segments?: number\n /** The thickness of the bar and the size of the text above it. */\n size?: MeterSize\n}\n\n// The root only lays out the text and the bar: the consumer's ARIA and other attributes belong\n// on the element carrying the role.\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<MeterProps>(), {\n value: 0,\n min: 0,\n max: 100,\n low: undefined,\n high: undefined,\n optimum: undefined,\n label: undefined,\n hideLabel: false,\n valueText: undefined,\n formatOptions: undefined,\n hideValue: false,\n // Deliberately undefined: the region of the value then picks the tone.\n tone: undefined,\n color: undefined,\n segments: 1,\n size: 'md',\n})\n\nconst { attrs, rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst locale = useLocale()\nconst labelId = useId()\n\n/* The normalization of the HTML `<meter>`: the bounds first, then each point brought into\n them, `high` never below `low`. A value that is not a number reads as the minimum. */\nconst range = computed(() => {\n const min = Number.isFinite(props.min) ? props.min : 0\n const max = Number.isFinite(props.max) ? Math.max(props.max, min) : Math.max(100, min)\n const fit = (point: number | undefined, from: number, fallback: number) =>\n point === undefined || Number.isNaN(point) ? fallback : clamp(point, from, max)\n const low = fit(props.low, min, min)\n return {\n min,\n max,\n value: fit(props.value, min, min),\n low,\n high: fit(props.high, low, max),\n optimum: fit(props.optimum, min, (min + max) / 2),\n }\n})\n\nconst fraction = computed(() => {\n const { min, max, value } = range.value\n return max > min ? (value - min) / (max - min) : 0\n})\n\n// @core\n// The regions of the HTML `<meter>`, with the boundaries Chromium draws: the part holding the\n// optimum is good, the part next to it average, and the far part, when the optimum sits beyond\n// `low` or `high`, poor.\nconst level = computed<'optimum' | 'suboptimal' | 'poor'>(() => {\n const { value, low, high, optimum } = range.value\n if (optimum >= low && optimum <= high)\n return value >= low && value <= high ? 'optimum' : 'suboptimal'\n if (optimum < low) return value < low ? 'optimum' : value <= high ? 'suboptimal' : 'poor'\n return value > high ? 'optimum' : value >= low ? 'suboptimal' : 'poor'\n})\n\nconst LEVEL_TONES = { optimum: 'success', suboptimal: 'warning', poor: 'danger' } as const\n\nconst resolvedTone = computed<MeterTone>(() => {\n if (props.tone) return props.tone\n const graded = props.low !== undefined || props.high !== undefined || props.optimum !== undefined\n return graded ? LEVEL_TONES[level.value] : 'accent'\n})\n\nconst text = computed(() => {\n if (props.valueText !== undefined) return props.valueText\n if (props.formatOptions)\n return new Intl.NumberFormat(locale.value, props.formatOptions).format(range.value.value)\n return m.value.progress.percent(Math.round(fraction.value * 100))\n})\n\nconst segmentCount = computed(() =>\n Number.isFinite(props.segments) ? Math.max(1, Math.floor(props.segments)) : 1,\n)\n\n/** How much of segment `index` is filled, from 0 to 1. */\nconst segmentFill = (index: number) => clamp(fraction.value * segmentCount.value - index, 0, 1)\n\n// @a11y\n// A visible label names the bar by reference, unless the consumer named it themselves; without\n// one, the dictionary does.\nconst ariaLabel = useAriaLabel(() => (props.label ? undefined : m.value.meter.label))\nconst labelledBy = computed(() =>\n props.label && attrs['aria-label'] == null && attrs['aria-labelledby'] == null\n ? labelId\n : undefined,\n)\n</script>\n\n<template>\n <div\n class=\"v-meter v-tone\"\n :class=\"rootClass\"\n :style=\"[customColorStyle(color), rootStyle]\"\n :data-tone=\"resolvedTone\"\n :data-custom=\"color !== undefined ? '' : undefined\"\n :data-level=\"level\"\n :data-size=\"size\"\n >\n <div v-if=\"(label && !hideLabel) || !hideValue\" class=\"v-meter-header\">\n <span v-if=\"label && !hideLabel\" :id=\"labelId\" class=\"v-meter-label\">{{ label }}</span>\n <!-- Read from the bar's `aria-valuetext`, so hidden here to avoid reading it twice. -->\n <span v-if=\"!hideValue\" class=\"v-meter-value\" aria-hidden=\"true\">{{ text }}</span>\n </div>\n <span v-if=\"label && hideLabel\" :id=\"labelId\" class=\"v-visually-hidden\">{{ label }}</span>\n <div\n class=\"v-meter-track\"\n role=\"meter\"\n :aria-valuenow=\"range.value\"\n :aria-valuemin=\"range.min\"\n :aria-valuemax=\"range.max\"\n :aria-valuetext=\"text\"\n :aria-labelledby=\"labelledBy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"forwardedAttrs\"\n >\n <span\n v-for=\"segment in segmentCount\"\n :key=\"segment\"\n class=\"v-meter-segment\"\n :style=\"{ '--meter-segment-fill': String(segmentFill(segment - 1)) }\"\n >\n <span class=\"v-meter-fill\" />\n </span>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-meter {\n --meter-thickness: var(--vectis-control-size-meter-thickness-md);\n /*\n * Fill and track come from the shared tone table. The track takes the soft border rather than\n * the soft background: the empty part must stay visible, since the reading is a proportion.\n */\n --meter-fill: var(--tone-bg-solid);\n --meter-track: var(--tone-border-soft);\n display: flex;\n flex-direction: column;\n gap: var(--vectis-space-1);\n min-inline-size: 0;\n font-family: var(--vectis-text-family);\n }\n\n /* The custom-colour row of the tone table defines no soft border; the tone's would show. */\n .v-meter[data-custom] {\n --meter-track: color-mix(in oklab, var(--custom-color), var(--vectis-color-surface) 70%);\n }\n\n .v-meter[data-size='sm'] {\n --meter-thickness: var(--vectis-control-size-meter-thickness-sm);\n }\n\n .v-meter[data-size='lg'] {\n --meter-thickness: var(--vectis-control-size-meter-thickness-lg);\n }\n\n .v-meter-header {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n column-gap: var(--vectis-space-2);\n }\n\n .v-meter-label {\n color: var(--vectis-color-text);\n font-size: var(--vectis-text-label-size);\n font-weight: var(--vectis-text-label-weight);\n line-height: var(--vectis-text-label-leading);\n }\n\n /* Pushed to the end even without a label before it. */\n .v-meter-value {\n margin-inline-start: auto;\n color: var(--vectis-color-text-muted);\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n font-variant-numeric: tabular-nums;\n }\n\n .v-meter[data-size='sm'] .v-meter-label,\n .v-meter[data-size='sm'] .v-meter-value {\n font-size: var(--vectis-text-caption-size);\n font-weight: var(--vectis-text-caption-weight);\n line-height: var(--vectis-text-caption-leading);\n }\n\n .v-meter-track {\n display: flex;\n gap: var(--vectis-control-size-meter-segment-gap);\n block-size: var(--meter-thickness);\n }\n\n .v-meter-segment {\n position: relative;\n flex: 1 1 0;\n border-radius: var(--vectis-radius-pill);\n background: var(--meter-track);\n }\n\n .v-meter-fill {\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n inline-size: calc(100% * var(--meter-segment-fill));\n border-radius: inherit;\n background: var(--meter-fill);\n /* A logical length rather than a scale, which would have to be undone in right to left. */\n transition:\n inline-size var(--vectis-duration-base) var(--vectis-ease-default),\n background-color var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-meter-fill {\n transition: none;\n }\n }\n\n @media (forced-colors: active) {\n .v-meter-segment {\n forced-color-adjust: none;\n background: Canvas;\n box-shadow: inset 0 0 0 var(--vectis-control-border-width) CanvasText;\n }\n\n .v-meter-fill {\n background: Highlight;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkFA,IAAM,IAAQ,GAmBR,EAAE,UAAO,cAAW,cAAW,sBAAmB,EAAa,GAC/D,IAAI,EAAY,GAChB,IAAS,EAAU,GACnB,IAAU,EAAM,GAIhB,IAAQ,QAAe;GAC3B,IAAM,IAAM,OAAO,SAAS,EAAM,GAAG,IAAI,EAAM,MAAM,GAC/C,IAAM,OAAO,SAAS,EAAM,GAAG,IAAI,KAAK,IAAI,EAAM,KAAK,CAAG,IAAI,KAAK,IAAI,KAAK,CAAG,GAC/E,KAAO,GAA2B,GAAc,MACpD,MAAU,KAAA,KAAa,OAAO,MAAM,CAAK,IAAI,IAAW,EAAM,GAAO,GAAM,CAAG,GAC1E,IAAM,EAAI,EAAM,KAAK,GAAK,CAAG;GACnC,OAAO;IACL;IACA;IACA,OAAO,EAAI,EAAM,OAAO,GAAK,CAAG;IAChC;IACA,MAAM,EAAI,EAAM,MAAM,GAAK,CAAG;IAC9B,SAAS,EAAI,EAAM,SAAS,IAAM,IAAM,KAAO,CAAC;GAClD;EACF,CAAC,GAEK,IAAW,QAAe;GAC9B,IAAM,EAAE,QAAK,QAAK,aAAU,EAAM;GAClC,OAAO,IAAM,KAAO,IAAQ,MAAQ,IAAM,KAAO;EACnD,CAAC,GAMK,IAAQ,QAAkD;GAC9D,IAAM,EAAE,UAAO,QAAK,SAAM,eAAY,EAAM;GAI5C,OAHI,KAAW,KAAO,KAAW,IACxB,KAAS,KAAO,KAAS,IAAO,YAAY,eACjD,IAAU,IAAY,IAAQ,IAAM,YAAY,KAAS,IAAO,eAAe,SAC5E,IAAQ,IAAO,YAAY,KAAS,IAAM,eAAe;EAClE,CAAC,GAEK,IAAc;GAAE,SAAS;GAAW,YAAY;GAAW,MAAM;EAAS,GAE1E,IAAe,QACf,EAAM,OAAa,EAAM,OACd,EAAM,QAAQ,KAAA,KAAa,EAAM,SAAS,KAAA,KAAa,EAAM,YAAY,KAAA,IACxE,EAAY,EAAM,SAAS,QAC5C,GAEK,IAAO,QACP,EAAM,cAAc,KAAA,IACpB,EAAM,gBACD,IAAI,KAAK,aAAa,EAAO,OAAO,EAAM,aAAa,CAAC,CAAC,OAAO,EAAM,MAAM,KAAK,IACnF,EAAE,MAAM,SAAS,QAAQ,KAAK,MAAM,EAAS,QAAQ,GAAG,CAAC,IAHtB,EAAM,SAIjD,GAEK,IAAe,QACnB,OAAO,SAAS,EAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,EAAM,QAAQ,CAAC,IAAI,CAC9E,GAGM,KAAe,MAAkB,EAAM,EAAS,QAAQ,EAAa,QAAQ,GAAO,GAAG,CAAC,GAKxF,IAAY,QAAoB,EAAM,QAAQ,KAAA,IAAY,EAAE,MAAM,MAAM,KAAM,GAC9E,IAAa,QACjB,EAAM,SAAS,EAAM,iBAAiB,QAAQ,EAAM,sBAAsB,OACtE,IACA,KAAA,CACN;yBAIE,EAmCM,OAAA;GAlCJ,OAAK,EAAA,CAAC,kBACE,EAAA,CAAA,CAAS,CAAA;GAChB,OAAK,EAAA,CAAG,EAAA,CAAA,CAAgB,CAAC,EAAA,KAAK,GAAG,EAAA,CAAA,CAAS,CAAA;GAC1C,aAAW,EAAA;GACX,eAAa,EAAA,UAAU,KAAA,IAAiB,KAAA,IAAR;GAChC,cAAY,EAAA;GACZ,aAAW,EAAA;;GAEA,EAAA,SAAK,CAAK,EAAA,aAAS,CAAM,EAAA,aAAA,EAAA,GAArC,EAIM,OAJN,GAIM,CAHQ,EAAA,SAAK,CAAK,EAAA,aAAA,EAAA,GAAtB,EAAuF,QAAA;;IAArD,IAAI,EAAA,CAAA;IAAS,OAAM;QAAmB,EAAA,KAAK,GAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,GAEhE,EAAA,YAA2D,EAAA,IAAA,EAAA,KAA3D,EAAA,GAAb,EAAkF,QAAlF,GAAkF,EAAd,EAAA,KAAI,GAAA,CAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA;GAE9D,EAAA,SAAS,EAAA,aAAA,EAAA,GAArB,EAA0F,QAAA;;IAAzD,IAAI,EAAA,CAAA;IAAS,OAAM;QAAuB,EAAA,KAAK,GAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA;GAChF,EAmBM,OAnBN,EAmBM;IAlBJ,OAAM;IACN,MAAK;IACJ,iBAAe,EAAA,MAAM;IACrB,iBAAe,EAAA,MAAM;IACrB,iBAAe,EAAA,MAAM;IACrB,kBAAgB,EAAA;IAChB,mBAAiB,EAAA;IACjB,cAAY,EAAA,CAAA;MACL,EAAA,CAAA,CAAc,GAAA,EAAA,EAAA,EAAA,GAEtB,EAOO,GAAA,MAAA,EANa,EAAA,QAAX,YADT,EAOO,QAAA;IALJ,KAAK;IACN,OAAM;IACL,OAAK,EAAA,EAAA,wBAA4B,OAAO,EAAY,IAAO,CAAA,CAAA,EAAA,CAAA;oBAE5D,EAA6B,QAAA,EAAvB,OAAM,eAAc,GAAA,MAAA,EAAA,CAAA,CAAA,GAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-number-input .v-input-control{font-variant-numeric:tabular-nums}.v-number-input .v-input-control[data-controls=split]{text-align:center}.v-separator[data-orientation=vertical].v-number-input-divider{block-size:var(--control-action-size);align-self:center}.v-number-input-step:disabled{color:var(--vectis-color-text-subtle);cursor:not-allowed}.v-number-input-stack{--vectis-icon-size:calc((var(--control-height) - 2px) / 2);border-inline-start:1px solid var(--vectis-color-border);flex-direction:column;align-self:stretch;display:flex}.v-number-input-stack:last-child{margin-inline-end:calc(-1 * var(--control-padding-inline-field))}.v-number-input-stack:not(:last-child){border-inline-end:1px solid var(--vectis-color-border)}.v-number-input-stack>.v-number-input-step{block-size:auto;inline-size:var(--control-action-size);border-radius:0;flex:1 1 0;margin:0}.v-number-input-stack>.v-number-input-step+.v-number-input-step{border-block-start:1px solid var(--vectis-color-border)}}
@@ -0,0 +1,114 @@
1
+ import { FieldLabelPosition } from '../VField/VField.js';
2
+ import { InputSize } from '../VInput/VInput.js';
3
+ /**
4
+ * Where the step buttons sit: a minus at the start and a plus at the end, both stacked at the
5
+ * end, or none.
6
+ */
7
+ export type NumberInputControls = 'split' | 'stacked' | 'none';
8
+ interface NumberInputProps {
9
+ /** The smallest value. A typed value below it is raised to it when committed. */
10
+ min?: number;
11
+ /** The largest value. A typed value above it is lowered to it when committed. */
12
+ max?: number;
13
+ /**
14
+ * How far the arrow keys and the buttons move the value, on a grid that starts at `min`, or at
15
+ * 0 without one. Page Up and Page Down move it ten steps.
16
+ */
17
+ step?: number;
18
+ /**
19
+ * How the value is shown while the field is not being edited: the options of
20
+ * `Intl.NumberFormat`, for a currency, a unit, a percentage or a number of decimals. With
21
+ * `style: 'percent'`, the value 0.25 shows and is typed as 25.
22
+ */
23
+ formatOptions?: Intl.NumberFormatOptions;
24
+ /** The locale the number is written and read in. It defaults to the design system's. */
25
+ locale?: string;
26
+ /** Where the step buttons sit. Whatever their place, they stay out of the tab order. */
27
+ controls?: NumberInputControls;
28
+ /** What the plus button does, in words. It falls back to the design system dictionary. */
29
+ incrementLabel?: string;
30
+ /** What the minus button does, in words. It falls back to the design system dictionary. */
31
+ decrementLabel?: string;
32
+ /** The height of the field: 32, 40 or 48 pixels. */
33
+ size?: InputSize;
34
+ /** Takes 4px off the height. */
35
+ compact?: boolean;
36
+ /** The label above the field, tied to it. */
37
+ label?: string;
38
+ /** A line of help under the field, read out along with the label. */
39
+ hint?: string;
40
+ /**
41
+ * A message saying what is wrong with the value, shown in place of the hint. It marks the
42
+ * field invalid and is announced when it appears or changes.
43
+ */
44
+ error?: string;
45
+ /** Marks the field as required: an asterisk follows the label, and the field is `required`. */
46
+ required?: boolean;
47
+ /** Hides the label visually. It still names the field for assistive technology. */
48
+ hideLabel?: boolean;
49
+ /**
50
+ * Where the label sits: above the field (`top`, the default), or at its start, in a column of
51
+ * its own, moving back above when there is not room for both.
52
+ */
53
+ labelPosition?: FieldLabelPosition;
54
+ /** Marks the field as invalid whatever the browser thinks. */
55
+ invalid?: boolean;
56
+ /** Makes the field unusable, greyed out through the colour tokens. */
57
+ disabled?: boolean;
58
+ /** Shows the value without allowing it to be changed, by typing or by stepping. */
59
+ readonly?: boolean;
60
+ /** Offers a cross that empties the field, setting the value to `null`. */
61
+ clearable?: boolean;
62
+ /** What the clear button does, in words. It falls back to the design system dictionary. */
63
+ clearLabel?: string;
64
+ /** Shows a spinner at the end of the field. */
65
+ loading?: boolean;
66
+ /** What screen readers announce while the spinner turns. */
67
+ loadingText?: string;
68
+ }
69
+ type __VLS_Props = NumberInputProps;
70
+ type __VLS_ModelProps = {
71
+ /** The value, `null` while the field is empty. */
72
+ modelValue?: number | null;
73
+ };
74
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
75
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {
76
+ /** Moves the focus to the real input. */
77
+ focus: (options?: FocusOptions) => void | undefined;
78
+ /** Selects everything in the field. */
79
+ select: () => void | undefined;
80
+ /** The real `<input>`. */
81
+ el: import('vue').ComputedRef<HTMLInputElement | null>;
82
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
83
+ clear: () => any;
84
+ "update:modelValue": (value: number | null) => any;
85
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
86
+ onClear?: (() => any) | undefined;
87
+ "onUpdate:modelValue"?: ((value: number | null) => any) | undefined;
88
+ }>, {
89
+ loading: boolean;
90
+ label: string;
91
+ error: string;
92
+ size: InputSize;
93
+ compact: boolean;
94
+ disabled: boolean;
95
+ required: boolean;
96
+ step: number;
97
+ controls: NumberInputControls;
98
+ invalid: boolean;
99
+ hint: string;
100
+ hideLabel: boolean;
101
+ labelPosition: FieldLabelPosition;
102
+ readonly: boolean;
103
+ loadingText: string;
104
+ clearable: boolean;
105
+ clearLabel: string;
106
+ min: number;
107
+ max: number;
108
+ formatOptions: Intl.NumberFormatOptions;
109
+ locale: string;
110
+ incrementLabel: string;
111
+ decrementLabel: string;
112
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
113
+ declare const _default: typeof __VLS_export;
114
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import './VNumberInput.css';
2
+ import e from "./VNumberInput.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VNumberInput/VNumberInput.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VNumberInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VNumberInput.js","names":[],"sources":["../../../src/components/VNumberInput/VNumberInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @a11y @core\n/**\n * A text field announced as a spinbutton rather than a native number input: only a text field\n * can show a number formatted for its locale (separators, currency, unit, percent), which\n * `type=\"number\"` refuses. The keyboard of a spinbutton, the parsing and the stepping are\n * therefore rebuilt here; the typed value is committed on blur and on Enter, so that a minimum\n * never interrupts the typing of a number that would have reached it.\n */\nimport { computed, inject, ref, useAttrs, watch } from 'vue'\n\nimport VIcon from '../VIcon/VIcon.vue'\nimport { add as addIcon } from '../VIcon/icons/add'\nimport { expand_less as expandLessIcon } from '../VIcon/icons/expand_less'\nimport { expand_more as expandMoreIcon } from '../VIcon/icons/expand_more'\nimport { remove as removeIcon } from '../VIcon/icons/remove'\nimport type { FieldLabelPosition } from '../VField/VField.vue'\nimport VInput from '../VInput/VInput.vue'\nimport type { InputSize } from '../VInput/VInput.vue'\nimport { inputGroupKey } from '../VInput/context'\nimport VSeparator from '../VSeparator/VSeparator.vue'\n\nimport { canClear } from '../../composables/useClearable'\nimport { partitionAttrs } from '../../utils/attrs'\nimport { useControlShape } from '../../composables/useControlShape'\nimport { useMessages, useResolvedLocale } from '../../i18n/state'\n\nimport { clamp, numberSeparators, parseNumber, scale, stepValue } from './number'\n\n/**\n * Where the step buttons sit: a minus at the start and a plus at the end, both stacked at the\n * end, or none.\n */\nexport type NumberInputControls = 'split' | 'stacked' | 'none'\n\ninterface NumberInputProps {\n /** The smallest value. A typed value below it is raised to it when committed. */\n min?: number\n /** The largest value. A typed value above it is lowered to it when committed. */\n max?: number\n /**\n * How far the arrow keys and the buttons move the value, on a grid that starts at `min`, or at\n * 0 without one. Page Up and Page Down move it ten steps.\n */\n step?: number\n /**\n * How the value is shown while the field is not being edited: the options of\n * `Intl.NumberFormat`, for a currency, a unit, a percentage or a number of decimals. With\n * `style: 'percent'`, the value 0.25 shows and is typed as 25.\n */\n formatOptions?: Intl.NumberFormatOptions\n /** The locale the number is written and read in. It defaults to the design system's. */\n locale?: string\n /** Where the step buttons sit. Whatever their place, they stay out of the tab order. */\n controls?: NumberInputControls\n /** What the plus button does, in words. It falls back to the design system dictionary. */\n incrementLabel?: string\n /** What the minus button does, in words. It falls back to the design system dictionary. */\n decrementLabel?: string\n /** The height of the field: 32, 40 or 48 pixels. */\n size?: InputSize\n /** Takes 4px off the height. */\n compact?: boolean\n /** The label above the field, tied to it. */\n label?: string\n /** A line of help under the field, read out along with the label. */\n hint?: string\n /**\n * A message saying what is wrong with the value, shown in place of the hint. It marks the\n * field invalid and is announced when it appears or changes.\n */\n error?: string\n /** Marks the field as required: an asterisk follows the label, and the field is `required`. */\n required?: boolean\n /** Hides the label visually. It still names the field for assistive technology. */\n hideLabel?: boolean\n /**\n * Where the label sits: above the field (`top`, the default), or at its start, in a column of\n * its own, moving back above when there is not room for both.\n */\n labelPosition?: FieldLabelPosition\n /** Marks the field as invalid whatever the browser thinks. */\n invalid?: boolean\n /** Makes the field unusable, greyed out through the colour tokens. */\n disabled?: boolean\n /** Shows the value without allowing it to be changed, by typing or by stepping. */\n readonly?: boolean\n /** Offers a cross that empties the field, setting the value to `null`. */\n clearable?: boolean\n /** What the clear button does, in words. It falls back to the design system dictionary. */\n clearLabel?: string\n /** Shows a spinner at the end of the field. */\n loading?: boolean\n /** What screen readers announce while the spinner turns. */\n loadingText?: string\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<NumberInputProps>(), {\n min: undefined,\n max: undefined,\n step: 1,\n formatOptions: undefined,\n locale: undefined,\n controls: 'split',\n incrementLabel: undefined,\n decrementLabel: undefined,\n size: 'md',\n compact: false,\n label: undefined,\n hint: undefined,\n error: undefined,\n required: false,\n hideLabel: false,\n labelPosition: 'top',\n invalid: false,\n disabled: false,\n readonly: false,\n clearable: false,\n clearLabel: undefined,\n loading: false,\n loadingText: undefined,\n})\n\nconst emit = defineEmits<{\n /** The clear button was pressed. The value is already `null`. */\n clear: []\n}>()\n\n/** The value, `null` while the field is empty. */\nconst model = defineModel<number | null>({ default: null })\n\nconst m = useMessages()\nconst resolvedLocale = useResolvedLocale(() => props.locale)\nconst incrementText = computed(() => props.incrementLabel ?? m.value.numberInput.increment)\nconst decrementText = computed(() => props.decrementLabel ?? m.value.numberInput.decrement)\n\nconst group = inject(inputGroupKey, null)\nconst { disabled: resolvedDisabled } = useControlShape(props, group)\n\n// @a11y\n// Everything goes down to VInput, which keeps `class` and `style` on its wrapper; except `name`\n// and `form`, which move to a hidden input carrying the bare number: the visible field holds\n// formatted text (\"1 234,50 €\"), which is not what a form should submit.\nconst attrs = useAttrs()\nconst split = computed(() => partitionAttrs(attrs, ['name', 'form']))\nconst fieldAttrs = computed(() => split.value.rest)\nconst formName = computed(() => split.value.picked.name as string | undefined)\nconst formOwner = computed(() => split.value.picked.form as string | undefined)\n\nconst percent = computed(() => props.formatOptions?.style === 'percent')\nconst separators = computed(() => numberSeparators(resolvedLocale.value))\nconst displayFormat = computed(\n () => new Intl.NumberFormat(resolvedLocale.value, props.formatOptions),\n)\n// The value as it is edited: no grouping, no symbol, every decimal it has.\nconst editFormat = computed(\n () =>\n new Intl.NumberFormat(resolvedLocale.value, {\n useGrouping: false,\n maximumFractionDigits: 20,\n }),\n)\n\nconst display = (value: number | null) => (value === null ? '' : displayFormat.value.format(value))\nconst editable = (value: number | null) =>\n value === null ? '' : editFormat.value.format(percent.value ? scale(value, 100) : value)\n\n/** What was typed, read as a value: `null` when empty, `NaN` when not a number. */\nfunction typedValue(): number | null {\n const value = parseNumber(text.value, separators.value)\n return value === null || Number.isNaN(value) || !percent.value ? value : scale(value, 0.01)\n}\n\nconst inputRef = ref<InstanceType<typeof VInput> | null>(null)\nconst hiddenEl = ref<HTMLInputElement | null>(null)\nconst focused = ref(false)\nconst text = ref(display(model.value))\n\nfunction syncText() {\n text.value = focused.value ? editable(model.value) : display(model.value)\n}\n\nwatch([model, displayFormat, editFormat], syncText)\n\nfunction setValue(value: number | null) {\n model.value = value\n syncText()\n // @core\n // Enter submits a form as the default action of the very keydown that commits the value,\n // before Vue renders: the hidden input is written now, or the previous number is submitted.\n if (hiddenEl.value) hiddenEl.value.value = value === null ? '' : String(value)\n}\n\n/** Commits what was typed: empty is `null`, a number is kept within bounds, text is undone. */\nfunction commit() {\n const value = typedValue()\n if (Number.isNaN(value)) syncText()\n else setValue(value === null ? null : clamp(value, props.min, props.max))\n}\n\nconst editableField = computed(() => !resolvedDisabled.value && !props.readonly)\n/**\n * Whether the field's own controls follow the plus button: the clear cross, which VInput shows by\n * the same rule, or the spinner. A rule then sets the plus apart from them.\n */\nconst endControls = computed(\n () => props.loading || canClear(props, resolvedDisabled.value, text.value !== ''),\n)\nconst atMin = computed(\n () => model.value !== null && props.min !== undefined && model.value <= props.min,\n)\nconst atMax = computed(\n () => model.value !== null && props.max !== undefined && model.value >= props.max,\n)\n\n/**\n * Moves the value by a number of steps, from what is typed when it reads as a number. An empty\n * field starts from 0, or from the nearest bound when 0 is out of range.\n */\nfunction stepBy(steps: number) {\n if (!editableField.value) return\n const typed = focused.value ? typedValue() : model.value\n const current = typed === null || Number.isNaN(typed) ? model.value : typed\n if (current === null) return setValue(clamp(0, props.min, props.max))\n const step = props.step > 0 ? props.step : 1\n setValue(clamp(stepValue(current, steps, step, props.min ?? 0), props.min, props.max))\n}\n\n// @keyboard\n// The keys of the APG spinbutton. Home and End only take a value when there is a bound to go\n// to; otherwise they keep moving the caret, as in any text field.\nfunction onKeydown(event: KeyboardEvent) {\n if (event.altKey || event.ctrlKey || event.metaKey) return\n const steps: Record<string, number> = { ArrowUp: 1, ArrowDown: -1, PageUp: 10, PageDown: -10 }\n if (event.key in steps) {\n event.preventDefault()\n stepBy(steps[event.key]!)\n } else if (event.key === 'Home' && props.min !== undefined && editableField.value) {\n event.preventDefault()\n setValue(props.min)\n } else if (event.key === 'End' && props.max !== undefined && editableField.value) {\n event.preventDefault()\n setValue(props.max)\n } else if (event.key === 'Enter') {\n commit()\n }\n}\n\nfunction onFocus() {\n focused.value = true\n syncText()\n}\n\nfunction onBlur() {\n focused.value = false\n commit()\n}\n\nfunction onClear() {\n setValue(null)\n emit('clear')\n}\n\ndefineExpose({\n /** Moves the focus to the real input. */\n focus: (options?: FocusOptions) => inputRef.value?.focus(options),\n /** Selects everything in the field. */\n select: () => inputRef.value?.select(),\n /** The real `<input>`. */\n el: computed(() => inputRef.value?.el ?? null),\n})\n</script>\n\n<template>\n <VInput\n ref=\"inputRef\"\n v-model=\"text\"\n class=\"v-number-input\"\n role=\"spinbutton\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n :aria-valuenow=\"model ?? undefined\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuetext=\"model === null ? undefined : display(model)\"\n :data-controls=\"controls\"\n v-bind=\"fieldAttrs\"\n :size=\"size\"\n :compact=\"compact\"\n :label=\"label\"\n :hint=\"hint\"\n :error=\"error\"\n :required=\"required\"\n :hide-label=\"hideLabel\"\n :label-position=\"labelPosition\"\n :invalid=\"invalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :clearable=\"clearable\"\n :clear-label=\"clearLabel\"\n :loading=\"loading\"\n :loading-text=\"loadingText\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n @clear=\"onClear\"\n >\n <!--\n The buttons stay out of the tab order: the arrow keys do what they do, from the field. A\n press does not take the focus either, so the field keeps it while the value moves.\n -->\n <template v-if=\"controls === 'split'\" #start>\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"v-field-action v-number-input-step\"\n :aria-label=\"decrementText\"\n :disabled=\"!editableField || atMin\"\n @mousedown.prevent\n @click=\"stepBy(-1)\"\n >\n <VIcon :name=\"removeIcon\" />\n </button>\n </template>\n <template v-if=\"controls === 'split'\" #value-end>\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"v-field-action v-number-input-step\"\n :aria-label=\"incrementText\"\n :disabled=\"!editableField || atMax\"\n @mousedown.prevent\n @click=\"stepBy(1)\"\n >\n <VIcon :name=\"addIcon\" />\n </button>\n <VSeparator v-if=\"endControls\" orientation=\"vertical\" class=\"v-number-input-divider\" />\n </template>\n <template v-else-if=\"controls === 'stacked'\" #value-end>\n <span class=\"v-number-input-stack\">\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"v-field-action v-number-input-step\"\n :aria-label=\"incrementText\"\n :disabled=\"!editableField || atMax\"\n @mousedown.prevent\n @click=\"stepBy(1)\"\n >\n <VIcon :name=\"expandLessIcon\" />\n </button>\n <button\n type=\"button\"\n tabindex=\"-1\"\n class=\"v-field-action v-number-input-step\"\n :aria-label=\"decrementText\"\n :disabled=\"!editableField || atMin\"\n @mousedown.prevent\n @click=\"stepBy(-1)\"\n >\n <VIcon :name=\"expandMoreIcon\" />\n </button>\n </span>\n </template>\n </VInput>\n <input\n v-if=\"formName\"\n ref=\"hiddenEl\"\n type=\"hidden\"\n :name=\"formName\"\n :form=\"formOwner\"\n :value=\"model ?? ''\"\n :disabled=\"resolvedDisabled\"\n />\n</template>\n\n<style>\n@layer vectis.components {\n .v-number-input .v-input-control {\n font-variant-numeric: tabular-nums;\n }\n\n /* Between a minus and a plus, the number reads as the thing they act on. */\n .v-number-input .v-input-control[data-controls='split'] {\n text-align: center;\n }\n\n /*\n * The rule between the plus button and the field's own controls, as VTimeInput draws after\n * AM/PM: icon height rather than the full height a vertical VSeparator stretches to, which\n * would read as a division of the box rather than a break in the row.\n */\n .v-separator[data-orientation='vertical'].v-number-input-divider {\n align-self: center;\n block-size: var(--control-action-size);\n }\n\n .v-number-input-step:disabled {\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n\n /*\n * The stacked pair fills the field's height, set apart from the value by a divider. Each half\n * takes its icon size from the height it has: the field's, less its two 1px borders.\n */\n .v-number-input-stack {\n --vectis-icon-size: calc((var(--control-height) - 2px) / 2);\n\n display: flex;\n flex-direction: column;\n align-self: stretch;\n border-inline-start: 1px solid var(--vectis-color-border);\n }\n\n /*\n * Last in the field, the pair reaches over the field's padding to its end edge. Followed by the\n * clear cross or the spinner, it stays in the flow and a second divider sets it apart from them.\n */\n .v-number-input-stack:last-child {\n margin-inline-end: calc(-1 * var(--control-padding-inline-field));\n }\n\n .v-number-input-stack:not(:last-child) {\n border-inline-end: 1px solid var(--vectis-color-border);\n }\n\n .v-number-input-stack > .v-number-input-step {\n flex: 1 1 0;\n block-size: auto;\n inline-size: var(--control-action-size);\n margin: 0;\n border-radius: 0;\n }\n\n .v-number-input-stack > .v-number-input-step + .v-number-input-step {\n border-block-start: 1px solid var(--vectis-color-border);\n }\n}\n</style>\n"],"mappings":""}