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.
- package/README.md +3 -3
- package/adatper.locale/vue-i18n.ts +14 -0
- package/adatper.locale/{vueless.js → vueless.ts} +67 -19
- package/composables/useAutoPosition.ts +113 -0
- package/composables/useBreakpoint.ts +109 -0
- package/composables/useLocale.ts +22 -0
- package/composables/useMutationObserver.ts +53 -0
- package/composables/{useUI.js → useUI.ts} +109 -105
- package/constants.js +124 -2
- package/directives/clickOutside/storybook/Docs.mdx +1 -1
- package/directives/clickOutside/storybook/{stories.js → stories.ts} +7 -9
- package/directives/clickOutside/types.ts +22 -0
- package/directives/clickOutside/vClickOutside.ts +96 -0
- package/directives/index.js +7 -2
- package/directives/tooltip/storybook/Docs.mdx +1 -1
- package/directives/tooltip/storybook/{stories.js → stories.ts} +22 -10
- package/directives/tooltip/types.ts +14 -0
- package/directives/tooltip/vTooltip.ts +82 -0
- package/{index.js → index.ts} +12 -9
- package/package.json +38 -25
- package/plugin-vite.d.ts +10 -0
- package/plugin-vite.js +97 -0
- package/{preset.tailwind.js → preset-tailwind.js} +21 -7
- package/types.ts +322 -0
- package/ui.button/UButton.vue +1 -1
- package/ui.button/storybook/Docs.mdx +1 -1
- package/ui.button/storybook/stories.js +11 -6
- package/ui.button/useAttrs.js +1 -1
- package/ui.button-link/ULink.vue +2 -2
- package/ui.button-link/storybook/Docs.mdx +1 -1
- package/ui.button-link/storybook/stories.js +2 -2
- package/ui.button-link/useAttrs.js +1 -1
- package/ui.button-toggle/UToggle.vue +1 -1
- package/ui.button-toggle/storybook/Docs.mdx +1 -1
- package/ui.button-toggle/storybook/stories.js +2 -2
- package/ui.button-toggle/useAttrs.js +1 -1
- package/ui.button-toggle-item/UToggleItem.vue +1 -1
- package/ui.button-toggle-item/storybook/Docs.mdx +1 -1
- package/ui.button-toggle-item/storybook/stories.js +1 -1
- package/ui.button-toggle-item/useAttrs.js +1 -1
- package/ui.container-accordion/UAccordion.vue +1 -1
- package/ui.container-accordion/storybook/Docs.mdx +1 -1
- package/ui.container-accordion/storybook/stories.js +1 -1
- package/ui.container-accordion/useAttrs.js +1 -1
- package/ui.container-card/storybook/Docs.mdx +1 -1
- package/ui.container-card/storybook/stories.js +1 -1
- package/ui.container-card/useAttrs.js +1 -1
- package/ui.container-col/UCol.vue +1 -1
- package/ui.container-col/storybook/Docs.mdx +1 -1
- package/ui.container-col/storybook/stories.js +1 -1
- package/ui.container-col/useAttrs.js +1 -1
- package/ui.container-divider/UDivider.vue +1 -1
- package/ui.container-divider/storybook/Docs.mdx +1 -1
- package/ui.container-divider/storybook/stories.js +2 -2
- package/ui.container-divider/useAttrs.js +1 -1
- package/ui.container-group/UGroup.vue +1 -1
- package/ui.container-group/storybook/Docs.mdx +1 -1
- package/ui.container-group/storybook/stories.js +1 -1
- package/ui.container-group/useAttrs.js +1 -1
- package/ui.container-modal/UModal.vue +1 -1
- package/ui.container-modal/storybook/Docs.mdx +1 -1
- package/ui.container-modal/storybook/stories.js +2 -2
- package/ui.container-modal/useAttrs.js +1 -1
- package/ui.container-modal-confirm/UModalConfirm.vue +2 -2
- package/ui.container-modal-confirm/storybook/Docs.mdx +1 -1
- package/ui.container-modal-confirm/storybook/stories.js +2 -2
- package/ui.container-modal-confirm/useAttrs.js +1 -1
- package/ui.container-page/UPage.vue +2 -2
- package/ui.container-page/storybook/Docs.mdx +1 -1
- package/ui.container-page/storybook/stories.js +1 -1
- package/ui.container-page/useAttrs.js +2 -2
- package/ui.container-row/URow.vue +1 -1
- package/ui.container-row/storybook/Docs.mdx +1 -1
- package/ui.container-row/storybook/stories.js +2 -2
- package/ui.container-row/useAttrs.js +1 -1
- package/ui.data-list/UDataList.vue +6 -6
- package/ui.data-list/storybook/Docs.mdx +1 -1
- package/ui.data-list/storybook/stories.js +1 -1
- package/ui.data-list/useAttrs.js +1 -1
- package/ui.data-table/UTable.vue +3 -3
- package/ui.data-table/UTableRow.vue +7 -6
- package/ui.data-table/config.js +10 -3
- package/ui.data-table/storybook/Docs.mdx +1 -1
- package/ui.data-table/storybook/stories.js +5 -3
- package/ui.data-table/useAttrs.js +1 -1
- package/ui.data-table/utilTable.js +1 -1
- package/ui.dropdown-badge/UDropdownBadge.vue +1 -1
- package/ui.dropdown-badge/storybook/Docs.mdx +1 -1
- package/ui.dropdown-badge/storybook/stories.js +2 -2
- package/ui.dropdown-badge/useAttrs.js +1 -1
- package/ui.dropdown-button/UDropdownButton.vue +1 -1
- package/ui.dropdown-button/storybook/Docs.mdx +1 -1
- package/ui.dropdown-button/storybook/stories.js +3 -3
- package/ui.dropdown-button/useAttrs.js +1 -1
- package/ui.dropdown-link/UDropdownLink.vue +1 -1
- package/ui.dropdown-link/config.js +1 -1
- package/ui.dropdown-link/storybook/Docs.mdx +1 -1
- package/ui.dropdown-link/storybook/stories.js +2 -2
- package/ui.dropdown-link/useAttrs.js +4 -6
- package/ui.dropdown-list/UDropdownList.vue +3 -3
- package/ui.dropdown-list/storybook/Docs.mdx +1 -1
- package/ui.dropdown-list/storybook/stories.js +2 -2
- package/ui.dropdown-list/useAttrs.js +1 -1
- package/ui.form-calendar/UCalendar.vue +2 -2
- package/ui.form-calendar/storybook/Docs.mdx +1 -1
- package/ui.form-calendar/storybook/stories.js +1 -1
- package/ui.form-calendar/useAttrs.js +1 -1
- package/ui.form-checkbox/UCheckbox.vue +1 -1
- package/ui.form-checkbox/storybook/Docs.mdx +1 -1
- package/ui.form-checkbox/storybook/stories.js +2 -2
- package/ui.form-checkbox/useAttrs.js +1 -1
- package/ui.form-checkbox-group/UCheckboxGroup.vue +1 -1
- package/ui.form-checkbox-group/storybook/Docs.mdx +1 -1
- package/ui.form-checkbox-group/storybook/stories.js +2 -2
- package/ui.form-checkbox-group/useAttrs.js +1 -1
- package/ui.form-checkbox-multi-state/UCheckboxMultiState.vue +1 -1
- package/ui.form-checkbox-multi-state/storybook/Docs.mdx +1 -1
- package/ui.form-checkbox-multi-state/storybook/stories.js +2 -2
- package/ui.form-checkbox-multi-state/useAttrs.js +1 -1
- package/ui.form-color-picker/UColorPicker.vue +1 -1
- package/ui.form-color-picker/storybook/Docs.mdx +1 -1
- package/ui.form-color-picker/storybook/stories.js +2 -2
- package/ui.form-color-picker/useAttrs.js +1 -1
- package/ui.form-date-picker/UDatePicker.vue +4 -7
- package/ui.form-date-picker/storybook/Docs.mdx +1 -1
- package/ui.form-date-picker/storybook/stories.js +3 -3
- package/ui.form-date-picker/useAttrs.js +2 -2
- package/ui.form-date-picker-range/UDatePickerRange.vue +2 -2
- package/ui.form-date-picker-range/storybook/Docs.mdx +1 -1
- package/ui.form-date-picker-range/storybook/stories.js +2 -2
- package/ui.form-date-picker-range/useAttrs.js +2 -2
- package/ui.form-date-picker-range/useLocale.js +1 -1
- package/ui.form-input/UInput.vue +3 -3
- package/ui.form-input/storybook/Docs.mdx +1 -1
- package/ui.form-input/storybook/stories.js +2 -2
- package/ui.form-input/useAttrs.js +1 -1
- package/ui.form-input-file/UInputFile.vue +2 -2
- package/ui.form-input-file/storybook/Docs.mdx +1 -1
- package/ui.form-input-file/storybook/stories.js +2 -2
- package/ui.form-input-file/useAttrs.js +1 -1
- package/ui.form-input-money/UInputMoney.vue +1 -1
- package/ui.form-input-money/storybook/Docs.mdx +1 -1
- package/ui.form-input-money/storybook/stories.js +2 -2
- package/ui.form-input-money/useAttrs.js +1 -1
- package/ui.form-input-money/useFormatCurrency.js +1 -1
- package/ui.form-input-number/UInputNumber.vue +5 -4
- package/ui.form-input-number/storybook/Docs.mdx +1 -1
- package/ui.form-input-number/storybook/stories.js +2 -2
- package/ui.form-input-number/useAttrs.js +1 -1
- package/ui.form-input-rating/UInputRating.vue +1 -1
- package/ui.form-input-rating/storybook/Docs.mdx +1 -1
- package/ui.form-input-rating/storybook/stories.js +2 -2
- package/ui.form-input-rating/useAttrs.js +1 -1
- package/ui.form-input-search/UInputSearch.vue +2 -2
- package/ui.form-input-search/storybook/Docs.mdx +1 -1
- package/ui.form-input-search/storybook/stories.js +2 -2
- package/ui.form-input-search/useAttrs.js +1 -1
- package/ui.form-label/ULabel.vue +1 -1
- package/ui.form-label/config.js +2 -2
- package/ui.form-label/storybook/Docs.mdx +1 -1
- package/ui.form-label/storybook/stories.js +2 -2
- package/ui.form-label/useAttrs.js +1 -1
- package/ui.form-radio/URadio.vue +1 -1
- package/ui.form-radio/storybook/Docs.mdx +1 -1
- package/ui.form-radio/storybook/stories.js +1 -1
- package/ui.form-radio/useAttrs.js +1 -1
- package/ui.form-radio-group/URadioGroup.vue +1 -1
- package/ui.form-radio-group/storybook/Docs.mdx +1 -1
- package/ui.form-radio-group/storybook/stories.js +2 -2
- package/ui.form-radio-group/useAttrs.js +1 -1
- package/ui.form-select/USelect.vue +4 -4
- package/ui.form-select/storybook/Docs.mdx +1 -1
- package/ui.form-select/storybook/stories.js +2 -2
- package/ui.form-select/useAttrs.js +1 -1
- package/ui.form-switch/USwitch.vue +2 -2
- package/ui.form-switch/storybook/Docs.mdx +1 -1
- package/ui.form-switch/storybook/stories.js +2 -2
- package/ui.form-switch/useAttrs.js +1 -1
- package/ui.form-switch/utilVariant.js +1 -1
- package/ui.form-textarea/UTextarea.vue +1 -1
- package/ui.form-textarea/storybook/Docs.mdx +1 -1
- package/ui.form-textarea/storybook/stories.js +2 -2
- package/ui.form-textarea/useAttrs.js +1 -1
- package/ui.image-avatar/UAvatar.vue +1 -1
- package/ui.image-avatar/storybook/Docs.mdx +1 -1
- package/ui.image-avatar/storybook/stories.js +2 -2
- package/ui.image-avatar/useAttrs.js +1 -1
- package/ui.image-icon/UIcon.vue +14 -8
- package/ui.image-icon/storybook/Docs.mdx +2 -2
- package/ui.image-icon/storybook/stories.js +2 -2
- package/ui.image-icon/useAttrs.js +2 -2
- package/ui.loader/ULoader.vue +1 -1
- package/ui.loader/storybook/Docs.mdx +1 -1
- package/ui.loader/storybook/stories.js +2 -2
- package/ui.loader/useAttrs.js +1 -1
- package/ui.loader-overlay/ULoaderOverlay.vue +1 -1
- package/ui.loader-overlay/storybook/Docs.mdx +1 -1
- package/ui.loader-overlay/storybook/stories.js +1 -1
- package/ui.loader-overlay/useAttrs.js +1 -1
- package/ui.loader-progress/ULoaderProgress.vue +33 -48
- package/ui.loader-progress/constants.js +1 -0
- package/ui.loader-progress/storybook/Docs.mdx +1 -1
- package/ui.loader-progress/storybook/stories.js +3 -4
- package/ui.loader-progress/useAttrs.js +1 -1
- package/ui.loader-progress/useLoaderProgress.js +13 -8
- package/ui.loader-progress/utilLoaderProgress.js +1 -1
- package/ui.navigation-pagination/UPagination.vue +1 -1
- package/ui.navigation-pagination/storybook/Docs.mdx +1 -1
- package/ui.navigation-pagination/storybook/stories.js +1 -1
- package/ui.navigation-pagination/useAttrs.js +1 -1
- package/ui.navigation-progress/UProgress.vue +1 -1
- package/ui.navigation-progress/storybook/Docs.mdx +1 -1
- package/ui.navigation-progress/storybook/stories.js +2 -2
- package/ui.navigation-progress/useAttrs.js +1 -1
- package/ui.navigation-tab/UTab.vue +1 -1
- package/ui.navigation-tab/storybook/Docs.mdx +1 -1
- package/ui.navigation-tab/storybook/stories.js +1 -1
- package/ui.navigation-tab/useAttrs.js +1 -1
- package/ui.navigation-tabs/UTabs.vue +1 -1
- package/ui.navigation-tabs/storybook/Docs.mdx +1 -1
- package/ui.navigation-tabs/storybook/stories.js +2 -2
- package/ui.navigation-tabs/useAttrs.js +1 -1
- package/ui.other-dot/UDot.vue +1 -1
- package/ui.other-dot/storybook/Docs.mdx +1 -1
- package/ui.other-dot/storybook/stories.js +2 -2
- package/ui.other-dot/useAttrs.js +1 -1
- package/ui.text-alert/UAlert.vue +1 -1
- package/ui.text-alert/storybook/Docs.mdx +1 -1
- package/ui.text-alert/storybook/stories.js +2 -2
- package/ui.text-alert/useAttrs.js +1 -1
- package/ui.text-badge/UBadge.vue +89 -179
- package/ui.text-badge/storybook/Docs.mdx +3 -3
- package/ui.text-badge/storybook/{stories.js → stories.ts} +33 -37
- package/ui.text-badge/types.ts +84 -0
- package/ui.text-badge/useAttrs.ts +28 -0
- package/ui.text-block/UText.vue +18 -62
- package/ui.text-block/storybook/Docs.mdx +3 -3
- package/ui.text-block/storybook/{stories.js → stories.ts} +13 -8
- package/ui.text-block/types.ts +33 -0
- package/ui.text-block/useAttrs.ts +20 -0
- package/ui.text-empty/UEmpty.vue +1 -1
- package/ui.text-empty/storybook/Docs.mdx +1 -1
- package/ui.text-empty/storybook/stories.js +2 -2
- package/ui.text-empty/useAttrs.js +1 -1
- package/ui.text-file/UFile.vue +13 -16
- package/ui.text-file/config.js +12 -2
- package/ui.text-file/storybook/Docs.mdx +1 -1
- package/ui.text-file/storybook/stories.js +1 -1
- package/ui.text-file/useAttrs.js +1 -1
- package/ui.text-files/UFiles.vue +1 -1
- package/ui.text-files/config.js +1 -1
- package/ui.text-files/storybook/Docs.mdx +1 -1
- package/ui.text-files/storybook/stories.js +1 -1
- package/ui.text-files/useAttrs.js +1 -1
- package/ui.text-header/UHeader.vue +1 -1
- package/ui.text-header/storybook/Docs.mdx +1 -1
- package/ui.text-header/storybook/stories.js +2 -2
- package/ui.text-header/useAttrs.js +1 -1
- package/ui.text-money/UMoney.vue +1 -1
- package/ui.text-money/storybook/Docs.mdx +1 -1
- package/ui.text-money/storybook/stories.js +2 -2
- package/ui.text-money/useAttrs.js +1 -1
- package/ui.text-money/utilMoney.js +2 -2
- package/ui.text-notify/UNotify.vue +2 -2
- package/ui.text-notify/storybook/Docs.mdx +1 -1
- package/ui.text-notify/storybook/stories.js +1 -1
- package/ui.text-notify/useAttrs.js +1 -1
- package/ui.text-notify/utilNotify.js +1 -1
- package/utils/{utilHelper.js → helper.ts} +14 -27
- package/utils/node/helper.js +78 -0
- package/utils/node/loaderIcon.js +232 -0
- package/utils/node/loaderSvg.js +71 -0
- package/utils/node/mergeConfigs.js +199 -0
- package/utils/node/tailwindSafelist.js +366 -0
- package/utils/node/vuelessConfig.js +42 -0
- package/utils/node/vuelessResolver.js +28 -0
- package/utils/{utilPlatform.js → platform.ts} +10 -3
- package/utils/{utilStorybook.js → storybook.ts} +102 -36
- package/utils/tailwindConfig.ts +33 -0
- package/utils/{utilTheme.js → theme.ts} +65 -30
- package/utils/ui.ts +129 -0
- package/web-types.json +1362 -157
- package/adatper.locale/vue-i18n.js +0 -11
- package/composables/useAutoPosition.js +0 -94
- package/composables/useBreakpoint.js +0 -104
- package/composables/useLocale.js +0 -25
- package/composables/useMutationObserver.js +0 -48
- package/directives/clickOutside/vClickOutside.js +0 -64
- package/directives/tooltip/vTooltip.js +0 -56
- package/ui.text-badge/useAttrs.js +0 -23
- package/ui.text-block/useAttrs.js +0 -15
- package/utils/utilUI.js +0 -360
- /package/adatper.locale/locales/{en.js → en.ts} +0 -0
- /package/ui.image-icon/{config.js → config.ts} +0 -0
- /package/ui.text-badge/{config.js → config.ts} +0 -0
- /package/ui.text-badge/{constants.js → constants.ts} +0 -0
- /package/ui.text-block/{config.js → config.ts} +0 -0
- /package/ui.text-block/{constants.js → constants.ts} +0 -0
|
@@ -1,24 +1,41 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { merge } from "lodash-es";
|
|
2
|
+
import tailwindColors from "tailwindcss/colors.js";
|
|
2
3
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
64
|
+
const ringOffsetColorDark =
|
|
40
65
|
config?.ringOffsetColorDark ??
|
|
41
66
|
vuelessConfig.ringOffsetColorDark ??
|
|
42
67
|
DEFAULT_RING_OFFSET_COLOR_DARK;
|
|
43
68
|
|
|
44
|
-
const
|
|
69
|
+
const ringOffsetColorLight =
|
|
45
70
|
config?.ringOffsetColorLight ??
|
|
46
71
|
vuelessConfig.ringOffsetColorLight ??
|
|
47
72
|
DEFAULT_RING_OFFSET_COLOR_LIGHT;
|
|
48
73
|
|
|
49
|
-
const
|
|
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
|
|
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":
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
149
|
+
const isDarkMode =
|
|
121
150
|
storedDarkMode !== null
|
|
122
151
|
? !!Number(storedDarkMode)
|
|
123
152
|
: !!(config?.darkMode ?? vuelessConfig.darkMode ?? config?.systemDarkMode);
|
|
124
153
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
+
}
|