@nuxt/ui 3.0.2 → 3.1.0

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 (220) hide show
  1. package/.nuxt/ui/accordion.ts +25 -4
  2. package/.nuxt/ui/alert.ts +52 -31
  3. package/.nuxt/ui/avatar-group.ts +24 -3
  4. package/.nuxt/ui/avatar.ts +26 -5
  5. package/.nuxt/ui/badge.ts +56 -35
  6. package/.nuxt/ui/breadcrumb.ts +28 -7
  7. package/.nuxt/ui/button-group.ts +23 -2
  8. package/.nuxt/ui/button.ts +66 -45
  9. package/.nuxt/ui/calendar.ts +39 -18
  10. package/.nuxt/ui/card.ts +28 -7
  11. package/.nuxt/ui/carousel.ts +29 -8
  12. package/.nuxt/ui/checkbox-group.ts +82 -0
  13. package/.nuxt/ui/checkbox.ts +163 -29
  14. package/.nuxt/ui/chip.ts +31 -10
  15. package/.nuxt/ui/collapsible.ts +23 -2
  16. package/.nuxt/ui/color-picker.ts +26 -5
  17. package/.nuxt/ui/command-palette.ts +37 -16
  18. package/.nuxt/ui/container.ts +23 -2
  19. package/.nuxt/ui/context-menu.ts +56 -35
  20. package/.nuxt/ui/drawer.ts +33 -12
  21. package/.nuxt/ui/dropdown-menu.ts +57 -36
  22. package/.nuxt/ui/form-field.ts +29 -8
  23. package/.nuxt/ui/form.ts +23 -2
  24. package/.nuxt/ui/index.ts +1 -0
  25. package/.nuxt/ui/input-menu.ts +65 -44
  26. package/.nuxt/ui/input-number.ts +43 -22
  27. package/.nuxt/ui/input.ts +46 -25
  28. package/.nuxt/ui/kbd.ts +27 -6
  29. package/.nuxt/ui/link.ts +26 -5
  30. package/.nuxt/ui/modal.ts +28 -7
  31. package/.nuxt/ui/navigation-menu.ts +102 -83
  32. package/.nuxt/ui/pagination.ts +23 -2
  33. package/.nuxt/ui/pin-input.ts +43 -22
  34. package/.nuxt/ui/popover.ts +25 -4
  35. package/.nuxt/ui/progress.ts +40 -19
  36. package/.nuxt/ui/radio-group.ts +273 -37
  37. package/.nuxt/ui/select-menu.ts +59 -35
  38. package/.nuxt/ui/select.ts +55 -34
  39. package/.nuxt/ui/separator.ts +31 -10
  40. package/.nuxt/ui/skeleton.ts +24 -3
  41. package/.nuxt/ui/slideover.ts +27 -6
  42. package/.nuxt/ui/slider.ts +39 -18
  43. package/.nuxt/ui/stepper.ts +41 -20
  44. package/.nuxt/ui/switch.ts +43 -22
  45. package/.nuxt/ui/table.ts +38 -17
  46. package/.nuxt/ui/tabs.ts +55 -34
  47. package/.nuxt/ui/textarea.ts +63 -37
  48. package/.nuxt/ui/toast.ts +47 -26
  49. package/.nuxt/ui/toaster.ts +23 -2
  50. package/.nuxt/ui/tooltip.ts +25 -4
  51. package/.nuxt/ui/tree.ts +41 -20
  52. package/.nuxt/ui.css +56 -12
  53. package/README.md +11 -0
  54. package/cli/templates.mjs +18 -17
  55. package/dist/module.json +5 -5
  56. package/dist/module.mjs +11 -7
  57. package/dist/runtime/components/Accordion.vue +36 -93
  58. package/dist/runtime/components/Accordion.vue.d.ts +91 -0
  59. package/dist/runtime/components/Alert.vue +37 -100
  60. package/dist/runtime/components/Alert.vue.d.ts +96 -0
  61. package/dist/runtime/components/App.vue +28 -34
  62. package/dist/runtime/components/App.vue.d.ts +24 -0
  63. package/dist/runtime/components/Avatar.vue +42 -75
  64. package/dist/runtime/components/Avatar.vue.d.ts +60 -0
  65. package/dist/runtime/components/AvatarGroup.vue +40 -77
  66. package/dist/runtime/components/AvatarGroup.vue.d.ts +40 -0
  67. package/dist/runtime/components/Badge.vue +33 -62
  68. package/dist/runtime/components/Badge.vue.d.ts +62 -0
  69. package/dist/runtime/components/Breadcrumb.vue +37 -90
  70. package/dist/runtime/components/Breadcrumb.vue.d.ts +82 -0
  71. package/dist/runtime/components/Button.vue +95 -104
  72. package/dist/runtime/components/Button.vue.d.ts +73 -0
  73. package/dist/runtime/components/ButtonGroup.vue +20 -46
  74. package/dist/runtime/components/ButtonGroup.vue.d.ts +55 -0
  75. package/dist/runtime/components/Calendar.vue +67 -150
  76. package/dist/runtime/components/Calendar.vue.d.ts +107 -0
  77. package/dist/runtime/components/Card.vue +18 -40
  78. package/dist/runtime/components/Card.vue.d.ts +38 -0
  79. package/dist/runtime/components/Carousel.vue +112 -234
  80. package/dist/runtime/components/Carousel.vue.d.ts +120 -0
  81. package/dist/runtime/components/Checkbox.vue +52 -93
  82. package/dist/runtime/components/Checkbox.vue.d.ts +76 -0
  83. package/dist/runtime/components/CheckboxGroup.vue +121 -0
  84. package/dist/runtime/components/CheckboxGroup.vue.d.ts +75 -0
  85. package/dist/runtime/components/Chip.vue +26 -69
  86. package/dist/runtime/components/Chip.vue.d.ts +71 -0
  87. package/dist/runtime/components/Collapsible.vue +22 -41
  88. package/dist/runtime/components/Collapsible.vue.d.ts +50 -0
  89. package/dist/runtime/components/ColorPicker.vue +111 -197
  90. package/dist/runtime/components/ColorPicker.vue.d.ts +63 -0
  91. package/dist/runtime/components/CommandPalette.vue +96 -237
  92. package/dist/runtime/components/CommandPalette.vue.d.ts +173 -0
  93. package/dist/runtime/components/Container.vue +15 -28
  94. package/dist/runtime/components/Container.vue.d.ts +27 -0
  95. package/dist/runtime/components/ContextMenu.vue +34 -133
  96. package/dist/runtime/components/ContextMenu.vue.d.ts +127 -0
  97. package/dist/runtime/components/ContextMenuContent.vue +73 -81
  98. package/dist/runtime/components/ContextMenuContent.vue.d.ts +105 -0
  99. package/dist/runtime/components/Drawer.vue +49 -83
  100. package/dist/runtime/components/Drawer.vue.d.ts +88 -0
  101. package/dist/runtime/components/DropdownMenu.vue +39 -142
  102. package/dist/runtime/components/DropdownMenu.vue.d.ts +141 -0
  103. package/dist/runtime/components/DropdownMenuContent.vue +78 -88
  104. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +55 -0
  105. package/dist/runtime/components/Form.vue +135 -220
  106. package/dist/runtime/components/Form.vue.d.ts +66 -0
  107. package/dist/runtime/components/FormField.vue +35 -77
  108. package/dist/runtime/components/FormField.vue.d.ts +70 -0
  109. package/dist/runtime/components/Icon.vue +12 -19
  110. package/dist/runtime/components/Icon.vue.d.ts +17 -0
  111. package/dist/runtime/components/Input.vue +82 -140
  112. package/dist/runtime/components/Input.vue.d.ts +91 -0
  113. package/dist/runtime/components/InputMenu.vue +185 -332
  114. package/dist/runtime/components/InputMenu.vue.d.ts +312 -0
  115. package/dist/runtime/components/InputNumber.vue +71 -133
  116. package/dist/runtime/components/InputNumber.vue.d.ts +193 -0
  117. package/dist/runtime/components/Kbd.vue +20 -46
  118. package/dist/runtime/components/Kbd.vue.d.ts +55 -0
  119. package/dist/runtime/components/Link.vue +98 -176
  120. package/dist/runtime/components/Link.vue.d.ts +124 -0
  121. package/dist/runtime/components/LinkBase.vue +33 -42
  122. package/dist/runtime/components/LinkBase.vue.d.ts +48 -0
  123. package/dist/runtime/components/Modal.vue +53 -116
  124. package/dist/runtime/components/Modal.vue.d.ts +109 -0
  125. package/dist/runtime/components/NavigationMenu.vue +77 -209
  126. package/dist/runtime/components/NavigationMenu.vue.d.ts +159 -0
  127. package/dist/runtime/components/OverlayProvider.vue +14 -18
  128. package/dist/runtime/components/OverlayProvider.vue.d.ts +2 -0
  129. package/dist/runtime/components/Pagination.vue +46 -140
  130. package/dist/runtime/components/Pagination.vue.d.ts +143 -0
  131. package/dist/runtime/components/PinInput.vue +61 -78
  132. package/dist/runtime/components/PinInput.vue.d.ts +68 -0
  133. package/dist/runtime/components/Popover.vue +47 -84
  134. package/dist/runtime/components/Popover.vue.d.ts +80 -0
  135. package/dist/runtime/components/Progress.vue +70 -131
  136. package/dist/runtime/components/Progress.vue.d.ts +97 -0
  137. package/dist/runtime/components/RadioGroup.vue +70 -132
  138. package/dist/runtime/components/RadioGroup.vue.d.ts +88 -0
  139. package/dist/runtime/components/Select.vue +110 -224
  140. package/dist/runtime/components/Select.vue.d.ts +139 -0
  141. package/dist/runtime/components/SelectMenu.vue +161 -310
  142. package/dist/runtime/components/SelectMenu.vue.d.ts +184 -0
  143. package/dist/runtime/components/Separator.vue +29 -71
  144. package/dist/runtime/components/Separator.vue.d.ts +75 -0
  145. package/dist/runtime/components/Skeleton.vue +21 -23
  146. package/dist/runtime/components/Skeleton.vue.d.ts +26 -0
  147. package/dist/runtime/components/Slideover.vue +53 -120
  148. package/dist/runtime/components/Slideover.vue.d.ts +111 -0
  149. package/dist/runtime/components/Slider.vue +46 -84
  150. package/dist/runtime/components/Slider.vue.d.ts +71 -0
  151. package/dist/runtime/components/Stepper.vue +45 -115
  152. package/dist/runtime/components/Stepper.vue.d.ts +89 -0
  153. package/dist/runtime/components/Switch.vue +45 -93
  154. package/dist/runtime/components/Switch.vue.d.ts +73 -0
  155. package/dist/runtime/components/Table.vue +163 -267
  156. package/dist/runtime/components/Table.vue.d.ts +183 -0
  157. package/dist/runtime/components/Tabs.vue +41 -107
  158. package/dist/runtime/components/Tabs.vue.d.ts +104 -0
  159. package/dist/runtime/components/Textarea.vue +113 -158
  160. package/dist/runtime/components/Textarea.vue.d.ts +95 -0
  161. package/dist/runtime/components/Toast.vue +49 -110
  162. package/dist/runtime/components/Toast.vue.d.ts +95 -0
  163. package/dist/runtime/components/Toaster.vue +70 -107
  164. package/dist/runtime/components/Toaster.vue.d.ts +63 -0
  165. package/dist/runtime/components/Tooltip.vue +38 -65
  166. package/dist/runtime/components/Tooltip.vue.d.ts +65 -0
  167. package/dist/runtime/components/Tree.vue +59 -166
  168. package/dist/runtime/components/Tree.vue.d.ts +128 -0
  169. package/dist/runtime/composables/defineShortcuts.d.ts +1 -1
  170. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  171. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  172. package/dist/runtime/composables/useFormField.d.ts +2 -2
  173. package/dist/runtime/composables/useOverlay.d.ts +14 -7
  174. package/dist/runtime/composables/useOverlay.js +14 -6
  175. package/dist/runtime/composables/usePortal.d.ts +6 -0
  176. package/dist/runtime/composables/usePortal.js +17 -0
  177. package/dist/runtime/index.css +1 -1
  178. package/dist/runtime/inertia/components/Link.vue +146 -0
  179. package/dist/runtime/inertia/components/Link.vue.d.ts +92 -0
  180. package/dist/runtime/inertia/stubs.d.ts +43 -0
  181. package/dist/runtime/inertia/stubs.js +82 -0
  182. package/dist/runtime/locale/bg.d.ts +3 -0
  183. package/dist/runtime/locale/bg.js +54 -0
  184. package/dist/runtime/locale/index.d.ts +5 -1
  185. package/dist/runtime/locale/index.js +5 -1
  186. package/dist/runtime/locale/kk.d.ts +3 -0
  187. package/dist/runtime/locale/kk.js +54 -0
  188. package/dist/runtime/locale/tj.d.ts +3 -0
  189. package/dist/runtime/locale/tj.js +54 -0
  190. package/dist/runtime/locale/ug_cn.d.ts +3 -0
  191. package/dist/runtime/locale/ug_cn.js +55 -0
  192. package/dist/runtime/types/form.d.ts +4 -1
  193. package/dist/runtime/types/index.d.ts +1 -0
  194. package/dist/runtime/types/index.js +1 -0
  195. package/dist/runtime/types/utils.d.ts +47 -7
  196. package/dist/runtime/utils/link.d.ts +3 -3
  197. package/dist/runtime/utils/link.js +1 -0
  198. package/dist/runtime/utils/tv.js +2 -2
  199. package/dist/runtime/vue/components/Icon.vue +7 -8
  200. package/dist/runtime/vue/components/Icon.vue.d.ts +14 -0
  201. package/dist/runtime/vue/components/Link.vue +118 -202
  202. package/dist/runtime/vue/components/Link.vue.d.ts +124 -0
  203. package/dist/runtime/vue/stubs.d.ts +2 -2
  204. package/dist/shared/{ui.BkNUP964.mjs → ui.D7lOOabO.mjs} +621 -362
  205. package/dist/types.d.mts +3 -5
  206. package/dist/unplugin.d.mts +4 -0
  207. package/dist/unplugin.mjs +25 -4
  208. package/dist/vite.mjs +1 -1
  209. package/package.json +94 -53
  210. package/dist/module.cjs +0 -62
  211. package/dist/module.d.cts +0 -45
  212. package/dist/module.d.ts +0 -45
  213. package/dist/shared/ui.BL-XB3u1.cjs +0 -3555
  214. package/dist/types.d.ts +0 -7
  215. package/dist/unplugin.cjs +0 -232
  216. package/dist/unplugin.d.cts +0 -62
  217. package/dist/unplugin.d.ts +0 -62
  218. package/dist/vite.cjs +0 -23
  219. package/dist/vite.d.cts +0 -15
  220. package/dist/vite.d.ts +0 -15
@@ -18,11 +18,14 @@ export interface Form<T extends object> {
18
18
  submit(): Promise<void>;
19
19
  disabled: ComputedRef<boolean>;
20
20
  dirty: ComputedRef<boolean>;
21
+ loading: Ref<boolean>;
21
22
  dirtyFields: DeepReadonly<Set<keyof T>>;
22
23
  touchedFields: DeepReadonly<Set<keyof T>>;
23
24
  blurredFields: DeepReadonly<Set<keyof T>>;
24
25
  }
25
- export type FormSchema<T extends object> = YupObjectSchema<T> | JoiSchema<T> | SuperstructSchema<any, any> | StandardSchemaV1;
26
+ export type FormSchema<I extends object = object, O extends object = I> = YupObjectSchema<I> | JoiSchema<I> | SuperstructSchema<any, any> | StandardSchemaV1<I, O>;
27
+ export type InferInput<Schema> = Schema extends StandardSchemaV1 ? StandardSchemaV1.InferInput<Schema> : Schema extends YupObjectSchema<infer I> ? I : Schema extends JoiSchema<infer I> ? I : Schema extends SuperstructSchema<infer I, any> ? I : Schema extends StandardSchemaV1 ? StandardSchemaV1.InferInput<Schema> : never;
28
+ export type InferOutput<Schema> = Schema extends StandardSchemaV1 ? StandardSchemaV1.InferOutput<Schema> : Schema extends YupObjectSchema<infer O> ? O : Schema extends JoiSchema<infer O> ? O : Schema extends SuperstructSchema<infer O, any> ? O : never;
26
29
  export type FormInputEvents = 'input' | 'blur' | 'change' | 'focus';
27
30
  export interface FormError<P extends string = string> {
28
31
  name?: P;
@@ -11,6 +11,7 @@ export * from '../components/Calendar.vue';
11
11
  export * from '../components/Card.vue';
12
12
  export * from '../components/Carousel.vue';
13
13
  export * from '../components/Checkbox.vue';
14
+ export * from '../components/CheckboxGroup.vue';
14
15
  export * from '../components/Chip.vue';
15
16
  export * from '../components/Collapsible.vue';
16
17
  export * from '../components/ColorPicker.vue';
@@ -11,6 +11,7 @@ export * from "../components/Calendar.vue";
11
11
  export * from "../components/Card.vue";
12
12
  export * from "../components/Carousel.vue";
13
13
  export * from "../components/Checkbox.vue";
14
+ export * from "../components/CheckboxGroup.vue";
14
15
  export * from "../components/Chip.vue";
15
16
  export * from "../components/Collapsible.vue";
16
17
  export * from "../components/ColorPicker.vue";
@@ -1,4 +1,5 @@
1
1
  import type { AcceptableValue as _AcceptableValue } from 'reka-ui';
2
+ import type { ClassValue } from 'tailwind-variants';
2
3
  import type { VNode } from 'vue';
3
4
  export interface TightMap<O = any> {
4
5
  [key: string]: TightMap | O;
@@ -8,19 +9,17 @@ export type DeepPartial<T, O = any> = {
8
9
  } & {
9
10
  [key: string]: O | TightMap<O>;
10
11
  };
12
+ export type DynamicSlotsKeys<Name extends string | undefined, Suffix extends string | undefined = undefined> = (Name extends string ? Suffix extends string ? Name | `${Name}-${Suffix}` : Name : never);
11
13
  export type DynamicSlots<T extends {
12
14
  slot?: string;
13
- }, S extends string | undefined = undefined, D extends object = {}> = {
14
- [K in T['slot'] as K extends string ? S extends string ? (K | `${K}-${S}`) : K : never]?: (props: {
15
+ }, Suffix extends string | undefined = undefined, ExtraProps extends object = {}> = {
16
+ [K in DynamicSlotsKeys<T['slot'], Suffix>]: (props: {
15
17
  item: Extract<T, {
16
- slot: K extends `${infer Base}-${S}` ? Base : K;
18
+ slot: K extends `${infer Base}-${Suffix}` ? Base : K;
17
19
  }>;
18
- } & D) => any;
20
+ } & ExtraProps) => any;
19
21
  };
20
22
  export type GetObjectField<MaybeObject, Key extends string> = MaybeObject extends Record<string, any> ? MaybeObject[Key] : never;
21
- export type PartialString<T> = {
22
- [K in keyof T]?: string;
23
- };
24
23
  export type AcceptableValue = Exclude<_AcceptableValue, Record<string, any>>;
25
24
  export type ArrayOrNested<T> = T[] | T[][];
26
25
  export type NestedItem<T> = T extends Array<infer I> ? NestedItem<I> : T;
@@ -45,4 +44,45 @@ export type StringOrVNode = string | VNode | (() => VNode);
45
44
  export type EmitsToProps<T> = {
46
45
  [K in keyof T as `on${Capitalize<string & K>}`]: T[K] extends [...args: infer Args] ? (...args: Args) => void : never;
47
46
  };
47
+ /**
48
+ * Utility type to flatten intersection types for better IDE hover information.
49
+ * @template T The type to flatten.
50
+ */
51
+ type Id<T> = {} & {
52
+ [P in keyof T]: T[P];
53
+ };
54
+ type ComponentVariants<T extends {
55
+ variants?: Record<string, Record<string, any>>;
56
+ }> = {
57
+ [K in keyof T['variants']]: keyof T['variants'][K];
58
+ };
59
+ type ComponentSlots<T extends {
60
+ slots?: Record<string, any>;
61
+ }> = Id<{
62
+ [K in keyof T['slots']]?: ClassValue;
63
+ }>;
64
+ type GetComponentAppConfig<A, U extends string, K extends string> = A extends Record<U, Record<K, any>> ? A[U][K] : {};
65
+ type ComponentAppConfig<T, A extends Record<string, any>, K extends string, U extends string = 'ui' | 'uiPro' | 'uiPro.prose'> = A & (U extends 'uiPro.prose' ? {
66
+ uiPro?: {
67
+ prose?: {
68
+ [k in K]?: Partial<T>;
69
+ };
70
+ };
71
+ } : {
72
+ [key in Exclude<U, 'uiPro.prose'>]?: {
73
+ [k in K]?: Partial<T>;
74
+ };
75
+ });
76
+ /**
77
+ * Defines the configuration shape expected for a component.
78
+ * @template T The component's theme imported from `#build/ui/*`.
79
+ * @template A The base AppConfig type from `@nuxt/schema`.
80
+ * @template K The key identifying the component (e.g., 'badge').
81
+ * @template U The top-level key in AppConfig ('ui' or 'uiPro').
82
+ */
83
+ export type ComponentConfig<T extends Record<string, any>, A extends Record<string, any>, K extends string, U extends 'ui' | 'uiPro' | 'uiPro.prose' = 'ui'> = {
84
+ AppConfig: ComponentAppConfig<T, A, K, U>;
85
+ variants: ComponentVariants<T & GetComponentAppConfig<A, U, K>>;
86
+ slots: ComponentSlots<T>;
87
+ };
48
88
  export {};
@@ -1,6 +1,6 @@
1
1
  import type { LinkProps } from '../types';
2
2
  export declare function pickLinkProps(link: LinkProps & {
3
3
  [key: string]: any;
4
- }): {
5
- [x: string]: any;
6
- };
4
+ }): import("@vueuse/shared").ReactivePickReturn<LinkProps & {
5
+ [key: string]: any;
6
+ }, string>;
@@ -15,6 +15,7 @@ export function pickLinkProps(link) {
15
15
  "exactQuery",
16
16
  "external",
17
17
  "href",
18
+ "download",
18
19
  "inactiveClass",
19
20
  "noPrefetch",
20
21
  "noRel",
@@ -1,4 +1,4 @@
1
1
  import { createTV } from "tailwind-variants";
2
- import _appConfig from "#build/app.config";
3
- const appConfigTv = _appConfig;
2
+ import appConfig from "#build/app.config";
3
+ const appConfigTv = appConfig;
4
4
  export const tv = /* @__PURE__ */ createTV(appConfigTv.ui?.tv);
@@ -1,13 +1,12 @@
1
- <script lang="ts">
2
- export interface IconProps {
3
- name: string
4
- }
5
- </script>
1
+ <script>
6
2
 
7
- <script setup lang="ts">
8
- import { Icon as IconifyIcon } from '@iconify/vue'
3
+ </script>
9
4
 
10
- defineProps<IconProps>()
5
+ <script setup>
6
+ import { Icon as IconifyIcon } from "@iconify/vue";
7
+ defineProps({
8
+ name: { type: String, required: true }
9
+ });
11
10
  </script>
12
11
 
13
12
  <template>
@@ -0,0 +1,14 @@
1
+ export interface IconProps {
2
+ name: string;
3
+ }
4
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<IconProps>>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<IconProps>>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
5
+ export default _default;
6
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
7
+ type __VLS_TypePropsToOption<T> = {
8
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
9
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
10
+ } : {
11
+ type: import('vue').PropType<T[K]>;
12
+ required: true;
13
+ };
14
+ };
@@ -1,200 +1,116 @@
1
- <script lang="ts">
2
- import type { ButtonHTMLAttributes } from 'vue'
3
- import { tv } from 'tailwind-variants'
4
- import type { AppConfig } from '@nuxt/schema'
5
- import _appConfig from '#build/app.config'
6
- import type { RouterLinkProps, RouteLocationRaw } from 'vue-router'
7
- import theme from '#build/ui/link'
8
-
9
- interface NuxtLinkProps extends Omit<RouterLinkProps, 'to'> {
10
- /**
11
- * Route Location the link should navigate to when clicked on.
12
- */
13
- to?: RouteLocationRaw // need to manually type to avoid breaking typedPages
14
- /**
15
- * An alias for `to`. If used with `to`, `href` will be ignored
16
- */
17
- href?: NuxtLinkProps['to']
18
- /**
19
- * Forces the link to be considered as external (true) or internal (false). This is helpful to handle edge-cases
20
- */
21
- external?: boolean
22
- /**
23
- * Where to display the linked URL, as the name for a browsing context.
24
- */
25
- target?: '_blank' | '_parent' | '_self' | '_top' | (string & {}) | null
26
- /**
27
- * A rel attribute value to apply on the link. Defaults to "noopener noreferrer" for external links.
28
- */
29
- rel?: 'noopener' | 'noreferrer' | 'nofollow' | 'sponsored' | 'ugc' | (string & {}) | null
30
- /**
31
- * If set to true, no rel attribute will be added to the link
32
- */
33
- noRel?: boolean
34
- /**
35
- * A class to apply to links that have been prefetched.
36
- */
37
- prefetchedClass?: string
38
- /**
39
- * When enabled will prefetch middleware, layouts and payloads of links in the viewport.
40
- */
41
- prefetch?: boolean
42
- /**
43
- * Allows controlling when to prefetch links. By default, prefetch is triggered only on visibility.
44
- */
45
- prefetchOn?: 'visibility' | 'interaction' | Partial<{
46
- visibility: boolean
47
- interaction: boolean
48
- }>
49
- /**
50
- * Escape hatch to disable `prefetch` attribute.
51
- */
52
- noPrefetch?: boolean
53
- }
54
-
55
- const appConfigLink = _appConfig as AppConfig & { ui: { link: Partial<typeof theme> } }
56
-
57
- const link = tv({ extend: tv(theme), ...(appConfigLink.ui?.link || {}) })
58
-
59
- export interface LinkProps extends NuxtLinkProps {
60
- /**
61
- * The element or component this component should render as when not a link.
62
- * @defaultValue 'button'
63
- */
64
- as?: any
65
- /**
66
- * The type of the button when not a link.
67
- * @defaultValue 'button'
68
- */
69
- type?: ButtonHTMLAttributes['type']
70
- disabled?: boolean
71
- /** Force the link to be active independent of the current route. */
72
- active?: boolean
73
- /** Will only be active if the current route is an exact match. */
74
- exact?: boolean
75
- /** Will only be active if the current route query is an exact match. */
76
- exactQuery?: boolean | 'partial'
77
- /** Will only be active if the current route hash is an exact match. */
78
- exactHash?: boolean
79
- /** The class to apply when the link is inactive. */
80
- inactiveClass?: string
81
- custom?: boolean
82
- /** When `true`, only styles from `class`, `activeClass`, and `inactiveClass` will be applied. */
83
- raw?: boolean
84
- class?: any
85
- }
86
-
87
- export interface LinkSlots {
88
- default(props: { active: boolean }): any
89
- }
1
+ <script>
2
+ import theme from "#build/ui/link";
90
3
  </script>
91
4
 
92
- <script setup lang="ts">
93
- import { computed, getCurrentInstance } from 'vue'
94
- import { isEqual, diff } from 'ohash/utils'
95
- import { useForwardProps } from 'reka-ui'
96
- import { reactiveOmit } from '@vueuse/core'
97
- import { hasProtocol } from 'ufo'
98
- import { useRoute } from '#imports'
99
- import { RouterLink } from 'vue-router'
100
-
101
- defineOptions({ inheritAttrs: false })
102
-
103
- const props = withDefaults(defineProps<LinkProps>(), {
104
- as: 'button',
105
- type: 'button',
106
- ariaCurrentValue: 'page',
107
- active: undefined,
108
- activeClass: '',
109
- inactiveClass: ''
110
- })
111
- defineSlots<LinkSlots>()
112
-
113
- // Check if vue-router is available by checking for the injection key
5
+ <script setup>
6
+ import { computed, getCurrentInstance } from "vue";
7
+ import { defu } from "defu";
8
+ import { isEqual, diff } from "ohash/utils";
9
+ import { useForwardProps } from "reka-ui";
10
+ import { reactiveOmit } from "@vueuse/core";
11
+ import { hasProtocol } from "ufo";
12
+ import { useRoute, RouterLink } from "vue-router";
13
+ import { useAppConfig } from "#imports";
14
+ import { tv } from "../../utils/tv";
15
+ defineOptions({ inheritAttrs: false });
16
+ const props = defineProps({
17
+ as: { type: null, required: false, default: "button" },
18
+ type: { type: null, required: false, default: "button" },
19
+ disabled: { type: Boolean, required: false },
20
+ active: { type: Boolean, required: false, default: void 0 },
21
+ exact: { type: Boolean, required: false },
22
+ exactQuery: { type: [Boolean, String], required: false },
23
+ exactHash: { type: Boolean, required: false },
24
+ inactiveClass: { type: String, required: false, default: "" },
25
+ custom: { type: Boolean, required: false },
26
+ raw: { type: Boolean, required: false },
27
+ class: { type: null, required: false },
28
+ to: { type: null, required: false },
29
+ href: { type: null, required: false },
30
+ external: { type: Boolean, required: false },
31
+ target: { type: [String, Object, null], required: false },
32
+ rel: { type: [String, Object, null], required: false },
33
+ noRel: { type: Boolean, required: false },
34
+ prefetchedClass: { type: String, required: false },
35
+ prefetch: { type: Boolean, required: false },
36
+ prefetchOn: { type: [String, Object], required: false },
37
+ noPrefetch: { type: Boolean, required: false },
38
+ activeClass: { type: String, required: false, default: "" },
39
+ exactActiveClass: { type: String, required: false },
40
+ ariaCurrentValue: { type: String, required: false, default: "page" },
41
+ viewTransition: { type: Boolean, required: false },
42
+ replace: { type: Boolean, required: false }
43
+ });
44
+ defineSlots();
114
45
  const hasRouter = computed(() => {
115
- const app = getCurrentInstance()?.appContext.app
116
- return !!(app?.config?.globalProperties?.$router)
117
- })
118
-
119
- // Only try to get route if router exists
46
+ const app = getCurrentInstance()?.appContext.app;
47
+ return !!app?.config?.globalProperties?.$router;
48
+ });
120
49
  const route = computed(() => {
121
- if (!hasRouter.value) return null
50
+ if (!hasRouter.value) return null;
122
51
  try {
123
- return useRoute()
52
+ return useRoute();
124
53
  } catch {
125
- return null
54
+ return null;
126
55
  }
127
- })
128
-
129
- const routerLinkProps = useForwardProps(reactiveOmit(props, 'as', 'type', 'disabled', 'active', 'exact', 'exactQuery', 'exactHash', 'activeClass', 'inactiveClass', 'to', 'raw', 'class'))
130
-
56
+ });
57
+ const appConfig = useAppConfig();
58
+ const routerLinkProps = useForwardProps(reactiveOmit(props, "as", "type", "disabled", "active", "exact", "exactQuery", "exactHash", "activeClass", "inactiveClass", "to", "raw", "class"));
131
59
  const ui = computed(() => tv({
132
- extend: link,
133
- variants: {
134
- active: {
135
- true: props.activeClass,
136
- false: props.inactiveClass
60
+ extend: tv(theme),
61
+ ...defu({
62
+ variants: {
63
+ active: {
64
+ true: props.activeClass,
65
+ false: props.inactiveClass
66
+ }
137
67
  }
138
- }
139
- }))
140
-
141
- function isPartiallyEqual(item1: any, item2: any) {
68
+ }, appConfig.ui?.link || {})
69
+ }));
70
+ function isPartiallyEqual(item1, item2) {
142
71
  const diffedKeys = diff(item1, item2).reduce((filtered, q) => {
143
- if (q.type === 'added') {
144
- filtered.add(q.key)
72
+ if (q.type === "added") {
73
+ filtered.add(q.key);
145
74
  }
146
- return filtered
147
- }, new Set<string>())
148
-
149
- const item1Filtered = Object.fromEntries(Object.entries(item1).filter(([key]) => !diffedKeys.has(key)))
150
- const item2Filtered = Object.fromEntries(Object.entries(item2).filter(([key]) => !diffedKeys.has(key)))
151
-
152
- return isEqual(item1Filtered, item2Filtered)
75
+ return filtered;
76
+ }, /* @__PURE__ */ new Set());
77
+ const item1Filtered = Object.fromEntries(Object.entries(item1).filter(([key]) => !diffedKeys.has(key)));
78
+ const item2Filtered = Object.fromEntries(Object.entries(item2).filter(([key]) => !diffedKeys.has(key)));
79
+ return isEqual(item1Filtered, item2Filtered);
153
80
  }
154
-
155
81
  const isExternal = computed(() => {
156
- if (!props.to) return false
157
- return typeof props.to === 'string' && hasProtocol(props.to, { acceptRelative: true })
158
- })
159
-
160
- function isLinkActive({ route: linkRoute, isActive, isExactActive }: any) {
161
- if (props.active !== undefined) {
162
- return props.active
82
+ if (!props.to) return false;
83
+ return typeof props.to === "string" && hasProtocol(props.to, { acceptRelative: true });
84
+ });
85
+ function isLinkActive({ route: linkRoute, isActive, isExactActive }) {
86
+ if (props.active !== void 0) {
87
+ return props.active;
163
88
  }
164
-
165
89
  if (!props.to || !route.value) {
166
- return false
90
+ return false;
167
91
  }
168
-
169
- if (props.exactQuery === 'partial') {
170
- if (!isPartiallyEqual(linkRoute.query, route.value.query)) return false
92
+ if (props.exactQuery === "partial") {
93
+ if (!isPartiallyEqual(linkRoute.query, route.value.query)) return false;
171
94
  } else if (props.exactQuery === true) {
172
- if (!isEqual(linkRoute.query, route.value.query)) return false
95
+ if (!isEqual(linkRoute.query, route.value.query)) return false;
173
96
  }
174
-
175
97
  if (props.exactHash && linkRoute.hash !== route.value.hash) {
176
- return false
98
+ return false;
177
99
  }
178
-
179
100
  if (props.exact && isExactActive) {
180
- return true
101
+ return true;
181
102
  }
182
-
183
103
  if (!props.exact && isActive) {
184
- return true
104
+ return true;
185
105
  }
186
-
187
- return false
106
+ return false;
188
107
  }
189
-
190
- function resolveLinkClass({ route, isActive, isExactActive }: any = {}) {
191
- const active = isLinkActive({ route, isActive, isExactActive })
192
-
108
+ function resolveLinkClass({ route: route2, isActive, isExactActive } = {}) {
109
+ const active = isLinkActive({ route: route2, isActive, isExactActive });
193
110
  if (props.raw) {
194
- return [props.class, active ? props.activeClass : props.inactiveClass]
111
+ return [props.class, active ? props.activeClass : props.inactiveClass];
195
112
  }
196
-
197
- return ui.value({ class: props.class, active, disabled: props.disabled })
113
+ return ui.value({ class: props.class, active, disabled: props.disabled });
198
114
  }
199
115
  </script>
200
116
 
@@ -204,28 +120,28 @@ function resolveLinkClass({ route, isActive, isExactActive }: any = {}) {
204
120
  <template v-if="custom">
205
121
  <slot
206
122
  v-bind="{
207
- ...$attrs,
208
- ...(exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {}),
209
- as,
210
- type,
211
- disabled,
212
- href: to ? href : undefined,
213
- navigate,
214
- active: isLinkActive({ route: linkRoute, isActive, isExactActive })
215
- }"
123
+ ...$attrs,
124
+ ...exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {},
125
+ as,
126
+ type,
127
+ disabled,
128
+ href: to ? href : void 0,
129
+ navigate,
130
+ active: isLinkActive({ route: linkRoute, isActive, isExactActive })
131
+ }"
216
132
  />
217
133
  </template>
218
134
  <ULinkBase
219
135
  v-else
220
136
  v-bind="{
221
- ...$attrs,
222
- ...(exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {}),
223
- as,
224
- type,
225
- disabled,
226
- href: to ? href : undefined,
227
- navigate
228
- }"
137
+ ...$attrs,
138
+ ...exact && isExactActive ? { 'aria-current': props.ariaCurrentValue } : {},
139
+ as,
140
+ type,
141
+ disabled,
142
+ href: to ? href : void 0,
143
+ navigate
144
+ }"
229
145
  :class="resolveLinkClass({ route: linkRoute, isActive, isExactActive })"
230
146
  >
231
147
  <slot :active="isLinkActive({ route: linkRoute, isActive, isExactActive })" />
@@ -237,26 +153,26 @@ function resolveLinkClass({ route, isActive, isExactActive }: any = {}) {
237
153
  <template v-if="custom">
238
154
  <slot
239
155
  v-bind="{
240
- ...$attrs,
241
- as,
242
- type,
243
- disabled,
244
- href: to,
245
- target: isExternal ? '_blank' : undefined,
246
- active: false
247
- }"
156
+ ...$attrs,
157
+ as,
158
+ type,
159
+ disabled,
160
+ href: to,
161
+ target: isExternal ? '_blank' : void 0,
162
+ active: false
163
+ }"
248
164
  />
249
165
  </template>
250
166
  <ULinkBase
251
167
  v-else
252
168
  v-bind="{
253
- ...$attrs,
254
- as,
255
- type,
256
- disabled,
257
- href: (to as string),
258
- target: isExternal ? '_blank' : undefined
259
- }"
169
+ ...$attrs,
170
+ as,
171
+ type,
172
+ disabled,
173
+ href: to,
174
+ target: isExternal ? '_blank' : void 0
175
+ }"
260
176
  :is-external="isExternal"
261
177
  :class="resolveLinkClass()"
262
178
  >