@indielayer/ui 1.3.0 → 1.4.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 (419) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +4 -4
  3. package/docs/App.vue +25 -0
  4. package/docs/assets/css/hljs.css +302 -0
  5. package/docs/assets/css/tailwind.css +46 -0
  6. package/docs/assets/images/error.svg +1 -0
  7. package/docs/assets/images/logo.png +0 -0
  8. package/docs/assets/images/logo_mini.svg +10 -0
  9. package/docs/assets/images/logo_white.png +0 -0
  10. package/docs/assets/images/logo_word.svg +12 -0
  11. package/docs/assets/images/logo_word_dark.svg +12 -0
  12. package/docs/assets/images/photo1.jpeg +0 -0
  13. package/docs/assets/images/photo2.jpeg +0 -0
  14. package/docs/components/Cookies.vue +42 -0
  15. package/docs/components/common/CodePreview.vue +80 -0
  16. package/docs/components/common/CodeSnippet.vue +49 -0
  17. package/docs/components/common/CopyButton.vue +50 -0
  18. package/docs/components/common/DocumentPage.vue +289 -0
  19. package/docs/components/common/Indielayer-theme.json +702 -0
  20. package/docs/components/common/MultiSnippet.vue +26 -0
  21. package/docs/components/menu/DocsMenu.vue +143 -0
  22. package/docs/components/toolbar/PreToolbar.vue +18 -0
  23. package/docs/components/toolbar/Toolbar.vue +63 -0
  24. package/docs/components/toolbar/ToolbarColorToggle.vue +49 -0
  25. package/docs/icons.ts +61 -0
  26. package/docs/layouts/default.vue +29 -0
  27. package/docs/layouts/simple.vue +3 -0
  28. package/docs/main.ts +33 -0
  29. package/docs/pages/colors.vue +125 -0
  30. package/docs/pages/component/accordion/index.vue +29 -0
  31. package/docs/pages/component/accordion/usage.vue +30 -0
  32. package/docs/pages/component/alert/index.vue +29 -0
  33. package/docs/pages/component/alert/usage.vue +18 -0
  34. package/docs/pages/component/avatar/index.vue +43 -0
  35. package/docs/pages/component/avatar/size.vue +9 -0
  36. package/docs/pages/component/avatar/usage.vue +9 -0
  37. package/docs/pages/component/avatar/variants.vue +8 -0
  38. package/docs/pages/component/badge/index.vue +29 -0
  39. package/docs/pages/component/badge/usage.vue +50 -0
  40. package/docs/pages/component/breadcrumbs/index.vue +29 -0
  41. package/docs/pages/component/breadcrumbs/usage.vue +19 -0
  42. package/docs/pages/component/button/button-group.vue +18 -0
  43. package/docs/pages/component/button/icons.vue +9 -0
  44. package/docs/pages/component/button/index.vue +64 -0
  45. package/docs/pages/component/button/size.vue +9 -0
  46. package/docs/pages/component/button/states.vue +6 -0
  47. package/docs/pages/component/button/usage.vue +12 -0
  48. package/docs/pages/component/button/variants.vue +7 -0
  49. package/docs/pages/component/card/index.vue +29 -0
  50. package/docs/pages/component/card/usage.vue +6 -0
  51. package/docs/pages/component/carousel/index.vue +29 -0
  52. package/docs/pages/component/carousel/usage.vue +10 -0
  53. package/docs/pages/component/checkbox/index.vue +50 -0
  54. package/docs/pages/component/checkbox/size.vue +9 -0
  55. package/docs/pages/component/checkbox/states.vue +9 -0
  56. package/docs/pages/component/checkbox/usage.vue +15 -0
  57. package/docs/pages/component/checkbox/variants.vue +8 -0
  58. package/docs/pages/component/container/index.vue +29 -0
  59. package/docs/pages/component/container/usage.vue +3 -0
  60. package/docs/pages/component/divider/index.vue +43 -0
  61. package/docs/pages/component/divider/label.vue +12 -0
  62. package/docs/pages/component/divider/usage.vue +7 -0
  63. package/docs/pages/component/divider/vertical.vue +7 -0
  64. package/docs/pages/component/drawer/index.vue +29 -0
  65. package/docs/pages/component/drawer/usage.vue +56 -0
  66. package/docs/pages/component/form/index.vue +29 -0
  67. package/docs/pages/component/form/usage.vue +96 -0
  68. package/docs/pages/component/formGroup/index.vue +29 -0
  69. package/docs/pages/component/formGroup/usage.vue +46 -0
  70. package/docs/pages/component/icon/index.vue +36 -0
  71. package/docs/pages/component/icon/usage.vue +6 -0
  72. package/docs/pages/component/icon/variants.vue +14 -0
  73. package/docs/pages/component/image/index.vue +29 -0
  74. package/docs/pages/component/image/usage.vue +8 -0
  75. package/docs/pages/component/input/index.vue +50 -0
  76. package/docs/pages/component/input/size.vue +13 -0
  77. package/docs/pages/component/input/states.vue +12 -0
  78. package/docs/pages/component/input/usage.vue +15 -0
  79. package/docs/pages/component/input/variants.vue +18 -0
  80. package/docs/pages/component/link/index.vue +29 -0
  81. package/docs/pages/component/link/usage.vue +12 -0
  82. package/docs/pages/component/loader/index.vue +29 -0
  83. package/docs/pages/component/loader/usage.vue +7 -0
  84. package/docs/pages/component/menu/index.vue +29 -0
  85. package/docs/pages/component/menu/usage.vue +69 -0
  86. package/docs/pages/component/modal/composed.vue +70 -0
  87. package/docs/pages/component/modal/index.vue +36 -0
  88. package/docs/pages/component/modal/usage.vue +61 -0
  89. package/docs/pages/component/notifications/index.vue +29 -0
  90. package/docs/pages/component/notifications/usage.vue +56 -0
  91. package/docs/pages/component/pagination/index.vue +29 -0
  92. package/docs/pages/component/pagination/usage.vue +17 -0
  93. package/docs/pages/component/popover/index.vue +29 -0
  94. package/docs/pages/component/popover/usage.vue +21 -0
  95. package/docs/pages/component/progress/index.vue +36 -0
  96. package/docs/pages/component/progress/usage.vue +7 -0
  97. package/docs/pages/component/progress/variants.vue +18 -0
  98. package/docs/pages/component/radio/index.vue +50 -0
  99. package/docs/pages/component/radio/size.vue +15 -0
  100. package/docs/pages/component/radio/states.vue +13 -0
  101. package/docs/pages/component/radio/usage.vue +14 -0
  102. package/docs/pages/component/radio/variants.vue +39 -0
  103. package/docs/pages/component/scroll/horizontal.vue +14 -0
  104. package/docs/pages/component/scroll/index.vue +36 -0
  105. package/docs/pages/component/scroll/usage.vue +5 -0
  106. package/docs/pages/component/select/index.vue +43 -0
  107. package/docs/pages/component/select/states.vue +22 -0
  108. package/docs/pages/component/select/usage.vue +45 -0
  109. package/docs/pages/component/select/variants.vue +23 -0
  110. package/docs/pages/component/skeleton/index.vue +29 -0
  111. package/docs/pages/component/skeleton/usage.vue +10 -0
  112. package/docs/pages/component/slider/index.vue +29 -0
  113. package/docs/pages/component/slider/usage.vue +15 -0
  114. package/docs/pages/component/spacer/index.vue +29 -0
  115. package/docs/pages/component/spacer/usage.vue +8 -0
  116. package/docs/pages/component/spinner/index.vue +36 -0
  117. package/docs/pages/component/spinner/usage.vue +3 -0
  118. package/docs/pages/component/spinner/variants.vue +9 -0
  119. package/docs/pages/component/stepper/index.vue +29 -0
  120. package/docs/pages/component/stepper/usage.vue +21 -0
  121. package/docs/pages/component/table/index.vue +36 -0
  122. package/docs/pages/component/table/states.vue +28 -0
  123. package/docs/pages/component/table/usage.vue +107 -0
  124. package/docs/pages/component/tabs/index.vue +29 -0
  125. package/docs/pages/component/tabs/usage.vue +137 -0
  126. package/docs/pages/component/tag/index.vue +29 -0
  127. package/docs/pages/component/tag/usage.vue +27 -0
  128. package/docs/pages/component/textarea/index.vue +43 -0
  129. package/docs/pages/component/textarea/states.vue +13 -0
  130. package/docs/pages/component/textarea/usage.vue +22 -0
  131. package/docs/pages/component/textarea/variants.vue +15 -0
  132. package/docs/pages/component/toggle/index.vue +43 -0
  133. package/docs/pages/component/toggle/states.vue +13 -0
  134. package/docs/pages/component/toggle/usage.vue +14 -0
  135. package/docs/pages/component/toggle/variants.vue +15 -0
  136. package/docs/pages/component/tooltip/index.vue +29 -0
  137. package/docs/pages/component/tooltip/usage.vue +16 -0
  138. package/docs/pages/error.vue +6 -0
  139. package/docs/pages/icons.vue +105 -0
  140. package/docs/pages/index.vue +157 -0
  141. package/docs/pages/play.vue +19 -0
  142. package/docs/pages/typography.vue +95 -0
  143. package/docs/router/index.ts +75 -0
  144. package/exports/tailwind.preset.js +1 -0
  145. package/lib/common/icons.d.ts +4 -1
  146. package/lib/common/icons.js +14 -11
  147. package/lib/components/accordion/Accordion.vue.d.ts +63 -0
  148. package/lib/components/accordion/Accordion.vue.js +40 -0
  149. package/lib/components/accordion/Accordion.vue2.js +4 -0
  150. package/lib/components/{collapse/Collapse.vue.d.ts → accordion/AccordionItem.vue.d.ts} +33 -18
  151. package/lib/components/accordion/AccordionItem.vue.js +140 -0
  152. package/lib/components/accordion/AccordionItem.vue2.js +4 -0
  153. package/lib/components/accordion/index.d.ts +4 -0
  154. package/lib/components/accordion/theme/Accordion.base.theme.d.ts +3 -0
  155. package/lib/components/accordion/theme/Accordion.base.theme.js +8 -0
  156. package/lib/components/accordion/theme/Accordion.carbon.theme.d.ts +3 -0
  157. package/lib/components/accordion/theme/Accordion.carbon.theme.js +5 -0
  158. package/lib/components/accordion/theme/AccordionItem.base.theme.d.ts +3 -0
  159. package/lib/components/accordion/theme/AccordionItem.base.theme.js +16 -0
  160. package/lib/components/accordion/theme/AccordionItem.carbon.theme.d.ts +3 -0
  161. package/lib/components/accordion/theme/AccordionItem.carbon.theme.js +5 -0
  162. package/lib/components/alert/theme/Alert.carbon.theme.js +39 -3
  163. package/lib/components/avatar/Avatar.vue.d.ts +2 -2
  164. package/lib/components/badge/Badge.vue.d.ts +2 -2
  165. package/lib/components/button/Button.vue.d.ts +3 -3
  166. package/lib/components/button/ButtonGroup.vue.d.ts +3 -3
  167. package/lib/components/button/theme/Button.carbon.theme.js +1 -1
  168. package/lib/components/carousel/CarouselSlide.vue.d.ts +19 -8
  169. package/lib/components/carousel/CarouselSlide.vue.js +2 -2
  170. package/lib/components/carousel/CarouselSlide.vue2.js +25 -18
  171. package/lib/components/checkbox/Checkbox.vue.d.ts +22 -10
  172. package/lib/components/checkbox/Checkbox.vue2.js +106 -72
  173. package/lib/components/checkbox/theme/Checkbox.base.theme.js +38 -31
  174. package/lib/components/checkbox/theme/Checkbox.carbon.theme.js +38 -31
  175. package/lib/components/container/Container.vue.d.ts +13 -0
  176. package/lib/components/container/Container.vue.js +15 -11
  177. package/lib/components/container/theme/Container.base.theme.js +7 -4
  178. package/lib/components/drawer/Drawer.vue.d.ts +4 -4
  179. package/lib/components/form/Form.vue.d.ts +25 -2
  180. package/lib/components/form/Form.vue.js +67 -36
  181. package/lib/components/form/theme/Form.base.theme.js +8 -4
  182. package/lib/components/form/theme/Form.carbon.theme.js +10 -3
  183. package/lib/components/formGroup/FormGroup.vue.d.ts +132 -0
  184. package/lib/components/formGroup/FormGroup.vue.js +82 -0
  185. package/lib/components/formGroup/FormGroup.vue2.js +4 -0
  186. package/lib/components/formGroup/__tests__/FormGroup.spec.d.ts +1 -0
  187. package/lib/components/formGroup/index.d.ts +2 -0
  188. package/lib/components/formGroup/theme/FormGroup.base.theme.d.ts +3 -0
  189. package/lib/components/formGroup/theme/FormGroup.base.theme.js +11 -0
  190. package/lib/components/formGroup/theme/FormGroup.carbon.theme.d.ts +3 -0
  191. package/lib/components/formGroup/theme/FormGroup.carbon.theme.js +11 -0
  192. package/lib/components/icon/theme/Icon.base.theme.js +1 -1
  193. package/lib/components/icon/theme/Icon.carbon.theme.js +4 -4
  194. package/lib/components/index.d.ts +3 -1
  195. package/lib/components/index.js +106 -100
  196. package/lib/components/input/Input.vue.d.ts +12 -9
  197. package/lib/components/input/Input.vue.js +39 -39
  198. package/lib/components/input/theme/Input.carbon.theme.js +1 -1
  199. package/lib/components/inputFooter/theme/InputFooter.base.theme.js +1 -1
  200. package/lib/components/inputFooter/theme/InputFooter.carbon.theme.js +1 -1
  201. package/lib/components/label/Label.vue.d.ts +3 -3
  202. package/lib/components/label/theme/Label.carbon.theme.js +7 -6
  203. package/lib/components/link/Link.vue.d.ts +1 -1
  204. package/lib/components/link/Link.vue.js +2 -2
  205. package/lib/components/link/Link.vue2.js +1 -1
  206. package/lib/components/link/theme/Link.base.theme.js +4 -4
  207. package/lib/components/link/theme/Link.carbon.theme.js +23 -3
  208. package/lib/components/loader/theme/Loader.carbon.theme.js +1 -1
  209. package/lib/components/menu/Menu.vue.d.ts +6 -5
  210. package/lib/components/menu/Menu.vue.js +43 -40
  211. package/lib/components/menu/MenuItem.vue.d.ts +4 -4
  212. package/lib/components/menu/MenuItem.vue.js +2 -2
  213. package/lib/components/menu/MenuItem.vue2.js +1 -1
  214. package/lib/components/menu/theme/MenuItem.base.theme.js +3 -3
  215. package/lib/components/modal/Modal.vue.d.ts +98 -3
  216. package/lib/components/modal/Modal.vue.js +153 -100
  217. package/lib/components/modal/theme/Modal.base.theme.js +15 -9
  218. package/lib/components/modal/theme/Modal.carbon.theme.js +27 -3
  219. package/lib/components/notifications/Notifications.vue.js +56 -53
  220. package/lib/components/notifications/theme/Notifications.base.theme.js +1 -1
  221. package/lib/components/notifications/theme/Notifications.carbon.theme.js +8 -3
  222. package/lib/components/popover/Popover.vue.d.ts +3 -3
  223. package/lib/components/radio/Radio.vue.d.ts +17 -12
  224. package/lib/components/radio/Radio.vue2.js +81 -66
  225. package/lib/components/radio/theme/Radio.base.theme.js +19 -16
  226. package/lib/components/radio/theme/Radio.carbon.theme.js +32 -29
  227. package/lib/components/select/Select.vue.d.ts +13 -10
  228. package/lib/components/select/Select.vue.js +115 -116
  229. package/lib/components/select/theme/Select.base.theme.js +10 -10
  230. package/lib/components/select/theme/Select.carbon.theme.js +5 -5
  231. package/lib/components/skeleton/Skeleton.vue.d.ts +19 -1
  232. package/lib/components/skeleton/Skeleton.vue.js +25 -15
  233. package/lib/components/skeleton/theme/Skeleton.base.theme.js +7 -4
  234. package/lib/components/slider/Slider.vue.d.ts +12 -6
  235. package/lib/components/slider/Slider.vue.js +3 -4
  236. package/lib/components/slider/theme/Slider.carbon.theme.js +4 -4
  237. package/lib/components/spinner/Spinner.vue.d.ts +1 -1
  238. package/lib/components/spinner/Spinner.vue.js +16 -17
  239. package/lib/components/stepper/Stepper.vue.d.ts +137 -0
  240. package/lib/components/stepper/Stepper.vue.js +128 -0
  241. package/lib/components/stepper/Stepper.vue2.js +4 -0
  242. package/lib/components/stepper/__tests__/Stepper.spec.d.ts +1 -0
  243. package/lib/components/stepper/index.d.ts +2 -0
  244. package/lib/components/stepper/theme/Stepper.base.theme.d.ts +3 -0
  245. package/lib/components/stepper/theme/Stepper.base.theme.js +20 -0
  246. package/lib/components/stepper/theme/Stepper.carbon.theme.d.ts +3 -0
  247. package/lib/components/{collapse/theme/Collapse.carbon.theme.js → stepper/theme/Stepper.carbon.theme.js} +1 -1
  248. package/lib/components/tab/Tab.vue.d.ts +11 -5
  249. package/lib/components/tab/Tab.vue.js +65 -50
  250. package/lib/components/tab/TabGroup.vue.d.ts +1 -1
  251. package/lib/components/tab/TabGroup.vue.js +5 -5
  252. package/lib/components/tab/theme/Tab.base.theme.js +2 -1
  253. package/lib/components/tab/theme/Tab.carbon.theme.js +6 -5
  254. package/lib/components/tab/theme/TabGroup.carbon.theme.js +28 -2
  255. package/lib/components/table/Table.vue.d.ts +115 -9
  256. package/lib/components/table/Table.vue.js +209 -98
  257. package/lib/components/table/TableCell.vue.d.ts +4 -5
  258. package/lib/components/table/TableCell.vue.js +21 -22
  259. package/lib/components/table/TableHead.vue.d.ts +16 -0
  260. package/lib/components/table/TableHead.vue.js +21 -0
  261. package/lib/components/table/TableHead.vue2.js +4 -0
  262. package/lib/components/table/TableHeader.vue.d.ts +4 -0
  263. package/lib/components/table/TableHeader.vue.js +45 -54
  264. package/lib/components/table/TableRow.vue.d.ts +15 -1
  265. package/lib/components/table/TableRow.vue.js +21 -25
  266. package/lib/components/table/index.d.ts +4 -2
  267. package/lib/components/table/theme/Table.base.theme.js +7 -6
  268. package/lib/components/table/theme/Table.carbon.theme.js +11 -3
  269. package/lib/components/table/theme/TableCell.base.theme.js +3 -3
  270. package/lib/components/table/theme/TableCell.carbon.theme.js +9 -3
  271. package/lib/components/table/theme/TableHead.base.theme.d.ts +3 -0
  272. package/lib/components/table/theme/TableHead.base.theme.js +9 -0
  273. package/lib/components/table/theme/TableHead.carbon.theme.d.ts +3 -0
  274. package/lib/components/table/theme/TableHead.carbon.theme.js +9 -0
  275. package/lib/components/table/theme/TableHeader.base.theme.d.ts +3 -0
  276. package/lib/components/table/theme/TableHeader.base.theme.js +12 -0
  277. package/lib/components/table/theme/TableHeader.carbon.theme.d.ts +3 -0
  278. package/lib/components/table/theme/TableHeader.carbon.theme.js +12 -0
  279. package/lib/components/table/theme/TableRow.base.theme.d.ts +3 -0
  280. package/lib/components/table/theme/TableRow.base.theme.js +11 -0
  281. package/lib/components/table/theme/TableRow.carbon.theme.d.ts +3 -0
  282. package/lib/components/table/theme/TableRow.carbon.theme.js +11 -0
  283. package/lib/components/tag/Tag.vue.d.ts +3 -3
  284. package/lib/components/tag/Tag.vue.js +17 -17
  285. package/lib/components/tag/theme/Tag.base.theme.js +14 -13
  286. package/lib/components/tag/theme/Tag.carbon.theme.js +14 -14
  287. package/lib/components/textarea/Textarea.vue.d.ts +11 -8
  288. package/lib/components/textarea/Textarea.vue.js +34 -34
  289. package/lib/components/textarea/theme/Textarea.carbon.theme.js +1 -1
  290. package/lib/components/toggle/Toggle.vue.d.ts +12 -12
  291. package/lib/components/toggle/Toggle.vue.js +37 -39
  292. package/lib/composables/keys.d.ts +5 -1
  293. package/lib/composables/keys.js +8 -6
  294. package/lib/composables/useFocusTrap.d.ts +6 -0
  295. package/lib/composables/useFocusTrap.js +45 -0
  296. package/lib/composables/useInputtable.d.ts +6 -0
  297. package/lib/composables/useInputtable.js +59 -42
  298. package/lib/index.js +137 -129
  299. package/lib/index.umd.js +3 -3
  300. package/lib/nuxt.mjs +33 -0
  301. package/lib/nuxt.plugin.js +8 -0
  302. package/lib/tailwind.preset.js +41 -0
  303. package/lib/theme.d.ts +8 -2
  304. package/lib/themes/base/components.d.ts +7 -1
  305. package/lib/themes/base/components.js +98 -86
  306. package/lib/themes/carbon/components.d.ts +7 -1
  307. package/lib/themes/carbon/components.js +98 -86
  308. package/lib/version.d.ts +1 -1
  309. package/lib/version.js +1 -1
  310. package/package.json +7 -2
  311. package/src/common/icons.ts +4 -1
  312. package/src/components/accordion/Accordion.vue +55 -0
  313. package/src/components/{collapse/Collapse.vue → accordion/AccordionItem.vue} +51 -32
  314. package/src/components/accordion/__tests__/Accordion.spec.ts +11 -0
  315. package/src/components/accordion/index.ts +4 -0
  316. package/src/components/accordion/theme/Accordion.base.theme.ts +9 -0
  317. package/src/components/accordion/theme/Accordion.carbon.theme.ts +7 -0
  318. package/src/components/accordion/theme/AccordionItem.base.theme.ts +38 -0
  319. package/src/components/accordion/theme/AccordionItem.carbon.theme.ts +7 -0
  320. package/src/components/alert/theme/Alert.carbon.theme.ts +54 -2
  321. package/src/components/button/theme/Button.carbon.theme.ts +1 -1
  322. package/src/components/carousel/CarouselSlide.vue +9 -4
  323. package/src/components/checkbox/Checkbox.vue +69 -20
  324. package/src/components/checkbox/theme/Checkbox.base.theme.ts +15 -1
  325. package/src/components/checkbox/theme/Checkbox.carbon.theme.ts +17 -3
  326. package/src/components/container/Container.vue +4 -0
  327. package/src/components/container/theme/Container.base.theme.ts +7 -1
  328. package/src/components/form/Form.vue +26 -5
  329. package/src/components/form/theme/Form.base.theme.ts +9 -1
  330. package/src/components/form/theme/Form.carbon.theme.ts +12 -2
  331. package/src/components/formGroup/FormGroup.vue +116 -0
  332. package/src/components/formGroup/__tests__/FormGroup.spec.ts +11 -0
  333. package/src/components/formGroup/index.ts +2 -0
  334. package/src/components/formGroup/theme/FormGroup.base.theme.ts +16 -0
  335. package/src/components/formGroup/theme/FormGroup.carbon.theme.ts +16 -0
  336. package/src/components/icon/theme/Icon.base.theme.ts +1 -1
  337. package/src/components/icon/theme/Icon.carbon.theme.ts +3 -4
  338. package/src/components/index.ts +3 -1
  339. package/src/components/input/Input.vue +3 -3
  340. package/src/components/input/theme/Input.carbon.theme.ts +1 -1
  341. package/src/components/inputFooter/theme/InputFooter.base.theme.ts +1 -1
  342. package/src/components/inputFooter/theme/InputFooter.carbon.theme.ts +1 -1
  343. package/src/components/label/theme/Label.carbon.theme.ts +8 -3
  344. package/src/components/link/Link.vue +1 -1
  345. package/src/components/link/theme/Link.carbon.theme.ts +23 -2
  346. package/src/components/loader/theme/Loader.carbon.theme.ts +1 -1
  347. package/src/components/menu/Menu.vue +8 -5
  348. package/src/components/menu/MenuItem.vue +1 -1
  349. package/src/components/menu/theme/MenuItem.base.theme.ts +3 -3
  350. package/src/components/modal/Modal.vue +110 -50
  351. package/src/components/modal/theme/Modal.base.theme.ts +28 -12
  352. package/src/components/modal/theme/Modal.carbon.theme.ts +55 -2
  353. package/src/components/notifications/Notifications.vue +5 -5
  354. package/src/components/notifications/theme/Notifications.base.theme.ts +1 -1
  355. package/src/components/notifications/theme/Notifications.carbon.theme.ts +12 -2
  356. package/src/components/radio/Radio.vue +39 -15
  357. package/src/components/radio/theme/Radio.base.theme.ts +7 -1
  358. package/src/components/radio/theme/Radio.carbon.theme.ts +13 -7
  359. package/src/components/select/Select.vue +10 -11
  360. package/src/components/select/theme/Select.base.theme.ts +1 -1
  361. package/src/components/select/theme/Select.carbon.theme.ts +2 -2
  362. package/src/components/skeleton/Skeleton.vue +18 -2
  363. package/src/components/skeleton/theme/Skeleton.base.theme.ts +8 -1
  364. package/src/components/slider/Slider.vue +1 -2
  365. package/src/components/slider/theme/Slider.carbon.theme.ts +1 -1
  366. package/src/components/spinner/Spinner.vue +2 -2
  367. package/src/components/stepper/Stepper.vue +153 -0
  368. package/src/components/{collapse/__tests__/Collapse.spec.ts → stepper/__tests__/Stepper.spec.ts} +3 -3
  369. package/src/components/stepper/index.ts +6 -0
  370. package/src/components/stepper/theme/Stepper.base.theme.ts +45 -0
  371. package/src/components/stepper/theme/Stepper.carbon.theme.ts +7 -0
  372. package/src/components/tab/Tab.vue +20 -6
  373. package/src/components/tab/TabGroup.vue +2 -2
  374. package/src/components/tab/theme/Tab.base.theme.ts +2 -0
  375. package/src/components/tab/theme/Tab.carbon.theme.ts +4 -2
  376. package/src/components/tab/theme/TabGroup.carbon.theme.ts +50 -2
  377. package/src/components/table/Table.vue +123 -27
  378. package/src/components/table/TableCell.vue +5 -6
  379. package/src/components/table/TableHead.vue +25 -0
  380. package/src/components/table/TableHeader.vue +35 -56
  381. package/src/components/table/TableRow.vue +19 -17
  382. package/src/components/table/index.ts +4 -2
  383. package/src/components/table/theme/Table.base.theme.ts +9 -7
  384. package/src/components/table/theme/Table.carbon.theme.ts +18 -2
  385. package/src/components/table/theme/TableCell.base.theme.ts +1 -1
  386. package/src/components/table/theme/TableCell.carbon.theme.ts +24 -2
  387. package/src/components/table/theme/TableHead.base.theme.ts +10 -0
  388. package/src/components/table/theme/TableHead.carbon.theme.ts +10 -0
  389. package/src/components/table/theme/TableHeader.base.theme.ts +28 -0
  390. package/src/components/table/theme/TableHeader.carbon.theme.ts +28 -0
  391. package/src/components/table/theme/TableRow.base.theme.ts +21 -0
  392. package/src/components/table/theme/TableRow.carbon.theme.ts +21 -0
  393. package/src/components/tag/Tag.vue +4 -4
  394. package/src/components/tag/theme/Tag.base.theme.ts +4 -4
  395. package/src/components/tag/theme/Tag.carbon.theme.ts +5 -6
  396. package/src/components/textarea/Textarea.vue +3 -3
  397. package/src/components/textarea/theme/Textarea.carbon.theme.ts +1 -1
  398. package/src/components/toggle/Toggle.vue +2 -4
  399. package/src/composables/keys.ts +5 -1
  400. package/src/composables/useFocusTrap.ts +106 -0
  401. package/src/composables/useInputtable.ts +31 -3
  402. package/src/theme.ts +14 -2
  403. package/src/themes/base/components.ts +7 -1
  404. package/src/themes/carbon/components.ts +7 -1
  405. package/src/version.ts +1 -1
  406. package/volar.d.ts +5 -1
  407. package/lib/components/collapse/Collapse.vue.js +0 -131
  408. package/lib/components/collapse/Collapse.vue2.js +0 -4
  409. package/lib/components/collapse/index.d.ts +0 -2
  410. package/lib/components/collapse/theme/Collapse.base.theme.d.ts +0 -3
  411. package/lib/components/collapse/theme/Collapse.base.theme.js +0 -10
  412. package/lib/components/collapse/theme/Collapse.carbon.theme.d.ts +0 -3
  413. package/lib/components/table/TableHead.d.ts +0 -2
  414. package/lib/components/table/TableHead.js +0 -19
  415. package/src/components/collapse/index.ts +0 -2
  416. package/src/components/collapse/theme/Collapse.base.theme.ts +0 -13
  417. package/src/components/collapse/theme/Collapse.carbon.theme.ts +0 -7
  418. package/src/components/table/TableHead.tsx +0 -14
  419. /package/lib/components/{collapse/__tests__/Collapse.spec.d.ts → accordion/__tests__/Accordion.spec.d.ts} +0 -0
@@ -6,16 +6,14 @@ const selectProps = {
6
6
  placeholder: String,
7
7
  options: Array as PropType<SelectOption[]>,
8
8
  multiple: Boolean,
9
- label: String,
10
- helper: String,
11
9
  flat: Boolean,
12
10
  native: Boolean,
13
11
  }
14
12
 
15
13
  export type SelectOption = {
16
14
  value: number | string;
17
- disabled: boolean;
18
15
  label: string;
16
+ disabled?: boolean;
19
17
  }
20
18
 
21
19
  export type SelectProps = ExtractPublicPropTypes<typeof selectProps>
@@ -39,7 +37,7 @@ import { useCommon } from '../../composables/useCommon'
39
37
  import { useInputtable } from '../../composables/useInputtable'
40
38
  import { useInteractive } from '../../composables/useInteractive'
41
39
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
42
- import { checkIcon, chevronDownIcon } from '../../common/icons'
40
+ import { checkIcon, selectIcon } from '../../common/icons'
43
41
 
44
42
  import XLabel from '../label/Label.vue'
45
43
  import XTag from '../tag/Tag.vue'
@@ -230,6 +228,7 @@ const { focus, blur } = useInteractive(elRef)
230
228
 
231
229
  const {
232
230
  errorInternal,
231
+ hideFooterInternal,
233
232
  inputListeners,
234
233
  reset,
235
234
  validate,
@@ -335,7 +334,8 @@ defineExpose({ focus, blur, reset, validate, setError })
335
334
  <x-tag
336
335
  v-for="value in selected"
337
336
  :key="value"
338
- size="sm"
337
+ size="xs"
338
+ outlined
339
339
  removable
340
340
  @remove="(e: Event) => { handleRemove(e, value) }"
341
341
  >{{ getLabel(value) }}</x-tag>
@@ -357,10 +357,7 @@ defineExpose({ focus, blur, reset, validate, setError })
357
357
  <x-popover
358
358
  v-else
359
359
  ref="popoverRef"
360
- block
361
360
  :disabled="disabled || loading || readonly"
362
- :dismiss-on-click="!multiple"
363
- align="left"
364
361
  >
365
362
  <div
366
363
  :class="[classes.box]"
@@ -370,7 +367,8 @@ defineExpose({ focus, blur, reset, validate, setError })
370
367
  <x-tag
371
368
  v-for="value in selected"
372
369
  :key="value"
373
- size="sm"
370
+ size="xs"
371
+ outlined
374
372
  removable
375
373
  @remove="(e: Event) => { handleRemove(e, value) }"
376
374
  >{{ getLabel(value) }}</x-tag>
@@ -415,6 +413,7 @@ defineExpose({ focus, blur, reset, validate, setError })
415
413
  </x-popover>
416
414
 
417
415
  <select
416
+ :id="id"
418
417
  ref="elRef"
419
418
  v-model="selected"
420
419
  tabindex="-1"
@@ -439,7 +438,7 @@ defineExpose({ focus, blur, reset, validate, setError })
439
438
  <x-spinner v-if="loading" :size="size" />
440
439
  <slot v-else name="icon">
441
440
  <x-icon
442
- :icon="chevronDownIcon"
441
+ :icon="selectIcon"
443
442
  :class="[classes.icon]"
444
443
  />
445
444
  </slot>
@@ -447,6 +446,6 @@ defineExpose({ focus, blur, reset, validate, setError })
447
446
  </div>
448
447
  </div>
449
448
 
450
- <x-input-footer v-if="!hideFooter" :error="errorInternal" :helper="helper"/>
449
+ <x-input-footer v-if="!hideFooterInternal" :error="errorInternal" :helper="helper"/>
451
450
  </x-label>
452
451
  </template>
@@ -27,7 +27,7 @@ const theme: SelectTheme = {
27
27
  return classes
28
28
  },
29
29
 
30
- content: 'py-1 max-h-72 overflow-scroll',
30
+ content: 'py-1 max-h-72 overflow-y-auto',
31
31
 
32
32
  iconWrapper: 'pointer-events-none absolute inset-y-0 right-0 flex items-center px-2',
33
33
 
@@ -18,7 +18,7 @@ const theme: SelectTheme = {
18
18
  } else if (props.readonly) {
19
19
  classes.push('bg-white dark:bg-gray-900 text-gray-700')
20
20
  } else {
21
- classes.push('bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-200')
21
+ classes.push('bg-gray-50 dark:bg-gray-800 text-gray-700 dark:text-gray-200')
22
22
  }
23
23
 
24
24
  if (data.errorInternal) {
@@ -30,7 +30,7 @@ const theme: SelectTheme = {
30
30
  return classes
31
31
  },
32
32
 
33
- content: 'py-1 max-h-72 overflow-scroll',
33
+ content: 'py-1 max-h-72 overflow-y-auto',
34
34
 
35
35
  iconWrapper: 'pointer-events-none absolute inset-y-0 right-0 flex items-center px-2',
36
36
 
@@ -1,9 +1,22 @@
1
1
  <script lang="ts">
2
+ const shapes = ['line', 'circle'] as const
3
+
4
+ export type SkeletonShape = typeof shapes[number]
5
+
6
+ const validators = {
7
+ shape: shapes,
8
+ }
9
+
2
10
  const skeletonProps = {
3
11
  tag: {
4
12
  type: String,
5
13
  default: 'div',
6
14
  },
15
+ shape: {
16
+ type: String as PropType<SkeletonShape>,
17
+ default: 'line',
18
+ validator: (val: SkeletonShape) => validators.shape.includes(val),
19
+ },
7
20
  }
8
21
 
9
22
  export type SkeletonProps = ExtractPublicPropTypes<typeof skeletonProps>
@@ -11,11 +24,14 @@ export type SkeletonProps = ExtractPublicPropTypes<typeof skeletonProps>
11
24
  type InternalClasses = 'wrapper'
12
25
  export interface SkeletonTheme extends ThemeComponent<SkeletonProps, InternalClasses> {}
13
26
 
14
- export default { name: 'XSkeleton' }
27
+ export default {
28
+ name: 'XSkeleton',
29
+ validators,
30
+ }
15
31
  </script>
16
32
 
17
33
  <script setup lang="ts">
18
- import type { ExtractPublicPropTypes } from 'vue'
34
+ import type { ExtractPublicPropTypes, PropType } from 'vue'
19
35
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
20
36
 
21
37
  const props = defineProps(skeletonProps)
@@ -2,7 +2,14 @@ import type { SkeletonTheme } from '../Skeleton.vue'
2
2
 
3
3
  const theme: SkeletonTheme = {
4
4
  classes: {
5
- wrapper: 'animate-pulse bg-gray-300 dark:bg-gray-600 rounded-md',
5
+ wrapper: ({ props }) => {
6
+ const classes = ['animate-pulse bg-gray-300 dark:bg-gray-600']
7
+
8
+ if (props.shape === 'circle') classes.push('w-8 h-8 rounded-full')
9
+ else classes.push('rounded-md')
10
+
11
+ return classes
12
+ },
6
13
  },
7
14
  }
8
15
 
@@ -4,7 +4,6 @@ const sliderProps = {
4
4
  ...useColors.props('primary'),
5
5
  ...useInteractive.props(),
6
6
  ...useInputtable.props(),
7
- label: String,
8
7
  min: Number,
9
8
  max: Number,
10
9
  step: {
@@ -183,7 +182,7 @@ defineExpose({ focus, blur, reset, validate, setError })
183
182
  classes.wrapper,
184
183
  ]"
185
184
  >
186
- <div class="flex items-center relative w-full" >
185
+ <div class="flex items-center relative w-full">
187
186
  <slot name="prefix" :value="value"></slot>
188
187
  <div
189
188
  ref="progressRef"
@@ -4,7 +4,7 @@ const theme: SliderTheme = {
4
4
  classes: {
5
5
  wrapper: '',
6
6
 
7
- drag: 'w-[16px] h-[16px] -mt-[11px] -ml-[8px] rounded-full bg-gray-900',
7
+ drag: 'w-[16px] h-[16px] -mt-[11px] -ml-[8px] rounded-full bg-gray-900 dark:bg-gray-100',
8
8
  },
9
9
 
10
10
  styles: ({ props, colors, css }) => {
@@ -3,7 +3,7 @@ const spinnerProps = {
3
3
  ...useCommon.props(),
4
4
  icon: {
5
5
  type: String,
6
- default: '<g fill="none" fill-rule="evenodd"><g transform="translate(1 1)" stroke-width="2"><circle stroke-opacity=".8" cx="18" cy="18" r="18"/><path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="0.5s" repeatCount="indefinite"/></path></g></g>',
6
+ default: '<g stroke-width="0"><path fill="currentColor" d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z" opacity=".25"/><path fill="currentColor" d="M10.72,19.9a8,8,0,0,1-6.5-9.79A7.77,7.77,0,0,1,10.4,4.16a8,8,0,0,1,9.49,6.52A1.54,1.54,0,0,0,21.38,12h.13a1.37,1.37,0,0,0,1.38-1.54,11,11,0,1,0-12.7,12.39A1.54,1.54,0,0,0,12,21.34h0A1.47,1.47,0,0,0,10.72,19.9Z"><animateTransform attributeName="transform" dur="0.65s" repeatCount="indefinite" type="rotate" values="0 12 12;360 12 12"/></path></g>',
7
7
  },
8
8
  }
9
9
 
@@ -27,5 +27,5 @@ defineProps(spinnerProps)
27
27
  </script>
28
28
 
29
29
  <template>
30
- <x-icon :icon="icon" :size="size" view-box="0 0 38 38"/>
30
+ <x-icon :icon="icon" :size="size" />
31
31
  </template>
@@ -0,0 +1,153 @@
1
+ <script lang="ts">
2
+ const validators = {
3
+ ...useCommon.validators(),
4
+ variant: ['line'] as const,
5
+ }
6
+ const stepperProps = {
7
+ ...useCommon.props(),
8
+ ...useColors.props('primary'),
9
+ modelValue: [String, Number],
10
+ steps: {
11
+ type: Array as PropType<StepperStep[]>,
12
+ default: () => [],
13
+ },
14
+ variant: {
15
+ type: String as PropType<StepperVariant>,
16
+ default: 'line',
17
+ },
18
+ grow: Boolean,
19
+ fullWidth: {
20
+ type: Boolean,
21
+ default: true,
22
+ },
23
+ interactive: {
24
+ type: Boolean,
25
+ default: true,
26
+ },
27
+ iconPristine: String,
28
+ iconComplete: String,
29
+ iconIncomplete: String,
30
+ iconCurrent: String,
31
+ iconError: String,
32
+ }
33
+
34
+ export type StepperStepStatus = 'pristine' | 'complete' | 'incomplete' | 'error'
35
+
36
+ export type StepperStep = {
37
+ status: StepperStepStatus;
38
+ label: string;
39
+ description: string;
40
+ disabled?: boolean;
41
+ }
42
+
43
+ export type StepperVariant = typeof validators.variant[number]
44
+ export type StepperProps = ExtractPublicPropTypes<typeof stepperProps>
45
+
46
+ type InternalClasses = 'wrapper' | 'list' | 'scroller' | 'content' | 'step' | 'label' | 'icon'
47
+ export interface StepperTheme extends ThemeComponent<StepperProps, InternalClasses> {}
48
+
49
+ export default {
50
+ name: 'XStepper',
51
+ validators,
52
+ }
53
+ </script>
54
+
55
+ <script setup lang="ts">
56
+ import { type PropType, ref, type ExtractPublicPropTypes } from 'vue'
57
+ import { useCommon } from '../../composables/useCommon'
58
+ import { useColors } from '../../composables/useColors'
59
+ import { useTheme, type ThemeComponent } from '../../composables/useTheme'
60
+
61
+ import XScroll from '../../components/scroll/Scroll.vue'
62
+ import XIcon from '../../components/icon/Icon.vue'
63
+ import { stepperPristineIcon, stepperIncompleteIcon, errorIcon, successIcon } from '../../common/icons'
64
+
65
+ const props = defineProps(stepperProps)
66
+
67
+ const emit = defineEmits(['update:modelValue'])
68
+
69
+ const scrollRef = ref<InstanceType<typeof XScroll> | null>(null)
70
+ const wrapperRef = ref<HTMLElement | null>(null)
71
+ const stepperRef = ref<HTMLElement | null>(null)
72
+
73
+ function activateStep(step: StepperStep, index: number) {
74
+ if (step.disabled || !props.interactive) return
75
+
76
+ emit('update:modelValue', index)
77
+ }
78
+
79
+ function calcIcon(step: StepperStep, index: number) {
80
+ if (step.status === 'incomplete') return props.iconIncomplete || stepperIncompleteIcon
81
+ if (step.status === 'error') return props.iconError || errorIcon
82
+ if (step.status === 'complete') return props.iconComplete || successIcon
83
+
84
+ return props.iconPristine || stepperPristineIcon
85
+ }
86
+
87
+ const { styles, classes, className } = useTheme('Stepper', {}, props)
88
+ </script>
89
+
90
+ <template>
91
+ <div>
92
+ <div
93
+ ref="wrapperRef"
94
+ class="relative"
95
+ :style="styles"
96
+ :class="[
97
+ className,
98
+ classes.wrapper,
99
+ ]"
100
+ >
101
+ <x-scroll
102
+ ref="scrollRef"
103
+ :scrollbar="false"
104
+ horizontal
105
+ mousewheel
106
+ :class="classes.scroller"
107
+ >
108
+ <div
109
+ ref="stepperRef"
110
+ class="relative"
111
+ :class="classes.list"
112
+ >
113
+ <component
114
+ :is="interactive ? 'button' : 'div'"
115
+ v-for="(step, index) in steps"
116
+ :key="index"
117
+ :class="[classes.step, {
118
+ 'cursor-pointer': interactive && !step.disabled,
119
+ 'text-gray-400 dark:text-gray-600': step.disabled,
120
+ 'flex-1': grow,
121
+ }]"
122
+ :disabled="step.disabled || !interactive"
123
+ @click="activateStep(step, index)"
124
+ >
125
+ <div class="overflow-hidden">
126
+ <div
127
+ class="h-0.5 w-full mb-2"
128
+ :class="[step.status === 'complete' || step.status === 'incomplete' ? 'bg-primary-500' : 'bg-gray-200 dark:bg-gray-700']"
129
+ ></div>
130
+ <div class="flex items-start pr-4">
131
+ <x-icon
132
+ :icon="calcIcon(step, index)"
133
+ size="sm"
134
+ :class="[classes.icon, {
135
+ 'text-primary-500': step.status === 'complete' || step.status === 'incomplete',
136
+ 'text-error-500': step.status === 'error',
137
+ }]"
138
+ />
139
+ <div class="grid text-left">
140
+ <div class="text-sm truncate">{{ step.label }}</div>
141
+ <div v-if="step.description" class="text-xs text-gray-500">{{ step.description }}</div>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ </component>
146
+ </div>
147
+ </x-scroll>
148
+ </div>
149
+ <div :class="classes.content">
150
+ <slot></slot>
151
+ </div>
152
+ </div>
153
+ </template>
@@ -1,10 +1,10 @@
1
1
  import { describe, it, expect } from 'vitest'
2
2
  import { mount } from '@vue/test-utils'
3
- import Collapse from '../Collapse.vue'
3
+ import Stepper from '../Stepper.vue'
4
4
 
5
- describe('Collapse', () => {
5
+ describe('Stepper', () => {
6
6
  it('renders without errors', () => {
7
- const wrapper = mount(Collapse)
7
+ const wrapper = mount(Stepper)
8
8
 
9
9
  expect(wrapper.vm).toBeTruthy()
10
10
  })
@@ -0,0 +1,6 @@
1
+ export { default as XStepper } from './Stepper.vue'
2
+ export type {
3
+ StepperProps,
4
+ StepperVariant,
5
+ StepperTheme,
6
+ } from './Stepper.vue'
@@ -0,0 +1,45 @@
1
+ import type { StepperTheme } from '../Stepper.vue'
2
+
3
+ const theme: StepperTheme = {
4
+ classes: {
5
+ wrapper: '',
6
+
7
+ scroller: ({ props }) => {
8
+ const c = ['']
9
+
10
+ if (!props.fullWidth) c.push('!w-fit')
11
+
12
+ return c
13
+ },
14
+
15
+ list: ({ props }) => {
16
+ const c = ['flex min-w-full w-fit items-start']
17
+
18
+ return c
19
+ },
20
+
21
+ step: ({ props, data }) => {
22
+ const classes = ['']
23
+
24
+ if (!props.grow) classes.push('w-[8rem]')
25
+
26
+ return classes
27
+ },
28
+
29
+ label: ({ props, data }) => {
30
+ const classes = ['']
31
+
32
+ return classes
33
+ },
34
+
35
+ icon: ({ props, data }) => {
36
+ const classes = ['mr-2 mt-0.5']
37
+
38
+ return classes
39
+ },
40
+
41
+ content: 'mt-2 mb-4',
42
+ },
43
+ }
44
+
45
+ export default theme
@@ -0,0 +1,7 @@
1
+ import type { StepperTheme } from '../Stepper.vue'
2
+
3
+ import BaseTheme from './Stepper.base.theme'
4
+
5
+ const theme: StepperTheme = BaseTheme
6
+
7
+ export default theme
@@ -6,18 +6,19 @@ const tabProps = {
6
6
  },
7
7
  tag: {
8
8
  type: String,
9
- default: 'div',
9
+ default: 'button',
10
10
  },
11
11
  to: [String, Object],
12
12
  label: String,
13
13
  icon: String,
14
14
  disabled: Boolean,
15
15
  exact: Boolean,
16
+ removable: Boolean,
16
17
  }
17
18
 
18
19
  export type TabProps = ExtractPublicPropTypes<typeof tabProps>
19
20
 
20
- type InternalClasses = 'wrapper' | 'content' | 'label' | 'icon'
21
+ type InternalClasses = 'wrapper' | 'content' | 'label' | 'icon' | 'tabpanel'
21
22
  type InternalExtraData = {
22
23
  selected: boolean;
23
24
  } & Pick<TabGroupInjection, 'state'>['state']
@@ -34,13 +35,15 @@ export default {
34
35
  <script setup lang="ts">
35
36
  import { inject, reactive, computed, ref, onMounted, type ExtractPublicPropTypes } from 'vue'
36
37
  import { useMutationObserver } from '@vueuse/core'
37
- import { injectTabKey } from '../../composables/keys'
38
+ import { injectTabGroupKey } from '../../composables/keys'
38
39
  import { useCommon, type Size } from '../../composables/useCommon'
39
40
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
40
41
 
41
42
  import XIcon from '../icon/Icon.vue'
42
43
  import XLink from '../link/Link.vue'
43
44
 
45
+ import { closeIcon } from '../../common/icons'
46
+
44
47
  import type { TabGroupInjection, TabGroupVariant } from './TabGroup.vue'
45
48
 
46
49
  const props = defineProps(tabProps)
@@ -50,7 +53,7 @@ const computedLabel = computed(() => props.label || props.value)
50
53
  const teleportTo = ref<HTMLElement | null>(null)
51
54
  const elRef = ref<HTMLElement | typeof XLink | null>(null)
52
55
 
53
- const tabs = inject(injectTabKey, {
56
+ const tabs = inject(injectTabGroupKey, {
54
57
  tabsContentRef: ref(null),
55
58
  activateTab: () => {},
56
59
  state: reactive({
@@ -99,9 +102,11 @@ function onClickTab(e: MouseEvent) {
99
102
  return
100
103
  }
101
104
 
102
- if (!props.to && computedValue.value) tabs.activateTab(computedValue.value)
105
+ if (!props.to && typeof computedValue.value !== 'undefined') tabs.activateTab(computedValue.value)
103
106
  }
104
107
 
108
+ defineEmits(['remove'])
109
+
105
110
  const { styles, classes, className } = useTheme('Tab', {}, ref({
106
111
  ...props,
107
112
  size: computedSize.value,
@@ -156,10 +161,19 @@ const { styles, classes, className } = useTheme('Tab', {}, ref({
156
161
  :class="classes.icon"
157
162
  />
158
163
  <div :class="classes.label">{{ computedLabel }}</div>
164
+ <x-icon
165
+ v-if="removable"
166
+ size="sm"
167
+ :icon="closeIcon"
168
+ class="ml-2 cursor-pointer hover:text-gray-700 dark:hover:text-gray-500 transition-colors duration-150"
169
+ @click="(e: Event) => $emit('remove', e)"
170
+ />
159
171
  </div>
160
172
  </slot>
161
173
  <teleport v-if="selected && teleportTo" :to="teleportTo">
162
- <slot></slot>
174
+ <div role="tabpanel" :class="classes.tabpanel">
175
+ <slot></slot>
176
+ </div>
163
177
  </teleport>
164
178
  </component>
165
179
  </template>
@@ -54,7 +54,7 @@ export default {
54
54
  <script setup lang="ts">
55
55
  import { reactive, computed, provide, type PropType, ref, watch, onMounted, watchEffect, type ExtractPublicPropTypes, type Ref, nextTick } from 'vue'
56
56
  import { useMutationObserver, useResizeObserver, useThrottleFn } from '@vueuse/core'
57
- import { injectTabKey } from '../../composables/keys'
57
+ import { injectTabGroupKey } from '../../composables/keys'
58
58
  import { useCommon, type Size } from '../../composables/useCommon'
59
59
  import { useColors } from '../../composables/useColors'
60
60
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
@@ -92,7 +92,7 @@ function activateTab(tab: string | number | null) {
92
92
  emit('update:modelValue', tab)
93
93
  }
94
94
 
95
- provide(injectTabKey, {
95
+ provide(injectTabGroupKey, {
96
96
  tabsContentRef,
97
97
  activateTab,
98
98
  state,
@@ -20,6 +20,8 @@ const theme: TabTheme = {
20
20
  label: 'font-medium',
21
21
 
22
22
  icon: 'mr-1.5',
23
+
24
+ tabpanel: 'py-2',
23
25
  },
24
26
  }
25
27
 
@@ -3,9 +3,9 @@ import type { TabTheme } from '../Tab.vue'
3
3
  const theme: TabTheme = {
4
4
  classes: {
5
5
  wrapper: ({ props, data }) => {
6
- const c = ['py-2 transition-colors duration-150 ease-in-out whitespace-nowrap text-left min-w-[8rem]']
6
+ const c = ['py-2 transition-colors duration-150 ease-in-out whitespace-nowrap text-left']
7
7
 
8
- if (data.variant === 'block') c.push('px-8')
8
+ if (data.variant === 'block') c.push('px-4')
9
9
  else c.push('px-4')
10
10
 
11
11
  if (props.size === 'lg') c.push('text-lg')
@@ -26,6 +26,8 @@ const theme: TabTheme = {
26
26
  },
27
27
 
28
28
  icon: 'mr-1.5',
29
+
30
+ tabpanel: 'py-4',
29
31
  },
30
32
  }
31
33
 
@@ -1,7 +1,55 @@
1
1
  import type { TabGroupTheme } from '../TabGroup.vue'
2
2
 
3
- import BaseTheme from './TabGroup.base.theme'
3
+ const theme: TabGroupTheme = {
4
+ classes: {
5
+ wrapper: '',
4
6
 
5
- const theme: TabGroupTheme = BaseTheme
7
+ scroller: ({ props }) => {
8
+ const c = ['']
9
+
10
+ if (!props.fullWidth) c.push('!w-fit')
11
+ if (props.variant === 'block') c.push('')
12
+ if (props.variant === 'block' && !props.ghost) c.push('bg-gray-200 dark:bg-gray-800')
13
+
14
+ return c
15
+ },
16
+
17
+ list: ({ props }) => {
18
+ const c = ['flex min-w-full w-fit']
19
+
20
+ if (props.variant === 'line') c.push('border-b border-gray-200 dark:border-gray-700')
21
+ if (props.variant === 'line' && !props.grow) c.push('')
22
+ if (props.variant === 'block') c.push('z-[1] py-1.5')
23
+ if (props.align === 'center') c.push('justify-center')
24
+ if (props.align === 'right') c.push('justify-end')
25
+
26
+ return c
27
+ },
28
+
29
+ tracker: ({ props }) => {
30
+ const c = ['absolute transition-all duration-150']
31
+
32
+ if (props.variant === 'line') c.push('h-[2px] -mt-[2px] bg-[color:var(--x-tab-group-text)] dark:bg-[color:var(--x-tab-group-dark-text)]')
33
+
34
+ if (props.variant === 'block') c.push('border-t-2 border-solid border-[color:var(--x-tab-group-text)] dark:border-[color:var(--x-tab-group-dark-text)] h-full top-0 bg-gray-100 dark:bg-gray-700')
35
+
36
+ return c
37
+ },
38
+ },
39
+
40
+ styles: ({ props, colors, css }) => {
41
+ const gray = colors.getPalette('gray')
42
+ const color = colors.getPalette(props.color)
43
+
44
+ return css.variables({
45
+ text: color[600],
46
+ bg: props.ghost ? color[50] : '#fff',
47
+ dark: {
48
+ text: color[400],
49
+ bg: props.ghost ? color[900] : gray[700],
50
+ },
51
+ })
52
+ },
53
+ }
6
54
 
7
55
  export default theme