@windrun-huaiin/third-ui 29.2.0 → 30.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/fuma/mdx/cheet-table.d.ts +13 -0
- package/dist/fuma/mdx/cheet-table.js +295 -0
- package/dist/fuma/mdx/cheet-table.mjs +293 -0
- package/dist/fuma/mdx/index.d.ts +1 -0
- package/dist/fuma/mdx/index.js +2 -0
- package/dist/fuma/mdx/index.mjs +1 -0
- package/dist/fuma/server/features/widgets.js +2 -0
- package/dist/fuma/server/features/widgets.mjs +2 -0
- package/dist/lib/fuma-schema-check-util.d.ts +1 -1
- package/dist/main/alert-dialog/confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/confirm-dialog.js +3 -3
- package/dist/main/alert-dialog/confirm-dialog.mjs +4 -4
- package/dist/main/alert-dialog/dialog-loading-action.d.ts +2 -1
- package/dist/main/alert-dialog/dialog-loading-action.js +6 -3
- package/dist/main/alert-dialog/dialog-loading-action.mjs +6 -3
- package/dist/main/alert-dialog/dialog-styles.d.ts +4 -2
- package/dist/main/alert-dialog/dialog-styles.js +8 -4
- package/dist/main/alert-dialog/dialog-styles.mjs +7 -5
- package/dist/main/alert-dialog/high-priority-confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/high-priority-confirm-dialog.js +7 -7
- package/dist/main/alert-dialog/high-priority-confirm-dialog.mjs +8 -8
- package/dist/main/alert-dialog/info-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/info-dialog.js +3 -3
- package/dist/main/alert-dialog/info-dialog.mjs +4 -4
- package/dist/main/alert-dialog/undoable-confirm-dialog.d.ts +2 -1
- package/dist/main/alert-dialog/undoable-confirm-dialog.js +4 -4
- package/dist/main/alert-dialog/undoable-confirm-dialog.mjs +5 -5
- package/dist/main/anime/anime-beam-frame.d.ts +3 -0
- package/dist/main/anime/anime-beam-frame.js +63 -0
- package/dist/main/anime/anime-beam-frame.mjs +61 -0
- package/dist/main/anime/anime-spiral-loading.d.ts +10 -0
- package/dist/main/anime/anime-spiral-loading.js +77 -0
- package/dist/main/anime/anime-spiral-loading.mjs +75 -0
- package/dist/main/anime/index.d.ts +2 -0
- package/dist/main/anime/index.js +10 -0
- package/dist/main/anime/index.mjs +3 -0
- package/dist/main/beam-frame/animate.d.ts +3 -0
- package/dist/main/beam-frame/animate.js +63 -0
- package/dist/main/beam-frame/animate.mjs +61 -0
- package/dist/main/beam-frame/beam-frame.d.ts +4 -0
- package/dist/main/beam-frame/beam-frame.js +262 -0
- package/dist/main/beam-frame/beam-frame.mjs +258 -0
- package/dist/main/beam-frame/index.d.ts +4 -0
- package/dist/main/beam-frame/index.js +11 -0
- package/dist/main/beam-frame/index.mjs +3 -0
- package/dist/main/beam-frame/motion.d.ts +3 -0
- package/dist/main/beam-frame/motion.js +61 -0
- package/dist/main/beam-frame/motion.mjs +59 -0
- package/dist/main/beam-frame/share-config.d.ts +54 -0
- package/dist/main/beam-frame/share-config.js +161 -0
- package/dist/main/beam-frame/share-config.mjs +152 -0
- package/dist/main/beam-frame-config.d.ts +54 -0
- package/dist/main/beam-frame-config.js +161 -0
- package/dist/main/beam-frame-config.mjs +152 -0
- package/dist/main/calendar/random-date-range-dialog.d.ts +5 -2
- package/dist/main/calendar/random-date-range-dialog.js +239 -109
- package/dist/main/calendar/random-date-range-dialog.mjs +242 -112
- package/dist/main/cta.js +17 -1
- package/dist/main/cta.mjs +18 -2
- package/dist/main/delayed-img.d.ts +1 -1
- package/dist/main/delayed-img.js +8 -5
- package/dist/main/delayed-img.mjs +8 -5
- package/dist/main/info-tooltip.js +70 -9
- package/dist/main/info-tooltip.mjs +70 -9
- package/dist/main/loading-frame/index.d.ts +1 -0
- package/dist/main/loading.d.ts +2 -1
- package/dist/main/loading.js +64 -26
- package/dist/main/loading.mjs +64 -26
- package/dist/main/motion/index.d.ts +1 -0
- package/dist/main/motion/index.js +9 -0
- package/dist/main/motion/index.mjs +2 -0
- package/dist/main/motion/motion-beam-frame.d.ts +3 -0
- package/dist/main/motion/motion-beam-frame.js +61 -0
- package/dist/main/motion/motion-beam-frame.mjs +59 -0
- package/dist/main/snake-loading-frame.d.ts +7 -3
- package/dist/main/snake-loading-frame.js +44 -252
- package/dist/main/snake-loading-frame.mjs +46 -254
- package/package.json +16 -5
- package/src/fuma/mdx/cheet-table.tsx +650 -0
- package/src/fuma/mdx/index.ts +1 -0
- package/src/fuma/server/features/widgets.tsx +2 -0
- package/src/main/alert-dialog/confirm-dialog.tsx +5 -2
- package/src/main/alert-dialog/dialog-loading-action.tsx +22 -5
- package/src/main/alert-dialog/dialog-styles.ts +13 -3
- package/src/main/alert-dialog/high-priority-confirm-dialog.tsx +29 -24
- package/src/main/alert-dialog/info-dialog.tsx +5 -2
- package/src/main/alert-dialog/undoable-confirm-dialog.tsx +21 -18
- package/src/main/anime/anime-beam-frame.tsx +128 -0
- package/src/main/anime/anime-spiral-loading.tsx +123 -0
- package/src/main/anime/index.ts +9 -0
- package/src/main/beam-frame-config.tsx +341 -0
- package/src/main/calendar/random-date-range-dialog.tsx +242 -74
- package/src/main/cta.tsx +50 -21
- package/src/main/delayed-img.tsx +9 -4
- package/src/main/info-tooltip.tsx +116 -20
- package/src/main/loading-frame/index.ts +4 -0
- package/src/main/loading.tsx +75 -24
- package/src/main/motion/index.ts +8 -0
- package/src/main/motion/motion-beam-frame.tsx +137 -0
- package/src/main/snake-loading-frame.tsx +95 -496
- package/src/styles/cta.css +21 -4
- package/src/styles/third-ui.css +0 -20
|
@@ -9,6 +9,7 @@ import '@windrun-huaiin/base-ui/lib';
|
|
|
9
9
|
import '@windrun-huaiin/lib/utils';
|
|
10
10
|
import { ZiaFolder, ZiaFile } from '../../mdx/zia-file.mjs';
|
|
11
11
|
import { SunoEmbed } from '../../mdx/suno-embed.mjs';
|
|
12
|
+
import { CheetTable } from '../../mdx/cheet-table.mjs';
|
|
12
13
|
|
|
13
14
|
const ImageGrid = lazy(() => import('../../heavy/image-grid.mjs').then((mod) => ({ default: mod.ImageGrid })));
|
|
14
15
|
const ImageZoom = lazy(() => import('../../heavy/image-zoom.mjs').then((mod) => ({ default: mod.ImageZoom })));
|
|
@@ -20,6 +21,7 @@ function createWidgetMdxComponents(cdnBaseUrl, imageFallbackSrc) {
|
|
|
20
21
|
ZiaFile,
|
|
21
22
|
ZiaFolder,
|
|
22
23
|
SunoEmbed,
|
|
24
|
+
CheetTable,
|
|
23
25
|
ImageGrid: (props) => (jsx(ImageGrid, Object.assign({}, props, { cdnBaseUrl: cdnBaseUrl }))),
|
|
24
26
|
ImageZoom: (props) => (jsx(ImageZoom, Object.assign({}, props, { fallbackSrc: imageFallbackSrc }))),
|
|
25
27
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z, ZodObject } from 'zod';
|
|
2
|
-
export declare const createDateSchema: () => z.
|
|
2
|
+
export declare const createDateSchema: () => z.ZodPreprocess<z.ZodString>;
|
|
3
3
|
export declare const createCommonDocsSchema: () => ZodObject<any>;
|
|
4
4
|
export declare const createCommonMetaSchema: () => ZodObject<any>;
|
|
5
5
|
export declare const remarkInstallOptions: {
|
|
@@ -12,8 +12,9 @@ interface ConfirmDialogProps {
|
|
|
12
12
|
confirmText?: string;
|
|
13
13
|
emphasis?: ConfirmDialogEmphasis;
|
|
14
14
|
loadingActions?: readonly DialogLoadingAction[];
|
|
15
|
+
loadingFullPage?: boolean;
|
|
15
16
|
onCancel?: DialogActionHandler;
|
|
16
17
|
onConfirm?: DialogActionHandler;
|
|
17
18
|
}
|
|
18
|
-
export declare function ConfirmDialog({ open, onOpenChange, type, title, description, cancelText, confirmText, emphasis, loadingActions, onCancel, onConfirm, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function ConfirmDialog({ open, onOpenChange, type, title, description, cancelText, confirmText, emphasis, loadingActions, loadingFullPage, onCancel, onConfirm, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
19
20
|
export {};
|
|
@@ -25,19 +25,19 @@ const confirmTypeClassMap = {
|
|
|
25
25
|
Icon: icons.CircleAlertIcon,
|
|
26
26
|
},
|
|
27
27
|
};
|
|
28
|
-
function ConfirmDialog({ open, onOpenChange, type = 'normal', title, description, cancelText = 'Cancel', confirmText = 'Confirm', emphasis = 'confirm', loadingActions, onCancel, onConfirm, }) {
|
|
28
|
+
function ConfirmDialog({ open, onOpenChange, type = 'normal', title, description, cancelText = 'Cancel', confirmText = 'Confirm', emphasis = 'confirm', loadingActions, loadingFullPage, onCancel, onConfirm, }) {
|
|
29
29
|
const typeClass = confirmTypeClassMap[type];
|
|
30
30
|
const Icon = typeClass.Icon;
|
|
31
31
|
const cancelButtonClass = emphasis === 'cancel' ? typeClass.action : dialogStyles.secondaryButtonClass;
|
|
32
32
|
const confirmButtonClass = emphasis === 'cancel' ? dialogStyles.secondaryButtonClass : typeClass.action;
|
|
33
|
-
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
33
|
+
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
34
34
|
const handleCancel = () => {
|
|
35
35
|
void runDialogAction('cancel', onCancel);
|
|
36
36
|
};
|
|
37
37
|
const handleClose = () => {
|
|
38
38
|
onOpenChange(false);
|
|
39
39
|
};
|
|
40
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, typeClass.content), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsxRuntime.jsx(Icon, { className: utils.cn('size-5', typeClass.icon) }) }), jsxRuntime.jsx("span", { className:
|
|
40
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, typeClass.content), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsxRuntime.jsx(Icon, { className: utils.cn('size-5', typeClass.icon) }) }), jsxRuntime.jsx("span", { className: dialogStyles.dialogTitleTextClass, children: title })] }) }), jsxRuntime.jsx("button", { type: "button", className: dialogStyles.closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsxRuntime.jsx(icons.XIcon, { className: "size-4" }) })] }), jsxRuntime.jsx(ui.AlertDialogDescription, { className: dialogStyles.dialogDescriptionClass, children: description }), jsxRuntime.jsxs("div", { className: dialogStyles.dialogFooterClass, children: [jsxRuntime.jsx(ui.AlertDialogCancel, { className: cancelButtonClass, onClick: handleCancel, children: cancelText }), jsxRuntime.jsx(ui.AlertDialogAction, { className: confirmButtonClass, onClick: () => {
|
|
41
41
|
void runDialogAction('confirm', onConfirm);
|
|
42
42
|
}, children: confirmText })] })] }) }), dialogLoading] }));
|
|
43
43
|
}
|
|
@@ -4,7 +4,7 @@ import { CircleAlertIcon, CircleQuestionMarkIcon, XIcon } from '@windrun-huaiin/
|
|
|
4
4
|
import { themeBgColor, themeIconColor } from '@windrun-huaiin/base-ui/lib';
|
|
5
5
|
import { AlertDialog, AlertDialogContent, AlertDialogTitle, AlertDialogDescription, AlertDialogCancel, AlertDialogAction } from '@windrun-huaiin/base-ui/ui';
|
|
6
6
|
import { cn } from '@windrun-huaiin/lib/utils';
|
|
7
|
-
import { dangerButtonClass, primaryButtonClass, secondaryButtonClass, dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, closeButtonClass, dialogDescriptionClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
7
|
+
import { dangerButtonClass, primaryButtonClass, secondaryButtonClass, dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, dialogTitleTextClass, closeButtonClass, dialogDescriptionClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
8
8
|
import { useDialogLoadingAction } from './dialog-loading-action.mjs';
|
|
9
9
|
|
|
10
10
|
const confirmTypeClassMap = {
|
|
@@ -23,19 +23,19 @@ const confirmTypeClassMap = {
|
|
|
23
23
|
Icon: CircleAlertIcon,
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
|
-
function ConfirmDialog({ open, onOpenChange, type = 'normal', title, description, cancelText = 'Cancel', confirmText = 'Confirm', emphasis = 'confirm', loadingActions, onCancel, onConfirm, }) {
|
|
26
|
+
function ConfirmDialog({ open, onOpenChange, type = 'normal', title, description, cancelText = 'Cancel', confirmText = 'Confirm', emphasis = 'confirm', loadingActions, loadingFullPage, onCancel, onConfirm, }) {
|
|
27
27
|
const typeClass = confirmTypeClassMap[type];
|
|
28
28
|
const Icon = typeClass.Icon;
|
|
29
29
|
const cancelButtonClass = emphasis === 'cancel' ? typeClass.action : secondaryButtonClass;
|
|
30
30
|
const confirmButtonClass = emphasis === 'cancel' ? secondaryButtonClass : typeClass.action;
|
|
31
|
-
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
31
|
+
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
32
32
|
const handleCancel = () => {
|
|
33
33
|
void runDialogAction('cancel', onCancel);
|
|
34
34
|
};
|
|
35
35
|
const handleClose = () => {
|
|
36
36
|
onOpenChange(false);
|
|
37
37
|
};
|
|
38
|
-
return (jsxs(Fragment, { children: [jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, typeClass.content), overlayClassName: dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsx(Icon, { className: cn('size-5', typeClass.icon) }) }), jsx("span", { className:
|
|
38
|
+
return (jsxs(Fragment, { children: [jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, typeClass.content), overlayClassName: dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsx(Icon, { className: cn('size-5', typeClass.icon) }) }), jsx("span", { className: dialogTitleTextClass, children: title })] }) }), jsx("button", { type: "button", className: closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsx(XIcon, { className: "size-4" }) })] }), jsx(AlertDialogDescription, { className: dialogDescriptionClass, children: description }), jsxs("div", { className: dialogFooterClass, children: [jsx(AlertDialogCancel, { className: cancelButtonClass, onClick: handleCancel, children: cancelText }), jsx(AlertDialogAction, { className: confirmButtonClass, onClick: () => {
|
|
39
39
|
void runDialogAction('confirm', onConfirm);
|
|
40
40
|
}, children: confirmText })] })] }) }), dialogLoading] }));
|
|
41
41
|
}
|
|
@@ -3,9 +3,10 @@ export type DialogLoadingAction = 'cancel' | 'confirm' | 'undo';
|
|
|
3
3
|
export type DialogActionHandler = () => void | Promise<void>;
|
|
4
4
|
interface UseDialogLoadingActionOptions {
|
|
5
5
|
loadingActions?: readonly DialogLoadingAction[];
|
|
6
|
+
loadingFullPage?: boolean;
|
|
6
7
|
onOpenChange: (open: boolean) => void;
|
|
7
8
|
}
|
|
8
|
-
export declare function useDialogLoadingAction({ loadingActions, onOpenChange, }: UseDialogLoadingActionOptions): {
|
|
9
|
+
export declare function useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange, }: UseDialogLoadingActionOptions): {
|
|
9
10
|
dialogLoading: React.ReactPortal | null;
|
|
10
11
|
runDialogAction: (action: DialogLoadingAction, handler?: DialogActionHandler) => Promise<void>;
|
|
11
12
|
};
|
|
@@ -6,23 +6,26 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
var React = require('react');
|
|
7
7
|
var reactDom = require('react-dom');
|
|
8
8
|
var loading = require('../loading.js');
|
|
9
|
+
var dialogStyles = require('./dialog-styles.js');
|
|
9
10
|
|
|
10
|
-
function useDialogLoadingAction({ loadingActions, onOpenChange, }) {
|
|
11
|
+
function useDialogLoadingAction({ loadingActions, loadingFullPage = false, onOpenChange, }) {
|
|
11
12
|
const [mounted, setMounted] = React.useState(false);
|
|
12
13
|
const [loading$1, setLoading] = React.useState(false);
|
|
13
14
|
React.useEffect(() => {
|
|
14
15
|
setMounted(true);
|
|
15
16
|
}, []);
|
|
16
17
|
const runDialogAction = React.useCallback((action, handler) => tslib.__awaiter(this, void 0, void 0, function* () {
|
|
17
|
-
onOpenChange(false);
|
|
18
18
|
if (!handler) {
|
|
19
|
+
onOpenChange(false);
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
21
22
|
if (!(loadingActions === null || loadingActions === void 0 ? void 0 : loadingActions.includes(action))) {
|
|
23
|
+
onOpenChange(false);
|
|
22
24
|
yield handler();
|
|
23
25
|
return;
|
|
24
26
|
}
|
|
25
27
|
setLoading(true);
|
|
28
|
+
onOpenChange(false);
|
|
26
29
|
try {
|
|
27
30
|
yield handler();
|
|
28
31
|
}
|
|
@@ -31,7 +34,7 @@ function useDialogLoadingAction({ loadingActions, onOpenChange, }) {
|
|
|
31
34
|
}
|
|
32
35
|
}), [loadingActions, onOpenChange]);
|
|
33
36
|
const dialogLoading = mounted && loading$1
|
|
34
|
-
? reactDom.createPortal(jsxRuntime.jsx("div", { className: "fixed inset-0 z-10000", children: jsxRuntime.jsx(loading.Loading, { className: "h-full w-full" }) }), document.body)
|
|
37
|
+
? reactDom.createPortal(loadingFullPage ? (jsxRuntime.jsx("div", { className: "fixed inset-0 z-10000", children: jsxRuntime.jsx(loading.Loading, { className: "h-full w-full" }) })) : (jsxRuntime.jsx("div", { className: "fixed inset-0 z-10000", children: jsxRuntime.jsx("div", { className: dialogStyles.dialogLoadingContentClass, children: jsxRuntime.jsx(loading.Loading, { compact: true, label: "Loading", className: "min-h-[220px] w-fit max-w-full rounded-none bg-transparent px-0 py-0 dark:bg-transparent", labelClassName: "text-foreground" }) }) })), document.body)
|
|
35
38
|
: null;
|
|
36
39
|
return {
|
|
37
40
|
dialogLoading,
|
|
@@ -4,23 +4,26 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
4
4
|
import React__default from 'react';
|
|
5
5
|
import { createPortal } from 'react-dom';
|
|
6
6
|
import { Loading } from '../loading.mjs';
|
|
7
|
+
import { dialogLoadingContentClass } from './dialog-styles.mjs';
|
|
7
8
|
|
|
8
|
-
function useDialogLoadingAction({ loadingActions, onOpenChange, }) {
|
|
9
|
+
function useDialogLoadingAction({ loadingActions, loadingFullPage = false, onOpenChange, }) {
|
|
9
10
|
const [mounted, setMounted] = React__default.useState(false);
|
|
10
11
|
const [loading, setLoading] = React__default.useState(false);
|
|
11
12
|
React__default.useEffect(() => {
|
|
12
13
|
setMounted(true);
|
|
13
14
|
}, []);
|
|
14
15
|
const runDialogAction = React__default.useCallback((action, handler) => __awaiter(this, void 0, void 0, function* () {
|
|
15
|
-
onOpenChange(false);
|
|
16
16
|
if (!handler) {
|
|
17
|
+
onOpenChange(false);
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
20
|
if (!(loadingActions === null || loadingActions === void 0 ? void 0 : loadingActions.includes(action))) {
|
|
21
|
+
onOpenChange(false);
|
|
20
22
|
yield handler();
|
|
21
23
|
return;
|
|
22
24
|
}
|
|
23
25
|
setLoading(true);
|
|
26
|
+
onOpenChange(false);
|
|
24
27
|
try {
|
|
25
28
|
yield handler();
|
|
26
29
|
}
|
|
@@ -29,7 +32,7 @@ function useDialogLoadingAction({ loadingActions, onOpenChange, }) {
|
|
|
29
32
|
}
|
|
30
33
|
}), [loadingActions, onOpenChange]);
|
|
31
34
|
const dialogLoading = mounted && loading
|
|
32
|
-
? createPortal(jsx("div", { className: "fixed inset-0 z-10000", children: jsx(Loading, { className: "h-full w-full" }) }), document.body)
|
|
35
|
+
? createPortal(loadingFullPage ? (jsx("div", { className: "fixed inset-0 z-10000", children: jsx(Loading, { className: "h-full w-full" }) })) : (jsx("div", { className: "fixed inset-0 z-10000", children: jsx("div", { className: dialogLoadingContentClass, children: jsx(Loading, { compact: true, label: "Loading", className: "min-h-[220px] w-fit max-w-full rounded-none bg-transparent px-0 py-0 dark:bg-transparent", labelClassName: "text-foreground" }) }) })), document.body)
|
|
33
36
|
: null;
|
|
34
37
|
return {
|
|
35
38
|
dialogLoading,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export declare const dialogSurfaceClass: string;
|
|
2
2
|
export declare const dialogThemedOverlayClass: string;
|
|
3
3
|
export declare const dialogContentClass: string;
|
|
4
|
+
export declare const dialogLoadingContentClass: string;
|
|
4
5
|
export declare const dialogHeaderClass = "flex items-start justify-between gap-4";
|
|
5
|
-
export declare const dialogTitleClass = "flex min-w-0 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50";
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const dialogTitleClass = "flex min-w-0 flex-1 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50";
|
|
7
|
+
export declare const dialogTitleTextClass = "min-w-0 flex-1 line-clamp-2 break-words";
|
|
8
|
+
export declare const dialogDescriptionClass = "mt-3 break-words text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300";
|
|
7
9
|
export declare const dialogFooterClass = "mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end";
|
|
8
10
|
export declare const closeButtonClass = "inline-flex size-8 shrink-0 items-center justify-center rounded-full text-neutral-400 transition hover:bg-neutral-100 hover:text-neutral-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:hover:bg-neutral-800 dark:hover:text-neutral-200";
|
|
9
11
|
export declare const secondaryButtonClass = "inline-flex min-h-10 items-center justify-center rounded-full border border-neutral-300 bg-white px-5 py-2 text-sm font-semibold text-neutral-700 transition hover:bg-neutral-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 disabled:pointer-events-none disabled:opacity-60 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:hover:bg-neutral-800";
|
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
var lib = require('@windrun-huaiin/base-ui/lib');
|
|
5
5
|
var utils = require('@windrun-huaiin/lib/utils');
|
|
6
6
|
|
|
7
|
-
const dialogSurfaceClass = utils.cn('w-[calc(100vw-2rem)] max-w-md rounded-2xl border bg-white p-5 text-neutral-950 shadow-2xl outline-none dark:bg-neutral-950 dark:text-neutral-50', 'border-neutral-200 dark:border-neutral-800');
|
|
7
|
+
const dialogSurfaceClass = utils.cn('min-h-[240px] w-[calc(100vw-2rem)] max-w-md rounded-2xl border bg-white p-5 text-neutral-950 shadow-2xl outline-none dark:bg-neutral-950 dark:text-neutral-50', 'border-neutral-200 dark:border-neutral-800');
|
|
8
8
|
const dialogThemedOverlayClass = utils.cn(lib.themeMainBgColor, 'opacity-90 backdrop-blur-[2px] dark:opacity-85');
|
|
9
9
|
const dialogContentClass = utils.cn('fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2', dialogSurfaceClass);
|
|
10
|
+
const dialogLoadingContentClass = utils.cn('fixed left-1/2 top-1/2 z-10000 -translate-x-1/2 -translate-y-1/2', dialogSurfaceClass, 'flex items-center justify-center overflow-hidden animate-in fade-in-0 zoom-in-95 duration-150');
|
|
10
11
|
const dialogHeaderClass = 'flex items-start justify-between gap-4';
|
|
11
|
-
const dialogTitleClass = 'flex min-w-0 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50';
|
|
12
|
-
const
|
|
12
|
+
const dialogTitleClass = 'flex min-w-0 flex-1 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50';
|
|
13
|
+
const dialogTitleTextClass = 'min-w-0 flex-1 line-clamp-2 break-words';
|
|
14
|
+
const dialogDescriptionClass = 'mt-3 break-words text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300';
|
|
13
15
|
const dialogFooterClass = 'mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end';
|
|
14
16
|
const closeButtonClass = 'inline-flex size-8 shrink-0 items-center justify-center rounded-full text-neutral-400 transition hover:bg-neutral-100 hover:text-neutral-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:hover:bg-neutral-800 dark:hover:text-neutral-200';
|
|
15
17
|
const secondaryButtonClass = 'inline-flex min-h-10 items-center justify-center rounded-full border border-neutral-300 bg-white px-5 py-2 text-sm font-semibold text-neutral-700 transition hover:bg-neutral-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 disabled:pointer-events-none disabled:opacity-60 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:hover:bg-neutral-800';
|
|
@@ -17,7 +19,7 @@ const primaryButtonClass = utils.cn('inline-flex min-h-10 items-center justify-c
|
|
|
17
19
|
const subtlePrimaryButtonClass = utils.cn('inline-flex min-h-10 items-center justify-center rounded-full border px-5 py-2 text-sm font-bold transition hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-60', lib.themeBgColor, lib.themeBorderColor, lib.themeIconColor, lib.themeRingColor);
|
|
18
20
|
const dangerButtonClass = 'inline-flex min-h-10 items-center justify-center rounded-full bg-red-600 px-5 py-2 text-sm font-bold text-white shadow-sm transition hover:bg-red-700 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 disabled:pointer-events-none disabled:opacity-60 dark:bg-red-600 dark:hover:bg-red-500';
|
|
19
21
|
const highPriorityTitleClass = utils.cn('flex min-w-0 items-center gap-2 text-lg font-bold leading-tight', lib.themeIconColor);
|
|
20
|
-
const highPrioritySurfaceClass = utils.cn(dialogSurfaceClass, 'backdrop-blur-md ring-4 animate-in zoom-in-95 duration-300', lib.themeBorderColor, lib.themeRingColor);
|
|
22
|
+
const highPrioritySurfaceClass = utils.cn(dialogSurfaceClass, 'flex flex-col', 'backdrop-blur-md ring-4 animate-in zoom-in-95 duration-300', lib.themeBorderColor, lib.themeRingColor);
|
|
21
23
|
|
|
22
24
|
exports.closeButtonClass = closeButtonClass;
|
|
23
25
|
exports.dangerButtonClass = dangerButtonClass;
|
|
@@ -25,9 +27,11 @@ exports.dialogContentClass = dialogContentClass;
|
|
|
25
27
|
exports.dialogDescriptionClass = dialogDescriptionClass;
|
|
26
28
|
exports.dialogFooterClass = dialogFooterClass;
|
|
27
29
|
exports.dialogHeaderClass = dialogHeaderClass;
|
|
30
|
+
exports.dialogLoadingContentClass = dialogLoadingContentClass;
|
|
28
31
|
exports.dialogSurfaceClass = dialogSurfaceClass;
|
|
29
32
|
exports.dialogThemedOverlayClass = dialogThemedOverlayClass;
|
|
30
33
|
exports.dialogTitleClass = dialogTitleClass;
|
|
34
|
+
exports.dialogTitleTextClass = dialogTitleTextClass;
|
|
31
35
|
exports.highPrioritySurfaceClass = highPrioritySurfaceClass;
|
|
32
36
|
exports.highPriorityTitleClass = highPriorityTitleClass;
|
|
33
37
|
exports.primaryButtonClass = primaryButtonClass;
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
import { themeMainBgColor, themeButtonGradientClass, themeButtonGradientHoverClass, themeRingColor, themeBgColor, themeBorderColor, themeIconColor } from '@windrun-huaiin/base-ui/lib';
|
|
3
3
|
import { cn } from '@windrun-huaiin/lib/utils';
|
|
4
4
|
|
|
5
|
-
const dialogSurfaceClass = cn('w-[calc(100vw-2rem)] max-w-md rounded-2xl border bg-white p-5 text-neutral-950 shadow-2xl outline-none dark:bg-neutral-950 dark:text-neutral-50', 'border-neutral-200 dark:border-neutral-800');
|
|
5
|
+
const dialogSurfaceClass = cn('min-h-[240px] w-[calc(100vw-2rem)] max-w-md rounded-2xl border bg-white p-5 text-neutral-950 shadow-2xl outline-none dark:bg-neutral-950 dark:text-neutral-50', 'border-neutral-200 dark:border-neutral-800');
|
|
6
6
|
const dialogThemedOverlayClass = cn(themeMainBgColor, 'opacity-90 backdrop-blur-[2px] dark:opacity-85');
|
|
7
7
|
const dialogContentClass = cn('fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2', dialogSurfaceClass);
|
|
8
|
+
const dialogLoadingContentClass = cn('fixed left-1/2 top-1/2 z-10000 -translate-x-1/2 -translate-y-1/2', dialogSurfaceClass, 'flex items-center justify-center overflow-hidden animate-in fade-in-0 zoom-in-95 duration-150');
|
|
8
9
|
const dialogHeaderClass = 'flex items-start justify-between gap-4';
|
|
9
|
-
const dialogTitleClass = 'flex min-w-0 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50';
|
|
10
|
-
const
|
|
10
|
+
const dialogTitleClass = 'flex min-w-0 flex-1 items-center gap-2 text-lg font-bold leading-tight text-neutral-950 dark:text-neutral-50';
|
|
11
|
+
const dialogTitleTextClass = 'min-w-0 flex-1 line-clamp-2 break-words';
|
|
12
|
+
const dialogDescriptionClass = 'mt-3 break-words text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300';
|
|
11
13
|
const dialogFooterClass = 'mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end';
|
|
12
14
|
const closeButtonClass = 'inline-flex size-8 shrink-0 items-center justify-center rounded-full text-neutral-400 transition hover:bg-neutral-100 hover:text-neutral-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:hover:bg-neutral-800 dark:hover:text-neutral-200';
|
|
13
15
|
const secondaryButtonClass = 'inline-flex min-h-10 items-center justify-center rounded-full border border-neutral-300 bg-white px-5 py-2 text-sm font-semibold text-neutral-700 transition hover:bg-neutral-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 disabled:pointer-events-none disabled:opacity-60 dark:border-neutral-700 dark:bg-neutral-900 dark:text-neutral-200 dark:hover:bg-neutral-800';
|
|
@@ -15,6 +17,6 @@ const primaryButtonClass = cn('inline-flex min-h-10 items-center justify-center
|
|
|
15
17
|
const subtlePrimaryButtonClass = cn('inline-flex min-h-10 items-center justify-center rounded-full border px-5 py-2 text-sm font-bold transition hover:brightness-95 focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-60', themeBgColor, themeBorderColor, themeIconColor, themeRingColor);
|
|
16
18
|
const dangerButtonClass = 'inline-flex min-h-10 items-center justify-center rounded-full bg-red-600 px-5 py-2 text-sm font-bold text-white shadow-sm transition hover:bg-red-700 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 disabled:pointer-events-none disabled:opacity-60 dark:bg-red-600 dark:hover:bg-red-500';
|
|
17
19
|
const highPriorityTitleClass = cn('flex min-w-0 items-center gap-2 text-lg font-bold leading-tight', themeIconColor);
|
|
18
|
-
const highPrioritySurfaceClass = cn(dialogSurfaceClass, 'backdrop-blur-md ring-4 animate-in zoom-in-95 duration-300', themeBorderColor, themeRingColor);
|
|
20
|
+
const highPrioritySurfaceClass = cn(dialogSurfaceClass, 'flex flex-col', 'backdrop-blur-md ring-4 animate-in zoom-in-95 duration-300', themeBorderColor, themeRingColor);
|
|
19
21
|
|
|
20
|
-
export { closeButtonClass, dangerButtonClass, dialogContentClass, dialogDescriptionClass, dialogFooterClass, dialogHeaderClass, dialogSurfaceClass, dialogThemedOverlayClass, dialogTitleClass, highPrioritySurfaceClass, highPriorityTitleClass, primaryButtonClass, secondaryButtonClass, subtlePrimaryButtonClass };
|
|
22
|
+
export { closeButtonClass, dangerButtonClass, dialogContentClass, dialogDescriptionClass, dialogFooterClass, dialogHeaderClass, dialogLoadingContentClass, dialogSurfaceClass, dialogThemedOverlayClass, dialogTitleClass, dialogTitleTextClass, highPrioritySurfaceClass, highPriorityTitleClass, primaryButtonClass, secondaryButtonClass, subtlePrimaryButtonClass };
|
|
@@ -10,6 +10,7 @@ interface HighPriorityConfirmDialogProps {
|
|
|
10
10
|
confirmText?: string;
|
|
11
11
|
cancelText?: string;
|
|
12
12
|
loadingActions?: readonly DialogLoadingAction[];
|
|
13
|
+
loadingFullPage?: boolean;
|
|
13
14
|
}
|
|
14
|
-
export declare function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText, cancelText, loadingActions, }: HighPriorityConfirmDialogProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
|
+
export declare function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText, cancelText, loadingActions, loadingFullPage, }: HighPriorityConfirmDialogProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
16
|
export {};
|
|
@@ -10,9 +10,9 @@ var dialogStyles = require('./dialog-styles.js');
|
|
|
10
10
|
var lib = require('@windrun-huaiin/base-ui/lib');
|
|
11
11
|
var dialogLoadingAction = require('./dialog-loading-action.js');
|
|
12
12
|
|
|
13
|
-
function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText = "Confirm", cancelText = "Cancel", loadingActions, }) {
|
|
13
|
+
function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText = "Confirm", cancelText = "Cancel", loadingActions, loadingFullPage, }) {
|
|
14
14
|
const [mounted, setMounted] = React.useState(false);
|
|
15
|
-
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
15
|
+
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
16
16
|
React.useEffect(() => {
|
|
17
17
|
// Ensure portal target exists and prevent hydration mismatch
|
|
18
18
|
setTimeout(() => setMounted(true), 0);
|
|
@@ -22,11 +22,11 @@ function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, ti
|
|
|
22
22
|
const handleClose = () => {
|
|
23
23
|
onOpenChange(false);
|
|
24
24
|
};
|
|
25
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [open && reactDom.createPortal(jsxRuntime.jsx("div", { className: "fixed inset-0 z-10000 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-300", children: jsxRuntime.jsxs("div", { className: utils.cn(dialogStyles.highPrioritySurfaceClass, "scale-100"), role: "dialog", "aria-modal": "true", onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsxs("h3", { className: dialogStyles.highPriorityTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', lib.themeBgColor, lib.themeBorderColor), children: jsxRuntime.jsx(icons.FAQSIcon, { className: utils.cn('size-5', lib.themeIconColor) }) }), jsxRuntime.jsx("span", { className:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [open && reactDom.createPortal(jsxRuntime.jsx("div", { className: "fixed inset-0 z-10000 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-300", children: jsxRuntime.jsxs("div", { className: utils.cn(dialogStyles.highPrioritySurfaceClass, "scale-100"), role: "dialog", "aria-modal": "true", onClick: (e) => e.stopPropagation(), children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsxs("h3", { className: dialogStyles.highPriorityTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', lib.themeBgColor, lib.themeBorderColor), children: jsxRuntime.jsx(icons.FAQSIcon, { className: utils.cn('size-5', lib.themeIconColor) }) }), jsxRuntime.jsx("span", { className: dialogStyles.dialogTitleTextClass, children: title })] }), jsxRuntime.jsx("button", { type: "button", className: dialogStyles.closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsxRuntime.jsx(icons.XIcon, { className: "size-4" }) })] }), jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [jsxRuntime.jsx("div", { className: dialogStyles.dialogDescriptionClass, children: description }), jsxRuntime.jsxs("div", { className: utils.cn(dialogStyles.dialogFooterClass, 'mt-auto'), children: [jsxRuntime.jsx("button", { type: "button", onClick: () => {
|
|
26
|
+
void runDialogAction('cancel', onCancel);
|
|
27
|
+
}, className: dialogStyles.secondaryButtonClass, children: cancelText }), jsxRuntime.jsx("button", { type: "button", onClick: () => {
|
|
28
|
+
void runDialogAction('confirm', onConfirm);
|
|
29
|
+
}, className: utils.cn(dialogStyles.primaryButtonClass, "hover:scale-105 active:scale-95"), children: confirmText })] })] })] }) }), document.body), dialogLoading] }));
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
exports.HighPriorityConfirmDialog = HighPriorityConfirmDialog;
|
|
@@ -4,13 +4,13 @@ import { useState, useEffect } from 'react';
|
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
5
|
import { FAQSIcon, XIcon } from '@windrun-huaiin/base-ui/icons';
|
|
6
6
|
import { cn } from '@windrun-huaiin/lib/utils';
|
|
7
|
-
import { dialogHeaderClass, highPriorityTitleClass, closeButtonClass, dialogDescriptionClass,
|
|
7
|
+
import { dialogHeaderClass, highPriorityTitleClass, dialogTitleTextClass, closeButtonClass, dialogDescriptionClass, secondaryButtonClass, primaryButtonClass, dialogFooterClass, highPrioritySurfaceClass } from './dialog-styles.mjs';
|
|
8
8
|
import { themeIconColor, themeBgColor, themeBorderColor } from '@windrun-huaiin/base-ui/lib';
|
|
9
9
|
import { useDialogLoadingAction } from './dialog-loading-action.mjs';
|
|
10
10
|
|
|
11
|
-
function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText = "Confirm", cancelText = "Cancel", loadingActions, }) {
|
|
11
|
+
function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, title, description, confirmText = "Confirm", cancelText = "Cancel", loadingActions, loadingFullPage, }) {
|
|
12
12
|
const [mounted, setMounted] = useState(false);
|
|
13
|
-
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
13
|
+
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
14
14
|
useEffect(() => {
|
|
15
15
|
// Ensure portal target exists and prevent hydration mismatch
|
|
16
16
|
setTimeout(() => setMounted(true), 0);
|
|
@@ -20,11 +20,11 @@ function HighPriorityConfirmDialog({ open, onOpenChange, onCancel, onConfirm, ti
|
|
|
20
20
|
const handleClose = () => {
|
|
21
21
|
onOpenChange(false);
|
|
22
22
|
};
|
|
23
|
-
return (jsxs(Fragment, { children: [open && createPortal(jsx("div", { className: "fixed inset-0 z-10000 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-300", children: jsxs("div", { className: cn(highPrioritySurfaceClass, "scale-100"), role: "dialog", "aria-modal": "true", onClick: (e) => e.stopPropagation(), children: [jsxs("div", { className: dialogHeaderClass, children: [jsxs("h3", { className: highPriorityTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', themeBgColor, themeBorderColor), children: jsx(FAQSIcon, { className: cn('size-5', themeIconColor) }) }), jsx("span", { className:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
return (jsxs(Fragment, { children: [open && createPortal(jsx("div", { className: "fixed inset-0 z-10000 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-in fade-in duration-300", children: jsxs("div", { className: cn(highPrioritySurfaceClass, "scale-100"), role: "dialog", "aria-modal": "true", onClick: (e) => e.stopPropagation(), children: [jsxs("div", { className: dialogHeaderClass, children: [jsxs("h3", { className: highPriorityTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', themeBgColor, themeBorderColor), children: jsx(FAQSIcon, { className: cn('size-5', themeIconColor) }) }), jsx("span", { className: dialogTitleTextClass, children: title })] }), jsx("button", { type: "button", className: closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsx(XIcon, { className: "size-4" }) })] }), jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [jsx("div", { className: dialogDescriptionClass, children: description }), jsxs("div", { className: cn(dialogFooterClass, 'mt-auto'), children: [jsx("button", { type: "button", onClick: () => {
|
|
24
|
+
void runDialogAction('cancel', onCancel);
|
|
25
|
+
}, className: secondaryButtonClass, children: cancelText }), jsx("button", { type: "button", onClick: () => {
|
|
26
|
+
void runDialogAction('confirm', onConfirm);
|
|
27
|
+
}, className: cn(primaryButtonClass, "hover:scale-105 active:scale-95"), children: confirmText })] })] })] }) }), document.body), dialogLoading] }));
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
export { HighPriorityConfirmDialog };
|
|
@@ -9,7 +9,8 @@ interface InfoDialogProps {
|
|
|
9
9
|
description: React.ReactNode;
|
|
10
10
|
confirmText?: string;
|
|
11
11
|
loadingActions?: readonly DialogLoadingAction[];
|
|
12
|
+
loadingFullPage?: boolean;
|
|
12
13
|
onConfirm?: DialogActionHandler;
|
|
13
14
|
}
|
|
14
|
-
export declare function InfoDialog({ open, onOpenChange, type, title, description, confirmText, loadingActions, onConfirm, }: InfoDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function InfoDialog({ open, onOpenChange, type, title, description, confirmText, loadingActions, loadingFullPage, onConfirm, }: InfoDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
15
16
|
export {};
|
|
@@ -38,12 +38,12 @@ const infoTypeClassMap = {
|
|
|
38
38
|
Icon: icons.BadgeXIcon,
|
|
39
39
|
},
|
|
40
40
|
};
|
|
41
|
-
function InfoDialog({ open, onOpenChange, type = 'info', title, description, confirmText = 'OK', loadingActions, onConfirm, }) {
|
|
41
|
+
function InfoDialog({ open, onOpenChange, type = 'info', title, description, confirmText = 'OK', loadingActions, loadingFullPage, onConfirm, }) {
|
|
42
42
|
const typeClass = infoTypeClassMap[type];
|
|
43
43
|
const Icon = typeClass.Icon;
|
|
44
44
|
const handleClose = () => onOpenChange(false);
|
|
45
|
-
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
46
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, typeClass.content), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsxRuntime.jsx(Icon, { className: utils.cn('size-5', typeClass.icon) }) }), jsxRuntime.jsx("span", { className:
|
|
45
|
+
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
46
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, typeClass.content), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: utils.cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsxRuntime.jsx(Icon, { className: utils.cn('size-5', typeClass.icon) }) }), jsxRuntime.jsx("span", { className: dialogStyles.dialogTitleTextClass, children: title })] }) }), jsxRuntime.jsx("button", { type: "button", className: dialogStyles.closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsxRuntime.jsx(icons.XIcon, { className: "size-4" }) })] }), jsxRuntime.jsx(ui.AlertDialogDescription, { className: dialogStyles.dialogDescriptionClass, children: description }), jsxRuntime.jsx("div", { className: dialogStyles.dialogFooterClass, children: jsxRuntime.jsx(ui.AlertDialogAction, { className: utils.cn('inline-flex min-h-10 items-center justify-center rounded-full px-5 py-2 text-sm font-bold transition focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-60', typeClass.action), onClick: () => {
|
|
47
47
|
void runDialogAction('confirm', onConfirm);
|
|
48
48
|
}, children: confirmText }) })] }) }), dialogLoading] }));
|
|
49
49
|
}
|
|
@@ -3,7 +3,7 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
|
3
3
|
import { BadgeXIcon, BadgeCheckIcon, BadgeAlertIcon, BadgeInfoIcon, XIcon } from '@windrun-huaiin/base-ui/icons';
|
|
4
4
|
import { AlertDialog, AlertDialogContent, AlertDialogTitle, AlertDialogDescription, AlertDialogAction } from '@windrun-huaiin/base-ui/ui';
|
|
5
5
|
import { cn } from '@windrun-huaiin/lib/utils';
|
|
6
|
-
import { dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, closeButtonClass, dialogDescriptionClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
6
|
+
import { dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, dialogTitleTextClass, closeButtonClass, dialogDescriptionClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
7
7
|
import { useDialogLoadingAction } from './dialog-loading-action.mjs';
|
|
8
8
|
|
|
9
9
|
const infoTypeClassMap = {
|
|
@@ -36,12 +36,12 @@ const infoTypeClassMap = {
|
|
|
36
36
|
Icon: BadgeXIcon,
|
|
37
37
|
},
|
|
38
38
|
};
|
|
39
|
-
function InfoDialog({ open, onOpenChange, type = 'info', title, description, confirmText = 'OK', loadingActions, onConfirm, }) {
|
|
39
|
+
function InfoDialog({ open, onOpenChange, type = 'info', title, description, confirmText = 'OK', loadingActions, loadingFullPage, onConfirm, }) {
|
|
40
40
|
const typeClass = infoTypeClassMap[type];
|
|
41
41
|
const Icon = typeClass.Icon;
|
|
42
42
|
const handleClose = () => onOpenChange(false);
|
|
43
|
-
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
44
|
-
return (jsxs(Fragment, { children: [jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, typeClass.content), overlayClassName: dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsx(Icon, { className: cn('size-5', typeClass.icon) }) }), jsx("span", { className:
|
|
43
|
+
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
44
|
+
return (jsxs(Fragment, { children: [jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, typeClass.content), overlayClassName: dialogThemedOverlayClass, onOverlayClick: handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: cn('inline-flex size-9 shrink-0 items-center justify-center rounded-full ring-1', typeClass.iconWrap), children: jsx(Icon, { className: cn('size-5', typeClass.icon) }) }), jsx("span", { className: dialogTitleTextClass, children: title })] }) }), jsx("button", { type: "button", className: closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsx(XIcon, { className: "size-4" }) })] }), jsx(AlertDialogDescription, { className: dialogDescriptionClass, children: description }), jsx("div", { className: dialogFooterClass, children: jsx(AlertDialogAction, { className: cn('inline-flex min-h-10 items-center justify-center rounded-full px-5 py-2 text-sm font-bold transition focus-visible:outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-60', typeClass.action), onClick: () => {
|
|
45
45
|
void runDialogAction('confirm', onConfirm);
|
|
46
46
|
}, children: confirmText }) })] }) }), dialogLoading] }));
|
|
47
47
|
}
|
|
@@ -14,8 +14,9 @@ export interface UndoableConfirmDialogProps {
|
|
|
14
14
|
emphasis?: ConfirmDialogEmphasis;
|
|
15
15
|
countdownSeconds?: number;
|
|
16
16
|
loadingActions?: readonly DialogLoadingAction[];
|
|
17
|
+
loadingFullPage?: boolean;
|
|
17
18
|
onCancel?: DialogActionHandler;
|
|
18
19
|
onConfirm: DialogActionHandler;
|
|
19
20
|
onUndo?: DialogActionHandler;
|
|
20
21
|
}
|
|
21
|
-
export declare function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText, confirmText, undoText, emphasis, countdownSeconds, loadingActions, onCancel, onConfirm, onUndo, }: UndoableConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText, confirmText, undoText, emphasis, countdownSeconds, loadingActions, loadingFullPage, onCancel, onConfirm, onUndo, }: UndoableConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,7 +11,7 @@ var utils = require('@windrun-huaiin/lib/utils');
|
|
|
11
11
|
var dialogStyles = require('./dialog-styles.js');
|
|
12
12
|
var dialogLoadingAction = require('./dialog-loading-action.js');
|
|
13
13
|
|
|
14
|
-
function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText = 'Cancel', confirmText = 'Delete', undoText = 'Undo', emphasis = 'confirm', countdownSeconds = 5, loadingActions, onCancel, onConfirm, onUndo, }) {
|
|
14
|
+
function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText = 'Cancel', confirmText = 'Delete', undoText = 'Undo', emphasis = 'confirm', countdownSeconds = 5, loadingActions, loadingFullPage, onCancel, onConfirm, onUndo, }) {
|
|
15
15
|
const safeCountdownSeconds = Math.max(1, Math.floor(countdownSeconds));
|
|
16
16
|
const [pending, setPending] = React.useState(false);
|
|
17
17
|
const [remainingSeconds, setRemainingSeconds] = React.useState(safeCountdownSeconds);
|
|
@@ -20,7 +20,7 @@ function UndoableConfirmDialog({ open, onOpenChange, title, description, pending
|
|
|
20
20
|
const intervalRef = React.useRef(null);
|
|
21
21
|
const cancelButtonClass = emphasis === 'cancel' ? dialogStyles.dangerButtonClass : dialogStyles.secondaryButtonClass;
|
|
22
22
|
const confirmButtonClass = emphasis === 'cancel' ? dialogStyles.secondaryButtonClass : dialogStyles.dangerButtonClass;
|
|
23
|
-
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
23
|
+
const { dialogLoading, runDialogAction } = dialogLoadingAction.useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
24
24
|
const clearTimers = React.useCallback(() => {
|
|
25
25
|
if (timeoutRef.current) {
|
|
26
26
|
window.clearTimeout(timeoutRef.current);
|
|
@@ -86,9 +86,9 @@ function UndoableConfirmDialog({ open, onOpenChange, title, description, pending
|
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
onOpenChange(nextOpen);
|
|
89
|
-
}, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, 'border-red-300 dark:border-red-700'), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: pending ? undefined : handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: "inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-red-100 text-red-600 ring-1 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-900", children: pending ? jsxRuntime.jsx(icons.Trash2Icon, { className: "size-5" }) : jsxRuntime.jsx(icons.CircleAlertIcon, { className: "size-5" }) }), jsxRuntime.jsx("span", { className:
|
|
89
|
+
}, children: jsxRuntime.jsxs(ui.AlertDialogContent, { className: utils.cn(dialogStyles.dialogContentClass, 'border-red-300 dark:border-red-700'), overlayClassName: dialogStyles.dialogThemedOverlayClass, onOverlayClick: pending ? undefined : handleClose, children: [jsxRuntime.jsxs("div", { className: dialogStyles.dialogHeaderClass, children: [jsxRuntime.jsx(ui.AlertDialogTitle, { asChild: true, children: jsxRuntime.jsxs("div", { className: dialogStyles.dialogTitleClass, children: [jsxRuntime.jsx("span", { className: "inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-red-100 text-red-600 ring-1 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-900", children: pending ? jsxRuntime.jsx(icons.Trash2Icon, { className: "size-5" }) : jsxRuntime.jsx(icons.CircleAlertIcon, { className: "size-5" }) }), jsxRuntime.jsx("span", { className: dialogStyles.dialogTitleTextClass, children: displayTitle })] }) }), jsxRuntime.jsx("button", { type: "button", className: dialogStyles.closeButtonClass, onClick: handleClose, "aria-label": "Close", disabled: confirming, children: jsxRuntime.jsx(icons.XIcon, { className: "size-4" }) })] }), jsxRuntime.jsx(ui.AlertDialogDescription, { className: utils.cn(dialogStyles.dialogDescriptionClass, 'min-h-[44px]'), children: jsxRuntime.jsx("span", { children: displayDescription }) }), jsxRuntime.jsx("div", { className: "flex h-12 items-center justify-center py-1", children: jsxRuntime.jsxs("div", { className: "flex items-baseline justify-center gap-2", children: [jsxRuntime.jsx("span", { className: utils.cn('text-4xl font-black leading-none tabular-nums', pending && 'animate-bounce', lib.themeIconColor), children: pending ? remainingSeconds : safeCountdownSeconds }), jsxRuntime.jsx("span", { className: utils.cn('text-sm font-bold', lib.themeIconColor), children: "s" })] }) }), jsxRuntime.jsx("div", { className: utils.cn(dialogStyles.dialogFooterClass, 'min-h-[88px] sm:min-h-10 sm:items-center'), children: pending ? (jsxRuntime.jsxs("button", { type: "button", onClick: () => {
|
|
90
90
|
void handleUndo();
|
|
91
|
-
}, className: dialogStyles.secondaryButtonClass, disabled: confirming, children: [jsxRuntime.jsx(icons.Undo2Icon, { className: "mr-1.5 size-4" }), undoText] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: handleCancel, className: cancelButtonClass, children: cancelText }), jsxRuntime.jsx("button", { type: "button", onClick: startCountdown, className: confirmButtonClass, children: confirmText })] })) })] }) }), dialogLoading] }));
|
|
91
|
+
}, className: utils.cn(dialogStyles.secondaryButtonClass, 'w-full sm:w-auto'), disabled: confirming, children: [jsxRuntime.jsx(icons.Undo2Icon, { className: "mr-1.5 size-4" }), undoText] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: handleCancel, className: utils.cn(cancelButtonClass, 'w-full sm:w-auto'), children: cancelText }), jsxRuntime.jsx("button", { type: "button", onClick: startCountdown, className: utils.cn(confirmButtonClass, 'w-full sm:w-auto'), children: confirmText })] })) })] }) }), dialogLoading] }));
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
exports.UndoableConfirmDialog = UndoableConfirmDialog;
|
|
@@ -6,10 +6,10 @@ import { Trash2Icon, CircleAlertIcon, XIcon, Undo2Icon } from '@windrun-huaiin/b
|
|
|
6
6
|
import { themeIconColor } from '@windrun-huaiin/base-ui/lib';
|
|
7
7
|
import { AlertDialog, AlertDialogContent, AlertDialogTitle, AlertDialogDescription } from '@windrun-huaiin/base-ui/ui';
|
|
8
8
|
import { cn } from '@windrun-huaiin/lib/utils';
|
|
9
|
-
import { dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, closeButtonClass, dialogDescriptionClass, secondaryButtonClass, dangerButtonClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
9
|
+
import { dialogThemedOverlayClass, dialogHeaderClass, dialogTitleClass, dialogTitleTextClass, closeButtonClass, dialogDescriptionClass, secondaryButtonClass, dangerButtonClass, dialogFooterClass, dialogContentClass } from './dialog-styles.mjs';
|
|
10
10
|
import { useDialogLoadingAction } from './dialog-loading-action.mjs';
|
|
11
11
|
|
|
12
|
-
function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText = 'Cancel', confirmText = 'Delete', undoText = 'Undo', emphasis = 'confirm', countdownSeconds = 5, loadingActions, onCancel, onConfirm, onUndo, }) {
|
|
12
|
+
function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText = 'Cancel', confirmText = 'Delete', undoText = 'Undo', emphasis = 'confirm', countdownSeconds = 5, loadingActions, loadingFullPage, onCancel, onConfirm, onUndo, }) {
|
|
13
13
|
const safeCountdownSeconds = Math.max(1, Math.floor(countdownSeconds));
|
|
14
14
|
const [pending, setPending] = React__default.useState(false);
|
|
15
15
|
const [remainingSeconds, setRemainingSeconds] = React__default.useState(safeCountdownSeconds);
|
|
@@ -18,7 +18,7 @@ function UndoableConfirmDialog({ open, onOpenChange, title, description, pending
|
|
|
18
18
|
const intervalRef = React__default.useRef(null);
|
|
19
19
|
const cancelButtonClass = emphasis === 'cancel' ? dangerButtonClass : secondaryButtonClass;
|
|
20
20
|
const confirmButtonClass = emphasis === 'cancel' ? secondaryButtonClass : dangerButtonClass;
|
|
21
|
-
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, onOpenChange });
|
|
21
|
+
const { dialogLoading, runDialogAction } = useDialogLoadingAction({ loadingActions, loadingFullPage, onOpenChange });
|
|
22
22
|
const clearTimers = React__default.useCallback(() => {
|
|
23
23
|
if (timeoutRef.current) {
|
|
24
24
|
window.clearTimeout(timeoutRef.current);
|
|
@@ -84,9 +84,9 @@ function UndoableConfirmDialog({ open, onOpenChange, title, description, pending
|
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
onOpenChange(nextOpen);
|
|
87
|
-
}, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, 'border-red-300 dark:border-red-700'), overlayClassName: dialogThemedOverlayClass, onOverlayClick: pending ? undefined : handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: "inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-red-100 text-red-600 ring-1 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-900", children: pending ? jsx(Trash2Icon, { className: "size-5" }) : jsx(CircleAlertIcon, { className: "size-5" }) }), jsx("span", { className:
|
|
87
|
+
}, children: jsxs(AlertDialogContent, { className: cn(dialogContentClass, 'border-red-300 dark:border-red-700'), overlayClassName: dialogThemedOverlayClass, onOverlayClick: pending ? undefined : handleClose, children: [jsxs("div", { className: dialogHeaderClass, children: [jsx(AlertDialogTitle, { asChild: true, children: jsxs("div", { className: dialogTitleClass, children: [jsx("span", { className: "inline-flex size-9 shrink-0 items-center justify-center rounded-full bg-red-100 text-red-600 ring-1 ring-red-200 dark:bg-red-950 dark:text-red-300 dark:ring-red-900", children: pending ? jsx(Trash2Icon, { className: "size-5" }) : jsx(CircleAlertIcon, { className: "size-5" }) }), jsx("span", { className: dialogTitleTextClass, children: displayTitle })] }) }), jsx("button", { type: "button", className: closeButtonClass, onClick: handleClose, "aria-label": "Close", disabled: confirming, children: jsx(XIcon, { className: "size-4" }) })] }), jsx(AlertDialogDescription, { className: cn(dialogDescriptionClass, 'min-h-[44px]'), children: jsx("span", { children: displayDescription }) }), jsx("div", { className: "flex h-12 items-center justify-center py-1", children: jsxs("div", { className: "flex items-baseline justify-center gap-2", children: [jsx("span", { className: cn('text-4xl font-black leading-none tabular-nums', pending && 'animate-bounce', themeIconColor), children: pending ? remainingSeconds : safeCountdownSeconds }), jsx("span", { className: cn('text-sm font-bold', themeIconColor), children: "s" })] }) }), jsx("div", { className: cn(dialogFooterClass, 'min-h-[88px] sm:min-h-10 sm:items-center'), children: pending ? (jsxs("button", { type: "button", onClick: () => {
|
|
88
88
|
void handleUndo();
|
|
89
|
-
}, className: secondaryButtonClass, disabled: confirming, children: [jsx(Undo2Icon, { className: "mr-1.5 size-4" }), undoText] })) : (jsxs(Fragment, { children: [jsx("button", { type: "button", onClick: handleCancel, className: cancelButtonClass, children: cancelText }), jsx("button", { type: "button", onClick: startCountdown, className: confirmButtonClass, children: confirmText })] })) })] }) }), dialogLoading] }));
|
|
89
|
+
}, className: cn(secondaryButtonClass, 'w-full sm:w-auto'), disabled: confirming, children: [jsx(Undo2Icon, { className: "mr-1.5 size-4" }), undoText] })) : (jsxs(Fragment, { children: [jsx("button", { type: "button", onClick: handleCancel, className: cn(cancelButtonClass, 'w-full sm:w-auto'), children: cancelText }), jsx("button", { type: "button", onClick: startCountdown, className: cn(confirmButtonClass, 'w-full sm:w-auto'), children: confirmText })] })) })] }) }), dialogLoading] }));
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
export { UndoableConfirmDialog };
|