@auronui/vue 1.0.21 → 1.0.22

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 (352) hide show
  1. package/dist/cjs/index.cjs +3680 -406
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/components/accordion/Accordion.js.map +1 -1
  4. package/dist/components/accordion/Accordion.vue_vue_type_script_setup_true_lang.js +15 -0
  5. package/dist/components/accordion/Accordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/accordion/AccordionContent.js.map +1 -1
  7. package/dist/components/accordion/AccordionContent.vue_vue_type_script_setup_true_lang.js +10 -2
  8. package/dist/components/accordion/AccordionContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/accordion/AccordionHeader.js.map +1 -1
  10. package/dist/components/accordion/AccordionHeader.vue_vue_type_script_setup_true_lang.js +13 -3
  11. package/dist/components/accordion/AccordionHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/accordion/AccordionItem.js.map +1 -1
  13. package/dist/components/accordion/AccordionItem.vue_vue_type_script_setup_true_lang.js +9 -0
  14. package/dist/components/accordion/AccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/accordion/AccordionTrigger.js.map +1 -1
  16. package/dist/components/accordion/AccordionTrigger.vue_vue_type_script_setup_true_lang.js +13 -3
  17. package/dist/components/accordion/AccordionTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  18. package/dist/components/alert-dialog/AlertDialogAction.js.map +1 -1
  19. package/dist/components/alert-dialog/AlertDialogAction.vue_vue_type_script_setup_true_lang.js +8 -2
  20. package/dist/components/alert-dialog/AlertDialogAction.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/alert-dialog/AlertDialogCancel.js.map +1 -1
  22. package/dist/components/alert-dialog/AlertDialogCancel.vue_vue_type_script_setup_true_lang.js +8 -2
  23. package/dist/components/alert-dialog/AlertDialogCancel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/components/alert-dialog/AlertDialogContent.js.map +1 -1
  25. package/dist/components/alert-dialog/AlertDialogContent.vue_vue_type_script_setup_true_lang.js +42 -6
  26. package/dist/components/alert-dialog/AlertDialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  27. package/dist/components/alert-dialog/AlertDialogDescription.js.map +1 -1
  28. package/dist/components/alert-dialog/AlertDialogDescription.vue_vue_type_script_setup_true_lang.js +11 -2
  29. package/dist/components/alert-dialog/AlertDialogDescription.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/alert-dialog/AlertDialogOverlay.js.map +1 -1
  31. package/dist/components/alert-dialog/AlertDialogOverlay.vue_vue_type_script_setup_true_lang.js +23 -2
  32. package/dist/components/alert-dialog/AlertDialogOverlay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/alert-dialog/AlertDialogTitle.js.map +1 -1
  34. package/dist/components/alert-dialog/AlertDialogTitle.vue_vue_type_script_setup_true_lang.js +10 -1
  35. package/dist/components/alert-dialog/AlertDialogTitle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/alert-dialog/AlertDialogTrigger.js.map +1 -1
  37. package/dist/components/alert-dialog/AlertDialogTrigger.vue_vue_type_script_setup_true_lang.js +12 -6
  38. package/dist/components/alert-dialog/AlertDialogTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -1
  40. package/dist/components/aspect-ratio/AspectRatio.vue_vue_type_script_setup_true_lang.js +10 -1
  41. package/dist/components/aspect-ratio/AspectRatio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/autocomplete/Autocomplete.js.map +1 -1
  43. package/dist/components/autocomplete/Autocomplete.vue_vue_type_script_setup_true_lang.js +29 -4
  44. package/dist/components/autocomplete/Autocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/autocomplete/AutocompleteContent.js.map +1 -1
  46. package/dist/components/autocomplete/AutocompleteContent.vue_vue_type_script_setup_true_lang.js +151 -9
  47. package/dist/components/autocomplete/AutocompleteContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/autocomplete/AutocompleteCreateItem.js.map +1 -1
  49. package/dist/components/autocomplete/AutocompleteCreateItem.vue_vue_type_script_setup_true_lang.js +24 -4
  50. package/dist/components/autocomplete/AutocompleteCreateItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/autocomplete/AutocompleteInput.js.map +1 -1
  52. package/dist/components/autocomplete/AutocompleteInput.vue_vue_type_script_setup_true_lang.js +75 -9
  53. package/dist/components/autocomplete/AutocompleteInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/autocomplete/AutocompleteItem.js.map +1 -1
  55. package/dist/components/autocomplete/AutocompleteItem.vue_vue_type_script_setup_true_lang.js +29 -5
  56. package/dist/components/autocomplete/AutocompleteItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/components/avatar/Avatar.js.map +1 -1
  58. package/dist/components/avatar/Avatar.vue_vue_type_script_setup_true_lang.js +39 -5
  59. package/dist/components/avatar/Avatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  60. package/dist/components/button/ToggleButton.js.map +1 -1
  61. package/dist/components/button/ToggleButton.vue_vue_type_script_setup_true_lang.js +16 -2
  62. package/dist/components/button/ToggleButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/calendar/Calendar.js.map +1 -1
  64. package/dist/components/calendar/Calendar.vue_vue_type_script_setup_true_lang.js +44 -0
  65. package/dist/components/calendar/Calendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/calendar-year-picker/CalendarYearPicker.js.map +1 -1
  67. package/dist/components/calendar-year-picker/CalendarYearPicker.vue_vue_type_script_setup_true_lang.js +21 -0
  68. package/dist/components/calendar-year-picker/CalendarYearPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/checkbox/Checkbox.js.map +1 -1
  70. package/dist/components/checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js +60 -3
  71. package/dist/components/checkbox/Checkbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/collapsible/Collapsible.js.map +1 -1
  73. package/dist/components/collapsible/Collapsible.vue_vue_type_script_setup_true_lang.js +9 -0
  74. package/dist/components/collapsible/Collapsible.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/collapsible/CollapsibleContent.js.map +1 -1
  76. package/dist/components/collapsible/CollapsibleContent.vue_vue_type_script_setup_true_lang.js +15 -4
  77. package/dist/components/collapsible/CollapsibleContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/collapsible/CollapsibleTrigger.js.map +1 -1
  79. package/dist/components/collapsible/CollapsibleTrigger.vue_vue_type_script_setup_true_lang.js +13 -3
  80. package/dist/components/collapsible/CollapsibleTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/components/color-area/ColorArea.js.map +1 -1
  82. package/dist/components/color-area/ColorArea.vue_vue_type_script_setup_true_lang.js +34 -3
  83. package/dist/components/color-area/ColorArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/color-field/ColorField.js.map +1 -1
  85. package/dist/components/color-field/ColorField.vue_vue_type_script_setup_true_lang.js +39 -2
  86. package/dist/components/color-field/ColorField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  87. package/dist/components/color-input-group/ColorInputGroup.js.map +1 -1
  88. package/dist/components/color-input-group/ColorInputGroup.vue_vue_type_script_setup_true_lang.js +39 -2
  89. package/dist/components/color-input-group/ColorInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/color-slider/ColorSlider.js.map +1 -1
  91. package/dist/components/color-slider/ColorSlider.vue_vue_type_script_setup_true_lang.js +40 -3
  92. package/dist/components/color-slider/ColorSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/color-swatch/ColorSwatch.js.map +1 -1
  94. package/dist/components/color-swatch/ColorSwatch.vue_vue_type_script_setup_true_lang.js +9 -2
  95. package/dist/components/color-swatch/ColorSwatch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  96. package/dist/components/color-swatch-picker/ColorSwatchPicker.js.map +1 -1
  97. package/dist/components/color-swatch-picker/ColorSwatchPicker.vue_vue_type_script_setup_true_lang.js +60 -4
  98. package/dist/components/color-swatch-picker/ColorSwatchPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  99. package/dist/components/combo-box/ComboBox.js.map +1 -1
  100. package/dist/components/combo-box/ComboBox.vue_vue_type_script_setup_true_lang.js +74 -3
  101. package/dist/components/combo-box/ComboBox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/combo-box/ComboBoxContent.js.map +1 -1
  103. package/dist/components/combo-box/ComboBoxContent.vue_vue_type_script_setup_true_lang.js +168 -10
  104. package/dist/components/combo-box/ComboBoxContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/combo-box/ComboBoxEmpty.js.map +1 -1
  106. package/dist/components/combo-box/ComboBoxEmpty.vue_vue_type_script_setup_true_lang.js +11 -1
  107. package/dist/components/combo-box/ComboBoxEmpty.vue_vue_type_script_setup_true_lang.js.map +1 -1
  108. package/dist/components/combo-box/ComboBoxInput.js.map +1 -1
  109. package/dist/components/combo-box/ComboBoxInput.vue_vue_type_script_setup_true_lang.js +78 -11
  110. package/dist/components/combo-box/ComboBoxInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  111. package/dist/components/combo-box/ComboBoxItem.js.map +1 -1
  112. package/dist/components/combo-box/ComboBoxItem.vue_vue_type_script_setup_true_lang.js +31 -7
  113. package/dist/components/combo-box/ComboBoxItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  114. package/dist/components/date-input/DateInput.js.map +1 -1
  115. package/dist/components/date-input/DateInput.vue_vue_type_script_setup_true_lang.js +30 -3
  116. package/dist/components/date-input/DateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/components/date-picker/DatePicker.js.map +1 -1
  118. package/dist/components/date-picker/DatePicker.vue_vue_type_script_setup_true_lang.js +140 -10
  119. package/dist/components/date-picker/DatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  120. package/dist/components/date-range-field/DateRangeField.js.map +1 -1
  121. package/dist/components/date-range-field/DateRangeField.vue_vue_type_script_setup_true_lang.js +24 -3
  122. package/dist/components/date-range-field/DateRangeField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  123. package/dist/components/date-range-picker/DateRangePicker.js.map +1 -1
  124. package/dist/components/date-range-picker/DateRangePicker.vue_vue_type_script_setup_true_lang.js +146 -9
  125. package/dist/components/date-range-picker/DateRangePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  126. package/dist/components/date-time-picker/DateTimePicker.js.map +1 -1
  127. package/dist/components/date-time-picker/DateTimePicker.vue_vue_type_script_setup_true_lang.js +143 -11
  128. package/dist/components/date-time-picker/DateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  129. package/dist/components/drawer/DrawerClose.js.map +1 -1
  130. package/dist/components/drawer/DrawerClose.vue_vue_type_script_setup_true_lang.js +13 -3
  131. package/dist/components/drawer/DrawerClose.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/components/drawer/DrawerContent.js.map +1 -1
  133. package/dist/components/drawer/DrawerContent.vue_vue_type_script_setup_true_lang.js +68 -8
  134. package/dist/components/drawer/DrawerContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  135. package/dist/components/drawer/DrawerOverlay.js.map +1 -1
  136. package/dist/components/drawer/DrawerOverlay.vue_vue_type_script_setup_true_lang.js +25 -1
  137. package/dist/components/drawer/DrawerOverlay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  138. package/dist/components/drawer/DrawerTitle.js.map +1 -1
  139. package/dist/components/drawer/DrawerTitle.vue_vue_type_script_setup_true_lang.js +27 -3
  140. package/dist/components/drawer/DrawerTitle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  141. package/dist/components/drawer/DrawerTrigger.js.map +1 -1
  142. package/dist/components/drawer/DrawerTrigger.vue_vue_type_script_setup_true_lang.js +11 -7
  143. package/dist/components/drawer/DrawerTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/components/dropdown/Dropdown.js.map +1 -1
  145. package/dist/components/dropdown/Dropdown.vue_vue_type_script_setup_true_lang.js +15 -5
  146. package/dist/components/dropdown/Dropdown.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/dropdown/DropdownCheckboxItem.js.map +1 -1
  148. package/dist/components/dropdown/DropdownCheckboxItem.vue_vue_type_script_setup_true_lang.js +29 -7
  149. package/dist/components/dropdown/DropdownCheckboxItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/dropdown/DropdownItem.js.map +1 -1
  151. package/dist/components/dropdown/DropdownItem.vue_vue_type_script_setup_true_lang.js +15 -2
  152. package/dist/components/dropdown/DropdownItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/dropdown/DropdownMenu.js.map +1 -1
  154. package/dist/components/dropdown/DropdownMenu.vue_vue_type_script_setup_true_lang.js +121 -5
  155. package/dist/components/dropdown/DropdownMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/components/dropdown/DropdownRadioGroup.js.map +1 -1
  157. package/dist/components/dropdown/DropdownRadioGroup.vue_vue_type_script_setup_true_lang.js +17 -4
  158. package/dist/components/dropdown/DropdownRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/components/dropdown/DropdownRadioItem.js.map +1 -1
  160. package/dist/components/dropdown/DropdownRadioItem.vue_vue_type_script_setup_true_lang.js +21 -5
  161. package/dist/components/dropdown/DropdownRadioItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  162. package/dist/components/dropdown/DropdownSection.js.map +1 -1
  163. package/dist/components/dropdown/DropdownSection.vue_vue_type_script_setup_true_lang.js +16 -3
  164. package/dist/components/dropdown/DropdownSection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/components/dropdown/DropdownSubContent.js.map +1 -1
  166. package/dist/components/dropdown/DropdownSubContent.vue_vue_type_script_setup_true_lang.js +125 -5
  167. package/dist/components/dropdown/DropdownSubContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/components/dropdown/DropdownSubTrigger.js.map +1 -1
  169. package/dist/components/dropdown/DropdownSubTrigger.vue_vue_type_script_setup_true_lang.js +15 -2
  170. package/dist/components/dropdown/DropdownSubTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/dropdown/DropdownTrigger.js.map +1 -1
  172. package/dist/components/dropdown/DropdownTrigger.vue_vue_type_script_setup_true_lang.js +22 -2
  173. package/dist/components/dropdown/DropdownTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/components/input-otp/InputOTP.js.map +1 -1
  175. package/dist/components/input-otp/InputOTP.vue_vue_type_script_setup_true_lang.js +34 -1
  176. package/dist/components/input-otp/InputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/list-box/ListBox.js.map +1 -1
  178. package/dist/components/list-box/ListBox.vue_vue_type_script_setup_true_lang.js +67 -8
  179. package/dist/components/list-box/ListBox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  180. package/dist/components/list-box/ListBoxItem.js.map +1 -1
  181. package/dist/components/list-box/ListBoxItem.vue_vue_type_script_setup_true_lang.js +36 -7
  182. package/dist/components/list-box/ListBoxItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  183. package/dist/components/list-box/ListBoxSection.js.map +1 -1
  184. package/dist/components/list-box/ListBoxSection.vue_vue_type_script_setup_true_lang.js +31 -4
  185. package/dist/components/list-box/ListBoxSection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  186. package/dist/components/modal/ModalClose.js.map +1 -1
  187. package/dist/components/modal/ModalClose.vue_vue_type_script_setup_true_lang.js +7 -1
  188. package/dist/components/modal/ModalClose.vue_vue_type_script_setup_true_lang.js.map +1 -1
  189. package/dist/components/modal/ModalContent.js.map +1 -1
  190. package/dist/components/modal/ModalContent.vue_vue_type_script_setup_true_lang.js +49 -5
  191. package/dist/components/modal/ModalContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/modal/ModalDescription.js.map +1 -1
  193. package/dist/components/modal/ModalDescription.vue_vue_type_script_setup_true_lang.js +10 -1
  194. package/dist/components/modal/ModalDescription.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/modal/ModalOverlay.js.map +1 -1
  196. package/dist/components/modal/ModalOverlay.vue_vue_type_script_setup_true_lang.js +23 -2
  197. package/dist/components/modal/ModalOverlay.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/modal/ModalTitle.js.map +1 -1
  199. package/dist/components/modal/ModalTitle.vue_vue_type_script_setup_true_lang.js +10 -1
  200. package/dist/components/modal/ModalTitle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/modal/ModalTrigger.js.map +1 -1
  202. package/dist/components/modal/ModalTrigger.vue_vue_type_script_setup_true_lang.js +12 -6
  203. package/dist/components/modal/ModalTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  204. package/dist/components/number-field/NumberField.js.map +1 -1
  205. package/dist/components/number-field/NumberField.vue_vue_type_script_setup_true_lang.js +24 -4
  206. package/dist/components/number-field/NumberField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  207. package/dist/components/pagination/Pagination.js.map +1 -1
  208. package/dist/components/pagination/Pagination.vue_vue_type_script_setup_true_lang.js +7 -1
  209. package/dist/components/pagination/Pagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  210. package/dist/components/pagination/PaginationContent.js.map +1 -1
  211. package/dist/components/pagination/PaginationContent.vue_vue_type_script_setup_true_lang.js +12 -2
  212. package/dist/components/pagination/PaginationContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  213. package/dist/components/pagination/PaginationEllipsis.js.map +1 -1
  214. package/dist/components/pagination/PaginationEllipsis.vue_vue_type_script_setup_true_lang.js +12 -2
  215. package/dist/components/pagination/PaginationEllipsis.vue_vue_type_script_setup_true_lang.js.map +1 -1
  216. package/dist/components/pagination/PaginationFirst.js.map +1 -1
  217. package/dist/components/pagination/PaginationFirst.vue_vue_type_script_setup_true_lang.js +9 -1
  218. package/dist/components/pagination/PaginationFirst.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/components/pagination/PaginationItem.js.map +1 -1
  220. package/dist/components/pagination/PaginationItem.vue_vue_type_script_setup_true_lang.js +11 -2
  221. package/dist/components/pagination/PaginationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  222. package/dist/components/pagination/PaginationLast.js.map +1 -1
  223. package/dist/components/pagination/PaginationLast.vue_vue_type_script_setup_true_lang.js +9 -1
  224. package/dist/components/pagination/PaginationLast.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/components/pagination/PaginationNext.js.map +1 -1
  226. package/dist/components/pagination/PaginationNext.vue_vue_type_script_setup_true_lang.js +9 -1
  227. package/dist/components/pagination/PaginationNext.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/components/pagination/PaginationPrev.js.map +1 -1
  229. package/dist/components/pagination/PaginationPrev.vue_vue_type_script_setup_true_lang.js +9 -1
  230. package/dist/components/pagination/PaginationPrev.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/components/popover/PopoverContent.js.map +1 -1
  232. package/dist/components/popover/PopoverContent.vue_vue_type_script_setup_true_lang.js +6 -2
  233. package/dist/components/popover/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/progress-bar/ProgressBar.js.map +1 -1
  235. package/dist/components/progress-bar/ProgressBar.vue_vue_type_script_setup_true_lang.js +37 -5
  236. package/dist/components/progress-bar/ProgressBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  237. package/dist/components/progress-circle/ProgressCircle.js.map +1 -1
  238. package/dist/components/progress-circle/ProgressCircle.vue_vue_type_script_setup_true_lang.js +21 -0
  239. package/dist/components/progress-circle/ProgressCircle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  240. package/dist/components/radio/Radio.js.map +1 -1
  241. package/dist/components/radio/Radio.vue_vue_type_script_setup_true_lang.js +46 -3
  242. package/dist/components/radio/Radio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  243. package/dist/components/radio/RadioGroup.js.map +1 -1
  244. package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js +24 -0
  245. package/dist/components/radio/RadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  246. package/dist/components/range-calendar/RangeCalendar.js.map +1 -1
  247. package/dist/components/range-calendar/RangeCalendar.vue_vue_type_script_setup_true_lang.js +44 -11
  248. package/dist/components/range-calendar/RangeCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  249. package/dist/components/scroll-area/ScrollArea.js.map +1 -1
  250. package/dist/components/scroll-area/ScrollArea.vue_vue_type_script_setup_true_lang.js +61 -8
  251. package/dist/components/scroll-area/ScrollArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/components/select/Select.js.map +1 -1
  253. package/dist/components/select/Select.vue_vue_type_script_setup_true_lang.js +12 -0
  254. package/dist/components/select/Select.vue_vue_type_script_setup_true_lang.js.map +1 -1
  255. package/dist/components/select/SelectContent.js.map +1 -1
  256. package/dist/components/select/SelectContent.vue_vue_type_script_setup_true_lang.js +140 -8
  257. package/dist/components/select/SelectContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  258. package/dist/components/select/SelectItem.js.map +1 -1
  259. package/dist/components/select/SelectItem.vue_vue_type_script_setup_true_lang.js +22 -6
  260. package/dist/components/select/SelectItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  261. package/dist/components/select/SelectTrigger.js.map +1 -1
  262. package/dist/components/select/SelectTrigger.vue_vue_type_script_setup_true_lang.js +23 -2
  263. package/dist/components/select/SelectTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  264. package/dist/components/select/SelectValue.js.map +1 -1
  265. package/dist/components/select/SelectValue.vue_vue_type_script_setup_true_lang.js +14 -2
  266. package/dist/components/select/SelectValue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  267. package/dist/components/slider/Slider.js.map +1 -1
  268. package/dist/components/slider/Slider.vue_vue_type_script_setup_true_lang.js +69 -6
  269. package/dist/components/slider/Slider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  270. package/dist/components/splitter/SplitterGroup.js.map +1 -1
  271. package/dist/components/splitter/SplitterGroup.vue_vue_type_script_setup_true_lang.js +18 -3
  272. package/dist/components/splitter/SplitterGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  273. package/dist/components/splitter/SplitterPanel.js.map +1 -1
  274. package/dist/components/splitter/SplitterPanel.vue_vue_type_script_setup_true_lang.js +20 -5
  275. package/dist/components/splitter/SplitterPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  276. package/dist/components/splitter/SplitterResizeHandle.js.map +1 -1
  277. package/dist/components/splitter/SplitterResizeHandle.vue_vue_type_script_setup_true_lang.js +16 -1
  278. package/dist/components/splitter/SplitterResizeHandle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  279. package/dist/components/switch/Switch.js.map +1 -1
  280. package/dist/components/switch/Switch.vue_vue_type_script_setup_true_lang.js +53 -2
  281. package/dist/components/switch/Switch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  282. package/dist/components/tabs/Tab.js.map +1 -1
  283. package/dist/components/tabs/Tab.vue_vue_type_script_setup_true_lang.js +7 -1
  284. package/dist/components/tabs/Tab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  285. package/dist/components/tabs/TabIndicator.js.map +1 -1
  286. package/dist/components/tabs/TabIndicator.vue_vue_type_script_setup_true_lang.js +12 -2
  287. package/dist/components/tabs/TabIndicator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  288. package/dist/components/tabs/TabList.js.map +1 -1
  289. package/dist/components/tabs/TabList.vue_vue_type_script_setup_true_lang.js +27 -4
  290. package/dist/components/tabs/TabList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  291. package/dist/components/tabs/TabPanel.js.map +1 -1
  292. package/dist/components/tabs/TabPanel.vue_vue_type_script_setup_true_lang.js +7 -1
  293. package/dist/components/tabs/TabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  294. package/dist/components/tabs/Tabs.js.map +1 -1
  295. package/dist/components/tabs/Tabs.vue_vue_type_script_setup_true_lang.js +13 -1
  296. package/dist/components/tabs/Tabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  297. package/dist/components/time-field/TimeField.js.map +1 -1
  298. package/dist/components/time-field/TimeField.vue_vue_type_script_setup_true_lang.js +22 -1
  299. package/dist/components/time-field/TimeField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  300. package/dist/components/toast/Toast.js.map +1 -1
  301. package/dist/components/toast/Toast.vue_vue_type_script_setup_true_lang.js +39 -4
  302. package/dist/components/toast/Toast.vue_vue_type_script_setup_true_lang.js.map +1 -1
  303. package/dist/components/toast/ToastAction.js.map +1 -1
  304. package/dist/components/toast/ToastAction.vue_vue_type_script_setup_true_lang.js +3 -1
  305. package/dist/components/toast/ToastAction.vue_vue_type_script_setup_true_lang.js.map +1 -1
  306. package/dist/components/toast/ToastClose.js.map +1 -1
  307. package/dist/components/toast/ToastClose.vue_vue_type_script_setup_true_lang.js +3 -1
  308. package/dist/components/toast/ToastClose.vue_vue_type_script_setup_true_lang.js.map +1 -1
  309. package/dist/components/toast/ToastDescription.js.map +1 -1
  310. package/dist/components/toast/ToastDescription.vue_vue_type_script_setup_true_lang.js +15 -3
  311. package/dist/components/toast/ToastDescription.vue_vue_type_script_setup_true_lang.js.map +1 -1
  312. package/dist/components/toast/ToastTitle.js.map +1 -1
  313. package/dist/components/toast/ToastTitle.vue_vue_type_script_setup_true_lang.js +15 -3
  314. package/dist/components/toast/ToastTitle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  315. package/dist/components/toast/ToastViewport.js.map +1 -1
  316. package/dist/components/toast/ToastViewport.vue_vue_type_script_setup_true_lang.js +22 -3
  317. package/dist/components/toast/ToastViewport.vue_vue_type_script_setup_true_lang.js.map +1 -1
  318. package/dist/components/toolbar/Toolbar.js.map +1 -1
  319. package/dist/components/toolbar/Toolbar.vue_vue_type_script_setup_true_lang.js +10 -1
  320. package/dist/components/toolbar/Toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  321. package/dist/components/toolbar/ToolbarButton.js.map +1 -1
  322. package/dist/components/toolbar/ToolbarButton.vue_vue_type_script_setup_true_lang.js +11 -2
  323. package/dist/components/toolbar/ToolbarButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/components/toolbar/ToolbarLink.js.map +1 -1
  325. package/dist/components/toolbar/ToolbarLink.vue_vue_type_script_setup_true_lang.js +11 -2
  326. package/dist/components/toolbar/ToolbarLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  327. package/dist/components/toolbar/ToolbarSeparator.js.map +1 -1
  328. package/dist/components/toolbar/ToolbarSeparator.vue_vue_type_script_setup_true_lang.js +14 -2
  329. package/dist/components/toolbar/ToolbarSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  330. package/dist/components/toolbar/ToolbarToggleGroup.js.map +1 -1
  331. package/dist/components/toolbar/ToolbarToggleGroup.vue_vue_type_script_setup_true_lang.js +22 -1
  332. package/dist/components/toolbar/ToolbarToggleGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  333. package/dist/components/toolbar/ToolbarToggleItem.js.map +1 -1
  334. package/dist/components/toolbar/ToolbarToggleItem.vue_vue_type_script_setup_true_lang.js +7 -1
  335. package/dist/components/toolbar/ToolbarToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  336. package/dist/components/tooltip/Tooltip.js.map +1 -1
  337. package/dist/components/tooltip/Tooltip.vue_vue_type_script_lang.js +20 -0
  338. package/dist/components/tooltip/Tooltip.vue_vue_type_script_lang.js.map +1 -1
  339. package/dist/components/tooltip/TooltipContent.js.map +1 -1
  340. package/dist/components/tooltip/TooltipContent.vue_vue_type_script_setup_true_lang.js +7 -2
  341. package/dist/components/tooltip/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  342. package/dist/components/tooltip/TooltipProvider.js.map +1 -1
  343. package/dist/components/tooltip/TooltipProvider.vue_vue_type_script_setup_true_lang.js +24 -3
  344. package/dist/components/tooltip/TooltipProvider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  345. package/dist/components/tree/Tree.js.map +1 -1
  346. package/dist/components/tree/Tree.vue_vue_type_script_setup_true_lang.js +16 -1
  347. package/dist/components/tree/Tree.vue_vue_type_script_setup_true_lang.js.map +1 -1
  348. package/dist/components/tree/TreeItem.js.map +1 -1
  349. package/dist/components/tree/TreeItem.vue_vue_type_script_setup_true_lang.js +7 -1
  350. package/dist/components/tree/TreeItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  351. package/dist/index.d.ts +2276 -364
  352. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/switch/Switch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useAttrs } from 'vue'\nimport { SwitchRoot, SwitchThumb } from 'reka-ui'\nimport { switchVariants, type SwitchVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useSwitchGroupInject } from './switch-group.context'\n\n// Disable Vue attribute fallthrough — we manually forward $attrs to SwitchRoot\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<{\n size?: SwitchVariants['size']\n value?: string\n modelValue?: boolean\n defaultValue?: boolean\n disabled?: boolean\n name?: string\n class?: ClassValue\n /** Per-slot class overrides. Each key is a slot name (e.g. 'base', 'control', 'thumb', 'content'). */\n classNames?: Partial<{\n base: ClassValue\n control: ClassValue\n thumb: ClassValue\n content: ClassValue\n }>\n}>(), {\n size: undefined,\n value: undefined,\n modelValue: undefined,\n defaultValue: false,\n disabled: false,\n name: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst attrs = useAttrs()\n\n// Inject SwitchGroup context with fallback defaults (standalone mode)\nconst groupCtx = useSwitchGroupInject({\n size: ref('md'),\n disabled: ref(false),\n selectedValues: ref([]),\n toggleValue: () => {},\n name: ref(undefined),\n})\n\n// Prop precedence: group disabled wins (D-02)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\n\n// Child size wins over group size\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\n\n// Determine if inside a group (value prop is the signal)\nconst isInGroup = computed(() => props.value !== undefined)\n\n// Compute checked state\nconst checked = computed<boolean>(() => {\n if (isInGroup.value) {\n return groupCtx.selectedValues.value.includes(props.value!)\n }\n return props.modelValue ?? false\n})\n\n// Handle Reka UI's update:checked event\nfunction handleUpdate(val: boolean) {\n if (isInGroup.value) {\n groupCtx.toggleValue(props.value!)\n } else {\n emit('update:modelValue', val)\n }\n}\n\nconst slotFns = computed(() =>\n switchVariants({ size: finalSize.value })\n)\n</script>\n\n<template>\n <!--\n v-bind=\"attrs\" forwards aria-label and other HTML attributes through to Reka UI's\n SwitchRoot, which then applies them to the inner <button> element.\n inheritAttrs: false prevents double-application on SwitchRoot's root.\n -->\n <SwitchRoot\n v-bind=\"attrs\"\n :model-value=\"checked\"\n :disabled=\"isDisabled\"\n :name=\"props.name ?? groupCtx.name.value\"\n :value=\"props.value\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"handleUpdate\"\n >\n <span :class=\"composeClassName(slotFns.control(), props.classNames?.control)\">\n <SwitchThumb :class=\"composeClassName(slotFns.thumb(), props.classNames?.thumb)\" />\n </span>\n <span\n v-if=\"$slots.default\"\n :class=\"composeClassName(slotFns.content(), props.classNames?.content)\"\n >\n <slot />\n </span>\n </SwitchRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAwBd,MAAM,OAAO;EAIb,MAAM,QAAQ,UAAS;EAGvB,MAAM,WAAW,qBAAqB;GACpC,MAAM,IAAI,KAAK;GACf,UAAU,IAAI,MAAM;GACpB,gBAAgB,IAAI,EAAE,CAAC;GACvB,mBAAmB;GACnB,MAAM,IAAI,KAAA,EAAU;GACrB,CAAA;EAGD,MAAM,aAAa,eAAe,SAAS,SAAS,SAAS,MAAM,SAAQ;EAG3E,MAAM,YAAY,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAK;EAGlE,MAAM,YAAY,eAAe,MAAM,UAAU,KAAA,EAAS;EAG1D,MAAM,UAAU,eAAwB;AACtC,OAAI,UAAU,MACZ,QAAO,SAAS,eAAe,MAAM,SAAS,MAAM,MAAM;AAE5D,UAAO,MAAM,cAAc;IAC5B;EAGD,SAAS,aAAa,KAAc;AAClC,OAAI,UAAU,MACZ,UAAS,YAAY,MAAM,MAAM;OAEjC,MAAK,qBAAqB,IAAG;;EAIjC,MAAM,UAAU,eACd,eAAe,EAAE,MAAM,UAAU,OAAO,CAAA,CAC1C;;uBASE,YAkBa,MAAA,WAAA,EAlBb,WACU,MAiBG,MAjBE,EAAA;IACZ,eAAa,QAAA;IACb,UAAU,WAAA;IACV,MAAM,MAAM,QAAQ,MAAA,SAAQ,CAAC,KAAK;IAClC,OAAO,MAAM;IACb,OAAO,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI;IAC3E,uBAAoB;;2BAId,CAFP,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,SAAO,EAAI,MAAM,YAAY,QAAO,CAAA,EAAA,EAAA,CACzE,YAAmF,MAAA,YAAA,EAAA,EAArE,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,OAAK,EAAI,MAAM,YAAY,MAAK,CAAA,EAAA,EAAA,MAAA,GAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EAAA,EAGxEA,KAAAA,OAAO,WAAA,WAAA,EADf,mBAKO,QAAA;;KAHJ,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,SAAO,EAAI,MAAM,YAAY,QAAO,CAAA;QAErE,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Switch.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/switch/Switch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useAttrs } from 'vue'\nimport { SwitchRoot, SwitchThumb } from 'reka-ui'\nimport { switchVariants, type SwitchVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useSwitchGroupInject } from './switch-group.context'\n\n// Disable Vue attribute fallthrough — we manually forward $attrs to SwitchRoot\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<{\n size?: SwitchVariants['size']\n value?: string\n modelValue?: boolean\n defaultValue?: boolean\n disabled?: boolean\n name?: string\n /** HTML id attribute forwarded to SwitchRoot. */\n id?: string\n /** The value for the checked state. */\n trueValue?: boolean | string | number\n /** The value for the unchecked state. */\n falseValue?: boolean | string | number\n /** Whether SwitchRoot renders as a child element. */\n asChild?: boolean\n /** Element or component to render SwitchRoot as. */\n as?: string\n /** Whether the switch is required. */\n required?: boolean\n /** Whether SwitchThumb renders as a child element. */\n thumbAsChild?: boolean\n /** Element or component to render SwitchThumb as. */\n thumbAs?: string\n class?: ClassValue\n /** Per-slot class overrides. Each key is a slot name (e.g. 'base', 'control', 'thumb', 'content'). */\n classNames?: Partial<{\n base: ClassValue\n control: ClassValue\n thumb: ClassValue\n content: ClassValue\n }>\n}>(), {\n size: undefined,\n value: undefined,\n modelValue: undefined,\n defaultValue: false,\n disabled: false,\n name: undefined,\n id: undefined,\n trueValue: undefined,\n falseValue: undefined,\n asChild: false,\n as: undefined,\n required: false,\n thumbAsChild: false,\n thumbAs: undefined,\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst attrs = useAttrs()\n\n// Inject SwitchGroup context with fallback defaults (standalone mode)\nconst groupCtx = useSwitchGroupInject({\n size: ref('md'),\n disabled: ref(false),\n selectedValues: ref([]),\n toggleValue: () => {},\n name: ref(undefined),\n})\n\n// Prop precedence: group disabled wins (D-02)\nconst isDisabled = computed(() => groupCtx.disabled.value || props.disabled)\n\n// Child size wins over group size\nconst finalSize = computed(() => props.size ?? groupCtx.size.value)\n\n// Determine if inside a group (value prop is the signal)\nconst isInGroup = computed(() => props.value !== undefined)\n\n// Compute checked state\nconst checked = computed<boolean>(() => {\n if (isInGroup.value) {\n return groupCtx.selectedValues.value.includes(props.value!)\n }\n return props.modelValue ?? false\n})\n\n// Handle Reka UI's update:checked event\nfunction handleUpdate(val: string | number | boolean) {\n if (isInGroup.value) {\n groupCtx.toggleValue(props.value!)\n } else {\n emit('update:modelValue', Boolean(val))\n }\n}\n\nconst slotFns = computed(() =>\n switchVariants({ size: finalSize.value })\n)\n</script>\n\n<template>\n <!--\n v-bind=\"attrs\" forwards aria-label and other HTML attributes through to Reka UI's\n SwitchRoot, which then applies them to the inner <button> element.\n inheritAttrs: false prevents double-application on SwitchRoot's root.\n -->\n <SwitchRoot\n v-bind=\"attrs\"\n :model-value=\"checked\"\n :disabled=\"isDisabled\"\n :name=\"props.name ?? groupCtx.name.value\"\n :value=\"props.value\"\n :id=\"props.id\"\n :true-value=\"props.trueValue\"\n :false-value=\"props.falseValue\"\n :as-child=\"props.asChild\"\n :as=\"props.as\"\n :required=\"props.required\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n @update:model-value=\"handleUpdate\"\n >\n <span :class=\"composeClassName(slotFns.control(), props.classNames?.control)\">\n <SwitchThumb\n :as-child=\"props.thumbAsChild\"\n :as=\"props.thumbAs\"\n :class=\"composeClassName(slotFns.thumb(), props.classNames?.thumb)\"\n />\n </span>\n <span\n v-if=\"$slots.default\"\n :class=\"composeClassName(slotFns.content(), props.classNames?.content)\"\n >\n <slot />\n </span>\n </SwitchRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAgDd,MAAM,OAAO;EAIb,MAAM,QAAQ,UAAS;EAGvB,MAAM,WAAW,qBAAqB;GACpC,MAAM,IAAI,KAAK;GACf,UAAU,IAAI,MAAM;GACpB,gBAAgB,IAAI,EAAE,CAAC;GACvB,mBAAmB;GACnB,MAAM,IAAI,KAAA,EAAU;GACrB,CAAA;EAGD,MAAM,aAAa,eAAe,SAAS,SAAS,SAAS,MAAM,SAAQ;EAG3E,MAAM,YAAY,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAK;EAGlE,MAAM,YAAY,eAAe,MAAM,UAAU,KAAA,EAAS;EAG1D,MAAM,UAAU,eAAwB;AACtC,OAAI,UAAU,MACZ,QAAO,SAAS,eAAe,MAAM,SAAS,MAAM,MAAM;AAE5D,UAAO,MAAM,cAAc;IAC5B;EAGD,SAAS,aAAa,KAAgC;AACpD,OAAI,UAAU,MACZ,UAAS,YAAY,MAAM,MAAM;OAEjC,MAAK,qBAAqB,QAAQ,IAAI,CAAA;;EAI1C,MAAM,UAAU,eACd,eAAe,EAAE,MAAM,UAAU,OAAO,CAAA,CAC1C;;uBASE,YA4Ba,MAAA,WAAA,EA5Bb,WACU,MA2BG,MA3BE,EAAA;IACZ,eAAa,QAAA;IACb,UAAU,WAAA;IACV,MAAM,MAAM,QAAQ,MAAA,SAAQ,CAAC,KAAK;IAClC,OAAO,MAAM;IACb,IAAI,MAAM;IACV,cAAY,MAAM;IAClB,eAAa,MAAM;IACnB,YAAU,MAAM;IAChB,IAAI,MAAM;IACV,UAAU,MAAM;IAChB,OAAO,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI;IAC3E,uBAAoB;;2BAQd,CANP,mBAMO,QAAA,EANA,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,SAAO,EAAI,MAAM,YAAY,QAAO,CAAA,EAAA,EAAA,CACzE,YAIE,MAAA,YAAA,EAAA;KAHC,YAAU,MAAM;KAChB,IAAI,MAAM;KACV,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,OAAK,EAAI,MAAM,YAAY,MAAK,CAAA;;;;;aAI7DA,KAAAA,OAAO,WAAA,WAAA,EADf,mBAKO,QAAA;;KAHJ,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,SAAO,EAAI,MAAM,YAAY,QAAO,CAAA;QAErE,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.js","names":[],"sources":["../../../src/components/tabs/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsTrigger } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n disabled?: boolean\n class?: ClassValue\n /** Override classes for individual slots. */\n classNames?: Partial<{\n tab: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :data-tab-value=\"props.value\"\n :class=\"composeClassName(ctx.slotFns.value.tab(), props.class, props.classNames?.tab)\"\n >\n <slot />\n </TabsTrigger>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Tab.js","names":[],"sources":["../../../src/components/tabs/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsTrigger } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n disabled?: boolean\n class?: ClassValue\n /** Override classes for individual slots. */\n classNames?: Partial<{\n tab: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :data-tab-value=\"props.value\"\n :class=\"composeClassName(ctx.slotFns.value.tab(), props.class, props.classNames?.tab)\"\n >\n <slot />\n </TabsTrigger>\n</template>\n"],"mappings":""}
@@ -15,7 +15,9 @@ var Tab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComp
15
15
  Object,
16
16
  Array
17
17
  ] },
18
- classNames: {}
18
+ classNames: {},
19
+ as: {},
20
+ asChild: { type: Boolean }
19
21
  },
20
22
  setup(__props) {
21
23
  const props = __props;
@@ -24,6 +26,8 @@ var Tab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComp
24
26
  return openBlock(), createBlock(unref(TabsTrigger), {
25
27
  value: props.value,
26
28
  disabled: props.disabled,
29
+ as: props.as,
30
+ "as-child": props.asChild,
27
31
  "data-tab-value": props.value,
28
32
  class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tab(), props.class, props.classNames?.tab))
29
33
  }, {
@@ -32,6 +36,8 @@ var Tab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComp
32
36
  }, 8, [
33
37
  "value",
34
38
  "disabled",
39
+ "as",
40
+ "as-child",
35
41
  "data-tab-value",
36
42
  "class"
37
43
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsTrigger } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n disabled?: boolean\n class?: ClassValue\n /** Override classes for individual slots. */\n classNames?: Partial<{\n tab: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :data-tab-value=\"props.value\"\n :class=\"composeClassName(ctx.slotFns.value.tab(), props.class, props.classNames?.tab)\"\n >\n <slot />\n </TabsTrigger>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EAUd,MAAM,MAAM,eAAc;;uBAIxB,YAOc,MAAA,YAAA,EAAA;IANX,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,kBAAgB,MAAM;IACtB,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,KAAG,EAAI,MAAM,OAAO,MAAM,YAAY,IAAG,CAAA;;2BAE5E,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Tab.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/Tab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsTrigger } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n disabled?: boolean\n class?: ClassValue\n /** Override classes for individual slots. */\n classNames?: Partial<{\n tab: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsTrigger\n :value=\"props.value\"\n :disabled=\"props.disabled\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :data-tab-value=\"props.value\"\n :class=\"composeClassName(ctx.slotFns.value.tab(), props.class, props.classNames?.tab)\"\n >\n <slot />\n </TabsTrigger>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EAcd,MAAM,MAAM,eAAc;;uBAIxB,YASc,MAAA,YAAA,EAAA;IARX,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,IAAI,MAAM;IACV,YAAU,MAAM;IAChB,kBAAgB,MAAM;IACtB,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,KAAG,EAAI,MAAM,OAAO,MAAM,YAAY,IAAG,CAAA;;2BAE5E,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabIndicator.js","names":[],"sources":["../../../src/components/tabs/TabIndicator.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsIndicator } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{ tabIndicator: ClassValue }>\n}>()\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsIndicator :class=\"composeClassName(ctx.slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator)\" />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TabIndicator.js","names":[],"sources":["../../../src/components/tabs/TabIndicator.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsIndicator } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{ tabIndicator: ClassValue }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsIndicator :as=\"props.as\" :as-child=\"props.asChild\" :class=\"composeClassName(ctx.slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator)\" />\n</template>\n"],"mappings":""}
@@ -13,13 +13,23 @@ var TabIndicator_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
13
13
  Object,
14
14
  Array
15
15
  ] },
16
- classNames: {}
16
+ classNames: {},
17
+ as: {},
18
+ asChild: { type: Boolean }
17
19
  },
18
20
  setup(__props) {
19
21
  const props = __props;
20
22
  const ctx = useTabsInject();
21
23
  return (_ctx, _cache) => {
22
- return openBlock(), createBlock(unref(TabsIndicator), { class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator)) }, null, 8, ["class"]);
24
+ return openBlock(), createBlock(unref(TabsIndicator), {
25
+ as: props.as,
26
+ "as-child": props.asChild,
27
+ class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator))
28
+ }, null, 8, [
29
+ "as",
30
+ "as-child",
31
+ "class"
32
+ ]);
23
33
  };
24
34
  }
25
35
  });
@@ -1 +1 @@
1
- {"version":3,"file":"TabIndicator.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabIndicator.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsIndicator } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{ tabIndicator: ClassValue }>\n}>()\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsIndicator :class=\"composeClassName(ctx.slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator)\" />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EAKd,MAAM,MAAM,eAAc;;uBAIxB,YAA0H,MAAA,cAAA,EAAA,EAA1G,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,cAAY,EAAI,MAAM,OAAO,MAAM,YAAY,aAAY,CAAA,EAAA,EAAA,MAAA,GAAA,CAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"TabIndicator.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabIndicator.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsIndicator } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{ tabIndicator: ClassValue }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsIndicator :as=\"props.as\" :as-child=\"props.asChild\" :class=\"composeClassName(ctx.slotFns.value.tabIndicator(), props.class, props.classNames?.tabIndicator)\" />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EASd,MAAM,MAAM,eAAc;;uBAIxB,YAAmK,MAAA,cAAA,EAAA;IAAnJ,IAAI,MAAM;IAAK,YAAU,MAAM;IAAU,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,cAAY,EAAI,MAAM,OAAO,MAAM,YAAY,aAAY,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabList.js","names":[],"sources":["../../../src/components/tabs/TabList.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch } from 'vue'\nimport { useTemplateRef } from 'vue'\nimport { TabsList } from 'reka-ui'\nimport { useResizeObserver, onClickOutside } from '@vueuse/core'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\nimport Button from '../button/Button.vue'\n\nconst props = defineProps<{\n loop?: boolean\n overflow?: 'arrows' | 'dropdown'\n class?: ClassValue\n /** Override classes on individual slots */\n classNames?: Partial<{\n tabList: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n\n// ── Arrows mode ─────────────────────────────────────────────────────────────\nconst scrollWrapperEl = useTemplateRef<HTMLElement>('scrollWrapperEl')\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\n\nfunction updateScrollButtons() {\n const el = scrollWrapperEl.value\n if (!el) { canScrollLeft.value = false; canScrollRight.value = false; return }\n canScrollLeft.value = el.scrollLeft > 1\n canScrollRight.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\n\nfunction scrollTabs(dir: 'left' | 'right') {\n const el = scrollWrapperEl.value\n if (!el) return\n el.scrollBy({ left: dir === 'left' ? -200 : 200, behavior: 'smooth' })\n // Poll briefly after smooth scroll starts so button states update\n setTimeout(updateScrollButtons, 150)\n setTimeout(updateScrollButtons, 350)\n}\n\nwatch(scrollWrapperEl, (el, oldEl) => {\n if (oldEl) oldEl.removeEventListener('scroll', updateScrollButtons)\n if (el) {\n el.addEventListener('scroll', updateScrollButtons, { passive: true })\n nextTick(updateScrollButtons)\n }\n}, { immediate: true })\n\nuseResizeObserver(scrollWrapperEl, () => nextTick(updateScrollButtons))\n\n// ── Dropdown mode ────────────────────────────────────────────────────────────\ninterface OverflowTab {\n value: string\n label: string\n disabled: boolean\n}\n\nconst containerEl = useTemplateRef<HTMLElement>('containerEl')\nconst dropdownEl = useTemplateRef<HTMLElement>('dropdownEl')\n\nconst hiddenTabs = ref<OverflowTab[]>([])\nconst dropdownOpen = ref(false)\nconst hasOverflow = computed(() => hiddenTabs.value.length > 0)\n\nonClickOutside(dropdownEl, () => { dropdownOpen.value = false })\n\nfunction computeOverflow() {\n if (!containerEl.value) return\n\n const allTabs = Array.from(\n containerEl.value.querySelectorAll('[data-tab-value]'),\n ) as HTMLElement[]\n\n // Reveal all tabs first\n allTabs.forEach(t => t.removeAttribute('data-overflow-hidden'))\n\n // Tabs use w-full and shrink to share the container width, so offsetWidth after\n // a normal render would be containerWidth/n — useless for overflow detection.\n // Force each tab to its natural content width for measurement only (no paint flash:\n // all DOM reads/writes happen synchronously within this JS task before the next frame).\n const listEl = containerEl.value.querySelector('[role=\"tablist\"]') as HTMLElement | null\n if (listEl) {\n listEl.style.overflow = 'visible'\n allTabs.forEach(t => { t.style.flexShrink = '0'; t.style.width = 'auto' })\n void listEl.offsetWidth // force reflow so offsetWidth reads below are accurate\n }\n\n // Measure the more button's real width by temporarily revealing its wrapper.\n // The wrapper is display:none when there's no overflow, so we can't rely on a\n // pre-measured value — measure it here while the (always-visible) container holds it.\n let moreWidth = 0\n const moreEl = dropdownEl.value\n if (moreEl) {\n const prevDisplay = moreEl.style.display\n moreEl.style.display = 'flex'\n void moreEl.offsetWidth\n moreWidth = moreEl.offsetWidth\n moreEl.style.display = prevDisplay\n }\n\n // clientWidth includes the container's horizontal padding; the flex children only\n // get the content box. Subtract padding so measurements compare against real space.\n const cs = getComputedStyle(containerEl.value)\n const padX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight)\n const gap = parseFloat(cs.columnGap) || 0\n const contentWidth = containerEl.value.clientWidth - padX\n\n const tabWidths = allTabs.map(t => t.offsetWidth)\n const totalWidth = tabWidths.reduce((sum, w) => sum + w, 0)\n\n // Restore layout before any early-return so tabs always look correct\n if (listEl) {\n listEl.style.overflow = ''\n allTabs.forEach(t => { t.style.flexShrink = ''; t.style.width = '' })\n }\n\n if (totalWidth <= contentWidth) {\n hiddenTabs.value = []\n return\n }\n\n // When the more button is shown it sits beside the clipped list, separated by `gap`.\n // Reserve its width + the gap (+1px sub-pixel safety) so the last visible tab can\n // never extend under the button.\n const available = contentWidth - moreWidth - gap - 1\n\n let accumulated = 0\n const newHidden: OverflowTab[] = []\n const visibleEls: HTMLElement[] = []\n\n for (let i = 0; i < allTabs.length; i++) {\n const tab = allTabs[i]\n const w = tabWidths[i]\n if (accumulated + w <= available) {\n accumulated += w\n visibleEls.push(tab)\n } else {\n newHidden.push({\n value: tab.getAttribute('data-tab-value') ?? '',\n label: tab.textContent?.trim() ?? '',\n disabled: tab.hasAttribute('data-disabled') || tab.getAttribute('aria-disabled') === 'true',\n })\n tab.setAttribute('data-overflow-hidden', '')\n }\n }\n\n // If the active tab ended up hidden, swap it with the last visible tab\n const activeValue = ctx.currentValue.value\n if (activeValue) {\n const hiddenActiveIdx = newHidden.findIndex(t => t.value === activeValue)\n if (hiddenActiveIdx !== -1 && visibleEls.length > 0) {\n const displacedEl = visibleEls[visibleEls.length - 1]\n const activeEl = allTabs.find(t => t.getAttribute('data-tab-value') === activeValue)\n\n if (displacedEl && activeEl) {\n // Swap: make displaced tab hidden, active tab visible\n displacedEl.setAttribute('data-overflow-hidden', '')\n activeEl.removeAttribute('data-overflow-hidden')\n\n const displaced: OverflowTab = {\n value: displacedEl.getAttribute('data-tab-value') ?? '',\n label: displacedEl.textContent?.trim() ?? '',\n disabled: displacedEl.hasAttribute('data-disabled') || displacedEl.getAttribute('aria-disabled') === 'true',\n }\n newHidden.splice(hiddenActiveIdx, 1)\n newHidden.unshift(displaced)\n }\n }\n }\n\n hiddenTabs.value = newHidden\n}\n\nuseResizeObserver(containerEl, () => nextTick(computeOverflow))\nonMounted(() => {\n nextTick(computeOverflow)\n})\n\n// Recompute when the active tab changes so the active tab is always visible\nwatch(() => ctx.currentValue.value, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\n// Safety re-check when overflow toggles. computeOverflow already reserves the more\n// button's width up front, so this is idempotent — it just guards against layout\n// settling (e.g. a scrollbar appearing) on the false→true transition.\nwatch(hasOverflow, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\nfunction selectOverflowTab(value: string) {\n ctx.changeTab(value)\n dropdownOpen.value = false\n}\n</script>\n\n<template>\n <!-- ── Default (no overflow behaviour) ───────────────────────────────────── -->\n <TabsList\n v-if=\"!props.overflow\"\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- ── Arrows mode ────────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'arrows'\"\n class=\"tabs__list-container tabs__list-container--arrows\"\n :class=\"{ 'has-left': canScrollLeft, 'has-right': canScrollRight }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--left', canScrollLeft && 'is-visible')\"\n aria-label=\"Scroll tabs left\"\n tabindex=\"-1\"\n @click=\"scrollTabs('left')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 11L5 7L9 3\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div ref=\"scrollWrapperEl\" class=\"tabs__scroll-wrapper\">\n <TabsList\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--scroll', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n </div>\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--right', canScrollRight && 'is-visible')\"\n aria-label=\"Scroll tabs right\"\n tabindex=\"-1\"\n @click=\"scrollTabs('right')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n </div>\n\n <!-- ── Dropdown mode ──────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'dropdown'\"\n ref=\"containerEl\"\n class=\"tabs__list-container tabs__list-container--dropdown\"\n >\n <TabsList\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--clipped', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- Always rendered so offsetWidth is measurable; visibility toggled via CSS -->\n <div\n ref=\"dropdownEl\"\n class=\"tabs__more\"\n :class=\"{ 'tabs__more--visible': hasOverflow }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n class=\"tabs__more-btn\"\n :aria-expanded=\"dropdownOpen\"\n aria-haspopup=\"menu\"\n @click=\"dropdownOpen = !dropdownOpen\"\n >\n +{{ hiddenTabs.length }}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 4L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div v-if=\"dropdownOpen\" class=\"tabs__overflow-menu\" role=\"menu\">\n <Button\n v-for=\"tab in hiddenTabs\"\n :key=\"tab.value\"\n variant=\"ghost\"\n radius=\"lg\"\n class=\"tabs__overflow-item\"\n role=\"menuitem\"\n :disabled=\"tab.disabled\"\n @click=\"selectOverflowTab(tab.value)\"\n >\n {{ tab.label }}\n </Button>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TabList.js","names":[],"sources":["../../../src/components/tabs/TabList.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch } from 'vue'\nimport { useTemplateRef } from 'vue'\nimport { TabsList } from 'reka-ui'\nimport { useResizeObserver, onClickOutside } from '@vueuse/core'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\nimport Button from '../button/Button.vue'\n\nconst props = defineProps<{\n loop?: boolean\n overflow?: 'arrows' | 'dropdown'\n class?: ClassValue\n /** Override classes on individual slots */\n classNames?: Partial<{\n tabList: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n\n// ── Arrows mode ─────────────────────────────────────────────────────────────\nconst scrollWrapperEl = useTemplateRef<HTMLElement>('scrollWrapperEl')\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\n\nfunction updateScrollButtons() {\n const el = scrollWrapperEl.value\n if (!el) { canScrollLeft.value = false; canScrollRight.value = false; return }\n canScrollLeft.value = el.scrollLeft > 1\n canScrollRight.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\n\nfunction scrollTabs(dir: 'left' | 'right') {\n const el = scrollWrapperEl.value\n if (!el) return\n el.scrollBy({ left: dir === 'left' ? -200 : 200, behavior: 'smooth' })\n // Poll briefly after smooth scroll starts so button states update\n setTimeout(updateScrollButtons, 150)\n setTimeout(updateScrollButtons, 350)\n}\n\nwatch(scrollWrapperEl, (el, oldEl) => {\n if (oldEl) oldEl.removeEventListener('scroll', updateScrollButtons)\n if (el) {\n el.addEventListener('scroll', updateScrollButtons, { passive: true })\n nextTick(updateScrollButtons)\n }\n}, { immediate: true })\n\nuseResizeObserver(scrollWrapperEl, () => nextTick(updateScrollButtons))\n\n// ── Dropdown mode ────────────────────────────────────────────────────────────\ninterface OverflowTab {\n value: string\n label: string\n disabled: boolean\n}\n\nconst containerEl = useTemplateRef<HTMLElement>('containerEl')\nconst dropdownEl = useTemplateRef<HTMLElement>('dropdownEl')\n\nconst hiddenTabs = ref<OverflowTab[]>([])\nconst dropdownOpen = ref(false)\nconst hasOverflow = computed(() => hiddenTabs.value.length > 0)\n\nonClickOutside(dropdownEl, () => { dropdownOpen.value = false })\n\nfunction computeOverflow() {\n if (!containerEl.value) return\n\n const allTabs = Array.from(\n containerEl.value.querySelectorAll('[data-tab-value]'),\n ) as HTMLElement[]\n\n // Reveal all tabs first\n allTabs.forEach(t => t.removeAttribute('data-overflow-hidden'))\n\n // Tabs use w-full and shrink to share the container width, so offsetWidth after\n // a normal render would be containerWidth/n — useless for overflow detection.\n // Force each tab to its natural content width for measurement only (no paint flash:\n // all DOM reads/writes happen synchronously within this JS task before the next frame).\n const listEl = containerEl.value.querySelector('[role=\"tablist\"]') as HTMLElement | null\n if (listEl) {\n listEl.style.overflow = 'visible'\n allTabs.forEach(t => { t.style.flexShrink = '0'; t.style.width = 'auto' })\n void listEl.offsetWidth // force reflow so offsetWidth reads below are accurate\n }\n\n // Measure the more button's real width by temporarily revealing its wrapper.\n // The wrapper is display:none when there's no overflow, so we can't rely on a\n // pre-measured value — measure it here while the (always-visible) container holds it.\n let moreWidth = 0\n const moreEl = dropdownEl.value\n if (moreEl) {\n const prevDisplay = moreEl.style.display\n moreEl.style.display = 'flex'\n void moreEl.offsetWidth\n moreWidth = moreEl.offsetWidth\n moreEl.style.display = prevDisplay\n }\n\n // clientWidth includes the container's horizontal padding; the flex children only\n // get the content box. Subtract padding so measurements compare against real space.\n const cs = getComputedStyle(containerEl.value)\n const padX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight)\n const gap = parseFloat(cs.columnGap) || 0\n const contentWidth = containerEl.value.clientWidth - padX\n\n const tabWidths = allTabs.map(t => t.offsetWidth)\n const totalWidth = tabWidths.reduce((sum, w) => sum + w, 0)\n\n // Restore layout before any early-return so tabs always look correct\n if (listEl) {\n listEl.style.overflow = ''\n allTabs.forEach(t => { t.style.flexShrink = ''; t.style.width = '' })\n }\n\n if (totalWidth <= contentWidth) {\n hiddenTabs.value = []\n return\n }\n\n // When the more button is shown it sits beside the clipped list, separated by `gap`.\n // Reserve its width + the gap (+1px sub-pixel safety) so the last visible tab can\n // never extend under the button.\n const available = contentWidth - moreWidth - gap - 1\n\n let accumulated = 0\n const newHidden: OverflowTab[] = []\n const visibleEls: HTMLElement[] = []\n\n for (let i = 0; i < allTabs.length; i++) {\n const tab = allTabs[i]\n const w = tabWidths[i]\n if (accumulated + w <= available) {\n accumulated += w\n visibleEls.push(tab)\n } else {\n newHidden.push({\n value: tab.getAttribute('data-tab-value') ?? '',\n label: tab.textContent?.trim() ?? '',\n disabled: tab.hasAttribute('data-disabled') || tab.getAttribute('aria-disabled') === 'true',\n })\n tab.setAttribute('data-overflow-hidden', '')\n }\n }\n\n // If the active tab ended up hidden, swap it with the last visible tab\n const activeValue = ctx.currentValue.value\n if (activeValue) {\n const hiddenActiveIdx = newHidden.findIndex(t => t.value === activeValue)\n if (hiddenActiveIdx !== -1 && visibleEls.length > 0) {\n const displacedEl = visibleEls[visibleEls.length - 1]\n const activeEl = allTabs.find(t => t.getAttribute('data-tab-value') === activeValue)\n\n if (displacedEl && activeEl) {\n // Swap: make displaced tab hidden, active tab visible\n displacedEl.setAttribute('data-overflow-hidden', '')\n activeEl.removeAttribute('data-overflow-hidden')\n\n const displaced: OverflowTab = {\n value: displacedEl.getAttribute('data-tab-value') ?? '',\n label: displacedEl.textContent?.trim() ?? '',\n disabled: displacedEl.hasAttribute('data-disabled') || displacedEl.getAttribute('aria-disabled') === 'true',\n }\n newHidden.splice(hiddenActiveIdx, 1)\n newHidden.unshift(displaced)\n }\n }\n }\n\n hiddenTabs.value = newHidden\n}\n\nuseResizeObserver(containerEl, () => nextTick(computeOverflow))\nonMounted(() => {\n nextTick(computeOverflow)\n})\n\n// Recompute when the active tab changes so the active tab is always visible\nwatch(() => ctx.currentValue.value, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\n// Safety re-check when overflow toggles. computeOverflow already reserves the more\n// button's width up front, so this is idempotent — it just guards against layout\n// settling (e.g. a scrollbar appearing) on the false→true transition.\nwatch(hasOverflow, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\nfunction selectOverflowTab(value: string) {\n ctx.changeTab(value)\n dropdownOpen.value = false\n}\n</script>\n\n<template>\n <!-- ── Default (no overflow behaviour) ───────────────────────────────────── -->\n <TabsList\n v-if=\"!props.overflow\"\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- ── Arrows mode ────────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'arrows'\"\n class=\"tabs__list-container tabs__list-container--arrows\"\n :class=\"{ 'has-left': canScrollLeft, 'has-right': canScrollRight }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--left', canScrollLeft && 'is-visible')\"\n aria-label=\"Scroll tabs left\"\n tabindex=\"-1\"\n @click=\"scrollTabs('left')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 11L5 7L9 3\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div ref=\"scrollWrapperEl\" class=\"tabs__scroll-wrapper\">\n <TabsList\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--scroll', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n </div>\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--right', canScrollRight && 'is-visible')\"\n aria-label=\"Scroll tabs right\"\n tabindex=\"-1\"\n @click=\"scrollTabs('right')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n </div>\n\n <!-- ── Dropdown mode ──────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'dropdown'\"\n ref=\"containerEl\"\n class=\"tabs__list-container tabs__list-container--dropdown\"\n >\n <TabsList\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--clipped', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- Always rendered so offsetWidth is measurable; visibility toggled via CSS -->\n <div\n ref=\"dropdownEl\"\n class=\"tabs__more\"\n :class=\"{ 'tabs__more--visible': hasOverflow }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n class=\"tabs__more-btn\"\n :aria-expanded=\"dropdownOpen\"\n aria-haspopup=\"menu\"\n @click=\"dropdownOpen = !dropdownOpen\"\n >\n +{{ hiddenTabs.length }}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 4L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div v-if=\"dropdownOpen\" class=\"tabs__overflow-menu\" role=\"menu\">\n <Button\n v-for=\"tab in hiddenTabs\"\n :key=\"tab.value\"\n variant=\"ghost\"\n radius=\"lg\"\n class=\"tabs__overflow-item\"\n role=\"menuitem\"\n :disabled=\"tab.disabled\"\n @click=\"selectOverflowTab(tab.value)\"\n >\n {{ tab.label }}\n </Button>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -22,7 +22,9 @@ var TabList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
22
22
  Object,
23
23
  Array
24
24
  ] },
25
- classNames: {}
25
+ classNames: {},
26
+ as: {},
27
+ asChild: { type: Boolean }
26
28
  },
27
29
  setup(__props) {
28
30
  const props = __props;
@@ -163,11 +165,18 @@ var TabList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
163
165
  return !props.overflow ? (openBlock(), createBlock(unref(TabsList), {
164
166
  key: 0,
165
167
  loop: props.loop ?? true,
168
+ as: props.as,
169
+ "as-child": props.asChild,
166
170
  class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabList(), props.class, props.classNames?.tabList))
167
171
  }, {
168
172
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
169
173
  _: 3
170
- }, 8, ["loop", "class"])) : props.overflow === "arrows" ? (openBlock(), createElementBlock("div", {
174
+ }, 8, [
175
+ "loop",
176
+ "as",
177
+ "as-child",
178
+ "class"
179
+ ])) : props.overflow === "arrows" ? (openBlock(), createElementBlock("div", {
171
180
  key: 1,
172
181
  class: normalizeClass(["tabs__list-container tabs__list-container--arrows", {
173
182
  "has-left": canScrollLeft.value,
@@ -205,11 +214,18 @@ var TabList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
205
214
  class: "tabs__scroll-wrapper"
206
215
  }, [createVNode(unref(TabsList), {
207
216
  loop: props.loop ?? true,
217
+ as: props.as,
218
+ "as-child": props.asChild,
208
219
  class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabList(), "tabs__list--scroll", props.class, props.classNames?.tabList))
209
220
  }, {
210
221
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
211
222
  _: 3
212
- }, 8, ["loop", "class"])], 512),
223
+ }, 8, [
224
+ "loop",
225
+ "as",
226
+ "as-child",
227
+ "class"
228
+ ])], 512),
213
229
  createVNode(Button_default, {
214
230
  variant: "secondary",
215
231
  size: "sm",
@@ -242,11 +258,18 @@ var TabList_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
242
258
  class: "tabs__list-container tabs__list-container--dropdown"
243
259
  }, [createVNode(unref(TabsList), {
244
260
  loop: props.loop ?? true,
261
+ as: props.as,
262
+ "as-child": props.asChild,
245
263
  class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabList(), "tabs__list--clipped", props.class, props.classNames?.tabList))
246
264
  }, {
247
265
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
248
266
  _: 3
249
- }, 8, ["loop", "class"]), createElementVNode("div", {
267
+ }, 8, [
268
+ "loop",
269
+ "as",
270
+ "as-child",
271
+ "class"
272
+ ]), createElementVNode("div", {
250
273
  ref_key: "dropdownEl",
251
274
  ref: dropdownEl,
252
275
  class: normalizeClass(["tabs__more", { "tabs__more--visible": hasOverflow.value }])
@@ -1 +1 @@
1
- {"version":3,"file":"TabList.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabList.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch } from 'vue'\nimport { useTemplateRef } from 'vue'\nimport { TabsList } from 'reka-ui'\nimport { useResizeObserver, onClickOutside } from '@vueuse/core'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\nimport Button from '../button/Button.vue'\n\nconst props = defineProps<{\n loop?: boolean\n overflow?: 'arrows' | 'dropdown'\n class?: ClassValue\n /** Override classes on individual slots */\n classNames?: Partial<{\n tabList: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n\n// ── Arrows mode ─────────────────────────────────────────────────────────────\nconst scrollWrapperEl = useTemplateRef<HTMLElement>('scrollWrapperEl')\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\n\nfunction updateScrollButtons() {\n const el = scrollWrapperEl.value\n if (!el) { canScrollLeft.value = false; canScrollRight.value = false; return }\n canScrollLeft.value = el.scrollLeft > 1\n canScrollRight.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\n\nfunction scrollTabs(dir: 'left' | 'right') {\n const el = scrollWrapperEl.value\n if (!el) return\n el.scrollBy({ left: dir === 'left' ? -200 : 200, behavior: 'smooth' })\n // Poll briefly after smooth scroll starts so button states update\n setTimeout(updateScrollButtons, 150)\n setTimeout(updateScrollButtons, 350)\n}\n\nwatch(scrollWrapperEl, (el, oldEl) => {\n if (oldEl) oldEl.removeEventListener('scroll', updateScrollButtons)\n if (el) {\n el.addEventListener('scroll', updateScrollButtons, { passive: true })\n nextTick(updateScrollButtons)\n }\n}, { immediate: true })\n\nuseResizeObserver(scrollWrapperEl, () => nextTick(updateScrollButtons))\n\n// ── Dropdown mode ────────────────────────────────────────────────────────────\ninterface OverflowTab {\n value: string\n label: string\n disabled: boolean\n}\n\nconst containerEl = useTemplateRef<HTMLElement>('containerEl')\nconst dropdownEl = useTemplateRef<HTMLElement>('dropdownEl')\n\nconst hiddenTabs = ref<OverflowTab[]>([])\nconst dropdownOpen = ref(false)\nconst hasOverflow = computed(() => hiddenTabs.value.length > 0)\n\nonClickOutside(dropdownEl, () => { dropdownOpen.value = false })\n\nfunction computeOverflow() {\n if (!containerEl.value) return\n\n const allTabs = Array.from(\n containerEl.value.querySelectorAll('[data-tab-value]'),\n ) as HTMLElement[]\n\n // Reveal all tabs first\n allTabs.forEach(t => t.removeAttribute('data-overflow-hidden'))\n\n // Tabs use w-full and shrink to share the container width, so offsetWidth after\n // a normal render would be containerWidth/n — useless for overflow detection.\n // Force each tab to its natural content width for measurement only (no paint flash:\n // all DOM reads/writes happen synchronously within this JS task before the next frame).\n const listEl = containerEl.value.querySelector('[role=\"tablist\"]') as HTMLElement | null\n if (listEl) {\n listEl.style.overflow = 'visible'\n allTabs.forEach(t => { t.style.flexShrink = '0'; t.style.width = 'auto' })\n void listEl.offsetWidth // force reflow so offsetWidth reads below are accurate\n }\n\n // Measure the more button's real width by temporarily revealing its wrapper.\n // The wrapper is display:none when there's no overflow, so we can't rely on a\n // pre-measured value — measure it here while the (always-visible) container holds it.\n let moreWidth = 0\n const moreEl = dropdownEl.value\n if (moreEl) {\n const prevDisplay = moreEl.style.display\n moreEl.style.display = 'flex'\n void moreEl.offsetWidth\n moreWidth = moreEl.offsetWidth\n moreEl.style.display = prevDisplay\n }\n\n // clientWidth includes the container's horizontal padding; the flex children only\n // get the content box. Subtract padding so measurements compare against real space.\n const cs = getComputedStyle(containerEl.value)\n const padX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight)\n const gap = parseFloat(cs.columnGap) || 0\n const contentWidth = containerEl.value.clientWidth - padX\n\n const tabWidths = allTabs.map(t => t.offsetWidth)\n const totalWidth = tabWidths.reduce((sum, w) => sum + w, 0)\n\n // Restore layout before any early-return so tabs always look correct\n if (listEl) {\n listEl.style.overflow = ''\n allTabs.forEach(t => { t.style.flexShrink = ''; t.style.width = '' })\n }\n\n if (totalWidth <= contentWidth) {\n hiddenTabs.value = []\n return\n }\n\n // When the more button is shown it sits beside the clipped list, separated by `gap`.\n // Reserve its width + the gap (+1px sub-pixel safety) so the last visible tab can\n // never extend under the button.\n const available = contentWidth - moreWidth - gap - 1\n\n let accumulated = 0\n const newHidden: OverflowTab[] = []\n const visibleEls: HTMLElement[] = []\n\n for (let i = 0; i < allTabs.length; i++) {\n const tab = allTabs[i]\n const w = tabWidths[i]\n if (accumulated + w <= available) {\n accumulated += w\n visibleEls.push(tab)\n } else {\n newHidden.push({\n value: tab.getAttribute('data-tab-value') ?? '',\n label: tab.textContent?.trim() ?? '',\n disabled: tab.hasAttribute('data-disabled') || tab.getAttribute('aria-disabled') === 'true',\n })\n tab.setAttribute('data-overflow-hidden', '')\n }\n }\n\n // If the active tab ended up hidden, swap it with the last visible tab\n const activeValue = ctx.currentValue.value\n if (activeValue) {\n const hiddenActiveIdx = newHidden.findIndex(t => t.value === activeValue)\n if (hiddenActiveIdx !== -1 && visibleEls.length > 0) {\n const displacedEl = visibleEls[visibleEls.length - 1]\n const activeEl = allTabs.find(t => t.getAttribute('data-tab-value') === activeValue)\n\n if (displacedEl && activeEl) {\n // Swap: make displaced tab hidden, active tab visible\n displacedEl.setAttribute('data-overflow-hidden', '')\n activeEl.removeAttribute('data-overflow-hidden')\n\n const displaced: OverflowTab = {\n value: displacedEl.getAttribute('data-tab-value') ?? '',\n label: displacedEl.textContent?.trim() ?? '',\n disabled: displacedEl.hasAttribute('data-disabled') || displacedEl.getAttribute('aria-disabled') === 'true',\n }\n newHidden.splice(hiddenActiveIdx, 1)\n newHidden.unshift(displaced)\n }\n }\n }\n\n hiddenTabs.value = newHidden\n}\n\nuseResizeObserver(containerEl, () => nextTick(computeOverflow))\nonMounted(() => {\n nextTick(computeOverflow)\n})\n\n// Recompute when the active tab changes so the active tab is always visible\nwatch(() => ctx.currentValue.value, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\n// Safety re-check when overflow toggles. computeOverflow already reserves the more\n// button's width up front, so this is idempotent — it just guards against layout\n// settling (e.g. a scrollbar appearing) on the false→true transition.\nwatch(hasOverflow, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\nfunction selectOverflowTab(value: string) {\n ctx.changeTab(value)\n dropdownOpen.value = false\n}\n</script>\n\n<template>\n <!-- ── Default (no overflow behaviour) ───────────────────────────────────── -->\n <TabsList\n v-if=\"!props.overflow\"\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- ── Arrows mode ────────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'arrows'\"\n class=\"tabs__list-container tabs__list-container--arrows\"\n :class=\"{ 'has-left': canScrollLeft, 'has-right': canScrollRight }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--left', canScrollLeft && 'is-visible')\"\n aria-label=\"Scroll tabs left\"\n tabindex=\"-1\"\n @click=\"scrollTabs('left')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 11L5 7L9 3\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div ref=\"scrollWrapperEl\" class=\"tabs__scroll-wrapper\">\n <TabsList\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--scroll', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n </div>\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--right', canScrollRight && 'is-visible')\"\n aria-label=\"Scroll tabs right\"\n tabindex=\"-1\"\n @click=\"scrollTabs('right')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n </div>\n\n <!-- ── Dropdown mode ──────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'dropdown'\"\n ref=\"containerEl\"\n class=\"tabs__list-container tabs__list-container--dropdown\"\n >\n <TabsList\n :loop=\"props.loop ?? true\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--clipped', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- Always rendered so offsetWidth is measurable; visibility toggled via CSS -->\n <div\n ref=\"dropdownEl\"\n class=\"tabs__more\"\n :class=\"{ 'tabs__more--visible': hasOverflow }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n class=\"tabs__more-btn\"\n :aria-expanded=\"dropdownOpen\"\n aria-haspopup=\"menu\"\n @click=\"dropdownOpen = !dropdownOpen\"\n >\n +{{ hiddenTabs.length }}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 4L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div v-if=\"dropdownOpen\" class=\"tabs__overflow-menu\" role=\"menu\">\n <Button\n v-for=\"tab in hiddenTabs\"\n :key=\"tab.value\"\n variant=\"ghost\"\n radius=\"lg\"\n class=\"tabs__overflow-item\"\n role=\"menuitem\"\n :disabled=\"tab.disabled\"\n @click=\"selectOverflowTab(tab.value)\"\n >\n {{ tab.label }}\n </Button>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TabList.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabList.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch } from 'vue'\nimport { useTemplateRef } from 'vue'\nimport { TabsList } from 'reka-ui'\nimport { useResizeObserver, onClickOutside } from '@vueuse/core'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\nimport Button from '../button/Button.vue'\n\nconst props = defineProps<{\n loop?: boolean\n overflow?: 'arrows' | 'dropdown'\n class?: ClassValue\n /** Override classes on individual slots */\n classNames?: Partial<{\n tabList: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n\n// ── Arrows mode ─────────────────────────────────────────────────────────────\nconst scrollWrapperEl = useTemplateRef<HTMLElement>('scrollWrapperEl')\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\n\nfunction updateScrollButtons() {\n const el = scrollWrapperEl.value\n if (!el) { canScrollLeft.value = false; canScrollRight.value = false; return }\n canScrollLeft.value = el.scrollLeft > 1\n canScrollRight.value = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n}\n\nfunction scrollTabs(dir: 'left' | 'right') {\n const el = scrollWrapperEl.value\n if (!el) return\n el.scrollBy({ left: dir === 'left' ? -200 : 200, behavior: 'smooth' })\n // Poll briefly after smooth scroll starts so button states update\n setTimeout(updateScrollButtons, 150)\n setTimeout(updateScrollButtons, 350)\n}\n\nwatch(scrollWrapperEl, (el, oldEl) => {\n if (oldEl) oldEl.removeEventListener('scroll', updateScrollButtons)\n if (el) {\n el.addEventListener('scroll', updateScrollButtons, { passive: true })\n nextTick(updateScrollButtons)\n }\n}, { immediate: true })\n\nuseResizeObserver(scrollWrapperEl, () => nextTick(updateScrollButtons))\n\n// ── Dropdown mode ────────────────────────────────────────────────────────────\ninterface OverflowTab {\n value: string\n label: string\n disabled: boolean\n}\n\nconst containerEl = useTemplateRef<HTMLElement>('containerEl')\nconst dropdownEl = useTemplateRef<HTMLElement>('dropdownEl')\n\nconst hiddenTabs = ref<OverflowTab[]>([])\nconst dropdownOpen = ref(false)\nconst hasOverflow = computed(() => hiddenTabs.value.length > 0)\n\nonClickOutside(dropdownEl, () => { dropdownOpen.value = false })\n\nfunction computeOverflow() {\n if (!containerEl.value) return\n\n const allTabs = Array.from(\n containerEl.value.querySelectorAll('[data-tab-value]'),\n ) as HTMLElement[]\n\n // Reveal all tabs first\n allTabs.forEach(t => t.removeAttribute('data-overflow-hidden'))\n\n // Tabs use w-full and shrink to share the container width, so offsetWidth after\n // a normal render would be containerWidth/n — useless for overflow detection.\n // Force each tab to its natural content width for measurement only (no paint flash:\n // all DOM reads/writes happen synchronously within this JS task before the next frame).\n const listEl = containerEl.value.querySelector('[role=\"tablist\"]') as HTMLElement | null\n if (listEl) {\n listEl.style.overflow = 'visible'\n allTabs.forEach(t => { t.style.flexShrink = '0'; t.style.width = 'auto' })\n void listEl.offsetWidth // force reflow so offsetWidth reads below are accurate\n }\n\n // Measure the more button's real width by temporarily revealing its wrapper.\n // The wrapper is display:none when there's no overflow, so we can't rely on a\n // pre-measured value — measure it here while the (always-visible) container holds it.\n let moreWidth = 0\n const moreEl = dropdownEl.value\n if (moreEl) {\n const prevDisplay = moreEl.style.display\n moreEl.style.display = 'flex'\n void moreEl.offsetWidth\n moreWidth = moreEl.offsetWidth\n moreEl.style.display = prevDisplay\n }\n\n // clientWidth includes the container's horizontal padding; the flex children only\n // get the content box. Subtract padding so measurements compare against real space.\n const cs = getComputedStyle(containerEl.value)\n const padX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight)\n const gap = parseFloat(cs.columnGap) || 0\n const contentWidth = containerEl.value.clientWidth - padX\n\n const tabWidths = allTabs.map(t => t.offsetWidth)\n const totalWidth = tabWidths.reduce((sum, w) => sum + w, 0)\n\n // Restore layout before any early-return so tabs always look correct\n if (listEl) {\n listEl.style.overflow = ''\n allTabs.forEach(t => { t.style.flexShrink = ''; t.style.width = '' })\n }\n\n if (totalWidth <= contentWidth) {\n hiddenTabs.value = []\n return\n }\n\n // When the more button is shown it sits beside the clipped list, separated by `gap`.\n // Reserve its width + the gap (+1px sub-pixel safety) so the last visible tab can\n // never extend under the button.\n const available = contentWidth - moreWidth - gap - 1\n\n let accumulated = 0\n const newHidden: OverflowTab[] = []\n const visibleEls: HTMLElement[] = []\n\n for (let i = 0; i < allTabs.length; i++) {\n const tab = allTabs[i]\n const w = tabWidths[i]\n if (accumulated + w <= available) {\n accumulated += w\n visibleEls.push(tab)\n } else {\n newHidden.push({\n value: tab.getAttribute('data-tab-value') ?? '',\n label: tab.textContent?.trim() ?? '',\n disabled: tab.hasAttribute('data-disabled') || tab.getAttribute('aria-disabled') === 'true',\n })\n tab.setAttribute('data-overflow-hidden', '')\n }\n }\n\n // If the active tab ended up hidden, swap it with the last visible tab\n const activeValue = ctx.currentValue.value\n if (activeValue) {\n const hiddenActiveIdx = newHidden.findIndex(t => t.value === activeValue)\n if (hiddenActiveIdx !== -1 && visibleEls.length > 0) {\n const displacedEl = visibleEls[visibleEls.length - 1]\n const activeEl = allTabs.find(t => t.getAttribute('data-tab-value') === activeValue)\n\n if (displacedEl && activeEl) {\n // Swap: make displaced tab hidden, active tab visible\n displacedEl.setAttribute('data-overflow-hidden', '')\n activeEl.removeAttribute('data-overflow-hidden')\n\n const displaced: OverflowTab = {\n value: displacedEl.getAttribute('data-tab-value') ?? '',\n label: displacedEl.textContent?.trim() ?? '',\n disabled: displacedEl.hasAttribute('data-disabled') || displacedEl.getAttribute('aria-disabled') === 'true',\n }\n newHidden.splice(hiddenActiveIdx, 1)\n newHidden.unshift(displaced)\n }\n }\n }\n\n hiddenTabs.value = newHidden\n}\n\nuseResizeObserver(containerEl, () => nextTick(computeOverflow))\nonMounted(() => {\n nextTick(computeOverflow)\n})\n\n// Recompute when the active tab changes so the active tab is always visible\nwatch(() => ctx.currentValue.value, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\n// Safety re-check when overflow toggles. computeOverflow already reserves the more\n// button's width up front, so this is idempotent — it just guards against layout\n// settling (e.g. a scrollbar appearing) on the false→true transition.\nwatch(hasOverflow, () => {\n if (props.overflow === 'dropdown') nextTick(computeOverflow)\n})\n\nfunction selectOverflowTab(value: string) {\n ctx.changeTab(value)\n dropdownOpen.value = false\n}\n</script>\n\n<template>\n <!-- ── Default (no overflow behaviour) ───────────────────────────────────── -->\n <TabsList\n v-if=\"!props.overflow\"\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- ── Arrows mode ────────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'arrows'\"\n class=\"tabs__list-container tabs__list-container--arrows\"\n :class=\"{ 'has-left': canScrollLeft, 'has-right': canScrollRight }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--left', canScrollLeft && 'is-visible')\"\n aria-label=\"Scroll tabs left\"\n tabindex=\"-1\"\n @click=\"scrollTabs('left')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 11L5 7L9 3\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div ref=\"scrollWrapperEl\" class=\"tabs__scroll-wrapper\">\n <TabsList\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--scroll', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n </div>\n\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n :is-icon-only=\"true\"\n :class=\"composeClassName('tabs__arrow tabs__arrow--right', canScrollRight && 'is-visible')\"\n aria-label=\"Scroll tabs right\"\n tabindex=\"-1\"\n @click=\"scrollTabs('right')\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 3L9 7L5 11\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n </div>\n\n <!-- ── Dropdown mode ──────────────────────────────────────────────────────── -->\n <div\n v-else-if=\"props.overflow === 'dropdown'\"\n ref=\"containerEl\"\n class=\"tabs__list-container tabs__list-container--dropdown\"\n >\n <TabsList\n :loop=\"props.loop ?? true\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabList(), 'tabs__list--clipped', props.class, props.classNames?.tabList)\"\n >\n <slot />\n </TabsList>\n\n <!-- Always rendered so offsetWidth is measurable; visibility toggled via CSS -->\n <div\n ref=\"dropdownEl\"\n class=\"tabs__more\"\n :class=\"{ 'tabs__more--visible': hasOverflow }\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n radius=\"full\"\n class=\"tabs__more-btn\"\n :aria-expanded=\"dropdownOpen\"\n aria-haspopup=\"menu\"\n @click=\"dropdownOpen = !dropdownOpen\"\n >\n +{{ hiddenTabs.length }}\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2 4L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </Button>\n\n <div v-if=\"dropdownOpen\" class=\"tabs__overflow-menu\" role=\"menu\">\n <Button\n v-for=\"tab in hiddenTabs\"\n :key=\"tab.value\"\n variant=\"ghost\"\n radius=\"lg\"\n class=\"tabs__overflow-item\"\n role=\"menuitem\"\n :disabled=\"tab.disabled\"\n @click=\"selectOverflowTab(tab.value)\"\n >\n {{ tab.label }}\n </Button>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TabPanel.js","names":[],"sources":["../../../src/components/tabs/TabPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n forceMount?: boolean\n class?: ClassValue\n /** Custom classes to apply to specific slots */\n classNames?: Partial<{\n tabPanel: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsContent\n :value=\"props.value\"\n :force-mount=\"props.forceMount\"\n :class=\"composeClassName(ctx.slotFns.value.tabPanel(), props.class, props.classNames?.tabPanel)\"\n >\n <slot />\n </TabsContent>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TabPanel.js","names":[],"sources":["../../../src/components/tabs/TabPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n forceMount?: boolean\n class?: ClassValue\n /** Custom classes to apply to specific slots */\n classNames?: Partial<{\n tabPanel: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsContent\n :value=\"props.value\"\n :force-mount=\"props.forceMount\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabPanel(), props.class, props.classNames?.tabPanel)\"\n >\n <slot />\n </TabsContent>\n</template>\n"],"mappings":""}
@@ -15,7 +15,9 @@ var TabPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
15
15
  Object,
16
16
  Array
17
17
  ] },
18
- classNames: {}
18
+ classNames: {},
19
+ as: {},
20
+ asChild: { type: Boolean }
19
21
  },
20
22
  setup(__props) {
21
23
  const props = __props;
@@ -24,6 +26,8 @@ var TabPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
24
26
  return openBlock(), createBlock(unref(TabsContent), {
25
27
  value: props.value,
26
28
  "force-mount": props.forceMount,
29
+ as: props.as,
30
+ "as-child": props.asChild,
27
31
  class: normalizeClass(unref(composeClassName)(unref(ctx).slotFns.value.tabPanel(), props.class, props.classNames?.tabPanel))
28
32
  }, {
29
33
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
@@ -31,6 +35,8 @@ var TabPanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
31
35
  }, 8, [
32
36
  "value",
33
37
  "force-mount",
38
+ "as",
39
+ "as-child",
34
40
  "class"
35
41
  ]);
36
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TabPanel.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n forceMount?: boolean\n class?: ClassValue\n /** Custom classes to apply to specific slots */\n classNames?: Partial<{\n tabPanel: ClassValue\n }>\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsContent\n :value=\"props.value\"\n :force-mount=\"props.forceMount\"\n :class=\"composeClassName(ctx.slotFns.value.tabPanel(), props.class, props.classNames?.tabPanel)\"\n >\n <slot />\n </TabsContent>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EAUd,MAAM,MAAM,eAAc;;uBAIxB,YAMc,MAAA,YAAA,EAAA;IALX,OAAO,MAAM;IACb,eAAa,MAAM;IACnB,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,UAAQ,EAAI,MAAM,OAAO,MAAM,YAAY,SAAQ,CAAA;;2BAEtF,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"TabPanel.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/TabPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabsContent } from 'reka-ui'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsInject } from './tabs.context'\n\nconst props = defineProps<{\n value: string\n forceMount?: boolean\n class?: ClassValue\n /** Custom classes to apply to specific slots */\n classNames?: Partial<{\n tabPanel: ClassValue\n }>\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>()\n\nconst ctx = useTabsInject()\n</script>\n\n<template>\n <TabsContent\n :value=\"props.value\"\n :force-mount=\"props.forceMount\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(ctx.slotFns.value.tabPanel(), props.class, props.classNames?.tabPanel)\"\n >\n <slot />\n </TabsContent>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAKA,MAAM,QAAQ;EAcd,MAAM,MAAM,eAAc;;uBAIxB,YAQc,MAAA,YAAA,EAAA;IAPX,OAAO,MAAM;IACb,eAAa,MAAM;IACnB,IAAI,MAAM;IACV,YAAU,MAAM;IAChB,OAAK,eAAE,MAAA,iBAAgB,CAAC,MAAA,IAAG,CAAC,QAAQ,MAAM,UAAQ,EAAI,MAAM,OAAO,MAAM,YAAY,SAAQ,CAAA;;2BAEtF,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","names":[],"sources":["../../../src/components/tabs/Tabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue'\nimport { TabsRoot } from 'reka-ui'\nimport { tabsVariants, type TabsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsProvide } from './tabs.context'\nimport TabList from './TabList.vue'\nimport Tab from './Tab.vue'\nimport TabPanel from './TabPanel.vue'\n\ntype TabShorthandItem = { value: string; label: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n modelValue?: string\n defaultValue?: string\n orientation?: 'horizontal' | 'vertical'\n variant?: TabsVariants['variant']\n activationMode?: 'automatic' | 'manual'\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render tabs from an array instead of the compound slot API */\n items?: TabShorthandItem[]\n}>(), {\n orientation: 'horizontal',\n variant: 'primary',\n activationMode: 'automatic',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst internalValue = ref<string | undefined>(props.modelValue ?? props.defaultValue)\n\nwatch(() => props.modelValue, (v) => {\n if (v !== undefined) internalValue.value = v\n})\n\nwatch(\n () => props.items,\n (items) => {\n if (items && items.length > 0 && !props.modelValue && !props.defaultValue && internalValue.value === undefined) {\n internalValue.value = items[0].value\n }\n },\n { immediate: true },\n)\n\nfunction changeTab(value: string) {\n internalValue.value = value\n emit('update:modelValue', value)\n}\n\nconst slotFns = computed(() => tabsVariants({ variant: props.variant }))\n\nuseTabsProvide({\n slotFns,\n orientation: toRef(props, 'orientation'),\n currentValue: internalValue,\n changeTab,\n})\n</script>\n\n<template>\n <TabsRoot\n :model-value=\"internalValue\"\n :orientation=\"props.orientation\"\n :activation-mode=\"props.activationMode\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n @update:model-value=\"changeTab\"\n >\n <template v-if=\"props.items\">\n <TabList>\n <Tab\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >{{ item.label }}</Tab>\n </TabList>\n <TabPanel\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n >{{ item.content }}</TabPanel>\n </template>\n <slot v-else />\n </TabsRoot>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"Tabs.js","names":[],"sources":["../../../src/components/tabs/Tabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue'\nimport { TabsRoot } from 'reka-ui'\nimport { tabsVariants, type TabsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsProvide } from './tabs.context'\nimport TabList from './TabList.vue'\nimport Tab from './Tab.vue'\nimport TabPanel from './TabPanel.vue'\n\ntype TabShorthandItem = { value: string; label: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n modelValue?: string\n defaultValue?: string\n orientation?: 'horizontal' | 'vertical'\n variant?: TabsVariants['variant']\n activationMode?: 'automatic' | 'manual'\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render tabs from an array instead of the compound slot API */\n items?: TabShorthandItem[]\n /** Reading direction of the tabs. */\n dir?: 'ltr' | 'rtl'\n /** Whether to unmount tab panels when they are hidden. */\n unmountOnHide?: boolean\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>(), {\n orientation: 'horizontal',\n variant: 'primary',\n activationMode: 'automatic',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst internalValue = ref<string | undefined>(props.modelValue ?? props.defaultValue)\n\nwatch(() => props.modelValue, (v) => {\n if (v !== undefined) internalValue.value = v\n})\n\nwatch(\n () => props.items,\n (items) => {\n if (items && items.length > 0 && !props.modelValue && !props.defaultValue && internalValue.value === undefined) {\n internalValue.value = items[0].value\n }\n },\n { immediate: true },\n)\n\nfunction changeTab(value: string) {\n internalValue.value = value\n emit('update:modelValue', value)\n}\n\nconst slotFns = computed(() => tabsVariants({ variant: props.variant }))\n\nuseTabsProvide({\n slotFns,\n orientation: toRef(props, 'orientation'),\n currentValue: internalValue,\n changeTab,\n})\n</script>\n\n<template>\n <TabsRoot\n :model-value=\"internalValue\"\n :orientation=\"props.orientation\"\n :activation-mode=\"props.activationMode\"\n :dir=\"props.dir\"\n :unmount-on-hide=\"props.unmountOnHide\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n @update:model-value=\"changeTab\"\n >\n <template v-if=\"props.items\">\n <TabList>\n <Tab\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >{{ item.label }}</Tab>\n </TabList>\n <TabPanel\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n >{{ item.content }}</TabPanel>\n </template>\n <slot v-else />\n </TabsRoot>\n</template>\n"],"mappings":""}
@@ -23,7 +23,11 @@ var Tabs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
23
23
  Array
24
24
  ] },
25
25
  classNames: {},
26
- items: {}
26
+ items: {},
27
+ dir: {},
28
+ unmountOnHide: { type: Boolean },
29
+ as: {},
30
+ asChild: { type: Boolean }
27
31
  },
28
32
  emits: ["update:modelValue"],
29
33
  setup(__props, { emit: __emit }) {
@@ -52,6 +56,10 @@ var Tabs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
52
56
  "model-value": internalValue.value,
53
57
  orientation: props.orientation,
54
58
  "activation-mode": props.activationMode,
59
+ dir: props.dir,
60
+ "unmount-on-hide": props.unmountOnHide,
61
+ as: props.as,
62
+ "as-child": props.asChild,
55
63
  class: normalizeClass(unref(composeClassName)(slotFns.value.base(), props.class, props.classNames?.base)),
56
64
  "data-orientation": props.orientation,
57
65
  "onUpdate:modelValue": changeTab
@@ -82,6 +90,10 @@ var Tabs_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
82
90
  "model-value",
83
91
  "orientation",
84
92
  "activation-mode",
93
+ "dir",
94
+ "unmount-on-hide",
95
+ "as",
96
+ "as-child",
85
97
  "class",
86
98
  "data-orientation"
87
99
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/Tabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue'\nimport { TabsRoot } from 'reka-ui'\nimport { tabsVariants, type TabsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsProvide } from './tabs.context'\nimport TabList from './TabList.vue'\nimport Tab from './Tab.vue'\nimport TabPanel from './TabPanel.vue'\n\ntype TabShorthandItem = { value: string; label: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n modelValue?: string\n defaultValue?: string\n orientation?: 'horizontal' | 'vertical'\n variant?: TabsVariants['variant']\n activationMode?: 'automatic' | 'manual'\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render tabs from an array instead of the compound slot API */\n items?: TabShorthandItem[]\n}>(), {\n orientation: 'horizontal',\n variant: 'primary',\n activationMode: 'automatic',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst internalValue = ref<string | undefined>(props.modelValue ?? props.defaultValue)\n\nwatch(() => props.modelValue, (v) => {\n if (v !== undefined) internalValue.value = v\n})\n\nwatch(\n () => props.items,\n (items) => {\n if (items && items.length > 0 && !props.modelValue && !props.defaultValue && internalValue.value === undefined) {\n internalValue.value = items[0].value\n }\n },\n { immediate: true },\n)\n\nfunction changeTab(value: string) {\n internalValue.value = value\n emit('update:modelValue', value)\n}\n\nconst slotFns = computed(() => tabsVariants({ variant: props.variant }))\n\nuseTabsProvide({\n slotFns,\n orientation: toRef(props, 'orientation'),\n currentValue: internalValue,\n changeTab,\n})\n</script>\n\n<template>\n <TabsRoot\n :model-value=\"internalValue\"\n :orientation=\"props.orientation\"\n :activation-mode=\"props.activationMode\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n @update:model-value=\"changeTab\"\n >\n <template v-if=\"props.items\">\n <TabList>\n <Tab\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >{{ item.label }}</Tab>\n </TabList>\n <TabPanel\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n >{{ item.content }}</TabPanel>\n </template>\n <slot v-else />\n </TabsRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,MAAM,QAAQ;EAmBd,MAAM,OAAO;EAIb,MAAM,gBAAgB,IAAwB,MAAM,cAAc,MAAM,aAAY;AAEpF,cAAY,MAAM,aAAa,MAAM;AACnC,OAAI,MAAM,KAAA,EAAW,eAAc,QAAQ;IAC5C;AAED,cACQ,MAAM,QACX,UAAU;AACT,OAAI,SAAS,MAAM,SAAS,KAAK,CAAC,MAAM,cAAc,CAAC,MAAM,gBAAgB,cAAc,UAAU,KAAA,EACnG,eAAc,QAAQ,MAAM,GAAG;KAGnC,EAAE,WAAW,MAAM,CACrB;EAEA,SAAS,UAAU,OAAe;AAChC,iBAAc,QAAQ;AACtB,QAAK,qBAAqB,MAAK;;EAGjC,MAAM,UAAU,eAAe,aAAa,EAAE,SAAS,MAAM,SAAS,CAAC,CAAA;AAEvE,iBAAe;GACb;GACA,aAAa,MAAM,OAAO,cAAc;GACxC,cAAc;GACd;GACD,CAAA;;uBAIC,YAwBW,MAAA,SAAA,EAAA;IAvBR,eAAa,cAAA;IACb,aAAa,MAAM;IACnB,mBAAiB,MAAM;IACvB,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI,CAAA;IAC3E,oBAAkB,MAAM;IACxB,uBAAoB;;2BAgBV,CAdK,MAAM,SAAA,WAAA,EAAtB,mBAcW,UAAA,EAAA,KAAA,GAAA,EAAA,CAbT,YAOU,iBAAA,MAAA;4BALqB,EAAA,UAAA,KAAA,EAD7B,mBAKuB,UAAA,MAAA,WAJN,MAAM,QAAd,SAAI;0BADb,YAKuB,aAAA;OAHpB,KAAK,KAAK;OACV,OAAO,KAAK;OACZ,UAAU,KAAK;;8BACD,CAAA,gBAAA,gBAAb,KAAK,MAAK,EAAA,EAAA,CAAA,CAAA;;;;;0BAEhB,mBAI8B,UAAA,MAAA,WAHb,MAAM,QAAd,SAAI;yBADb,YAI8B,kBAAA;MAF3B,KAAK,KAAK;MACV,OAAO,KAAK;;6BACI,CAAA,gBAAA,gBAAf,KAAK,QAAO,EAAA,EAAA,CAAA,CAAA;;;uBAElB,WAAe,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"Tabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tabs/Tabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, toRef, watch } from 'vue'\nimport { TabsRoot } from 'reka-ui'\nimport { tabsVariants, type TabsVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\nimport { useTabsProvide } from './tabs.context'\nimport TabList from './TabList.vue'\nimport Tab from './Tab.vue'\nimport TabPanel from './TabPanel.vue'\n\ntype TabShorthandItem = { value: string; label: string; content?: string; disabled?: boolean }\n\nconst props = withDefaults(defineProps<{\n modelValue?: string\n defaultValue?: string\n orientation?: 'horizontal' | 'vertical'\n variant?: TabsVariants['variant']\n activationMode?: 'automatic' | 'manual'\n class?: ClassValue\n /** Override classes for individual slots */\n classNames?: Partial<{\n base: ClassValue\n }>\n /** Shorthand API: render tabs from an array instead of the compound slot API */\n items?: TabShorthandItem[]\n /** Reading direction of the tabs. */\n dir?: 'ltr' | 'rtl'\n /** Whether to unmount tab panels when they are hidden. */\n unmountOnHide?: boolean\n /** Render as a different element type. */\n as?: string\n /** Merge props onto child element instead of rendering a wrapper. */\n asChild?: boolean\n}>(), {\n orientation: 'horizontal',\n variant: 'primary',\n activationMode: 'automatic',\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst internalValue = ref<string | undefined>(props.modelValue ?? props.defaultValue)\n\nwatch(() => props.modelValue, (v) => {\n if (v !== undefined) internalValue.value = v\n})\n\nwatch(\n () => props.items,\n (items) => {\n if (items && items.length > 0 && !props.modelValue && !props.defaultValue && internalValue.value === undefined) {\n internalValue.value = items[0].value\n }\n },\n { immediate: true },\n)\n\nfunction changeTab(value: string) {\n internalValue.value = value\n emit('update:modelValue', value)\n}\n\nconst slotFns = computed(() => tabsVariants({ variant: props.variant }))\n\nuseTabsProvide({\n slotFns,\n orientation: toRef(props, 'orientation'),\n currentValue: internalValue,\n changeTab,\n})\n</script>\n\n<template>\n <TabsRoot\n :model-value=\"internalValue\"\n :orientation=\"props.orientation\"\n :activation-mode=\"props.activationMode\"\n :dir=\"props.dir\"\n :unmount-on-hide=\"props.unmountOnHide\"\n :as=\"props.as\"\n :as-child=\"props.asChild\"\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-orientation=\"props.orientation\"\n @update:model-value=\"changeTab\"\n >\n <template v-if=\"props.items\">\n <TabList>\n <Tab\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >{{ item.label }}</Tab>\n </TabList>\n <TabPanel\n v-for=\"item in props.items\"\n :key=\"item.value\"\n :value=\"item.value\"\n >{{ item.content }}</TabPanel>\n </template>\n <slot v-else />\n </TabsRoot>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,MAAM,QAAQ;EA2Bd,MAAM,OAAO;EAIb,MAAM,gBAAgB,IAAwB,MAAM,cAAc,MAAM,aAAY;AAEpF,cAAY,MAAM,aAAa,MAAM;AACnC,OAAI,MAAM,KAAA,EAAW,eAAc,QAAQ;IAC5C;AAED,cACQ,MAAM,QACX,UAAU;AACT,OAAI,SAAS,MAAM,SAAS,KAAK,CAAC,MAAM,cAAc,CAAC,MAAM,gBAAgB,cAAc,UAAU,KAAA,EACnG,eAAc,QAAQ,MAAM,GAAG;KAGnC,EAAE,WAAW,MAAM,CACrB;EAEA,SAAS,UAAU,OAAe;AAChC,iBAAc,QAAQ;AACtB,QAAK,qBAAqB,MAAK;;EAGjC,MAAM,UAAU,eAAe,aAAa,EAAE,SAAS,MAAM,SAAS,CAAC,CAAA;AAEvE,iBAAe;GACb;GACA,aAAa,MAAM,OAAO,cAAc;GACxC,cAAc;GACd;GACD,CAAA;;uBAIC,YA4BW,MAAA,SAAA,EAAA;IA3BR,eAAa,cAAA;IACb,aAAa,MAAM;IACnB,mBAAiB,MAAM;IACvB,KAAK,MAAM;IACX,mBAAiB,MAAM;IACvB,IAAI,MAAM;IACV,YAAU,MAAM;IAChB,OAAK,eAAE,MAAA,iBAAgB,CAAC,QAAA,MAAQ,MAAI,EAAI,MAAM,OAAO,MAAM,YAAY,KAAI,CAAA;IAC3E,oBAAkB,MAAM;IACxB,uBAAoB;;2BAgBV,CAdK,MAAM,SAAA,WAAA,EAAtB,mBAcW,UAAA,EAAA,KAAA,GAAA,EAAA,CAbT,YAOU,iBAAA,MAAA;4BALqB,EAAA,UAAA,KAAA,EAD7B,mBAKuB,UAAA,MAAA,WAJN,MAAM,QAAd,SAAI;0BADb,YAKuB,aAAA;OAHpB,KAAK,KAAK;OACV,OAAO,KAAK;OACZ,UAAU,KAAK;;8BACD,CAAA,gBAAA,gBAAb,KAAK,MAAK,EAAA,EAAA,CAAA,CAAA;;;;;0BAEhB,mBAI8B,UAAA,MAAA,WAHb,MAAM,QAAd,SAAI;yBADb,YAI8B,kBAAA;MAF3B,KAAK,KAAK;MACV,OAAO,KAAK;;6BACI,CAAA,gBAAA,gBAAf,KAAK,QAAO,EAAA,EAAA,CAAA,CAAA;;;uBAElB,WAAe,KAAA,QAAA,WAAA,EAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeField.js","names":[],"sources":["../../../src/components/time-field/TimeField.vue"],"sourcesContent":["<!--\n TimeField — form-field mirror of Input.vue for @internationalized/date Time values.\n\n Anatomy, data-attributes, floating-label behavior, start/end content\n slots, and a11y wiring all mirror Input.vue / DateInput.vue. See the\n Input.vue docblock for the canonical contract.\n-->\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useAttrs, useId, watch } from 'vue'\nimport { TimeFieldRoot, TimeFieldInput } from 'reka-ui'\nimport type { TimeValue } from 'reka-ui'\nimport { timeFieldVariants, type TimeFieldVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'flat',\n size: 'md',\n color: 'default',\n labelPlacement: 'inside',\n fullWidth: false,\n isInvalid: false,\n isDisabled: false,\n isReadOnly: false,\n isRequired: false,\n granularity: 'minute',\n hideTimeZone: false,\n})\n\nconst modelValue = defineModel<TimeValue | null | undefined>()\n\ntype Props = {\n /** Visual style of the field. @default 'flat' */\n variant?: TimeFieldVariants['variant']\n /** Field height. @default 'md' */\n size?: TimeFieldVariants['size']\n /** Accent color applied to focus ring + floating label. @default 'default' */\n color?: TimeFieldVariants['color']\n /** Label placement relative to the field. @default 'inside' */\n labelPlacement?: TimeFieldVariants['labelPlacement']\n /** Stretches root wrapper to 100% width. @default false */\n fullWidth?: boolean\n /** Marks the field as invalid. @default false */\n isInvalid?: boolean\n /** Disables the field. @default false */\n isDisabled?: boolean\n /** Makes the field read-only. @default false */\n isReadOnly?: boolean\n /** Adds a required asterisk next to the label. @default false */\n isRequired?: boolean\n /** Field label. When omitted, floating-label behavior is skipped. */\n label?: string\n /** Helper text below the field. Suppressed when isInvalid && errorMessage is shown. */\n description?: string\n /** Error text below the field. Only rendered when isInvalid is true. */\n errorMessage?: string\n /** Extra classes merged onto the root wrapper. */\n class?: ClassValue\n /** Per-slot class overrides. */\n classNames?: Partial<{\n base: ClassValue\n label: ClassValue\n mainWrapper: ClassValue\n inputWrapper: ClassValue\n startContent: ClassValue\n segmentList: ClassValue\n segment: ClassValue\n endContent: ClassValue\n helperWrapper: ClassValue\n errorMessage: ClassValue\n description: ClassValue\n }>\n\n /* ─── TimeField-specific ──────────────────────────────────────── */\n defaultValue?: TimeValue\n placeholderValue?: TimeValue\n minValue?: TimeValue\n maxValue?: TimeValue\n granularity?: 'hour' | 'minute' | 'second'\n hourCycle?: 12 | 24\n locale?: string\n name?: string\n hideTimeZone?: boolean\n}\n\nconst attrs = useAttrs()\nconst generatedId = useId()\nconst fieldId = computed(() => (attrs.id as string | undefined) ?? `${generatedId}-field`)\nconst labelId = computed(() => `${generatedId}-label`)\nconst descriptionId = computed(() => `${generatedId}-description`)\nconst errorMessageId = computed(() => `${generatedId}-error`)\n\nconst hasLabel = computed(() => !!props.label)\nconst isFilled = computed(() => modelValue.value != null)\n\nconst showError = computed(() => props.isInvalid && !!props.errorMessage)\nconst showDescription = computed(() => !!props.description && !showError.value)\nconst hasHelper = computed(() => showError.value || showDescription.value)\nconst ariaDescribedBy = computed(() => {\n if (showError.value) return errorMessageId.value\n if (showDescription.value) return descriptionId.value\n return undefined\n})\n\nconst fieldRef = ref<HTMLElement | null>(null)\n// Reka components expose their root DOM node via $el — unwrap before using DOM APIs.\nconst fieldEl = computed<HTMLElement | null>(() => {\n const r = fieldRef.value as unknown as { $el?: HTMLElement } | HTMLElement | null\n if (!r) return null\n if (r instanceof HTMLElement) return r\n return r.$el ?? null\n})\n\n// `isFocused` tracks focus on a TIME SEGMENT specifically — not any descendant.\n// This prevents nested interactive children (e.g. a TimePickerTrigger button in\n// endContent) from flipping the field into the focused visual state.\nconst isFocused = ref(false)\nfunction updateSegmentFocus() {\n const root = fieldEl.value\n if (!root) { isFocused.value = false; return }\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n isFocused.value = !!active\n && root.contains(active)\n && active.hasAttribute('data-reka-time-field-segment')\n}\nfunction onDocFocusIn() { updateSegmentFocus() }\nfunction onDocFocusOut() { queueMicrotask(updateSegmentFocus) }\n\n// Guard against a focus snap-back after an outside click. When the user\n// clicks outside the field, we mark a short-lived \"suppress segment focus\"\n// window. Any focusin landing on a segment inside that window gets blurred\n// immediately — kills the two-click-to-blur UX regardless of which internal\n// mechanism (Reka VisuallyHidden, label-for, contenteditable selection\n// restoration) tried to restore the focus.\nlet suppressSegmentFocusUntil = 0\nfunction onDocPointerDown(e: PointerEvent) {\n const root = fieldEl.value\n if (!root) return\n const target = e.target as Node | null\n if (!target || root.contains(target)) return\n suppressSegmentFocusUntil = performance.now() + 250\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n if (active && root.contains(active) && active.hasAttribute('data-reka-time-field-segment')) {\n active.blur()\n }\n}\nfunction onDocFocusInGuard(e: FocusEvent) {\n if (performance.now() >= suppressSegmentFocusUntil) return\n const root = fieldEl.value\n if (!root) return\n const t = e.target as HTMLElement | null\n if (t && root.contains(t) && t.hasAttribute?.('data-reka-time-field-segment')) {\n t.blur()\n }\n}\n\nonMounted(() => {\n document.addEventListener('focusin', onDocFocusIn)\n document.addEventListener('focusout', onDocFocusOut)\n document.addEventListener('pointerdown', onDocPointerDown, true)\n document.addEventListener('focusin', onDocFocusInGuard, true)\n})\nonBeforeUnmount(() => {\n document.removeEventListener('focusin', onDocFocusIn)\n document.removeEventListener('focusout', onDocFocusOut)\n document.removeEventListener('pointerdown', onDocPointerDown, true)\n document.removeEventListener('focusin', onDocFocusInGuard, true)\n})\n\n// Track data-filled synchronously from the rendered segments — defaultValue +\n// isFilled from modelValue misses the uncontrolled case and the partially-typed\n// case. After each value/segment render, sniff any non-literal segment that\n// carries data-placeholder=\"false\".\nconst segmentsFilled = ref(false)\nfunction recomputeFilled() {\n const root = fieldEl.value\n if (!root || typeof root.querySelectorAll !== 'function') {\n segmentsFilled.value = false\n return\n }\n const segs = root.querySelectorAll('[data-reka-time-field-segment]:not([data-reka-time-field-segment=\"literal\"])')\n let anyFilled = false\n segs.forEach((el) => {\n if ((el as HTMLElement).dataset.placeholder === 'false') anyFilled = true\n })\n segmentsFilled.value = anyFilled\n}\nwatch([modelValue, () => props.defaultValue, () => props.granularity, () => props.hourCycle], () => {\n queueMicrotask(recomputeFilled)\n}, { immediate: true })\n\nconst effectiveFilled = computed(() => isFilled.value || segmentsFilled.value)\n\n// Only intervene on the INITIAL click that enters the field. Once a segment\n// already holds focus, leave subsequent mousedowns alone so the user can\n// blur naturally (clicking elsewhere) without focus snapping back to a\n// segment and requiring a second click.\nfunction handleFieldMousedown(e: MouseEvent) {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (target.closest('[data-reka-time-field-segment]')) return\n if (target.closest('[data-slot=\"start-content\"]')) return\n if (target.closest('[data-slot=\"end-content\"]')) return\n if (target.closest('button, [role=\"button\"]')) return\n const root = fieldEl.value\n if (!root) return\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n if (active && root.contains(active) && active.hasAttribute('data-reka-time-field-segment')) {\n return\n }\n const first = root.querySelector<HTMLElement>(\n '[data-reka-time-field-segment]:not([data-reka-time-field-segment=\"literal\"])',\n )\n if (first) {\n e.preventDefault()\n first.focus()\n }\n}\n\nconst slotFns = computed(() =>\n timeFieldVariants({\n variant: props.variant,\n size: props.size,\n color: props.color,\n fullWidth: props.fullWidth,\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isReadonly: props.isReadOnly,\n hasLabel: hasLabel.value,\n labelPlacement: props.labelPlacement,\n }),\n)\n\nconst showOutsideLabel = computed(\n () => hasLabel.value && props.labelPlacement !== 'inside',\n)\nconst showInsideLabel = computed(\n () => hasLabel.value && props.labelPlacement === 'inside',\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-invalid=\"isInvalid || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-readonly=\"isReadOnly || undefined\"\n :data-required=\"isRequired || undefined\"\n :data-has-label=\"hasLabel || undefined\"\n :data-has-helper=\"hasHelper || undefined\"\n >\n <label\n v-if=\"showOutsideLabel\"\n :id=\"labelId\"\n :for=\"fieldId\"\n :class=\"composeClassName(slotFns.label(), props.classNames?.label)\"\n >{{ label }}<span\n v-if=\"isRequired\"\n aria-hidden=\"true\"\n > *</span></label>\n\n <div :class=\"composeClassName(slotFns.mainWrapper(), props.classNames?.mainWrapper)\">\n <TimeFieldRoot\n :id=\"fieldId\"\n ref=\"fieldRef\"\n v-model=\"modelValue\"\n :default-value=\"defaultValue\"\n :placeholder=\"placeholderValue\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"granularity\"\n :hour-cycle=\"hourCycle\"\n :locale=\"locale\"\n :disabled=\"isDisabled\"\n :readonly=\"isReadOnly\"\n :name=\"name\"\n :hide-time-zone=\"hideTimeZone\"\n :aria-labelledby=\"hasLabel ? labelId : undefined\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-required=\"isRequired || undefined\"\n :aria-invalid=\"isInvalid || undefined\"\n :class=\"composeClassName(slotFns.inputWrapper(), props.classNames?.inputWrapper)\"\n :data-filled=\"hasLabel ? (effectiveFilled || undefined) : undefined\"\n :data-focused=\"isFocused || undefined\"\n :data-invalid=\"isInvalid || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-readonly=\"isReadOnly || undefined\"\n @mousedown=\"handleFieldMousedown\"\n >\n <template #default=\"{ segments }\">\n <label\n v-if=\"showInsideLabel\"\n :id=\"labelId\"\n :for=\"fieldId\"\n :class=\"composeClassName(slotFns.label(), props.classNames?.label)\"\n >{{ label }}<span\n v-if=\"isRequired\"\n aria-hidden=\"true\"\n > *</span></label>\n\n <span\n v-if=\"$slots.startContent\"\n :class=\"composeClassName(slotFns.startContent(), props.classNames?.startContent)\"\n data-slot=\"start-content\"\n >\n <slot name=\"startContent\" />\n </span>\n\n <div\n :class=\"composeClassName(slotFns.segmentList(), props.classNames?.segmentList)\"\n data-slot=\"segment-list\"\n >\n <template\n v-for=\"(segment, _i) in segments\"\n :key=\"_i\"\n >\n <TimeFieldInput\n :part=\"segment.part\"\n :class=\"composeClassName(slotFns.segment(), props.classNames?.segment)\"\n >\n {{ segment.value }}\n </TimeFieldInput>\n </template>\n </div>\n\n <span\n v-if=\"$slots.endContent\"\n :class=\"composeClassName(slotFns.endContent(), props.classNames?.endContent)\"\n data-slot=\"end-content\"\n >\n <slot name=\"endContent\" />\n </span>\n </template>\n </TimeFieldRoot>\n\n <div\n v-if=\"hasHelper\"\n :class=\"composeClassName(slotFns.helperWrapper(), props.classNames?.helperWrapper)\"\n >\n <div\n v-if=\"showError\"\n :id=\"errorMessageId\"\n :class=\"composeClassName(slotFns.errorMessage(), props.classNames?.errorMessage)\"\n role=\"alert\"\n >\n {{ errorMessage }}\n </div>\n <div\n v-else-if=\"showDescription\"\n :id=\"descriptionId\"\n :class=\"composeClassName(slotFns.description(), props.classNames?.description)\"\n >\n {{ description }}\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TimeField.js","names":[],"sources":["../../../src/components/time-field/TimeField.vue"],"sourcesContent":["<!--\n TimeField — form-field mirror of Input.vue for @internationalized/date Time values.\n\n Anatomy, data-attributes, floating-label behavior, start/end content\n slots, and a11y wiring all mirror Input.vue / DateInput.vue. See the\n Input.vue docblock for the canonical contract.\n-->\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, useAttrs, useId, watch } from 'vue'\nimport { TimeFieldRoot, TimeFieldInput } from 'reka-ui'\nimport type { TimeValue } from 'reka-ui'\nimport { timeFieldVariants, type TimeFieldVariants } from '@auronui/styles'\nimport { composeClassName , type ClassValue} from '../../utils/composeClassName'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'flat',\n size: 'md',\n color: 'default',\n labelPlacement: 'inside',\n fullWidth: false,\n isInvalid: false,\n isDisabled: false,\n isReadOnly: false,\n isRequired: false,\n granularity: 'minute',\n hideTimeZone: false,\n})\n\nconst modelValue = defineModel<TimeValue | null | undefined>()\n\ntype Props = {\n /** Visual style of the field. @default 'flat' */\n variant?: TimeFieldVariants['variant']\n /** Field height. @default 'md' */\n size?: TimeFieldVariants['size']\n /** Accent color applied to focus ring + floating label. @default 'default' */\n color?: TimeFieldVariants['color']\n /** Label placement relative to the field. @default 'inside' */\n labelPlacement?: TimeFieldVariants['labelPlacement']\n /** Stretches root wrapper to 100% width. @default false */\n fullWidth?: boolean\n /** Marks the field as invalid. @default false */\n isInvalid?: boolean\n /** Disables the field. @default false */\n isDisabled?: boolean\n /** Makes the field read-only. @default false */\n isReadOnly?: boolean\n /** Adds a required asterisk next to the label. @default false */\n isRequired?: boolean\n /** Field label. When omitted, floating-label behavior is skipped. */\n label?: string\n /** Helper text below the field. Suppressed when isInvalid && errorMessage is shown. */\n description?: string\n /** Error text below the field. Only rendered when isInvalid is true. */\n errorMessage?: string\n /** Extra classes merged onto the root wrapper. */\n class?: ClassValue\n /** Per-slot class overrides. */\n classNames?: Partial<{\n base: ClassValue\n label: ClassValue\n mainWrapper: ClassValue\n inputWrapper: ClassValue\n startContent: ClassValue\n segmentList: ClassValue\n segment: ClassValue\n endContent: ClassValue\n helperWrapper: ClassValue\n errorMessage: ClassValue\n description: ClassValue\n }>\n\n /* ─── TimeField-specific ──────────────────────────────────────── */\n defaultValue?: TimeValue\n defaultPlaceholder?: TimeValue\n placeholderValue?: TimeValue\n minValue?: TimeValue\n maxValue?: TimeValue\n granularity?: 'hour' | 'minute' | 'second'\n hourCycle?: 12 | 24\n /** Steps for segment keyboard navigation. */\n step?: Partial<Record<'hour' | 'minute' | 'second' | 'millisecond', number>>\n /** Enable step snapping behavior. */\n stepSnapping?: boolean\n locale?: string\n name?: string\n hideTimeZone?: boolean\n /** Marks the field as required for form submission. */\n required?: boolean\n /** Text direction for the field. */\n dir?: 'ltr' | 'rtl'\n /** Render root as a different element or component. */\n as?: string\n /** Render root child as root element. */\n asChild?: boolean\n}\n\nconst attrs = useAttrs()\nconst generatedId = useId()\nconst fieldId = computed(() => (attrs.id as string | undefined) ?? `${generatedId}-field`)\nconst labelId = computed(() => `${generatedId}-label`)\nconst descriptionId = computed(() => `${generatedId}-description`)\nconst errorMessageId = computed(() => `${generatedId}-error`)\n\nconst hasLabel = computed(() => !!props.label)\nconst isFilled = computed(() => modelValue.value != null)\n\nconst showError = computed(() => props.isInvalid && !!props.errorMessage)\nconst showDescription = computed(() => !!props.description && !showError.value)\nconst hasHelper = computed(() => showError.value || showDescription.value)\nconst ariaDescribedBy = computed(() => {\n if (showError.value) return errorMessageId.value\n if (showDescription.value) return descriptionId.value\n return undefined\n})\n\nconst fieldRef = ref<HTMLElement | null>(null)\n// Reka components expose their root DOM node via $el — unwrap before using DOM APIs.\nconst fieldEl = computed<HTMLElement | null>(() => {\n const r = fieldRef.value as unknown as { $el?: HTMLElement } | HTMLElement | null\n if (!r) return null\n if (r instanceof HTMLElement) return r\n return r.$el ?? null\n})\n\n// `isFocused` tracks focus on a TIME SEGMENT specifically — not any descendant.\n// This prevents nested interactive children (e.g. a TimePickerTrigger button in\n// endContent) from flipping the field into the focused visual state.\nconst isFocused = ref(false)\nfunction updateSegmentFocus() {\n const root = fieldEl.value\n if (!root) { isFocused.value = false; return }\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n isFocused.value = !!active\n && root.contains(active)\n && active.hasAttribute('data-reka-time-field-segment')\n}\nfunction onDocFocusIn() { updateSegmentFocus() }\nfunction onDocFocusOut() { queueMicrotask(updateSegmentFocus) }\n\n// Guard against a focus snap-back after an outside click. When the user\n// clicks outside the field, we mark a short-lived \"suppress segment focus\"\n// window. Any focusin landing on a segment inside that window gets blurred\n// immediately — kills the two-click-to-blur UX regardless of which internal\n// mechanism (Reka VisuallyHidden, label-for, contenteditable selection\n// restoration) tried to restore the focus.\nlet suppressSegmentFocusUntil = 0\nfunction onDocPointerDown(e: PointerEvent) {\n const root = fieldEl.value\n if (!root) return\n const target = e.target as Node | null\n if (!target || root.contains(target)) return\n suppressSegmentFocusUntil = performance.now() + 250\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n if (active && root.contains(active) && active.hasAttribute('data-reka-time-field-segment')) {\n active.blur()\n }\n}\nfunction onDocFocusInGuard(e: FocusEvent) {\n if (performance.now() >= suppressSegmentFocusUntil) return\n const root = fieldEl.value\n if (!root) return\n const t = e.target as HTMLElement | null\n if (t && root.contains(t) && t.hasAttribute?.('data-reka-time-field-segment')) {\n t.blur()\n }\n}\n\nonMounted(() => {\n document.addEventListener('focusin', onDocFocusIn)\n document.addEventListener('focusout', onDocFocusOut)\n document.addEventListener('pointerdown', onDocPointerDown, true)\n document.addEventListener('focusin', onDocFocusInGuard, true)\n})\nonBeforeUnmount(() => {\n document.removeEventListener('focusin', onDocFocusIn)\n document.removeEventListener('focusout', onDocFocusOut)\n document.removeEventListener('pointerdown', onDocPointerDown, true)\n document.removeEventListener('focusin', onDocFocusInGuard, true)\n})\n\n// Track data-filled synchronously from the rendered segments — defaultValue +\n// isFilled from modelValue misses the uncontrolled case and the partially-typed\n// case. After each value/segment render, sniff any non-literal segment that\n// carries data-placeholder=\"false\".\nconst segmentsFilled = ref(false)\nfunction recomputeFilled() {\n const root = fieldEl.value\n if (!root || typeof root.querySelectorAll !== 'function') {\n segmentsFilled.value = false\n return\n }\n const segs = root.querySelectorAll('[data-reka-time-field-segment]:not([data-reka-time-field-segment=\"literal\"])')\n let anyFilled = false\n segs.forEach((el) => {\n if ((el as HTMLElement).dataset.placeholder === 'false') anyFilled = true\n })\n segmentsFilled.value = anyFilled\n}\nwatch([modelValue, () => props.defaultValue, () => props.granularity, () => props.hourCycle], () => {\n queueMicrotask(recomputeFilled)\n}, { immediate: true })\n\nconst effectiveFilled = computed(() => isFilled.value || segmentsFilled.value)\n\n// Only intervene on the INITIAL click that enters the field. Once a segment\n// already holds focus, leave subsequent mousedowns alone so the user can\n// blur naturally (clicking elsewhere) without focus snapping back to a\n// segment and requiring a second click.\nfunction handleFieldMousedown(e: MouseEvent) {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (target.closest('[data-reka-time-field-segment]')) return\n if (target.closest('[data-slot=\"start-content\"]')) return\n if (target.closest('[data-slot=\"end-content\"]')) return\n if (target.closest('button, [role=\"button\"]')) return\n const root = fieldEl.value\n if (!root) return\n const active = (root.ownerDocument ?? document).activeElement as HTMLElement | null\n if (active && root.contains(active) && active.hasAttribute('data-reka-time-field-segment')) {\n return\n }\n const first = root.querySelector<HTMLElement>(\n '[data-reka-time-field-segment]:not([data-reka-time-field-segment=\"literal\"])',\n )\n if (first) {\n e.preventDefault()\n first.focus()\n }\n}\n\nconst slotFns = computed(() =>\n timeFieldVariants({\n variant: props.variant,\n size: props.size,\n color: props.color,\n fullWidth: props.fullWidth,\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n isReadonly: props.isReadOnly,\n hasLabel: hasLabel.value,\n labelPlacement: props.labelPlacement,\n }),\n)\n\nconst showOutsideLabel = computed(\n () => hasLabel.value && props.labelPlacement !== 'inside',\n)\nconst showInsideLabel = computed(\n () => hasLabel.value && props.labelPlacement === 'inside',\n)\n</script>\n\n<template>\n <div\n :class=\"composeClassName(slotFns.base(), props.class, props.classNames?.base)\"\n :data-invalid=\"isInvalid || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-readonly=\"isReadOnly || undefined\"\n :data-required=\"isRequired || undefined\"\n :data-has-label=\"hasLabel || undefined\"\n :data-has-helper=\"hasHelper || undefined\"\n >\n <label\n v-if=\"showOutsideLabel\"\n :id=\"labelId\"\n :for=\"fieldId\"\n :class=\"composeClassName(slotFns.label(), props.classNames?.label)\"\n >{{ label }}<span\n v-if=\"isRequired\"\n aria-hidden=\"true\"\n > *</span></label>\n\n <div :class=\"composeClassName(slotFns.mainWrapper(), props.classNames?.mainWrapper)\">\n <TimeFieldRoot\n :id=\"fieldId\"\n ref=\"fieldRef\"\n v-model=\"modelValue\"\n :default-value=\"defaultValue\"\n :default-placeholder=\"defaultPlaceholder\"\n :placeholder=\"placeholderValue\"\n :min-value=\"minValue\"\n :max-value=\"maxValue\"\n :granularity=\"granularity\"\n :hour-cycle=\"hourCycle\"\n :step=\"step\"\n :step-snapping=\"stepSnapping\"\n :locale=\"locale\"\n :disabled=\"isDisabled\"\n :readonly=\"isReadOnly\"\n :name=\"name\"\n :hide-time-zone=\"hideTimeZone\"\n :required=\"required\"\n :dir=\"dir\"\n :as=\"as\"\n :as-child=\"asChild\"\n :aria-labelledby=\"hasLabel ? labelId : undefined\"\n :aria-describedby=\"ariaDescribedBy\"\n :aria-required=\"isRequired || undefined\"\n :aria-invalid=\"isInvalid || undefined\"\n :class=\"composeClassName(slotFns.inputWrapper(), props.classNames?.inputWrapper)\"\n :data-filled=\"hasLabel ? (effectiveFilled || undefined) : undefined\"\n :data-focused=\"isFocused || undefined\"\n :data-invalid=\"isInvalid || undefined\"\n :data-disabled=\"isDisabled || undefined\"\n :data-readonly=\"isReadOnly || undefined\"\n @mousedown=\"handleFieldMousedown\"\n >\n <template #default=\"{ segments }\">\n <label\n v-if=\"showInsideLabel\"\n :id=\"labelId\"\n :for=\"fieldId\"\n :class=\"composeClassName(slotFns.label(), props.classNames?.label)\"\n >{{ label }}<span\n v-if=\"isRequired\"\n aria-hidden=\"true\"\n > *</span></label>\n\n <span\n v-if=\"$slots.startContent\"\n :class=\"composeClassName(slotFns.startContent(), props.classNames?.startContent)\"\n data-slot=\"start-content\"\n >\n <slot name=\"startContent\" />\n </span>\n\n <div\n :class=\"composeClassName(slotFns.segmentList(), props.classNames?.segmentList)\"\n data-slot=\"segment-list\"\n >\n <template\n v-for=\"(segment, _i) in segments\"\n :key=\"_i\"\n >\n <TimeFieldInput\n :part=\"segment.part\"\n :class=\"composeClassName(slotFns.segment(), props.classNames?.segment)\"\n >\n {{ segment.value }}\n </TimeFieldInput>\n </template>\n </div>\n\n <span\n v-if=\"$slots.endContent\"\n :class=\"composeClassName(slotFns.endContent(), props.classNames?.endContent)\"\n data-slot=\"end-content\"\n >\n <slot name=\"endContent\" />\n </span>\n </template>\n </TimeFieldRoot>\n\n <div\n v-if=\"hasHelper\"\n :class=\"composeClassName(slotFns.helperWrapper(), props.classNames?.helperWrapper)\"\n >\n <div\n v-if=\"showError\"\n :id=\"errorMessageId\"\n :class=\"composeClassName(slotFns.errorMessage(), props.classNames?.errorMessage)\"\n role=\"alert\"\n >\n {{ errorMessage }}\n </div>\n <div\n v-else-if=\"showDescription\"\n :id=\"descriptionId\"\n :class=\"composeClassName(slotFns.description(), props.classNames?.description)\"\n >\n {{ description }}\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}