@nuxt/ui 3.0.0-alpha.6 → 3.0.0-alpha.7

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.
Files changed (41) hide show
  1. package/dist/module.d.mts +6 -6
  2. package/dist/module.d.ts +6 -6
  3. package/dist/module.json +1 -1
  4. package/dist/module.mjs +391 -257
  5. package/dist/runtime/components/Accordion.vue +13 -5
  6. package/dist/runtime/components/Breadcrumb.vue +14 -6
  7. package/dist/runtime/components/Button.vue +4 -2
  8. package/dist/runtime/components/Carousel.vue +6 -6
  9. package/dist/runtime/components/Checkbox.vue +3 -6
  10. package/dist/runtime/components/CommandPalette.vue +25 -16
  11. package/dist/runtime/components/ContextMenu.vue +31 -7
  12. package/dist/runtime/components/ContextMenuContent.vue +36 -8
  13. package/dist/runtime/components/DropdownMenu.vue +31 -7
  14. package/dist/runtime/components/DropdownMenuContent.vue +38 -8
  15. package/dist/runtime/components/Form.vue +3 -1
  16. package/dist/runtime/components/Input.vue +6 -4
  17. package/dist/runtime/components/InputMenu.vue +40 -24
  18. package/dist/runtime/components/LinkBase.vue +4 -2
  19. package/dist/runtime/components/NavigationMenu.vue +78 -41
  20. package/dist/runtime/components/RadioGroup.vue +22 -3
  21. package/dist/runtime/components/Select.vue +22 -10
  22. package/dist/runtime/components/SelectMenu.vue +43 -31
  23. package/dist/runtime/components/Table.vue +232 -0
  24. package/dist/runtime/components/Tabs.vue +15 -7
  25. package/dist/runtime/components/Toaster.vue +1 -1
  26. package/dist/runtime/composables/defineShortcuts.js +1 -1
  27. package/dist/runtime/composables/useComponentIcons.d.ts +3 -0
  28. package/dist/runtime/composables/useModal.d.ts +1 -1
  29. package/dist/runtime/composables/useSlideover.d.ts +1 -1
  30. package/dist/runtime/index.css +1 -1
  31. package/dist/runtime/keyframes.css +1 -0
  32. package/dist/runtime/types/form.d.ts +2 -1
  33. package/dist/runtime/types/index.d.ts +1 -0
  34. package/dist/runtime/types/index.js +1 -0
  35. package/dist/runtime/utils/form.d.ts +3 -0
  36. package/dist/runtime/utils/form.js +14 -0
  37. package/dist/runtime/utils/index.d.ts +1 -0
  38. package/dist/runtime/utils/index.js +3 -0
  39. package/package.json +15 -12
  40. package/dist/runtime/types/component.d.ts +0 -17
  41. package/dist/runtime/types/component.js +0 -0
@@ -1,7 +1,7 @@
1
1
  <!-- eslint-disable vue/block-tag-newline -->
2
2
  <script lang="ts">
3
3
  import { tv, type VariantProps } from 'tailwind-variants'
4
- import type { TabsRootProps, TabsRootEmits, TabsContentProps, TabsTriggerProps } from 'radix-vue'
4
+ import type { TabsRootProps, TabsRootEmits, TabsContentProps } from 'radix-vue'
5
5
  import type { AppConfig } from '@nuxt/schema'
6
6
  import _appConfig from '#build/app.config'
7
7
  import theme from '#build/ui/tabs'
@@ -12,7 +12,7 @@ const appConfig = _appConfig as AppConfig & { ui: { tabs: Partial<typeof theme>
12
12
 
13
13
  const tabs = tv({ extend: tv(theme), ...(appConfig.ui?.tabs || {}) })
14
14
 
15
- export interface TabsItem extends Pick<TabsTriggerProps, 'disabled'> {
15
+ export interface TabsItem {
16
16
  label?: string
17
17
  icon?: string
18
18
  avatar?: AvatarProps
@@ -20,6 +20,7 @@ export interface TabsItem extends Pick<TabsTriggerProps, 'disabled'> {
20
20
  content?: string
21
21
  /** A unique value for the tab item. Defaults to the index. */
22
22
  value?: string | number
23
+ disabled?: boolean
23
24
  }
24
25
 
25
26
  type TabsVariants = VariantProps<typeof tabs>
@@ -44,6 +45,11 @@ export interface TabsProps<T> extends Pick<TabsRootProps<string | number>, 'defa
44
45
  * @defaultValue true
45
46
  */
46
47
  content?: boolean | Omit<TabsContentProps, 'as' | 'asChild' | 'value'>
48
+ /**
49
+ * The key used to get the label from the item.
50
+ * @defaultValue 'label'
51
+ */
52
+ labelKey?: string
47
53
  class?: any
48
54
  ui?: PartialString<typeof tabs.slots>
49
55
  }
@@ -66,11 +72,13 @@ import { computed, toRef } from 'vue'
66
72
  import { defu } from 'defu'
67
73
  import { TabsRoot, TabsList, TabsIndicator, TabsTrigger, TabsContent, useForwardPropsEmits } from 'radix-vue'
68
74
  import { reactivePick } from '@vueuse/core'
75
+ import { get } from '../utils'
69
76
 
70
77
  const props = withDefaults(defineProps<TabsProps<T>>(), {
71
78
  content: true,
72
79
  defaultValue: '0',
73
- orientation: 'horizontal'
80
+ orientation: 'horizontal',
81
+ labelKey: 'label'
74
82
  })
75
83
  const emits = defineEmits<TabsEmits>()
76
84
  const slots = defineSlots<TabsSlots<T>>()
@@ -93,12 +101,12 @@ const ui = computed(() => tabs({
93
101
 
94
102
  <TabsTrigger v-for="(item, index) of items" :key="index" :value="item.value || String(index)" :disabled="item.disabled" :class="ui.trigger({ class: props.ui?.trigger })">
95
103
  <slot name="leading" :item="item" :index="index">
96
- <UAvatar v-if="item.avatar" :size="((props.ui?.leadingAvatarSize || ui.leadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })" />
97
- <UIcon v-else-if="item.icon" :name="item.icon" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
104
+ <UIcon v-if="item.icon" :name="item.icon" :class="ui.leadingIcon({ class: props.ui?.leadingIcon })" />
105
+ <UAvatar v-else-if="item.avatar" :size="((props.ui?.leadingAvatarSize || ui.leadingAvatarSize()) as AvatarProps['size'])" v-bind="item.avatar" :class="ui.leadingAvatar({ class: props.ui?.leadingAvatar })" />
98
106
  </slot>
99
107
 
100
- <span v-if="item.label || !!slots.default" :class="ui.label({ class: props.ui?.label })">
101
- <slot :item="item" :index="index">{{ item.label }}</slot>
108
+ <span v-if="get(item, props.labelKey as string) || !!slots.default" :class="ui.label({ class: props.ui?.label })">
109
+ <slot :item="item" :index="index">{{ get(item, props.labelKey as string) }}</slot>
102
110
  </span>
103
111
 
104
112
  <slot name="trailing" :item="item" :index="index" />
@@ -32,8 +32,8 @@ import { ref, computed } from 'vue'
32
32
  import { ToastProvider, ToastViewport, useForwardProps } from 'radix-vue'
33
33
  import { reactivePick } from '@vueuse/core'
34
34
  import { useToast } from '../composables/useToast'
35
- import UToast from './Toast.vue'
36
35
  import { omit } from '../utils'
36
+ import UToast from './Toast.vue'
37
37
 
38
38
  const props = withDefaults(defineProps<ToasterProps>(), {
39
39
  expand: true,
@@ -9,7 +9,7 @@ export function extractShortcuts(items) {
9
9
  items2.forEach((item) => {
10
10
  if (item.kbds?.length && (item.select || item.click)) {
11
11
  const shortcutKey = item.kbds.join("_");
12
- shortcuts[shortcutKey] = item.select || item.click;
12
+ shortcuts[shortcutKey] = item.onSelect || item.onClick;
13
13
  }
14
14
  if (item.children) {
15
15
  traverse(item.children.flat());
@@ -1,7 +1,10 @@
1
1
  import { type MaybeRefOrGetter } from 'vue';
2
+ import type { AvatarProps } from '../types';
2
3
  export interface UseComponentIconsProps {
3
4
  /** Display an icon based on the `leading` and `trailing` props. */
4
5
  icon?: string;
6
+ /** Display an avatar on the left side. */
7
+ avatar?: AvatarProps;
5
8
  /** When `true`, the icon will be displayed on the left side. */
6
9
  leading?: boolean;
7
10
  /** Display an icon on the left side. */
@@ -1,6 +1,6 @@
1
1
  import type { ShallowRef, Component, InjectionKey } from 'vue';
2
+ import type { ComponentProps } from 'vue-component-type-helpers';
2
3
  import type { ModalProps } from '../types';
3
- import type { ComponentProps } from '../types/component';
4
4
  export interface ModalState {
5
5
  component: Component | string;
6
6
  props: ModalProps;
@@ -1,6 +1,6 @@
1
1
  import type { ShallowRef, Component, InjectionKey } from 'vue';
2
+ import type { ComponentProps } from 'vue-component-type-helpers';
2
3
  import type { SlideoverProps } from '../types';
3
- import type { ComponentProps } from '../types/component';
4
4
  export interface SlideoverState {
5
5
  component: Component | string;
6
6
  props: SlideoverProps;
@@ -1 +1 @@
1
- @theme{--spacing-4_5:1.125rem}@variant dark (&:where(.dark, .dark *));@layer base{body{@apply antialiased font-sans text-[--ui-text] bg-[--ui-bg]}:root{color-scheme:light;--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-bg:var(--color-white);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900);--ui-radius:var(--radius)}.dark{color-scheme:dark;--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:var(--color-white);--ui-bg:var(--ui-color-neutral-900);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:var(--color-white);--ui-border:var(--ui-color-neutral-800);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:var(--color-white)}@keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}@keyframes toast-collapsed-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--before) - var(--height))*var(--gap))) scale(var(--scale))}}@keyframes toast-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--offset) - var(--height))*var(--translate-factor)))}}@keyframes toast-slide-left{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(-100%) translateY(var(--translate))}}@keyframes toast-slide-right{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(100%) translateY(var(--translate))}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes slide-in-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes slide-out-to-top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes slide-in-from-right{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out-to-right{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes slide-in-from-left{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slide-out-to-left{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-from-top-and-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-top-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes slide-in-from-right-and-fade{0%{opacity:0;transform:translateX(4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-right-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(4px)}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes slide-in-from-left-and-fade{0%{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-left-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-4px)}}@keyframes enter-from-right{0%{opacity:0;transform:translateX(200px)}to{opacity:1;transform:translateX(0)}}@keyframes enter-from-left{0%{opacity:0;transform:translateX(-200px)}to{opacity:1;transform:translateX(0)}}@keyframes exit-to-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(200px)}}@keyframes exit-to-left{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-200px)}}@keyframes carousel{0%,to{width:50%}0%{transform:translateX(-100%)}to{transform:translateX(200%)}}@keyframes carousel-vertical{0%,to{height:50%}0%{transform:translateY(-100%)}to{transform:translateY(200%)}}@keyframes carousel-inverse{0%,to{width:50%}0%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes carousel-inverse-vertical{0%,to{height:50%}0%{transform:translateY(200%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:50%}0%,to{transform:translateX(-25%)}50%{transform:translateX(125%)}}@keyframes swing-vertical{0%,to{height:50%}0%,to{transform:translateY(-25%)}50%{transform:translateY(125%)}}@keyframes elastic{0%,to{margin-left:25%;width:50%}50%{margin-left:5%;width:90%}}@keyframes elastic-vertical{0%,to{height:50%;margin-top:25%}50%{height:90%;margin-top:5%}}}
1
+ @import "./keyframes.css";@theme default{--spacing-4_5:1.125rem}@variant dark (&:where(.dark, .dark *));@layer base{body{@apply antialiased text-[var(--ui-text)] bg-[var(--ui-bg)]}:root{color-scheme:light;--ui-text-dimmed:var(--ui-color-neutral-400);--ui-text-muted:var(--ui-color-neutral-500);--ui-text-toned:var(--ui-color-neutral-600);--ui-text:var(--ui-color-neutral-700);--ui-text-highlighted:var(--ui-color-neutral-900);--ui-bg:var(--color-white);--ui-bg-elevated:var(--ui-color-neutral-100);--ui-bg-accented:var(--ui-color-neutral-200);--ui-bg-inverted:var(--ui-color-neutral-900);--ui-border:var(--ui-color-neutral-200);--ui-border-accented:var(--ui-color-neutral-300);--ui-border-inverted:var(--ui-color-neutral-900);--ui-radius:var(--radius)}.dark{color-scheme:dark;--ui-text-dimmed:var(--ui-color-neutral-500);--ui-text-muted:var(--ui-color-neutral-400);--ui-text-toned:var(--ui-color-neutral-300);--ui-text:var(--ui-color-neutral-200);--ui-text-highlighted:var(--color-white);--ui-bg:var(--ui-color-neutral-900);--ui-bg-elevated:var(--ui-color-neutral-800);--ui-bg-accented:var(--ui-color-neutral-700);--ui-bg-inverted:var(--color-white);--ui-border:var(--ui-color-neutral-800);--ui-border-accented:var(--ui-color-neutral-700);--ui-border-inverted:var(--color-white)}}
@@ -0,0 +1 @@
1
+ @keyframes accordion-up{0%{height:var(--radix-accordion-content-height)}to{height:0}}@keyframes accordion-down{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}@keyframes toast-collapsed-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--before) - var(--height))*var(--gap))) scale(var(--scale))}}@keyframes toast-closed{0%{transform:var(--transform)}to{transform:translateY(calc((var(--offset) - var(--height))*var(--translate-factor)))}}@keyframes toast-slide-left{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(-100%) translateY(var(--translate))}}@keyframes toast-slide-right{0%{transform:translateX(0) translateY(var(--translate))}to{transform:translateX(100%) translateY(var(--translate))}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes scale-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes scale-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes slide-in-from-top{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes slide-out-to-top{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes slide-in-from-right{0%{transform:translateX(100%)}to{transform:translateX(0)}}@keyframes slide-out-to-right{0%{transform:translateX(0)}to{transform:translateX(100%)}}@keyframes slide-in-from-bottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes slide-out-to-bottom{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes slide-in-from-left{0%{transform:translateX(-100%)}to{transform:translateX(0)}}@keyframes slide-out-to-left{0%{transform:translateX(0)}to{transform:translateX(-100%)}}@keyframes slide-in-from-top-and-fade{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-top-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-4px)}}@keyframes slide-in-from-right-and-fade{0%{opacity:0;transform:translateX(4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-right-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(4px)}}@keyframes slide-in-from-bottom-and-fade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes slide-out-to-bottom-and-fade{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}@keyframes slide-in-from-left-and-fade{0%{opacity:0;transform:translateX(-4px)}to{opacity:1;transform:translateX(0)}}@keyframes slide-out-to-left-and-fade{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-4px)}}@keyframes enter-from-right{0%{opacity:0;transform:translateX(200px)}to{opacity:1;transform:translateX(0)}}@keyframes enter-from-left{0%{opacity:0;transform:translateX(-200px)}to{opacity:1;transform:translateX(0)}}@keyframes exit-to-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(200px)}}@keyframes exit-to-left{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-200px)}}@keyframes carousel{0%,to{width:50%}0%{transform:translateX(-100%)}to{transform:translateX(200%)}}@keyframes carousel-vertical{0%,to{height:50%}0%{transform:translateY(-100%)}to{transform:translateY(200%)}}@keyframes carousel-inverse{0%,to{width:50%}0%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes carousel-inverse-vertical{0%,to{height:50%}0%{transform:translateY(200%)}to{transform:translateY(-100%)}}@keyframes swing{0%,to{width:50%}0%,to{transform:translateX(-25%)}50%{transform:translateX(125%)}}@keyframes swing-vertical{0%,to{height:50%}0%,to{transform:translateY(-25%)}50%{transform:translateY(125%)}}@keyframes elastic{0%,to{margin-left:25%;width:50%}50%{margin-left:5%;width:90%}}@keyframes elastic-vertical{0%,to{height:50%;margin-top:25%}50%{height:90%;margin-top:5%}}
@@ -5,6 +5,7 @@ import type { Schema as JoiSchema } from 'joi';
5
5
  import type { ObjectSchema as YupObjectSchema } from 'yup';
6
6
  import type { GenericSchema as ValibotSchema, GenericSchemaAsync as ValibotSchemaAsync, SafeParser as ValibotSafeParser, SafeParserAsync as ValibotSafeParserAsync } from 'valibot';
7
7
  import type { GetObjectField } from './utils';
8
+ import type { Struct as SuperstructSchema } from 'superstruct';
8
9
  export interface Form<T> {
9
10
  validate(opts?: {
10
11
  name: string | string[];
@@ -18,7 +19,7 @@ export interface Form<T> {
18
19
  submit(): Promise<void>;
19
20
  disabled: ComputedRef<boolean>;
20
21
  }
21
- export type FormSchema<T extends Record<string, any>> = ZodSchema | YupObjectSchema<T> | ValibotSchema | ValibotSchemaAsync | ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any> | JoiSchema<T> | StandardSchema;
22
+ export type FormSchema<T extends Record<string, any>> = ZodSchema | YupObjectSchema<T> | ValibotSchema | ValibotSchemaAsync | ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any> | JoiSchema<T> | SuperstructSchema<any, any> | StandardSchema;
22
23
  export type FormInputEvents = 'input' | 'blur' | 'change';
23
24
  export interface FormError<P extends string = string> {
24
25
  name: P;
@@ -35,6 +35,7 @@ export * from '../components/Skeleton.vue';
35
35
  export * from '../components/Slideover.vue';
36
36
  export * from '../components/Slider.vue';
37
37
  export * from '../components/Switch.vue';
38
+ export * from '../components/Table.vue';
38
39
  export * from '../components/Tabs.vue';
39
40
  export * from '../components/Textarea.vue';
40
41
  export * from '../components/Toast.vue';
@@ -35,6 +35,7 @@ export * from "../components/Skeleton.vue";
35
35
  export * from "../components/Slideover.vue";
36
36
  export * from "../components/Slider.vue";
37
37
  export * from "../components/Switch.vue";
38
+ export * from "../components/Table.vue";
38
39
  export * from "../components/Tabs.vue";
39
40
  export * from "../components/Textarea.vue";
40
41
  export * from "../components/Toast.vue";
@@ -3,10 +3,12 @@ import type { ZodSchema } from 'zod';
3
3
  import type { ValidationError as JoiError, Schema as JoiSchema } from 'joi';
4
4
  import type { ObjectSchema as YupObjectSchema, ValidationError as YupError } from 'yup';
5
5
  import type { GenericSchema as ValibotSchema, GenericSchemaAsync as ValibotSchemaAsync, SafeParser as ValibotSafeParser, SafeParserAsync as ValibotSafeParserAsync } from 'valibot';
6
+ import type { Struct } from 'superstruct';
6
7
  import type { FormError } from '../types/form';
7
8
  export declare function isYupSchema(schema: any): schema is YupObjectSchema<any>;
8
9
  export declare function isYupError(error: any): error is YupError;
9
10
  export declare function getYupErrors(state: any, schema: YupObjectSchema<any>): Promise<FormError[]>;
11
+ export declare function isSuperStructSchema(schema: any): schema is Struct<any, any>;
10
12
  export declare function isZodSchema(schema: any): schema is ZodSchema;
11
13
  export declare function getZodErrors(state: any, schema: ZodSchema): Promise<FormError[]>;
12
14
  export declare function isJoiSchema(schema: any): schema is JoiSchema;
@@ -16,3 +18,4 @@ export declare function isValibotSchema(schema: any): schema is ValibotSchema |
16
18
  export declare function getValibotErrors(state: any, schema: ValibotSchema | ValibotSchemaAsync | ValibotSafeParser<any, any> | ValibotSafeParserAsync<any, any>): Promise<FormError[]>;
17
19
  export declare function isStandardSchema(schema: any): schema is StandardSchema;
18
20
  export declare function getStandardErrors(state: any, schema: StandardSchema): Promise<FormError[]>;
21
+ export declare function getSuperStructErrors(state: any, schema: Struct<any, any>): Promise<FormError[]>;
@@ -19,6 +19,9 @@ export async function getYupErrors(state, schema) {
19
19
  }
20
20
  }
21
21
  }
22
+ export function isSuperStructSchema(schema) {
23
+ return "schema" in schema && typeof schema.coercer === "function" && typeof schema.validator === "function" && typeof schema.refiner === "function";
24
+ }
22
25
  export function isZodSchema(schema) {
23
26
  return schema.parse !== void 0;
24
27
  }
@@ -74,3 +77,14 @@ export async function getStandardErrors(state, schema) {
74
77
  message: issue.message
75
78
  })) || [];
76
79
  }
80
+ export async function getSuperStructErrors(state, schema) {
81
+ const [err] = schema.validate(state);
82
+ if (err) {
83
+ const errors = err.failures();
84
+ return errors.map((error) => ({
85
+ message: error.message,
86
+ name: error.path.join(".")
87
+ }));
88
+ }
89
+ return [];
90
+ }
@@ -3,3 +3,4 @@ export declare function omit<Data extends object, Keys extends keyof Data>(data:
3
3
  export declare function get(object: Record<string, any> | undefined, path: (string | number)[] | string, defaultValue?: any): any;
4
4
  export declare function set(object: Record<string, any>, path: (string | number)[] | string, value: any): void;
5
5
  export declare function looseToNumber(val: any): any;
6
+ export declare function escapeRegExp(string: string): string;
@@ -45,3 +45,6 @@ export function looseToNumber(val) {
45
45
  const n = Number.parseFloat(val);
46
46
  return Number.isNaN(n) ? val : n;
47
47
  }
48
+ export function escapeRegExp(string) {
49
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
50
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@nuxt/ui",
3
3
  "description": "A UI Library for Modern Web Apps, powered by Vue & Tailwind CSS.",
4
- "version": "3.0.0-alpha.6",
5
- "packageManager": "pnpm@9.12.1",
4
+ "version": "3.0.0-alpha.7",
5
+ "packageManager": "pnpm@9.12.2",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/nuxt/ui.git"
@@ -38,20 +38,22 @@
38
38
  "docs": "DEV=true nuxi dev docs",
39
39
  "docs:build": "nuxi build docs",
40
40
  "docs:prepare": "nuxt-component-meta docs",
41
+ "docs:typecheck": "nuxi typecheck docs",
41
42
  "lint": "eslint .",
42
43
  "lint:fix": "eslint . --fix",
43
- "typecheck": "vue-tsc --noEmit && nuxi typecheck playground && nuxi typecheck docs",
44
+ "typecheck": "vue-tsc --noEmit && nuxi typecheck playground",
44
45
  "test": "vitest",
45
46
  "release": "release-it --preRelease=alpha --npm.tag=next"
46
47
  },
47
48
  "dependencies": {
48
- "@nuxt/fonts": "^0.10.0",
49
- "@nuxt/icon": "^1.5.5",
49
+ "@nuxt/fonts": "^0.10.2",
50
+ "@nuxt/icon": "^1.5.6",
50
51
  "@nuxt/kit": "^3.13.2",
51
52
  "@nuxt/schema": "^3.13.2",
52
53
  "@nuxtjs/color-mode": "^3.5.1",
53
- "@tailwindcss/postcss": "4.0.0-alpha.24",
54
- "@tailwindcss/vite": "4.0.0-alpha.24",
54
+ "@tailwindcss/postcss": "4.0.0-alpha.29",
55
+ "@tailwindcss/vite": "4.0.0-alpha.29",
56
+ "@tanstack/vue-table": "^8.20.5",
55
57
  "@vueuse/core": "^11.1.0",
56
58
  "@vueuse/integrations": "^11.1.0",
57
59
  "defu": "^6.1.4",
@@ -67,14 +69,14 @@
67
69
  "radix-vue": "^1.9.7",
68
70
  "scule": "^1.3.0",
69
71
  "tailwind-variants": "^0.2.1",
70
- "tailwindcss": "4.0.0-alpha.24",
72
+ "tailwindcss": "4.0.0-alpha.29",
71
73
  "vaul-vue": "^0.2.0"
72
74
  },
73
75
  "devDependencies": {
74
76
  "@nuxt/eslint-config": "^0.5.7",
75
77
  "@nuxt/module-builder": "^0.8.4",
76
- "@nuxt/test-utils": "^3.14.3",
77
- "@release-it/conventional-changelog": "^8.0.2",
78
+ "@nuxt/test-utils": "^3.14.4",
79
+ "@release-it/conventional-changelog": "^9.0.1",
78
80
  "@standard-schema/spec": "1.0.0-beta.1",
79
81
  "@vue/test-utils": "^2.4.6",
80
82
  "embla-carousel": "^8.3.0",
@@ -82,9 +84,10 @@
82
84
  "happy-dom": "^15.7.4",
83
85
  "joi": "^17.13.3",
84
86
  "nuxt": "^3.13.2",
85
- "release-it": "^17.7.0",
87
+ "release-it": "^17.10.0",
88
+ "superstruct": "^2.0.2",
86
89
  "valibot": "^0.42.1",
87
- "vitest": "^2.1.2",
90
+ "vitest": "^2.1.3",
88
91
  "vitest-environment-nuxt": "^1.0.1",
89
92
  "vue-tsc": "^2.1.6",
90
93
  "yup": "^1.4.0",
@@ -1,17 +0,0 @@
1
- export type ComponentProps<T> = T extends new () => {
2
- $props: infer P;
3
- } ? NonNullable<P> : T extends (props: infer P, ...args: any) => any ? P : Record<string, never>;
4
- export type ComponentSlots<T> = T extends new () => {
5
- $slots: infer S;
6
- } ? NonNullable<S> : T extends (props: any, ctx: {
7
- slots: infer S;
8
- attrs: any;
9
- emit: any;
10
- }, ...args: any) => any ? NonNullable<S> : Record<string, never>;
11
- export type ComponentEmit<T> = T extends new () => {
12
- $emit: infer E;
13
- } ? NonNullable<E> : T extends (props: any, ctx: {
14
- slots: any;
15
- attrs: any;
16
- emit: infer E;
17
- }, ...args: any) => any ? NonNullable<E> : Record<string, never>;
File without changes