vueless 0.0.479 → 0.0.481

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 (298) hide show
  1. package/README.md +3 -3
  2. package/adatper.locale/vue-i18n.ts +14 -0
  3. package/adatper.locale/{vueless.js → vueless.ts} +67 -19
  4. package/composables/useAutoPosition.ts +113 -0
  5. package/composables/useBreakpoint.ts +109 -0
  6. package/composables/useLocale.ts +22 -0
  7. package/composables/useMutationObserver.ts +53 -0
  8. package/composables/{useUI.js → useUI.ts} +109 -105
  9. package/constants.js +124 -2
  10. package/directives/clickOutside/storybook/Docs.mdx +1 -1
  11. package/directives/clickOutside/storybook/{stories.js → stories.ts} +7 -9
  12. package/directives/clickOutside/types.ts +22 -0
  13. package/directives/clickOutside/vClickOutside.ts +96 -0
  14. package/directives/index.js +7 -2
  15. package/directives/tooltip/storybook/Docs.mdx +1 -1
  16. package/directives/tooltip/storybook/{stories.js → stories.ts} +22 -10
  17. package/directives/tooltip/types.ts +14 -0
  18. package/directives/tooltip/vTooltip.ts +82 -0
  19. package/{index.js → index.ts} +12 -9
  20. package/package.json +38 -25
  21. package/plugin-vite.d.ts +10 -0
  22. package/plugin-vite.js +97 -0
  23. package/{preset.tailwind.js → preset-tailwind.js} +21 -7
  24. package/types.ts +322 -0
  25. package/ui.button/UButton.vue +1 -1
  26. package/ui.button/storybook/Docs.mdx +1 -1
  27. package/ui.button/storybook/stories.js +11 -6
  28. package/ui.button/useAttrs.js +1 -1
  29. package/ui.button-link/ULink.vue +2 -2
  30. package/ui.button-link/storybook/Docs.mdx +1 -1
  31. package/ui.button-link/storybook/stories.js +2 -2
  32. package/ui.button-link/useAttrs.js +1 -1
  33. package/ui.button-toggle/UToggle.vue +1 -1
  34. package/ui.button-toggle/storybook/Docs.mdx +1 -1
  35. package/ui.button-toggle/storybook/stories.js +2 -2
  36. package/ui.button-toggle/useAttrs.js +1 -1
  37. package/ui.button-toggle-item/UToggleItem.vue +1 -1
  38. package/ui.button-toggle-item/storybook/Docs.mdx +1 -1
  39. package/ui.button-toggle-item/storybook/stories.js +1 -1
  40. package/ui.button-toggle-item/useAttrs.js +1 -1
  41. package/ui.container-accordion/UAccordion.vue +1 -1
  42. package/ui.container-accordion/storybook/Docs.mdx +1 -1
  43. package/ui.container-accordion/storybook/stories.js +1 -1
  44. package/ui.container-accordion/useAttrs.js +1 -1
  45. package/ui.container-card/storybook/Docs.mdx +1 -1
  46. package/ui.container-card/storybook/stories.js +1 -1
  47. package/ui.container-card/useAttrs.js +1 -1
  48. package/ui.container-col/UCol.vue +1 -1
  49. package/ui.container-col/storybook/Docs.mdx +1 -1
  50. package/ui.container-col/storybook/stories.js +1 -1
  51. package/ui.container-col/useAttrs.js +1 -1
  52. package/ui.container-divider/UDivider.vue +1 -1
  53. package/ui.container-divider/storybook/Docs.mdx +1 -1
  54. package/ui.container-divider/storybook/stories.js +2 -2
  55. package/ui.container-divider/useAttrs.js +1 -1
  56. package/ui.container-group/UGroup.vue +1 -1
  57. package/ui.container-group/storybook/Docs.mdx +1 -1
  58. package/ui.container-group/storybook/stories.js +1 -1
  59. package/ui.container-group/useAttrs.js +1 -1
  60. package/ui.container-modal/UModal.vue +1 -1
  61. package/ui.container-modal/storybook/Docs.mdx +1 -1
  62. package/ui.container-modal/storybook/stories.js +2 -2
  63. package/ui.container-modal/useAttrs.js +1 -1
  64. package/ui.container-modal-confirm/UModalConfirm.vue +2 -2
  65. package/ui.container-modal-confirm/storybook/Docs.mdx +1 -1
  66. package/ui.container-modal-confirm/storybook/stories.js +2 -2
  67. package/ui.container-modal-confirm/useAttrs.js +1 -1
  68. package/ui.container-page/UPage.vue +2 -2
  69. package/ui.container-page/storybook/Docs.mdx +1 -1
  70. package/ui.container-page/storybook/stories.js +1 -1
  71. package/ui.container-page/useAttrs.js +2 -2
  72. package/ui.container-row/URow.vue +1 -1
  73. package/ui.container-row/storybook/Docs.mdx +1 -1
  74. package/ui.container-row/storybook/stories.js +2 -2
  75. package/ui.container-row/useAttrs.js +1 -1
  76. package/ui.data-list/UDataList.vue +6 -6
  77. package/ui.data-list/storybook/Docs.mdx +1 -1
  78. package/ui.data-list/storybook/stories.js +1 -1
  79. package/ui.data-list/useAttrs.js +1 -1
  80. package/ui.data-table/UTable.vue +3 -3
  81. package/ui.data-table/UTableRow.vue +7 -6
  82. package/ui.data-table/config.js +10 -3
  83. package/ui.data-table/storybook/Docs.mdx +1 -1
  84. package/ui.data-table/storybook/stories.js +5 -3
  85. package/ui.data-table/useAttrs.js +1 -1
  86. package/ui.data-table/utilTable.js +1 -1
  87. package/ui.dropdown-badge/UDropdownBadge.vue +1 -1
  88. package/ui.dropdown-badge/storybook/Docs.mdx +1 -1
  89. package/ui.dropdown-badge/storybook/stories.js +2 -2
  90. package/ui.dropdown-badge/useAttrs.js +1 -1
  91. package/ui.dropdown-button/UDropdownButton.vue +1 -1
  92. package/ui.dropdown-button/storybook/Docs.mdx +1 -1
  93. package/ui.dropdown-button/storybook/stories.js +3 -3
  94. package/ui.dropdown-button/useAttrs.js +1 -1
  95. package/ui.dropdown-link/UDropdownLink.vue +1 -1
  96. package/ui.dropdown-link/config.js +1 -1
  97. package/ui.dropdown-link/storybook/Docs.mdx +1 -1
  98. package/ui.dropdown-link/storybook/stories.js +2 -2
  99. package/ui.dropdown-link/useAttrs.js +4 -6
  100. package/ui.dropdown-list/UDropdownList.vue +3 -3
  101. package/ui.dropdown-list/storybook/Docs.mdx +1 -1
  102. package/ui.dropdown-list/storybook/stories.js +2 -2
  103. package/ui.dropdown-list/useAttrs.js +1 -1
  104. package/ui.form-calendar/UCalendar.vue +2 -2
  105. package/ui.form-calendar/storybook/Docs.mdx +1 -1
  106. package/ui.form-calendar/storybook/stories.js +1 -1
  107. package/ui.form-calendar/useAttrs.js +1 -1
  108. package/ui.form-checkbox/UCheckbox.vue +1 -1
  109. package/ui.form-checkbox/storybook/Docs.mdx +1 -1
  110. package/ui.form-checkbox/storybook/stories.js +2 -2
  111. package/ui.form-checkbox/useAttrs.js +1 -1
  112. package/ui.form-checkbox-group/UCheckboxGroup.vue +1 -1
  113. package/ui.form-checkbox-group/storybook/Docs.mdx +1 -1
  114. package/ui.form-checkbox-group/storybook/stories.js +2 -2
  115. package/ui.form-checkbox-group/useAttrs.js +1 -1
  116. package/ui.form-checkbox-multi-state/UCheckboxMultiState.vue +1 -1
  117. package/ui.form-checkbox-multi-state/storybook/Docs.mdx +1 -1
  118. package/ui.form-checkbox-multi-state/storybook/stories.js +2 -2
  119. package/ui.form-checkbox-multi-state/useAttrs.js +1 -1
  120. package/ui.form-color-picker/UColorPicker.vue +1 -1
  121. package/ui.form-color-picker/storybook/Docs.mdx +1 -1
  122. package/ui.form-color-picker/storybook/stories.js +2 -2
  123. package/ui.form-color-picker/useAttrs.js +1 -1
  124. package/ui.form-date-picker/UDatePicker.vue +4 -7
  125. package/ui.form-date-picker/storybook/Docs.mdx +1 -1
  126. package/ui.form-date-picker/storybook/stories.js +3 -3
  127. package/ui.form-date-picker/useAttrs.js +2 -2
  128. package/ui.form-date-picker-range/UDatePickerRange.vue +2 -2
  129. package/ui.form-date-picker-range/storybook/Docs.mdx +1 -1
  130. package/ui.form-date-picker-range/storybook/stories.js +2 -2
  131. package/ui.form-date-picker-range/useAttrs.js +2 -2
  132. package/ui.form-date-picker-range/useLocale.js +1 -1
  133. package/ui.form-input/UInput.vue +3 -3
  134. package/ui.form-input/storybook/Docs.mdx +1 -1
  135. package/ui.form-input/storybook/stories.js +2 -2
  136. package/ui.form-input/useAttrs.js +1 -1
  137. package/ui.form-input-file/UInputFile.vue +2 -2
  138. package/ui.form-input-file/storybook/Docs.mdx +1 -1
  139. package/ui.form-input-file/storybook/stories.js +2 -2
  140. package/ui.form-input-file/useAttrs.js +1 -1
  141. package/ui.form-input-money/UInputMoney.vue +1 -1
  142. package/ui.form-input-money/storybook/Docs.mdx +1 -1
  143. package/ui.form-input-money/storybook/stories.js +2 -2
  144. package/ui.form-input-money/useAttrs.js +1 -1
  145. package/ui.form-input-money/useFormatCurrency.js +1 -1
  146. package/ui.form-input-number/UInputNumber.vue +5 -4
  147. package/ui.form-input-number/storybook/Docs.mdx +1 -1
  148. package/ui.form-input-number/storybook/stories.js +2 -2
  149. package/ui.form-input-number/useAttrs.js +1 -1
  150. package/ui.form-input-rating/UInputRating.vue +1 -1
  151. package/ui.form-input-rating/storybook/Docs.mdx +1 -1
  152. package/ui.form-input-rating/storybook/stories.js +2 -2
  153. package/ui.form-input-rating/useAttrs.js +1 -1
  154. package/ui.form-input-search/UInputSearch.vue +2 -2
  155. package/ui.form-input-search/storybook/Docs.mdx +1 -1
  156. package/ui.form-input-search/storybook/stories.js +2 -2
  157. package/ui.form-input-search/useAttrs.js +1 -1
  158. package/ui.form-label/ULabel.vue +1 -1
  159. package/ui.form-label/config.js +2 -2
  160. package/ui.form-label/storybook/Docs.mdx +1 -1
  161. package/ui.form-label/storybook/stories.js +2 -2
  162. package/ui.form-label/useAttrs.js +1 -1
  163. package/ui.form-radio/URadio.vue +1 -1
  164. package/ui.form-radio/storybook/Docs.mdx +1 -1
  165. package/ui.form-radio/storybook/stories.js +1 -1
  166. package/ui.form-radio/useAttrs.js +1 -1
  167. package/ui.form-radio-group/URadioGroup.vue +1 -1
  168. package/ui.form-radio-group/storybook/Docs.mdx +1 -1
  169. package/ui.form-radio-group/storybook/stories.js +2 -2
  170. package/ui.form-radio-group/useAttrs.js +1 -1
  171. package/ui.form-select/USelect.vue +4 -4
  172. package/ui.form-select/storybook/Docs.mdx +1 -1
  173. package/ui.form-select/storybook/stories.js +2 -2
  174. package/ui.form-select/useAttrs.js +1 -1
  175. package/ui.form-switch/USwitch.vue +2 -2
  176. package/ui.form-switch/storybook/Docs.mdx +1 -1
  177. package/ui.form-switch/storybook/stories.js +2 -2
  178. package/ui.form-switch/useAttrs.js +1 -1
  179. package/ui.form-switch/utilVariant.js +1 -1
  180. package/ui.form-textarea/UTextarea.vue +1 -1
  181. package/ui.form-textarea/storybook/Docs.mdx +1 -1
  182. package/ui.form-textarea/storybook/stories.js +2 -2
  183. package/ui.form-textarea/useAttrs.js +1 -1
  184. package/ui.image-avatar/UAvatar.vue +1 -1
  185. package/ui.image-avatar/storybook/Docs.mdx +1 -1
  186. package/ui.image-avatar/storybook/stories.js +2 -2
  187. package/ui.image-avatar/useAttrs.js +1 -1
  188. package/ui.image-icon/UIcon.vue +14 -8
  189. package/ui.image-icon/storybook/Docs.mdx +2 -2
  190. package/ui.image-icon/storybook/stories.js +2 -2
  191. package/ui.image-icon/useAttrs.js +2 -2
  192. package/ui.loader/ULoader.vue +1 -1
  193. package/ui.loader/storybook/Docs.mdx +1 -1
  194. package/ui.loader/storybook/stories.js +2 -2
  195. package/ui.loader/useAttrs.js +1 -1
  196. package/ui.loader-overlay/ULoaderOverlay.vue +1 -1
  197. package/ui.loader-overlay/storybook/Docs.mdx +1 -1
  198. package/ui.loader-overlay/storybook/stories.js +1 -1
  199. package/ui.loader-overlay/useAttrs.js +1 -1
  200. package/ui.loader-progress/ULoaderProgress.vue +33 -48
  201. package/ui.loader-progress/constants.js +1 -0
  202. package/ui.loader-progress/storybook/Docs.mdx +1 -1
  203. package/ui.loader-progress/storybook/stories.js +3 -4
  204. package/ui.loader-progress/useAttrs.js +1 -1
  205. package/ui.loader-progress/useLoaderProgress.js +13 -8
  206. package/ui.loader-progress/utilLoaderProgress.js +1 -1
  207. package/ui.navigation-pagination/UPagination.vue +1 -1
  208. package/ui.navigation-pagination/storybook/Docs.mdx +1 -1
  209. package/ui.navigation-pagination/storybook/stories.js +1 -1
  210. package/ui.navigation-pagination/useAttrs.js +1 -1
  211. package/ui.navigation-progress/UProgress.vue +1 -1
  212. package/ui.navigation-progress/storybook/Docs.mdx +1 -1
  213. package/ui.navigation-progress/storybook/stories.js +2 -2
  214. package/ui.navigation-progress/useAttrs.js +1 -1
  215. package/ui.navigation-tab/UTab.vue +1 -1
  216. package/ui.navigation-tab/storybook/Docs.mdx +1 -1
  217. package/ui.navigation-tab/storybook/stories.js +1 -1
  218. package/ui.navigation-tab/useAttrs.js +1 -1
  219. package/ui.navigation-tabs/UTabs.vue +1 -1
  220. package/ui.navigation-tabs/storybook/Docs.mdx +1 -1
  221. package/ui.navigation-tabs/storybook/stories.js +2 -2
  222. package/ui.navigation-tabs/useAttrs.js +1 -1
  223. package/ui.other-dot/UDot.vue +1 -1
  224. package/ui.other-dot/storybook/Docs.mdx +1 -1
  225. package/ui.other-dot/storybook/stories.js +2 -2
  226. package/ui.other-dot/useAttrs.js +1 -1
  227. package/ui.text-alert/UAlert.vue +1 -1
  228. package/ui.text-alert/storybook/Docs.mdx +1 -1
  229. package/ui.text-alert/storybook/stories.js +2 -2
  230. package/ui.text-alert/useAttrs.js +1 -1
  231. package/ui.text-badge/UBadge.vue +89 -179
  232. package/ui.text-badge/storybook/Docs.mdx +3 -3
  233. package/ui.text-badge/storybook/{stories.js → stories.ts} +33 -37
  234. package/ui.text-badge/types.ts +84 -0
  235. package/ui.text-badge/useAttrs.ts +28 -0
  236. package/ui.text-block/UText.vue +18 -62
  237. package/ui.text-block/storybook/Docs.mdx +3 -3
  238. package/ui.text-block/storybook/{stories.js → stories.ts} +13 -8
  239. package/ui.text-block/types.ts +33 -0
  240. package/ui.text-block/useAttrs.ts +20 -0
  241. package/ui.text-empty/UEmpty.vue +1 -1
  242. package/ui.text-empty/storybook/Docs.mdx +1 -1
  243. package/ui.text-empty/storybook/stories.js +2 -2
  244. package/ui.text-empty/useAttrs.js +1 -1
  245. package/ui.text-file/UFile.vue +13 -16
  246. package/ui.text-file/config.js +12 -2
  247. package/ui.text-file/storybook/Docs.mdx +1 -1
  248. package/ui.text-file/storybook/stories.js +1 -1
  249. package/ui.text-file/useAttrs.js +1 -1
  250. package/ui.text-files/UFiles.vue +1 -1
  251. package/ui.text-files/config.js +1 -1
  252. package/ui.text-files/storybook/Docs.mdx +1 -1
  253. package/ui.text-files/storybook/stories.js +1 -1
  254. package/ui.text-files/useAttrs.js +1 -1
  255. package/ui.text-header/UHeader.vue +1 -1
  256. package/ui.text-header/storybook/Docs.mdx +1 -1
  257. package/ui.text-header/storybook/stories.js +2 -2
  258. package/ui.text-header/useAttrs.js +1 -1
  259. package/ui.text-money/UMoney.vue +1 -1
  260. package/ui.text-money/storybook/Docs.mdx +1 -1
  261. package/ui.text-money/storybook/stories.js +2 -2
  262. package/ui.text-money/useAttrs.js +1 -1
  263. package/ui.text-money/utilMoney.js +2 -2
  264. package/ui.text-notify/UNotify.vue +2 -2
  265. package/ui.text-notify/storybook/Docs.mdx +1 -1
  266. package/ui.text-notify/storybook/stories.js +1 -1
  267. package/ui.text-notify/useAttrs.js +1 -1
  268. package/ui.text-notify/utilNotify.js +1 -1
  269. package/utils/{utilHelper.js → helper.ts} +14 -27
  270. package/utils/node/helper.js +78 -0
  271. package/utils/node/loaderIcon.js +232 -0
  272. package/utils/node/loaderSvg.js +71 -0
  273. package/utils/node/mergeConfigs.js +199 -0
  274. package/utils/node/tailwindSafelist.js +366 -0
  275. package/utils/node/vuelessConfig.js +42 -0
  276. package/utils/node/vuelessResolver.js +28 -0
  277. package/utils/{utilPlatform.js → platform.ts} +10 -3
  278. package/utils/{utilStorybook.js → storybook.ts} +102 -36
  279. package/utils/tailwindConfig.ts +33 -0
  280. package/utils/{utilTheme.js → theme.ts} +65 -30
  281. package/utils/ui.ts +129 -0
  282. package/web-types.json +1362 -157
  283. package/adatper.locale/vue-i18n.js +0 -11
  284. package/composables/useAutoPosition.js +0 -94
  285. package/composables/useBreakpoint.js +0 -104
  286. package/composables/useLocale.js +0 -25
  287. package/composables/useMutationObserver.js +0 -48
  288. package/directives/clickOutside/vClickOutside.js +0 -64
  289. package/directives/tooltip/vTooltip.js +0 -56
  290. package/ui.text-badge/useAttrs.js +0 -23
  291. package/ui.text-block/useAttrs.js +0 -15
  292. package/utils/utilUI.js +0 -360
  293. /package/adatper.locale/locales/{en.js → en.ts} +0 -0
  294. /package/ui.image-icon/{config.js → config.ts} +0 -0
  295. /package/ui.text-badge/{config.js → config.ts} +0 -0
  296. /package/ui.text-badge/{constants.js → constants.ts} +0 -0
  297. /package/ui.text-block/{config.js → config.ts} +0 -0
  298. /package/ui.text-block/{constants.js → constants.ts} +0 -0
@@ -1,24 +1,41 @@
1
- import colors from "tailwindcss/colors.js";
1
+ import { merge } from "lodash-es";
2
+ import tailwindColors from "tailwindcss/colors.js";
2
3
 
3
- import { vuelessConfig } from "./utilUI.js";
4
- import { isSSR, isCSR } from "./utilHelper.js";
4
+ import { tailwindConfig } from "./tailwindConfig.ts";
5
+ import { vuelessConfig } from "./ui.ts";
6
+ import { isSSR, isCSR } from "./helper.ts";
5
7
  import {
6
- GRAY_COLOR,
7
- COOL_COLOR,
8
8
  BRAND_COLORS,
9
9
  GRAYSCALE_COLOR,
10
10
  DEFAULT_RING,
11
11
  DEFAULT_RING_OFFSET,
12
- DEFAULT_RING_OFFSET_COLOR_LIGHT,
13
- DEFAULT_RING_OFFSET_COLOR_DARK,
14
12
  DEFAULT_ROUNDING,
15
13
  DEFAULT_BRAND_COLOR,
16
14
  DEFAULT_GRAY_COLOR,
15
+ DEFAULT_RING_OFFSET_COLOR_LIGHT,
16
+ DEFAULT_RING_OFFSET_COLOR_DARK,
17
17
  DARK_MODE_SELECTOR,
18
18
  GRAY_COLORS,
19
19
  PX_IN_REM,
20
+ COOL_COLOR,
21
+ GRAY_COLOR,
22
+ LIGHT_MODE_SELECTOR,
20
23
  } from "../constants.js";
21
24
 
25
+ import type {
26
+ ThemeConfig,
27
+ GrayColors,
28
+ BrandColors,
29
+ VuelessCssVariables,
30
+ TailwindColorShades,
31
+ } from "../types.ts";
32
+
33
+ type DefaultColors = typeof tailwindColors;
34
+
35
+ interface InternalThemeConfig extends ThemeConfig {
36
+ systemDarkMode?: boolean;
37
+ }
38
+
22
39
  export function themeInit() {
23
40
  if (isSSR) return;
24
41
 
@@ -31,26 +48,30 @@ export function themeInit() {
31
48
  );
32
49
  }
33
50
 
34
- export function setTheme(config = {}) {
51
+ export function setTheme(config: InternalThemeConfig = {}) {
35
52
  const isDarkMode = setDarkMode(config);
53
+ const rounding = config?.rounding ?? vuelessConfig.rounding ?? DEFAULT_ROUNDING;
54
+
55
+ let brand: BrandColors | GrayColors | typeof GRAY_COLOR =
56
+ config?.brand ?? vuelessConfig.brand ?? DEFAULT_BRAND_COLOR;
57
+
58
+ let gray: GrayColors | typeof GRAY_COLOR =
59
+ config?.gray ?? vuelessConfig.gray ?? DEFAULT_GRAY_COLOR;
60
+
36
61
  const ring = config?.ring ?? vuelessConfig.ring ?? DEFAULT_RING;
37
62
  const ringOffset = config?.ringOffset ?? vuelessConfig.ringOffset ?? DEFAULT_RING_OFFSET;
38
63
 
39
- const defaultRingOffsetColorDark =
64
+ const ringOffsetColorDark =
40
65
  config?.ringOffsetColorDark ??
41
66
  vuelessConfig.ringOffsetColorDark ??
42
67
  DEFAULT_RING_OFFSET_COLOR_DARK;
43
68
 
44
- const defaultRingOffsetColorLight =
69
+ const ringOffsetColorLight =
45
70
  config?.ringOffsetColorLight ??
46
71
  vuelessConfig.ringOffsetColorLight ??
47
72
  DEFAULT_RING_OFFSET_COLOR_LIGHT;
48
73
 
49
- const rounding = config?.rounding ?? vuelessConfig.rounding ?? DEFAULT_ROUNDING;
50
- let brand = config?.brand ?? vuelessConfig.brand ?? DEFAULT_BRAND_COLOR;
51
- let gray = config?.gray ?? vuelessConfig.gray ?? DEFAULT_GRAY_COLOR;
52
-
53
- const isBrandColor = BRAND_COLORS.some((color) => color === brand);
74
+ const isBrandColor = [...BRAND_COLORS, GRAYSCALE_COLOR].some((color) => color === brand);
54
75
  const isGrayColor = GRAY_COLORS.some((color) => color === gray);
55
76
 
56
77
  if (!isBrandColor) {
@@ -65,9 +86,7 @@ export function setTheme(config = {}) {
65
86
 
66
87
  const defaultBrandShade = isDarkMode ? 400 : 600;
67
88
  const defaultGrayShade = isDarkMode ? 400 : 600;
68
- const defaultRingOffsetColor = isDarkMode
69
- ? defaultRingOffsetColorDark
70
- : defaultRingOffsetColorLight;
89
+ const defaultRingOffsetColor = isDarkMode ? ringOffsetColorDark : ringOffsetColorLight;
71
90
 
72
91
  if (gray === COOL_COLOR) {
73
92
  gray = GRAY_COLOR;
@@ -77,21 +96,31 @@ export function setTheme(config = {}) {
77
96
  brand = gray;
78
97
  }
79
98
 
80
- const variables = {
99
+ const colors: DefaultColors = merge(tailwindColors, tailwindConfig?.theme?.extend?.colors || {});
100
+
101
+ const variables: Partial<VuelessCssVariables> = {
102
+ "--vl-rounding": `${Number(rounding) / PX_IN_REM}rem`,
81
103
  "--vl-ring": `${ring}px`,
82
104
  "--vl-ring-offset": `${ringOffset}px`,
83
- "--vl-ring-offset-color": `rgb(${convertHexInRgb(defaultRingOffsetColor)})`,
84
- "--vl-rounding": `${Number(rounding) / PX_IN_REM}rem`,
105
+ "--vl-ring-offset-color": convertHexInRgb(defaultRingOffsetColor),
85
106
  "--vl-color-gray-default": convertHexInRgb(colors[gray][defaultBrandShade]),
86
107
  "--vl-color-brand-default": convertHexInRgb(colors[brand][defaultGrayShade]),
87
108
  };
88
109
 
89
110
  for (const key in colors[gray]) {
90
- variables[`--vl-color-gray-${key}`] = convertHexInRgb(colors[gray][key]);
111
+ const shade = key as unknown as keyof TailwindColorShades;
112
+
113
+ variables[`--vl-color-gray-${key}` as keyof VuelessCssVariables] = convertHexInRgb(
114
+ colors[gray][shade],
115
+ );
91
116
  }
92
117
 
93
118
  for (const key in colors[brand]) {
94
- variables[`--vl-color-brand-${key}`] = convertHexInRgb(colors[brand][key]);
119
+ const shade = key as unknown as keyof TailwindColorShades;
120
+
121
+ variables[`--vl-color-brand-${key}` as keyof VuelessCssVariables] = convertHexInRgb(
122
+ colors[brand][shade],
123
+ );
95
124
  }
96
125
 
97
126
  const stringVariables = Object.entries(variables)
@@ -110,26 +139,32 @@ export function setTheme(config = {}) {
110
139
  return rootVariables;
111
140
  }
112
141
 
113
- function setDarkMode(config) {
142
+ function setDarkMode(config: InternalThemeConfig) {
114
143
  config?.darkMode === undefined
115
144
  ? isCSR && localStorage.removeItem(DARK_MODE_SELECTOR)
116
- : isCSR && localStorage.setItem(DARK_MODE_SELECTOR, Number(!!config?.darkMode));
145
+ : isCSR && localStorage.setItem(DARK_MODE_SELECTOR, Number(config?.darkMode).toString());
117
146
 
118
147
  const storedDarkMode = isCSR ? localStorage.getItem(DARK_MODE_SELECTOR) : null;
119
148
 
120
- let isDarkMode =
149
+ const isDarkMode =
121
150
  storedDarkMode !== null
122
151
  ? !!Number(storedDarkMode)
123
152
  : !!(config?.darkMode ?? vuelessConfig.darkMode ?? config?.systemDarkMode);
124
153
 
125
- isDarkMode
126
- ? isCSR && document.documentElement.classList.add(DARK_MODE_SELECTOR)
127
- : isCSR && document.documentElement.classList.remove(DARK_MODE_SELECTOR);
154
+ if (isCSR) {
155
+ if (isDarkMode) {
156
+ document.documentElement.classList.remove(LIGHT_MODE_SELECTOR);
157
+ document.documentElement.classList.add(DARK_MODE_SELECTOR);
158
+ } else {
159
+ document.documentElement.classList.remove(DARK_MODE_SELECTOR);
160
+ document.documentElement.classList.add(LIGHT_MODE_SELECTOR);
161
+ }
162
+ }
128
163
 
129
164
  return isDarkMode;
130
165
  }
131
166
 
132
- export function convertHexInRgb(hex) {
167
+ export function convertHexInRgb(hex: string) {
133
168
  const color = hex.replace(/#/g, "");
134
169
 
135
170
  let r, g, b;
package/utils/ui.ts ADDED
@@ -0,0 +1,129 @@
1
+ import { merge } from "lodash-es";
2
+ import { defineConfig } from "cva";
3
+ import { extendTailwindMerge } from "tailwind-merge";
4
+ import { cloneDeep, isCSR, isSSR } from "./helper.ts";
5
+ import { createMergeConfigsFunction } from "./node/mergeConfigs.js";
6
+ import {
7
+ BRAND_COLOR,
8
+ GRAYSCALE_COLOR,
9
+ DEFAULT_BRAND_COLOR,
10
+ NESTED_COMPONENT_REG_EXP,
11
+ TAILWIND_MERGE_EXTENSION,
12
+ } from "../constants.js";
13
+
14
+ import type { BrandColors, Config, ComponentNames, Component, Defaults } from "../types.ts";
15
+
16
+ /**
17
+ * Load Vueless config from the project root.
18
+ * Both for server and client side renderings.
19
+ * IIFE for SSR is used to prevent top level await issue.
20
+ */
21
+ export let vuelessConfig: Config = {};
22
+
23
+ if (isSSR) {
24
+ /* Load Vueless config from the project root in IIFE (no top-level await). */
25
+ (async () => {
26
+ try {
27
+ const filePath = `${process.cwd()}/vueless.config`;
28
+
29
+ vuelessConfig = (await import(/* @vite-ignore */ `${filePath}.js`)).default;
30
+
31
+ if (!vuelessConfig) {
32
+ vuelessConfig = (await import(/* @vite-ignore */ `${filePath}.ts`)).default;
33
+ }
34
+ } catch {
35
+ vuelessConfig = {};
36
+ }
37
+ })();
38
+ }
39
+
40
+ if (isCSR) {
41
+ vuelessConfig =
42
+ Object.values(
43
+ import.meta.glob("/vueless.config.{js,ts}", { eager: true, import: "default" }),
44
+ )[0] || {};
45
+ }
46
+
47
+ /**
48
+ * Extend twMerge (tailwind merge) by vueless and user config:
49
+ * All list of rules available here:
50
+ * https://github.com/dcastil/tailwind-merge/blob/v2.3.0/src/lib/default-config.ts
51
+ */
52
+ const twMerge = extendTailwindMerge(merge(TAILWIND_MERGE_EXTENSION, vuelessConfig.tailwindMerge));
53
+
54
+ /**
55
+ * Export cva (class variance authority) methods:
56
+ * – extended with tailwind-merge
57
+ * – remove all Vueless nested component names ({U...} strings) from class list string.
58
+ * Learn more here: https://beta.cva.style
59
+ */
60
+ export const {
61
+ cx,
62
+ compose,
63
+ cva: classVarianceAuthority,
64
+ } = defineConfig({
65
+ hooks: {
66
+ onComplete: (classNames) => twMerge(classNames).replace(NESTED_COMPONENT_REG_EXP, ""),
67
+ },
68
+ });
69
+
70
+ export const mergeConfigs = createMergeConfigsFunction(cx);
71
+
72
+ /* This allows skipping some CVA config keys in vueless config. */
73
+ export const cva = ({ base = "", variants = {}, compoundVariants = [], defaultVariants = {} }) =>
74
+ classVarianceAuthority({
75
+ base,
76
+ variants,
77
+ compoundVariants,
78
+ defaultVariants,
79
+ });
80
+
81
+ /**
82
+ * Return default values for component props, icons, etc..
83
+ */
84
+ export function getDefault<T>(defaultConfig: Component, name: ComponentNames): T {
85
+ const componentDefaults = cloneDeep(defaultConfig.defaults) || {};
86
+ const globalDefaults = cloneDeep(vuelessConfig.component?.[name]?.defaults) || {};
87
+
88
+ const defaults = merge(componentDefaults, globalDefaults) as T & Defaults;
89
+
90
+ if (defaults.color) {
91
+ defaults.color = getColor(defaults.color as BrandColors);
92
+ }
93
+
94
+ return defaults;
95
+ }
96
+
97
+ /**
98
+ * Return `grayscale` color if in component config it `brand` but in vueless config it `grayscale`
99
+ * Otherwise return given color.
100
+ */
101
+ export function getColor(color: string) {
102
+ const isBrandColorGrayscale = (vuelessConfig.brand ?? DEFAULT_BRAND_COLOR) === GRAYSCALE_COLOR;
103
+ const isComponentColorBrand = color === BRAND_COLOR;
104
+
105
+ return isBrandColorGrayscale && isComponentColorBrand ? GRAYSCALE_COLOR : color;
106
+ }
107
+
108
+ /**
109
+ * Replace in tailwind classes `{color}` variable into given color.
110
+ */
111
+ export function setColor(classes: string, color: string) {
112
+ return classes?.replace(/{color}/g, color);
113
+ }
114
+
115
+ /**
116
+ * Generates simple unique identifier.
117
+ */
118
+ export function getRandomId(length = 15) {
119
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
120
+ const charactersLength = characters.length;
121
+
122
+ let id = "";
123
+
124
+ while (id.length < length) {
125
+ id += characters.charAt(Math.floor(Math.random() * charactersLength));
126
+ }
127
+
128
+ return id;
129
+ }