vueless 0.0.10 → 0.0.12

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 (359) hide show
  1. package/composable.ui/index.js +395 -0
  2. package/package.json +2 -2
  3. package/service.storybook/index.js +91 -0
  4. package/service.tailwind/index.js +103 -0
  5. package/service.ui/index.js +193 -0
  6. package/ui.button/Docs.mdx +16 -0
  7. package/ui.button/composables/attrs.composable.js +41 -0
  8. package/ui.button/configs/default.config.js +165 -0
  9. package/ui.button/constants/index.js +5 -0
  10. package/ui.button/index.stories.js +166 -0
  11. package/ui.button/index.vue +151 -0
  12. package/ui.button-link/Docs.mdx +16 -0
  13. package/ui.button-link/composables/attrs.composable.js +99 -0
  14. package/ui.button-link/configs/default.config.js +80 -0
  15. package/ui.button-link/constants/index.js +5 -0
  16. package/ui.button-link/index.stories.js +158 -0
  17. package/ui.button-link/index.vue +226 -0
  18. package/ui.button-toggle/Docs.mdx +16 -0
  19. package/ui.button-toggle/composables/attrs.composable.js +16 -0
  20. package/ui.button-toggle/configs/default.config.js +12 -0
  21. package/ui.button-toggle/constants/index.js +7 -0
  22. package/ui.button-toggle/index.stories.js +155 -0
  23. package/ui.button-toggle/index.vue +128 -0
  24. package/ui.button-toggle-item/Docs.mdx +16 -0
  25. package/ui.button-toggle-item/composables/attrs.composable.js +53 -0
  26. package/ui.button-toggle-item/configs/default.config.js +58 -0
  27. package/ui.button-toggle-item/constants/index.js +5 -0
  28. package/ui.button-toggle-item/index.stories.js +77 -0
  29. package/ui.button-toggle-item/index.vue +147 -0
  30. package/ui.container-accordion/composables/attrs.composable.js +45 -0
  31. package/ui.container-accordion/configs/default.config.js +32 -0
  32. package/ui.container-accordion/constants/index.js +5 -0
  33. package/ui.container-accordion/index.stories.js +89 -0
  34. package/ui.container-accordion/index.vue +95 -0
  35. package/ui.container-card/Docs.mdx +16 -0
  36. package/ui.container-card/composable/attrs.composable.js +56 -0
  37. package/ui.container-card/configs/default.config.js +31 -0
  38. package/ui.container-card/constants/index.js +5 -0
  39. package/ui.container-card/index.stories.js +170 -0
  40. package/ui.container-card/index.vue +146 -0
  41. package/ui.container-divider/Docs.mdx +16 -0
  42. package/ui.container-divider/composables/attrs.composable.js +65 -0
  43. package/ui.container-divider/configs/default.config.js +79 -0
  44. package/ui.container-divider/constants/index.js +5 -0
  45. package/ui.container-divider/index.stories.js +124 -0
  46. package/ui.container-divider/index.vue +138 -0
  47. package/ui.container-group/Docs.mdx +16 -0
  48. package/ui.container-group/composables/attrs.composable.js +44 -0
  49. package/ui.container-group/configs/default.config.js +29 -0
  50. package/ui.container-group/constants/index.js +5 -0
  51. package/ui.container-group/index.stories.js +88 -0
  52. package/ui.container-group/index.vue +106 -0
  53. package/ui.container-groups/Docs.mdx +16 -0
  54. package/ui.container-groups/composables/attrs.composable.js +12 -0
  55. package/ui.container-groups/configs/default.config.js +3 -0
  56. package/ui.container-groups/index.stories.js +45 -0
  57. package/ui.container-groups/index.vue +33 -0
  58. package/ui.container-modal/Docs.mdx +16 -0
  59. package/ui.container-modal/composables/attrs.composable.js +90 -0
  60. package/ui.container-modal/configs/default.config.js +69 -0
  61. package/ui.container-modal/constants/index.js +5 -0
  62. package/ui.container-modal/index.stories.js +170 -0
  63. package/ui.container-modal/index.vue +336 -0
  64. package/ui.container-modal-confirm/Docs.mdx +16 -0
  65. package/ui.container-modal-confirm/composable/attrs.composable.js +20 -0
  66. package/ui.container-modal-confirm/configs/default.config.js +15 -0
  67. package/ui.container-modal-confirm/constants/index.js +5 -0
  68. package/ui.container-modal-confirm/index.stories.js +209 -0
  69. package/ui.container-modal-confirm/index.vue +182 -0
  70. package/ui.container-page/Docs.mdx +16 -0
  71. package/ui.container-page/composables/attrs.composable.js +96 -0
  72. package/ui.container-page/configs/default.config.js +71 -0
  73. package/ui.container-page/constants/index.js +5 -0
  74. package/ui.container-page/index.stories.js +147 -0
  75. package/ui.container-page/index.vue +275 -0
  76. package/ui.container-row/Docs.mdx +16 -0
  77. package/ui.container-row/composables/attrs.composable.js +23 -0
  78. package/ui.container-row/configs/default.config.js +14 -0
  79. package/ui.container-row/constants/index.js +5 -0
  80. package/ui.container-row/index.stories.js +81 -0
  81. package/ui.container-row/index.vue +45 -0
  82. package/ui.data-list/composables/attrs.composable.js +45 -0
  83. package/ui.data-list/configs/default.config.js +32 -0
  84. package/ui.data-list/constants/index.js +5 -0
  85. package/ui.data-list/index.stories.js +91 -0
  86. package/ui.data-list/index.vue +259 -0
  87. package/ui.data-table/Docs.mdx +16 -0
  88. package/ui.data-table/composables/attrs.composable.js +188 -0
  89. package/ui.data-table/configs/default.config.js +88 -0
  90. package/ui.data-table/constants/index.js +5 -0
  91. package/ui.data-table/index.stories.js +261 -0
  92. package/ui.data-table/index.vue +730 -0
  93. package/ui.data-table/services/table.service.js +15 -0
  94. package/ui.data-table-cell/composables/attrs.composable.js +24 -0
  95. package/ui.data-table-cell/configs/default.config.js +19 -0
  96. package/ui.data-table-cell/constants/index.js +5 -0
  97. package/ui.data-table-cell/index.vue +44 -0
  98. package/ui.dropdown-badge/Docs.mdx +16 -0
  99. package/ui.dropdown-badge/composables/attrs.composable.js +63 -0
  100. package/ui.dropdown-badge/configs/default.config.js +34 -0
  101. package/ui.dropdown-badge/constants/index.js +5 -0
  102. package/ui.dropdown-badge/index.stories.js +126 -0
  103. package/ui.dropdown-badge/index.vue +234 -0
  104. package/ui.dropdown-button/Docs.mdx +16 -0
  105. package/ui.dropdown-button/composables/attrs.composable.js +63 -0
  106. package/ui.dropdown-button/configs/default.config.js +37 -0
  107. package/ui.dropdown-button/constants/index.js +14 -0
  108. package/ui.dropdown-button/index.stories.js +158 -0
  109. package/ui.dropdown-button/index.vue +271 -0
  110. package/ui.dropdown-item/Docs.mdx +16 -0
  111. package/ui.dropdown-item/composables/attrs.composable.js +13 -0
  112. package/ui.dropdown-item/configs/default.config.js +16 -0
  113. package/ui.dropdown-item/index.stories.js +30 -0
  114. package/ui.dropdown-item/index.vue +53 -0
  115. package/ui.dropdown-link/Docs.mdx +16 -0
  116. package/ui.dropdown-link/composables/attrs.composable.js +65 -0
  117. package/ui.dropdown-link/configs/default.config.js +37 -0
  118. package/ui.dropdown-link/constants/index.js +5 -0
  119. package/ui.dropdown-link/index.stories.js +127 -0
  120. package/ui.dropdown-link/index.vue +261 -0
  121. package/ui.dropdown-list/Docs.mdx +16 -0
  122. package/ui.dropdown-list/composables/attrs.composable.js +93 -0
  123. package/ui.dropdown-list/composables/usePointer.js +77 -0
  124. package/ui.dropdown-list/configs/default.config.js +74 -0
  125. package/ui.dropdown-list/constants/index.js +5 -0
  126. package/ui.dropdown-list/index.stories.js +76 -0
  127. package/ui.dropdown-list/index.vue +284 -0
  128. package/ui.form-calendar/Docs.mdx +52 -0
  129. package/ui.form-calendar/components/DayView.vue +268 -0
  130. package/ui.form-calendar/components/MonthView.vue +114 -0
  131. package/ui.form-calendar/components/YearView.vue +118 -0
  132. package/ui.form-calendar/composables/attrs.composable.js +106 -0
  133. package/ui.form-calendar/configs/default.config.js +125 -0
  134. package/ui.form-calendar/constants/index.js +71 -0
  135. package/ui.form-calendar/index.stories.js +59 -0
  136. package/ui.form-calendar/index.vue +743 -0
  137. package/ui.form-calendar/services/calendar.service.js +189 -0
  138. package/ui.form-calendar/services/date.service.js +282 -0
  139. package/ui.form-calendar/services/formatting.service.js +180 -0
  140. package/ui.form-checkbox/Docs.mdx +16 -0
  141. package/ui.form-checkbox/composables/attrs.composable.js +57 -0
  142. package/ui.form-checkbox/configs/default.config.js +69 -0
  143. package/ui.form-checkbox/constants/index.js +5 -0
  144. package/ui.form-checkbox/index.stories.js +147 -0
  145. package/ui.form-checkbox/index.vue +242 -0
  146. package/ui.form-checkbox-group/Docs.mdx +16 -0
  147. package/ui.form-checkbox-group/composables/attrs.composable.js +17 -0
  148. package/ui.form-checkbox-group/configs/default.config.js +5 -0
  149. package/ui.form-checkbox-group/constants/index.js +5 -0
  150. package/ui.form-checkbox-group/index.stories.js +45 -0
  151. package/ui.form-checkbox-group/index.vue +145 -0
  152. package/ui.form-checkbox-multi-state/Docs.mdx +16 -0
  153. package/ui.form-checkbox-multi-state/composables/attrs.composable.js +24 -0
  154. package/ui.form-checkbox-multi-state/configs/default.config.js +9 -0
  155. package/ui.form-checkbox-multi-state/constants/index.js +5 -0
  156. package/ui.form-checkbox-multi-state/index.stories.js +59 -0
  157. package/ui.form-checkbox-multi-state/index.vue +134 -0
  158. package/ui.form-color-picker/composables/attrs.composable.js +44 -0
  159. package/ui.form-color-picker/configs/default.config.js +52 -0
  160. package/ui.form-color-picker/constants/index.js +5 -0
  161. package/ui.form-color-picker/index.stories.js +63 -0
  162. package/ui.form-color-picker/index.vue +171 -0
  163. package/ui.form-date-picker/Docs.mdx +52 -0
  164. package/ui.form-date-picker/composables/attrs.composable.js +22 -0
  165. package/ui.form-date-picker/configs/default.config.js +26 -0
  166. package/ui.form-date-picker/constants/index.js +5 -0
  167. package/ui.form-date-picker/index.stories.js +132 -0
  168. package/ui.form-date-picker/index.vue +256 -0
  169. package/ui.form-date-picker-range/composables/attrs.composable.js +100 -0
  170. package/ui.form-date-picker-range/configs/default.config.js +172 -0
  171. package/ui.form-date-picker-range/constants/index.js +23 -0
  172. package/ui.form-date-picker-range/index.stories.js +135 -0
  173. package/ui.form-date-picker-range/index.vue +937 -0
  174. package/ui.form-date-picker-range/services/dateRange.service.js +116 -0
  175. package/ui.form-date-picker-range/services/validation.service.js +22 -0
  176. package/ui.form-input/Docs.mdx +16 -0
  177. package/ui.form-input/assets/fonts/text-security-disc.woff +0 -0
  178. package/ui.form-input/composables/attrs.composable.js +66 -0
  179. package/ui.form-input/configs/default.config.js +72 -0
  180. package/ui.form-input/constants/index.js +5 -0
  181. package/ui.form-input/index.stories.js +166 -0
  182. package/ui.form-input/index.vue +388 -0
  183. package/ui.form-input-file/composables/attrs.composable.js +82 -0
  184. package/ui.form-input-file/configs/default.config.js +59 -0
  185. package/ui.form-input-file/constants/index.js +5 -0
  186. package/ui.form-input-file/index.stories.js +86 -0
  187. package/ui.form-input-file/index.vue +387 -0
  188. package/ui.form-input-money/Docs.mdx +16 -0
  189. package/ui.form-input-money/composables/attrs.composable.js +13 -0
  190. package/ui.form-input-money/composables/useFormatCurrency.js +82 -0
  191. package/ui.form-input-money/configs/default.config.js +16 -0
  192. package/ui.form-input-money/constants/index.js +5 -0
  193. package/ui.form-input-money/index.stories.js +126 -0
  194. package/ui.form-input-money/index.vue +263 -0
  195. package/ui.form-input-money/services/format.service.js +72 -0
  196. package/ui.form-input-number/Docs.mdx +16 -0
  197. package/ui.form-input-number/composables/attrs.composable.js +47 -0
  198. package/ui.form-input-number/configs/default.config.js +33 -0
  199. package/ui.form-input-number/constants/index.js +5 -0
  200. package/ui.form-input-number/index.stories.js +103 -0
  201. package/ui.form-input-number/index.vue +162 -0
  202. package/ui.form-input-rating/composables/attrs.composable.js +34 -0
  203. package/ui.form-input-rating/configs/default.config.js +25 -0
  204. package/ui.form-input-rating/constants/index.js +5 -0
  205. package/ui.form-input-rating/index.stories.js +108 -0
  206. package/ui.form-input-rating/index.vue +186 -0
  207. package/ui.form-input-search/composables/attrs.composable.js +21 -0
  208. package/ui.form-input-search/configs/default.config.js +20 -0
  209. package/ui.form-input-search/constants/index.js +5 -0
  210. package/ui.form-input-search/index.stories.js +90 -0
  211. package/ui.form-input-search/index.vue +215 -0
  212. package/ui.form-label/Docs.mdx +16 -0
  213. package/ui.form-label/composables/attrs.composable.js +65 -0
  214. package/ui.form-label/configs/default.config.js +95 -0
  215. package/ui.form-label/constants/index.js +13 -0
  216. package/ui.form-label/index.stories.js +107 -0
  217. package/ui.form-label/index.vue +170 -0
  218. package/ui.form-radio/Docs.mdx +16 -0
  219. package/ui.form-radio/composables/attrs.composable.js +34 -0
  220. package/ui.form-radio/configs/default.config.js +47 -0
  221. package/ui.form-radio/constants/index.js +5 -0
  222. package/ui.form-radio/index.stories.js +71 -0
  223. package/ui.form-radio/index.vue +170 -0
  224. package/ui.form-radio-card/Docs.mdx +16 -0
  225. package/ui.form-radio-card/composables/attrs.composable.js +35 -0
  226. package/ui.form-radio-card/configs/default.config.js +25 -0
  227. package/ui.form-radio-card/constants/index.js +5 -0
  228. package/ui.form-radio-card/index.stories.js +149 -0
  229. package/ui.form-radio-card/index.vue +160 -0
  230. package/ui.form-radio-card/services/variant.service.js +15 -0
  231. package/ui.form-radio-group/Docs.mdx +16 -0
  232. package/ui.form-radio-group/composables/attrs.composable.js +27 -0
  233. package/ui.form-radio-group/configs/default.config.js +18 -0
  234. package/ui.form-radio-group/constants/index.js +5 -0
  235. package/ui.form-radio-group/index.stories.js +42 -0
  236. package/ui.form-radio-group/index.vue +128 -0
  237. package/ui.form-select/Docs.mdx +16 -0
  238. package/ui.form-select/composables/attrs.composable.js +172 -0
  239. package/ui.form-select/configs/default.config.js +138 -0
  240. package/ui.form-select/constants/index.js +19 -0
  241. package/ui.form-select/index.stories.js +339 -0
  242. package/ui.form-select/index.vue +722 -0
  243. package/ui.form-select/services/select.service.js +98 -0
  244. package/ui.form-switch/composables/attrs.composable.js +77 -0
  245. package/ui.form-switch/configs/default.config.js +76 -0
  246. package/ui.form-switch/constants/index.js +5 -0
  247. package/ui.form-switch/index.stories.js +93 -0
  248. package/ui.form-switch/index.vue +199 -0
  249. package/ui.form-switch/services/variant.service.js +31 -0
  250. package/ui.form-textarea/Docs.mdx +16 -0
  251. package/ui.form-textarea/composables/attrs.composable.js +52 -0
  252. package/ui.form-textarea/configs/default.config.js +68 -0
  253. package/ui.form-textarea/constants/index.js +5 -0
  254. package/ui.form-textarea/index.stories.js +151 -0
  255. package/ui.form-textarea/index.vue +284 -0
  256. package/ui.image-avatar/composables/attrs.composable.js +34 -0
  257. package/ui.image-avatar/configs/default.config.js +42 -0
  258. package/ui.image-avatar/constants/index.js +5 -0
  259. package/ui.image-avatar/default-avatar.png +0 -0
  260. package/ui.image-avatar/index.stories.js +107 -0
  261. package/ui.image-avatar/index.vue +121 -0
  262. package/ui.image-icon/Docs.mdx +16 -0
  263. package/ui.image-icon/composables/attrs.composable.js +65 -0
  264. package/ui.image-icon/configs/default.config.js +90 -0
  265. package/ui.image-icon/constants/index.js +5 -0
  266. package/ui.image-icon/index.stories.js +110 -0
  267. package/ui.image-icon/index.vue +233 -0
  268. package/ui.image-logo/composables/attrs.composable.js +41 -0
  269. package/ui.image-logo/configs/default.config.js +38 -0
  270. package/ui.image-logo/constants/index.js +5 -0
  271. package/ui.image-logo/index.stories.js +84 -0
  272. package/ui.image-logo/index.vue +98 -0
  273. package/ui.loader-rendering/index.vue +72 -0
  274. package/ui.loader-rendering/store/index.js +17 -0
  275. package/ui.loader-top/components/TopProgress.vue +277 -0
  276. package/ui.loader-top/index.vue +221 -0
  277. package/ui.loader-top/store/index.js +59 -0
  278. package/ui.navigation-pagination/composables/attrs.composable.js +41 -0
  279. package/ui.navigation-pagination/configs/default.config.js +24 -0
  280. package/ui.navigation-pagination/constants/index.js +8 -0
  281. package/ui.navigation-pagination/index.stories.js +52 -0
  282. package/ui.navigation-pagination/index.vue +276 -0
  283. package/ui.navigation-stepper/composables/attrs.composable.js +25 -0
  284. package/ui.navigation-stepper/configs/default.config.js +13 -0
  285. package/ui.navigation-stepper/constants/index.js +5 -0
  286. package/ui.navigation-stepper/index.stories.js +30 -0
  287. package/ui.navigation-stepper/index.vue +126 -0
  288. package/ui.navigation-tab/composables/attrs.composable.js +30 -0
  289. package/ui.navigation-tab/configs/default.config.js +22 -0
  290. package/ui.navigation-tab/constants/index.js +5 -0
  291. package/ui.navigation-tab/index.stories.js +57 -0
  292. package/ui.navigation-tab/index.vue +85 -0
  293. package/ui.navigation-tabs/composables/attrs.composable.js +24 -0
  294. package/ui.navigation-tabs/configs/default.config.js +14 -0
  295. package/ui.navigation-tabs/constants/index.js +5 -0
  296. package/ui.navigation-tabs/index.stories.js +69 -0
  297. package/ui.navigation-tabs/index.vue +99 -0
  298. package/ui.notify/index.sto_ries.js +102 -0
  299. package/ui.notify/index.vue +248 -0
  300. package/ui.notify/services/index.js +87 -0
  301. package/ui.other-dot/composables/attrs.composable.js +32 -0
  302. package/ui.other-dot/configs/default.config.js +21 -0
  303. package/ui.other-dot/constants/index.js +5 -0
  304. package/ui.other-dot/index.stories.js +77 -0
  305. package/ui.other-dot/index.vue +52 -0
  306. package/ui.other-loader/composables/attrs.composable.js +51 -0
  307. package/ui.other-loader/configs/default.config.js +47 -0
  308. package/ui.other-loader/constants/index.js +5 -0
  309. package/ui.other-loader/index.stories.js +78 -0
  310. package/ui.other-loader/index.vue +136 -0
  311. package/ui.text-alert/composables/attrs.composable.js +48 -0
  312. package/ui.text-alert/configs/default.config.js +51 -0
  313. package/ui.text-alert/constatns/index.js +5 -0
  314. package/ui.text-alert/index.stories.js +157 -0
  315. package/ui.text-alert/index.vue +122 -0
  316. package/ui.text-badge/Docs.mdx +16 -0
  317. package/ui.text-badge/composables/attrs.composable.js +49 -0
  318. package/ui.text-badge/configs/default.config.js +51 -0
  319. package/ui.text-badge/constants/index.js +5 -0
  320. package/ui.text-badge/index.stories.js +190 -0
  321. package/ui.text-badge/index.vue +120 -0
  322. package/ui.text-block/composables/attrs.composable.js +31 -0
  323. package/ui.text-block/configs/default.config.js +35 -0
  324. package/ui.text-block/constatns/index.js +5 -0
  325. package/ui.text-block/index.stories.js +112 -0
  326. package/ui.text-block/index.vue +76 -0
  327. package/ui.text-empty/Docs.mdx +16 -0
  328. package/ui.text-empty/composables/attrs.composable.js +43 -0
  329. package/ui.text-empty/configs/default.config.js +30 -0
  330. package/ui.text-empty/constants/index.js +5 -0
  331. package/ui.text-empty/index.stories.js +106 -0
  332. package/ui.text-empty/index.vue +95 -0
  333. package/ui.text-file/composables/attrs.composable.js +37 -0
  334. package/ui.text-file/configs/default.config.js +15 -0
  335. package/ui.text-file/index.stories.js +29 -0
  336. package/ui.text-file/index.vue +93 -0
  337. package/ui.text-files/composables/attrs.composable.js +19 -0
  338. package/ui.text-files/configs/default.config.js +9 -0
  339. package/ui.text-files/constants/index.js +5 -0
  340. package/ui.text-files/index.stories.js +32 -0
  341. package/ui.text-files/index.vue +87 -0
  342. package/ui.text-header/Docs.mdx +16 -0
  343. package/ui.text-header/composables/attrs.composable.js +34 -0
  344. package/ui.text-header/configs/default.config.js +45 -0
  345. package/ui.text-header/constants/index.js +5 -0
  346. package/ui.text-header/index.stories.js +106 -0
  347. package/ui.text-header/index.vue +83 -0
  348. package/ui.text-money/Docs.mdx +16 -0
  349. package/ui.text-money/assets/credit.svg +7 -0
  350. package/ui.text-money/assets/debit.svg +12 -0
  351. package/ui.text-money/composables/attrs.composable.js +65 -0
  352. package/ui.text-money/configs/default.config.js +69 -0
  353. package/ui.text-money/constants/index.js +7 -0
  354. package/ui.text-money/index.stories.js +265 -0
  355. package/ui.text-money/index.vue +204 -0
  356. package/ui.text-money/services/money.services.js +24 -0
  357. package/ui.viewport/index.vue +78 -0
  358. package/ui.viewport/store/index.js +47 -0
  359. package/web-types.json +7187 -0
@@ -0,0 +1,395 @@
1
+ import {
2
+ ref,
3
+ watchEffect,
4
+ getCurrentInstance,
5
+ toValue,
6
+ useAttrs,
7
+ Comment,
8
+ Text,
9
+ Fragment,
10
+ } from "vue";
11
+ import { cx, globalComponentConfig, strategy } from "../service.ui";
12
+
13
+ const strategyType = {
14
+ merge: "merge",
15
+ replace: "replace",
16
+ overwrite: "overwrite",
17
+ };
18
+
19
+ /**
20
+ Merging component configs in a given sequence (bigger number = bigger priority):
21
+ 1. Default component config
22
+ 2. Custom global component config (/vueless.config.js)
23
+ 3. Component config (:config="{...}" props)
24
+ 4. Component classes (class="...")
25
+ */
26
+ export default function useUI(defaultConfig = {}, propsConfigGetter = null, topLevelClassKey) {
27
+ const { name: componentName } = getCurrentInstance().type;
28
+ const globalConfig = globalComponentConfig[componentName];
29
+
30
+ const isStrategyValid = strategy && Object.values(strategyType).includes(strategy);
31
+ const vuelessStrategy = isStrategyValid ? strategy : strategyType.merge;
32
+
33
+ const [firstClassKey] = Object.keys(defaultConfig);
34
+ const config = ref({});
35
+ const attrs = useAttrs();
36
+
37
+ watchEffect(() => {
38
+ const propsConfig = propsConfigGetter && propsConfigGetter();
39
+
40
+ const mergedConfig = getMergedConfig({
41
+ defaultConfig,
42
+ globalConfig,
43
+ propsConfig,
44
+ vuelessStrategy,
45
+ });
46
+
47
+ config.value = mergeClassesIntoConfig(mergedConfig, topLevelClassKey || firstClassKey, attrs);
48
+ });
49
+
50
+ function getAttrs(configKey, options) {
51
+ const cvaClasses = options?.classes || "";
52
+ const isComponent = options?.isComponent;
53
+
54
+ const attrs = useAttrs();
55
+ const isDev = import.meta.env.DEV;
56
+ const vuelessAttrs = ref({});
57
+
58
+ const commonAttrs = {
59
+ ...attrs,
60
+ component: isDev && (attrs.component || componentName || null),
61
+ "config-key": isDev && (attrs["config-key"] || configKey || null),
62
+ "child-component": isDev && attrs.component ? componentName : null,
63
+ "child-config-key": isDev && attrs.component ? configKey : null,
64
+ };
65
+
66
+ // Delete value key to prevent v-model overwrite
67
+ delete commonAttrs.value;
68
+
69
+ watchEffect(() => {
70
+ const configKeyValue = config.value[configKey];
71
+ const isObject = typeof configKeyValue === "object";
72
+
73
+ const configAttrs = {
74
+ config: configKeyValue,
75
+ ...configKeyValue?.defaultVariants,
76
+ };
77
+
78
+ const isTopLevelClassKey = configKey === (topLevelClassKey || firstClassKey);
79
+
80
+ const attrClass = isTopLevelClassKey && !isComponent ? attrs.class : "";
81
+ const configKeyClass = isObject ? configKeyValue.base : configKeyValue;
82
+
83
+ vuelessAttrs.value = {
84
+ ...commonAttrs,
85
+ class: cx([configKeyClass, toValue(cvaClasses), attrClass]),
86
+ ...((isObject && configAttrs) || {}),
87
+ };
88
+ });
89
+
90
+ return vuelessAttrs;
91
+ }
92
+
93
+ return {
94
+ config,
95
+ getAttrs,
96
+ setColor,
97
+ hasSlotContent,
98
+ };
99
+ }
100
+
101
+ /**
102
+ Get merged config based on config merging strategy.
103
+ @param {Object} defaultConfig
104
+ @param {Object} globalConfig
105
+ @param {Object} propsConfig
106
+ @param {string} vuelessStrategy - vueless top level merge strategy.
107
+
108
+ @returns {Object}
109
+ */
110
+ function getMergedConfig({ defaultConfig, globalConfig, propsConfig, vuelessStrategy }) {
111
+ defaultConfig = cloneDeep(defaultConfig);
112
+
113
+ const strategy =
114
+ !globalConfig && !propsConfig
115
+ ? strategyType.merge
116
+ : propsConfig?.strategy || globalConfig?.strategy || vuelessStrategy;
117
+
118
+ if (strategy === strategyType.merge) {
119
+ return mergeConfigs({ defaultConfig, globalConfig, propsConfig });
120
+ }
121
+
122
+ if (strategy === strategyType.replace) {
123
+ return mergeConfigs({ defaultConfig, globalConfig, propsConfig, isReplace: true });
124
+ }
125
+
126
+ if (strategy === strategyType.overwrite) {
127
+ const isGlobalConfig = globalConfig && Object.keys(globalConfig).length;
128
+ const isPropsConfig = propsConfig && Object.keys(propsConfig).length;
129
+
130
+ return isPropsConfig ? propsConfig : isGlobalConfig ? globalConfig : defaultConfig;
131
+ }
132
+ }
133
+
134
+ /**
135
+ Recursively merge config objects with removing tailwind classes duplicates.
136
+ @param {Object} defaultConfig
137
+ @param {Object} globalConfig
138
+ @param {Object} propsConfig
139
+ @param {Object} config - final merged config.
140
+ @param {boolean} isReplace - enables class replacement instead of merge.
141
+
142
+ @returns {Object}
143
+ */
144
+ function mergeConfigs({
145
+ defaultConfig,
146
+ globalConfig,
147
+ propsConfig,
148
+ config = {},
149
+ isReplace = false,
150
+ }) {
151
+ globalConfig = globalConfig || {};
152
+ propsConfig = propsConfig || {};
153
+
154
+ const isGlobalConfig = Object.keys(globalConfig).length;
155
+ const isPropsConfig = Object.keys(propsConfig).length;
156
+
157
+ // Add unique keys from defaultConfig to composedConfig
158
+ let composedConfig = cloneDeep(defaultConfig);
159
+
160
+ // Add unique keys from globalConfig to composedConfig
161
+ for (let key in globalConfig) {
162
+ if (!Object.keys(composedConfig).includes(key)) {
163
+ composedConfig[key] = globalConfig[key];
164
+ }
165
+ }
166
+
167
+ // Add unique keys from propsConfig to composedConfig
168
+ for (let key in propsConfig) {
169
+ if (!Object.keys(composedConfig).includes(key)) {
170
+ composedConfig[key] = propsConfig[key];
171
+ }
172
+ }
173
+
174
+ for (let key in composedConfig) {
175
+ if (isGlobalConfig || isPropsConfig) {
176
+ if (key === "strategy") {
177
+ config[key] = propsConfig[key] || globalConfig[key] || defaultConfig[key];
178
+ } else if (key === "defaultVariants") {
179
+ config[key] = { ...defaultConfig[key], ...globalConfig[key], ...propsConfig[key] };
180
+ } else if (key === "compoundVariants") {
181
+ config[key] = mergeCompoundVariants({
182
+ defaultConfig: composedConfig,
183
+ globalConfig,
184
+ propsConfig,
185
+ isReplace,
186
+ key,
187
+ });
188
+ } else {
189
+ const isObjectComposedConfig = typeof composedConfig[key] === "object";
190
+ const isObjectGlobalConfig = typeof globalConfig[key] === "object";
191
+ const isObjectPropsConfig = typeof propsConfig[key] === "object";
192
+
193
+ const isObject = isObjectComposedConfig || isObjectGlobalConfig || isObjectPropsConfig;
194
+ const isEmpty = composedConfig[key] === null;
195
+ const isIconName = /^.*(iconName|IconName)$/.test(key);
196
+ const isI18n = key === "i18n";
197
+
198
+ config[key] =
199
+ isObject && !isEmpty && !isI18n
200
+ ? mergeConfigs({
201
+ defaultConfig: stringToObject(composedConfig[key]),
202
+ globalConfig: stringToObject(globalConfig[key]),
203
+ propsConfig: stringToObject(propsConfig[key]),
204
+ config: stringToObject(composedConfig[key]),
205
+ isReplace,
206
+ })
207
+ : isReplace || isIconName || isI18n
208
+ ? propsConfig[key] || globalConfig[key] || defaultConfig[key]
209
+ : cx([defaultConfig[key], globalConfig[key], propsConfig[key]]);
210
+ }
211
+ } else {
212
+ config[key] = composedConfig[key];
213
+ }
214
+ }
215
+
216
+ return config;
217
+ }
218
+
219
+ /**
220
+ Turn simplified nested component config to regular config.
221
+ @param {Object | String} value
222
+ @returns {Object}
223
+ */
224
+ function stringToObject(value) {
225
+ return typeof value === "object" ? value : { base: value };
226
+ }
227
+
228
+ /**
229
+ Merge CVA compound variants arrays.
230
+ @param {Object} defaultConfig
231
+ @param {Object} globalConfig
232
+ @param {Object} propsConfig
233
+ @param {string} key
234
+ @param {boolean} isReplace - enables class replacement instead of merge.
235
+
236
+ @returns {Array}
237
+ */
238
+ function mergeCompoundVariants({ defaultConfig, globalConfig, propsConfig, key, isReplace }) {
239
+ if (
240
+ (globalConfig[key] && !Array.isArray(globalConfig[key])) ||
241
+ (propsConfig[key] && !Array.isArray(propsConfig[key])) ||
242
+ (defaultConfig[key] && !Array.isArray(defaultConfig[key]))
243
+ ) {
244
+ // eslint-disable-next-line no-console
245
+ console.error("CompoundVariants should be an array.");
246
+ }
247
+
248
+ let globalConfigUniqueItems = cloneDeep(globalConfig[key] || []);
249
+ let propsConfigUniqueItems = cloneDeep(propsConfig[key] || []);
250
+
251
+ const config = defaultConfig[key].map((defaultConfigItem) => {
252
+ /**
253
+ Compare two objects by keys for match.
254
+ @param {Object} configItem
255
+ @returns {Boolean}
256
+ */
257
+ function isSameItem(configItem) {
258
+ const hasConfigItemKeys = Object.keys(defaultConfigItem)
259
+ .map((key) => defaultConfigItem[key] === configItem[key] || key === "class")
260
+ .every((item) => !!item);
261
+
262
+ const hasDefaultConfigItemKeys = Object.keys(configItem)
263
+ .map((key) => defaultConfigItem[key] === configItem[key] || key === "class")
264
+ .every((item) => !!item);
265
+
266
+ return hasConfigItemKeys && hasDefaultConfigItemKeys;
267
+ }
268
+
269
+ /**
270
+ Find the same compound variant item in custom config if exist.
271
+ @param {Object} config
272
+ @returns {Object|undefined}
273
+ */
274
+ function findItem(config = []) {
275
+ const globalConfigUniqueItemIndex = globalConfigUniqueItems.findIndex(isSameItem);
276
+ const propsConfigUniqueItemIndex = propsConfigUniqueItems.findIndex(isSameItem);
277
+
278
+ if (~globalConfigUniqueItemIndex) {
279
+ globalConfigUniqueItems.splice(globalConfigUniqueItemIndex, 1);
280
+ }
281
+
282
+ if (~propsConfigUniqueItemIndex) {
283
+ propsConfigUniqueItems.splice(propsConfigUniqueItemIndex, 1);
284
+ }
285
+
286
+ return config.find(isSameItem);
287
+ }
288
+
289
+ const globalConfigItem = findItem(globalConfig[key]);
290
+ const propsConfigItem = findItem(propsConfig[key]);
291
+
292
+ return globalConfigItem || propsConfigItem
293
+ ? {
294
+ ...defaultConfigItem,
295
+ class: isReplace
296
+ ? propsConfigItem?.class || globalConfigItem?.class || defaultConfigItem.class
297
+ : cx([defaultConfigItem.class, globalConfigItem?.class, propsConfigItem?.class]),
298
+ }
299
+ : defaultConfigItem;
300
+ });
301
+
302
+ return [...config, ...globalConfigUniqueItems, ...propsConfigUniqueItems];
303
+ }
304
+
305
+ /**
306
+ Merge component classes from "class" attribute into final config.
307
+ @param {Object} config
308
+ @param {Object} attrs
309
+ @param {string} topLevelClassKey
310
+
311
+ @returns {Object}
312
+ */
313
+ function mergeClassesIntoConfig(config, topLevelClassKey, attrs) {
314
+ if (typeof config[topLevelClassKey] === "object") {
315
+ config[topLevelClassKey].base = cx([config[topLevelClassKey]?.base, attrs.class]);
316
+ } else {
317
+ config[topLevelClassKey] = cx([config[topLevelClassKey], attrs.class]);
318
+ }
319
+
320
+ return config;
321
+ }
322
+
323
+ /**
324
+ Check if slot defined, and have a content.
325
+ @param slot
326
+ @param props
327
+
328
+ @returns {boolean}
329
+ */
330
+ function hasSlotContent(slot, props = {}) {
331
+ const asArray = (arg) => (Array.isArray(arg) ? arg : arg != null ? [arg] : []);
332
+
333
+ const isVNodeEmpty = (vnode) => {
334
+ return (
335
+ !vnode ||
336
+ asArray(vnode).every(
337
+ (vnode) =>
338
+ vnode.type === Comment ||
339
+ (vnode.type === Text && !vnode.children?.length) ||
340
+ (vnode.type === Fragment && !vnode.children?.length),
341
+ )
342
+ );
343
+ };
344
+
345
+ return !isVNodeEmpty(slot?.(props));
346
+ }
347
+
348
+ /**
349
+ Deeply clone given object (same as lodash.cloneDeep).
350
+ @param {Object} entity
351
+ @param cache
352
+
353
+ @returns {Object}
354
+ */
355
+ function cloneDeep(entity, cache = new WeakMap()) {
356
+ const referenceTypes = ["Array", "Object", "Map", "Set", "Date"];
357
+ const entityType = Object.prototype.toString.call(entity);
358
+
359
+ if (
360
+ !new RegExp(referenceTypes.join("|")).test(entityType) ||
361
+ entity instanceof WeakMap ||
362
+ entity instanceof WeakSet
363
+ ) {
364
+ return entity;
365
+ }
366
+
367
+ if (cache.has(entity)) {
368
+ return cache.get(entity);
369
+ }
370
+
371
+ const c = new entity.constructor();
372
+
373
+ if (entity instanceof Map) {
374
+ entity.forEach((value, key) => c.set(cloneDeep(key), cloneDeep(value)));
375
+ }
376
+
377
+ if (entity instanceof Set) {
378
+ entity.forEach((value) => c.add(cloneDeep(value)));
379
+ }
380
+
381
+ if (entity instanceof Date) {
382
+ return new Date(entity);
383
+ }
384
+
385
+ cache.set(entity, c);
386
+
387
+ return Object.assign(
388
+ c,
389
+ ...Object.keys(entity).map((prop) => ({ [prop]: cloneDeep(entity[prop], cache) })),
390
+ );
391
+ }
392
+
393
+ function setColor(classes, color) {
394
+ return classes?.replaceAll("{color}", color);
395
+ }
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless Component Framework.",
6
6
  "homepage": "https://vueless.com",
7
7
  "author": "Johnny Grid",
8
8
  "main": "index.js",
9
9
  "type": "module",
10
- "files": ["src"],
11
10
  "scripts": {
12
11
  "lint": "eslint --ext .vue,.js,.ts --no-fix --ignore-path .eslintignore src/ .storybook/ tests/",
13
12
  "lint:fix": "eslint --ext .vue,.js,.ts --fix --ignore-path .eslintignore src/ .storybook/ tests/",
@@ -20,6 +19,7 @@
20
19
  "sb:build": "STORYBOOK_VUELESS_ENV=1 storybook build",
21
20
  "sb:preview": "vite preview --host --outDir=storybook-static",
22
21
  "vueless:update": "yarn add -D file:../vite-plugin-vueless file:../vueless-storybook",
22
+ "vueless:publish": "rm -rf dist && mkdir -p dist && cp -r src/* package.json LICENSE web-types.json README.md dist/ && npm publish ./dist",
23
23
  "postinstall": "node .web-types-gen"
24
24
  },
25
25
  "dependencies": {
@@ -0,0 +1,91 @@
1
+ import { contributions } from "/web-types.json";
2
+
3
+ const getComponentData = (componentName) => {
4
+ return contributions.html.tags.find((item) => item.name === componentName);
5
+ };
6
+
7
+ export function getSlotNames(componentName) {
8
+ return getComponentData(componentName)?.slots?.map((item) => item.name);
9
+ }
10
+
11
+ export function getArgTypes(componentName) {
12
+ const component = getComponentData(componentName);
13
+
14
+ if (!component) return;
15
+
16
+ const types = {};
17
+
18
+ getSlotNames(componentName)?.forEach((slotName) => {
19
+ types[slotName] = { control: "text" };
20
+ });
21
+
22
+ component.attributes?.forEach((attribute) => {
23
+ const type = attribute.value.type;
24
+
25
+ if (type === "string") {
26
+ types[attribute.name] = {
27
+ control: "text",
28
+ table: {
29
+ defaultValue: { summary: attribute.default || "" },
30
+ },
31
+ };
32
+ }
33
+
34
+ if (type === "number") {
35
+ types[attribute.name] = {
36
+ control: "number",
37
+ table: {
38
+ defaultValue: { summary: attribute.default || "" },
39
+ },
40
+ };
41
+ }
42
+
43
+ if (type === "boolean") {
44
+ types[attribute.name] = {
45
+ control: "boolean",
46
+ table: {
47
+ defaultValue: { summary: attribute.default || "" },
48
+ },
49
+ };
50
+ }
51
+
52
+ if (type.includes("|")) {
53
+ const options = attribute.value.type.replace(/['|]/g, "").split(/\s+/);
54
+
55
+ if (options.length > 1) {
56
+ types[attribute.name] = {
57
+ options,
58
+ control: "select",
59
+ table: {
60
+ defaultValue: { summary: attribute.default || "" },
61
+ },
62
+ };
63
+ }
64
+ }
65
+
66
+ if (attribute.description?.includes("@ignore")) {
67
+ types[attribute.name] = {
68
+ table: {
69
+ disable: true,
70
+ },
71
+ };
72
+ }
73
+ });
74
+
75
+ if (import.meta.env.STORYBOOK_FULL) {
76
+ component.events?.forEach((event) => {
77
+ const eventName = "on" + event.name.charAt(0).toUpperCase() + event.name.slice(1);
78
+
79
+ types[eventName] = {
80
+ action: event.name,
81
+ table: { category: "Storybook Events" },
82
+ };
83
+ });
84
+ }
85
+
86
+ return types;
87
+ }
88
+
89
+ export function getSource(defaultCnfig) {
90
+ return defaultCnfig.replace("export default /*tw*/ ", "").replace(";", "");
91
+ }
@@ -0,0 +1,103 @@
1
+ import colors from "tailwindcss/colors.js";
2
+ import forms from "@tailwindcss/forms";
3
+ import vuelessConfig from "../../vueless.config.js";
4
+
5
+ export const grayColors = ["slate", "gray", "zinc", "neutral", "stone"];
6
+ export const brandColors = [
7
+ "brand",
8
+ "red",
9
+ "orange",
10
+ "amber",
11
+ "yellow",
12
+ "lime",
13
+ "green",
14
+ "emerald",
15
+ "teal",
16
+ "cyan",
17
+ "sky",
18
+ "blue",
19
+ "indigo",
20
+ "violet",
21
+ "purple",
22
+ "fuchsia",
23
+ "pink",
24
+ "rose",
25
+ ];
26
+
27
+ export default class TailwindServiceDefault {
28
+ constructor() {
29
+ this.vuelessPreset = this.get();
30
+ }
31
+
32
+ /**
33
+ * Transform CSS variable with RGB numbers into CSS color.
34
+ * @returns {Function}
35
+ */
36
+ static twColorWithOpacity(variableName) {
37
+ return ({ opacityValue }) => {
38
+ return opacityValue !== undefined
39
+ ? `rgba(var(${variableName}), ${opacityValue})`
40
+ : `rgb(var(${variableName}))`;
41
+ };
42
+ }
43
+
44
+ /**
45
+ * Convert sting patterns to RegExp.
46
+ * @returns {Array} - TailwindCSS safelist.
47
+ */
48
+ static getSafelist() {
49
+ return JSON.parse(process.env.SAFELIST_JSON || "[]").map((rule) => ({
50
+ ...rule,
51
+ pattern: new RegExp(rule.pattern),
52
+ }));
53
+ }
54
+
55
+ /**
56
+ * Generates preset for TailwindCSS base on Vueless config.
57
+ * @returns {Object}
58
+ */
59
+ get() {
60
+ const isProd = process.env.NODE_ENV === "production";
61
+ const brandColor = TailwindServiceDefault.twColorWithOpacity("--color-brand");
62
+ const { brand, gray } = vuelessConfig;
63
+
64
+ let brandPalette = brandColors.includes(brand) ? colors[brand] : colors.green;
65
+ let grayPalette = grayColors.includes(gray) ? colors[gray] : colors.zinc;
66
+
67
+ if (brand === "grayscale") {
68
+ brandPalette = grayPalette;
69
+ }
70
+
71
+ const prodSafelist = TailwindServiceDefault.getSafelist();
72
+ const devSafelist = [
73
+ {
74
+ pattern: /(border|bg|text|ring)-(.*)-((50|[1-9]00|950)?)$/,
75
+ variants: ["hover", "focus", "focus-within", "active"],
76
+ },
77
+ ];
78
+
79
+ return {
80
+ content: [
81
+ "./index.html",
82
+ "./src/**/*.{js,ts,jsx,tsx,vue}",
83
+ "./vueless.config.{js,ts}",
84
+ "./node_modules/vueless/**/*.{js,ts,vue}",
85
+ ],
86
+ safelist: isProd ? prodSafelist : devSafelist,
87
+ theme: {
88
+ extend: {
89
+ colors: {
90
+ brand: { ...brandPalette, DEFAULT: brandColor },
91
+ gray: grayPalette,
92
+ },
93
+ fontSize: {
94
+ "2xs": ["0.625rem", "0.875rem"], // 10px
95
+ },
96
+ },
97
+ },
98
+ plugins: [forms],
99
+ };
100
+ }
101
+ }
102
+
103
+ export const { vuelessPreset } = new TailwindServiceDefault();