@omerdlw/base-framework 1.0.6 → 2.0.0
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.
- package/dist/atoms/index.js +1 -103
- package/dist/atoms/index.js.map +1 -1
- package/dist/chunk-3BUP64Q6.js +105 -0
- package/dist/chunk-3BUP64Q6.js.map +1 -0
- package/dist/chunk-3MSK4XGK.js +9888 -0
- package/dist/chunk-3MSK4XGK.js.map +1 -0
- package/dist/chunk-4GMQKD6F.js +353 -0
- package/dist/chunk-4GMQKD6F.js.map +1 -0
- package/dist/chunk-65ZB4QTQ.js +888 -0
- package/dist/chunk-65ZB4QTQ.js.map +1 -0
- package/dist/chunk-6SG7V77J.js +577 -0
- package/dist/chunk-6SG7V77J.js.map +1 -0
- package/dist/chunk-7HQMXTNP.js +419 -0
- package/dist/chunk-7HQMXTNP.js.map +1 -0
- package/dist/chunk-7TAVYJ3A.js +371 -0
- package/dist/chunk-7TAVYJ3A.js.map +1 -0
- package/dist/chunk-AQ4BNXA2.js +349 -0
- package/dist/chunk-AQ4BNXA2.js.map +1 -0
- package/dist/chunk-CGHZSSFR.js +2166 -0
- package/dist/chunk-CGHZSSFR.js.map +1 -0
- package/dist/chunk-DGCQWQLZ.js +61 -0
- package/dist/chunk-DGCQWQLZ.js.map +1 -0
- package/dist/chunk-FIMPHODX.js +67 -0
- package/dist/chunk-FIMPHODX.js.map +1 -0
- package/dist/chunk-GF7TUX5I.js +1889 -0
- package/dist/chunk-GF7TUX5I.js.map +1 -0
- package/dist/chunk-JELG4JLT.js +454 -0
- package/dist/chunk-JELG4JLT.js.map +1 -0
- package/dist/chunk-K676GL7Z.js +51 -0
- package/dist/chunk-K676GL7Z.js.map +1 -0
- package/dist/chunk-KKQT46TP.js +26 -0
- package/dist/chunk-KKQT46TP.js.map +1 -0
- package/dist/chunk-QI3ALLIB.js +38 -0
- package/dist/chunk-QI3ALLIB.js.map +1 -0
- package/dist/chunk-QXR55VVS.js +1139 -0
- package/dist/chunk-QXR55VVS.js.map +1 -0
- package/dist/chunk-R2YGFJDJ.js +408 -0
- package/dist/chunk-R2YGFJDJ.js.map +1 -0
- package/dist/chunk-RFZQWLC5.js +27 -0
- package/dist/chunk-RFZQWLC5.js.map +1 -0
- package/dist/chunk-SYAVGTOX.js +521 -0
- package/dist/chunk-SYAVGTOX.js.map +1 -0
- package/dist/chunk-TV3WEF5G.js +784 -0
- package/dist/chunk-TV3WEF5G.js.map +1 -0
- package/dist/chunk-XASQT4CQ.js +280 -0
- package/dist/chunk-XASQT4CQ.js.map +1 -0
- package/dist/error/index.js +5 -682
- package/dist/error/index.js.map +1 -1
- package/dist/error/reporter.d.ts.map +1 -1
- package/dist/error/theme.d.ts +1 -1
- package/dist/error/theme.d.ts.map +1 -1
- package/dist/events.js +1 -7
- package/dist/events.js.map +1 -1
- package/dist/hooks/index.js +1 -358
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-global-event.d.ts +1 -1
- package/dist/index.js +18 -20029
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2035
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/modules/ambient/analyze.d.ts +46 -0
- package/dist/modules/ambient/analyze.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +1 -5
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/context.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +11 -12
- package/dist/modules/ambient/dom.d.ts.map +1 -1
- package/dist/modules/ambient/extractor.d.ts +10 -10
- package/dist/modules/ambient/extractor.d.ts.map +1 -1
- package/dist/modules/ambient/hooks.d.ts +1 -1
- package/dist/modules/ambient/hooks.d.ts.map +1 -1
- package/dist/modules/ambient/index.d.ts +6 -4
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +7 -762
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts +1 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/ambient/oklab.d.ts +36 -0
- package/dist/modules/ambient/oklab.d.ts.map +1 -0
- package/dist/modules/ambient/pipeline.d.ts +28 -0
- package/dist/modules/ambient/pipeline.d.ts.map +1 -0
- package/dist/modules/ambient/quantize.d.ts +22 -0
- package/dist/modules/ambient/quantize.d.ts.map +1 -0
- package/dist/modules/ambient/server/address.d.ts +8 -0
- package/dist/modules/ambient/server/address.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.d.ts +53 -0
- package/dist/modules/ambient/server/index.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.js +221 -0
- package/dist/modules/ambient/server/index.js.map +1 -0
- package/dist/modules/ambient/settings.d.ts +19 -0
- package/dist/modules/ambient/settings.d.ts.map +1 -0
- package/dist/modules/ambient/types.d.ts +105 -9
- package/dist/modules/ambient/types.d.ts.map +1 -1
- package/dist/modules/ambient/worker/index.d.ts +15 -0
- package/dist/modules/ambient/worker/index.d.ts.map +1 -0
- package/dist/modules/ambient/worker/index.js +114 -0
- package/dist/modules/ambient/worker/index.js.map +1 -0
- package/dist/modules/background/constants.d.ts +2 -2
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +1 -1
- package/dist/modules/background/index.js +6 -3078
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/motion.d.ts +9 -7
- package/dist/modules/background/motion.d.ts.map +1 -1
- package/dist/modules/background/overlay.d.ts +3 -8
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/types.d.ts +16 -2
- package/dist/modules/background/types.d.ts.map +1 -1
- package/dist/modules/context-menu/constants.d.ts +2 -2
- package/dist/modules/context-menu/constants.d.ts.map +1 -1
- package/dist/modules/context-menu/hooks.d.ts +1 -1
- package/dist/modules/context-menu/index.js +10 -1896
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/context-menu/motion.d.ts +1 -8
- package/dist/modules/context-menu/motion.d.ts.map +1 -1
- package/dist/modules/context-menu/overlay.d.ts.map +1 -1
- package/dist/modules/context-menu/types.d.ts +16 -2
- package/dist/modules/context-menu/types.d.ts.map +1 -1
- package/dist/modules/controls/constants.d.ts +1 -1
- package/dist/modules/controls/constants.d.ts.map +1 -1
- package/dist/modules/controls/entries.d.ts +1 -1
- package/dist/modules/controls/hooks.d.ts +1 -1
- package/dist/modules/controls/index.js +4 -1110
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/overlay.d.ts +1 -1
- package/dist/modules/controls/types.d.ts +2 -2
- package/dist/modules/dock/cards.d.ts +708 -24
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/constants.d.ts +2 -2
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/helpers.d.ts +2 -2
- package/dist/modules/dock/hooks.d.ts +2 -2
- package/dist/modules/dock/index.d.ts +1 -1
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +9 -12132
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/module.d.ts +1 -1
- package/dist/modules/dock/motion.d.ts +41 -915
- package/dist/modules/dock/motion.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts +1 -23
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/styles.d.ts +4 -4
- package/dist/modules/dock/surface/hooks.d.ts +5 -20
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
- package/dist/modules/dock/surface/machine.d.ts +4 -3
- package/dist/modules/dock/surface/machine.d.ts.map +1 -1
- package/dist/modules/dock/surface/stack.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +158 -3
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +16 -17883
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/constants.d.ts +1 -1
- package/dist/modules/loading/constants.d.ts.map +1 -1
- package/dist/modules/loading/context.d.ts +1 -1
- package/dist/modules/loading/hooks.d.ts +1 -1
- package/dist/modules/loading/index.js +5 -1153
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/types.d.ts +2 -2
- package/dist/modules/media/context.d.ts +1 -1
- package/dist/modules/media/index.js +3 -570
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/media/types.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts +1 -1
- package/dist/modules/modal/hooks.d.ts +3 -3
- package/dist/modules/modal/index.js +8 -2355
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/modal/motion.d.ts +3 -8
- package/dist/modules/modal/motion.d.ts.map +1 -1
- package/dist/modules/modal/overlay.d.ts.map +1 -1
- package/dist/modules/modal/types.d.ts +21 -0
- package/dist/modules/modal/types.d.ts.map +1 -1
- package/dist/modules/notification/constants.d.ts +2 -2
- package/dist/modules/notification/constants.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +1 -1
- package/dist/modules/notification/hooks.d.ts +1 -1
- package/dist/modules/notification/index.js +4 -828
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/motion.d.ts +1 -7
- package/dist/modules/notification/motion.d.ts.map +1 -1
- package/dist/modules/notification/overlay.d.ts.map +1 -1
- package/dist/modules/notification/types.d.ts +9 -1
- package/dist/modules/notification/types.d.ts.map +1 -1
- package/dist/overlay-TZ6L52A5.js +9 -0
- package/dist/overlay-TZ6L52A5.js.map +1 -0
- package/dist/provider.d.ts +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +6 -1968
- package/dist/provider.js.map +1 -1
- package/dist/result.js +2 -63
- package/dist/result.js.map +1 -1
- package/dist/theme.d.ts +45 -8
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +3 -41
- package/dist/theme.js.map +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +126 -155
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/motion-config.d.ts +44 -0
- package/dist/tokens/motion-config.d.ts.map +1 -0
- package/dist/tokens/motion.d.ts +23 -174
- package/dist/tokens/motion.d.ts.map +1 -1
- package/dist/utils/index.js +4 -82
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/report.d.ts.map +1 -1
- package/docs/README.md +1 -0
- package/docs/architecture-and-rules.md +4 -3
- package/docs/core-engine.md +7 -10
- package/docs/getting-started.md +4 -2
- package/docs/modules/ambient.md +194 -80
- package/docs/modules/background.md +3 -3
- package/docs/modules/context-menu.md +2 -2
- package/docs/modules/dock.md +8 -5
- package/docs/modules/modal.md +2 -2
- package/docs/modules/notification.md +2 -2
- package/docs/theming.md +81 -9
- package/package.json +22 -5
- package/templates/AGENTS.md +1 -1
- package/templates/motion/background.ts +17 -0
- package/templates/motion/context-menu.ts +63 -0
- package/templates/motion/dock.ts +327 -0
- package/templates/motion/modal.ts +79 -0
- package/templates/motion/notification.ts +27 -0
- package/templates/motion/tokens.ts +47 -0
- package/templates/tsconfig.json +7 -0
- package/dist/modules/ambient/color.d.ts +0 -21
- 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":"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","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"]}
|