diff --git a/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap b/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap index 9842cbf7dd..3c63022fd3 100644 --- a/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap +++ b/src/packages/__VUE/configprovider/__tests__/__snapshots__/configprovider.spec.ts.snap @@ -1,7 +1,13 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`ConfigProvider: props themeVars 1`] = ` -"
+"
+ +
" +`; + +exports[`ConfigProvider: props themeVars 2`] = ` +"
" `; diff --git a/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts b/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts index a21200bbfe..b57fa0baa0 100644 --- a/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts +++ b/src/packages/__VUE/configprovider/__tests__/configprovider.spec.ts @@ -27,4 +27,11 @@ test('ConfigProvider: props themeVars', async () => { } }); expect(wrapper.html()).toMatchSnapshot(); + + await wrapper.setProps({ + themeVars: { + primaryColor: '#ff' + } + }); + expect(wrapper.html()).toMatchSnapshot(); }); diff --git a/src/packages/__VUE/configprovider/common.ts b/src/packages/__VUE/configprovider/common.ts new file mode 100644 index 0000000000..995410ad33 --- /dev/null +++ b/src/packages/__VUE/configprovider/common.ts @@ -0,0 +1,80 @@ +import { h, computed } from 'vue'; + +export const component = (tag: string) => { + return { + props: { + theme: { type: String, default: '' }, + themeVars: { type: Object, default: {} }, + tag: { type: String, default: tag } + }, + + setup(props: any, { slots }: any) { + const hexToRgb = (color: string) => { + //十六进制颜色值的正则表达式 + const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; + if (!reg.test(color)) return ''; + color = color.toLowerCase(); + // 如果是16进制颜色 + if (color.length === 4) { + color = + '#' + + color + .slice(1) + .split('') + .map((char) => char + char) + .join(''); + } + //处理六位的颜色值 + const colors = []; + for (let i = 1; i < 7; i += 2) { + colors.push(parseInt('0x' + color.slice(i, i + 2))); + } + return colors.join(','); + }; + + const kebabCase = (str: string): string => { + str = str.replace(str.charAt(0), str.charAt(0).toLocaleLowerCase()); + return str.replace(/([a-z])([A-Z])/g, (_, p1, p2) => p1 + '-' + p2.toLowerCase()); + }; + + const mapThemeVarsToCSSVars = (themeVars: Record) => { + if (!themeVars) return; + const cssVars: Record = {}; + const primaryColor = themeVars?.primaryColor; + // 为了处理一些组件的rgba透明颜色 + if (primaryColor) { + const primaryColorRgb = hexToRgb(primaryColor); + cssVars[ + '--nut-address-region-tab-line' + ] = `linear-gradient(90deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + cssVars[ + '--nut-tabs-horizontal-tab-line-color' + ] = `linear-gradient(90deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + cssVars[ + '--nut-tabs-vertical-tab-line-color' + ] = `linear-gradient(180deg, ${primaryColor} 0%, rgba(${primaryColorRgb}, 0.15) 100%)`; + } + + Object.keys(themeVars).forEach((key) => { + cssVars[`--nut-${kebabCase(key)}`] = themeVars[key]; + }); + + return cssVars; + }; + + const themeStyle = computed(() => mapThemeVarsToCSSVars(props.themeVars)); + const defaultSlots = slots.default?.(); + + return () => { + return h( + props.tag, + { + class: `nut-theme-${props.theme}`, + style: themeStyle.value + }, + defaultSlots + ); + }; + } + }; +}; diff --git a/src/packages/__VUE/configprovider/demo.vue b/src/packages/__VUE/configprovider/demo.vue index e0171f9c7c..91cb36054b 100644 --- a/src/packages/__VUE/configprovider/demo.vue +++ b/src/packages/__VUE/configprovider/demo.vue @@ -68,11 +68,12 @@
- - diff --git a/src/packages/__VUE/configprovider/index.taro.vue b/src/packages/__VUE/configprovider/index.taro.vue index 1db530b2b3..6297ca519f 100644 --- a/src/packages/__VUE/configprovider/index.taro.vue +++ b/src/packages/__VUE/configprovider/index.taro.vue @@ -1,74 +1,8 @@ diff --git a/src/packages/__VUE/configprovider/index.vue b/src/packages/__VUE/configprovider/index.vue index 0905a59ab1..65317bee01 100644 --- a/src/packages/__VUE/configprovider/index.vue +++ b/src/packages/__VUE/configprovider/index.vue @@ -1,76 +1,8 @@