@owp/core 2.5.8 → 2.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/index16.js +4 -4
- package/dist/_virtual/index17.js +4 -4
- package/dist/_virtual/index18.js +4 -4
- package/dist/_virtual/index19.js +4 -4
- package/dist/components/OwpDialog/OwpDialog.js +67 -46
- package/dist/components/OwpDialog/OwpDialog.js.map +1 -1
- package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js +162 -153
- package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js.map +1 -1
- package/dist/components/OwpTable/OwpDataTable.js +297 -283
- package/dist/components/OwpTable/OwpDataTable.js.map +1 -1
- package/dist/components/OwpTable/OwpFieldTable.js +98 -86
- package/dist/components/OwpTable/OwpFieldTable.js.map +1 -1
- package/dist/components/OwpTable/OwpTable.js +145 -127
- package/dist/components/OwpTable/OwpTable.js.map +1 -1
- package/dist/components/OwpTable/internal/defaultTableStyle.js +21 -15
- package/dist/components/OwpTable/internal/defaultTableStyle.js.map +1 -1
- package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js +195 -147
- package/dist/components/OwpTreeGrid/internal/treeGridRuntime.js.map +1 -1
- package/dist/constants/tableTheme.js.map +1 -1
- package/dist/features/themePreview/components/ThemePreviewCanvas.js +300 -263
- package/dist/features/themePreview/components/ThemePreviewCanvas.js.map +1 -1
- package/dist/features/themePreview/components/ThemePreviewCanvasSections.js +148 -141
- package/dist/features/themePreview/components/ThemePreviewCanvasSections.js.map +1 -1
- package/dist/features/themePreview/components/ThemePreviewColorField.js +168 -138
- package/dist/features/themePreview/components/ThemePreviewColorField.js.map +1 -1
- package/dist/features/themePreview/components/ThemePreviewControls.js +410 -218
- package/dist/features/themePreview/components/ThemePreviewControls.js.map +1 -1
- package/dist/features/themePreview/components/themePreviewCanvas.shared.js +145 -125
- package/dist/features/themePreview/components/themePreviewCanvas.shared.js.map +1 -1
- package/dist/features/themePreview/configs/table.js +4 -2
- package/dist/features/themePreview/configs/table.js.map +1 -1
- package/dist/features/themePreview/dialogs/ThemePreviewDialog.js +124 -118
- package/dist/features/themePreview/dialogs/ThemePreviewDialog.js.map +1 -1
- package/dist/features/themePreview/hooks/useThemePreview.js +275 -193
- package/dist/features/themePreview/hooks/useThemePreview.js.map +1 -1
- package/dist/features/themePreview/utils/themePreviewDefinitions.js +8 -0
- package/dist/features/themePreview/utils/themePreviewDefinitions.js.map +1 -1
- package/dist/features/themePreview/utils/themePreviewSettings.js +188 -151
- package/dist/features/themePreview/utils/themePreviewSettings.js.map +1 -1
- package/dist/features/themePreview.js +18 -17
- package/dist/layout/components/toggles/NavigationSearchToggle.js +3 -3
- package/dist/layout/components/toolbar/ToolbarLayout.js +36 -35
- package/dist/layout/components/toolbar/ToolbarLayout.js.map +1 -1
- 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/RestartAltOutlined.js +9 -0
- 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/RestartAltOutlined.js.map +1 -0
- package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE128/constants.js +1 -1
- package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/CODE93/constants.js +1 -1
- package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/EAN_UPC/constants.js +1 -1
- package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/ITF/constants.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/core/utils.js +1 -1
- package/dist/node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/renderer/utils.js +1 -1
- 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
- package/dist/owp-app.css +1 -1
- package/dist/types/components/OwpDialog/OwpDialog.d.ts +2 -0
- package/dist/types/components/OwpTable/OwpFieldTable.d.ts +3 -2
- package/dist/types/components/OwpTable/internal/defaultTableStyle.d.ts +2 -0
- package/dist/types/constants/tableTheme.d.ts +1 -0
- package/dist/types/features/themePreview/components/ThemePreviewColorField.d.ts +3 -1
- package/dist/types/features/themePreview/components/ThemePreviewControls.d.ts +4 -1
- package/dist/types/features/themePreview/configs/settings.d.ts +2 -0
- package/dist/types/features/themePreview/configs/table.d.ts +2 -0
- package/dist/types/features/themePreview/hooks/useThemePreview.d.ts +3 -0
- package/dist/types/features/themePreview/utils/index.d.ts +1 -1
- package/dist/types/features/themePreview/utils/themePreviewSettings.d.ts +11 -1
- package/dist/types/types/OwpTableThemeTypes.d.ts +8 -0
- package/package.json +1 -1
|
@@ -1 +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 SnackbarProviderTheme,\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 {\n createThemePreviewAppConfigFiles,\n createThemePreviewExportData,\n resetThemePreviewSessionState,\n} 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 snackbarProviderProps?: SnackbarProviderTheme;\n theme?: typeof defaultSettingsConfig.theme;\n };\n defaultSnackbarProviderProps?: SnackbarProviderTheme;\n defaultSnackbarTheme?: SnackbarTheme;\n};\ntype ThemePreviewSaveDialogPayload = {\n initialFileName: string;\n};\n\nfunction createThemePreviewArchiveFiles(draftSettings: Parameters<typeof createThemePreviewExportData>[0]) {\n const exportData = createThemePreviewExportData(draftSettings);\n const appConfigFiles = createThemePreviewAppConfigFiles(draftSettings);\n\n return [\n ...appConfigFiles.map(({ fileName, content }) => ({\n fileName,\n blob: new Blob([content], {\n type: 'text/plain;charset=utf-8',\n }),\n })),\n ...Object.entries(exportData).map(([fileName, fileData]) => ({\n fileName: `preview/${fileName}.json`,\n blob: new Blob([JSON.stringify(fileData, null, 2)], {\n type: 'application/json',\n }),\n })),\n ];\n}\n\nfunction getThemePreviewArchiveProviderProps(\n archiveSettings: ThemePreviewSettingsArchive | null,\n) {\n return (\n archiveSettings?.defaultSnackbarProviderProps ??\n archiveSettings?.defaultSettingsConfig?.snackbarProviderProps\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 await saveAsZipFile(createThemePreviewArchiveFiles(draftSettings), {\n fileTitle: getThemePreviewConfigFileTitle(fileName),\n archiveExtension: 'owp',\n preserveFileNames: true,\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 const nextSnackbarProviderProps = getThemePreviewArchiveProviderProps(parsedSettings);\n\n if (!nextTheme) {\n enqueueSnackbar('theme 설정을 읽지 못했습니다.', {\n variant: 'warning',\n });\n return;\n }\n\n handleLoadSettings(nextTheme, nextSnackbarTheme, nextSnackbarProviderProps);\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","draftSettings","exportData","createThemePreviewExportData","createThemePreviewAppConfigFiles","fileName","content","fileData","__name","getThemePreviewArchiveProviderProps","archiveSettings","_a","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","hasTemporaryChanges","hasTemporarySnapshot","presetOptions","selectedModes","selectedPresetKeys","setActiveSection","handlePaletteValueChange","handlePaletteValuesChange","handleApplyToMain","handleLoadSettings","handlePresetKeyChange","handlePresetModeChange","handleReset","handleTemporaryLoad","handleTemporarySave","useThemePreview","defaultSettingsConfig","isPresetThemeSection","resolvedSelectedMode","resolvedSelectedPresetKey","handleThemePreviewInteraction","handleSaveConfigFiles","saveAsZipFile","handleOpenSaveDialog","nextFileName","handleOpenZipFile","handleManualTemporarySave","enqueueSnackbar","handleManualTemporaryLoad","handleDialogClose","resetThemePreviewSessionState","handleZipFileChange","selectedFile","parsedSettings","readZipEntryJson","nextTheme","_b","nextSnackbarTheme","defaultSnackbarTheme","nextSnackbarProviderProps","handleSectionChange","sectionKey","useEffect","previewContentElement","handlePointerDown","handlePointerUp","clearAutoSaveTimeout","scheduleAutoSave","delay","isUserInteracting","handlePageExit","Button","SaveOutlinedIcon","RestoreOutlinedIcon","DownloadOutlinedIcon","UploadFileOutlinedIcon","ThemePreviewControls","ThemePreviewCanvas"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThemePreviewDialog.js","sources":["../../../../src/features/themePreview/dialogs/ThemePreviewDialog.tsx"],"sourcesContent":["import { OwpDialog } from '@/components/OwpDialog';\nimport {\n defaultSnackbarTheme,\n type SnackbarProviderTheme,\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 {\n createThemePreviewAppConfigFiles,\n createThemePreviewExportData,\n resetThemePreviewSessionState,\n} 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 snackbarProviderProps?: SnackbarProviderTheme;\n theme?: typeof defaultSettingsConfig.theme;\n };\n defaultSnackbarProviderProps?: SnackbarProviderTheme;\n defaultSnackbarTheme?: SnackbarTheme;\n};\ntype ThemePreviewSaveDialogPayload = {\n initialFileName: string;\n};\n\nfunction createThemePreviewArchiveFiles(draftSettings: Parameters<typeof createThemePreviewExportData>[0]) {\n const exportData = createThemePreviewExportData(draftSettings);\n const appConfigFiles = createThemePreviewAppConfigFiles(draftSettings);\n\n return [\n ...appConfigFiles.map(({ fileName, content }) => ({\n fileName,\n blob: new Blob([content], {\n type: 'text/plain;charset=utf-8',\n }),\n })),\n ...Object.entries(exportData).map(([fileName, fileData]) => ({\n fileName: `preview/${fileName}.json`,\n blob: new Blob([JSON.stringify(fileData, null, 2)], {\n type: 'application/json',\n }),\n })),\n ];\n}\n\nfunction getThemePreviewArchiveProviderProps(\n archiveSettings: ThemePreviewSettingsArchive | null,\n) {\n return (\n archiveSettings?.defaultSnackbarProviderProps ??\n archiveSettings?.defaultSettingsConfig?.snackbarProviderProps\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 resetVersion,\n selectedModes,\n selectedPresetKeys,\n setActiveSection,\n handlePaletteValueChange,\n handlePaletteValuesChange,\n handlePaletteValueReset,\n handlePaletteValuesReset,\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 await saveAsZipFile(createThemePreviewArchiveFiles(draftSettings), {\n fileTitle: getThemePreviewConfigFileTitle(fileName),\n archiveExtension: 'owp',\n preserveFileNames: true,\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 const nextSnackbarProviderProps = getThemePreviewArchiveProviderProps(parsedSettings);\n\n if (!nextTheme) {\n enqueueSnackbar('theme 설정을 읽지 못했습니다.', {\n variant: 'warning',\n });\n return;\n }\n\n handleLoadSettings(nextTheme, nextSnackbarTheme, nextSnackbarProviderProps);\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 resetVersion={resetVersion}\n onSectionChange={handleSectionChange}\n onPaletteValueChange={handlePaletteValueChange}\n onPaletteValuesChange={handlePaletteValuesChange}\n onPaletteValueReset={handlePaletteValueReset}\n onPaletteValuesReset={handlePaletteValuesReset}\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","draftSettings","exportData","createThemePreviewExportData","createThemePreviewAppConfigFiles","fileName","content","fileData","__name","getThemePreviewArchiveProviderProps","archiveSettings","_a","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","hasTemporaryChanges","hasTemporarySnapshot","presetOptions","resetVersion","selectedModes","selectedPresetKeys","setActiveSection","handlePaletteValueChange","handlePaletteValuesChange","handlePaletteValueReset","handlePaletteValuesReset","handleApplyToMain","handleLoadSettings","handlePresetKeyChange","handlePresetModeChange","handleReset","handleTemporaryLoad","handleTemporarySave","useThemePreview","defaultSettingsConfig","isPresetThemeSection","resolvedSelectedMode","resolvedSelectedPresetKey","handleThemePreviewInteraction","handleSaveConfigFiles","saveAsZipFile","handleOpenSaveDialog","nextFileName","handleOpenZipFile","handleManualTemporarySave","enqueueSnackbar","handleManualTemporaryLoad","handleDialogClose","resetThemePreviewSessionState","handleZipFileChange","selectedFile","parsedSettings","readZipEntryJson","nextTheme","_b","nextSnackbarTheme","defaultSnackbarTheme","nextSnackbarProviderProps","handleSectionChange","sectionKey","useEffect","previewContentElement","handlePointerDown","handlePointerUp","clearAutoSaveTimeout","scheduleAutoSave","delay","isUserInteracting","handlePageExit","Button","SaveOutlinedIcon","RestoreOutlinedIcon","DownloadOutlinedIcon","UploadFileOutlinedIcon","ThemePreviewControls","ThemePreviewCanvas"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAMA,KAA2BC,IAC3BC,KAA4B,6BAC5BC,IAAsC,MAAS,KAC/CC,KAAuC,IAAI,KAC3CC,KAAmC,KAAK;AAc9C,SAASC,GAA+BC,GAAmE;AACzG,QAAMC,IAAaC,GAA6BF,CAAa;AAG7D,SAAO;AAAA,IACL,GAHqBG,GAAiCH,CAAa,EAGjD,IAAI,CAAC,EAAE,UAAAI,GAAU,SAAAC,SAAe;AAAA,MAChD,UAAAD;AAAA,MACA,MAAM,IAAI,KAAK,CAACC,CAAO,GAAG;AAAA,QACxB,MAAM;AAAA,MAAA,CACP;AAAA,IAAA,EACD;AAAA,IACF,GAAG,OAAO,QAAQJ,CAAU,EAAE,IAAI,CAAC,CAACG,GAAUE,CAAQ,OAAO;AAAA,MAC3D,UAAU,WAAWF,CAAQ;AAAA,MAC7B,MAAM,IAAI,KAAK,CAAC,KAAK,UAAUE,GAAU,MAAM,CAAC,CAAC,GAAG;AAAA,QAClD,MAAM;AAAA,MAAA,CACP;AAAA,IAAA,EACD;AAAA,EAAA;AAEN;AAlBSC,EAAAR,IAAA;AAoBT,SAASS,GACPC,GACA;;AACA,UACEA,KAAA,gBAAAA,EAAiB,mCACjBC,IAAAD,KAAA,gBAAAA,EAAiB,0BAAjB,gBAAAC,EAAwC;AAE5C;AAPSH,EAAAC,IAAA;AAST,SAASG,GAA+BC,GAAe;AACrD,QAAMC,IAAiBD,EACpB,KAAA,EACA,QAAQ,wBAAwB,EAAE,EAClC,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,QAAQ,kBAAkB,EAAE;AAE/B,SAAOC,IAAiB,wBAAwBA,CAAc,KAAK;AACrE;AATSN,EAAAI,IAAA;AAWT,MAAMG,IAA6B;AAAA,EACjC,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,eAAe;AAAA,EAAA;AAAA,EAEjB,yBAAyB;AAAA,IACvB,UAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAW;AAAA,IACX,IAAI;AAAA,EAAA;AAAA,EAEN,0BAA0B;AAAA,IACxB,IAAI;AAAA,EAAA;AAAA,EAEN,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,YAAY;AACd,GACMC,IAAqC;AAAA,EACzC,kBAAkB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET,WAAW;AAAA,IACT,iBAAiB;AAAA,IACjB,aAAa;AAAA,EAAA;AAAA,EAEf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,OAAO;AACT,GACMC,IAAoC;AAAA,EACxC,kBAAkB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET,WAAW;AAAA,IACT,iBAAiB;AAAA,IACjB,aAAa;AAAA,EAAA;AAAA,EAEf,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,OAAO;AACT,GACMC,KAA+B,WAE/BC,KAGF,gBAAAX,EAAA,CAAC;AAAA,EACH,MAAAY;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AACF,MAAsE;AACpE,QAAM,CAACjB,GAAUkB,CAAW,IAAIC,GAASH,KAAA,gBAAAA,EAAS,oBAAmB,EAAE;AAEvE,SACE,gBAAAI;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,MAAAN;AAAA,MACA,UAAS;AAAA,MACT,SAAS,gBAAAZ,EAAA,MAAMc,EAAQ,MAAS,GAAvB;AAAA,MACT,WAAW,gBAAAd,EAAA,MAAMc,EAAQjB,CAAQ,GAAtB;AAAA,MACX,cAAc;AAAA,QACZ,IAAI;AAAA,UACF,UAAU;AAAA,UACV,GAAG;AAAA,QAAA;AAAA,MACL;AAAA,MAGF,UAAA,gBAAAsB,EAAC,OAAA,EAAI,WAAU,wBACb,UAAA;AAAA,QAAA,gBAAAF;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAOvB;AAAA,YACP,aAAY;AAAA,YACZ,UAAU,gBAAAG,EAAA,CAACqB,MAAU;AACnB,cAAAN,EAAYM,EAAM,OAAO,KAAK;AAAA,YAChC,GAFU;AAAA,UAEV;AAAA,QAAA;AAAA,0BAEDC,GAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,UAAA,yBAAA,CAEnD;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN,GApCI,2BAsCSC,KAA4E,gBAAAvB,EAAA,CAAC;AAAA,EACxF,MAAAY;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AACF,MAAyD;AACvD,QAAM,CAACU,GAAgBC,CAAiB,IAAIT,EAAS,EAAE,GACjD,CAACU,GAAwBC,CAAyB,IAAIX,EAAS,EAAK,GACpEY,IAA0BC,EAA8B,IAAI,GAC5DC,IAAkBD,EAAgC,IAAI,GACtDE,IAAqBF,EAAsB,IAAI,GAC/CG,IAAmBH,EAAO,EAAK,GAC/BI,IAA2BJ,EAAO,KAAK,IAAA,CAAK,GAC5CK,IAAyBL,EAAO,EAAK,GACrCM,IAAyBN,EAA+C,MAAA;AAAA,GAAe,GACvFO,IAAkCP,EAAsB,IAAI,GAC5DQ,IAAUC,GAAA,GACV,EAAE,aAAAC,EAAA,IAAgBC,GAAA,GAClB;AAAA,IACJ,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAjD;AAAA,IACA,qBAAAkD;AAAA,IACA,sBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,IACA,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,0BAAAC;AAAA,IACA,2BAAAC;AAAA,IACA,yBAAAC;AAAA,IACA,0BAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,qBAAAC;AAAA,EAAA,IACEC,GAAgB;AAAA,IAClB,gBAAgBhD,KAAA,gBAAAA,EAAS;AAAA,IACzB,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA;AAAA,IAEX,cAAc3B;AAAA,IACd,YAAY4E,GAAsB;AAAA,EAAA,CACnC,GACKC,IACJtB,MAAkB,UAAUA,MAAkB,YAAYA,MAAkB,WACxEuB,KAAuBD,IAAuBhB,EAAcN,CAAa,IAAI,SAC7EwB,KAA4BF,IAAuBf,EAAmBP,CAAa,IAAI,IAEvFyB,IAAgC,gBAAAlE,EAAA,MAAM;AAC1C,IAAAiC,EAAyB,UAAU,KAAK,IAAA;AAAA,EAC1C,GAFsC,kCAIhCkC,KAAwB,gBAAAnE,EAAA,OAAOH,MAAqB;AACxD,UAAMuE,GAAc5E,GAA+BC,CAAa,GAAG;AAAA,MACjE,WAAWW,GAA+BP,CAAQ;AAAA,MAClD,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,IAAA,CACpB;AAAA,EACH,GAN8B,0BAQxBwE,KAAuB,gBAAArE,EAAA,YAAY;AACvC,UAAMsE,IAAe,MAAMjC,EAAQ,KAAK1B,IAAwB;AAAA,MAC9D,iBAAiBa;AAAA,IAAA,CAClB;AAED,IAAI8C,MAAiB,WAIrB7C,EAAkB6C,CAAY,GAC9B,MAAMH,GAAsBG,CAAY;AAAA,EAC1C,GAX6B,yBAavBC,KAAoB,gBAAAvE,EAAA,MAAM;;AAC9B,KAAAG,IAAA2B,EAAgB,YAAhB,QAAA3B,EAAyB;AAAA,EAC3B,GAF0B,sBAIpBqE,KAA4B,gBAAAxE,EAAA,MAAM;AACtC,IAAA4D,EAAoB,QAAQ,GAC5Ba,EAAgB,kBAAkB;AAAA,MAChC,SAAS;AAAA,IAAA,CACV;AAAA,EACH,GALkC,8BAO5BC,KAA4B,gBAAA1E,EAAA,MAAM;AACtC,QAAI,CAAC2D,MAAuB;AAC1B,MAAAc,EAAgB,wBAAwB;AAAA,QACtC,SAAS;AAAA,MAAA,CACV;AACD;AAAA,IACF;AAEA,IAAAA,EAAgB,sBAAsB;AAAA,MACpC,SAAS;AAAA,IAAA,CACV;AAAA,EACH,GAXkC,8BAa5BE,KAAoB,gBAAA3E,EAAA,YAAY;AACpC,IAAI2C,MACkB,MAAMJ,EAAY;AAAA,MACpC,OAAO;AAAA,IAAA,CACR,KAGCqB,EAAoB,QAAQ,GAC5Ba,EAAgB,uCAAuC;AAAA,MACrD,SAAS;AAAA,IAAA,CACV,KAEDG,GAAA,IAIJ9D,EAAQ,MAAS;AAAA,EACnB,GAjB0B,sBAmBpB+D,KAAsB,gBAAA7E,EAAA,OAAOqB,MAAyC;;AAC1E,UAAMyD,KAAe3E,IAAAkB,EAAM,OAAO,UAAb,gBAAAlB,EAAqB;AAE1C,QAAK2E;AAIL,UAAI;AACF,cAAMC,IAAiB,MAAMC;AAAA,UAC3BF;AAAA,UACA,CAACjF,OAAaA,GAAS,SAAS,eAAe;AAAA,QAAA;AAGjD,YAAI,CAACkF,GAAgB;AACnB,UAAAN,EAAgB,2BAA2B;AAAA,YACzC,SAAS;AAAA,UAAA,CACV;AACD;AAAA,QACF;AAEA,cAAMQ,KAAYC,IAAAH,EAAe,0BAAf,gBAAAG,EAAsC,OAClDC,KAAoBJ,EAAe,wBAAwBK,IAC3DC,KAA4BpF,GAAoC8E,CAAc;AAEpF,YAAI,CAACE,GAAW;AACd,UAAAR,EAAgB,uBAAuB;AAAA,YACrC,SAAS;AAAA,UAAA,CACV;AACD;AAAA,QACF;AAEA,QAAAlB,GAAmB0B,GAAWE,IAAmBE,EAAyB,GAC1EZ,EAAgB,8BAA8B;AAAA,UAC5C,SAAS;AAAA,QAAA,CACV;AAAA,MACH,QAAQ;AACN,QAAAA,EAAgB,6BAA6B;AAAA,UAC3C,SAAS;AAAA,QAAA,CACV;AAAA,MACH,UAAA;AACE,QAAApD,EAAM,OAAO,QAAQ;AAAA,MACvB;AAAA,EACF,GA1C4B,wBA4CtBiE,KAAsB,gBAAAtF,EAAA,CAACuF,MAAuC;AAClE,IAAIA,MAAe9C,MAIfL,EAAgC,YAClC,qBAAqBA,EAAgC,OAAO,GAC5DA,EAAgC,UAAU,OAG5CT,EAA0B,EAAI,GAE9BS,EAAgC,UAAU,sBAAsB,MAAM;AACpE,MAAAa,EAAiBsC,CAAU,GAE3BnD,EAAgC,UAAU,sBAAsB,MAAM;AACpE,QAAAT,EAA0B,EAAK,GAC/BS,EAAgC,UAAU;AAAA,MAC5C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GApB4B;AAsB5B,SAAAoD,EAAU,MAAM;AACd,IAAArD,EAAuB,UAAUyB;AAAA,EACnC,GAAG,CAACA,CAAmB,CAAC,GAExB4B,EAAU,MAAM;AACd,IAAAtD,EAAuB,UAAUS;AAAA,EACnC,GAAG,CAACA,CAAmB,CAAC,GAExB6C,EAAU,MAAM;AACd,UAAMC,IAAwB7D,EAAwB;AAEtD,QAAI,CAAC6D;AACH;AAGF,UAAMC,IAAoB,gBAAA1F,EAAA,MAAM;AAC9B,MAAAgC,EAAiB,UAAU,IAC3BkC,EAAA;AAAA,IACF,GAH0B,sBAIpByB,IAAkB,gBAAA3F,EAAA,MAAM;AAC5B,MAAAgC,EAAiB,UAAU,IAC3BkC,EAAA;AAAA,IACF,GAHwB;AAKxB,WAAAuB,EAAsB,iBAAiB,eAAeC,CAAiB,GACvED,EAAsB,iBAAiB,aAAaE,CAAe,GACnEF,EAAsB,iBAAiB,iBAAiBE,CAAe,GACvEF,EAAsB,iBAAiB,WAAWvB,CAA6B,GAC/EuB,EAAsB,iBAAiB,SAASvB,CAA6B,GAC7EuB,EAAsB,iBAAiB,UAAUvB,CAA6B,GAC9EuB,EAAsB,iBAAiB,WAAWvB,CAA6B,GAExE,MAAM;AACX,MAAAuB,EAAsB,oBAAoB,eAAeC,CAAiB,GAC1ED,EAAsB,oBAAoB,aAAaE,CAAe,GACtEF,EAAsB,oBAAoB,iBAAiBE,CAAe,GAC1EF,EAAsB,oBAAoB,WAAWvB,CAA6B,GAClFuB,EAAsB,oBAAoB,SAASvB,CAA6B,GAChFuB,EAAsB,oBAAoB,UAAUvB,CAA6B,GACjFuB,EAAsB,oBAAoB,WAAWvB,CAA6B;AAAA,IACpF;AAAA,EACF,GAAG,CAAA,CAAE,GAELsB,EAAU,MAAM;AACd,UAAMI,IAAuB,gBAAA5F,EAAA,MAAM;AACjC,MAAK+B,EAAmB,YAIxB,OAAO,aAAaA,EAAmB,OAAO,GAC9CA,EAAmB,UAAU;AAAA,IAC/B,GAP6B,yBAQvB8D,IAAmB,gBAAA7F,EAAA,CAAC8F,MAAkB;AAC1C,MAAAF,EAAA,GACA7D,EAAmB,UAAU,OAAO,WAAW,MAAM;AACnD,cAAMgE,IACJ/D,EAAiB,WACjB,KAAK,QAAQC,EAAyB,UAAU3C;AAElD,YAAI,SAAS,UAAUyG,GAAmB;AACxC,UAAAF,EAAiBtG,EAAgC;AACjD;AAAA,QACF;AAEA,QAAA4C,EAAuB,QAAQ,MAAM,GACrC0D,EAAiBxG,CAAmC;AAAA,MACtD,GAAGyG,CAAK;AAAA,IACV,GAfyB;AAiBzB,WAAAD,EAAiBxG,CAAmC,GAE7C,MAAM;AACX,MAAAuG,EAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE,GAELJ,EAAU,MAAM;AACd,UAAMQ,IAAiB,gBAAAhG,EAAA,MAAM;AAC3B,MAAKkC,EAAuB,WAI5BC,EAAuB,QAAQ,QAAQ;AAAA,IACzC,GANuB;AAQvB,kBAAO,iBAAiB,YAAY6D,CAAc,GAClD,OAAO,iBAAiB,gBAAgBA,CAAc,GAE/C,MAAM;AACX,aAAO,oBAAoB,YAAYA,CAAc,GACrD,OAAO,oBAAoB,gBAAgBA,CAAc;AAAA,IAC3D;AAAA,EACF,GAAG,CAAA,CAAE,GAELR,EAAU,MACD,MAAM;AACX,IAAKpD,EAAgC,WAIrC,qBAAqBA,EAAgC,OAAO;AAAA,EAC9D,GACC,CAAA,CAAE,GAGH,gBAAAnB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,6DACb,UAAA;AAAA,QAAA,gBAAAF,EAACK,GAAA,EAAW,SAAQ,MAAK,YAAY,KAAK,IAAI,EAAE,OAAOZ,GAAA,GAAgC,UAAA,oBAAA,CAEvF;AAAA,QACA,gBAAAS,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,UAAA,gBAAAF;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,IAAI;AAAA,gBACF,GAAG1F;AAAA,gBACH,GAAGE;AAAA,cAAA;AAAA,cAEL,SAASiD;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAAzC;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,UAAU,CAACvD;AAAA,cACX,IAAI;AAAA,gBACF,GAAGnC;AAAA,gBACH,GAAGC;AAAA,cAAA;AAAA,cAEL,SAAS8C;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAEF,MAAA1C;AAAA,MACA,UAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS+D;AAAA,MACT,SACE,gBAAAxD,EAAC,OAAA,EAAI,WAAU,qEACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,UAAA,gBAAAF;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,6BAAYC,IAAA,EAAiB;AAAA,cAC7B,IAAI;AAAA,gBACF,GAAG3F;AAAA,gBACH,GAAGC;AAAA,cAAA;AAAA,cAEL,SAASgE;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAAvD;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,6BAAYE,IAAA,EAAoB;AAAA,cAChC,UAAU,CAACvD;AAAA,cACX,IAAI;AAAA,gBACF,GAAGrC;AAAA,gBACH,GAAGE;AAAA,cAAA;AAAA,cAEL,SAASiE;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACF;AAAA,QACA,gBAAAvD,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,UAAA,gBAAAF;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,6BAAYG,IAAA,EAAqB;AAAA,cACjC,IAAI;AAAA,gBACF,GAAG7F;AAAA,gBACH,GAAGC;AAAA,cAAA;AAAA,cAEL,SAAS6D;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAApD;AAAA,YAACgF;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,6BAAYI,IAAA,EAAuB;AAAA,cACnC,IAAI;AAAA,gBACF,GAAG9F;AAAA,gBACH,GAAGE;AAAA,cAAA;AAAA,cAEL,SAAS8D;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACF;AAAA,0BACC,OAAA,CAAA,CAAI;AAAA,MAAA,GACP;AAAA,MAEF,WAAW;AAAA,QACT,OAAO;AAAA,UACL,IAAI;AAAA,YACF,OAAO;AAAA,YACP,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,GAAG;AAAA,UAAA;AAAA,QACL;AAAA,MACF;AAAA,MAEF,cAAc;AAAA,QACZ,IAAI;AAAA,UACF,QAAQ;AAAA,UACR,GAAG;AAAA,QAAA;AAAA,MACL;AAAA,MAGF,UAAA,gBAAApD,EAAC,OAAA,EAAI,KAAKS,GAAyB,WAAU,uCAC3C,UAAA;AAAA,QAAA,gBAAAX;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKa;AAAA,YACL,MAAK;AAAA,YACL,QAAQ1C;AAAA,YACR,WAAU;AAAA,YACV,UAAUyF;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAA1D,EAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,UAAA,gBAAAF;AAAA,YAACqF;AAAA,YAAA;AAAA,cACC,eAAA7D;AAAA,cACA,eAAAI;AAAA,cACA,cAAcmB;AAAA,cACd,mBAAmBC;AAAA,cACnB,UAAUxE;AAAA,cACV,cAAAqD;AAAA,cACA,iBAAiBwC;AAAA,cACjB,sBAAsBpC;AAAA,cACtB,uBAAuBC;AAAA,cACvB,qBAAqBC;AAAA,cACrB,sBAAsBC;AAAA,cACtB,mBAAmBG;AAAA,cACnB,oBAAoBC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEtB,gBAAAxC;AAAA,YAACsF;AAAA,YAAA;AAAA,cACC,eAAA9D;AAAA,cACA,WAAWf;AAAA,cACX,UAAUjC;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAGN,GAlbyF;"}
|