@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
@@ -3,18 +3,49 @@ const modalSize = ['xs', 'sm', 'md', 'lg', 'xl', 'full'] as const
3
3
  const modalProps = {
4
4
  size: {
5
5
  type: String as PropType<ModalSize>,
6
- default: 'md',
6
+ default: 'xl',
7
7
  },
8
8
  modelValue: Boolean,
9
9
  showClose: Boolean,
10
10
  backdrop: Boolean,
11
+ hasActions: {
12
+ type: Boolean,
13
+ default: true,
14
+ },
15
+ hasHeader: {
16
+ type: Boolean,
17
+ default: true,
18
+ },
19
+ title: String,
20
+ description: String,
21
+ label: String,
22
+ loading: Boolean,
23
+ loadingText: String,
24
+ fluid: Boolean,
25
+
26
+ // form props
27
+ isForm: Boolean,
28
+ formDisabled: Boolean,
29
+ formDescription: String,
30
+ formTitle: String,
31
+ formAutoValidate: {
32
+ type: Boolean,
33
+ default: true,
34
+ },
35
+ formErrors: {
36
+ type: [Array, Object] as PropType<[FormError[], FormError]>,
37
+ default: () => ([]),
38
+ },
11
39
  }
12
40
 
13
41
  export type ModalSize = typeof modalSize[number]
14
42
  export type ModalProps = ExtractPublicPropTypes<typeof modalProps>
15
43
 
16
- type InternalClasses = 'wrapper' | 'backdrop' | 'modal' | 'closeIcon' | 'header' | 'content' | 'actions'
17
- export interface ModalTheme extends ThemeComponent<ModalProps, InternalClasses> {}
44
+ type InternalClasses = 'wrapper' | 'backdrop' | 'modal' | 'closeIcon' | 'header' | 'content' | 'actions' | 'title' | 'description' | 'label'
45
+ type InternaData = {
46
+ visible: boolean;
47
+ }
48
+ export interface ModalTheme extends ThemeComponent<ModalProps, InternalClasses, InternaData> {}
18
49
 
19
50
  export default {
20
51
  name: 'XModal',
@@ -25,21 +56,27 @@ export default {
25
56
  </script>
26
57
 
27
58
  <script setup lang="ts">
28
- import { ref, watch, type PropType, type ExtractPublicPropTypes } from 'vue'
59
+ import { ref, watch, type PropType, type ExtractPublicPropTypes, computed, nextTick, onMounted } from 'vue'
29
60
  import { onClickOutside, useEventListener } from '@vueuse/core'
30
61
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
62
+ import { useFocusTrap } from '../../composables/useFocusTrap'
31
63
  import { closeIcon } from '../../common/icons'
32
64
 
33
- import XScroll from '../../components/scroll/Scroll.vue'
34
- import XIcon from '../icon/Icon.vue'
65
+ import XButton from '../button/Button.vue'
66
+ import XScroll from '../scroll/Scroll.vue'
67
+ import XForm, { type FormError } from '../form/Form.vue'
68
+ import { useSlots } from 'vue'
35
69
 
36
70
  const props = defineProps(modalProps)
37
71
 
38
- const emit = defineEmits(['update:modelValue'])
72
+ const emit = defineEmits(['update:modelValue', 'submit'])
39
73
 
40
74
  const value = ref(props.modelValue)
41
75
  const visible = ref(false)
42
76
  const modalRef = ref<HTMLElement | null>(null)
77
+ const modalWrapperRef = ref<HTMLElement | null>(null)
78
+
79
+ const { initFocusTrap, clearFocusTrap } = useFocusTrap()
43
80
 
44
81
  let stopClickOutside: undefined | (() => void) = undefined
45
82
 
@@ -56,21 +93,29 @@ watch(value, (val) => {
56
93
  }
57
94
  })
58
95
 
59
- watch(() => props.modelValue, (val) => {
96
+ watch(() => props.modelValue, checkVisibiliy, { immediate: true })
97
+
98
+ async function checkVisibiliy() {
99
+ const val = props.modelValue
100
+
60
101
  if (val) {
61
102
  value.value = val
62
103
 
63
- setTimeout(() => {
64
- visible.value = val
65
- })
66
- } else {
104
+ await nextTick()
105
+
67
106
  visible.value = val
68
107
 
69
- setTimeout(() => {
70
- value.value = val
71
- }, 150)
108
+ await nextTick()
109
+
110
+ initFocusTrap(modalRef)
111
+ document.body.style.overflow = 'hidden'
112
+ } else {
113
+ visible.value = val
114
+ value.value = val
115
+ clearFocusTrap()
116
+ document.body.style.overflow = 'auto'
72
117
  }
73
- })
118
+ }
74
119
 
75
120
  if (typeof window !== 'undefined') useEventListener(document, 'keydown', onKeyDown)
76
121
 
@@ -80,23 +125,27 @@ function onKeyDown(event: KeyboardEvent) {
80
125
 
81
126
  function close() {
82
127
  visible.value = false
83
-
84
128
  setTimeout(() => {
85
- value.value = false
86
129
  emit('update:modelValue', false)
87
130
  }, 150)
88
131
  }
89
132
 
90
133
  function open() {
91
- value.value = true
92
134
  emit('update:modelValue', true)
93
-
94
- setTimeout(() => {
95
- visible.value = true
96
- })
135
+ visible.value = true
97
136
  }
98
137
 
99
- const { styles, classes, className } = useTheme('Modal', {}, props)
138
+ const slots = useSlots()
139
+
140
+ const hasPlaceholder = computed(() => {
141
+ if (slots['tertiary-action'] || slots['cancel-action']) return true
142
+
143
+ return false
144
+ })
145
+
146
+ const { styles, classes, className } = useTheme('Modal', {}, props, {
147
+ visible,
148
+ })
100
149
 
101
150
  defineExpose({ open, close })
102
151
  </script>
@@ -105,6 +154,7 @@ defineExpose({ open, close })
105
154
  <teleport to="body">
106
155
  <div
107
156
  v-if="value"
157
+ ref="modalWrapperRef"
108
158
  :style="styles"
109
159
  :class="[
110
160
  className,
@@ -114,38 +164,32 @@ defineExpose({ open, close })
114
164
  >
115
165
  <div
116
166
  v-if="backdrop"
117
- :class="[
118
- classes.backdrop,
119
- visible ? 'ease-out duration-200 opacity-30 dark:opacity-70' : 'ease-in duration-100 opacity-0',
120
- ]"
167
+ :class="classes.backdrop"
121
168
  ></div>
122
169
 
123
170
  <div class="flex items-end sm:items-center justify-center p-4 sm:p-6 h-screen">
124
- <div
171
+ <component
172
+ :is="isForm ? XForm : 'div'"
125
173
  ref="modalRef"
126
- :class="[
127
- classes.modal,
128
- visible ?
129
- 'ease-out duration-200 opacity-100 translate-y-0 sm:scale-100'
130
- : 'ease-in duration-200 opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95',
131
- ]"
174
+ :disabled="formDisabled"
175
+ :auto-validate="formAutoValidate"
176
+ :title="formTitle"
177
+ :description="formDescription"
178
+ :errors="formErrors"
179
+ :class="classes.modal"
180
+ auto-focus
181
+ :has-footer="false"
132
182
  role="dialog"
133
183
  aria-modal="true"
134
184
  aria-labelledby="modal-headline"
185
+ @submit="$emit('submit')"
135
186
  >
136
- <div
137
- v-if="showClose"
138
- :class="[
139
- classes.closeIcon,
140
- $slots.image ? 'bg-gray-900 text-white' : 'bg-gray-500 text-gray-800 dark:text-gray-300'
141
- ]"
142
- @click="close"
143
- >
144
- <x-icon :icon="closeIcon"/>
145
- </div>
146
187
  <slot name="image"></slot>
147
- <div v-if="$slots.header" :class="classes.header">
148
- <slot name="header"></slot>
188
+ <div v-if="hasHeader" :class="classes.header">
189
+ <slot name="header">
190
+ <div v-if="label" :class="classes.label">{{ label }}</div>
191
+ <div v-if="title" :class="classes.title">{{ title }}</div>
192
+ </slot>
149
193
  </div>
150
194
  <x-scroll
151
195
  v-if="$slots.default"
@@ -153,13 +197,29 @@ defineExpose({ open, close })
153
197
  vertical
154
198
  >
155
199
  <div :class="classes.content">
200
+ <div v-if="description" :class="classes.description">{{ description }}</div>
156
201
  <slot></slot>
157
202
  </div>
158
203
  </x-scroll>
159
- <div v-if="$slots.actions" :class="classes.actions">
160
- <slot name="actions"></slot>
204
+ <x-button
205
+ v-if="showClose"
206
+ ghost
207
+ size="lg"
208
+ tabindex="-1"
209
+ :icon="closeIcon"
210
+ :class="classes.closeIcon"
211
+ @click="close"
212
+ />
213
+ <div v-if="hasActions" :class="classes.actions">
214
+ <slot name="actions">
215
+ <slot name="cancel-action"></slot>
216
+ <div v-if="hasPlaceholder"></div>
217
+ <slot name="tertiary-action"></slot>
218
+ <slot name="secondary-action"></slot>
219
+ <slot name="primary-action"></slot>
220
+ </slot>
161
221
  </div>
162
- </div>
222
+ </component>
163
223
  </div>
164
224
  </div>
165
225
  </teleport>
@@ -4,27 +4,43 @@ const theme: ModalTheme = {
4
4
  classes: {
5
5
  wrapper: 'fixed z-40 inset-0 overflow-y-auto transition-all',
6
6
 
7
- backdrop: 'fixed inset-0 bg-gray-500 dark:bg-black transition-opacity',
7
+ backdrop: ({ data }) => {
8
+ const classes = ['fixed inset-0 bg-gray-500 dark:bg-black transition-opacity']
8
9
 
9
- modal: ({ props }) => {
10
- let c = 'relative flex flex-col z-10 bg-white dark:bg-gray-900 rounded-md shadow-lg transform transition-all overflow-hidden max-h-full w-full'
10
+ if (data.visible) classes.push('ease-out duration-200 opacity-30 dark:opacity-70')
11
+ else classes.push('ease-in duration-100 opacity-0')
11
12
 
12
- if (props.size === 'xs') c += ' sm:max-w-xs'
13
- else if (props.size === 'sm') c += ' sm:max-w-sm'
14
- else if (props.size === 'lg') c += ' sm:max-w-xl'
15
- else if (props.size === 'xl') c += ' sm:max-w-3xl'
16
- else c += ' sm:max-w-lg'
13
+ return classes
14
+ },
15
+
16
+ modal: ({ props, data }) => {
17
+ const classes = ['relative flex flex-col z-10 bg-white dark:bg-gray-900 rounded-md shadow-lg transform transition-all overflow-hidden max-h-full w-full']
18
+
19
+ if (data.visible) classes.push('ease-out duration-200 opacity-100 translate-y-0 sm:scale-100')
20
+ else classes.push('ease-in duration-200 opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95')
21
+
22
+ if (props.size === 'xs') classes.push('sm:max-w-xs')
23
+ else if (props.size === 'sm') classes.push('sm:max-w-sm')
24
+ else if (props.size === 'lg') classes.push('sm:max-w-xl')
25
+ else if (props.size === 'xl') classes.push('sm:max-w-3xl')
26
+ else classes.push('sm:max-w-lg')
17
27
 
18
- return c
28
+ return classes
19
29
  },
20
30
 
21
- closeIcon: 'flex absolute p-1 top-4 z-10 right-4 rounded-full bg-opacity-10 hover:bg-opacity-30 cursor-pointer',
31
+ closeIcon: '!absolute top-2 z-10 right-2',
22
32
 
23
- header: 'text-lg font-semibold px-6 py-4 border-b',
33
+ header: 'text-lg pl-6 py-4 border-b pr-12',
24
34
 
25
35
  content: 'px-6 py-4',
26
36
 
27
- actions: 'bg-slate-50 dark:bg-gray-800 p-4',
37
+ actions: 'bg-slate-50 dark:bg-gray-800 p-4 grid grid-flow-col gap-4',
38
+
39
+ label: 'text-xs text-gray-500 mb-1',
40
+
41
+ title: 'text-xl font-semibold mb-4',
42
+
43
+ description: 'text-sm',
28
44
  },
29
45
  }
30
46
 
@@ -1,7 +1,60 @@
1
1
  import type { ModalTheme } from '../Modal.vue'
2
2
 
3
- import BaseTheme from './Modal.base.theme'
3
+ const theme: ModalTheme = {
4
+ classes: {
5
+ wrapper: 'fixed z-40 inset-0 overflow-y-auto transition-all',
4
6
 
5
- const theme: ModalTheme = BaseTheme
7
+ backdrop: ({ data }) => {
8
+ const classes = ['fixed inset-0 bg-gray-500 dark:bg-black transition-opacity']
9
+
10
+ if (data.visible) classes.push('ease-out duration-200 opacity-70 dark:opacity-70')
11
+ else classes.push('ease-in duration-100 opacity-0')
12
+
13
+ return classes
14
+ },
15
+
16
+ modal: ({ props, data }) => {
17
+ const classes = ['relative flex flex-col z-10 bg-gray-200 dark:bg-gray-900 shadow-lg transform transition-all overflow-hidden max-h-full w-full']
18
+
19
+ if (data.visible) classes.push('ease-out duration-200 opacity-100 translate-y-0 sm:scale-100')
20
+ else classes.push('ease-in duration-200 opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95')
21
+
22
+ if (props.size === 'xs') classes.push('sm:max-w-xs')
23
+ else if (props.size === 'sm') classes.push('sm:max-w-sm')
24
+ else if (props.size === 'lg') classes.push('sm:max-w-xl')
25
+ else if (props.size === 'xl') classes.push('sm:max-w-3xl')
26
+ else classes.push('sm:max-w-lg')
27
+
28
+ return classes
29
+ },
30
+
31
+ closeIcon: '!absolute top-0 z-10 right-0',
32
+
33
+ header: 'text-lg pl-4 pt-4 pr-12',
34
+
35
+ content: ({ props }) => {
36
+ const classes = ['pb-8']
37
+
38
+ if (!props.fluid) classes.push('px-4')
39
+
40
+ return classes
41
+ },
42
+
43
+ actions: ({ props, slots }) => {
44
+ const classes = ['grid grid-flow-col gap-[1px]']
45
+
46
+ if (slots['tertiary-action'] || slots['cancel-action']) classes.push('grid-cols-4')
47
+ else classes.push('grid-cols-2')
48
+
49
+ return classes
50
+ },
51
+
52
+ label: 'text-xs text-gray-500 mb-1',
53
+
54
+ title: 'text-xl mb-4',
55
+
56
+ description: 'text-sm mb-4',
57
+ },
58
+ }
6
59
 
7
60
  export default theme
@@ -286,25 +286,25 @@ defineExpose({ log, info, success, warn, warning: warn, error })
286
286
  viewBox="0 0 20 20"
287
287
  />
288
288
  <div class="flex items-center flex-wrap">
289
- <span v-if="notification.title" class="font-semibold mr-2">{{ notification.title }}</span>
289
+ <span v-if="notification.title" class="font-medium mr-2">{{ notification.title }}</span>
290
290
  <span>{{ notification.message }}</span>
291
291
  </div>
292
292
  <x-spacer/>
293
- <div
293
+ <button
294
294
  v-if="notification.action"
295
295
  class="
296
296
  ml-3
297
- font-semibold
297
+ font-medium
298
298
  cursor-pointer
299
299
  text-[color:var(--x-notification-action)]
300
300
  hover:text-[color:var(--x-notification-action-hover)]
301
301
  dark:text-[color:var(--x-notification-dark-action)]
302
302
  dark:hover:text-[color:var(--x-notification-dark-action-hover)]
303
303
  "
304
- @click="notification.action.onClick"
304
+ @click="() => { notification.action?.onClick(); remove(notification); }"
305
305
  >
306
306
  {{ notification.action.label }}
307
- </div>
307
+ </button>
308
308
  <x-icon
309
309
  v-if="notification.removable"
310
310
  :icon="closeIcon"
@@ -2,7 +2,7 @@ import type { NotificationsTheme } from '../Notifications.vue'
2
2
 
3
3
  const theme: NotificationsTheme = {
4
4
  classes: {
5
- wrapper: 'fixed z-40 w-full sm:w-auto overflow-y-auto max-h-screen',
5
+ wrapper: 'fixed z-50 w-full sm:w-auto overflow-y-auto max-h-screen',
6
6
 
7
7
  list: 'flex flex-col items-end w-full sm:w-[520px] px-4',
8
8
 
@@ -1,7 +1,17 @@
1
1
  import type { NotificationsTheme } from '../Notifications.vue'
2
2
 
3
- import BaseTheme from './Notifications.base.theme'
3
+ const theme: NotificationsTheme = {
4
+ classes: {
5
+ wrapper: 'fixed z-50 w-full sm:w-auto overflow-y-auto max-h-screen',
4
6
 
5
- const theme: NotificationsTheme = BaseTheme
7
+ list: 'flex flex-col items-end w-full sm:w-[520px] px-4',
8
+
9
+ item: () => {
10
+ const classes = ['w-full flex items-center px-4 py-3 bg-gray-800 dark:bg-gray-50 text-white dark:text-gray-900 border-l-2 border-[color:var(--x-notification-icon)]']
11
+
12
+ return classes
13
+ },
14
+ },
15
+ }
6
16
 
7
17
  export default theme
@@ -4,16 +4,14 @@ const radioProps = {
4
4
  ...useColors.props('primary'),
5
5
  ...useInteractive.props(),
6
6
  ...useInputtable.props(),
7
- value: [String, Number, Boolean, Function, Object, Array],
8
- label: String,
9
- helper: String,
7
+ value: [String, Number],
10
8
  glow: Boolean,
11
9
  }
12
10
 
13
11
  export type RadioProps = ExtractPublicPropTypes<typeof radioProps>
14
12
 
15
13
  type InternalClasses = 'wrapper' | 'circle' | 'circleIcon' | 'label' | 'content'
16
- type InternalExtraData = { selected: Ref<boolean>; }
14
+ type InternalExtraData = { selected: Ref<boolean>; isInsideForm: boolean; isInsideFormGroup: boolean; }
17
15
  export interface RadioTheme extends ThemeComponent<RadioProps, InternalClasses, InternalExtraData> {}
18
16
 
19
17
  export default {
@@ -25,7 +23,7 @@ export default {
25
23
  </script>
26
24
 
27
25
  <script setup lang="ts">
28
- import { computed, ref, type ExtractPublicPropTypes, type Ref } from 'vue'
26
+ import { computed, ref, type ExtractPublicPropTypes, type Ref, unref } from 'vue'
29
27
  import { useCommon } from '../../composables/useCommon'
30
28
  import { useTheme, type ThemeComponent } from '../../composables/useTheme'
31
29
  import { useColors } from '../../composables/useColors'
@@ -41,25 +39,49 @@ const emit = defineEmits(useInputtable.emits(false))
41
39
 
42
40
  const elRef = ref<HTMLElement | null>(null)
43
41
 
42
+ const { focus, blur } = useInteractive(elRef)
43
+
44
+ const {
45
+ errorInternal,
46
+ hideFooterInternal,
47
+ isInsideForm,
48
+ isInsideFormGroup,
49
+ isFirstValidation,
50
+ formGroup,
51
+ reset,
52
+ validate,
53
+ setError,
54
+ } = useInputtable(props, { focus, emit, withListeners: false })
55
+
44
56
  const selected = computed({
45
57
  get() {
58
+ const formGroupValue = unref(formGroup.value)
59
+
60
+ if (isInsideFormGroup) return formGroupValue === props.value
61
+
46
62
  return props.value === props.modelValue
47
63
  },
48
64
  set() {
49
65
  emit('update:modelValue', props.value)
66
+ formGroup.setValue(props.value as any)
50
67
  },
51
68
  })
52
69
 
53
- const { focus, blur } = useInteractive(elRef)
70
+ function select() {
71
+ emit('update:modelValue', props.value)
72
+ formGroup.setValue(props.value as any)
73
+ }
54
74
 
55
- const {
56
- errorInternal,
57
- reset,
58
- validate,
59
- setError,
60
- } = useInputtable(props, { focus, emit, withListeners: false })
75
+ const listeners = {
76
+ input: () => {
77
+ if (isInsideFormGroup) return
78
+ setTimeout(() => {
79
+ if (props.validateOnInput && !isFirstValidation.value) validate(props.modelValue)
80
+ }, 0)
81
+ },
82
+ }
61
83
 
62
- const { styles, classes, className } = useTheme('Radio', {}, props, { selected })
84
+ const { styles, classes, className } = useTheme('Radio', {}, props, { selected, isInsideForm, isInsideFormGroup })
63
85
 
64
86
  defineExpose({ focus, blur, reset, validate, setError })
65
87
  </script>
@@ -75,19 +97,21 @@ defineExpose({ focus, blur, reset, validate, setError })
75
97
  className,
76
98
  classes.wrapper,
77
99
  ]"
78
- @keypress.prevent.stop.space="$emit('update:modelValue', value)"
100
+ @keypress.prevent.stop.space="select"
79
101
  >
80
102
  <div
81
103
  class="flex items-center"
82
104
  :class="{ 'cursor-not-allowed': disabled }"
83
105
  >
84
106
  <input
107
+ :id="id"
85
108
  v-model="selected"
86
109
  :name="name"
87
110
  :required="required"
88
111
  :disabled="disabled || loading"
89
112
  type="radio"
90
113
  class="invisible absolute"
114
+ v-on="listeners"
91
115
  />
92
116
  <div
93
117
  :class="[
@@ -125,7 +149,7 @@ defineExpose({ focus, blur, reset, validate, setError })
125
149
  </div>
126
150
  </div>
127
151
 
128
- <x-input-footer v-if="!hideFooter" :error="errorInternal" :helper="helper"/>
152
+ <x-input-footer v-if="!hideFooterInternal" :error="errorInternal" :helper="helper"/>
129
153
  </label>
130
154
  </template>
131
155
 
@@ -2,7 +2,13 @@ import type { RadioTheme } from '../Radio.vue'
2
2
 
3
3
  const theme: RadioTheme = {
4
4
  classes: {
5
- wrapper: 'inline-block relative cursor-pointer focus:outline-none group',
5
+ wrapper: ({ data }) => {
6
+ const classes = ['inline-block relative cursor-pointer focus:outline-none group']
7
+
8
+ if (data.isInsideForm && !data.isInsideFormGroup) classes.push('mb-3')
9
+
10
+ return classes
11
+ },
6
12
 
7
13
  circle: ({ props }) => {
8
14
  let c = 'rounded-full flex justify-center items-center shrink-0 border-2 outline-offset-2 outline-slate-300 dark:outline-slate-500 group-focus:outline-1 group-focus:outline'
@@ -2,16 +2,22 @@ import type { RadioTheme } from '../Radio.vue'
2
2
 
3
3
  const theme: RadioTheme = {
4
4
  classes: {
5
- wrapper: 'inline-block relative cursor-pointer focus:outline-none group',
5
+ wrapper: ({ data }) => {
6
+ const classes = ['inline-block relative cursor-pointer focus:outline-none group']
7
+
8
+ if (data.isInsideForm && !data.isInsideFormGroup) classes.push('mb-8')
9
+
10
+ return classes
11
+ },
6
12
 
7
13
  circle: ({ props }) => {
8
- let c = 'rounded-full flex justify-center items-center shrink-0 border outline-offset-2 outline-slate-300 dark:outline-slate-500 group-focus:outline-1 group-focus:outline'
14
+ const classes = ['rounded-full flex justify-center items-center shrink-0 border outline-offset-2 outline-slate-300 dark:outline-slate-500 group-focus:outline-1 group-focus:outline']
9
15
 
10
- if (props.size === 'xs' || props.size === 'sm') c += ' h-4 w-4'
11
- if (props.size === 'xl') c += ' h-6 w-6'
12
- else c += ' h-5 w-5'
16
+ if (props.size === 'xs' || props.size === 'sm') classes.push('h-3 w-3')
17
+ else if (props.size === 'xl') classes.push('h-5 w-5')
18
+ else classes.push('h-4 w-4')
13
19
 
14
- return c
20
+ return classes
15
21
  },
16
22
 
17
23
  circleIcon: ({ props, data }) => {
@@ -84,7 +90,7 @@ const theme: RadioTheme = {
84
90
  } else {
85
91
  vars.push(css.variables({
86
92
  bg: '#fff',
87
- border: props.glow ? color[300] : gray[300],
93
+ border: props.glow ? color[300] : gray[900],
88
94
  dark: {
89
95
  bg: gray[900],
90
96
  border: props.glow ? color[300] : gray[300],