@omerdlw/base-framework 1.0.6 → 2.0.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 (234) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-4GMQKD6F.js +353 -0
  6. package/dist/chunk-4GMQKD6F.js.map +1 -0
  7. package/dist/chunk-6SG7V77J.js +577 -0
  8. package/dist/chunk-6SG7V77J.js.map +1 -0
  9. package/dist/chunk-6ZJVLUBE.js +26 -0
  10. package/dist/chunk-6ZJVLUBE.js.map +1 -0
  11. package/dist/chunk-7HQMXTNP.js +419 -0
  12. package/dist/chunk-7HQMXTNP.js.map +1 -0
  13. package/dist/chunk-7TAVYJ3A.js +371 -0
  14. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  15. package/dist/chunk-A5RE3F6O.js +9905 -0
  16. package/dist/chunk-A5RE3F6O.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-QI3ALLIB.js +38 -0
  32. package/dist/chunk-QI3ALLIB.js.map +1 -0
  33. package/dist/chunk-QXR55VVS.js +1139 -0
  34. package/dist/chunk-QXR55VVS.js.map +1 -0
  35. package/dist/chunk-R2YGFJDJ.js +408 -0
  36. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  37. package/dist/chunk-RFZQWLC5.js +27 -0
  38. package/dist/chunk-RFZQWLC5.js.map +1 -0
  39. package/dist/chunk-SKBITB5X.js +888 -0
  40. package/dist/chunk-SKBITB5X.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20029
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +10 -10
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -762
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +711 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12132
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/layout.d.ts.map +1 -1
  139. package/dist/modules/dock/module.d.ts +1 -1
  140. package/dist/modules/dock/motion.d.ts +44 -912
  141. package/dist/modules/dock/motion.d.ts.map +1 -1
  142. package/dist/modules/dock/overlay.d.ts +1 -1
  143. package/dist/modules/dock/overlay.d.ts.map +1 -1
  144. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  145. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  146. package/dist/modules/dock/styles.d.ts +4 -4
  147. package/dist/modules/dock/surface/hooks.d.ts +5 -20
  148. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  149. package/dist/modules/dock/surface/machine.d.ts +4 -3
  150. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  151. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  152. package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
  153. package/dist/modules/dock/types.d.ts +162 -3
  154. package/dist/modules/dock/types.d.ts.map +1 -1
  155. package/dist/modules/index.js +16 -17883
  156. package/dist/modules/index.js.map +1 -1
  157. package/dist/modules/loading/constants.d.ts +1 -1
  158. package/dist/modules/loading/constants.d.ts.map +1 -1
  159. package/dist/modules/loading/context.d.ts +1 -1
  160. package/dist/modules/loading/hooks.d.ts +1 -1
  161. package/dist/modules/loading/index.js +5 -1153
  162. package/dist/modules/loading/index.js.map +1 -1
  163. package/dist/modules/loading/types.d.ts +2 -2
  164. package/dist/modules/media/context.d.ts +1 -1
  165. package/dist/modules/media/index.js +3 -570
  166. package/dist/modules/media/index.js.map +1 -1
  167. package/dist/modules/media/types.d.ts +2 -2
  168. package/dist/modules/modal/constants.d.ts +2 -2
  169. package/dist/modules/modal/constants.d.ts.map +1 -1
  170. package/dist/modules/modal/context.d.ts +1 -1
  171. package/dist/modules/modal/hooks.d.ts +3 -3
  172. package/dist/modules/modal/index.js +8 -2355
  173. package/dist/modules/modal/index.js.map +1 -1
  174. package/dist/modules/modal/motion.d.ts +3 -8
  175. package/dist/modules/modal/motion.d.ts.map +1 -1
  176. package/dist/modules/modal/overlay.d.ts.map +1 -1
  177. package/dist/modules/modal/types.d.ts +21 -0
  178. package/dist/modules/modal/types.d.ts.map +1 -1
  179. package/dist/modules/notification/constants.d.ts +2 -2
  180. package/dist/modules/notification/constants.d.ts.map +1 -1
  181. package/dist/modules/notification/context.d.ts +1 -1
  182. package/dist/modules/notification/hooks.d.ts +1 -1
  183. package/dist/modules/notification/index.js +4 -828
  184. package/dist/modules/notification/index.js.map +1 -1
  185. package/dist/modules/notification/motion.d.ts +1 -7
  186. package/dist/modules/notification/motion.d.ts.map +1 -1
  187. package/dist/modules/notification/overlay.d.ts.map +1 -1
  188. package/dist/modules/notification/types.d.ts +9 -1
  189. package/dist/modules/notification/types.d.ts.map +1 -1
  190. package/dist/overlay-TZ6L52A5.js +9 -0
  191. package/dist/overlay-TZ6L52A5.js.map +1 -0
  192. package/dist/provider.d.ts +1 -1
  193. package/dist/provider.d.ts.map +1 -1
  194. package/dist/provider.js +6 -1968
  195. package/dist/provider.js.map +1 -1
  196. package/dist/result.js +2 -63
  197. package/dist/result.js.map +1 -1
  198. package/dist/theme.d.ts +45 -8
  199. package/dist/theme.d.ts.map +1 -1
  200. package/dist/theme.js +3 -41
  201. package/dist/theme.js.map +1 -1
  202. package/dist/tokens/index.d.ts +1 -0
  203. package/dist/tokens/index.d.ts.map +1 -1
  204. package/dist/tokens/index.js +126 -155
  205. package/dist/tokens/index.js.map +1 -1
  206. package/dist/tokens/motion-config.d.ts +44 -0
  207. package/dist/tokens/motion-config.d.ts.map +1 -0
  208. package/dist/tokens/motion.d.ts +23 -174
  209. package/dist/tokens/motion.d.ts.map +1 -1
  210. package/dist/utils/index.js +4 -82
  211. package/dist/utils/index.js.map +1 -1
  212. package/dist/utils/report.d.ts.map +1 -1
  213. package/docs/README.md +1 -0
  214. package/docs/architecture-and-rules.md +4 -3
  215. package/docs/core-engine.md +7 -10
  216. package/docs/getting-started.md +4 -2
  217. package/docs/modules/ambient.md +194 -80
  218. package/docs/modules/background.md +3 -3
  219. package/docs/modules/context-menu.md +2 -2
  220. package/docs/modules/dock.md +9 -6
  221. package/docs/modules/modal.md +2 -2
  222. package/docs/modules/notification.md +2 -2
  223. package/docs/theming.md +81 -9
  224. package/package.json +22 -5
  225. package/templates/AGENTS.md +1 -1
  226. package/templates/motion/background.ts +17 -0
  227. package/templates/motion/context-menu.ts +63 -0
  228. package/templates/motion/dock.ts +327 -0
  229. package/templates/motion/modal.ts +79 -0
  230. package/templates/motion/notification.ts +27 -0
  231. package/templates/motion/tokens.ts +47 -0
  232. package/templates/tsconfig.json +7 -0
  233. package/dist/modules/ambient/color.d.ts +0 -21
  234. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -0,0 +1,349 @@
1
+ import { useModalContainerModel, isSidePosition, hasHeightConstraint, useModalModel, modalTheme, useModalLayerModel, getModalLayout, MODAL_POSITIONS, getModalPosition, getModalLabel } from './chunk-7HQMXTNP.js';
2
+ import { Z_INDEX } from './chunk-QI3ALLIB.js';
3
+ import { useModuleMotion } from './chunk-7TAVYJ3A.js';
4
+ import { ModuleBoundary } from './chunk-GF7TUX5I.js';
5
+ import { cn } from './chunk-TV3WEF5G.js';
6
+ import { Button, Icon } from './chunk-3BUP64Q6.js';
7
+ import { isValidElement, createElement } from 'react';
8
+ import { motion, AnimatePresence } from 'motion/react';
9
+ import { createPortal } from 'react-dom';
10
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
+
12
+ // src/modules/modal/motion.ts
13
+ var MODAL_COMPOSITOR_STYLE = Object.freeze({
14
+ WebkitBackfaceVisibility: "hidden",
15
+ WebkitFontSmoothing: "antialiased",
16
+ backfaceVisibility: "hidden",
17
+ transform: "translateZ(0)",
18
+ willChange: "transform, opacity"
19
+ });
20
+ function useModalMotion() {
21
+ return useModuleMotion(modalTheme);
22
+ }
23
+ function getModalPositionMotion(positions, position) {
24
+ return positions[position] ?? positions.center;
25
+ }
26
+ function hasSlotContent(value) {
27
+ return value !== null && value !== void 0 && value !== false && value !== "";
28
+ }
29
+ function isHeaderConfig(value) {
30
+ return Boolean(
31
+ value && typeof value === "object" && !Array.isArray(value) && !isValidElement(value)
32
+ );
33
+ }
34
+ function resolveHeaderActions(actions, close) {
35
+ return typeof actions === "function" ? actions({ close }) : actions || null;
36
+ }
37
+ function CloseButton({
38
+ close,
39
+ theme
40
+ }) {
41
+ if (typeof close !== "function") return null;
42
+ return /* @__PURE__ */ jsx(
43
+ Button,
44
+ {
45
+ type: "button",
46
+ "aria-label": "Close modal",
47
+ onClick: close,
48
+ className: theme.slots.closeButton,
49
+ children: /* @__PURE__ */ jsx(Icon, { icon: "solar:close-bold", size: 16 })
50
+ }
51
+ );
52
+ }
53
+ function SlotRow({
54
+ center,
55
+ left,
56
+ right,
57
+ sticky,
58
+ theme,
59
+ variants
60
+ }) {
61
+ const hasCenter = hasSlotContent(center);
62
+ return /* @__PURE__ */ jsxs(
63
+ motion.div,
64
+ {
65
+ variants,
66
+ initial: "hidden",
67
+ animate: "visible",
68
+ "data-columns": hasCenter ? 3 : 2,
69
+ "data-sticky": sticky,
70
+ className: theme.slots.row,
71
+ style: sticky ? theme.styles.row : void 0,
72
+ children: [
73
+ /* @__PURE__ */ jsx("div", { className: theme.slots.rowStart, children: left }),
74
+ hasCenter && /* @__PURE__ */ jsx("div", { className: theme.slots.rowCenter, children: center }),
75
+ /* @__PURE__ */ jsx("div", { className: theme.slots.rowEnd, children: right })
76
+ ]
77
+ }
78
+ );
79
+ }
80
+ function resolveHeader(header, close, theme) {
81
+ const config = isHeaderConfig(header) ? header : {};
82
+ const customNode = typeof header !== "boolean" && !isHeaderConfig(header) && hasSlotContent(header) ? header : null;
83
+ const actions = resolveHeaderActions(config.actions, close);
84
+ const showClose = config.showClose === true;
85
+ const left = customNode !== null ? null : config.left ?? (config.title ? /* @__PURE__ */ jsx("h2", { id: config.titleId, className: theme.slots.title, children: config.title }) : null);
86
+ const right = customNode !== null ? null : config.right ?? (hasSlotContent(actions) || showClose ? /* @__PURE__ */ jsxs(Fragment, { children: [
87
+ actions,
88
+ showClose && /* @__PURE__ */ jsx(CloseButton, { close, theme })
89
+ ] }) : null);
90
+ return { center: customNode ?? config.center ?? null, config, left, right };
91
+ }
92
+ function ModalContainer({
93
+ bodyClassName,
94
+ children,
95
+ className,
96
+ close,
97
+ footer,
98
+ header = {},
99
+ position = null
100
+ }) {
101
+ const { theme } = useModalContainerModel();
102
+ const modalMotion = useModalMotion();
103
+ const headerRow = header === false ? null : resolveHeader(header, close, theme);
104
+ const shouldRenderHeader = headerRow && [headerRow.left, headerRow.center, headerRow.right].some(hasSlotContent);
105
+ const footerConfig = footer && typeof footer === "object" ? footer : {};
106
+ const {
107
+ center: footerCenter = null,
108
+ left: footerLeft = null,
109
+ right: footerRight = null
110
+ } = footerConfig;
111
+ const shouldRenderFooter = footer !== false && [footerLeft, footerCenter, footerRight].some(hasSlotContent);
112
+ const resolvedPosition = position || headerRow?.config.position || null;
113
+ return /* @__PURE__ */ jsxs(
114
+ "div",
115
+ {
116
+ "data-height": isSidePosition(resolvedPosition) ? "full" : hasHeightConstraint(className) ? void 0 : "capped",
117
+ className: cn(theme.slots.content, className),
118
+ children: [
119
+ shouldRenderHeader && /* @__PURE__ */ jsx(
120
+ SlotRow,
121
+ {
122
+ variants: modalMotion.header,
123
+ left: headerRow.left,
124
+ center: headerRow.center,
125
+ right: headerRow.right,
126
+ theme,
127
+ sticky: headerRow.config.sticky ? "top" : void 0
128
+ }
129
+ ),
130
+ /* @__PURE__ */ jsx(
131
+ motion.div,
132
+ {
133
+ variants: modalMotion.content,
134
+ initial: "hidden",
135
+ animate: "visible",
136
+ "data-lenis-prevent": true,
137
+ "data-lenis-prevent-wheel": true,
138
+ className: cn(theme.slots.body, bodyClassName),
139
+ children
140
+ }
141
+ ),
142
+ shouldRenderFooter && /* @__PURE__ */ jsx(
143
+ SlotRow,
144
+ {
145
+ variants: modalMotion.footer,
146
+ left: footerLeft,
147
+ center: footerCenter,
148
+ right: footerRight,
149
+ theme,
150
+ sticky: footerConfig.sticky ? "bottom" : void 0
151
+ }
152
+ )
153
+ ]
154
+ }
155
+ );
156
+ }
157
+ function ModalLayerSwitcher({
158
+ currentEntry,
159
+ onSwitchToPrevious,
160
+ previousEntry,
161
+ theme
162
+ }) {
163
+ return /* @__PURE__ */ jsxs("div", { className: theme.slots.switcher, children: [
164
+ /* @__PURE__ */ jsxs(
165
+ Button,
166
+ {
167
+ type: "button",
168
+ onClick: onSwitchToPrevious,
169
+ className: theme.slots.switcherButton,
170
+ children: [
171
+ /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ jsx(
172
+ "path",
173
+ {
174
+ d: "M7.5 2.5L4 6l3.5 3.5",
175
+ stroke: "currentColor",
176
+ strokeWidth: "1.5",
177
+ strokeLinecap: "round",
178
+ strokeLinejoin: "round"
179
+ }
180
+ ) }),
181
+ getModalLabel(previousEntry.modalType)
182
+ ]
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsx("span", { className: theme.slots.switcherDivider, children: "/" }),
186
+ /* @__PURE__ */ jsx("span", { className: theme.slots.switcherCurrent, children: getModalLabel(currentEntry.modalType) })
187
+ ] });
188
+ }
189
+ function ModalLayer({
190
+ closeModal,
191
+ entry,
192
+ isMobileViewport,
193
+ isTopModal,
194
+ modalStack,
195
+ registry,
196
+ stackIndex,
197
+ theme
198
+ }) {
199
+ const {
200
+ modalRef,
201
+ activePosition,
202
+ ActiveModalComponent,
203
+ isPanelChrome,
204
+ previousEntry,
205
+ baseZIndex
206
+ } = useModalLayerModel({
207
+ closeModal,
208
+ entry,
209
+ isMobileViewport,
210
+ isTopModal,
211
+ modalStack,
212
+ registry,
213
+ stackIndex
214
+ });
215
+ const modalMotion = useModalMotion();
216
+ if (!ActiveModalComponent) return null;
217
+ const layout = getModalLayout(activePosition, isMobileViewport);
218
+ const positionMotion = getModalPositionMotion(
219
+ modalMotion.positions,
220
+ activePosition
221
+ );
222
+ return /* @__PURE__ */ jsx(
223
+ "div",
224
+ {
225
+ role: "dialog",
226
+ "aria-modal": isTopModal,
227
+ "aria-labelledby": entry.title ? `modal-title-${entry.id}` : void 0,
228
+ style: { zIndex: baseZIndex },
229
+ "data-position": getModalPosition(activePosition),
230
+ "data-inset": activePosition === MODAL_POSITIONS.CENTER && !isMobileViewport ? true : void 0,
231
+ className: theme.slots.layer,
232
+ children: /* @__PURE__ */ jsx(
233
+ motion.div,
234
+ {
235
+ ref: modalRef,
236
+ variants: positionMotion.variants,
237
+ initial: "hidden",
238
+ animate: "visible",
239
+ exit: "exit",
240
+ transition: positionMotion.transition,
241
+ "data-active": isTopModal,
242
+ "data-layout": layout,
243
+ className: theme.slots.frame,
244
+ style: { zIndex: Z_INDEX.MODAL_FRAME, ...MODAL_COMPOSITOR_STYLE },
245
+ onClick: (e) => e.stopPropagation(),
246
+ children: /* @__PURE__ */ jsxs(
247
+ "div",
248
+ {
249
+ "data-layout": layout,
250
+ className: cn(
251
+ theme.slots.panel,
252
+ isPanelChrome ? theme.slots.panelChrome : theme.slots.panelBare
253
+ ),
254
+ children: [
255
+ /* @__PURE__ */ jsx(ModuleBoundary, { name: entry.modalType, children: createElement(ActiveModalComponent, {
256
+ close: (result) => closeModal(result, entry.id),
257
+ data: entry.props,
258
+ header: {
259
+ actions: entry.headerActions,
260
+ position: activePosition,
261
+ showClose: entry.showClose,
262
+ title: entry.title,
263
+ titleId: `modal-title-${entry.id}`
264
+ }
265
+ }) }),
266
+ !isTopModal && /* @__PURE__ */ jsx(
267
+ "div",
268
+ {
269
+ onClick: (e) => {
270
+ e.stopPropagation();
271
+ const topModal = modalStack[modalStack.length - 1];
272
+ if (topModal) closeModal(null, topModal.id);
273
+ },
274
+ className: theme.slots.dim,
275
+ style: theme.styles.dim,
276
+ "aria-label": "Close active top modal"
277
+ }
278
+ ),
279
+ isTopModal && stackIndex > 0 && previousEntry && /* @__PURE__ */ jsx(
280
+ ModalLayerSwitcher,
281
+ {
282
+ currentEntry: entry,
283
+ previousEntry,
284
+ theme,
285
+ onSwitchToPrevious: () => closeModal(null, entry.id)
286
+ }
287
+ )
288
+ ]
289
+ }
290
+ )
291
+ }
292
+ )
293
+ }
294
+ );
295
+ }
296
+ function Modal() {
297
+ const {
298
+ closeModal,
299
+ registry,
300
+ visibleModalStack,
301
+ topModalEntry,
302
+ isModalVisible,
303
+ mounted,
304
+ isMobileViewport,
305
+ isTopExitSettling,
306
+ setIsTopExitSettling,
307
+ theme
308
+ } = useModalModel();
309
+ const modalMotion = useModalMotion();
310
+ if (!mounted) return null;
311
+ return createPortal(
312
+ /* @__PURE__ */ jsxs(Fragment, { children: [
313
+ /* @__PURE__ */ jsx(AnimatePresence, { children: isModalVisible && /* @__PURE__ */ jsx(
314
+ motion.div,
315
+ {
316
+ variants: modalMotion.backdrop,
317
+ initial: "hidden",
318
+ animate: "visible",
319
+ exit: "exit",
320
+ className: theme.slots.backdrop,
321
+ style: theme.styles.backdrop,
322
+ onClick: () => {
323
+ if (!isTopExitSettling) closeModal(null, topModalEntry.id);
324
+ }
325
+ },
326
+ "global-modal-backdrop"
327
+ ) }),
328
+ /* @__PURE__ */ jsx(AnimatePresence, { onExitComplete: () => setIsTopExitSettling(false), children: visibleModalStack.map((entry, index) => /* @__PURE__ */ jsx(
329
+ ModalLayer,
330
+ {
331
+ entry,
332
+ stackIndex: index,
333
+ isTopModal: index === visibleModalStack.length - 1 && !isTopExitSettling,
334
+ isMobileViewport,
335
+ closeModal,
336
+ registry,
337
+ modalStack: visibleModalStack,
338
+ theme
339
+ },
340
+ entry.id
341
+ )) })
342
+ ] }),
343
+ document.body
344
+ );
345
+ }
346
+
347
+ export { Modal, ModalContainer, hasSlotContent, isHeaderConfig, resolveHeaderActions };
348
+ //# sourceMappingURL=chunk-AQ4BNXA2.js.map
349
+ //# sourceMappingURL=chunk-AQ4BNXA2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/modal/motion.ts","../src/modules/modal/header.ts","../src/modules/modal/overlay.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAIO,IAAM,sBAAA,GAAyB,OAAO,MAAA,CAAO;AAAA,EAClD,wBAAA,EAA0B,QAAA;AAAA,EAC1B,mBAAA,EAAqB,aAAA;AAAA,EACrB,kBAAA,EAAoB,QAAA;AAAA,EACpB,SAAA,EAAW,eAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAU,CAAA;AAEH,SAAS,cAAA,GAAiB;AAC/B,EAAA,OAAO,gBAAgB,UAAU,CAAA;AACnC;AAEO,SAAS,sBAAA,CACd,WACA,QAAA,EACqB;AACrB,EAAA,OAAO,SAAA,CAAU,QAAQ,CAAA,IAAK,SAAA,CAAU,MAAA;AAC1C;ACnBO,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,OACE,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,SAAS,KAAA,KAAU,EAAA;AAE1E;AAEO,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,OAAO,OAAA;AAAA,IACL,KAAA,IACA,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IACpB,CAAC,cAAA,CAAe,KAAK;AAAA,GACvB;AACF;AAEO,SAAS,oBAAA,CACd,SAIA,KAAA,EACW;AACX,EAAA,OAAO,OAAO,YAAY,UAAA,GAAa,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,OAAA,IAAW,IAAA;AACzE;ACmBA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,IAAA;AACxC,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,MAAM,KAAA,CAAM,WAAA;AAAA,MAEvB,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,kBAAA,EAAmB,MAAM,EAAA,EAAI;AAAA;AAAA,GAC1C;AAEJ;AAEA,SAAS,OAAA,CAAQ;AAAA,EACf,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,SAAA,GAAY,eAAe,MAAM,CAAA;AACvC,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,QAAA;AAAA,MACA,OAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAQ,SAAA;AAAA,MACR,cAAA,EAAc,YAAY,CAAA,GAAI,CAAA;AAAA,MAC9B,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW,MAAM,KAAA,CAAM,GAAA;AAAA,MACvB,KAAA,EAAO,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,GAAA,GAAM,MAAA;AAAA,MAEnC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,UAAW,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAC3C,6BAAa,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,KAAA,CAAM,KAAA,CAAM,WAAY,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,4BAC5D,KAAA,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,QAAS,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GAC7C;AAEJ;AAEA,SAAS,aAAA,CACP,MAAA,EACA,KAAA,EACA,KAAA,EACA;AACA,EAAA,MAAM,MAAA,GAAqC,cAAA,CAAe,MAAM,CAAA,GAC3D,SACD,EAAC;AACL,EAAA,MAAM,UAAA,GACJ,OAAO,MAAA,KAAW,SAAA,IAClB,CAAC,cAAA,CAAe,MAAM,CAAA,IACtB,cAAA,CAAe,MAAM,CAAA,GAChB,MAAA,GACD,IAAA;AACN,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,IAAA;AAEvC,EAAA,MAAM,OACJ,UAAA,KAAe,IAAA,GACX,OACC,MAAA,CAAO,IAAA,KACP,OAAO,KAAA,mBACN,GAAA,CAAC,QAAG,EAAA,EAAI,MAAA,CAAO,SAAS,SAAA,EAAW,KAAA,CAAM,MAAM,KAAA,EAC5C,QAAA,EAAA,MAAA,CAAO,OACV,CAAA,GACE,IAAA,CAAA;AACV,EAAA,MAAM,KAAA,GACJ,UAAA,KAAe,IAAA,GACX,IAAA,GACC,MAAA,CAAO,UACP,cAAA,CAAe,OAAO,CAAA,IAAK,SAAA,mBAC1B,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,SAAA,oBAAa,GAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,KAAA,EAAc;AAAA,GAAA,EACzD,CAAA,GACE,IAAA,CAAA;AAEV,EAAA,OAAO,EAAE,QAAQ,UAAA,IAAc,MAAA,CAAO,UAAU,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,EAAM;AAC5E;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,QAAA,GAAW;AACb,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,sBAAA,EAAuB;AACzC,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,YACJ,MAAA,KAAW,KAAA,GAAQ,OAAO,aAAA,CAAc,MAAA,EAAQ,OAAO,KAAK,CAAA;AAC9D,EAAA,MAAM,kBAAA,GACJ,SAAA,IACA,CAAC,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,KAAK,CAAA,CAAE,IAAA,CAAK,cAAc,CAAA;AAEzE,EAAA,MAAM,eACJ,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,GACvB,SACD,EAAC;AACP,EAAA,MAAM;AAAA,IACJ,QAAQ,YAAA,GAAe,IAAA;AAAA,IACvB,MAAM,UAAA,GAAa,IAAA;AAAA,IACnB,OAAO,WAAA,GAAc;AAAA,GACvB,GAAI,YAAA;AACJ,EAAA,MAAM,kBAAA,GACJ,WAAW,KAAA,IACX,CAAC,YAAY,YAAA,EAAc,WAAW,CAAA,CAAE,IAAA,CAAK,cAAc,CAAA;AAE7D,EAAA,MAAM,gBAAA,GAAmB,QAAA,IAAY,SAAA,EAAW,MAAA,CAAO,QAAA,IAAY,IAAA;AAEnE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EACE,eAAe,gBAAgB,CAAA,GAC3B,SACA,mBAAA,CAAoB,SAAS,IAC3B,MAAA,GACA,QAAA;AAAA,MAER,SAAA,EAAW,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,SAAS,SAAS,CAAA;AAAA,MAE3C,QAAA,EAAA;AAAA,QAAA,kBAAA,oBACC,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,UAAU,WAAA,CAAY,MAAA;AAAA,YACtB,MAAM,SAAA,CAAU,IAAA;AAAA,YAChB,QAAQ,SAAA,CAAU,MAAA;AAAA,YAClB,OAAO,SAAA,CAAU,KAAA;AAAA,YACjB,KAAA;AAAA,YACA,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,MAAA,GAAS,KAAA,GAAQ;AAAA;AAAA,SAC5C;AAAA,wBAGF,GAAA;AAAA,UAAC,MAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,UAAU,WAAA,CAAY,OAAA;AAAA,YACtB,OAAA,EAAQ,QAAA;AAAA,YACR,OAAA,EAAQ,SAAA;AAAA,YACR,oBAAA,EAAkB,IAAA;AAAA,YAClB,0BAAA,EAAwB,IAAA;AAAA,YACxB,SAAA,EAAW,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,MAAM,aAAa,CAAA;AAAA,YAE5C;AAAA;AAAA,SACH;AAAA,QAEC,kBAAA,oBACC,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,UAAU,WAAA,CAAY,MAAA;AAAA,YACtB,IAAA,EAAM,UAAA;AAAA,YACN,MAAA,EAAQ,YAAA;AAAA,YACR,KAAA,EAAO,WAAA;AAAA,YACP,KAAA;AAAA,YACA,MAAA,EAAQ,YAAA,CAAa,MAAA,GAAS,QAAA,GAAW;AAAA;AAAA;AAC3C;AAAA;AAAA,GAEJ;AAEJ;AAEA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,MAAM,QAAA,EAC1B,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,kBAAA;AAAA,QACT,SAAA,EAAW,MAAM,KAAA,CAAM,cAAA;AAAA,QAEvB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACnD,QAAA,kBAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAE,sBAAA;AAAA,cACF,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe;AAAA;AAAA,WACjB,EACF,CAAA;AAAA,UACC,aAAA,CAAc,cAAc,SAAS;AAAA;AAAA;AAAA,KACxC;AAAA,wBACC,MAAA,EAAA,EAAK,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,iBAAiB,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,oBAC/C,GAAA,CAAC,UAAK,SAAA,EAAW,KAAA,CAAM,MAAM,eAAA,EAC1B,QAAA,EAAA,aAAA,CAAc,YAAA,CAAa,SAAS,CAAA,EACvC;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,UAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EASG;AACD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,MACE,kBAAA,CAAmB;AAAA,IACrB,UAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,IAAI,CAAC,sBAAsB,OAAO,IAAA;AAClC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,cAAA,EAAgB,gBAAgB,CAAA;AAC9D,EAAA,MAAM,cAAA,GAAiB,sBAAA;AAAA,IACrB,WAAA,CAAY,SAAA;AAAA,IACZ;AAAA,GACF;AACA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,UAAA;AAAA,MACZ,mBAAiB,KAAA,CAAM,KAAA,GAAQ,CAAA,YAAA,EAAe,KAAA,CAAM,EAAE,CAAA,CAAA,GAAK,MAAA;AAAA,MAC3D,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,MAC5B,eAAA,EAAe,iBAAiB,cAAc,CAAA;AAAA,MAC9C,cACE,cAAA,KAAmB,eAAA,CAAgB,MAAA,IAAU,CAAC,mBAC1C,IAAA,GACA,MAAA;AAAA,MAEN,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,MAEvB,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,UAAU,cAAA,CAAe,QAAA;AAAA,UACzB,OAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,YAAY,cAAA,CAAe,UAAA;AAAA,UAC3B,aAAA,EAAa,UAAA;AAAA,UACb,aAAA,EAAa,MAAA;AAAA,UACb,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,UACvB,OAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,WAAA,EAAa,GAAG,sBAAA,EAAuB;AAAA,UAChE,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,UAElC,QAAA,kBAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAa,MAAA;AAAA,cACb,SAAA,EAAW,EAAA;AAAA,gBACT,MAAM,KAAA,CAAM,KAAA;AAAA,gBACZ,aAAA,GAAgB,KAAA,CAAM,KAAA,CAAM,WAAA,GAAc,MAAM,KAAA,CAAM;AAAA,eACxD;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,KAAA,CAAM,SAAA,EACzB,wBAAc,oBAAA,EAAsB;AAAA,kBACnC,OAAO,CAAC,MAAA,KAAoB,UAAA,CAAW,MAAA,EAAQ,MAAM,EAAE,CAAA;AAAA,kBACvD,MAAM,KAAA,CAAM,KAAA;AAAA,kBACZ,MAAA,EAAQ;AAAA,oBACN,SAAS,KAAA,CAAM,aAAA;AAAA,oBACf,QAAA,EAAU,cAAA;AAAA,oBACV,WAAW,KAAA,CAAM,SAAA;AAAA,oBACjB,OAAO,KAAA,CAAM,KAAA;AAAA,oBACb,OAAA,EAAS,CAAA,YAAA,EAAe,KAAA,CAAM,EAAE,CAAA;AAAA;AAClC,iBACD,CAAA,EACH,CAAA;AAAA,gBAEC,CAAC,UAAA,oBACA,GAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,sBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,sBAAA,MAAM,QAAA,GAAW,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AACjD,sBAAA,IAAI,QAAA,EAAU,UAAA,CAAW,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AAAA,oBAC5C,CAAA;AAAA,oBACA,SAAA,EAAW,MAAM,KAAA,CAAM,GAAA;AAAA,oBACvB,KAAA,EAAO,MAAM,MAAA,CAAO,GAAA;AAAA,oBACpB,YAAA,EAAW;AAAA;AAAA,iBACb;AAAA,gBAGD,UAAA,IAAc,UAAA,GAAa,CAAA,IAAK,aAAA,oBAC/B,GAAA;AAAA,kBAAC,kBAAA;AAAA,kBAAA;AAAA,oBACC,YAAA,EAAc,KAAA;AAAA,oBACd,aAAA;AAAA,oBACA,KAAA;AAAA,oBACA,kBAAA,EAAoB,MAAM,UAAA,CAAW,IAAA,EAAM,MAAM,EAAE;AAAA;AAAA;AACrD;AAAA;AAAA;AAEJ;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,KAAA,GAAQ;AACtB,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAc;AAClB,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,OAAO,YAAA;AAAA,oBACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,mBACE,QAAA,EAAA,cAAA,oBACC,GAAA;AAAA,QAAC,MAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UAEC,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,OAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAW,MAAM,KAAA,CAAM,QAAA;AAAA,UACvB,KAAA,EAAO,MAAM,MAAA,CAAO,QAAA;AAAA,UACpB,SAAS,MAAM;AACb,YAAA,IAAI,CAAC,iBAAA,EAAmB,UAAA,CAAW,IAAA,EAAM,cAAc,EAAE,CAAA;AAAA,UAC3D;AAAA,SAAA;AAAA,QATI;AAAA,OAUN,EAEJ,CAAA;AAAA,sBAEA,GAAA,CAAC,eAAA,EAAA,EAAgB,cAAA,EAAgB,MAAM,oBAAA,CAAqB,KAAK,CAAA,EAC9D,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAC,KAAA,EAAmB,KAAA,qBACzC,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,KAAA;AAAA,UACA,UAAA,EAAY,KAAA;AAAA,UACZ,UAAA,EACE,KAAA,KAAU,iBAAA,CAAkB,MAAA,GAAS,KAAK,CAAC,iBAAA;AAAA,UAE7C,gBAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA,EAAY,iBAAA;AAAA,UACZ;AAAA,SAAA;AAAA,QAVK,KAAA,CAAM;AAAA,OAYd,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF","file":"chunk-AQ4BNXA2.js","sourcesContent":["import { useModuleMotion } from \"@/theme\";\nimport { modalTheme } from \"./constants\";\nimport { type ModalPosition, type ModalPositionMotion } from \"./types\";\n\nexport const MODAL_COMPOSITOR_STYLE = Object.freeze({\n WebkitBackfaceVisibility: \"hidden\",\n WebkitFontSmoothing: \"antialiased\",\n backfaceVisibility: \"hidden\",\n transform: \"translateZ(0)\",\n willChange: \"transform, opacity\",\n} as const);\n\nexport function useModalMotion() {\n return useModuleMotion(modalTheme);\n}\n\nexport function getModalPositionMotion(\n positions: Readonly<Record<ModalPosition, ModalPositionMotion>>,\n position: ModalPosition,\n): ModalPositionMotion {\n return positions[position] ?? positions.center;\n}\n","import { isValidElement, type ReactNode } from \"react\";\n\nexport function hasSlotContent(value: unknown): boolean {\n return (\n value !== null && value !== undefined && value !== false && value !== \"\"\n );\n}\n\nexport function isHeaderConfig(value: unknown): boolean {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !isValidElement(value),\n );\n}\n\nexport function resolveHeaderActions(\n actions:\n | ReactNode\n | ((props: { close?: (result?: unknown) => void }) => ReactNode)\n | undefined,\n close?: (result?: unknown) => void,\n): ReactNode {\n return typeof actions === \"function\" ? actions({ close }) : actions || null;\n}\n","\"use client\";\n\nimport { createElement, type ReactNode } from \"react\";\nimport { motion, AnimatePresence, type Variants } from \"motion/react\";\nimport { Button, Icon } from \"@/atoms\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { cn } from \"@/utils\";\nimport { createPortal } from \"react-dom\";\nimport { ModuleBoundary } from \"@/kernel\";\nimport { MODAL_POSITIONS } from \"./constants\";\nimport {\n MODAL_COMPOSITOR_STYLE,\n getModalPositionMotion,\n useModalMotion,\n} from \"./motion\";\nimport {\n type ModalContainerFooterConfig,\n type ModalContainerHeaderConfig,\n type ModalContainerProps,\n type ModalThemeSlot,\n type ModalComponent,\n type ModalEntry,\n} from \"./types\";\nimport {\n getModalLayout,\n getModalPosition,\n hasHeightConstraint,\n isSidePosition,\n} from \"./layout\";\nimport {\n hasSlotContent,\n isHeaderConfig,\n resolveHeaderActions,\n} from \"./header\";\nimport { getModalLabel } from \"./identity\";\nimport {\n useModalContainerModel,\n useModalLayerModel,\n useModalModel,\n} from \"./hooks\";\nimport { type ResolvedTheme } from \"@/theme\";\n\ntype Theme = ResolvedTheme<ModalThemeSlot>;\n\nfunction CloseButton({\n close,\n theme,\n}: {\n close?: (result?: unknown) => void;\n theme: Theme;\n}) {\n if (typeof close !== \"function\") return null;\n return (\n <Button\n type=\"button\"\n aria-label=\"Close modal\"\n onClick={close}\n className={theme.slots.closeButton}\n >\n <Icon icon=\"solar:close-bold\" size={16} />\n </Button>\n );\n}\n\nfunction SlotRow({\n center,\n left,\n right,\n sticky,\n theme,\n variants,\n}: {\n center: ReactNode;\n left: ReactNode;\n right: ReactNode;\n sticky?: \"top\" | \"bottom\";\n theme: Theme;\n variants: Variants;\n}) {\n const hasCenter = hasSlotContent(center);\n return (\n <motion.div\n variants={variants}\n initial=\"hidden\"\n animate=\"visible\"\n data-columns={hasCenter ? 3 : 2}\n data-sticky={sticky}\n className={theme.slots.row}\n style={sticky ? theme.styles.row : undefined}\n >\n <div className={theme.slots.rowStart}>{left}</div>\n {hasCenter && <div className={theme.slots.rowCenter}>{center}</div>}\n <div className={theme.slots.rowEnd}>{right}</div>\n </motion.div>\n );\n}\n\nfunction resolveHeader(\n header: ModalContainerProps[\"header\"],\n close: ModalContainerProps[\"close\"],\n theme: Theme,\n) {\n const config: ModalContainerHeaderConfig = isHeaderConfig(header)\n ? (header as ModalContainerHeaderConfig)\n : {};\n const customNode =\n typeof header !== \"boolean\" &&\n !isHeaderConfig(header) &&\n hasSlotContent(header)\n ? (header as ReactNode)\n : null;\n const actions = resolveHeaderActions(config.actions, close);\n const showClose = config.showClose === true;\n\n const left =\n customNode !== null\n ? null\n : (config.left ??\n (config.title ? (\n <h2 id={config.titleId} className={theme.slots.title}>\n {config.title}\n </h2>\n ) : null));\n const right =\n customNode !== null\n ? null\n : (config.right ??\n (hasSlotContent(actions) || showClose ? (\n <>\n {actions}\n {showClose && <CloseButton close={close} theme={theme} />}\n </>\n ) : null));\n\n return { center: customNode ?? config.center ?? null, config, left, right };\n}\n\nexport function ModalContainer({\n bodyClassName,\n children,\n className,\n close,\n footer,\n header = {},\n position = null,\n}: ModalContainerProps) {\n const { theme } = useModalContainerModel();\n const modalMotion = useModalMotion();\n const headerRow =\n header === false ? null : resolveHeader(header, close, theme);\n const shouldRenderHeader =\n headerRow &&\n [headerRow.left, headerRow.center, headerRow.right].some(hasSlotContent);\n\n const footerConfig: ModalContainerFooterConfig =\n footer && typeof footer === \"object\"\n ? (footer as ModalContainerFooterConfig)\n : {};\n const {\n center: footerCenter = null,\n left: footerLeft = null,\n right: footerRight = null,\n } = footerConfig;\n const shouldRenderFooter =\n footer !== false &&\n [footerLeft, footerCenter, footerRight].some(hasSlotContent);\n\n const resolvedPosition = position || headerRow?.config.position || null;\n\n return (\n <div\n data-height={\n isSidePosition(resolvedPosition)\n ? \"full\"\n : hasHeightConstraint(className)\n ? undefined\n : \"capped\"\n }\n className={cn(theme.slots.content, className)}\n >\n {shouldRenderHeader && (\n <SlotRow\n variants={modalMotion.header}\n left={headerRow.left}\n center={headerRow.center}\n right={headerRow.right}\n theme={theme}\n sticky={headerRow.config.sticky ? \"top\" : undefined}\n />\n )}\n\n <motion.div\n variants={modalMotion.content}\n initial=\"hidden\"\n animate=\"visible\"\n data-lenis-prevent\n data-lenis-prevent-wheel\n className={cn(theme.slots.body, bodyClassName)}\n >\n {children}\n </motion.div>\n\n {shouldRenderFooter && (\n <SlotRow\n variants={modalMotion.footer}\n left={footerLeft}\n center={footerCenter}\n right={footerRight}\n theme={theme}\n sticky={footerConfig.sticky ? \"bottom\" : undefined}\n />\n )}\n </div>\n );\n}\n\nfunction ModalLayerSwitcher({\n currentEntry,\n onSwitchToPrevious,\n previousEntry,\n theme,\n}: {\n currentEntry: ModalEntry;\n onSwitchToPrevious: () => void;\n previousEntry: ModalEntry;\n theme: Theme;\n}) {\n return (\n <div className={theme.slots.switcher}>\n <Button\n type=\"button\"\n onClick={onSwitchToPrevious}\n className={theme.slots.switcherButton}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n {getModalLabel(previousEntry.modalType)}\n </Button>\n <span className={theme.slots.switcherDivider}>/</span>\n <span className={theme.slots.switcherCurrent}>\n {getModalLabel(currentEntry.modalType)}\n </span>\n </div>\n );\n}\n\nfunction ModalLayer({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n theme,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n theme: Theme;\n}) {\n const {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n previousEntry,\n baseZIndex,\n } = useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n });\n const modalMotion = useModalMotion();\n if (!ActiveModalComponent) return null;\n const layout = getModalLayout(activePosition, isMobileViewport);\n const positionMotion = getModalPositionMotion(\n modalMotion.positions,\n activePosition,\n );\n return (\n <div\n role=\"dialog\"\n aria-modal={isTopModal}\n aria-labelledby={entry.title ? `modal-title-${entry.id}` : undefined}\n style={{ zIndex: baseZIndex }}\n data-position={getModalPosition(activePosition)}\n data-inset={\n activePosition === MODAL_POSITIONS.CENTER && !isMobileViewport\n ? true\n : undefined\n }\n className={theme.slots.layer}\n >\n <motion.div\n ref={modalRef}\n variants={positionMotion.variants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n transition={positionMotion.transition}\n data-active={isTopModal}\n data-layout={layout}\n className={theme.slots.frame}\n style={{ zIndex: Z_INDEX.MODAL_FRAME, ...MODAL_COMPOSITOR_STYLE }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n data-layout={layout}\n className={cn(\n theme.slots.panel,\n isPanelChrome ? theme.slots.panelChrome : theme.slots.panelBare,\n )}\n >\n <ModuleBoundary name={entry.modalType}>\n {createElement(ActiveModalComponent, {\n close: (result: unknown) => closeModal(result, entry.id),\n data: entry.props,\n header: {\n actions: entry.headerActions,\n position: activePosition,\n showClose: entry.showClose,\n title: entry.title,\n titleId: `modal-title-${entry.id}`,\n },\n })}\n </ModuleBoundary>\n\n {!isTopModal && (\n <div\n onClick={(e) => {\n e.stopPropagation();\n const topModal = modalStack[modalStack.length - 1];\n if (topModal) closeModal(null, topModal.id);\n }}\n className={theme.slots.dim}\n style={theme.styles.dim}\n aria-label=\"Close active top modal\"\n />\n )}\n\n {isTopModal && stackIndex > 0 && previousEntry && (\n <ModalLayerSwitcher\n currentEntry={entry}\n previousEntry={previousEntry}\n theme={theme}\n onSwitchToPrevious={() => closeModal(null, entry.id)}\n />\n )}\n </div>\n </motion.div>\n </div>\n );\n}\n\nexport function Modal() {\n const {\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme,\n } = useModalModel();\n const modalMotion = useModalMotion();\n if (!mounted) return null;\n return createPortal(\n <>\n <AnimatePresence>\n {isModalVisible && (\n <motion.div\n key=\"global-modal-backdrop\"\n variants={modalMotion.backdrop}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"exit\"\n className={theme.slots.backdrop}\n style={theme.styles.backdrop}\n onClick={() => {\n if (!isTopExitSettling) closeModal(null, topModalEntry.id);\n }}\n />\n )}\n </AnimatePresence>\n\n <AnimatePresence onExitComplete={() => setIsTopExitSettling(false)}>\n {visibleModalStack.map((entry: ModalEntry, index: number) => (\n <ModalLayer\n key={entry.id}\n entry={entry}\n stackIndex={index}\n isTopModal={\n index === visibleModalStack.length - 1 && !isTopExitSettling\n }\n isMobileViewport={isMobileViewport}\n closeModal={closeModal}\n registry={registry}\n modalStack={visibleModalStack}\n theme={theme}\n />\n ))}\n </AnimatePresence>\n </>,\n document.body,\n );\n}\n"]}