@windrun-huaiin/third-ui 29.2.1 → 30.1.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.
Files changed (121) hide show
  1. package/dist/fuma/fuma-page-genarator.d.ts +2 -6
  2. package/dist/fuma/fuma-page-genarator.js +3 -2
  3. package/dist/fuma/fuma-page-genarator.mjs +3 -2
  4. package/dist/fuma/mdx/cheet-table.d.ts +13 -0
  5. package/dist/fuma/mdx/cheet-table.js +295 -0
  6. package/dist/fuma/mdx/cheet-table.mjs +293 -0
  7. package/dist/fuma/mdx/index.d.ts +1 -0
  8. package/dist/fuma/mdx/index.js +2 -0
  9. package/dist/fuma/mdx/index.mjs +1 -0
  10. package/dist/fuma/server/features/widgets.js +2 -0
  11. package/dist/fuma/server/features/widgets.mjs +2 -0
  12. package/dist/lib/fuma-schema-check-util.d.ts +1 -1
  13. package/dist/main/404-page.d.ts +12 -0
  14. package/dist/main/404-page.js +66 -0
  15. package/dist/main/404-page.mjs +64 -0
  16. package/dist/main/alert-dialog/confirm-dialog.js +1 -1
  17. package/dist/main/alert-dialog/confirm-dialog.mjs +2 -2
  18. package/dist/main/alert-dialog/dialog-loading-action.js +5 -2
  19. package/dist/main/alert-dialog/dialog-loading-action.mjs +5 -2
  20. package/dist/main/alert-dialog/dialog-styles.d.ts +4 -2
  21. package/dist/main/alert-dialog/dialog-styles.js +8 -4
  22. package/dist/main/alert-dialog/dialog-styles.mjs +7 -5
  23. package/dist/main/alert-dialog/high-priority-confirm-dialog.js +5 -5
  24. package/dist/main/alert-dialog/high-priority-confirm-dialog.mjs +6 -6
  25. package/dist/main/alert-dialog/info-dialog.js +1 -1
  26. package/dist/main/alert-dialog/info-dialog.mjs +2 -2
  27. package/dist/main/alert-dialog/undoable-confirm-dialog.js +2 -2
  28. package/dist/main/alert-dialog/undoable-confirm-dialog.mjs +3 -3
  29. package/dist/main/anime/anime-404-page.d.ts +14 -0
  30. package/dist/main/anime/anime-404-page.js +197 -0
  31. package/dist/main/anime/anime-404-page.mjs +195 -0
  32. package/dist/main/anime/anime-beam-frame.d.ts +3 -0
  33. package/dist/main/anime/anime-beam-frame.js +63 -0
  34. package/dist/main/anime/anime-beam-frame.mjs +61 -0
  35. package/dist/main/anime/anime-not-found-page.d.ts +7 -0
  36. package/dist/main/anime/anime-not-found-page.js +142 -0
  37. package/dist/main/anime/anime-not-found-page.mjs +140 -0
  38. package/dist/main/anime/anime-spiral-loading.d.ts +10 -0
  39. package/dist/main/anime/anime-spiral-loading.js +77 -0
  40. package/dist/main/anime/anime-spiral-loading.mjs +75 -0
  41. package/dist/main/anime/index.d.ts +3 -0
  42. package/dist/main/anime/index.js +12 -0
  43. package/dist/main/anime/index.mjs +4 -0
  44. package/dist/main/beam-frame/animate.d.ts +3 -0
  45. package/dist/main/beam-frame/animate.js +63 -0
  46. package/dist/main/beam-frame/animate.mjs +61 -0
  47. package/dist/main/beam-frame/beam-frame.d.ts +4 -0
  48. package/dist/main/beam-frame/beam-frame.js +262 -0
  49. package/dist/main/beam-frame/beam-frame.mjs +258 -0
  50. package/dist/main/beam-frame/index.d.ts +4 -0
  51. package/dist/main/beam-frame/index.js +11 -0
  52. package/dist/main/beam-frame/index.mjs +3 -0
  53. package/dist/main/beam-frame/motion.d.ts +3 -0
  54. package/dist/main/beam-frame/motion.js +61 -0
  55. package/dist/main/beam-frame/motion.mjs +59 -0
  56. package/dist/main/beam-frame/share-config.d.ts +54 -0
  57. package/dist/main/beam-frame/share-config.js +161 -0
  58. package/dist/main/beam-frame/share-config.mjs +152 -0
  59. package/dist/main/beam-frame-config.d.ts +54 -0
  60. package/dist/main/beam-frame-config.js +161 -0
  61. package/dist/main/beam-frame-config.mjs +152 -0
  62. package/dist/main/calendar/random-date-range-dialog.js +177 -51
  63. package/dist/main/calendar/random-date-range-dialog.mjs +178 -52
  64. package/dist/main/cta.js +17 -1
  65. package/dist/main/cta.mjs +18 -2
  66. package/dist/main/delayed-img.d.ts +1 -1
  67. package/dist/main/delayed-img.js +8 -5
  68. package/dist/main/delayed-img.mjs +8 -5
  69. package/dist/main/index.d.ts +1 -0
  70. package/dist/main/index.js +2 -0
  71. package/dist/main/index.mjs +1 -0
  72. package/dist/main/info-tooltip.js +70 -9
  73. package/dist/main/info-tooltip.mjs +70 -9
  74. package/dist/main/loading-frame/index.d.ts +1 -0
  75. package/dist/main/loading.d.ts +2 -1
  76. package/dist/main/loading.js +64 -26
  77. package/dist/main/loading.mjs +64 -26
  78. package/dist/main/motion/creative-left-panel.d.ts +7 -0
  79. package/dist/main/motion/creative-left-panel.js +11 -0
  80. package/dist/main/motion/creative-left-panel.mjs +9 -0
  81. package/dist/main/motion/creative-right-panel.d.ts +7 -0
  82. package/dist/main/motion/creative-right-panel.js +11 -0
  83. package/dist/main/motion/creative-right-panel.mjs +9 -0
  84. package/dist/main/motion/index.d.ts +1 -0
  85. package/dist/main/motion/index.js +9 -0
  86. package/dist/main/motion/index.mjs +2 -0
  87. package/dist/main/motion/motion-beam-frame.d.ts +3 -0
  88. package/dist/main/motion/motion-beam-frame.js +61 -0
  89. package/dist/main/motion/motion-beam-frame.mjs +59 -0
  90. package/dist/main/snake-loading-frame.d.ts +7 -3
  91. package/dist/main/snake-loading-frame.js +45 -252
  92. package/dist/main/snake-loading-frame.mjs +47 -254
  93. package/package.json +16 -5
  94. package/src/fuma/fuma-page-genarator.tsx +2 -22
  95. package/src/fuma/mdx/cheet-table.tsx +650 -0
  96. package/src/fuma/mdx/index.ts +1 -0
  97. package/src/fuma/server/features/widgets.tsx +2 -0
  98. package/src/main/404-page.tsx +162 -0
  99. package/src/main/alert-dialog/confirm-dialog.tsx +2 -1
  100. package/src/main/alert-dialog/dialog-loading-action.tsx +7 -5
  101. package/src/main/alert-dialog/dialog-styles.ts +13 -3
  102. package/src/main/alert-dialog/high-priority-confirm-dialog.tsx +26 -23
  103. package/src/main/alert-dialog/info-dialog.tsx +2 -1
  104. package/src/main/alert-dialog/undoable-confirm-dialog.tsx +18 -17
  105. package/src/main/anime/anime-404-page.tsx +344 -0
  106. package/src/main/anime/anime-beam-frame.tsx +128 -0
  107. package/src/main/anime/anime-spiral-loading.tsx +123 -0
  108. package/src/main/anime/index.ts +10 -0
  109. package/src/main/beam-frame-config.tsx +341 -0
  110. package/src/main/calendar/random-date-range-dialog.tsx +225 -69
  111. package/src/main/cta.tsx +50 -21
  112. package/src/main/delayed-img.tsx +9 -4
  113. package/src/main/index.ts +1 -0
  114. package/src/main/info-tooltip.tsx +116 -20
  115. package/src/main/loading-frame/index.ts +4 -0
  116. package/src/main/loading.tsx +75 -24
  117. package/src/main/motion/index.ts +8 -0
  118. package/src/main/motion/motion-beam-frame.tsx +137 -0
  119. package/src/main/snake-loading-frame.tsx +95 -496
  120. package/src/styles/cta.css +21 -4
  121. package/src/styles/third-ui.css +0 -20
@@ -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 dialogDescriptionClass = "mt-3 text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300";
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 dialogDescriptionClass = 'mt-3 text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300';
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 dialogDescriptionClass = 'mt-3 text-sm font-medium leading-relaxed text-neutral-600 dark:text-neutral-300';
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 };
@@ -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: "min-w-0 truncate", 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("div", { className: dialogStyles.dialogDescriptionClass, children: description }), jsxRuntime.jsxs("div", { className: dialogStyles.dialogFooterClass, 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] }));
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,7 +4,7 @@ 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, dialogFooterClass, secondaryButtonClass, primaryButtonClass, highPrioritySurfaceClass } from './dialog-styles.mjs';
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
 
@@ -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: "min-w-0 truncate", children: title })] }), jsx("button", { type: "button", className: closeButtonClass, onClick: handleClose, "aria-label": "Close", children: jsx(XIcon, { className: "size-4" }) })] }), jsx("div", { className: dialogDescriptionClass, children: description }), jsxs("div", { className: dialogFooterClass, 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] }));
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 };
@@ -43,7 +43,7 @@ function InfoDialog({ open, onOpenChange, type = 'info', title, description, con
43
43
  const Icon = typeClass.Icon;
44
44
  const handleClose = () => onOpenChange(false);
45
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: "min-w-0 truncate", 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: () => {
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 = {
@@ -41,7 +41,7 @@ function InfoDialog({ open, onOpenChange, type = 'info', title, description, con
41
41
  const Icon = typeClass.Icon;
42
42
  const handleClose = () => onOpenChange(false);
43
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: "min-w-0 truncate", 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: () => {
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
  }
@@ -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: "min-w-0 truncate", 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: () => {
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,7 +6,7 @@ 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
12
  function UndoableConfirmDialog({ open, onOpenChange, title, description, pendingTitle, pendingDescription, cancelText = 'Cancel', confirmText = 'Delete', undoText = 'Undo', emphasis = 'confirm', countdownSeconds = 5, loadingActions, loadingFullPage, onCancel, onConfirm, onUndo, }) {
@@ -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: "min-w-0 truncate", 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: () => {
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 };
@@ -0,0 +1,14 @@
1
+ import { type SupportedThemeColor } from '@windrun-huaiin/base-ui/lib';
2
+ import { type ReactNode } from 'react';
3
+ export interface AnimeNotFoundPageProps {
4
+ siteIcon: ReactNode;
5
+ homeUrl?: string;
6
+ className?: string;
7
+ compact?: boolean;
8
+ themeClass?: SupportedThemeColor;
9
+ themeColor?: string;
10
+ ambientAnimated?: boolean;
11
+ doorOpen?: boolean;
12
+ onDoorOpenChange?: (open: boolean) => void;
13
+ }
14
+ export declare function AnimeNotFoundPage({ siteIcon, homeUrl, className, compact, themeClass, themeColor, ambientAnimated, doorOpen, onDoorOpenChange, }: AnimeNotFoundPageProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,197 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var lib = require('@windrun-huaiin/base-ui/lib');
6
+ var utils = require('@windrun-huaiin/lib/utils');
7
+ var animejs = require('animejs');
8
+ var react = require('motion/react');
9
+ var React = require('react');
10
+
11
+ const THEME_BG_CLASS_MAP = {
12
+ 'text-purple-500': 'bg-purple-500/20',
13
+ 'text-orange-500': 'bg-orange-500/20',
14
+ 'text-indigo-500': 'bg-indigo-500/20',
15
+ 'text-emerald-500': 'bg-emerald-500/20',
16
+ 'text-rose-500': 'bg-rose-500/20',
17
+ };
18
+ const dust = Array.from({ length: 10 }, (_, index) => ({
19
+ id: index,
20
+ left: `${12 + index * 8}%`,
21
+ top: `${18 + (index % 5) * 13}%`,
22
+ size: 3 + (index % 3),
23
+ }));
24
+ function AnimeNotFoundPage({ siteIcon, homeUrl = process.env.NEXT_PUBLIC_BASE_URL || '/', className, compact = false, themeClass, themeColor, ambientAnimated = true, doorOpen, onDoorOpenChange, }) {
25
+ const rootRef = React.useRef(null);
26
+ const timelineRef = React.useRef(null);
27
+ const shimmerRef = React.useRef(null);
28
+ const doorAnimationRef = React.useRef(null);
29
+ const lightAnimationRef = React.useRef(null);
30
+ const handleAnimationRef = React.useRef(null);
31
+ const messageAnimationRef = React.useRef(null);
32
+ const isDoorOpenRef = React.useRef(doorOpen !== null && doorOpen !== void 0 ? doorOpen : false);
33
+ const prefersReducedMotion = react.useReducedMotion();
34
+ const activeThemeClass = themeClass !== null && themeClass !== void 0 ? themeClass : lib.themeIconColor;
35
+ const activeGradientClass = themeClass ? lib.THEME_BUTTON_GRADIENT_CLASS_MAP[themeClass] : lib.themeButtonGradientClass;
36
+ const activeBgClass = themeClass ? THEME_BG_CLASS_MAP[themeClass] : lib.themeBgColor;
37
+ const doorStyle = React.useMemo(() => ({
38
+ '--not-found-theme': themeColor !== null && themeColor !== void 0 ? themeColor : lib.themeSvgIconColor,
39
+ }), [themeColor]);
40
+ React.useEffect(() => {
41
+ var _a, _b;
42
+ const root = rootRef.current;
43
+ if (!root || prefersReducedMotion) {
44
+ return undefined;
45
+ }
46
+ const door = root.querySelector('[data-not-found-door]');
47
+ const light = root.querySelector('[data-not-found-light]');
48
+ const message = root.querySelector('[data-not-found-message]');
49
+ const plate = root.querySelector('[data-not-found-plate]');
50
+ const handle = root.querySelector('[data-not-found-handle]');
51
+ const dustNodes = Array.from(root.querySelectorAll('[data-not-found-dust]'));
52
+ if (!door || !light || !plate || !handle) {
53
+ return undefined;
54
+ }
55
+ door.style.transform = 'rotateY(-2deg) translateX(0)';
56
+ light.style.opacity = '0.2';
57
+ light.style.transform = 'scaleX(0.78)';
58
+ if (message) {
59
+ message.style.opacity = '0';
60
+ message.style.transform = 'translateY(8px)';
61
+ }
62
+ (_a = timelineRef.current) === null || _a === void 0 ? void 0 : _a.revert();
63
+ (_b = shimmerRef.current) === null || _b === void 0 ? void 0 : _b.revert();
64
+ timelineRef.current = null;
65
+ shimmerRef.current = null;
66
+ if (ambientAnimated) {
67
+ timelineRef.current = animejs.createTimeline({ loop: true })
68
+ .add(plate, {
69
+ translateY: [0, -3, 0],
70
+ scale: [1, 1.025, 1],
71
+ duration: 1400,
72
+ ease: 'inOutSine',
73
+ })
74
+ .add(plate, {
75
+ translateY: [0, -3, 0],
76
+ scale: [1, 1.025, 1],
77
+ duration: 1400,
78
+ ease: 'inOutSine',
79
+ }, '+=900')
80
+ .add(dustNodes, {
81
+ opacity: [0, 0.72, 0],
82
+ translateY: [14, -18],
83
+ translateX: (_target, index) => (index % 2 === 0 ? 10 : -10),
84
+ scale: [0.4, 1, 0.6],
85
+ duration: 1800,
86
+ delay: animejs.stagger(80),
87
+ ease: 'outSine',
88
+ }, '<+=200');
89
+ shimmerRef.current = animejs.animate(root.querySelectorAll('[data-not-found-shimmer]'), {
90
+ translateX: ['-120%', '120%'],
91
+ opacity: [0, 0.8, 0],
92
+ duration: 2400,
93
+ delay: animejs.stagger(160),
94
+ ease: 'inOutSine',
95
+ loop: true,
96
+ });
97
+ }
98
+ return () => {
99
+ var _a, _b, _c, _d, _e, _f;
100
+ (_a = timelineRef.current) === null || _a === void 0 ? void 0 : _a.revert();
101
+ timelineRef.current = null;
102
+ (_b = shimmerRef.current) === null || _b === void 0 ? void 0 : _b.revert();
103
+ shimmerRef.current = null;
104
+ (_c = doorAnimationRef.current) === null || _c === void 0 ? void 0 : _c.revert();
105
+ doorAnimationRef.current = null;
106
+ (_d = lightAnimationRef.current) === null || _d === void 0 ? void 0 : _d.revert();
107
+ lightAnimationRef.current = null;
108
+ (_e = handleAnimationRef.current) === null || _e === void 0 ? void 0 : _e.revert();
109
+ handleAnimationRef.current = null;
110
+ (_f = messageAnimationRef.current) === null || _f === void 0 ? void 0 : _f.revert();
111
+ messageAnimationRef.current = null;
112
+ };
113
+ }, [ambientAnimated, prefersReducedMotion]);
114
+ const setDoorOpen = React.useCallback((nextOpen) => {
115
+ var _a, _b, _c, _d;
116
+ const root = rootRef.current;
117
+ if (!root) {
118
+ return;
119
+ }
120
+ const door = root.querySelector('[data-not-found-door]');
121
+ const light = root.querySelector('[data-not-found-light]');
122
+ const handle = root.querySelector('[data-not-found-handle]');
123
+ const message = root.querySelector('[data-not-found-message]');
124
+ if (!door || !light || !handle) {
125
+ return;
126
+ }
127
+ isDoorOpenRef.current = nextOpen;
128
+ (_a = doorAnimationRef.current) === null || _a === void 0 ? void 0 : _a.pause();
129
+ (_b = lightAnimationRef.current) === null || _b === void 0 ? void 0 : _b.pause();
130
+ (_c = handleAnimationRef.current) === null || _c === void 0 ? void 0 : _c.pause();
131
+ (_d = messageAnimationRef.current) === null || _d === void 0 ? void 0 : _d.pause();
132
+ doorAnimationRef.current = null;
133
+ lightAnimationRef.current = null;
134
+ handleAnimationRef.current = null;
135
+ messageAnimationRef.current = null;
136
+ if (prefersReducedMotion) {
137
+ door.style.transform = nextOpen ? 'rotateY(-72deg) translateX(-12px)' : 'rotateY(-2deg) translateX(0)';
138
+ light.style.opacity = nextOpen ? '0.8' : '0.2';
139
+ light.style.transform = nextOpen ? 'scaleX(1.28)' : 'scaleX(0.78)';
140
+ if (message) {
141
+ message.style.opacity = nextOpen ? '1' : '0';
142
+ message.style.transform = nextOpen ? 'translateY(0)' : 'translateY(8px)';
143
+ }
144
+ return;
145
+ }
146
+ doorAnimationRef.current = animejs.animate(door, {
147
+ rotateY: nextOpen ? -72 : -2,
148
+ translateX: nextOpen ? -12 : 0,
149
+ duration: 1050,
150
+ ease: 'inOutCubic',
151
+ });
152
+ lightAnimationRef.current = animejs.animate(light, {
153
+ opacity: nextOpen ? 0.8 : 0.2,
154
+ scaleX: nextOpen ? 1.28 : 0.78,
155
+ duration: 1050,
156
+ ease: 'inOutSine',
157
+ });
158
+ handleAnimationRef.current = animejs.animate(handle, {
159
+ scale: [1, 1.05, 1],
160
+ duration: 520,
161
+ ease: 'inOutSine',
162
+ });
163
+ if (message) {
164
+ messageAnimationRef.current = animejs.animate(message, {
165
+ opacity: nextOpen ? [0, 1] : [1, 0],
166
+ translateY: nextOpen ? [10, 0] : [0, 4, 10],
167
+ scale: nextOpen ? [0.96, 1] : [1, 0.98],
168
+ duration: nextOpen ? 620 : 520,
169
+ delay: nextOpen ? 320 : 280,
170
+ ease: nextOpen ? 'outCubic' : 'inOutSine',
171
+ });
172
+ }
173
+ }, [prefersReducedMotion]);
174
+ React.useEffect(() => {
175
+ if (doorOpen === undefined || doorOpen === isDoorOpenRef.current) {
176
+ return;
177
+ }
178
+ setDoorOpen(doorOpen);
179
+ }, [doorOpen, setDoorOpen]);
180
+ const toggleDoor = () => {
181
+ const nextOpen = !isDoorOpenRef.current;
182
+ if (doorOpen !== undefined) {
183
+ onDoorOpenChange === null || onDoorOpenChange === void 0 ? void 0 : onDoorOpenChange(nextOpen);
184
+ return;
185
+ }
186
+ setDoorOpen(nextOpen);
187
+ onDoorOpenChange === null || onDoorOpenChange === void 0 ? void 0 : onDoorOpenChange(nextOpen);
188
+ };
189
+ return (jsxRuntime.jsxs("div", { ref: rootRef, className: utils.cn('relative flex w-full items-center justify-center overflow-hidden px-4 py-8', compact ? 'h-full min-h-full' : 'min-h-dvh', className), style: doorStyle, children: [jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 -z-10 bg-[radial-gradient(circle_at_50%_20%,rgba(255,255,255,0.75),transparent_34%),linear-gradient(180deg,rgba(250,250,250,0.96),rgba(244,244,245,0.72))] dark:bg-[radial-gradient(circle_at_50%_20%,rgba(255,255,255,0.08),transparent_34%),linear-gradient(180deg,rgba(24,24,27,0.96),rgba(9,9,11,0.92))]" }), jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-x-0 bottom-0 -z-10 h-1/2 bg-[linear-gradient(180deg,transparent,rgba(0,0,0,0.05))] dark:bg-[linear-gradient(180deg,transparent,rgba(0,0,0,0.34))]" }), jsxRuntime.jsxs("div", { className: "flex w-full max-w-3xl flex-col items-center gap-5", children: [jsxRuntime.jsx("section", { className: "text-center", children: jsxRuntime.jsx("h3", { className: utils.cn('whitespace-nowrap text-[clamp(2.15rem,8vw,3.4rem)] font-black leading-none tracking-normal bg-linear-to-r bg-clip-text text-transparent', activeGradientClass), children: "Page Not Found" }) }), jsxRuntime.jsx("section", { className: "flex w-full justify-center", children: jsxRuntime.jsxs("div", { className: "relative aspect-[0.78] w-full max-w-[270px] sm:max-w-[315px] md:max-w-[330px] perspective-distant", children: [jsxRuntime.jsx("div", { "data-not-found-light": "", className: "absolute left-[14%] top-[7%] h-[86%] w-[72%] rounded-[28px] bg-[radial-gradient(circle_at_50%_45%,rgba(255,255,255,0.96),color-mix(in_srgb,var(--not-found-theme)_42%,transparent)_42%,transparent_72%)] opacity-25 blur-xl" }), jsxRuntime.jsx("div", { className: "absolute inset-[4%] rounded-[32px] border border-black/10 bg-neutral-950/5 shadow-2xl shadow-black/10 dark:border-white/10 dark:bg-white/5" }), jsxRuntime.jsx("div", { className: "absolute inset-[8%] rounded-[26px] bg-[linear-gradient(180deg,rgba(255,255,255,0.88),rgba(228,228,231,0.86))] shadow-[inset_0_1px_0_rgba(255,255,255,0.85)] dark:bg-[linear-gradient(180deg,rgba(39,39,42,0.92),rgba(24,24,27,0.96))]" }), jsxRuntime.jsxs("p", { "data-not-found-message": "", className: "pointer-events-none absolute right-[16%] top-[29%] z-2 max-w-[46%] text-right text-sm font-medium leading-6 text-muted-foreground opacity-100", children: [jsxRuntime.jsx("span", { className: "block", children: "The page" }), jsxRuntime.jsx("span", { className: "block", children: "you're looking for" }), jsxRuntime.jsx("span", { className: "block", children: "doesn't exist" })] }), jsxRuntime.jsx("button", { type: "button", className: "absolute inset-[8%] z-1 rounded-[26px] outline-none focus-visible:ring-2 focus-visible:ring-(--not-found-theme)", "aria-label": "Toggle the 404 door", onClick: toggleDoor }), jsxRuntime.jsxs("div", { "data-not-found-door": "", className: "absolute inset-[8%] z-10 origin-left rounded-[26px] border border-black/10 bg-[linear-gradient(145deg,rgba(255,255,255,0.92),rgba(212,212,216,0.9))] shadow-2xl shadow-black/20 will-change-transform dark:border-white/10 dark:bg-[linear-gradient(145deg,rgba(63,63,70,0.96),rgba(24,24,27,0.98))]", children: [jsxRuntime.jsxs("div", { className: "absolute inset-4 overflow-hidden rounded-[20px]", children: [jsxRuntime.jsx("div", { "data-not-found-shimmer": "", className: "absolute inset-y-0 w-1/3 -skew-x-12 bg-white/35 blur-md dark:bg-white/12" }), jsxRuntime.jsxs("a", { href: homeUrl, className: "absolute inset-x-5 bottom-5 flex h-[39%] flex-col items-center justify-center gap-2 rounded-2xl border border-black/10 bg-white/25 text-sm text-muted-foreground transition-opacity hover:opacity-80 dark:border-white/10 dark:bg-white/5", children: [jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-2", children: [siteIcon, jsxRuntime.jsx("span", { children: "Woops!" })] }), jsxRuntime.jsx("span", { className: utils.cn('text-xs font-semibold underline underline-offset-4', activeThemeClass, 'decoration-current'), children: "Back to Homepage" })] })] }), jsxRuntime.jsxs("div", { "data-not-found-plate": "", className: "absolute left-1/2 top-[18%] flex h-[88px] w-[156px] -translate-x-1/2 items-center justify-center overflow-hidden rounded-2xl border border-black/10 bg-white/86 shadow-lg shadow-black/10 dark:border-white/10 dark:bg-black/30", children: [jsxRuntime.jsx("div", { "data-not-found-shimmer": "", className: "absolute inset-y-0 w-1/2 -skew-x-12 bg-white/60 blur-md dark:bg-white/15" }), jsxRuntime.jsx("span", { className: utils.cn('relative text-5xl font-black tabular-nums bg-linear-to-r bg-clip-text text-transparent', activeGradientClass), children: "404" })] }), jsxRuntime.jsx("button", { type: "button", "data-not-found-handle": "", className: "group absolute right-[1%] top-[39%] z-10 flex size-12 items-center justify-center rounded-full outline-none ring-offset-2 transition-transform hover:scale-105 focus-visible:ring-2 focus-visible:ring-(--not-found-theme)", "aria-label": "Toggle the 404 door", onClick: toggleDoor, children: jsxRuntime.jsxs("span", { className: "relative grid h-8 w-6 place-items-center rounded-full border border-black/10 bg-white/50 shadow-inner shadow-black/10 backdrop-blur-sm transform-[rotateY(18deg)] dark:border-white/15 dark:bg-black/25", children: [jsxRuntime.jsx("span", { className: "absolute size-10 rounded-full bg-(--not-found-theme) opacity-0 blur-md transition-opacity duration-300 group-hover:opacity-25" }), jsxRuntime.jsx("span", { className: "relative grid size-4 place-items-center rounded-full border border-black/10 bg-(--not-found-theme) shadow-lg shadow-black/25 dark:border-white/15", children: jsxRuntime.jsx("span", { className: "absolute right-1 top-1 size-1 rounded-full bg-white/75" }) })] }) })] }), dust.map(dot => (jsxRuntime.jsx("span", { "data-not-found-dust": "", className: utils.cn('absolute rounded-full opacity-0', activeBgClass), style: {
190
+ left: dot.left,
191
+ top: dot.top,
192
+ width: dot.size,
193
+ height: dot.size,
194
+ } }, dot.id)))] }) })] })] }));
195
+ }
196
+
197
+ exports.AnimeNotFoundPage = AnimeNotFoundPage;