From 2729812a3c8eec04399ffb00ec59009b706f13c7 Mon Sep 17 00:00:00 2001 From: HoshinoSuzumi Date: Mon, 25 Nov 2024 22:35:39 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(toggle):=20new=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/content/2.components/toggle.md | 69 ++++++++++++++++ src/runtime/components/forms/Toggle.vue | 100 ++++++++++++++++++++++++ src/runtime/types/index.ts | 1 + src/runtime/types/toggle.ts | 9 +++ src/runtime/ui.config/forms/toggle.ts | 53 +++++++++++++ src/runtime/ui.config/index.ts | 1 + src/runtime/utils/colors.ts | 10 +++ 7 files changed, 243 insertions(+) create mode 100644 docs/content/2.components/toggle.md create mode 100644 src/runtime/components/forms/Toggle.vue create mode 100644 src/runtime/types/toggle.ts create mode 100644 src/runtime/ui.config/forms/toggle.ts diff --git a/docs/content/2.components/toggle.md b/docs/content/2.components/toggle.md new file mode 100644 index 0000000..f6ab33d --- /dev/null +++ b/docs/content/2.components/toggle.md @@ -0,0 +1,69 @@ +--- +description: Get a dynamic switch component +since: 1.3.4 +--- + +## Usage + +Use the `v-model` directive to make it reactive. + +::ComponentPreview +--- +privateProps: + v-model: checked +--- +:: + +### Colors + +The `color` prop affects the background color of the toggle. + +::ComponentPreview +--- +privateProps: + modelValue: true +props: + color: primary +--- +:: + +### Sizes + +The default size of the toggle is `md`. + +::ComponentPreview +--- +props: + size: md +--- +:: + +### Rounded + +You can make the toggle rounded by setting the `rounded` prop to `true`. + +::ComponentPreview +--- +props: + rounded: true + size: md +--- +:: + +### Disabled + +Disable it. + +::ComponentPreview +--- +privateProps: + modelValue: true +props: + disabled: true +--- +:: + +## Config + +::ComponentDefaults +:: diff --git a/src/runtime/components/forms/Toggle.vue b/src/runtime/components/forms/Toggle.vue new file mode 100644 index 0000000..5805618 --- /dev/null +++ b/src/runtime/components/forms/Toggle.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/runtime/types/index.ts b/src/runtime/types/index.ts index 5353ccb..29b38fb 100644 --- a/src/runtime/types/index.ts +++ b/src/runtime/types/index.ts @@ -2,5 +2,6 @@ export * from './button' export * from './message' export * from './input' export * from './kbd' +export * from './toggle' export * from './utils' diff --git a/src/runtime/types/toggle.ts b/src/runtime/types/toggle.ts new file mode 100644 index 0000000..871a33a --- /dev/null +++ b/src/runtime/types/toggle.ts @@ -0,0 +1,9 @@ +import type { AppConfig } from '@nuxt/schema' +import type { toggle } from '../ui.config' +import type { ExtractDeepKey } from './utils' +import type colors from '#ray-colors' + +export type ToggleSize = + | keyof typeof toggle.size + | ExtractDeepKey +export type ToggleColor = (typeof colors)[number] diff --git a/src/runtime/ui.config/forms/toggle.ts b/src/runtime/ui.config/forms/toggle.ts new file mode 100644 index 0000000..55355bf --- /dev/null +++ b/src/runtime/ui.config/forms/toggle.ts @@ -0,0 +1,53 @@ +export default { + base: 'relative inline-flex flex-shrink-0 shadow-inner disabled:cursor-not-allowed disabled:opacity-50 focus:outline-none transition ease-in-out duration-200 group', + rounded: 'rounded-md', + ring: 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-900', + active: 'bg-{color}-500 dark:bg-{color}-400', + inactive: 'bg-gray-100 dark:bg-gray-800', + size: { + '2xs': 'h-3 w-5', + 'xs': 'h-3.5 w-6', + 'sm': 'h-4 w-7', + 'md': 'h-5 w-9', + 'lg': 'h-6 w-11', + 'xl': 'h-7 w-[3.25rem]', + '2xl': 'h-8 w-[3.75rem]', + }, + bullet: { + base: 'relative inline-block m-0.5 bg-white dark:bg-gray-900 pointer-events-none transform transition ease-in-out duration-300 group-active:scale-90 group-disabled:scale-100', + shadow: 'shadow', + rounded: 'rounded', + size: { + '2xs': 'h-2 w-2', + 'xs': 'h-2.5 w-2.5', + 'sm': 'h-3 w-3', + 'md': 'h-4 w-4', + 'lg': 'h-5 w-5', + 'xl': 'h-6 w-6', + '2xl': 'h-7 w-7', + }, + translate: { + '2xs': 'group-active:translate-x-1', + 'xs': 'group-active:translate-x-1.5', + 'sm': 'group-active:translate-x-2', + 'md': 'group-active:translate-x-2.5', + 'lg': 'group-active:translate-x-3', + 'xl': 'group-active:translate-x-3.5', + '2xl': 'group-active:translate-x-4', + }, + active: { + '2xs': 'translate-x-2', + 'xs': 'translate-x-2.5', + 'sm': 'translate-x-3', + 'md': 'translate-x-4', + 'lg': 'translate-x-5', + 'xl': 'translate-x-6', + '2xl': 'translate-x-7', + }, + inactive: 'translate-x-0', + }, + default: { + size: 'md', + color: 'primary', + }, +} diff --git a/src/runtime/ui.config/index.ts b/src/runtime/ui.config/index.ts index 17cbfe3..da5b789 100644 --- a/src/runtime/ui.config/index.ts +++ b/src/runtime/ui.config/index.ts @@ -7,6 +7,7 @@ export { default as kbd } from './elements/kbd' // forms export { default as input } from './forms/input' +export { default as toggle } from './forms/toggle' // overlays export { default as message } from './overlays/message' diff --git a/src/runtime/utils/colors.ts b/src/runtime/utils/colors.ts index 8ceb802..d27ea78 100644 --- a/src/runtime/utils/colors.ts +++ b/src/runtime/utils/colors.ts @@ -179,6 +179,16 @@ const safelistForComponent: Record< variants: ['focus'], }, ], + toggle: colorsToRegex => [ + { + pattern: RegExp(`^ring-(${colorsToRegex})-400$`), + variants: ['focus-visible', 'dark'], + }, + { + pattern: RegExp(`^ring-(${colorsToRegex})-500$`), + variants: ['focus-visible'], + }, + ], } export const generateSafelist = (colors: string[], globalColors: string[]) => {