@indielayer/ui 1.3.0 → 1.5.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 (479) 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 +47 -0
  17. package/docs/components/common/CopyButton.vue +50 -0
  18. package/docs/components/common/DocumentPage.vue +285 -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 +96 -0
  22. package/docs/components/toolbar/PreToolbar.vue +16 -0
  23. package/docs/components/toolbar/Toolbar.vue +76 -0
  24. package/docs/components/toolbar/ToolbarColorToggle.vue +49 -0
  25. package/docs/icons.ts +61 -0
  26. package/docs/layouts/default.vue +33 -0
  27. package/docs/layouts/simple.vue +3 -0
  28. package/docs/main.ts +33 -0
  29. package/docs/pages/colors.vue +120 -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 +22 -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 +47 -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 +14 -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 +71 -0
  87. package/docs/pages/component/modal/index.vue +36 -0
  88. package/docs/pages/component/modal/usage.vue +66 -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 +46 -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 +142 -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 +19 -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 +12 -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 +12 -0
  138. package/docs/pages/error.vue +6 -0
  139. package/docs/pages/icons.vue +101 -0
  140. package/docs/pages/index.vue +153 -0
  141. package/docs/pages/play.vue +7 -0
  142. package/docs/pages/typography.vue +91 -0
  143. package/docs/router/index.ts +77 -0
  144. package/lib/common/icons.d.ts +4 -1
  145. package/lib/common/icons.js +14 -11
  146. package/lib/components/accordion/Accordion.vue.d.ts +63 -0
  147. package/lib/components/accordion/Accordion.vue.js +40 -0
  148. package/lib/components/accordion/Accordion.vue2.js +4 -0
  149. package/lib/components/{collapse/Collapse.vue.d.ts → accordion/AccordionItem.vue.d.ts} +33 -18
  150. package/lib/components/accordion/AccordionItem.vue.js +140 -0
  151. package/lib/components/accordion/AccordionItem.vue2.js +4 -0
  152. package/lib/components/accordion/index.d.ts +4 -0
  153. package/lib/components/accordion/theme/Accordion.base.theme.d.ts +3 -0
  154. package/lib/components/accordion/theme/Accordion.base.theme.js +8 -0
  155. package/lib/components/accordion/theme/Accordion.carbon.theme.d.ts +3 -0
  156. package/lib/components/accordion/theme/Accordion.carbon.theme.js +5 -0
  157. package/lib/components/accordion/theme/AccordionItem.base.theme.d.ts +3 -0
  158. package/lib/components/accordion/theme/AccordionItem.base.theme.js +16 -0
  159. package/lib/components/accordion/theme/AccordionItem.carbon.theme.d.ts +3 -0
  160. package/lib/components/accordion/theme/AccordionItem.carbon.theme.js +5 -0
  161. package/lib/components/alert/theme/Alert.carbon.theme.js +39 -3
  162. package/lib/components/avatar/Avatar.vue.d.ts +2 -2
  163. package/lib/components/badge/Badge.vue.d.ts +2 -2
  164. package/lib/components/badge/Badge.vue.js +7 -7
  165. package/lib/components/breadcrumbs/theme/Breadcrumbs.base.theme.js +1 -1
  166. package/lib/components/button/Button.vue.d.ts +3 -3
  167. package/lib/components/button/ButtonGroup.vue.d.ts +3 -3
  168. package/lib/components/button/theme/Button.base.theme.js +7 -7
  169. package/lib/components/button/theme/Button.carbon.theme.js +1 -1
  170. package/lib/components/card/theme/Card.base.theme.js +1 -1
  171. package/lib/components/carousel/CarouselSlide.vue.d.ts +19 -8
  172. package/lib/components/carousel/CarouselSlide.vue.js +2 -2
  173. package/lib/components/carousel/CarouselSlide.vue2.js +25 -18
  174. package/lib/components/checkbox/Checkbox.vue.d.ts +25 -10
  175. package/lib/components/checkbox/Checkbox.vue2.js +106 -72
  176. package/lib/components/checkbox/theme/Checkbox.base.theme.js +38 -31
  177. package/lib/components/checkbox/theme/Checkbox.carbon.theme.js +38 -31
  178. package/lib/components/container/Container.vue.d.ts +13 -0
  179. package/lib/components/container/Container.vue.js +15 -11
  180. package/lib/components/container/theme/Container.base.theme.js +7 -4
  181. package/lib/components/divider/Divider.vue.js +14 -14
  182. package/lib/components/divider/theme/Divider.base.theme.js +2 -2
  183. package/lib/components/drawer/Drawer.vue.d.ts +4 -4
  184. package/lib/components/drawer/Drawer.vue.js +2 -2
  185. package/lib/components/drawer/theme/Drawer.base.theme.js +1 -1
  186. package/lib/components/form/Form.vue.d.ts +25 -2
  187. package/lib/components/form/Form.vue.js +67 -36
  188. package/lib/components/form/theme/Form.base.theme.js +7 -3
  189. package/lib/components/form/theme/Form.carbon.theme.js +10 -3
  190. package/lib/components/formGroup/FormGroup.vue.d.ts +135 -0
  191. package/lib/components/formGroup/FormGroup.vue.js +83 -0
  192. package/lib/components/formGroup/FormGroup.vue2.js +4 -0
  193. package/lib/components/formGroup/__tests__/FormGroup.spec.d.ts +1 -0
  194. package/lib/components/formGroup/index.d.ts +2 -0
  195. package/lib/components/formGroup/theme/FormGroup.base.theme.d.ts +3 -0
  196. package/lib/components/formGroup/theme/FormGroup.base.theme.js +11 -0
  197. package/lib/components/formGroup/theme/FormGroup.carbon.theme.d.ts +3 -0
  198. package/lib/components/formGroup/theme/FormGroup.carbon.theme.js +11 -0
  199. package/lib/components/icon/theme/Icon.base.theme.js +2 -2
  200. package/lib/components/icon/theme/Icon.carbon.theme.js +4 -4
  201. package/lib/components/index.d.ts +3 -1
  202. package/lib/components/index.js +102 -95
  203. package/lib/components/input/Input.vue.d.ts +15 -9
  204. package/lib/components/input/Input.vue.js +43 -42
  205. package/lib/components/input/theme/Input.base.theme.js +10 -10
  206. package/lib/components/input/theme/Input.carbon.theme.js +10 -10
  207. package/lib/components/inputFooter/theme/InputFooter.base.theme.js +3 -3
  208. package/lib/components/inputFooter/theme/InputFooter.carbon.theme.js +3 -3
  209. package/lib/components/label/Label.vue.d.ts +6 -3
  210. package/lib/components/label/Label.vue.js +26 -20
  211. package/lib/components/label/theme/Label.base.theme.js +1 -1
  212. package/lib/components/label/theme/Label.carbon.theme.js +8 -7
  213. package/lib/components/link/Link.vue.d.ts +1 -1
  214. package/lib/components/link/Link.vue.js +1 -1
  215. package/lib/components/link/Link.vue2.js +4 -4
  216. package/lib/components/link/theme/Link.base.theme.js +4 -4
  217. package/lib/components/link/theme/Link.carbon.theme.js +23 -3
  218. package/lib/components/loader/theme/Loader.base.theme.js +1 -1
  219. package/lib/components/loader/theme/Loader.carbon.theme.js +2 -2
  220. package/lib/components/menu/Menu.vue.d.ts +6 -5
  221. package/lib/components/menu/Menu.vue.js +44 -41
  222. package/lib/components/menu/MenuItem.vue.d.ts +4 -4
  223. package/lib/components/menu/MenuItem.vue.js +2 -2
  224. package/lib/components/menu/MenuItem.vue2.js +1 -1
  225. package/lib/components/menu/theme/MenuItem.base.theme.js +22 -32
  226. package/lib/components/modal/Modal.vue.d.ts +102 -3
  227. package/lib/components/modal/Modal.vue.js +157 -100
  228. package/lib/components/modal/theme/Modal.base.theme.js +15 -9
  229. package/lib/components/modal/theme/Modal.carbon.theme.js +27 -3
  230. package/lib/components/notifications/Notifications.vue.js +57 -54
  231. package/lib/components/notifications/theme/Notifications.base.theme.js +2 -2
  232. package/lib/components/notifications/theme/Notifications.carbon.theme.js +8 -3
  233. package/lib/components/pagination/Pagination.vue.js +27 -27
  234. package/lib/components/popover/Popover.vue.d.ts +16 -3
  235. package/lib/components/popover/Popover.vue.js +13 -8
  236. package/lib/components/popover/Popover.vue2.js +3 -2
  237. package/lib/components/popover/Popover.vue3.js +2 -3
  238. package/lib/components/popover/theme/PopoverContainer.base.theme.js +4 -4
  239. package/lib/components/popover/theme/PopoverContainer.carbon.theme.js +4 -4
  240. package/lib/components/progress/Progress.vue.js +11 -11
  241. package/lib/components/progress/theme/Progress.base.theme.js +10 -10
  242. package/lib/components/radio/Radio.vue.d.ts +20 -12
  243. package/lib/components/radio/Radio.vue2.js +81 -66
  244. package/lib/components/radio/theme/Radio.base.theme.js +34 -31
  245. package/lib/components/radio/theme/Radio.carbon.theme.js +33 -30
  246. package/lib/components/select/Select.vue.d.ts +29 -10
  247. package/lib/components/select/Select.vue.js +121 -119
  248. package/lib/components/select/theme/Select.base.theme.js +6 -6
  249. package/lib/components/select/theme/Select.carbon.theme.js +11 -11
  250. package/lib/components/skeleton/Skeleton.vue.d.ts +19 -1
  251. package/lib/components/skeleton/Skeleton.vue.js +25 -15
  252. package/lib/components/skeleton/theme/Skeleton.base.theme.js +7 -4
  253. package/lib/components/slider/Slider.vue.d.ts +15 -6
  254. package/lib/components/slider/Slider.vue.js +4 -5
  255. package/lib/components/slider/theme/Slider.carbon.theme.js +8 -8
  256. package/lib/components/spinner/Spinner.vue.d.ts +1 -1
  257. package/lib/components/spinner/Spinner.vue.js +16 -17
  258. package/lib/components/stepper/Stepper.vue.d.ts +137 -0
  259. package/lib/components/stepper/Stepper.vue.js +128 -0
  260. package/lib/components/stepper/Stepper.vue2.js +4 -0
  261. package/lib/components/stepper/__tests__/Stepper.spec.d.ts +1 -0
  262. package/lib/components/stepper/index.d.ts +2 -0
  263. package/lib/components/stepper/theme/Stepper.base.theme.d.ts +3 -0
  264. package/lib/components/stepper/theme/Stepper.base.theme.js +20 -0
  265. package/lib/components/stepper/theme/Stepper.carbon.theme.d.ts +3 -0
  266. package/lib/components/{collapse/theme/Collapse.carbon.theme.js → stepper/theme/Stepper.carbon.theme.js} +1 -1
  267. package/lib/components/tab/Tab.vue.d.ts +11 -5
  268. package/lib/components/tab/Tab.vue.js +72 -56
  269. package/lib/components/tab/TabGroup.vue.d.ts +1 -1
  270. package/lib/components/tab/TabGroup.vue.js +5 -5
  271. package/lib/components/tab/theme/Tab.base.theme.js +2 -1
  272. package/lib/components/tab/theme/Tab.carbon.theme.js +6 -5
  273. package/lib/components/tab/theme/TabGroup.base.theme.js +15 -15
  274. package/lib/components/tab/theme/TabGroup.carbon.theme.js +29 -3
  275. package/lib/components/table/Table.vue.d.ts +115 -9
  276. package/lib/components/table/Table.vue.js +188 -79
  277. package/lib/components/table/TableCell.vue.d.ts +4 -5
  278. package/lib/components/table/TableCell.vue.js +21 -22
  279. package/lib/components/table/TableHead.vue.d.ts +16 -0
  280. package/lib/components/table/TableHead.vue.js +21 -0
  281. package/lib/components/table/TableHead.vue2.js +4 -0
  282. package/lib/components/table/TableHeader.vue.d.ts +4 -0
  283. package/lib/components/table/TableHeader.vue.js +45 -54
  284. package/lib/components/table/TableRow.vue.d.ts +15 -1
  285. package/lib/components/table/TableRow.vue.js +21 -25
  286. package/lib/components/table/index.d.ts +4 -2
  287. package/lib/components/table/theme/Table.base.theme.js +6 -5
  288. package/lib/components/table/theme/Table.carbon.theme.js +11 -3
  289. package/lib/components/table/theme/TableCell.base.theme.js +3 -3
  290. package/lib/components/table/theme/TableCell.carbon.theme.js +9 -3
  291. package/lib/components/table/theme/TableHead.base.theme.d.ts +3 -0
  292. package/lib/components/table/theme/TableHead.base.theme.js +9 -0
  293. package/lib/components/table/theme/TableHead.carbon.theme.d.ts +3 -0
  294. package/lib/components/table/theme/TableHead.carbon.theme.js +9 -0
  295. package/lib/components/table/theme/TableHeader.base.theme.d.ts +3 -0
  296. package/lib/components/table/theme/TableHeader.base.theme.js +12 -0
  297. package/lib/components/table/theme/TableHeader.carbon.theme.d.ts +3 -0
  298. package/lib/components/table/theme/TableHeader.carbon.theme.js +12 -0
  299. package/lib/components/table/theme/TableRow.base.theme.d.ts +3 -0
  300. package/lib/components/table/theme/TableRow.base.theme.js +11 -0
  301. package/lib/components/table/theme/TableRow.carbon.theme.d.ts +3 -0
  302. package/lib/components/table/theme/TableRow.carbon.theme.js +11 -0
  303. package/lib/components/tag/Tag.vue.d.ts +3 -3
  304. package/lib/components/tag/Tag.vue.js +18 -18
  305. package/lib/components/tag/theme/Tag.base.theme.js +14 -13
  306. package/lib/components/tag/theme/Tag.carbon.theme.js +14 -14
  307. package/lib/components/textarea/Textarea.vue.d.ts +18 -8
  308. package/lib/components/textarea/Textarea.vue.js +44 -42
  309. package/lib/components/textarea/theme/Textarea.base.theme.js +6 -6
  310. package/lib/components/textarea/theme/Textarea.carbon.theme.js +6 -6
  311. package/lib/components/toggle/Toggle.vue.d.ts +15 -12
  312. package/lib/components/toggle/Toggle.vue.js +51 -53
  313. package/lib/components/toggle/theme/Toggle.base.theme.js +1 -1
  314. package/lib/components/tooltip/ToggleTip.vue.d.ts +14 -0
  315. package/lib/components/tooltip/ToggleTip.vue.js +29 -0
  316. package/lib/components/tooltip/ToggleTip.vue2.js +4 -0
  317. package/lib/components/tooltip/Tooltip.vue.d.ts +22 -3
  318. package/lib/components/tooltip/Tooltip.vue.js +26 -17
  319. package/lib/components/tooltip/__tests__/ToggleTip.spec.d.ts +1 -0
  320. package/lib/components/tooltip/index.d.ts +2 -0
  321. package/lib/composables/keys.d.ts +5 -1
  322. package/lib/composables/keys.js +8 -6
  323. package/lib/composables/useColors.js +9 -9
  324. package/lib/composables/useFocusTrap.d.ts +6 -0
  325. package/lib/composables/useFocusTrap.js +45 -0
  326. package/lib/composables/useInputtable.d.ts +7 -0
  327. package/lib/composables/useInputtable.js +64 -46
  328. package/lib/index.js +139 -129
  329. package/lib/index.umd.js +7 -3
  330. package/lib/nuxt.mjs +33 -0
  331. package/lib/nuxt.plugin.js +8 -0
  332. package/lib/tailwind.preset.js +40 -0
  333. package/lib/theme.d.ts +8 -2
  334. package/lib/themes/base/components.d.ts +7 -1
  335. package/lib/themes/base/components.js +98 -86
  336. package/lib/themes/base/index.js +3 -6
  337. package/lib/themes/base/styles.css.js +4 -0
  338. package/lib/themes/carbon/components.d.ts +7 -1
  339. package/lib/themes/carbon/components.js +98 -86
  340. package/lib/version.d.ts +1 -1
  341. package/lib/version.js +1 -1
  342. package/package.json +8 -2
  343. package/src/common/icons.ts +4 -1
  344. package/src/components/accordion/Accordion.vue +55 -0
  345. package/src/components/{collapse/Collapse.vue → accordion/AccordionItem.vue} +51 -32
  346. package/src/components/accordion/__tests__/Accordion.spec.ts +11 -0
  347. package/src/components/accordion/index.ts +4 -0
  348. package/src/components/accordion/theme/Accordion.base.theme.ts +9 -0
  349. package/src/components/accordion/theme/Accordion.carbon.theme.ts +7 -0
  350. package/src/components/accordion/theme/AccordionItem.base.theme.ts +38 -0
  351. package/src/components/accordion/theme/AccordionItem.carbon.theme.ts +7 -0
  352. package/src/components/alert/theme/Alert.carbon.theme.ts +54 -2
  353. package/src/components/badge/Badge.vue +1 -1
  354. package/src/components/breadcrumbs/theme/Breadcrumbs.base.theme.ts +1 -1
  355. package/src/components/button/theme/Button.base.theme.ts +2 -2
  356. package/src/components/button/theme/Button.carbon.theme.ts +1 -1
  357. package/src/components/card/theme/Card.base.theme.ts +1 -1
  358. package/src/components/carousel/CarouselSlide.vue +9 -4
  359. package/src/components/checkbox/Checkbox.vue +69 -20
  360. package/src/components/checkbox/theme/Checkbox.base.theme.ts +22 -8
  361. package/src/components/checkbox/theme/Checkbox.carbon.theme.ts +18 -4
  362. package/src/components/container/Container.vue +4 -0
  363. package/src/components/container/theme/Container.base.theme.ts +7 -1
  364. package/src/components/divider/Divider.vue +1 -1
  365. package/src/components/divider/theme/Divider.base.theme.ts +2 -2
  366. package/src/components/drawer/Drawer.vue +2 -2
  367. package/src/components/drawer/theme/Drawer.base.theme.ts +1 -1
  368. package/src/components/form/Form.vue +26 -5
  369. package/src/components/form/theme/Form.base.theme.ts +9 -1
  370. package/src/components/form/theme/Form.carbon.theme.ts +12 -2
  371. package/src/components/formGroup/FormGroup.vue +117 -0
  372. package/src/components/formGroup/__tests__/FormGroup.spec.ts +11 -0
  373. package/src/components/formGroup/index.ts +2 -0
  374. package/src/components/formGroup/theme/FormGroup.base.theme.ts +16 -0
  375. package/src/components/formGroup/theme/FormGroup.carbon.theme.ts +16 -0
  376. package/src/components/icon/theme/Icon.base.theme.ts +3 -3
  377. package/src/components/icon/theme/Icon.carbon.theme.ts +3 -4
  378. package/src/components/index.ts +3 -1
  379. package/src/components/input/Input.vue +5 -4
  380. package/src/components/input/theme/Input.base.theme.ts +5 -5
  381. package/src/components/input/theme/Input.carbon.theme.ts +6 -6
  382. package/src/components/inputFooter/theme/InputFooter.base.theme.ts +3 -3
  383. package/src/components/inputFooter/theme/InputFooter.carbon.theme.ts +3 -3
  384. package/src/components/label/Label.vue +4 -1
  385. package/src/components/label/theme/Label.base.theme.ts +1 -1
  386. package/src/components/label/theme/Label.carbon.theme.ts +9 -4
  387. package/src/components/link/Link.vue +1 -1
  388. package/src/components/link/theme/Link.carbon.theme.ts +23 -2
  389. package/src/components/loader/theme/Loader.base.theme.ts +1 -1
  390. package/src/components/loader/theme/Loader.carbon.theme.ts +2 -2
  391. package/src/components/menu/Menu.vue +11 -8
  392. package/src/components/menu/MenuItem.vue +1 -1
  393. package/src/components/menu/theme/MenuItem.base.theme.ts +32 -36
  394. package/src/components/modal/Modal.vue +117 -52
  395. package/src/components/modal/theme/Modal.base.theme.ts +31 -12
  396. package/src/components/modal/theme/Modal.carbon.theme.ts +55 -2
  397. package/src/components/notifications/Notifications.vue +6 -6
  398. package/src/components/notifications/theme/Notifications.base.theme.ts +2 -2
  399. package/src/components/notifications/theme/Notifications.carbon.theme.ts +12 -2
  400. package/src/components/pagination/Pagination.vue +3 -3
  401. package/src/components/popover/Popover.vue +77 -2
  402. package/src/components/popover/theme/PopoverContainer.base.theme.ts +1 -1
  403. package/src/components/popover/theme/PopoverContainer.carbon.theme.ts +1 -1
  404. package/src/components/progress/Progress.vue +1 -1
  405. package/src/components/progress/theme/Progress.base.theme.ts +2 -2
  406. package/src/components/radio/Radio.vue +39 -15
  407. package/src/components/radio/theme/Radio.base.theme.ts +15 -9
  408. package/src/components/radio/theme/Radio.carbon.theme.ts +14 -8
  409. package/src/components/select/Select.vue +17 -15
  410. package/src/components/select/theme/Select.base.theme.ts +8 -8
  411. package/src/components/select/theme/Select.carbon.theme.ts +9 -9
  412. package/src/components/skeleton/Skeleton.vue +18 -2
  413. package/src/components/skeleton/theme/Skeleton.base.theme.ts +8 -1
  414. package/src/components/slider/Slider.vue +2 -3
  415. package/src/components/slider/theme/Slider.carbon.theme.ts +1 -1
  416. package/src/components/spinner/Spinner.vue +2 -2
  417. package/src/components/stepper/Stepper.vue +153 -0
  418. package/src/components/{collapse/__tests__/Collapse.spec.ts → stepper/__tests__/Stepper.spec.ts} +3 -3
  419. package/src/components/stepper/index.ts +6 -0
  420. package/src/components/stepper/theme/Stepper.base.theme.ts +45 -0
  421. package/src/components/stepper/theme/Stepper.carbon.theme.ts +7 -0
  422. package/src/components/tab/Tab.vue +21 -7
  423. package/src/components/tab/TabGroup.vue +2 -2
  424. package/src/components/tab/theme/Tab.base.theme.ts +2 -0
  425. package/src/components/tab/theme/Tab.carbon.theme.ts +4 -2
  426. package/src/components/tab/theme/TabGroup.base.theme.ts +4 -4
  427. package/src/components/tab/theme/TabGroup.carbon.theme.ts +50 -2
  428. package/src/components/table/Table.vue +125 -27
  429. package/src/components/table/TableCell.vue +5 -6
  430. package/src/components/table/TableHead.vue +25 -0
  431. package/src/components/table/TableHeader.vue +35 -56
  432. package/src/components/table/TableRow.vue +19 -17
  433. package/src/components/table/index.ts +4 -2
  434. package/src/components/table/theme/Table.base.theme.ts +9 -7
  435. package/src/components/table/theme/Table.carbon.theme.ts +18 -2
  436. package/src/components/table/theme/TableCell.base.theme.ts +1 -1
  437. package/src/components/table/theme/TableCell.carbon.theme.ts +24 -2
  438. package/src/components/table/theme/TableHead.base.theme.ts +10 -0
  439. package/src/components/table/theme/TableHead.carbon.theme.ts +10 -0
  440. package/src/components/table/theme/TableHeader.base.theme.ts +28 -0
  441. package/src/components/table/theme/TableHeader.carbon.theme.ts +28 -0
  442. package/src/components/table/theme/TableRow.base.theme.ts +21 -0
  443. package/src/components/table/theme/TableRow.carbon.theme.ts +21 -0
  444. package/src/components/tag/Tag.vue +4 -4
  445. package/src/components/tag/theme/Tag.base.theme.ts +4 -4
  446. package/src/components/tag/theme/Tag.carbon.theme.ts +5 -6
  447. package/src/components/textarea/Textarea.vue +6 -4
  448. package/src/components/textarea/theme/Textarea.base.theme.ts +5 -4
  449. package/src/components/textarea/theme/Textarea.carbon.theme.ts +5 -5
  450. package/src/components/toggle/Toggle.vue +5 -7
  451. package/src/components/toggle/theme/Toggle.base.theme.ts +1 -1
  452. package/src/components/tooltip/ToggleTip.vue +31 -0
  453. package/src/components/tooltip/Tooltip.vue +14 -4
  454. package/src/components/tooltip/__tests__/ToggleTip.spec.ts +11 -0
  455. package/src/components/tooltip/index.ts +3 -0
  456. package/src/composables/keys.ts +5 -1
  457. package/src/composables/useColors.ts +1 -1
  458. package/src/composables/useFocusTrap.ts +106 -0
  459. package/src/composables/useInputtable.ts +32 -3
  460. package/src/theme.ts +14 -2
  461. package/src/themes/base/components.ts +7 -1
  462. package/src/themes/base/index.ts +0 -3
  463. package/src/themes/base/styles.css +4 -0
  464. package/src/themes/carbon/components.ts +7 -1
  465. package/src/version.ts +1 -1
  466. package/volar.d.ts +6 -1
  467. package/lib/components/collapse/Collapse.vue.js +0 -131
  468. package/lib/components/collapse/Collapse.vue2.js +0 -4
  469. package/lib/components/collapse/index.d.ts +0 -2
  470. package/lib/components/collapse/theme/Collapse.base.theme.d.ts +0 -3
  471. package/lib/components/collapse/theme/Collapse.base.theme.js +0 -10
  472. package/lib/components/collapse/theme/Collapse.carbon.theme.d.ts +0 -3
  473. package/lib/components/table/TableHead.d.ts +0 -2
  474. package/lib/components/table/TableHead.js +0 -19
  475. package/src/components/collapse/index.ts +0 -2
  476. package/src/components/collapse/theme/Collapse.base.theme.ts +0 -13
  477. package/src/components/collapse/theme/Collapse.carbon.theme.ts +0 -7
  478. package/src/components/table/TableHead.tsx +0 -14
  479. /package/lib/components/{collapse/__tests__/Collapse.spec.d.ts → accordion/__tests__/Accordion.spec.d.ts} +0 -0
@@ -1,21 +1,20 @@
1
1
  <script lang="ts">
2
2
  const selectProps = {
3
+ ...useColors.props('primary'),
3
4
  ...useCommon.props(),
4
5
  ...useInteractive.props(),
5
6
  ...useInputtable.props(),
6
7
  placeholder: String,
7
8
  options: Array as PropType<SelectOption[]>,
8
9
  multiple: Boolean,
9
- label: String,
10
- helper: String,
11
10
  flat: Boolean,
12
11
  native: Boolean,
13
12
  }
14
13
 
15
14
  export type SelectOption = {
16
15
  value: number | string;
17
- disabled: boolean;
18
16
  label: string;
17
+ disabled?: boolean;
19
18
  }
20
19
 
21
20
  export type SelectProps = ExtractPublicPropTypes<typeof selectProps>
@@ -35,11 +34,12 @@ export default {
35
34
  <script setup lang="ts">
36
35
  import { computed, ref, watch, type PropType, type ExtractPublicPropTypes, type Ref, nextTick, unref } from 'vue'
37
36
  import { useEventListener } from '@vueuse/core'
37
+ import { useColors } from '../../composables/useColors'
38
38
  import { useCommon } from '../../composables/useCommon'
39
39
  import { useInputtable } from '../../composables/useInputtable'
40
40
  import { useInteractive } from '../../composables/useInteractive'
41
41
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
42
- import { checkIcon, chevronDownIcon } from '../../common/icons'
42
+ import { checkIcon, selectIcon } from '../../common/icons'
43
43
 
44
44
  import XLabel from '../label/Label.vue'
45
45
  import XTag from '../tag/Tag.vue'
@@ -230,6 +230,7 @@ const { focus, blur } = useInteractive(elRef)
230
230
 
231
231
  const {
232
232
  errorInternal,
233
+ hideFooterInternal,
233
234
  inputListeners,
234
235
  reset,
235
236
  validate,
@@ -326,6 +327,7 @@ defineExpose({ focus, blur, reset, validate, setError })
326
327
  className,
327
328
  classes.wrapper,
328
329
  ]"
330
+ :tooltip="tooltip"
329
331
  v-on="labelListeners"
330
332
  >
331
333
  <div class="relative">
@@ -335,7 +337,8 @@ defineExpose({ focus, blur, reset, validate, setError })
335
337
  <x-tag
336
338
  v-for="value in selected"
337
339
  :key="value"
338
- size="sm"
340
+ size="xs"
341
+ outlined
339
342
  removable
340
343
  @remove="(e: Event) => { handleRemove(e, value) }"
341
344
  >{{ getLabel(value) }}</x-tag>
@@ -347,7 +350,7 @@ defineExpose({ focus, blur, reset, validate, setError })
347
350
  <template v-else>
348
351
  <div
349
352
  v-if="placeholder"
350
- class="text-gray-400 dark:text-gray-500"
353
+ class="text-secondary-400 dark:text-secondary-500"
351
354
  >
352
355
  {{ placeholder }}
353
356
  </div>
@@ -357,10 +360,7 @@ defineExpose({ focus, blur, reset, validate, setError })
357
360
  <x-popover
358
361
  v-else
359
362
  ref="popoverRef"
360
- block
361
363
  :disabled="disabled || loading || readonly"
362
- :dismiss-on-click="!multiple"
363
- align="left"
364
364
  >
365
365
  <div
366
366
  :class="[classes.box]"
@@ -370,7 +370,8 @@ defineExpose({ focus, blur, reset, validate, setError })
370
370
  <x-tag
371
371
  v-for="value in selected"
372
372
  :key="value"
373
- size="sm"
373
+ size="xs"
374
+ outlined
374
375
  removable
375
376
  @remove="(e: Event) => { handleRemove(e, value) }"
376
377
  >{{ getLabel(value) }}</x-tag>
@@ -383,7 +384,7 @@ defineExpose({ focus, blur, reset, validate, setError })
383
384
  <template v-else>
384
385
  <div
385
386
  v-if="placeholder"
386
- class="text-gray-400 dark:text-gray-500"
387
+ class="text-secondary-400 dark:text-secondary-500"
387
388
  >
388
389
  {{ placeholder }}
389
390
  </div>
@@ -402,12 +403,12 @@ defineExpose({ focus, blur, reset, validate, setError })
402
403
  :size="size"
403
404
  :disabled="item.disabled"
404
405
  :selected="index === selectedIndex"
405
- color="primary"
406
+ :color="color"
406
407
  filled
407
408
  @click="() => !multiple && popoverRef?.hide()"
408
409
  />
409
410
  </template>
410
- <div v-else class="px-2 text-center text-gray-400">
411
+ <div v-else class="px-2 text-center text-secondary-400">
411
412
  No options
412
413
  </div>
413
414
  </x-popover-container>
@@ -415,6 +416,7 @@ defineExpose({ focus, blur, reset, validate, setError })
415
416
  </x-popover>
416
417
 
417
418
  <select
419
+ :id="id"
418
420
  ref="elRef"
419
421
  v-model="selected"
420
422
  tabindex="-1"
@@ -439,7 +441,7 @@ defineExpose({ focus, blur, reset, validate, setError })
439
441
  <x-spinner v-if="loading" :size="size" />
440
442
  <slot v-else name="icon">
441
443
  <x-icon
442
- :icon="chevronDownIcon"
444
+ :icon="selectIcon"
443
445
  :class="[classes.icon]"
444
446
  />
445
447
  </slot>
@@ -447,6 +449,6 @@ defineExpose({ focus, blur, reset, validate, setError })
447
449
  </div>
448
450
  </div>
449
451
 
450
- <x-input-footer v-if="!hideFooter" :error="errorInternal" :helper="helper"/>
452
+ <x-input-footer v-if="!hideFooterInternal" :error="errorInternal" :helper="helper"/>
451
453
  </x-label>
452
454
  </template>
@@ -5,9 +5,9 @@ const theme: SelectTheme = {
5
5
  wrapper: '',
6
6
 
7
7
  box: ({ props, data }) => {
8
- const classes = ['w-full border border-gray-300 dark:border-gray-700 pr-8 outline-transparent outline outline-2 outline-offset-[-1px] transition-all duration-150 ease-in-out rounded-md shadow-sm']
8
+ const classes = ['w-full border border-secondary-300 dark:border-secondary-700 pr-8 outline-transparent outline outline-2 outline-offset-[-1px] transition-all duration-150 ease-in-out rounded-md shadow-sm']
9
9
 
10
- if (!data.errorInternal && !props.disabled) classes.push('hover:border-gray-400 dark:hover:border-gray-500')
10
+ if (!data.errorInternal && !props.disabled) classes.push('hover:border-secondary-400 dark:hover:border-secondary-500')
11
11
 
12
12
  if (props.size === 'xs') classes.push('px-2 py-1 text-xs')
13
13
  else if (props.size === 'sm') classes.push('px-2 py-2 text-sm')
@@ -15,11 +15,11 @@ const theme: SelectTheme = {
15
15
  else if (props.size === 'xl') classes.push('px-5 py-4 text-xl')
16
16
  else classes.push('px-3 py-2')
17
17
 
18
- if (props.disabled) classes.push('bg-gray-100 dark:bg-gray-900 text-gray-500 cursor-not-allowed')
19
- else classes.push('bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-200')
18
+ if (props.disabled) classes.push('bg-secondary-100 dark:bg-secondary-700 text-secondary-400 dark:text-secondary-600 cursor-not-allowed')
19
+ else classes.push('bg-white dark:bg-secondary-800 text-secondary-700 dark:text-secondary-200')
20
20
 
21
21
  if (data.errorInternal) {
22
- classes.push('border-red-500 dark:border-red-400 group-focus:outline-red-500')
22
+ classes.push('border-error-500 dark:border-error-400 group-focus:outline-error-500')
23
23
  } else if (!props.disabled) {
24
24
  classes.push('group-focus:outline-[color:var(--x-select-border)]')
25
25
  }
@@ -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: 'p-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
 
@@ -39,8 +39,8 @@ const theme: SelectTheme = {
39
39
  else if (props.size === 'xl') classes.push('h-7 w-7')
40
40
  else classes.push('h-5 w-5')
41
41
 
42
- if (props.disabled) classes.push('text-gray-300 dark:text-gray-500')
43
- else classes.push('text-gray-500 dark:text-gray-400')
42
+ if (props.disabled) classes.push('text-secondary-300 dark:text-secondary-500')
43
+ else classes.push('text-secondary-500 dark:text-secondary-400')
44
44
 
45
45
  return classes
46
46
  },
@@ -5,24 +5,24 @@ const theme: SelectTheme = {
5
5
  wrapper: '',
6
6
 
7
7
  box: ({ props, data }) => {
8
- const classes = ['w-full border-b text-sm px-4 border-gray-300 dark:border-gray-700 pr-8 outline-transparent outline outline-2 outline-offset-[-1px] transition-all duration-150 ease-in-out']
8
+ const classes = ['w-full border-b text-sm px-4 border-secondary-300 dark:border-secondary-700 pr-8 outline-transparent outline outline-2 outline-offset-[-1px] transition-all duration-150 ease-in-out']
9
9
 
10
- if (!data.errorInternal && !props.disabled) classes.push('hover:border-gray-400 dark:hover:border-gray-500')
10
+ if (!data.errorInternal && !props.disabled) classes.push('hover:border-secondary-400 dark:hover:border-secondary-500')
11
11
 
12
12
  if (props.size === 'xs' || props.size === 'sm') classes.push('py-1.5')
13
13
  else if (props.size === 'lg' || props.size === 'xl') classes.push('py-3.5')
14
14
  else classes.push('py-2.5')
15
15
 
16
16
  if (props.disabled) {
17
- classes.push('bg-gray-100 dark:bg-gray-900 text-gray-300 cursor-not-allowed')
17
+ classes.push('bg-secondary-100 dark:bg-secondary-900 text-secondary-300 cursor-not-allowed')
18
18
  } else if (props.readonly) {
19
- classes.push('bg-white dark:bg-gray-900 text-gray-700')
19
+ classes.push('bg-white dark:bg-secondary-900 text-secondary-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-secondary-50 dark:bg-secondary-800 text-secondary-700 dark:text-secondary-200')
22
22
  }
23
23
 
24
24
  if (data.errorInternal) {
25
- classes.push('border-red-500 dark:border-red-400 group-focus:outline-red-500')
25
+ classes.push('border-error-500 dark:border-error-400 group-focus:outline-error-500')
26
26
  } else if (!props.disabled) {
27
27
  classes.push('group-focus:outline-[color:var(--x-select-border)]')
28
28
  }
@@ -30,15 +30,15 @@ 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
 
37
37
  icon: ({ props }) => {
38
38
  const classes = ['h-5 w-5']
39
39
 
40
- if (props.disabled) classes.push('text-gray-300 dark:text-gray-500')
41
- else classes.push('text-gray-500 dark:text-gray-400')
40
+ if (props.disabled) classes.push('text-secondary-300 dark:text-secondary-500')
41
+ else classes.push('text-secondary-500 dark:text-secondary-400')
42
42
 
43
43
  return classes
44
44
  },
@@ -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-secondary-300 dark:bg-secondary-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"
@@ -212,6 +211,6 @@ defineExpose({ focus, blur, reset, validate, setError })
212
211
  <slot name="suffix" :value="value"></slot>
213
212
  </div>
214
213
 
215
- <p v-if="errorInternal" class="text-sm text-red-500 mt-1" v-text="errorInternal"></p>
214
+ <p v-if="errorInternal" class="text-sm text-error-500 mt-1" v-text="errorInternal"></p>
216
215
  </x-label>
217
216
  </template>
@@ -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-secondary-900 dark:bg-secondary-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-secondary-400 dark:text-secondary-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-secondary-200 dark:bg-secondary-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-secondary-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,
@@ -134,7 +139,7 @@ const { styles, classes, className } = useTheme('Tab', {}, ref({
134
139
  'text-[color:var(--x-tab-group-text)] dark:text-[color:var(--x-tab-group-dark-text)]': selected,
135
140
  'cursor-pointer': !disabled,
136
141
  'cursor-not-allowed': disabled,
137
- 'cursor-not-allowed text-gray-500': disabled && !selected,
142
+ 'cursor-not-allowed text-secondary-500': disabled && !selected,
138
143
  },
139
144
  ]"
140
145
  :aria-disabled="disabled ? 'true' : undefined"
@@ -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-secondary-700 dark:hover:text-secondary-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 v-if="$slots.default" role="tabpanel" :class="classes.tabpanel">
175
+ <slot></slot>
176
+ </div>
163
177
  </teleport>
164
178
  </component>
165
179
  </template>