@zentauri-ui/zentauri-components 1.1.1 → 1.2.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/README.md +62 -21
- package/dist/chunk-2VQJ6OIL.js +31 -0
- package/dist/chunk-2VQJ6OIL.js.map +1 -0
- package/dist/chunk-73VCO5TE.mjs +29 -0
- package/dist/chunk-73VCO5TE.mjs.map +1 -0
- package/dist/chunk-BSWYZTYK.js +31 -0
- package/dist/chunk-BSWYZTYK.js.map +1 -0
- package/dist/chunk-CY5BQKRZ.mjs +29 -0
- package/dist/chunk-CY5BQKRZ.mjs.map +1 -0
- package/dist/chunk-DFEZH7TC.mjs +27 -0
- package/dist/chunk-DFEZH7TC.mjs.map +1 -0
- package/dist/chunk-FT2LMA66.mjs +25 -0
- package/dist/chunk-FT2LMA66.mjs.map +1 -0
- package/dist/chunk-JE3PD5ZA.js +107 -0
- package/dist/chunk-JE3PD5ZA.js.map +1 -0
- package/dist/chunk-JXCTEAXD.js +38 -0
- package/dist/chunk-JXCTEAXD.js.map +1 -0
- package/dist/chunk-LIJ6BDGP.mjs +36 -0
- package/dist/chunk-LIJ6BDGP.mjs.map +1 -0
- package/dist/chunk-PMAF6FBF.mjs +37 -0
- package/dist/chunk-PMAF6FBF.mjs.map +1 -0
- package/dist/chunk-TZ2JVWTZ.mjs +104 -0
- package/dist/chunk-TZ2JVWTZ.mjs.map +1 -0
- package/dist/chunk-UIYFEP3I.js +39 -0
- package/dist/chunk-UIYFEP3I.js.map +1 -0
- package/dist/chunk-UOZYPWDZ.js +32 -0
- package/dist/chunk-UOZYPWDZ.js.map +1 -0
- package/dist/chunk-WL5I7RVS.mjs +54 -0
- package/dist/chunk-WL5I7RVS.mjs.map +1 -0
- package/dist/chunk-WP7GYBRI.js +27 -0
- package/dist/chunk-WP7GYBRI.js.map +1 -0
- package/dist/chunk-YPLVTUYL.js +56 -0
- package/dist/chunk-YPLVTUYL.js.map +1 -0
- package/dist/hooks/useBodyScrollLock.d.mts +14 -0
- package/dist/hooks/useBodyScrollLock.d.ts +14 -0
- package/dist/hooks/useBodyScrollLock.js +13 -0
- package/dist/hooks/useBodyScrollLock.js.map +1 -0
- package/dist/hooks/useBodyScrollLock.mjs +4 -0
- package/dist/hooks/useBodyScrollLock.mjs.map +1 -0
- package/dist/hooks/useClickOutside.d.mts +23 -0
- package/dist/hooks/useClickOutside.d.ts +23 -0
- package/dist/hooks/useClickOutside.js +13 -0
- package/dist/hooks/useClickOutside.js.map +1 -0
- package/dist/hooks/useClickOutside.mjs +4 -0
- package/dist/hooks/useClickOutside.mjs.map +1 -0
- package/dist/hooks/useClipboard.d.mts +22 -0
- package/dist/hooks/useClipboard.d.ts +22 -0
- package/dist/hooks/useClipboard.js +51 -0
- package/dist/hooks/useClipboard.js.map +1 -0
- package/dist/hooks/useClipboard.mjs +49 -0
- package/dist/hooks/useClipboard.mjs.map +1 -0
- package/dist/hooks/useControllableState.d.mts +22 -0
- package/dist/hooks/useControllableState.d.ts +22 -0
- package/dist/hooks/useControllableState.js +13 -0
- package/dist/hooks/useControllableState.js.map +1 -0
- package/dist/hooks/useControllableState.mjs +4 -0
- package/dist/hooks/useControllableState.mjs.map +1 -0
- package/dist/hooks/useDebouncedValue.d.mts +14 -0
- package/dist/hooks/useDebouncedValue.d.ts +14 -0
- package/dist/hooks/useDebouncedValue.js +22 -0
- package/dist/hooks/useDebouncedValue.js.map +1 -0
- package/dist/hooks/useDebouncedValue.mjs +20 -0
- package/dist/hooks/useDebouncedValue.mjs.map +1 -0
- package/dist/hooks/useDisclosure.d.mts +25 -0
- package/dist/hooks/useDisclosure.d.ts +25 -0
- package/dist/hooks/useDisclosure.js +37 -0
- package/dist/hooks/useDisclosure.js.map +1 -0
- package/dist/hooks/useDisclosure.mjs +35 -0
- package/dist/hooks/useDisclosure.mjs.map +1 -0
- package/dist/hooks/useDocumentTitle.d.mts +19 -0
- package/dist/hooks/useDocumentTitle.d.ts +19 -0
- package/dist/hooks/useDocumentTitle.js +40 -0
- package/dist/hooks/useDocumentTitle.js.map +1 -0
- package/dist/hooks/useDocumentTitle.mjs +38 -0
- package/dist/hooks/useDocumentTitle.mjs.map +1 -0
- package/dist/hooks/useFocusManagement.d.mts +24 -0
- package/dist/hooks/useFocusManagement.d.ts +24 -0
- package/dist/hooks/useFocusManagement.js +14 -0
- package/dist/hooks/useFocusManagement.js.map +1 -0
- package/dist/hooks/useFocusManagement.mjs +5 -0
- package/dist/hooks/useFocusManagement.mjs.map +1 -0
- package/dist/hooks/useHover.d.mts +15 -0
- package/dist/hooks/useHover.d.ts +15 -0
- package/dist/hooks/useHover.js +37 -0
- package/dist/hooks/useHover.js.map +1 -0
- package/dist/hooks/useHover.mjs +35 -0
- package/dist/hooks/useHover.mjs.map +1 -0
- package/dist/hooks/useInView.d.mts +19 -0
- package/dist/hooks/useInView.d.ts +19 -0
- package/dist/hooks/useInView.js +15 -0
- package/dist/hooks/useInView.js.map +1 -0
- package/dist/hooks/useInView.mjs +13 -0
- package/dist/hooks/useInView.mjs.map +1 -0
- package/dist/hooks/useIntersectionObserver.d.mts +19 -0
- package/dist/hooks/useIntersectionObserver.d.ts +19 -0
- package/dist/hooks/useIntersectionObserver.js +13 -0
- package/dist/hooks/useIntersectionObserver.js.map +1 -0
- package/dist/hooks/useIntersectionObserver.mjs +4 -0
- package/dist/hooks/useIntersectionObserver.mjs.map +1 -0
- package/dist/hooks/useIsMounted.d.mts +11 -0
- package/dist/hooks/useIsMounted.d.ts +11 -0
- package/dist/hooks/useIsMounted.js +20 -0
- package/dist/hooks/useIsMounted.js.map +1 -0
- package/dist/hooks/useIsMounted.mjs +18 -0
- package/dist/hooks/useIsMounted.mjs.map +1 -0
- package/dist/hooks/useIsomorphicLayoutEffect.d.mts +11 -0
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +11 -0
- package/dist/hooks/useIsomorphicLayoutEffect.js +11 -0
- package/dist/hooks/useIsomorphicLayoutEffect.js.map +1 -0
- package/dist/hooks/useIsomorphicLayoutEffect.mjs +9 -0
- package/dist/hooks/useIsomorphicLayoutEffect.mjs.map +1 -0
- package/dist/hooks/useLocalStorage.d.mts +22 -0
- package/dist/hooks/useLocalStorage.d.ts +22 -0
- package/dist/hooks/useLocalStorage.js +84 -0
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/hooks/useLocalStorage.mjs +82 -0
- package/dist/hooks/useLocalStorage.mjs.map +1 -0
- package/dist/hooks/useMediaQuery.d.mts +13 -0
- package/dist/hooks/useMediaQuery.d.ts +13 -0
- package/dist/hooks/useMediaQuery.js +13 -0
- package/dist/hooks/useMediaQuery.js.map +1 -0
- package/dist/hooks/useMediaQuery.mjs +4 -0
- package/dist/hooks/useMediaQuery.mjs.map +1 -0
- package/dist/hooks/useNetworkStatus.d.mts +10 -0
- package/dist/hooks/useNetworkStatus.d.ts +10 -0
- package/dist/hooks/useNetworkStatus.js +30 -0
- package/dist/hooks/useNetworkStatus.js.map +1 -0
- package/dist/hooks/useNetworkStatus.mjs +28 -0
- package/dist/hooks/useNetworkStatus.mjs.map +1 -0
- package/dist/hooks/usePageVisibility.d.mts +10 -0
- package/dist/hooks/usePageVisibility.d.ts +10 -0
- package/dist/hooks/usePageVisibility.js +28 -0
- package/dist/hooks/usePageVisibility.js.map +1 -0
- package/dist/hooks/usePageVisibility.mjs +26 -0
- package/dist/hooks/usePageVisibility.mjs.map +1 -0
- package/dist/hooks/usePagination.d.mts +5 -0
- package/dist/hooks/usePagination.d.ts +5 -0
- package/dist/hooks/usePagination.js +18 -0
- package/dist/hooks/usePagination.js.map +1 -0
- package/dist/hooks/usePagination.mjs +5 -0
- package/dist/hooks/usePagination.mjs.map +1 -0
- package/dist/hooks/usePrefersColorScheme.d.mts +10 -0
- package/dist/hooks/usePrefersColorScheme.d.ts +10 -0
- package/dist/hooks/usePrefersColorScheme.js +17 -0
- package/dist/hooks/usePrefersColorScheme.js.map +1 -0
- package/dist/hooks/usePrefersColorScheme.mjs +15 -0
- package/dist/hooks/usePrefersColorScheme.mjs.map +1 -0
- package/dist/hooks/usePrefersReducedMotion.d.mts +10 -0
- package/dist/hooks/usePrefersReducedMotion.d.ts +10 -0
- package/dist/hooks/usePrefersReducedMotion.js +13 -0
- package/dist/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/hooks/usePrefersReducedMotion.mjs +11 -0
- package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -0
- package/dist/hooks/useResizeObserver.d.mts +23 -0
- package/dist/hooks/useResizeObserver.d.ts +23 -0
- package/dist/hooks/useResizeObserver.js +38 -0
- package/dist/hooks/useResizeObserver.js.map +1 -0
- package/dist/hooks/useResizeObserver.mjs +36 -0
- package/dist/hooks/useResizeObserver.mjs.map +1 -0
- package/dist/hooks/useSessionStorage.d.mts +22 -0
- package/dist/hooks/useSessionStorage.d.ts +22 -0
- package/dist/hooks/useSessionStorage.js +58 -0
- package/dist/hooks/useSessionStorage.js.map +1 -0
- package/dist/hooks/useSessionStorage.mjs +56 -0
- package/dist/hooks/useSessionStorage.mjs.map +1 -0
- package/dist/hooks/useThrottledCallback.d.mts +14 -0
- package/dist/hooks/useThrottledCallback.d.ts +14 -0
- package/dist/hooks/useThrottledCallback.js +27 -0
- package/dist/hooks/useThrottledCallback.js.map +1 -0
- package/dist/hooks/useThrottledCallback.mjs +25 -0
- package/dist/hooks/useThrottledCallback.mjs.map +1 -0
- package/dist/hooks/useToggle.d.mts +9 -0
- package/dist/hooks/useToggle.d.ts +9 -0
- package/dist/hooks/useToggle.js +20 -0
- package/dist/hooks/useToggle.js.map +1 -0
- package/dist/hooks/useToggle.mjs +18 -0
- package/dist/hooks/useToggle.mjs.map +1 -0
- package/dist/hooks/useWindowSize.d.mts +14 -0
- package/dist/hooks/useWindowSize.d.ts +14 -0
- package/dist/hooks/useWindowSize.js +30 -0
- package/dist/hooks/useWindowSize.js.map +1 -0
- package/dist/hooks/useWindowSize.mjs +28 -0
- package/dist/hooks/useWindowSize.mjs.map +1 -0
- package/dist/hooks/utils.d.mts +8 -0
- package/dist/hooks/utils.d.ts +8 -0
- package/dist/hooks/utils.js +24 -0
- package/dist/hooks/utils.js.map +1 -0
- package/dist/hooks/utils.mjs +3 -0
- package/dist/hooks/utils.mjs.map +1 -0
- package/dist/index-ClPu5gDp.d.ts +86 -0
- package/dist/index-D4p9fn1o.d.mts +86 -0
- package/dist/ui/accordion.js +5 -5
- package/dist/ui/accordion.mjs +1 -1
- package/dist/ui/alert.js +7 -7
- package/dist/ui/alert.mjs +1 -1
- package/dist/ui/avatar.js +6 -6
- package/dist/ui/avatar.js.map +1 -1
- package/dist/ui/avatar.mjs +1 -1
- package/dist/ui/avatar.mjs.map +1 -1
- package/dist/ui/badge.js +2 -2
- package/dist/ui/badge.mjs +1 -1
- package/dist/ui/breadcrumb.js +7 -7
- package/dist/ui/breadcrumb.mjs +1 -1
- package/dist/ui/buttons.js +3 -3
- package/dist/ui/buttons.mjs +1 -1
- package/dist/ui/card.js +7 -7
- package/dist/ui/card.js.map +1 -1
- package/dist/ui/card.mjs +1 -1
- package/dist/ui/card.mjs.map +1 -1
- package/dist/ui/divider.js +6 -6
- package/dist/ui/divider.mjs +1 -1
- package/dist/ui/drawer.js +15 -60
- package/dist/ui/drawer.js.map +1 -1
- package/dist/ui/drawer.mjs +9 -54
- package/dist/ui/drawer.mjs.map +1 -1
- package/dist/ui/dropdown.js +6 -13
- package/dist/ui/dropdown.js.map +1 -1
- package/dist/ui/dropdown.mjs +4 -11
- package/dist/ui/dropdown.mjs.map +1 -1
- package/dist/ui/empty-state.js +6 -6
- package/dist/ui/empty-state.js.map +1 -1
- package/dist/ui/empty-state.mjs +1 -1
- package/dist/ui/empty-state.mjs.map +1 -1
- package/dist/ui/file-upload.js +3 -3
- package/dist/ui/file-upload.mjs +1 -1
- package/dist/ui/inputs.js +3 -3
- package/dist/ui/inputs.mjs +1 -1
- package/dist/ui/modal.js +16 -61
- package/dist/ui/modal.js.map +1 -1
- package/dist/ui/modal.mjs +9 -54
- package/dist/ui/modal.mjs.map +1 -1
- package/dist/ui/pagination.d.mts +3 -81
- package/dist/ui/pagination.d.ts +3 -81
- package/dist/ui/pagination.js +13 -122
- package/dist/ui/pagination.js.map +1 -1
- package/dist/ui/pagination.mjs +5 -114
- package/dist/ui/pagination.mjs.map +1 -1
- package/dist/ui/progress.js +7 -10
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/progress.mjs +1 -4
- package/dist/ui/progress.mjs.map +1 -1
- package/dist/ui/select.js +6 -6
- package/dist/ui/select.mjs +1 -1
- package/dist/ui/skeleton.js +7 -7
- package/dist/ui/skeleton.mjs +1 -1
- package/dist/ui/slider.js +9 -9
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/slider.mjs +1 -1
- package/dist/ui/slider.mjs.map +1 -1
- package/dist/ui/spinner.js +24 -10
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/spinner.mjs +17 -3
- package/dist/ui/spinner.mjs.map +1 -1
- package/dist/ui/stepper.js +6 -6
- package/dist/ui/stepper.mjs +1 -1
- package/dist/ui/table.js +9 -9
- package/dist/ui/table.js.map +1 -1
- package/dist/ui/table.mjs +1 -1
- package/dist/ui/table.mjs.map +1 -1
- package/dist/ui/tabs.js +5 -5
- package/dist/ui/tabs.mjs +1 -1
- package/dist/ui/toast.js +7 -7
- package/dist/ui/toast.js.map +1 -1
- package/dist/ui/toast.mjs +1 -1
- package/dist/ui/toast.mjs.map +1 -1
- package/dist/ui/toggle.js +3 -3
- package/dist/ui/toggle.mjs +1 -1
- package/dist/ui/tooltip.js +2 -2
- package/dist/ui/tooltip.mjs +1 -1
- package/package.json +7 -2
- package/dist/chunk-B23TPTVG.mjs +0 -11
- package/dist/chunk-B23TPTVG.mjs.map +0 -1
- package/dist/chunk-WZ2GOU2J.js +0 -13
- package/dist/chunk-WZ2GOU2J.js.map +0 -1
package/dist/ui/inputs.mjs
CHANGED
package/dist/ui/modal.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkYPLVTUYL_js = require('../chunk-YPLVTUYL.js');
|
|
5
|
+
require('../chunk-UIYFEP3I.js');
|
|
6
|
+
var chunkUOZYPWDZ_js = require('../chunk-UOZYPWDZ.js');
|
|
5
7
|
var framerMotion = require('framer-motion');
|
|
6
8
|
var react = require('react');
|
|
7
9
|
var reactDom = require('react-dom');
|
|
@@ -131,19 +133,6 @@ function useModalContext(component) {
|
|
|
131
133
|
}
|
|
132
134
|
return ctx;
|
|
133
135
|
}
|
|
134
|
-
var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex="-1"])';
|
|
135
|
-
function useBodyScrollLock(locked) {
|
|
136
|
-
react.useEffect(() => {
|
|
137
|
-
if (!locked) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const previousOverflow = document.body.style.overflow;
|
|
141
|
-
document.body.style.overflow = "hidden";
|
|
142
|
-
return () => {
|
|
143
|
-
document.body.style.overflow = previousOverflow;
|
|
144
|
-
};
|
|
145
|
-
}, [locked]);
|
|
146
|
-
}
|
|
147
136
|
function Modal({
|
|
148
137
|
open,
|
|
149
138
|
defaultOpen = false,
|
|
@@ -194,7 +183,7 @@ function ModalTrigger({
|
|
|
194
183
|
ref,
|
|
195
184
|
type: "button",
|
|
196
185
|
"data-slot": "modal-trigger",
|
|
197
|
-
className:
|
|
186
|
+
className: chunkUOZYPWDZ_js.cn(modalTriggerVariants({ appearance }), className),
|
|
198
187
|
onClick: (event) => {
|
|
199
188
|
onClick?.(event);
|
|
200
189
|
if (!event.defaultPrevented) {
|
|
@@ -222,45 +211,11 @@ function ModalContent({
|
|
|
222
211
|
const reduceMotion = framerMotion.useReducedMotion();
|
|
223
212
|
const overlayMotion = modalOverlayAnimationPresets[reduceMotion ? "fade" : animation];
|
|
224
213
|
const panelMotion = modalOverlayAnimationPresets[reduceMotion ? "fade" : animation];
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
const handleKeyDown = (event) => {
|
|
231
|
-
if (event.key === "Escape") {
|
|
232
|
-
setOpen(false);
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
window.addEventListener("keydown", handleKeyDown);
|
|
236
|
-
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
237
|
-
}, [open, setOpen]);
|
|
238
|
-
react.useEffect(() => {
|
|
239
|
-
if (!open) {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
const node = contentRef.current;
|
|
243
|
-
if (!node) {
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
const focusables = Array.from(
|
|
247
|
-
node.querySelectorAll(FOCUSABLE_SELECTOR)
|
|
248
|
-
).filter((element) => element.offsetParent !== null || element === node);
|
|
249
|
-
const target = focusables[0] ?? node;
|
|
250
|
-
const previouslyFocused = document.activeElement;
|
|
251
|
-
target.focus();
|
|
252
|
-
const handleFocusIn = (event) => {
|
|
253
|
-
if (!node.contains(event.target)) {
|
|
254
|
-
event.stopPropagation();
|
|
255
|
-
target.focus();
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
document.addEventListener("focusin", handleFocusIn);
|
|
259
|
-
return () => {
|
|
260
|
-
document.removeEventListener("focusin", handleFocusIn);
|
|
261
|
-
previouslyFocused?.focus?.();
|
|
262
|
-
};
|
|
263
|
-
}, [contentRef, open]);
|
|
214
|
+
chunkYPLVTUYL_js.useFocusManagement({
|
|
215
|
+
open,
|
|
216
|
+
setOpen,
|
|
217
|
+
contentRef
|
|
218
|
+
});
|
|
264
219
|
const portalTarget = typeof document !== "undefined" ? document.body : null;
|
|
265
220
|
if (!portalTarget) {
|
|
266
221
|
return null;
|
|
@@ -299,7 +254,7 @@ function ModalContent({
|
|
|
299
254
|
"aria-describedby": descriptionId,
|
|
300
255
|
"data-slot": "modal-content",
|
|
301
256
|
tabIndex: -1,
|
|
302
|
-
className:
|
|
257
|
+
className: chunkUOZYPWDZ_js.cn(
|
|
303
258
|
modalContentVariants({ size, position, appearance }),
|
|
304
259
|
className
|
|
305
260
|
),
|
|
@@ -322,7 +277,7 @@ function ModalHeader({ className, children }) {
|
|
|
322
277
|
"header",
|
|
323
278
|
{
|
|
324
279
|
"data-slot": "modal-header",
|
|
325
|
-
className:
|
|
280
|
+
className: chunkUOZYPWDZ_js.cn("mb-4 flex flex-col gap-2", className),
|
|
326
281
|
children
|
|
327
282
|
}
|
|
328
283
|
);
|
|
@@ -333,7 +288,7 @@ function ModalBody({ className, children }) {
|
|
|
333
288
|
"div",
|
|
334
289
|
{
|
|
335
290
|
"data-slot": "modal-body",
|
|
336
|
-
className:
|
|
291
|
+
className: chunkUOZYPWDZ_js.cn("text-sm text-slate-300", className),
|
|
337
292
|
children
|
|
338
293
|
}
|
|
339
294
|
);
|
|
@@ -344,7 +299,7 @@ function ModalFooter({ className, children }) {
|
|
|
344
299
|
"footer",
|
|
345
300
|
{
|
|
346
301
|
"data-slot": "modal-footer",
|
|
347
|
-
className:
|
|
302
|
+
className: chunkUOZYPWDZ_js.cn("mt-6 flex justify-end gap-2", className),
|
|
348
303
|
children
|
|
349
304
|
}
|
|
350
305
|
);
|
|
@@ -357,7 +312,7 @@ function ModalTitle({ className, children }) {
|
|
|
357
312
|
{
|
|
358
313
|
id: titleId,
|
|
359
314
|
"data-slot": "modal-title",
|
|
360
|
-
className:
|
|
315
|
+
className: chunkUOZYPWDZ_js.cn("text-lg font-semibold", className),
|
|
361
316
|
children
|
|
362
317
|
}
|
|
363
318
|
);
|
|
@@ -370,7 +325,7 @@ function ModalDescription({ className, children }) {
|
|
|
370
325
|
{
|
|
371
326
|
id: descriptionId,
|
|
372
327
|
"data-slot": "modal-description",
|
|
373
|
-
className:
|
|
328
|
+
className: chunkUOZYPWDZ_js.cn("text-sm text-slate-400", className),
|
|
374
329
|
children
|
|
375
330
|
}
|
|
376
331
|
);
|
|
@@ -387,7 +342,7 @@ function ModalClose({
|
|
|
387
342
|
{
|
|
388
343
|
type: "button",
|
|
389
344
|
"data-slot": "modal-close",
|
|
390
|
-
className:
|
|
345
|
+
className: chunkUOZYPWDZ_js.cn(
|
|
391
346
|
"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30",
|
|
392
347
|
className
|
|
393
348
|
),
|
package/dist/ui/modal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/modal/animations.ts","../../src/ui/modal/variants.ts","../../src/ui/modal/modal.tsx"],"names":["cva","createContext","useContext","useEffect","useState","useCallback","useId","useRef","useMemo","jsx","cn","useReducedMotion","createPortal","AnimatePresence","jsxs","motion"],"mappings":"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","file":"modal.js","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { ModalAnimation } from \"./types\";\n\ntype ModalPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"exit\" | \"transition\"\n>;\n\nexport type ModalAnimationPresets = Record<\n ModalAnimation,\n ModalPresetMotionProps\n>;\n\nexport const modalOverlayAnimationPresets: ModalAnimationPresets = {\n none: {},\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.2 },\n },\n scale: {\n initial: { opacity: 0, scale: 0.96 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 420, damping: 32 },\n },\n \"slide-up\": {\n initial: { opacity: 0, y: 24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n \"slide-down\": {\n initial: { opacity: 0, y: -24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const modalOverlayVariants = cva(\n \"fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm data-[state=open]:animate-in\",\n);\n\nexport const modalTriggerVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer rounded-md border\",\n {\n variants: {\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n },\n },\n);\n\nexport const modalContentVariants = cva(\n \"fixed left-1/2 z-50 w-[calc(100%-2rem)] max-h-[min(90vh,720px)] translate-x-[-50%] overflow-y-auto border border-white/10 bg-slate-950 p-6 text-slate-50 shadow-[0_24px_80px_rgba(15,23,42,0.55)] focus:outline-none\",\n {\n variants: {\n size: {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100%-2rem)]\",\n },\n position: {\n center: \"top-1/2 translate-y-[-50%]\",\n top: \"top-10 translate-y-0\",\n bottom: \"bottom-10 translate-y-0\",\n },\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n size: \"md\",\n position: \"center\",\n appearance: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { modalOverlayAnimationPresets } from \"./animations\";\nimport type {\n ModalContentProps,\n ModalProps,\n ModalSectionProps,\n ModalTriggerProps,\n} from \"./types\";\nimport {\n modalContentVariants,\n modalOverlayVariants,\n modalTriggerVariants,\n} from \"./variants\";\n\ntype ModalCtx = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst ModalContext = createContext<ModalCtx | null>(null);\n\nfunction useModalContext(component: string): ModalCtx {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Modal>`);\n }\n return ctx;\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])';\n\nfunction useBodyScrollLock(locked: boolean) {\n useEffect(() => {\n if (!locked) {\n return;\n }\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [locked]);\n}\n\nexport function Modal({\n open,\n defaultOpen = false,\n onOpenChange,\n children,\n}: ModalProps) {\n const isControlled = open !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const resolvedOpen = isControlled ? Boolean(open) : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n const ctx = useMemo(\n () => ({\n open: resolvedOpen,\n setOpen,\n titleId,\n descriptionId,\n contentRef,\n }),\n [descriptionId, resolvedOpen, setOpen, titleId],\n );\n\n return <ModalContext.Provider value={ctx}>{children}</ModalContext.Provider>;\n}\n\nModal.displayName = \"Modal\";\n\nexport function ModalTrigger({\n className,\n children,\n appearance,\n onClick,\n ref,\n ...rest\n}: ModalTriggerProps) {\n const { setOpen } = useModalContext(\"ModalTrigger\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"modal-trigger\"\n className={cn(modalTriggerVariants({ appearance }), className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n setOpen(true);\n }\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nModalTrigger.displayName = \"ModalTrigger\";\n\nexport function ModalContent({\n className,\n size,\n position,\n appearance,\n animation = \"scale\",\n children,\n ref,\n id,\n style,\n}: ModalContentProps) {\n const { open, setOpen, titleId, descriptionId, contentRef } =\n useModalContext(\"ModalContent\");\n const reduceMotion = useReducedMotion();\n const overlayMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n const panelMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n\n useBodyScrollLock(open);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, setOpen]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const node = contentRef.current;\n if (!node) {\n return;\n }\n const focusables = Array.from(\n node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => element.offsetParent !== null || element === node);\n const target = focusables[0] ?? node;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n target.focus();\n\n const handleFocusIn = (event: FocusEvent) => {\n if (!node.contains(event.target as Node)) {\n event.stopPropagation();\n target.focus();\n }\n };\n document.addEventListener(\"focusin\", handleFocusIn);\n return () => {\n document.removeEventListener(\"focusin\", handleFocusIn);\n previouslyFocused?.focus?.();\n };\n }, [contentRef, open]);\n\n const portalTarget = typeof document !== \"undefined\" ? document.body : null;\n\n if (!portalTarget) {\n return null;\n }\n\n return createPortal(\n <AnimatePresence>\n {open ? (\n <div className=\"fixed inset-0 z-50\" data-slot=\"modal-portal\">\n <motion.button\n type=\"button\"\n aria-hidden\n tabIndex={-1}\n data-slot=\"modal-overlay\"\n className={modalOverlayVariants()}\n onClick={() => setOpen(false)}\n initial={animation === \"none\" ? false : overlayMotion.initial}\n animate={animation === \"none\" ? undefined : overlayMotion.animate}\n exit={animation === \"none\" ? undefined : overlayMotion.exit}\n transition={overlayMotion.transition}\n />\n <motion.div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.RefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n data-slot=\"modal-content\"\n tabIndex={-1}\n className={cn(\n modalContentVariants({ size, position, appearance }),\n className,\n )}\n initial={animation === \"none\" ? false : panelMotion.initial}\n animate={animation === \"none\" ? undefined : panelMotion.animate}\n exit={animation === \"none\" ? undefined : panelMotion.exit}\n transition={panelMotion.transition}\n id={id}\n style={style}\n >\n {children}\n </motion.div>\n </div>\n ) : null}\n </AnimatePresence>,\n portalTarget,\n );\n}\n\nModalContent.displayName = \"ModalContent\";\n\nexport function ModalHeader({ className, children }: ModalSectionProps) {\n return (\n <header\n data-slot=\"modal-header\"\n className={cn(\"mb-4 flex flex-col gap-2\", className)}\n >\n {children}\n </header>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n\nexport function ModalBody({ className, children }: ModalSectionProps) {\n return (\n <div\n data-slot=\"modal-body\"\n className={cn(\"text-sm text-slate-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n\nexport function ModalFooter({ className, children }: ModalSectionProps) {\n return (\n <footer\n data-slot=\"modal-footer\"\n className={cn(\"mt-6 flex justify-end gap-2\", className)}\n >\n {children}\n </footer>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n\nexport function ModalTitle({ className, children }: ModalSectionProps) {\n const { titleId } = useModalContext(\"ModalTitle\");\n return (\n <h2\n id={titleId}\n data-slot=\"modal-title\"\n className={cn(\"text-lg font-semibold\", className)}\n >\n {children}\n </h2>\n );\n}\n\nModalTitle.displayName = \"ModalTitle\";\n\nexport function ModalDescription({ className, children }: ModalSectionProps) {\n const { descriptionId } = useModalContext(\"ModalDescription\");\n return (\n <p\n id={descriptionId}\n data-slot=\"modal-description\"\n className={cn(\"text-sm text-slate-400\", className)}\n >\n {children}\n </p>\n );\n}\n\nModalDescription.displayName = \"ModalDescription\";\n\nexport function ModalClose({\n className,\n children,\n ...rest\n}: ModalSectionProps) {\n const { setOpen } = useModalContext(\"ModalClose\");\n return (\n <button\n type=\"button\"\n data-slot=\"modal-close\"\n className={cn(\n \"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n {...rest}\n >\n {children ?? \"×\"}\n </button>\n );\n}\n\nModalClose.displayName = \"ModalClose\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/modal/animations.ts","../../src/ui/modal/variants.ts","../../src/ui/modal/modal.tsx"],"names":["cva","createContext","useContext","useState","useCallback","useId","useRef","useMemo","jsx","cn","useReducedMotion","useFocusManagement","createPortal","AnimatePresence","jsxs","motion"],"mappings":"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","file":"modal.js","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { ModalAnimation } from \"./types\";\n\ntype ModalPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"exit\" | \"transition\"\n>;\n\nexport type ModalAnimationPresets = Record<\n ModalAnimation,\n ModalPresetMotionProps\n>;\n\nexport const modalOverlayAnimationPresets: ModalAnimationPresets = {\n none: {},\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.2 },\n },\n scale: {\n initial: { opacity: 0, scale: 0.96 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 420, damping: 32 },\n },\n \"slide-up\": {\n initial: { opacity: 0, y: 24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n \"slide-down\": {\n initial: { opacity: 0, y: -24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const modalOverlayVariants = cva(\n \"fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm data-[state=open]:animate-in\",\n);\n\nexport const modalTriggerVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer rounded-md border\",\n {\n variants: {\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n },\n },\n);\n\nexport const modalContentVariants = cva(\n \"fixed left-1/2 z-50 w-[calc(100%-2rem)] max-h-[min(90vh,720px)] translate-x-[-50%] overflow-y-auto border border-white/10 bg-slate-950 p-6 text-slate-50 shadow-[0_24px_80px_rgba(15,23,42,0.55)] focus:outline-none\",\n {\n variants: {\n size: {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100%-2rem)]\",\n },\n position: {\n center: \"top-1/2 translate-y-[-50%]\",\n top: \"top-10 translate-y-0\",\n bottom: \"bottom-10 translate-y-0\",\n },\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n size: \"md\",\n position: \"center\",\n appearance: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { modalOverlayAnimationPresets } from \"./animations\";\nimport type {\n ModalContentProps,\n ModalProps,\n ModalSectionProps,\n ModalTriggerProps,\n} from \"./types\";\nimport {\n modalContentVariants,\n modalOverlayVariants,\n modalTriggerVariants,\n} from \"./variants\";\nimport { useFocusManagement } from \"../../hooks/useFocusManagement\";\n\ntype ModalCtx = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst ModalContext = createContext<ModalCtx | null>(null);\n\nfunction useModalContext(component: string): ModalCtx {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Modal>`);\n }\n return ctx;\n}\n\nexport function Modal({\n open,\n defaultOpen = false,\n onOpenChange,\n children,\n}: ModalProps) {\n const isControlled = open !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const resolvedOpen = isControlled ? Boolean(open) : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n const ctx = useMemo(\n () => ({\n open: resolvedOpen,\n setOpen,\n titleId,\n descriptionId,\n contentRef,\n }),\n [descriptionId, resolvedOpen, setOpen, titleId],\n );\n\n return <ModalContext.Provider value={ctx}>{children}</ModalContext.Provider>;\n}\n\nModal.displayName = \"Modal\";\n\nexport function ModalTrigger({\n className,\n children,\n appearance,\n onClick,\n ref,\n ...rest\n}: ModalTriggerProps) {\n const { setOpen } = useModalContext(\"ModalTrigger\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"modal-trigger\"\n className={cn(modalTriggerVariants({ appearance }), className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n setOpen(true);\n }\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nModalTrigger.displayName = \"ModalTrigger\";\n\nexport function ModalContent({\n className,\n size,\n position,\n appearance,\n animation = \"scale\",\n children,\n ref,\n id,\n style,\n}: ModalContentProps) {\n const { open, setOpen, titleId, descriptionId, contentRef } =\n useModalContext(\"ModalContent\");\n const reduceMotion = useReducedMotion();\n const overlayMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n const panelMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n\n useFocusManagement({\n open,\n setOpen,\n contentRef,\n });\n\n const portalTarget = typeof document !== \"undefined\" ? document.body : null;\n\n if (!portalTarget) {\n return null;\n }\n\n return createPortal(\n <AnimatePresence>\n {open ? (\n <div className=\"fixed inset-0 z-50\" data-slot=\"modal-portal\">\n <motion.button\n type=\"button\"\n aria-hidden\n tabIndex={-1}\n data-slot=\"modal-overlay\"\n className={modalOverlayVariants()}\n onClick={() => setOpen(false)}\n initial={animation === \"none\" ? false : overlayMotion.initial}\n animate={animation === \"none\" ? undefined : overlayMotion.animate}\n exit={animation === \"none\" ? undefined : overlayMotion.exit}\n transition={overlayMotion.transition}\n />\n <motion.div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.RefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n data-slot=\"modal-content\"\n tabIndex={-1}\n className={cn(\n modalContentVariants({ size, position, appearance }),\n className,\n )}\n initial={animation === \"none\" ? false : panelMotion.initial}\n animate={animation === \"none\" ? undefined : panelMotion.animate}\n exit={animation === \"none\" ? undefined : panelMotion.exit}\n transition={panelMotion.transition}\n id={id}\n style={style}\n >\n {children}\n </motion.div>\n </div>\n ) : null}\n </AnimatePresence>,\n portalTarget,\n );\n}\n\nModalContent.displayName = \"ModalContent\";\n\nexport function ModalHeader({ className, children }: ModalSectionProps) {\n return (\n <header\n data-slot=\"modal-header\"\n className={cn(\"mb-4 flex flex-col gap-2\", className)}\n >\n {children}\n </header>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n\nexport function ModalBody({ className, children }: ModalSectionProps) {\n return (\n <div\n data-slot=\"modal-body\"\n className={cn(\"text-sm text-slate-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n\nexport function ModalFooter({ className, children }: ModalSectionProps) {\n return (\n <footer\n data-slot=\"modal-footer\"\n className={cn(\"mt-6 flex justify-end gap-2\", className)}\n >\n {children}\n </footer>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n\nexport function ModalTitle({ className, children }: ModalSectionProps) {\n const { titleId } = useModalContext(\"ModalTitle\");\n return (\n <h2\n id={titleId}\n data-slot=\"modal-title\"\n className={cn(\"text-lg font-semibold\", className)}\n >\n {children}\n </h2>\n );\n}\n\nModalTitle.displayName = \"ModalTitle\";\n\nexport function ModalDescription({ className, children }: ModalSectionProps) {\n const { descriptionId } = useModalContext(\"ModalDescription\");\n return (\n <p\n id={descriptionId}\n data-slot=\"modal-description\"\n className={cn(\"text-sm text-slate-400\", className)}\n >\n {children}\n </p>\n );\n}\n\nModalDescription.displayName = \"ModalDescription\";\n\nexport function ModalClose({\n className,\n children,\n ...rest\n}: ModalSectionProps) {\n const { setOpen } = useModalContext(\"ModalClose\");\n return (\n <button\n type=\"button\"\n data-slot=\"modal-close\"\n className={cn(\n \"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n {...rest}\n >\n {children ?? \"×\"}\n </button>\n );\n}\n\nModalClose.displayName = \"ModalClose\";\n"]}
|
package/dist/ui/modal.mjs
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import { useFocusManagement } from '../chunk-WL5I7RVS.mjs';
|
|
3
|
+
import '../chunk-PMAF6FBF.mjs';
|
|
4
|
+
import { cn } from '../chunk-DFEZH7TC.mjs';
|
|
3
5
|
import { useReducedMotion, AnimatePresence, motion } from 'framer-motion';
|
|
4
|
-
import { createContext, useState, useCallback, useId, useRef, useMemo,
|
|
6
|
+
import { createContext, useState, useCallback, useId, useRef, useMemo, useContext } from 'react';
|
|
5
7
|
import { createPortal } from 'react-dom';
|
|
6
8
|
import { cva } from 'class-variance-authority';
|
|
7
9
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
@@ -129,19 +131,6 @@ function useModalContext(component) {
|
|
|
129
131
|
}
|
|
130
132
|
return ctx;
|
|
131
133
|
}
|
|
132
|
-
var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex="-1"])';
|
|
133
|
-
function useBodyScrollLock(locked) {
|
|
134
|
-
useEffect(() => {
|
|
135
|
-
if (!locked) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const previousOverflow = document.body.style.overflow;
|
|
139
|
-
document.body.style.overflow = "hidden";
|
|
140
|
-
return () => {
|
|
141
|
-
document.body.style.overflow = previousOverflow;
|
|
142
|
-
};
|
|
143
|
-
}, [locked]);
|
|
144
|
-
}
|
|
145
134
|
function Modal({
|
|
146
135
|
open,
|
|
147
136
|
defaultOpen = false,
|
|
@@ -220,45 +209,11 @@ function ModalContent({
|
|
|
220
209
|
const reduceMotion = useReducedMotion();
|
|
221
210
|
const overlayMotion = modalOverlayAnimationPresets[reduceMotion ? "fade" : animation];
|
|
222
211
|
const panelMotion = modalOverlayAnimationPresets[reduceMotion ? "fade" : animation];
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const handleKeyDown = (event) => {
|
|
229
|
-
if (event.key === "Escape") {
|
|
230
|
-
setOpen(false);
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
window.addEventListener("keydown", handleKeyDown);
|
|
234
|
-
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
235
|
-
}, [open, setOpen]);
|
|
236
|
-
useEffect(() => {
|
|
237
|
-
if (!open) {
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
const node = contentRef.current;
|
|
241
|
-
if (!node) {
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
const focusables = Array.from(
|
|
245
|
-
node.querySelectorAll(FOCUSABLE_SELECTOR)
|
|
246
|
-
).filter((element) => element.offsetParent !== null || element === node);
|
|
247
|
-
const target = focusables[0] ?? node;
|
|
248
|
-
const previouslyFocused = document.activeElement;
|
|
249
|
-
target.focus();
|
|
250
|
-
const handleFocusIn = (event) => {
|
|
251
|
-
if (!node.contains(event.target)) {
|
|
252
|
-
event.stopPropagation();
|
|
253
|
-
target.focus();
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
document.addEventListener("focusin", handleFocusIn);
|
|
257
|
-
return () => {
|
|
258
|
-
document.removeEventListener("focusin", handleFocusIn);
|
|
259
|
-
previouslyFocused?.focus?.();
|
|
260
|
-
};
|
|
261
|
-
}, [contentRef, open]);
|
|
212
|
+
useFocusManagement({
|
|
213
|
+
open,
|
|
214
|
+
setOpen,
|
|
215
|
+
contentRef
|
|
216
|
+
});
|
|
262
217
|
const portalTarget = typeof document !== "undefined" ? document.body : null;
|
|
263
218
|
if (!portalTarget) {
|
|
264
219
|
return null;
|
package/dist/ui/modal.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/modal/animations.ts","../../src/ui/modal/variants.ts","../../src/ui/modal/modal.tsx"],"names":[],"mappings":"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","file":"modal.mjs","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { ModalAnimation } from \"./types\";\n\ntype ModalPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"exit\" | \"transition\"\n>;\n\nexport type ModalAnimationPresets = Record<\n ModalAnimation,\n ModalPresetMotionProps\n>;\n\nexport const modalOverlayAnimationPresets: ModalAnimationPresets = {\n none: {},\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.2 },\n },\n scale: {\n initial: { opacity: 0, scale: 0.96 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 420, damping: 32 },\n },\n \"slide-up\": {\n initial: { opacity: 0, y: 24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n \"slide-down\": {\n initial: { opacity: 0, y: -24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const modalOverlayVariants = cva(\n \"fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm data-[state=open]:animate-in\",\n);\n\nexport const modalTriggerVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer rounded-md border\",\n {\n variants: {\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n },\n },\n);\n\nexport const modalContentVariants = cva(\n \"fixed left-1/2 z-50 w-[calc(100%-2rem)] max-h-[min(90vh,720px)] translate-x-[-50%] overflow-y-auto border border-white/10 bg-slate-950 p-6 text-slate-50 shadow-[0_24px_80px_rgba(15,23,42,0.55)] focus:outline-none\",\n {\n variants: {\n size: {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100%-2rem)]\",\n },\n position: {\n center: \"top-1/2 translate-y-[-50%]\",\n top: \"top-10 translate-y-0\",\n bottom: \"bottom-10 translate-y-0\",\n },\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n size: \"md\",\n position: \"center\",\n appearance: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { modalOverlayAnimationPresets } from \"./animations\";\nimport type {\n ModalContentProps,\n ModalProps,\n ModalSectionProps,\n ModalTriggerProps,\n} from \"./types\";\nimport {\n modalContentVariants,\n modalOverlayVariants,\n modalTriggerVariants,\n} from \"./variants\";\n\ntype ModalCtx = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst ModalContext = createContext<ModalCtx | null>(null);\n\nfunction useModalContext(component: string): ModalCtx {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Modal>`);\n }\n return ctx;\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])';\n\nfunction useBodyScrollLock(locked: boolean) {\n useEffect(() => {\n if (!locked) {\n return;\n }\n const previousOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previousOverflow;\n };\n }, [locked]);\n}\n\nexport function Modal({\n open,\n defaultOpen = false,\n onOpenChange,\n children,\n}: ModalProps) {\n const isControlled = open !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const resolvedOpen = isControlled ? Boolean(open) : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n const ctx = useMemo(\n () => ({\n open: resolvedOpen,\n setOpen,\n titleId,\n descriptionId,\n contentRef,\n }),\n [descriptionId, resolvedOpen, setOpen, titleId],\n );\n\n return <ModalContext.Provider value={ctx}>{children}</ModalContext.Provider>;\n}\n\nModal.displayName = \"Modal\";\n\nexport function ModalTrigger({\n className,\n children,\n appearance,\n onClick,\n ref,\n ...rest\n}: ModalTriggerProps) {\n const { setOpen } = useModalContext(\"ModalTrigger\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"modal-trigger\"\n className={cn(modalTriggerVariants({ appearance }), className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n setOpen(true);\n }\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nModalTrigger.displayName = \"ModalTrigger\";\n\nexport function ModalContent({\n className,\n size,\n position,\n appearance,\n animation = \"scale\",\n children,\n ref,\n id,\n style,\n}: ModalContentProps) {\n const { open, setOpen, titleId, descriptionId, contentRef } =\n useModalContext(\"ModalContent\");\n const reduceMotion = useReducedMotion();\n const overlayMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n const panelMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n\n useBodyScrollLock(open);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, setOpen]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const node = contentRef.current;\n if (!node) {\n return;\n }\n const focusables = Array.from(\n node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => element.offsetParent !== null || element === node);\n const target = focusables[0] ?? node;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n target.focus();\n\n const handleFocusIn = (event: FocusEvent) => {\n if (!node.contains(event.target as Node)) {\n event.stopPropagation();\n target.focus();\n }\n };\n document.addEventListener(\"focusin\", handleFocusIn);\n return () => {\n document.removeEventListener(\"focusin\", handleFocusIn);\n previouslyFocused?.focus?.();\n };\n }, [contentRef, open]);\n\n const portalTarget = typeof document !== \"undefined\" ? document.body : null;\n\n if (!portalTarget) {\n return null;\n }\n\n return createPortal(\n <AnimatePresence>\n {open ? (\n <div className=\"fixed inset-0 z-50\" data-slot=\"modal-portal\">\n <motion.button\n type=\"button\"\n aria-hidden\n tabIndex={-1}\n data-slot=\"modal-overlay\"\n className={modalOverlayVariants()}\n onClick={() => setOpen(false)}\n initial={animation === \"none\" ? false : overlayMotion.initial}\n animate={animation === \"none\" ? undefined : overlayMotion.animate}\n exit={animation === \"none\" ? undefined : overlayMotion.exit}\n transition={overlayMotion.transition}\n />\n <motion.div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.RefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n data-slot=\"modal-content\"\n tabIndex={-1}\n className={cn(\n modalContentVariants({ size, position, appearance }),\n className,\n )}\n initial={animation === \"none\" ? false : panelMotion.initial}\n animate={animation === \"none\" ? undefined : panelMotion.animate}\n exit={animation === \"none\" ? undefined : panelMotion.exit}\n transition={panelMotion.transition}\n id={id}\n style={style}\n >\n {children}\n </motion.div>\n </div>\n ) : null}\n </AnimatePresence>,\n portalTarget,\n );\n}\n\nModalContent.displayName = \"ModalContent\";\n\nexport function ModalHeader({ className, children }: ModalSectionProps) {\n return (\n <header\n data-slot=\"modal-header\"\n className={cn(\"mb-4 flex flex-col gap-2\", className)}\n >\n {children}\n </header>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n\nexport function ModalBody({ className, children }: ModalSectionProps) {\n return (\n <div\n data-slot=\"modal-body\"\n className={cn(\"text-sm text-slate-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n\nexport function ModalFooter({ className, children }: ModalSectionProps) {\n return (\n <footer\n data-slot=\"modal-footer\"\n className={cn(\"mt-6 flex justify-end gap-2\", className)}\n >\n {children}\n </footer>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n\nexport function ModalTitle({ className, children }: ModalSectionProps) {\n const { titleId } = useModalContext(\"ModalTitle\");\n return (\n <h2\n id={titleId}\n data-slot=\"modal-title\"\n className={cn(\"text-lg font-semibold\", className)}\n >\n {children}\n </h2>\n );\n}\n\nModalTitle.displayName = \"ModalTitle\";\n\nexport function ModalDescription({ className, children }: ModalSectionProps) {\n const { descriptionId } = useModalContext(\"ModalDescription\");\n return (\n <p\n id={descriptionId}\n data-slot=\"modal-description\"\n className={cn(\"text-sm text-slate-400\", className)}\n >\n {children}\n </p>\n );\n}\n\nModalDescription.displayName = \"ModalDescription\";\n\nexport function ModalClose({\n className,\n children,\n ...rest\n}: ModalSectionProps) {\n const { setOpen } = useModalContext(\"ModalClose\");\n return (\n <button\n type=\"button\"\n data-slot=\"modal-close\"\n className={cn(\n \"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n {...rest}\n >\n {children ?? \"×\"}\n </button>\n );\n}\n\nModalClose.displayName = \"ModalClose\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/modal/animations.ts","../../src/ui/modal/variants.ts","../../src/ui/modal/modal.tsx"],"names":[],"mappings":"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","file":"modal.mjs","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nimport type { ModalAnimation } from \"./types\";\n\ntype ModalPresetMotionProps = Pick<\n HTMLMotionProps<\"div\">,\n \"initial\" | \"animate\" | \"exit\" | \"transition\"\n>;\n\nexport type ModalAnimationPresets = Record<\n ModalAnimation,\n ModalPresetMotionProps\n>;\n\nexport const modalOverlayAnimationPresets: ModalAnimationPresets = {\n none: {},\n fade: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n exit: { opacity: 0 },\n transition: { duration: 0.2 },\n },\n scale: {\n initial: { opacity: 0, scale: 0.96 },\n animate: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.96 },\n transition: { type: \"spring\", stiffness: 420, damping: 32 },\n },\n \"slide-up\": {\n initial: { opacity: 0, y: 24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n \"slide-down\": {\n initial: { opacity: 0, y: -24 },\n animate: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -16 },\n transition: { type: \"spring\", stiffness: 380, damping: 30 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const modalOverlayVariants = cva(\n \"fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm data-[state=open]:animate-in\",\n);\n\nexport const modalTriggerVariants = cva(\n \"relative inline-flex shrink-0 cursor-pointer rounded-md border\",\n {\n variants: {\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n appearance: \"default\",\n },\n },\n);\n\nexport const modalContentVariants = cva(\n \"fixed left-1/2 z-50 w-[calc(100%-2rem)] max-h-[min(90vh,720px)] translate-x-[-50%] overflow-y-auto border border-white/10 bg-slate-950 p-6 text-slate-50 shadow-[0_24px_80px_rgba(15,23,42,0.55)] focus:outline-none\",\n {\n variants: {\n size: {\n sm: \"max-w-md\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n full: \"max-w-[calc(100%-2rem)]\",\n },\n position: {\n center: \"top-1/2 translate-y-[-50%]\",\n top: \"top-10 translate-y-0\",\n bottom: \"bottom-10 translate-y-0\",\n },\n appearance: {\n default: \"bg-slate-950\",\n glass: \"border-white/15 bg-slate-950/70 backdrop-blur-xl\",\n sky: \"border-sky-600 bg-sky-950/70 backdrop-blur-xl\",\n rose: \"border-rose-600 bg-rose-950/70 backdrop-blur-xl\",\n purple: \"border-purple-600 bg-purple-950/70 backdrop-blur-xl\",\n pink: \"border-pink-600 bg-pink-950/70 backdrop-blur-xl\",\n orange: \"border-orange-600 bg-orange-950/70 backdrop-blur-xl\",\n yellow: \"border-yellow-600 bg-yellow-950/70 backdrop-blur-xl\",\n teal: \"border-teal-600 bg-teal-950/70 backdrop-blur-xl\",\n indigo: \"border-indigo-600 bg-indigo-950/70 backdrop-blur-xl\",\n emerald: \"border-emerald-600 bg-emerald-950/70 backdrop-blur-xl\",\n gray: \"border-gray-600 bg-gray-950/70 backdrop-blur-xl\",\n amber: \"border-amber-600 bg-amber-950/70 backdrop-blur-xl\",\n violet: \"border-violet-600 bg-violet-950/70 backdrop-blur-xl\",\n \"gradient-blue\":\n \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-green\":\n \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl\",\n \"gradient-red\":\n \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-yellow\":\n \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl\",\n \"gradient-purple\":\n \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl\",\n \"gradient-teal\":\n \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl\",\n \"gradient-indigo\":\n \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl\",\n \"gradient-pink\":\n \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl\",\n \"gradient-orange\":\n \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl\",\n },\n },\n defaultVariants: {\n size: \"md\",\n position: \"center\",\n appearance: \"default\",\n },\n },\n);\n","\"use client\";\n\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { modalOverlayAnimationPresets } from \"./animations\";\nimport type {\n ModalContentProps,\n ModalProps,\n ModalSectionProps,\n ModalTriggerProps,\n} from \"./types\";\nimport {\n modalContentVariants,\n modalOverlayVariants,\n modalTriggerVariants,\n} from \"./variants\";\nimport { useFocusManagement } from \"../../hooks/useFocusManagement\";\n\ntype ModalCtx = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n contentRef: React.RefObject<HTMLDivElement | null>;\n};\n\nconst ModalContext = createContext<ModalCtx | null>(null);\n\nfunction useModalContext(component: string): ModalCtx {\n const ctx = useContext(ModalContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Modal>`);\n }\n return ctx;\n}\n\nexport function Modal({\n open,\n defaultOpen = false,\n onOpenChange,\n children,\n}: ModalProps) {\n const isControlled = open !== undefined;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const resolvedOpen = isControlled ? Boolean(open) : uncontrolledOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const baseId = useId();\n const titleId = `${baseId}-title`;\n const descriptionId = `${baseId}-description`;\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n const ctx = useMemo(\n () => ({\n open: resolvedOpen,\n setOpen,\n titleId,\n descriptionId,\n contentRef,\n }),\n [descriptionId, resolvedOpen, setOpen, titleId],\n );\n\n return <ModalContext.Provider value={ctx}>{children}</ModalContext.Provider>;\n}\n\nModal.displayName = \"Modal\";\n\nexport function ModalTrigger({\n className,\n children,\n appearance,\n onClick,\n ref,\n ...rest\n}: ModalTriggerProps) {\n const { setOpen } = useModalContext(\"ModalTrigger\");\n return (\n <button\n ref={ref}\n type=\"button\"\n data-slot=\"modal-trigger\"\n className={cn(modalTriggerVariants({ appearance }), className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n setOpen(true);\n }\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nModalTrigger.displayName = \"ModalTrigger\";\n\nexport function ModalContent({\n className,\n size,\n position,\n appearance,\n animation = \"scale\",\n children,\n ref,\n id,\n style,\n}: ModalContentProps) {\n const { open, setOpen, titleId, descriptionId, contentRef } =\n useModalContext(\"ModalContent\");\n const reduceMotion = useReducedMotion();\n const overlayMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n const panelMotion =\n modalOverlayAnimationPresets[reduceMotion ? \"fade\" : animation];\n\n useFocusManagement({\n open,\n setOpen,\n contentRef,\n });\n\n const portalTarget = typeof document !== \"undefined\" ? document.body : null;\n\n if (!portalTarget) {\n return null;\n }\n\n return createPortal(\n <AnimatePresence>\n {open ? (\n <div className=\"fixed inset-0 z-50\" data-slot=\"modal-portal\">\n <motion.button\n type=\"button\"\n aria-hidden\n tabIndex={-1}\n data-slot=\"modal-overlay\"\n className={modalOverlayVariants()}\n onClick={() => setOpen(false)}\n initial={animation === \"none\" ? false : overlayMotion.initial}\n animate={animation === \"none\" ? undefined : overlayMotion.animate}\n exit={animation === \"none\" ? undefined : overlayMotion.exit}\n transition={overlayMotion.transition}\n />\n <motion.div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.RefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n data-slot=\"modal-content\"\n tabIndex={-1}\n className={cn(\n modalContentVariants({ size, position, appearance }),\n className,\n )}\n initial={animation === \"none\" ? false : panelMotion.initial}\n animate={animation === \"none\" ? undefined : panelMotion.animate}\n exit={animation === \"none\" ? undefined : panelMotion.exit}\n transition={panelMotion.transition}\n id={id}\n style={style}\n >\n {children}\n </motion.div>\n </div>\n ) : null}\n </AnimatePresence>,\n portalTarget,\n );\n}\n\nModalContent.displayName = \"ModalContent\";\n\nexport function ModalHeader({ className, children }: ModalSectionProps) {\n return (\n <header\n data-slot=\"modal-header\"\n className={cn(\"mb-4 flex flex-col gap-2\", className)}\n >\n {children}\n </header>\n );\n}\n\nModalHeader.displayName = \"ModalHeader\";\n\nexport function ModalBody({ className, children }: ModalSectionProps) {\n return (\n <div\n data-slot=\"modal-body\"\n className={cn(\"text-sm text-slate-300\", className)}\n >\n {children}\n </div>\n );\n}\n\nModalBody.displayName = \"ModalBody\";\n\nexport function ModalFooter({ className, children }: ModalSectionProps) {\n return (\n <footer\n data-slot=\"modal-footer\"\n className={cn(\"mt-6 flex justify-end gap-2\", className)}\n >\n {children}\n </footer>\n );\n}\n\nModalFooter.displayName = \"ModalFooter\";\n\nexport function ModalTitle({ className, children }: ModalSectionProps) {\n const { titleId } = useModalContext(\"ModalTitle\");\n return (\n <h2\n id={titleId}\n data-slot=\"modal-title\"\n className={cn(\"text-lg font-semibold\", className)}\n >\n {children}\n </h2>\n );\n}\n\nModalTitle.displayName = \"ModalTitle\";\n\nexport function ModalDescription({ className, children }: ModalSectionProps) {\n const { descriptionId } = useModalContext(\"ModalDescription\");\n return (\n <p\n id={descriptionId}\n data-slot=\"modal-description\"\n className={cn(\"text-sm text-slate-400\", className)}\n >\n {children}\n </p>\n );\n}\n\nModalDescription.displayName = \"ModalDescription\";\n\nexport function ModalClose({\n className,\n children,\n ...rest\n}: ModalSectionProps) {\n const { setOpen } = useModalContext(\"ModalClose\");\n return (\n <button\n type=\"button\"\n data-slot=\"modal-close\"\n className={cn(\n \"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-md text-slate-200 transition hover:bg-white/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/30\",\n className,\n )}\n aria-label=\"Close dialog\"\n onClick={() => setOpen(false)}\n {...rest}\n >\n {children ?? \"×\"}\n </button>\n );\n}\n\nModalClose.displayName = \"ModalClose\";\n"]}
|
package/dist/ui/pagination.d.mts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as class_variance_authority from 'class-variance-authority';
|
|
2
|
-
import { VariantProps } from 'class-variance-authority';
|
|
3
2
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
4
3
|
import * as react from 'react';
|
|
5
|
-
|
|
6
|
-
import
|
|
4
|
+
export { P as PaginationAppearance, a as PaginationPageItem, b as PaginationProps, c as PaginationSize, U as UsePaginationParams, d as UsePaginationResult, u as usePagination } from '../index-D4p9fn1o.mjs';
|
|
5
|
+
import '../variants-Dd9pe-ov.mjs';
|
|
7
6
|
|
|
8
7
|
declare const Pagination: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLElement>, HTMLElement>, "ref">, "onChange"> & class_variance_authority.VariantProps<(props?: ({
|
|
9
8
|
appearance?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link" | "glass" | "emerald" | "indigo" | "purple" | "pink" | "rose" | "sky" | "teal" | "yellow" | "orange" | "gray" | "amber" | "violet" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | null | undefined;
|
|
@@ -22,83 +21,6 @@ declare const Pagination: react.ForwardRefExoticComponent<Omit<Omit<react.Detail
|
|
|
22
21
|
getPageHref?: (page: number) => string | undefined;
|
|
23
22
|
} & react.RefAttributes<HTMLElement>>;
|
|
24
23
|
|
|
25
|
-
type PaginationPageItem$1 = {
|
|
26
|
-
type: "page";
|
|
27
|
-
value: number;
|
|
28
|
-
} | {
|
|
29
|
-
type: "ellipsis";
|
|
30
|
-
key: string;
|
|
31
|
-
};
|
|
32
|
-
type BuildPaginationItemsParams = {
|
|
33
|
-
pageCount: number;
|
|
34
|
-
currentPage: number;
|
|
35
|
-
siblingCount: number;
|
|
36
|
-
boundaryCount: number;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Builds the ordered list of page numbers and ellipsis markers for a pagination control.
|
|
40
|
-
*
|
|
41
|
-
* Args:
|
|
42
|
-
* pageCount: Total number of pages (must be >= 0).
|
|
43
|
-
* currentPage: Active page index (1-based).
|
|
44
|
-
* siblingCount: How many page buttons to show on each side of the current page.
|
|
45
|
-
* boundaryCount: How many pages to pin at the start and end of the range.
|
|
46
|
-
*
|
|
47
|
-
* Returns:
|
|
48
|
-
* A list of items suitable for rendering, e.g. [1, ellipsis, 4,5,6, ellipsis, 20].
|
|
49
|
-
*/
|
|
50
|
-
declare function buildPaginationItems({ pageCount, currentPage, siblingCount, boundaryCount, }: BuildPaginationItemsParams): PaginationPageItem$1[];
|
|
51
|
-
declare function clampPage(page: number, pageCount: number): number;
|
|
52
|
-
|
|
53
|
-
type PaginationAppearance = NonNullable<VariantProps<typeof buttonVariants>["appearance"]>;
|
|
54
|
-
type PaginationSize = NonNullable<VariantProps<typeof buttonVariants>["size"]>;
|
|
55
|
-
type PaginationPageItem = PaginationPageItem$1;
|
|
56
|
-
type UsePaginationParams = {
|
|
57
|
-
pageCount: number;
|
|
58
|
-
page?: number;
|
|
59
|
-
defaultPage?: number;
|
|
60
|
-
siblingCount?: number;
|
|
61
|
-
boundaryCount?: number;
|
|
62
|
-
onPageChange?: (page: number) => void;
|
|
63
|
-
};
|
|
64
|
-
type UsePaginationResult = {
|
|
65
|
-
/** 1-based active page, clamped to `[1, pageCount]`. */
|
|
66
|
-
currentPage: number;
|
|
67
|
-
pageCount: number;
|
|
68
|
-
items: PaginationPageItem[];
|
|
69
|
-
setPage: (page: number) => void;
|
|
70
|
-
goPrev: () => void;
|
|
71
|
-
goNext: () => void;
|
|
72
|
-
canGoPrev: boolean;
|
|
73
|
-
canGoNext: boolean;
|
|
74
|
-
};
|
|
75
|
-
type PaginationProps = Omit<ComponentPropsWithoutRef<"nav">, "onChange"> & VariantProps<typeof buttonVariants> & {
|
|
76
|
-
pageCount: number;
|
|
77
|
-
page?: number;
|
|
78
|
-
defaultPage?: number;
|
|
79
|
-
onPageChange?: (page: number) => void;
|
|
80
|
-
/**
|
|
81
|
-
* Number of page buttons to show on each side of the current page (the “middle” window).
|
|
82
|
-
* @defaultValue 1
|
|
83
|
-
*/
|
|
84
|
-
siblingCount?: number;
|
|
85
|
-
/**
|
|
86
|
-
* Number of pages to keep visible at the start and end of the range.
|
|
87
|
-
* @defaultValue 1
|
|
88
|
-
*/
|
|
89
|
-
boundaryCount?: number;
|
|
90
|
-
showPrevNext?: boolean;
|
|
91
|
-
prevLabel?: string;
|
|
92
|
-
nextLabel?: string;
|
|
93
|
-
ellipsisLabel?: string;
|
|
94
|
-
/**
|
|
95
|
-
* When set, page controls render as anchors suitable for URL-based pagination.
|
|
96
|
-
*/
|
|
97
|
-
getPageHref?: (page: number) => string | undefined;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
declare function usePagination({ pageCount, page, defaultPage, siblingCount, boundaryCount, onPageChange, }: UsePaginationParams): UsePaginationResult;
|
|
101
|
-
|
|
102
24
|
/**
|
|
103
25
|
* Layout and chrome for the page list cluster. Appearance and size keys align with
|
|
104
26
|
* `components/ui/buttons/variants.ts` for consistent design-system tokens.
|
|
@@ -111,4 +33,4 @@ declare const paginationEllipsisVariants: (props?: ({
|
|
|
111
33
|
size?: "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | "4xl" | "5xl" | "6xl" | "7xl" | "8xl" | "9xl" | "10xl" | "icon" | null | undefined;
|
|
112
34
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
113
35
|
|
|
114
|
-
export { Pagination,
|
|
36
|
+
export { Pagination, paginationEllipsisVariants, paginationListVariants };
|