vectis-ui 0.1.0 → 0.8.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 (475) hide show
  1. package/README.md +40 -6
  2. package/dist/components/VAccordion/VAccordion.css +1 -1
  3. package/dist/components/VAccordion/VAccordion.d.ts +9 -16
  4. package/dist/components/VAccordion/VAccordion.js.map +1 -1
  5. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js +3 -3
  6. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/VAccordion/VAccordionItem.css +1 -1
  8. package/dist/components/VAccordion/VAccordionItem.d.ts +33 -19
  9. package/dist/components/VAccordion/VAccordionItem.js.map +1 -1
  10. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js +50 -38
  11. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/VAccordion/context.d.ts +1 -8
  13. package/dist/components/VAccordion/context.js.map +1 -1
  14. package/dist/components/VAvatar/VAvatar.css +1 -1
  15. package/dist/components/VAvatar/VAvatar.d.ts +44 -29
  16. package/dist/components/VAvatar/VAvatar.js.map +1 -1
  17. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js +38 -35
  18. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/VAvatar/VAvatarGroup.d.ts +5 -16
  20. package/dist/components/VAvatar/VAvatarGroup.js.map +1 -1
  21. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +7 -7
  22. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/VAvatar/context.d.ts +6 -10
  24. package/dist/components/VAvatar/context.js.map +1 -1
  25. package/dist/components/VBadge/VBadge.css +1 -1
  26. package/dist/components/VBadge/VBadge.d.ts +31 -10
  27. package/dist/components/VBadge/VBadge.js.map +1 -1
  28. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +39 -24
  29. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/VBreadcrumb/VBreadcrumb.css +1 -1
  31. package/dist/components/VBreadcrumb/VBreadcrumb.d.ts +4 -17
  32. package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -1
  33. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +23 -25
  34. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/VButton/VButton.css +1 -1
  36. package/dist/components/VButton/VButton.d.ts +30 -10
  37. package/dist/components/VButton/VButton.js.map +1 -1
  38. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js +39 -30
  39. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/VButton/VButtonGroup.css +1 -1
  41. package/dist/components/VButton/VButtonGroup.d.ts +76 -13
  42. package/dist/components/VButton/VButtonGroup.js.map +1 -1
  43. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js +74 -8
  44. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/VButton/context.d.ts +30 -0
  46. package/dist/components/VButton/context.js +6 -0
  47. package/dist/components/VButton/context.js.map +1 -0
  48. package/dist/components/VCalendar/VCalendar.css +1 -1
  49. package/dist/components/VCalendar/VCalendar.d.ts +50 -36
  50. package/dist/components/VCalendar/VCalendar.js.map +1 -1
  51. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +99 -85
  52. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  53. package/dist/components/VCalendar/VCalendarEvent.css +1 -1
  54. package/dist/components/VCalendar/VCalendarEvent.d.ts +5 -11
  55. package/dist/components/VCalendar/VCalendarEvent.js.map +1 -1
  56. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js +7 -1
  57. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/VCalendar/VCalendarMonth.css +1 -1
  59. package/dist/components/VCalendar/VCalendarMonth.d.ts +10 -13
  60. package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
  61. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +183 -244
  62. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/VCalendar/VCalendarTimeGrid.css +1 -1
  64. package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +15 -20
  65. package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
  66. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +385 -448
  67. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/VCalendar/VCalendarYear.css +1 -1
  69. package/dist/components/VCalendar/VCalendarYear.js.map +1 -1
  70. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js +53 -49
  71. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/VCalendar/gesture.d.ts +158 -0
  73. package/dist/components/VCalendar/gesture.js +170 -0
  74. package/dist/components/VCalendar/gesture.js.map +1 -0
  75. package/dist/components/VCalendar/keyboard.d.ts +9 -3
  76. package/dist/components/VCalendar/keyboard.js +2 -6
  77. package/dist/components/VCalendar/keyboard.js.map +1 -1
  78. package/dist/components/VCalendar/layout.d.ts +67 -54
  79. package/dist/components/VCalendar/layout.js +77 -69
  80. package/dist/components/VCalendar/layout.js.map +1 -1
  81. package/dist/components/VCalendar/timeGrid.d.ts +55 -0
  82. package/dist/components/VCalendar/timeGrid.js +71 -0
  83. package/dist/components/VCalendar/timeGrid.js.map +1 -0
  84. package/dist/components/VCalendar/types.d.ts +41 -16
  85. package/dist/components/VCarousel/VCarousel.css +1 -1
  86. package/dist/components/VCarousel/VCarousel.d.ts +21 -41
  87. package/dist/components/VCarousel/VCarousel.js.map +1 -1
  88. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +157 -129
  89. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/VCarousel/VCarouselItem.d.ts +0 -17
  91. package/dist/components/VCarousel/VCarouselItem.js.map +1 -1
  92. package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/VCarousel/context.d.ts +0 -12
  94. package/dist/components/VCarousel/context.js.map +1 -1
  95. package/dist/components/VCheckbox/VCheckbox.css +1 -1
  96. package/dist/components/VCheckbox/VCheckbox.d.ts +31 -16
  97. package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
  98. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +62 -29
  99. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/VChip/VChip.css +1 -1
  101. package/dist/components/VChip/VChip.d.ts +36 -26
  102. package/dist/components/VChip/VChip.js.map +1 -1
  103. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +57 -48
  104. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/VCombobox/VCombobox.css +1 -1
  106. package/dist/components/VCombobox/VCombobox.d.ts +127 -31
  107. package/dist/components/VCombobox/VCombobox.js.map +1 -1
  108. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +336 -247
  109. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/VCombobox/VComboboxGroup.css +1 -1
  111. package/dist/components/VCombobox/VComboboxGroup.d.ts +0 -9
  112. package/dist/components/VCombobox/VComboboxGroup.js.map +1 -1
  113. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +1 -1
  114. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/VCombobox/VComboboxOption.css +1 -1
  116. package/dist/components/VCombobox/VComboboxOption.d.ts +0 -15
  117. package/dist/components/VCombobox/VComboboxOption.js.map +1 -1
  118. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js +4 -4
  119. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  120. package/dist/components/VCombobox/VComboboxSeparator.js.map +1 -1
  121. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/VCombobox/infiniteScroll.js.map +1 -1
  123. package/dist/components/VDataTable/VDataTable.css +1 -1
  124. package/dist/components/VDataTable/VDataTable.d.ts +50 -28
  125. package/dist/components/VDataTable/VDataTable.js.map +1 -1
  126. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +183 -194
  127. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  128. package/dist/components/VDateInput/VDateInput.css +1 -1
  129. package/dist/components/VDateInput/VDateInput.d.ts +90 -42
  130. package/dist/components/VDateInput/VDateInput.js.map +1 -1
  131. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +159 -191
  132. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/VDatePicker/VDatePicker.css +1 -1
  134. package/dist/components/VDatePicker/VDatePicker.d.ts +61 -30
  135. package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
  136. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +243 -221
  137. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/components/VDialog/VDialog.css +1 -1
  139. package/dist/components/VDialog/VDialog.d.ts +45 -33
  140. package/dist/components/VDialog/VDialog.js.map +1 -1
  141. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +65 -64
  142. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/components/VDialog/VDialogAlert.d.ts +24 -20
  144. package/dist/components/VDialog/VDialogAlert.js.map +1 -1
  145. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js +36 -25
  146. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/VFileInput/VFileInput.css +1 -1
  148. package/dist/components/VFileInput/VFileInput.d.ts +78 -26
  149. package/dist/components/VFileInput/VFileInput.js.map +1 -1
  150. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +144 -132
  151. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  152. package/dist/components/VFilePicker/VFilePicker.css +1 -1
  153. package/dist/components/VFilePicker/VFilePicker.d.ts +47 -30
  154. package/dist/components/VFilePicker/VFilePicker.js.map +1 -1
  155. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +166 -163
  156. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/components/VFilePicker/fileKind.d.ts +2 -27
  158. package/dist/components/VFilePicker/fileKind.js +9 -8
  159. package/dist/components/VFilePicker/fileKind.js.map +1 -1
  160. package/dist/components/VHotkeys/VHotkeys.css +1 -1
  161. package/dist/components/VHotkeys/VHotkeys.d.ts +8 -30
  162. package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
  163. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +4 -4
  164. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/components/VHotkeys/platform.js.map +1 -1
  166. package/dist/components/VIcon/VIcon.css +1 -1
  167. package/dist/components/VIcon/VIcon.d.ts +15 -6
  168. package/dist/components/VIcon/VIcon.js.map +1 -1
  169. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js +45 -37
  170. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/VIcon/iconProps.js.map +1 -1
  172. package/dist/components/VIcon/icons/index.d.ts +1 -1
  173. package/dist/components/VIcon/icons/index.js.map +1 -1
  174. package/dist/components/VIcon/icons/names.d.ts +1 -1
  175. package/dist/components/VIcon/icons/names.js.map +1 -1
  176. package/dist/components/VIcon/resolver.d.ts +3 -3
  177. package/dist/components/VIcon/resolver.js.map +1 -1
  178. package/dist/components/VIcon/types.d.ts +12 -12
  179. package/dist/components/VIconButton/VIconButton.css +1 -1
  180. package/dist/components/VIconButton/VIconButton.d.ts +28 -11
  181. package/dist/components/VIconButton/VIconButton.js.map +1 -1
  182. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js +26 -20
  183. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  184. package/dist/components/VInput/VInput.css +1 -1
  185. package/dist/components/VInput/VInput.d.ts +26 -7
  186. package/dist/components/VInput/VInput.js.map +1 -1
  187. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +86 -75
  188. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  189. package/dist/components/VInput/VInputGroup.css +2 -0
  190. package/dist/components/VInput/VInputGroup.d.ts +47 -0
  191. package/dist/components/VInput/VInputGroup.js +9 -0
  192. package/dist/components/VInput/VInputGroup.js.map +1 -0
  193. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js +80 -0
  194. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  195. package/dist/components/VInput/context.d.ts +11 -0
  196. package/dist/components/VInput/context.js +6 -0
  197. package/dist/components/VInput/context.js.map +1 -0
  198. package/dist/components/VInputOTP/VInputOTP.css +1 -1
  199. package/dist/components/VInputOTP/VInputOTP.d.ts +37 -22
  200. package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
  201. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +98 -61
  202. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
  203. package/dist/components/VMenu/VMenu.d.ts +23 -30
  204. package/dist/components/VMenu/VMenu.js.map +1 -1
  205. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +31 -27
  206. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  207. package/dist/components/VMenu/VMenuGroup.css +1 -1
  208. package/dist/components/VMenu/VMenuGroup.d.ts +12 -8
  209. package/dist/components/VMenu/VMenuGroup.js.map +1 -1
  210. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js +11 -11
  211. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  212. package/dist/components/VMenu/VMenuItem.css +1 -1
  213. package/dist/components/VMenu/VMenuItem.d.ts +11 -19
  214. package/dist/components/VMenu/VMenuItem.js.map +1 -1
  215. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +65 -57
  216. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  217. package/dist/components/VMenu/VMenuPanel.d.ts +14 -30
  218. package/dist/components/VMenu/VMenuPanel.js.map +1 -1
  219. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +43 -44
  220. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/components/VMenu/context.d.ts +2 -6
  222. package/dist/components/VMenu/context.js.map +1 -1
  223. package/dist/components/VPagination/VPagination.css +1 -1
  224. package/dist/components/VPagination/VPagination.d.ts +60 -22
  225. package/dist/components/VPagination/VPagination.js.map +1 -1
  226. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +113 -161
  227. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/components/VPopover/VPopover.css +1 -1
  229. package/dist/components/VPopover/VPopover.d.ts +26 -7
  230. package/dist/components/VPopover/VPopover.js.map +1 -1
  231. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js +43 -37
  232. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -1
  233. package/dist/components/VProgressCircular/VProgressCircular.css +1 -1
  234. package/dist/components/VProgressCircular/VProgressCircular.d.ts +15 -4
  235. package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -1
  236. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js +32 -30
  237. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -1
  238. package/dist/components/VProgressLinear/VProgressLinear.css +1 -1
  239. package/dist/components/VProgressLinear/VProgressLinear.d.ts +23 -8
  240. package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
  241. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +34 -32
  242. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  243. package/dist/components/VRadio/VRadio.css +1 -1
  244. package/dist/components/VRadio/VRadio.d.ts +36 -18
  245. package/dist/components/VRadio/VRadio.js.map +1 -1
  246. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +55 -26
  247. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/VSeparator/VSeparator.d.ts +4 -2
  249. package/dist/components/VSeparator/VSeparator.js.map +1 -1
  250. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  251. package/dist/components/VSideNavigation/VSideNavigation.css +1 -1
  252. package/dist/components/VSideNavigation/VSideNavigation.d.ts +5 -19
  253. package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -1
  254. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +5 -5
  255. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/VSideNavigation/VSideNavigationGroup.css +1 -1
  257. package/dist/components/VSideNavigation/VSideNavigationGroup.d.ts +9 -17
  258. package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -1
  259. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js +2 -2
  260. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  261. package/dist/components/VSideNavigation/VSideNavigationItem.css +1 -1
  262. package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +22 -30
  263. package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
  264. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +77 -87
  265. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  266. package/dist/components/VSideNavigation/context.d.ts +0 -14
  267. package/dist/components/VSideNavigation/context.js.map +1 -1
  268. package/dist/components/VSkeletonLoader/VSkeletonLoader.css +1 -1
  269. package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +9 -9
  270. package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  271. package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  272. package/dist/components/VSlider/VSlider.css +1 -1
  273. package/dist/components/VSlider/VSlider.d.ts +52 -27
  274. package/dist/components/VSlider/VSlider.js.map +1 -1
  275. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +202 -118
  276. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  277. package/dist/components/VSnackbar/VSnackbar.css +1 -1
  278. package/dist/components/VSnackbar/VSnackbar.d.ts +0 -23
  279. package/dist/components/VSnackbar/VSnackbar.js.map +1 -1
  280. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +38 -38
  281. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/components/VSnackbar/state.d.ts +0 -27
  283. package/dist/components/VSnackbar/state.js.map +1 -1
  284. package/dist/components/VSpinner/VSpinner.css +1 -1
  285. package/dist/components/VSpinner/VSpinner.d.ts +6 -6
  286. package/dist/components/VSpinner/VSpinner.js.map +1 -1
  287. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js +10 -9
  288. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  289. package/dist/components/VSwitch/VSwitch.css +1 -1
  290. package/dist/components/VSwitch/VSwitch.d.ts +35 -13
  291. package/dist/components/VSwitch/VSwitch.js.map +1 -1
  292. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +62 -21
  293. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  294. package/dist/components/VTabs/VTab.css +1 -1
  295. package/dist/components/VTabs/VTab.d.ts +12 -12
  296. package/dist/components/VTabs/VTab.js.map +1 -1
  297. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js +36 -24
  298. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  299. package/dist/components/VTabs/VTabPanel.d.ts +2 -10
  300. package/dist/components/VTabs/VTabPanel.js.map +1 -1
  301. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  302. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  303. package/dist/components/VTabs/VTabs.css +1 -1
  304. package/dist/components/VTabs/VTabs.d.ts +27 -18
  305. package/dist/components/VTabs/VTabs.js.map +1 -1
  306. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +92 -81
  307. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  308. package/dist/components/VTabs/context.d.ts +9 -19
  309. package/dist/components/VTabs/context.js +1 -1
  310. package/dist/components/VTabs/context.js.map +1 -1
  311. package/dist/components/VTextarea/VTextarea.css +1 -1
  312. package/dist/components/VTextarea/VTextarea.d.ts +34 -6
  313. package/dist/components/VTextarea/VTextarea.js.map +1 -1
  314. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +91 -74
  315. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  316. package/dist/components/VTimeInput/VTimeInput.css +1 -1
  317. package/dist/components/VTimeInput/VTimeInput.d.ts +123 -33
  318. package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
  319. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +294 -291
  320. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  321. package/dist/components/VTimeInput/search.d.ts +24 -0
  322. package/dist/components/VTimeInput/search.js +22 -0
  323. package/dist/components/VTimeInput/search.js.map +1 -0
  324. package/dist/components/VTimePicker/VTimePicker.css +1 -1
  325. package/dist/components/VTimePicker/VTimePicker.d.ts +51 -30
  326. package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
  327. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +216 -151
  328. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  329. package/dist/components/VTimePicker/limits.d.ts +88 -0
  330. package/dist/components/VTimePicker/limits.js +70 -0
  331. package/dist/components/VTimePicker/limits.js.map +1 -0
  332. package/dist/components/VToast/VToast.css +1 -1
  333. package/dist/components/VToast/VToast.d.ts +0 -10
  334. package/dist/components/VToast/VToast.js.map +1 -1
  335. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +10 -10
  336. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -1
  337. package/dist/components/VToast/VToaster.css +1 -1
  338. package/dist/components/VToast/VToaster.d.ts +0 -17
  339. package/dist/components/VToast/VToaster.js.map +1 -1
  340. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +29 -28
  341. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
  342. package/dist/components/VToast/state.d.ts +10 -19
  343. package/dist/components/VToast/state.js +1 -1
  344. package/dist/components/VToast/state.js.map +1 -1
  345. package/dist/components/VToggle/VToggle.css +1 -1
  346. package/dist/components/VToggle/VToggle.d.ts +56 -11
  347. package/dist/components/VToggle/VToggle.js.map +1 -1
  348. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +80 -46
  349. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  350. package/dist/components/VToggle/VToggleItem.d.ts +16 -2
  351. package/dist/components/VToggle/VToggleItem.js +0 -2
  352. package/dist/components/VToggle/VToggleItem.js.map +1 -1
  353. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js +23 -15
  354. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  355. package/dist/components/VToggle/context.d.ts +4 -24
  356. package/dist/components/VToggle/context.js.map +1 -1
  357. package/dist/components/VTooltip/VTooltip.css +1 -1
  358. package/dist/components/VTooltip/VTooltip.d.ts +9 -33
  359. package/dist/components/VTooltip/VTooltip.js.map +1 -1
  360. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +28 -24
  361. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  362. package/dist/components/VTypography/VTypography.js.map +1 -1
  363. package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -1
  364. package/dist/composables/useAriaLabel.d.ts +0 -17
  365. package/dist/composables/useAriaLabel.js.map +1 -1
  366. package/dist/composables/useClearable.d.ts +42 -0
  367. package/dist/composables/useClearable.js +19 -0
  368. package/dist/composables/useClearable.js.map +1 -0
  369. package/dist/composables/useControlShape.d.ts +22 -0
  370. package/dist/composables/useControlShape.js +13 -0
  371. package/dist/composables/useControlShape.js.map +1 -0
  372. package/dist/composables/useDetailsOpen.d.ts +22 -0
  373. package/dist/composables/useDetailsOpen.js +21 -0
  374. package/dist/composables/useDetailsOpen.js.map +1 -0
  375. package/dist/composables/useFieldIds.d.ts +0 -15
  376. package/dist/composables/useFieldIds.js +8 -7
  377. package/dist/composables/useFieldIds.js.map +1 -1
  378. package/dist/composables/useFieldPanel.d.ts +21 -18
  379. package/dist/composables/useFieldPanel.js +43 -23
  380. package/dist/composables/useFieldPanel.js.map +1 -1
  381. package/dist/composables/useFileDrop.d.ts +0 -22
  382. package/dist/composables/useFileDrop.js.map +1 -1
  383. package/dist/composables/useFileField.d.ts +45 -17
  384. package/dist/composables/useFileField.js +40 -20
  385. package/dist/composables/useFileField.js.map +1 -1
  386. package/dist/composables/useFocusoutDismiss.d.ts +0 -15
  387. package/dist/composables/useFocusoutDismiss.js.map +1 -1
  388. package/dist/composables/useIconClickHandlers.d.ts +29 -14
  389. package/dist/composables/useIconClickHandlers.js +15 -5
  390. package/dist/composables/useIconClickHandlers.js.map +1 -1
  391. package/dist/composables/useInertLink.d.ts +20 -0
  392. package/dist/composables/useInertLink.js +23 -0
  393. package/dist/composables/useInertLink.js.map +1 -0
  394. package/dist/composables/useMaskedField.d.ts +33 -10
  395. package/dist/composables/useMaskedField.js +45 -1
  396. package/dist/composables/useMaskedField.js.map +1 -1
  397. package/dist/composables/usePopover.d.ts +15 -1
  398. package/dist/composables/usePopover.js +23 -8
  399. package/dist/composables/usePopover.js.map +1 -1
  400. package/dist/composables/useProgressValue.d.ts +5 -8
  401. package/dist/composables/useProgressValue.js +6 -3
  402. package/dist/composables/useProgressValue.js.map +1 -1
  403. package/dist/composables/useRootAttrs.d.ts +12 -19
  404. package/dist/composables/useRootAttrs.js.map +1 -1
  405. package/dist/composables/useTimer.d.ts +8 -10
  406. package/dist/composables/useTimer.js.map +1 -1
  407. package/dist/i18n/en.d.ts +2 -10
  408. package/dist/i18n/en.js +18 -19
  409. package/dist/i18n/en.js.map +1 -1
  410. package/dist/i18n/fr.d.ts +2 -18
  411. package/dist/i18n/fr.js +18 -19
  412. package/dist/i18n/fr.js.map +1 -1
  413. package/dist/i18n/state.d.ts +44 -47
  414. package/dist/i18n/state.js +20 -17
  415. package/dist/i18n/state.js.map +1 -1
  416. package/dist/i18n/types.d.ts +53 -44
  417. package/dist/icons.d.ts +3 -3
  418. package/dist/index.d.ts +43 -17
  419. package/dist/index.js +45 -44
  420. package/dist/styles.css +1 -1
  421. package/dist/tokens/css.js.map +1 -1
  422. package/dist/tokens/index.d.ts +5 -1
  423. package/dist/tokens/primitives.js.map +1 -1
  424. package/dist/tokens/semantic.d.ts +5 -1
  425. package/dist/tokens/semantic.js +6 -2
  426. package/dist/tokens/semantic.js.map +1 -1
  427. package/dist/tokens/themes/dark.js.map +1 -1
  428. package/dist/tokens/types.d.ts +7 -15
  429. package/dist/tokens/types.js.map +1 -1
  430. package/dist/tokens.json +25 -5
  431. package/dist/types.d.ts +24 -0
  432. package/dist/utils/array.d.ts +3 -6
  433. package/dist/utils/array.js.map +1 -1
  434. package/dist/utils/arrowNav.d.ts +17 -17
  435. package/dist/utils/arrowNav.js +5 -3
  436. package/dist/utils/arrowNav.js.map +1 -1
  437. package/dist/utils/chip.d.ts +11 -15
  438. package/dist/utils/chip.js.map +1 -1
  439. package/dist/utils/css.d.ts +22 -11
  440. package/dist/utils/css.js +5 -2
  441. package/dist/utils/css.js.map +1 -1
  442. package/dist/utils/date.d.ts +42 -19
  443. package/dist/utils/date.js +97 -98
  444. package/dist/utils/date.js.map +1 -1
  445. package/dist/utils/direction.d.ts +6 -12
  446. package/dist/utils/direction.js.map +1 -1
  447. package/dist/utils/env.d.ts +5 -6
  448. package/dist/utils/file.d.ts +46 -58
  449. package/dist/utils/file.js +43 -36
  450. package/dist/utils/file.js.map +1 -1
  451. package/dist/utils/focus.d.ts +8 -17
  452. package/dist/utils/focus.js.map +1 -1
  453. package/dist/utils/hostWarns.d.ts +12 -0
  454. package/dist/utils/hostWarns.js +6 -0
  455. package/dist/utils/hostWarns.js.map +1 -0
  456. package/dist/utils/ids.d.ts +10 -0
  457. package/dist/utils/ids.js +8 -0
  458. package/dist/utils/ids.js.map +1 -0
  459. package/dist/utils/matcher.d.ts +5 -9
  460. package/dist/utils/matcher.js.map +1 -1
  461. package/dist/utils/memo.d.ts +12 -0
  462. package/dist/utils/memo.js +9 -0
  463. package/dist/utils/memo.js.map +1 -0
  464. package/dist/utils/number.d.ts +3 -4
  465. package/dist/utils/number.js.map +1 -1
  466. package/dist/utils/text.d.ts +20 -9
  467. package/dist/utils/text.js +17 -3
  468. package/dist/utils/text.js.map +1 -1
  469. package/dist/utils/time.d.ts +53 -61
  470. package/dist/utils/time.js +49 -45
  471. package/dist/utils/time.js.map +1 -1
  472. package/dist/utils/vnode.d.ts +8 -15
  473. package/dist/utils/vnode.js.map +1 -1
  474. package/package.json +6 -6
  475. package/dist/components/VToggle/VToggleItem.css +0 -2
@@ -1,21 +1,22 @@
1
1
  import { useMessages as e } from "../../i18n/state.js";
2
- import t from "../VIcon/VIcon.js";
3
- import n from "../VTypography/VTypography.js";
4
- import { iconName as r, iconProps as i } from "../VIcon/iconProps.js";
2
+ import { iconName as t, iconProps as n } from "../VIcon/iconProps.js";
3
+ import r from "../VIcon/VIcon.js";
4
+ import i from "../VTypography/VTypography.js";
5
5
  import a from "../VSpinner/VSpinner.js";
6
6
  import { useRootAttrs as o } from "../../composables/useRootAttrs.js";
7
7
  import { close as s } from "../VIcon/icons/close.js";
8
8
  import { useFieldIds as c } from "../../composables/useFieldIds.js";
9
- import { useIconClickHandlers as l } from "../../composables/useIconClickHandlers.js";
10
- import { useTextLimit as u } from "../../composables/useTextLimit.js";
11
- import { computed as d, createBlock as f, createCommentVNode as p, createElementBlock as m, createElementVNode as h, createTextVNode as g, createVNode as _, defineComponent as v, guardReactiveProps as y, mergeModels as b, mergeProps as x, normalizeClass as S, normalizeProps as C, normalizeStyle as w, openBlock as T, ref as E, renderSlot as D, toDisplayString as O, unref as k, useModel as ee, vModelText as te, withCtx as A, withDirectives as j } from "vue";
9
+ import { useIconClickHandlers as ee } from "../../composables/useIconClickHandlers.js";
10
+ import { useClearable as te } from "../../composables/useClearable.js";
11
+ import { useTextLimit as l } from "../../composables/useTextLimit.js";
12
+ import { computed as u, createBlock as d, createCommentVNode as f, createElementBlock as p, createElementVNode as m, createTextVNode as h, createVNode as g, defineComponent as _, guardReactiveProps as v, mergeModels as y, mergeProps as b, normalizeClass as x, normalizeProps as S, normalizeStyle as C, openBlock as w, ref as T, renderSlot as E, toDisplayString as D, unref as O, useModel as ne, vModelText as re, withCtx as k, withDirectives as A } from "vue";
12
13
  //#region src/components/VTextarea/VTextarea.vue?vue&type=script&setup=true&lang.ts
13
- var M = [
14
+ var j = [
14
15
  "data-size",
15
16
  "data-compact",
16
17
  "data-disabled",
17
18
  "data-readonly"
18
- ], N = ["data-auto-grow"], P = ["aria-label", "disabled"], F = [
19
+ ], M = ["data-auto-grow"], N = ["aria-label", "disabled"], P = [
19
20
  "id",
20
21
  "rows",
21
22
  "maxlength",
@@ -23,13 +24,13 @@ var M = [
23
24
  "readonly",
24
25
  "aria-invalid",
25
26
  "aria-describedby"
26
- ], I = ["aria-label"], L = ["aria-label", "disabled"], R = {
27
+ ], F = ["aria-label"], I = ["aria-label", "disabled"], L = {
27
28
  key: 1,
28
- class: "v-textarea-meta"
29
- }, z = ["data-over"], B = /*@__PURE__*/ v({
29
+ class: "v-textarea-meta v-field-meta"
30
+ }, R = ["data-over"], z = /*@__PURE__*/ _({
30
31
  inheritAttrs: !1,
31
32
  __name: "VTextarea",
32
- props: /*@__PURE__*/ b({
33
+ props: /*@__PURE__*/ y({
33
34
  size: { default: "md" },
34
35
  compact: {
35
36
  type: Boolean,
@@ -67,6 +68,10 @@ var M = [
67
68
  type: Boolean,
68
69
  default: !1
69
70
  },
71
+ clearVisible: {
72
+ type: Boolean,
73
+ default: void 0
74
+ },
70
75
  clearLabel: { default: void 0 },
71
76
  maxlength: { default: void 0 },
72
77
  softLimit: {
@@ -81,107 +86,119 @@ var M = [
81
86
  modelValue: { default: "" },
82
87
  modelModifiers: {}
83
88
  }),
84
- emits: /*@__PURE__*/ b([
89
+ emits: /*@__PURE__*/ y([
85
90
  "click:icon-start",
86
91
  "click:icon-end",
87
92
  "clear"
88
93
  ], ["update:modelValue"]),
89
- setup(v, { emit: b }) {
90
- let B = v, V = b, H = ee(v, "modelValue"), U = d(() => Math.max(1, Math.round(B.rows))), { attrs: W, rootClass: G, rootStyle: K, forwardedAttrs: q } = o(), J = e(), Y = d(() => B.loadingLabel ?? J.value.common.loading), X = d(() => B.clearLabel ?? J.value.common.clear), { fieldId: Z, hintId: ne, describedBy: re } = c(W, () => !!B.hint), { hasIconStartHandler: ie, hasIconEndHandler: Q } = l({
94
+ setup(_, { expose: y, emit: z }) {
95
+ let B = _, V = z, H = ne(_, "modelValue"), U = u(() => Math.max(1, Math.round(B.rows))), { attrs: W, rootClass: G, rootStyle: K, forwardedAttrs: q } = o(), J = e(), Y = u(() => B.clearLabel ?? J.value.common.clear), { fieldId: X, hintId: ie, describedBy: ae } = c(W, () => !!B.hint), { hasIconStartHandler: oe, hasIconEndHandler: se } = ee({
91
96
  name: "VTextarea",
92
97
  iconStartLabel: B.iconStartLabel,
93
98
  iconEndLabel: B.iconEndLabel
94
- }), $ = E(null), ae = d(() => B.clearable && H.value.length > 0 && !B.disabled && !B.readonly);
95
- function oe() {
96
- H.value = "", V("clear"), $.value?.focus();
97
- }
98
- let { counterText: se, over: ce } = u({
99
- el: $,
99
+ }), Z = T(null), { showClear: Q, onClear: $ } = te({
100
+ clearable: () => B.clearable,
101
+ clearVisible: () => B.clearVisible,
102
+ disabled: () => B.disabled,
103
+ readonly: () => B.readonly,
104
+ text: () => H.value,
105
+ controlEl: Z,
106
+ onCleared: () => {
107
+ H.value = "", V("clear");
108
+ }
109
+ }), { counterText: ce, over: le } = l({
110
+ el: Z,
100
111
  text: () => H.value,
101
112
  maxlength: () => B.maxlength,
102
113
  softLimit: () => B.softLimit
103
114
  });
104
- return (e, o) => (T(), m("div", {
105
- class: S(["v-textarea v-control", k(G)]),
106
- style: w(k(K)),
107
- "data-size": v.size,
108
- "data-compact": v.compact ? "" : void 0,
109
- "data-disabled": v.disabled ? "" : void 0,
110
- "data-readonly": v.readonly ? "" : void 0
115
+ return y({
116
+ focus: (e) => Z.value?.focus(e),
117
+ select: () => Z.value?.select(),
118
+ el: Z
119
+ }), (e, o) => (w(), p("div", {
120
+ class: x(["v-textarea v-control", O(G)]),
121
+ style: C(O(K)),
122
+ "data-size": _.size,
123
+ "data-compact": _.compact ? "" : void 0,
124
+ "data-disabled": _.disabled ? "" : void 0,
125
+ "data-readonly": _.readonly ? "" : void 0
111
126
  }, [
112
- v.label ? (T(), f(n, {
127
+ _.label ? (w(), d(i, {
113
128
  key: 0,
114
129
  as: "label",
115
130
  variant: "label",
116
131
  class: "v-textarea-label",
117
- for: k(Z)
132
+ for: O(X)
118
133
  }, {
119
- default: A(() => [g(O(v.label), 1)]),
134
+ default: k(() => [h(D(_.label), 1)]),
120
135
  _: 1
121
- }, 8, ["for"])) : p("", !0),
122
- h("div", {
136
+ }, 8, ["for"])) : f("", !0),
137
+ m("div", {
123
138
  class: "v-textarea-field",
124
- style: w({ "--textarea-rows": U.value }),
125
- "data-auto-grow": v.autoGrow ? "" : void 0
139
+ style: C({ "--textarea-rows": U.value }),
140
+ "data-auto-grow": _.autoGrow ? "" : void 0
126
141
  }, [
127
- D(e.$slots, "start", {}, () => [v.iconStart && k(ie) ? (T(), m("button", {
142
+ _.iconStart && O(oe) ? (w(), p("button", {
128
143
  key: 0,
129
144
  type: "button",
130
- class: "v-textarea-action",
131
- "aria-label": v.iconStartLabel ?? k(r)(v.iconStart),
132
- disabled: v.disabled,
145
+ class: "v-textarea-action v-field-action",
146
+ "aria-label": _.iconStartLabel ?? O(t)(_.iconStart),
147
+ disabled: _.disabled,
133
148
  onClick: o[0] ||= (e) => V("click:icon-start", e)
134
- }, [_(t, C(y(k(i)(v.iconStart))), null, 16)], 8, P)) : v.iconStart ? (T(), f(t, C(x({ key: 1 }, k(i)(v.iconStart))), null, 16)) : p("", !0)]),
135
- j(h("textarea", x(k(q), {
136
- id: k(Z),
149
+ }, [g(r, S(v(O(n)(_.iconStart))), null, 16)], 8, N)) : _.iconStart ? (w(), d(r, S(b({ key: 1 }, O(n)(_.iconStart))), null, 16)) : f("", !0),
150
+ E(e.$slots, "start"),
151
+ A(m("textarea", b(O(q), {
152
+ id: O(X),
137
153
  ref_key: "controlEl",
138
- ref: $,
154
+ ref: Z,
139
155
  "onUpdate:modelValue": o[1] ||= (e) => H.value = e,
140
156
  class: "v-textarea-control",
141
157
  rows: U.value,
142
- maxlength: v.softLimit ? void 0 : v.maxlength,
143
- disabled: v.disabled,
144
- readonly: v.readonly || void 0,
145
- "aria-invalid": v.invalid || void 0,
146
- "aria-describedby": k(re)
147
- }), null, 16, F), [[te, H.value]]),
148
- ae.value ? (T(), m("button", {
149
- key: 0,
158
+ maxlength: _.softLimit ? void 0 : _.maxlength,
159
+ disabled: _.disabled,
160
+ readonly: _.readonly || void 0,
161
+ "aria-invalid": _.invalid || void 0,
162
+ "aria-describedby": O(ae)
163
+ }), null, 16, P), [[re, H.value]]),
164
+ E(e.$slots, "value-end"),
165
+ O(Q) ? (w(), p("button", {
166
+ key: 2,
150
167
  type: "button",
151
- class: "v-textarea-action v-textarea-clear",
152
- "aria-label": X.value,
153
- onClick: oe
154
- }, [_(t, { name: k(s) }, null, 8, ["name"])], 8, I)) : p("", !0),
155
- v.loading ? (T(), f(a, {
156
- key: 1,
157
- label: Y.value
158
- }, null, 8, ["label"])) : D(e.$slots, "end", {}, () => [v.iconEnd && k(Q) ? (T(), m("button", {
168
+ class: "v-textarea-action v-field-action v-textarea-clear",
169
+ "aria-label": Y.value,
170
+ onClick: o[2] ||= (...e) => O($) && O($)(...e)
171
+ }, [g(r, { name: O(s) }, null, 8, ["name"])], 8, F)) : f("", !0),
172
+ _.loading ? (w(), d(a, {
173
+ key: 3,
174
+ label: _.loadingLabel
175
+ }, null, 8, ["label"])) : E(e.$slots, "end", {}, () => [_.iconEnd && O(se) ? (w(), p("button", {
159
176
  key: 0,
160
177
  type: "button",
161
- class: "v-textarea-action",
162
- "aria-label": v.iconEndLabel ?? k(r)(v.iconEnd),
163
- disabled: v.disabled,
164
- onClick: o[2] ||= (e) => V("click:icon-end", e)
165
- }, [_(t, C(y(k(i)(v.iconEnd))), null, 16)], 8, L)) : v.iconEnd ? (T(), f(t, C(x({ key: 1 }, k(i)(v.iconEnd))), null, 16)) : p("", !0)], void 0, 2)
166
- ], 12, N),
167
- v.hint || v.counter ? (T(), m("div", R, [v.hint ? (T(), f(n, {
178
+ class: "v-textarea-action v-field-action",
179
+ "aria-label": _.iconEndLabel ?? O(t)(_.iconEnd),
180
+ disabled: _.disabled,
181
+ onClick: o[3] ||= (e) => V("click:icon-end", e)
182
+ }, [g(r, S(v(O(n)(_.iconEnd))), null, 16)], 8, I)) : _.iconEnd ? (w(), d(r, S(b({ key: 1 }, O(n)(_.iconEnd))), null, 16)) : f("", !0)], void 0, 4)
183
+ ], 12, M),
184
+ _.hint || _.counter ? (w(), p("div", L, [_.hint ? (w(), d(i, {
168
185
  key: 0,
169
- id: k(ne),
186
+ id: O(ie),
170
187
  variant: "caption",
171
188
  tone: "muted",
172
189
  class: "v-textarea-hint"
173
190
  }, {
174
- default: A(() => [g(O(v.hint), 1)]),
191
+ default: k(() => [h(D(_.hint), 1)]),
175
192
  _: 1
176
- }, 8, ["id"])) : p("", !0), v.counter ? (T(), m("span", {
193
+ }, 8, ["id"])) : f("", !0), _.counter ? (w(), p("span", {
177
194
  key: 1,
178
- class: "v-textarea-counter",
179
- "data-over": k(ce) ? "" : void 0
180
- }, O(k(se)), 9, z)) : p("", !0)])) : p("", !0)
181
- ], 14, M));
195
+ class: "v-textarea-counter v-field-counter",
196
+ "data-over": O(le) ? "" : void 0
197
+ }, D(O(ce)), 9, R)) : f("", !0)])) : f("", !0)
198
+ ], 14, j));
182
199
  }
183
200
  });
184
201
  //#endregion
185
- export { B as default };
202
+ export { z as default };
186
203
 
187
204
  //# sourceMappingURL=VTextarea.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VTextarea.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VTextarea/VTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @core\n/**\n * A field for text running over several lines, with the same label, hint, icons,\n * counter, loading state and clear button as VInput, arranged around a real\n * `<textarea>`.\n *\n * Two things differ from its single-line counterpart. The field can grow with what\n * is typed into it, and that is pure CSS — a browser without `field-sizing` simply\n * keeps a fixed height with its usual scrollbar. And the counter is placed UNDER the\n * field rather than inside it, where several lines of text would run into it.\n *\n * As in VInput, the attributes it is given are split — `class` and `style` stay\n * outside, the rest goes to the textarea — validation stays the browser's, and the\n * only behavioural JavaScript is the v-model and the clear button, which has to hand\n * focus back to the field it just emptied.\n */\nimport { computed, ref } from 'vue'\n\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconName, iconProps } from '../VIcon/iconProps'\nimport { close as closeIcon } from '../VIcon/icons/close'\nimport type { IconSource } from '../VIcon/types'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport VTypography from '../VTypography/VTypography.vue'\n\nimport { useFieldIds } from '../../composables/useFieldIds'\nimport { useIconClickHandlers } from '../../composables/useIconClickHandlers'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTextLimit } from '../../composables/useTextLimit'\nimport { useMessages } from '../../i18n/state'\n\ninterface TextareaProps {\n /** The size of the field, which sets its padding, its type scale and its icons. */\n size?: 'sm' | 'md' | 'lg'\n /**\n * Takes 4px off the field by tightening its padding, leaving the number of lines,\n * the type and the icons alone.\n */\n compact?: boolean\n /**\n * How many lines of text the field shows — the native `rows` attribute, which is\n * what gives the field its height. Anything under 1 is raised to 1, and at 1 the\n * field is exactly as tall as a VInput of the same size.\n */\n rows?: number\n /**\n * Lets the field grow as the text is typed, instead of scrolling inside the height\n * `rows` gives it — which stays its starting height. It is pure CSS; where the\n * browser does not support it, the field simply behaves like an ordinary textarea.\n */\n autoGrow?: boolean\n /**\n * Marks the field as invalid whatever the browser thinks — the route for a rule\n * only the server can check.\n */\n invalid?: boolean\n /** Makes the field unusable, greyed out through the colour tokens. */\n disabled?: boolean\n /**\n * Shows the text without allowing it to be changed. The field can still be focused\n * and copied from, and the clear button is hidden.\n */\n readonly?: boolean\n /** The label above the field, tied to it so that clicking it focuses the field. */\n label?: string\n /**\n * A line of help under the field, tied to the textarea for assistive technology so\n * that it is read out along with the label.\n */\n hint?: string\n /**\n * An icon inside the field, at the start. It is decorative by default and becomes a\n * real button as soon as a `@click:icon-start` listener is attached — in which case\n * it needs `iconStartLabel`. The `#start` slot replaces it.\n */\n iconStart?: IconSource\n /**\n * The same at the end of the field. The `#end` slot replaces it, and the loading\n * spinner takes its place while it turns.\n */\n iconEnd?: IconSource\n /** What the start icon does, in words, once it is clickable. */\n iconStartLabel?: string\n /** What the end icon does, in words, once it is clickable. */\n iconEndLabel?: string\n /** Shows a spinner at the end of the field, in place of the end icon or slot. */\n loading?: boolean\n /**\n * What screen readers announce while the spinner turns. It falls back to the design\n * system dictionary.\n */\n loadingLabel?: string\n /**\n * Offers a cross that empties the field. It appears when there is something to\n * clear and the field can be edited.\n */\n clearable?: boolean\n /** What the clear button does, in words. It falls back to the design system dictionary. */\n clearLabel?: string\n /**\n * The maximum number of characters. By default this is the browser's own limit,\n * which simply refuses anything beyond it.\n */\n maxlength?: number\n /**\n * Turns that limit into a soft one: the reader may type past it, and the field goes\n * into error instead of silently refusing the keystrokes. It is reported through\n * the native validity, so a form cannot be submitted over the limit.\n */\n softLimit?: boolean\n /**\n * Shows how much has been typed, under the field: \"12/80\" against a limit, or just\n * \"12\" without one.\n */\n counter?: boolean\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n size: 'md',\n compact: false,\n rows: 5,\n autoGrow: false,\n invalid: false,\n disabled: false,\n readonly: false,\n label: undefined,\n hint: undefined,\n iconStart: undefined,\n iconEnd: undefined,\n iconStartLabel: undefined,\n iconEndLabel: undefined,\n loading: false,\n loadingLabel: undefined,\n clearable: false,\n clearLabel: undefined,\n maxlength: undefined,\n softLimit: false,\n counter: false,\n})\n\nconst emit = defineEmits<{\n /** The start icon was clicked. Attaching this listener is what makes it a button. */\n 'click:icon-start': [event: MouseEvent]\n /** The end icon was clicked. Attaching this listener is what makes it a button. */\n 'click:icon-end': [event: MouseEvent]\n /** The clear button was pressed. The field has already been emptied. */\n clear: []\n}>()\n\ndefineSlots<{\n /** Content at the start of the field, which replaces `iconStart`. */\n start?(): unknown\n /**\n * Content at the end of the field, which replaces `iconEnd`. It is hidden while the\n * field is loading, the spinner taking that place.\n */\n end?(): unknown\n}>()\n\nconst model = defineModel<string>({ default: '' })\n\n// HTML wants `rows` to be a positive integer, and it drops anything else on the floor:\n// a 0, a negative or a fractional value would leave the browser falling back to its own\n// default of two rows, which is neither what was asked for nor this component's default.\n// Rounding and flooring here is what keeps the prop's contract out of the parser's hands.\nconst resolvedRows = computed(() => Math.max(1, Math.round(props.rows)))\n\n// `class` and `style` stay on the wrapper, where a consumer expects to style the\n// field; every other attribute goes to the textarea, where it does something.\nconst { attrs, rootClass, rootStyle, forwardedAttrs: restAttrs } = useRootAttrs()\n\n// The prop keeps priority; what it falls back to is the dictionary, so the default\n// wording follows the language the design system is set to.\nconst m = useMessages()\nconst resolvedLoadingLabel = computed(() => props.loadingLabel ?? m.value.common.loading)\nconst resolvedClearLabel = computed(() => props.clearLabel ?? m.value.common.clear)\n\nconst { fieldId, hintId, describedBy } = useFieldIds(attrs, () => !!props.hint)\n\nconst { hasIconStartHandler, hasIconEndHandler } = useIconClickHandlers({\n name: 'VTextarea',\n iconStartLabel: props.iconStartLabel,\n iconEndLabel: props.iconEndLabel,\n})\n\nconst controlEl = ref<HTMLTextAreaElement | null>(null)\n\nconst showClear = computed(\n () => props.clearable && model.value.length > 0 && !props.disabled && !props.readonly,\n)\n\n// @a11y @core — moving the focus back is the accessibility half of this handler.\n// The cross vanishes the instant it empties the field, so without that call focus\n// falls back to the page body and a keyboard user loses their place in the form.\nfunction onClear() {\n model.value = ''\n emit('clear')\n controlEl.value?.focus()\n}\n\nconst { counterText, over } = useTextLimit({\n el: controlEl,\n text: () => model.value,\n maxlength: () => props.maxlength,\n softLimit: () => props.softLimit,\n})\n</script>\n\n<template>\n <div\n class=\"v-textarea v-control\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-size=\"size\"\n :data-compact=\"compact ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-readonly=\"readonly ? '' : undefined\"\n >\n <VTypography v-if=\"label\" as=\"label\" variant=\"label\" class=\"v-textarea-label\" :for=\"fieldId\">\n {{ label }}\n </VTypography>\n\n <div\n class=\"v-textarea-field\"\n :style=\"{ '--textarea-rows': resolvedRows }\"\n :data-auto-grow=\"autoGrow ? '' : undefined\"\n >\n <slot name=\"start\">\n <button\n v-if=\"iconStart && hasIconStartHandler\"\n type=\"button\"\n class=\"v-textarea-action\"\n :aria-label=\"iconStartLabel ?? iconName(iconStart)\"\n :disabled=\"disabled\"\n @click=\"emit('click:icon-start', $event)\"\n >\n <VIcon v-bind=\"iconProps(iconStart)\" />\n </button>\n <VIcon v-else-if=\"iconStart\" v-bind=\"iconProps(iconStart)\" />\n </slot>\n\n <textarea\n v-bind=\"restAttrs\"\n :id=\"fieldId\"\n ref=\"controlEl\"\n v-model=\"model\"\n class=\"v-textarea-control\"\n :rows=\"resolvedRows\"\n :maxlength=\"softLimit ? undefined : maxlength\"\n :disabled=\"disabled\"\n :readonly=\"readonly || undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"v-textarea-action v-textarea-clear\"\n :aria-label=\"resolvedClearLabel\"\n @click=\"onClear\"\n >\n <VIcon :name=\"closeIcon\" />\n </button>\n\n <VSpinner v-if=\"loading\" :label=\"resolvedLoadingLabel\" />\n <slot v-else name=\"end\">\n <button\n v-if=\"iconEnd && hasIconEndHandler\"\n type=\"button\"\n class=\"v-textarea-action\"\n :aria-label=\"iconEndLabel ?? iconName(iconEnd)\"\n :disabled=\"disabled\"\n @click=\"emit('click:icon-end', $event)\"\n >\n <VIcon v-bind=\"iconProps(iconEnd)\" />\n </button>\n <VIcon v-else-if=\"iconEnd\" v-bind=\"iconProps(iconEnd)\" />\n </slot>\n </div>\n\n <div v-if=\"hint || counter\" class=\"v-textarea-meta\">\n <VTypography v-if=\"hint\" :id=\"hintId\" variant=\"caption\" tone=\"muted\" class=\"v-textarea-hint\">\n {{ hint }}\n </VTypography>\n <span v-if=\"counter\" class=\"v-textarea-counter\" :data-over=\"over ? '' : undefined\">\n {{ counterText }}\n </span>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-textarea {\n display: flex;\n flex-direction: column;\n gap: var(--vectis-space-1);\n width: 100%;\n font-family: var(--vectis-text-family);\n }\n\n /* The label and the hint are rendered by VTypography, which carries their type. The\n .v-textarea-label and .v-textarea-hint classes remain as hooks: a consumer\n overrides through them, and the disabled state below reaches them that way. */\n\n .v-textarea-meta {\n display: flex;\n align-items: baseline;\n gap: var(--vectis-space-2);\n }\n\n /* The counter keeps its own local styling rather than going through VTypography:\n figures of equal width, so the number does not shift as it counts, and a colour\n that marks the overflow — neither of which is a typographic role. */\n .v-textarea-counter {\n margin-inline-start: auto;\n font-size: var(--vectis-text-caption-size);\n color: var(--vectis-color-text-muted);\n font-variant-numeric: tabular-nums;\n }\n\n .v-textarea-counter[data-over] {\n color: var(--vectis-color-danger-text);\n }\n\n /* This is the box that carries the border, the background, the focus ring and the\n resize handle — which is why it also hides its overflow, `resize` having no\n effect on a box whose overflow is visible. `--field-border-color` is the single\n source of truth for its colour, and the hover, error and disabled states do\n nothing but redefine it. */\n .v-textarea-field {\n --field-border-color: var(--vectis-color-border-strong);\n\n /*\n * Nothing here restates the size scale: the `--control-*` variables are inherited\n * from the v-control root (styles/control-size.css), the icon context included.\n *\n * The field carries NO height of its own: it is the `rows` attribute on the\n * textarea that sets one, and the field is simply as tall as the control it wraps.\n * That is what makes dragging the resize handle behave like a bare textarea — the\n * field shrinks and the control scrolls — instead of stopping at a CSS floor.\n */\n\n /* The leading is named ONCE and feeds two things that have to agree by\n construction: the field's own `line-height`, and the first line box below,\n against which everything sitting beside the text is offset. */\n --textarea-leading: var(--vectis-text-body-md-leading);\n\n /* The height of the FIRST line box, the row the icons and the buttons align on.\n\n TRAP — it is DERIVED and must never be written as `1lh`. The `lh` unit resolves\n against the element the property is USED on, and the children do not share the\n field's font: an icon carries `--vectis-icon-size` (20px against the field's\n 14px), so `1lh` measured a 30px line there and dropped every icon 4.5px below\n the text and the buttons it is supposed to line up with. The buttons happened to\n be right only because the reset gives them `font: inherit`. */\n --textarea-line: calc(var(--control-font-size) * var(--textarea-leading));\n\n display: flex;\n align-items: flex-start;\n gap: var(--control-gap);\n padding-inline: var(--control-padding-inline-field);\n /* Half of what is left of the control height once its two 1px borders and one line\n box are taken out — so at `rows=\"1\"` the field is exactly a VInput of the same\n size, and every further row adds precisely one line box.\n\n It reads --control-height and not --control-height-base, which is what carries\n the density here: with no height of its own left to shrink, the padding is the\n only lever `compact` has, and 2px off each edge is the -4px the whole scale\n promises. */\n padding-block: calc((var(--control-height) - 2px - var(--textarea-line)) / 2);\n background: var(--vectis-color-surface);\n color: var(--vectis-color-text);\n border: 1px solid var(--field-border-color);\n border-radius: var(--vectis-radius-interactive);\n font-size: var(--control-font-size);\n /* Text running over several lines takes the body line height. The `control` type\n role, whose lines are set tight against one another, only makes sense for a\n single-line label. */\n line-height: var(--textarea-leading);\n resize: vertical;\n overflow: hidden;\n transition:\n border-color var(--vectis-duration-fast) var(--vectis-ease-default),\n background-color var(--vectis-duration-fast) var(--vectis-ease-default),\n box-shadow var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-textarea-control {\n flex: 1;\n min-width: 0;\n align-self: stretch;\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n outline: none; /* the focus ring is drawn by the field around it, not here */\n resize: none; /* the resize handle belongs to the field, so there is only one */\n }\n\n .v-textarea-control::placeholder {\n color: var(--vectis-color-text-subtle);\n }\n\n /* The icons and buttons align with the FIRST line of text rather than with the\n middle of a field whose height varies: half the difference between the line box and\n the element centres it there. On a single line that comes out identical to the\n centring VInput gets from its fixed height, which is the point.\n\n The measure is `--textarea-line` and never `1lh` — see the trap where it is\n declared: `lh` would be resolved against each child's own font, which differs from\n the field's.\n\n TRAP — the margin is SYMMETRIC, the VToast rule. It looks redundant under\n `align-items: flex-start`, where only the start side moves anything, but the end\n side is what keeps the item's OUTER box down to one line box. Left off, a clear\n cross (24px against a 21px line) would be the tallest thing in the flex line and\n the field would be 1.5px taller than the rows asked for — 2px at `lg` — which is\n exactly the gap that stops `rows=\"1\"` from being a VInput. */\n .v-textarea-field > .v-icon,\n .v-textarea-field > .v-spinner {\n margin-block: calc((var(--textarea-line) - var(--vectis-icon-size)) / 2);\n }\n\n .v-textarea-field > .v-textarea-action {\n margin-block: calc((var(--textarea-line) - var(--control-action-size)) / 2);\n }\n\n /* A decorative icon is drawn in a muted grey, so it stays quieter than the text\n being typed beside it. */\n .v-textarea-field > .v-icon {\n color: var(--vectis-color-text-muted);\n }\n\n .v-textarea-field > .v-spinner {\n font-size: var(--vectis-icon-size);\n }\n\n /* A read-only field sinks slightly into the page but keeps its text at full\n strength — the value is there to be read — and still shows the accent focus ring.\n The state is read from [data-readonly] and never from `:read-only`, which the\n browser also matches on a disabled field.\n\n TRAP — this block must stay FIRST in the sequence of states: read-only, then\n hover, focus, invalid and disabled. Every one of these selectors weighs (0,3,0),\n `:has()` taking the specificity of what it contains, so nothing but the source\n order arbitrates between them. Moved further down, this rule would repaint the\n error border and the accent focus ring grey, with no error anywhere. What belongs\n to a read-only field is its BASE colour alone. */\n .v-textarea[data-readonly] .v-textarea-field {\n --field-border-color: var(--vectis-color-border);\n\n background: var(--vectis-color-surface-sunken);\n }\n\n .v-textarea-field:hover:not(:has(.v-textarea-control:focus)):not(\n :has(\n .v-textarea-control:disabled,\n .v-textarea-control:user-invalid,\n .v-textarea-control[aria-invalid='true']\n )\n ) {\n --field-border-color: color-mix(\n in oklab,\n var(--vectis-color-border-strong),\n var(--vectis-color-text) 15%\n );\n }\n\n /* The focused field appears to have a two-pixel border: it is really its own 1px\n border plus a 1px shadow of the same colour just outside it, which costs no\n layout and therefore makes nothing jump.\n\n The selector watches the CONTROL's focus and not `:focus-within`, so that when one\n of the field's own buttons takes keyboard focus, only that button's outline\n lights up: two indicators at once would be unreadable. And it is `:focus` rather\n than `:focus-visible`, because a text field shows its focus even when it was\n reached with the mouse.\n\n The transparent outline is the safety net for Windows forced colours, which drop\n box-shadows entirely; an outline survives and keeps the field marked. */\n .v-textarea-field:has(.v-textarea-control:focus) {\n --field-border-color: var(--vectis-color-accent);\n\n box-shadow: 0 0 0 1px var(--field-border-color);\n outline: var(--vectis-focus-ring-width) solid transparent;\n }\n\n /* The invalid state, from the browser's own verdict first and from the `invalid`\n prop second. Only the colour variable is changed, which is why the border AND the\n focus ring both turn red without either being restated. */\n .v-textarea-field:has(.v-textarea-control:user-invalid),\n .v-textarea-field:has(.v-textarea-control[aria-invalid='true']) {\n --field-border-color: var(--vectis-color-danger);\n }\n\n /* The field's own buttons — the clear cross, a clickable icon — go from muted grey\n to full strength on hover, and take VButton's radius so their focus ring has the\n same rounded corners as everything else.\n\n The negative margin is DERIVED and never written as a number: it is exactly half\n the difference between the icon and the wider box holding it. Subtracting it\n cancels that inset, so the glyph lands precisely where a decorative icon would\n have — against the field's padding, one --control-gap from its neighbour. */\n .v-textarea-action {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--control-action-size);\n height: var(--control-action-size);\n margin-inline: calc((var(--vectis-icon-size) - var(--control-action-size)) / 2);\n padding: 0;\n border: none;\n background: transparent;\n color: var(--vectis-color-text-muted);\n border-radius: var(--vectis-radius-interactive);\n cursor: pointer;\n flex: none;\n transition: color var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-textarea-action:hover:not(:disabled) {\n color: var(--vectis-color-text);\n }\n\n .v-textarea-action:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(var(--vectis-focus-ring-offset) * -1);\n }\n\n /* A disabled field greys out through the colour tokens, the same ones VCheckbox and\n VRadio use, and never through opacity. It comes LAST in the sequence of states,\n which at equal specificity is what makes it win over all of them, the error\n included: a disabled field is not submitted, so it has nothing to report.\n\n The text here is `text-muted` and not the `text-subtle` used by the label and the\n hint below, because those sit on the page surface where this sits on\n `surface-muted` — against which subtle falls to a 4.4:1 contrast. The control\n itself is exempt from that rule, being natively disabled, but the icons the field\n CONTAINS are not, and they inherit this colour. */\n .v-textarea[data-disabled] .v-textarea-field {\n --field-border-color: var(--vectis-color-border);\n\n background: var(--vectis-color-surface-muted);\n color: var(--vectis-color-text-muted);\n cursor: not-allowed;\n resize: none;\n }\n\n .v-textarea[data-disabled] .v-textarea-label,\n .v-textarea[data-disabled] .v-textarea-hint,\n .v-textarea[data-disabled] .v-textarea-counter {\n color: var(--vectis-color-text-subtle);\n }\n\n .v-textarea[data-disabled] .v-textarea-action,\n .v-textarea[data-disabled] .v-textarea-field > .v-icon {\n color: inherit;\n cursor: not-allowed;\n }\n\n .v-textarea-control:disabled {\n cursor: not-allowed;\n }\n\n /* Growing with the content is pure CSS: `field-sizing` makes the textarea's height\n follow what is typed, and the field around it follows in turn. The resize handle\n goes, there being nothing left to resize by hand. A browser without support keeps\n the fixed height and its scrollbar, which is the intended fallback. */\n .v-textarea-field[data-auto-grow] {\n resize: none;\n }\n\n /* `field-sizing: content` sizes the control to what has been typed and ignores `rows`\n outright, so an auto-growing field would open one line tall whatever the prop said.\n The floor hands the STARTING height back to `rows` and leaves the growing to the\n browser. It is scoped to this branch and must not be lifted onto the control at\n large: a floor there would stop the control shrinking with the resize handle, and\n the field, which hides its overflow, would clip it instead of scrolling. */\n .v-textarea-field[data-auto-grow] .v-textarea-control {\n field-sizing: content;\n min-block-size: calc(var(--textarea-rows) * var(--textarea-line));\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-textarea-field,\n .v-textarea-action {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"VTextarea.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VTextarea/VTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @core\n/**\n * A multi-line field, with the same label, hint, icons, counter, loading state and clear\n * cross as VInput, arranged around a real `<textarea>`.\n *\n * Two things differ. It grows with what is typed, which is pure CSS (`field-sizing`) — a\n * browser without it keeps a fixed height and its usual scrollbar. And the counter goes\n * UNDER the field rather than inside it, where several lines of text would run into it.\n *\n * As in VInput: the attrs split, validation stays the browser's, and the only behavioural JS\n * is the v-model and the clear cross, which hands focus back to the field it just emptied.\n */\nimport { computed, ref } from 'vue'\n\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconName, iconProps } from '../VIcon/iconProps'\nimport { close as closeIcon } from '../VIcon/icons/close'\nimport type { IconSource } from '../VIcon/types'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport VTypography from '../VTypography/VTypography.vue'\n\nimport { useClearable } from '../../composables/useClearable'\nimport { useFieldIds } from '../../composables/useFieldIds'\nimport { useIconClickHandlers } from '../../composables/useIconClickHandlers'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTextLimit } from '../../composables/useTextLimit'\nimport { useMessages } from '../../i18n/state'\n\n/** The height of one line: 32, 40 or 48 pixels. */\nexport type TextareaSize = 'sm' | 'md' | 'lg'\n\ninterface TextareaProps {\n /** The size of the field, which sets its padding, its type scale and its icons. */\n size?: TextareaSize\n /**\n * Takes 4px off the field by tightening its padding, leaving the number of lines,\n * the type and the icons alone.\n */\n compact?: boolean\n /**\n * How many lines of text the field shows — the native `rows` attribute, which is\n * what gives the field its height. Anything under 1 is raised to 1, and at 1 the\n * field is exactly as tall as a VInput of the same size.\n */\n rows?: number\n /**\n * Lets the field grow as the text is typed, instead of scrolling inside the height\n * `rows` gives it — which stays its starting height. It is pure CSS; where the\n * browser does not support it, the field simply behaves like an ordinary textarea.\n */\n autoGrow?: boolean\n /**\n * Marks the field as invalid whatever the browser thinks — the route for a rule\n * only the server can check.\n */\n invalid?: boolean\n /** Makes the field unusable, greyed out through the colour tokens. */\n disabled?: boolean\n /**\n * Shows the text without allowing it to be changed. The field can still be focused\n * and copied from, and the clear button is hidden.\n */\n readonly?: boolean\n /** The label above the field, tied to it so that clicking it focuses the field. */\n label?: string\n /**\n * A line of help under the field, tied to the textarea for assistive technology so\n * that it is read out along with the label.\n */\n hint?: string\n /**\n * An icon inside the field, at the start. It is decorative by default and becomes a\n * real button as soon as a `@click:icon-start` listener is attached — in which case\n * it needs `iconStartLabel`. The `#start` slot is rendered after it, so the two can\n * be given together.\n */\n iconStart?: IconSource\n /**\n * The same at the end of the field. The `#end` slot replaces it, and the loading\n * spinner takes its place while it turns.\n */\n iconEnd?: IconSource\n /** What the start icon does, in words, once it is clickable. */\n iconStartLabel?: string\n /** What the end icon does, in words, once it is clickable. */\n iconEndLabel?: string\n /** Shows a spinner at the end of the field, in place of the end icon or slot. */\n loading?: boolean\n /**\n * What screen readers announce while the spinner turns. It falls back to the design\n * system dictionary.\n */\n loadingLabel?: string\n /**\n * Offers a cross that empties the field. It appears when there is something to\n * clear and the field can be edited.\n */\n clearable?: boolean\n /**\n * Decides whether the cross is shown, instead of letting the field work it out from its\n * own content — a read-only field included. It is the same escape hatch VInput offers,\n * for the same reason: a component built on top of this one may hold what there is to\n * clear somewhere other than the text.\n */\n clearVisible?: boolean\n /** What the clear button does, in words. It falls back to the design system dictionary. */\n clearLabel?: string\n /**\n * The maximum number of characters. By default this is the browser's own limit,\n * which simply refuses anything beyond it.\n */\n maxlength?: number\n /**\n * Turns that limit into a soft one: the reader may type past it, and the field goes\n * into error instead of silently refusing the keystrokes. It is reported through\n * the native validity, so a form cannot be submitted over the limit.\n */\n softLimit?: boolean\n /**\n * Shows how much has been typed, under the field: \"12/80\" against a limit, or just\n * \"12\" without one.\n */\n counter?: boolean\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n size: 'md',\n compact: false,\n rows: 5,\n autoGrow: false,\n invalid: false,\n disabled: false,\n readonly: false,\n label: undefined,\n hint: undefined,\n iconStart: undefined,\n iconEnd: undefined,\n iconStartLabel: undefined,\n iconEndLabel: undefined,\n loading: false,\n loadingLabel: undefined,\n clearable: false,\n clearVisible: undefined,\n clearLabel: undefined,\n maxlength: undefined,\n softLimit: false,\n counter: false,\n})\n\nconst emit = defineEmits<{\n /** The start icon was clicked. Attaching this listener is what makes it a button. */\n 'click:icon-start': [event: MouseEvent]\n /** The end icon was clicked. Attaching this listener is what makes it a button. */\n 'click:icon-end': [event: MouseEvent]\n /** The clear button was pressed. The field has already been emptied. */\n clear: []\n}>()\n\ndefineSlots<{\n /**\n * Content at the start of the field, rendered after `iconStart` rather than in its\n * place, as in VInput.\n */\n start?(): unknown\n /**\n * Content at the end of the field, which replaces `iconEnd`. It is hidden while the\n * field is loading, the spinner taking that place.\n */\n end?(): unknown\n /**\n * Controls of your own inside the field, placed before the field's own — the clear cross\n * and the end icon. It is the slot for something that acts on the VALUE rather than on\n * the field, and it is VInput's slot of the same name.\n */\n 'value-end'?(): unknown\n}>()\n\n/** The text in the field, empty to begin with. */\nconst model = defineModel<string>({ default: '' })\n\n// HTML wants `rows` to be a positive integer, and it drops anything else on the floor:\n// a 0, a negative or a fractional value would leave the browser falling back to its own\n// default of two rows, which is neither what was asked for nor this component's default.\n// Rounding and flooring here is what keeps the prop's contract out of the parser's hands.\nconst resolvedRows = computed(() => Math.max(1, Math.round(props.rows)))\n\n// `class` and `style` stay on the wrapper, where a consumer expects to style the\n// field; every other attribute goes to the textarea, where it does something.\nconst { attrs, rootClass, rootStyle, forwardedAttrs: restAttrs } = useRootAttrs()\n\n// The prop keeps priority; what it falls back to is the dictionary, so the default\n// wording follows the language the design system is set to.\nconst m = useMessages()\nconst resolvedClearLabel = computed(() => props.clearLabel ?? m.value.common.clear)\n\nconst { fieldId, hintId, describedBy } = useFieldIds(attrs, () => !!props.hint)\n\nconst { hasIconStartHandler, hasIconEndHandler } = useIconClickHandlers({\n name: 'VTextarea',\n iconStartLabel: props.iconStartLabel,\n iconEndLabel: props.iconEndLabel,\n})\n\nconst controlEl = ref<HTMLTextAreaElement | null>(null)\n\nconst { showClear, onClear } = useClearable({\n clearable: () => props.clearable,\n clearVisible: () => props.clearVisible,\n disabled: () => props.disabled,\n readonly: () => props.readonly,\n text: () => model.value,\n controlEl,\n onCleared: () => {\n model.value = ''\n emit('clear')\n },\n})\n\nconst { counterText, over } = useTextLimit({\n el: controlEl,\n text: () => model.value,\n maxlength: () => props.maxlength,\n softLimit: () => props.softLimit,\n})\n\ndefineExpose({\n /** Moves the focus to the real textarea. */\n focus: (options?: FocusOptions) => controlEl.value?.focus(options),\n /** Selects everything in the field. */\n select: () => controlEl.value?.select(),\n /** The real `<textarea>`, for what neither of the two above covers. */\n el: controlEl,\n})\n</script>\n\n<template>\n <div\n class=\"v-textarea v-control\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-size=\"size\"\n :data-compact=\"compact ? '' : undefined\"\n :data-disabled=\"disabled ? '' : undefined\"\n :data-readonly=\"readonly ? '' : undefined\"\n >\n <VTypography v-if=\"label\" as=\"label\" variant=\"label\" class=\"v-textarea-label\" :for=\"fieldId\">\n {{ label }}\n </VTypography>\n\n <div\n class=\"v-textarea-field\"\n :style=\"{ '--textarea-rows': resolvedRows }\"\n :data-auto-grow=\"autoGrow ? '' : undefined\"\n >\n <!-- The start icon is rendered BEFORE the slot, where the end icon is the slot's own\n fallback. The asymmetry is VInput's, mirrored here so the two fields answer the\n same way: what a composed field puts in that zone is OTHER content beside the\n icon, not another way of drawing it. -->\n <button\n v-if=\"iconStart && hasIconStartHandler\"\n type=\"button\"\n class=\"v-textarea-action v-field-action\"\n :aria-label=\"iconStartLabel ?? iconName(iconStart)\"\n :disabled=\"disabled\"\n @click=\"emit('click:icon-start', $event)\"\n >\n <VIcon v-bind=\"iconProps(iconStart)\" />\n </button>\n <VIcon v-else-if=\"iconStart\" v-bind=\"iconProps(iconStart)\" />\n <slot name=\"start\" />\n\n <textarea\n v-bind=\"restAttrs\"\n :id=\"fieldId\"\n ref=\"controlEl\"\n v-model=\"model\"\n class=\"v-textarea-control\"\n :rows=\"resolvedRows\"\n :maxlength=\"softLimit ? undefined : maxlength\"\n :disabled=\"disabled\"\n :readonly=\"readonly || undefined\"\n :aria-invalid=\"invalid || undefined\"\n :aria-describedby=\"describedBy\"\n />\n\n <slot name=\"value-end\" />\n\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"v-textarea-action v-field-action v-textarea-clear\"\n :aria-label=\"resolvedClearLabel\"\n @click=\"onClear\"\n >\n <VIcon :name=\"closeIcon\" />\n </button>\n\n <VSpinner v-if=\"loading\" :label=\"loadingLabel\" />\n <slot v-else name=\"end\">\n <button\n v-if=\"iconEnd && hasIconEndHandler\"\n type=\"button\"\n class=\"v-textarea-action v-field-action\"\n :aria-label=\"iconEndLabel ?? iconName(iconEnd)\"\n :disabled=\"disabled\"\n @click=\"emit('click:icon-end', $event)\"\n >\n <VIcon v-bind=\"iconProps(iconEnd)\" />\n </button>\n <VIcon v-else-if=\"iconEnd\" v-bind=\"iconProps(iconEnd)\" />\n </slot>\n </div>\n\n <div v-if=\"hint || counter\" class=\"v-textarea-meta v-field-meta\">\n <VTypography v-if=\"hint\" :id=\"hintId\" variant=\"caption\" tone=\"muted\" class=\"v-textarea-hint\">\n {{ hint }}\n </VTypography>\n <span\n v-if=\"counter\"\n class=\"v-textarea-counter v-field-counter\"\n :data-over=\"over ? '' : undefined\"\n >\n {{ counterText }}\n </span>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-textarea {\n display: flex;\n flex-direction: column;\n gap: var(--vectis-space-1);\n width: 100%;\n font-family: var(--vectis-text-family);\n }\n\n /* The label and the hint are rendered by VTypography, which carries their type. The\n .v-textarea-label and .v-textarea-hint classes remain as hooks: a consumer\n overrides through them, and the disabled state below reaches them that way. */\n\n /* This is the box that carries the border, the background, the focus ring and the\n resize handle — which is why it also hides its overflow, `resize` having no\n effect on a box whose overflow is visible. `--field-border-color` is the single\n source of truth for its colour, and the hover, error and disabled states do\n nothing but redefine it. */\n .v-textarea-field {\n --field-border-color: var(--vectis-color-border-strong);\n\n /*\n * Nothing here restates the size scale: the `--control-*` variables are inherited\n * from the v-control root (styles/control-size.css), the icon context included.\n *\n * The field carries NO height of its own: it is the `rows` attribute on the\n * textarea that sets one, and the field is simply as tall as the control it wraps.\n * That is what makes dragging the resize handle behave like a bare textarea — the\n * field shrinks and the control scrolls — instead of stopping at a CSS floor.\n */\n\n /* The leading is named ONCE and feeds two things that have to agree by\n construction: the field's own `line-height`, and the first line box below,\n against which everything sitting beside the text is offset. */\n --textarea-leading: var(--vectis-text-body-md-leading);\n\n /* The height of the FIRST line box, the row the icons and the buttons align on.\n\n TRAP — it is DERIVED and must never be written as `1lh`. The `lh` unit resolves\n against the element the property is USED on, and the children do not share the\n field's font: an icon carries `--vectis-icon-size` (20px against the field's\n 14px), so `1lh` measured a 30px line there and dropped every icon 4.5px below\n the text and the buttons it is supposed to line up with. The buttons happened to\n be right only because the reset gives them `font: inherit`. */\n --textarea-line: calc(var(--control-font-size) * var(--textarea-leading));\n\n display: flex;\n align-items: flex-start;\n gap: var(--control-gap);\n padding-inline: var(--control-padding-inline-field);\n /* Half of what is left of the control height once its two 1px borders and one line\n box are taken out — so at `rows=\"1\"` the field is exactly a VInput of the same\n size, and every further row adds precisely one line box.\n\n It reads --control-height and not --control-height-base, which is what carries\n the density here: with no height of its own left to shrink, the padding is the\n only lever `compact` has, and 2px off each edge is the -4px the whole scale\n promises. */\n padding-block: calc((var(--control-height) - 2px - var(--textarea-line)) / 2);\n background: var(--vectis-color-surface);\n color: var(--vectis-color-text);\n border: 1px solid var(--field-border-color);\n /* TRAP — the cap is what carries the VInput identity above into the OTHER row counts,\n and it has to stay derived from --control-height. A browser scales down any radius it\n cannot fit, so on a one-row field a pill override is already painted as half the\n control height; min() applies that same reduction to a field that is taller. Written\n bare, the identical override paints half of a FIVE-row box instead: 60px corners on a\n 120px field, an ellipse sitting beside buttons that kept 20px, and the same again on\n every drag of the resize handle. At the shipped 6px it resolves to 6px on every size,\n compact included, so nothing at the default value can see this line go — only the\n PillRadius play function can. */\n border-radius: min(var(--vectis-radius-interactive), calc(var(--control-height) / 2));\n font-size: var(--control-font-size);\n /* Text running over several lines takes the body line height. The `control` type\n role, whose lines are set tight against one another, only makes sense for a\n single-line label. */\n line-height: var(--textarea-leading);\n resize: vertical;\n overflow: hidden;\n transition:\n border-color var(--vectis-duration-fast) var(--vectis-ease-default),\n background-color var(--vectis-duration-fast) var(--vectis-ease-default),\n box-shadow var(--vectis-duration-fast) var(--vectis-ease-default);\n }\n\n .v-textarea-control {\n flex: 1;\n min-width: 0;\n align-self: stretch;\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n outline: none; /* the focus ring is drawn by the field around it, not here */\n resize: none; /* the resize handle belongs to the field, so there is only one */\n }\n\n .v-textarea-control::placeholder {\n color: var(--vectis-color-text-subtle);\n }\n\n /* The icons and buttons align with the FIRST line of text rather than with the\n middle of a field whose height varies: half the difference between the line box and\n the element centres it there. On a single line that comes out identical to the\n centring VInput gets from its fixed height, which is the point.\n\n The measure is `--textarea-line` and never `1lh` — see the trap where it is\n declared: `lh` would be resolved against each child's own font, which differs from\n the field's.\n\n TRAP — the margin is SYMMETRIC, the VToast rule. It looks redundant under\n `align-items: flex-start`, where only the start side moves anything, but the end\n side is what keeps the item's OUTER box down to one line box. Left off, a clear\n cross (24px against a 21px line) would be the tallest thing in the flex line and\n the field would be 1.5px taller than the rows asked for — 2px at `lg` — which is\n exactly the gap that stops `rows=\"1\"` from being a VInput. */\n .v-textarea-field > .v-icon,\n .v-textarea-field > .v-spinner {\n margin-block: calc((var(--textarea-line) - var(--vectis-icon-size)) / 2);\n }\n\n .v-textarea-field > .v-textarea-action {\n margin-block: calc((var(--textarea-line) - var(--control-action-size)) / 2);\n }\n\n /* A decorative icon is drawn in a muted grey, so it stays quieter than the text\n being typed beside it. */\n .v-textarea-field > .v-icon {\n color: var(--vectis-color-text-muted);\n }\n\n .v-textarea-field > .v-spinner {\n font-size: var(--vectis-icon-size);\n }\n\n /* A read-only field sinks slightly into the page but keeps its text at full\n strength — the value is there to be read — and still shows the accent focus ring.\n The state is read from [data-readonly] and never from `:read-only`, which the\n browser also matches on a disabled field.\n\n TRAP — this block must stay FIRST in the sequence of states: read-only, then\n hover, focus, invalid and disabled. Every one of these selectors weighs (0,3,0),\n `:has()` taking the specificity of what it contains, so nothing but the source\n order arbitrates between them. Moved further down, this rule would repaint the\n error border and the accent focus ring grey, with no error anywhere. What belongs\n to a read-only field is its BASE colour alone. */\n .v-textarea[data-readonly] .v-textarea-field {\n --field-border-color: var(--vectis-color-border);\n\n background: var(--vectis-color-surface-sunken);\n }\n\n .v-textarea-field:hover:not(:has(.v-textarea-control:focus)):not(\n :has(\n .v-textarea-control:disabled,\n .v-textarea-control:user-invalid,\n .v-textarea-control[aria-invalid='true']\n )\n ) {\n --field-border-color: color-mix(\n in oklab,\n var(--vectis-color-border-strong),\n var(--vectis-color-text) 15%\n );\n }\n\n /* The focused field appears to have a two-pixel border: it is really its own 1px\n border plus a 1px shadow of the same colour just outside it, which costs no\n layout and therefore makes nothing jump.\n\n The selector watches the CONTROL's focus and not `:focus-within`, so that when one\n of the field's own buttons takes keyboard focus, only that button's outline\n lights up: two indicators at once would be unreadable. And it is `:focus` rather\n than `:focus-visible`, because a text field shows its focus even when it was\n reached with the mouse.\n\n The transparent outline is the safety net for Windows forced colours, which drop\n box-shadows entirely; an outline survives and keeps the field marked. */\n .v-textarea-field:has(.v-textarea-control:focus) {\n --field-border-color: var(--vectis-color-accent);\n\n box-shadow: 0 0 0 1px var(--field-border-color);\n outline: var(--vectis-focus-ring-width) solid transparent;\n }\n\n /* The invalid state, from the browser's own verdict first and from the `invalid`\n prop second. Only the colour variable is changed, which is why the border AND the\n focus ring both turn red without either being restated. */\n .v-textarea-field:has(.v-textarea-control:user-invalid),\n .v-textarea-field:has(.v-textarea-control[aria-invalid='true']) {\n --field-border-color: var(--vectis-color-danger);\n }\n\n /* A disabled field greys out through the colour tokens, the same ones VCheckbox and\n VRadio use, and never through opacity. It comes LAST in the sequence of states,\n which at equal specificity is what makes it win over all of them, the error\n included: a disabled field is not submitted, so it has nothing to report.\n\n The text here is `text-muted` and not the `text-subtle` used by the label and the\n hint below, because those sit on the page surface where this sits on\n `surface-muted` — against which subtle falls to a 4.4:1 contrast. The control\n itself is exempt from that rule, being natively disabled, but the icons the field\n CONTAINS are not, and they inherit this colour. */\n .v-textarea[data-disabled] .v-textarea-field {\n --field-border-color: var(--vectis-color-border);\n\n background: var(--vectis-color-surface-muted);\n color: var(--vectis-color-text-muted);\n cursor: not-allowed;\n resize: none;\n }\n\n .v-textarea[data-disabled] .v-textarea-label,\n .v-textarea[data-disabled] .v-textarea-hint,\n .v-textarea[data-disabled] .v-textarea-counter {\n color: var(--vectis-color-text-subtle);\n }\n\n .v-textarea[data-disabled] .v-textarea-action,\n .v-textarea[data-disabled] .v-textarea-field > .v-icon {\n color: inherit;\n cursor: not-allowed;\n }\n\n .v-textarea-control:disabled {\n cursor: not-allowed;\n }\n\n /* Growing with the content is pure CSS: `field-sizing` makes the textarea's height\n follow what is typed, and the field around it follows in turn. The resize handle\n goes, there being nothing left to resize by hand. A browser without support keeps\n the fixed height and its scrollbar, which is the intended fallback. */\n .v-textarea-field[data-auto-grow] {\n resize: none;\n }\n\n /* `field-sizing: content` sizes the control to what has been typed and ignores `rows`\n outright, so an auto-growing field would open one line tall whatever the prop said.\n The floor hands the STARTING height back to `rows` and leaves the growing to the\n browser. It is scoped to this branch and must not be lifted onto the control at\n large: a floor there would stop the control shrinking with the resize handle, and\n the field, which hides its overflow, would clip it instead of scrolling. */\n .v-textarea-field[data-auto-grow] .v-textarea-control {\n field-sizing: content;\n min-block-size: calc(var(--textarea-rows) * var(--textarea-line));\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-textarea-field {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
- @layer vectis.components{.v-time-input{anchor-scope:--time-input-anchor;width:100%;font-family:var(--vectis-text-family);display:block}.v-time-input-row{align-items:stretch;gap:var(--vectis-space-2);display:flex}.v-time-input-control{anchor-name:--time-input-anchor;cursor:pointer;flex:1;min-inline-size:0}.v-time-input[data-mode=input] .v-time-input-control{cursor:text}.v-time-input[data-mode=input] .v-input-control{font-variant-numeric:tabular-nums}.v-time-input-meridiem{flex:none;align-self:center}.v-time-input-row:has(.v-input-label) .v-time-input-meridiem{margin-block-start:calc(var(--vectis-text-label-size) * var(--vectis-text-label-leading) + var(--vectis-space-1))}.v-time-input-row:has(.v-input-hint) .v-time-input-meridiem{margin-block-end:calc(var(--vectis-text-caption-size) * var(--vectis-text-caption-leading) + var(--vectis-space-1))}.v-popover-panel.v-time-input-panel{width:max-content;padding:var(--vectis-space-3);color:var(--vectis-color-text);flex-direction:column;display:flex}.v-time-input-list{min-inline-size:anchor-size(width);max-block-size:var(--vectis-control-size-time-input-list-max-block);overflow:auto}.v-time-input-option{width:100%;min-height:var(--control-height);padding:var(--vectis-space-1) var(--control-padding-inline);border-radius:var(--vectis-radius-sm);color:var(--vectis-color-text);font-family:inherit;font-size:var(--control-font-size);line-height:var(--vectis-text-body-md-leading);font-variant-numeric:tabular-nums;text-align:start;cursor:pointer;background:0 0;border:none;align-items:center;display:flex}.v-time-input-option:hover{background:var(--vectis-color-surface-muted)}.v-time-input-option:focus-visible{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:calc(-1 * var(--vectis-focus-ring-width))}.v-time-input-option[aria-selected=true]{background:var(--vectis-color-accent-surface);color:var(--vectis-color-accent-text)}.v-time-input-footer{justify-content:flex-end;align-items:center;gap:var(--vectis-space-2);display:flex}}
2
+ @layer vectis.components{.v-time-input{anchor-scope:--time-input-anchor;width:100%;font-family:var(--vectis-text-family);display:block}.v-time-input-control{cursor:pointer}.v-time-input-control .v-input-field{anchor-name:--time-input-anchor}.v-time-input[data-mode=input] .v-time-input-control{cursor:text}.v-time-input[data-mode=input] .v-input-control{font-variant-numeric:tabular-nums}.v-field-action.v-time-input-meridiem{inline-size:auto;min-inline-size:var(--control-action-size);padding-inline:calc((var(--control-action-size) - var(--vectis-icon-size)) / 2);font:inherit}.v-separator[data-orientation=vertical].v-time-input-divider{block-size:var(--control-action-size);align-self:center}.v-popover-panel.v-time-input-panel{width:max-content;color:var(--vectis-color-text);padding:0}.v-time-input[data-mode=list] .v-combobox-panel{font-variant-numeric:tabular-nums}}
@@ -1,24 +1,11 @@
1
1
  import { IconSource } from '../VIcon/types.js';
2
2
  import { TimePickerFormat } from '../VTimePicker/VTimePicker.js';
3
- /**
4
- * A field for choosing a time, with an optional panel below it. The shell is the same one
5
- * VDateInput uses: the panel is opened from code, which is what lets the focus be moved
6
- * into it, and closed when the focus leaves the component or Escape is pressed.
7
- *
8
- * The field comes in three forms. It can be TYPED into, hours and minutes behind a mask,
9
- * optionally with a picker beside it. It can be read-only, the picker then being the only way
10
- * in. Or it can offer a LIST of times at a fixed interval, which suits booking a slot far
11
- * better than pointing at a clock face.
12
- *
13
- * The two panels commit differently, and deliberately so. The PICKER works on a draft that
14
- * only OK writes to the value — Cancel, Escape and the focus leaving all discard it —
15
- * because dragging a hand across a clock passes over dozens of times nobody meant. The
16
- * LIST writes immediately: choosing a row there is one deliberate gesture.
17
- *
18
- * Whatever is displayed, the value itself is always a 24-hour time.
19
- */
20
- export type TimeInputMode = 'readonly' | 'input' | 'list';
21
- type Placement = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end';
3
+ import { TimePickerAllowed } from '../VTimePicker/limits.js';
4
+ export type TimeInputMode = 'picker' | 'input' | 'list';
5
+ /** Where the panel opens relative to the field, whether it holds the clock or the list. */
6
+ export type TimeInputPlacement = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end';
7
+ /** The height of the field: 32, 40 or 48 pixels. */
8
+ export type TimeInputSize = 'sm' | 'md' | 'lg';
22
9
  interface TimeInputProps {
23
10
  /**
24
11
  * Whether times are shown on a 12- or a 24-hour clock. Left out, the reader's language
@@ -26,19 +13,17 @@ interface TimeInputProps {
26
13
  */
27
14
  format?: TimePickerFormat;
28
15
  /**
29
- * Which form the field takes: one that can be TYPED into, a read-only one where the
30
- * picker is the only way in — so the picker is forced on there — or a LIST of times at a
31
- * fixed interval, where a picker would make no sense.
16
+ * Which form the field takes: one that can be TYPED into, a `picker` one where the
17
+ * clock is the only way in — so the picker is forced on there — or a searchable LIST of
18
+ * times at a fixed interval, where a picker would make no sense.
32
19
  */
33
20
  mode?: TimeInputMode;
34
21
  /**
35
22
  * Offers the picker beside a field one can type into: an icon at the end of the field,
36
23
  * and a panel it opens.
37
24
  *
38
- * It is left undefined by default rather than set to off, which is what distinguishes
39
- * "not given" from an explicit refusal — and therefore what allows warning only the
40
- * consumer who really asked to remove the picker from a read-only field, where it is the
41
- * only way in.
25
+ * It means nothing in `picker` mode, where the clock is already the only way to choose,
26
+ * nor in `list` mode, which has a panel of its own — VDateInput reads it the same way.
42
27
  */
43
28
  showPicker?: boolean;
44
29
  /**
@@ -46,6 +31,21 @@ interface TimeInputProps {
46
31
  * arrow keys and to the rows of the list.
47
32
  */
48
33
  minuteStep?: number;
34
+ /**
35
+ * The earliest time that can be chosen, inclusive, as a canonical 24-hour `'HH:mm'`.
36
+ * The picker and the list both LEAVE OUT what it rules out, and a time typed past it
37
+ * makes the field invalid.
38
+ */
39
+ min?: string;
40
+ /** The latest time that can be chosen, inclusive, written like `min`. */
41
+ max?: string;
42
+ /**
43
+ * Which hours can be chosen: the list of them, or a rule answering for one. The hour
44
+ * handed to a rule is always the 24-hour one, whichever clock is on display.
45
+ */
46
+ allowedHours?: TimePickerAllowed;
47
+ /** Which minutes can be chosen: the list of them, or a rule answering for one. */
48
+ allowedMinutes?: TimePickerAllowed;
49
49
  /**
50
50
  * A BCP 47 locale, which decides the clock and how a time is written out. It TAKES
51
51
  * PRECEDENCE over the design system's global locale and falls back to it — which is why
@@ -60,25 +60,87 @@ interface TimeInputProps {
60
60
  /** What the field says while empty. */
61
61
  placeholder?: string;
62
62
  /** The height of the field: 32, 40 or 48 pixels. */
63
- size?: 'sm' | 'md' | 'lg';
63
+ size?: TimeInputSize;
64
64
  /** Takes 4px off the height. */
65
65
  compact?: boolean;
66
66
  /** Makes the field unusable, greyed out through the colour tokens. */
67
67
  disabled?: boolean;
68
+ /**
69
+ * Shows the time without letting it be changed: nothing can be typed, there is no
70
+ * clock and no clear cross. The field stays focusable and can be copied from, which
71
+ * is what separates it from `disabled`, and it is a different question from `mode`,
72
+ * which says how a field that CAN be changed is filled in.
73
+ */
74
+ readonly?: boolean;
68
75
  /** Marks the field as invalid — for a rule of your own. */
69
76
  invalid?: boolean;
77
+ /**
78
+ * An icon inside the field, at the start. It is decorative by default and becomes a
79
+ * real button as soon as a `@click:icon-start` listener is attached, in which case it
80
+ * needs `iconStartLabel`.
81
+ */
82
+ iconStart?: IconSource;
83
+ /** What the start icon does, in words, once it is clickable. */
84
+ iconStartLabel?: string;
85
+ /**
86
+ * What the clock button does, in words. It names the button `pickerIcon` renders,
87
+ * and falls back to the design system dictionary.
88
+ */
89
+ pickerIconLabel?: string;
90
+ /**
91
+ * Shows a spinner at the end of the field, in place of the clock icon. It says that
92
+ * something is being loaded and changes nothing else: the field can still be typed
93
+ * into and the panel still opens.
94
+ */
95
+ loading?: boolean;
96
+ /**
97
+ * What screen readers announce while the spinner turns. It falls back to the design
98
+ * system dictionary.
99
+ */
100
+ loadingLabel?: string;
70
101
  /** Offers a cross that empties the value, shown before the end icon. */
71
102
  clearable?: boolean;
103
+ /** What that cross does, in words. It falls back to the design system dictionary. */
104
+ clearLabel?: string;
72
105
  /**
73
106
  * The icon that opens the PICKER, at the end of the field. It has no effect on the list
74
107
  * form, whose chevron follows the combobox convention. The clear cross appears to its
75
108
  * left rather than in its place.
76
109
  */
77
110
  pickerIcon?: IconSource;
78
- /** Where the panel opens relative to the field. */
79
- placement?: Placement;
111
+ /** Where the panel opens relative to the field, whether it holds the clock or the list. */
112
+ placement?: TimeInputPlacement;
80
113
  }
81
114
  type __VLS_Props = TimeInputProps;
115
+ type __VLS_Slots = {
116
+ /**
117
+ * Content at the start of the field, rendered after `iconStart` rather than in its place,
118
+ * as in VInput.
119
+ */
120
+ start?(): unknown;
121
+ /**
122
+ * Controls of your own inside the field, after the AM/PM button when there is one and
123
+ * before the ones the field owns — the clear cross and the icon that opens the panel.
124
+ * Those two are this component's own affordance, which is why there is no `#end` here.
125
+ */
126
+ 'value-end'?(): unknown;
127
+ /**
128
+ * The strip at the foot of the clock, which REPLACES the Cancel and OK buttons rather
129
+ * than joining them.
130
+ *
131
+ * It receives both actions, and they are what make the slot usable: the clock writes a
132
+ * DRAFT that only `confirm` commits, so a footer of your own without it would leave the
133
+ * value unchangeable through the panel. `cancel` drops the draft and closes, and `close`
134
+ * is the same function under the name VDateInput's footer hands out.
135
+ *
136
+ * It is not rendered in `list` mode, which has no panel of this component's own.
137
+ */
138
+ footer?(props: {
139
+ confirm: () => void;
140
+ cancel: () => void;
141
+ close: () => void;
142
+ }): unknown;
143
+ };
82
144
  type __VLS_ModelProps = {
83
145
  /**
84
146
  * The time, always as a 24-hour "HH:mm" string whatever clock is displayed. A consumer
@@ -87,26 +149,54 @@ type __VLS_ModelProps = {
87
149
  modelValue?: string | null;
88
150
  };
89
151
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
90
- declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
152
+ declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
153
+ /** Moves the focus to the text field. */
154
+ focus: (options?: FocusOptions) => void | undefined;
155
+ /** Selects what the field is showing. */
156
+ select: () => void | undefined;
157
+ /** The real `<input>` behind the field, for what neither of the two above covers. */
158
+ el: import('vue').ComputedRef<HTMLInputElement | null>;
159
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
160
+ clear: () => any;
91
161
  "update:modelValue": (value: string | null) => any;
162
+ "click:icon-start": (event: MouseEvent) => any;
92
163
  }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
164
+ onClear?: (() => any) | undefined;
93
165
  "onUpdate:modelValue"?: ((value: string | null) => any) | undefined;
166
+ "onClick:icon-start"?: ((event: MouseEvent) => any) | undefined;
94
167
  }>, {
168
+ loading: boolean;
95
169
  label: string;
96
- minuteStep: number;
97
170
  placeholder: string;
98
- size: "sm" | "md" | "lg";
99
- placement: Placement;
171
+ size: TimeInputSize;
172
+ placement: TimeInputPlacement;
100
173
  mode: TimeInputMode;
101
174
  compact: boolean;
102
175
  disabled: boolean;
176
+ iconStart: IconSource;
103
177
  invalid: boolean;
104
178
  hint: string;
179
+ readonly: boolean;
180
+ iconStartLabel: string;
181
+ loadingLabel: string;
105
182
  clearable: boolean;
183
+ clearLabel: string;
184
+ max: string;
106
185
  format: TimePickerFormat;
186
+ min: string;
107
187
  locale: string;
108
188
  showPicker: boolean;
189
+ pickerIconLabel: string;
109
190
  pickerIcon: IconSource;
191
+ minuteStep: number;
192
+ allowedHours: TimePickerAllowed;
193
+ allowedMinutes: TimePickerAllowed;
110
194
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
195
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
111
196
  declare const _default: typeof __VLS_export;
112
197
  export default _default;
198
+ type __VLS_WithSlots<T, S> = T & {
199
+ new (): {
200
+ $slots: S;
201
+ };
202
+ };