@rotki/ui-library 2.27.0 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +36 -15
  2. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +0 -4
  4. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +9 -10
  5. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
  7. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +16 -3
  8. package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/alerts/RuiAlert.js.map +1 -1
  10. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +43 -212
  11. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/avatars/RuiAvatar.js.map +1 -1
  13. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +22 -32
  14. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  15. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  16. package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +6 -0
  17. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +17 -13
  18. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/avatars/avatar-props.d.ts +16 -3
  20. package/dist/components/avatars/avatar-props.js +42 -5
  21. package/dist/components/avatars/avatar-props.js.map +1 -1
  22. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  23. package/dist/components/buttons/button/RuiButton.vue.d.ts +0 -1
  24. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +39 -26
  25. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/components/buttons/button/button-props.d.ts +0 -2
  27. package/dist/components/buttons/button/button-props.js +5 -5
  28. package/dist/components/buttons/button/button-props.js.map +1 -1
  29. package/dist/components/buttons/button/button-styles.d.ts +4 -1
  30. package/dist/components/buttons/button/button-styles.js +136 -55
  31. package/dist/components/buttons/button/button-styles.js.map +1 -1
  32. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  33. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +8 -2
  34. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +66 -97
  35. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/buttons/button-group/button-group-context.d.ts +28 -0
  37. package/dist/components/buttons/button-group/button-group-context.js +22 -0
  38. package/dist/components/buttons/button-group/button-group-context.js.map +1 -0
  39. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  40. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +6 -3
  41. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  43. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +12 -8
  44. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
  46. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +21 -22
  47. package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  49. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +17 -21
  50. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  51. package/dist/components/cards/RuiCard.js.map +1 -1
  52. package/dist/components/cards/RuiCard.vue.d.ts +0 -3
  53. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +31 -19
  54. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  56. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +13 -25
  57. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/chips/RuiChip.js.map +1 -1
  59. package/dist/components/chips/RuiChip.vue.d.ts +5 -2
  60. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +127 -78
  61. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/chips/chip-props.d.ts +2 -0
  63. package/dist/components/chips/chip-props.js +5 -3
  64. package/dist/components/chips/chip-props.js.map +1 -1
  65. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  66. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +5 -5
  67. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
  69. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  70. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -2
  71. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/color-picker/RuiColorInput.js.map +1 -1
  73. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +46 -36
  74. package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  76. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +4 -5
  77. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  79. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +3 -2
  80. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +81 -80
  81. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  83. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +2 -2
  84. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  85. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  86. package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +4 -3
  87. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +3 -3
  88. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  89. package/dist/components/date-time-picker/date-time-picker-styles.d.ts +128 -219
  90. package/dist/components/date-time-picker/date-time-picker-styles.js +1 -2
  91. package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
  92. package/dist/components/date-time-picker/use-date-bounds.js +1 -1
  93. package/dist/components/date-time-picker/use-date-time-selection.js +65 -66
  94. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  95. package/dist/components/date-time-picker/use-input-handler.js +1 -1
  96. package/dist/components/date-time-picker/use-keyboard-handler.js +29 -30
  97. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  98. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  99. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -68
  100. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +203 -198
  101. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -1
  103. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +1 -0
  104. package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
  106. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +2 -0
  107. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +8 -3
  108. package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
  110. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +4 -0
  111. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +24 -10
  112. package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
  113. package/dist/components/forms/auto-complete/auto-complete-props.d.ts +66 -0
  114. package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +128 -218
  115. package/dist/components/forms/auto-complete/auto-complete-styles.js +4 -2
  116. package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
  117. package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
  118. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +3 -6
  119. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +154 -154
  120. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/forms/category-picker/category-picker-styles.d.ts +83 -232
  122. package/dist/components/forms/category-picker/category-picker-styles.js +20 -26
  123. package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
  124. package/dist/components/forms/check-control-styles.d.ts +61 -2
  125. package/dist/components/forms/check-control-styles.js +53 -46
  126. package/dist/components/forms/check-control-styles.js.map +1 -1
  127. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  128. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +32 -19
  129. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
  131. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -4
  132. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/forms/field-defaults/RuiFieldDefaults.js +7 -0
  134. package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -0
  135. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue.d.ts +16 -0
  136. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js +18 -0
  137. package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/forms/field-label/RuiFieldLabel.js +7 -0
  139. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -0
  140. package/dist/components/forms/field-label/RuiFieldLabel.vue.d.ts +17 -0
  141. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +57 -0
  142. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  143. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
  144. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +1 -1
  145. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +56 -35
  146. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  147. package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
  148. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +14 -15
  149. package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
  151. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +3 -3
  152. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  153. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
  154. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +6 -6
  155. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  157. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +3 -12
  158. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +61 -56
  159. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  161. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +0 -1
  162. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +13 -20
  163. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/components/forms/select/menu-select-styles.d.ts +99 -221
  165. package/dist/components/forms/select/menu-select-styles.js +1 -4
  166. package/dist/components/forms/select/menu-select-styles.js.map +1 -1
  167. package/dist/components/forms/slider/RuiSlider.js.map +1 -1
  168. package/dist/components/forms/slider/RuiSlider.vue.d.ts +0 -4
  169. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +129 -106
  170. package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/forms/slider/slider-styles.d.ts +40 -40
  172. package/dist/components/forms/slider/slider-styles.js +67 -109
  173. package/dist/components/forms/slider/slider-styles.js.map +1 -1
  174. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  175. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +33 -45
  176. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
  178. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +3 -2
  179. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +138 -117
  180. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/components/forms/text-area/text-area-styles.d.ts +41 -115
  182. package/dist/components/forms/text-area/text-area-styles.js +34 -194
  183. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  184. package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
  185. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +5 -2
  186. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +112 -105
  187. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  188. package/dist/components/forms/text-field/text-field-styles.d.ts +37 -145
  189. package/dist/components/forms/text-field/text-field-styles.js +24 -267
  190. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  191. package/dist/components/forms/text-input-styles.d.ts +98 -229
  192. package/dist/components/forms/text-input-styles.js +63 -193
  193. package/dist/components/forms/text-input-styles.js.map +1 -1
  194. package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
  195. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +11 -1
  196. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +5 -5
  197. package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/icons/RuiIcon.js.map +1 -1
  199. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +7 -4
  200. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/index.d.ts +5 -3
  202. package/dist/components/index.js +4 -3
  203. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  204. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +6 -5
  205. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  206. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  207. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +8 -8
  208. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  209. package/dist/components/logos/RuiLogo.js.map +1 -1
  210. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +2 -2
  211. package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
  212. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  213. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +76 -48
  214. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  216. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +3 -2
  217. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +17 -13
  218. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  220. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -7
  221. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +33 -29
  222. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  223. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  224. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +6 -2
  225. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +49 -25
  226. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  227. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  228. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +7 -8
  229. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  231. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +0 -5
  232. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +17 -11
  233. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  234. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +5 -12
  235. package/dist/components/overlays/tooltip/tooltip-styles.js +11 -18
  236. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  237. package/dist/components/progress/RuiProgress.js.map +1 -1
  238. package/dist/components/progress/RuiProgress.vue.d.ts +4 -0
  239. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +73 -47
  240. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  242. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +28 -29
  243. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  244. package/dist/components/steppers/RuiStepper.js.map +1 -1
  245. package/dist/components/steppers/RuiStepper.vue.d.ts +0 -4
  246. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +36 -29
  247. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  248. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  249. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +2 -0
  250. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +47 -47
  251. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  252. package/dist/components/tables/RuiDataTable.js.map +1 -1
  253. package/dist/components/tables/RuiDataTable.vue.d.ts +3 -6
  254. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +85 -67
  255. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  256. package/dist/components/tables/RuiExpandButton.js.map +1 -1
  257. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -0
  258. package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  259. package/dist/components/tables/RuiTable.js.map +1 -1
  260. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +8 -5
  261. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  262. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  263. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
  264. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  265. package/dist/components/tables/RuiTableHead.js.map +1 -1
  266. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +89 -67
  267. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  268. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  269. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +9 -12
  270. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +1 -1
  272. package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
  273. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +3 -3
  274. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  275. package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
  276. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +8 -4
  277. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
  279. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +2 -2
  280. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  281. package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
  282. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +47 -8
  283. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/components/tables/data-table-styles.d.ts +24 -0
  285. package/dist/components/tables/data-table-styles.js +35 -20
  286. package/dist/components/tables/data-table-styles.js.map +1 -1
  287. package/dist/components/tables/table_no_data_placeholder.js +1 -1
  288. package/dist/components/tables/table_no_data_placeholder.js.map +1 -1
  289. package/dist/components/tables/table_no_data_placeholder_dark.js +1 -1
  290. package/dist/components/tables/table_no_data_placeholder_dark.js.map +1 -1
  291. package/dist/components/tables/use-pagination-navigation.js +1 -1
  292. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  293. package/dist/components/tabs/tab/RuiTab.vue.d.ts +2 -5
  294. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +95 -69
  295. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  296. package/dist/components/tabs/tab/use-tab-link.js +1 -1
  297. package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
  298. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +0 -1
  299. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +5 -11
  300. package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  301. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  302. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +8 -13
  303. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  304. package/dist/components/tabs/tab-props.d.ts +7 -1
  305. package/dist/components/tabs/tab-props.js +7 -1
  306. package/dist/components/tabs/tab-props.js.map +1 -1
  307. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  308. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +2 -1
  309. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +188 -43
  310. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  311. package/dist/components/tabs/tabs/use-tab-indicator.d.ts +27 -0
  312. package/dist/components/tabs/tabs/use-tab-indicator.js +67 -0
  313. package/dist/components/tabs/tabs/use-tab-indicator.js.map +1 -0
  314. package/dist/components/tabs/tabs/use-tab-keyboard.d.ts +17 -0
  315. package/dist/components/tabs/tabs/use-tab-keyboard.js +57 -0
  316. package/dist/components/tabs/tabs/use-tab-keyboard.js.map +1 -0
  317. package/dist/components/tabs/tabs/use-tab-routing.js +1 -2
  318. package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
  319. package/dist/components/tabs/tabs/use-tab-scroll.js +15 -15
  320. package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
  321. package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
  322. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +95 -93
  323. package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  324. package/dist/components/time-picker/time-picker-styles.d.ts +18 -0
  325. package/dist/components/time-picker/time-picker-styles.js +16 -10
  326. package/dist/components/time-picker/time-picker-styles.js.map +1 -1
  327. package/dist/composables/breakpoint.js +3 -3
  328. package/dist/composables/breakpoint.js.map +1 -1
  329. package/dist/composables/defaults/field.d.ts +22 -0
  330. package/dist/composables/defaults/field.js +29 -0
  331. package/dist/composables/defaults/field.js.map +1 -0
  332. package/dist/composables/dropdown-menu.d.ts +23 -11
  333. package/dist/composables/dropdown-menu.js +44 -34
  334. package/dist/composables/dropdown-menu.js.map +1 -1
  335. package/dist/composables/floating.d.ts +1 -3
  336. package/dist/composables/floating.js +16 -13
  337. package/dist/composables/floating.js.map +1 -1
  338. package/dist/composables/forms/auto-complete/chips.d.ts +22 -0
  339. package/dist/composables/forms/auto-complete/chips.js +42 -0
  340. package/dist/composables/forms/auto-complete/chips.js.map +1 -0
  341. package/dist/composables/forms/auto-complete/combobox.d.ts +25 -0
  342. package/dist/composables/forms/auto-complete/combobox.js +35 -0
  343. package/dist/composables/forms/auto-complete/combobox.js.map +1 -0
  344. package/dist/composables/forms/auto-complete/focus.d.ts +5 -2
  345. package/dist/composables/forms/auto-complete/focus.js +44 -19
  346. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  347. package/dist/composables/forms/auto-complete/index.d.ts +3 -0
  348. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -1
  349. package/dist/composables/forms/auto-complete/keyboard-navigation.js +49 -21
  350. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  351. package/dist/composables/forms/auto-complete/search.js +6 -7
  352. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  353. package/dist/composables/forms/auto-complete/selection.d.ts +37 -0
  354. package/dist/composables/forms/auto-complete/selection.js +60 -0
  355. package/dist/composables/forms/auto-complete/selection.js.map +1 -0
  356. package/dist/composables/forms/auto-complete/value.js +20 -1
  357. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  358. package/dist/composables/forms/category-picker/use-category-picker.js +1 -1
  359. package/dist/composables/forms/use-prepend-append-width.js +6 -6
  360. package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
  361. package/dist/composables/keyboard-scroll.d.ts +17 -0
  362. package/dist/composables/keyboard-scroll.js +58 -0
  363. package/dist/composables/keyboard-scroll.js.map +1 -0
  364. package/dist/composables/overlay-stack.js +1 -1
  365. package/dist/composables/sticky-header.d.ts +8 -0
  366. package/dist/composables/sticky-header.js +21 -10
  367. package/dist/composables/sticky-header.js.map +1 -1
  368. package/dist/composables/tables/data-table/columns.js +1 -1
  369. package/dist/composables/tables/data-table/expansion.js +1 -1
  370. package/dist/composables/tables/data-table/grouping.js +27 -28
  371. package/dist/composables/tables/data-table/grouping.js.map +1 -1
  372. package/dist/composables/tables/data-table/page-scroll.d.ts +32 -0
  373. package/dist/composables/tables/data-table/page-scroll.js +144 -0
  374. package/dist/composables/tables/data-table/page-scroll.js.map +1 -0
  375. package/dist/composables/tables/data-table/pagination.js +1 -1
  376. package/dist/composables/tables/data-table/selection.js +37 -38
  377. package/dist/composables/tables/data-table/selection.js.map +1 -1
  378. package/dist/composables/tables/data-table/sort.js +1 -1
  379. package/dist/composables/theme.js +12 -12
  380. package/dist/composables/theme.js.map +1 -1
  381. package/dist/composables/timeout-manager.js +1 -1
  382. package/dist/consts/colors.d.ts +4 -0
  383. package/dist/consts/colors.js +1 -37
  384. package/dist/consts/colors.js.map +1 -1
  385. package/dist/consts/tokens.d.ts +56 -0
  386. package/dist/consts/tokens.js +46 -0
  387. package/dist/consts/tokens.js.map +1 -0
  388. package/dist/consts/typography.d.ts +51 -18
  389. package/dist/index.d.ts +7 -2
  390. package/dist/index.js +10 -6
  391. package/dist/index.js.map +1 -1
  392. package/dist/library-icons.json +0 -10
  393. package/dist/style.css +5629 -4678
  394. package/dist/styles/colors.css +315 -0
  395. package/dist/styles/tokens.css +50 -0
  396. package/dist/tailwind.css +145 -0
  397. package/dist/theme/theme.css +403 -0
  398. package/dist/theme.css +403 -0
  399. package/dist/types/dom.d.ts +9 -0
  400. package/dist/types/theme.d.ts +2 -3
  401. package/dist/types/theme.js.map +1 -1
  402. package/dist/utils/form-text-detail.js +1 -1
  403. package/dist/utils/helpers.d.ts +0 -8
  404. package/dist/utils/helpers.js +1 -2
  405. package/dist/utils/helpers.js.map +1 -1
  406. package/dist/utils/tv.js +13 -21
  407. package/dist/utils/tv.js.map +1 -1
  408. package/dist/vendor/@vueuse/core/dist/index.js +1577 -0
  409. package/dist/vendor/@vueuse/core/dist/index.js.map +1 -0
  410. package/dist/vendor/@vueuse/shared/dist/index.js +563 -0
  411. package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -0
  412. package/dist/vite-plugin/index.js +5 -6
  413. package/dist/vite-plugin/index.js.map +1 -1
  414. package/dist/web-types.json +278 -403
  415. package/package.json +17 -19
  416. package/dist/components/icons/LazyIcon.vue.d.ts +0 -8
  417. package/dist/components/steppers/RuiStepperCustomIcon.js +0 -7
  418. package/dist/components/steppers/RuiStepperCustomIcon.js.map +0 -1
  419. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +0 -8
  420. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +0 -43
  421. package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +0 -1
  422. package/dist/composables/colors/common.d.ts +0 -20
  423. package/dist/composables/colors/index.d.ts +0 -3
  424. package/dist/composables/colors/text-input.d.ts +0 -27
  425. package/dist/composables/forms/use-label-with-quote.d.ts +0 -2
  426. package/dist/composables/popper.d.ts +0 -16
  427. package/dist/composables/popper.js +0 -23
  428. package/dist/composables/popper.js.map +0 -1
  429. package/dist/consts/forms/auto-complete/index.d.ts +0 -4
  430. package/dist/theme/index.d.ts +0 -5
  431. package/dist/theme/index.js +0 -162
  432. package/dist/theme/index.js.map +0 -1
  433. package/dist/utils/forms/auto-complete/index.d.ts +0 -2
@@ -1,14 +1,18 @@
1
+ import { get, set, watchImmediate } from "../../../vendor/@vueuse/shared/dist/index.js";
1
2
  import { tv } from "../../../utils/tv.js";
2
3
  import RuiIcon_default from "../../icons/RuiIcon.js";
3
4
  import RuiButton_default from "../../buttons/button/RuiButton.js";
4
- import { TabLayout } from "../tab-props.js";
5
+ import { useKeyboardScroll } from "../../../composables/keyboard-scroll.js";
6
+ import { TabLayout, TabVariant } from "../tab-props.js";
7
+ import { useTabIndicator } from "./use-tab-indicator.js";
8
+ import { useTabKeyboard } from "./use-tab-keyboard.js";
5
9
  import { useTabRouting } from "./use-tab-routing.js";
6
10
  import { useTabScroll } from "./use-tab-scroll.js";
7
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isVNode, mergeModels, normalizeClass, onMounted, openBlock, ref, renderList, resolveDynamicComponent, unref, useModel, useSlots, useTemplateRef, watch, withCtx } from "vue";
8
- import { watchImmediate } from "@vueuse/core";
9
- import { get as get$1, set as set$1 } from "@vueuse/shared";
11
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isVNode, mergeModels, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, resolveDynamicComponent, unref, useModel, useSlots, useTemplateRef, watch, withCtx } from "vue";
10
12
  //#region src/components/tabs/tabs/RuiTabs.vue?vue&type=script&setup=true&lang.ts
11
13
  var _hoisted_1 = ["data-vertical"];
14
+ var _hoisted_2 = ["tabindex"];
15
+ var _hoisted_3 = ["aria-orientation"];
12
16
  var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
13
17
  name: "RuiTabs",
14
18
  __name: "RuiTabs",
@@ -27,7 +31,8 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
27
31
  default: false
28
32
  },
29
33
  align: { default: "center" },
30
- indicatorPosition: { default: "end" }
34
+ indicatorPosition: { default: "end" },
35
+ variant: { default: () => TabVariant.underline }
31
36
  }, {
32
37
  "modelValue": { default: 0 },
33
38
  "modelModifiers": {}
@@ -43,34 +48,141 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
43
48
  const internalModelValue = ref();
44
49
  const bar = useTemplateRef("bar");
45
50
  const wrapper = useTemplateRef("wrapper");
51
+ const barTabindex = useKeyboardScroll(bar);
52
+ /**
53
+ * The bar. The underline variant draws its 1px track as a `before` line along
54
+ * the whole root, so the arrows sit on it too, and the 2px indicator, a layer
55
+ * above, covers it under the active tab.
56
+ */
46
57
  const tabs = tv({
47
58
  slots: {
48
59
  root: "",
49
- arrow: "",
50
- bar: "no-scrollbar max-h-full overflow-auto",
51
- wrapper: "h-full inline-flex max-w-none"
60
+ arrow: "flex shrink-0 items-center justify-center",
61
+ bar: "no-scrollbar relative max-h-full overflow-auto outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2",
62
+ wrapper: "inline-flex max-w-none",
63
+ indicator: "pointer-events-none absolute"
52
64
  },
53
65
  variants: {
66
+ variant: {
67
+ [TabVariant.underline]: {
68
+ root: `relative before:pointer-events-none before:absolute before:bg-rui-divider before:content-['']`,
69
+ indicator: "z-1 bg-rui-primary"
70
+ },
71
+ [TabVariant.segmented]: {
72
+ root: "rounded-rui-panel bg-rui-neutral-200 p-0.5 dark:bg-rui-neutral-800",
73
+ wrapper: "gap-0.5",
74
+ indicator: "rounded-rui-control bg-rui-surface shadow-rui-control dark:bg-rui-neutral-700"
75
+ }
76
+ },
54
77
  layout: {
55
78
  [TabLayout.horizontal]: {
56
79
  root: "flex h-fit",
57
- arrow: "h-[3rem] w-10",
58
- bar: "h-[3rem]",
59
- wrapper: ""
80
+ arrow: "w-8"
60
81
  },
61
82
  [TabLayout.vertical]: {
62
83
  root: "inline-flex flex-col",
63
- arrow: "min-h-[3rem] w-full",
64
- bar: "",
65
- wrapper: "flex-col h-auto"
84
+ arrow: "h-8 w-full",
85
+ wrapper: "flex-col w-full"
66
86
  }
67
87
  },
68
- wide: { true: {
69
- bar: "w-full",
70
- wrapper: "min-w-full"
71
- } }
88
+ indicatorPosition: {
89
+ start: {},
90
+ end: {}
91
+ },
92
+ color: {
93
+ primary: {},
94
+ secondary: {},
95
+ error: {},
96
+ warning: {},
97
+ info: {},
98
+ success: {}
99
+ },
100
+ wide: {
101
+ true: {
102
+ bar: "w-full",
103
+ wrapper: "min-w-full"
104
+ },
105
+ false: {}
106
+ },
107
+ animated: {
108
+ true: { indicator: "transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none" },
109
+ false: {}
110
+ }
72
111
  },
73
- defaultVariants: { layout: TabLayout.horizontal }
112
+ compoundVariants: [
113
+ {
114
+ variant: TabVariant.underline,
115
+ layout: TabLayout.horizontal,
116
+ indicatorPosition: "end",
117
+ class: {
118
+ root: "before:inset-x-0 before:bottom-0 before:h-px",
119
+ indicator: "bottom-0 h-0.5 rounded-t-full"
120
+ }
121
+ },
122
+ {
123
+ variant: TabVariant.underline,
124
+ layout: TabLayout.horizontal,
125
+ indicatorPosition: "start",
126
+ class: {
127
+ root: "before:inset-x-0 before:top-0 before:h-px",
128
+ indicator: "top-0 h-0.5 rounded-b-full"
129
+ }
130
+ },
131
+ {
132
+ variant: TabVariant.underline,
133
+ layout: TabLayout.vertical,
134
+ indicatorPosition: "end",
135
+ class: {
136
+ root: "before:inset-y-0 before:right-0 before:w-px",
137
+ indicator: "right-0 w-0.5 rounded-l-full"
138
+ }
139
+ },
140
+ {
141
+ variant: TabVariant.underline,
142
+ layout: TabLayout.vertical,
143
+ indicatorPosition: "start",
144
+ class: {
145
+ root: "before:inset-y-0 before:left-0 before:w-px",
146
+ indicator: "left-0 w-0.5 rounded-r-full"
147
+ }
148
+ },
149
+ {
150
+ variant: TabVariant.segmented,
151
+ layout: TabLayout.horizontal,
152
+ wide: false,
153
+ class: { root: "w-fit max-w-full" }
154
+ },
155
+ {
156
+ variant: TabVariant.underline,
157
+ color: "secondary",
158
+ class: { indicator: "bg-rui-secondary" }
159
+ },
160
+ {
161
+ variant: TabVariant.underline,
162
+ color: "error",
163
+ class: { indicator: "bg-rui-error" }
164
+ },
165
+ {
166
+ variant: TabVariant.underline,
167
+ color: "warning",
168
+ class: { indicator: "bg-rui-warning" }
169
+ },
170
+ {
171
+ variant: TabVariant.underline,
172
+ color: "info",
173
+ class: { indicator: "bg-rui-info" }
174
+ },
175
+ {
176
+ variant: TabVariant.underline,
177
+ color: "success",
178
+ class: { indicator: "bg-rui-success" }
179
+ }
180
+ ],
181
+ defaultVariants: {
182
+ variant: TabVariant.underline,
183
+ layout: TabLayout.horizontal,
184
+ indicatorPosition: "end"
185
+ }
74
186
  });
75
187
  const slots = useSlots();
76
188
  const { showArrows, prevArrowDisabled, nextArrowDisabled, onPrevSliderClick, onNextSliderClick, keepActiveTabVisible } = useTabScroll({
@@ -79,21 +191,36 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
79
191
  vertical: () => __props.vertical
80
192
  });
81
193
  const { resolveRoute, isPathMatch } = useTabRouting({ onRouteChange: () => applyNewValue(true) });
194
+ const { onKeydown } = useTabKeyboard({
195
+ wrapper,
196
+ vertical: () => __props.vertical
197
+ });
198
+ const { style: indicatorStyle, animated, update: updateIndicator } = useTabIndicator({
199
+ bar,
200
+ wrapper,
201
+ vertical: () => __props.vertical,
202
+ variant: () => __props.variant
203
+ });
82
204
  const layout = computed(() => __props.vertical ? TabLayout.vertical : TabLayout.horizontal);
83
205
  const ui = computed(() => tabs({
84
- layout: get$1(layout),
85
- wide: __props.vertical || __props.grow
206
+ variant: __props.variant,
207
+ layout: get(layout),
208
+ indicatorPosition: __props.indicatorPosition,
209
+ color: __props.color,
210
+ wide: __props.vertical || __props.grow,
211
+ animated: get(animated)
86
212
  }));
87
213
  const children = computed(() => {
88
214
  const tabs = getChildrenTabs(slots.default?.() ?? []);
89
- const currentModelValue = get$1(internalModelValue);
215
+ const currentModelValue = get(internalModelValue);
90
216
  const inheritedProps = {
91
217
  color: __props.color,
92
218
  grow: __props.grow,
93
219
  disabled: __props.disabled,
94
220
  vertical: __props.vertical,
95
221
  align: __props.align,
96
- indicatorPosition: __props.indicatorPosition
222
+ indicatorPosition: __props.indicatorPosition,
223
+ variant: __props.variant
97
224
  };
98
225
  return tabs.map((tab, index) => {
99
226
  let tabValue = tab.props?.value ?? index;
@@ -124,22 +251,21 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
124
251
  }).flat();
125
252
  }
126
253
  function updateModelValue(newModelValue) {
127
- set$1(modelValue, newModelValue);
128
- set$1(internalModelValue, newModelValue);
254
+ set(modelValue, newModelValue);
255
+ set(internalModelValue, newModelValue);
129
256
  }
130
257
  function getTabRouteProps(props) {
131
258
  return {
132
259
  value: typeof props.value === "string" || typeof props.value === "number" ? props.value : void 0,
133
260
  to: props.to ?? void 0,
134
261
  link: typeof props.link === "boolean" ? props.link : void 0,
135
- exact: typeof props.exact === "boolean" ? props.exact : void 0,
136
- exactPath: typeof props.exactPath === "boolean" ? props.exactPath : void 0
262
+ exact: typeof props.exact === "boolean" ? props.exact : void 0
137
263
  };
138
264
  }
139
265
  function resolveActiveValue(onlyLink) {
140
- const enabledChildren = get$1(children).filter((child) => !child.props?.disabled);
266
+ const enabledChildren = get(children).filter((child) => !child.props?.disabled);
141
267
  if (enabledChildren.length === 0) return void 0;
142
- let result = get$1(modelValue) || 0;
268
+ let result = get(modelValue) || 0;
143
269
  enabledChildren.forEach((child, index) => {
144
270
  const tabProps = getTabRouteProps(child.props);
145
271
  if (!onlyLink && index === 0 && tabProps.value) result = tabProps.value;
@@ -153,14 +279,20 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
153
279
  if (value !== void 0) updateModelValue(value);
154
280
  keepActiveTabVisible();
155
281
  }
156
- watchImmediate(() => get$1(modelValue), (modelValue) => {
157
- set$1(internalModelValue, modelValue);
282
+ watchImmediate(() => get(modelValue), (modelValue) => {
283
+ set(internalModelValue, modelValue);
158
284
  });
159
285
  watch(internalModelValue, () => {
160
286
  keepActiveTabVisible();
161
287
  });
288
+ watch(() => [
289
+ __props.vertical,
290
+ __props.variant,
291
+ __props.grow,
292
+ __props.align
293
+ ], () => nextTick(updateIndicator), { flush: "post" });
162
294
  onMounted(() => {
163
- if (get$1(modelValue) !== void 0) return;
295
+ if (get(modelValue) !== void 0) return;
164
296
  applyNewValue();
165
297
  });
166
298
  return (_ctx, _cache) => {
@@ -172,44 +304,57 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
172
304
  key: 0,
173
305
  class: normalizeClass(unref(ui).arrow())
174
306
  }, [createVNode(RuiButton_default, {
175
- class: "w-full h-full !rounded-none",
176
307
  variant: "text",
177
- color: __props.color,
308
+ icon: "",
309
+ size: "sm",
310
+ tabindex: "-1",
311
+ "aria-label": "Scroll tabs back",
178
312
  disabled: unref(prevArrowDisabled),
179
313
  onClick: _cache[0] || (_cache[0] = ($event) => unref(onPrevSliderClick)())
180
314
  }, {
181
315
  default: withCtx(() => [createVNode(RuiIcon_default, { name: __props.vertical ? "lu-chevron-up" : "lu-chevron-left" }, null, 8, ["name"])]),
182
316
  _: 1
183
- }, 8, ["color", "disabled"])], 2)) : createCommentVNode("", true),
317
+ }, 8, ["disabled"])], 2)) : createCommentVNode("", true),
184
318
  createElementVNode("div", {
185
319
  ref_key: "bar",
186
320
  ref: bar,
187
- class: normalizeClass(unref(ui).bar())
188
- }, [createElementVNode("div", {
321
+ class: normalizeClass(unref(ui).bar()),
322
+ tabindex: unref(barTabindex)
323
+ }, [unref(indicatorStyle) ? (openBlock(), createElementBlock("span", {
324
+ key: 0,
325
+ "aria-hidden": "true",
326
+ "data-id": "tabs-indicator",
327
+ class: normalizeClass(unref(ui).indicator()),
328
+ style: normalizeStyle(unref(indicatorStyle))
329
+ }, null, 6)) : createCommentVNode("", true), createElementVNode("div", {
189
330
  ref_key: "wrapper",
190
331
  ref: wrapper,
191
332
  role: "tablist",
192
333
  "data-id": "tabs-wrapper",
193
- class: normalizeClass(unref(ui).wrapper())
334
+ "aria-orientation": __props.vertical ? "vertical" : void 0,
335
+ class: normalizeClass(unref(ui).wrapper()),
336
+ onKeydown: _cache[2] || (_cache[2] = ($event) => unref(onKeydown)($event))
194
337
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(children), (child, i) => {
195
338
  return openBlock(), createBlock(resolveDynamicComponent(child), {
196
339
  key: i,
197
340
  onClick: _cache[1] || (_cache[1] = ($event) => updateModelValue($event))
198
341
  });
199
- }), 128))], 2)], 2),
342
+ }), 128))], 42, _hoisted_3)], 10, _hoisted_2),
200
343
  unref(showArrows) ? (openBlock(), createElementBlock("div", {
201
344
  key: 1,
202
345
  class: normalizeClass(unref(ui).arrow())
203
346
  }, [createVNode(RuiButton_default, {
204
- class: "w-full h-full !rounded-none",
205
347
  variant: "text",
206
- color: __props.color,
348
+ icon: "",
349
+ size: "sm",
350
+ tabindex: "-1",
351
+ "aria-label": "Scroll tabs forward",
207
352
  disabled: unref(nextArrowDisabled),
208
- onClick: _cache[2] || (_cache[2] = ($event) => unref(onNextSliderClick)())
353
+ onClick: _cache[3] || (_cache[3] = ($event) => unref(onNextSliderClick)())
209
354
  }, {
210
355
  default: withCtx(() => [createVNode(RuiIcon_default, { name: __props.vertical ? "lu-chevron-down" : "lu-chevron-right" }, null, 8, ["name"])]),
211
356
  _: 1
212
- }, 8, ["color", "disabled"])], 2)) : createCommentVNode("", true)
357
+ }, 8, ["disabled"])], 2)) : createCommentVNode("", true)
213
358
  ], 10, _hoisted_1);
214
359
  };
215
360
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode, type VNode } from 'vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TabAlignment, type TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabRouting } from '@/components/tabs/tabs/use-tab-routing';\nimport { useTabScroll } from '@/components/tabs/tabs/use-tab-scroll';\nimport { tv } from '@/utils/tv';\n\ntype ChildNode = VNode & { props: Record<string, any> };\n\ninterface ResolvedTabProps {\n value?: string | number;\n to?: unknown;\n link?: boolean;\n exact?: boolean;\n exactPath?: boolean;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\n/**\n * The selected tab, defaulting to the first one. The default also narrows the\n * `update:modelValue` payload to `number | string`, so a consumer's handler\n * needs no undefined in its signature.\n */\nconst modelValue = defineModel<number | string>({ default: 0 });\n\nconst {\n color,\n vertical = false,\n disabled = false,\n grow = false,\n align = 'center',\n indicatorPosition = 'end',\n} = defineProps<Props>();\n\nconst internalModelValue = ref<string | number>();\nconst bar = useTemplateRef<HTMLDivElement>('bar');\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\n\nconst tabs = tv({\n slots: {\n root: '',\n arrow: '',\n bar: 'no-scrollbar max-h-full overflow-auto',\n wrapper: 'h-full inline-flex max-w-none',\n },\n variants: {\n layout: {\n [TabLayout.horizontal]: {\n root: 'flex h-fit',\n arrow: 'h-[3rem] w-10',\n bar: 'h-[3rem]',\n wrapper: '',\n },\n [TabLayout.vertical]: {\n root: 'inline-flex flex-col',\n arrow: 'min-h-[3rem] w-full',\n bar: '',\n wrapper: 'flex-col h-auto',\n },\n },\n wide: {\n true: {\n bar: 'w-full',\n wrapper: 'min-w-full',\n },\n },\n },\n defaultVariants: { layout: TabLayout.horizontal },\n});\n\nconst slots = useSlots();\n\nconst {\n showArrows,\n prevArrowDisabled,\n nextArrowDisabled,\n onPrevSliderClick,\n onNextSliderClick,\n keepActiveTabVisible,\n} = useTabScroll({ bar, wrapper, vertical: () => vertical });\n\nconst { resolveRoute, isPathMatch } = useTabRouting({\n onRouteChange: () => applyNewValue(true),\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst ui = computed<ReturnType<typeof tabs>>(() => tabs({ layout: get(layout), wide: vertical || grow }));\n\nconst children = computed<ChildNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n const currentModelValue = get(internalModelValue);\n const inheritedProps = {\n color,\n grow,\n disabled,\n vertical,\n align,\n indicatorPosition,\n };\n\n return tabs.map((tab, index) => {\n let tabValue = tab.props?.value ?? index;\n if (tab.props?.link !== false && tab.props?.to)\n tabValue = tab.props.to;\n\n const active = currentModelValue === tabValue;\n return {\n ...tab,\n props: {\n value: tabValue,\n active,\n ...inheritedProps,\n ...tab.props,\n },\n };\n });\n});\n\n/**\n * Unwraps the fragments a `v-for` in the slot produces, so only tabs come\n * back.\n *\n * @param children - the slot's vnodes\n * @returns the tabs among them\n */\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children.flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n }).flat();\n}\n\nfunction updateModelValue(newModelValue: string | number): void {\n set(modelValue, newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nfunction getTabRouteProps(props: Record<string, unknown>): ResolvedTabProps {\n return {\n value: typeof props.value === 'string' || typeof props.value === 'number' ? props.value : undefined,\n to: props.to ?? undefined,\n link: typeof props.link === 'boolean' ? props.link : undefined,\n exact: typeof props.exact === 'boolean' ? props.exact : undefined,\n exactPath: typeof props.exactPath === 'boolean' ? props.exactPath : undefined,\n };\n}\n\nfunction resolveActiveValue(onlyLink: boolean): string | number | undefined {\n const enabledChildren = get(children).filter(child => !child.props?.disabled);\n if (enabledChildren.length === 0)\n return undefined;\n\n let result: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const tabProps = getTabRouteProps(child.props);\n if (!onlyLink && index === 0 && tabProps.value)\n result = tabProps.value;\n\n const fullPath = resolveRoute(tabProps.to);\n\n if (tabProps.link !== false && fullPath && isPathMatch(fullPath, tabProps))\n result = fullPath;\n });\n return result;\n}\n\nfunction applyNewValue(onlyLink = false): void {\n const value = resolveActiveValue(onlyLink);\n if (value !== undefined)\n updateModelValue(value);\n\n keepActiveTabVisible();\n}\n\nwatchImmediate(() => get(modelValue), (modelValue) => {\n set(internalModelValue, modelValue);\n});\n\nwatch(internalModelValue, () => {\n keepActiveTabVisible();\n});\n\nonMounted(() => {\n if (get(modelValue) !== undefined)\n return;\n\n applyNewValue();\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n :data-vertical=\"vertical || undefined\"\n >\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n class=\"w-full h-full !rounded-none\"\n variant=\"text\"\n :color=\"color\"\n :disabled=\"prevArrowDisabled\"\n @click=\"onPrevSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-up' : 'lu-chevron-left'\" />\n </RuiButton>\n </div>\n <div\n ref=\"bar\"\n :class=\"ui.bar()\"\n >\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n data-id=\"tabs-wrapper\"\n :class=\"ui.wrapper()\"\n >\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateModelValue($event)\"\n />\n </div>\n </div>\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n class=\"w-full h-full !rounded-none\"\n variant=\"text\"\n :color=\"color\"\n :disabled=\"nextArrowDisabled\"\n @click=\"onNextSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-down' : 'lu-chevron-right'\" />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode, type VNode } from 'vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TabAlignment, type TabIndicatorPosition, TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { useTabIndicator } from '@/components/tabs/tabs/use-tab-indicator';\nimport { useTabKeyboard } from '@/components/tabs/tabs/use-tab-keyboard';\nimport { useTabRouting } from '@/components/tabs/tabs/use-tab-routing';\nimport { useTabScroll } from '@/components/tabs/tabs/use-tab-scroll';\nimport { useKeyboardScroll } from '@/composables/keyboard-scroll';\nimport { tv } from '@/utils/tv';\n\ntype ChildNode = VNode & { props: Record<string, any> };\n\ninterface ResolvedTabProps {\n value?: string | number;\n to?: unknown;\n link?: boolean;\n exact?: boolean;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n variant?: TabVariant;\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\n/**\n * The selected tab, defaulting to the first one. The default also narrows the\n * `update:modelValue` payload to `number | string`, so a consumer's handler\n * needs no undefined in its signature.\n */\nconst modelValue = defineModel<number | string>({ default: 0 });\n\nconst {\n color,\n vertical = false,\n disabled = false,\n grow = false,\n align = 'center',\n indicatorPosition = 'end',\n variant = TabVariant.underline,\n} = defineProps<Props>();\n\nconst internalModelValue = ref<string | number>();\nconst bar = useTemplateRef<HTMLDivElement>('bar');\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst barTabindex = useKeyboardScroll(bar);\n\n/**\n * The bar. The underline variant draws its 1px track as a `before` line along\n * the whole root, so the arrows sit on it too, and the 2px indicator, a layer\n * above, covers it under the active tab.\n */\nconst tabs = tv({\n slots: {\n root: '',\n arrow: 'flex shrink-0 items-center justify-center',\n // a tab stop only when it scrolls with every tab disabled (useKeyboardScroll)\n bar: 'no-scrollbar relative max-h-full overflow-auto outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2',\n wrapper: 'inline-flex max-w-none',\n indicator: 'pointer-events-none absolute',\n },\n variants: {\n variant: {\n [TabVariant.underline]: {\n root: `relative before:pointer-events-none before:absolute before:bg-rui-divider before:content-['']`,\n indicator: 'z-1 bg-rui-primary',\n },\n [TabVariant.segmented]: {\n // neutral-200, not 100: on a near-white page (`#fafafa`) the lighter track all but disappeared\n root: 'rounded-rui-panel bg-rui-neutral-200 p-0.5 dark:bg-rui-neutral-800',\n wrapper: 'gap-0.5',\n indicator: 'rounded-rui-control bg-rui-surface shadow-rui-control dark:bg-rui-neutral-700',\n },\n },\n layout: {\n [TabLayout.horizontal]: { root: 'flex h-fit', arrow: 'w-8' },\n [TabLayout.vertical]: { root: 'inline-flex flex-col', arrow: 'h-8 w-full', wrapper: 'flex-col w-full' },\n },\n indicatorPosition: {\n start: {},\n end: {},\n },\n color: {\n primary: {},\n secondary: {},\n error: {},\n warning: {},\n info: {},\n success: {},\n },\n wide: {\n true: { bar: 'w-full', wrapper: 'min-w-full' },\n false: {},\n },\n animated: {\n true: { indicator: 'transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none' },\n false: {},\n },\n },\n compoundVariants: [\n { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'end', class: { root: 'before:inset-x-0 before:bottom-0 before:h-px', indicator: 'bottom-0 h-0.5 rounded-t-full' } },\n { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'start', class: { root: 'before:inset-x-0 before:top-0 before:h-px', indicator: 'top-0 h-0.5 rounded-b-full' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, indicatorPosition: 'end', class: { root: 'before:inset-y-0 before:right-0 before:w-px', indicator: 'right-0 w-0.5 rounded-l-full' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, indicatorPosition: 'start', class: { root: 'before:inset-y-0 before:left-0 before:w-px', indicator: 'left-0 w-0.5 rounded-r-full' } },\n // the underline track spans its row, while a segmented control hugs its options unless it grows\n { variant: TabVariant.segmented, layout: TabLayout.horizontal, wide: false, class: { root: 'w-fit max-w-full' } },\n // `color` picks the underline's color; the segmented pill stays a neutral surface\n { variant: TabVariant.underline, color: 'secondary', class: { indicator: 'bg-rui-secondary' } },\n { variant: TabVariant.underline, color: 'error', class: { indicator: 'bg-rui-error' } },\n { variant: TabVariant.underline, color: 'warning', class: { indicator: 'bg-rui-warning' } },\n { variant: TabVariant.underline, color: 'info', class: { indicator: 'bg-rui-info' } },\n { variant: TabVariant.underline, color: 'success', class: { indicator: 'bg-rui-success' } },\n ],\n defaultVariants: { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'end' },\n});\n\nconst slots = useSlots();\n\nconst {\n showArrows,\n prevArrowDisabled,\n nextArrowDisabled,\n onPrevSliderClick,\n onNextSliderClick,\n keepActiveTabVisible,\n} = useTabScroll({ bar, wrapper, vertical: () => vertical });\n\nconst { resolveRoute, isPathMatch } = useTabRouting({\n onRouteChange: () => applyNewValue(true),\n});\n\nconst { onKeydown } = useTabKeyboard({ wrapper, vertical: () => vertical });\n\nconst { style: indicatorStyle, animated, update: updateIndicator } = useTabIndicator({\n bar,\n wrapper,\n vertical: () => vertical,\n variant: () => variant,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst ui = computed<ReturnType<typeof tabs>>(() => tabs({\n variant,\n layout: get(layout),\n indicatorPosition,\n color,\n wide: vertical || grow,\n animated: get(animated),\n}));\n\nconst children = computed<ChildNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n const currentModelValue = get(internalModelValue);\n const inheritedProps = {\n color,\n grow,\n disabled,\n vertical,\n align,\n indicatorPosition,\n variant,\n };\n\n return tabs.map((tab, index) => {\n let tabValue = tab.props?.value ?? index;\n if (tab.props?.link !== false && tab.props?.to)\n tabValue = tab.props.to;\n\n const active = currentModelValue === tabValue;\n return {\n ...tab,\n props: {\n value: tabValue,\n active,\n ...inheritedProps,\n ...tab.props,\n },\n };\n });\n});\n\n/**\n * Unwraps the fragments a `v-for` in the slot produces, so only tabs come\n * back.\n *\n * @param children - the slot's vnodes\n * @returns the tabs among them\n */\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children.flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n }).flat();\n}\n\nfunction updateModelValue(newModelValue: string | number): void {\n set(modelValue, newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nfunction getTabRouteProps(props: Record<string, unknown>): ResolvedTabProps {\n return {\n value: typeof props.value === 'string' || typeof props.value === 'number' ? props.value : undefined,\n to: props.to ?? undefined,\n link: typeof props.link === 'boolean' ? props.link : undefined,\n exact: typeof props.exact === 'boolean' ? props.exact : undefined,\n };\n}\n\nfunction resolveActiveValue(onlyLink: boolean): string | number | undefined {\n const enabledChildren = get(children).filter(child => !child.props?.disabled);\n if (enabledChildren.length === 0)\n return undefined;\n\n let result: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const tabProps = getTabRouteProps(child.props);\n if (!onlyLink && index === 0 && tabProps.value)\n result = tabProps.value;\n\n const fullPath = resolveRoute(tabProps.to);\n\n if (tabProps.link !== false && fullPath && isPathMatch(fullPath, tabProps))\n result = fullPath;\n });\n return result;\n}\n\nfunction applyNewValue(onlyLink = false): void {\n const value = resolveActiveValue(onlyLink);\n if (value !== undefined)\n updateModelValue(value);\n\n keepActiveTabVisible();\n}\n\nwatchImmediate(() => get(modelValue), (modelValue) => {\n set(internalModelValue, modelValue);\n});\n\nwatch(internalModelValue, () => {\n keepActiveTabVisible();\n});\n\nwatch(() => [vertical, variant, grow, align], () => nextTick(updateIndicator), { flush: 'post' });\n\nonMounted(() => {\n if (get(modelValue) !== undefined)\n return;\n\n applyNewValue();\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n :data-vertical=\"vertical || undefined\"\n >\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n aria-label=\"Scroll tabs back\"\n :disabled=\"prevArrowDisabled\"\n @click=\"onPrevSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-up' : 'lu-chevron-left'\" />\n </RuiButton>\n </div>\n <div\n ref=\"bar\"\n :class=\"ui.bar()\"\n :tabindex=\"barTabindex\"\n >\n <span\n v-if=\"indicatorStyle\"\n aria-hidden=\"true\"\n data-id=\"tabs-indicator\"\n :class=\"ui.indicator()\"\n :style=\"indicatorStyle\"\n />\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n data-id=\"tabs-wrapper\"\n :aria-orientation=\"vertical ? 'vertical' : undefined\"\n :class=\"ui.wrapper()\"\n @keydown=\"onKeydown($event)\"\n >\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateModelValue($event)\"\n />\n </div>\n </div>\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n aria-label=\"Scroll tabs forward\"\n :disabled=\"nextArrowDisabled\"\n @click=\"onNextSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-down' : 'lu-chevron-right'\" />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ComputedRef, CSSProperties, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';
2
+ import { TabVariant } from '../tab-props.js';
3
+ interface UseTabIndicatorOptions {
4
+ /** The scrolling bar, the indicator's positioning context */
5
+ bar: Readonly<ShallowRef<HTMLDivElement | null>>;
6
+ /** The tablist inside the bar */
7
+ wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;
8
+ /** Whether the tabs run top to bottom, so the underline follows their height */
9
+ vertical: MaybeRefOrGetter<boolean>;
10
+ /** The bar's look, which decides whether the indicator is a line or a pill */
11
+ variant: MaybeRefOrGetter<TabVariant>;
12
+ }
13
+ interface UseTabIndicatorReturn {
14
+ /** The indicator's box, or undefined while no tab is active */
15
+ style: ComputedRef<CSSProperties | undefined>;
16
+ /** False until the first placement, so the indicator appears in place rather than sliding in */
17
+ animated: Readonly<Ref<boolean>>;
18
+ update: () => void;
19
+ }
20
+ /**
21
+ * Tracks the active tab's box so one indicator can slide between tabs. It lives
22
+ * in the bar, next to the tablist, so it scrolls with the tabs while the
23
+ * tablist holds only tabs. The underline takes the tab's span along the bar;
24
+ * the segmented pill takes its whole box.
25
+ */
26
+ export declare function useTabIndicator({ bar, wrapper, vertical, variant }: UseTabIndicatorOptions): UseTabIndicatorReturn;
27
+ export {};
@@ -0,0 +1,67 @@
1
+ import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
2
+ import { useMutationObserver, useResizeObserver } from "../../../vendor/@vueuse/core/dist/index.js";
3
+ import { TabVariant } from "../tab-props.js";
4
+ import { computed, onMounted, readonly, shallowRef, toValue } from "vue";
5
+ //#region src/components/tabs/tabs/use-tab-indicator.ts
6
+ /**
7
+ * Tracks the active tab's box so one indicator can slide between tabs. It lives
8
+ * in the bar, next to the tablist, so it scrolls with the tabs while the
9
+ * tablist holds only tabs. The underline takes the tab's span along the bar;
10
+ * the segmented pill takes its whole box.
11
+ */
12
+ function useTabIndicator({ bar, wrapper, vertical, variant }) {
13
+ const rect = shallowRef();
14
+ const animated = shallowRef(false);
15
+ function update() {
16
+ const tab = get(bar)?.querySelector("[role=tab][data-active-tab]");
17
+ if (!tab) {
18
+ set(rect, void 0);
19
+ return;
20
+ }
21
+ set(rect, {
22
+ left: tab.offsetLeft,
23
+ top: tab.offsetTop,
24
+ width: tab.offsetWidth,
25
+ height: tab.offsetHeight
26
+ });
27
+ if (!get(animated)) requestAnimationFrame(() => set(animated, true));
28
+ }
29
+ const style = computed(() => {
30
+ const box = get(rect);
31
+ if (!box) return void 0;
32
+ const px = (value) => `${value}px`;
33
+ if (toValue(variant) === TabVariant.segmented) return {
34
+ left: px(box.left),
35
+ top: px(box.top),
36
+ width: px(box.width),
37
+ height: px(box.height)
38
+ };
39
+ return toValue(vertical) ? {
40
+ top: px(box.top),
41
+ height: px(box.height)
42
+ } : {
43
+ left: px(box.left),
44
+ width: px(box.width)
45
+ };
46
+ });
47
+ useResizeObserver(wrapper, update);
48
+ useMutationObserver(wrapper, update, {
49
+ subtree: true,
50
+ attributes: true,
51
+ attributeFilter: ["data-active-tab"],
52
+ childList: true
53
+ });
54
+ onMounted(() => {
55
+ update();
56
+ document.fonts?.ready.then(update).catch(() => {});
57
+ });
58
+ return {
59
+ style,
60
+ animated: readonly(animated),
61
+ update
62
+ };
63
+ }
64
+ //#endregion
65
+ export { useTabIndicator };
66
+
67
+ //# sourceMappingURL=use-tab-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tab-indicator.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-indicator.ts"],"sourcesContent":["import type { ComputedRef, CSSProperties, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';\nimport { TabVariant } from '@/components/tabs/tab-props';\n\ninterface UseTabIndicatorOptions {\n /** The scrolling bar, the indicator's positioning context */\n bar: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** The tablist inside the bar */\n wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** Whether the tabs run top to bottom, so the underline follows their height */\n vertical: MaybeRefOrGetter<boolean>;\n /** The bar's look, which decides whether the indicator is a line or a pill */\n variant: MaybeRefOrGetter<TabVariant>;\n}\n\ninterface UseTabIndicatorReturn {\n /** The indicator's box, or undefined while no tab is active */\n style: ComputedRef<CSSProperties | undefined>;\n /** False until the first placement, so the indicator appears in place rather than sliding in */\n animated: Readonly<Ref<boolean>>;\n update: () => void;\n}\n\ninterface TabRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Tracks the active tab's box so one indicator can slide between tabs. It lives\n * in the bar, next to the tablist, so it scrolls with the tabs while the\n * tablist holds only tabs. The underline takes the tab's span along the bar;\n * the segmented pill takes its whole box.\n */\nexport function useTabIndicator({ bar, wrapper, vertical, variant }: UseTabIndicatorOptions): UseTabIndicatorReturn {\n const rect = shallowRef<TabRect>();\n const animated = shallowRef<boolean>(false);\n\n function update(): void {\n const tab = get(bar)?.querySelector<HTMLElement>('[role=tab][data-active-tab]');\n if (!tab) {\n set(rect, undefined);\n return;\n }\n\n set(rect, { left: tab.offsetLeft, top: tab.offsetTop, width: tab.offsetWidth, height: tab.offsetHeight });\n\n if (!get(animated))\n requestAnimationFrame(() => set(animated, true));\n }\n\n const style = computed<CSSProperties | undefined>(() => {\n const box = get(rect);\n if (!box)\n return undefined;\n\n const px = (value: number): string => `${value}px`;\n if (toValue(variant) === TabVariant.segmented)\n return { left: px(box.left), top: px(box.top), width: px(box.width), height: px(box.height) };\n\n return toValue(vertical)\n ? { top: px(box.top), height: px(box.height) }\n : { left: px(box.left), width: px(box.width) };\n });\n\n useResizeObserver(wrapper, update);\n useMutationObserver(wrapper, update, { subtree: true, attributes: true, attributeFilter: ['data-active-tab'], childList: true });\n\n onMounted(() => {\n update();\n // a web font that loads later changes every label's width\n document.fonts?.ready.then(update).catch(() => {});\n });\n\n return { style, animated: readonly(animated), update };\n}\n"],"mappings":";;;;;;;;;;;AAmCA,SAAgB,gBAAgB,EAAE,KAAK,SAAS,UAAU,WAA0D;CAClH,MAAM,OAAO,WAAoB;CACjC,MAAM,WAAW,WAAoB,KAAK;CAE1C,SAAS,SAAe;EACtB,MAAM,MAAM,IAAI,GAAG,CAAC,EAAE,cAA2B,6BAA6B;EAC9E,IAAI,CAAC,KAAK;GACR,IAAI,MAAM,KAAA,CAAS;GACnB;EACF;EAEA,IAAI,MAAM;GAAE,MAAM,IAAI;GAAY,KAAK,IAAI;GAAW,OAAO,IAAI;GAAa,QAAQ,IAAI;EAAa,CAAC;EAExG,IAAI,CAAC,IAAI,QAAQ,GACf,4BAA4B,IAAI,UAAU,IAAI,CAAC;CACnD;CAEA,MAAM,QAAQ,eAA0C;EACtD,MAAM,MAAM,IAAI,IAAI;EACpB,IAAI,CAAC,KACH,OAAO,KAAA;EAET,MAAM,MAAM,UAA0B,GAAG,MAAM;EAC/C,IAAI,QAAQ,OAAO,MAAM,WAAW,WAClC,OAAO;GAAE,MAAM,GAAG,IAAI,IAAI;GAAG,KAAK,GAAG,IAAI,GAAG;GAAG,OAAO,GAAG,IAAI,KAAK;GAAG,QAAQ,GAAG,IAAI,MAAM;EAAE;EAE9F,OAAO,QAAQ,QAAQ,IACnB;GAAE,KAAK,GAAG,IAAI,GAAG;GAAG,QAAQ,GAAG,IAAI,MAAM;EAAE,IAC3C;GAAE,MAAM,GAAG,IAAI,IAAI;GAAG,OAAO,GAAG,IAAI,KAAK;EAAE;CACjD,CAAC;CAED,kBAAkB,SAAS,MAAM;CACjC,oBAAoB,SAAS,QAAQ;EAAE,SAAS;EAAM,YAAY;EAAM,iBAAiB,CAAC,iBAAiB;EAAG,WAAW;CAAK,CAAC;CAE/H,gBAAgB;EACd,OAAO;EAEP,SAAS,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;CACnD,CAAC;CAED,OAAO;EAAE;EAAO,UAAU,SAAS,QAAQ;EAAG;CAAO;AACvD"}
@@ -0,0 +1,17 @@
1
+ import type { MaybeRefOrGetter, ShallowRef } from 'vue';
2
+ interface UseTabKeyboardOptions {
3
+ /** The tablist element */
4
+ wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;
5
+ /** Whether the tabs run top to bottom, which moves with the up and down arrows */
6
+ vertical: MaybeRefOrGetter<boolean>;
7
+ }
8
+ interface UseTabKeyboardReturn {
9
+ onKeydown: (event: KeyboardEvent) => void;
10
+ }
11
+ /**
12
+ * The WAI-ARIA tabs keys: the arrows along the bar move to the next or
13
+ * previous enabled tab and select it, Home and End jump to the ends. Selecting
14
+ * goes through a click, so a link tab navigates as it would with the mouse.
15
+ */
16
+ export declare function useTabKeyboard({ wrapper, vertical }: UseTabKeyboardOptions): UseTabKeyboardReturn;
17
+ export {};
@@ -0,0 +1,57 @@
1
+ import { get } from "../../../vendor/@vueuse/shared/dist/index.js";
2
+ import { toValue } from "vue";
3
+ //#region src/components/tabs/tabs/use-tab-keyboard.ts
4
+ /**
5
+ * The index a key moves to among `count` tabs, wrapping at both ends.
6
+ *
7
+ * @param step - -1 or 1 for the arrows, or `first` and `last` for Home and End
8
+ * @param current - the focused tab's index
9
+ * @param count - the number of enabled tabs
10
+ * @returns the index to move to
11
+ */
12
+ function targetIndex(step, current, count) {
13
+ if (step === "first") return 0;
14
+ if (step === "last") return count - 1;
15
+ return (current + step + count) % count;
16
+ }
17
+ /**
18
+ * The WAI-ARIA tabs keys: the arrows along the bar move to the next or
19
+ * previous enabled tab and select it, Home and End jump to the ends. Selecting
20
+ * goes through a click, so a link tab navigates as it would with the mouse.
21
+ */
22
+ function useTabKeyboard({ wrapper, vertical }) {
23
+ function steps(list) {
24
+ if (toValue(vertical)) return {
25
+ ArrowUp: -1,
26
+ ArrowDown: 1,
27
+ Home: "first",
28
+ End: "last"
29
+ };
30
+ const rtl = getComputedStyle(list).direction === "rtl";
31
+ return {
32
+ ArrowLeft: rtl ? 1 : -1,
33
+ ArrowRight: rtl ? -1 : 1,
34
+ Home: "first",
35
+ End: "last"
36
+ };
37
+ }
38
+ function onKeydown(event) {
39
+ const list = get(wrapper);
40
+ const step = list ? steps(list)[event.key] : void 0;
41
+ if (!list || step === void 0) return;
42
+ const enabled = [...list.querySelectorAll("[role=tab]:not([disabled]):not([aria-disabled=true])")];
43
+ const focused = event.target;
44
+ const current = focused instanceof HTMLElement ? enabled.indexOf(focused) : -1;
45
+ if (current === -1) return;
46
+ const tab = enabled[targetIndex(step, current, enabled.length)];
47
+ if (!tab) return;
48
+ event.preventDefault();
49
+ tab.focus();
50
+ tab.click();
51
+ }
52
+ return { onKeydown };
53
+ }
54
+ //#endregion
55
+ export { useTabKeyboard };
56
+
57
+ //# sourceMappingURL=use-tab-keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tab-keyboard.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-keyboard.ts"],"sourcesContent":["import type { MaybeRefOrGetter, ShallowRef } from 'vue';\n\ninterface UseTabKeyboardOptions {\n /** The tablist element */\n wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** Whether the tabs run top to bottom, which moves with the up and down arrows */\n vertical: MaybeRefOrGetter<boolean>;\n}\n\ninterface UseTabKeyboardReturn {\n onKeydown: (event: KeyboardEvent) => void;\n}\n\n/**\n * The index a key moves to among `count` tabs, wrapping at both ends.\n *\n * @param step - -1 or 1 for the arrows, or `first` and `last` for Home and End\n * @param current - the focused tab's index\n * @param count - the number of enabled tabs\n * @returns the index to move to\n */\nfunction targetIndex(step: -1 | 1 | 'first' | 'last', current: number, count: number): number {\n if (step === 'first')\n return 0;\n if (step === 'last')\n return count - 1;\n return (current + step + count) % count;\n}\n\n/**\n * The WAI-ARIA tabs keys: the arrows along the bar move to the next or\n * previous enabled tab and select it, Home and End jump to the ends. Selecting\n * goes through a click, so a link tab navigates as it would with the mouse.\n */\nexport function useTabKeyboard({ wrapper, vertical }: UseTabKeyboardOptions): UseTabKeyboardReturn {\n function steps(list: HTMLElement): Record<string, -1 | 1 | 'first' | 'last'> {\n if (toValue(vertical))\n return { ArrowUp: -1, ArrowDown: 1, Home: 'first', End: 'last' };\n\n const rtl = getComputedStyle(list).direction === 'rtl';\n return { ArrowLeft: rtl ? 1 : -1, ArrowRight: rtl ? -1 : 1, Home: 'first', End: 'last' };\n }\n\n function onKeydown(event: KeyboardEvent): void {\n const list = get(wrapper);\n const step = list ? steps(list)[event.key] : undefined;\n if (!list || step === undefined)\n return;\n\n const enabled = [...list.querySelectorAll<HTMLElement>('[role=tab]:not([disabled]):not([aria-disabled=true])')];\n // the key lands on the focused tab\n const focused = event.target;\n const current = focused instanceof HTMLElement ? enabled.indexOf(focused) : -1;\n if (current === -1)\n return;\n\n const tab = enabled[targetIndex(step, current, enabled.length)];\n if (!tab)\n return;\n\n event.preventDefault();\n tab.focus();\n tab.click();\n }\n\n return { onKeydown };\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAS,YAAY,MAAiC,SAAiB,OAAuB;CAC5F,IAAI,SAAS,SACX,OAAO;CACT,IAAI,SAAS,QACX,OAAO,QAAQ;CACjB,QAAQ,UAAU,OAAO,SAAS;AACpC;;;;;;AAOA,SAAgB,eAAe,EAAE,SAAS,YAAyD;CACjG,SAAS,MAAM,MAA8D;EAC3E,IAAI,QAAQ,QAAQ,GAClB,OAAO;GAAE,SAAS;GAAI,WAAW;GAAG,MAAM;GAAS,KAAK;EAAO;EAEjE,MAAM,MAAM,iBAAiB,IAAI,CAAC,CAAC,cAAc;EACjD,OAAO;GAAE,WAAW,MAAM,IAAI;GAAI,YAAY,MAAM,KAAK;GAAG,MAAM;GAAS,KAAK;EAAO;CACzF;CAEA,SAAS,UAAU,OAA4B;EAC7C,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,KAAA;EAC7C,IAAI,CAAC,QAAQ,SAAS,KAAA,GACpB;EAEF,MAAM,UAAU,CAAC,GAAG,KAAK,iBAA8B,sDAAsD,CAAC;EAE9G,MAAM,UAAU,MAAM;EACtB,MAAM,UAAU,mBAAmB,cAAc,QAAQ,QAAQ,OAAO,IAAI;EAC5E,IAAI,YAAY,IACd;EAEF,MAAM,MAAM,QAAQ,YAAY,MAAM,SAAS,QAAQ,MAAM;EAC7D,IAAI,CAAC,KACH;EAEF,MAAM,eAAe;EACrB,IAAI,MAAM;EACV,IAAI,MAAM;CACZ;CAEA,OAAO,EAAE,UAAU;AACrB"}
@@ -22,9 +22,8 @@ function useTabRouting({ onRouteChange }) {
22
22
  if (!isRouteLocation(to)) return void 0;
23
23
  return router.resolve(to).fullPath;
24
24
  }
25
- function isPathMatch(path, { exactPath, exact }) {
25
+ function isPathMatch(path, { exact }) {
26
26
  const currentRoute = route.fullPath;
27
- if (exactPath) return currentRoute === path;
28
27
  const base = typeof window !== "undefined" ? window.location.origin : "http://localhost";
29
28
  const routeWithoutQueryParams = new URL(path, base).pathname;
30
29
  if (exact) return currentRoute === routeWithoutQueryParams;
@@ -1 +1 @@
1
- {"version":3,"file":"use-tab-routing.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-routing.ts"],"sourcesContent":["import type { RouteMatchOptions } from '@/components/tabs/tab-props';\nimport { type RouteLocationRaw, useRoute, useRouter } from 'vue-router';\n\ninterface UseTabRoutingOptions {\n /** Callback invoked when the route changes, to re-sync the active tab */\n onRouteChange: () => void;\n}\n\ninterface UseTabRoutingReturn {\n /** Whether vue-router is available in the app context */\n hasRouter: boolean;\n /**\n * Resolves a route location and returns its full path, or undefined\n * if the router is not available or the value is not a valid route location.\n */\n resolveRoute: (to: unknown) => string | undefined;\n /**\n * Checks whether a given path matches the current route.\n * Supports exact path, exact route, and prefix matching.\n */\n isPathMatch: (path: string, options: RouteMatchOptions) => boolean;\n}\n\nexport function isRouteLocation(value: unknown): value is RouteLocationRaw {\n return typeof value === 'string' || (typeof value === 'object' && value !== null);\n}\n\n/**\n * Composable that manages vue-router integration for the RuiTabs component.\n * Provides route resolution and path matching utilities, and watches for\n * route changes to notify the parent component.\n */\nexport function useTabRouting({ onRouteChange }: UseTabRoutingOptions): UseTabRoutingReturn {\n const hasRouter = getCurrentInstance()?.appContext.config.globalProperties.$router !== undefined;\n\n if (!hasRouter) {\n return {\n hasRouter,\n resolveRoute: () => undefined,\n isPathMatch: () => false,\n };\n }\n\n const route = useRoute();\n const router = useRouter();\n\n function resolveRoute(to: unknown): string | undefined {\n if (!isRouteLocation(to))\n return undefined;\n\n return router.resolve(to).fullPath;\n }\n\n function isPathMatch(\n path: string,\n { exactPath, exact }: RouteMatchOptions,\n ): boolean {\n const currentRoute = route.fullPath;\n\n if (exactPath)\n return currentRoute === path;\n\n const base = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const routeWithoutQueryParams = new URL(path, base).pathname;\n\n if (exact)\n return currentRoute === routeWithoutQueryParams;\n\n return currentRoute.startsWith(routeWithoutQueryParams);\n }\n\n watch(route, onRouteChange);\n\n return {\n hasRouter,\n resolveRoute,\n isPathMatch,\n };\n}\n"],"mappings":";;;AAuBA,SAAgB,gBAAgB,OAA2C;CACzE,OAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,UAAU;AAC9E;;;;;;AAOA,SAAgB,cAAc,EAAE,iBAA4D;CAC1F,MAAM,YAAY,mBAAmB,CAAC,EAAE,WAAW,OAAO,iBAAiB,YAAY,KAAA;CAEvF,IAAI,CAAC,WACH,OAAO;EACL;EACA,oBAAoB,KAAA;EACpB,mBAAmB;CACrB;CAGF,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,UAAU;CAEzB,SAAS,aAAa,IAAiC;EACrD,IAAI,CAAC,gBAAgB,EAAE,GACrB,OAAO,KAAA;EAET,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC;CAC5B;CAEA,SAAS,YACP,MACA,EAAE,WAAW,SACJ;EACT,MAAM,eAAe,MAAM;EAE3B,IAAI,WACF,OAAO,iBAAiB;EAE1B,MAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;EACtE,MAAM,0BAA0B,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC;EAEpD,IAAI,OACF,OAAO,iBAAiB;EAE1B,OAAO,aAAa,WAAW,uBAAuB;CACxD;CAEA,MAAM,OAAO,aAAa;CAE1B,OAAO;EACL;EACA;EACA;CACF;AACF"}
1
+ {"version":3,"file":"use-tab-routing.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-routing.ts"],"sourcesContent":["import type { RouteMatchOptions } from '@/components/tabs/tab-props';\nimport { type RouteLocationRaw, useRoute, useRouter } from 'vue-router';\n\ninterface UseTabRoutingOptions {\n /** Callback invoked when the route changes, to re-sync the active tab */\n onRouteChange: () => void;\n}\n\ninterface UseTabRoutingReturn {\n /** Whether vue-router is available in the app context */\n hasRouter: boolean;\n /**\n * Resolves a route location and returns its full path, or undefined\n * if the router is not available or the value is not a valid route location.\n */\n resolveRoute: (to: unknown) => string | undefined;\n /**\n * Checks whether a given path matches the current route.\n * Supports exact path, exact route, and prefix matching.\n */\n isPathMatch: (path: string, options: RouteMatchOptions) => boolean;\n}\n\nexport function isRouteLocation(value: unknown): value is RouteLocationRaw {\n return typeof value === 'string' || (typeof value === 'object' && value !== null);\n}\n\n/**\n * Composable that manages vue-router integration for the RuiTabs component.\n * Provides route resolution and path matching utilities, and watches for\n * route changes to notify the parent component.\n */\nexport function useTabRouting({ onRouteChange }: UseTabRoutingOptions): UseTabRoutingReturn {\n const hasRouter = getCurrentInstance()?.appContext.config.globalProperties.$router !== undefined;\n\n if (!hasRouter) {\n return {\n hasRouter,\n resolveRoute: () => undefined,\n isPathMatch: () => false,\n };\n }\n\n const route = useRoute();\n const router = useRouter();\n\n function resolveRoute(to: unknown): string | undefined {\n if (!isRouteLocation(to))\n return undefined;\n\n return router.resolve(to).fullPath;\n }\n\n function isPathMatch(\n path: string,\n { exact }: RouteMatchOptions,\n ): boolean {\n const currentRoute = route.fullPath;\n const base = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const routeWithoutQueryParams = new URL(path, base).pathname;\n\n if (exact)\n return currentRoute === routeWithoutQueryParams;\n\n return currentRoute.startsWith(routeWithoutQueryParams);\n }\n\n watch(route, onRouteChange);\n\n return {\n hasRouter,\n resolveRoute,\n isPathMatch,\n };\n}\n"],"mappings":";;;AAuBA,SAAgB,gBAAgB,OAA2C;CACzE,OAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,UAAU;AAC9E;;;;;;AAOA,SAAgB,cAAc,EAAE,iBAA4D;CAC1F,MAAM,YAAY,mBAAmB,CAAC,EAAE,WAAW,OAAO,iBAAiB,YAAY,KAAA;CAEvF,IAAI,CAAC,WACH,OAAO;EACL;EACA,oBAAoB,KAAA;EACpB,mBAAmB;CACrB;CAGF,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,UAAU;CAEzB,SAAS,aAAa,IAAiC;EACrD,IAAI,CAAC,gBAAgB,EAAE,GACrB,OAAO,KAAA;EAET,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC;CAC5B;CAEA,SAAS,YACP,MACA,EAAE,SACO;EACT,MAAM,eAAe,MAAM;EAC3B,MAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;EACtE,MAAM,0BAA0B,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC;EAEpD,IAAI,OACF,OAAO,iBAAiB;EAE1B,OAAO,aAAa,WAAW,uBAAuB;CACxD;CAEA,MAAM,OAAO,aAAa;CAE1B,OAAO;EACL;EACA;EACA;CACF;AACF"}