@rotki/ui-library 3.1.7 → 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 (257) 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-group/RuiButtonGroup.js.map +1 -1
  26. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +2 -138
  27. package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/buttons/button-group/button-group-styles.d.ts +142 -0
  29. package/dist/components/buttons/button-group/button-group-styles.js +143 -0
  30. package/dist/components/buttons/button-group/button-group-styles.js.map +1 -0
  31. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  32. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +1 -8
  33. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  34. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  35. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +2 -22
  36. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  38. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +3 -14
  39. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/calendar/calendar-grid-styles.d.ts +43 -0
  41. package/dist/components/calendar/calendar-grid-styles.js +26 -0
  42. package/dist/components/calendar/calendar-grid-styles.js.map +1 -0
  43. package/dist/components/calendar/calendar-menu-styles.d.ts +34 -0
  44. package/dist/components/calendar/calendar-menu-styles.js +17 -0
  45. package/dist/components/calendar/calendar-menu-styles.js.map +1 -0
  46. package/dist/components/calendar/calendar-styles.d.ts +16 -0
  47. package/dist/components/calendar/calendar-styles.js +13 -0
  48. package/dist/components/calendar/calendar-styles.js.map +1 -0
  49. package/dist/components/cards/RuiCard.js.map +1 -1
  50. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +3 -58
  51. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/components/cards/RuiCardHeader.js.map +1 -1
  53. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +2 -20
  54. package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  55. package/dist/components/cards/card-header-styles.d.ts +46 -0
  56. package/dist/components/cards/card-header-styles.js +24 -0
  57. package/dist/components/cards/card-header-styles.js.map +1 -0
  58. package/dist/components/cards/card-styles.d.ts +175 -0
  59. package/dist/components/cards/card-styles.js +62 -0
  60. package/dist/components/cards/card-styles.js.map +1 -0
  61. package/dist/components/chips/RuiChip.js.map +1 -1
  62. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +2 -241
  63. package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/chips/chip-styles.d.ts +223 -0
  65. package/dist/components/chips/chip-styles.js +246 -0
  66. package/dist/components/chips/chip-styles.js.map +1 -0
  67. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  68. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +3 -3
  69. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  71. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +3 -3
  72. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  74. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +3 -3
  75. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/color-picker/color-board-styles.d.ts +1 -0
  77. package/dist/components/color-picker/color-board-styles.js +7 -0
  78. package/dist/components/color-picker/color-board-styles.js.map +1 -0
  79. package/dist/components/color-picker/color-hue-styles.d.ts +1 -0
  80. package/dist/components/color-picker/color-hue-styles.js +7 -0
  81. package/dist/components/color-picker/color-hue-styles.js.map +1 -0
  82. package/dist/components/color-picker/color-picker-styles.d.ts +1 -0
  83. package/dist/components/color-picker/color-picker-styles.js +7 -0
  84. package/dist/components/color-picker/color-picker-styles.js.map +1 -0
  85. package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -1
  86. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +1 -11
  87. package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/forms/field-label/field-label-styles.d.ts +43 -0
  89. package/dist/components/forms/field-label/field-label-styles.js +16 -0
  90. package/dist/components/forms/field-label/field-label-styles.js.map +1 -0
  91. package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
  92. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +2 -11
  93. package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/components/forms/select/simple-select-styles.d.ts +2 -0
  95. package/dist/components/forms/select/simple-select-styles.js +15 -0
  96. package/dist/components/forms/select/simple-select-styles.js.map +1 -0
  97. package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
  98. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +1 -126
  99. package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  100. package/dist/components/forms/switch/switch-styles.d.ts +151 -0
  101. package/dist/components/forms/switch/switch-styles.js +131 -0
  102. package/dist/components/forms/switch/switch-styles.js.map +1 -0
  103. package/dist/components/icons/RuiIcon.js.map +1 -1
  104. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +2 -28
  105. package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/components/icons/icon-styles.d.ts +44 -0
  107. package/dist/components/icons/icon-styles.js +33 -0
  108. package/dist/components/icons/icon-styles.js.map +1 -0
  109. package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
  110. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +2 -12
  111. package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  112. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  113. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +3 -13
  114. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/loaders/skeleton-base-styles.d.ts +25 -0
  116. package/dist/components/loaders/skeleton-base-styles.js +16 -0
  117. package/dist/components/loaders/skeleton-base-styles.js.map +1 -0
  118. package/dist/components/loaders/skeleton-loader-styles.d.ts +37 -0
  119. package/dist/components/loaders/skeleton-loader-styles.js +18 -0
  120. package/dist/components/loaders/skeleton-loader-styles.js.map +1 -0
  121. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  122. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +1 -83
  123. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  124. package/dist/components/overlays/badge/badge-styles.d.ts +193 -0
  125. package/dist/components/overlays/badge/badge-styles.js +88 -0
  126. package/dist/components/overlays/badge/badge-styles.js.map +1 -0
  127. package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
  128. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +3 -14
  129. package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/overlays/dialog/dialog-styles.d.ts +40 -0
  131. package/dist/components/overlays/dialog/dialog-styles.js +18 -0
  132. package/dist/components/overlays/dialog/dialog-styles.js.map +1 -0
  133. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  134. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -0
  135. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +113 -58
  136. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/components/overlays/menu/menu-styles.d.ts +58 -0
  138. package/dist/components/overlays/menu/menu-styles.js +25 -0
  139. package/dist/components/overlays/menu/menu-styles.js.map +1 -0
  140. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
  141. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +4 -69
  142. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  143. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.d.ts +76 -0
  144. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js +72 -0
  145. package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js.map +1 -0
  146. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  147. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +3 -3
  148. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  149. package/dist/components/overlays/notification/notification-styles.d.ts +1 -0
  150. package/dist/components/overlays/notification/notification-styles.js +7 -0
  151. package/dist/components/overlays/notification/notification-styles.js.map +1 -0
  152. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  153. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +4 -2
  154. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +42 -25
  155. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  156. package/dist/components/overlays/tooltip/tooltip-styles.d.ts +2 -0
  157. package/dist/components/overlays/tooltip/tooltip-styles.js +3 -1
  158. package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
  159. package/dist/components/progress/RuiProgress.js.map +1 -1
  160. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +1 -133
  161. package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  162. package/dist/components/progress/progress-styles.d.ts +181 -0
  163. package/dist/components/progress/progress-styles.js +139 -0
  164. package/dist/components/progress/progress-styles.js.map +1 -0
  165. package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
  166. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +3 -13
  167. package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/components/steppers/RuiStepper.js.map +1 -1
  169. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +4 -94
  170. package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  171. package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
  172. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +2 -34
  173. package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
  174. package/dist/components/steppers/footer-stepper-styles.d.ts +28 -0
  175. package/dist/components/steppers/footer-stepper-styles.js +16 -0
  176. package/dist/components/steppers/footer-stepper-styles.js.map +1 -0
  177. package/dist/components/steppers/stepper-icon-styles.d.ts +60 -0
  178. package/dist/components/steppers/stepper-icon-styles.js +39 -0
  179. package/dist/components/steppers/stepper-icon-styles.js.map +1 -0
  180. package/dist/components/steppers/stepper-styles.d.ts +202 -0
  181. package/dist/components/steppers/stepper-styles.js +98 -0
  182. package/dist/components/steppers/stepper-styles.js.map +1 -0
  183. package/dist/components/tables/RuiTable.js.map +1 -1
  184. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +1 -32
  185. package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  186. package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
  187. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -15
  188. package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  189. package/dist/components/tables/RuiTableErrorState.js.map +1 -1
  190. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js +2 -5
  191. package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  192. package/dist/components/tables/RuiTableHead.js.map +1 -1
  193. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -34
  194. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/tables/RuiTableLoadingState.js.map +1 -1
  196. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js +1 -8
  197. package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  198. package/dist/components/tables/RuiTablePagination.js.map +1 -1
  199. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +1 -30
  200. package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  201. package/dist/components/tables/table-empty-state-styles.d.ts +43 -0
  202. package/dist/components/tables/table-empty-state-styles.js +20 -0
  203. package/dist/components/tables/table-empty-state-styles.js.map +1 -0
  204. package/dist/components/tables/table-error-state-styles.d.ts +36 -0
  205. package/dist/components/tables/table-error-state-styles.js +15 -0
  206. package/dist/components/tables/table-error-state-styles.js.map +1 -0
  207. package/dist/components/tables/table-head-styles.d.ts +91 -0
  208. package/dist/components/tables/table-head-styles.js +39 -0
  209. package/dist/components/tables/table-head-styles.js.map +1 -0
  210. package/dist/components/tables/table-loading-state-styles.d.ts +34 -0
  211. package/dist/components/tables/table-loading-state-styles.js +13 -0
  212. package/dist/components/tables/table-loading-state-styles.js.map +1 -0
  213. package/dist/components/tables/table-pagination-styles.d.ts +82 -0
  214. package/dist/components/tables/table-pagination-styles.js +35 -0
  215. package/dist/components/tables/table-pagination-styles.js.map +1 -0
  216. package/dist/components/tables/table-styles.d.ts +62 -0
  217. package/dist/components/tables/table-styles.js +37 -0
  218. package/dist/components/tables/table-styles.js.map +1 -0
  219. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  220. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +3 -84
  221. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  222. package/dist/components/tabs/tab/tab-styles.d.ts +153 -0
  223. package/dist/components/tabs/tab/tab-styles.js +89 -0
  224. package/dist/components/tabs/tab/tab-styles.js.map +1 -0
  225. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  226. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +2 -137
  227. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  228. package/dist/components/tabs/tabs/tabs-styles.d.ts +168 -0
  229. package/dist/components/tabs/tabs/tabs-styles.js +142 -0
  230. package/dist/components/tabs/tabs/tabs-styles.js.map +1 -0
  231. package/dist/composables/floating.d.ts +3 -1
  232. package/dist/composables/floating.js +8 -9
  233. package/dist/composables/floating.js.map +1 -1
  234. package/dist/icons/icons_1.d.ts +1 -1
  235. package/dist/icons/icons_1.js +10 -9
  236. package/dist/icons/icons_1.js.map +1 -1
  237. package/dist/icons/icons_2.d.ts +1 -1
  238. package/dist/icons/icons_2.js +9 -11
  239. package/dist/icons/icons_2.js.map +1 -1
  240. package/dist/icons/icons_3.d.ts +1 -1
  241. package/dist/icons/icons_3.js +11 -5
  242. package/dist/icons/icons_3.js.map +1 -1
  243. package/dist/icons/icons_4.d.ts +1 -1
  244. package/dist/icons/icons_4.js +5 -10
  245. package/dist/icons/icons_4.js.map +1 -1
  246. package/dist/icons/icons_5.d.ts +1 -0
  247. package/dist/icons/icons_5.js +10 -1
  248. package/dist/icons/icons_5.js.map +1 -1
  249. package/dist/icons/index.d.ts +1 -1
  250. package/dist/icons/index.js +7 -6
  251. package/dist/icons/index.js.map +1 -1
  252. package/dist/index.js +6 -6
  253. package/dist/utils/form-text-detail.d.ts +2 -0
  254. package/dist/utils/form-text-detail.js +5 -1
  255. package/dist/utils/form-text-detail.js.map +1 -1
  256. package/dist/web-types.json +11 -1
  257. package/package.json +1 -1
@@ -1,7 +1,8 @@
1
1
  import { get } from "../../../vendor/@vueuse/shared/dist/index.js";
2
- import { cn, tv } from "../../../utils/tv.js";
2
+ import { cn } from "../../../utils/tv.js";
3
3
  import { TabAlignment, TabIndicatorPosition, TabLayout, TabVariant } from "../tab-props.js";
4
4
  import { useTabLink } from "./use-tab-link.js";
5
+ import { tabStyles } from "./tab-styles.js";
5
6
  import { computed, createBlock, createCommentVNode, createElementVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderSlot, resolveDynamicComponent, unref, useId, useSlots, withCtx } from "vue";
6
7
  //#region src/components/tabs/tab/RuiTab.vue?vue&type=script&setup=true&lang.ts
7
8
  var RuiTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -46,88 +47,6 @@ var RuiTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
46
47
  setup(__props, { emit: __emit }) {
47
48
  const emit = __emit;
48
49
  const slots = useSlots();
49
- /**
50
- * A tab is a plain button or link: RuiTabs draws the active indicator, so a tab
51
- * only sets its label color, and its hover fill. On the underline bar the fill
52
- * hugs the label rather than the 40px cell, so the bar stays calm.
53
- */
54
- const tab = tv({
55
- slots: {
56
- root: [
57
- "group relative inline-flex shrink-0 items-center whitespace-nowrap rounded-rui-control",
58
- "text-sm font-medium text-rui-text-secondary transition-colors duration-150 [--rui-icon-size:1rem]",
59
- "outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2"
60
- ].join(" "),
61
- content: "inline-flex items-center gap-2 rounded-rui-control transition-colors duration-150"
62
- },
63
- variants: {
64
- variant: {
65
- [TabVariant.underline]: {
66
- root: "px-1",
67
- content: "h-8 px-2"
68
- },
69
- [TabVariant.segmented]: { root: "z-1 h-8 px-3" }
70
- },
71
- layout: {
72
- [TabLayout.horizontal]: {},
73
- [TabLayout.vertical]: { root: "w-full" }
74
- },
75
- align: {
76
- start: { root: "justify-start text-left rtl:justify-end rtl:text-right" },
77
- center: { root: "justify-center text-center" },
78
- end: { root: "justify-end text-right rtl:justify-start rtl:text-left" }
79
- },
80
- grow: { true: { root: "grow" } },
81
- active: {
82
- true: { root: "text-rui-text" },
83
- false: {}
84
- },
85
- disabled: {
86
- true: { root: "cursor-not-allowed text-rui-text-disabled" },
87
- false: { root: "cursor-pointer hover:text-rui-text" }
88
- }
89
- },
90
- compoundVariants: [
91
- {
92
- variant: TabVariant.underline,
93
- layout: TabLayout.horizontal,
94
- class: { root: "h-10" }
95
- },
96
- {
97
- variant: TabVariant.underline,
98
- layout: TabLayout.horizontal,
99
- disabled: false,
100
- class: { content: "group-hover:bg-rui-hover" }
101
- },
102
- {
103
- variant: TabVariant.underline,
104
- layout: TabLayout.vertical,
105
- class: {
106
- root: "min-h-9 px-3",
107
- content: "h-auto px-0 py-2"
108
- }
109
- },
110
- {
111
- variant: TabVariant.underline,
112
- layout: TabLayout.vertical,
113
- disabled: false,
114
- class: { root: "hover:bg-rui-hover" }
115
- },
116
- {
117
- variant: TabVariant.underline,
118
- layout: TabLayout.vertical,
119
- active: true,
120
- class: { root: "bg-rui-hover" }
121
- }
122
- ],
123
- defaultVariants: {
124
- variant: TabVariant.underline,
125
- layout: TabLayout.horizontal,
126
- align: "center",
127
- active: false,
128
- disabled: false
129
- }
130
- });
131
50
  const { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({
132
51
  link: () => __props.link,
133
52
  to: () => __props.to,
@@ -136,7 +55,7 @@ var RuiTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCom
136
55
  const layout = computed(() => __props.vertical ? TabLayout.vertical : TabLayout.horizontal);
137
56
  const isSelf = computed(() => __props.target === "_self");
138
57
  const isEffectivelyActive = computed(() => __props.active || get(isRouteActive));
139
- const ui = computed(() => tab({
58
+ const ui = computed(() => tabStyles({
140
59
  variant: __props.variant,
141
60
  layout: get(layout),
142
61
  align: __props.align,
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTab.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_unref","_mergeProps","_withCtx","_createElementVNode","_normalizeClass","_renderSlot","_createCommentVNode"],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport { TabAlignment, TabIndicatorPosition, TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n variant?: TabVariant;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n variant = TabVariant.underline,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\n/**\n * A tab is a plain button or link: RuiTabs draws the active indicator, so a tab\n * only sets its label color, and its hover fill. On the underline bar the fill\n * hugs the label rather than the 40px cell, so the bar stays calm.\n */\nconst tab = tv({\n slots: {\n root: [\n 'group relative inline-flex shrink-0 items-center whitespace-nowrap rounded-rui-control',\n 'text-sm font-medium text-rui-text-secondary transition-colors duration-150 [--rui-icon-size:1rem]',\n // inset, since the scrolling bar would clip a ring drawn outside the tab\n 'outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2',\n ].join(' '),\n content: 'inline-flex items-center gap-2 rounded-rui-control transition-colors duration-150',\n },\n variants: {\n variant: {\n [TabVariant.underline]: { root: 'px-1', content: 'h-8 px-2' },\n // above the sliding pill, which RuiTabs renders behind the tabs\n [TabVariant.segmented]: { root: 'z-1 h-8 px-3' },\n },\n layout: {\n [TabLayout.horizontal]: {},\n [TabLayout.vertical]: { root: 'w-full' },\n },\n align: {\n start: { root: 'justify-start text-left rtl:justify-end rtl:text-right' },\n center: { root: 'justify-center text-center' },\n end: { root: 'justify-end text-right rtl:justify-start rtl:text-left' },\n },\n grow: {\n true: { root: 'grow' },\n },\n active: {\n true: { root: 'text-rui-text' },\n false: {},\n },\n disabled: {\n true: { root: 'cursor-not-allowed text-rui-text-disabled' },\n false: { root: 'cursor-pointer hover:text-rui-text' },\n },\n },\n compoundVariants: [\n { variant: TabVariant.underline, layout: TabLayout.horizontal, class: { root: 'h-10' } },\n { variant: TabVariant.underline, layout: TabLayout.horizontal, disabled: false, class: { content: 'group-hover:bg-rui-hover' } },\n // a vertical list fills the whole row on hover and keeps that fill on the selected row\n { variant: TabVariant.underline, layout: TabLayout.vertical, class: { root: 'min-h-9 px-3', content: 'h-auto px-0 py-2' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, disabled: false, class: { root: 'hover:bg-rui-hover' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, active: true, class: { root: 'bg-rui-hover' } },\n ],\n defaultVariants: {\n variant: TabVariant.underline,\n layout: TabLayout.horizontal,\n align: 'center',\n active: false,\n disabled: false,\n },\n});\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\nconst ui = computed<ReturnType<typeof tab>>(() => tab({\n variant,\n layout: get(layout),\n align,\n grow,\n disabled,\n active: get(isEffectivelyActive),\n}));\n\nfunction onClick(event: MouseEvent): void {\n if (disabled) {\n event.preventDefault();\n return;\n }\n\n emit('click', value);\n if (navigate && get(isSelf))\n navigate(event);\n}\n</script>\n\n<template>\n <component\n :is=\"isLink ? 'a' : 'button'\"\n :type=\"isLink ? undefined : 'button'\"\n :class=\"[\n ui.root({ class: cn(classNames?.root) }),\n isEffectivelyActive && classNames?.active,\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :data-variant=\"variant\"\n :data-color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"isLink ? undefined : disabled\"\n :aria-disabled=\"isLink && disabled ? 'true' : undefined\"\n :href=\"isLink && !isSelf && !disabled ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n :tabindex=\"isEffectivelyActive && !disabled ? 0 : -1\"\n v-bind=\"$attrs\"\n @click=\"onClick($event)\"\n >\n <span :class=\"ui.content()\">\n <slot\n v-if=\"slots.prepend\"\n name=\"prepend\"\n />\n <slot />\n <slot\n v-if=\"slots.append\"\n name=\"append\"\n />\n </span>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDA,MAAM,OAAO;EAIb,MAAM,QAAQC,SAAA;;;;;;EAWd,MAAM,MAAM,GAAG;GACb,OAAO;IACL,MAAM;KACJ;KACA;KAEA;IACF,CAAC,CAAC,KAAK,GAAG;IACV,SAAS;GACX;GACA,UAAU;IACR,SAAS;MACN,WAAW,YAAY;MAAE,MAAM;MAAQ,SAAS;KAAW;MAE3D,WAAW,YAAY,EAAE,MAAM,eAAe;IACjD;IACA,QAAQ;MACL,UAAU,aAAa,CAAC;MACxB,UAAU,WAAW,EAAE,MAAM,SAAS;IACzC;IACA,OAAO;KACL,OAAO,EAAE,MAAM,yDAAyD;KACxE,QAAQ,EAAE,MAAM,6BAA6B;KAC7C,KAAK,EAAE,MAAM,yDAAyD;IACxE;IACA,MAAM,EACJ,MAAM,EAAE,MAAM,OAAO,EACvB;IACA,QAAQ;KACN,MAAM,EAAE,MAAM,gBAAgB;KAC9B,OAAO,CAAC;IACV;IACA,UAAU;KACR,MAAM,EAAE,MAAM,4CAA4C;KAC1D,OAAO,EAAE,MAAM,qCAAqC;IACtD;GACF;GACA,kBAAkB;IAChB;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAY,OAAO,EAAE,MAAM,OAAO;IAAE;IACvF;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAY,UAAU;KAAO,OAAO,EAAE,SAAS,2BAA2B;IAAE;IAE/H;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAU,OAAO;MAAE,MAAM;MAAgB,SAAS;KAAmB;IAAE;IAC1H;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAU,UAAU;KAAO,OAAO,EAAE,MAAM,qBAAqB;IAAE;IACpH;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAU,QAAQ;KAAM,OAAO,EAAE,MAAM,eAAe;IAAE;GAC7G;GACA,iBAAiB;IACf,SAAS,WAAW;IACpB,QAAQ,UAAU;IAClB,OAAO;IACP,QAAQ;IACR,UAAU;GACZ;EACF,CAAC;EAED,MAAM,EAAE,eAAe,MAAM,UAAU,UAAU,WAAW,WAAW;GACrE,YAAY,QAAA;GACZ,UAAU,QAAA;GACV,aAAa,QAAA;EACf,CAAC;EAED,MAAM,SAAS,eAA0B,QAAA,WAAW,UAAU,WAAW,UAAU,UAAU;EAC7F,MAAM,SAAS,eAAwB,QAAA,WAAW,OAAO;EACzD,MAAM,sBAAsB,eAAwB,QAAA,UAAU,IAAI,aAAa,CAAC;EAChF,MAAM,KAAK,eAAuC,IAAI;GACpD,SAAM,QAAA;GACN,QAAQ,IAAI,MAAM;GAClB,OAAI,QAAA;GACJ,MAAG,QAAA;GACH,UAAO,QAAA;GACP,QAAQ,IAAI,mBAAmB;EACjC,CAAC,CAAC;EAEF,SAAS,QAAQ,OAAyB;GACxC,IAAI,QAAA,UAAU;IACZ,MAAM,eAAe;IACrB;GACF;GAEA,KAAK,SAAS,QAAA,KAAK;GACnB,IAAI,YAAY,IAAI,MAAM,GACxB,SAAS,KAAK;EAClB;;GAIE,OAAAC,UAAA,GAAAC,YAkCYC,wBAjCLC,MAAA,MAAA,IAAM,MAAA,QAAA,GADbC,WAkCY;IAhCT,MAAMD,MAAA,MAAA,IAAS,KAAA,IAAS;IACxB,OAAK,CAAUA,MAAA,EAAA,CAAE,CAAC,KAAI,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAC,QAAA,YAAY,IAAI,EAAA,CAAA,GAAYA,MAAA,mBAAA,KAAuB,QAAA,YAAY,MAAA;IAIlG,mBAAiBA,MAAA,mBAAA,KAAuB,KAAA;IACxC,cAAY,QAAA;IACZ,2BAAyB,QAAA;IACzB,iBAAe,QAAA,YAAY,KAAA;IAC3B,gBAAc,QAAA;IACd,cAAYA,MAAA,mBAAA,IAAsB,QAAA,QAAQ,KAAA;IAC1C,UAAUA,MAAA,MAAA,IAAS,KAAA,IAAY,QAAA;IAC/B,iBAAeA,MAAA,MAAA,KAAU,QAAA,WAAQ,SAAY,KAAA;IAC7C,MAAMA,MAAA,MAAA,KAAM,CAAKA,MAAA,MAAA,KAAM,CAAK,QAAA,WAAWA,MAAA,QAAA,IAAW,KAAA;IAClD,QAAQA,MAAA,MAAA,IAAS,QAAA,SAAS,KAAA;IAC3B,MAAK;IACJ,iBAAeA,MAAA,mBAAA;IACf,UAAUA,MAAA,mBAAA,KAAmB,CAAK,QAAA,WAAQ,IAAA;GACnCL,GAAAA,KAAAA,QAAM,EACb,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAQ,MAAM,GAAA,CAAA,GAAA;IAEtB,SAAAO,cAUO,CAVPC,mBAUO,QAAA,EAVA,OAAKC,eAAEJ,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA,EAAA,GAAA;KAEd,MAAM,UADdK,WAGE,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA;KACFA,WAAQ,KAAA,QAAA,SAAA;KAEA,MAAM,SADdA,WAGE,KAAA,QAAA,UAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA"}
1
+ {"version":3,"file":"RuiTab.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_useSlots","_openBlock","_createBlock","_resolveDynamicComponent","_unref","_mergeProps","_withCtx","_createElementVNode","_normalizeClass","_renderSlot","_createCommentVNode"],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport { TabAlignment, TabIndicatorPosition, TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { cn } from '@/utils/tv';\nimport { tabStyles } from './tab-styles';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n variant?: TabVariant;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n variant = TabVariant.underline,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\nconst ui = computed<ReturnType<typeof tabStyles>>(() => tabStyles({\n variant,\n layout: get(layout),\n align,\n grow,\n disabled,\n active: get(isEffectivelyActive),\n}));\n\nfunction onClick(event: MouseEvent): void {\n if (disabled) {\n event.preventDefault();\n return;\n }\n\n emit('click', value);\n if (navigate && get(isSelf))\n navigate(event);\n}\n</script>\n\n<template>\n <component\n :is=\"isLink ? 'a' : 'button'\"\n :type=\"isLink ? undefined : 'button'\"\n :class=\"[\n ui.root({ class: cn(classNames?.root) }),\n isEffectivelyActive && classNames?.active,\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :data-variant=\"variant\"\n :data-color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"isLink ? undefined : disabled\"\n :aria-disabled=\"isLink && disabled ? 'true' : undefined\"\n :href=\"isLink && !isSelf && !disabled ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n :tabindex=\"isEffectivelyActive && !disabled ? 0 : -1\"\n v-bind=\"$attrs\"\n @click=\"onClick($event)\"\n >\n <span :class=\"ui.content()\">\n <slot\n v-if=\"slots.prepend\"\n name=\"prepend\"\n />\n <slot />\n <slot\n v-if=\"slots.append\"\n name=\"append\"\n />\n </span>\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqDA,MAAM,OAAO;EAIb,MAAM,QAAQC,SAAA;EAMd,MAAM,EAAE,eAAe,MAAM,UAAU,UAAU,WAAW,WAAW;GACrE,YAAY,QAAA;GACZ,UAAU,QAAA;GACV,aAAa,QAAA;EACf,CAAC;EAED,MAAM,SAAS,eAA0B,QAAA,WAAW,UAAU,WAAW,UAAU,UAAU;EAC7F,MAAM,SAAS,eAAwB,QAAA,WAAW,OAAO;EACzD,MAAM,sBAAsB,eAAwB,QAAA,UAAU,IAAI,aAAa,CAAC;EAChF,MAAM,KAAK,eAA6C,UAAU;GAChE,SAAM,QAAA;GACN,QAAQ,IAAI,MAAM;GAClB,OAAI,QAAA;GACJ,MAAG,QAAA;GACH,UAAO,QAAA;GACP,QAAQ,IAAI,mBAAmB;EACjC,CAAC,CAAC;EAEF,SAAS,QAAQ,OAAyB;GACxC,IAAI,QAAA,UAAU;IACZ,MAAM,eAAe;IACrB;GACF;GAEA,KAAK,SAAS,QAAA,KAAK;GACnB,IAAI,YAAY,IAAI,MAAM,GACxB,SAAS,KAAK;EAClB;;GAIE,OAAAC,UAAA,GAAAC,YAkCYC,wBAjCLC,MAAA,MAAA,IAAM,MAAA,QAAA,GADbC,WAkCY;IAhCT,MAAMD,MAAA,MAAA,IAAS,KAAA,IAAS;IACxB,OAAK,CAAUA,MAAA,EAAA,CAAE,CAAC,KAAI,EAAA,OAAUA,MAAA,EAAA,CAAE,CAAC,QAAA,YAAY,IAAI,EAAA,CAAA,GAAYA,MAAA,mBAAA,KAAuB,QAAA,YAAY,MAAA;IAIlG,mBAAiBA,MAAA,mBAAA,KAAuB,KAAA;IACxC,cAAY,QAAA;IACZ,2BAAyB,QAAA;IACzB,iBAAe,QAAA,YAAY,KAAA;IAC3B,gBAAc,QAAA;IACd,cAAYA,MAAA,mBAAA,IAAsB,QAAA,QAAQ,KAAA;IAC1C,UAAUA,MAAA,MAAA,IAAS,KAAA,IAAY,QAAA;IAC/B,iBAAeA,MAAA,MAAA,KAAU,QAAA,WAAQ,SAAY,KAAA;IAC7C,MAAMA,MAAA,MAAA,KAAM,CAAKA,MAAA,MAAA,KAAM,CAAK,QAAA,WAAWA,MAAA,QAAA,IAAW,KAAA;IAClD,QAAQA,MAAA,MAAA,IAAS,QAAA,SAAS,KAAA;IAC3B,MAAK;IACJ,iBAAeA,MAAA,mBAAA;IACf,UAAUA,MAAA,mBAAA,KAAmB,CAAK,QAAA,WAAQ,IAAA;GACnCL,GAAAA,KAAAA,QAAM,EACb,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAQ,MAAM,GAAA,CAAA,GAAA;IAEtB,SAAAO,cAUO,CAVPC,mBAUO,QAAA,EAVA,OAAKC,eAAEJ,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA,EAAA,GAAA;KAEd,MAAM,UADdK,WAGE,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA;KACFA,WAAQ,KAAA,QAAA,SAAA;KAEA,MAAM,SADdA,WAGE,KAAA,QAAA,UAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,mBAAA,IAAA,IAAA"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * A tab is a plain button or link: RuiTabs draws the active indicator, so a tab
3
+ * only sets its label color, and its hover fill. On the underline bar the fill
4
+ * hugs the label rather than the 40px cell, so the bar stays calm.
5
+ */
6
+ export declare const tabStyles: import("tailwind-variants").TVReturnType<{
7
+ variant: {
8
+ underline: {
9
+ root: string;
10
+ content: string;
11
+ };
12
+ segmented: {
13
+ root: string;
14
+ };
15
+ };
16
+ layout: {
17
+ horizontal: {};
18
+ vertical: {
19
+ root: string;
20
+ };
21
+ };
22
+ align: {
23
+ start: {
24
+ root: string;
25
+ };
26
+ center: {
27
+ root: string;
28
+ };
29
+ end: {
30
+ root: string;
31
+ };
32
+ };
33
+ grow: {
34
+ true: {
35
+ root: string;
36
+ };
37
+ };
38
+ active: {
39
+ true: {
40
+ root: string;
41
+ };
42
+ false: {};
43
+ };
44
+ disabled: {
45
+ true: {
46
+ root: string;
47
+ };
48
+ false: {
49
+ root: string;
50
+ };
51
+ };
52
+ }, {
53
+ root: string;
54
+ content: string;
55
+ }, undefined, {
56
+ variant: {
57
+ underline: {
58
+ root: string;
59
+ content: string;
60
+ };
61
+ segmented: {
62
+ root: string;
63
+ };
64
+ };
65
+ layout: {
66
+ horizontal: {};
67
+ vertical: {
68
+ root: string;
69
+ };
70
+ };
71
+ align: {
72
+ start: {
73
+ root: string;
74
+ };
75
+ center: {
76
+ root: string;
77
+ };
78
+ end: {
79
+ root: string;
80
+ };
81
+ };
82
+ grow: {
83
+ true: {
84
+ root: string;
85
+ };
86
+ };
87
+ active: {
88
+ true: {
89
+ root: string;
90
+ };
91
+ false: {};
92
+ };
93
+ disabled: {
94
+ true: {
95
+ root: string;
96
+ };
97
+ false: {
98
+ root: string;
99
+ };
100
+ };
101
+ }, {
102
+ root: string;
103
+ content: string;
104
+ }, import("tailwind-variants").TVReturnTypeLike<{
105
+ variant: {
106
+ underline: {
107
+ root: string;
108
+ content: string;
109
+ };
110
+ segmented: {
111
+ root: string;
112
+ };
113
+ };
114
+ layout: {
115
+ horizontal: {};
116
+ vertical: {
117
+ root: string;
118
+ };
119
+ };
120
+ align: {
121
+ start: {
122
+ root: string;
123
+ };
124
+ center: {
125
+ root: string;
126
+ };
127
+ end: {
128
+ root: string;
129
+ };
130
+ };
131
+ grow: {
132
+ true: {
133
+ root: string;
134
+ };
135
+ };
136
+ active: {
137
+ true: {
138
+ root: string;
139
+ };
140
+ false: {};
141
+ };
142
+ disabled: {
143
+ true: {
144
+ root: string;
145
+ };
146
+ false: {
147
+ root: string;
148
+ };
149
+ };
150
+ }, {
151
+ root: string;
152
+ content: string;
153
+ }>>;
@@ -0,0 +1,89 @@
1
+ import { tv } from "../../../utils/tv.js";
2
+ import { TabLayout, TabVariant } from "../tab-props.js";
3
+ //#region src/components/tabs/tab/tab-styles.ts
4
+ /**
5
+ * A tab is a plain button or link: RuiTabs draws the active indicator, so a tab
6
+ * only sets its label color, and its hover fill. On the underline bar the fill
7
+ * hugs the label rather than the 40px cell, so the bar stays calm.
8
+ */
9
+ var tabStyles = tv({
10
+ slots: {
11
+ root: [
12
+ "group relative inline-flex shrink-0 items-center whitespace-nowrap rounded-rui-control",
13
+ "text-sm font-medium text-rui-text-secondary transition-colors duration-150 [--rui-icon-size:1rem]",
14
+ "outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2"
15
+ ].join(" "),
16
+ content: "inline-flex items-center gap-2 rounded-rui-control transition-colors duration-150"
17
+ },
18
+ variants: {
19
+ variant: {
20
+ [TabVariant.underline]: {
21
+ root: "px-1",
22
+ content: "h-8 px-2"
23
+ },
24
+ [TabVariant.segmented]: { root: "z-1 h-8 px-3" }
25
+ },
26
+ layout: {
27
+ [TabLayout.horizontal]: {},
28
+ [TabLayout.vertical]: { root: "w-full" }
29
+ },
30
+ align: {
31
+ start: { root: "justify-start text-left rtl:justify-end rtl:text-right" },
32
+ center: { root: "justify-center text-center" },
33
+ end: { root: "justify-end text-right rtl:justify-start rtl:text-left" }
34
+ },
35
+ grow: { true: { root: "grow" } },
36
+ active: {
37
+ true: { root: "text-rui-text" },
38
+ false: {}
39
+ },
40
+ disabled: {
41
+ true: { root: "cursor-not-allowed text-rui-text-disabled" },
42
+ false: { root: "cursor-pointer hover:text-rui-text" }
43
+ }
44
+ },
45
+ compoundVariants: [
46
+ {
47
+ variant: TabVariant.underline,
48
+ layout: TabLayout.horizontal,
49
+ class: { root: "h-10" }
50
+ },
51
+ {
52
+ variant: TabVariant.underline,
53
+ layout: TabLayout.horizontal,
54
+ disabled: false,
55
+ class: { content: "group-hover:bg-rui-hover" }
56
+ },
57
+ {
58
+ variant: TabVariant.underline,
59
+ layout: TabLayout.vertical,
60
+ class: {
61
+ root: "min-h-9 px-3",
62
+ content: "h-auto px-0 py-2"
63
+ }
64
+ },
65
+ {
66
+ variant: TabVariant.underline,
67
+ layout: TabLayout.vertical,
68
+ disabled: false,
69
+ class: { root: "hover:bg-rui-hover" }
70
+ },
71
+ {
72
+ variant: TabVariant.underline,
73
+ layout: TabLayout.vertical,
74
+ active: true,
75
+ class: { root: "bg-rui-hover" }
76
+ }
77
+ ],
78
+ defaultVariants: {
79
+ variant: TabVariant.underline,
80
+ layout: TabLayout.horizontal,
81
+ align: "center",
82
+ active: false,
83
+ disabled: false
84
+ }
85
+ });
86
+ //#endregion
87
+ export { tabStyles };
88
+
89
+ //# sourceMappingURL=tab-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-styles.js","names":[],"sources":["../../../../src/components/tabs/tab/tab-styles.ts"],"sourcesContent":["import { TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * A tab is a plain button or link: RuiTabs draws the active indicator, so a tab\n * only sets its label color, and its hover fill. On the underline bar the fill\n * hugs the label rather than the 40px cell, so the bar stays calm.\n */\nexport const tabStyles = tv({\n slots: {\n root: [\n 'group relative inline-flex shrink-0 items-center whitespace-nowrap rounded-rui-control',\n 'text-sm font-medium text-rui-text-secondary transition-colors duration-150 [--rui-icon-size:1rem]',\n // inset, since the scrolling bar would clip a ring drawn outside the tab\n 'outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2',\n ].join(' '),\n content: 'inline-flex items-center gap-2 rounded-rui-control transition-colors duration-150',\n },\n variants: {\n variant: {\n [TabVariant.underline]: { root: 'px-1', content: 'h-8 px-2' },\n // above the sliding pill, which RuiTabs renders behind the tabs\n [TabVariant.segmented]: { root: 'z-1 h-8 px-3' },\n },\n layout: {\n [TabLayout.horizontal]: {},\n [TabLayout.vertical]: { root: 'w-full' },\n },\n align: {\n start: { root: 'justify-start text-left rtl:justify-end rtl:text-right' },\n center: { root: 'justify-center text-center' },\n end: { root: 'justify-end text-right rtl:justify-start rtl:text-left' },\n },\n grow: {\n true: { root: 'grow' },\n },\n active: {\n true: { root: 'text-rui-text' },\n false: {},\n },\n disabled: {\n true: { root: 'cursor-not-allowed text-rui-text-disabled' },\n false: { root: 'cursor-pointer hover:text-rui-text' },\n },\n },\n compoundVariants: [\n { variant: TabVariant.underline, layout: TabLayout.horizontal, class: { root: 'h-10' } },\n { variant: TabVariant.underline, layout: TabLayout.horizontal, disabled: false, class: { content: 'group-hover:bg-rui-hover' } },\n // a vertical list fills the whole row on hover and keeps that fill on the selected row\n { variant: TabVariant.underline, layout: TabLayout.vertical, class: { root: 'min-h-9 px-3', content: 'h-auto px-0 py-2' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, disabled: false, class: { root: 'hover:bg-rui-hover' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, active: true, class: { root: 'bg-rui-hover' } },\n ],\n defaultVariants: {\n variant: TabVariant.underline,\n layout: TabLayout.horizontal,\n align: 'center',\n active: false,\n disabled: false,\n },\n});\n"],"mappings":";;;;;;;;AAQA,IAAa,YAAY,GAAG;CAC1B,OAAO;EACL,MAAM;GACJ;GACA;GAEA;EACF,CAAC,CAAC,KAAK,GAAG;EACV,SAAS;CACX;CACA,UAAU;EACR,SAAS;IACN,WAAW,YAAY;IAAE,MAAM;IAAQ,SAAS;GAAW;IAE3D,WAAW,YAAY,EAAE,MAAM,eAAe;EACjD;EACA,QAAQ;IACL,UAAU,aAAa,CAAC;IACxB,UAAU,WAAW,EAAE,MAAM,SAAS;EACzC;EACA,OAAO;GACL,OAAO,EAAE,MAAM,yDAAyD;GACxE,QAAQ,EAAE,MAAM,6BAA6B;GAC7C,KAAK,EAAE,MAAM,yDAAyD;EACxE;EACA,MAAM,EACJ,MAAM,EAAE,MAAM,OAAO,EACvB;EACA,QAAQ;GACN,MAAM,EAAE,MAAM,gBAAgB;GAC9B,OAAO,CAAC;EACV;EACA,UAAU;GACR,MAAM,EAAE,MAAM,4CAA4C;GAC1D,OAAO,EAAE,MAAM,qCAAqC;EACtD;CACF;CACA,kBAAkB;EAChB;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAY,OAAO,EAAE,MAAM,OAAO;EAAE;EACvF;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAY,UAAU;GAAO,OAAO,EAAE,SAAS,2BAA2B;EAAE;EAE/H;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAU,OAAO;IAAE,MAAM;IAAgB,SAAS;GAAmB;EAAE;EAC1H;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAU,UAAU;GAAO,OAAO,EAAE,MAAM,qBAAqB;EAAE;EACpH;GAAE,SAAS,WAAW;GAAW,QAAQ,UAAU;GAAU,QAAQ;GAAM,OAAO,EAAE,MAAM,eAAe;EAAE;CAC7G;CACA,iBAAiB;EACf,SAAS,WAAW;EACpB,QAAQ,UAAU;EAClB,OAAO;EACP,QAAQ;EACR,UAAU;CACZ;AACF,CAAC"}
@@ -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,