@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indielayer/ui",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Indielayer UI Components with Tailwind CSS build for Vue 3",
5
5
  "author": {
6
6
  "name": "João Teixeira",
@@ -20,6 +20,7 @@
20
20
  "files": [
21
21
  "lib",
22
22
  "src",
23
+ "docs",
23
24
  "*.d.ts",
24
25
  "exports",
25
26
  "README.md"
@@ -64,12 +65,14 @@
64
65
  "jsdom": "^22.1.0",
65
66
  "postcss": "^8.4.4",
66
67
  "rollup-plugin-visualizer": "^5.9.2",
68
+ "shiki": "1.0.0-beta.1",
67
69
  "stylelint": "^14.16.1",
68
70
  "tailwindcss": "^3.3.2",
69
71
  "typescript": "^5.2.2",
70
72
  "vite": "^4.4.11",
71
73
  "vitest": "^0.32.2",
72
74
  "vue": "^3.3.9",
75
+ "vue-router": "^4.2.2",
73
76
  "vue-tsc": "^1.8.2"
74
77
  },
75
78
  "browserslist": [
@@ -90,9 +93,11 @@
90
93
  "access": "public"
91
94
  },
92
95
  "scripts": {
93
- "dev": "pnpm generate && vite build --watch",
96
+ "dev": "vite dev --mode docs",
94
97
  "build": "pnpm generate && vite build",
98
+ "build:docs": "pnpm build --mode docs",
95
99
  "build:prod": "pnpm build && pnpm gen-types",
100
+ "build:watch": "pnpm generate && vite build --watch",
96
101
  "build:only": "vite build",
97
102
  "build:stats": "VITE_VISUALIZER=Y npm run build",
98
103
  "generate": "pnpm gen-version",
@@ -11,5 +11,8 @@ export const dotsIcon = '<path d="M5 12h.01M12 12h.01M19 12h.01M6 12a1 1 0 11-2
11
11
  export const prevIcon = '<path d="M15 19l-7-7 7-7" />'
12
12
  export const nextIcon = '<path d="M9 5l7 7-7 7" />'
13
13
  export const checkIcon = '<path d="M5 13l4 4L19 7" />'
14
- export const chevronDownIcon = '<path d="M8 9l4-4 4 4m0 6l-4 4-4-4" />'
14
+ export const selectIcon = '<path d="M8 9l4-4 4 4m0 6l-4 4-4-4" />'
15
15
  export const externalIcon = '<line x1="7" y1="17" x2="17" y2="7" /><polyline points="7 7 17 7 17 17" />'
16
+ export const stepperPristineIcon = '<path d="M7.5 4.21v.01M4.21 7.5v.01M3 12v.01m1.21 4.49v.01m3.29 3.28v.01M12 21v.01m4.5-1.22v.01m3.29-3.3v.01M21 12v.01M19.79 7.5v.01m-3.29-3.3v.01M12 3v.01"/>'
17
+ export const stepperIncompleteIcon = '<svg focusable="false" preserveAspectRatio="xMidYMid meet" fill="currentColor" viewBox="0 0 32 32" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"><path d="M23.7642 6.8593l1.2851-1.5315A13.976 13.976 0 0020.8672 2.887l-.6836 1.8776A11.9729 11.9729 0 0123.7642 6.8593zM27.81 14l1.9677-.4128A13.8888 13.8888 0 0028.14 9.0457L26.4087 10A12.52 12.52 0 0127.81 14zM20.1836 27.2354l.6836 1.8776a13.976 13.976 0 004.1821-2.4408l-1.2851-1.5315A11.9729 11.9729 0 0120.1836 27.2354zM26.4087 22L28.14 23a14.14 14.14 0 001.6382-4.5872L27.81 18.0659A12.1519 12.1519 0 0126.4087 22zM16 30V2a14 14 0 000 28z"></path></svg>'
18
+ export const chevronDownIcon = '<path d="M19 9l-7 7-7-7" />'
@@ -0,0 +1,55 @@
1
+ <script lang="ts">
2
+ const accordionProps = {
3
+ tag: {
4
+ type: String,
5
+ default: 'div',
6
+ },
7
+ disabled: Boolean,
8
+ expanded: Boolean,
9
+ showIcon: {
10
+ type: Boolean,
11
+ default: true,
12
+ },
13
+ icon: String,
14
+ iconAlign: String as PropType<AccordionItemAlign>,
15
+ }
16
+
17
+ export type AccordionProps = ExtractPublicPropTypes<typeof accordionProps>
18
+
19
+ export type AccordionInjection = AccordionProps & {
20
+ isInsideAccordion: boolean;
21
+ }
22
+
23
+ type InternalClasses = 'wrapper'
24
+ export interface AccordionTheme extends ThemeComponent<AccordionProps, InternalClasses> {}
25
+
26
+ export default {
27
+ name: 'XAccordion',
28
+ validators: {},
29
+ }
30
+ </script>
31
+
32
+ <script setup lang="ts">
33
+ import { type ExtractPublicPropTypes, type PropType, provide } from 'vue'
34
+ import { useTheme, type ThemeComponent } from '../../composables/useTheme'
35
+ import type { AccordionItemAlign } from './AccordionItem.vue'
36
+ import { injectAccordionKey } from '../../composables/keys'
37
+
38
+ const props = defineProps(accordionProps)
39
+
40
+ provide(injectAccordionKey, { ...props, isInsideAccordion: true })
41
+
42
+ const { styles, classes, className } = useTheme('Accordion', {}, props)
43
+ </script>
44
+
45
+ <template>
46
+ <div
47
+ :style="styles"
48
+ :class="[
49
+ className,
50
+ classes.wrapper,
51
+ ]"
52
+ >
53
+ <slot></slot>
54
+ </div>
55
+ </template>
@@ -1,35 +1,61 @@
1
1
  <script lang="ts">
2
- const collapseProps = {
3
- ...useColors.props(),
2
+ const accordionItemAlign = ['left', 'right'] as const
3
+ const accordionItemProps = {
4
4
  tag: {
5
5
  type: String,
6
6
  default: 'div',
7
7
  },
8
8
  disabled: Boolean,
9
9
  expanded: Boolean,
10
- showIcon: Boolean,
10
+ showIcon: {
11
+ type: Boolean,
12
+ default: true,
13
+ },
11
14
  icon: String,
15
+ iconAlign: {
16
+ type: String as PropType<AccordionItemAlign>,
17
+ default: 'right',
18
+ },
12
19
  }
13
20
 
14
- export type CollapseProps = ExtractPublicPropTypes<typeof collapseProps>
21
+ export type AccordionItemAlign = typeof accordionItemAlign[number]
22
+ export type AccordionItemProps = ExtractPublicPropTypes<typeof accordionItemProps>
15
23
 
16
24
  type InternalClasses = 'wrapper' | 'icon' | 'content'
17
- export interface CollapseTheme extends ThemeComponent<CollapseProps, InternalClasses> {}
25
+ type InternalData = {
26
+ collapsed: boolean;
27
+ isInsideAccordion: boolean;
28
+ }
29
+ export interface AccordionItemTheme extends ThemeComponent<AccordionItemProps, InternalClasses, InternalData> {}
18
30
 
19
- export default { name: 'XCollapse' }
31
+ export default {
32
+ name: 'XAccordionItem',
33
+ validators: {
34
+ iconAlign: accordionItemAlign,
35
+ },
36
+ }
20
37
  </script>
21
38
 
22
39
  <script setup lang="ts">
23
- import { ref, watch, type ExtractPublicPropTypes } from 'vue'
40
+ import { ref, watch, type ExtractPublicPropTypes, type PropType, inject, computed, reactive } from 'vue'
24
41
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
25
- import { useColors } from '../../composables/useColors'
26
42
 
27
43
  import XIcon from '../../components/icon/Icon.vue'
44
+ import { injectAccordionKey } from '../../composables/keys'
28
45
 
29
- const props = defineProps(collapseProps)
46
+ const props = defineProps(accordionItemProps)
30
47
 
31
48
  const emit = defineEmits(['expand'])
32
49
 
50
+ const accordionProps = inject(injectAccordionKey, {
51
+ isInsideAccordion: false,
52
+ })
53
+
54
+ const computedIconAlign = computed(() => accordionProps.iconAlign || props.iconAlign)
55
+ const computedProps = reactive({
56
+ iconAlign: computedIconAlign,
57
+ })
58
+
33
59
  const collapsed = ref(!props.expanded)
34
60
  const animated = ref(true)
35
61
 
@@ -101,7 +127,10 @@ function onExpand(anim = true) {
101
127
  emit('expand')
102
128
  }
103
129
 
104
- const { styles, classes, className } = useTheme('Collapse', {}, props)
130
+ const { styles, classes, className } = useTheme('AccordionItem', {}, {
131
+ ...props,
132
+ ...computedProps,
133
+ }, { collapsed, isInsideAccordion: accordionProps.isInsideAccordion })
105
134
 
106
135
  defineExpose({ toggle, open, close })
107
136
  </script>
@@ -114,7 +143,7 @@ defineExpose({ toggle, open, close })
114
143
  :aria-disabled="disabled"
115
144
  :aria-expanded="collapsed ? 'false' : 'true'"
116
145
  >
117
- <div
146
+ <button
118
147
  :class="classes.wrapper"
119
148
  @click="toggle"
120
149
  >
@@ -123,29 +152,19 @@ defineExpose({ toggle, open, close })
123
152
  </div>
124
153
 
125
154
  <div v-if="showIcon" :class="classes.icon">
126
- <span
127
- class="flex transform transition-transform duration-150"
128
- :class="[
129
- {
130
- 'rotate-180': !collapsed,
131
- 'text-gray-300': disabled
132
- }
133
- ]"
155
+ <x-icon v-if="icon" :icon="icon" />
156
+ <svg
157
+ v-else
158
+ viewBox="0 0 24 24"
159
+ stroke="currentColor"
160
+ fill="none"
161
+ role="presentation"
162
+ class="stroke-2 w-4 h-4"
134
163
  >
135
- <x-icon v-if="icon" :icon="icon" />
136
- <svg
137
- v-else
138
- viewBox="0 0 24 24"
139
- stroke="currentColor"
140
- fill="none"
141
- role="presentation"
142
- class="stroke-2 w-5 h-5"
143
- >
144
- <path d="M19 9l-7 7-7-7" />
145
- </svg>
146
- </span>
164
+ <path d="M19 9l-7 7-7-7" />
165
+ </svg>
147
166
  </div>
148
- </div>
167
+ </button>
149
168
 
150
169
  <template v-if="$slots.summary">
151
170
  <slot name="summary"></slot>
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import Accordion from '../Accordion.vue'
4
+
5
+ describe('Accordion', () => {
6
+ it('renders properly', () => {
7
+ const wrapper = mount(Accordion)
8
+
9
+ expect(wrapper.vm).toBeTruthy()
10
+ })
11
+ })
@@ -0,0 +1,4 @@
1
+ export { default as XAccordion } from './Accordion.vue'
2
+ export type { AccordionProps, AccordionInjection, AccordionTheme } from './Accordion.vue'
3
+ export { default as XAccordionItem } from './AccordionItem.vue'
4
+ export type { AccordionItemProps, AccordionItemTheme } from './AccordionItem.vue'
@@ -0,0 +1,9 @@
1
+ import type { AccordionTheme } from '../Accordion.vue'
2
+
3
+ const theme: AccordionTheme = {
4
+ classes: {
5
+ wrapper: 'grid grid-cols-1 divide-y',
6
+ },
7
+ }
8
+
9
+ export default theme
@@ -0,0 +1,7 @@
1
+ import type { AccordionTheme } from '../Accordion.vue'
2
+
3
+ import BaseTheme from './Accordion.base.theme'
4
+
5
+ const theme: AccordionTheme = BaseTheme
6
+
7
+ export default theme
@@ -0,0 +1,38 @@
1
+ import type { AccordionItemTheme } from '../AccordionItem.vue'
2
+
3
+ const theme: AccordionItemTheme = {
4
+ classes: {
5
+ wrapper: ({ props, slots, data }) => {
6
+ const classes = ['relative flex items-center w-full text-left']
7
+
8
+ if (!data.isInsideAccordion) return classes
9
+
10
+ if (slots.default) {
11
+ if (props.iconAlign === 'left') classes.push('pl-8 pr-4')
12
+ else classes.push('pr-8 pl-4')
13
+ classes.push('py-2')
14
+ if (!props.disabled) classes.push('hover:bg-gray-50 dark:hover:bg-gray-600')
15
+ }
16
+
17
+ if (!props.disabled) classes.push('cursor-pointer')
18
+
19
+ return classes
20
+ },
21
+
22
+ icon: ({ props, data }) => {
23
+ const classes = ['absolute flex transform transition-transform duration-150']
24
+
25
+ if (!data.collapsed) classes.push('rotate-180')
26
+ if (props.disabled) classes.push('text-gray-300')
27
+
28
+ if (props.iconAlign === 'left') classes.push('left-2')
29
+ else classes.push('right-2')
30
+
31
+ return classes
32
+ },
33
+
34
+ content: 'transition-[height] duration-150 overflow-y-hidden',
35
+ },
36
+ }
37
+
38
+ export default theme
@@ -0,0 +1,7 @@
1
+ import type { AccordionItemTheme } from '../AccordionItem.vue'
2
+
3
+ import BaseTheme from './AccordionItem.base.theme'
4
+
5
+ const theme: AccordionItemTheme = BaseTheme
6
+
7
+ export default theme
@@ -1,7 +1,59 @@
1
1
  import type { AlertTheme } from '../Alert.vue'
2
2
 
3
- import BaseTheme from './Alert.base.theme'
3
+ const theme: AlertTheme = {
4
+ classes: {
5
+ wrapper: 'flex items-center space-x-2 px-4 py-3 border border-l-4 text-sm',
6
+ },
7
+ styles: ({ props, colors, css }) => {
8
+ const gray = colors.getPalette('gray')
9
+ const color = colors.getPalette(props.color)
10
+ const vars = []
4
11
 
5
- const theme: AlertTheme = BaseTheme
12
+ if (props.glow) vars.push(css.get('glow', colors.getColorOpacity(color[500], 0.5)))
13
+
14
+ if (props.color) {
15
+ if (props.light) {
16
+ vars.push(css.variables({
17
+ bg: color[50],
18
+ text: gray[900],
19
+ icon: color[600],
20
+ border: props.outlined ? color[600] : color[50],
21
+ dark: {
22
+ bg: gray[800],
23
+ text: gray[100],
24
+ icon: color[600],
25
+ border: props.outlined ? color[500] : color[200],
26
+ },
27
+ }))
28
+ } else {
29
+ vars.push(css.variables({
30
+ bg: props.outlined ? 'transparent' : color[600],
31
+ text: props.outlined ? color[600] : color[50],
32
+ icon: props.outlined ? color[600] : color[50],
33
+ border: color[600],
34
+ dark: {
35
+ border: color[400],
36
+ text: props.outlined ? color[400] : color[50],
37
+ },
38
+ }))
39
+ }
40
+
41
+ return vars
42
+ }
43
+
44
+ vars.push(css.variables({
45
+ bg: 'transparent',
46
+ text: color[500],
47
+ border: color[300],
48
+ dark: {
49
+ bg: 'transparent',
50
+ text: color[300],
51
+ border: color[500],
52
+ },
53
+ }))
54
+
55
+ return vars
56
+ },
57
+ }
6
58
 
7
59
  export default theme
@@ -3,7 +3,7 @@ import type { ButtonTheme } from '../Button.vue'
3
3
  const theme: ButtonTheme = {
4
4
  classes: {
5
5
  wrapper({ props, slots, data }) {
6
- const classes = ['relative transition duration-150 focus:outline-none inline-flex whitespace-nowrap overflow-hidden align-top appearance-none text-sm active:shadow-none border !leading-[1.28572] tracking-wide font-light']
6
+ const classes = ['relative transition duration-150 inline-flex whitespace-nowrap overflow-hidden align-top appearance-none text-sm active:shadow-none border !leading-[1.28572] tracking-wide font-light']
7
7
 
8
8
  // radius
9
9
  if (!data.isButtonGroup) classes.push(props.rounded ? 'rounded-full' : '')
@@ -1,5 +1,10 @@
1
1
  <script lang="ts">
2
- const carouselSlideProps = {}
2
+ const carouselSlideProps = {
3
+ tag: {
4
+ type: String,
5
+ default: 'div',
6
+ },
7
+ }
3
8
 
4
9
  export type CarouselSlideProps = ExtractPublicPropTypes<typeof carouselSlideProps>
5
10
 
@@ -8,7 +13,6 @@ export interface CarouselSlideTheme extends ThemeComponent<CarouselSlideProps, I
8
13
 
9
14
  export default {
10
15
  name: 'XCarouselSlide',
11
- validators: {},
12
16
  }
13
17
  </script>
14
18
 
@@ -22,7 +26,8 @@ const { styles, classes, className } = useTheme('CarouselSlide', {}, props)
22
26
  </script>
23
27
 
24
28
  <template>
25
- <div
29
+ <component
30
+ :is="tag"
26
31
  :style="styles"
27
32
  :class="[
28
33
  className,
@@ -31,7 +36,7 @@ const { styles, classes, className } = useTheme('CarouselSlide', {}, props)
31
36
  ]"
32
37
  >
33
38
  <slot></slot>
34
- </div>
39
+ </component>
35
40
  </template>
36
41
 
37
42
  <style lang="postcss" scoped module>
@@ -4,15 +4,15 @@ const checkboxProps = {
4
4
  ...useColors.props('primary'),
5
5
  ...useInteractive.props(),
6
6
  ...useInputtable.props(),
7
- label: String,
8
- helper: String,
7
+ value: [String, Number],
8
+ indeterminate: Boolean,
9
9
  glow: Boolean,
10
10
  }
11
11
 
12
12
  export type CheckboxProps = ExtractPublicPropTypes<typeof checkboxProps>
13
13
 
14
- type InternalClasses = 'wrapper' | 'box' | 'icon' | 'label'
15
- type InternalExtraData = { checked: Ref<boolean>; }
14
+ type InternalClasses = 'wrapper' | 'content' | 'box' | 'icon' | 'label'
15
+ type InternalExtraData = { checked: Ref<boolean>; isInsideForm: boolean; isInsideFormGroup: boolean;}
16
16
  export interface CheckboxTheme extends ThemeComponent<CheckboxProps, InternalClasses, InternalExtraData> {}
17
17
 
18
18
  export default {
@@ -24,7 +24,7 @@ export default {
24
24
  </script>
25
25
 
26
26
  <script setup lang="ts">
27
- import { ref, watch, type ExtractPublicPropTypes, type Ref } from 'vue'
27
+ import { ref, watch, type ExtractPublicPropTypes, type Ref, unref, nextTick } from 'vue'
28
28
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
29
29
  import { useCommon } from '../../composables/useCommon'
30
30
  import { useColors } from '../../composables/useColors'
@@ -41,14 +41,6 @@ const emit = defineEmits(useInputtable.emits(false))
41
41
  const elRef = ref<HTMLElement | null>(null)
42
42
  const checked = ref(false)
43
43
 
44
- watch(() => props.modelValue, (value) => {
45
- checked.value = !!value
46
- }, { immediate: true })
47
-
48
- watch(() => checked.value, (value) => {
49
- emit('update:modelValue', value)
50
- })
51
-
52
44
  function toggle() {
53
45
  checked.value = !checked.value
54
46
  }
@@ -57,13 +49,69 @@ const { focus, blur } = useInteractive(elRef)
57
49
 
58
50
  const {
59
51
  errorInternal,
52
+ hideFooterInternal,
60
53
  isInsideForm,
54
+ isInsideFormGroup,
55
+ isFirstValidation,
56
+ formGroup,
61
57
  reset,
62
58
  validate,
63
59
  setError,
64
60
  } = useInputtable(props, { focus, emit, withListeners: false })
65
61
 
66
- const { styles, classes, className } = useTheme('Checkbox', {}, props, { checked })
62
+ if (isInsideFormGroup) {
63
+ watch(() => formGroup.value, () => {
64
+ const formGroupValue = unref(formGroup.value)
65
+
66
+ if (formGroupValue && Array.isArray(formGroupValue) && formGroupValue.includes(props.value as never)) checked.value = true
67
+ else checked.value = false
68
+ }, { immediate: true, deep: true })
69
+
70
+ watch(() => checked.value, (value) => {
71
+ if (!props.value) return
72
+
73
+ const formGroupValue = unref(formGroup.value)
74
+
75
+ if (value) {
76
+ if (formGroupValue && Array.isArray(formGroupValue)) {
77
+ if (!formGroupValue.includes(props.value as never)) {
78
+ const newValue = [...formGroupValue, props.value]
79
+
80
+ formGroup.setValue(newValue as any)
81
+ }
82
+ } else {
83
+ formGroup.setValue([props.value as any])
84
+ }
85
+ } else {
86
+ if (formGroupValue && Array.isArray(formGroupValue) && formGroupValue.includes(props.value as never)) {
87
+ const index = formGroupValue.findIndex((v) => v === props.value)
88
+ const newValue = [...formGroupValue]
89
+
90
+ newValue.splice(index, 1)
91
+ formGroup.setValue(newValue as any)
92
+ }
93
+ }
94
+ })
95
+ } else {
96
+ watch(() => props.modelValue, (value) => {
97
+ checked.value = !!value
98
+ }, { immediate: true })
99
+
100
+ watch(() => checked.value, (value) => {
101
+ emit('update:modelValue', value)
102
+ })
103
+ }
104
+
105
+ const listeners = {
106
+ input: () => {
107
+ if (isInsideFormGroup) return
108
+ setTimeout(() => {
109
+ if (props.validateOnInput && !isFirstValidation.value) validate(props.modelValue)
110
+ }, 0)
111
+ },
112
+ }
113
+
114
+ const { styles, classes, className } = useTheme('Checkbox', {}, props, { checked, isInsideForm, isInsideFormGroup })
67
115
 
68
116
  defineExpose({ focus, blur, toggle, reset, validate, setError })
69
117
  </script>
@@ -74,25 +122,25 @@ defineExpose({ focus, blur, toggle, reset, validate, setError })
74
122
  :class="[
75
123
  className,
76
124
  classes.wrapper,
77
- { 'mb-3': isInsideForm }
78
125
  ]"
79
126
  >
80
127
  <div
81
128
  ref="elRef"
82
- class="flex items-center"
83
- :class="{ 'cursor-not-allowed': disabled }"
129
+ :class="classes.content"
84
130
  tabindex="0"
85
131
  @keypress.prevent.stop.space="toggle"
86
132
  >
87
133
  <input
134
+ :id="id"
88
135
  v-model="checked"
89
- :aria-checked="checked ? 'true' : 'false'"
136
+ :name="name"
137
+ :aria-checked="indeterminate ? 'mixed' : (checked ? 'true' : 'false')"
90
138
  :aria-disabled="disabled ? 'true' : undefined"
91
139
  type="checkbox"
92
140
  class="invisible absolute"
93
141
  :disabled="disabled || loading"
94
- :name="name"
95
142
  :required="required"
143
+ v-on="listeners"
96
144
  />
97
145
  <div
98
146
  :class="[
@@ -101,6 +149,7 @@ defineExpose({ focus, blur, toggle, reset, validate, setError })
101
149
  ]"
102
150
  >
103
151
  <x-spinner v-if="loading" :size="size" class="absolute" />
152
+ <span v-else-if="indeterminate" name="check-icon" class="w-2/3 h-[2px] bg-white dark:bg-gray-900"></span>
104
153
  <slot v-else name="icon">
105
154
  <svg
106
155
  viewBox="0 0 20 20"
@@ -116,7 +165,7 @@ defineExpose({ focus, blur, toggle, reset, validate, setError })
116
165
  </div>
117
166
  </div>
118
167
 
119
- <x-input-footer v-if="!hideFooter" :error="errorInternal" :helper="helper"/>
168
+ <x-input-footer v-if="!hideFooterInternal" :error="errorInternal" :helper="helper"/>
120
169
  </label>
121
170
  </template>
122
171
 
@@ -2,7 +2,13 @@ import type { CheckboxTheme } from '../Checkbox.vue'
2
2
 
3
3
  const theme: CheckboxTheme = {
4
4
  classes: {
5
- wrapper: 'inline-block relative cursor-pointer align-middle',
5
+ wrapper: ({ data }) => {
6
+ const classes = ['inline-block relative cursor-pointer align-middle']
7
+
8
+ if (data.isInsideForm && !data.isInsideFormGroup) classes.push('mb-3')
9
+
10
+ return classes
11
+ },
6
12
 
7
13
  box: ({ props }) => {
8
14
  const classes = ['rounded flex justify-center items-center shrink-0 border-2 border-[color:var(--x-checkbox-border)] bg-[color:var(--x-checkbox-bg)] dark:border-[color:var(--x-checkbox-dark-border)] dark:bg-[color:var(--x-checkbox-dark-bg)]']
@@ -14,6 +20,14 @@ const theme: CheckboxTheme = {
14
20
  return classes
15
21
  },
16
22
 
23
+ content: ({ props }) => {
24
+ const classes = ['flex items-center']
25
+
26
+ if (props.disabled) classes.push('cursor-not-allowed')
27
+
28
+ return classes
29
+ },
30
+
17
31
  icon: ({ props }) => {
18
32
  const classes = ['fill-current text-white dark:text-gray-900']
19
33
 
@@ -2,10 +2,16 @@ import type { CheckboxTheme } from '../Checkbox.vue'
2
2
 
3
3
  const theme: CheckboxTheme = {
4
4
  classes: {
5
- wrapper: 'inline-block relative cursor-pointer align-middle',
5
+ wrapper: ({ data }) => {
6
+ const classes = ['inline-block relative cursor-pointer align-middle']
7
+
8
+ if (data.isInsideForm && !data.isInsideFormGroup) classes.push('mb-8')
9
+
10
+ return classes
11
+ },
6
12
 
7
13
  box: ({ props }) => {
8
- const classes = ['rounded-sm flex justify-center items-center shrink-0 border border-[color:var(--x-checkbox-border)] bg-[color:var(--x-checkbox-bg)] dark:border-[color:var(--x-checkbox-dark-border)] dark:bg-[color:var(--x-checkbox-dark-bg)]']
14
+ const classes = ['rounded-sm flex justify-center items-center shrink-0 border border-[color:var(--x-checkbox-border)] bg-[color:var(--x-checkbox-bg)] dark:border-[color:var(--x-checkbox-dark-border)] dark:bg-[color:var(--x-checkbox-dark-bg)] mt-0.5']
9
15
 
10
16
  if (props.size === 'xs' || props.size === 'sm') classes.push('h-3 w-3')
11
17
  else if (props.size === 'xl') classes.push('h-5 w-5')
@@ -14,6 +20,14 @@ const theme: CheckboxTheme = {
14
20
  return classes
15
21
  },
16
22
 
23
+ content: ({ props }) => {
24
+ const classes = ['flex']
25
+
26
+ if (props.disabled) classes.push('cursor-not-allowed')
27
+
28
+ return classes
29
+ },
30
+
17
31
  icon: ({ props }) => {
18
32
  const classes = ['fill-current text-white dark:text-gray-900']
19
33
 
@@ -25,7 +39,7 @@ const theme: CheckboxTheme = {
25
39
  },
26
40
 
27
41
  label: ({ props }) => {
28
- const classes = ['inline-block text-gray-800 dark:text-gray-200 pl-2 text-sm']
42
+ const classes = ['text-gray-800 dark:text-gray-200 pl-2 text-sm']
29
43
 
30
44
  if (props.size === 'xs') classes.push('text-xs')
31
45
  else if (props.size === 'sm') classes.push('text-sm')