From 1bfe244c27feef0208a1ae0b917acbc6c69b75b4 Mon Sep 17 00:00:00 2001 From: Mees Date: Thu, 24 Apr 2025 13:49:59 +0200 Subject: [PATCH 1/9] feat: time-field --- playground-vue/src/app.vue | 1 + playground/app/app.vue | 1 + .../app/pages/components/time-field.vue | 135 ++++++++++++ src/runtime/components/TimeField.vue | 201 ++++++++++++++++++ src/runtime/types/index.ts | 1 + src/theme/index.ts | 1 + src/theme/time-field.ts | 164 ++++++++++++++ 7 files changed, 504 insertions(+) create mode 100644 playground/app/pages/components/time-field.vue create mode 100644 src/runtime/components/TimeField.vue create mode 100644 src/theme/time-field.ts diff --git a/playground-vue/src/app.vue b/playground-vue/src/app.vue index caaf932a0c..169d3517b7 100644 --- a/playground-vue/src/app.vue +++ b/playground-vue/src/app.vue @@ -63,6 +63,7 @@ const components = [ 'textarea', 'toast', 'tooltip', + 'time-field', 'tree' ] diff --git a/playground/app/app.vue b/playground/app/app.vue index 5bfd85766e..a6c522458d 100644 --- a/playground/app/app.vue +++ b/playground/app/app.vue @@ -61,6 +61,7 @@ const components = [ 'tabs', 'table', 'textarea', + 'time-field', 'toast', 'tooltip', 'tree' diff --git a/playground/app/pages/components/time-field.vue b/playground/app/pages/components/time-field.vue new file mode 100644 index 0000000000..b7cb1d1282 --- /dev/null +++ b/playground/app/pages/components/time-field.vue @@ -0,0 +1,135 @@ + + + diff --git a/src/runtime/components/TimeField.vue b/src/runtime/components/TimeField.vue new file mode 100644 index 0000000000..32ca4862d4 --- /dev/null +++ b/src/runtime/components/TimeField.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/src/runtime/types/index.ts b/src/runtime/types/index.ts index c5e73f665b..40053098ef 100644 --- a/src/runtime/types/index.ts +++ b/src/runtime/types/index.ts @@ -46,6 +46,7 @@ export * from '../components/Switch.vue' export * from '../components/Table.vue' export * from '../components/Tabs.vue' export * from '../components/Textarea.vue' +export * from '../components/TimeField.vue' export * from '../components/Toast.vue' export * from '../components/Toaster.vue' export * from '../components/Tooltip.vue' diff --git a/src/theme/index.ts b/src/theme/index.ts index 752065ec45..a7acc948c5 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -44,6 +44,7 @@ export { default as switch } from './switch' export { default as table } from './table' export { default as tabs } from './tabs' export { default as textarea } from './textarea' +export { default as timeField } from './time-field' export { default as toast } from './toast' export { default as toaster } from './toaster' export { default as tooltip } from './tooltip' diff --git a/src/theme/time-field.ts b/src/theme/time-field.ts new file mode 100644 index 0000000000..6841ce5950 --- /dev/null +++ b/src/theme/time-field.ts @@ -0,0 +1,164 @@ +import type { ModuleOptions } from '../module' +import { buttonGroupVariantWithRoot } from './button-group' + +export default (options: Required) => ({ + slots: { + root: 'relative inline-flex items-center border rounded-md', + base: ['mx-0.5 focus:outline-none focus:bg-elevated rounded focus:shadow-[0_0_0_1px] focus:shadow-black data-[placeholder]:text-dimmed', options.theme.transitions && 'transition-colors'], + leading: 'flex items-center h-full px-2', + leadingIcon: 'shrink-0 text-dimmed', + trailing: 'flex items-center h-full px-2', + trailingIcon: 'shrink-0 text-dimmed' + }, + variants: { + ...buttonGroupVariantWithRoot, + size: { + xs: { + root: 'text-xs', + base: 'py-1 text-xs', + leadingIcon: 'size-4', + trailingIcon: 'size-4' + }, + sm: { + root: 'text-xs', + base: 'py-1.5 text-xs', + leadingIcon: 'size-4', + trailingIcon: 'size-4' + }, + md: { + root: 'text-sm', + base: 'py-1.5 text-sm', + leadingIcon: 'size-5', + trailingIcon: 'size-5' + }, + lg: { + root: 'text-sm', + base: 'py-2 text-sm', + leadingIcon: 'size-5', + trailingIcon: 'size-5' + }, + xl: { + root: 'text-base', + base: 'py-2 text-base', + leadingIcon: 'size-6', + trailingIcon: 'size-6' + } + }, + variant: { + outline: { + root: 'border-accented text-highlighted bg-default data-[invalid]:ring data-[invalid]:ring-inset data-[invalid]:ring-red-500' + }, + soft: { + root: 'border-transparent text-highlighted bg-elevated/50 hover:bg-elevated focus-within:bg-elevated disabled:bg-elevated/50' + }, + subtle: { + root: 'border-accented text-highlighted bg-elevated data-[invalid]:ring data-[invalid]:ring-inset data-[invalid]:ring-red-500' + }, + ghost: { + root: 'border-transparent text-highlighted bg-transparent hover:bg-elevated focus-within:bg-elevated disabled:bg-transparent dark:disabled:bg-transparent' + }, + none: { + root: 'border-transparent text-highlighted bg-transparent' + } + }, + color: { + ...Object.fromEntries((options.theme.colors || []).map((color: string) => [color, ''])), + neutral: '' + }, + leading: { + true: '' + }, + trailing: { + true: '' + }, + loading: { + true: '' + }, + highlight: { + true: '' + } + }, + compoundVariants: [...(options.theme.colors || []).map((color: string) => ({ + color, + variant: ['outline', 'subtle'], + class: { + root: `data-[focus-within]:ring-2 data-[focus-within]:ring-inset data-[focus-within]:ring-${color}` + } + })), ...(options.theme.colors || []).map((color: string) => ({ + color, + highlight: true, + class: { + root: `ring ring-inset ring-${color}` + } + })), { + color: 'neutral', + variant: ['outline', 'subtle'], + class: { + root: 'data-[focus-within]:ring-2 data-[focus-within]:ring-inset data-[focus-within]:ring-inverted' + } + }, { + color: 'neutral', + highlight: true, + class: { + root: 'ring ring-inset ring-inverted' + } + }, { + leading: true, + size: 'xs', + class: {} + }, { + leading: true, + size: 'sm', + class: {} + }, { + leading: true, + size: 'md', + class: {} + }, { + leading: true, + size: 'lg', + class: {} + }, { + leading: true, + size: 'xl', + class: {} + }, { + trailing: true, + size: 'xs', + class: {} + }, { + trailing: true, + size: 'sm', + class: {} + }, { + trailing: true, + size: 'md', + class: {} + }, { + trailing: true, + size: 'lg', + class: {} + }, { + trailing: true, + size: 'xl', + class: {} + }, { + loading: true, + leading: true, + class: { + leadingIcon: 'animate-spin' + } + }, { + loading: true, + leading: false, + trailing: true, + class: { + trailingIcon: 'animate-spin' + } + }], + defaultVariants: { + size: 'md', + color: 'primary', + variant: 'outline' + } +}) From c7974fe261167566b9461be9aa2356263659d45e Mon Sep 17 00:00:00 2001 From: Mees Date: Thu, 24 Apr 2025 14:01:47 +0200 Subject: [PATCH 2/9] chore: eslint fixes --- .../app/pages/components/time-field.vue | 85 +++++++++++++------ src/runtime/components/TimeField.vue | 4 +- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/playground/app/pages/components/time-field.vue b/playground/app/pages/components/time-field.vue index b7cb1d1282..6bc64a3ece 100644 --- a/playground/app/pages/components/time-field.vue +++ b/playground/app/pages/components/time-field.vue @@ -1,11 +1,6 @@ + + diff --git a/playground/app/pages/components/time-field.vue b/playground/app/pages/components/time-field.vue deleted file mode 100644 index 422e315ff1..0000000000 --- a/playground/app/pages/components/time-field.vue +++ /dev/null @@ -1,171 +0,0 @@ - - - diff --git a/src/runtime/components/InputNumber.vue b/src/runtime/components/InputNumber.vue index e212122d06..73184f9e08 100644 --- a/src/runtime/components/InputNumber.vue +++ b/src/runtime/components/InputNumber.vue @@ -1,5 +1,5 @@