@pixpilot/formily-shadcn 1.16.0 → 1.17.1

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 (242) hide show
  1. package/dist/components/array-base/component-context.cjs +0 -1
  2. package/dist/components/array-base/component-context.js +1 -1
  3. package/dist/components/array-base/components/Addition.cjs +0 -1
  4. package/dist/components/array-base/components/Addition.js +0 -1
  5. package/dist/components/array-base/components/ArrayItemLabel.cjs +0 -1
  6. package/dist/components/array-base/components/ArrayItemLabel.js +0 -1
  7. package/dist/components/array-base/components/get-array-components.cjs +0 -1
  8. package/dist/components/array-base/components/get-array-components.js +0 -1
  9. package/dist/components/array-cards/ArrayCards.cjs +0 -4
  10. package/dist/components/array-cards/ArrayCards.js +0 -4
  11. package/dist/components/array-cards/Item.cjs +0 -3
  12. package/dist/components/array-cards/Item.js +0 -3
  13. package/dist/components/array-collapse/ArrayCollapse.cjs +0 -4
  14. package/dist/components/array-collapse/ArrayCollapse.js +0 -4
  15. package/dist/components/array-collapse/Item.cjs +0 -3
  16. package/dist/components/array-collapse/Item.js +0 -3
  17. package/dist/components/array-common/ArrayDragHandle.cjs +0 -2
  18. package/dist/components/array-common/ArrayDragHandle.js +0 -2
  19. package/dist/components/array-common/ArrayItemHeaderRow.cjs +0 -1
  20. package/dist/components/array-common/ArrayItemHeaderRow.js +0 -1
  21. package/dist/components/array-common/ArrayItemsList.cjs +0 -3
  22. package/dist/components/array-common/ArrayItemsList.js +0 -3
  23. package/dist/components/array-common/ItemWrapper.cjs +0 -1
  24. package/dist/components/array-common/ItemWrapper.js +0 -1
  25. package/dist/components/array-common/ListItem.cjs +0 -2
  26. package/dist/components/array-common/ListItem.js +0 -2
  27. package/dist/components/array-common/RenderBuiltInOperation.cjs +0 -1
  28. package/dist/components/array-common/RenderBuiltInOperation.js +0 -1
  29. package/dist/components/array-common/use-array-item-actions.cjs +2 -3
  30. package/dist/components/array-common/use-array-item-actions.js +0 -1
  31. package/dist/components/array-common/use-array-item-wrapper-props.cjs +0 -1
  32. package/dist/components/array-common/use-array-item-wrapper-props.js +0 -1
  33. package/dist/components/array-dialog/ArrayDialog.cjs +0 -3
  34. package/dist/components/array-dialog/ArrayDialog.js +0 -3
  35. package/dist/components/array-dialog/EditDialog.cjs +0 -1
  36. package/dist/components/array-dialog/EditDialog.js +0 -1
  37. package/dist/components/array-inline/ArrayInline.cjs +0 -4
  38. package/dist/components/array-inline/ArrayInline.js +0 -4
  39. package/dist/components/array-inline/Item.cjs +0 -2
  40. package/dist/components/array-inline/Item.js +0 -2
  41. package/dist/components/array-popover/ArrayPopover.cjs +0 -3
  42. package/dist/components/array-popover/ArrayPopover.js +0 -3
  43. package/dist/components/array-popover/Popover.cjs +0 -1
  44. package/dist/components/array-popover/Popover.js +0 -1
  45. package/dist/components/array-sortable/SortableContainer.cjs +0 -3
  46. package/dist/components/array-sortable/SortableContainer.js +0 -3
  47. package/dist/components/dialog-item/BaseDialogItem.cjs +111 -0
  48. package/dist/components/dialog-item/BaseDialogItem.d.cts +56 -0
  49. package/dist/components/dialog-item/BaseDialogItem.d.ts +56 -0
  50. package/dist/components/dialog-item/BaseDialogItem.js +106 -0
  51. package/dist/components/dialog-item/ConnectedDialogItem.cjs +16 -0
  52. package/dist/components/dialog-item/ConnectedDialogItem.d.cts +15 -0
  53. package/dist/components/dialog-item/ConnectedDialogItem.d.ts +15 -0
  54. package/dist/components/dialog-item/ConnectedDialogItem.js +14 -0
  55. package/dist/components/dialog-item/index.d.cts +2 -0
  56. package/dist/components/dialog-item/index.d.ts +2 -0
  57. package/dist/components/dialog-item/mcp.js +127 -0
  58. package/dist/components/file-upload/use-file-upload-feedback.cjs +0 -1
  59. package/dist/components/file-upload/use-file-upload-feedback.js +3 -2
  60. package/dist/components/form/Form.cjs +0 -2
  61. package/dist/components/form/Form.js +0 -2
  62. package/dist/components/form-item/BaseFormItem.cjs +0 -1
  63. package/dist/components/form-item/BaseFormItem.js +0 -1
  64. package/dist/components/form-item/ConnectedFormItem.cjs +2 -34
  65. package/dist/components/form-item/ConnectedFormItem.d.cts +4 -4
  66. package/dist/components/form-item/ConnectedFormItem.d.ts +4 -4
  67. package/dist/components/form-item/ConnectedFormItem.js +3 -34
  68. package/dist/components/form-item/map-form-item-props.cjs +50 -0
  69. package/dist/components/form-item/map-form-item-props.js +47 -0
  70. package/dist/components/form-item-container/FormItemContainer.cjs +0 -1
  71. package/dist/components/form-item-container/FormItemContainer.js +0 -1
  72. package/dist/components/icon-picker/IconPicker.cjs +0 -1
  73. package/dist/components/icon-picker/IconPicker.js +0 -1
  74. package/dist/components/json-schema-form-renderer/JsonSchemaForm.cjs +0 -1
  75. package/dist/components/json-schema-form-renderer/JsonSchemaForm.js +0 -1
  76. package/dist/components/json-schema-form-renderer/JsonSchemaFormRenderer.cjs +0 -1
  77. package/dist/components/json-schema-form-renderer/JsonSchemaFormRenderer.js +0 -1
  78. package/dist/components/object-container/ObjectContainer.cjs +0 -2
  79. package/dist/components/object-container/ObjectContainer.js +0 -2
  80. package/dist/components/overlay-common/OverlayFields.cjs +26 -0
  81. package/dist/components/overlay-common/OverlayFields.d.cts +1 -0
  82. package/dist/components/overlay-common/OverlayFields.d.ts +1 -0
  83. package/dist/components/overlay-common/OverlayFields.js +24 -0
  84. package/dist/components/overlay-common/OverlayTrigger.cjs +27 -0
  85. package/dist/components/overlay-common/OverlayTrigger.d.cts +15 -0
  86. package/dist/components/overlay-common/OverlayTrigger.d.ts +15 -0
  87. package/dist/components/overlay-common/OverlayTrigger.js +23 -0
  88. package/dist/components/overlay-common/constants.cjs +10 -0
  89. package/dist/components/overlay-common/constants.js +9 -0
  90. package/dist/components/overlay-common/index.d.cts +4 -0
  91. package/dist/components/overlay-common/index.d.ts +4 -0
  92. package/dist/components/overlay-common/is-empty-field-value.cjs +23 -0
  93. package/dist/components/overlay-common/is-empty-field-value.js +22 -0
  94. package/dist/components/overlay-common/overlay-types.d.cts +27 -0
  95. package/dist/components/overlay-common/overlay-types.d.ts +27 -0
  96. package/dist/components/overlay-common/use-overlay.cjs +108 -0
  97. package/dist/components/overlay-common/use-overlay.d.cts +1 -0
  98. package/dist/components/overlay-common/use-overlay.d.ts +1 -0
  99. package/dist/components/overlay-common/use-overlay.js +105 -0
  100. package/dist/components/popover-item/BasePopoverItem.cjs +105 -0
  101. package/dist/components/popover-item/BasePopoverItem.d.cts +57 -0
  102. package/dist/components/popover-item/BasePopoverItem.d.ts +57 -0
  103. package/dist/components/popover-item/BasePopoverItem.js +101 -0
  104. package/dist/components/popover-item/ConnectedPopoverItem.cjs +16 -0
  105. package/dist/components/popover-item/ConnectedPopoverItem.d.cts +15 -0
  106. package/dist/components/popover-item/ConnectedPopoverItem.d.ts +15 -0
  107. package/dist/components/popover-item/ConnectedPopoverItem.js +14 -0
  108. package/dist/components/popover-item/index.d.cts +2 -0
  109. package/dist/components/popover-item/index.d.ts +2 -0
  110. package/dist/components/popover-item/mcp.js +127 -0
  111. package/dist/components/radio/Radio.d.cts +2 -2
  112. package/dist/components/rich-text-editor/RichTextEditor.cjs +0 -1
  113. package/dist/components/rich-text-editor/RichTextEditor.js +0 -1
  114. package/dist/components/row/Row.d.cts +2 -2
  115. package/dist/components/schema-field/schema-field-basics.cjs +5 -26
  116. package/dist/components/schema-field/schema-field-basics.d.cts +344 -270
  117. package/dist/components/schema-field/schema-field-basics.d.ts +344 -270
  118. package/dist/components/schema-field/schema-field-basics.js +5 -26
  119. package/dist/components/schema-field/schema-field-extended.cjs +0 -4
  120. package/dist/components/schema-field/schema-field-extended.d.cts +498 -424
  121. package/dist/components/schema-field/schema-field-extended.d.ts +480 -406
  122. package/dist/components/schema-field/schema-field-extended.js +0 -4
  123. package/dist/components/schema-field/schema-field.cjs +0 -5
  124. package/dist/components/schema-field/schema-field.d.cts +431 -357
  125. package/dist/components/schema-field/schema-field.d.ts +432 -358
  126. package/dist/components/schema-field/schema-field.js +0 -5
  127. package/dist/components/toggle-group/ToggleGroup.cjs +1 -2
  128. package/dist/components/toggle-group/ToggleGroup.js +1 -1
  129. package/dist/generated/mcp-registry.js +56 -52
  130. package/dist/hooks/use-form-context.cjs +0 -1
  131. package/dist/hooks/use-form-context.js +0 -1
  132. package/dist/hooks/use-form-schema.cjs +0 -1
  133. package/dist/hooks/use-form-schema.js +0 -1
  134. package/dist/hooks/use-schema-field.cjs +5 -4
  135. package/dist/hooks/use-schema-field.js +5 -3
  136. package/dist/index.cjs +9 -39
  137. package/dist/index.d.cts +7 -1
  138. package/dist/index.d.ts +7 -1
  139. package/dist/index.js +6 -40
  140. package/dist/utils/get-default-value.cjs +1 -2
  141. package/dist/utils/get-default-value.js +1 -1
  142. package/dist/utils/has-error.cjs +1 -2
  143. package/dist/utils/has-error.js +1 -1
  144. package/dist/utils/index.d.cts +2 -1
  145. package/dist/utils/index.d.ts +2 -1
  146. package/dist/utils/resolve-responsive-space.cjs +1 -3
  147. package/dist/utils/resolve-responsive-space.js +1 -1
  148. package/dist/utils/validate-schema-shape.cjs +63 -0
  149. package/dist/utils/validate-schema-shape.d.cts +1 -0
  150. package/dist/utils/validate-schema-shape.d.ts +1 -0
  151. package/dist/utils/validate-schema-shape.js +61 -0
  152. package/package.json +7 -6
  153. package/dist/components/array-base/index.cjs +0 -3
  154. package/dist/components/array-base/index.js +0 -3
  155. package/dist/components/array-cards/index.cjs +0 -1
  156. package/dist/components/array-cards/index.js +0 -1
  157. package/dist/components/array-collapse/index.cjs +0 -1
  158. package/dist/components/array-collapse/index.js +0 -1
  159. package/dist/components/array-common/index.cjs +0 -20
  160. package/dist/components/array-common/index.js +0 -20
  161. package/dist/components/array-dialog/index.cjs +0 -1
  162. package/dist/components/array-dialog/index.js +0 -1
  163. package/dist/components/array-inline/index.cjs +0 -1
  164. package/dist/components/array-inline/index.js +0 -1
  165. package/dist/components/array-popover/index.cjs +0 -1
  166. package/dist/components/array-popover/index.js +0 -1
  167. package/dist/components/array-sortable/index.cjs +0 -3
  168. package/dist/components/array-sortable/index.js +0 -3
  169. package/dist/components/array-tags/index.cjs +0 -1
  170. package/dist/components/array-tags/index.js +0 -1
  171. package/dist/components/array-toggle-group/index.cjs +0 -1
  172. package/dist/components/array-toggle-group/index.js +0 -1
  173. package/dist/components/checkbox/index.cjs +0 -1
  174. package/dist/components/checkbox/index.js +0 -1
  175. package/dist/components/color-select/index.cjs +0 -1
  176. package/dist/components/color-select/index.js +0 -1
  177. package/dist/components/column/index.cjs +0 -1
  178. package/dist/components/column/index.js +0 -1
  179. package/dist/components/combobox/index.cjs +0 -1
  180. package/dist/components/combobox/index.js +0 -1
  181. package/dist/components/context/index.cjs +0 -1
  182. package/dist/components/context/index.js +0 -1
  183. package/dist/components/date-picker/index.cjs +0 -1
  184. package/dist/components/date-picker/index.js +0 -1
  185. package/dist/components/file-upload/index.cjs +0 -5
  186. package/dist/components/file-upload/index.js +0 -5
  187. package/dist/components/form/index.cjs +0 -1
  188. package/dist/components/form/index.js +0 -1
  189. package/dist/components/form-grid/index.cjs +0 -1
  190. package/dist/components/form-grid/index.js +0 -1
  191. package/dist/components/form-item/FormItem.cjs +0 -2
  192. package/dist/components/form-item/FormItem.js +0 -2
  193. package/dist/components/form-item/index.cjs +0 -3
  194. package/dist/components/form-item/index.js +0 -3
  195. package/dist/components/form-item-container/index.cjs +0 -1
  196. package/dist/components/form-item-container/index.js +0 -1
  197. package/dist/components/hidden/index.cjs +0 -1
  198. package/dist/components/hidden/index.js +0 -1
  199. package/dist/components/icon-picker/index.cjs +0 -1
  200. package/dist/components/icon-picker/index.js +0 -1
  201. package/dist/components/icon-toggle/index.cjs +0 -1
  202. package/dist/components/icon-toggle/index.js +0 -1
  203. package/dist/components/input/index.cjs +0 -1
  204. package/dist/components/input/index.js +0 -1
  205. package/dist/components/json-schema-form-renderer/index.cjs +0 -4
  206. package/dist/components/json-schema-form-renderer/index.js +0 -4
  207. package/dist/components/number/index.cjs +0 -1
  208. package/dist/components/number/index.js +0 -1
  209. package/dist/components/object-container/index.cjs +0 -1
  210. package/dist/components/object-container/index.js +0 -1
  211. package/dist/components/radio/index.cjs +0 -1
  212. package/dist/components/radio/index.js +0 -1
  213. package/dist/components/rating/index.cjs +0 -1
  214. package/dist/components/rating/index.js +0 -1
  215. package/dist/components/rich-text-editor/index.cjs +0 -1
  216. package/dist/components/rich-text-editor/index.js +0 -1
  217. package/dist/components/row/index.cjs +0 -1
  218. package/dist/components/row/index.js +0 -1
  219. package/dist/components/schema-field/index.cjs +0 -3
  220. package/dist/components/schema-field/index.js +0 -3
  221. package/dist/components/select/index.cjs +0 -1
  222. package/dist/components/select/index.js +0 -1
  223. package/dist/components/separator/index.cjs +0 -1
  224. package/dist/components/separator/index.js +0 -1
  225. package/dist/components/slider/index.cjs +0 -3
  226. package/dist/components/slider/index.js +0 -3
  227. package/dist/components/switch/index.cjs +0 -1
  228. package/dist/components/switch/index.js +0 -1
  229. package/dist/components/tags-input-inline/index.cjs +0 -1
  230. package/dist/components/tags-input-inline/index.js +0 -1
  231. package/dist/components/textarea/index.cjs +0 -1
  232. package/dist/components/textarea/index.js +0 -1
  233. package/dist/components/toggle-button/index.cjs +0 -1
  234. package/dist/components/toggle-button/index.js +0 -1
  235. package/dist/components/toggle-group/index.cjs +0 -1
  236. package/dist/components/toggle-group/index.js +0 -1
  237. package/dist/hooks/index.cjs +0 -4
  238. package/dist/hooks/index.js +0 -4
  239. package/dist/utils/index.cjs +0 -14
  240. package/dist/utils/index.js +0 -14
  241. package/dist/utils/use-array-item-editor.cjs +0 -3
  242. package/dist/utils/use-array-item-editor.js +0 -1
@@ -0,0 +1,108 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_resolve_responsive_space = require('../../utils/resolve-responsive-space.cjs');
3
+ const require_use_description = require('../../hooks/use-description.cjs');
4
+ const require_use_form_context = require('../../hooks/use-form-context.cjs');
5
+ const require_use_label = require('../../hooks/use-label.cjs');
6
+ const require_use_shake_animation = require('../array-common/use-shake-animation.cjs');
7
+ const require_constants = require('./constants.cjs');
8
+ const require_is_empty_field_value = require('./is-empty-field-value.cjs');
9
+ let __formily_react = require("@formily/react");
10
+ __formily_react = require_rolldown_runtime.__toESM(__formily_react);
11
+ let react = require("react");
12
+ react = require_rolldown_runtime.__toESM(react);
13
+
14
+ //#region src/components/overlay-common/use-overlay.ts
15
+ /**
16
+ * Formily glob matching the field itself and every descendant, and nothing
17
+ * else — `*(a,a.*)` matches `a`, `a.b`, and `a.b.c`, but not the sibling `ab`.
18
+ * One pattern covers both shapes an overlay can hold: a single input (validate
19
+ * the field) and an object's form (validate its fields), at any depth.
20
+ */
21
+ function buildValidationPattern(address) {
22
+ return `*(${address},${address}.*)`;
23
+ }
24
+ /**
25
+ * Shared state for fields that render their input(s) inside an overlay
26
+ * (dialog or popover) opened from a trigger button.
27
+ *
28
+ * Fields render in the parent form (no draft copy), so edits commit as the
29
+ * user types. This mirrors the autoSave mode of ArrayDialog/ArrayPopover:
30
+ * validation on close is scoped to the overlay's own fields so unrelated
31
+ * fields elsewhere in the form are not validated.
32
+ */
33
+ function useOverlay(options = {}) {
34
+ const { label, description, trigger, open, defaultOpen, onOpenChange, validateOnClose = true } = options;
35
+ const effectiveLabel = require_use_label.useLabel(label);
36
+ const effectiveDescription = require_use_description.useDescription(description);
37
+ const [uncontrolledOpen, setUncontrolledOpen] = react.default.useState(defaultOpen ?? false);
38
+ const isControlled = open !== void 0;
39
+ const isOpen = isControlled ? open : uncontrolledOpen;
40
+ const setOpen = react.default.useCallback((next) => {
41
+ if (!isControlled) setUncontrolledOpen(next);
42
+ onOpenChange?.(next);
43
+ }, [isControlled, onOpenChange]);
44
+ const { layout } = require_use_form_context.useFormContext();
45
+ const gapClass = require_resolve_responsive_space.resolveResponsiveGapClass({ density: layout?.density });
46
+ const field = (0, __formily_react.useField)();
47
+ const hasError = field.errors.length > 0;
48
+ const validationPath = buildValidationPattern(field.address.toString());
49
+ const noun = (0, __formily_react.useFieldSchema)().title ?? require_constants.DEFAULT_TRIGGER_NOUN;
50
+ const isEmpty = require_is_empty_field_value.isEmptyFieldValue(field.value);
51
+ const resolvedTrigger = {
52
+ ...trigger,
53
+ label: trigger?.label ?? (isEmpty ? `Add ${noun}` : `Edit ${noun}`)
54
+ };
55
+ const { shouldShake, triggerShake } = require_use_shake_animation.useShakeAnimation();
56
+ const revalidateOnOpenRef = react.default.useRef(false);
57
+ react.default.useEffect(() => {
58
+ if (!isOpen || !revalidateOnOpenRef.current) return;
59
+ revalidateOnOpenRef.current = false;
60
+ Promise.resolve(field.form.validate(validationPath)).catch(() => void 0);
61
+ }, [
62
+ field.form,
63
+ isOpen,
64
+ validationPath
65
+ ]);
66
+ const requestClose = react.default.useCallback(() => {
67
+ if (!validateOnClose) {
68
+ setOpen(false);
69
+ return;
70
+ }
71
+ Promise.resolve(field.form.validate(validationPath)).then(() => {
72
+ setOpen(false);
73
+ }).catch(() => {
74
+ triggerShake();
75
+ });
76
+ }, [
77
+ field.form,
78
+ setOpen,
79
+ triggerShake,
80
+ validateOnClose,
81
+ validationPath
82
+ ]);
83
+ return {
84
+ label: effectiveLabel,
85
+ description: effectiveDescription,
86
+ trigger: resolvedTrigger,
87
+ open: isOpen,
88
+ gapClass,
89
+ hasError,
90
+ shouldShake,
91
+ handleOpenChange: react.default.useCallback((next) => {
92
+ if (next) {
93
+ revalidateOnOpenRef.current = hasError;
94
+ setOpen(true);
95
+ return;
96
+ }
97
+ requestClose();
98
+ }, [
99
+ hasError,
100
+ requestClose,
101
+ setOpen
102
+ ]),
103
+ requestClose
104
+ };
105
+ }
106
+
107
+ //#endregion
108
+ exports.useOverlay = useOverlay;
@@ -0,0 +1 @@
1
+ import "./OverlayTrigger.cjs";
@@ -0,0 +1 @@
1
+ import "./OverlayTrigger.js";
@@ -0,0 +1,105 @@
1
+ import { resolveResponsiveGapClass } from "../../utils/resolve-responsive-space.js";
2
+ import { useDescription } from "../../hooks/use-description.js";
3
+ import { useFormContext } from "../../hooks/use-form-context.js";
4
+ import { useLabel } from "../../hooks/use-label.js";
5
+ import { useShakeAnimation } from "../array-common/use-shake-animation.js";
6
+ import { DEFAULT_TRIGGER_NOUN } from "./constants.js";
7
+ import { isEmptyFieldValue } from "./is-empty-field-value.js";
8
+ import { useField, useFieldSchema } from "@formily/react";
9
+ import React from "react";
10
+
11
+ //#region src/components/overlay-common/use-overlay.ts
12
+ /**
13
+ * Formily glob matching the field itself and every descendant, and nothing
14
+ * else — `*(a,a.*)` matches `a`, `a.b`, and `a.b.c`, but not the sibling `ab`.
15
+ * One pattern covers both shapes an overlay can hold: a single input (validate
16
+ * the field) and an object's form (validate its fields), at any depth.
17
+ */
18
+ function buildValidationPattern(address) {
19
+ return `*(${address},${address}.*)`;
20
+ }
21
+ /**
22
+ * Shared state for fields that render their input(s) inside an overlay
23
+ * (dialog or popover) opened from a trigger button.
24
+ *
25
+ * Fields render in the parent form (no draft copy), so edits commit as the
26
+ * user types. This mirrors the autoSave mode of ArrayDialog/ArrayPopover:
27
+ * validation on close is scoped to the overlay's own fields so unrelated
28
+ * fields elsewhere in the form are not validated.
29
+ */
30
+ function useOverlay(options = {}) {
31
+ const { label, description, trigger, open, defaultOpen, onOpenChange, validateOnClose = true } = options;
32
+ const effectiveLabel = useLabel(label);
33
+ const effectiveDescription = useDescription(description);
34
+ const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen ?? false);
35
+ const isControlled = open !== void 0;
36
+ const isOpen = isControlled ? open : uncontrolledOpen;
37
+ const setOpen = React.useCallback((next) => {
38
+ if (!isControlled) setUncontrolledOpen(next);
39
+ onOpenChange?.(next);
40
+ }, [isControlled, onOpenChange]);
41
+ const { layout } = useFormContext();
42
+ const gapClass = resolveResponsiveGapClass({ density: layout?.density });
43
+ const field = useField();
44
+ const hasError = field.errors.length > 0;
45
+ const validationPath = buildValidationPattern(field.address.toString());
46
+ const noun = useFieldSchema().title ?? DEFAULT_TRIGGER_NOUN;
47
+ const isEmpty = isEmptyFieldValue(field.value);
48
+ const resolvedTrigger = {
49
+ ...trigger,
50
+ label: trigger?.label ?? (isEmpty ? `Add ${noun}` : `Edit ${noun}`)
51
+ };
52
+ const { shouldShake, triggerShake } = useShakeAnimation();
53
+ const revalidateOnOpenRef = React.useRef(false);
54
+ React.useEffect(() => {
55
+ if (!isOpen || !revalidateOnOpenRef.current) return;
56
+ revalidateOnOpenRef.current = false;
57
+ Promise.resolve(field.form.validate(validationPath)).catch(() => void 0);
58
+ }, [
59
+ field.form,
60
+ isOpen,
61
+ validationPath
62
+ ]);
63
+ const requestClose = React.useCallback(() => {
64
+ if (!validateOnClose) {
65
+ setOpen(false);
66
+ return;
67
+ }
68
+ Promise.resolve(field.form.validate(validationPath)).then(() => {
69
+ setOpen(false);
70
+ }).catch(() => {
71
+ triggerShake();
72
+ });
73
+ }, [
74
+ field.form,
75
+ setOpen,
76
+ triggerShake,
77
+ validateOnClose,
78
+ validationPath
79
+ ]);
80
+ return {
81
+ label: effectiveLabel,
82
+ description: effectiveDescription,
83
+ trigger: resolvedTrigger,
84
+ open: isOpen,
85
+ gapClass,
86
+ hasError,
87
+ shouldShake,
88
+ handleOpenChange: React.useCallback((next) => {
89
+ if (next) {
90
+ revalidateOnOpenRef.current = hasError;
91
+ setOpen(true);
92
+ return;
93
+ }
94
+ requestClose();
95
+ }, [
96
+ hasError,
97
+ requestClose,
98
+ setOpen
99
+ ]),
100
+ requestClose
101
+ };
102
+ }
103
+
104
+ //#endregion
105
+ export { useOverlay };
@@ -0,0 +1,105 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_ShakeStyles = require('../array-common/ShakeStyles.cjs');
3
+ const require_BaseFormItem = require('../form-item/BaseFormItem.cjs');
4
+ const require_OverlayFields = require('../overlay-common/OverlayFields.cjs');
5
+ const require_OverlayTrigger = require('../overlay-common/OverlayTrigger.cjs');
6
+ const require_use_overlay = require('../overlay-common/use-overlay.cjs');
7
+ let react = require("react");
8
+ react = require_rolldown_runtime.__toESM(react);
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
+ react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
11
+ let __pixpilot_shadcn = require("@pixpilot/shadcn");
12
+ __pixpilot_shadcn = require_rolldown_runtime.__toESM(__pixpilot_shadcn);
13
+
14
+ //#region src/components/popover-item/BasePopoverItem.tsx
15
+ /**
16
+ * Formily decorator that edits a single field inside a popover.
17
+ *
18
+ * Used in place of FormItem (`x-decorator: 'PopoverItem'`), it renders the
19
+ * field's label, description, and validation feedback exactly as FormItem
20
+ * does, but puts a trigger button where the input would sit and moves the
21
+ * input itself into a popover. The field keeps its own component, so
22
+ * validation and x-reactions behave as they do under FormItem.
23
+ */
24
+ const BasePopoverItem = ({ children, label, description, trigger: triggerProp, open: openProp, defaultOpen, onOpenChange, validateOnClose, modal = false, popover, feedbackStatus, feedbackText,...formItemProps }) => {
25
+ const { label: effectiveLabel, description: desc, trigger, open, gapClass, hasError, shouldShake, handleOpenChange, requestClose } = require_use_overlay.useOverlay({
26
+ label,
27
+ description,
28
+ trigger: triggerProp,
29
+ open: openProp,
30
+ defaultOpen,
31
+ onOpenChange,
32
+ validateOnClose
33
+ });
34
+ const title = popover?.title ?? effectiveLabel;
35
+ const overlayDescription = popover?.description ?? desc;
36
+ const slots = popover?.slots;
37
+ const hasHeader = title != null || overlayDescription != null;
38
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.Popover, {
39
+ open,
40
+ onOpenChange: handleOpenChange,
41
+ modal,
42
+ children: [
43
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_BaseFormItem.BaseFormItem, {
44
+ ...formItemProps,
45
+ label,
46
+ description,
47
+ feedbackStatus,
48
+ feedbackText,
49
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__pixpilot_shadcn.PopoverTrigger, {
50
+ asChild: true,
51
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OverlayTrigger.OverlayTrigger, {
52
+ invalid: hasError,
53
+ ...trigger
54
+ })
55
+ })
56
+ }),
57
+ !open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OverlayFields.OverlayFields, { children }),
58
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__pixpilot_shadcn.PopoverContent, {
59
+ align: "start",
60
+ ...slots?.content,
61
+ className: (0, __pixpilot_shadcn.cn)("w-(--radix-popover-trigger-width) min-w-72", shouldShake && "pp-shake", slots?.content?.className),
62
+ onInteractOutside: (event) => {
63
+ slots?.content?.onInteractOutside?.(event);
64
+ if (event.defaultPrevented) return;
65
+ event.preventDefault();
66
+ requestClose();
67
+ },
68
+ onEscapeKeyDown: (event) => {
69
+ slots?.content?.onEscapeKeyDown?.(event);
70
+ if (event.defaultPrevented) return;
71
+ event.preventDefault();
72
+ requestClose();
73
+ },
74
+ children: [
75
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ShakeStyles.ShakeStyles, {}),
76
+ hasHeader && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
77
+ ...slots?.header,
78
+ className: (0, __pixpilot_shadcn.cn)("space-y-1 pb-3", slots?.header?.className),
79
+ children: [title != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
80
+ ...slots?.title,
81
+ className: (0, __pixpilot_shadcn.cn)("font-medium leading-none", slots?.title?.className),
82
+ children: title
83
+ }), overlayDescription != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
84
+ ...slots?.description,
85
+ className: (0, __pixpilot_shadcn.cn)("text-muted-foreground text-sm", slots?.description?.className),
86
+ children: overlayDescription
87
+ })]
88
+ }),
89
+ open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
90
+ ...slots?.body,
91
+ className: (0, __pixpilot_shadcn.cn)("grid", gapClass, slots?.body?.className),
92
+ children: [children, feedbackText != null && feedbackText !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
93
+ className: (0, __pixpilot_shadcn.cn)("text-[0.8rem]", feedbackStatus === "error" && "text-destructive font-medium", feedbackStatus === "warning" && "text-amber-600", feedbackStatus === "success" && "text-green-600"),
94
+ children: feedbackText
95
+ })]
96
+ })
97
+ ]
98
+ })
99
+ ]
100
+ });
101
+ };
102
+ BasePopoverItem.displayName = "BasePopoverItem";
103
+
104
+ //#endregion
105
+ exports.BasePopoverItem = BasePopoverItem;
@@ -0,0 +1,57 @@
1
+ import { FormItemProps } from "../form-item/form-item-types.cjs";
2
+ import "../form-item/index.cjs";
3
+ import { OverlayBaseSlots, OverlayProps } from "../overlay-common/overlay-types.cjs";
4
+ import { OverlayTriggerProps } from "../overlay-common/OverlayTrigger.cjs";
5
+ import "../overlay-common/index.cjs";
6
+ import React from "react";
7
+ import { PopoverContent } from "@pixpilot/shadcn";
8
+
9
+ //#region src/components/popover-item/BasePopoverItem.d.ts
10
+ interface PopoverItemProps extends Omit<FormItemProps, 'popover'> {
11
+ /**
12
+ * Props for the trigger button, e.g. `{ label: 'Write a bio' }`. Without a
13
+ * label it reads `Add <title>` when the field is empty and `Edit <title>`
14
+ * once it holds a value. Settable from an x-reaction via
15
+ * `decoratorProps.trigger`.
16
+ */
17
+ trigger?: OverlayTriggerProps;
18
+ /** Controlled open state of the popover. */
19
+ open?: boolean;
20
+ /** Initial open state when uncontrolled. */
21
+ defaultOpen?: boolean;
22
+ onOpenChange?: (open: boolean) => void;
23
+ /**
24
+ * When false, the popover closes without validating the field first.
25
+ * Default is true.
26
+ */
27
+ validateOnClose?: boolean;
28
+ /**
29
+ * If true, interaction outside the popover is blocked while it is open.
30
+ * Default is false.
31
+ */
32
+ modal?: boolean;
33
+ /**
34
+ * The popover itself — its `title`, `description`, and `slots`, e.g.
35
+ * `{ title: 'Notes', slots: { content: { className: 'w-96' } } }`. Title and
36
+ * description default to the field's label and description.
37
+ */
38
+ popover?: PopoverItemPopoverProps;
39
+ }
40
+ interface PopoverItemPopoverSlots extends OverlayBaseSlots {
41
+ content?: React.ComponentProps<typeof PopoverContent>;
42
+ title?: React.ComponentProps<'h4'>;
43
+ description?: React.ComponentProps<'p'>;
44
+ }
45
+ type PopoverItemPopoverProps = OverlayProps<PopoverItemPopoverSlots>;
46
+ /**
47
+ * Formily decorator that edits a single field inside a popover.
48
+ *
49
+ * Used in place of FormItem (`x-decorator: 'PopoverItem'`), it renders the
50
+ * field's label, description, and validation feedback exactly as FormItem
51
+ * does, but puts a trigger button where the input would sit and moves the
52
+ * input itself into a popover. The field keeps its own component, so
53
+ * validation and x-reactions behave as they do under FormItem.
54
+ */
55
+ declare const BasePopoverItem: React.FC<React.PropsWithChildren<PopoverItemProps>>;
56
+ //#endregion
57
+ export { BasePopoverItem, PopoverItemProps };
@@ -0,0 +1,57 @@
1
+ import { FormItemProps } from "../form-item/form-item-types.js";
2
+ import "../form-item/index.js";
3
+ import { OverlayBaseSlots, OverlayProps } from "../overlay-common/overlay-types.js";
4
+ import { OverlayTriggerProps } from "../overlay-common/OverlayTrigger.js";
5
+ import "../overlay-common/index.js";
6
+ import React from "react";
7
+ import { PopoverContent } from "@pixpilot/shadcn";
8
+
9
+ //#region src/components/popover-item/BasePopoverItem.d.ts
10
+ interface PopoverItemProps extends Omit<FormItemProps, 'popover'> {
11
+ /**
12
+ * Props for the trigger button, e.g. `{ label: 'Write a bio' }`. Without a
13
+ * label it reads `Add <title>` when the field is empty and `Edit <title>`
14
+ * once it holds a value. Settable from an x-reaction via
15
+ * `decoratorProps.trigger`.
16
+ */
17
+ trigger?: OverlayTriggerProps;
18
+ /** Controlled open state of the popover. */
19
+ open?: boolean;
20
+ /** Initial open state when uncontrolled. */
21
+ defaultOpen?: boolean;
22
+ onOpenChange?: (open: boolean) => void;
23
+ /**
24
+ * When false, the popover closes without validating the field first.
25
+ * Default is true.
26
+ */
27
+ validateOnClose?: boolean;
28
+ /**
29
+ * If true, interaction outside the popover is blocked while it is open.
30
+ * Default is false.
31
+ */
32
+ modal?: boolean;
33
+ /**
34
+ * The popover itself — its `title`, `description`, and `slots`, e.g.
35
+ * `{ title: 'Notes', slots: { content: { className: 'w-96' } } }`. Title and
36
+ * description default to the field's label and description.
37
+ */
38
+ popover?: PopoverItemPopoverProps;
39
+ }
40
+ interface PopoverItemPopoverSlots extends OverlayBaseSlots {
41
+ content?: React.ComponentProps<typeof PopoverContent>;
42
+ title?: React.ComponentProps<'h4'>;
43
+ description?: React.ComponentProps<'p'>;
44
+ }
45
+ type PopoverItemPopoverProps = OverlayProps<PopoverItemPopoverSlots>;
46
+ /**
47
+ * Formily decorator that edits a single field inside a popover.
48
+ *
49
+ * Used in place of FormItem (`x-decorator: 'PopoverItem'`), it renders the
50
+ * field's label, description, and validation feedback exactly as FormItem
51
+ * does, but puts a trigger button where the input would sit and moves the
52
+ * input itself into a popover. The field keeps its own component, so
53
+ * validation and x-reactions behave as they do under FormItem.
54
+ */
55
+ declare const BasePopoverItem: React.FC<React.PropsWithChildren<PopoverItemProps>>;
56
+ //#endregion
57
+ export { BasePopoverItem, PopoverItemProps };
@@ -0,0 +1,101 @@
1
+ import { ShakeStyles } from "../array-common/ShakeStyles.js";
2
+ import { BaseFormItem } from "../form-item/BaseFormItem.js";
3
+ import { OverlayFields } from "../overlay-common/OverlayFields.js";
4
+ import { OverlayTrigger } from "../overlay-common/OverlayTrigger.js";
5
+ import { useOverlay } from "../overlay-common/use-overlay.js";
6
+ import React from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { Popover, PopoverContent, PopoverTrigger, cn } from "@pixpilot/shadcn";
9
+
10
+ //#region src/components/popover-item/BasePopoverItem.tsx
11
+ /**
12
+ * Formily decorator that edits a single field inside a popover.
13
+ *
14
+ * Used in place of FormItem (`x-decorator: 'PopoverItem'`), it renders the
15
+ * field's label, description, and validation feedback exactly as FormItem
16
+ * does, but puts a trigger button where the input would sit and moves the
17
+ * input itself into a popover. The field keeps its own component, so
18
+ * validation and x-reactions behave as they do under FormItem.
19
+ */
20
+ const BasePopoverItem = ({ children, label, description, trigger: triggerProp, open: openProp, defaultOpen, onOpenChange, validateOnClose, modal = false, popover, feedbackStatus, feedbackText,...formItemProps }) => {
21
+ const { label: effectiveLabel, description: desc, trigger, open, gapClass, hasError, shouldShake, handleOpenChange, requestClose } = useOverlay({
22
+ label,
23
+ description,
24
+ trigger: triggerProp,
25
+ open: openProp,
26
+ defaultOpen,
27
+ onOpenChange,
28
+ validateOnClose
29
+ });
30
+ const title = popover?.title ?? effectiveLabel;
31
+ const overlayDescription = popover?.description ?? desc;
32
+ const slots = popover?.slots;
33
+ const hasHeader = title != null || overlayDescription != null;
34
+ return /* @__PURE__ */ jsxs(Popover, {
35
+ open,
36
+ onOpenChange: handleOpenChange,
37
+ modal,
38
+ children: [
39
+ /* @__PURE__ */ jsx(BaseFormItem, {
40
+ ...formItemProps,
41
+ label,
42
+ description,
43
+ feedbackStatus,
44
+ feedbackText,
45
+ children: /* @__PURE__ */ jsx(PopoverTrigger, {
46
+ asChild: true,
47
+ children: /* @__PURE__ */ jsx(OverlayTrigger, {
48
+ invalid: hasError,
49
+ ...trigger
50
+ })
51
+ })
52
+ }),
53
+ !open && /* @__PURE__ */ jsx(OverlayFields, { children }),
54
+ /* @__PURE__ */ jsxs(PopoverContent, {
55
+ align: "start",
56
+ ...slots?.content,
57
+ className: cn("w-(--radix-popover-trigger-width) min-w-72", shouldShake && "pp-shake", slots?.content?.className),
58
+ onInteractOutside: (event) => {
59
+ slots?.content?.onInteractOutside?.(event);
60
+ if (event.defaultPrevented) return;
61
+ event.preventDefault();
62
+ requestClose();
63
+ },
64
+ onEscapeKeyDown: (event) => {
65
+ slots?.content?.onEscapeKeyDown?.(event);
66
+ if (event.defaultPrevented) return;
67
+ event.preventDefault();
68
+ requestClose();
69
+ },
70
+ children: [
71
+ /* @__PURE__ */ jsx(ShakeStyles, {}),
72
+ hasHeader && /* @__PURE__ */ jsxs("div", {
73
+ ...slots?.header,
74
+ className: cn("space-y-1 pb-3", slots?.header?.className),
75
+ children: [title != null && /* @__PURE__ */ jsx("h4", {
76
+ ...slots?.title,
77
+ className: cn("font-medium leading-none", slots?.title?.className),
78
+ children: title
79
+ }), overlayDescription != null && /* @__PURE__ */ jsx("p", {
80
+ ...slots?.description,
81
+ className: cn("text-muted-foreground text-sm", slots?.description?.className),
82
+ children: overlayDescription
83
+ })]
84
+ }),
85
+ open && /* @__PURE__ */ jsxs("div", {
86
+ ...slots?.body,
87
+ className: cn("grid", gapClass, slots?.body?.className),
88
+ children: [children, feedbackText != null && feedbackText !== "" && /* @__PURE__ */ jsx("p", {
89
+ className: cn("text-[0.8rem]", feedbackStatus === "error" && "text-destructive font-medium", feedbackStatus === "warning" && "text-amber-600", feedbackStatus === "success" && "text-green-600"),
90
+ children: feedbackText
91
+ })]
92
+ })
93
+ ]
94
+ })
95
+ ]
96
+ });
97
+ };
98
+ BasePopoverItem.displayName = "BasePopoverItem";
99
+
100
+ //#endregion
101
+ export { BasePopoverItem };
@@ -0,0 +1,16 @@
1
+ const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
+ const require_map_form_item_props = require('../form-item/map-form-item-props.cjs');
3
+ const require_BasePopoverItem = require('./BasePopoverItem.cjs');
4
+ let __formily_react = require("@formily/react");
5
+ __formily_react = require_rolldown_runtime.__toESM(__formily_react);
6
+
7
+ //#region src/components/popover-item/ConnectedPopoverItem.tsx
8
+ /**
9
+ * PopoverItem decorator connected to Formily field state.
10
+ * Maps field label, description, and validation state onto the decorator the
11
+ * same way FormItem does.
12
+ */
13
+ const PopoverItem = (0, __formily_react.connect)(require_BasePopoverItem.BasePopoverItem, (0, __formily_react.mapProps)(require_map_form_item_props.mapFormItemProps));
14
+
15
+ //#endregion
16
+ exports.PopoverItem = PopoverItem;
@@ -0,0 +1,15 @@
1
+ import { PopoverItemProps } from "./BasePopoverItem.cjs";
2
+ import * as react4 from "react";
3
+
4
+ //#region src/components/popover-item/ConnectedPopoverItem.d.ts
5
+
6
+ /**
7
+ * PopoverItem decorator connected to Formily field state.
8
+ * Maps field label, description, and validation state onto the decorator the
9
+ * same way FormItem does.
10
+ */
11
+ declare const PopoverItem: react4.ForwardRefExoticComponent<Omit<Partial<PopoverItemProps & {
12
+ children?: react4.ReactNode | undefined;
13
+ }>, "ref"> & react4.RefAttributes<unknown>>;
14
+ //#endregion
15
+ export { PopoverItem };
@@ -0,0 +1,15 @@
1
+ import { PopoverItemProps } from "./BasePopoverItem.js";
2
+ import * as react4 from "react";
3
+
4
+ //#region src/components/popover-item/ConnectedPopoverItem.d.ts
5
+
6
+ /**
7
+ * PopoverItem decorator connected to Formily field state.
8
+ * Maps field label, description, and validation state onto the decorator the
9
+ * same way FormItem does.
10
+ */
11
+ declare const PopoverItem: react4.ForwardRefExoticComponent<Omit<Partial<PopoverItemProps & {
12
+ children?: react4.ReactNode | undefined;
13
+ }>, "ref"> & react4.RefAttributes<unknown>>;
14
+ //#endregion
15
+ export { PopoverItem };
@@ -0,0 +1,14 @@
1
+ import { mapFormItemProps } from "../form-item/map-form-item-props.js";
2
+ import { BasePopoverItem } from "./BasePopoverItem.js";
3
+ import { connect, mapProps } from "@formily/react";
4
+
5
+ //#region src/components/popover-item/ConnectedPopoverItem.tsx
6
+ /**
7
+ * PopoverItem decorator connected to Formily field state.
8
+ * Maps field label, description, and validation state onto the decorator the
9
+ * same way FormItem does.
10
+ */
11
+ const PopoverItem = connect(BasePopoverItem, mapProps(mapFormItemProps));
12
+
13
+ //#endregion
14
+ export { PopoverItem };
@@ -0,0 +1,2 @@
1
+ import { BasePopoverItem, PopoverItemProps } from "./BasePopoverItem.cjs";
2
+ import { PopoverItem } from "./ConnectedPopoverItem.cjs";
@@ -0,0 +1,2 @@
1
+ import { BasePopoverItem, PopoverItemProps } from "./BasePopoverItem.js";
2
+ import { PopoverItem } from "./ConnectedPopoverItem.js";