vectis-ui 0.1.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 (676) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +27 -0
  3. package/README.md +354 -0
  4. package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
  5. package/dist/components/VAccordion/VAccordion.css +2 -0
  6. package/dist/components/VAccordion/VAccordion.d.ts +59 -0
  7. package/dist/components/VAccordion/VAccordion.js +9 -0
  8. package/dist/components/VAccordion/VAccordion.js.map +1 -0
  9. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js +42 -0
  10. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -0
  11. package/dist/components/VAccordion/VAccordionItem.css +2 -0
  12. package/dist/components/VAccordion/VAccordionItem.d.ts +64 -0
  13. package/dist/components/VAccordion/VAccordionItem.js +9 -0
  14. package/dist/components/VAccordion/VAccordionItem.js.map +1 -0
  15. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js +70 -0
  16. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  17. package/dist/components/VAccordion/context.d.ts +18 -0
  18. package/dist/components/VAccordion/context.js +6 -0
  19. package/dist/components/VAccordion/context.js.map +1 -0
  20. package/dist/components/VAvatar/VAvatar.css +2 -0
  21. package/dist/components/VAvatar/VAvatar.d.ts +68 -0
  22. package/dist/components/VAvatar/VAvatar.js +9 -0
  23. package/dist/components/VAvatar/VAvatar.js.map +1 -0
  24. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js +87 -0
  25. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/VAvatar/VAvatarGroup.css +2 -0
  27. package/dist/components/VAvatar/VAvatarGroup.d.ts +59 -0
  28. package/dist/components/VAvatar/VAvatarGroup.js +9 -0
  29. package/dist/components/VAvatar/VAvatarGroup.js.map +1 -0
  30. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +43 -0
  31. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  32. package/dist/components/VAvatar/context.d.ts +17 -0
  33. package/dist/components/VAvatar/context.js +6 -0
  34. package/dist/components/VAvatar/context.js.map +1 -0
  35. package/dist/components/VBadge/VBadge.css +2 -0
  36. package/dist/components/VBadge/VBadge.d.ts +74 -0
  37. package/dist/components/VBadge/VBadge.js +9 -0
  38. package/dist/components/VBadge/VBadge.js.map +1 -0
  39. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +40 -0
  40. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/VBreadcrumb/VBreadcrumb.css +2 -0
  42. package/dist/components/VBreadcrumb/VBreadcrumb.d.ts +68 -0
  43. package/dist/components/VBreadcrumb/VBreadcrumb.js +9 -0
  44. package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -0
  45. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +70 -0
  46. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -0
  47. package/dist/components/VButton/VButton.css +2 -0
  48. package/dist/components/VButton/VButton.d.ts +88 -0
  49. package/dist/components/VButton/VButton.js +9 -0
  50. package/dist/components/VButton/VButton.js.map +1 -0
  51. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js +86 -0
  52. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/VButton/VButtonGroup.css +2 -0
  54. package/dist/components/VButton/VButtonGroup.d.ts +32 -0
  55. package/dist/components/VButton/VButtonGroup.js +9 -0
  56. package/dist/components/VButton/VButtonGroup.js.map +1 -0
  57. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js +17 -0
  58. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/VCalendar/VCalendar.css +2 -0
  60. package/dist/components/VCalendar/VCalendar.d.ts +129 -0
  61. package/dist/components/VCalendar/VCalendar.js +9 -0
  62. package/dist/components/VCalendar/VCalendar.js.map +1 -0
  63. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +374 -0
  64. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  65. package/dist/components/VCalendar/VCalendarEvent.css +2 -0
  66. package/dist/components/VCalendar/VCalendarEvent.d.ts +71 -0
  67. package/dist/components/VCalendar/VCalendarEvent.js +9 -0
  68. package/dist/components/VCalendar/VCalendarEvent.js.map +1 -0
  69. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js +106 -0
  70. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -0
  71. package/dist/components/VCalendar/VCalendarMonth.css +2 -0
  72. package/dist/components/VCalendar/VCalendarMonth.d.ts +60 -0
  73. package/dist/components/VCalendar/VCalendarMonth.js +9 -0
  74. package/dist/components/VCalendar/VCalendarMonth.js.map +1 -0
  75. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +342 -0
  76. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -0
  77. package/dist/components/VCalendar/VCalendarTimeGrid.css +2 -0
  78. package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +85 -0
  79. package/dist/components/VCalendar/VCalendarTimeGrid.js +9 -0
  80. package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -0
  81. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +621 -0
  82. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/VCalendar/VCalendarYear.css +2 -0
  84. package/dist/components/VCalendar/VCalendarYear.d.ts +31 -0
  85. package/dist/components/VCalendar/VCalendarYear.js +9 -0
  86. package/dist/components/VCalendar/VCalendarYear.js.map +1 -0
  87. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js +76 -0
  88. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -0
  89. package/dist/components/VCalendar/color.d.ts +9 -0
  90. package/dist/components/VCalendar/color.js +9 -0
  91. package/dist/components/VCalendar/color.js.map +1 -0
  92. package/dist/components/VCalendar/edgeStep.d.ts +38 -0
  93. package/dist/components/VCalendar/edgeStep.js +28 -0
  94. package/dist/components/VCalendar/edgeStep.js.map +1 -0
  95. package/dist/components/VCalendar/keyboard.d.ts +78 -0
  96. package/dist/components/VCalendar/keyboard.js +86 -0
  97. package/dist/components/VCalendar/keyboard.js.map +1 -0
  98. package/dist/components/VCalendar/layout.d.ts +355 -0
  99. package/dist/components/VCalendar/layout.js +292 -0
  100. package/dist/components/VCalendar/layout.js.map +1 -0
  101. package/dist/components/VCalendar/types.d.ts +78 -0
  102. package/dist/components/VCarousel/VCarousel.css +2 -0
  103. package/dist/components/VCarousel/VCarousel.d.ts +241 -0
  104. package/dist/components/VCarousel/VCarousel.js +9 -0
  105. package/dist/components/VCarousel/VCarousel.js.map +1 -0
  106. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +262 -0
  107. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  108. package/dist/components/VCarousel/VCarouselItem.d.ts +41 -0
  109. package/dist/components/VCarousel/VCarouselItem.js +7 -0
  110. package/dist/components/VCarousel/VCarouselItem.js.map +1 -0
  111. package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js +25 -0
  112. package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  113. package/dist/components/VCarousel/context.d.ts +23 -0
  114. package/dist/components/VCarousel/context.js +6 -0
  115. package/dist/components/VCarousel/context.js.map +1 -0
  116. package/dist/components/VCheckbox/VCheckbox.css +2 -0
  117. package/dist/components/VCheckbox/VCheckbox.d.ts +63 -0
  118. package/dist/components/VCheckbox/VCheckbox.js +9 -0
  119. package/dist/components/VCheckbox/VCheckbox.js.map +1 -0
  120. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +83 -0
  121. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  122. package/dist/components/VChip/VChip.css +2 -0
  123. package/dist/components/VChip/VChip.d.ts +120 -0
  124. package/dist/components/VChip/VChip.js +9 -0
  125. package/dist/components/VChip/VChip.js.map +1 -0
  126. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +118 -0
  127. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  128. package/dist/components/VCombobox/VCombobox.css +2 -0
  129. package/dist/components/VCombobox/VCombobox.d.ts +183 -0
  130. package/dist/components/VCombobox/VCombobox.js +9 -0
  131. package/dist/components/VCombobox/VCombobox.js.map +1 -0
  132. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +428 -0
  133. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  134. package/dist/components/VCombobox/VComboboxGroup.css +2 -0
  135. package/dist/components/VCombobox/VComboboxGroup.d.ts +26 -0
  136. package/dist/components/VCombobox/VComboboxGroup.js +9 -0
  137. package/dist/components/VCombobox/VComboboxGroup.js.map +1 -0
  138. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  139. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  140. package/dist/components/VCombobox/VComboboxOption.css +2 -0
  141. package/dist/components/VCombobox/VComboboxOption.d.ts +48 -0
  142. package/dist/components/VCombobox/VComboboxOption.js +9 -0
  143. package/dist/components/VCombobox/VComboboxOption.js.map +1 -0
  144. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js +56 -0
  145. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/VCombobox/VComboboxSeparator.css +2 -0
  147. package/dist/components/VCombobox/VComboboxSeparator.d.ts +3 -0
  148. package/dist/components/VCombobox/VComboboxSeparator.js +9 -0
  149. package/dist/components/VCombobox/VComboboxSeparator.js.map +1 -0
  150. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js +16 -0
  151. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  152. package/dist/components/VCombobox/infiniteScroll.d.ts +22 -0
  153. package/dist/components/VCombobox/infiniteScroll.js +28 -0
  154. package/dist/components/VCombobox/infiniteScroll.js.map +1 -0
  155. package/dist/components/VDataTable/VDataTable.css +2 -0
  156. package/dist/components/VDataTable/VDataTable.d.ts +214 -0
  157. package/dist/components/VDataTable/VDataTable.js +9 -0
  158. package/dist/components/VDataTable/VDataTable.js.map +1 -0
  159. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +396 -0
  160. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  161. package/dist/components/VDateInput/VDateInput.css +2 -0
  162. package/dist/components/VDateInput/VDateInput.d.ts +152 -0
  163. package/dist/components/VDateInput/VDateInput.js +9 -0
  164. package/dist/components/VDateInput/VDateInput.js.map +1 -0
  165. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +324 -0
  166. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  167. package/dist/components/VDatePicker/VDatePicker.css +2 -0
  168. package/dist/components/VDatePicker/VDatePicker.d.ts +143 -0
  169. package/dist/components/VDatePicker/VDatePicker.js +9 -0
  170. package/dist/components/VDatePicker/VDatePicker.js.map +1 -0
  171. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +454 -0
  172. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  173. package/dist/components/VDatePicker/keyboard.d.ts +56 -0
  174. package/dist/components/VDatePicker/keyboard.js +26 -0
  175. package/dist/components/VDatePicker/keyboard.js.map +1 -0
  176. package/dist/components/VDialog/VDialog.css +2 -0
  177. package/dist/components/VDialog/VDialog.d.ts +96 -0
  178. package/dist/components/VDialog/VDialog.js +9 -0
  179. package/dist/components/VDialog/VDialog.js.map +1 -0
  180. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +134 -0
  181. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  182. package/dist/components/VDialog/VDialogAlert.d.ts +67 -0
  183. package/dist/components/VDialog/VDialogAlert.js +7 -0
  184. package/dist/components/VDialog/VDialogAlert.js.map +1 -0
  185. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js +60 -0
  186. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  187. package/dist/components/VFileInput/VFileInput.css +2 -0
  188. package/dist/components/VFileInput/VFileInput.d.ts +156 -0
  189. package/dist/components/VFileInput/VFileInput.js +9 -0
  190. package/dist/components/VFileInput/VFileInput.js.map +1 -0
  191. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +244 -0
  192. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/components/VFileInput/truncate.d.ts +29 -0
  194. package/dist/components/VFileInput/truncate.js +10 -0
  195. package/dist/components/VFileInput/truncate.js.map +1 -0
  196. package/dist/components/VFilePicker/VFilePicker.css +2 -0
  197. package/dist/components/VFilePicker/VFilePicker.d.ts +203 -0
  198. package/dist/components/VFilePicker/VFilePicker.js +9 -0
  199. package/dist/components/VFilePicker/VFilePicker.js.map +1 -0
  200. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +266 -0
  201. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  202. package/dist/components/VFilePicker/fileKind.d.ts +29 -0
  203. package/dist/components/VFilePicker/fileKind.js +91 -0
  204. package/dist/components/VFilePicker/fileKind.js.map +1 -0
  205. package/dist/components/VHotkeys/VHotkeys.css +2 -0
  206. package/dist/components/VHotkeys/VHotkeys.d.ts +100 -0
  207. package/dist/components/VHotkeys/VHotkeys.js +9 -0
  208. package/dist/components/VHotkeys/VHotkeys.js.map +1 -0
  209. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +76 -0
  210. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -0
  211. package/dist/components/VHotkeys/platform.d.ts +82 -0
  212. package/dist/components/VHotkeys/platform.js +115 -0
  213. package/dist/components/VHotkeys/platform.js.map +1 -0
  214. package/dist/components/VIcon/VIcon.css +2 -0
  215. package/dist/components/VIcon/VIcon.d.ts +57 -0
  216. package/dist/components/VIcon/VIcon.js +9 -0
  217. package/dist/components/VIcon/VIcon.js.map +1 -0
  218. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js +99 -0
  219. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  220. package/dist/components/VIcon/iconProps.d.ts +30 -0
  221. package/dist/components/VIcon/iconProps.js +6 -0
  222. package/dist/components/VIcon/iconProps.js.map +1 -0
  223. package/dist/components/VIcon/icons/arrow_downward.d.ts +5 -0
  224. package/dist/components/VIcon/icons/arrow_downward.js +9 -0
  225. package/dist/components/VIcon/icons/arrow_downward.js.map +1 -0
  226. package/dist/components/VIcon/icons/arrow_downward_alt.d.ts +5 -0
  227. package/dist/components/VIcon/icons/arrow_downward_alt.js +9 -0
  228. package/dist/components/VIcon/icons/arrow_downward_alt.js.map +1 -0
  229. package/dist/components/VIcon/icons/arrow_drop_down.d.ts +5 -0
  230. package/dist/components/VIcon/icons/arrow_drop_down.js +9 -0
  231. package/dist/components/VIcon/icons/arrow_drop_down.js.map +1 -0
  232. package/dist/components/VIcon/icons/arrow_drop_up.d.ts +5 -0
  233. package/dist/components/VIcon/icons/arrow_drop_up.js +9 -0
  234. package/dist/components/VIcon/icons/arrow_drop_up.js.map +1 -0
  235. package/dist/components/VIcon/icons/arrow_left_alt.d.ts +5 -0
  236. package/dist/components/VIcon/icons/arrow_left_alt.js +9 -0
  237. package/dist/components/VIcon/icons/arrow_left_alt.js.map +1 -0
  238. package/dist/components/VIcon/icons/arrow_right_alt.d.ts +5 -0
  239. package/dist/components/VIcon/icons/arrow_right_alt.js +9 -0
  240. package/dist/components/VIcon/icons/arrow_right_alt.js.map +1 -0
  241. package/dist/components/VIcon/icons/arrow_upward.d.ts +5 -0
  242. package/dist/components/VIcon/icons/arrow_upward.js +9 -0
  243. package/dist/components/VIcon/icons/arrow_upward.js.map +1 -0
  244. package/dist/components/VIcon/icons/arrow_upward_alt.d.ts +5 -0
  245. package/dist/components/VIcon/icons/arrow_upward_alt.js +9 -0
  246. package/dist/components/VIcon/icons/arrow_upward_alt.js.map +1 -0
  247. package/dist/components/VIcon/icons/attach_file.d.ts +5 -0
  248. package/dist/components/VIcon/icons/attach_file.js +9 -0
  249. package/dist/components/VIcon/icons/attach_file.js.map +1 -0
  250. package/dist/components/VIcon/icons/audio_file.d.ts +5 -0
  251. package/dist/components/VIcon/icons/audio_file.js +9 -0
  252. package/dist/components/VIcon/icons/audio_file.js.map +1 -0
  253. package/dist/components/VIcon/icons/calendar_today.d.ts +5 -0
  254. package/dist/components/VIcon/icons/calendar_today.js +9 -0
  255. package/dist/components/VIcon/icons/calendar_today.js.map +1 -0
  256. package/dist/components/VIcon/icons/check.d.ts +5 -0
  257. package/dist/components/VIcon/icons/check.js +9 -0
  258. package/dist/components/VIcon/icons/check.js.map +1 -0
  259. package/dist/components/VIcon/icons/check_circle.d.ts +5 -0
  260. package/dist/components/VIcon/icons/check_circle.js +9 -0
  261. package/dist/components/VIcon/icons/check_circle.js.map +1 -0
  262. package/dist/components/VIcon/icons/chevron_left.d.ts +5 -0
  263. package/dist/components/VIcon/icons/chevron_left.js +9 -0
  264. package/dist/components/VIcon/icons/chevron_left.js.map +1 -0
  265. package/dist/components/VIcon/icons/chevron_right.d.ts +5 -0
  266. package/dist/components/VIcon/icons/chevron_right.js +9 -0
  267. package/dist/components/VIcon/icons/chevron_right.js.map +1 -0
  268. package/dist/components/VIcon/icons/close.d.ts +5 -0
  269. package/dist/components/VIcon/icons/close.js +9 -0
  270. package/dist/components/VIcon/icons/close.js.map +1 -0
  271. package/dist/components/VIcon/icons/cloud_upload.d.ts +5 -0
  272. package/dist/components/VIcon/icons/cloud_upload.js +9 -0
  273. package/dist/components/VIcon/icons/cloud_upload.js.map +1 -0
  274. package/dist/components/VIcon/icons/code.d.ts +5 -0
  275. package/dist/components/VIcon/icons/code.js +9 -0
  276. package/dist/components/VIcon/icons/code.js.map +1 -0
  277. package/dist/components/VIcon/icons/description.d.ts +5 -0
  278. package/dist/components/VIcon/icons/description.js +9 -0
  279. package/dist/components/VIcon/icons/description.js.map +1 -0
  280. package/dist/components/VIcon/icons/error.d.ts +5 -0
  281. package/dist/components/VIcon/icons/error.js +9 -0
  282. package/dist/components/VIcon/icons/error.js.map +1 -0
  283. package/dist/components/VIcon/icons/expand_less.d.ts +5 -0
  284. package/dist/components/VIcon/icons/expand_less.js +9 -0
  285. package/dist/components/VIcon/icons/expand_less.js.map +1 -0
  286. package/dist/components/VIcon/icons/expand_more.d.ts +5 -0
  287. package/dist/components/VIcon/icons/expand_more.js +9 -0
  288. package/dist/components/VIcon/icons/expand_more.js.map +1 -0
  289. package/dist/components/VIcon/icons/folder_zip.d.ts +5 -0
  290. package/dist/components/VIcon/icons/folder_zip.js +9 -0
  291. package/dist/components/VIcon/icons/folder_zip.js.map +1 -0
  292. package/dist/components/VIcon/icons/image.d.ts +5 -0
  293. package/dist/components/VIcon/icons/image.js +9 -0
  294. package/dist/components/VIcon/icons/image.js.map +1 -0
  295. package/dist/components/VIcon/icons/index.d.ts +183 -0
  296. package/dist/components/VIcon/icons/index.js +77 -0
  297. package/dist/components/VIcon/icons/index.js.map +1 -0
  298. package/dist/components/VIcon/icons/info.d.ts +5 -0
  299. package/dist/components/VIcon/icons/info.js +9 -0
  300. package/dist/components/VIcon/icons/info.js.map +1 -0
  301. package/dist/components/VIcon/icons/more_horiz.d.ts +5 -0
  302. package/dist/components/VIcon/icons/more_horiz.js +9 -0
  303. package/dist/components/VIcon/icons/more_horiz.js.map +1 -0
  304. package/dist/components/VIcon/icons/names.d.ts +11 -0
  305. package/dist/components/VIcon/icons/names.js +5 -0
  306. package/dist/components/VIcon/icons/names.js.map +1 -0
  307. package/dist/components/VIcon/icons/notifications.d.ts +5 -0
  308. package/dist/components/VIcon/icons/notifications.js +9 -0
  309. package/dist/components/VIcon/icons/notifications.js.map +1 -0
  310. package/dist/components/VIcon/icons/picture_as_pdf.d.ts +5 -0
  311. package/dist/components/VIcon/icons/picture_as_pdf.js +9 -0
  312. package/dist/components/VIcon/icons/picture_as_pdf.js.map +1 -0
  313. package/dist/components/VIcon/icons/schedule.d.ts +5 -0
  314. package/dist/components/VIcon/icons/schedule.js +9 -0
  315. package/dist/components/VIcon/icons/schedule.js.map +1 -0
  316. package/dist/components/VIcon/icons/search.d.ts +5 -0
  317. package/dist/components/VIcon/icons/search.js +9 -0
  318. package/dist/components/VIcon/icons/search.js.map +1 -0
  319. package/dist/components/VIcon/icons/swap_vert.d.ts +5 -0
  320. package/dist/components/VIcon/icons/swap_vert.js +9 -0
  321. package/dist/components/VIcon/icons/swap_vert.js.map +1 -0
  322. package/dist/components/VIcon/icons/table_chart.d.ts +5 -0
  323. package/dist/components/VIcon/icons/table_chart.js +9 -0
  324. package/dist/components/VIcon/icons/table_chart.js.map +1 -0
  325. package/dist/components/VIcon/icons/video_file.d.ts +5 -0
  326. package/dist/components/VIcon/icons/video_file.js +9 -0
  327. package/dist/components/VIcon/icons/video_file.js.map +1 -0
  328. package/dist/components/VIcon/icons/viewBox.d.ts +6 -0
  329. package/dist/components/VIcon/icons/viewBox.js +6 -0
  330. package/dist/components/VIcon/icons/viewBox.js.map +1 -0
  331. package/dist/components/VIcon/icons/warning.d.ts +5 -0
  332. package/dist/components/VIcon/icons/warning.js +9 -0
  333. package/dist/components/VIcon/icons/warning.js.map +1 -0
  334. package/dist/components/VIcon/resolver.d.ts +76 -0
  335. package/dist/components/VIcon/resolver.js +35 -0
  336. package/dist/components/VIcon/resolver.js.map +1 -0
  337. package/dist/components/VIcon/types.d.ts +77 -0
  338. package/dist/components/VIconButton/VIconButton.css +2 -0
  339. package/dist/components/VIconButton/VIconButton.d.ts +66 -0
  340. package/dist/components/VIconButton/VIconButton.js +9 -0
  341. package/dist/components/VIconButton/VIconButton.js.map +1 -0
  342. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js +70 -0
  343. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  344. package/dist/components/VInput/VInput.css +2 -0
  345. package/dist/components/VInput/VInput.d.ts +152 -0
  346. package/dist/components/VInput/VInput.js +9 -0
  347. package/dist/components/VInput/VInput.js.map +1 -0
  348. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +185 -0
  349. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  350. package/dist/components/VInputOTP/VInputOTP.css +2 -0
  351. package/dist/components/VInputOTP/VInputOTP.d.ts +76 -0
  352. package/dist/components/VInputOTP/VInputOTP.js +9 -0
  353. package/dist/components/VInputOTP/VInputOTP.js.map +1 -0
  354. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +149 -0
  355. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -0
  356. package/dist/components/VMenu/VMenu.d.ts +91 -0
  357. package/dist/components/VMenu/VMenu.js +7 -0
  358. package/dist/components/VMenu/VMenu.js.map +1 -0
  359. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +73 -0
  360. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  361. package/dist/components/VMenu/VMenuGroup.css +2 -0
  362. package/dist/components/VMenu/VMenuGroup.d.ts +22 -0
  363. package/dist/components/VMenu/VMenuGroup.js +9 -0
  364. package/dist/components/VMenu/VMenuGroup.js.map +1 -0
  365. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  366. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  367. package/dist/components/VMenu/VMenuItem.css +2 -0
  368. package/dist/components/VMenu/VMenuItem.d.ts +85 -0
  369. package/dist/components/VMenu/VMenuItem.js +9 -0
  370. package/dist/components/VMenu/VMenuItem.js.map +1 -0
  371. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +121 -0
  372. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  373. package/dist/components/VMenu/VMenuPanel.css +2 -0
  374. package/dist/components/VMenu/VMenuPanel.d.ts +91 -0
  375. package/dist/components/VMenu/VMenuPanel.js +9 -0
  376. package/dist/components/VMenu/VMenuPanel.js.map +1 -0
  377. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +103 -0
  378. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  379. package/dist/components/VMenu/VMenuSeparator.css +2 -0
  380. package/dist/components/VMenu/VMenuSeparator.d.ts +3 -0
  381. package/dist/components/VMenu/VMenuSeparator.js +9 -0
  382. package/dist/components/VMenu/VMenuSeparator.js.map +1 -0
  383. package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js +13 -0
  384. package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  385. package/dist/components/VMenu/context.d.ts +33 -0
  386. package/dist/components/VMenu/context.js +9 -0
  387. package/dist/components/VMenu/context.js.map +1 -0
  388. package/dist/components/VPagination/VPagination.css +2 -0
  389. package/dist/components/VPagination/VPagination.d.ts +103 -0
  390. package/dist/components/VPagination/VPagination.js +9 -0
  391. package/dist/components/VPagination/VPagination.js.map +1 -0
  392. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +270 -0
  393. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -0
  394. package/dist/components/VPopover/VPopover.css +2 -0
  395. package/dist/components/VPopover/VPopover.d.ts +82 -0
  396. package/dist/components/VPopover/VPopover.js +9 -0
  397. package/dist/components/VPopover/VPopover.js.map +1 -0
  398. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js +65 -0
  399. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -0
  400. package/dist/components/VProgressCircular/VProgressCircular.css +2 -0
  401. package/dist/components/VProgressCircular/VProgressCircular.d.ts +60 -0
  402. package/dist/components/VProgressCircular/VProgressCircular.js +9 -0
  403. package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -0
  404. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js +74 -0
  405. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -0
  406. package/dist/components/VProgressLinear/VProgressLinear.css +2 -0
  407. package/dist/components/VProgressLinear/VProgressLinear.d.ts +74 -0
  408. package/dist/components/VProgressLinear/VProgressLinear.js +9 -0
  409. package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -0
  410. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +74 -0
  411. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -0
  412. package/dist/components/VRadio/VRadio.css +2 -0
  413. package/dist/components/VRadio/VRadio.d.ts +58 -0
  414. package/dist/components/VRadio/VRadio.js +9 -0
  415. package/dist/components/VRadio/VRadio.js.map +1 -0
  416. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +60 -0
  417. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -0
  418. package/dist/components/VSeparator/VSeparator.css +2 -0
  419. package/dist/components/VSeparator/VSeparator.d.ts +23 -0
  420. package/dist/components/VSeparator/VSeparator.js +9 -0
  421. package/dist/components/VSeparator/VSeparator.js.map +1 -0
  422. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js +17 -0
  423. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  424. package/dist/components/VSideNavigation/VSideNavigation.css +2 -0
  425. package/dist/components/VSideNavigation/VSideNavigation.d.ts +64 -0
  426. package/dist/components/VSideNavigation/VSideNavigation.js +9 -0
  427. package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -0
  428. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +67 -0
  429. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -0
  430. package/dist/components/VSideNavigation/VSideNavigationGroup.css +2 -0
  431. package/dist/components/VSideNavigation/VSideNavigationGroup.d.ts +33 -0
  432. package/dist/components/VSideNavigation/VSideNavigationGroup.js +9 -0
  433. package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -0
  434. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js +20 -0
  435. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  436. package/dist/components/VSideNavigation/VSideNavigationItem.css +2 -0
  437. package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +103 -0
  438. package/dist/components/VSideNavigation/VSideNavigationItem.js +9 -0
  439. package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -0
  440. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +154 -0
  441. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  442. package/dist/components/VSideNavigation/VSideNavigationSeparator.css +2 -0
  443. package/dist/components/VSideNavigation/VSideNavigationSeparator.d.ts +3 -0
  444. package/dist/components/VSideNavigation/VSideNavigationSeparator.js +17 -0
  445. package/dist/components/VSideNavigation/VSideNavigationSeparator.js.map +1 -0
  446. package/dist/components/VSideNavigation/context.d.ts +37 -0
  447. package/dist/components/VSideNavigation/context.js +6 -0
  448. package/dist/components/VSideNavigation/context.js.map +1 -0
  449. package/dist/components/VSkeletonLoader/VSkeletonLoader.css +2 -0
  450. package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +75 -0
  451. package/dist/components/VSkeletonLoader/VSkeletonLoader.js +9 -0
  452. package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -0
  453. package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js +61 -0
  454. package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -0
  455. package/dist/components/VSlider/VSlider.css +2 -0
  456. package/dist/components/VSlider/VSlider.d.ts +82 -0
  457. package/dist/components/VSlider/VSlider.js +9 -0
  458. package/dist/components/VSlider/VSlider.js.map +1 -0
  459. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +220 -0
  460. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -0
  461. package/dist/components/VSnackbar/VSnackbar.css +2 -0
  462. package/dist/components/VSnackbar/VSnackbar.d.ts +51 -0
  463. package/dist/components/VSnackbar/VSnackbar.js +9 -0
  464. package/dist/components/VSnackbar/VSnackbar.js.map +1 -0
  465. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +83 -0
  466. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  467. package/dist/components/VSnackbar/state.d.ts +92 -0
  468. package/dist/components/VSnackbar/state.js +18 -0
  469. package/dist/components/VSnackbar/state.js.map +1 -0
  470. package/dist/components/VSpinner/VSpinner.css +2 -0
  471. package/dist/components/VSpinner/VSpinner.d.ts +21 -0
  472. package/dist/components/VSpinner/VSpinner.js +9 -0
  473. package/dist/components/VSpinner/VSpinner.js.map +1 -0
  474. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js +25 -0
  475. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  476. package/dist/components/VSwitch/VSwitch.css +2 -0
  477. package/dist/components/VSwitch/VSwitch.d.ts +46 -0
  478. package/dist/components/VSwitch/VSwitch.js +9 -0
  479. package/dist/components/VSwitch/VSwitch.js.map +1 -0
  480. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +51 -0
  481. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -0
  482. package/dist/components/VTabs/VTab.css +2 -0
  483. package/dist/components/VTabs/VTab.d.ts +42 -0
  484. package/dist/components/VTabs/VTab.js +9 -0
  485. package/dist/components/VTabs/VTab.js.map +1 -0
  486. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js +66 -0
  487. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -0
  488. package/dist/components/VTabs/VTabPanel.css +2 -0
  489. package/dist/components/VTabs/VTabPanel.d.ts +34 -0
  490. package/dist/components/VTabs/VTabPanel.js +9 -0
  491. package/dist/components/VTabs/VTabPanel.js.map +1 -0
  492. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js +34 -0
  493. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  494. package/dist/components/VTabs/VTabs.css +2 -0
  495. package/dist/components/VTabs/VTabs.d.ts +107 -0
  496. package/dist/components/VTabs/VTabs.js +9 -0
  497. package/dist/components/VTabs/VTabs.js.map +1 -0
  498. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +199 -0
  499. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  500. package/dist/components/VTabs/context.d.ts +43 -0
  501. package/dist/components/VTabs/context.js +6 -0
  502. package/dist/components/VTabs/context.js.map +1 -0
  503. package/dist/components/VTextarea/VTextarea.css +2 -0
  504. package/dist/components/VTextarea/VTextarea.d.ts +140 -0
  505. package/dist/components/VTextarea/VTextarea.js +9 -0
  506. package/dist/components/VTextarea/VTextarea.js.map +1 -0
  507. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +187 -0
  508. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -0
  509. package/dist/components/VTimeInput/VTimeInput.css +2 -0
  510. package/dist/components/VTimeInput/VTimeInput.d.ts +112 -0
  511. package/dist/components/VTimeInput/VTimeInput.js +9 -0
  512. package/dist/components/VTimeInput/VTimeInput.js.map +1 -0
  513. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +385 -0
  514. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  515. package/dist/components/VTimePicker/VTimePicker.css +2 -0
  516. package/dist/components/VTimePicker/VTimePicker.d.ts +89 -0
  517. package/dist/components/VTimePicker/VTimePicker.js +9 -0
  518. package/dist/components/VTimePicker/VTimePicker.js.map +1 -0
  519. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +257 -0
  520. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  521. package/dist/components/VToast/VToast.css +2 -0
  522. package/dist/components/VToast/VToast.d.ts +24 -0
  523. package/dist/components/VToast/VToast.js +9 -0
  524. package/dist/components/VToast/VToast.js.map +1 -0
  525. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +62 -0
  526. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -0
  527. package/dist/components/VToast/VToaster.css +2 -0
  528. package/dist/components/VToast/VToaster.d.ts +42 -0
  529. package/dist/components/VToast/VToaster.js +9 -0
  530. package/dist/components/VToast/VToaster.js.map +1 -0
  531. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +112 -0
  532. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -0
  533. package/dist/components/VToast/state.d.ts +74 -0
  534. package/dist/components/VToast/state.js +25 -0
  535. package/dist/components/VToast/state.js.map +1 -0
  536. package/dist/components/VToggle/VToggle.css +2 -0
  537. package/dist/components/VToggle/VToggle.d.ts +84 -0
  538. package/dist/components/VToggle/VToggle.js +9 -0
  539. package/dist/components/VToggle/VToggle.js.map +1 -0
  540. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +103 -0
  541. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -0
  542. package/dist/components/VToggle/VToggleItem.css +2 -0
  543. package/dist/components/VToggle/VToggleItem.d.ts +35 -0
  544. package/dist/components/VToggle/VToggleItem.js +9 -0
  545. package/dist/components/VToggle/VToggleItem.js.map +1 -0
  546. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js +51 -0
  547. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  548. package/dist/components/VToggle/context.d.ts +37 -0
  549. package/dist/components/VToggle/context.js +6 -0
  550. package/dist/components/VToggle/context.js.map +1 -0
  551. package/dist/components/VTooltip/VTooltip.css +2 -0
  552. package/dist/components/VTooltip/VTooltip.d.ts +76 -0
  553. package/dist/components/VTooltip/VTooltip.js +9 -0
  554. package/dist/components/VTooltip/VTooltip.js.map +1 -0
  555. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +50 -0
  556. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  557. package/dist/components/VTypography/VTypography.css +2 -0
  558. package/dist/components/VTypography/VTypography.d.ts +46 -0
  559. package/dist/components/VTypography/VTypography.js +9 -0
  560. package/dist/components/VTypography/VTypography.js.map +1 -0
  561. package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js +49 -0
  562. package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -0
  563. package/dist/composables/useAriaLabel.d.ts +19 -0
  564. package/dist/composables/useAriaLabel.js +10 -0
  565. package/dist/composables/useAriaLabel.js.map +1 -0
  566. package/dist/composables/useFieldIds.d.ts +21 -0
  567. package/dist/composables/useFieldIds.js +14 -0
  568. package/dist/composables/useFieldIds.js.map +1 -0
  569. package/dist/composables/useFieldPanel.d.ts +61 -0
  570. package/dist/composables/useFieldPanel.js +39 -0
  571. package/dist/composables/useFieldPanel.js.map +1 -0
  572. package/dist/composables/useFileDrop.d.ts +30 -0
  573. package/dist/composables/useFileDrop.js +28 -0
  574. package/dist/composables/useFileDrop.js.map +1 -0
  575. package/dist/composables/useFileField.d.ts +36 -0
  576. package/dist/composables/useFileField.js +45 -0
  577. package/dist/composables/useFileField.js.map +1 -0
  578. package/dist/composables/useFocusoutDismiss.d.ts +17 -0
  579. package/dist/composables/useFocusoutDismiss.js +11 -0
  580. package/dist/composables/useFocusoutDismiss.js.map +1 -0
  581. package/dist/composables/useIconClickHandlers.d.ts +27 -0
  582. package/dist/composables/useIconClickHandlers.js +13 -0
  583. package/dist/composables/useIconClickHandlers.js.map +1 -0
  584. package/dist/composables/useMaskedField.d.ts +65 -0
  585. package/dist/composables/useMaskedField.js +54 -0
  586. package/dist/composables/useMaskedField.js.map +1 -0
  587. package/dist/composables/usePopover.d.ts +7 -0
  588. package/dist/composables/usePopover.js +24 -0
  589. package/dist/composables/usePopover.js.map +1 -0
  590. package/dist/composables/useProgressValue.d.ts +13 -0
  591. package/dist/composables/useProgressValue.js +14 -0
  592. package/dist/composables/useProgressValue.js.map +1 -0
  593. package/dist/composables/useRootAttrs.d.ts +34 -0
  594. package/dist/composables/useRootAttrs.js +15 -0
  595. package/dist/composables/useRootAttrs.js.map +1 -0
  596. package/dist/composables/useTextLimit.d.ts +31 -0
  597. package/dist/composables/useTextLimit.js +19 -0
  598. package/dist/composables/useTextLimit.js.map +1 -0
  599. package/dist/composables/useTimer.d.ts +18 -0
  600. package/dist/composables/useTimer.js +19 -0
  601. package/dist/composables/useTimer.js.map +1 -0
  602. package/dist/i18n/en.d.ts +10 -0
  603. package/dist/i18n/en.js +179 -0
  604. package/dist/i18n/en.js.map +1 -0
  605. package/dist/i18n/fr.d.ts +18 -0
  606. package/dist/i18n/fr.js +179 -0
  607. package/dist/i18n/fr.js.map +1 -0
  608. package/dist/i18n/state.d.ts +64 -0
  609. package/dist/i18n/state.js +40 -0
  610. package/dist/i18n/state.js.map +1 -0
  611. package/dist/i18n/types.d.ts +345 -0
  612. package/dist/icons.d.ts +16 -0
  613. package/dist/icons.js +38 -0
  614. package/dist/index.d.ts +90 -0
  615. package/dist/index.js +64 -0
  616. package/dist/styles.css +1 -0
  617. package/dist/tokens/css.d.ts +25 -0
  618. package/dist/tokens/css.js +29 -0
  619. package/dist/tokens/css.js.map +1 -0
  620. package/dist/tokens/index.d.ts +370 -0
  621. package/dist/tokens/index.js +15 -0
  622. package/dist/tokens/index.js.map +1 -0
  623. package/dist/tokens/primitives.d.ts +101 -0
  624. package/dist/tokens/primitives.js +166 -0
  625. package/dist/tokens/primitives.js.map +1 -0
  626. package/dist/tokens/semantic.d.ts +236 -0
  627. package/dist/tokens/semantic.js +219 -0
  628. package/dist/tokens/semantic.js.map +1 -0
  629. package/dist/tokens/themes/dark.d.ts +49 -0
  630. package/dist/tokens/themes/dark.js +53 -0
  631. package/dist/tokens/themes/dark.js.map +1 -0
  632. package/dist/tokens/types.d.ts +38 -0
  633. package/dist/tokens/types.js +16 -0
  634. package/dist/tokens/types.js.map +1 -0
  635. package/dist/tokens.json +1516 -0
  636. package/dist/utils/array.d.ts +10 -0
  637. package/dist/utils/array.js +8 -0
  638. package/dist/utils/array.js.map +1 -0
  639. package/dist/utils/arrowNav.d.ts +27 -0
  640. package/dist/utils/arrowNav.js +26 -0
  641. package/dist/utils/arrowNav.js.map +1 -0
  642. package/dist/utils/chip.d.ts +26 -0
  643. package/dist/utils/chip.js +13 -0
  644. package/dist/utils/chip.js.map +1 -0
  645. package/dist/utils/css.d.ts +19 -0
  646. package/dist/utils/css.js +13 -0
  647. package/dist/utils/css.js.map +1 -0
  648. package/dist/utils/date.d.ts +199 -0
  649. package/dist/utils/date.js +225 -0
  650. package/dist/utils/date.js.map +1 -0
  651. package/dist/utils/direction.d.ts +18 -0
  652. package/dist/utils/direction.js +8 -0
  653. package/dist/utils/direction.js.map +1 -0
  654. package/dist/utils/env.d.ts +10 -0
  655. package/dist/utils/file.d.ts +95 -0
  656. package/dist/utils/file.js +70 -0
  657. package/dist/utils/file.js.map +1 -0
  658. package/dist/utils/focus.d.ts +24 -0
  659. package/dist/utils/focus.js +13 -0
  660. package/dist/utils/focus.js.map +1 -0
  661. package/dist/utils/matcher.d.ts +13 -0
  662. package/dist/utils/matcher.js +11 -0
  663. package/dist/utils/matcher.js.map +1 -0
  664. package/dist/utils/number.d.ts +9 -0
  665. package/dist/utils/number.js +8 -0
  666. package/dist/utils/number.js.map +1 -0
  667. package/dist/utils/text.d.ts +19 -0
  668. package/dist/utils/text.js +12 -0
  669. package/dist/utils/text.js.map +1 -0
  670. package/dist/utils/time.d.ts +138 -0
  671. package/dist/utils/time.js +123 -0
  672. package/dist/utils/time.js.map +1 -0
  673. package/dist/utils/vnode.d.ts +21 -0
  674. package/dist/utils/vnode.js +14 -0
  675. package/dist/utils/vnode.js.map +1 -0
  676. package/package.json +114 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSkeletonLoader.js","names":[],"sources":["../../../src/components/VSkeletonLoader/VSkeletonLoader.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The grey silhouette standing in for content that has not arrived yet: a line of\n * text, a button, an avatar. It is drawn entirely in CSS.\n *\n * The element rendered is a CONTAINER holding its silhouettes, and not itself the\n * painted shape — the opposite of VProgressLinear. That is what makes several lines\n * possible at no cost, and what keeps every rule below uniform: there is no\n * \"painted root\" case beside a \"painted child\" one. It carries the shared size class,\n * so a skeleton of a given size is exactly as tall as a button of that size.\n *\n * The component MEASURES nothing. It does not look at what it replaces to work out a\n * shape; the shape is declared. The three derived values are all the JavaScript there\n * is — no event, no lifecycle, no DOM.\n */\nimport { computed } from 'vue'\n\nimport { useMessages } from '../../i18n/state'\nimport { cssSize } from '../../utils/css'\n\nexport type SkeletonShape = 'text' | 'control' | 'pill' | 'circle' | 'surface'\nexport type SkeletonAnimation = 'wave' | 'pulse' | 'none'\nexport type SkeletonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\ninterface SkeletonLoaderProps {\n /**\n * What the silhouette stands for. Each value sets both a corner radius and a way of\n * being sized:\n *\n * - `text` follows the typography around it, so several silhouettes occupy exactly\n * as many lines as the text they replace;\n * - `control` takes the height of a control of the given size — a button, a field;\n * - `pill` is that same height with fully rounded ends — a chip, a badge;\n * - `circle` is that height in both dimensions — an avatar, a round icon button;\n * - `surface` is a card or an image, with a height of its own.\n */\n shape?: SkeletonShape\n /**\n * The size on the scale shared by every control. It only means something for the\n * shapes sized like a control: text follows the typography around it, and a surface\n * has its own height.\n */\n size?: SkeletonSize\n /** Takes 4px off the height, as everywhere else in the design system. */\n compact?: boolean\n /**\n * The width: a number is read as pixels, and anything else as a CSS length of your\n * own — `'100%'`, `'12ch'`. Left out, the silhouette takes all the width available.\n */\n width?: number | string\n /** The height, read the same way. It wins over the shape and the size. */\n height?: number | string\n /**\n * How many silhouettes to stack. In the text shape the LAST one is drawn shorter\n * than the others, and that single detail is what reads as a paragraph rather than\n * as a table.\n */\n lines?: number\n /**\n * How the silhouette shows that something is happening. Turning it off freezes it,\n * which suits printing, a screenshot, or a parent already animating.\n */\n animation?: SkeletonAnimation\n /**\n * A background colour of your own, replacing the token. The wave's highlight is\n * DERIVED from it, so it stays correct with nothing else to set.\n */\n color?: string\n /**\n * Announces the loading to screen readers. It is OFF by default, because a skeleton\n * is decorative: a page holds a dozen of them, and a dozen competing announcements\n * are unreadable. What should announce the wait is the container around them,\n * marked as busy.\n */\n announce?: boolean\n /**\n * What is announced, which also IMPLIES announcing. Prefer something situated —\n * \"Loading the results\" — since a generic word is the reason the default is silence.\n * It falls back to the design system dictionary.\n */\n label?: string\n}\n\nconst props = withDefaults(defineProps<SkeletonLoaderProps>(), {\n shape: 'text',\n size: 'md',\n compact: false,\n width: undefined,\n height: undefined,\n lines: 1,\n animation: 'wave',\n color: undefined,\n announce: false,\n label: undefined,\n})\n\n// A guard against two silent bugs: asked for zero lines the component would render\n// NOTHING at all — an invisible skeleton nobody notices is missing — and a fractional\n// count would produce a surprising number of them.\nconst count = computed(() => Math.max(1, Math.trunc(props.lines)))\n\n// @a11y — silent by default, since a dozen silhouettes must not produce a dozen\n// announcements. Supplying a label counts as asking to be announced, otherwise that\n// prop would sit there doing nothing.\nconst announced = computed(() => props.announce || props.label !== undefined)\n\nconst m = useMessages()\n// TRAP — the dictionary must never be read directly in the body of `setup`: the value\n// would be captured once and would stop following a later change of language.\nconst resolvedLabel = computed(() => props.label ?? m.value.common.loading)\n</script>\n\n<template>\n <span\n class=\"v-skeleton v-control\"\n :data-shape=\"shape\"\n :data-size=\"size\"\n :data-compact=\"compact ? '' : undefined\"\n :data-animation=\"animation\"\n :data-custom=\"color !== undefined ? '' : undefined\"\n :role=\"announced ? 'status' : undefined\"\n :aria-hidden=\"announced ? undefined : 'true'\"\n :style=\"{\n '--custom-color': color,\n '--skeleton-w': cssSize(width),\n '--skeleton-h': cssSize(height),\n }\"\n >\n <!--\n TRAP — the label is rendered BEFORE the silhouettes, and that order is\n structural. The rule shortening the last line of a paragraph asks for the last\n CHILD, so a label rendered after them would quietly take that place and no line\n would be shortened. A unit test locks the order.\n\n It costs no layout: the class hiding it takes it out of the flow entirely, so it\n is never one of the stacked items. And it is rendered only when something is\n actually announced — inside a subtree hidden from screen readers it would be text\n nobody can reach.\n -->\n <span v-if=\"announced\" class=\"v-visually-hidden\">{{ resolvedLabel }}</span>\n <span v-for=\"n in count\" :key=\"n\" class=\"v-skeleton-item\" />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n /*\n * The whole geometry comes down to four variables. The shape table below sets them,\n * and the dimension props overwrite them inline — which always wins over a rule\n * targeting the same element, so no specificity contest is possible.\n */\n .v-skeleton {\n /* The grey has a token of its own. No existing colour role holds the right value in\n BOTH themes: the muted surface is too pale in the light one for the pulse to be\n visible at all, and the border colour has the right tone but the wrong meaning. */\n --skeleton-base: var(--vectis-color-surface-skeleton);\n /*\n * The lighter shade the animation sweeps across is DERIVED from the grey rather\n * than named: it is that same colour, a little lighter.\n *\n * Expressing it as a lightness STEP is what makes one declaration correct in both\n * themes. Mixing towards a target colour would not: in the light theme the\n * silhouette is darker than the page, in the dark theme it is LIGHTER than it, so\n * any fixed target would lighten in one and darken in the other. A step in\n * lightness always goes the same way — and in the light theme it naturally stops at\n * white, exactly the page's colour.\n *\n * It also follows a custom colour with nothing else to set. The step itself is a\n * bare ratio, the same tolerance as the opacities.\n */\n --skeleton-highlight: oklch(from var(--skeleton-base) calc(l + 0.06) c h);\n --skeleton-h: var(--control-height);\n --skeleton-radius: var(--vectis-radius-interactive);\n --skeleton-gap: var(--vectis-space-2);\n display: flex;\n flex-direction: column;\n gap: var(--skeleton-gap);\n }\n\n /* A custom colour wins by specificity rather than by order, being one step more\n specific than the rule above — unlike VProgressLinear's tones, which all sit at the\n same level and depend on their sequence. */\n .v-skeleton[data-custom] {\n --skeleton-base: var(--custom-color);\n }\n\n .v-skeleton-item {\n /* The animation's overlay is positioned against this box. */\n position: relative;\n /* The height from the shape table is a DEFAULT: inside a parent that has a height\n of its own, the silhouette grows to fill it — a card fills its slot. */\n flex: 1 1 auto;\n inline-size: var(--skeleton-w, 100%);\n block-size: var(--skeleton-h);\n /* Clipped rather than hidden: hiding the overflow would turn every silhouette into\n a scroll container, for nothing. */\n overflow: clip;\n border-radius: var(--skeleton-radius);\n background: var(--skeleton-base);\n }\n\n /*\n * A line of text is one em tall, which means it follows the typography it INHERITS,\n * and it is centred in the line box the same way a line of text would be.\n *\n * The gap between lines and the padding around them are derived from that same line\n * height, so that N silhouettes occupy exactly N lines of text: replacing them with\n * the real content shifts nothing on the page. The floor guards against a parent\n * whose lines are set tighter than its font size, where the gap would otherwise go\n * negative.\n */\n .v-skeleton[data-shape='text'] {\n --skeleton-h: 1em;\n --skeleton-radius: var(--vectis-radius-pill);\n --skeleton-gap: max(0px, calc(1lh - 1em));\n padding-block: calc(max(0px, calc(1lh - 1em)) / 2);\n }\n\n /* A line of text keeps the height its typography gives it: unlike the other shapes it\n neither stretches in a tall parent nor squashes in a short one. */\n .v-skeleton[data-shape='text'] .v-skeleton-item {\n flex: none;\n }\n\n /*\n * The shortened last line, the one detail that makes a stack of bars read as a\n * paragraph. Asking for a line PRECEDED by another is what guarantees it only\n * applies from two lines up — a single line is not a paragraph — and the proportion\n * is taken from the EFFECTIVE width, so it still works under a `width` prop.\n */\n .v-skeleton[data-shape='text'] .v-skeleton-item + .v-skeleton-item:last-child {\n --skeleton-last-line: 0.6;\n inline-size: calc(var(--skeleton-w, 100%) * var(--skeleton-last-line));\n }\n\n .v-skeleton[data-shape='pill'] {\n --skeleton-radius: var(--vectis-radius-pill);\n }\n\n /*\n * A circle takes its width FROM its height through the ratio, so changing the size\n * alone changes the diameter and nothing has to be kept in step.\n *\n * The container sits inline, like the avatar it replaces, rather than spanning the\n * whole width, and aligning to the start stops the silhouette from being stretched\n * sideways — which is what keeps the circle round.\n */\n .v-skeleton[data-shape='circle'] {\n --skeleton-radius: var(--vectis-radius-pill);\n display: inline-flex;\n align-items: start;\n }\n\n .v-skeleton[data-shape='circle'] .v-skeleton-item {\n /* Left to the content rather than set to the full width, so that the ratio is what\n decides. An explicit `width` still takes over, and then knowingly gives an\n oval. */\n inline-size: var(--skeleton-w, auto);\n aspect-ratio: 1;\n }\n\n /*\n * A surface — a card, an image, a block — has no height anyone could guess without\n * measuring the page, which this component deliberately never does. It takes a\n * default from a token, which the `height` prop overrides, as does any consumer style\n * (theirs sits outside our layers and therefore wins).\n */\n .v-skeleton[data-shape='surface'] {\n --skeleton-h: var(--vectis-control-size-skeleton-surface);\n --skeleton-radius: var(--vectis-radius-surface);\n }\n\n /*\n * The pulse: a flat sheet of the lighter shade fades in and out OVER the silhouette.\n *\n * Fading the silhouette itself would be shorter to write, and wrong: it would fade\n * towards the PAGE, which means lightening in the light theme and DARKENING in the\n * dark one — the opposite of what the wave does. Going through an overlay in the\n * derived colour gives the same direction in both, and it is still only an opacity\n * being animated, so it costs no layout.\n */\n .v-skeleton[data-animation='pulse'] .v-skeleton-item::after {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--skeleton-highlight);\n animation: v-skeleton-pulse var(--vectis-duration-1500) var(--vectis-ease-in-out) infinite;\n }\n\n /*\n * The wave: a band of light crossing the silhouette.\n *\n * The gradient is SYMMETRIC — transparent, light, transparent — so the physical angle\n * it is drawn at makes no observable difference, and there is nothing to mirror in a\n * right-to-left page. All that matters is the DIRECTION of the run, and reversing the\n * animation is enough for that. It is exact here because the run is linear, hence\n * identical read backwards; the same argument VProgressLinear uses for its\n * indeterminate bar.\n *\n * The band is moved by a transform, where VProgressLinear runs a logical property.\n * The trade-off is genuinely reversed between the two: that component has a vertical\n * orientation to serve and only ever draws one bar, whereas a page may hold a dozen\n * skeletons, and here a movement the compositor can handle without laying anything\n * out is no longer negotiable.\n */\n .v-skeleton[data-animation='wave'] .v-skeleton-item::after {\n content: '';\n position: absolute;\n inset: 0;\n background-image: linear-gradient(90deg, transparent, var(--skeleton-highlight), transparent);\n animation: v-skeleton-wave var(--vectis-duration-1500) linear infinite;\n }\n\n /* Scoped to the wave: the pulse uses the same overlay, but its run is symmetric in\n time, so reversing it would change nothing at all. */\n .v-skeleton[data-animation='wave']:dir(rtl) .v-skeleton-item::after {\n animation-direction: reverse;\n }\n\n /* These keyframes serve this component alone, so they stay in its own stylesheet.\n Only the spin shared by VSpinner and VProgressCircular is declared globally, in\n styles/utilities.css. */\n @keyframes v-skeleton-pulse {\n from,\n to {\n opacity: 0;\n }\n\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes v-skeleton-wave {\n from {\n translate: -100% 0;\n }\n\n to {\n translate: 100% 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n /*\n * The design system's rule for readers who ask for less motion is to slow down\n * rather than to stop: a motionless placeholder no longer says that anything is in\n * progress. But the wave is a TRANSLATION, which is exactly what those readers are\n * flagging, so it FALLS BACK to the pulse — which keeps the signal without moving\n * anything. Both are then slowed considerably.\n *\n * Since the two animations share the same overlay, all that is left to do is\n * replace the moving gradient with the flat colour.\n *\n * TRAP — this rule has exactly the same specificity as the two it overrides, so it\n * is its position at the END of the stylesheet that makes it win.\n */\n .v-skeleton:is([data-animation='wave'], [data-animation='pulse']) .v-skeleton-item::after {\n background-image: none;\n background-color: var(--skeleton-highlight);\n animation: v-skeleton-pulse var(--vectis-duration-5000) var(--vectis-ease-in-out) infinite;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { useMessages as e } from "../../i18n/state.js";
2
+ import { cssSize as t } from "../../utils/css.js";
3
+ import { Fragment as n, computed as r, createCommentVNode as i, createElementBlock as a, defineComponent as o, normalizeStyle as s, openBlock as c, renderList as l, toDisplayString as u, unref as d } from "vue";
4
+ //#region src/components/VSkeletonLoader/VSkeletonLoader.vue?vue&type=script&setup=true&lang.ts
5
+ var f = [
6
+ "data-shape",
7
+ "data-size",
8
+ "data-compact",
9
+ "data-animation",
10
+ "data-custom",
11
+ "role",
12
+ "aria-hidden"
13
+ ], p = {
14
+ key: 0,
15
+ class: "v-visually-hidden"
16
+ }, m = /*@__PURE__*/ o({
17
+ __name: "VSkeletonLoader",
18
+ props: {
19
+ shape: { default: "text" },
20
+ size: { default: "md" },
21
+ compact: {
22
+ type: Boolean,
23
+ default: !1
24
+ },
25
+ width: { default: void 0 },
26
+ height: { default: void 0 },
27
+ lines: { default: 1 },
28
+ animation: { default: "wave" },
29
+ color: { default: void 0 },
30
+ announce: {
31
+ type: Boolean,
32
+ default: !1
33
+ },
34
+ label: { default: void 0 }
35
+ },
36
+ setup(o) {
37
+ let m = o, h = r(() => Math.max(1, Math.trunc(m.lines))), g = r(() => m.announce || m.label !== void 0), _ = e(), v = r(() => m.label ?? _.value.common.loading);
38
+ return (e, r) => (c(), a("span", {
39
+ class: "v-skeleton v-control",
40
+ "data-shape": o.shape,
41
+ "data-size": o.size,
42
+ "data-compact": o.compact ? "" : void 0,
43
+ "data-animation": o.animation,
44
+ "data-custom": o.color === void 0 ? void 0 : "",
45
+ role: g.value ? "status" : void 0,
46
+ "aria-hidden": g.value ? void 0 : "true",
47
+ style: s({
48
+ "--custom-color": o.color,
49
+ "--skeleton-w": d(t)(o.width),
50
+ "--skeleton-h": d(t)(o.height)
51
+ })
52
+ }, [g.value ? (c(), a("span", p, u(v.value), 1)) : i("", !0), (c(!0), a(n, null, l(h.value, (e) => (c(), a("span", {
53
+ key: e,
54
+ class: "v-skeleton-item"
55
+ }))), 128))], 12, f));
56
+ }
57
+ });
58
+ //#endregion
59
+ export { m as default };
60
+
61
+ //# sourceMappingURL=VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSkeletonLoader.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VSkeletonLoader/VSkeletonLoader.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The grey silhouette standing in for content that has not arrived yet: a line of\n * text, a button, an avatar. It is drawn entirely in CSS.\n *\n * The element rendered is a CONTAINER holding its silhouettes, and not itself the\n * painted shape — the opposite of VProgressLinear. That is what makes several lines\n * possible at no cost, and what keeps every rule below uniform: there is no\n * \"painted root\" case beside a \"painted child\" one. It carries the shared size class,\n * so a skeleton of a given size is exactly as tall as a button of that size.\n *\n * The component MEASURES nothing. It does not look at what it replaces to work out a\n * shape; the shape is declared. The three derived values are all the JavaScript there\n * is — no event, no lifecycle, no DOM.\n */\nimport { computed } from 'vue'\n\nimport { useMessages } from '../../i18n/state'\nimport { cssSize } from '../../utils/css'\n\nexport type SkeletonShape = 'text' | 'control' | 'pill' | 'circle' | 'surface'\nexport type SkeletonAnimation = 'wave' | 'pulse' | 'none'\nexport type SkeletonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\ninterface SkeletonLoaderProps {\n /**\n * What the silhouette stands for. Each value sets both a corner radius and a way of\n * being sized:\n *\n * - `text` follows the typography around it, so several silhouettes occupy exactly\n * as many lines as the text they replace;\n * - `control` takes the height of a control of the given size — a button, a field;\n * - `pill` is that same height with fully rounded ends — a chip, a badge;\n * - `circle` is that height in both dimensions — an avatar, a round icon button;\n * - `surface` is a card or an image, with a height of its own.\n */\n shape?: SkeletonShape\n /**\n * The size on the scale shared by every control. It only means something for the\n * shapes sized like a control: text follows the typography around it, and a surface\n * has its own height.\n */\n size?: SkeletonSize\n /** Takes 4px off the height, as everywhere else in the design system. */\n compact?: boolean\n /**\n * The width: a number is read as pixels, and anything else as a CSS length of your\n * own — `'100%'`, `'12ch'`. Left out, the silhouette takes all the width available.\n */\n width?: number | string\n /** The height, read the same way. It wins over the shape and the size. */\n height?: number | string\n /**\n * How many silhouettes to stack. In the text shape the LAST one is drawn shorter\n * than the others, and that single detail is what reads as a paragraph rather than\n * as a table.\n */\n lines?: number\n /**\n * How the silhouette shows that something is happening. Turning it off freezes it,\n * which suits printing, a screenshot, or a parent already animating.\n */\n animation?: SkeletonAnimation\n /**\n * A background colour of your own, replacing the token. The wave's highlight is\n * DERIVED from it, so it stays correct with nothing else to set.\n */\n color?: string\n /**\n * Announces the loading to screen readers. It is OFF by default, because a skeleton\n * is decorative: a page holds a dozen of them, and a dozen competing announcements\n * are unreadable. What should announce the wait is the container around them,\n * marked as busy.\n */\n announce?: boolean\n /**\n * What is announced, which also IMPLIES announcing. Prefer something situated —\n * \"Loading the results\" — since a generic word is the reason the default is silence.\n * It falls back to the design system dictionary.\n */\n label?: string\n}\n\nconst props = withDefaults(defineProps<SkeletonLoaderProps>(), {\n shape: 'text',\n size: 'md',\n compact: false,\n width: undefined,\n height: undefined,\n lines: 1,\n animation: 'wave',\n color: undefined,\n announce: false,\n label: undefined,\n})\n\n// A guard against two silent bugs: asked for zero lines the component would render\n// NOTHING at all — an invisible skeleton nobody notices is missing — and a fractional\n// count would produce a surprising number of them.\nconst count = computed(() => Math.max(1, Math.trunc(props.lines)))\n\n// @a11y — silent by default, since a dozen silhouettes must not produce a dozen\n// announcements. Supplying a label counts as asking to be announced, otherwise that\n// prop would sit there doing nothing.\nconst announced = computed(() => props.announce || props.label !== undefined)\n\nconst m = useMessages()\n// TRAP — the dictionary must never be read directly in the body of `setup`: the value\n// would be captured once and would stop following a later change of language.\nconst resolvedLabel = computed(() => props.label ?? m.value.common.loading)\n</script>\n\n<template>\n <span\n class=\"v-skeleton v-control\"\n :data-shape=\"shape\"\n :data-size=\"size\"\n :data-compact=\"compact ? '' : undefined\"\n :data-animation=\"animation\"\n :data-custom=\"color !== undefined ? '' : undefined\"\n :role=\"announced ? 'status' : undefined\"\n :aria-hidden=\"announced ? undefined : 'true'\"\n :style=\"{\n '--custom-color': color,\n '--skeleton-w': cssSize(width),\n '--skeleton-h': cssSize(height),\n }\"\n >\n <!--\n TRAP — the label is rendered BEFORE the silhouettes, and that order is\n structural. The rule shortening the last line of a paragraph asks for the last\n CHILD, so a label rendered after them would quietly take that place and no line\n would be shortened. A unit test locks the order.\n\n It costs no layout: the class hiding it takes it out of the flow entirely, so it\n is never one of the stacked items. And it is rendered only when something is\n actually announced — inside a subtree hidden from screen readers it would be text\n nobody can reach.\n -->\n <span v-if=\"announced\" class=\"v-visually-hidden\">{{ resolvedLabel }}</span>\n <span v-for=\"n in count\" :key=\"n\" class=\"v-skeleton-item\" />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n /*\n * The whole geometry comes down to four variables. The shape table below sets them,\n * and the dimension props overwrite them inline — which always wins over a rule\n * targeting the same element, so no specificity contest is possible.\n */\n .v-skeleton {\n /* The grey has a token of its own. No existing colour role holds the right value in\n BOTH themes: the muted surface is too pale in the light one for the pulse to be\n visible at all, and the border colour has the right tone but the wrong meaning. */\n --skeleton-base: var(--vectis-color-surface-skeleton);\n /*\n * The lighter shade the animation sweeps across is DERIVED from the grey rather\n * than named: it is that same colour, a little lighter.\n *\n * Expressing it as a lightness STEP is what makes one declaration correct in both\n * themes. Mixing towards a target colour would not: in the light theme the\n * silhouette is darker than the page, in the dark theme it is LIGHTER than it, so\n * any fixed target would lighten in one and darken in the other. A step in\n * lightness always goes the same way — and in the light theme it naturally stops at\n * white, exactly the page's colour.\n *\n * It also follows a custom colour with nothing else to set. The step itself is a\n * bare ratio, the same tolerance as the opacities.\n */\n --skeleton-highlight: oklch(from var(--skeleton-base) calc(l + 0.06) c h);\n --skeleton-h: var(--control-height);\n --skeleton-radius: var(--vectis-radius-interactive);\n --skeleton-gap: var(--vectis-space-2);\n display: flex;\n flex-direction: column;\n gap: var(--skeleton-gap);\n }\n\n /* A custom colour wins by specificity rather than by order, being one step more\n specific than the rule above — unlike VProgressLinear's tones, which all sit at the\n same level and depend on their sequence. */\n .v-skeleton[data-custom] {\n --skeleton-base: var(--custom-color);\n }\n\n .v-skeleton-item {\n /* The animation's overlay is positioned against this box. */\n position: relative;\n /* The height from the shape table is a DEFAULT: inside a parent that has a height\n of its own, the silhouette grows to fill it — a card fills its slot. */\n flex: 1 1 auto;\n inline-size: var(--skeleton-w, 100%);\n block-size: var(--skeleton-h);\n /* Clipped rather than hidden: hiding the overflow would turn every silhouette into\n a scroll container, for nothing. */\n overflow: clip;\n border-radius: var(--skeleton-radius);\n background: var(--skeleton-base);\n }\n\n /*\n * A line of text is one em tall, which means it follows the typography it INHERITS,\n * and it is centred in the line box the same way a line of text would be.\n *\n * The gap between lines and the padding around them are derived from that same line\n * height, so that N silhouettes occupy exactly N lines of text: replacing them with\n * the real content shifts nothing on the page. The floor guards against a parent\n * whose lines are set tighter than its font size, where the gap would otherwise go\n * negative.\n */\n .v-skeleton[data-shape='text'] {\n --skeleton-h: 1em;\n --skeleton-radius: var(--vectis-radius-pill);\n --skeleton-gap: max(0px, calc(1lh - 1em));\n padding-block: calc(max(0px, calc(1lh - 1em)) / 2);\n }\n\n /* A line of text keeps the height its typography gives it: unlike the other shapes it\n neither stretches in a tall parent nor squashes in a short one. */\n .v-skeleton[data-shape='text'] .v-skeleton-item {\n flex: none;\n }\n\n /*\n * The shortened last line, the one detail that makes a stack of bars read as a\n * paragraph. Asking for a line PRECEDED by another is what guarantees it only\n * applies from two lines up — a single line is not a paragraph — and the proportion\n * is taken from the EFFECTIVE width, so it still works under a `width` prop.\n */\n .v-skeleton[data-shape='text'] .v-skeleton-item + .v-skeleton-item:last-child {\n --skeleton-last-line: 0.6;\n inline-size: calc(var(--skeleton-w, 100%) * var(--skeleton-last-line));\n }\n\n .v-skeleton[data-shape='pill'] {\n --skeleton-radius: var(--vectis-radius-pill);\n }\n\n /*\n * A circle takes its width FROM its height through the ratio, so changing the size\n * alone changes the diameter and nothing has to be kept in step.\n *\n * The container sits inline, like the avatar it replaces, rather than spanning the\n * whole width, and aligning to the start stops the silhouette from being stretched\n * sideways — which is what keeps the circle round.\n */\n .v-skeleton[data-shape='circle'] {\n --skeleton-radius: var(--vectis-radius-pill);\n display: inline-flex;\n align-items: start;\n }\n\n .v-skeleton[data-shape='circle'] .v-skeleton-item {\n /* Left to the content rather than set to the full width, so that the ratio is what\n decides. An explicit `width` still takes over, and then knowingly gives an\n oval. */\n inline-size: var(--skeleton-w, auto);\n aspect-ratio: 1;\n }\n\n /*\n * A surface — a card, an image, a block — has no height anyone could guess without\n * measuring the page, which this component deliberately never does. It takes a\n * default from a token, which the `height` prop overrides, as does any consumer style\n * (theirs sits outside our layers and therefore wins).\n */\n .v-skeleton[data-shape='surface'] {\n --skeleton-h: var(--vectis-control-size-skeleton-surface);\n --skeleton-radius: var(--vectis-radius-surface);\n }\n\n /*\n * The pulse: a flat sheet of the lighter shade fades in and out OVER the silhouette.\n *\n * Fading the silhouette itself would be shorter to write, and wrong: it would fade\n * towards the PAGE, which means lightening in the light theme and DARKENING in the\n * dark one — the opposite of what the wave does. Going through an overlay in the\n * derived colour gives the same direction in both, and it is still only an opacity\n * being animated, so it costs no layout.\n */\n .v-skeleton[data-animation='pulse'] .v-skeleton-item::after {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--skeleton-highlight);\n animation: v-skeleton-pulse var(--vectis-duration-1500) var(--vectis-ease-in-out) infinite;\n }\n\n /*\n * The wave: a band of light crossing the silhouette.\n *\n * The gradient is SYMMETRIC — transparent, light, transparent — so the physical angle\n * it is drawn at makes no observable difference, and there is nothing to mirror in a\n * right-to-left page. All that matters is the DIRECTION of the run, and reversing the\n * animation is enough for that. It is exact here because the run is linear, hence\n * identical read backwards; the same argument VProgressLinear uses for its\n * indeterminate bar.\n *\n * The band is moved by a transform, where VProgressLinear runs a logical property.\n * The trade-off is genuinely reversed between the two: that component has a vertical\n * orientation to serve and only ever draws one bar, whereas a page may hold a dozen\n * skeletons, and here a movement the compositor can handle without laying anything\n * out is no longer negotiable.\n */\n .v-skeleton[data-animation='wave'] .v-skeleton-item::after {\n content: '';\n position: absolute;\n inset: 0;\n background-image: linear-gradient(90deg, transparent, var(--skeleton-highlight), transparent);\n animation: v-skeleton-wave var(--vectis-duration-1500) linear infinite;\n }\n\n /* Scoped to the wave: the pulse uses the same overlay, but its run is symmetric in\n time, so reversing it would change nothing at all. */\n .v-skeleton[data-animation='wave']:dir(rtl) .v-skeleton-item::after {\n animation-direction: reverse;\n }\n\n /* These keyframes serve this component alone, so they stay in its own stylesheet.\n Only the spin shared by VSpinner and VProgressCircular is declared globally, in\n styles/utilities.css. */\n @keyframes v-skeleton-pulse {\n from,\n to {\n opacity: 0;\n }\n\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes v-skeleton-wave {\n from {\n translate: -100% 0;\n }\n\n to {\n translate: 100% 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n /*\n * The design system's rule for readers who ask for less motion is to slow down\n * rather than to stop: a motionless placeholder no longer says that anything is in\n * progress. But the wave is a TRANSLATION, which is exactly what those readers are\n * flagging, so it FALLS BACK to the pulse — which keeps the signal without moving\n * anything. Both are then slowed considerably.\n *\n * Since the two animations share the same overlay, all that is left to do is\n * replace the moving gradient with the flat colour.\n *\n * TRAP — this rule has exactly the same specificity as the two it overrides, so it\n * is its position at the END of the stylesheet that makes it win.\n */\n .v-skeleton:is([data-animation='wave'], [data-animation='pulse']) .v-skeleton-item::after {\n background-image: none;\n background-color: var(--skeleton-highlight);\n animation: v-skeleton-pulse var(--vectis-duration-5000) var(--vectis-ease-in-out) infinite;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmFA,IAAM,IAAQ,GAgBR,IAAQ,QAAe,KAAK,IAAI,GAAG,KAAK,MAAM,EAAM,KAAK,CAAC,CAAC,GAK3D,IAAY,QAAe,EAAM,YAAY,EAAM,UAAU,KAAA,CAAS,GAEtE,IAAI,EAAY,GAGhB,IAAgB,QAAe,EAAM,SAAS,EAAE,MAAM,OAAO,OAAO;yBAIxE,EA4BO,QAAA;GA3BL,OAAM;GACL,cAAY,EAAA;GACZ,aAAW,EAAA;GACX,gBAAc,EAAA,UAAO,KAAQ,KAAA;GAC7B,kBAAgB,EAAA;GAChB,eAAa,EAAA,UAAU,KAAA,IAAiB,KAAA,IAAR;GAChC,MAAM,EAAA,QAAS,WAAc,KAAA;GAC7B,eAAa,EAAA,QAAY,KAAA,IAAS;GAClC,OAAK,EAAA;sBAA4B,EAAA;oBAA6B,EAAA,CAAA,CAAO,CAAC,EAAA,KAAK;oBAAyB,EAAA,CAAA,CAAO,CAAC,EAAA,MAAM;;MAiBvG,EAAA,SAAA,EAAA,GAAZ,EAA2E,QAA3E,GAA2E,EAAvB,EAAA,KAAa,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,GACjE,EAA4D,GAAA,MAAA,EAA1C,EAAA,QAAL,YAAb,EAA4D,QAAA;GAAlC,KAAK;GAAG,OAAM"}
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-slider{--slider-thumb:var(--vectis-control-size-slider-thumb);--slider-track:var(--vectis-control-size-slider-track);align-items:center;column-gap:var(--vectis-space-2);row-gap:var(--vectis-space-1);width:100%;font-family:var(--vectis-text-family);grid-template-columns:minmax(0,1fr);grid-template-areas:"rail";display:grid}.v-slider:has(.v-slider-labels){grid-template-areas:"rail""labels"}.v-slider:has(.v-slider-field-end){grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"rail field-end"}.v-slider:has(.v-slider-field-end):has(.v-slider-labels){grid-template-areas:"rail field-end""labels."}.v-slider:has(.v-slider-field-start){grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"field-start rail field-end"}.v-slider:has(.v-slider-field-start):has(.v-slider-labels){grid-template-areas:"field-start rail field-end"".labels."}.v-slider-rail{block-size:var(--slider-thumb);grid-area:rail;position:relative}.v-slider-control{position:absolute;inset:0}.v-slider-track{block-size:var(--slider-track);border-radius:var(--vectis-radius-full);background:var(--vectis-color-border);margin-block:auto;position:absolute;inset-block:0;inset-inline:0;overflow:hidden}.v-slider-fill{inline-size:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--end-fraction));background:var(--vectis-color-accent);position:absolute;inset-block:0;inset-inline-start:0}.v-slider[data-range] .v-slider-fill{inline-size:calc((100% - var(--slider-thumb)) * (var(--end-fraction) - var(--start-fraction)));inset-inline-start:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--start-fraction))}.v-slider-tick{--slider-tick:calc(var(--slider-track) / 3 * 2);inline-size:var(--slider-tick);block-size:var(--slider-tick);border-radius:var(--vectis-radius-full);background:var(--vectis-color-border-strong);margin-block:auto;position:absolute;inset-block:0;inset-inline-start:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction) - var(--slider-tick) / 2)}.v-slider-tick[data-filled]{background:var(--vectis-color-text-on-accent)}.v-slider-input{appearance:none;pointer-events:none;background:0 0;width:100%;height:100%;margin:0;position:absolute;inset:0}.v-slider:not([data-range]) .v-slider-input{pointer-events:auto;cursor:pointer}.v-slider-input::-webkit-slider-thumb{appearance:none;pointer-events:auto;width:var(--slider-thumb);height:var(--slider-thumb);border-radius:var(--vectis-radius-full);background:var(--vectis-color-surface);border:var(--vectis-control-border-width) solid var(--vectis-color-accent);box-shadow:var(--vectis-shadow-xs);cursor:pointer;transition:background-color var(--vectis-duration-fast) var(--vectis-ease-default)}.v-slider-input::-moz-range-thumb{pointer-events:auto;width:var(--slider-thumb);height:var(--slider-thumb);border-radius:var(--vectis-radius-full);background:var(--vectis-color-surface);border:var(--vectis-control-border-width) solid var(--vectis-color-accent);box-shadow:var(--vectis-shadow-xs);cursor:pointer;transition:background-color var(--vectis-duration-fast) var(--vectis-ease-default)}.v-slider-input:hover:not(:disabled)::-webkit-slider-thumb{background:var(--vectis-color-accent-surface)}.v-slider-input:active:not(:disabled)::-webkit-slider-thumb{background:var(--vectis-color-accent-surface)}.v-slider-input:hover:not(:disabled)::-moz-range-thumb{background:var(--vectis-color-accent-surface)}.v-slider-input:active:not(:disabled)::-moz-range-thumb{background:var(--vectis-color-accent-surface)}.v-slider-input:focus-visible{outline:none}.v-slider-input:focus-visible::-webkit-slider-thumb{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-slider-input:focus-visible::-moz-range-thumb{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-slider-tooltip{opacity:0;visibility:hidden;inline-size:0;transition:opacity var(--vectis-duration-fast) var(--vectis-ease-default), visibility var(--vectis-duration-fast) var(--vectis-ease-default);justify-content:center;display:flex;position:absolute;inset-block-end:calc(100% + var(--vectis-space-2));inset-inline-start:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction))}.v-slider:has(.v-slider-input-start:active) .v-slider-tooltip-start,.v-slider:has(.v-slider-input-start:focus-visible) .v-slider-tooltip-start,.v-slider:has(.v-slider-input-end:active) .v-slider-tooltip-end,.v-slider:has(.v-slider-input-end:focus-visible) .v-slider-tooltip-end{opacity:1;visibility:visible}.v-slider-tooltip-bubble{padding:var(--vectis-space-1) var(--vectis-space-2);background:var(--vectis-color-surface-inverse);color:var(--vectis-color-text-on-inverse);font-size:var(--vectis-text-caption-size);line-height:var(--vectis-text-caption-leading);border-radius:var(--vectis-radius-sm);box-shadow:var(--vectis-shadow-sm);white-space:nowrap}.v-slider-labels{min-block-size:var(--vectis-icon-size-md);--vectis-icon-size:var(--vectis-icon-size-md);font-size:var(--vectis-text-caption-size);color:var(--vectis-color-text-muted);grid-area:labels;position:relative}.v-slider-label{white-space:nowrap;justify-content:center;inline-size:0;display:flex;position:absolute;inset-block-start:0;inset-inline-start:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction))}.v-slider-field.v-input{inline-size:var(--vectis-control-size-slider-field)}.v-slider-field-start{grid-area:field-start}.v-slider-field-end{grid-area:field-end}.v-slider[data-orientation=vertical]{grid-template-columns:none;grid-template-areas:"rail";justify-items:center;inline-size:fit-content}.v-slider[data-orientation=vertical]:has(.v-slider-labels){grid-template-columns:auto auto;grid-template-areas:"rail labels"}.v-slider[data-orientation=vertical]:has(.v-slider-field-end){grid-template-columns:none;grid-template-areas:"field-end""rail"}.v-slider[data-orientation=vertical]:has(.v-slider-field-end):has(.v-slider-labels){grid-template-columns:auto auto;grid-template-areas:"field-end.""rail labels"}.v-slider[data-orientation=vertical]:has(.v-slider-field-start){grid-template-columns:none;grid-template-areas:"field-end""rail""field-start"}.v-slider[data-orientation=vertical]:has(.v-slider-field-start):has(.v-slider-labels){grid-template-columns:auto auto;grid-template-areas:"field-end.""rail labels""field-start."}.v-slider[data-orientation=vertical] .v-slider-rail{inline-size:var(--slider-thumb);block-size:var(--vectis-control-size-slider-length)}.v-slider[data-orientation=vertical] .v-slider-control{writing-mode:vertical-lr;direction:rtl}.v-slider[data-orientation=vertical] .v-slider-tooltip{justify-content:flex-end;align-items:center;block-size:0;inline-size:auto;inset-block-end:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction));inset-inline-start:auto;inset-inline-end:calc(100% + var(--vectis-space-2))}.v-slider[data-orientation=vertical] .v-slider-labels{align-self:stretch;min-block-size:auto}.v-slider[data-orientation=vertical] .v-slider-label{justify-content:flex-start;align-items:center;block-size:0;inline-size:auto;inset-block-start:auto;inset-block-end:calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction));inset-inline-start:0}.v-slider[data-disabled]{cursor:not-allowed}.v-slider[data-disabled] .v-slider-track{background:var(--vectis-color-surface-muted)}.v-slider[data-disabled] .v-slider-fill,.v-slider[data-disabled] .v-slider-tick{background:var(--vectis-color-text-subtle)}.v-slider[data-disabled] .v-slider-tick[data-filled]{background:var(--vectis-color-surface-muted)}.v-slider[data-disabled] .v-slider-labels{color:var(--vectis-color-text-subtle)}.v-slider[data-disabled] .v-slider-input{cursor:not-allowed}.v-slider[data-disabled] .v-slider-input::-webkit-slider-thumb{background:var(--vectis-color-surface-muted);border-color:var(--vectis-color-text-subtle);box-shadow:none;cursor:not-allowed}.v-slider[data-disabled] .v-slider-input::-moz-range-thumb{background:var(--vectis-color-surface-muted);border-color:var(--vectis-color-text-subtle);box-shadow:none;cursor:not-allowed}@media (prefers-reduced-motion:reduce){.v-slider-input::-webkit-slider-thumb{transition:none}.v-slider-input::-moz-range-thumb{transition:none}.v-slider-tooltip{transition:none}}}
@@ -0,0 +1,82 @@
1
+ import { IconSource } from '../VIcon/types.js';
2
+ /**
3
+ * A value chosen by sliding a thumb along a track, and optionally a range between two
4
+ * of them.
5
+ *
6
+ * Underneath is the browser's own range control, which brings the keyboard, the correct
7
+ * announcement to screen readers and the form behaviour with it. The JavaScript covers
8
+ * only what it cannot: stopping the two values from crossing over each other — there is
9
+ * no native control with two thumbs, so a range is two of them superimposed — feeding
10
+ * the optional number fields, which the native element does not validate, and computing
11
+ * the positions of the ticks, the labels and the tooltip.
12
+ *
13
+ * Those positions are handed to the stylesheet as plain fractions written inline, and
14
+ * that is the only binding between the two. They matter because a thumb's centre does
15
+ * NOT travel the full width of the track: it runs from half a thumb in to half a thumb
16
+ * from the end, and everything meant to line up with it has to follow that same run.
17
+ */
18
+ export type SliderLabel = string | {
19
+ icon: IconSource;
20
+ label: string;
21
+ };
22
+ interface SliderProps {
23
+ /** The lowest value the thumb can reach. */
24
+ min?: number;
25
+ /** The highest value the thumb can reach. */
26
+ max?: number;
27
+ /** The gap between two values it can stop on. */
28
+ step?: number;
29
+ /** Offers two thumbs to pick a range, which makes the v-model a pair of values. */
30
+ range?: boolean;
31
+ /** Makes the slider unusable. */
32
+ disabled?: boolean;
33
+ /**
34
+ * What screen readers announce for the slider. In range mode the two thumbs are
35
+ * announced as the start and the end of it.
36
+ */
37
+ label?: string;
38
+ /** Turns the slider upright, with the lowest value at the bottom. */
39
+ orientation?: 'horizontal' | 'vertical';
40
+ /**
41
+ * Adds a number field beside the slider for setting the value exactly — one, or one
42
+ * per end in range mode. Sliding is quick but imprecise; this is the way out.
43
+ */
44
+ inputs?: boolean;
45
+ /**
46
+ * Marks each step on the track. Providing labels implies it. Past fifty steps the
47
+ * marks would be an unreadable comb and are not drawn at all.
48
+ */
49
+ ticks?: boolean;
50
+ /**
51
+ * A label for every step, in order — a piece of text, or an icon with the words that
52
+ * name it for screen readers. They also become what a screen reader announces in
53
+ * place of the raw number.
54
+ */
55
+ labels?: SliderLabel[];
56
+ /** Shows the value in a bubble above the thumb while it is being moved or focused. */
57
+ tooltip?: boolean;
58
+ }
59
+ type __VLS_Props = SliderProps;
60
+ type __VLS_ModelProps = {
61
+ modelValue?: number | [number, number];
62
+ };
63
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
64
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
65
+ "update:modelValue": (value: number | [number, number]) => any;
66
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
67
+ "onUpdate:modelValue"?: ((value: number | [number, number]) => any) | undefined;
68
+ }>, {
69
+ label: string;
70
+ range: boolean;
71
+ orientation: "horizontal" | "vertical";
72
+ disabled: boolean;
73
+ tooltip: boolean;
74
+ max: number;
75
+ step: number;
76
+ inputs: boolean;
77
+ min: number;
78
+ ticks: boolean;
79
+ labels: SliderLabel[];
80
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
81
+ declare const _default: typeof __VLS_export;
82
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import './VSlider.css';
2
+ import e from "./VSlider.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VSlider/VSlider.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VSlider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSlider.js","names":[],"sources":["../../../src/components/VSlider/VSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport type { IconSource } from '../VIcon/types'\nimport VInput from '../VInput/VInput.vue'\n\nimport { isDev } from '../../utils/env'\nimport { useMessages } from '../../i18n/state'\n\n// @core\n/**\n * A value chosen by sliding a thumb along a track, and optionally a range between two\n * of them.\n *\n * Underneath is the browser's own range control, which brings the keyboard, the correct\n * announcement to screen readers and the form behaviour with it. The JavaScript covers\n * only what it cannot: stopping the two values from crossing over each other — there is\n * no native control with two thumbs, so a range is two of them superimposed — feeding\n * the optional number fields, which the native element does not validate, and computing\n * the positions of the ticks, the labels and the tooltip.\n *\n * Those positions are handed to the stylesheet as plain fractions written inline, and\n * that is the only binding between the two. They matter because a thumb's centre does\n * NOT travel the full width of the track: it runs from half a thumb in to half a thumb\n * from the end, and everything meant to line up with it has to follow that same run.\n */\nexport type SliderLabel = string | { icon: IconSource; label: string }\n\ninterface SliderProps {\n /** The lowest value the thumb can reach. */\n min?: number\n /** The highest value the thumb can reach. */\n max?: number\n /** The gap between two values it can stop on. */\n step?: number\n /** Offers two thumbs to pick a range, which makes the v-model a pair of values. */\n range?: boolean\n /** Makes the slider unusable. */\n disabled?: boolean\n /**\n * What screen readers announce for the slider. In range mode the two thumbs are\n * announced as the start and the end of it.\n */\n label?: string\n /** Turns the slider upright, with the lowest value at the bottom. */\n orientation?: 'horizontal' | 'vertical'\n /**\n * Adds a number field beside the slider for setting the value exactly — one, or one\n * per end in range mode. Sliding is quick but imprecise; this is the way out.\n */\n inputs?: boolean\n /**\n * Marks each step on the track. Providing labels implies it. Past fifty steps the\n * marks would be an unreadable comb and are not drawn at all.\n */\n ticks?: boolean\n /**\n * A label for every step, in order — a piece of text, or an icon with the words that\n * name it for screen readers. They also become what a screen reader announces in\n * place of the raw number.\n */\n labels?: SliderLabel[]\n /** Shows the value in a bubble above the thumb while it is being moved or focused. */\n tooltip?: boolean\n}\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n disabled: false,\n label: undefined,\n orientation: 'horizontal',\n inputs: false,\n ticks: false,\n labels: undefined,\n tooltip: false,\n})\n\nconst model = defineModel<number | [number, number]>({ default: 0 })\n\nconst startValue = computed(() => (Array.isArray(model.value) ? model.value[0] : props.min))\nconst endValue = computed(() =>\n Array.isArray(model.value) ? model.value[1] : (model.value as number),\n)\n\n/**\n * Where a value sits along the run, as a fraction between 0 and 1. The guard covers a\n * slider whose two bounds are equal, which would otherwise divide by zero.\n */\nconst frac = (v: number) => Math.min(1, Math.max(0, (v - props.min) / (props.max - props.min || 1)))\n\n// @core — what stops the two values from crossing. A range is two native controls laid\n// over one another, and there is no dual-thumb control to inherit this behaviour from.\nfunction onStartInput(event: Event) {\n const el = event.target as HTMLInputElement\n const clamped = Math.min(Number(el.value), endValue.value)\n el.value = String(clamped)\n model.value = [clamped, endValue.value]\n}\n\nfunction onEndInput(event: Event) {\n const el = event.target as HTMLInputElement\n if (!props.range) {\n model.value = Number(el.value)\n return\n }\n const clamped = Math.max(Number(el.value), startValue.value)\n el.value = String(clamped)\n model.value = [startValue.value, clamped]\n}\n\n/**\n * How many whole steps the thumb can actually stop on. It matters when the range does\n * not divide evenly by the step: the native control stops at the last step that fits,\n * short of the maximum, and the ticks have to agree with it.\n */\nconst stepCount = computed(() => Math.floor((props.max - props.min) / props.step + 1e-9))\n\nconst showTicks = computed(\n () =>\n (props.ticks || props.labels !== undefined) && stepCount.value >= 1 && stepCount.value <= 50,\n)\n\nconst tickItems = computed(() => {\n if (!showTicks.value) return []\n return Array.from({ length: stepCount.value + 1 }, (_, i) => {\n const value = props.min + i * props.step\n const filled = props.range\n ? value >= startValue.value && value <= endValue.value\n : value <= endValue.value\n return { f: frac(value), filled }\n })\n})\n\nconst labelFraction = (index: number) => frac(props.min + index * props.step)\n\n/** What a value is called, if the consumer named its step; failing that, the number itself. */\nfunction labelTextAt(value: number): string {\n const item = props.labels?.[Math.round((value - props.min) / props.step)]\n if (item === undefined) return String(value)\n return typeof item === 'string' ? item : item.label\n}\n\n// @a11y\n/* What each thumb is announced as. There is no prop for the two halves: the wording\n comes from the dictionary, which is also where it is changed.\n\n With a single thumb there is nothing to distinguish: that thumb IS the value, so it\n simply takes the consumer's label, and is left unnamed when none was given. The\n generic fallback applies to the NUMBER FIELD alone, which cannot go unnamed — a bare\n field in a form has to say what it holds. */\nconst m = useMessages()\nconst startLabel = computed(() =>\n props.label ? m.value.slider.rangeStart(props.label) : m.value.slider.start,\n)\nconst endLabel = computed(() =>\n props.label ? m.value.slider.rangeEnd(props.label) : m.value.slider.end,\n)\nconst rangeEndLabel = computed(() => (props.range ? endLabel.value : props.label))\nconst fieldEndLabel = computed(() =>\n props.range ? endLabel.value : (props.label ?? m.value.slider.value),\n)\n\nconst startValueText = computed(() => (props.labels ? labelTextAt(startValue.value) : undefined))\nconst endValueText = computed(() => (props.labels ? labelTextAt(endValue.value) : undefined))\n\n// @devwarn\nif (isDev) {\n if ((props.ticks || props.labels) && stepCount.value > 50)\n console.warn(`[VSlider] ${stepCount.value} steps — ticks/labels not rendered past 50.`)\n if (props.labels && props.labels.length !== stepCount.value + 1)\n console.warn(\n `[VSlider] ${props.labels.length} labels for ${stepCount.value + 1} steps — one label per step expected.`,\n )\n}\n\n// The text held by the number fields, kept apart from the slider's own value.\n//\n// It is typed as text OR a number because these are number fields, whose value Vue\n// converts to a number as soon as it can be read as one — while an empty field, or one\n// holding a half-typed \"1-\", stays text. That is why the value is turned back into text\n// when it is committed.\nconst startFieldText = ref<string | number>(String(startValue.value))\nconst endFieldText = ref<string | number>(String(endValue.value))\n\n// Sliding the thumb keeps the fields in step, continuously.\nwatch(startValue, (v) => (startFieldText.value = String(v)))\nwatch(endValue, (v) => (endFieldText.value = String(v)))\n\n/**\n * Takes what was typed in a field and makes it the value — but only once the reader has\n * finished, on leaving the field or on Enter. Reading it as they type would clamp the\n * \"1\" of \"15\" to the minimum before the 5 was ever pressed.\n *\n * Anything unreadable, an empty field included, silently puts the previous value back.\n */\nfunction commitField(which: 'start' | 'end') {\n const raw = which === 'start' ? startFieldText.value : endFieldText.value\n // TRAP — parsed rather than converted: an empty string parses to nothing, which is\n // what triggers the revert below, where converting it would give ZERO and quietly\n // overwrite the value with it.\n const parsed = Number.parseFloat(String(raw))\n if (Number.isNaN(parsed)) {\n resyncFields()\n return\n }\n const clamped = Math.min(props.max, Math.max(props.min, parsed))\n // Brought onto the nearest step. The rounding that follows removes the noise decimal\n // steps leave behind — a tenth cannot be represented exactly, so 0.1 × 3 comes out as\n // 0.30000000000000004.\n let value = props.min + Math.round((clamped - props.min) / props.step) * props.step\n value = Math.min(props.max, Math.round(value * 1e10) / 1e10)\n if (!props.range) {\n model.value = value\n } else if (which === 'start') {\n model.value = [Math.min(value, endValue.value), endValue.value]\n } else {\n model.value = [startValue.value, Math.max(value, startValue.value)]\n }\n // Put back explicitly, because a commit that does not change the value — typing 200\n // where the maximum is 100 — changes nothing for the watchers to react to, and the\n // field would go on showing what was typed.\n resyncFields()\n}\n\nfunction resyncFields() {\n startFieldText.value = String(startValue.value)\n endFieldText.value = String(endValue.value)\n}\n</script>\n\n<template>\n <div\n class=\"v-slider\"\n :data-range=\"range ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-orientation=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :style=\"{\n '--start-fraction': String(frac(startValue)),\n '--end-fraction': String(frac(endValue)),\n }\"\n >\n <VInput\n v-if=\"inputs && range\"\n v-model=\"startFieldText\"\n class=\"v-slider-field v-slider-field-start\"\n type=\"number\"\n size=\"sm\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"startLabel\"\n @change=\"commitField('start')\"\n />\n <div class=\"v-slider-rail\">\n <span class=\"v-slider-control\">\n <span class=\"v-slider-track\" aria-hidden=\"true\">\n <span class=\"v-slider-fill\" />\n <span\n v-for=\"(tick, i) in tickItems\"\n :key=\"i\"\n class=\"v-slider-tick\"\n :data-filled=\"tick.filled ? '' : undefined\"\n :style=\"{ '--fill-fraction': String(tick.f) }\"\n />\n </span>\n <input\n v-if=\"range\"\n type=\"range\"\n class=\"v-slider-input v-slider-input-start\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :value=\"startValue\"\n :aria-label=\"startLabel\"\n :aria-valuetext=\"startValueText\"\n @input=\"onStartInput\"\n />\n <input\n type=\"range\"\n class=\"v-slider-input v-slider-input-end\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :value=\"endValue\"\n :aria-label=\"rangeEndLabel\"\n :aria-valuetext=\"endValueText\"\n @input=\"onEndInput\"\n />\n </span>\n <span\n v-if=\"tooltip && range\"\n class=\"v-slider-tooltip v-slider-tooltip-start\"\n aria-hidden=\"true\"\n :style=\"{ '--fill-fraction': String(frac(startValue)) }\"\n >\n <span class=\"v-slider-tooltip-bubble\">{{ startValueText ?? startValue }}</span>\n </span>\n <span\n v-if=\"tooltip\"\n class=\"v-slider-tooltip v-slider-tooltip-end\"\n aria-hidden=\"true\"\n :style=\"{ '--fill-fraction': String(frac(endValue)) }\"\n >\n <span class=\"v-slider-tooltip-bubble\">{{ endValueText ?? endValue }}</span>\n </span>\n </div>\n <div v-if=\"labels\" class=\"v-slider-labels\">\n <span\n v-for=\"(item, i) in labels\"\n :key=\"i\"\n class=\"v-slider-label\"\n :style=\"{ '--fill-fraction': String(labelFraction(i)) }\"\n >\n <template v-if=\"typeof item === 'string'\">{{ item }}</template>\n <VIcon v-else v-bind=\"iconProps(item.icon)\" :label=\"item.label\" />\n </span>\n </div>\n <VInput\n v-if=\"inputs\"\n v-model=\"endFieldText\"\n class=\"v-slider-field v-slider-field-end\"\n type=\"number\"\n size=\"sm\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"fieldEndLabel\"\n @change=\"commitField('end')\"\n />\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-slider {\n --slider-thumb: var(--vectis-control-size-slider-thumb);\n --slider-track: var(--vectis-control-size-slider-track);\n display: grid;\n grid-template-areas: 'rail';\n grid-template-columns: minmax(0, 1fr);\n align-items: center;\n column-gap: var(--vectis-space-2);\n row-gap: var(--vectis-space-1);\n width: 100%;\n font-family: var(--vectis-text-family);\n }\n\n .v-slider:has(.v-slider-labels) {\n grid-template-areas: 'rail' 'labels';\n }\n\n .v-slider:has(.v-slider-field-end) {\n grid-template-areas: 'rail field-end';\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .v-slider:has(.v-slider-field-end):has(.v-slider-labels) {\n grid-template-areas: 'rail field-end' 'labels .';\n }\n\n .v-slider:has(.v-slider-field-start) {\n grid-template-areas: 'field-start rail field-end';\n grid-template-columns: auto minmax(0, 1fr) auto;\n }\n\n .v-slider:has(.v-slider-field-start):has(.v-slider-labels) {\n grid-template-areas: 'field-start rail field-end' '. labels .';\n }\n\n .v-slider-rail {\n grid-area: rail;\n position: relative;\n block-size: var(--slider-thumb);\n }\n\n .v-slider-control {\n position: absolute;\n inset: 0;\n }\n\n .v-slider-track {\n position: absolute;\n inset-inline: 0;\n inset-block: 0;\n margin-block: auto;\n block-size: var(--slider-track);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-border);\n overflow: hidden;\n }\n\n .v-slider-fill {\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n inline-size: calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--end-fraction));\n background: var(--vectis-color-accent);\n }\n\n .v-slider[data-range] .v-slider-fill {\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--start-fraction)\n );\n inline-size: calc((100% - var(--slider-thumb)) * (var(--end-fraction) - var(--start-fraction)));\n }\n\n .v-slider-tick {\n --slider-tick: calc(var(--slider-track) / 3 * 2);\n position: absolute;\n inset-block: 0;\n margin-block: auto;\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction) -\n var(--slider-tick) / 2\n );\n inline-size: var(--slider-tick);\n block-size: var(--slider-tick);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-border-strong);\n }\n\n .v-slider-tick[data-filled] {\n background: var(--vectis-color-text-on-accent);\n }\n\n /* The two controls lie exactly on top of one another, so only their thumbs are allowed\n to receive the pointer. Without that, the one on top would swallow every click and\n the other thumb could never be grabbed. */\n .v-slider-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n appearance: none;\n background: transparent;\n pointer-events: none;\n }\n\n /* With a single thumb there is nothing underneath to protect, so the whole control\n takes the pointer again — which is what makes clicking the track jump the value\n there and start dragging at once, natively and with no code at all. The accepted\n side effect is that the thumb lights up when the pointer is anywhere over the\n track. */\n .v-slider:not([data-range]) .v-slider-input {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .v-slider-input::-webkit-slider-thumb {\n appearance: none;\n pointer-events: auto;\n width: var(--slider-thumb);\n height: var(--slider-thumb);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-surface);\n border: var(--vectis-control-border-width) solid var(--vectis-color-accent);\n box-shadow: var(--vectis-shadow-xs);\n cursor: pointer;\n transition: background-color var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-slider-input::-moz-range-thumb {\n pointer-events: auto;\n width: var(--slider-thumb);\n height: var(--slider-thumb);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-surface);\n border: var(--vectis-control-border-width) solid var(--vectis-color-accent);\n box-shadow: var(--vectis-shadow-xs);\n cursor: pointer;\n transition: background-color var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n /* The thumb tints as the pointer rests on it or drags it. TRAP — the state is read on\n the control and the thumb is then addressed, never the reverse: a state pseudo-class\n written after the thumb's own pseudo-element is unreliable across browsers. */\n .v-slider-input:hover:not(:disabled)::-webkit-slider-thumb,\n .v-slider-input:active:not(:disabled)::-webkit-slider-thumb {\n background: var(--vectis-color-accent-surface);\n }\n\n .v-slider-input:hover:not(:disabled)::-moz-range-thumb,\n .v-slider-input:active:not(:disabled)::-moz-range-thumb {\n background: var(--vectis-color-accent-surface);\n }\n\n .v-slider-input:focus-visible {\n outline: none;\n }\n\n .v-slider-input:focus-visible::-webkit-slider-thumb {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: var(--vectis-focus-ring-offset);\n }\n\n .v-slider-input:focus-visible::-moz-range-thumb {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: var(--vectis-focus-ring-offset);\n }\n\n /* The bubble showing the value. It looks like a VTooltip but is placed by arithmetic\n rather than anchored to the thumb: a native thumb is a pseudo-element, and the\n browser's anchoring cannot attach anything to one. */\n .v-slider-tooltip {\n position: absolute;\n inset-block-end: calc(100% + var(--vectis-space-2));\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inline-size: 0;\n display: flex;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--vectis-duration-fast) var(--vectis-ease-default),\n visibility var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-slider:has(.v-slider-input-start:active) .v-slider-tooltip-start,\n .v-slider:has(.v-slider-input-start:focus-visible) .v-slider-tooltip-start,\n .v-slider:has(.v-slider-input-end:active) .v-slider-tooltip-end,\n .v-slider:has(.v-slider-input-end:focus-visible) .v-slider-tooltip-end {\n opacity: 1;\n visibility: visible;\n }\n\n .v-slider-tooltip-bubble {\n padding: var(--vectis-space-1) var(--vectis-space-2);\n background: var(--vectis-color-surface-inverse);\n color: var(--vectis-color-text-on-inverse);\n font-size: var(--vectis-text-caption-size);\n line-height: var(--vectis-text-caption-leading);\n border-radius: var(--vectis-radius-sm);\n box-shadow: var(--vectis-shadow-sm);\n white-space: nowrap;\n }\n\n .v-slider-labels {\n grid-area: labels;\n position: relative;\n /* The labels are positioned individually and therefore contribute no height of\n their own; this reserves enough room for either kind, a small line of text or an\n icon. */\n min-block-size: var(--vectis-icon-size-md);\n --vectis-icon-size: var(--vectis-icon-size-md);\n font-size: var(--vectis-text-caption-size);\n color: var(--vectis-color-text-muted);\n }\n\n /* A box of zero width placed exactly on the step: its content then overflows equally\n on both sides, which centres it there. Centring it with a transform would be the\n usual trick, but a transform is physical and would have to be undone for the\n vertical orientation and again for a right-to-left page. */\n .v-slider-label {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inline-size: 0;\n display: flex;\n justify-content: center;\n white-space: nowrap;\n }\n\n .v-slider-field.v-input {\n inline-size: var(--vectis-control-size-slider-field);\n }\n\n .v-slider-field-start {\n grid-area: field-start;\n }\n\n .v-slider-field-end {\n grid-area: field-end;\n }\n\n .v-slider[data-orientation='vertical'] {\n grid-template-areas: 'rail';\n grid-template-columns: none;\n inline-size: fit-content;\n justify-items: center;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-labels) {\n grid-template-areas: 'rail labels';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-end) {\n grid-template-areas: 'field-end' 'rail';\n grid-template-columns: none;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-end):has(.v-slider-labels) {\n grid-template-areas: 'field-end .' 'rail labels';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-start) {\n grid-template-areas: 'field-end' 'rail' 'field-start';\n grid-template-columns: none;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-start):has(.v-slider-labels) {\n grid-template-areas: 'field-end .' 'rail labels' 'field-start .';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-rail {\n inline-size: var(--slider-thumb);\n block-size: var(--vectis-control-size-slider-length);\n }\n\n /* Only this inner box is turned upright, and that is the whole trick: the track, the\n fill and the ticks are all placed with logical properties, so they follow the change\n of axis with no rule written a second time — while the bubbles and the labels stay\n outside that box, and therefore keep their text horizontal.\n\n The direction is reversed with it so that the lowest value ends up at the bottom. */\n .v-slider[data-orientation='vertical'] .v-slider-control {\n writing-mode: vertical-lr;\n direction: rtl;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-tooltip {\n inset-block-end: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inset-inline-start: auto;\n inset-inline-end: calc(100% + var(--vectis-space-2));\n inline-size: auto;\n block-size: 0;\n align-items: center;\n justify-content: flex-end;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-labels {\n align-self: stretch;\n min-block-size: auto;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-label {\n inset-block-start: auto;\n inset-block-end: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inset-inline-start: 0;\n inline-size: auto;\n block-size: 0;\n align-items: center;\n justify-content: flex-start;\n }\n\n /* A disabled slider greys out through the colour tokens, the same ones VCheckbox and\n VSwitch use, and never through opacity. */\n .v-slider[data-disabled] {\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-track {\n background: var(--vectis-color-surface-muted);\n }\n\n .v-slider[data-disabled] .v-slider-fill {\n background: var(--vectis-color-text-subtle);\n }\n\n .v-slider[data-disabled] .v-slider-tick {\n background: var(--vectis-color-text-subtle);\n }\n\n /* A tick sitting on the greyed fill takes the light colour back, so that it stays\n visible against it — the same inversion VCheckbox applies to its disabled tick. */\n .v-slider[data-disabled] .v-slider-tick[data-filled] {\n background: var(--vectis-color-surface-muted);\n }\n\n .v-slider[data-disabled] .v-slider-labels {\n color: var(--vectis-color-text-subtle);\n }\n\n .v-slider[data-disabled] .v-slider-input {\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-input::-webkit-slider-thumb {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-text-subtle);\n box-shadow: none;\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-input::-moz-range-thumb {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-text-subtle);\n box-shadow: none;\n cursor: not-allowed;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-slider-input::-webkit-slider-thumb {\n transition: none;\n }\n\n .v-slider-input::-moz-range-thumb {\n transition: none;\n }\n\n .v-slider-tooltip {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,220 @@
1
+ import { useMessages as e } from "../../i18n/state.js";
2
+ import t from "../VIcon/VIcon.js";
3
+ import { iconProps as n } from "../VIcon/iconProps.js";
4
+ import r from "../VInput/VInput.js";
5
+ import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, defineComponent as d, mergeModels as f, mergeProps as p, normalizeStyle as m, openBlock as h, ref as g, renderList as _, toDisplayString as v, unref as y, useModel as b, watch as x } from "vue";
6
+ //#region src/components/VSlider/VSlider.vue?vue&type=script&setup=true&lang.ts
7
+ var S = [
8
+ "data-range",
9
+ "data-disabled",
10
+ "data-orientation"
11
+ ], C = { class: "v-slider-rail" }, w = { class: "v-slider-control" }, T = {
12
+ class: "v-slider-track",
13
+ "aria-hidden": "true"
14
+ }, E = ["data-filled"], D = [
15
+ "min",
16
+ "max",
17
+ "step",
18
+ "disabled",
19
+ "value",
20
+ "aria-label",
21
+ "aria-valuetext"
22
+ ], O = [
23
+ "min",
24
+ "max",
25
+ "step",
26
+ "disabled",
27
+ "value",
28
+ "aria-label",
29
+ "aria-valuetext"
30
+ ], k = { class: "v-slider-tooltip-bubble" }, A = { class: "v-slider-tooltip-bubble" }, j = {
31
+ key: 1,
32
+ class: "v-slider-labels"
33
+ }, M = /*@__PURE__*/ d({
34
+ __name: "VSlider",
35
+ props: /*@__PURE__*/ f({
36
+ min: { default: 0 },
37
+ max: { default: 100 },
38
+ step: { default: 1 },
39
+ range: {
40
+ type: Boolean,
41
+ default: !1
42
+ },
43
+ disabled: {
44
+ type: Boolean,
45
+ default: !1
46
+ },
47
+ label: { default: void 0 },
48
+ orientation: { default: "horizontal" },
49
+ inputs: {
50
+ type: Boolean,
51
+ default: !1
52
+ },
53
+ ticks: {
54
+ type: Boolean,
55
+ default: !1
56
+ },
57
+ labels: { default: void 0 },
58
+ tooltip: {
59
+ type: Boolean,
60
+ default: !1
61
+ }
62
+ }, {
63
+ modelValue: { default: 0 },
64
+ modelModifiers: {}
65
+ }),
66
+ emits: ["update:modelValue"],
67
+ setup(d) {
68
+ let f = d, M = b(d, "modelValue"), N = a(() => Array.isArray(M.value) ? M.value[0] : f.min), P = a(() => Array.isArray(M.value) ? M.value[1] : M.value), F = (e) => Math.min(1, Math.max(0, (e - f.min) / (f.max - f.min || 1)));
69
+ function I(e) {
70
+ let t = e.target, n = Math.min(Number(t.value), P.value);
71
+ t.value = String(n), M.value = [n, P.value];
72
+ }
73
+ function L(e) {
74
+ let t = e.target;
75
+ if (!f.range) {
76
+ M.value = Number(t.value);
77
+ return;
78
+ }
79
+ let n = Math.max(Number(t.value), N.value);
80
+ t.value = String(n), M.value = [N.value, n];
81
+ }
82
+ let R = a(() => Math.floor((f.max - f.min) / f.step + 1e-9)), z = a(() => (f.ticks || f.labels !== void 0) && R.value >= 1 && R.value <= 50), B = a(() => z.value ? Array.from({ length: R.value + 1 }, (e, t) => {
83
+ let n = f.min + t * f.step, r = f.range ? n >= N.value && n <= P.value : n <= P.value;
84
+ return {
85
+ f: F(n),
86
+ filled: r
87
+ };
88
+ }) : []), V = (e) => F(f.min + e * f.step);
89
+ function H(e) {
90
+ let t = f.labels?.[Math.round((e - f.min) / f.step)];
91
+ return t === void 0 ? String(e) : typeof t == "string" ? t : t.label;
92
+ }
93
+ let U = e(), W = a(() => f.label ? U.value.slider.rangeStart(f.label) : U.value.slider.start), G = a(() => f.label ? U.value.slider.rangeEnd(f.label) : U.value.slider.end), K = a(() => f.range ? G.value : f.label), q = a(() => f.range ? G.value : f.label ?? U.value.slider.value), J = a(() => f.labels ? H(N.value) : void 0), Y = a(() => f.labels ? H(P.value) : void 0), X = g(String(N.value)), Z = g(String(P.value));
94
+ x(N, (e) => X.value = String(e)), x(P, (e) => Z.value = String(e));
95
+ function Q(e) {
96
+ let t = e === "start" ? X.value : Z.value, n = Number.parseFloat(String(t));
97
+ if (Number.isNaN(n)) {
98
+ $();
99
+ return;
100
+ }
101
+ let r = Math.min(f.max, Math.max(f.min, n)), i = f.min + Math.round((r - f.min) / f.step) * f.step;
102
+ i = Math.min(f.max, Math.round(i * 1e10) / 1e10), f.range ? e === "start" ? M.value = [Math.min(i, P.value), P.value] : M.value = [N.value, Math.max(i, N.value)] : M.value = i, $();
103
+ }
104
+ function $() {
105
+ X.value = String(N.value), Z.value = String(P.value);
106
+ }
107
+ return (e, a) => (h(), c("div", {
108
+ class: "v-slider",
109
+ "data-range": d.range ? "" : void 0,
110
+ "data-disabled": d.disabled ? "" : void 0,
111
+ "data-orientation": d.orientation === "vertical" ? "vertical" : void 0,
112
+ style: m({
113
+ "--start-fraction": String(F(N.value)),
114
+ "--end-fraction": String(F(P.value))
115
+ })
116
+ }, [
117
+ d.inputs && d.range ? (h(), o(r, {
118
+ key: 0,
119
+ modelValue: X.value,
120
+ "onUpdate:modelValue": a[0] ||= (e) => X.value = e,
121
+ class: "v-slider-field v-slider-field-start",
122
+ type: "number",
123
+ size: "sm",
124
+ min: d.min,
125
+ max: d.max,
126
+ step: d.step,
127
+ disabled: d.disabled,
128
+ "aria-label": W.value,
129
+ onChange: a[1] ||= (e) => Q("start")
130
+ }, null, 8, [
131
+ "modelValue",
132
+ "min",
133
+ "max",
134
+ "step",
135
+ "disabled",
136
+ "aria-label"
137
+ ])) : s("", !0),
138
+ l("div", C, [
139
+ l("span", w, [
140
+ l("span", T, [a[4] ||= l("span", { class: "v-slider-fill" }, null, -1), (h(!0), c(i, null, _(B.value, (e, t) => (h(), c("span", {
141
+ key: t,
142
+ class: "v-slider-tick",
143
+ "data-filled": e.filled ? "" : void 0,
144
+ style: m({ "--fill-fraction": String(e.f) })
145
+ }, null, 12, E))), 128))]),
146
+ d.range ? (h(), c("input", {
147
+ key: 0,
148
+ type: "range",
149
+ class: "v-slider-input v-slider-input-start",
150
+ min: d.min,
151
+ max: d.max,
152
+ step: d.step,
153
+ disabled: d.disabled,
154
+ value: N.value,
155
+ "aria-label": W.value,
156
+ "aria-valuetext": J.value,
157
+ onInput: I
158
+ }, null, 40, D)) : s("", !0),
159
+ l("input", {
160
+ type: "range",
161
+ class: "v-slider-input v-slider-input-end",
162
+ min: d.min,
163
+ max: d.max,
164
+ step: d.step,
165
+ disabled: d.disabled,
166
+ value: P.value,
167
+ "aria-label": K.value,
168
+ "aria-valuetext": Y.value,
169
+ onInput: L
170
+ }, null, 40, O)
171
+ ]),
172
+ d.tooltip && d.range ? (h(), c("span", {
173
+ key: 0,
174
+ class: "v-slider-tooltip v-slider-tooltip-start",
175
+ "aria-hidden": "true",
176
+ style: m({ "--fill-fraction": String(F(N.value)) })
177
+ }, [l("span", k, v(J.value ?? N.value), 1)], 4)) : s("", !0),
178
+ d.tooltip ? (h(), c("span", {
179
+ key: 1,
180
+ class: "v-slider-tooltip v-slider-tooltip-end",
181
+ "aria-hidden": "true",
182
+ style: m({ "--fill-fraction": String(F(P.value)) })
183
+ }, [l("span", A, v(Y.value ?? P.value), 1)], 4)) : s("", !0)
184
+ ]),
185
+ d.labels ? (h(), c("div", j, [(h(!0), c(i, null, _(d.labels, (e, r) => (h(), c("span", {
186
+ key: r,
187
+ class: "v-slider-label",
188
+ style: m({ "--fill-fraction": String(V(r)) })
189
+ }, [typeof e == "string" ? (h(), c(i, { key: 0 }, [u(v(e), 1)], 64)) : (h(), o(t, p({
190
+ key: 1,
191
+ ref_for: !0
192
+ }, y(n)(e.icon), { label: e.label }), null, 16, ["label"]))], 4))), 128))])) : s("", !0),
193
+ d.inputs ? (h(), o(r, {
194
+ key: 2,
195
+ modelValue: Z.value,
196
+ "onUpdate:modelValue": a[2] ||= (e) => Z.value = e,
197
+ class: "v-slider-field v-slider-field-end",
198
+ type: "number",
199
+ size: "sm",
200
+ min: d.min,
201
+ max: d.max,
202
+ step: d.step,
203
+ disabled: d.disabled,
204
+ "aria-label": q.value,
205
+ onChange: a[3] ||= (e) => Q("end")
206
+ }, null, 8, [
207
+ "modelValue",
208
+ "min",
209
+ "max",
210
+ "step",
211
+ "disabled",
212
+ "aria-label"
213
+ ])) : s("", !0)
214
+ ], 12, S));
215
+ }
216
+ });
217
+ //#endregion
218
+ export { M as default };
219
+
220
+ //# sourceMappingURL=VSlider.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VSlider.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VSlider/VSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport type { IconSource } from '../VIcon/types'\nimport VInput from '../VInput/VInput.vue'\n\nimport { isDev } from '../../utils/env'\nimport { useMessages } from '../../i18n/state'\n\n// @core\n/**\n * A value chosen by sliding a thumb along a track, and optionally a range between two\n * of them.\n *\n * Underneath is the browser's own range control, which brings the keyboard, the correct\n * announcement to screen readers and the form behaviour with it. The JavaScript covers\n * only what it cannot: stopping the two values from crossing over each other — there is\n * no native control with two thumbs, so a range is two of them superimposed — feeding\n * the optional number fields, which the native element does not validate, and computing\n * the positions of the ticks, the labels and the tooltip.\n *\n * Those positions are handed to the stylesheet as plain fractions written inline, and\n * that is the only binding between the two. They matter because a thumb's centre does\n * NOT travel the full width of the track: it runs from half a thumb in to half a thumb\n * from the end, and everything meant to line up with it has to follow that same run.\n */\nexport type SliderLabel = string | { icon: IconSource; label: string }\n\ninterface SliderProps {\n /** The lowest value the thumb can reach. */\n min?: number\n /** The highest value the thumb can reach. */\n max?: number\n /** The gap between two values it can stop on. */\n step?: number\n /** Offers two thumbs to pick a range, which makes the v-model a pair of values. */\n range?: boolean\n /** Makes the slider unusable. */\n disabled?: boolean\n /**\n * What screen readers announce for the slider. In range mode the two thumbs are\n * announced as the start and the end of it.\n */\n label?: string\n /** Turns the slider upright, with the lowest value at the bottom. */\n orientation?: 'horizontal' | 'vertical'\n /**\n * Adds a number field beside the slider for setting the value exactly — one, or one\n * per end in range mode. Sliding is quick but imprecise; this is the way out.\n */\n inputs?: boolean\n /**\n * Marks each step on the track. Providing labels implies it. Past fifty steps the\n * marks would be an unreadable comb and are not drawn at all.\n */\n ticks?: boolean\n /**\n * A label for every step, in order — a piece of text, or an icon with the words that\n * name it for screen readers. They also become what a screen reader announces in\n * place of the raw number.\n */\n labels?: SliderLabel[]\n /** Shows the value in a bubble above the thumb while it is being moved or focused. */\n tooltip?: boolean\n}\n\nconst props = withDefaults(defineProps<SliderProps>(), {\n min: 0,\n max: 100,\n step: 1,\n range: false,\n disabled: false,\n label: undefined,\n orientation: 'horizontal',\n inputs: false,\n ticks: false,\n labels: undefined,\n tooltip: false,\n})\n\nconst model = defineModel<number | [number, number]>({ default: 0 })\n\nconst startValue = computed(() => (Array.isArray(model.value) ? model.value[0] : props.min))\nconst endValue = computed(() =>\n Array.isArray(model.value) ? model.value[1] : (model.value as number),\n)\n\n/**\n * Where a value sits along the run, as a fraction between 0 and 1. The guard covers a\n * slider whose two bounds are equal, which would otherwise divide by zero.\n */\nconst frac = (v: number) => Math.min(1, Math.max(0, (v - props.min) / (props.max - props.min || 1)))\n\n// @core — what stops the two values from crossing. A range is two native controls laid\n// over one another, and there is no dual-thumb control to inherit this behaviour from.\nfunction onStartInput(event: Event) {\n const el = event.target as HTMLInputElement\n const clamped = Math.min(Number(el.value), endValue.value)\n el.value = String(clamped)\n model.value = [clamped, endValue.value]\n}\n\nfunction onEndInput(event: Event) {\n const el = event.target as HTMLInputElement\n if (!props.range) {\n model.value = Number(el.value)\n return\n }\n const clamped = Math.max(Number(el.value), startValue.value)\n el.value = String(clamped)\n model.value = [startValue.value, clamped]\n}\n\n/**\n * How many whole steps the thumb can actually stop on. It matters when the range does\n * not divide evenly by the step: the native control stops at the last step that fits,\n * short of the maximum, and the ticks have to agree with it.\n */\nconst stepCount = computed(() => Math.floor((props.max - props.min) / props.step + 1e-9))\n\nconst showTicks = computed(\n () =>\n (props.ticks || props.labels !== undefined) && stepCount.value >= 1 && stepCount.value <= 50,\n)\n\nconst tickItems = computed(() => {\n if (!showTicks.value) return []\n return Array.from({ length: stepCount.value + 1 }, (_, i) => {\n const value = props.min + i * props.step\n const filled = props.range\n ? value >= startValue.value && value <= endValue.value\n : value <= endValue.value\n return { f: frac(value), filled }\n })\n})\n\nconst labelFraction = (index: number) => frac(props.min + index * props.step)\n\n/** What a value is called, if the consumer named its step; failing that, the number itself. */\nfunction labelTextAt(value: number): string {\n const item = props.labels?.[Math.round((value - props.min) / props.step)]\n if (item === undefined) return String(value)\n return typeof item === 'string' ? item : item.label\n}\n\n// @a11y\n/* What each thumb is announced as. There is no prop for the two halves: the wording\n comes from the dictionary, which is also where it is changed.\n\n With a single thumb there is nothing to distinguish: that thumb IS the value, so it\n simply takes the consumer's label, and is left unnamed when none was given. The\n generic fallback applies to the NUMBER FIELD alone, which cannot go unnamed — a bare\n field in a form has to say what it holds. */\nconst m = useMessages()\nconst startLabel = computed(() =>\n props.label ? m.value.slider.rangeStart(props.label) : m.value.slider.start,\n)\nconst endLabel = computed(() =>\n props.label ? m.value.slider.rangeEnd(props.label) : m.value.slider.end,\n)\nconst rangeEndLabel = computed(() => (props.range ? endLabel.value : props.label))\nconst fieldEndLabel = computed(() =>\n props.range ? endLabel.value : (props.label ?? m.value.slider.value),\n)\n\nconst startValueText = computed(() => (props.labels ? labelTextAt(startValue.value) : undefined))\nconst endValueText = computed(() => (props.labels ? labelTextAt(endValue.value) : undefined))\n\n// @devwarn\nif (isDev) {\n if ((props.ticks || props.labels) && stepCount.value > 50)\n console.warn(`[VSlider] ${stepCount.value} steps — ticks/labels not rendered past 50.`)\n if (props.labels && props.labels.length !== stepCount.value + 1)\n console.warn(\n `[VSlider] ${props.labels.length} labels for ${stepCount.value + 1} steps — one label per step expected.`,\n )\n}\n\n// The text held by the number fields, kept apart from the slider's own value.\n//\n// It is typed as text OR a number because these are number fields, whose value Vue\n// converts to a number as soon as it can be read as one — while an empty field, or one\n// holding a half-typed \"1-\", stays text. That is why the value is turned back into text\n// when it is committed.\nconst startFieldText = ref<string | number>(String(startValue.value))\nconst endFieldText = ref<string | number>(String(endValue.value))\n\n// Sliding the thumb keeps the fields in step, continuously.\nwatch(startValue, (v) => (startFieldText.value = String(v)))\nwatch(endValue, (v) => (endFieldText.value = String(v)))\n\n/**\n * Takes what was typed in a field and makes it the value — but only once the reader has\n * finished, on leaving the field or on Enter. Reading it as they type would clamp the\n * \"1\" of \"15\" to the minimum before the 5 was ever pressed.\n *\n * Anything unreadable, an empty field included, silently puts the previous value back.\n */\nfunction commitField(which: 'start' | 'end') {\n const raw = which === 'start' ? startFieldText.value : endFieldText.value\n // TRAP — parsed rather than converted: an empty string parses to nothing, which is\n // what triggers the revert below, where converting it would give ZERO and quietly\n // overwrite the value with it.\n const parsed = Number.parseFloat(String(raw))\n if (Number.isNaN(parsed)) {\n resyncFields()\n return\n }\n const clamped = Math.min(props.max, Math.max(props.min, parsed))\n // Brought onto the nearest step. The rounding that follows removes the noise decimal\n // steps leave behind — a tenth cannot be represented exactly, so 0.1 × 3 comes out as\n // 0.30000000000000004.\n let value = props.min + Math.round((clamped - props.min) / props.step) * props.step\n value = Math.min(props.max, Math.round(value * 1e10) / 1e10)\n if (!props.range) {\n model.value = value\n } else if (which === 'start') {\n model.value = [Math.min(value, endValue.value), endValue.value]\n } else {\n model.value = [startValue.value, Math.max(value, startValue.value)]\n }\n // Put back explicitly, because a commit that does not change the value — typing 200\n // where the maximum is 100 — changes nothing for the watchers to react to, and the\n // field would go on showing what was typed.\n resyncFields()\n}\n\nfunction resyncFields() {\n startFieldText.value = String(startValue.value)\n endFieldText.value = String(endValue.value)\n}\n</script>\n\n<template>\n <div\n class=\"v-slider\"\n :data-range=\"range ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-orientation=\"orientation === 'vertical' ? 'vertical' : undefined\"\n :style=\"{\n '--start-fraction': String(frac(startValue)),\n '--end-fraction': String(frac(endValue)),\n }\"\n >\n <VInput\n v-if=\"inputs && range\"\n v-model=\"startFieldText\"\n class=\"v-slider-field v-slider-field-start\"\n type=\"number\"\n size=\"sm\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"startLabel\"\n @change=\"commitField('start')\"\n />\n <div class=\"v-slider-rail\">\n <span class=\"v-slider-control\">\n <span class=\"v-slider-track\" aria-hidden=\"true\">\n <span class=\"v-slider-fill\" />\n <span\n v-for=\"(tick, i) in tickItems\"\n :key=\"i\"\n class=\"v-slider-tick\"\n :data-filled=\"tick.filled ? '' : undefined\"\n :style=\"{ '--fill-fraction': String(tick.f) }\"\n />\n </span>\n <input\n v-if=\"range\"\n type=\"range\"\n class=\"v-slider-input v-slider-input-start\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :value=\"startValue\"\n :aria-label=\"startLabel\"\n :aria-valuetext=\"startValueText\"\n @input=\"onStartInput\"\n />\n <input\n type=\"range\"\n class=\"v-slider-input v-slider-input-end\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :value=\"endValue\"\n :aria-label=\"rangeEndLabel\"\n :aria-valuetext=\"endValueText\"\n @input=\"onEndInput\"\n />\n </span>\n <span\n v-if=\"tooltip && range\"\n class=\"v-slider-tooltip v-slider-tooltip-start\"\n aria-hidden=\"true\"\n :style=\"{ '--fill-fraction': String(frac(startValue)) }\"\n >\n <span class=\"v-slider-tooltip-bubble\">{{ startValueText ?? startValue }}</span>\n </span>\n <span\n v-if=\"tooltip\"\n class=\"v-slider-tooltip v-slider-tooltip-end\"\n aria-hidden=\"true\"\n :style=\"{ '--fill-fraction': String(frac(endValue)) }\"\n >\n <span class=\"v-slider-tooltip-bubble\">{{ endValueText ?? endValue }}</span>\n </span>\n </div>\n <div v-if=\"labels\" class=\"v-slider-labels\">\n <span\n v-for=\"(item, i) in labels\"\n :key=\"i\"\n class=\"v-slider-label\"\n :style=\"{ '--fill-fraction': String(labelFraction(i)) }\"\n >\n <template v-if=\"typeof item === 'string'\">{{ item }}</template>\n <VIcon v-else v-bind=\"iconProps(item.icon)\" :label=\"item.label\" />\n </span>\n </div>\n <VInput\n v-if=\"inputs\"\n v-model=\"endFieldText\"\n class=\"v-slider-field v-slider-field-end\"\n type=\"number\"\n size=\"sm\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-label=\"fieldEndLabel\"\n @change=\"commitField('end')\"\n />\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-slider {\n --slider-thumb: var(--vectis-control-size-slider-thumb);\n --slider-track: var(--vectis-control-size-slider-track);\n display: grid;\n grid-template-areas: 'rail';\n grid-template-columns: minmax(0, 1fr);\n align-items: center;\n column-gap: var(--vectis-space-2);\n row-gap: var(--vectis-space-1);\n width: 100%;\n font-family: var(--vectis-text-family);\n }\n\n .v-slider:has(.v-slider-labels) {\n grid-template-areas: 'rail' 'labels';\n }\n\n .v-slider:has(.v-slider-field-end) {\n grid-template-areas: 'rail field-end';\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .v-slider:has(.v-slider-field-end):has(.v-slider-labels) {\n grid-template-areas: 'rail field-end' 'labels .';\n }\n\n .v-slider:has(.v-slider-field-start) {\n grid-template-areas: 'field-start rail field-end';\n grid-template-columns: auto minmax(0, 1fr) auto;\n }\n\n .v-slider:has(.v-slider-field-start):has(.v-slider-labels) {\n grid-template-areas: 'field-start rail field-end' '. labels .';\n }\n\n .v-slider-rail {\n grid-area: rail;\n position: relative;\n block-size: var(--slider-thumb);\n }\n\n .v-slider-control {\n position: absolute;\n inset: 0;\n }\n\n .v-slider-track {\n position: absolute;\n inset-inline: 0;\n inset-block: 0;\n margin-block: auto;\n block-size: var(--slider-track);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-border);\n overflow: hidden;\n }\n\n .v-slider-fill {\n position: absolute;\n inset-block: 0;\n inset-inline-start: 0;\n inline-size: calc(var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--end-fraction));\n background: var(--vectis-color-accent);\n }\n\n .v-slider[data-range] .v-slider-fill {\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--start-fraction)\n );\n inline-size: calc((100% - var(--slider-thumb)) * (var(--end-fraction) - var(--start-fraction)));\n }\n\n .v-slider-tick {\n --slider-tick: calc(var(--slider-track) / 3 * 2);\n position: absolute;\n inset-block: 0;\n margin-block: auto;\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction) -\n var(--slider-tick) / 2\n );\n inline-size: var(--slider-tick);\n block-size: var(--slider-tick);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-border-strong);\n }\n\n .v-slider-tick[data-filled] {\n background: var(--vectis-color-text-on-accent);\n }\n\n /* The two controls lie exactly on top of one another, so only their thumbs are allowed\n to receive the pointer. Without that, the one on top would swallow every click and\n the other thumb could never be grabbed. */\n .v-slider-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n appearance: none;\n background: transparent;\n pointer-events: none;\n }\n\n /* With a single thumb there is nothing underneath to protect, so the whole control\n takes the pointer again — which is what makes clicking the track jump the value\n there and start dragging at once, natively and with no code at all. The accepted\n side effect is that the thumb lights up when the pointer is anywhere over the\n track. */\n .v-slider:not([data-range]) .v-slider-input {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .v-slider-input::-webkit-slider-thumb {\n appearance: none;\n pointer-events: auto;\n width: var(--slider-thumb);\n height: var(--slider-thumb);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-surface);\n border: var(--vectis-control-border-width) solid var(--vectis-color-accent);\n box-shadow: var(--vectis-shadow-xs);\n cursor: pointer;\n transition: background-color var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-slider-input::-moz-range-thumb {\n pointer-events: auto;\n width: var(--slider-thumb);\n height: var(--slider-thumb);\n border-radius: var(--vectis-radius-full);\n background: var(--vectis-color-surface);\n border: var(--vectis-control-border-width) solid var(--vectis-color-accent);\n box-shadow: var(--vectis-shadow-xs);\n cursor: pointer;\n transition: background-color var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n /* The thumb tints as the pointer rests on it or drags it. TRAP — the state is read on\n the control and the thumb is then addressed, never the reverse: a state pseudo-class\n written after the thumb's own pseudo-element is unreliable across browsers. */\n .v-slider-input:hover:not(:disabled)::-webkit-slider-thumb,\n .v-slider-input:active:not(:disabled)::-webkit-slider-thumb {\n background: var(--vectis-color-accent-surface);\n }\n\n .v-slider-input:hover:not(:disabled)::-moz-range-thumb,\n .v-slider-input:active:not(:disabled)::-moz-range-thumb {\n background: var(--vectis-color-accent-surface);\n }\n\n .v-slider-input:focus-visible {\n outline: none;\n }\n\n .v-slider-input:focus-visible::-webkit-slider-thumb {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: var(--vectis-focus-ring-offset);\n }\n\n .v-slider-input:focus-visible::-moz-range-thumb {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: var(--vectis-focus-ring-offset);\n }\n\n /* The bubble showing the value. It looks like a VTooltip but is placed by arithmetic\n rather than anchored to the thumb: a native thumb is a pseudo-element, and the\n browser's anchoring cannot attach anything to one. */\n .v-slider-tooltip {\n position: absolute;\n inset-block-end: calc(100% + var(--vectis-space-2));\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inline-size: 0;\n display: flex;\n justify-content: center;\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--vectis-duration-fast) var(--vectis-ease-default),\n visibility var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-slider:has(.v-slider-input-start:active) .v-slider-tooltip-start,\n .v-slider:has(.v-slider-input-start:focus-visible) .v-slider-tooltip-start,\n .v-slider:has(.v-slider-input-end:active) .v-slider-tooltip-end,\n .v-slider:has(.v-slider-input-end:focus-visible) .v-slider-tooltip-end {\n opacity: 1;\n visibility: visible;\n }\n\n .v-slider-tooltip-bubble {\n padding: var(--vectis-space-1) var(--vectis-space-2);\n background: var(--vectis-color-surface-inverse);\n color: var(--vectis-color-text-on-inverse);\n font-size: var(--vectis-text-caption-size);\n line-height: var(--vectis-text-caption-leading);\n border-radius: var(--vectis-radius-sm);\n box-shadow: var(--vectis-shadow-sm);\n white-space: nowrap;\n }\n\n .v-slider-labels {\n grid-area: labels;\n position: relative;\n /* The labels are positioned individually and therefore contribute no height of\n their own; this reserves enough room for either kind, a small line of text or an\n icon. */\n min-block-size: var(--vectis-icon-size-md);\n --vectis-icon-size: var(--vectis-icon-size-md);\n font-size: var(--vectis-text-caption-size);\n color: var(--vectis-color-text-muted);\n }\n\n /* A box of zero width placed exactly on the step: its content then overflows equally\n on both sides, which centres it there. Centring it with a transform would be the\n usual trick, but a transform is physical and would have to be undone for the\n vertical orientation and again for a right-to-left page. */\n .v-slider-label {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inline-size: 0;\n display: flex;\n justify-content: center;\n white-space: nowrap;\n }\n\n .v-slider-field.v-input {\n inline-size: var(--vectis-control-size-slider-field);\n }\n\n .v-slider-field-start {\n grid-area: field-start;\n }\n\n .v-slider-field-end {\n grid-area: field-end;\n }\n\n .v-slider[data-orientation='vertical'] {\n grid-template-areas: 'rail';\n grid-template-columns: none;\n inline-size: fit-content;\n justify-items: center;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-labels) {\n grid-template-areas: 'rail labels';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-end) {\n grid-template-areas: 'field-end' 'rail';\n grid-template-columns: none;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-end):has(.v-slider-labels) {\n grid-template-areas: 'field-end .' 'rail labels';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-start) {\n grid-template-areas: 'field-end' 'rail' 'field-start';\n grid-template-columns: none;\n }\n\n .v-slider[data-orientation='vertical']:has(.v-slider-field-start):has(.v-slider-labels) {\n grid-template-areas: 'field-end .' 'rail labels' 'field-start .';\n grid-template-columns: auto auto;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-rail {\n inline-size: var(--slider-thumb);\n block-size: var(--vectis-control-size-slider-length);\n }\n\n /* Only this inner box is turned upright, and that is the whole trick: the track, the\n fill and the ticks are all placed with logical properties, so they follow the change\n of axis with no rule written a second time — while the bubbles and the labels stay\n outside that box, and therefore keep their text horizontal.\n\n The direction is reversed with it so that the lowest value ends up at the bottom. */\n .v-slider[data-orientation='vertical'] .v-slider-control {\n writing-mode: vertical-lr;\n direction: rtl;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-tooltip {\n inset-block-end: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inset-inline-start: auto;\n inset-inline-end: calc(100% + var(--vectis-space-2));\n inline-size: auto;\n block-size: 0;\n align-items: center;\n justify-content: flex-end;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-labels {\n align-self: stretch;\n min-block-size: auto;\n }\n\n .v-slider[data-orientation='vertical'] .v-slider-label {\n inset-block-start: auto;\n inset-block-end: calc(\n var(--slider-thumb) / 2 + (100% - var(--slider-thumb)) * var(--fill-fraction)\n );\n inset-inline-start: 0;\n inline-size: auto;\n block-size: 0;\n align-items: center;\n justify-content: flex-start;\n }\n\n /* A disabled slider greys out through the colour tokens, the same ones VCheckbox and\n VSwitch use, and never through opacity. */\n .v-slider[data-disabled] {\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-track {\n background: var(--vectis-color-surface-muted);\n }\n\n .v-slider[data-disabled] .v-slider-fill {\n background: var(--vectis-color-text-subtle);\n }\n\n .v-slider[data-disabled] .v-slider-tick {\n background: var(--vectis-color-text-subtle);\n }\n\n /* A tick sitting on the greyed fill takes the light colour back, so that it stays\n visible against it — the same inversion VCheckbox applies to its disabled tick. */\n .v-slider[data-disabled] .v-slider-tick[data-filled] {\n background: var(--vectis-color-surface-muted);\n }\n\n .v-slider[data-disabled] .v-slider-labels {\n color: var(--vectis-color-text-subtle);\n }\n\n .v-slider[data-disabled] .v-slider-input {\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-input::-webkit-slider-thumb {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-text-subtle);\n box-shadow: none;\n cursor: not-allowed;\n }\n\n .v-slider[data-disabled] .v-slider-input::-moz-range-thumb {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-text-subtle);\n box-shadow: none;\n cursor: not-allowed;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-slider-input::-webkit-slider-thumb {\n transition: none;\n }\n\n .v-slider-input::-moz-range-thumb {\n transition: none;\n }\n\n .v-slider-tooltip {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEA,IAAM,IAAQ,GAcR,IAAQ,EAAsC,GAAA,YAAe,GAE7D,IAAa,QAAgB,MAAM,QAAQ,EAAM,KAAK,IAAI,EAAM,MAAM,KAAK,EAAM,GAAI,GACrF,IAAW,QACf,MAAM,QAAQ,EAAM,KAAK,IAAI,EAAM,MAAM,KAAM,EAAM,KACvD,GAMM,KAAQ,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,EAAM,QAAQ,EAAM,MAAM,EAAM,OAAO,EAAE,CAAC;EAInG,SAAS,EAAa,GAAc;GAClC,IAAM,IAAK,EAAM,QACX,IAAU,KAAK,IAAI,OAAO,EAAG,KAAK,GAAG,EAAS,KAAK;GAEzD,AADA,EAAG,QAAQ,OAAO,CAAO,GACzB,EAAM,QAAQ,CAAC,GAAS,EAAS,KAAK;EACxC;EAEA,SAAS,EAAW,GAAc;GAChC,IAAM,IAAK,EAAM;GACjB,IAAI,CAAC,EAAM,OAAO;IAChB,EAAM,QAAQ,OAAO,EAAG,KAAK;IAC7B;GACF;GACA,IAAM,IAAU,KAAK,IAAI,OAAO,EAAG,KAAK,GAAG,EAAW,KAAK;GAE3D,AADA,EAAG,QAAQ,OAAO,CAAO,GACzB,EAAM,QAAQ,CAAC,EAAW,OAAO,CAAO;EAC1C;EAOA,IAAM,IAAY,QAAe,KAAK,OAAO,EAAM,MAAM,EAAM,OAAO,EAAM,OAAO,IAAI,CAAC,GAElF,IAAY,SAEb,EAAM,SAAS,EAAM,WAAW,KAAA,MAAc,EAAU,SAAS,KAAK,EAAU,SAAS,EAC9F,GAEM,IAAY,QACX,EAAU,QACR,MAAM,KAAK,EAAE,QAAQ,EAAU,QAAQ,EAAE,IAAI,GAAG,MAAM;GAC3D,IAAM,IAAQ,EAAM,MAAM,IAAI,EAAM,MAC9B,IAAS,EAAM,QACjB,KAAS,EAAW,SAAS,KAAS,EAAS,QAC/C,KAAS,EAAS;GACtB,OAAO;IAAE,GAAG,EAAK,CAAK;IAAG;GAAO;EAClC,CAAC,IAP4B,CAAC,CAQ/B,GAEK,KAAiB,MAAkB,EAAK,EAAM,MAAM,IAAQ,EAAM,IAAI;EAG5E,SAAS,EAAY,GAAuB;GAC1C,IAAM,IAAO,EAAM,SAAS,KAAK,OAAO,IAAQ,EAAM,OAAO,EAAM,IAAI;GAEvE,OADI,MAAS,KAAA,IAAkB,OAAO,CAAK,IACpC,OAAO,KAAS,WAAW,IAAO,EAAK;EAChD;EAUA,IAAM,IAAI,EAAY,GAChB,IAAa,QACjB,EAAM,QAAQ,EAAE,MAAM,OAAO,WAAW,EAAM,KAAK,IAAI,EAAE,MAAM,OAAO,KACxE,GACM,IAAW,QACf,EAAM,QAAQ,EAAE,MAAM,OAAO,SAAS,EAAM,KAAK,IAAI,EAAE,MAAM,OAAO,GACtE,GACM,IAAgB,QAAgB,EAAM,QAAQ,EAAS,QAAQ,EAAM,KAAM,GAC3E,IAAgB,QACpB,EAAM,QAAQ,EAAS,QAAS,EAAM,SAAS,EAAE,MAAM,OAAO,KAChE,GAEM,IAAiB,QAAgB,EAAM,SAAS,EAAY,EAAW,KAAK,IAAI,KAAA,CAAU,GAC1F,IAAe,QAAgB,EAAM,SAAS,EAAY,EAAS,KAAK,IAAI,KAAA,CAAU,GAkBtF,IAAiB,EAAqB,OAAO,EAAW,KAAK,CAAC,GAC9D,IAAe,EAAqB,OAAO,EAAS,KAAK,CAAC;EAIhE,AADA,EAAM,IAAa,MAAO,EAAe,QAAQ,OAAO,CAAC,CAAE,GAC3D,EAAM,IAAW,MAAO,EAAa,QAAQ,OAAO,CAAC,CAAE;EASvD,SAAS,EAAY,GAAwB;GAC3C,IAAM,IAAM,MAAU,UAAU,EAAe,QAAQ,EAAa,OAI9D,IAAS,OAAO,WAAW,OAAO,CAAG,CAAC;GAC5C,IAAI,OAAO,MAAM,CAAM,GAAG;IACxB,EAAa;IACb;GACF;GACA,IAAM,IAAU,KAAK,IAAI,EAAM,KAAK,KAAK,IAAI,EAAM,KAAK,CAAM,CAAC,GAI3D,IAAQ,EAAM,MAAM,KAAK,OAAO,IAAU,EAAM,OAAO,EAAM,IAAI,IAAI,EAAM;GAY/E,AAXA,IAAQ,KAAK,IAAI,EAAM,KAAK,KAAK,MAAM,IAAQ,IAAI,IAAI,IAAI,GACtD,EAAM,QAEA,MAAU,UACnB,EAAM,QAAQ,CAAC,KAAK,IAAI,GAAO,EAAS,KAAK,GAAG,EAAS,KAAK,IAE9D,EAAM,QAAQ,CAAC,EAAW,OAAO,KAAK,IAAI,GAAO,EAAW,KAAK,CAAC,IAJlE,EAAM,QAAQ,GAShB,EAAa;EACf;EAEA,SAAS,IAAe;GAEtB,AADA,EAAe,QAAQ,OAAO,EAAW,KAAK,GAC9C,EAAa,QAAQ,OAAO,EAAS,KAAK;EAC5C;yBAIE,EAsGM,OAAA;GArGJ,OAAM;GACL,cAAY,EAAA,QAAK,KAAQ,KAAA;GACzB,iBAAe,EAAA,WAAQ,KAAQ,KAAA;GAC/B,oBAAkB,EAAA,gBAAW,aAAA,aAA+B,KAAA;GAC5D,OAAK,EAAA;wBAA8B,OAAO,EAAK,EAAA,KAAU,CAAA;sBAA4B,OAAO,EAAK,EAAA,KAAQ,CAAA;;;GAMlG,EAAA,UAAU,EAAA,SAAA,EAAA,GADlB,EAYE,GAAA;;gBAVS,EAAA;6CAAc,QAAA;IACvB,OAAM;IACN,MAAK;IACL,MAAK;IACJ,KAAK,EAAA;IACL,KAAK,EAAA;IACL,MAAM,EAAA;IACN,UAAU,EAAA;IACV,cAAY,EAAA;IACZ,UAAM,AAAA,EAAA,QAAA,MAAE,EAAW,OAAA;;;;;;;;;GAEtB,EAsDM,OAtDN,GAsDM;IArDJ,EAoCO,QApCP,GAoCO;KAnCL,EASO,QATP,GASO,CAAA,AAAA,EAAA,OARL,EAA8B,QAAA,EAAxB,OAAM,gBAAe,GAAA,MAAA,EAAA,IAAA,EAAA,EAAA,GAC3B,EAME,GAAA,MAAA,EALoB,EAAA,QAAZ,GAAM,YADhB,EAME,QAAA;MAJC,KAAK;MACN,OAAM;MACL,eAAa,EAAK,SAAM,KAAQ,KAAA;MAChC,OAAK,EAAA,EAAA,mBAAuB,OAAO,EAAK,CAAC,EAAA,CAAA;;KAItC,EAAA,SAAA,EAAA,GADR,EAYE,SAAA;;MAVA,MAAK;MACL,OAAM;MACL,KAAK,EAAA;MACL,KAAK,EAAA;MACL,MAAM,EAAA;MACN,UAAU,EAAA;MACV,OAAO,EAAA;MACP,cAAY,EAAA;MACZ,kBAAgB,EAAA;MAChB,SAAO;;KAEV,EAWE,SAAA;MAVA,MAAK;MACL,OAAM;MACL,KAAK,EAAA;MACL,KAAK,EAAA;MACL,MAAM,EAAA;MACN,UAAU,EAAA;MACV,OAAO,EAAA;MACP,cAAY,EAAA;MACZ,kBAAgB,EAAA;MAChB,SAAO;;;IAIJ,EAAA,WAAW,EAAA,SAAA,EAAA,GADnB,EAOO,QAAA;;KALL,OAAM;KACN,eAAY;KACX,OAAK,EAAA,EAAA,mBAAuB,OAAO,EAAK,EAAA,KAAU,CAAA,EAAA,CAAA;QAEnD,EAA+E,QAA/E,GAA+E,EAAtC,EAAA,SAAkB,EAAA,KAAU,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAG/D,EAAA,WAAA,EAAA,GADR,EAOO,QAAA;;KALL,OAAM;KACN,eAAY;KACX,OAAK,EAAA,EAAA,mBAAuB,OAAO,EAAK,EAAA,KAAQ,CAAA,EAAA,CAAA;QAEjD,EAA2E,QAA3E,GAA2E,EAAlC,EAAA,SAAgB,EAAA,KAAQ,GAAA,CAAA,CAAA,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA;;GAG1D,EAAA,UAAA,EAAA,GAAX,EAUM,OAVN,GAUM,EAAA,EAAA,EAAA,GATJ,EAQO,GAAA,MAAA,EAPe,EAAA,SAAZ,GAAM,YADhB,EAQO,QAAA;IANJ,KAAK;IACN,OAAM;IACL,OAAK,EAAA,EAAA,mBAAuB,OAAO,EAAc,CAAC,CAAA,EAAA,CAAA;cAE5B,KAAI,YAAA,EAAA,GAA3B,EAA+D,GAAA,EAAA,KAAA,EAAA,GAAA,CAAA,EAAA,EAAlB,CAAI,GAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GACjD,EAAkE,GAAlE,EAAkE;;;MAA5C,EAAA,CAAA,CAAS,CAAC,EAAK,IAAI,GAAA,EAAI,OAAO,EAAK,MAAA,CAAA,GAAA,MAAA,IAAA,CAAA,OAAA,CAAA,EAAA,GAAA,CAAA;GAIrD,EAAA,UAAA,EAAA,GADR,EAYE,GAAA;;gBAVS,EAAA;6CAAY,QAAA;IACrB,OAAM;IACN,MAAK;IACL,MAAK;IACJ,KAAK,EAAA;IACL,KAAK,EAAA;IACL,MAAM,EAAA;IACN,UAAU,EAAA;IACV,cAAY,EAAA;IACZ,UAAM,AAAA,EAAA,QAAA,MAAE,EAAW,KAAA"}
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-snackbar-host{width:fit-content;bottom:var(--vectis-space-4);--banner-enter-y:var(--vectis-space-4);background:0 0;border:none;margin:0;padding:0;overflow:visible}.v-snackbar-host[data-placement=bottom-left]{left:var(--vectis-space-4)}.v-snackbar-host[data-placement=bottom-right]{right:var(--vectis-space-4)}.v-snackbar-host[data-placement=bottom-center]{margin-inline:auto;left:0;right:0}.v-snackbar-host{opacity:1;transition:opacity var(--vectis-duration-base) var(--vectis-ease-default), overlay var(--vectis-duration-base) allow-discrete, display var(--vectis-duration-base) allow-discrete}.v-snackbar-host:not(:popover-open){opacity:0}@starting-style{.v-snackbar-host:popover-open{opacity:0}}@media (prefers-reduced-motion:reduce){.v-snackbar-host{transition:none}}.v-snackbar{padding-block:var(--vectis-space-3);padding-inline:var(--vectis-space-4);min-inline-size:var(--vectis-control-size-snackbar-min);max-inline-size:min(var(--vectis-control-size-snackbar-max), calc(100vw - 2 * var(--vectis-space-4)));background:var(--tone-bg-solid);color:var(--tone-text-solid);align-items:center}.v-snackbar-icon{--vectis-icon-size:var(--vectis-icon-size-md)}.v-snackbar-message{overflow-wrap:anywhere;flex:1;min-width:0}.v-snackbar .v-snackbar-action[data-tone]{--tone-text-tinted:currentcolor;--tone-bg-soft:color-mix(in oklab, currentcolor, transparent 85%)}.v-snackbar-action{--snackbar-action-height:var(--vectis-control-height-sm);margin-block:calc((var(--banner-line) - var(--snackbar-action-height)) / 2);margin-inline-end:calc(-1 * var(--vectis-space-2))}}