@nuxt/ui 4.0.0-alpha.1 → 4.0.0-alpha.2

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 (251) hide show
  1. package/.nuxt/ui/content/content-navigation.ts +2 -1
  2. package/.nuxt/ui/marquee.ts +1 -1
  3. package/.nuxt/ui/progress.ts +3 -3
  4. package/.nuxt/ui/prose/code-tree.ts +1 -1
  5. package/.nuxt/ui/tree.ts +1 -1
  6. package/README.md +13 -1
  7. package/dist/module.d.mts +6 -6
  8. package/dist/module.json +2 -2
  9. package/dist/module.mjs +8 -6
  10. package/dist/runtime/components/Accordion.d.vue.ts +79 -0
  11. package/dist/runtime/components/Accordion.vue +3 -3
  12. package/dist/runtime/components/Accordion.vue.d.ts +2 -2
  13. package/dist/runtime/components/Alert.d.vue.ts +81 -0
  14. package/dist/runtime/components/App.d.vue.ts +25 -0
  15. package/dist/runtime/components/AuthForm.d.vue.ts +128 -0
  16. package/dist/runtime/components/AuthForm.vue.d.ts +39 -1
  17. package/dist/runtime/components/Avatar.d.vue.ts +41 -0
  18. package/dist/runtime/components/AvatarGroup.d.vue.ts +31 -0
  19. package/dist/runtime/components/Badge.d.vue.ts +43 -0
  20. package/dist/runtime/components/Banner.d.vue.ts +72 -0
  21. package/dist/runtime/components/Banner.vue +1 -1
  22. package/dist/runtime/components/BlogPost.d.vue.ts +60 -0
  23. package/dist/runtime/components/BlogPosts.d.vue.ts +31 -0
  24. package/dist/runtime/components/Breadcrumb.d.vue.ts +67 -0
  25. package/dist/runtime/components/Breadcrumb.vue +1 -1
  26. package/dist/runtime/components/Breadcrumb.vue.d.ts +2 -2
  27. package/dist/runtime/components/Button.d.vue.ts +44 -0
  28. package/dist/runtime/components/Calendar.d.vue.ts +112 -0
  29. package/dist/runtime/components/Card.d.vue.ts +29 -0
  30. package/dist/runtime/components/Carousel.d.vue.ts +127 -0
  31. package/dist/runtime/components/Carousel.vue.d.ts +10 -10
  32. package/dist/runtime/components/ChangelogVersion.d.vue.ts +59 -0
  33. package/dist/runtime/components/ChangelogVersions.d.vue.ts +78 -0
  34. package/dist/runtime/components/ChangelogVersions.vue +2 -2
  35. package/dist/runtime/components/ChatMessage.d.vue.ts +67 -0
  36. package/dist/runtime/components/ChatMessages.d.vue.ts +83 -0
  37. package/dist/runtime/components/ChatMessages.vue +2 -2
  38. package/dist/runtime/components/ChatPalette.d.vue.ts +24 -0
  39. package/dist/runtime/components/ChatPrompt.d.vue.ts +61 -0
  40. package/dist/runtime/components/ChatPrompt.vue +2 -2
  41. package/dist/runtime/components/ChatPromptSubmit.d.vue.ts +100 -0
  42. package/dist/runtime/components/Checkbox.d.vue.ts +74 -0
  43. package/dist/runtime/components/CheckboxGroup.d.vue.ts +89 -0
  44. package/dist/runtime/components/CheckboxGroup.vue +8 -8
  45. package/dist/runtime/components/CheckboxGroup.vue.d.ts +17 -13
  46. package/dist/runtime/components/Chip.d.vue.ts +57 -0
  47. package/dist/runtime/components/Collapsible.d.vue.ts +35 -0
  48. package/dist/runtime/components/ColorPicker.d.vue.ts +48 -0
  49. package/dist/runtime/components/CommandPalette.d.vue.ts +193 -0
  50. package/dist/runtime/components/CommandPalette.vue +5 -4
  51. package/dist/runtime/components/CommandPalette.vue.d.ts +2 -1
  52. package/dist/runtime/components/Container.d.vue.ts +18 -0
  53. package/dist/runtime/components/ContextMenu.d.vue.ts +110 -0
  54. package/dist/runtime/components/ContextMenu.vue +2 -2
  55. package/dist/runtime/components/ContextMenu.vue.d.ts +2 -2
  56. package/dist/runtime/components/ContextMenuContent.d.vue.ts +50 -0
  57. package/dist/runtime/components/ContextMenuContent.vue +2 -2
  58. package/dist/runtime/components/ContextMenuContent.vue.d.ts +2 -2
  59. package/dist/runtime/components/DashboardGroup.d.vue.ts +24 -0
  60. package/dist/runtime/components/DashboardNavbar.d.vue.ts +52 -0
  61. package/dist/runtime/components/DashboardPanel.d.vue.ts +30 -0
  62. package/dist/runtime/components/DashboardResizeHandle.d.vue.ts +18 -0
  63. package/dist/runtime/components/DashboardSearch.d.vue.ts +91 -0
  64. package/dist/runtime/components/DashboardSearch.vue +2 -2
  65. package/dist/runtime/components/DashboardSearchButton.d.vue.ts +59 -0
  66. package/dist/runtime/components/DashboardSearchButton.vue +2 -2
  67. package/dist/runtime/components/DashboardSidebar.d.vue.ts +75 -0
  68. package/dist/runtime/components/DashboardSidebarCollapse.d.vue.ts +19 -0
  69. package/dist/runtime/components/DashboardSidebarToggle.d.vue.ts +19 -0
  70. package/dist/runtime/components/DashboardToolbar.d.vue.ts +25 -0
  71. package/dist/runtime/components/Drawer.d.vue.ts +84 -0
  72. package/dist/runtime/components/DropdownMenu.d.vue.ts +120 -0
  73. package/dist/runtime/components/DropdownMenu.vue +2 -2
  74. package/dist/runtime/components/DropdownMenu.vue.d.ts +2 -2
  75. package/dist/runtime/components/DropdownMenuContent.d.vue.ts +56 -0
  76. package/dist/runtime/components/DropdownMenuContent.vue +2 -2
  77. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +2 -2
  78. package/dist/runtime/components/Error.d.vue.ts +47 -0
  79. package/dist/runtime/components/FieldGroup.d.vue.ts +34 -0
  80. package/dist/runtime/components/FileUpload.d.vue.ts +166 -0
  81. package/dist/runtime/components/FileUpload.vue +1 -0
  82. package/dist/runtime/components/Footer.d.vue.ts +29 -0
  83. package/dist/runtime/components/FooterColumns.d.vue.ts +57 -0
  84. package/dist/runtime/components/Form.d.vue.ts +114 -0
  85. package/dist/runtime/components/Form.vue +111 -52
  86. package/dist/runtime/components/Form.vue.d.ts +54 -11
  87. package/dist/runtime/components/FormField.d.vue.ts +61 -0
  88. package/dist/runtime/components/Header.d.vue.ts +68 -0
  89. package/dist/runtime/components/Icon.d.vue.ts +8 -0
  90. package/dist/runtime/components/Input.d.vue.ts +74 -0
  91. package/dist/runtime/components/Input.vue.d.ts +4 -3
  92. package/dist/runtime/components/InputMenu.d.vue.ts +330 -0
  93. package/dist/runtime/components/InputMenu.vue +1 -1
  94. package/dist/runtime/components/InputMenu.vue.d.ts +4 -4
  95. package/dist/runtime/components/InputNumber.d.vue.ts +188 -0
  96. package/dist/runtime/components/InputNumber.vue +2 -2
  97. package/dist/runtime/components/InputNumber.vue.d.ts +0 -2
  98. package/dist/runtime/components/InputTags.d.vue.ts +186 -0
  99. package/dist/runtime/components/Kbd.d.vue.ts +38 -0
  100. package/dist/runtime/components/Link.d.vue.ts +91 -0
  101. package/dist/runtime/components/LinkBase.d.vue.ts +25 -0
  102. package/dist/runtime/components/Main.d.vue.ts +20 -0
  103. package/dist/runtime/components/Marquee.d.vue.ts +32 -0
  104. package/dist/runtime/components/Marquee.vue +1 -1
  105. package/dist/runtime/components/Modal.d.vue.ts +107 -0
  106. package/dist/runtime/components/NavigationMenu.d.vue.ts +171 -0
  107. package/dist/runtime/components/NavigationMenu.vue.d.ts +2 -2
  108. package/dist/runtime/components/OverlayProvider.d.vue.ts +2 -0
  109. package/dist/runtime/components/Page.d.vue.ts +25 -0
  110. package/dist/runtime/components/PageAnchors.d.vue.ts +47 -0
  111. package/dist/runtime/components/PageAside.d.vue.ts +27 -0
  112. package/dist/runtime/components/PageBody.d.vue.ts +18 -0
  113. package/dist/runtime/components/PageCTA.d.vue.ts +56 -0
  114. package/dist/runtime/components/PageCard.d.vue.ts +72 -0
  115. package/dist/runtime/components/PageColumns.d.vue.ts +18 -0
  116. package/dist/runtime/components/PageFeature.d.vue.ts +44 -0
  117. package/dist/runtime/components/PageGrid.d.vue.ts +18 -0
  118. package/dist/runtime/components/PageHeader.d.vue.ts +36 -0
  119. package/dist/runtime/components/PageHero.d.vue.ts +53 -0
  120. package/dist/runtime/components/PageLinks.d.vue.ts +49 -0
  121. package/dist/runtime/components/PageList.d.vue.ts +21 -0
  122. package/dist/runtime/components/PageLogos.d.vue.ts +33 -0
  123. package/dist/runtime/components/PageSection.d.vue.ts +68 -0
  124. package/dist/runtime/components/Pagination.d.vue.ts +118 -0
  125. package/dist/runtime/components/PinInput.d.vue.ts +60 -0
  126. package/dist/runtime/components/Popover.d.vue.ts +71 -0
  127. package/dist/runtime/components/PricingPlan.d.vue.ts +112 -0
  128. package/dist/runtime/components/PricingPlans.d.vue.ts +44 -0
  129. package/dist/runtime/components/PricingTable.d.vue.ts +105 -0
  130. package/dist/runtime/components/Progress.d.vue.ts +66 -0
  131. package/dist/runtime/components/Progress.vue +2 -3
  132. package/dist/runtime/components/RadioGroup.d.vue.ts +99 -0
  133. package/dist/runtime/components/RadioGroup.vue +13 -11
  134. package/dist/runtime/components/RadioGroup.vue.d.ts +17 -13
  135. package/dist/runtime/components/Select.d.vue.ts +254 -0
  136. package/dist/runtime/components/Select.vue +3 -3
  137. package/dist/runtime/components/Select.vue.d.ts +5 -5
  138. package/dist/runtime/components/SelectMenu.d.vue.ts +303 -0
  139. package/dist/runtime/components/SelectMenu.vue.d.ts +4 -4
  140. package/dist/runtime/components/Separator.d.vue.ts +54 -0
  141. package/dist/runtime/components/Skeleton.d.vue.ts +17 -0
  142. package/dist/runtime/components/Slideover.d.vue.ts +108 -0
  143. package/dist/runtime/components/Slider.d.vue.ts +57 -0
  144. package/dist/runtime/components/Stepper.d.vue.ts +87 -0
  145. package/dist/runtime/components/Switch.d.vue.ts +71 -0
  146. package/dist/runtime/components/Table.d.vue.ts +201 -0
  147. package/dist/runtime/components/Table.vue.d.ts +26 -26
  148. package/dist/runtime/components/Tabs.d.vue.ts +99 -0
  149. package/dist/runtime/components/Tabs.vue +10 -3
  150. package/dist/runtime/components/Tabs.vue.d.ts +2 -2
  151. package/dist/runtime/components/Textarea.d.vue.ts +74 -0
  152. package/dist/runtime/components/Timeline.d.vue.ts +71 -0
  153. package/dist/runtime/components/Toast.d.vue.ts +165 -0
  154. package/dist/runtime/components/Toaster.d.vue.ts +44 -0
  155. package/dist/runtime/components/Tooltip.d.vue.ts +57 -0
  156. package/dist/runtime/components/Tree.d.vue.ts +116 -0
  157. package/dist/runtime/components/Tree.vue +68 -40
  158. package/dist/runtime/components/Tree.vue.d.ts +1 -1
  159. package/dist/runtime/components/User.d.vue.ts +47 -0
  160. package/dist/runtime/components/color-mode/ColorModeAvatar.d.vue.ts +7 -0
  161. package/dist/runtime/components/color-mode/ColorModeButton.d.vue.ts +23 -0
  162. package/dist/runtime/components/color-mode/ColorModeImage.d.vue.ts +6 -0
  163. package/dist/runtime/components/color-mode/ColorModeSelect.d.vue.ts +5 -0
  164. package/dist/runtime/components/color-mode/ColorModeSwitch.d.vue.ts +5 -0
  165. package/dist/runtime/components/content/ContentNavigation.d.vue.ts +102 -0
  166. package/dist/runtime/components/content/ContentNavigation.vue +5 -4
  167. package/dist/runtime/components/content/ContentNavigation.vue.d.ts +2 -2
  168. package/dist/runtime/components/content/ContentSearch.d.vue.ts +114 -0
  169. package/dist/runtime/components/content/ContentSearch.vue +2 -2
  170. package/dist/runtime/components/content/ContentSearchButton.d.vue.ts +59 -0
  171. package/dist/runtime/components/content/ContentSearchButton.vue +2 -2
  172. package/dist/runtime/components/content/ContentSurround.d.vue.ts +59 -0
  173. package/dist/runtime/components/content/ContentToc.d.vue.ts +88 -0
  174. package/dist/runtime/components/locale/LocaleSelect.d.vue.ts +15 -0
  175. package/dist/runtime/components/prose/A.d.vue.ts +15 -0
  176. package/dist/runtime/components/prose/Accordion.d.vue.ts +16 -0
  177. package/dist/runtime/components/prose/AccordionItem.d.vue.ts +15 -0
  178. package/dist/runtime/components/prose/Badge.d.vue.ts +13 -0
  179. package/dist/runtime/components/prose/Blockquote.d.vue.ts +13 -0
  180. package/dist/runtime/components/prose/Callout.d.vue.ts +26 -0
  181. package/dist/runtime/components/prose/Card.d.vue.ts +29 -0
  182. package/dist/runtime/components/prose/CardGroup.d.vue.ts +13 -0
  183. package/dist/runtime/components/prose/Code.d.vue.ts +22 -0
  184. package/dist/runtime/components/prose/CodeCollapse.d.vue.ts +47 -0
  185. package/dist/runtime/components/prose/CodeGroup.d.vue.ts +37 -0
  186. package/dist/runtime/components/prose/CodeIcon.d.vue.ts +7 -0
  187. package/dist/runtime/components/prose/CodePreview.d.vue.ts +19 -0
  188. package/dist/runtime/components/prose/CodeTree.d.vue.ts +28 -0
  189. package/dist/runtime/components/prose/CodeTree.vue +38 -31
  190. package/dist/runtime/components/prose/Collapsible.d.vue.ts +39 -0
  191. package/dist/runtime/components/prose/Em.d.vue.ts +13 -0
  192. package/dist/runtime/components/prose/Field.d.vue.ts +39 -0
  193. package/dist/runtime/components/prose/FieldGroup.d.vue.ts +18 -0
  194. package/dist/runtime/components/prose/H1.d.vue.ts +19 -0
  195. package/dist/runtime/components/prose/H2.d.vue.ts +19 -0
  196. package/dist/runtime/components/prose/H3.d.vue.ts +19 -0
  197. package/dist/runtime/components/prose/H4.d.vue.ts +19 -0
  198. package/dist/runtime/components/prose/Hr.d.vue.ts +5 -0
  199. package/dist/runtime/components/prose/Icon.d.vue.ts +6 -0
  200. package/dist/runtime/components/prose/Img.d.vue.ts +21 -0
  201. package/dist/runtime/components/prose/Kbd.d.vue.ts +6 -0
  202. package/dist/runtime/components/prose/Li.d.vue.ts +13 -0
  203. package/dist/runtime/components/prose/Ol.d.vue.ts +13 -0
  204. package/dist/runtime/components/prose/P.d.vue.ts +13 -0
  205. package/dist/runtime/components/prose/Pre.d.vue.ts +26 -0
  206. package/dist/runtime/components/prose/Script.d.vue.ts +5 -0
  207. package/dist/runtime/components/prose/Steps.d.vue.ts +22 -0
  208. package/dist/runtime/components/prose/Strong.d.vue.ts +13 -0
  209. package/dist/runtime/components/prose/Table.d.vue.ts +18 -0
  210. package/dist/runtime/components/prose/Tabs.d.vue.ts +36 -0
  211. package/dist/runtime/components/prose/TabsItem.d.vue.ts +15 -0
  212. package/dist/runtime/components/prose/Tbody.d.vue.ts +13 -0
  213. package/dist/runtime/components/prose/Td.d.vue.ts +13 -0
  214. package/dist/runtime/components/prose/Th.d.vue.ts +13 -0
  215. package/dist/runtime/components/prose/Thead.d.vue.ts +13 -0
  216. package/dist/runtime/components/prose/Tr.d.vue.ts +13 -0
  217. package/dist/runtime/components/prose/Ul.d.vue.ts +13 -0
  218. package/dist/runtime/components/prose/callout/Caution.d.vue.ts +14 -0
  219. package/dist/runtime/components/prose/callout/Note.d.vue.ts +14 -0
  220. package/dist/runtime/components/prose/callout/Tip.d.vue.ts +14 -0
  221. package/dist/runtime/components/prose/callout/Warning.d.vue.ts +14 -0
  222. package/dist/runtime/composables/useFormField.d.ts +1 -0
  223. package/dist/runtime/composables/useFormField.js +1 -0
  224. package/dist/runtime/inertia/components/Link.d.vue.ts +63 -0
  225. package/dist/runtime/inertia/components/LinkBase.d.vue.ts +25 -0
  226. package/dist/runtime/locale/de_ch.d.ts +3 -0
  227. package/dist/runtime/locale/de_ch.js +129 -0
  228. package/dist/runtime/locale/id.js +1 -1
  229. package/dist/runtime/locale/index.d.ts +2 -0
  230. package/dist/runtime/locale/index.js +2 -0
  231. package/dist/runtime/locale/ka.d.ts +3 -0
  232. package/dist/runtime/locale/ka.js +132 -0
  233. package/dist/runtime/types/form.d.ts +9 -8
  234. package/dist/runtime/types/form.js +1 -3
  235. package/dist/runtime/types/index.d.ts +1 -0
  236. package/dist/runtime/types/index.js +1 -0
  237. package/dist/runtime/types/utils.d.ts +7 -3
  238. package/dist/runtime/utils/form.d.ts +2 -0
  239. package/dist/runtime/utils/form.js +28 -0
  240. package/dist/runtime/utils/fuse.d.ts +2 -1
  241. package/dist/runtime/utils/index.d.ts +3 -3
  242. package/dist/runtime/utils/index.js +6 -3
  243. package/dist/runtime/vue/components/Icon.d.vue.ts +6 -0
  244. package/dist/runtime/vue/components/Link.d.vue.ts +93 -0
  245. package/dist/runtime/vue/components/color-mode/ColorModeButton.d.vue.ts +16 -0
  246. package/dist/runtime/vue/components/color-mode/ColorModeSelect.d.vue.ts +5 -0
  247. package/dist/runtime/vue/components/color-mode/ColorModeSwitch.d.vue.ts +5 -0
  248. package/dist/shared/{ui.BEZXPd3d.mjs → ui.Bs5uUhtm.mjs} +17 -12
  249. package/dist/unplugin.mjs +1 -1
  250. package/dist/vite.mjs +1 -1
  251. package/package.json +21 -34
@@ -0,0 +1,29 @@
1
+ import type { AppConfig } from '@nuxt/schema';
2
+ import type { ComponentConfig } from '../types/tv';
3
+ import theme from '#build/ui/footer';
4
+ type Footer = ComponentConfig<typeof theme, AppConfig, 'footer'>;
5
+ export interface FooterProps {
6
+ /**
7
+ * The element or component this component should render as.
8
+ * @defaultValue 'footer'
9
+ */
10
+ as?: any;
11
+ class?: any;
12
+ ui?: Footer['slots'];
13
+ }
14
+ export interface FooterSlots {
15
+ left(props?: {}): any;
16
+ default(props?: {}): any;
17
+ right(props?: {}): any;
18
+ top(props?: {}): any;
19
+ bottom(props?: {}): any;
20
+ }
21
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<FooterProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FooterProps> & Readonly<{}>, {
22
+ as: any;
23
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, FooterSlots>;
24
+ export default _default;
25
+ type __VLS_WithSlots<T, S> = T & {
26
+ new (): {
27
+ $slots: S;
28
+ };
29
+ };
@@ -0,0 +1,57 @@
1
+ import type { AppConfig } from '@nuxt/schema';
2
+ import theme from '#build/ui/footer-columns';
3
+ import type { IconProps, LinkProps } from '../types';
4
+ import type { ComponentConfig } from '../types/tv';
5
+ type FooterColumns = ComponentConfig<typeof theme, AppConfig, 'footerColumns'>;
6
+ export interface FooterColumnLink extends Omit<LinkProps, 'custom'> {
7
+ label: string;
8
+ /**
9
+ * @IconifyIcon
10
+ */
11
+ icon?: IconProps['name'];
12
+ class?: any;
13
+ ui?: Pick<FooterColumns['slots'], 'item' | 'link' | 'linkLabel' | 'linkLabelExternalIcon' | 'linkLeadingIcon'>;
14
+ }
15
+ export interface FooterColumn<T extends FooterColumnLink = FooterColumnLink> {
16
+ label: string;
17
+ children?: T[];
18
+ }
19
+ export interface FooterColumnsProps<T extends FooterColumnLink = FooterColumnLink> {
20
+ /**
21
+ * The element or component this component should render as.
22
+ * @defaultValue 'div'
23
+ */
24
+ as?: any;
25
+ class?: any;
26
+ columns?: FooterColumn<T>[];
27
+ ui?: FooterColumns['slots'];
28
+ }
29
+ type SlotProps<T> = (props: {
30
+ link: T;
31
+ active: boolean;
32
+ }) => any;
33
+ export interface FooterColumnsSlots<T extends FooterColumnLink = FooterColumnLink> {
34
+ 'left'(props?: {}): any;
35
+ 'default'(props?: {}): any;
36
+ 'right'(props?: {}): any;
37
+ 'column-label'?: (props: {
38
+ column: FooterColumn<T>;
39
+ }) => any;
40
+ 'link': SlotProps<T>;
41
+ 'link-leading': SlotProps<T>;
42
+ 'link-label': SlotProps<T>;
43
+ 'link-trailing': SlotProps<T>;
44
+ }
45
+ declare const _default: <T extends FooterColumnLink>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
46
+ props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{} & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, never> & FooterColumnsProps<T> & {}> & import("vue").PublicProps;
47
+ expose(exposed: import("vue").ShallowUnwrapRef<{}>): void;
48
+ attrs: any;
49
+ slots: FooterColumnsSlots<T>;
50
+ emit: {};
51
+ }>) => import("vue").VNode & {
52
+ __ctx?: Awaited<typeof __VLS_setup>;
53
+ };
54
+ export default _default;
55
+ type __VLS_PrettifyLocal<T> = {
56
+ [K in keyof T as K]: T[K];
57
+ } & {};
@@ -0,0 +1,114 @@
1
+ import type { FormSchema, FormError, FormInputEvents, FormErrorEvent, FormSubmitEvent, FormErrorWithId, InferInput, FormData } from '../types/form';
2
+ export type FormProps<S extends FormSchema, T extends boolean = true, N extends boolean = false> = {
3
+ id?: string | number;
4
+ /** Schema to validate the form state. Supports Standard Schema objects, Yup, Joi, and Superstructs. */
5
+ schema?: S;
6
+ /** An object representing the current state of the form. */
7
+ state?: N extends false ? Partial<InferInput<S>> : never;
8
+ /**
9
+ * Custom validation function to validate the form state.
10
+ * @param state - The current state of the form.
11
+ * @returns A promise that resolves to an array of FormError objects, or an array of FormError objects directly.
12
+ */
13
+ validate?: (state: Partial<InferInput<S>>) => Promise<FormError[]> | FormError[];
14
+ /**
15
+ * The list of input events that trigger the form validation.
16
+ * @remarks The form always validates on submit.
17
+ * @defaultValue `['blur', 'change', 'input']`
18
+ */
19
+ validateOn?: FormInputEvents[];
20
+ /** Disable all inputs inside the form. */
21
+ disabled?: boolean;
22
+ /**
23
+ * Path of the form's state within it's parent form.
24
+ * Used for nesting forms. Only available if `nested` is true.
25
+ */
26
+ name?: N extends true ? string : never;
27
+ /**
28
+ * Delay in milliseconds before validating the form on input events.
29
+ * @defaultValue `300`
30
+ */
31
+ validateOnInputDelay?: number;
32
+ /**
33
+ * If true, applies schema transformations on submit.
34
+ * @defaultValue `true`
35
+ */
36
+ transform?: T;
37
+ /**
38
+ * If true, this form will attach to its parent Form and validate at the same time.
39
+ * @defaultValue `false`
40
+ */
41
+ nested?: N;
42
+ /**
43
+ * When `true`, all form elements will be disabled on `@submit` event.
44
+ * This will cause any focused input elements to lose their focus state.
45
+ * @defaultValue `true`
46
+ */
47
+ loadingAuto?: boolean;
48
+ class?: any;
49
+ onSubmit?: ((event: FormSubmitEvent<FormData<S, T>>) => void | Promise<void>) | (() => void | Promise<void>);
50
+ };
51
+ export interface FormEmits<S extends FormSchema, T extends boolean = true> {
52
+ submit: [event: FormSubmitEvent<FormData<S, T>>];
53
+ error: [event: FormErrorEvent];
54
+ }
55
+ export interface FormSlots {
56
+ default(props: {
57
+ errors: FormError[];
58
+ loading: boolean;
59
+ }): any;
60
+ }
61
+ declare const _default: <S extends FormSchema, T extends boolean = true, N extends boolean = false>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
62
+ props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
63
+ readonly onError?: ((event: FormErrorEvent) => any) | undefined;
64
+ readonly onSubmit?: ((event: FormSubmitEvent<FormData<S, T>>) => any) | undefined;
65
+ } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onSubmit" | "onError"> & FormProps<S, T, N> & {}> & import("vue").PublicProps;
66
+ expose(exposed: import("vue").ShallowUnwrapRef<{
67
+ validate: {
68
+ <T_1 extends boolean>(opts: {
69
+ name?: keyof InferInput<S> | (keyof InferInput<S>)[] | undefined;
70
+ silent?: false | undefined;
71
+ nested?: boolean;
72
+ transform?: T_1 | undefined;
73
+ }): Promise<FormData<S, T_1>>;
74
+ <T_1 extends boolean>(opts: {
75
+ name?: keyof InferInput<S> | (keyof InferInput<S>)[] | undefined;
76
+ silent?: true | undefined;
77
+ nested?: boolean;
78
+ transform?: T_1 | undefined;
79
+ }): Promise<FormData<S, T_1> | false>;
80
+ };
81
+ errors: import("vue").Ref<{
82
+ id?: string | undefined;
83
+ name?: string | undefined;
84
+ message: string;
85
+ }[], FormErrorWithId[] | {
86
+ id?: string | undefined;
87
+ name?: string | undefined;
88
+ message: string;
89
+ }[]>;
90
+ setErrors(errs: FormError[], name?: keyof InferInput<S> | string | RegExp): void;
91
+ submit(): Promise<void>;
92
+ getErrors(name?: keyof InferInput<S> | string | RegExp): {
93
+ id?: string | undefined;
94
+ name?: string | undefined;
95
+ message: string;
96
+ }[];
97
+ clear(name?: keyof InferInput<S> | string | RegExp): void;
98
+ disabled: import("vue").ComputedRef<boolean>;
99
+ loading: import("vue").Ref<boolean, boolean>;
100
+ dirty: import("vue").ComputedRef<boolean>;
101
+ dirtyFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
102
+ blurredFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
103
+ touchedFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
104
+ }>): void;
105
+ attrs: any;
106
+ slots: FormSlots;
107
+ emit: ((evt: "error", event: FormErrorEvent) => void) & ((evt: "submit", event: FormSubmitEvent<FormData<S, T>>) => void);
108
+ }>) => import("vue").VNode & {
109
+ __ctx?: Awaited<typeof __VLS_setup>;
110
+ };
111
+ export default _default;
112
+ type __VLS_PrettifyLocal<T> = {
113
+ [K in keyof T as K]: T[K];
114
+ } & {};
@@ -6,22 +6,23 @@ import theme from "#build/ui/form";
6
6
  import { provide, inject, nextTick, ref, onUnmounted, onMounted, computed, useId, readonly, reactive } from "vue";
7
7
  import { useEventBus } from "@vueuse/core";
8
8
  import { useAppConfig } from "#imports";
9
- import { formOptionsInjectionKey, formInputsInjectionKey, formBusInjectionKey, formLoadingInjectionKey, formErrorsInjectionKey } from "../composables/useFormField";
9
+ import { formOptionsInjectionKey, formInputsInjectionKey, formBusInjectionKey, formLoadingInjectionKey, formErrorsInjectionKey, formStateInjectionKey } from "../composables/useFormField";
10
10
  import { tv } from "../utils/tv";
11
- import { validateSchema } from "../utils/form";
11
+ import { validateSchema, getAtPath, setAtPath } from "../utils/form";
12
12
  import { FormValidationException } from "../types/form";
13
13
  const props = defineProps({
14
14
  id: { type: [String, Number], required: false },
15
15
  schema: { type: null, required: false },
16
- state: { type: Object, required: true },
16
+ state: { type: null, required: false },
17
17
  validate: { type: Function, required: false },
18
18
  validateOn: { type: Array, required: false, default() {
19
19
  return ["input", "blur", "change"];
20
20
  } },
21
21
  disabled: { type: Boolean, required: false },
22
+ name: { type: null, required: false },
22
23
  validateOnInputDelay: { type: Number, required: false, default: 300 },
23
24
  transform: { type: null, required: false, default: () => true },
24
- attach: { type: Boolean, required: false, default: true },
25
+ nested: { type: null, required: false },
25
26
  loadingAuto: { type: Boolean, required: false, default: true },
26
27
  class: { type: null, required: false },
27
28
  onSubmit: { type: Function, required: false }
@@ -32,16 +33,37 @@ const appConfig = useAppConfig();
32
33
  const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.form || {} }));
33
34
  const formId = props.id ?? useId();
34
35
  const bus = useEventBus(`form-${formId}`);
35
- const parentBus = props.attach && inject(
36
+ const isNested = props.nested?.toString() === "" || props.nested === true;
37
+ const parentBus = isNested && inject(
36
38
  formBusInjectionKey,
37
39
  void 0
38
40
  );
41
+ const parentState = isNested ? inject(formStateInjectionKey, void 0) : void 0;
42
+ const state = computed(() => {
43
+ if (parentState?.value) {
44
+ return props.name ? getAtPath(parentState.value, props.name) : parentState.value;
45
+ }
46
+ return props.state;
47
+ });
39
48
  provide(formBusInjectionKey, bus);
49
+ provide(formStateInjectionKey, state);
40
50
  const nestedForms = ref(/* @__PURE__ */ new Map());
51
+ onMounted(async () => {
52
+ if (parentBus) {
53
+ await nextTick();
54
+ parentBus.emit({ type: "attach", validate: _validate, formId, name: props.name, api });
55
+ }
56
+ });
57
+ onUnmounted(() => {
58
+ bus.reset();
59
+ if (parentBus) {
60
+ parentBus.emit({ type: "detach", formId });
61
+ }
62
+ });
41
63
  onMounted(async () => {
42
64
  bus.on(async (event) => {
43
65
  if (event.type === "attach") {
44
- nestedForms.value.set(event.formId, { validate: event.validate });
66
+ nestedForms.value.set(event.formId, { validate: event.validate, name: event.name, api: event.api });
45
67
  } else if (event.type === "detach") {
46
68
  nestedForms.value.delete(event.formId);
47
69
  } else if (props.validateOn?.includes(event.type) && !loading.value) {
@@ -62,20 +84,6 @@ onMounted(async () => {
62
84
  }
63
85
  });
64
86
  });
65
- onUnmounted(() => {
66
- bus.reset();
67
- });
68
- onMounted(async () => {
69
- if (parentBus) {
70
- await nextTick();
71
- parentBus.emit({ type: "attach", validate: _validate, formId });
72
- }
73
- });
74
- onUnmounted(() => {
75
- if (parentBus) {
76
- parentBus.emit({ type: "detach", formId });
77
- }
78
- });
79
87
  const errors = ref([]);
80
88
  provide(formErrorsInjectionKey, errors);
81
89
  const inputs = ref({});
@@ -91,9 +99,9 @@ function resolveErrorIds(errs) {
91
99
  }
92
100
  const transformedState = ref(null);
93
101
  async function getErrors() {
94
- let errs = props.validate ? await props.validate(props.state) ?? [] : [];
102
+ let errs = props.validate ? await props.validate(state.value) ?? [] : [];
95
103
  if (props.schema) {
96
- const { errors: errors2, result } = await validateSchema(props.state, props.schema);
104
+ const { errors: errors2, result } = await validateSchema(state.value, props.schema);
97
105
  if (errors2) {
98
106
  errs = errs.concat(errors2);
99
107
  } else {
@@ -102,38 +110,52 @@ async function getErrors() {
102
110
  }
103
111
  return resolveErrorIds(errs);
104
112
  }
105
- async function _validate(opts = { silent: false, nested: true, transform: false }) {
113
+ async function _validate(opts = { silent: false, nested: false, transform: false }) {
106
114
  const names = opts.name && !Array.isArray(opts.name) ? [opts.name] : opts.name;
107
- const nestedValidatePromises = !names && opts.nested ? Array.from(nestedForms.value.values()).map(
108
- ({ validate }) => validate(opts).then(() => void 0).catch((error) => {
115
+ async function validateNestedForms({ validate, name }) {
116
+ try {
117
+ return { name, output: await validate({ ...opts, silent: false }) };
118
+ } catch (error) {
109
119
  if (!(error instanceof FormValidationException)) {
110
120
  throw error;
111
121
  }
112
- return error;
113
- })
114
- ) : [];
122
+ return { name, error };
123
+ }
124
+ }
125
+ const nestedValidatePromises = !names && opts.nested ? Array.from(nestedForms.value.values()).map(validateNestedForms) : [];
126
+ const nestedResults = await Promise.all(nestedValidatePromises);
127
+ const nestedErrors = nestedResults.flatMap((result) => {
128
+ if (!result.error) return [];
129
+ return result.error.errors.map((e) => ({ ...e, name: result.name ? [result.name, e.name].join(".") : e.name }));
130
+ });
131
+ const nestedOutputs = nestedResults.filter((c) => c.output !== void 0);
132
+ const allErrors = [await getErrors(), nestedErrors].flat();
115
133
  if (names) {
116
- const otherErrors = errors.value.filter((error) => !names.some((name) => {
117
- const pattern = inputs.value?.[name]?.pattern;
118
- return name === error.name || pattern && error.name?.match(pattern);
119
- }));
120
- const pathErrors = (await getErrors()).filter((error) => names.some((name) => {
121
- const pattern = inputs.value?.[name]?.pattern;
122
- return name === error.name || pattern && error.name?.match(pattern);
123
- }));
134
+ const namesSet = new Set(names);
135
+ const patterns = names.map((name) => inputs.value?.[name]?.pattern).filter(Boolean);
136
+ const isErrorForPath = (error) => {
137
+ if (!error.name) return false;
138
+ if (namesSet.has(error.name)) return true;
139
+ return patterns.some((pattern) => pattern.test(error.name));
140
+ };
141
+ const otherErrors = errors.value.filter((error) => !isErrorForPath(error));
142
+ const pathErrors = allErrors.filter(isErrorForPath);
124
143
  errors.value = otherErrors.concat(pathErrors);
125
144
  } else {
126
- errors.value = await getErrors();
145
+ errors.value = allErrors;
127
146
  }
128
- const childErrors = (await Promise.all(nestedValidatePromises)).filter((val) => val !== void 0);
129
- if (errors.value.length + childErrors.length > 0) {
147
+ if (errors.value?.length) {
130
148
  if (opts.silent) return false;
131
- throw new FormValidationException(formId, errors.value, childErrors);
149
+ throw new FormValidationException(formId, errors.value);
132
150
  }
133
151
  if (opts.transform) {
134
- Object.assign(props.state, transformedState.value);
152
+ nestedOutputs.forEach((o) => {
153
+ if (o.name) setAtPath(transformedState.value, o.name, o.output);
154
+ else Object.assign(transformedState.value, o.output);
155
+ });
156
+ return transformedState.value ?? state.value;
135
157
  }
136
- return props.state;
158
+ return state.value;
137
159
  }
138
160
  const loading = ref(false);
139
161
  provide(formLoadingInjectionKey, readonly(loading));
@@ -150,8 +172,7 @@ async function onSubmitWrapper(payload) {
150
172
  }
151
173
  const errorEvent = {
152
174
  ...event,
153
- errors: error.errors,
154
- children: error.children
175
+ errors: error.errors
155
176
  };
156
177
  emits("error", errorEvent);
157
178
  } finally {
@@ -163,15 +184,34 @@ provide(formOptionsInjectionKey, computed(() => ({
163
184
  disabled: disabled.value,
164
185
  validateOnInputDelay: props.validateOnInputDelay
165
186
  })));
166
- defineExpose({
187
+ const api = {
167
188
  validate: _validate,
168
189
  errors,
169
190
  setErrors(errs, name) {
191
+ let formErrors = resolveErrorIds(errs).filter((e) => e.id);
170
192
  if (name) {
171
- errors.value = errors.value.filter((err) => name instanceof RegExp ? !(err.name && name.test(err.name)) : err.name !== name).concat(resolveErrorIds(errs));
172
- } else {
173
- errors.value = resolveErrorIds(errs);
193
+ formErrors = errors.value.filter(
194
+ (err) => name instanceof RegExp ? !(err.name && name.test(err.name)) : err.name !== name
195
+ ).concat(formErrors);
196
+ }
197
+ for (const form of nestedForms.value.values()) {
198
+ const errors2 = errs.flatMap((e) => {
199
+ if (!form.name) return [e];
200
+ if (e?.name?.startsWith(form.name + `.`)) {
201
+ return [{
202
+ ...e,
203
+ name: e?.name.split(form.name + `.`)[1]
204
+ }];
205
+ }
206
+ return [];
207
+ });
208
+ const nameMatch = name instanceof RegExp ? form.name && name.test(form.name.toString()) : form.name !== name;
209
+ if (nameMatch || !form.name) {
210
+ form.api.setErrors(errors2, name);
211
+ formErrors = formErrors.concat(form.api.getErrors().map((e) => ({ ...e, name: form.name ? [form.name, e.name].join(".") : e.name })));
212
+ }
174
213
  }
214
+ errors.value = formErrors;
175
215
  },
176
216
  async submit() {
177
217
  await onSubmitWrapper(new Event("submit"));
@@ -183,11 +223,29 @@ defineExpose({
183
223
  return errors.value;
184
224
  },
185
225
  clear(name) {
226
+ let formErrors = [];
186
227
  if (name) {
187
- errors.value = errors.value.filter((err) => name instanceof RegExp ? !(err.name && name.test(err.name)) : err.name !== name);
188
- } else {
189
- errors.value = [];
228
+ formErrors = errors.value.filter(
229
+ (err) => {
230
+ return err.name && !!inputs.value[err.name] && (name instanceof RegExp ? !(err.name && name.test(err.name)) : err.name !== name);
231
+ }
232
+ );
233
+ }
234
+ for (const form of nestedForms.value.values()) {
235
+ if (!form.name) form.api.clear(name);
236
+ else if (form.name === name || name instanceof RegExp && name.test(form.name)) form.api.clear();
237
+ else if (typeof name === "string" && name?.startsWith(form.name + `.`)) {
238
+ const nestedName = name?.split(`${form.name}.`)[1];
239
+ form.api.clear(nestedName);
240
+ }
241
+ formErrors = formErrors.concat(
242
+ form.api.getErrors().map((e) => ({
243
+ ...e,
244
+ name: form.name ? [form.name, e.name].join(".") : e.name
245
+ }))
246
+ );
190
247
  }
248
+ errors.value = formErrors;
191
249
  },
192
250
  disabled,
193
251
  loading,
@@ -195,7 +253,8 @@ defineExpose({
195
253
  dirtyFields: readonly(dirtyFields),
196
254
  blurredFields: readonly(blurredFields),
197
255
  touchedFields: readonly(touchedFields)
198
- });
256
+ };
257
+ defineExpose(api);
199
258
  </script>
200
259
 
201
260
  <template>
@@ -1,10 +1,10 @@
1
- import type { FormSchema, FormError, FormInputEvents, FormErrorEvent, FormSubmitEvent, Form, InferInput, FormData } from '../types/form';
2
- export interface FormProps<S extends FormSchema, T extends boolean = true> {
1
+ import type { FormSchema, FormError, FormInputEvents, FormErrorEvent, FormSubmitEvent, FormErrorWithId, InferInput, FormData } from '../types/form';
2
+ export type FormProps<S extends FormSchema, T extends boolean = true, N extends boolean = false> = {
3
3
  id?: string | number;
4
4
  /** Schema to validate the form state. Supports Standard Schema objects, Yup, Joi, and Superstructs. */
5
5
  schema?: S;
6
6
  /** An object representing the current state of the form. */
7
- state: Partial<InferInput<S>>;
7
+ state?: N extends false ? Partial<InferInput<S>> : never;
8
8
  /**
9
9
  * Custom validation function to validate the form state.
10
10
  * @param state - The current state of the form.
@@ -19,21 +19,26 @@ export interface FormProps<S extends FormSchema, T extends boolean = true> {
19
19
  validateOn?: FormInputEvents[];
20
20
  /** Disable all inputs inside the form. */
21
21
  disabled?: boolean;
22
+ /**
23
+ * Path of the form's state within it's parent form.
24
+ * Used for nesting forms. Only available if `nested` is true.
25
+ */
26
+ name?: N extends true ? string : never;
22
27
  /**
23
28
  * Delay in milliseconds before validating the form on input events.
24
29
  * @defaultValue `300`
25
30
  */
26
31
  validateOnInputDelay?: number;
27
32
  /**
28
- * If true, schema transformations will be applied to the state on submit.
33
+ * If true, applies schema transformations on submit.
29
34
  * @defaultValue `true`
30
35
  */
31
36
  transform?: T;
32
37
  /**
33
- * If true, this form will attach to its parent Form (if any) and validate at the same time.
34
- * @defaultValue `true`
38
+ * If true, this form will attach to its parent Form and validate at the same time.
39
+ * @defaultValue `false`
35
40
  */
36
- attach?: boolean;
41
+ nested?: N;
37
42
  /**
38
43
  * When `true`, all form elements will be disabled on `@submit` event.
39
44
  * This will cause any focused input elements to lose their focus state.
@@ -42,7 +47,7 @@ export interface FormProps<S extends FormSchema, T extends boolean = true> {
42
47
  loadingAuto?: boolean;
43
48
  class?: any;
44
49
  onSubmit?: ((event: FormSubmitEvent<FormData<S, T>>) => void | Promise<void>) | (() => void | Promise<void>);
45
- }
50
+ };
46
51
  export interface FormEmits<S extends FormSchema, T extends boolean = true> {
47
52
  submit: [event: FormSubmitEvent<FormData<S, T>>];
48
53
  error: [event: FormErrorEvent];
@@ -53,12 +58,50 @@ export interface FormSlots {
53
58
  loading: boolean;
54
59
  }): any;
55
60
  }
56
- declare const _default: <S extends FormSchema, T extends boolean = true>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
61
+ declare const _default: <S extends FormSchema, T extends boolean = true, N extends boolean = false>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
57
62
  props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
58
63
  readonly onError?: ((event: FormErrorEvent) => any) | undefined;
59
64
  readonly onSubmit?: ((event: FormSubmitEvent<FormData<S, T>>) => any) | undefined;
60
- } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onSubmit" | "onError"> & FormProps<S, T> & {}> & import("vue").PublicProps;
61
- expose(exposed: import("vue").ShallowUnwrapRef<Form<S>>): void;
65
+ } & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, never>, "onSubmit" | "onError"> & FormProps<S, T, N> & {}> & import("vue").PublicProps;
66
+ expose(exposed: import("vue").ShallowUnwrapRef<{
67
+ validate: {
68
+ <T_1 extends boolean>(opts: {
69
+ name?: keyof InferInput<S> | (keyof InferInput<S>)[] | undefined;
70
+ silent?: false | undefined;
71
+ nested?: boolean;
72
+ transform?: T_1 | undefined;
73
+ }): Promise<FormData<S, T_1>>;
74
+ <T_1 extends boolean>(opts: {
75
+ name?: keyof InferInput<S> | (keyof InferInput<S>)[] | undefined;
76
+ silent?: true | undefined;
77
+ nested?: boolean;
78
+ transform?: T_1 | undefined;
79
+ }): Promise<FormData<S, T_1> | false>;
80
+ };
81
+ errors: import("vue").Ref<{
82
+ id?: string | undefined;
83
+ name?: string | undefined;
84
+ message: string;
85
+ }[], FormErrorWithId[] | {
86
+ id?: string | undefined;
87
+ name?: string | undefined;
88
+ message: string;
89
+ }[]>;
90
+ setErrors(errs: FormError[], name?: keyof InferInput<S> | string | RegExp): void;
91
+ submit(): Promise<void>;
92
+ getErrors(name?: keyof InferInput<S> | string | RegExp): {
93
+ id?: string | undefined;
94
+ name?: string | undefined;
95
+ message: string;
96
+ }[];
97
+ clear(name?: keyof InferInput<S> | string | RegExp): void;
98
+ disabled: import("vue").ComputedRef<boolean>;
99
+ loading: import("vue").Ref<boolean, boolean>;
100
+ dirty: import("vue").ComputedRef<boolean>;
101
+ dirtyFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
102
+ blurredFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
103
+ touchedFields: ReadonlySet<import("vue").DeepReadonly<import("@vue/reactivity").UnwrapRefSimple<keyof InferInput<S>>>>;
104
+ }>): void;
62
105
  attrs: any;
63
106
  slots: FormSlots;
64
107
  emit: ((evt: "error", event: FormErrorEvent) => void) & ((evt: "submit", event: FormSubmitEvent<FormData<S, T>>) => void);
@@ -0,0 +1,61 @@
1
+ import type { AppConfig } from '@nuxt/schema';
2
+ import theme from '#build/ui/form-field';
3
+ import type { ComponentConfig } from '../types/tv';
4
+ type FormField = ComponentConfig<typeof theme, AppConfig, 'formField'>;
5
+ export interface FormFieldProps {
6
+ /**
7
+ * The element or component this component should render as.
8
+ * @defaultValue 'div'
9
+ */
10
+ as?: any;
11
+ /** The name of the FormField. Also used to match form errors. */
12
+ name?: string;
13
+ /** A regular expression to match form error names. */
14
+ errorPattern?: RegExp;
15
+ label?: string;
16
+ description?: string;
17
+ help?: string;
18
+ error?: boolean | string;
19
+ hint?: string;
20
+ /**
21
+ * @defaultValue 'md'
22
+ */
23
+ size?: FormField['variants']['size'];
24
+ required?: boolean;
25
+ /** If true, validation on input will be active immediately instead of waiting for a blur event. */
26
+ eagerValidation?: boolean;
27
+ /**
28
+ * Delay in milliseconds before validating the form on input events.
29
+ * @defaultValue `300`
30
+ */
31
+ validateOnInputDelay?: number;
32
+ class?: any;
33
+ ui?: FormField['slots'];
34
+ }
35
+ export interface FormFieldSlots {
36
+ label(props: {
37
+ label?: string;
38
+ }): any;
39
+ hint(props: {
40
+ hint?: string;
41
+ }): any;
42
+ description(props: {
43
+ description?: string;
44
+ }): any;
45
+ help(props: {
46
+ help?: string;
47
+ }): any;
48
+ error(props: {
49
+ error?: boolean | string;
50
+ }): any;
51
+ default(props: {
52
+ error?: boolean | string;
53
+ }): any;
54
+ }
55
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<FormFieldProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FormFieldProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, FormFieldSlots>;
56
+ export default _default;
57
+ type __VLS_WithSlots<T, S> = T & {
58
+ new (): {
59
+ $slots: S;
60
+ };
61
+ };