@owp/core 2.5.4 → 2.5.5

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 (149) hide show
  1. package/dist/_virtual/index10.js +2 -2
  2. package/dist/_virtual/index11.js +2 -2
  3. package/dist/_virtual/index12.js +2 -2
  4. package/dist/_virtual/index13.js +2 -2
  5. package/dist/_virtual/index15.js +2 -2
  6. package/dist/_virtual/index16.js +4 -4
  7. package/dist/_virtual/index17.js +4 -4
  8. package/dist/_virtual/index18.js +4 -4
  9. package/dist/_virtual/index19.js +4 -4
  10. package/dist/_virtual/index5.js +2 -2
  11. package/dist/components/OwpPageSkeleton/OwpPageSkeleton.js +4 -4
  12. package/dist/components/OwpTable/OwpDataTable.js +293 -327
  13. package/dist/components/OwpTable/OwpDataTable.js.map +1 -1
  14. package/dist/components/OwpTable/OwpTable.js +102 -117
  15. package/dist/components/OwpTable/OwpTable.js.map +1 -1
  16. package/dist/components/OwpTable/internal/defaultTableStyle.js +50 -0
  17. package/dist/components/OwpTable/internal/defaultTableStyle.js.map +1 -0
  18. package/dist/components/OwpTreeGrid/OwpTreeGrid.js +47 -45
  19. package/dist/components/OwpTreeGrid/OwpTreeGrid.js.map +1 -1
  20. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +179 -161
  21. package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js.map +1 -1
  22. package/dist/contexts/OwpAppProvider.js.map +1 -1
  23. package/dist/features/themePreview/components/ThemePreviewCanvas.js +492 -0
  24. package/dist/features/themePreview/components/ThemePreviewCanvas.js.map +1 -0
  25. package/dist/features/themePreview/components/ThemePreviewCanvasSections.js +678 -0
  26. package/dist/features/themePreview/components/ThemePreviewCanvasSections.js.map +1 -0
  27. package/dist/features/themePreview/components/ThemePreviewColorField.js +301 -0
  28. package/dist/features/themePreview/components/ThemePreviewColorField.js.map +1 -0
  29. package/dist/features/themePreview/components/ThemePreviewControls.js +306 -0
  30. package/dist/features/themePreview/components/ThemePreviewControls.js.map +1 -0
  31. package/dist/features/themePreview/components/themePreviewCanvas.icons.js +17 -0
  32. package/dist/features/themePreview/components/themePreviewCanvas.icons.js.map +1 -0
  33. package/dist/features/themePreview/components/themePreviewCanvas.shared.js +296 -0
  34. package/dist/features/themePreview/components/themePreviewCanvas.shared.js.map +1 -0
  35. package/dist/features/themePreview/configs/grid.js +45 -0
  36. package/dist/features/themePreview/configs/grid.js.map +1 -0
  37. package/dist/features/themePreview/configs/presets.js +1106 -0
  38. package/dist/features/themePreview/configs/presets.js.map +1 -0
  39. package/dist/features/themePreview/configs/previewStorage.js +93 -0
  40. package/dist/features/themePreview/configs/previewStorage.js.map +1 -0
  41. package/dist/features/themePreview/configs/settings.js +148 -0
  42. package/dist/features/themePreview/configs/settings.js.map +1 -0
  43. package/dist/features/themePreview/configs/snackbar.js +39 -0
  44. package/dist/features/themePreview/configs/snackbar.js.map +1 -0
  45. package/dist/features/themePreview/configs/surface.js +10 -0
  46. package/dist/features/themePreview/configs/surface.js.map +1 -0
  47. package/dist/features/themePreview/configs/table.js +30 -0
  48. package/dist/features/themePreview/configs/table.js.map +1 -0
  49. package/dist/features/themePreview/defs/ThemePreviewGridDef.xml.js +43 -0
  50. package/dist/features/themePreview/defs/ThemePreviewGridDef.xml.js.map +1 -0
  51. package/dist/features/themePreview/defs/ThemePreviewReadonlyGridDef.xml.js +43 -0
  52. package/dist/features/themePreview/defs/ThemePreviewReadonlyGridDef.xml.js.map +1 -0
  53. package/dist/features/themePreview/dialogs/ThemePreviewDialog.js +429 -0
  54. package/dist/features/themePreview/dialogs/ThemePreviewDialog.js.map +1 -0
  55. package/dist/features/themePreview/hooks/useThemePreview.js +235 -0
  56. package/dist/features/themePreview/hooks/useThemePreview.js.map +1 -0
  57. package/dist/features/themePreview/utils/color.js +79 -0
  58. package/dist/features/themePreview/utils/color.js.map +1 -0
  59. package/dist/features/themePreview/utils/themePreviewDefinitions.js +526 -0
  60. package/dist/features/themePreview/utils/themePreviewDefinitions.js.map +1 -0
  61. package/dist/features/themePreview/utils/themePreviewExport.js +111 -0
  62. package/dist/features/themePreview/utils/themePreviewExport.js.map +1 -0
  63. package/dist/features/themePreview/utils/themePreviewSettings.js +211 -0
  64. package/dist/features/themePreview/utils/themePreviewSettings.js.map +1 -0
  65. package/dist/features/themePreview.js +75 -0
  66. package/dist/features/themePreview.js.map +1 -0
  67. package/dist/layout/components/logo/Logo.js +49 -45
  68. package/dist/layout/components/logo/Logo.js.map +1 -1
  69. package/dist/layout/components/toggles/NavigationSearchToggle.js +3 -3
  70. package/dist/layout/components/toggles/ThemePreviewToggle.js +51 -0
  71. package/dist/layout/components/toggles/ThemePreviewToggle.js.map +1 -0
  72. package/dist/layout/components/toolbar/ToolbarLayout.js +8 -6
  73. package/dist/layout/components/toolbar/ToolbarLayout.js.map +1 -1
  74. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/CheckCircleOutline.js +9 -0
  75. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/CheckCircleOutline.js.map +1 -0
  76. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/DownloadOutlined.js +9 -0
  77. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/DownloadOutlined.js.map +1 -0
  78. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/ErrorOutline.js +9 -0
  79. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/ErrorOutline.js.map +1 -0
  80. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/InfoOutlined.js +9 -0
  81. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/InfoOutlined.js.map +1 -0
  82. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/KeyboardArrowUpRounded.js +9 -0
  83. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/KeyboardArrowUpRounded.js.map +1 -0
  84. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/MenuRounded.js +9 -0
  85. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/MenuRounded.js.map +1 -0
  86. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/NotificationsNoneOutlined.js +9 -0
  87. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/NotificationsNoneOutlined.js.map +1 -0
  88. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/PaletteOutlined.js +25 -0
  89. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/PaletteOutlined.js.map +1 -0
  90. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/RestoreOutlined.js +9 -0
  91. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/RestoreOutlined.js.map +1 -0
  92. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/SaveOutlined.js +9 -0
  93. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/SaveOutlined.js.map +1 -0
  94. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/SpaceDashboardOutlined.js +9 -0
  95. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/SpaceDashboardOutlined.js.map +1 -0
  96. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/UploadFileOutlined.js +9 -0
  97. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/UploadFileOutlined.js.map +1 -0
  98. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/WarningAmberRounded.js +9 -0
  99. package/dist/node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/WarningAmberRounded.js.map +1 -0
  100. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
  101. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/index.js +1 -1
  102. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE39/index.js +1 -1
  103. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/index.js +1 -1
  104. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/index.js +1 -1
  105. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/GenericBarcode/index.js +1 -1
  106. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
  107. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/index.js +1 -1
  108. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/MSI/index.js +1 -1
  109. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/codabar/index.js +1 -1
  110. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/pharmacode/index.js +1 -1
  111. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/renderers/index.js +1 -1
  112. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.js +1 -1
  113. package/dist/node_modules/.pnpm/react-overlays@5.2.1_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/react-overlays/esm/Portal.js +1 -1
  114. package/dist/owp-app.css +1 -1
  115. package/dist/types/components/OwpTable/internal/defaultTableStyle.d.ts +49 -0
  116. package/dist/types/components/OwpTreeGrid/OwpTreeGrid.d.ts +2 -1
  117. package/dist/types/components/OwpTreeGrid/internal/treeGridRuntime.d.ts +6 -1
  118. package/dist/types/contexts/OwpAppProvider.d.ts +2 -0
  119. package/dist/types/features/themePreview/components/ThemePreviewCanvas.d.ts +8 -0
  120. package/dist/types/features/themePreview/components/ThemePreviewCanvasSections.d.ts +82 -0
  121. package/dist/types/features/themePreview/components/ThemePreviewColorField.d.ts +10 -0
  122. package/dist/types/features/themePreview/components/ThemePreviewControls.d.ts +18 -0
  123. package/dist/types/features/themePreview/components/index.d.ts +3 -0
  124. package/dist/types/features/themePreview/components/themePreviewCanvas.icons.d.ts +3 -0
  125. package/dist/types/features/themePreview/components/themePreviewCanvas.shared.d.ts +121 -0
  126. package/dist/types/features/themePreview/configs/grid.d.ts +41 -0
  127. package/dist/types/features/themePreview/configs/index.d.ts +7 -0
  128. package/dist/types/features/themePreview/configs/presets.d.ts +1153 -0
  129. package/dist/types/features/themePreview/configs/previewStorage.d.ts +34 -0
  130. package/dist/types/features/themePreview/configs/settings.d.ts +271 -0
  131. package/dist/types/features/themePreview/configs/snackbar.d.ts +43 -0
  132. package/dist/types/features/themePreview/configs/surface.d.ts +6 -0
  133. package/dist/types/features/themePreview/configs/table.d.ts +47 -0
  134. package/dist/types/features/themePreview/dialogs/ThemePreviewDialog.d.ts +3 -0
  135. package/dist/types/features/themePreview/dialogs/index.d.ts +1 -0
  136. package/dist/types/features/themePreview/hooks/index.d.ts +1 -0
  137. package/dist/types/features/themePreview/hooks/useThemePreview.d.ts +60 -0
  138. package/dist/types/features/themePreview/index.d.ts +6 -0
  139. package/dist/types/features/themePreview/types/index.d.ts +1 -0
  140. package/dist/types/features/themePreview/types/themePreview.d.ts +44 -0
  141. package/dist/types/features/themePreview/utils/color.d.ts +14 -0
  142. package/dist/types/features/themePreview/utils/index.d.ts +4 -0
  143. package/dist/types/features/themePreview/utils/themePreviewDefinitions.d.ts +10 -0
  144. package/dist/types/features/themePreview/utils/themePreviewExport.d.ts +1091 -0
  145. package/dist/types/features/themePreview/utils/themePreviewSettings.d.ts +54 -0
  146. package/dist/types/layout/components/toggles/ThemePreviewToggle.d.ts +5 -0
  147. package/features/themePreview.d.ts +3 -0
  148. package/features/themePreview.js +1 -0
  149. package/package.json +2 -1
@@ -0,0 +1,429 @@
1
+ var pe = Object.defineProperty;
2
+ var n = (a, r) => pe(a, "name", { value: r, configurable: !0 });
3
+ import { jsx as t, jsxs as f } from "../../../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
4
+ import { defaultSnackbarTheme as ve } from "../configs/snackbar.js";
5
+ import { themesConfig as ge } from "../configs/presets.js";
6
+ import { defaultSettingsConfig as we } from "../configs/settings.js";
7
+ import { useConfirm as xe } from "../../../hooks/useConfirm.js";
8
+ import { readZipEntryJson as Ce, saveAsZipFile as Se } from "../../../utils/zipUtil.js";
9
+ import Te from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/DownloadOutlined.js";
10
+ import Pe from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/RestoreOutlined.js";
11
+ import Ee from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/SaveOutlined.js";
12
+ import be from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/UploadFileOutlined.js";
13
+ import { Button as h, Typography as W, TextField as ye } from "@mui/material";
14
+ import { useDialogs as Ae } from "@toolpad/core/useDialogs";
15
+ import { enqueueSnackbar as d } from "notistack";
16
+ import { useState as _, useRef as m, useEffect as p } from "react";
17
+ import { useThemePreview as Le } from "../hooks/useThemePreview.js";
18
+ import { ThemePreviewControls as Fe } from "../components/ThemePreviewControls.js";
19
+ import { ThemePreviewCanvas as _e } from "../components/ThemePreviewCanvas.js";
20
+ import { resetThemePreviewSessionState as ke } from "../utils/themePreviewSettings.js";
21
+ import { createThemePreviewExportData as Ie } from "../utils/themePreviewExport.js";
22
+ import { OwpDialog as j } from "../../../components/OwpDialog/OwpDialog.js";
23
+ const Me = ge, De = ".owp,.zip,application/zip", V = 300 * 1e3, Ne = 2 * 1e3, Re = 15 * 1e3;
24
+ function Oe(a) {
25
+ return Object.entries(a).map(([r, u]) => ({
26
+ fileName: r,
27
+ blob: new Blob([JSON.stringify(u, null, 2)], {
28
+ type: "application/json"
29
+ })
30
+ }));
31
+ }
32
+ n(Oe, "createThemePreviewArchiveFiles");
33
+ function Ve(a) {
34
+ const r = a.trim().replace(/[^0-9A-Za-z가-힣 _-]+/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^[-_]+|[-_]+$/g, "");
35
+ return r ? `theme-preview-config-${r}` : "theme-preview-config";
36
+ }
37
+ n(Ve, "getThemePreviewConfigFileTitle");
38
+ const v = {
39
+ "&.MuiButton-root": {
40
+ fontSize: "1.3rem",
41
+ letterSpacing: "0.04rem"
42
+ },
43
+ "&.MuiButton-sizeSmall": {
44
+ fontSize: "1.3rem",
45
+ letterSpacing: "0.04rem",
46
+ minHeight: 42,
47
+ px: 2.25
48
+ },
49
+ "& .MuiButton-startIcon": {
50
+ mr: 0.75
51
+ },
52
+ fontWeight: 800,
53
+ lineHeight: 1.2,
54
+ minHeight: 42,
55
+ px: 2.25,
56
+ whiteSpace: "nowrap"
57
+ }, L = {
58
+ "&.Mui-disabled": {
59
+ backgroundColor: "#e5e7eb",
60
+ borderColor: "#e5e7eb",
61
+ color: "#a1a1aa"
62
+ },
63
+ "&:hover": {
64
+ backgroundColor: "#1696d5",
65
+ borderColor: "#1696d5"
66
+ },
67
+ backgroundColor: "#1ea3e6",
68
+ border: "1px solid #1ea3e6",
69
+ color: "#ffffff"
70
+ }, F = {
71
+ "&.Mui-disabled": {
72
+ backgroundColor: "#ffffff",
73
+ borderColor: "#d1d5db",
74
+ color: "#9ca3af"
75
+ },
76
+ "&:hover": {
77
+ backgroundColor: "#f8fafc",
78
+ borderColor: "#111827"
79
+ },
80
+ backgroundColor: "#ffffff",
81
+ border: "1px solid #111827",
82
+ color: "#111827"
83
+ }, We = "#111827", je = /* @__PURE__ */ n(({
84
+ open: a,
85
+ payload: r,
86
+ onClose: u
87
+ }) => {
88
+ const [g, S] = _((r == null ? void 0 : r.initialFileName) ?? "");
89
+ return /* @__PURE__ */ t(
90
+ j,
91
+ {
92
+ title: "설정파일 저장",
93
+ open: a,
94
+ maxWidth: "xs",
95
+ onClose: /* @__PURE__ */ n(() => u(void 0), "onClose"),
96
+ onConfirm: /* @__PURE__ */ n(() => u(g), "onConfirm"),
97
+ contentProps: {
98
+ sx: {
99
+ minWidth: 360,
100
+ p: 3
101
+ }
102
+ },
103
+ children: /* @__PURE__ */ f("div", { className: "flex flex-col gap-12", children: [
104
+ /* @__PURE__ */ t(
105
+ ye,
106
+ {
107
+ label: "저장 이름",
108
+ value: g,
109
+ placeholder: "저장 이름 입력",
110
+ onChange: /* @__PURE__ */ n((T) => {
111
+ S(T.target.value);
112
+ }, "onChange")
113
+ }
114
+ ),
115
+ /* @__PURE__ */ t(W, { variant: "body2", color: "text.secondary", children: "저장 확장자는 `.owp`로 고정됩니다." })
116
+ ] })
117
+ }
118
+ );
119
+ }, "ThemePreviewSaveDialog"), cn = /* @__PURE__ */ n(({
120
+ open: a,
121
+ payload: r,
122
+ onClose: u
123
+ }) => {
124
+ const [g, S] = _(""), [T, k] = _(!1), I = m(null), M = m(null), w = m(null), P = m(!1), D = m(Date.now()), N = m(!1), E = m(() => {
125
+ }), l = m(null), z = Ae(), { confirmSave: U } = xe(), {
126
+ activeSection: c,
127
+ canApplyToMain: B,
128
+ draftSettings: b,
129
+ hasTemporaryChanges: y,
130
+ hasTemporarySnapshot: H,
131
+ presetOptions: K,
132
+ selectedModes: Z,
133
+ selectedPresetKeys: q,
134
+ setActiveSection: J,
135
+ handlePaletteValueChange: $,
136
+ handlePaletteValuesChange: Y,
137
+ handleApplyToMain: G,
138
+ handleLoadSettings: Q,
139
+ handlePresetKeyChange: X,
140
+ handlePresetModeChange: ee,
141
+ handleReset: ne,
142
+ handleTemporaryLoad: te,
143
+ handleTemporarySave: x
144
+ } = Le({
145
+ initialSection: r == null ? void 0 : r.initialSection,
146
+ initialPresetKeys: {
147
+ main: "light1",
148
+ navbar: "light2",
149
+ toolbar: "surfaceDark"
150
+ },
151
+ presetThemes: Me,
152
+ resetTheme: we.theme
153
+ }), R = c === "main" || c === "navbar" || c === "toolbar", re = R ? Z[c] : "light", ie = R ? q[c] : "", o = /* @__PURE__ */ n(() => {
154
+ D.current = Date.now();
155
+ }, "handleThemePreviewInteraction"), oe = /* @__PURE__ */ n(async (e) => {
156
+ const i = Ie(b);
157
+ await Se(Oe(i), {
158
+ type: "application/json",
159
+ fileExtension: "json",
160
+ fileTitle: Ve(e),
161
+ archiveExtension: "owp"
162
+ });
163
+ }, "handleSaveConfigFiles"), ae = /* @__PURE__ */ n(async () => {
164
+ const e = await z.open(je, {
165
+ initialFileName: g
166
+ });
167
+ e !== void 0 && (S(e), await oe(e));
168
+ }, "handleOpenSaveDialog"), se = /* @__PURE__ */ n(() => {
169
+ var e;
170
+ (e = M.current) == null || e.click();
171
+ }, "handleOpenZipFile"), le = /* @__PURE__ */ n(() => {
172
+ x("manual"), d("임시 저장을 완료했습니다.", {
173
+ variant: "success"
174
+ });
175
+ }, "handleManualTemporarySave"), ce = /* @__PURE__ */ n(() => {
176
+ if (!te()) {
177
+ d("불러올 임시 저장 데이터가 없습니다.", {
178
+ variant: "warning"
179
+ });
180
+ return;
181
+ }
182
+ d("임시 저장 데이터를 불러왔습니다.", {
183
+ variant: "success"
184
+ });
185
+ }, "handleManualTemporaryLoad"), de = /* @__PURE__ */ n(async () => {
186
+ y && (await U({
187
+ title: "변경된 값을 저장하겠습니까?"
188
+ }) ? (x("manual"), d("임시 저장되었습니다. 다시 실행하면 저장된 데이터를 불러옵니다.", {
189
+ variant: "info"
190
+ })) : ke()), u(void 0);
191
+ }, "handleDialogClose"), me = /* @__PURE__ */ n(async (e) => {
192
+ var s, C;
193
+ const i = (s = e.target.files) == null ? void 0 : s[0];
194
+ if (i)
195
+ try {
196
+ const A = await Ce(
197
+ i,
198
+ (he) => he.endsWith("settings.json")
199
+ );
200
+ if (!A) {
201
+ d("settings.json 파일이 없습니다.", {
202
+ variant: "warning"
203
+ });
204
+ return;
205
+ }
206
+ const O = (C = A.defaultSettingsConfig) == null ? void 0 : C.theme, ue = A.defaultSnackbarTheme ?? ve;
207
+ if (!O) {
208
+ d("theme 설정을 읽지 못했습니다.", {
209
+ variant: "warning"
210
+ });
211
+ return;
212
+ }
213
+ Q(O, ue), d("설정 파일을 로드하고 메인 화면에 적용했습니다.", {
214
+ variant: "success"
215
+ });
216
+ } catch {
217
+ d("설정 파일을 불러오는 중 오류가 발생했습니다.", {
218
+ variant: "error"
219
+ });
220
+ } finally {
221
+ e.target.value = "";
222
+ }
223
+ }, "handleZipFileChange"), fe = /* @__PURE__ */ n((e) => {
224
+ e !== c && (l.current && (cancelAnimationFrame(l.current), l.current = null), k(!0), l.current = requestAnimationFrame(() => {
225
+ J(e), l.current = requestAnimationFrame(() => {
226
+ k(!1), l.current = null;
227
+ });
228
+ }));
229
+ }, "handleSectionChange");
230
+ return p(() => {
231
+ E.current = x;
232
+ }, [x]), p(() => {
233
+ N.current = y;
234
+ }, [y]), p(() => {
235
+ const e = I.current;
236
+ if (!e)
237
+ return;
238
+ const i = /* @__PURE__ */ n(() => {
239
+ P.current = !0, o();
240
+ }, "handlePointerDown"), s = /* @__PURE__ */ n(() => {
241
+ P.current = !1, o();
242
+ }, "handlePointerUp");
243
+ return e.addEventListener("pointerdown", i), e.addEventListener("pointerup", s), e.addEventListener("pointercancel", s), e.addEventListener("keydown", o), e.addEventListener("input", o), e.addEventListener("change", o), e.addEventListener("focusin", o), () => {
244
+ e.removeEventListener("pointerdown", i), e.removeEventListener("pointerup", s), e.removeEventListener("pointercancel", s), e.removeEventListener("keydown", o), e.removeEventListener("input", o), e.removeEventListener("change", o), e.removeEventListener("focusin", o);
245
+ };
246
+ }, []), p(() => {
247
+ const e = /* @__PURE__ */ n(() => {
248
+ w.current && (window.clearTimeout(w.current), w.current = null);
249
+ }, "clearAutoSaveTimeout"), i = /* @__PURE__ */ n((s) => {
250
+ e(), w.current = window.setTimeout(() => {
251
+ const C = P.current || Date.now() - D.current < Ne;
252
+ if (document.hidden || C) {
253
+ i(Re);
254
+ return;
255
+ }
256
+ E.current("auto"), i(V);
257
+ }, s);
258
+ }, "scheduleAutoSave");
259
+ return i(V), () => {
260
+ e();
261
+ };
262
+ }, []), p(() => {
263
+ const e = /* @__PURE__ */ n(() => {
264
+ N.current && E.current("manual");
265
+ }, "handlePageExit");
266
+ return window.addEventListener("pagehide", e), window.addEventListener("beforeunload", e), () => {
267
+ window.removeEventListener("pagehide", e), window.removeEventListener("beforeunload", e);
268
+ };
269
+ }, []), p(() => () => {
270
+ l.current && cancelAnimationFrame(l.current);
271
+ }, []), /* @__PURE__ */ t(
272
+ j,
273
+ {
274
+ title: /* @__PURE__ */ f("div", { className: "flex w-full flex-wrap items-center justify-between gap-12", children: [
275
+ /* @__PURE__ */ t(W, { variant: "h6", fontWeight: 700, sx: { color: We }, children: "OWP Theme Preview" }),
276
+ /* @__PURE__ */ f("div", { className: "flex flex-wrap items-center gap-8", children: [
277
+ /* @__PURE__ */ t(
278
+ h,
279
+ {
280
+ size: "small",
281
+ variant: "outlined",
282
+ sx: {
283
+ ...v,
284
+ ...F
285
+ },
286
+ onClick: ne,
287
+ children: "초기 상태로 초기화"
288
+ }
289
+ ),
290
+ /* @__PURE__ */ t(
291
+ h,
292
+ {
293
+ size: "small",
294
+ variant: "contained",
295
+ disabled: !B,
296
+ sx: {
297
+ ...v,
298
+ ...L
299
+ },
300
+ onClick: G,
301
+ children: "메인에 적용해보기"
302
+ }
303
+ )
304
+ ] })
305
+ ] }),
306
+ open: a,
307
+ maxWidth: "xl",
308
+ canConfirm: !1,
309
+ onClose: de,
310
+ actions: /* @__PURE__ */ f("div", { className: "grid min-w-0 flex-1 grid-cols-[1fr_auto_1fr] items-center gap-y-8", children: [
311
+ /* @__PURE__ */ f("div", { className: "flex flex-wrap items-center justify-start gap-8", children: [
312
+ /* @__PURE__ */ t(
313
+ h,
314
+ {
315
+ variant: "contained",
316
+ startIcon: /* @__PURE__ */ t(Ee, {}),
317
+ sx: {
318
+ ...v,
319
+ ...L
320
+ },
321
+ onClick: le,
322
+ children: "임시 저장하기"
323
+ }
324
+ ),
325
+ /* @__PURE__ */ t(
326
+ h,
327
+ {
328
+ variant: "outlined",
329
+ startIcon: /* @__PURE__ */ t(Pe, {}),
330
+ disabled: !H,
331
+ sx: {
332
+ ...v,
333
+ ...F
334
+ },
335
+ onClick: ce,
336
+ children: "임시 저장 불러오기"
337
+ }
338
+ )
339
+ ] }),
340
+ /* @__PURE__ */ f("div", { className: "flex flex-wrap items-center justify-center gap-8", children: [
341
+ /* @__PURE__ */ t(
342
+ h,
343
+ {
344
+ variant: "contained",
345
+ startIcon: /* @__PURE__ */ t(Te, {}),
346
+ sx: {
347
+ ...v,
348
+ ...L
349
+ },
350
+ onClick: ae,
351
+ children: "설정파일 저장하기"
352
+ }
353
+ ),
354
+ /* @__PURE__ */ t(
355
+ h,
356
+ {
357
+ variant: "outlined",
358
+ startIcon: /* @__PURE__ */ t(be, {}),
359
+ sx: {
360
+ ...v,
361
+ ...F
362
+ },
363
+ onClick: se,
364
+ children: "설정파일 불러오기"
365
+ }
366
+ )
367
+ ] }),
368
+ /* @__PURE__ */ t("div", {})
369
+ ] }),
370
+ slotProps: {
371
+ paper: {
372
+ sx: {
373
+ width: "min(1680px, calc(100vw - 48px))",
374
+ maxWidth: "none",
375
+ height: "calc(100vh - 48px)",
376
+ m: 3
377
+ }
378
+ }
379
+ },
380
+ contentProps: {
381
+ sx: {
382
+ height: "100%",
383
+ p: 3
384
+ }
385
+ },
386
+ children: /* @__PURE__ */ f("div", { ref: I, className: "flex h-full min-h-0 flex-col gap-12", children: [
387
+ /* @__PURE__ */ t(
388
+ "input",
389
+ {
390
+ ref: M,
391
+ type: "file",
392
+ accept: De,
393
+ className: "hidden",
394
+ onChange: me
395
+ }
396
+ ),
397
+ /* @__PURE__ */ f("div", { className: "grid min-h-0 flex-1 gap-20 xl:grid-cols-[420px_minmax(0,1fr)]", children: [
398
+ /* @__PURE__ */ t(
399
+ Fe,
400
+ {
401
+ activeSection: c,
402
+ presetOptions: K,
403
+ selectedMode: re,
404
+ selectedPresetKey: ie,
405
+ settings: b,
406
+ onSectionChange: fe,
407
+ onPaletteValueChange: $,
408
+ onPaletteValuesChange: Y,
409
+ onPresetKeyChange: X,
410
+ onPresetModeChange: ee
411
+ }
412
+ ),
413
+ /* @__PURE__ */ t(
414
+ _e,
415
+ {
416
+ activeSection: c,
417
+ isLoading: T,
418
+ settings: b
419
+ }
420
+ )
421
+ ] })
422
+ ] })
423
+ }
424
+ );
425
+ }, "ThemePreviewDialog");
426
+ export {
427
+ cn as ThemePreviewDialog
428
+ };
429
+ //# sourceMappingURL=ThemePreviewDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemePreviewDialog.js","sources":["../../../../src/features/themePreview/dialogs/ThemePreviewDialog.tsx"],"sourcesContent":["import { OwpDialog } from '@/components/OwpDialog';\nimport {\n defaultSnackbarTheme,\n type SnackbarTheme,\n} from '@/features/themePreview/configs/snackbar';\nimport themesConfig from '@/features/themePreview/configs/presets';\nimport { defaultSettingsConfig } from '@/features/themePreview/configs/settings';\nimport { useConfirm } from '@/hooks/useConfirm';\nimport { readZipEntryJson, saveAsZipFile } from '@/utils';\nimport DownloadOutlinedIcon from '@mui/icons-material/DownloadOutlined';\nimport RestoreOutlinedIcon from '@mui/icons-material/RestoreOutlined';\nimport SaveOutlinedIcon from '@mui/icons-material/SaveOutlined';\nimport UploadFileOutlinedIcon from '@mui/icons-material/UploadFileOutlined';\nimport { Button, TextField, Typography } from '@mui/material';\nimport { useDialogs, type DialogComponent, type DialogProps } from '@toolpad/core/useDialogs';\nimport { enqueueSnackbar } from 'notistack';\nimport { ChangeEvent, useEffect, useRef, useState } from 'react';\nimport { ThemePreviewCanvas, ThemePreviewControls } from '../components';\nimport { useThemePreview } from '../hooks';\nimport type {\n ThemePreviewDialogPayload,\n ThemePreviewPresetThemes,\n ThemePreviewSectionKey,\n} from '../types';\nimport { createThemePreviewExportData, resetThemePreviewSessionState } from '../utils';\n\nconst themePreviewPresetThemes = themesConfig as ThemePreviewPresetThemes;\nconst themePreviewArchiveAccept = '.owp,.zip,application/zip';\nconst THEME_PREVIEW_AUTO_SAVE_INTERVAL_MS = 5 * 60 * 1000;\nconst THEME_PREVIEW_AUTO_SAVE_IDLE_WAIT_MS = 2 * 1000;\nconst THEME_PREVIEW_AUTO_SAVE_RETRY_MS = 15 * 1000;\n\ntype ThemePreviewSettingsArchive = {\n defaultSettingsConfig?: {\n theme?: typeof defaultSettingsConfig.theme;\n };\n defaultSnackbarTheme?: SnackbarTheme;\n};\ntype ThemePreviewSaveDialogPayload = {\n initialFileName: string;\n};\n\nfunction createThemePreviewArchiveFiles(\n exportData: ReturnType<typeof createThemePreviewExportData>,\n) {\n return Object.entries(exportData).map(([fileName, fileData]) => ({\n fileName,\n blob: new Blob([JSON.stringify(fileData, null, 2)], {\n type: 'application/json',\n }),\n }));\n}\n\nfunction getThemePreviewConfigFileTitle(value: string) {\n const sanitizedValue = value\n .trim()\n .replace(/[^0-9A-Za-z가-힣 _-]+/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^[-_]+|[-_]+$/g, '');\n\n return sanitizedValue ? `theme-preview-config-${sanitizedValue}` : 'theme-preview-config';\n}\n\nconst themePreviewActionButtonSx = {\n '&.MuiButton-root': {\n fontSize: '1.3rem',\n letterSpacing: '0.04rem',\n },\n '&.MuiButton-sizeSmall': {\n fontSize: '1.3rem',\n letterSpacing: '0.04rem',\n minHeight: 42,\n px: 2.25,\n },\n '& .MuiButton-startIcon': {\n mr: 0.75,\n },\n fontWeight: 800,\n lineHeight: 1.2,\n minHeight: 42,\n px: 2.25,\n whiteSpace: 'nowrap',\n} as const;\nconst themePreviewFixedContainedActionSx = {\n '&.Mui-disabled': {\n backgroundColor: '#e5e7eb',\n borderColor: '#e5e7eb',\n color: '#a1a1aa',\n },\n '&:hover': {\n backgroundColor: '#1696d5',\n borderColor: '#1696d5',\n },\n backgroundColor: '#1ea3e6',\n border: '1px solid #1ea3e6',\n color: '#ffffff',\n} as const;\nconst themePreviewFixedOutlinedActionSx = {\n '&.Mui-disabled': {\n backgroundColor: '#ffffff',\n borderColor: '#d1d5db',\n color: '#9ca3af',\n },\n '&:hover': {\n backgroundColor: '#f8fafc',\n borderColor: '#111827',\n },\n backgroundColor: '#ffffff',\n border: '1px solid #111827',\n color: '#111827',\n} as const;\nconst themePreviewDialogTitleColor = '#111827';\n\nconst ThemePreviewSaveDialog: DialogComponent<\n ThemePreviewSaveDialogPayload,\n string | undefined\n> = ({\n open,\n payload,\n onClose,\n}: DialogProps<ThemePreviewSaveDialogPayload, string | undefined>) => {\n const [fileName, setFileName] = useState(payload?.initialFileName ?? '');\n\n return (\n <OwpDialog\n title=\"설정파일 저장\"\n open={open}\n maxWidth=\"xs\"\n onClose={() => onClose(undefined)}\n onConfirm={() => onClose(fileName)}\n contentProps={{\n sx: {\n minWidth: 360,\n p: 3,\n },\n }}\n >\n <div className=\"flex flex-col gap-12\">\n <TextField\n label=\"저장 이름\"\n value={fileName}\n placeholder=\"저장 이름 입력\"\n onChange={(event) => {\n setFileName(event.target.value);\n }}\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n 저장 확장자는 `.owp`로 고정됩니다.\n </Typography>\n </div>\n </OwpDialog>\n );\n};\n\nexport const ThemePreviewDialog: DialogComponent<ThemePreviewDialogPayload, undefined> = ({\n open,\n payload,\n onClose,\n}: DialogProps<ThemePreviewDialogPayload, undefined>) => {\n const [configFileName, setConfigFileName] = useState('');\n const [isPreviewCanvasLoading, setIsPreviewCanvasLoading] = useState(false);\n const previewDialogContentRef = useRef<HTMLDivElement | null>(null);\n const zipFileInputRef = useRef<HTMLInputElement | null>(null);\n const autoSaveTimeoutRef = useRef<number | null>(null);\n const isPointerDownRef = useRef(false);\n const lastUserInteractionAtRef = useRef(Date.now());\n const hasTemporaryChangesRef = useRef(false);\n const handleTemporarySaveRef = useRef<(saveType?: 'auto' | 'manual') => void>(() => undefined);\n const previewCanvasTransitionFrameRef = useRef<number | null>(null);\n const dialogs = useDialogs();\n const { confirmSave } = useConfirm();\n const {\n activeSection,\n canApplyToMain,\n draftSettings,\n hasTemporaryChanges,\n hasTemporarySnapshot,\n presetOptions,\n selectedModes,\n selectedPresetKeys,\n setActiveSection,\n handlePaletteValueChange,\n handlePaletteValuesChange,\n handleApplyToMain,\n handleLoadSettings,\n handlePresetKeyChange,\n handlePresetModeChange,\n handleReset,\n handleTemporaryLoad,\n handleTemporarySave,\n } = useThemePreview({\n initialSection: payload?.initialSection,\n initialPresetKeys: {\n main: 'light1',\n navbar: 'light2',\n toolbar: 'surfaceDark',\n },\n presetThemes: themePreviewPresetThemes,\n resetTheme: defaultSettingsConfig.theme,\n });\n const isPresetThemeSection =\n activeSection === 'main' || activeSection === 'navbar' || activeSection === 'toolbar';\n const resolvedSelectedMode = isPresetThemeSection ? selectedModes[activeSection] : 'light';\n const resolvedSelectedPresetKey = isPresetThemeSection ? selectedPresetKeys[activeSection] : '';\n\n const handleThemePreviewInteraction = () => {\n lastUserInteractionAtRef.current = Date.now();\n };\n\n const handleSaveConfigFiles = async (fileName: string) => {\n const exportData = createThemePreviewExportData(draftSettings);\n\n await saveAsZipFile(createThemePreviewArchiveFiles(exportData), {\n type: 'application/json',\n fileExtension: 'json',\n fileTitle: getThemePreviewConfigFileTitle(fileName),\n archiveExtension: 'owp',\n });\n };\n\n const handleOpenSaveDialog = async () => {\n const nextFileName = await dialogs.open(ThemePreviewSaveDialog, {\n initialFileName: configFileName,\n });\n\n if (nextFileName === undefined) {\n return;\n }\n\n setConfigFileName(nextFileName);\n await handleSaveConfigFiles(nextFileName);\n };\n\n const handleOpenZipFile = () => {\n zipFileInputRef.current?.click();\n };\n\n const handleManualTemporarySave = () => {\n handleTemporarySave('manual');\n enqueueSnackbar('임시 저장을 완료했습니다.', {\n variant: 'success',\n });\n };\n\n const handleManualTemporaryLoad = () => {\n if (!handleTemporaryLoad()) {\n enqueueSnackbar('불러올 임시 저장 데이터가 없습니다.', {\n variant: 'warning',\n });\n return;\n }\n\n enqueueSnackbar('임시 저장 데이터를 불러왔습니다.', {\n variant: 'success',\n });\n };\n\n const handleDialogClose = async () => {\n if (hasTemporaryChanges) {\n const isConfirmed = await confirmSave({\n title: '변경된 값을 저장하겠습니까?',\n });\n\n if (isConfirmed) {\n handleTemporarySave('manual');\n enqueueSnackbar('임시 저장되었습니다. 다시 실행하면 저장된 데이터를 불러옵니다.', {\n variant: 'info',\n });\n } else {\n resetThemePreviewSessionState();\n }\n }\n\n onClose(undefined);\n };\n\n const handleZipFileChange = async (event: ChangeEvent<HTMLInputElement>) => {\n const selectedFile = event.target.files?.[0];\n\n if (!selectedFile) {\n return;\n }\n\n try {\n const parsedSettings = await readZipEntryJson<ThemePreviewSettingsArchive>(\n selectedFile,\n (fileName) => fileName.endsWith('settings.json'),\n );\n\n if (!parsedSettings) {\n enqueueSnackbar('settings.json 파일이 없습니다.', {\n variant: 'warning',\n });\n return;\n }\n\n const nextTheme = parsedSettings.defaultSettingsConfig?.theme;\n const nextSnackbarTheme = parsedSettings.defaultSnackbarTheme ?? defaultSnackbarTheme;\n\n if (!nextTheme) {\n enqueueSnackbar('theme 설정을 읽지 못했습니다.', {\n variant: 'warning',\n });\n return;\n }\n\n handleLoadSettings(nextTheme, nextSnackbarTheme);\n enqueueSnackbar('설정 파일을 로드하고 메인 화면에 적용했습니다.', {\n variant: 'success',\n });\n } catch {\n enqueueSnackbar('설정 파일을 불러오는 중 오류가 발생했습니다.', {\n variant: 'error',\n });\n } finally {\n event.target.value = '';\n }\n };\n\n const handleSectionChange = (sectionKey: ThemePreviewSectionKey) => {\n if (sectionKey === activeSection) {\n return;\n }\n\n if (previewCanvasTransitionFrameRef.current) {\n cancelAnimationFrame(previewCanvasTransitionFrameRef.current);\n previewCanvasTransitionFrameRef.current = null;\n }\n\n setIsPreviewCanvasLoading(true);\n\n previewCanvasTransitionFrameRef.current = requestAnimationFrame(() => {\n setActiveSection(sectionKey);\n\n previewCanvasTransitionFrameRef.current = requestAnimationFrame(() => {\n setIsPreviewCanvasLoading(false);\n previewCanvasTransitionFrameRef.current = null;\n });\n });\n };\n\n useEffect(() => {\n handleTemporarySaveRef.current = handleTemporarySave;\n }, [handleTemporarySave]);\n\n useEffect(() => {\n hasTemporaryChangesRef.current = hasTemporaryChanges;\n }, [hasTemporaryChanges]);\n\n useEffect(() => {\n const previewContentElement = previewDialogContentRef.current;\n\n if (!previewContentElement) {\n return;\n }\n\n const handlePointerDown = () => {\n isPointerDownRef.current = true;\n handleThemePreviewInteraction();\n };\n const handlePointerUp = () => {\n isPointerDownRef.current = false;\n handleThemePreviewInteraction();\n };\n\n previewContentElement.addEventListener('pointerdown', handlePointerDown);\n previewContentElement.addEventListener('pointerup', handlePointerUp);\n previewContentElement.addEventListener('pointercancel', handlePointerUp);\n previewContentElement.addEventListener('keydown', handleThemePreviewInteraction);\n previewContentElement.addEventListener('input', handleThemePreviewInteraction);\n previewContentElement.addEventListener('change', handleThemePreviewInteraction);\n previewContentElement.addEventListener('focusin', handleThemePreviewInteraction);\n\n return () => {\n previewContentElement.removeEventListener('pointerdown', handlePointerDown);\n previewContentElement.removeEventListener('pointerup', handlePointerUp);\n previewContentElement.removeEventListener('pointercancel', handlePointerUp);\n previewContentElement.removeEventListener('keydown', handleThemePreviewInteraction);\n previewContentElement.removeEventListener('input', handleThemePreviewInteraction);\n previewContentElement.removeEventListener('change', handleThemePreviewInteraction);\n previewContentElement.removeEventListener('focusin', handleThemePreviewInteraction);\n };\n }, []);\n\n useEffect(() => {\n const clearAutoSaveTimeout = () => {\n if (!autoSaveTimeoutRef.current) {\n return;\n }\n\n window.clearTimeout(autoSaveTimeoutRef.current);\n autoSaveTimeoutRef.current = null;\n };\n const scheduleAutoSave = (delay: number) => {\n clearAutoSaveTimeout();\n autoSaveTimeoutRef.current = window.setTimeout(() => {\n const isUserInteracting =\n isPointerDownRef.current ||\n Date.now() - lastUserInteractionAtRef.current < THEME_PREVIEW_AUTO_SAVE_IDLE_WAIT_MS;\n\n if (document.hidden || isUserInteracting) {\n scheduleAutoSave(THEME_PREVIEW_AUTO_SAVE_RETRY_MS);\n return;\n }\n\n handleTemporarySaveRef.current('auto');\n scheduleAutoSave(THEME_PREVIEW_AUTO_SAVE_INTERVAL_MS);\n }, delay);\n };\n\n scheduleAutoSave(THEME_PREVIEW_AUTO_SAVE_INTERVAL_MS);\n\n return () => {\n clearAutoSaveTimeout();\n };\n }, []);\n\n useEffect(() => {\n const handlePageExit = () => {\n if (!hasTemporaryChangesRef.current) {\n return;\n }\n\n handleTemporarySaveRef.current('manual');\n };\n\n window.addEventListener('pagehide', handlePageExit);\n window.addEventListener('beforeunload', handlePageExit);\n\n return () => {\n window.removeEventListener('pagehide', handlePageExit);\n window.removeEventListener('beforeunload', handlePageExit);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (!previewCanvasTransitionFrameRef.current) {\n return;\n }\n\n cancelAnimationFrame(previewCanvasTransitionFrameRef.current);\n };\n }, []);\n\n return (\n <OwpDialog\n title={\n <div className=\"flex w-full flex-wrap items-center justify-between gap-12\">\n <Typography variant=\"h6\" fontWeight={700} sx={{ color: themePreviewDialogTitleColor }}>\n OWP Theme Preview\n </Typography>\n <div className=\"flex flex-wrap items-center gap-8\">\n <Button\n size=\"small\"\n variant=\"outlined\"\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedOutlinedActionSx,\n }}\n onClick={handleReset}\n >\n 초기 상태로 초기화\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n disabled={!canApplyToMain}\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedContainedActionSx,\n }}\n onClick={handleApplyToMain}\n >\n 메인에 적용해보기\n </Button>\n </div>\n </div>\n }\n open={open}\n maxWidth=\"xl\"\n canConfirm={false}\n onClose={handleDialogClose}\n actions={\n <div className=\"grid min-w-0 flex-1 grid-cols-[1fr_auto_1fr] items-center gap-y-8\">\n <div className=\"flex flex-wrap items-center justify-start gap-8\">\n <Button\n variant=\"contained\"\n startIcon={<SaveOutlinedIcon />}\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedContainedActionSx,\n }}\n onClick={handleManualTemporarySave}\n >\n 임시 저장하기\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<RestoreOutlinedIcon />}\n disabled={!hasTemporarySnapshot}\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedOutlinedActionSx,\n }}\n onClick={handleManualTemporaryLoad}\n >\n 임시 저장 불러오기\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center justify-center gap-8\">\n <Button\n variant=\"contained\"\n startIcon={<DownloadOutlinedIcon />}\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedContainedActionSx,\n }}\n onClick={handleOpenSaveDialog}\n >\n 설정파일 저장하기\n </Button>\n <Button\n variant=\"outlined\"\n startIcon={<UploadFileOutlinedIcon />}\n sx={{\n ...themePreviewActionButtonSx,\n ...themePreviewFixedOutlinedActionSx,\n }}\n onClick={handleOpenZipFile}\n >\n 설정파일 불러오기\n </Button>\n </div>\n <div />\n </div>\n }\n slotProps={{\n paper: {\n sx: {\n width: 'min(1680px, calc(100vw - 48px))',\n maxWidth: 'none',\n height: 'calc(100vh - 48px)',\n m: 3,\n },\n },\n }}\n contentProps={{\n sx: {\n height: '100%',\n p: 3,\n },\n }}\n >\n <div ref={previewDialogContentRef} className=\"flex h-full min-h-0 flex-col gap-12\">\n <input\n ref={zipFileInputRef}\n type=\"file\"\n accept={themePreviewArchiveAccept}\n className=\"hidden\"\n onChange={handleZipFileChange}\n />\n <div className=\"grid min-h-0 flex-1 gap-20 xl:grid-cols-[420px_minmax(0,1fr)]\">\n <ThemePreviewControls\n activeSection={activeSection}\n presetOptions={presetOptions}\n selectedMode={resolvedSelectedMode}\n selectedPresetKey={resolvedSelectedPresetKey}\n settings={draftSettings}\n onSectionChange={handleSectionChange}\n onPaletteValueChange={handlePaletteValueChange}\n onPaletteValuesChange={handlePaletteValuesChange}\n onPresetKeyChange={handlePresetKeyChange}\n onPresetModeChange={handlePresetModeChange}\n />\n <ThemePreviewCanvas\n activeSection={activeSection}\n isLoading={isPreviewCanvasLoading}\n settings={draftSettings}\n />\n </div>\n </div>\n </OwpDialog>\n );\n};\n"],"names":["themePreviewPresetThemes","themesConfig","themePreviewArchiveAccept","THEME_PREVIEW_AUTO_SAVE_INTERVAL_MS","THEME_PREVIEW_AUTO_SAVE_IDLE_WAIT_MS","THEME_PREVIEW_AUTO_SAVE_RETRY_MS","createThemePreviewArchiveFiles","exportData","fileName","fileData","__name","getThemePreviewConfigFileTitle","value","sanitizedValue","themePreviewActionButtonSx","themePreviewFixedContainedActionSx","themePreviewFixedOutlinedActionSx","themePreviewDialogTitleColor","ThemePreviewSaveDialog","open","payload","onClose","setFileName","useState","jsx","OwpDialog","jsxs","TextField","event","Typography","ThemePreviewDialog","configFileName","setConfigFileName","isPreviewCanvasLoading","setIsPreviewCanvasLoading","previewDialogContentRef","useRef","zipFileInputRef","autoSaveTimeoutRef","isPointerDownRef","lastUserInteractionAtRef","hasTemporaryChangesRef","handleTemporarySaveRef","previewCanvasTransitionFrameRef","dialogs","useDialogs","confirmSave","useConfirm","activeSection","canApplyToMain","draftSettings","hasTemporaryChanges","hasTemporarySnapshot","presetOptions","selectedModes","selectedPresetKeys","setActiveSection","handlePaletteValueChange","handlePaletteValuesChange","handleApplyToMain","handleLoadSettings","handlePresetKeyChange","handlePresetModeChange","handleReset","handleTemporaryLoad","handleTemporarySave","useThemePreview","defaultSettingsConfig","isPresetThemeSection","resolvedSelectedMode","resolvedSelectedPresetKey","handleThemePreviewInteraction","handleSaveConfigFiles","createThemePreviewExportData","saveAsZipFile","handleOpenSaveDialog","nextFileName","handleOpenZipFile","_a","handleManualTemporarySave","enqueueSnackbar","handleManualTemporaryLoad","handleDialogClose","resetThemePreviewSessionState","handleZipFileChange","selectedFile","parsedSettings","readZipEntryJson","nextTheme","_b","nextSnackbarTheme","defaultSnackbarTheme","handleSectionChange","sectionKey","useEffect","previewContentElement","handlePointerDown","handlePointerUp","clearAutoSaveTimeout","scheduleAutoSave","delay","isUserInteracting","handlePageExit","Button","SaveOutlinedIcon","RestoreOutlinedIcon","DownloadOutlinedIcon","UploadFileOutlinedIcon","ThemePreviewControls","ThemePreviewCanvas"],"mappings":"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"}