diff --git a/docs/.vitepress/theme/CodePreview.vue b/docs/.vitepress/theme/CodePreview.vue index b40b9af9..46d855b0 100644 --- a/docs/.vitepress/theme/CodePreview.vue +++ b/docs/.vitepress/theme/CodePreview.vue @@ -25,7 +25,7 @@ defineExpose({ dark, showCode }) :class="{ dark: dark, }" - class="relative mt-4 overflow-hidden rounded-xl border dark:border-slate-500/50" + class="not-prose relative mt-4 overflow-hidden rounded-xl border dark:border-slate-500/50" >
diff --git a/src/components/Button/style.ts b/src/components/Button/style.ts index 94afff62..d2eff125 100644 --- a/src/components/Button/style.ts +++ b/src/components/Button/style.ts @@ -51,7 +51,7 @@ const createBtnCls = classed('t-button', { true: '!px-0 w-[--t-btn-h]', }, variant: { - default: `shadow-sm border`, + default: `shadow-sm border py-1`, filled: `shadow-sm border`, light: `shadow-sm border`, link: `border decoration-2 underline-offset-2`, @@ -121,12 +121,12 @@ const getBtnCssVars = (variant: ButtonVariants['variant'], color: ColorKey, prim export function useStyle(variant: MaybeRefOrGetter) { const { colors, getColorKey } = useTheme() const variantRef = computed(() => { - const orginVariant = { ...toValue(variant) } + const originVariant = { ...toValue(variant) } const _variant: ButtonVariants = { - ...orginVariant, - color: orginVariant.color || 'gray', - ring: orginVariant.variant === 'link' ? false : orginVariant.ring, - variant: orginVariant.variant || (orginVariant.color ? 'filled' : 'default'), + ...originVariant, + color: originVariant.color || 'gray', + ring: originVariant.variant === 'link' ? false : originVariant.ring, + variant: originVariant.variant || (originVariant.color ? 'filled' : 'default'), } return _variant }) diff --git a/src/components/ConfigProvider/index.ts b/src/components/ConfigProvider/index.ts index fe342180..77dbf359 100644 --- a/src/components/ConfigProvider/index.ts +++ b/src/components/ConfigProvider/index.ts @@ -1,17 +1,19 @@ import { + computed, + defineComponent, type ExtractPropTypes, type ExtractPublicPropTypes, type PropType, - type SlotsType, - type VNode, - computed, - defineComponent, provide, reactive, ref, renderSlot, + type SlotsType, + type VNode, } from 'vue' + import { type Theme } from '@/theme' + import { type Config, configProviderKey, useConfig } from './useConfig' export { useConfig } diff --git a/src/components/List/index.tsx b/src/components/List/ItemList.tsx similarity index 80% rename from src/components/List/index.tsx rename to src/components/List/ItemList.tsx index c56a171e..c809bed4 100644 --- a/src/components/List/index.tsx +++ b/src/components/List/ItemList.tsx @@ -14,7 +14,7 @@ import { type OptionItem, type OptionValue, toMultipleVal } from '@/utils/option const props = { value: [String, Number, Array] as PropType>, - options: { + items: { type: Array as PropType, default: () => [], }, @@ -22,21 +22,20 @@ const props = { multiple: Boolean, } -export type ListProps = ExtractPropTypes +export type ItemListProps = ExtractPropTypes -export type ListPublicProps = ExtractPublicPropTypes +export type ItemListPublicProps = ExtractPublicPropTypes -export type ListCssVars = { - '--t-list-accent-color': string - '--t-list-ring-color': string +export type ItemListCssVars = { + '--t-itemList-accent-color': string } -export const List = defineComponent({ - name: 'TList', +export const ItemList = defineComponent({ + name: 'TItemList', props, emits: { - 'update:value': (val: Required['value']) => true, - change: (val: Required['value']) => true, + 'update:value': (val: Required['value']) => true, + change: (val: Required['value']) => true, }, slots: Object as SlotsType<{ item: (props: { item: OptionItem; selected: boolean }) => VNode[] @@ -53,9 +52,8 @@ export const List = defineComponent({ props.multiple ? [] : undefined ) - const cssVars = computed(() => ({ - '--t-list-accent-color': colors.value.primary[500], - '--t-list-ring-color': colors.value.primary[500], + const cssVars = computed(() => ({ + '--t-itemList-accent-color': colors.value.primary[500], })) const itemClickHandler = (item: OptionItem) => { @@ -84,8 +82,8 @@ export const List = defineComponent({ class="w-full overflow-auto rounded-md bg-white py-1 text-sm shadow-md ring-1 ring-black ring-opacity-5 focus:outline-none " tabindex="-1" > - {props.options.length > 0 ? ( - props.options.map(item => + {props.items.length > 0 ? ( + props.items.map(item => slots.item ? ( slots.item({ item, selected: isSelected(item) }) ) : ( @@ -95,8 +93,8 @@ export const List = defineComponent({ item.disabled ? 'font-normal text-gray-400' : isSelected(item) - ? 'cursor-pointer font-semibold hover:text-white hover:bg-[--t-list-accent-color]' - : 'cursor-pointer font-normal text-gray-700 hover:text-white hover:bg-[--t-list-accent-color]', + ? 'cursor-pointer font-semibold hover:text-white hover:bg-[--t-itemList-accent-color]' + : 'cursor-pointer font-normal text-gray-700 hover:text-white hover:bg-[--t-itemList-accent-color]', ]} onClick={() => itemClickHandler(item)} > diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx new file mode 100644 index 00000000..e69de29b diff --git a/src/components/Select/SelectList.tsx b/src/components/Select/SelectList.tsx deleted file mode 100644 index 4081f903..00000000 --- a/src/components/Select/SelectList.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { - computed, - defineComponent, - type ExtractPropTypes, - type ExtractPublicPropTypes, - type PropType, - ref, - type SlotsType, - type VNode, -} from 'vue' - -import { useTheme } from '@/theme' - -const props = { - value: null, - checked: Boolean, -} - -export type SlectListProps = ExtractPropTypes - -export type SlectListPublicProps = ExtractPublicPropTypes - -export type SlectListCssVars = { - '--t-btn-text-color': string - '--t-btn-border-color': string - '--t-btn-bg': string - - '--t-btn-text-color-hover': string - '--t-btn-border-color-hover': string - '--t-btn-bg-hover': string - - '--t-btn-ring-color': string -} - -export const SlectList = defineComponent({ - name: 'TSlectList', - props, - slots: Object as SlotsType<{ - default: () => VNode - }>, - setup(props, { slots, emit }) { - const { colors } = useTheme() - - const { cssVars, cls } = useStyle(() => { - return { - ...props, - } - }) - - const hasIcon = computed(() => !!slots.icon || props.loading) - const onClick = (e: MouseEvent) => { - if (!props.disabled) { - emit('click', e) - } - } - return () => ( -
    -
  • - Wade Cooper - - - - -
  • -
- ) - }, -}) diff --git a/src/components/Select/index.tsx b/src/components/Select/index.tsx index 0f5ce301..138b238b 100644 --- a/src/components/Select/index.tsx +++ b/src/components/Select/index.tsx @@ -17,7 +17,7 @@ import { useTheme } from '@/theme' import { type OptionItem, type OptionValue, toMultipleVal } from '@/utils/option' import { SelectorIcon } from '../Icon' -import { List } from '../List' +import { ItemList } from '../List/ItemList' import { Popper } from '../Popper' const props = { @@ -87,7 +87,12 @@ export const Select = defineComponent({ ), content: () => ( - + ), }} diff --git a/src/theme/index.ts b/src/theme/index.ts index c037495f..6d372739 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -1,8 +1,10 @@ import { computed, inject, ref } from 'vue' import { useConfig } from '@/components/ConfigProvider' -import { type AliasColorMap, COLORS, type Color, type ColorAlias, type ColorKey, type ColorMap } from './colors' -export { type SizeType, type SpaceType, getSpace } from './space' + +import { type AliasColorMap, type Color, type ColorAlias, type ColorKey, type ColorMap, COLORS } from './colors' + +export { getSpace, type SizeType, type SpaceType } from './space' export type { Color, ColorKey, ColorMap } export { COLORS } diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 00000000..b551f1b7 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,3 @@ +export type Fn = (...args: any[]) => any + +export type Flat = T extends Fn ? T : T extends object ? { [K in keyof T]: T[K] } : T diff --git a/src/utils/style.ts b/src/utils/style.ts index e69de29b..f09c32f4 100644 --- a/src/utils/style.ts +++ b/src/utils/style.ts @@ -0,0 +1,20 @@ +import { computed, type MaybeRefOrGetter, toValue } from 'vue' + +import type { Flat } from '@/types' + +type CssVars = {}> = { + [K in keyof T as `--${N}-${string & K}`]: T[K] +} + +export function createCssVar>(name: N, cssVars: T) { + const result = Object.entries(cssVars).reduce((acc, [key, value]) => { + // @ts-ignore + acc[`--${name}-${key}`] = value + return acc + }, {} as Flat>) + return result +} + +export function useCssVar>(name: N, getter: MaybeRefOrGetter) { + return computed(() => createCssVar(name, toValue(getter))) +} diff --git a/tsconfig.json b/tsconfig.json index d21f1686..044b1181 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "@jaskang/config/tsconfig.web.json", - "include": ["env.d.ts", "src/**/*", "src/**/*.vue","docs/.vitepress/config.ts", "docs/.vitepress/theme/**/*"], + "include": ["env.d.ts", "src/**/*", "docs/.vitepress/config.ts", "docs/.vitepress/theme/**/*"], "compilerOptions": { "outDir": "dist_types", "composite": true,