@rotki/ui-library 3.1.6 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  2. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +3 -3
  3. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/accordions/accordion/accordion-styles.d.ts +1 -0
  5. package/dist/components/accordions/accordion/accordion-styles.js +7 -0
  6. package/dist/components/accordions/accordion/accordion-styles.js.map +1 -0
  7. package/dist/components/alerts/RuiAlert.js.map +1 -1
  8. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +1 -65
  9. package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/alerts/alert-styles.d.ts +145 -0
  11. package/dist/components/alerts/alert-styles.js +70 -0
  12. package/dist/components/alerts/alert-styles.js.map +1 -0
  13. package/dist/components/avatars/RuiAvatar.js.map +1 -1
  14. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -38
  15. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
  17. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +1 -13
  18. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/avatars/avatar-group-styles.d.ts +49 -0
  20. package/dist/components/avatars/avatar-group-styles.js +18 -0
  21. package/dist/components/avatars/avatar-group-styles.js.map +1 -0
  22. package/dist/components/avatars/avatar-styles.d.ts +181 -0
  23. package/dist/components/avatars/avatar-styles.js +43 -0
  24. package/dist/components/avatars/avatar-styles.js.map +1 -0
  25. package/dist/components/buttons/button/button-styles.js +1 -1
  26. package/dist/components/buttons/button/button-styles.js.map +1 -1
  27. package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
  28. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +2 -138
  29. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/buttons/button-group/button-group-styles.d.ts +142 -0
  31. package/dist/components/buttons/button-group/button-group-styles.js +143 -0
  32. package/dist/components/buttons/button-group/button-group-styles.js.map +1 -0
  33. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  34. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +1 -8
  35. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  37. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +2 -22
  38. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  39. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  40. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +3 -14
  41. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/calendar/calendar-grid-styles.d.ts +43 -0
  43. package/dist/components/calendar/calendar-grid-styles.js +26 -0
  44. package/dist/components/calendar/calendar-grid-styles.js.map +1 -0
  45. package/dist/components/calendar/calendar-menu-styles.d.ts +34 -0
  46. package/dist/components/calendar/calendar-menu-styles.js +17 -0
  47. package/dist/components/calendar/calendar-menu-styles.js.map +1 -0
  48. package/dist/components/calendar/calendar-styles.d.ts +16 -0
  49. package/dist/components/calendar/calendar-styles.js +13 -0
  50. package/dist/components/calendar/calendar-styles.js.map +1 -0
  51. package/dist/components/cards/RuiCard.js.map +1 -1
  52. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +3 -58
  53. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  55. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +2 -20
  56. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/components/cards/card-header-styles.d.ts +46 -0
  58. package/dist/components/cards/card-header-styles.js +24 -0
  59. package/dist/components/cards/card-header-styles.js.map +1 -0
  60. package/dist/components/cards/card-styles.d.ts +175 -0
  61. package/dist/components/cards/card-styles.js +62 -0
  62. package/dist/components/cards/card-styles.js.map +1 -0
  63. package/dist/components/chips/RuiChip.js.map +1 -1
  64. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +2 -241
  65. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/chips/chip-styles.d.ts +223 -0
  67. package/dist/components/chips/chip-styles.js +246 -0
  68. package/dist/components/chips/chip-styles.js.map +1 -0
  69. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  70. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +3 -3
  71. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  73. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +3 -3
  74. package/dist/components/color-picker/RuiColorHue.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 +3 -3
  77. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/color-picker/color-board-styles.d.ts +1 -0
  79. package/dist/components/color-picker/color-board-styles.js +7 -0
  80. package/dist/components/color-picker/color-board-styles.js.map +1 -0
  81. package/dist/components/color-picker/color-hue-styles.d.ts +1 -0
  82. package/dist/components/color-picker/color-hue-styles.js +7 -0
  83. package/dist/components/color-picker/color-hue-styles.js.map +1 -0
  84. package/dist/components/color-picker/color-picker-styles.d.ts +1 -0
  85. package/dist/components/color-picker/color-picker-styles.js +7 -0
  86. package/dist/components/color-picker/color-picker-styles.js.map +1 -0
  87. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -1
  88. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +1 -11
  89. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/forms/field-label/field-label-styles.d.ts +43 -0
  91. package/dist/components/forms/field-label/field-label-styles.js +16 -0
  92. package/dist/components/forms/field-label/field-label-styles.js.map +1 -0
  93. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  95. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +2 -11
  96. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  97. package/dist/components/forms/select/simple-select-styles.d.ts +2 -0
  98. package/dist/components/forms/select/simple-select-styles.js +15 -0
  99. package/dist/components/forms/select/simple-select-styles.js.map +1 -0
  100. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  101. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +1 -126
  102. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/forms/switch/switch-styles.d.ts +151 -0
  104. package/dist/components/forms/switch/switch-styles.js +131 -0
  105. package/dist/components/forms/switch/switch-styles.js.map +1 -0
  106. package/dist/components/icons/RuiIcon.js.map +1 -1
  107. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +2 -28
  108. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/icons/icon-styles.d.ts +44 -0
  110. package/dist/components/icons/icon-styles.js +33 -0
  111. package/dist/components/icons/icon-styles.js.map +1 -0
  112. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  113. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +2 -12
  114. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  116. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +3 -13
  117. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/loaders/skeleton-base-styles.d.ts +25 -0
  119. package/dist/components/loaders/skeleton-base-styles.js +16 -0
  120. package/dist/components/loaders/skeleton-base-styles.js.map +1 -0
  121. package/dist/components/loaders/skeleton-loader-styles.d.ts +37 -0
  122. package/dist/components/loaders/skeleton-loader-styles.js +18 -0
  123. package/dist/components/loaders/skeleton-loader-styles.js.map +1 -0
  124. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  125. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +1 -83
  126. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  127. package/dist/components/overlays/badge/badge-styles.d.ts +193 -0
  128. package/dist/components/overlays/badge/badge-styles.js +88 -0
  129. package/dist/components/overlays/badge/badge-styles.js.map +1 -0
  130. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  131. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +3 -14
  132. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  133. package/dist/components/overlays/dialog/dialog-styles.d.ts +40 -0
  134. package/dist/components/overlays/dialog/dialog-styles.js +18 -0
  135. package/dist/components/overlays/dialog/dialog-styles.js.map +1 -0
  136. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  137. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -0
  138. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +113 -58
  139. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/overlays/menu/menu-styles.d.ts +58 -0
  141. package/dist/components/overlays/menu/menu-styles.js +25 -0
  142. package/dist/components/overlays/menu/menu-styles.js.map +1 -0
  143. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  144. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +4 -69
  145. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.d.ts +76 -0
  147. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js +72 -0
  148. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js.map +1 -0
  149. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  150. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +3 -3
  151. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  152. package/dist/components/overlays/notification/notification-styles.d.ts +1 -0
  153. package/dist/components/overlays/notification/notification-styles.js +7 -0
  154. package/dist/components/overlays/notification/notification-styles.js.map +1 -0
  155. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  156. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +4 -2
  157. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +42 -25
  158. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  159. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +2 -0
  160. package/dist/components/overlays/tooltip/tooltip-styles.js +3 -1
  161. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  162. package/dist/components/progress/RuiProgress.js.map +1 -1
  163. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +1 -133
  164. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/components/progress/progress-styles.d.ts +181 -0
  166. package/dist/components/progress/progress-styles.js +139 -0
  167. package/dist/components/progress/progress-styles.js.map +1 -0
  168. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  169. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +3 -13
  170. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/steppers/RuiStepper.js.map +1 -1
  172. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +4 -94
  173. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  175. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +2 -34
  176. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  177. package/dist/components/steppers/footer-stepper-styles.d.ts +28 -0
  178. package/dist/components/steppers/footer-stepper-styles.js +16 -0
  179. package/dist/components/steppers/footer-stepper-styles.js.map +1 -0
  180. package/dist/components/steppers/stepper-icon-styles.d.ts +60 -0
  181. package/dist/components/steppers/stepper-icon-styles.js +39 -0
  182. package/dist/components/steppers/stepper-icon-styles.js.map +1 -0
  183. package/dist/components/steppers/stepper-styles.d.ts +202 -0
  184. package/dist/components/steppers/stepper-styles.js +98 -0
  185. package/dist/components/steppers/stepper-styles.js.map +1 -0
  186. package/dist/components/tables/RuiTable.js.map +1 -1
  187. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +1 -32
  188. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  189. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  190. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -15
  191. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/tables/RuiTableErrorState.js.map +1 -1
  193. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js +2 -5
  194. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/tables/RuiTableHead.js.map +1 -1
  196. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -34
  197. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/tables/RuiTableLoadingState.js.map +1 -1
  199. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js +1 -8
  200. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  202. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +1 -30
  203. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  204. package/dist/components/tables/table-empty-state-styles.d.ts +43 -0
  205. package/dist/components/tables/table-empty-state-styles.js +20 -0
  206. package/dist/components/tables/table-empty-state-styles.js.map +1 -0
  207. package/dist/components/tables/table-error-state-styles.d.ts +36 -0
  208. package/dist/components/tables/table-error-state-styles.js +15 -0
  209. package/dist/components/tables/table-error-state-styles.js.map +1 -0
  210. package/dist/components/tables/table-head-styles.d.ts +91 -0
  211. package/dist/components/tables/table-head-styles.js +39 -0
  212. package/dist/components/tables/table-head-styles.js.map +1 -0
  213. package/dist/components/tables/table-loading-state-styles.d.ts +34 -0
  214. package/dist/components/tables/table-loading-state-styles.js +13 -0
  215. package/dist/components/tables/table-loading-state-styles.js.map +1 -0
  216. package/dist/components/tables/table-pagination-styles.d.ts +82 -0
  217. package/dist/components/tables/table-pagination-styles.js +35 -0
  218. package/dist/components/tables/table-pagination-styles.js.map +1 -0
  219. package/dist/components/tables/table-styles.d.ts +62 -0
  220. package/dist/components/tables/table-styles.js +37 -0
  221. package/dist/components/tables/table-styles.js.map +1 -0
  222. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  223. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +3 -84
  224. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/components/tabs/tab/tab-styles.d.ts +153 -0
  226. package/dist/components/tabs/tab/tab-styles.js +89 -0
  227. package/dist/components/tabs/tab/tab-styles.js.map +1 -0
  228. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  229. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +2 -137
  230. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  231. package/dist/components/tabs/tabs/tabs-styles.d.ts +168 -0
  232. package/dist/components/tabs/tabs/tabs-styles.js +142 -0
  233. package/dist/components/tabs/tabs/tabs-styles.js.map +1 -0
  234. package/dist/composables/floating.d.ts +3 -1
  235. package/dist/composables/floating.js +8 -9
  236. package/dist/composables/floating.js.map +1 -1
  237. package/dist/icons/icons_1.d.ts +1 -1
  238. package/dist/icons/icons_1.js +10 -9
  239. package/dist/icons/icons_1.js.map +1 -1
  240. package/dist/icons/icons_2.d.ts +1 -1
  241. package/dist/icons/icons_2.js +9 -11
  242. package/dist/icons/icons_2.js.map +1 -1
  243. package/dist/icons/icons_3.d.ts +1 -1
  244. package/dist/icons/icons_3.js +11 -5
  245. package/dist/icons/icons_3.js.map +1 -1
  246. package/dist/icons/icons_4.d.ts +1 -1
  247. package/dist/icons/icons_4.js +5 -10
  248. package/dist/icons/icons_4.js.map +1 -1
  249. package/dist/icons/icons_5.d.ts +1 -0
  250. package/dist/icons/icons_5.js +10 -1
  251. package/dist/icons/icons_5.js.map +1 -1
  252. package/dist/icons/index.d.ts +1 -1
  253. package/dist/icons/index.js +7 -6
  254. package/dist/icons/index.js.map +1 -1
  255. package/dist/index.js +6 -6
  256. package/dist/style.css +8 -0
  257. package/dist/utils/form-text-detail.d.ts +2 -0
  258. package/dist/utils/form-text-detail.js +5 -1
  259. package/dist/utils/form-text-detail.js.map +1 -1
  260. package/dist/web-types.json +11 -1
  261. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTabs.js","names":["_sfc_main"],"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":""}
1
+ {"version":3,"file":"RuiTabs.js","names":["_sfc_main"],"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 { tabsStyles } from './tabs-styles';\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\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 tabsStyles>>(() => tabsStyles({\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":""}
@@ -1,5 +1,4 @@
1
1
  import { get, set, watchImmediate } from "../../../vendor/@vueuse/shared/dist/index.js";
2
- import { tv } from "../../../utils/tv.js";
3
2
  import RuiIcon_default from "../../icons/RuiIcon.js";
4
3
  import RuiButton_default from "../../buttons/button/RuiButton.js";
5
4
  import { useKeyboardScroll } from "../../../composables/keyboard-scroll.js";
@@ -8,6 +7,7 @@ import { useTabIndicator } from "./use-tab-indicator.js";
8
7
  import { useTabKeyboard } from "./use-tab-keyboard.js";
9
8
  import { useTabRouting } from "./use-tab-routing.js";
10
9
  import { useTabScroll } from "./use-tab-scroll.js";
10
+ import { tabsStyles } from "./tabs-styles.js";
11
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";
12
12
  //#region src/components/tabs/tabs/RuiTabs.vue?vue&type=script&setup=true&lang.ts
13
13
  var _hoisted_1 = ["data-vertical"];
@@ -49,141 +49,6 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
49
49
  const bar = useTemplateRef("bar");
50
50
  const wrapper = useTemplateRef("wrapper");
51
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
- */
57
- const tabs = tv({
58
- slots: {
59
- root: "",
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"
64
- },
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
- },
77
- layout: {
78
- [TabLayout.horizontal]: {
79
- root: "flex h-fit",
80
- arrow: "w-8"
81
- },
82
- [TabLayout.vertical]: {
83
- root: "inline-flex flex-col",
84
- arrow: "h-8 w-full",
85
- wrapper: "flex-col w-full"
86
- }
87
- },
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
- }
111
- },
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
- }
186
- });
187
52
  const slots = useSlots();
188
53
  const { showArrows, prevArrowDisabled, nextArrowDisabled, onPrevSliderClick, onNextSliderClick, keepActiveTabVisible } = useTabScroll({
189
54
  bar,
@@ -202,7 +67,7 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
202
67
  variant: () => __props.variant
203
68
  });
204
69
  const layout = computed(() => __props.vertical ? TabLayout.vertical : TabLayout.horizontal);
205
- const ui = computed(() => tabs({
70
+ const ui = computed(() => tabsStyles({
206
71
  variant: __props.variant,
207
72
  layout: get(layout),
208
73
  indicatorPosition: __props.indicatorPosition,
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","RuiButton","_withCtx","RuiIcon","_createCommentVNode","_createElementVNode","_normalizeStyle","_Fragment","_renderList","_createBlock","_resolveDynamicComponent"],"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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"}
1
+ {"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","RuiButton","_withCtx","RuiIcon","_createCommentVNode","_createElementVNode","_normalizeStyle","_Fragment","_renderList","_createBlock","_resolveDynamicComponent"],"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 { tabsStyles } from './tabs-styles';\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\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 tabsStyles>>(() => tabsStyles({\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,168 @@
1
+ /**
2
+ * The bar. The underline variant draws its 1px track as a `before` line along
3
+ * the whole root, so the arrows sit on it too, and the 2px indicator, a layer
4
+ * above, covers it under the active tab.
5
+ */
6
+ export declare const tabsStyles: import("tailwind-variants").TVReturnType<{
7
+ variant: {
8
+ underline: {
9
+ root: string;
10
+ indicator: string;
11
+ };
12
+ segmented: {
13
+ root: string;
14
+ wrapper: string;
15
+ indicator: string;
16
+ };
17
+ };
18
+ layout: {
19
+ horizontal: {
20
+ root: string;
21
+ arrow: string;
22
+ };
23
+ vertical: {
24
+ root: string;
25
+ arrow: string;
26
+ wrapper: string;
27
+ };
28
+ };
29
+ indicatorPosition: {
30
+ start: {};
31
+ end: {};
32
+ };
33
+ color: {
34
+ primary: {};
35
+ secondary: {};
36
+ error: {};
37
+ warning: {};
38
+ info: {};
39
+ success: {};
40
+ };
41
+ wide: {
42
+ true: {
43
+ bar: string;
44
+ wrapper: string;
45
+ };
46
+ false: {};
47
+ };
48
+ animated: {
49
+ true: {
50
+ indicator: string;
51
+ };
52
+ false: {};
53
+ };
54
+ }, {
55
+ root: string;
56
+ arrow: string;
57
+ bar: string;
58
+ wrapper: string;
59
+ indicator: string;
60
+ }, undefined, {
61
+ variant: {
62
+ underline: {
63
+ root: string;
64
+ indicator: string;
65
+ };
66
+ segmented: {
67
+ root: string;
68
+ wrapper: string;
69
+ indicator: string;
70
+ };
71
+ };
72
+ layout: {
73
+ horizontal: {
74
+ root: string;
75
+ arrow: string;
76
+ };
77
+ vertical: {
78
+ root: string;
79
+ arrow: string;
80
+ wrapper: string;
81
+ };
82
+ };
83
+ indicatorPosition: {
84
+ start: {};
85
+ end: {};
86
+ };
87
+ color: {
88
+ primary: {};
89
+ secondary: {};
90
+ error: {};
91
+ warning: {};
92
+ info: {};
93
+ success: {};
94
+ };
95
+ wide: {
96
+ true: {
97
+ bar: string;
98
+ wrapper: string;
99
+ };
100
+ false: {};
101
+ };
102
+ animated: {
103
+ true: {
104
+ indicator: string;
105
+ };
106
+ false: {};
107
+ };
108
+ }, {
109
+ root: string;
110
+ arrow: string;
111
+ bar: string;
112
+ wrapper: string;
113
+ indicator: string;
114
+ }, import("tailwind-variants").TVReturnTypeLike<{
115
+ variant: {
116
+ underline: {
117
+ root: string;
118
+ indicator: string;
119
+ };
120
+ segmented: {
121
+ root: string;
122
+ wrapper: string;
123
+ indicator: string;
124
+ };
125
+ };
126
+ layout: {
127
+ horizontal: {
128
+ root: string;
129
+ arrow: string;
130
+ };
131
+ vertical: {
132
+ root: string;
133
+ arrow: string;
134
+ wrapper: string;
135
+ };
136
+ };
137
+ indicatorPosition: {
138
+ start: {};
139
+ end: {};
140
+ };
141
+ color: {
142
+ primary: {};
143
+ secondary: {};
144
+ error: {};
145
+ warning: {};
146
+ info: {};
147
+ success: {};
148
+ };
149
+ wide: {
150
+ true: {
151
+ bar: string;
152
+ wrapper: string;
153
+ };
154
+ false: {};
155
+ };
156
+ animated: {
157
+ true: {
158
+ indicator: string;
159
+ };
160
+ false: {};
161
+ };
162
+ }, {
163
+ root: string;
164
+ arrow: string;
165
+ bar: string;
166
+ wrapper: string;
167
+ indicator: string;
168
+ }>>;
@@ -0,0 +1,142 @@
1
+ import { tv } from "../../../utils/tv.js";
2
+ import { TabLayout, TabVariant } from "../tab-props.js";
3
+ //#region src/components/tabs/tabs/tabs-styles.ts
4
+ /**
5
+ * The bar. The underline variant draws its 1px track as a `before` line along
6
+ * the whole root, so the arrows sit on it too, and the 2px indicator, a layer
7
+ * above, covers it under the active tab.
8
+ */
9
+ var tabsStyles = tv({
10
+ slots: {
11
+ root: "",
12
+ arrow: "flex shrink-0 items-center justify-center",
13
+ bar: "no-scrollbar relative max-h-full overflow-auto outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2",
14
+ wrapper: "inline-flex max-w-none",
15
+ indicator: "pointer-events-none absolute"
16
+ },
17
+ variants: {
18
+ variant: {
19
+ [TabVariant.underline]: {
20
+ root: `relative before:pointer-events-none before:absolute before:bg-rui-divider before:content-['']`,
21
+ indicator: "z-1 bg-rui-primary"
22
+ },
23
+ [TabVariant.segmented]: {
24
+ root: "rounded-rui-panel bg-rui-neutral-200 p-0.5 dark:bg-rui-neutral-800",
25
+ wrapper: "gap-0.5",
26
+ indicator: "rounded-rui-control bg-rui-surface shadow-rui-control dark:bg-rui-neutral-700"
27
+ }
28
+ },
29
+ layout: {
30
+ [TabLayout.horizontal]: {
31
+ root: "flex h-fit",
32
+ arrow: "w-8"
33
+ },
34
+ [TabLayout.vertical]: {
35
+ root: "inline-flex flex-col",
36
+ arrow: "h-8 w-full",
37
+ wrapper: "flex-col w-full"
38
+ }
39
+ },
40
+ indicatorPosition: {
41
+ start: {},
42
+ end: {}
43
+ },
44
+ color: {
45
+ primary: {},
46
+ secondary: {},
47
+ error: {},
48
+ warning: {},
49
+ info: {},
50
+ success: {}
51
+ },
52
+ wide: {
53
+ true: {
54
+ bar: "w-full",
55
+ wrapper: "min-w-full"
56
+ },
57
+ false: {}
58
+ },
59
+ animated: {
60
+ true: { indicator: "transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none" },
61
+ false: {}
62
+ }
63
+ },
64
+ compoundVariants: [
65
+ {
66
+ variant: TabVariant.underline,
67
+ layout: TabLayout.horizontal,
68
+ indicatorPosition: "end",
69
+ class: {
70
+ root: "before:inset-x-0 before:bottom-0 before:h-px",
71
+ indicator: "bottom-0 h-0.5 rounded-t-full"
72
+ }
73
+ },
74
+ {
75
+ variant: TabVariant.underline,
76
+ layout: TabLayout.horizontal,
77
+ indicatorPosition: "start",
78
+ class: {
79
+ root: "before:inset-x-0 before:top-0 before:h-px",
80
+ indicator: "top-0 h-0.5 rounded-b-full"
81
+ }
82
+ },
83
+ {
84
+ variant: TabVariant.underline,
85
+ layout: TabLayout.vertical,
86
+ indicatorPosition: "end",
87
+ class: {
88
+ root: "before:inset-y-0 before:right-0 before:w-px",
89
+ indicator: "right-0 w-0.5 rounded-l-full"
90
+ }
91
+ },
92
+ {
93
+ variant: TabVariant.underline,
94
+ layout: TabLayout.vertical,
95
+ indicatorPosition: "start",
96
+ class: {
97
+ root: "before:inset-y-0 before:left-0 before:w-px",
98
+ indicator: "left-0 w-0.5 rounded-r-full"
99
+ }
100
+ },
101
+ {
102
+ variant: TabVariant.segmented,
103
+ layout: TabLayout.horizontal,
104
+ wide: false,
105
+ class: { root: "w-fit max-w-full" }
106
+ },
107
+ {
108
+ variant: TabVariant.underline,
109
+ color: "secondary",
110
+ class: { indicator: "bg-rui-secondary" }
111
+ },
112
+ {
113
+ variant: TabVariant.underline,
114
+ color: "error",
115
+ class: { indicator: "bg-rui-error" }
116
+ },
117
+ {
118
+ variant: TabVariant.underline,
119
+ color: "warning",
120
+ class: { indicator: "bg-rui-warning" }
121
+ },
122
+ {
123
+ variant: TabVariant.underline,
124
+ color: "info",
125
+ class: { indicator: "bg-rui-info" }
126
+ },
127
+ {
128
+ variant: TabVariant.underline,
129
+ color: "success",
130
+ class: { indicator: "bg-rui-success" }
131
+ }
132
+ ],
133
+ defaultVariants: {
134
+ variant: TabVariant.underline,
135
+ layout: TabLayout.horizontal,
136
+ indicatorPosition: "end"
137
+ }
138
+ });
139
+ //#endregion
140
+ export { tabsStyles };
141
+
142
+ //# sourceMappingURL=tabs-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-styles.js","names":[],"sources":["../../../../src/components/tabs/tabs/tabs-styles.ts"],"sourcesContent":["import { TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { tv } from '@/utils/tv';\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 */\nexport const tabsStyles = 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"],"mappings":";;;;;;;;AAQA,IAAa,aAAa,GAAG;CAC3B,OAAO;EACL,MAAM;EACN,OAAO;EAEP,KAAK;EACL,SAAS;EACT,WAAW;CACb;CACA,UAAU;EACR,SAAS;IACN,WAAW,YAAY;IACtB,MAAM;IACN,WAAW;GACb;IACC,WAAW,YAAY;IAEtB,MAAM;IACN,SAAS;IACT,WAAW;GACb;EACF;EACA,QAAQ;IACL,UAAU,aAAa;IAAE,MAAM;IAAc,OAAO;GAAM;IAC1D,UAAU,WAAW;IAAE,MAAM;IAAwB,OAAO;IAAc,SAAS;GAAkB;EACxG;EACA,mBAAmB;GACjB,OAAO,CAAC;GACR,KAAK,CAAC;EACR;EACA,OAAO;GACL,SAAS,CAAC;GACV,WAAW,CAAC;GACZ,OAAO,CAAC;GACR,SAAS,CAAC;GACV,MAAM,CAAC;GACP,SAAS,CAAC;EACZ;EACA,MAAM;GACJ,MAAM;IAAE,KAAK;IAAU,SAAS;GAAa;GAC7C,OAAO,CAAC;EACV;EACA,UAAU;GACR,MAAM,EAAE,WAAW,yFAAyF;GAC5G,OAAO,CAAC;EACV;CACF;CACA,kBAAkB;EAChB;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAY,mBAAmB;GAAO,OAAO;IAAE,MAAM;IAAgD,WAAW;GAAgC;EAAE;EACrM;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAY,mBAAmB;GAAS,OAAO;IAAE,MAAM;IAA6C,WAAW;GAA6B;EAAE;EACjM;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAU,mBAAmB;GAAO,OAAO;IAAE,MAAM;IAA+C,WAAW;GAA+B;EAAE;EACjM;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAU,mBAAmB;GAAS,OAAO;IAAE,MAAM;IAA8C,WAAW;GAA8B;EAAE;EAEjM;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAY,MAAM;GAAO,OAAO,EAAE,MAAM,mBAAmB;EAAE;EAEhH;GAAE,SAAS,WAAW;GAAW,OAAO;GAAa,OAAO,EAAE,WAAW,mBAAmB;EAAE;EAC9F;GAAE,SAAS,WAAW;GAAW,OAAO;GAAS,OAAO,EAAE,WAAW,eAAe;EAAE;EACtF;GAAE,SAAS,WAAW;GAAW,OAAO;GAAW,OAAO,EAAE,WAAW,iBAAiB;EAAE;EAC1F;GAAE,SAAS,WAAW;GAAW,OAAO;GAAQ,OAAO,EAAE,WAAW,cAAc;EAAE;EACpF;GAAE,SAAS,WAAW;GAAW,OAAO;GAAW,OAAO,EAAE,WAAW,iBAAiB;EAAE;CAC5F;CACA,iBAAiB;EAAE,SAAS,WAAW;EAAW,QAAQ,UAAU;EAAY,mBAAmB;CAAM;AAC3G,CAAC"}
@@ -64,5 +64,7 @@ export interface UseFloatingReturn {
64
64
  updatePosition: () => Promise<void>;
65
65
  visible: Ref<boolean>;
66
66
  }
67
- export declare function useFloating(options: MaybeRefOrGetter<FloatingOptions>, disabled?: MaybeRefOrGetter<boolean>, openDelay?: MaybeRefOrGetter<number>, closeDelay?: MaybeRefOrGetter<number>, virtualReference?: MaybeRefOrGetter<Element | VirtualElement | undefined>): UseFloatingReturn;
67
+ export declare function useFloating(options: MaybeRefOrGetter<FloatingOptions>, disabled?: MaybeRefOrGetter<boolean>, openDelay?: MaybeRefOrGetter<number>, closeDelay?: MaybeRefOrGetter<number>, virtualReference?: MaybeRefOrGetter<Element | VirtualElement | undefined>,
68
+ /** A popover template ref the caller already owns; the returned `popover` then stays unused. */
69
+ popoverElement?: Readonly<Ref<MaybeElement>>): UseFloatingReturn;
68
70
  export {};
@@ -1,7 +1,7 @@
1
1
  import { get, set } from "../vendor/@vueuse/shared/dist/index.js";
2
2
  import { unrefElement } from "../vendor/@vueuse/core/dist/index.js";
3
3
  import { useTimeoutManager } from "./timeout-manager.js";
4
- import { onMounted, readonly, ref, shallowRef, toValue, watchEffect } from "vue";
4
+ import { readonly, ref, shallowRef, toValue, watchEffect } from "vue";
5
5
  import { arrow, autoUpdate, computePosition, flip, offset, shift, size } from "@floating-ui/dom";
6
6
  //#region src/composables/floating.ts
7
7
  var Placement = {
@@ -83,9 +83,10 @@ function applyArrowStyles(arrowEl, result) {
83
83
  top: arrowData.y != null ? `${arrowData.y}px` : ""
84
84
  });
85
85
  }
86
- function useFloating(options, disabled = false, openDelay = 0, closeDelay = 0, virtualReference) {
86
+ function useFloating(options, disabled = false, openDelay = 0, closeDelay = 0, virtualReference, popoverElement) {
87
87
  const reference = ref();
88
88
  const popover = ref();
89
+ const popoverSource = popoverElement ?? popover;
89
90
  const open = shallowRef(false);
90
91
  const visible = shallowRef(false);
91
92
  const leavePending = shallowRef(false);
@@ -119,8 +120,8 @@ function useFloating(options, disabled = false, openDelay = 0, closeDelay = 0, v
119
120
  set(leavePending, true);
120
121
  }
121
122
  function getValidElements() {
122
- if (!get(popover) || !get(reference) && !toValue(virtualReference)) return null;
123
- const popoverEl = unrefElement(popover);
123
+ if (!get(popoverSource) || !get(reference) && !toValue(virtualReference)) return null;
124
+ const popoverEl = unrefElement(popoverSource);
124
125
  const referenceEl = toValue(virtualReference) || unrefElement(reference);
125
126
  if (!(popoverEl instanceof HTMLElement) || !referenceEl) return null;
126
127
  return {
@@ -168,11 +169,9 @@ function useFloating(options, disabled = false, openDelay = 0, closeDelay = 0, v
168
169
  cleanupAutoUpdate?.();
169
170
  cleanupAutoUpdate = null;
170
171
  }
171
- onMounted(() => {
172
- watchEffect((onCleanup) => {
173
- startAutoUpdate();
174
- onCleanup(stopAutoUpdate);
175
- });
172
+ watchEffect((onCleanup) => {
173
+ startAutoUpdate();
174
+ onCleanup(stopAutoUpdate);
176
175
  });
177
176
  return {
178
177
  currentPlacement: readonly(currentPlacement),