@mapomodule/form 2.0.0-beta.0 → 2.0.0-beta.10

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 (194) hide show
  1. package/README.md +2 -1
  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__/useFormFromSchema.test.d.ts +2 -0
  9. package/dist/__tests__/useFormFromSchema.test.d.ts.map +1 -0
  10. package/dist/__tests__/useMapoForm.test.d.ts +2 -0
  11. package/dist/__tests__/useMapoForm.test.d.ts.map +1 -0
  12. package/dist/index.d.mts +9 -1
  13. package/dist/index.d.ts +15 -1
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.mjs +7 -34
  16. package/dist/module.d.mts +20 -2
  17. package/dist/module.d.ts +12 -2
  18. package/dist/module.d.ts.map +1 -0
  19. package/dist/module.json +1 -1
  20. package/dist/module.mjs +187 -13
  21. package/dist/runtime/components/MapoFocusPortal.vue +115 -0
  22. package/dist/runtime/components/MapoFocusPortal.vue.d.ts +4 -0
  23. package/dist/runtime/components/MapoFocusPortal.vue.d.ts.map +1 -0
  24. package/dist/runtime/components/MapoForm.vue +168 -0
  25. package/dist/runtime/components/MapoForm.vue.d.ts +47 -0
  26. package/dist/runtime/components/MapoForm.vue.d.ts.map +1 -0
  27. package/dist/runtime/components/MapoFormField.vue +269 -0
  28. package/dist/runtime/components/MapoFormField.vue.d.ts +46 -0
  29. package/dist/runtime/components/MapoFormField.vue.d.ts.map +1 -0
  30. package/dist/runtime/components/MapoFormFlatSection.vue +149 -0
  31. package/dist/runtime/components/MapoFormFlatSection.vue.d.ts +15 -0
  32. package/dist/runtime/components/MapoFormFlatSection.vue.d.ts.map +1 -0
  33. package/dist/runtime/components/MapoFormGroup.vue +247 -0
  34. package/dist/runtime/components/MapoFormGroup.vue.d.ts +44 -0
  35. package/dist/runtime/components/MapoFormGroup.vue.d.ts.map +1 -0
  36. package/dist/runtime/components/MapoFormTabs.vue +110 -0
  37. package/dist/runtime/components/MapoFormTabs.vue.d.ts +15 -0
  38. package/dist/runtime/components/MapoFormTabs.vue.d.ts.map +1 -0
  39. package/dist/runtime/components/MapoUnknownField.vue +62 -0
  40. package/dist/runtime/components/MapoUnknownField.vue.d.ts +16 -0
  41. package/dist/runtime/components/MapoUnknownField.vue.d.ts.map +1 -0
  42. package/dist/runtime/components/fields/MapoDateField.vue +88 -0
  43. package/dist/runtime/components/fields/MapoDateField.vue.d.ts +17 -0
  44. package/dist/runtime/components/fields/MapoDateField.vue.d.ts.map +1 -0
  45. package/dist/runtime/components/fields/MapoDateTimeField.vue +159 -0
  46. package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts +17 -0
  47. package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts.map +1 -0
  48. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue +130 -0
  49. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts +16 -0
  50. package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts.map +1 -0
  51. package/dist/runtime/components/fields/MapoFileField.vue +99 -0
  52. package/dist/runtime/components/fields/MapoFileField.vue.d.ts +16 -0
  53. package/dist/runtime/components/fields/MapoFileField.vue.d.ts.map +1 -0
  54. package/dist/runtime/components/fields/MapoFksField.vue +122 -0
  55. package/dist/runtime/components/fields/MapoFksField.vue.d.ts +16 -0
  56. package/dist/runtime/components/fields/MapoFksField.vue.d.ts.map +1 -0
  57. package/dist/runtime/components/fields/MapoMapField.vue +99 -0
  58. package/dist/runtime/components/fields/MapoMapField.vue.d.ts +22 -0
  59. package/dist/runtime/components/fields/MapoMapField.vue.d.ts.map +1 -0
  60. package/dist/runtime/components/fields/MapoMapFieldClient.vue +67 -0
  61. package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts +20 -0
  62. package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts.map +1 -0
  63. package/dist/runtime/components/fields/MapoMediaField.vue +91 -0
  64. package/dist/runtime/components/fields/MapoMediaField.vue.d.ts +16 -0
  65. package/dist/runtime/components/fields/MapoMediaField.vue.d.ts.map +1 -0
  66. package/dist/runtime/components/fields/MapoMediaM2mField.vue +110 -0
  67. package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts +16 -0
  68. package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts.map +1 -0
  69. package/dist/runtime/components/fields/MapoMediaUnavailable.vue +15 -0
  70. package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts +4 -0
  71. package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts.map +1 -0
  72. package/dist/runtime/components/fields/MapoRepeater.vue +459 -0
  73. package/dist/runtime/components/fields/MapoRepeater.vue.d.ts +16 -0
  74. package/dist/runtime/components/fields/MapoRepeater.vue.d.ts.map +1 -0
  75. package/dist/runtime/components/fields/MapoRepeaterItem.vue +346 -0
  76. package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts +55 -0
  77. package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts.map +1 -0
  78. package/dist/runtime/components/fields/MapoSeoPreview.vue +122 -0
  79. package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts +22 -0
  80. package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts.map +1 -0
  81. package/dist/runtime/components/fields/MapoTimeField.vue +44 -0
  82. package/dist/runtime/components/fields/MapoTimeField.vue.d.ts +17 -0
  83. package/dist/runtime/components/fields/MapoTimeField.vue.d.ts.map +1 -0
  84. package/dist/runtime/components/fields/MapoWygEditor.vue +252 -0
  85. package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts +16 -0
  86. package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts.map +1 -0
  87. package/dist/runtime/components/fields/nui/NuiCheckbox.vue +9 -0
  88. package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts +4 -0
  89. package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts.map +1 -0
  90. package/dist/runtime/components/fields/nui/NuiInput.vue +9 -0
  91. package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts +4 -0
  92. package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts.map +1 -0
  93. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue +18 -0
  94. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts +4 -0
  95. package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts.map +1 -0
  96. package/dist/runtime/components/fields/nui/NuiSlider.vue +9 -0
  97. package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts +4 -0
  98. package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts.map +1 -0
  99. package/dist/runtime/components/fields/nui/NuiSwitch.vue +9 -0
  100. package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts +4 -0
  101. package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts.map +1 -0
  102. package/dist/runtime/components/fields/nui/NuiTextarea.vue +9 -0
  103. package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts +4 -0
  104. package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts.map +1 -0
  105. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts +13 -0
  106. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts.map +1 -0
  107. package/dist/runtime/components/fields/nui/useNuiFieldAttrs.js +19 -0
  108. package/dist/runtime/composables/defineFormField.d.ts +25 -0
  109. package/dist/runtime/composables/defineFormField.d.ts.map +1 -0
  110. package/dist/runtime/composables/defineFormField.js +27 -0
  111. package/dist/runtime/composables/useCurrentLang.d.ts +6 -0
  112. package/dist/runtime/composables/useCurrentLang.d.ts.map +1 -0
  113. package/dist/runtime/composables/useCurrentLang.js +9 -0
  114. package/dist/runtime/composables/useFocusMode.d.ts +40 -0
  115. package/dist/runtime/composables/useFocusMode.d.ts.map +1 -0
  116. package/dist/runtime/composables/useFocusMode.js +31 -0
  117. package/dist/runtime/composables/useFormDraft.d.ts +60 -0
  118. package/dist/runtime/composables/useFormDraft.d.ts.map +1 -0
  119. package/dist/runtime/composables/useFormDraft.js +52 -0
  120. package/dist/runtime/composables/useFormFromSchema.d.ts +21 -0
  121. package/dist/runtime/composables/useFormFromSchema.d.ts.map +1 -0
  122. package/dist/runtime/composables/useFormFromSchema.js +145 -0
  123. package/dist/runtime/composables/useMapoForm.d.ts +96 -0
  124. package/dist/runtime/composables/useMapoForm.d.ts.map +1 -0
  125. package/dist/runtime/composables/useMapoForm.js +325 -0
  126. package/dist/runtime/composables/useMediaManager.d.ts +17 -0
  127. package/dist/runtime/composables/useMediaManager.d.ts.map +1 -0
  128. package/dist/runtime/composables/useMediaManager.js +6 -0
  129. package/dist/runtime/composables/useProgressiveDisclosure.d.ts +44 -0
  130. package/dist/runtime/composables/useProgressiveDisclosure.d.ts.map +1 -0
  131. package/dist/runtime/composables/useProgressiveDisclosure.js +23 -0
  132. package/dist/runtime/composables/useUnsavedChangesGuard.d.ts +24 -0
  133. package/dist/runtime/composables/useUnsavedChangesGuard.d.ts.map +1 -0
  134. package/dist/runtime/composables/useUnsavedChangesGuard.js +28 -0
  135. package/dist/runtime/devtools/DevtoolsFormsPage.vue +235 -0
  136. package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts +4 -0
  137. package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts.map +1 -0
  138. package/dist/runtime/plugins/form-registry.d.ts +18 -0
  139. package/dist/runtime/plugins/form-registry.d.ts.map +1 -0
  140. package/dist/runtime/plugins/form-registry.js +19 -0
  141. package/dist/runtime/registry/defaults.d.ts +3 -0
  142. package/dist/runtime/registry/defaults.d.ts.map +1 -0
  143. package/dist/runtime/registry/defaults.js +93 -0
  144. package/dist/runtime/types/descriptor.d.ts +373 -0
  145. package/dist/runtime/types/descriptor.d.ts.map +1 -0
  146. package/dist/runtime/types/descriptor.js +26 -0
  147. package/dist/runtime/types/index.d.ts +12 -0
  148. package/dist/runtime/types/index.d.ts.map +1 -0
  149. package/dist/runtime/types/index.js +6 -0
  150. package/dist/runtime/types/layout.d.ts +21 -0
  151. package/dist/runtime/types/layout.d.ts.map +1 -0
  152. package/dist/runtime/types/layout.js +0 -0
  153. package/dist/runtime/types/media.d.ts +43 -0
  154. package/dist/runtime/types/media.d.ts.map +1 -0
  155. package/dist/runtime/types/media.js +0 -0
  156. package/dist/runtime/types/registry.d.ts +62 -0
  157. package/dist/runtime/types/registry.d.ts.map +1 -0
  158. package/dist/runtime/types/registry.js +19 -0
  159. package/dist/runtime/utils/flattenFieldGroups.d.ts +50 -0
  160. package/dist/runtime/utils/flattenFieldGroups.d.ts.map +1 -0
  161. package/dist/runtime/utils/flattenFieldGroups.js +24 -0
  162. package/dist/types.d.mts +6 -10
  163. package/package.json +10 -8
  164. package/src/__tests__/article.schema.json +193 -0
  165. package/src/__tests__/camomillaRoundTrip.test.ts +73 -0
  166. package/src/__tests__/useFormFromSchema.test.ts +24 -0
  167. package/src/__tests__/useMapoForm.test.ts +5 -0
  168. package/src/index.ts +5 -0
  169. package/src/module.ts +34 -0
  170. package/src/runtime/components/MapoFocusPortal.vue +3 -1
  171. package/src/runtime/components/MapoFormTabs.vue +4 -1
  172. package/src/runtime/components/fields/MapoDateField.vue +3 -1
  173. package/src/runtime/components/fields/MapoDateTimeField.vue +3 -1
  174. package/src/runtime/components/fields/MapoEnhancedMediaField.vue +153 -0
  175. package/src/runtime/components/fields/MapoFileField.vue +3 -1
  176. package/src/runtime/components/fields/MapoFksField.vue +7 -2
  177. package/src/runtime/components/fields/MapoMapField.vue +5 -2
  178. package/src/runtime/components/fields/MapoMediaField.vue +104 -0
  179. package/src/runtime/components/fields/MapoMediaM2mField.vue +130 -0
  180. package/src/runtime/components/fields/MapoMediaUnavailable.vue +19 -0
  181. package/src/runtime/components/fields/MapoRepeater.vue +33 -26
  182. package/src/runtime/components/fields/MapoRepeaterItem.vue +14 -8
  183. package/src/runtime/components/fields/MapoSeoPreview.vue +17 -13
  184. package/src/runtime/components/fields/MapoWygEditor.vue +47 -5
  185. package/src/runtime/composables/useFormFromSchema.ts +4 -1
  186. package/src/runtime/composables/useMapoForm.ts +4 -2
  187. package/src/runtime/composables/useMediaManager.ts +21 -0
  188. package/src/runtime/composables/useUnsavedChangesGuard.ts +3 -3
  189. package/src/runtime/registry/defaults.ts +9 -1
  190. package/src/runtime/types/descriptor.ts +22 -7
  191. package/src/runtime/types/index.ts +4 -0
  192. package/src/runtime/types/media.ts +44 -0
  193. package/dist/index.d.cts +0 -1
  194. package/dist/module.d.cts +0 -2
package/README.md CHANGED
@@ -5,7 +5,7 @@ Form engine for Mapo v2 — descriptor-driven, typesafe, headless-ready admin fo
5
5
  ## Features
6
6
 
7
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
8
+ - **All field types built-in**: text, select, date/time, FK/M2M autocomplete, WYSIWYG editor, SEO preview, map, repeater, media pickers
9
9
  - **Headless composable**: `useMapoForm()` for fully custom layouts; `<MapoForm>` for the default shell
10
10
  - **Registry auto-injection**: `<MapoForm>` and `<MapoDetail>` resolve `$mapoFormRegistry` automatically — no boilerplate
11
11
  - **Typed extension API**: `defineFormField(type, entry, opts)` to register custom fields with collision detection
@@ -16,6 +16,7 @@ Form engine for Mapo v2 — descriptor-driven, typesafe, headless-ready admin fo
16
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
17
  - **Draft persistence**: `draftKey` option on `useMapoForm()` auto-saves to localStorage every 2 s; `checkDraft()` / `draftBanner` offer restore/discard; clears on successful `submit()`
18
18
  - **Fail-soft**: unknown field types render a non-destructive placeholder, never crash the form
19
+ - **Media pickers**: `media`, `media-m2m` and `enhanced-media` field types are built in; they drive the Media Manager from [`@mapomodule/uikit`](../uikit/README.md), resolved at runtime — install it to enable them
19
20
 
20
21
  ## Install
21
22
 
@@ -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=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 "/Volumes/Development/Lotrek/Projects/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 "/Volumes/Development/Lotrek/Projects/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:///Volumes/Development/Lotrek/Projects/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": "/Volumes/Development/Lotrek/Projects/mapo-new/packages/@mapomodule/form"
7
- },
8
- "transformOptions": {
9
- "babel": {
10
- "plugins": []
11
- }
12
- }
13
- })
14
-
15
- /** @type {import("/Volumes/Development/Lotrek/Projects/mapo-new/packages/@mapomodule/form/src/index.js")} */
16
- const _module = await jiti.import("/Volumes/Development/Lotrek/Projects/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 "/Volumes/Development/Lotrek/Projects/mapo-new/packages/@mapomodule/form/src/module.js";
2
- export { default } from "/Volumes/Development/Lotrek/Projects/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 "/Volumes/Development/Lotrek/Projects/mapo-new/packages/@mapomodule/form/src/module.js";
2
- export { default } from "/Volumes/Development/Lotrek/Projects/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.0",
4
+ "version": "2.0.0-beta.10",
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:///Volumes/Development/Lotrek/Projects/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": "/Volumes/Development/Lotrek/Projects/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("/Volumes/Development/Lotrek/Projects/mapo-new/packages/@mapomodule/form/src/module.js")} */
16
- const _module = await jiti.import("/Volumes/Development/Lotrek/Projects/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 };
@@ -0,0 +1,115 @@
1
+ <script setup>
2
+ import { computed, ref, onMounted, onUnmounted } from "vue";
3
+ import { watch } from "vue";
4
+ import { useI18n } from "vue-i18n";
5
+ import { useFocusMode } from "../composables/useFocusMode.js";
6
+ import MapoForm from "./MapoForm.vue";
7
+ const { t } = useI18n();
8
+ const { focusTarget, exit } = useFocusMode();
9
+ const isOpen = computed(() => focusTarget.value !== null);
10
+ const canUseDocument = typeof document !== "undefined";
11
+ function onKeyDown(e) {
12
+ if (e.key === "Escape" && isOpen.value) exit();
13
+ }
14
+ onMounted(() => window.addEventListener("keydown", onKeyDown));
15
+ onUnmounted(() => window.removeEventListener("keydown", onKeyDown));
16
+ watch(isOpen, (open) => {
17
+ if (!canUseDocument) return;
18
+ document.body.style.overflow = open ? "hidden" : "";
19
+ });
20
+ const localModel = ref({});
21
+ watch(
22
+ () => focusTarget.value?.model,
23
+ (val) => {
24
+ if (val) localModel.value = { ...val };
25
+ },
26
+ { immediate: true }
27
+ );
28
+ function onUpdate(val) {
29
+ localModel.value = val;
30
+ focusTarget.value?.onUpdate(val);
31
+ }
32
+ </script>
33
+
34
+ <template>
35
+ <Teleport to="body">
36
+ <Transition name="mapo-focus-portal">
37
+ <div
38
+ v-if="isOpen && focusTarget"
39
+ class="mapo-focus-portal fixed inset-0 z-[9999] flex flex-col bg-white"
40
+ role="dialog"
41
+ aria-modal="true"
42
+ >
43
+ <!-- ── Header ────────────────────────────────────────────────────── -->
44
+ <div
45
+ class="flex shrink-0 items-center gap-3 border-b border-gray-200 px-6 py-3"
46
+ >
47
+ <!-- Breadcrumb -->
48
+ <nav class="flex min-w-0 flex-1 items-center gap-1 text-sm">
49
+ <template v-for="(crumb, i) in focusTarget.breadcrumb" :key="i">
50
+ <span
51
+ :class="
52
+ i < focusTarget.breadcrumb.length - 1 ? 'text-gray-400' : 'font-semibold text-gray-800'
53
+ "
54
+ class="truncate"
55
+ >
56
+ {{ crumb }}
57
+ </span>
58
+ <UIcon
59
+ v-if="i < focusTarget.breadcrumb.length - 1"
60
+ name="i-lucide-chevron-right"
61
+ class="h-3.5 w-3.5 shrink-0 text-gray-300"
62
+ />
63
+ </template>
64
+ </nav>
65
+
66
+ <!-- Close button -->
67
+ <UButton
68
+ variant="ghost"
69
+ color="neutral"
70
+ icon="i-lucide-x"
71
+ :label="t('mapo.close')"
72
+ size="sm"
73
+ @click="exit"
74
+ />
75
+ </div>
76
+
77
+ <!-- ── Body: scrollable sub-form ────────────────────────────────── -->
78
+ <div class="min-h-0 flex-1 overflow-y-auto">
79
+ <div class="mx-auto max-w-3xl px-6 py-8">
80
+ <MapoForm
81
+ :model-value="localModel"
82
+ :fields="focusTarget.fields"
83
+ :errors="focusTarget.errors.value"
84
+ :languages="focusTarget.languages"
85
+ :current-lang="focusTarget.currentLang"
86
+ :registry="focusTarget.registry"
87
+ @update:model-value="onUpdate"
88
+ />
89
+ </div>
90
+ </div>
91
+
92
+ <!-- ── Footer ───────────────────────────────────────────────────── -->
93
+ <div
94
+ class="flex shrink-0 items-center justify-end gap-3 border-t border-gray-200 px-6 py-3"
95
+ >
96
+ <p class="mr-auto text-xs text-gray-400">
97
+ <UIcon name="i-lucide-keyboard" class="mr-1 inline h-3 w-3" />
98
+ Press
99
+ <kbd class="rounded bg-gray-100 px-1 py-0.5 font-mono text-xs"
100
+ >ESC</kbd
101
+ >
102
+ to return to the form
103
+ </p>
104
+ <UButton variant="ghost" color="neutral" @click="exit">
105
+ Close
106
+ </UButton>
107
+ </div>
108
+ </div>
109
+ </Transition>
110
+ </Teleport>
111
+ </template>
112
+
113
+ <style scoped>
114
+ .mapo-focus-portal-enter-active{transition:opacity .2s ease,transform .2s ease}.mapo-focus-portal-leave-active{transition:opacity .15s ease,transform .15s ease}.mapo-focus-portal-enter-from,.mapo-focus-portal-leave-to{opacity:0;transform:scale(.98)}.mapo-focus-portal-enter-to,.mapo-focus-portal-leave-from{opacity:1;transform:scale(1)}
115
+ </style>
@@ -0,0 +1,4 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
4
+ //# sourceMappingURL=MapoFocusPortal.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MapoFocusPortal.vue.d.ts","sourceRoot":"","sources":["../../../src/runtime/components/MapoFocusPortal.vue"],"names":[],"mappings":"AAudA,QAAA,MAAM,YAAY,+QAChB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}