@mapomodule/form 2.0.0-beta.1 → 2.0.0-beta.11

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 (202) hide show
  1. package/README.md +37 -118
  2. package/dist/__tests__/__mocks__/nuxt-imports.d.ts +4 -0
  3. package/dist/__tests__/__mocks__/nuxt-imports.d.ts.map +1 -0
  4. package/dist/__tests__/camomillaRoundTrip.test.d.ts +2 -0
  5. package/dist/__tests__/camomillaRoundTrip.test.d.ts.map +1 -0
  6. package/dist/__tests__/registry.test.d.ts +2 -0
  7. package/dist/__tests__/registry.test.d.ts.map +1 -0
  8. package/dist/__tests__/tabVisibility.test.d.ts +2 -0
  9. package/dist/__tests__/tabVisibility.test.d.ts.map +1 -0
  10. package/dist/__tests__/useFormFromSchema.test.d.ts +2 -0
  11. package/dist/__tests__/useFormFromSchema.test.d.ts.map +1 -0
  12. package/dist/__tests__/useMapoForm.test.d.ts +2 -0
  13. package/dist/__tests__/useMapoForm.test.d.ts.map +1 -0
  14. package/dist/index.d.mts +9 -1
  15. package/dist/index.d.ts +15 -1
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.mjs +7 -34
  18. package/dist/module.d.mts +20 -2
  19. package/dist/module.d.ts +12 -2
  20. package/dist/module.d.ts.map +1 -0
  21. package/dist/module.json +1 -1
  22. package/dist/module.mjs +187 -13
  23. package/dist/runtime/components/MapoFocusPortal.vue +115 -0
  24. package/dist/runtime/components/MapoFocusPortal.vue.d.ts +4 -0
  25. package/dist/runtime/components/MapoFocusPortal.vue.d.ts.map +1 -0
  26. package/dist/runtime/components/MapoForm.vue +177 -0
  27. package/dist/runtime/components/MapoForm.vue.d.ts +47 -0
  28. package/dist/runtime/components/MapoForm.vue.d.ts.map +1 -0
  29. package/dist/runtime/components/MapoFormField.vue +269 -0
  30. package/dist/runtime/components/MapoFormField.vue.d.ts +46 -0
  31. package/dist/runtime/components/MapoFormField.vue.d.ts.map +1 -0
  32. package/dist/runtime/components/MapoFormFlatSection.vue +149 -0
  33. package/dist/runtime/components/MapoFormFlatSection.vue.d.ts +15 -0
  34. package/dist/runtime/components/MapoFormFlatSection.vue.d.ts.map +1 -0
  35. package/dist/runtime/components/MapoFormGroup.vue +247 -0
  36. package/dist/runtime/components/MapoFormGroup.vue.d.ts +44 -0
  37. package/dist/runtime/components/MapoFormGroup.vue.d.ts.map +1 -0
  38. package/dist/runtime/components/MapoFormTabs.vue +122 -0
  39. package/dist/runtime/components/MapoFormTabs.vue.d.ts +15 -0
  40. package/dist/runtime/components/MapoFormTabs.vue.d.ts.map +1 -0
  41. package/dist/runtime/components/MapoUnknownField.vue +62 -0
  42. package/dist/runtime/components/MapoUnknownField.vue.d.ts +16 -0
  43. package/dist/runtime/components/MapoUnknownField.vue.d.ts.map +1 -0
  44. package/dist/runtime/components/fields/MapoDateField.vue +88 -0
  45. package/dist/runtime/components/fields/MapoDateField.vue.d.ts +17 -0
  46. package/dist/runtime/components/fields/MapoDateField.vue.d.ts.map +1 -0
  47. package/dist/runtime/components/fields/MapoDateTimeField.vue +159 -0
  48. package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts +17 -0
  49. package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts.map +1 -0
  50. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue +130 -0
  51. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts +16 -0
  52. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts.map +1 -0
  53. package/dist/runtime/components/fields/MapoFileField.vue +99 -0
  54. package/dist/runtime/components/fields/MapoFileField.vue.d.ts +16 -0
  55. package/dist/runtime/components/fields/MapoFileField.vue.d.ts.map +1 -0
  56. package/dist/runtime/components/fields/MapoFksField.vue +122 -0
  57. package/dist/runtime/components/fields/MapoFksField.vue.d.ts +16 -0
  58. package/dist/runtime/components/fields/MapoFksField.vue.d.ts.map +1 -0
  59. package/dist/runtime/components/fields/MapoMapField.vue +99 -0
  60. package/dist/runtime/components/fields/MapoMapField.vue.d.ts +22 -0
  61. package/dist/runtime/components/fields/MapoMapField.vue.d.ts.map +1 -0
  62. package/dist/runtime/components/fields/MapoMapFieldClient.vue +67 -0
  63. package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts +20 -0
  64. package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts.map +1 -0
  65. package/dist/runtime/components/fields/MapoMediaField.vue +93 -0
  66. package/dist/runtime/components/fields/MapoMediaField.vue.d.ts +16 -0
  67. package/dist/runtime/components/fields/MapoMediaField.vue.d.ts.map +1 -0
  68. package/dist/runtime/components/fields/MapoMediaM2mField.vue +111 -0
  69. package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts +16 -0
  70. package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts.map +1 -0
  71. package/dist/runtime/components/fields/MapoMediaUnavailable.vue +15 -0
  72. package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts +4 -0
  73. package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts.map +1 -0
  74. package/dist/runtime/components/fields/MapoRepeater.vue +459 -0
  75. package/dist/runtime/components/fields/MapoRepeater.vue.d.ts +16 -0
  76. package/dist/runtime/components/fields/MapoRepeater.vue.d.ts.map +1 -0
  77. package/dist/runtime/components/fields/MapoRepeaterItem.vue +346 -0
  78. package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts +55 -0
  79. package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts.map +1 -0
  80. package/dist/runtime/components/fields/MapoSeoPreview.vue +122 -0
  81. package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts +22 -0
  82. package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts.map +1 -0
  83. package/dist/runtime/components/fields/MapoTimeField.vue +44 -0
  84. package/dist/runtime/components/fields/MapoTimeField.vue.d.ts +17 -0
  85. package/dist/runtime/components/fields/MapoTimeField.vue.d.ts.map +1 -0
  86. package/dist/runtime/components/fields/MapoWygEditor.vue +258 -0
  87. package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts +16 -0
  88. package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts.map +1 -0
  89. package/dist/runtime/components/fields/nui/NuiCheckbox.vue +9 -0
  90. package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts +4 -0
  91. package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts.map +1 -0
  92. package/dist/runtime/components/fields/nui/NuiInput.vue +9 -0
  93. package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts +4 -0
  94. package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts.map +1 -0
  95. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue +18 -0
  96. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts +4 -0
  97. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts.map +1 -0
  98. package/dist/runtime/components/fields/nui/NuiSlider.vue +9 -0
  99. package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts +4 -0
  100. package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts.map +1 -0
  101. package/dist/runtime/components/fields/nui/NuiSwitch.vue +9 -0
  102. package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts +4 -0
  103. package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts.map +1 -0
  104. package/dist/runtime/components/fields/nui/NuiTextarea.vue +9 -0
  105. package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts +4 -0
  106. package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts.map +1 -0
  107. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts +13 -0
  108. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts.map +1 -0
  109. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.js +19 -0
  110. package/dist/runtime/composables/defineFormField.d.ts +25 -0
  111. package/dist/runtime/composables/defineFormField.d.ts.map +1 -0
  112. package/dist/runtime/composables/defineFormField.js +27 -0
  113. package/dist/runtime/composables/useCurrentLang.d.ts +6 -0
  114. package/dist/runtime/composables/useCurrentLang.d.ts.map +1 -0
  115. package/dist/runtime/composables/useCurrentLang.js +9 -0
  116. package/dist/runtime/composables/useFocusMode.d.ts +40 -0
  117. package/dist/runtime/composables/useFocusMode.d.ts.map +1 -0
  118. package/dist/runtime/composables/useFocusMode.js +31 -0
  119. package/dist/runtime/composables/useFormDraft.d.ts +60 -0
  120. package/dist/runtime/composables/useFormDraft.d.ts.map +1 -0
  121. package/dist/runtime/composables/useFormDraft.js +52 -0
  122. package/dist/runtime/composables/useFormFromSchema.d.ts +21 -0
  123. package/dist/runtime/composables/useFormFromSchema.d.ts.map +1 -0
  124. package/dist/runtime/composables/useFormFromSchema.js +145 -0
  125. package/dist/runtime/composables/useMapoForm.d.ts +96 -0
  126. package/dist/runtime/composables/useMapoForm.d.ts.map +1 -0
  127. package/dist/runtime/composables/useMapoForm.js +325 -0
  128. package/dist/runtime/composables/useMediaManager.d.ts +17 -0
  129. package/dist/runtime/composables/useMediaManager.d.ts.map +1 -0
  130. package/dist/runtime/composables/useMediaManager.js +6 -0
  131. package/dist/runtime/composables/useProgressiveDisclosure.d.ts +44 -0
  132. package/dist/runtime/composables/useProgressiveDisclosure.d.ts.map +1 -0
  133. package/dist/runtime/composables/useProgressiveDisclosure.js +23 -0
  134. package/dist/runtime/composables/useUnsavedChangesGuard.d.ts +24 -0
  135. package/dist/runtime/composables/useUnsavedChangesGuard.d.ts.map +1 -0
  136. package/dist/runtime/composables/useUnsavedChangesGuard.js +28 -0
  137. package/dist/runtime/devtools/DevtoolsFormsPage.vue +235 -0
  138. package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts +4 -0
  139. package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts.map +1 -0
  140. package/dist/runtime/plugins/form-registry.d.ts +18 -0
  141. package/dist/runtime/plugins/form-registry.d.ts.map +1 -0
  142. package/dist/runtime/plugins/form-registry.js +19 -0
  143. package/dist/runtime/registry/defaults.d.ts +3 -0
  144. package/dist/runtime/registry/defaults.d.ts.map +1 -0
  145. package/dist/runtime/registry/defaults.js +93 -0
  146. package/dist/runtime/types/descriptor.d.ts +373 -0
  147. package/dist/runtime/types/descriptor.d.ts.map +1 -0
  148. package/dist/runtime/types/descriptor.js +26 -0
  149. package/dist/runtime/types/index.d.ts +12 -0
  150. package/dist/runtime/types/index.d.ts.map +1 -0
  151. package/dist/runtime/types/index.js +6 -0
  152. package/dist/runtime/types/layout.d.ts +21 -0
  153. package/dist/runtime/types/layout.d.ts.map +1 -0
  154. package/dist/runtime/types/layout.js +0 -0
  155. package/dist/runtime/types/media.d.ts +43 -0
  156. package/dist/runtime/types/media.d.ts.map +1 -0
  157. package/dist/runtime/types/media.js +0 -0
  158. package/dist/runtime/types/registry.d.ts +62 -0
  159. package/dist/runtime/types/registry.d.ts.map +1 -0
  160. package/dist/runtime/types/registry.js +19 -0
  161. package/dist/runtime/utils/flattenFieldGroups.d.ts +50 -0
  162. package/dist/runtime/utils/flattenFieldGroups.d.ts.map +1 -0
  163. package/dist/runtime/utils/flattenFieldGroups.js +24 -0
  164. package/dist/runtime/utils/tabVisibility.d.ts +18 -0
  165. package/dist/runtime/utils/tabVisibility.d.ts.map +1 -0
  166. package/dist/runtime/utils/tabVisibility.js +18 -0
  167. package/dist/types.d.mts +6 -10
  168. package/package.json +10 -8
  169. package/src/__tests__/article.schema.json +193 -0
  170. package/src/__tests__/camomillaRoundTrip.test.ts +73 -0
  171. package/src/__tests__/tabVisibility.test.ts +102 -0
  172. package/src/__tests__/useFormFromSchema.test.ts +24 -0
  173. package/src/__tests__/useMapoForm.test.ts +5 -0
  174. package/src/index.ts +5 -0
  175. package/src/module.ts +34 -0
  176. package/src/runtime/components/MapoFocusPortal.vue +3 -1
  177. package/src/runtime/components/MapoForm.vue +17 -4
  178. package/src/runtime/components/MapoFormTabs.vue +29 -6
  179. package/src/runtime/components/fields/MapoDateField.vue +3 -1
  180. package/src/runtime/components/fields/MapoDateTimeField.vue +3 -1
  181. package/src/runtime/components/fields/MapoEnhancedMediaField.vue +153 -0
  182. package/src/runtime/components/fields/MapoFileField.vue +3 -1
  183. package/src/runtime/components/fields/MapoFksField.vue +7 -2
  184. package/src/runtime/components/fields/MapoMapField.vue +5 -2
  185. package/src/runtime/components/fields/MapoMediaField.vue +106 -0
  186. package/src/runtime/components/fields/MapoMediaM2mField.vue +131 -0
  187. package/src/runtime/components/fields/MapoMediaUnavailable.vue +19 -0
  188. package/src/runtime/components/fields/MapoRepeater.vue +33 -26
  189. package/src/runtime/components/fields/MapoRepeaterItem.vue +14 -8
  190. package/src/runtime/components/fields/MapoSeoPreview.vue +17 -13
  191. package/src/runtime/components/fields/MapoWygEditor.vue +55 -7
  192. package/src/runtime/composables/useFormFromSchema.ts +4 -1
  193. package/src/runtime/composables/useMapoForm.ts +4 -2
  194. package/src/runtime/composables/useMediaManager.ts +21 -0
  195. package/src/runtime/composables/useUnsavedChangesGuard.ts +3 -3
  196. package/src/runtime/registry/defaults.ts +9 -1
  197. package/src/runtime/types/descriptor.ts +22 -7
  198. package/src/runtime/types/index.ts +4 -0
  199. package/src/runtime/types/media.ts +44 -0
  200. package/src/runtime/utils/tabVisibility.ts +44 -0
  201. package/dist/index.d.cts +0 -1
  202. package/dist/module.d.cts +0 -2
package/README.md CHANGED
@@ -1,43 +1,28 @@
1
1
  # @mapomodule/form
2
2
 
3
- Form engine for Mapo v2 — descriptor-driven, typesafe, headless-ready admin forms for Nuxt 4 + Django/DRF.
4
-
5
- ## Features
6
-
7
- - **Descriptor-driven**: define fields as `FieldDescriptor[]` — layout, validation, i18n in one object
8
- - **All field types built-in**: text, select, date/time, FK/M2M autocomplete, WYSIWYG editor, SEO preview, map, repeater
9
- - **Headless composable**: `useMapoForm()` for fully custom layouts; `<MapoForm>` for the default shell
10
- - **Registry auto-injection**: `<MapoForm>` and `<MapoDetail>` resolve `$mapoFormRegistry` automatically — no boilerplate
11
- - **Typed extension API**: `defineFormField(type, entry, opts)` to register custom fields with collision detection
12
- - **JSON Schema bridge**: `useFormFromSchema()` generates descriptors from Pydantic v2 / DRF-spectacular schemas
13
- - **Multilingual fields**: `translatable: true` writes to `model.translations[lang].field` automatically
14
- - **Client validation**: `validate(value, ctx)` per descriptor + `required` shorthand
15
- - **Tab/group layout**: declare `tab` and `group` per field — tabs render automatically (incl. nested tabs), groups are collapsible. Tab panels expose `tab.<name>.before/after`, full override, `.label` and `tab-bar-end` slots
16
- - **Consistent repeater items**: `MapoRepeater` drives each item through `useMapoForm`, so nested-path keys, `translatable`, accessors, `descriptor.is` overrides and **client validation** behave identically inside a repeater
17
- - **Draft persistence**: `draftKey` option on `useMapoForm()` auto-saves to localStorage every 2 s; `checkDraft()` / `draftBanner` offer restore/discard; clears on successful `submit()`
18
- - **Fail-soft**: unknown field types render a non-destructive placeholder, never crash the form
19
-
20
- ## Install
21
-
22
- `@mapomodule/form` is included automatically when you install `mapomodule` (recommended). No additional module entry is needed.
23
-
24
- ```ts
25
- // nuxt.config.ts
26
- export default defineNuxtConfig({
27
- modules: ["@nuxt/ui", "mapomodule"],
28
- mapo: {
29
- form: {
30
- // optional — global field registry defaults
31
- },
32
- },
33
- });
3
+ The form engine of Mapo. A form is an array of `FieldDescriptor` objects; the engine resolves each descriptor's `type` through a field registry to a lazily loaded component, and renders the result in `MapoDetail` (from `@mapomodule/uikit`), in `MapoForm`, or headless through `useMapoForm()`.
4
+
5
+ ## Installation
6
+
7
+ Installed by the meta-package [`mapomodule`](https://www.npmjs.com/package/mapomodule), which configures it under `mapo.form`. On its own it reads the `mapoForm` key:
8
+
9
+ ```bash
10
+ pnpm add @mapomodule/form@next
34
11
  ```
35
12
 
13
+ | Option | Default | Description |
14
+ | ----------------- | ------- | ---------------------------------------------------------------------------------------- |
15
+ | `fields.attrs` | `{}` | Default `attrs` per field type, merged into the registry defaults |
16
+ | `groups.expanded` | `true` | Whether collapsible field groups start open |
17
+ | `debounce` | `300` | Milliseconds before a field change reaches the model; `descriptor.debounce` overrides it |
18
+
19
+ Mapo v2 is published on the `next` dist-tag while it is in beta.
20
+
36
21
  ## Quick start
37
22
 
38
23
  ```vue
39
24
  <script setup lang="ts">
40
- import type { FieldDescriptor } from "@mapomodule/form";
25
+ import type { FieldDescriptor } from "mapomodule/types";
41
26
 
42
27
  interface Article {
43
28
  title: string;
@@ -60,96 +45,30 @@ const fields: FieldDescriptor<Article>[] = [
60
45
  </template>
61
46
  ```
62
47
 
63
- The `registry` prop is optional — `<MapoForm>` falls back to the global `$mapoFormRegistry` provided by this module's plugin. Pass it explicitly only when you want to swap the registry for a single form.
64
-
65
- ## Field types
66
-
67
- | Type | Component | Notes |
68
- | ---------------------------- | --------------------- | ----------------------------------------------------------- |
69
- | `text` | `UInput` | |
70
- | `textarea` | `UTextarea` | |
71
- | `number` | `UInput[type=number]` | |
72
- | `boolean` | `UCheckbox` | |
73
- | `switch` | `USwitch` | |
74
- | `color` | `UInput[type=color]` | |
75
- | `slider` | `USlider` | |
76
- | `file` | `MapoFileField` | Current-file preview, image thumbnail, remove button |
77
- | `select` | `USelectMenu` | requires `attrs.options` |
78
- | `date` / `datetime` / `time` | `MapoDateField` etc. | ISO string in model; `tz: 'naive' \| 'utc'` for `datetime` |
79
- | `fks` | `MapoFksField` | FK autocomplete; `attrs.endpoint` required |
80
- | `m2m` | `MapoFksField` | Multi-select autocomplete, removable chips |
81
- | `editor` | `MapoWygEditor` | Tiptap v2; sanitized output, safe `Link` validator |
82
- | `seo` | `MapoSeoPreview` | Title / description with live SERP preview |
83
- | `map` | `MapoMapField` | Leaflet, `{ lat, lng }` in model, SSR-safe via `ClientOnly` |
84
- | `repeater` | `MapoRepeater` | Nested fields, drag-and-drop, undo stack, templates |
85
-
86
- ## JSON Schema → Form
87
-
88
- ```ts
89
- const schema = await $fetch("/api/schema/");
90
- const fields = useFormFromSchema(schema, {
91
- exclude: ["id", "created_at"],
92
- overrides: {
93
- body: { type: "editor", translatable: true },
94
- },
95
- });
96
- ```
48
+ The built-in types cover text and numbers, choices, dates and times, files, relations (`fks`, `m2m`), rich text, SEO preview, maps, repeaters and media pickers. The media pickers drive the Media Manager of `@mapomodule/uikit` and show a notice when it is not installed. A `type` the registry does not know renders `MapoUnknownField` instead of breaking the form.
97
49
 
98
- ## Headless
50
+ ## What you get
99
51
 
100
- ```ts
101
- const form = useMapoForm({ model, fields, registry: $mapoFormRegistry });
52
+ Components and composables are auto-imported.
102
53
 
103
- // form.isDirty, form.isLoading, form.getPatch(), form.submit(handler)
104
- ```
105
-
106
- The headless composable still requires the registry explicitly — `useNuxtApp()` is not available in every context where you might want to drive a form (tests, storybook, server-side preview).
107
-
108
- ## Draft persistence (headless)
54
+ | API | Purpose |
55
+ | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
56
+ | `MapoForm` | Renders a `FieldDescriptor[]` on your model, with tabs, collapsible groups, a responsive grid and slots |
57
+ | `useMapoForm(options)` | The same engine headless: dirty state, client validation, `getPatch()`, `submit()`, drafts. Pass `registry` explicitly |
58
+ | `defineFormField(type, component, opts?)` | Registers a custom field type from a plugin: a component or a lazy `import()`, with optional default `attrs` and accessor. Re-registering a type warns unless you pass `{ override: true }` |
59
+ | `useFormFromSchema(schema, opts?)` | Builds descriptors from a JSON Schema, such as a DRF-spectacular or Pydantic schema |
60
+ | `when`, `whenAny`, `whenNot`, `matchesField`, `isOneOf`, … | Build `visible` conditions declaratively |
61
+ | `useFormDraft`, `useFocusMode`, `useCurrentLang` | Draft autosave, focus mode, the language being edited |
62
+ | `$mapoFormRegistry` | The global registry: type → component, default `attrs`, accessor |
109
63
 
110
- ```ts
111
- const form = useMapoForm({
112
- model,
113
- fields,
114
- registry: $mapoFormRegistry,
115
- draftKey: `article:${route.params.id}`,
116
- });
117
-
118
- // After fetch:
119
- form.checkDraft(); // populates form.draftBanner if a draft is found
120
- ```
121
-
122
- `form.draftBanner.value` exposes `{ savedAt, restore(), discard() }`. On `submit()` success the draft is cleared automatically. When using `<MapoDetail :draft="true">`, all of this is handled for you.
123
-
124
- ## Custom fields
125
-
126
- The recommended way to register a custom field is the typed `defineFormField()` helper, called from a Nuxt plugin:
127
-
128
- ```ts
129
- // app/plugins/my-fields.ts
130
- export default defineNuxtPlugin(() => {
131
- defineFormField("rich-text", () => import("~/components/RichText.vue"), {
132
- attrs: { rows: 6 },
133
- });
134
- });
135
- ```
136
-
137
- Plugins in `app/plugins/` run after module plugins, so `$mapoFormRegistry` is always available. Re-registering an existing type prints a development warning unless you pass `{ override: true }` explicitly.
138
-
139
- Any component with `modelValue` + `descriptor` + `errors` + `readonly` props works as a field.
64
+ A custom field is any component that accepts the `modelValue`, `descriptor`, `errors`, `readonly` and `disabled` props and emits `update:modelValue`.
140
65
 
141
66
  ## Documentation
142
67
 
143
- Full docs: [Form Engine — Quickstart](../../../docs/uikit/form/index.md)
144
-
145
- - [All field types](../../../docs/uikit/form/add-fields.md)
146
- - [Validation](../../../docs/uikit/form/validation.md)
147
- - [i18n / multilingual fields](../../../docs/uikit/form/i18n.md)
148
- - [`useMapoForm()` headless](../../../docs/uikit/form/composable.md)
149
- - [Custom fields & registry](../../../docs/uikit/form/custom-fields.md)
150
- - [Slot system](../../../docs/uikit/form/slots.md)
151
- - [JSON Schema bridge](../../../docs/uikit/form/schema-to-form.md)
152
-
153
- ## License
154
-
155
- MIT
68
+ - [Form Engine](https://lotrekagency.github.io/mapo-new/uikit/form/): your first form, tabs and groups, how the engine works
69
+ - [All field types](https://lotrekagency.github.io/mapo-new/uikit/form/add-fields)
70
+ - [Field registry](https://lotrekagency.github.io/mapo-new/uikit/form/registry) and [Custom fields](https://lotrekagency.github.io/mapo-new/uikit/form/custom-fields)
71
+ - [Validation](https://lotrekagency.github.io/mapo-new/uikit/form/validation), [Multilingual fields](https://lotrekagency.github.io/mapo-new/uikit/form/i18n), [Draft autosave](https://lotrekagency.github.io/mapo-new/uikit/form/draft), [Progressive Disclosure](https://lotrekagency.github.io/mapo-new/uikit/form/progressive-disclosure)
72
+ - [`useMapoForm()` reference](https://lotrekagency.github.io/mapo-new/uikit/form/composable)
73
+ - [From JSON Schema to form](https://lotrekagency.github.io/mapo-new/uikit/form/schema-to-form)
74
+ - [Form Engine — Component API Reference](https://lotrekagency.github.io/mapo-new/uikit/form/api)
@@ -0,0 +1,4 @@
1
+ export declare const useSnackStore: import("vitest").Mock<() => {
2
+ show: import("vitest").Mock<(...args: any[]) => any>;
3
+ }>;
4
+ //# sourceMappingURL=nuxt-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxt-imports.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/nuxt-imports.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;EAEvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=camomillaRoundTrip.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camomillaRoundTrip.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/camomillaRoundTrip.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tabVisibility.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabVisibility.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tabVisibility.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useFormFromSchema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormFromSchema.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useFormFromSchema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useMapoForm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMapoForm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useMapoForm.test.ts"],"names":[],"mappings":""}
package/dist/index.d.mts CHANGED
@@ -1 +1,9 @@
1
- export * from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.js";
1
+ export { MapoFormOptions } from './module.mjs';
2
+ export { UseFormFromSchemaOptions, useFormFromSchema } from '../dist/runtime/composables/useFormFromSchema.js';
3
+ export { UseFormDraftOptions, useFormDraft } from '../dist/runtime/composables/useFormDraft.js';
4
+ export { FocusTarget, useFocusMode } from '../dist/runtime/composables/useFocusMode.js';
5
+ export { UnsavedChangesGuardOptions, useUnsavedChangesGuard } from '../dist/runtime/composables/useUnsavedChangesGuard.js';
6
+ export { greaterThan, isEmpty, isNoneOf, isNotEmpty, isOneOf, lessThan, matches, matchesField, when, whenAny, whenNot } from '../dist/runtime/composables/useProgressiveDisclosure.js';
7
+ export { FieldGroupDescriptor, flattenFieldGroups } from '../dist/runtime/utils/flattenFieldGroups.js';
8
+ export { AnyFieldDescriptor, BooleanDescriptor, ColorDescriptor, CustomDescriptor, DateDescriptor, EditorDescriptor, EnhancedMediaDescriptor, EnhancedMediaValue, FieldAccessor, FieldComponentEntry, FieldDescriptor, FieldRegistry, FieldType, FileDescriptor, FksDescriptor, KnownFieldType, MapDescriptor, MediaDescriptor, MediaItem, MediaLink, MediaM2mDescriptor, NumberDescriptor, PartialFieldRegistry, RepeaterDescriptor, SelectDescriptor, SeoDescriptor, TextDescriptor } from '../dist/runtime/types/index.js';
9
+ import '@nuxt/schema';
package/dist/index.d.ts CHANGED
@@ -1 +1,15 @@
1
- export * from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.js";
1
+ export type { MapoFormOptions } from "./module.js";
2
+ export { useFormFromSchema } from "./runtime/composables/useFormFromSchema.js";
3
+ export type { UseFormFromSchemaOptions } from "./runtime/composables/useFormFromSchema.js";
4
+ export { useFormDraft } from "./runtime/composables/useFormDraft.js";
5
+ export type { UseFormDraftOptions } from "./runtime/composables/useFormDraft.js";
6
+ export { useFocusMode } from "./runtime/composables/useFocusMode.js";
7
+ export type { FocusTarget } from "./runtime/composables/useFocusMode.js";
8
+ export { useUnsavedChangesGuard } from "./runtime/composables/useUnsavedChangesGuard.js";
9
+ export type { UnsavedChangesGuardOptions } from "./runtime/composables/useUnsavedChangesGuard.js";
10
+ export { when, whenAny, whenNot, matchesField, isOneOf, isNoneOf, isNotEmpty, isEmpty, greaterThan, lessThan, matches, } from "./runtime/composables/useProgressiveDisclosure.js";
11
+ export { flattenFieldGroups } from "./runtime/utils/flattenFieldGroups.js";
12
+ export type { FieldGroupDescriptor } from "./runtime/utils/flattenFieldGroups.js";
13
+ export { KnownFieldType } from "./runtime/types/index.js";
14
+ export type { FieldType, FieldAccessor, FieldDescriptor, AnyFieldDescriptor, TextDescriptor, NumberDescriptor, BooleanDescriptor, SelectDescriptor, FksDescriptor, DateDescriptor, ColorDescriptor, FileDescriptor, EditorDescriptor, SeoDescriptor, MapDescriptor, RepeaterDescriptor, MediaDescriptor, MediaM2mDescriptor, EnhancedMediaDescriptor, CustomDescriptor, MediaLink, MediaItem, EnhancedMediaValue, FieldComponentEntry, FieldRegistry, PartialFieldRegistry, } from "./runtime/types/index.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,YAAY,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAElG,OAAO,EACL,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAU,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EACR,OAAO,GACR,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,SAAS,EACT,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,0BAA0B,CAAC"}
package/dist/index.mjs CHANGED
@@ -1,34 +1,7 @@
1
- import { createJiti } from "file:///home/runner/work/mapo-new/mapo-new/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/jiti.mjs";
2
-
3
- const jiti = createJiti(import.meta.url, {
4
- "interopDefault": true,
5
- "alias": {
6
- "@mapomodule/form": "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form"
7
- },
8
- "transformOptions": {
9
- "babel": {
10
- "plugins": []
11
- }
12
- }
13
- })
14
-
15
- /** @type {import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.js")} */
16
- const _module = await jiti.import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.ts");
17
-
18
- export const useFormFromSchema = _module.useFormFromSchema;
19
- export const useFormDraft = _module.useFormDraft;
20
- export const useFocusMode = _module.useFocusMode;
21
- export const useUnsavedChangesGuard = _module.useUnsavedChangesGuard;
22
- export const when = _module.when;
23
- export const whenAny = _module.whenAny;
24
- export const whenNot = _module.whenNot;
25
- export const matchesField = _module.matchesField;
26
- export const isOneOf = _module.isOneOf;
27
- export const isNoneOf = _module.isNoneOf;
28
- export const isNotEmpty = _module.isNotEmpty;
29
- export const isEmpty = _module.isEmpty;
30
- export const greaterThan = _module.greaterThan;
31
- export const lessThan = _module.lessThan;
32
- export const matches = _module.matches;
33
- export const flattenFieldGroups = _module.flattenFieldGroups;
34
- export const KnownFieldType = _module.KnownFieldType;
1
+ export { useFormFromSchema } from '../dist/runtime/composables/useFormFromSchema.js';
2
+ export { useFormDraft } from '../dist/runtime/composables/useFormDraft.js';
3
+ export { useFocusMode } from '../dist/runtime/composables/useFocusMode.js';
4
+ export { useUnsavedChangesGuard } from '../dist/runtime/composables/useUnsavedChangesGuard.js';
5
+ export { greaterThan, isEmpty, isNoneOf, isNotEmpty, isOneOf, lessThan, matches, matchesField, when, whenAny, whenNot } from '../dist/runtime/composables/useProgressiveDisclosure.js';
6
+ export { flattenFieldGroups } from '../dist/runtime/utils/flattenFieldGroups.js';
7
+ export { KnownFieldType } from '../dist/runtime/types/index.js';
package/dist/module.d.mts CHANGED
@@ -1,2 +1,20 @@
1
- export * from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.js";
2
- export { default } from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.js";
1
+ import { NuxtModule } from '@nuxt/schema';
2
+ import { PartialFieldRegistry } from '../dist/runtime/types/index.js';
3
+ import '../dist/runtime/composables/useFormFromSchema.js';
4
+ import '../dist/runtime/composables/useFormDraft.js';
5
+ import '../dist/runtime/composables/useFocusMode.js';
6
+ import '../dist/runtime/composables/useUnsavedChangesGuard.js';
7
+ import '../dist/runtime/composables/useProgressiveDisclosure.js';
8
+ import '../dist/runtime/utils/flattenFieldGroups.js';
9
+
10
+ interface MapoFormOptions {
11
+ fields?: PartialFieldRegistry;
12
+ groups?: {
13
+ expanded?: boolean;
14
+ };
15
+ debounce?: number;
16
+ }
17
+ declare const _default: NuxtModule<MapoFormOptions, MapoFormOptions, false>;
18
+
19
+ export { _default as default };
20
+ export type { MapoFormOptions };
package/dist/module.d.ts CHANGED
@@ -1,2 +1,12 @@
1
- export * from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.js";
2
- export { default } from "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.js";
1
+ import type { NuxtModule } from "@nuxt/schema";
2
+ import type { PartialFieldRegistry } from "./runtime/types/index.js";
3
+ export interface MapoFormOptions {
4
+ fields?: PartialFieldRegistry;
5
+ groups?: {
6
+ expanded?: boolean;
7
+ };
8
+ debounce?: number;
9
+ }
10
+ declare const _default: NuxtModule<MapoFormOptions, MapoFormOptions, false>;
11
+ export default _default;
12
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;;AAED,wBAkOyC"}
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mapomodule/form",
3
3
  "configKey": "mapoForm",
4
- "version": "2.0.0-beta.1",
4
+ "version": "2.0.0-beta.11",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "unknown"
package/dist/module.mjs CHANGED
@@ -1,18 +1,192 @@
1
- import { createJiti } from "file:///home/runner/work/mapo-new/mapo-new/node_modules/.pnpm/jiti@2.6.1/node_modules/jiti/lib/jiti.mjs";
1
+ import { defineNuxtModule, createResolver, hasNuxtModule, installModule, addPlugin, addTypeTemplate, extendPages, addComponent, addImports } from '@nuxt/kit';
2
2
 
3
- const jiti = createJiti(import.meta.url, {
4
- "interopDefault": true,
5
- "alias": {
6
- "@mapomodule/form": "/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form"
3
+ const module$1 = defineNuxtModule({
4
+ meta: {
5
+ name: "@mapomodule/form",
6
+ configKey: "mapoForm"
7
7
  },
8
- "transformOptions": {
9
- "babel": {
10
- "plugins": []
8
+ defaults: {
9
+ debounce: 300,
10
+ groups: { expanded: true }
11
+ },
12
+ async setup(options, nuxt) {
13
+ const resolver = createResolver(import.meta.url);
14
+ nuxt.options.build.transpile.push(resolver.resolve("./runtime"));
15
+ nuxt.options.imports.transform ??= {};
16
+ (nuxt.options.imports.transform.include ??= []).push(
17
+ /@mapomodule[\\/]form[\\/]/
18
+ );
19
+ if (!hasNuxtModule("@mapomodule/i18n")) {
20
+ await installModule(await resolver.resolvePath("@mapomodule/i18n"));
11
21
  }
22
+ nuxt.options.runtimeConfig.public.mapoForm = {
23
+ groups: { expanded: options.groups?.expanded ?? true },
24
+ debounce: options.debounce ?? 300,
25
+ // attrs is JSON-serialisable (plain objects) — merged in the plugin
26
+ fields: { attrs: options.fields?.attrs ?? {} }
27
+ };
28
+ addPlugin(resolver.resolve("./runtime/plugins/form-registry"));
29
+ addTypeTemplate({
30
+ filename: "types/mapo-form-registry.d.ts",
31
+ getContents: () => `
32
+ import type { FieldRegistry } from '@mapomodule/form/types';
33
+ declare module '#app' {
34
+ interface NuxtApp {
35
+ $mapoFormRegistry: FieldRegistry;
12
36
  }
13
- })
14
-
15
- /** @type {import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.js")} */
16
- const _module = await jiti.import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/module.ts");
37
+ }
38
+ declare module 'vue' {
39
+ interface ComponentCustomProperties {
40
+ $mapoFormRegistry: FieldRegistry;
41
+ }
42
+ }
43
+ export {};
44
+ `
45
+ });
46
+ if (nuxt.options.dev) {
47
+ extendPages((pages) => {
48
+ pages.push({
49
+ name: "mapo-devtools-forms",
50
+ path: "/_mapo/devtools/forms",
51
+ file: resolver.resolve("./runtime/devtools/DevtoolsFormsPage.vue")
52
+ });
53
+ });
54
+ nuxt.hook(
55
+ "devtools:customTabs",
56
+ (tabs) => {
57
+ tabs.push({
58
+ name: "mapo-forms",
59
+ title: "Mapo Forms",
60
+ icon: "i-lucide-layout-list",
61
+ view: { type: "iframe", src: "/_mapo/devtools/forms" }
62
+ });
63
+ }
64
+ );
65
+ }
66
+ const shellComponents = [
67
+ "MapoForm",
68
+ "MapoFormField",
69
+ "MapoFormGroup",
70
+ "MapoFormTabs",
71
+ "MapoUnknownField",
72
+ "MapoFocusPortal"
73
+ ];
74
+ for (const name of shellComponents) {
75
+ addComponent({
76
+ name,
77
+ filePath: resolver.resolve(`./runtime/components/${name}.vue`)
78
+ });
79
+ }
80
+ const mediaFieldComponents = [
81
+ "MapoMediaField",
82
+ "MapoMediaM2mField",
83
+ "MapoEnhancedMediaField",
84
+ "MapoMediaUnavailable"
85
+ ];
86
+ for (const name of mediaFieldComponents) {
87
+ addComponent({
88
+ name,
89
+ filePath: resolver.resolve(`./runtime/components/fields/${name}.vue`)
90
+ });
91
+ }
92
+ addImports([
93
+ {
94
+ name: "useMapoForm",
95
+ from: resolver.resolve("./runtime/composables/useMapoForm")
96
+ },
97
+ {
98
+ name: "useCurrentLang",
99
+ from: resolver.resolve("./runtime/composables/useCurrentLang")
100
+ },
101
+ {
102
+ name: "provideCurrentLang",
103
+ from: resolver.resolve("./runtime/composables/useCurrentLang")
104
+ },
105
+ {
106
+ name: "useFormFromSchema",
107
+ from: resolver.resolve("./runtime/composables/useFormFromSchema")
108
+ },
109
+ {
110
+ name: "useFormDraft",
111
+ from: resolver.resolve("./runtime/composables/useFormDraft")
112
+ },
113
+ {
114
+ name: "useFocusMode",
115
+ from: resolver.resolve("./runtime/composables/useFocusMode")
116
+ },
117
+ {
118
+ name: "defineFormField",
119
+ from: resolver.resolve("./runtime/composables/defineFormField")
120
+ },
121
+ // Progressive disclosure DSL
122
+ {
123
+ name: "when",
124
+ from: resolver.resolve(
125
+ "./runtime/composables/useProgressiveDisclosure"
126
+ )
127
+ },
128
+ {
129
+ name: "whenAny",
130
+ from: resolver.resolve(
131
+ "./runtime/composables/useProgressiveDisclosure"
132
+ )
133
+ },
134
+ {
135
+ name: "whenNot",
136
+ from: resolver.resolve(
137
+ "./runtime/composables/useProgressiveDisclosure"
138
+ )
139
+ },
140
+ {
141
+ name: "matchesField",
142
+ from: resolver.resolve(
143
+ "./runtime/composables/useProgressiveDisclosure"
144
+ )
145
+ },
146
+ {
147
+ name: "isOneOf",
148
+ from: resolver.resolve(
149
+ "./runtime/composables/useProgressiveDisclosure"
150
+ )
151
+ },
152
+ {
153
+ name: "isNoneOf",
154
+ from: resolver.resolve(
155
+ "./runtime/composables/useProgressiveDisclosure"
156
+ )
157
+ },
158
+ {
159
+ name: "isNotEmpty",
160
+ from: resolver.resolve(
161
+ "./runtime/composables/useProgressiveDisclosure"
162
+ )
163
+ },
164
+ {
165
+ name: "isEmpty",
166
+ from: resolver.resolve(
167
+ "./runtime/composables/useProgressiveDisclosure"
168
+ )
169
+ },
170
+ {
171
+ name: "greaterThan",
172
+ from: resolver.resolve(
173
+ "./runtime/composables/useProgressiveDisclosure"
174
+ )
175
+ },
176
+ {
177
+ name: "lessThan",
178
+ from: resolver.resolve(
179
+ "./runtime/composables/useProgressiveDisclosure"
180
+ )
181
+ },
182
+ {
183
+ name: "matches",
184
+ from: resolver.resolve(
185
+ "./runtime/composables/useProgressiveDisclosure"
186
+ )
187
+ }
188
+ ]);
189
+ }
190
+ });
17
191
 
18
- export default _module?.default ?? _module;
192
+ export { module$1 as default };