@robot-admin/layout 2.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +344 -604
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +590 -0
- package/dist/index.js +2198 -431
- package/dist/index.js.map +1 -1
- package/package.json +76 -72
- package/src/styles/layouts.scss +706 -0
- package/src/styles/settings.scss +385 -385
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants/index.ts","../src/stores/settings.ts","../src/components/SettingsDrawer/data.ts","../src/components/SettingsDrawer/index.vue","../src/setup.ts"],"sourcesContent":["/**\r\n * 布局和设置系统 - 常量定义\r\n */\r\n\r\nimport type {\r\n ThemePreset,\r\n SettingsState,\r\n LayoutInfo,\r\n PresetColor,\r\n} from \"../types\";\r\n\r\n// ============ 主题色预设 ============\r\nexport const PRESET_COLORS: PresetColor[] = [\r\n { name: \"拂晓蓝\", value: \"#409eff\" },\r\n { name: \"薄暮红\", value: \"#f5222d\" },\r\n { name: \"火山橙\", value: \"#fa541c\" },\r\n { name: \"日暮黄\", value: \"#faad14\" },\r\n { name: \"极光绿\", value: \"#52c41a\" },\r\n { name: \"明青\", value: \"#13c2c2\" },\r\n { name: \"极客蓝\", value: \"#2f54eb\" },\r\n { name: \"酱紫\", value: \"#722ed1\" },\r\n] as const;\r\n\r\n// ============ 主题预设方案 ============\r\nexport const THEME_PRESETS: ThemePreset[] = [\r\n {\r\n name: \"科技蓝\",\r\n icon: \"💙\",\r\n primaryColor: \"#409eff\",\r\n },\r\n {\r\n name: \"清新绿\",\r\n icon: \"💚\",\r\n primaryColor: \"#52c41a\",\r\n },\r\n {\r\n name: \"商务灰\",\r\n icon: \"🖤\",\r\n primaryColor: \"#595959\",\r\n },\r\n {\r\n name: \"活力橙\",\r\n icon: \"🧡\",\r\n primaryColor: \"#fa8c16\",\r\n },\r\n {\r\n name: \"优雅紫\",\r\n icon: \"💜\",\r\n primaryColor: \"#722ed1\",\r\n },\r\n {\r\n name: \"经典红\",\r\n icon: \"❤️\",\r\n primaryColor: \"#f5222d\",\r\n },\r\n];\r\n\r\n// ============ 布局模式信息 ============\r\nexport const LAYOUT_MODES: LayoutInfo[] = [\r\n {\r\n mode: \"side\",\r\n label: \"左侧菜单\",\r\n description: \"经典的左侧导航布局\",\r\n icon: \"i-mdi:page-layout-sidebar-left\",\r\n },\r\n {\r\n mode: \"top\",\r\n label: \"顶部菜单\",\r\n description: \"顶部水平导航布局\",\r\n icon: \"i-mdi:page-layout-header\",\r\n },\r\n {\r\n mode: \"mix\",\r\n label: \"混合菜单\",\r\n description: \"顶部 + 侧边混合布局\",\r\n icon: \"i-mdi:page-layout-header-sidebar-left\",\r\n },\r\n {\r\n mode: \"mix-top\",\r\n label: \"顶部混合\",\r\n description: \"侧边优先的混合布局\",\r\n icon: \"i-mdi:page-layout-sidebar-left-header\",\r\n },\r\n {\r\n mode: \"reverse-horizontal-mix\",\r\n label: \"反转混合\",\r\n description: \"反转的水平混合布局\",\r\n icon: \"i-mdi:page-layout-header-footer\",\r\n },\r\n {\r\n mode: \"card-layout\",\r\n label: \"卡片布局\",\r\n description: \"卡片式布局风格\",\r\n icon: \"i-mdi:card-outline\",\r\n },\r\n];\r\n\r\n// ============ 圆角映射 ============\r\nexport const BORDER_RADIUS_MAP = {\r\n small: \"4px\",\r\n medium: \"6px\",\r\n large: \"8px\",\r\n} as const;\r\n\r\n// ============ 动画映射 ============\r\nexport const TRANSITION_MAP = {\r\n fade: \"fade-transform\",\r\n slide: \"fade-slide\",\r\n zoom: \"fade-zoom\",\r\n none: \"\",\r\n} as const;\r\n\r\n// ============ 默认配置 ============\r\nexport const DEFAULT_SETTINGS: SettingsState = {\r\n // 外观\r\n themeMode: \"light\",\r\n primaryColor: \"#409eff\",\r\n borderRadius: \"medium\",\r\n transitionType: \"slide\",\r\n enableTransition: true,\r\n\r\n // 布局\r\n layoutMode: \"side\",\r\n collapsed: false,\r\n fixedHeader: true,\r\n showBreadcrumb: true,\r\n showBreadcrumbIcon: true,\r\n showTagsView: true,\r\n tagsViewHeight: 44,\r\n tagsViewStyle: \"default\",\r\n showFooter: true,\r\n sidebarWidth: 220,\r\n sidebarCollapsedWidth: 64,\r\n headerHeight: 56,\r\n\r\n // 高级\r\n enableHotkeys: true,\r\n version: \"2.0.2\",\r\n};\r\n\r\n// ============ 其他常量 ============\r\n\r\n/** Color swatches for color picker */\r\nexport const COLOR_SWATCHES = PRESET_COLORS.map((c) => c.value);\r\n","import { defineStore } from \"pinia\";\r\nimport { ref, computed, watch } from \"vue\";\r\nimport type { ThemeMode } from \"@robot-admin/theme\";\r\nimport type {\r\n SettingsState,\r\n ThemePreset,\r\n LayoutMode,\r\n TransitionType,\r\n BorderRadiusSize,\r\n TagsViewStyle,\r\n SettingsStoreOptions,\r\n} from \"../types\";\r\nimport {\r\n DEFAULT_SETTINGS,\r\n BORDER_RADIUS_MAP,\r\n TRANSITION_MAP,\r\n} from \"../constants\";\r\n\r\n/**\r\n * 调整颜色亮度\r\n * @param color - 十六进制颜色值\r\n * @param amount - 调整量,正数变亮,负数变暗\r\n */\r\nexport function adjustColor(color: string, amount: number): string {\r\n const num = parseInt(color.replace(\"#\", \"\"), 16);\r\n const r = Math.min(255, Math.max(0, (num >> 16) + amount));\r\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amount));\r\n const b = Math.min(255, Math.max(0, (num & 0x0000ff) + amount));\r\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\r\n}\r\n\r\n/**\r\n * 创建设置管理 Store\r\n * @param options - 配置选项\r\n */\r\nexport function createSettingsStore(options: SettingsStoreOptions = {}) {\r\n const { defaults = {}, onThemeModeChange } = options;\r\n\r\n // 合并默认配置\r\n const finalDefaults = {\r\n ...DEFAULT_SETTINGS,\r\n ...defaults,\r\n };\r\n\r\n return defineStore(\"settings\", () => {\r\n // ============ 状态定义 ============\r\n\r\n // 外观设置\r\n const themeMode = ref<ThemeMode>(finalDefaults.themeMode);\r\n const primaryColor = ref<string>(finalDefaults.primaryColor);\r\n const borderRadius = ref<BorderRadiusSize>(finalDefaults.borderRadius);\r\n const transitionType = ref<TransitionType>(finalDefaults.transitionType);\r\n const enableTransition = ref<boolean>(finalDefaults.enableTransition);\r\n\r\n // 布局设置\r\n const layoutMode = ref<LayoutMode>(finalDefaults.layoutMode);\r\n const collapsed = ref<boolean>(finalDefaults.collapsed);\r\n const fixedHeader = ref<boolean>(finalDefaults.fixedHeader);\r\n const showBreadcrumb = ref<boolean>(finalDefaults.showBreadcrumb);\r\n const showBreadcrumbIcon = ref<boolean>(finalDefaults.showBreadcrumbIcon);\r\n const showTagsView = ref<boolean>(finalDefaults.showTagsView);\r\n const tagsViewHeight = ref<number>(finalDefaults.tagsViewHeight);\r\n const tagsViewStyle = ref<TagsViewStyle>(finalDefaults.tagsViewStyle);\r\n const showFooter = ref<boolean>(finalDefaults.showFooter);\r\n const sidebarWidth = ref<number>(finalDefaults.sidebarWidth);\r\n const sidebarCollapsedWidth = ref<number>(\r\n finalDefaults.sidebarCollapsedWidth,\r\n );\r\n const headerHeight = ref<number>(finalDefaults.headerHeight);\r\n\r\n // 高级设置\r\n const enableHotkeys = ref<boolean>(finalDefaults.enableHotkeys);\r\n const version = ref<string>(finalDefaults.version);\r\n\r\n // ============ 计算属性 ============\r\n\r\n /** 获取圆角值 */\r\n const borderRadiusValue = computed(\r\n () => BORDER_RADIUS_MAP[borderRadius.value],\r\n );\r\n\r\n /** 获取过渡动画名称 */\r\n const transitionName = computed(() => TRANSITION_MAP[transitionType.value]);\r\n\r\n /** 是否启用过渡动画 */\r\n const shouldEnableTransition = computed(\r\n () => enableTransition.value && transitionType.value !== \"none\",\r\n );\r\n\r\n /** 获取完整的设置状态 */\r\n const settingsState = computed<SettingsState>(() => ({\r\n themeMode: themeMode.value,\r\n primaryColor: primaryColor.value,\r\n borderRadius: borderRadius.value,\r\n transitionType: transitionType.value,\r\n enableTransition: enableTransition.value,\r\n layoutMode: layoutMode.value,\r\n collapsed: collapsed.value,\r\n fixedHeader: fixedHeader.value,\r\n showBreadcrumb: showBreadcrumb.value,\r\n showBreadcrumbIcon: showBreadcrumbIcon.value,\r\n showTagsView: showTagsView.value,\r\n tagsViewHeight: tagsViewHeight.value,\r\n tagsViewStyle: tagsViewStyle.value,\r\n showFooter: showFooter.value,\r\n sidebarWidth: sidebarWidth.value,\r\n sidebarCollapsedWidth: sidebarCollapsedWidth.value,\r\n headerHeight: headerHeight.value,\r\n enableHotkeys: enableHotkeys.value,\r\n version: version.value,\r\n }));\r\n\r\n // ============ 方法 ============\r\n\r\n /**\r\n * 同步 CSS Variables\r\n */\r\n const syncCSSVariables = () => {\r\n if (typeof document === \"undefined\") return;\r\n\r\n const root = document.documentElement;\r\n\r\n // 主题色\r\n root.style.setProperty(\"--primary-color\", primaryColor.value);\r\n root.style.setProperty(\r\n \"--primary-color-hover\",\r\n adjustColor(primaryColor.value, 10),\r\n );\r\n root.style.setProperty(\r\n \"--primary-color-pressed\",\r\n adjustColor(primaryColor.value, -10),\r\n );\r\n\r\n // 圆角\r\n root.style.setProperty(\"--border-radius\", borderRadiusValue.value);\r\n\r\n // 尺寸\r\n root.style.setProperty(\"--sidebar-width\", `${sidebarWidth.value}px`);\r\n root.style.setProperty(\r\n \"--sidebar-collapsed-width\",\r\n `${sidebarCollapsedWidth.value}px`,\r\n );\r\n root.style.setProperty(\"--header-height\", `${headerHeight.value}px`);\r\n root.style.setProperty(\"--tags-view-height\", `${tagsViewHeight.value}px`);\r\n };\r\n\r\n /**\r\n * 应用主题预设方案\r\n * 注意:只应用颜色配置,不改变布局模式和主题模式\r\n */\r\n const applyPreset = async (preset: ThemePreset) => {\r\n // 只应用主题色\r\n primaryColor.value = preset.primaryColor;\r\n\r\n // 应用其他细节配置(如果存在)\r\n if (preset.settings) {\r\n if (preset.settings.borderRadius)\r\n borderRadius.value = preset.settings.borderRadius;\r\n if (preset.settings.transitionType)\r\n transitionType.value = preset.settings.transitionType;\r\n if (preset.settings.showBreadcrumb !== undefined)\r\n showBreadcrumb.value = preset.settings.showBreadcrumb;\r\n if (preset.settings.showTagsView !== undefined)\r\n showTagsView.value = preset.settings.showTagsView;\r\n if (preset.settings.tagsViewStyle)\r\n tagsViewStyle.value = preset.settings.tagsViewStyle;\r\n }\r\n };\r\n\r\n /**\r\n * 重置配置\r\n */\r\n const resetSettings = () => {\r\n themeMode.value = finalDefaults.themeMode;\r\n primaryColor.value = finalDefaults.primaryColor;\r\n borderRadius.value = finalDefaults.borderRadius;\r\n transitionType.value = finalDefaults.transitionType;\r\n enableTransition.value = finalDefaults.enableTransition;\r\n\r\n layoutMode.value = finalDefaults.layoutMode;\r\n collapsed.value = finalDefaults.collapsed;\r\n fixedHeader.value = finalDefaults.fixedHeader;\r\n showBreadcrumb.value = finalDefaults.showBreadcrumb;\r\n showBreadcrumbIcon.value = finalDefaults.showBreadcrumbIcon;\r\n showTagsView.value = finalDefaults.showTagsView;\r\n tagsViewHeight.value = finalDefaults.tagsViewHeight;\r\n tagsViewStyle.value = finalDefaults.tagsViewStyle;\r\n showFooter.value = finalDefaults.showFooter;\r\n sidebarWidth.value = finalDefaults.sidebarWidth;\r\n sidebarCollapsedWidth.value = finalDefaults.sidebarCollapsedWidth;\r\n headerHeight.value = finalDefaults.headerHeight;\r\n\r\n enableHotkeys.value = finalDefaults.enableHotkeys;\r\n };\r\n\r\n /**\r\n * 更新主题模式\r\n */\r\n const updateThemeMode = async (mode: ThemeMode) => {\r\n themeMode.value = mode;\r\n if (onThemeModeChange) {\r\n await onThemeModeChange(mode);\r\n }\r\n };\r\n\r\n /**\r\n * 切换侧边栏折叠状态\r\n */\r\n const toggleCollapse = () => {\r\n collapsed.value = !collapsed.value;\r\n };\r\n\r\n // ============ 监听器 ============\r\n\r\n // 监听配置变化,同步 CSS Variables\r\n watch(\r\n [\r\n primaryColor,\r\n borderRadiusValue,\r\n sidebarWidth,\r\n sidebarCollapsedWidth,\r\n headerHeight,\r\n tagsViewHeight,\r\n ],\r\n () => {\r\n syncCSSVariables();\r\n },\r\n { immediate: true },\r\n );\r\n\r\n // ============ 返回 ============\r\n\r\n return {\r\n // 状态\r\n themeMode,\r\n primaryColor,\r\n borderRadius,\r\n transitionType,\r\n enableTransition,\r\n layoutMode,\r\n collapsed,\r\n fixedHeader,\r\n showBreadcrumb,\r\n showBreadcrumbIcon,\r\n showTagsView,\r\n tagsViewHeight,\r\n tagsViewStyle,\r\n showFooter,\r\n sidebarWidth,\r\n sidebarCollapsedWidth,\r\n headerHeight,\r\n enableHotkeys,\r\n version,\r\n\r\n // 计算属性\r\n borderRadiusValue,\r\n transitionName,\r\n shouldEnableTransition,\r\n settingsState,\r\n\r\n // 方法\r\n syncCSSVariables,\r\n applyPreset,\r\n resetSettings,\r\n updateThemeMode,\r\n toggleCollapse,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * 默认的设置 Store(使用默认配置)\r\n */\r\nexport const useSettingsStore = createSettingsStore();\r\n","/**\r\n * SettingsDrawer - 常量数据\r\n */\r\n\r\nimport { THEME_PRESETS, COLOR_SWATCHES } from \"../../constants\";\r\nimport type { ThemePreset } from \"../../types\";\r\n\r\n// 重新导出(内部使用)\r\nexport { COLOR_SWATCHES, THEME_PRESETS };\r\nexport type { ThemePreset };\r\n\r\n// 布局模式选项 - 完整的 6 种布局(含 SVG 图标,仅 UI 内部使用)\r\nexport const LAYOUT_MODE_OPTIONS = [\r\n {\r\n label: \"左侧菜单(默认)\",\r\n value: \"side\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"16\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"18\" y=\"0\" width=\"38\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"18\" y=\"12\" width=\"38\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n {\r\n label: \"顶部菜单(清爽)\",\r\n value: \"top\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"56\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"0\" y=\"12\" width=\"56\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"0\" y=\"22\" width=\"56\" height=\"24\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n {\r\n label: \"左侧混合(灵巧)\",\r\n value: \"mix\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"10\" y=\"0\" width=\"14\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"26\" y=\"0\" width=\"30\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.6\"/>\r\n <rect x=\"26\" y=\"12\" width=\"30\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n {\r\n label: \"顶部混合(侧优)\",\r\n value: \"mix-top\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"10\" y=\"0\" width=\"46\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"10\" y=\"12\" width=\"46\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n {\r\n label: \"反转混合(另类)\",\r\n value: \"reverse-horizontal-mix\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"56\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"44\" y=\"12\" width=\"12\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"0\" y=\"12\" width=\"42\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n {\r\n label: \"卡片网格(新颖)\",\r\n value: \"card-layout\",\r\n disabled: false,\r\n svg: `\r\n <rect x=\"0\" y=\"0\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\r\n <rect x=\"32\" y=\"0\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\r\n <rect x=\"0\" y=\"24\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.6\"/>\r\n <rect x=\"32\" y=\"24\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\r\n `,\r\n },\r\n];\r\n","<template>\r\n <NDrawer\r\n v-model:show=\"visible\"\r\n :width=\"380\"\r\n placement=\"right\"\r\n :trap-focus=\"false\"\r\n :block-scroll=\"false\"\r\n >\r\n <NDrawerContent title=\"⚙️ 布局配置\" closable>\r\n <NTabs v-model:value=\"activeTab\" animated class=\"settings-tabs\">\r\n <!-- 外观 Tab -->\r\n <NTabPane name=\"appearance\" tab=\"🎨 外观\">\r\n <!-- 预设方案网格 -->\r\n <div class=\"settings-section\">\r\n <div class=\"preset-grid\">\r\n <div\r\n v-for=\"preset in THEME_PRESETS\"\r\n :key=\"preset.name\"\r\n class=\"preset-card\"\r\n :class=\"{ active: isCurrentPreset(preset) }\"\r\n @click=\"handleApplyPreset(preset)\"\r\n >\r\n <div class=\"preset-icon\">{{ preset.icon }}</div>\r\n <div class=\"preset-name\">{{ preset.name }}</div>\r\n <div class=\"preset-color\">\r\n <span\r\n class=\"color-dot\"\r\n :style=\"{ backgroundColor: preset.primaryColor }\"\r\n ></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 主题模式 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">主题模式</div>\r\n <NRadioGroup\r\n v-model:value=\"settingsStore.themeMode\"\r\n class=\"mode-group\"\r\n >\r\n <NRadioButton value=\"light\">\r\n <span class=\"i-mdi:white-balance-sunny mr-1\"></span>\r\n 浅色\r\n </NRadioButton>\r\n <NRadioButton value=\"dark\">\r\n <span class=\"i-mdi:moon-waning-crescent mr-1\"></span>\r\n 深色\r\n </NRadioButton>\r\n <NRadioButton value=\"auto\">\r\n <span class=\"i-mdi:theme-light-dark mr-1\"></span>\r\n 自动\r\n </NRadioButton>\r\n </NRadioGroup>\r\n </div>\r\n\r\n <!-- 主题色 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">主题色</div>\r\n <div class=\"color-picker-wrapper\">\r\n <NColorPicker\r\n v-model:value=\"settingsStore.primaryColor\"\r\n :show-alpha=\"false\"\r\n :swatches=\"COLOR_SWATCHES\"\r\n :actions=\"['confirm']\"\r\n />\r\n <span class=\"color-value\">{{ settingsStore.primaryColor }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- 圆角大小 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">圆角大小</div>\r\n <NRadioGroup\r\n v-model:value=\"settingsStore.borderRadius\"\r\n class=\"radius-group\"\r\n >\r\n <NRadioButton value=\"small\">小 (4px)</NRadioButton>\r\n <NRadioButton value=\"medium\">中 (6px)</NRadioButton>\r\n <NRadioButton value=\"large\">大 (8px)</NRadioButton>\r\n </NRadioGroup>\r\n </div>\r\n\r\n <!-- 页面动画 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">页面动画</div>\r\n <div class=\"flex items-center justify-between mb-2\">\r\n <span class=\"text-sm\">启用动画</span>\r\n <NSwitch v-model:value=\"settingsStore.enableTransition\" />\r\n </div>\r\n <NRadioGroup\r\n v-model:value=\"settingsStore.transitionType\"\r\n :disabled=\"!settingsStore.enableTransition\"\r\n class=\"transition-group\"\r\n >\r\n <NRadioButton value=\"fade\">淡入</NRadioButton>\r\n <NRadioButton value=\"slide\">滑动</NRadioButton>\r\n <NRadioButton value=\"zoom\">缩放</NRadioButton>\r\n <NRadioButton value=\"none\">无</NRadioButton>\r\n </NRadioGroup>\r\n </div>\r\n\r\n <!-- 恢复默认 -->\r\n <div class=\"settings-section\">\r\n <NButton block secondary @click=\"handleResetAppearance\">\r\n <template #icon>\r\n <span class=\"i-mdi:restore\"></span>\r\n </template>\r\n 恢复外观默认设置\r\n </NButton>\r\n </div>\r\n </NTabPane>\r\n\r\n <!-- 布局 Tab -->\r\n <NTabPane name=\"layout\" tab=\"📐 布局\">\r\n <!-- 布局模式 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">布局模式</div>\r\n <div class=\"layout-grid\">\r\n <div\r\n v-for=\"mode in LAYOUT_MODE_OPTIONS\"\r\n :key=\"mode.value\"\r\n class=\"layout-item\"\r\n :class=\"{\r\n active: settingsStore.layoutMode === mode.value,\r\n disabled: mode.disabled,\r\n }\"\r\n @click.stop=\"handleLayoutChange(mode.value, mode.disabled)\"\r\n >\r\n <div class=\"layout-screenshot\">\r\n <svg\r\n class=\"layout-svg\"\r\n viewBox=\"0 0 56 48\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <g v-html=\"mode.svg\"></g>\r\n </svg>\r\n </div>\r\n <div class=\"layout-label\">\r\n {{ mode.label }}\r\n <span v-if=\"mode.disabled\" class=\"badge-soon\">敬请期待</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 界面元素 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">界面元素</div>\r\n <div class=\"setting-item\">\r\n <span>显示面包屑</span>\r\n <NSwitch v-model:value=\"settingsStore.showBreadcrumb\" />\r\n </div>\r\n <div class=\"setting-item\">\r\n <span>显示面包屑图标</span>\r\n <NSwitch\r\n v-model:value=\"settingsStore.showBreadcrumbIcon\"\r\n :disabled=\"!settingsStore.showBreadcrumb\"\r\n />\r\n </div>\r\n <div class=\"setting-item\">\r\n <span>显示标签页</span>\r\n <NSwitch v-model:value=\"settingsStore.showTagsView\" />\r\n </div>\r\n <div class=\"setting-item\">\r\n <span>显示页脚</span>\r\n <NSwitch v-model:value=\"settingsStore.showFooter\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 尺寸调整 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">尺寸调整</div>\r\n <div class=\"slider-item\">\r\n <div class=\"slider-label\">\r\n <span>侧边栏宽度</span>\r\n <span class=\"slider-value\"\r\n >{{ settingsStore.sidebarWidth }}px</span\r\n >\r\n </div>\r\n <NSlider\r\n v-model:value=\"settingsStore.sidebarWidth\"\r\n :min=\"180\"\r\n :max=\"280\"\r\n :step=\"10\"\r\n :marks=\"{ 180: '180', 220: '220', 280: '280' }\"\r\n />\r\n </div>\r\n <div class=\"slider-item\">\r\n <div class=\"slider-label\">\r\n <span>头部高度</span>\r\n <span class=\"slider-value\"\r\n >{{ settingsStore.headerHeight }}px</span\r\n >\r\n </div>\r\n <NSlider\r\n v-model:value=\"settingsStore.headerHeight\"\r\n :min=\"48\"\r\n :max=\"64\"\r\n :step=\"4\"\r\n :marks=\"{ 48: '48', 56: '56', 64: '64' }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 恢复默认 -->\r\n <div class=\"settings-section\">\r\n <NButton block secondary @click=\"handleResetLayout\">\r\n <template #icon>\r\n <span class=\"i-mdi:restore\"></span>\r\n </template>\r\n 恢复布局默认设置\r\n </NButton>\r\n </div>\r\n </NTabPane>\r\n\r\n <!-- 功能 Tab -->\r\n <NTabPane name=\"features\" tab=\"🔧 功能\">\r\n <!-- 缓存管理 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">缓存管理</div>\r\n <div class=\"action-buttons-grid\">\r\n <NButton secondary @click=\"handleClearCache\">\r\n <template #icon>\r\n <span class=\"i-mdi:delete-sweep\"></span>\r\n </template>\r\n 清除缓存\r\n </NButton>\r\n <NButton secondary @click=\"handleReload\">\r\n <template #icon>\r\n <span class=\"i-mdi:refresh\"></span>\r\n </template>\r\n 重新加载\r\n </NButton>\r\n </div>\r\n </div>\r\n\r\n <!-- 配置管理 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">配置管理</div>\r\n <div class=\"action-buttons-grid\">\r\n <NButton secondary @click=\"handleExportConfig\">\r\n <template #icon>\r\n <span class=\"i-mdi:download\"></span>\r\n </template>\r\n 导出配置\r\n </NButton>\r\n <NButton secondary @click=\"handleImportConfig\">\r\n <template #icon>\r\n <span class=\"i-mdi:upload\"></span>\r\n </template>\r\n 导入配置\r\n </NButton>\r\n </div>\r\n <NButton\r\n block\r\n type=\"error\"\r\n secondary\r\n class=\"mt-2\"\r\n @click=\"handleReset\"\r\n >\r\n <template #icon>\r\n <span class=\"i-mdi:restore\"></span>\r\n </template>\r\n 重置所有配置\r\n </NButton>\r\n </div>\r\n\r\n <!-- 系统模式 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">系统模式</div>\r\n <div class=\"setting-item\">\r\n <div class=\"setting-label\">\r\n <span>灰色模式</span>\r\n <span class=\"setting-desc\">用于哀悼日场景</span>\r\n </div>\r\n <NSwitch v-model:value=\"grayMode\" />\r\n </div>\r\n <div class=\"setting-item\">\r\n <div class=\"setting-label\">\r\n <span>色弱模式</span>\r\n <span class=\"setting-desc\">提供无障碍访问支持</span>\r\n </div>\r\n <NSwitch v-model:value=\"colorWeakMode\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 水印设置 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">水印设置</div>\r\n <div class=\"setting-item\">\r\n <span>启用水印</span>\r\n <NSwitch v-model:value=\"watermarkEnabled\" />\r\n </div>\r\n <div v-if=\"watermarkEnabled\" class=\"mt-2\">\r\n <NInput\r\n v-model:value=\"watermarkText\"\r\n placeholder=\"请输入水印内容\"\r\n size=\"small\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 系统信息 -->\r\n <div class=\"settings-section\">\r\n <div class=\"section-title\">系统信息</div>\r\n <div class=\"system-info\">\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">浏览器</span>\r\n <span class=\"info-value\">{{ systemInfo.browser }}</span>\r\n </div>\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">操作系统</span>\r\n <span class=\"info-value\">{{ systemInfo.os }}</span>\r\n </div>\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">屏幕分辨率</span>\r\n <span class=\"info-value\">{{ systemInfo.resolution }}</span>\r\n </div>\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">设备像素比</span>\r\n <span class=\"info-value\">{{ systemInfo.pixelRatio }}</span>\r\n </div>\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">语言</span>\r\n <span class=\"info-value\">{{ systemInfo.language }}</span>\r\n </div>\r\n <div class=\"info-item\">\r\n <span class=\"info-label\">时区</span>\r\n <span class=\"info-value\">{{ systemInfo.timezone }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </NTabPane>\r\n </NTabs>\r\n </NDrawerContent>\r\n </NDrawer>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, onUnmounted } from \"vue\";\r\nimport {\r\n NDrawer,\r\n NDrawerContent,\r\n NTabs,\r\n NTabPane,\r\n NRadioGroup,\r\n NRadioButton,\r\n NColorPicker,\r\n NSwitch,\r\n NButton,\r\n NSlider,\r\n NInput,\r\n useMessage,\r\n useDialog,\r\n} from \"naive-ui\";\r\nimport { useSettingsStore } from \"../../stores/settings\";\r\nimport { DEFAULT_SETTINGS } from \"../../constants\";\r\nimport { COLOR_SWATCHES, LAYOUT_MODE_OPTIONS, THEME_PRESETS } from \"./data\";\r\nimport type { ThemePreset } from \"../../types\";\r\n\r\n// ============ 数据定义 ============\r\n\r\nconst message = useMessage();\r\nconst dialog = useDialog();\r\nconst settingsStore = useSettingsStore();\r\nconst visible = defineModel<boolean>(\"show\", { default: false });\r\nconst activeTab = ref(\"appearance\");\r\n\r\n// 功能开关\r\nconst grayMode = ref(false);\r\nconst colorWeakMode = ref(false);\r\nconst watermarkEnabled = ref(false);\r\nconst watermarkText = ref(\"Robot Admin\");\r\n\r\n// 水印元素引用\r\nlet watermarkEl: HTMLElement | null = null;\r\n\r\n// 创建水印函数\r\nconst createWatermark = (text: string) => {\r\n // 移除旧水印\r\n if (watermarkEl) {\r\n document.body.removeChild(watermarkEl);\r\n watermarkEl = null;\r\n }\r\n\r\n // 创建 canvas\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\")!;\r\n canvas.width = 200;\r\n canvas.height = 150;\r\n\r\n ctx.font = \"14px Microsoft JhengHei\";\r\n ctx.fillStyle = \"rgba(120, 120, 120, 0.15)\";\r\n ctx.rotate((-20 * Math.PI) / 180);\r\n ctx.fillText(text, 0, 80);\r\n\r\n // 创建水印容器\r\n watermarkEl = document.createElement(\"div\");\r\n watermarkEl.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n background-image: url(${canvas.toDataURL()});\r\n background-repeat: repeat;\r\n z-index: 9999;\r\n user-select: none;\r\n `;\r\n\r\n document.body.appendChild(watermarkEl);\r\n};\r\n\r\n// 移除水印函数\r\nconst removeWatermark = () => {\r\n if (watermarkEl) {\r\n document.body.removeChild(watermarkEl);\r\n watermarkEl = null;\r\n }\r\n};\r\n\r\n// 监听灰色模式\r\nwatch(grayMode, (val) => {\r\n document.documentElement.classList.toggle(\"gray-mode\", val);\r\n});\r\n\r\n// 监听色弱模式\r\nwatch(colorWeakMode, (val) => {\r\n document.documentElement.classList.toggle(\"color-weak-mode\", val);\r\n});\r\n\r\n// 监听水印开关\r\nwatch(watermarkEnabled, (val) => {\r\n if (val) {\r\n createWatermark(watermarkText.value);\r\n } else {\r\n removeWatermark();\r\n }\r\n});\r\n\r\n// 监听水印文本\r\nwatch(watermarkText, (val) => {\r\n if (watermarkEnabled.value) {\r\n createWatermark(val);\r\n }\r\n});\r\n\r\n// 获取系统信息\r\nconst systemInfo = computed(() => {\r\n const ua = navigator.userAgent;\r\n let browser = \"Unknown\";\r\n let os = \"Unknown\";\r\n\r\n // 检测浏览器\r\n if (ua.includes(\"Chrome\")) browser = \"Chrome\";\r\n else if (ua.includes(\"Firefox\")) browser = \"Firefox\";\r\n else if (ua.includes(\"Safari\")) browser = \"Safari\";\r\n else if (ua.includes(\"Edge\")) browser = \"Edge\";\r\n\r\n // 检测操作系统\r\n if (ua.includes(\"Windows\")) os = \"Windows\";\r\n else if (ua.includes(\"Mac\")) os = \"macOS\";\r\n else if (ua.includes(\"Linux\")) os = \"Linux\";\r\n else if (ua.includes(\"Android\")) os = \"Android\";\r\n else if (ua.includes(\"iOS\")) os = \"iOS\";\r\n\r\n return {\r\n browser,\r\n os,\r\n resolution: `${window.screen.width} × ${window.screen.height}`,\r\n pixelRatio: window.devicePixelRatio + \"x\",\r\n language: navigator.language,\r\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n };\r\n});\r\n\r\n// 组件卸载时清理水印\r\nonUnmounted(() => {\r\n removeWatermark();\r\n});\r\n\r\n// 处理布局切换 - 阻止抽屉关闭\r\nconst handleLayoutChange = (value: string, disabled?: boolean) => {\r\n if (disabled) return;\r\n settingsStore.layoutMode = value as any;\r\n};\r\n\r\n// ============ 方法 ============\r\n\r\n/**\r\n * 判断是否是当前预设\r\n */\r\nconst isCurrentPreset = (preset: ThemePreset) => {\r\n return settingsStore.primaryColor === preset.primaryColor;\r\n};\r\n\r\n/**\r\n * 应用预设方案\r\n */\r\nconst handleApplyPreset = (preset: ThemePreset) => {\r\n settingsStore.applyPreset(preset);\r\n message.success(`已应用「${preset.name}」主题方案`);\r\n};\r\n\r\n/**\r\n * 恢复外观默认设置\r\n */\r\nconst handleResetAppearance = () => {\r\n settingsStore.themeMode = DEFAULT_SETTINGS.themeMode;\r\n settingsStore.primaryColor = DEFAULT_SETTINGS.primaryColor;\r\n settingsStore.borderRadius = DEFAULT_SETTINGS.borderRadius;\r\n settingsStore.transitionType = DEFAULT_SETTINGS.transitionType;\r\n settingsStore.enableTransition = DEFAULT_SETTINGS.enableTransition;\r\n message.success(\"已恢复外观默认设置\");\r\n};\r\n\r\n/**\r\n * 恢复布局默认设置\r\n */\r\nconst handleResetLayout = () => {\r\n settingsStore.layoutMode = DEFAULT_SETTINGS.layoutMode;\r\n settingsStore.fixedHeader = DEFAULT_SETTINGS.fixedHeader;\r\n settingsStore.showBreadcrumb = DEFAULT_SETTINGS.showBreadcrumb;\r\n settingsStore.showBreadcrumbIcon = DEFAULT_SETTINGS.showBreadcrumbIcon;\r\n settingsStore.showTagsView = DEFAULT_SETTINGS.showTagsView;\r\n settingsStore.tagsViewHeight = DEFAULT_SETTINGS.tagsViewHeight;\r\n settingsStore.tagsViewStyle = DEFAULT_SETTINGS.tagsViewStyle;\r\n settingsStore.showFooter = DEFAULT_SETTINGS.showFooter;\r\n settingsStore.sidebarWidth = DEFAULT_SETTINGS.sidebarWidth;\r\n settingsStore.sidebarCollapsedWidth = DEFAULT_SETTINGS.sidebarCollapsedWidth;\r\n settingsStore.headerHeight = DEFAULT_SETTINGS.headerHeight;\r\n message.success(\"已恢复布局默认设置\");\r\n};\r\n\r\n/**\r\n * 重置配置\r\n */\r\nconst handleReset = () => {\r\n dialog.warning({\r\n title: \"确认重置\",\r\n content: \"确定要恢复默认配置吗?此操作不可撤销。\",\r\n positiveText: \"确认\",\r\n negativeText: \"取消\",\r\n onPositiveClick: () => {\r\n settingsStore.resetSettings();\r\n message.success(\"已恢复默认配置\");\r\n },\r\n });\r\n};\r\n\r\n/**\r\n * 清除缓存\r\n */\r\nconst handleClearCache = () => {\r\n dialog.warning({\r\n title: \"确认清除\",\r\n content: \"确定要清除浏览器缓存吗?\",\r\n positiveText: \"确认\",\r\n negativeText: \"取消\",\r\n onPositiveClick: () => {\r\n // 清除 localStorage\r\n const keysToKeep = [\"theme-mode\", \"robot-admin-settings\"];\r\n const allKeys = Object.keys(localStorage);\r\n allKeys.forEach((key) => {\r\n if (!keysToKeep.includes(key)) {\r\n localStorage.removeItem(key);\r\n }\r\n });\r\n // 清除 sessionStorage\r\n sessionStorage.clear();\r\n message.success(\"缓存已清除\");\r\n },\r\n });\r\n};\r\n\r\n/**\r\n * 重新加载页面\r\n */\r\nconst handleReload = () => {\r\n location.reload();\r\n};\r\n\r\n/**\r\n * 导出配置\r\n */\r\nconst handleExportConfig = () => {\r\n const config = {\r\n settings: settingsStore.settingsState,\r\n gray: grayMode.value,\r\n colorWeak: colorWeakMode.value,\r\n watermark: {\r\n enabled: watermarkEnabled.value,\r\n text: watermarkText.value,\r\n },\r\n exportTime: new Date().toISOString(),\r\n };\r\n const blob = new Blob([JSON.stringify(config, null, 2)], {\r\n type: \"application/json\",\r\n });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = `robot-admin-config-${Date.now()}.json`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n message.success(\"配置已导出\");\r\n};\r\n\r\n/**\r\n * 导入配置\r\n */\r\nconst handleImportConfig = () => {\r\n const input = document.createElement(\"input\");\r\n input.type = \"file\";\r\n input.accept = \"application/json\";\r\n input.onchange = async (e: Event) => {\r\n const file = (e.target as HTMLInputElement).files?.[0];\r\n if (!file) return;\r\n\r\n try {\r\n const text = await file.text();\r\n const config = JSON.parse(text);\r\n\r\n // 应用配置\r\n if (config.settings) {\r\n settingsStore.$patch(config.settings);\r\n }\r\n if (config.gray !== undefined) {\r\n grayMode.value = config.gray;\r\n }\r\n if (config.colorWeak !== undefined) {\r\n colorWeakMode.value = config.colorWeak;\r\n }\r\n if (config.watermark) {\r\n watermarkEnabled.value = config.watermark.enabled;\r\n watermarkText.value = config.watermark.text;\r\n }\r\n\r\n message.success(\"配置已导入\");\r\n } catch (error) {\r\n message.error(\"配置文件格式错误\");\r\n }\r\n };\r\n input.click();\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@import \"../../styles/settings.scss\";\r\n</style>\r\n","/**\r\n * @robot-admin/layout\r\n *\r\n * 布局系统一键初始化\r\n */\r\n\r\nimport type { App } from \"vue\";\r\nimport type { SettingsStoreOptions } from \"./types\";\r\nimport { createSettingsStore } from \"./stores/settings\";\r\n\r\n/**\r\n * 初始化布局系统\r\n *\r\n * @example\r\n * ```ts\r\n * import { setupLayout } from '@robot-admin/layout'\r\n * setupLayout(app, {\r\n * onThemeModeChange: async (mode) => {\r\n * const themeStore = useThemeStore()\r\n * await themeStore.setMode(mode)\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function setupLayout(_app: App, options: SettingsStoreOptions = {}) {\r\n // 注册 settings store\r\n const settingsStore = createSettingsStore(options);\r\n\r\n // 初始化 CSS Variables\r\n settingsStore().syncCSSVariables();\r\n\r\n return settingsStore;\r\n}\r\n"],"names":["PRESET_COLORS","THEME_PRESETS","LAYOUT_MODES","BORDER_RADIUS_MAP","TRANSITION_MAP","DEFAULT_SETTINGS","COLOR_SWATCHES","c","adjustColor","color","amount","num","r","g","b","createSettingsStore","options","defaults","onThemeModeChange","finalDefaults","defineStore","themeMode","ref","primaryColor","borderRadius","transitionType","enableTransition","layoutMode","collapsed","fixedHeader","showBreadcrumb","showBreadcrumbIcon","showTagsView","tagsViewHeight","tagsViewStyle","showFooter","sidebarWidth","sidebarCollapsedWidth","headerHeight","enableHotkeys","version","borderRadiusValue","computed","transitionName","shouldEnableTransition","settingsState","syncCSSVariables","root","applyPreset","preset","resetSettings","updateThemeMode","mode","toggleCollapse","watch","useSettingsStore","LAYOUT_MODE_OPTIONS","message","useMessage","dialog","useDialog","settingsStore","visible","_useModel","__props","activeTab","grayMode","colorWeakMode","watermarkEnabled","watermarkText","watermarkEl","createWatermark","text","canvas","ctx","removeWatermark","val","systemInfo","ua","browser","os","onUnmounted","handleLayoutChange","value","disabled","isCurrentPreset","handleApplyPreset","handleResetAppearance","handleResetLayout","handleReset","handleClearCache","keysToKeep","key","handleReload","handleExportConfig","config","blob","url","a","handleImportConfig","input","file","_createBlock","_unref","NDrawer","$event","_createVNode","NDrawerContent","NTabs","NTabPane","_createElementVNode","_hoisted_1","_hoisted_2","_createElementBlock","_Fragment","_renderList","_normalizeClass","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_normalizeStyle","_hoisted_7","_cache","NRadioGroup","NRadioButton","_hoisted_8","_hoisted_9","NColorPicker","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","NSwitch","_hoisted_14","NButton","_hoisted_15","_hoisted_16","_withModifiers","_hoisted_18","_openBlock","_hoisted_19","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","NSlider","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","NInput","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","setupLayout","_app"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants/index.ts","../src/stores/settings.ts","../src/composables/useLayoutContext.ts","../src/composables/useLayoutCache.ts","../src/components/layouts/SideLayout/index.vue","../src/components/ResponsiveMenu/index.vue","../src/components/layouts/TopLayout/index.vue","../src/composables/useMenuSplit.ts","../src/components/layouts/MixLayout/index.vue","../src/components/layouts/MixTopLayout/index.vue","../src/components/layouts/ReverseHorizontalMixLayout/index.vue","../src/components/layouts/CardLayout/index.vue","../src/components/C_LayoutContainer/index.vue","../src/components/SettingsDrawer/data.ts","../src/components/SettingsDrawer/index.vue","../src/components/BrandLogo/index.vue","../src/components/IconMenu/index.vue","../src/components/FloatingMenu/index.vue","../src/components/SideMenu/index.vue","../src/components/DrawerMenu/index.vue","../src/components/MenuTrigger/index.vue","../src/setup.ts"],"sourcesContent":["/**\n * 布局和设置系统 - 常量定义\n */\n\nimport type {\n ThemePreset,\n SettingsState,\n LayoutInfo,\n PresetColor,\n} from \"../types\";\n\n// ============ 主题色预设 ============\nexport const PRESET_COLORS: PresetColor[] = [\n { name: \"拂晓蓝\", value: \"#409eff\" },\n { name: \"薄暮红\", value: \"#f5222d\" },\n { name: \"火山橙\", value: \"#fa541c\" },\n { name: \"日暮黄\", value: \"#faad14\" },\n { name: \"极光绿\", value: \"#52c41a\" },\n { name: \"明青\", value: \"#13c2c2\" },\n { name: \"极客蓝\", value: \"#2f54eb\" },\n { name: \"酱紫\", value: \"#722ed1\" },\n] as const;\n\n// ============ 主题预设方案 ============\nexport const THEME_PRESETS: ThemePreset[] = [\n {\n name: \"科技蓝\",\n icon: \"💙\",\n primaryColor: \"#409eff\",\n },\n {\n name: \"清新绿\",\n icon: \"💚\",\n primaryColor: \"#52c41a\",\n },\n {\n name: \"商务灰\",\n icon: \"🖤\",\n primaryColor: \"#595959\",\n },\n {\n name: \"活力橙\",\n icon: \"🧡\",\n primaryColor: \"#fa8c16\",\n },\n {\n name: \"优雅紫\",\n icon: \"💜\",\n primaryColor: \"#722ed1\",\n },\n {\n name: \"经典红\",\n icon: \"❤️\",\n primaryColor: \"#f5222d\",\n },\n];\n\n// ============ 布局模式信息 ============\nexport const LAYOUT_MODES: LayoutInfo[] = [\n {\n mode: \"side\",\n label: \"左侧菜单\",\n description: \"经典的左侧导航布局\",\n icon: \"i-mdi:page-layout-sidebar-left\",\n },\n {\n mode: \"top\",\n label: \"顶部菜单\",\n description: \"顶部水平导航布局\",\n icon: \"i-mdi:page-layout-header\",\n },\n {\n mode: \"mix\",\n label: \"混合菜单\",\n description: \"顶部 + 侧边混合布局\",\n icon: \"i-mdi:page-layout-header-sidebar-left\",\n },\n {\n mode: \"mix-top\",\n label: \"顶部混合\",\n description: \"侧边优先的混合布局\",\n icon: \"i-mdi:page-layout-sidebar-left-header\",\n },\n {\n mode: \"reverse-horizontal-mix\",\n label: \"反转混合\",\n description: \"反转的水平混合布局\",\n icon: \"i-mdi:page-layout-header-footer\",\n },\n {\n mode: \"card-layout\",\n label: \"卡片布局\",\n description: \"卡片式布局风格\",\n icon: \"i-mdi:card-outline\",\n },\n];\n\n// ============ 圆角映射 ============\nexport const BORDER_RADIUS_MAP = {\n small: \"4px\",\n medium: \"6px\",\n large: \"8px\",\n} as const;\n\n// ============ 动画映射 ============\nexport const TRANSITION_MAP = {\n fade: \"fade-transform\",\n slide: \"fade-slide\",\n zoom: \"fade-zoom\",\n none: \"\",\n} as const;\n\n// ============ 默认配置 ============\nexport const DEFAULT_SETTINGS: SettingsState = {\n // 外观\n themeMode: \"light\",\n primaryColor: \"#409eff\",\n borderRadius: \"medium\",\n transitionType: \"slide\",\n enableTransition: true,\n\n // 布局\n layoutMode: \"side\",\n collapsed: false,\n fixedHeader: true,\n showBreadcrumb: true,\n showBreadcrumbIcon: true,\n showTagsView: true,\n tagsViewHeight: 44,\n tagsViewStyle: \"default\",\n showFooter: true,\n sidebarWidth: 220,\n sidebarCollapsedWidth: 64,\n headerHeight: 56,\n\n // 高级\n enableHotkeys: true,\n version: \"2.0.2\",\n};\n\n// ============ 其他常量 ============\n\n/** Color swatches for color picker */\nexport const COLOR_SWATCHES = PRESET_COLORS.map((c) => c.value);\n","import { defineStore } from \"pinia\";\nimport { ref, computed, watch } from \"vue\";\nimport type { ThemeMode } from \"@robot-admin/theme\";\nimport type {\n SettingsState,\n ThemePreset,\n LayoutMode,\n TransitionType,\n BorderRadiusSize,\n TagsViewStyle,\n SettingsStoreOptions,\n} from \"../types\";\nimport {\n DEFAULT_SETTINGS,\n BORDER_RADIUS_MAP,\n TRANSITION_MAP,\n} from \"../constants\";\n\n/**\n * 调整颜色亮度\n * @param color - 十六进制颜色值\n * @param amount - 调整量,正数变亮,负数变暗\n */\nexport function adjustColor(color: string, amount: number): string {\n const num = parseInt(color.replace(\"#\", \"\"), 16);\n const r = Math.min(255, Math.max(0, (num >> 16) + amount));\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amount));\n const b = Math.min(255, Math.max(0, (num & 0x0000ff) + amount));\n return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, \"0\")}`;\n}\n\n/**\n * 创建设置管理 Store\n * @param options - 配置选项\n */\nexport function createSettingsStore(options: SettingsStoreOptions = {}) {\n const { defaults = {}, onThemeModeChange } = options;\n\n // 合并默认配置\n const finalDefaults = {\n ...DEFAULT_SETTINGS,\n ...defaults,\n };\n\n return defineStore(\"settings\", () => {\n // ============ 状态定义 ============\n\n // 外观设置\n const themeMode = ref<ThemeMode>(finalDefaults.themeMode);\n const primaryColor = ref<string>(finalDefaults.primaryColor);\n const borderRadius = ref<BorderRadiusSize>(finalDefaults.borderRadius);\n const transitionType = ref<TransitionType>(finalDefaults.transitionType);\n const enableTransition = ref<boolean>(finalDefaults.enableTransition);\n\n // 布局设置\n const layoutMode = ref<LayoutMode>(finalDefaults.layoutMode);\n const collapsed = ref<boolean>(finalDefaults.collapsed);\n const fixedHeader = ref<boolean>(finalDefaults.fixedHeader);\n const showBreadcrumb = ref<boolean>(finalDefaults.showBreadcrumb);\n const showBreadcrumbIcon = ref<boolean>(finalDefaults.showBreadcrumbIcon);\n const showTagsView = ref<boolean>(finalDefaults.showTagsView);\n const tagsViewHeight = ref<number>(finalDefaults.tagsViewHeight);\n const tagsViewStyle = ref<TagsViewStyle>(finalDefaults.tagsViewStyle);\n const showFooter = ref<boolean>(finalDefaults.showFooter);\n const sidebarWidth = ref<number>(finalDefaults.sidebarWidth);\n const sidebarCollapsedWidth = ref<number>(\n finalDefaults.sidebarCollapsedWidth,\n );\n const headerHeight = ref<number>(finalDefaults.headerHeight);\n\n // 高级设置\n const enableHotkeys = ref<boolean>(finalDefaults.enableHotkeys);\n const version = ref<string>(finalDefaults.version);\n\n // ============ 计算属性 ============\n\n /** 获取圆角值 */\n const borderRadiusValue = computed(\n () => BORDER_RADIUS_MAP[borderRadius.value],\n );\n\n /** 获取过渡动画名称 */\n const transitionName = computed(() => TRANSITION_MAP[transitionType.value]);\n\n /** 是否启用过渡动画 */\n const shouldEnableTransition = computed(\n () => enableTransition.value && transitionType.value !== \"none\",\n );\n\n /** 获取完整的设置状态 */\n const settingsState = computed<SettingsState>(() => ({\n themeMode: themeMode.value,\n primaryColor: primaryColor.value,\n borderRadius: borderRadius.value,\n transitionType: transitionType.value,\n enableTransition: enableTransition.value,\n layoutMode: layoutMode.value,\n collapsed: collapsed.value,\n fixedHeader: fixedHeader.value,\n showBreadcrumb: showBreadcrumb.value,\n showBreadcrumbIcon: showBreadcrumbIcon.value,\n showTagsView: showTagsView.value,\n tagsViewHeight: tagsViewHeight.value,\n tagsViewStyle: tagsViewStyle.value,\n showFooter: showFooter.value,\n sidebarWidth: sidebarWidth.value,\n sidebarCollapsedWidth: sidebarCollapsedWidth.value,\n headerHeight: headerHeight.value,\n enableHotkeys: enableHotkeys.value,\n version: version.value,\n }));\n\n // ============ 方法 ============\n\n /**\n * 同步 CSS Variables\n */\n const syncCSSVariables = () => {\n if (typeof document === \"undefined\") return;\n\n const root = document.documentElement;\n\n // 主题色\n root.style.setProperty(\"--primary-color\", primaryColor.value);\n root.style.setProperty(\n \"--primary-color-hover\",\n adjustColor(primaryColor.value, 10),\n );\n root.style.setProperty(\n \"--primary-color-pressed\",\n adjustColor(primaryColor.value, -10),\n );\n\n // 圆角\n root.style.setProperty(\"--border-radius\", borderRadiusValue.value);\n\n // 尺寸\n root.style.setProperty(\"--sidebar-width\", `${sidebarWidth.value}px`);\n root.style.setProperty(\n \"--sidebar-collapsed-width\",\n `${sidebarCollapsedWidth.value}px`,\n );\n root.style.setProperty(\"--header-height\", `${headerHeight.value}px`);\n root.style.setProperty(\"--tags-view-height\", `${tagsViewHeight.value}px`);\n };\n\n /**\n * 应用主题预设方案\n * 注意:只应用颜色配置,不改变布局模式和主题模式\n */\n const applyPreset = async (preset: ThemePreset) => {\n // 只应用主题色\n primaryColor.value = preset.primaryColor;\n\n // 应用其他细节配置(如果存在)\n if (preset.settings) {\n if (preset.settings.borderRadius)\n borderRadius.value = preset.settings.borderRadius;\n if (preset.settings.transitionType)\n transitionType.value = preset.settings.transitionType;\n if (preset.settings.showBreadcrumb !== undefined)\n showBreadcrumb.value = preset.settings.showBreadcrumb;\n if (preset.settings.showTagsView !== undefined)\n showTagsView.value = preset.settings.showTagsView;\n if (preset.settings.tagsViewStyle)\n tagsViewStyle.value = preset.settings.tagsViewStyle;\n }\n };\n\n /**\n * 重置配置\n */\n const resetSettings = () => {\n themeMode.value = finalDefaults.themeMode;\n primaryColor.value = finalDefaults.primaryColor;\n borderRadius.value = finalDefaults.borderRadius;\n transitionType.value = finalDefaults.transitionType;\n enableTransition.value = finalDefaults.enableTransition;\n\n layoutMode.value = finalDefaults.layoutMode;\n collapsed.value = finalDefaults.collapsed;\n fixedHeader.value = finalDefaults.fixedHeader;\n showBreadcrumb.value = finalDefaults.showBreadcrumb;\n showBreadcrumbIcon.value = finalDefaults.showBreadcrumbIcon;\n showTagsView.value = finalDefaults.showTagsView;\n tagsViewHeight.value = finalDefaults.tagsViewHeight;\n tagsViewStyle.value = finalDefaults.tagsViewStyle;\n showFooter.value = finalDefaults.showFooter;\n sidebarWidth.value = finalDefaults.sidebarWidth;\n sidebarCollapsedWidth.value = finalDefaults.sidebarCollapsedWidth;\n headerHeight.value = finalDefaults.headerHeight;\n\n enableHotkeys.value = finalDefaults.enableHotkeys;\n };\n\n /**\n * 更新主题模式\n */\n const updateThemeMode = async (mode: ThemeMode) => {\n themeMode.value = mode;\n if (onThemeModeChange) {\n await onThemeModeChange(mode);\n }\n };\n\n /**\n * 切换侧边栏折叠状态\n */\n const toggleCollapse = () => {\n collapsed.value = !collapsed.value;\n };\n\n // ============ 监听器 ============\n\n // 监听配置变化,同步 CSS Variables\n watch(\n [\n primaryColor,\n borderRadiusValue,\n sidebarWidth,\n sidebarCollapsedWidth,\n headerHeight,\n tagsViewHeight,\n ],\n () => {\n syncCSSVariables();\n },\n { immediate: true },\n );\n\n // ============ 返回 ============\n\n return {\n // 状态\n themeMode,\n primaryColor,\n borderRadius,\n transitionType,\n enableTransition,\n layoutMode,\n collapsed,\n fixedHeader,\n showBreadcrumb,\n showBreadcrumbIcon,\n showTagsView,\n tagsViewHeight,\n tagsViewStyle,\n showFooter,\n sidebarWidth,\n sidebarCollapsedWidth,\n headerHeight,\n enableHotkeys,\n version,\n\n // 计算属性\n borderRadiusValue,\n transitionName,\n shouldEnableTransition,\n settingsState,\n\n // 方法\n syncCSSVariables,\n applyPreset,\n resetSettings,\n updateThemeMode,\n toggleCollapse,\n };\n });\n}\n\n/**\n * 默认的设置 Store(使用默认配置)\n */\nexport const useSettingsStore = createSettingsStore();\n","/**\r\n * @robot-admin/layout\r\n *\r\n * 布局上下文 - Provide/Inject 机制\r\n * 消费方通过 provide 注入数据,骨架组件通过 inject 读取\r\n * 实现布局骨架与业务数据的完全解耦\r\n */\r\n\r\nimport type { InjectionKey, ComputedRef, Component } from \"vue\";\r\nimport { inject } from \"vue\";\r\nimport type { MenuOptions } from \"../types/menu\";\r\nimport type { LayoutMode } from \"../types\";\r\n\r\n/**\r\n * 品牌配置\r\n */\r\nexport interface LayoutBrandConfig {\r\n /** 品牌名称,如 'Robot Admin' */\r\n name?: string;\r\n /** 品牌副标题,如 '机器人管理系统' */\r\n subtitle?: string;\r\n /** Logo 地址(图片或视频) */\r\n logoSrc?: string;\r\n /** Logo 类型 */\r\n logoType?: \"video\" | \"image\";\r\n /** Logo 尺寸 */\r\n logoSize?: number;\r\n /** 首页路径,默认 '/home' */\r\n homePath?: string;\r\n /** 页脚版权文本 */\r\n copyright?: string;\r\n}\r\n\r\n/**\r\n * 布局上下文数据接口\r\n * 骨架组件通过 inject 获取这些数据\r\n */\r\nexport interface LayoutContext {\r\n // ============ 菜单数据 ============\r\n /** 菜单列表数据 */\r\n menus: ComputedRef<MenuOptions[]>;\r\n\r\n // ============ 主题状态 ============\r\n /** 是否为暗色模式 */\r\n isDark: ComputedRef<boolean>;\r\n\r\n // ============ 布局配置(来自 settings store) ============\r\n /** 当前布局模式 */\r\n layoutMode: ComputedRef<LayoutMode>;\r\n /** 侧边栏宽度 (px) */\r\n sidebarWidth: ComputedRef<number>;\r\n /** 侧边栏折叠后宽度 (px) */\r\n sidebarCollapsedWidth: ComputedRef<number>;\r\n /** 是否显示页脚 */\r\n showFooter: ComputedRef<boolean>;\r\n /** 是否显示标签页 */\r\n showTagsView: ComputedRef<boolean>;\r\n /** 标签页高度 (px) */\r\n tagsViewHeight: ComputedRef<number>;\r\n /** 头部高度 (px) */\r\n headerHeight: ComputedRef<number>;\r\n /** 过渡动画名称 */\r\n transitionName: ComputedRef<string>;\r\n /** 是否显示面包屑 */\r\n showBreadcrumb: ComputedRef<boolean>;\r\n /** 是否显示面包屑图标 */\r\n showBreadcrumbIcon: ComputedRef<boolean>;\r\n /** 是否固定头部 */\r\n fixedHeader: ComputedRef<boolean>;\r\n\r\n // ============ 品牌配置 ============\r\n /** 品牌信息 */\r\n brand: LayoutBrandConfig;\r\n\r\n // ============ 可选:图标组件 ============\r\n /**\r\n * 自定义图标组件(如 @iconify/vue 的 Icon 组件)\r\n * 用于布局内部组件渲染菜单图标\r\n * 组件需接受 name (string) 和 size (number) 两个 props\r\n * 如果不提供,将使用 CSS class 渲染图标\r\n */\r\n iconComponent?: Component;\r\n}\r\n\r\n/**\r\n * 布局上下文 Injection Key\r\n */\r\nexport const LAYOUT_CONTEXT_KEY: InjectionKey<LayoutContext> =\r\n Symbol(\"layout-context\");\r\n\r\n/**\r\n * 抽屉菜单统一控制器\r\n * 解决 MenuTrigger 与 DrawerMenu 各自拥有独立定时器导致的\r\n * \"鼠标从 trigger 移到 drawer 过程中 drawer 被关闭\"问题\r\n */\r\nexport interface DrawerHandlers {\r\n /** 显示抽屉并取消所有待执行的隐藏操作 */\r\n show: () => void;\r\n /** 启动延迟隐藏(300ms) */\r\n startHide: () => void;\r\n /** 立即隐藏抽屉(如导航跳转后) */\r\n hide: () => void;\r\n}\r\n\r\n/**\r\n * 抽屉菜单控制器 Injection Key\r\n */\r\nexport const DRAWER_HANDLER_KEY: InjectionKey<DrawerHandlers> =\r\n Symbol(\"drawer-handlers\");\r\n\r\n/**\r\n * 在骨架组件中获取布局上下文\r\n *\r\n * @throws 如果没有 provide LayoutContext 会抛出错误\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * // 在包的骨架组件内部使用\r\n * const ctx = useLayoutContext()\r\n * const menus = ctx.menus\r\n * const isDark = ctx.isDark\r\n * </script>\r\n * ```\r\n */\r\nexport function useLayoutContext(): LayoutContext {\r\n const ctx = inject(LAYOUT_CONTEXT_KEY);\r\n if (!ctx) {\r\n throw new Error(\r\n \"[Layout] LayoutContext not provided. \" +\r\n \"请在上层组件中使用 provide(LAYOUT_CONTEXT_KEY, ...) 注入布局数据。\",\r\n );\r\n }\r\n return ctx;\r\n}\r\n\r\n/**\r\n * 默认品牌配置\r\n */\r\nexport const DEFAULT_BRAND_CONFIG: Required<LayoutBrandConfig> = {\r\n name: \"Admin\",\r\n subtitle: \"\",\r\n logoSrc: \"\",\r\n logoType: \"image\",\r\n logoSize: 36,\r\n homePath: \"/home\",\r\n copyright: \"\",\r\n};\r\n","/**\r\n * @robot-admin/layout\r\n *\r\n * 统一的 KeepAlive 缓存管理\r\n * 从主项目提取的通用 composable,零业务依赖\r\n */\r\n\r\nimport { ref, watch } from \"vue\";\r\nimport { useRoute } from \"vue-router\";\r\n\r\n/** KeepAlive 缓存选项 */\r\nexport interface LayoutCacheOptions {\r\n /** 最大缓存数量,默认 20 */\r\n maxCacheCount?: number;\r\n /** 是否在开发模式下输出日志,默认 true */\r\n enableDevLog?: boolean;\r\n /** 是否暴露调试方法到 window,默认 true */\r\n exposeToWindow?: boolean;\r\n}\r\n\r\n/**\r\n * 统一的 KeepAlive 缓存管理 composable\r\n *\r\n * @param options - 缓存配置选项\r\n * @returns 缓存视图列表和管理方法\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { useLayoutCache } from '@robot-admin/layout'\r\n *\r\n * const { cachedViews, maxCacheCount } = useLayoutCache({ maxCacheCount: 30 })\r\n * </script>\r\n *\r\n * <template>\r\n * <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\r\n * <RouterView />\r\n * </KeepAlive>\r\n * </template>\r\n * ```\r\n */\r\nexport function useLayoutCache(options: LayoutCacheOptions = {}) {\r\n const {\r\n maxCacheCount: maxCount = 20,\r\n enableDevLog = true,\r\n exposeToWindow: expose = true,\r\n } = options;\r\n\r\n const route = useRoute();\r\n const cachedViews = ref<string[]>([]);\r\n const maxCacheCount = ref(maxCount);\r\n\r\n const isDev =\r\n typeof import.meta !== \"undefined\" &&\r\n (import.meta as any).env?.DEV === true;\r\n\r\n /**\r\n * 判断页面是否应该被缓存\r\n * 极简策略:只有明确配置 meta.keepAlive = true 才缓存\r\n */\r\n const shouldCache = (routeName: string | symbol | undefined | null) => {\r\n if (!routeName || typeof routeName !== \"string\") return false;\r\n return route.meta?.keepAlive === true;\r\n };\r\n\r\n /** 添加缓存 */\r\n const addCache = (name: string) => {\r\n if (!cachedViews.value.includes(name) && shouldCache(name)) {\r\n cachedViews.value.push(name);\r\n\r\n // 控制缓存数量\r\n if (cachedViews.value.length > maxCacheCount.value) {\r\n cachedViews.value.shift();\r\n }\r\n\r\n if (isDev && enableDevLog) {\r\n console.debug(\r\n `[KeepAlive] ✅ 缓存: ${name} (${cachedViews.value.length}/${maxCacheCount.value})`,\r\n );\r\n }\r\n }\r\n };\r\n\r\n /** 移除缓存 */\r\n const removeCache = (name: string) => {\r\n const index = cachedViews.value.indexOf(name);\r\n if (index > -1) {\r\n cachedViews.value.splice(index, 1);\r\n if (isDev && enableDevLog) {\r\n console.debug(`[KeepAlive] ❌ 移除: ${name}`);\r\n }\r\n }\r\n };\r\n\r\n /** 清空所有缓存 */\r\n const clearAllCache = () => {\r\n cachedViews.value = [];\r\n if (isDev && enableDevLog) {\r\n console.debug(\"[KeepAlive] 🗑️ 清空所有缓存\");\r\n }\r\n };\r\n\r\n // 暴露调试方法到 window\r\n if (isDev && expose && typeof window !== \"undefined\") {\r\n (window as any).__clearCache__ = clearAllCache;\r\n (window as any).__removeCache__ = removeCache;\r\n (window as any).__getCachedViews__ = () => cachedViews.value;\r\n }\r\n\r\n // 监听路由变化,动态管理缓存\r\n watch(\r\n () => route.name,\r\n (newName) => {\r\n if (newName && typeof newName === \"string\") {\r\n addCache(newName);\r\n }\r\n },\r\n { immediate: true },\r\n );\r\n\r\n return {\r\n cachedViews,\r\n maxCacheCount,\r\n addCache,\r\n removeCache,\r\n clearAllCache,\r\n };\r\n}\r\n","<!--\n * @robot-admin/layout - SideLayout\n *\n * 左侧菜单布局骨架\n * 经典的左侧导航 + 右侧内容布局,使用 NLayout/NLayoutSider 实现\n *\n * Slots:\n * #logo - Logo/品牌区域(侧边栏顶部)\n * #menu - 垂直菜单区域(侧边栏)\n * #header - 头部区域(含面包屑、导航栏右侧操作等)\n * #default - 页面内容(自动包含 RouterView + KeepAlive + Transition)\n * #footer - 页脚区域\n -->\n<template>\n <NLayout has-sider>\n <NLayoutSider\n bordered\n collapse-mode=\"width\"\n :collapsed-width=\"ctx.sidebarCollapsedWidth.value\"\n :width=\"ctx.sidebarWidth.value\"\n :native-scrollbar=\"false\"\n :collapsed=\"collapsed\"\n @update:collapsed=\"handleCollapsedUpdate\"\n :class=\"[\n 'layout-sider',\n 'no-horizontal-scroll',\n ctx.isDark.value ? 'dark-theme' : 'light-theme',\n ]\"\n >\n <slot name=\"logo\" />\n <slot name=\"menu\" :collapsed=\"collapsed\" />\n </NLayoutSider>\n\n <NLayout>\n <slot name=\"header\" />\n\n <NLayoutContent class=\"content-with-header p16px app-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"ctx.transitionName.value\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </NLayoutContent>\n\n <slot name=\"footer\" />\n </NLayout>\n </NLayout>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\nimport { NLayout, NLayoutSider, NLayoutContent } from \"naive-ui\";\nimport { useLayoutContext } from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\n\ndefineOptions({ name: \"SideLayout\" });\n\nconst props = withDefaults(\n defineProps<{\n /** 控制侧边栏折叠状态 (支持 v-model:collapsed) */\n collapsed?: boolean;\n }>(),\n { collapsed: false },\n);\n\nconst emit = defineEmits<{\n \"update:collapsed\": [value: boolean];\n}>();\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\n\n// 内部折叠状态,与 prop 双向同步\nconst _collapsed = ref(props.collapsed);\nwatch(\n () => props.collapsed,\n (v) => {\n _collapsed.value = v;\n },\n);\n\nconst collapsed = computed(() => _collapsed.value);\n\nconst handleCollapsedUpdate = (val: boolean) => {\n _collapsed.value = val;\n emit(\"update:collapsed\", val);\n};\n\n// 折叠切换\nconst toggleCollapse = () => {\n const next = !_collapsed.value;\n _collapsed.value = next;\n emit(\"update:collapsed\", next);\n};\n\ndefineExpose({\n collapsed,\n toggleCollapse,\n});\n</script>\n","<!--\r\n * @robot-admin/layout - ResponsiveMenu\r\n *\r\n * 响应式水平菜单\r\n * 用于 TopLayout / MixTopLayout / ReverseHorizontalMixLayout 的水平菜单\r\n * 自动检测容器宽度,溢出项放入“更多”下拉菜单,使用 NMenu (naive-ui) 渲染\r\n -->\r\n<template>\r\n <div ref=\"containerRef\" class=\"responsive-menu\">\r\n <div ref=\"visibleRef\" class=\"responsive-menu__visible\">\r\n <NMenu\r\n v-if=\"visibleOptions.length > 0\"\r\n mode=\"horizontal\"\r\n :value=\"activeKey\"\r\n :options=\"visibleOptions\"\r\n :theme-overrides=\"menuThemeOverrides\"\r\n @update:value=\"handleSelect\"\r\n />\r\n </div>\r\n\r\n <NDropdown\r\n v-if=\"hiddenItems.length > 0\"\r\n :options=\"dropdownOptions\"\r\n placement=\"bottom-end\"\r\n trigger=\"hover\"\r\n @select=\"handleSelect\"\r\n >\r\n <div class=\"responsive-menu__more\">\r\n <NButton text class=\"responsive-menu__more-btn\">\r\n <!-- 纯 CSS 三个点图标 -->\r\n <span class=\"dots-icon\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </span>\r\n </NButton>\r\n </div>\r\n </NDropdown>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, onMounted, onUnmounted, nextTick, h } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { NMenu, NDropdown, NButton } from \"naive-ui\";\r\nimport type { MenuOption, DropdownOption } from \"naive-ui\";\r\nimport type { MenuOptions } from \"../../types/menu\";\r\nimport { useLayoutContext } from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"ResponsiveMenu\" });\r\n\r\nconst props = defineProps<{\r\n /** 菜单数据 */\r\n data: MenuOptions[];\r\n}>();\r\n\r\nconst route = useRoute();\r\nconst router = useRouter();\r\nconst ctx = useLayoutContext();\r\n\r\n// 安全包装\r\nconst menuData = computed(() => props.data || []);\r\nconst activeKey = computed(() => route.path);\r\n\r\n// 根据主题选择菜单样式\r\nconst isDarkMode = ctx.isDark;\r\n\r\nconst lightTheme = {\r\n itemTextColor: \"rgba(51, 65, 85, 0.85)\",\r\n itemTextColorHover: \"rgba(30, 64, 175, 0.95)\",\r\n itemTextColorActive: \"rgba(30, 64, 175, 1)\",\r\n itemTextColorActiveHover: \"rgba(30, 64, 175, 1)\",\r\n itemTextColorChildActive: \"rgba(30, 64, 175, 1)\",\r\n itemIconColor: \"rgba(51, 65, 85, 0.7)\",\r\n itemIconColorHover: \"rgba(30, 64, 175, 0.85)\",\r\n itemIconColorActive: \"rgba(30, 64, 175, 1)\",\r\n itemIconColorActiveHover: \"rgba(30, 64, 175, 1)\",\r\n itemIconColorChildActive: \"rgba(30, 64, 175, 1)\",\r\n itemColorHover: \"rgba(30, 64, 175, 0.06)\",\r\n itemColorActive: \"rgba(30, 64, 175, 0.1)\",\r\n itemColorActiveHover: \"rgba(30, 64, 175, 0.12)\",\r\n itemColorActiveCollapsed: \"rgba(30, 64, 175, 0.1)\",\r\n arrowColor: \"rgba(51, 65, 85, 0.6)\",\r\n arrowColorHover: \"rgba(30, 64, 175, 0.8)\",\r\n arrowColorActive: \"rgba(30, 64, 175, 1)\",\r\n arrowColorChildActive: \"rgba(30, 64, 175, 1)\",\r\n itemHeight: \"42px\",\r\n itemPadding: \"0 18px\",\r\n itemBorderRadius: \"10px\",\r\n groupTextColor: \"rgba(51, 65, 85, 0.65)\",\r\n};\r\n\r\nconst darkTheme = {\r\n itemTextColor: \"rgba(226, 232, 240, 0.85)\",\r\n itemTextColorHover: \"rgba(255, 255, 255, 0.95)\",\r\n itemTextColorActive: \"rgba(147, 197, 253, 1)\",\r\n itemTextColorActiveHover: \"rgba(147, 197, 253, 1)\",\r\n itemTextColorChildActive: \"rgba(147, 197, 253, 1)\",\r\n itemIconColor: \"rgba(226, 232, 240, 0.7)\",\r\n itemIconColorHover: \"rgba(255, 255, 255, 0.85)\",\r\n itemIconColorActive: \"rgba(147, 197, 253, 1)\",\r\n itemIconColorActiveHover: \"rgba(147, 197, 253, 1)\",\r\n itemIconColorChildActive: \"rgba(147, 197, 253, 1)\",\r\n itemColorHover: \"rgba(59, 130, 246, 0.1)\",\r\n itemColorActive: \"rgba(59, 130, 246, 0.15)\",\r\n itemColorActiveHover: \"rgba(59, 130, 246, 0.18)\",\r\n itemColorActiveCollapsed: \"rgba(59, 130, 246, 0.15)\",\r\n arrowColor: \"rgba(226, 232, 240, 0.5)\",\r\n arrowColorHover: \"rgba(255, 255, 255, 0.7)\",\r\n arrowColorActive: \"rgba(147, 197, 253, 1)\",\r\n arrowColorChildActive: \"rgba(147, 197, 253, 1)\",\r\n itemHeight: \"42px\",\r\n itemPadding: \"0 18px\",\r\n itemBorderRadius: \"10px\",\r\n groupTextColor: \"rgba(226, 232, 240, 0.6)\",\r\n};\r\n\r\nconst menuThemeOverrides = computed(() =>\r\n isDarkMode.value ? darkTheme : lightTheme,\r\n);\r\n\r\n// ============ 图标渲染 ============\r\n\r\nconst renderIcon = (icon: string, size = 18) => {\r\n if (ctx.iconComponent) {\r\n return () => h(ctx.iconComponent!, { name: icon, size });\r\n }\r\n return () =>\r\n h(\"i\", {\r\n class: icon,\r\n style: {\r\n fontSize: `${size}px`,\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n },\r\n });\r\n};\r\n\r\n// ============ 菜单转换 ============\r\n\r\nconst convertToMenuOption = (item: MenuOptions): MenuOption => ({\r\n key: item.path || \"\",\r\n label: item.meta?.title || item.name || \"\",\r\n icon: item.meta?.icon ? renderIcon(item.meta.icon, 18) : undefined,\r\n children: item.children?.length\r\n ? item.children.map(convertToMenuOption)\r\n : undefined,\r\n});\r\n\r\n// ============ 响应式计算 ============\r\n\r\nconst containerRef = ref<HTMLElement>();\r\nconst visibleItems = ref<MenuOptions[]>([]);\r\nconst hiddenItems = ref<MenuOptions[]>([]);\r\n\r\nconst visibleOptions = computed<MenuOption[]>(() =>\r\n visibleItems.value.map(convertToMenuOption),\r\n);\r\n\r\nconst dropdownOptions = computed<DropdownOption[]>(() =>\r\n hiddenItems.value.map((item) => ({\r\n key: item.path || \"\",\r\n label: item.meta?.title || item.name || \"\",\r\n icon: item.meta?.icon ? renderIcon(item.meta.icon, 16) : undefined,\r\n children: item.children?.length\r\n ? item.children.map((child) => ({\r\n key: child.path || \"\",\r\n label: child.meta?.title || child.name || \"\",\r\n icon: child.meta?.icon ? renderIcon(child.meta.icon, 16) : undefined,\r\n }))\r\n : undefined,\r\n })),\r\n);\r\n\r\nconst handleSelect = (key: string) => {\r\n if (key) router.push(key);\r\n};\r\n\r\n// ============ 宽度估算 ============\r\n\r\nconst estimateItemWidth = (item: MenuOptions): number => {\r\n const ITEM_PADDING = 36; // itemPadding: \"0 18px\" → 18*2\r\n const ITEM_MARGIN = 8;\r\n const ICON_WIDTH = 26;\r\n const EXTRA = 8;\r\n\r\n const title = item.meta?.title || item.name || \"\";\r\n let textWidth = 0;\r\n for (const char of title) {\r\n const code = char.charCodeAt(0);\r\n // CJK / 全角字符约 15px(14px 字号下的实际宽度)\r\n if (\r\n (code >= 0x4e00 && code <= 0x9fff) || // CJK 统一汉字\r\n (code >= 0x3400 && code <= 0x4dbf) || // CJK 扩展 A\r\n (code >= 0x3000 && code <= 0x303f) || // CJK 符号\r\n (code >= 0xff00 && code <= 0xffef) || // 全角字符\r\n (code >= 0x3040 && code <= 0x309f) || // 平假名\r\n (code >= 0x30a0 && code <= 0x30ff) // 片假名\r\n ) {\r\n textWidth += 15;\r\n } else {\r\n textWidth += 8;\r\n }\r\n }\r\n const iconWidth = item.meta?.icon ? ICON_WIDTH : 0;\r\n\r\n return textWidth + iconWidth + ITEM_PADDING + ITEM_MARGIN + EXTRA;\r\n};\r\n\r\nconst calculateVisibleCount = (containerWidth: number): number => {\r\n if (!menuData.value.length) return 0;\r\n\r\n const MORE_BTN_WIDTH = 80;\r\n const SAFETY = 15;\r\n\r\n let totalWidth = 0;\r\n for (const item of menuData.value) {\r\n totalWidth += estimateItemWidth(item);\r\n }\r\n\r\n if (totalWidth + SAFETY <= containerWidth) {\r\n return menuData.value.length;\r\n }\r\n\r\n let usedWidth = 0;\r\n let count = 0;\r\n const available = containerWidth - MORE_BTN_WIDTH - SAFETY;\r\n\r\n for (const item of menuData.value) {\r\n const w = estimateItemWidth(item);\r\n if (usedWidth + w <= available) {\r\n usedWidth += w;\r\n count++;\r\n } else break;\r\n }\r\n\r\n return Math.max(count, 1);\r\n};\r\n\r\nconst calculateVisibleItems = () => {\r\n if (!containerRef.value || !menuData.value.length) return;\r\n\r\n const containerWidth = containerRef.value.offsetWidth;\r\n if (containerWidth === 0) {\r\n nextTick(() => calculateVisibleItems());\r\n return;\r\n }\r\n\r\n const count = calculateVisibleCount(containerWidth);\r\n visibleItems.value = menuData.value.slice(0, count);\r\n hiddenItems.value = menuData.value.slice(count);\r\n};\r\n\r\n// ============ 防抖 & ResizeObserver ============\r\n\r\nlet resizeTimer: number | null = null;\r\nconst debouncedCalculate = () => {\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n resizeTimer = window.setTimeout(() => calculateVisibleItems(), 100);\r\n};\r\n\r\nlet resizeObserver: ResizeObserver | null = null;\r\n\r\nonMounted(() => {\r\n nextTick(() => calculateVisibleItems());\r\n if (containerRef.value) {\r\n resizeObserver = new ResizeObserver(() => debouncedCalculate());\r\n resizeObserver.observe(containerRef.value);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n resizeObserver?.disconnect();\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n});\r\n\r\nwatch(\r\n () => props.data,\r\n () => nextTick(() => calculateVisibleItems()),\r\n {\r\n deep: true,\r\n },\r\n);\r\n</script>\r\n\r\n<style scoped>\r\n.responsive-menu {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n gap: 0;\r\n}\r\n\r\n.responsive-menu__visible {\r\n flex: 0 1 auto;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu) {\r\n background-color: transparent !important;\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item) {\r\n position: relative;\r\n font-weight: 500;\r\n letter-spacing: 0.01em;\r\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n/* 防止 NMenu 内部截断菜单项文字 */\r\n.responsive-menu__visible :deep(.n-menu-item-content-header) {\r\n overflow: visible !important;\r\n text-overflow: clip !important;\r\n white-space: nowrap !important;\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item-content) {\r\n overflow: visible !important;\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item::after) {\r\n content: \"\";\r\n position: absolute;\r\n bottom: 0;\r\n left: 50%;\r\n transform: translateX(-50%) scaleX(0);\r\n width: 60%;\r\n height: 2px;\r\n background: linear-gradient(90deg, transparent, currentColor, transparent);\r\n opacity: 0;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item.n-menu-item--selected::after) {\r\n transform: translateX(-50%) scaleX(1);\r\n opacity: 0.5;\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item:hover) {\r\n transform: translateY(-1px);\r\n}\r\n\r\n.responsive-menu__visible :deep(.n-menu-item.n-menu-item--selected) {\r\n box-shadow:\r\n 0 2px 8px -2px rgba(30, 64, 175, 0.15),\r\n 0 1px 3px rgba(30, 64, 175, 0.1);\r\n}\r\n\r\n.responsive-menu__more {\r\n flex-shrink: 0;\r\n margin-left: 4px;\r\n}\r\n\r\n.responsive-menu__more-btn {\r\n min-width: 42px;\r\n height: 42px;\r\n padding: 0 18px !important;\r\n border-radius: 10px !important;\r\n background-color: transparent !important;\r\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.responsive-menu__more-btn::before,\r\n.responsive-menu__more-btn :deep(.n-button__border),\r\n.responsive-menu__more-btn :deep(.n-button__state-border) {\r\n display: none !important;\r\n}\r\n\r\n.responsive-menu__more-btn:hover {\r\n background-color: rgba(30, 64, 175, 0.06) !important;\r\n transform: translateY(-1px);\r\n}\r\n\r\n/* 纯 CSS 三个点图标 */\r\n.dots-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 3px;\r\n width: 20px;\r\n height: 20px;\r\n}\r\n\r\n.dots-icon span {\r\n width: 4px;\r\n height: 4px;\r\n border-radius: 50%;\r\n background-color: currentColor;\r\n opacity: 0.85;\r\n}\r\n</style>\r\n","<!--\n * @robot-admin/layout - TopLayout\n *\n * 顶部导航布局骨架\n * Logo+品牌 | 水平菜单 | 操作区 → 标签页 → 内容区 → 页脚\n *\n * Slots:\n * #logo - Logo/品牌区域\n * #menu - 水平菜单(默认使用 ResponsiveMenu)\n * #header-extra - 头部右侧操作区\n * #tags-view - 标签页区域\n * #footer - 页脚区域\n -->\n<template>\n <div class=\"top-layout-container\">\n <!-- 顶部导航栏 -->\n <div\n class=\"top-navbar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- 左侧:Logo 和品牌 -->\n <div class=\"navbar-left\">\n <slot name=\"logo\">\n <div class=\"logo-container\">\n <div class=\"logo-glow\"></div>\n <video\n v-if=\"brand.logoType === 'video'\"\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n autoplay\n loop\n muted\n playsinline\n class=\"logo-video\"\n >\n 您的浏览器不支持 video 标签。\n </video>\n <img\n v-else\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n class=\"logo-video\"\n />\n </div>\n <div class=\"brand-name\">\n <span class=\"brand-title\">{{ brand.name }}</span>\n <span class=\"brand-subtitle\">{{ brand.subtitle }}</span>\n </div>\n <div class=\"navbar-divider\"></div>\n </slot>\n </div>\n\n <!-- 中间:水平菜单 -->\n <div class=\"navbar-center\">\n <slot name=\"menu\">\n <ResponsiveMenu :data=\"menus\" />\n </slot>\n </div>\n\n <!-- 右侧:操作区 -->\n <slot name=\"header-extra\" />\n </div>\n\n <!-- 标签页区域 -->\n <div\n v-if=\"showTagsView\"\n class=\"tags-view-container\"\n :style=\"{ height: `${tagsViewHeight}px` }\"\n >\n <slot name=\"tags-view\" />\n </div>\n\n <!-- 主内容区域 -->\n <NLayout>\n <NLayoutContent class=\"main-content\">\n <div class=\"page-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"transitionName\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </div>\n </NLayoutContent>\n\n <!-- 页脚 -->\n <template v-if=\"showFooter\">\n <slot name=\"footer\" />\n </template>\n </NLayout>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport \"./index.scss\";\nimport { computed } from \"vue\";\nimport { NLayout, NLayoutContent } from \"naive-ui\";\nimport {\n useLayoutContext,\n DEFAULT_BRAND_CONFIG,\n} from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\nimport ResponsiveMenu from \"../../ResponsiveMenu/index.vue\";\n\ndefineOptions({ name: \"TopLayout\" });\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\n\nconst isDarkMode = ctx.isDark;\nconst menus = computed(() => ctx.menus.value);\nconst showTagsView = computed(() => ctx.showTagsView.value);\nconst tagsViewHeight = computed(() => ctx.tagsViewHeight.value);\nconst showFooter = computed(() => ctx.showFooter.value);\nconst transitionName = computed(() => ctx.transitionName.value);\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\n</script>\n","/**\r\n * @robot-admin/layout\r\n *\r\n * 菜单拆分 Composable - 通用的一级/二级菜单拆分逻辑\r\n * 用于 Mix / MixTop / ReverseHorizontalMix 等需要菜单拆分的布局\r\n */\r\n\r\nimport {\r\n ref,\r\n computed,\r\n watch,\r\n onMounted,\r\n toValue,\r\n type ComputedRef,\r\n type Ref,\r\n type MaybeRefOrGetter,\r\n} from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport type { MenuOptions } from \"../types/menu\";\r\n\r\nexport interface UseMenuSplitOptions {\r\n /** 菜单数据(响应式) */\r\n menus: ComputedRef<MenuOptions[]>;\r\n /** 是否使用悬浮式二级菜单(MixLayout 的 toggle 模式) */\r\n floatingSecondMenu?: MaybeRefOrGetter<boolean>;\r\n}\r\n\r\nexport interface UseMenuSplitReturn {\r\n /** 当前激活的一级菜单路径 */\r\n activeFirstMenu: Ref<string>;\r\n /** 当前激活的一级菜单完整数据 */\r\n activeFirstMenuItem: ComputedRef<MenuOptions | undefined>;\r\n /** 当前一级菜单对应的二级菜单列表 */\r\n currentSecondMenus: ComputedRef<MenuOptions[]>;\r\n /** 悬浮的菜单项(MixLayout 使用) */\r\n hoveredMenuItem: Ref<MenuOptions | null>;\r\n /** 实际展示的菜单项(hovered 优先,fallback 到 active) */\r\n displayMenuItem: ComputedRef<MenuOptions | null>;\r\n /** 是否显示悬浮二级菜单(MixLayout 使用) */\r\n showSecondMenu: Ref<boolean>;\r\n /** 处理一级菜单点击 */\r\n handleFirstMenuClick: (item: MenuOptions) => void;\r\n /** 处理二级菜单点击 */\r\n handleSecondMenuClick: (item: MenuOptions) => void;\r\n /** 检查路由是否匹配菜单项 */\r\n isMenuItemActive: (menuPath: string | undefined) => boolean;\r\n}\r\n\r\n/**\r\n * 菜单拆分 Composable\r\n *\r\n * 提供一级/二级菜单拆分状态管理、路由自动匹配、菜单点击处理。\r\n * 供 MixLayout / MixTopLayout / ReverseHorizontalMixLayout 共用。\r\n *\r\n * @example\r\n * ```ts\r\n * const menuSplit = useMenuSplit({\r\n * menus: ctx.menus,\r\n * floatingSecondMenu: computed(() => layoutMode.value === 'mix'),\r\n * })\r\n * ```\r\n */\r\nexport function useMenuSplit(options: UseMenuSplitOptions): UseMenuSplitReturn {\r\n const { menus, floatingSecondMenu = false } = options;\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n const activeFirstMenu = ref<string>(\"\");\r\n const hoveredMenuItem = ref<MenuOptions | null>(null);\r\n const showSecondMenu = ref(false);\r\n\r\n /** 当前展示在悬浮面板上的菜单项(优先 hovered,fallback 到 active) */\r\n const displayMenuItem = computed<MenuOptions | null>(\r\n () => hoveredMenuItem.value || activeFirstMenuItem.value || null,\r\n );\r\n\r\n // ============ 路径匹配 ============\r\n\r\n const normalizePath = (path: string) =>\r\n path.startsWith(\"/\") ? path : `/${path}`;\r\n\r\n const isMenuItemActive = (menuPath: string | undefined): boolean => {\r\n if (!menuPath) return false;\r\n const currentPath = route.path;\r\n if (currentPath === menuPath) return true;\r\n const normalizedMenuPath = normalizePath(menuPath);\r\n const normalizedCurrentPath = normalizePath(currentPath);\r\n if (normalizedCurrentPath === normalizedMenuPath) return true;\r\n return normalizedCurrentPath.includes(`/${menuPath}`);\r\n };\r\n\r\n // ============ 查找一级菜单 ============\r\n\r\n const findActiveTopMenu = (items: MenuOptions[]): MenuOptions | null => {\r\n for (const item of items) {\r\n if (isMenuItemActive(item.path)) return item;\r\n if (item.children?.length) {\r\n const found = findActiveTopMenu(item.children);\r\n if (found) return item;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n // ============ 计算属性 ============\r\n\r\n const activeFirstMenuItem = computed(() =>\r\n menus.value.find((item) => item.path === activeFirstMenu.value),\r\n );\r\n\r\n const currentSecondMenus = computed(\r\n () => activeFirstMenuItem.value?.children || [],\r\n );\r\n\r\n // ============ 交互处理 ============\r\n\r\n const handleFirstMenuClick = (item: MenuOptions) => {\r\n if (toValue(floatingSecondMenu)) {\r\n // MixLayout: 纯点击模式\r\n if (item.children && item.children.length > 0) {\r\n if (showSecondMenu.value && activeFirstMenu.value === item.path) {\r\n // 点击同一个已展开的菜单 → 关闭\r\n showSecondMenu.value = false;\r\n } else {\r\n // 点击另一个或未展开 → 展开/切换\r\n activeFirstMenu.value = item.path || \"\";\r\n showSecondMenu.value = true;\r\n }\r\n } else {\r\n // 没有子菜单 → 关闭二级面板并跳转\r\n activeFirstMenu.value = item.path || \"\";\r\n showSecondMenu.value = false;\r\n if (item.path) router.push(item.path);\r\n }\r\n } else {\r\n // MixTop / Reverse: 直接切换\r\n if (!item.children || item.children.length === 0) {\r\n if (item.path) router.push(item.path);\r\n }\r\n }\r\n };\r\n\r\n const handleSecondMenuClick = (item: MenuOptions) => {\r\n if (item.path) router.push(item.path);\r\n };\r\n\r\n // ============ 路由自动匹配 ============\r\n\r\n const updateActiveMenuByRoute = () => {\r\n const menuList = menus.value;\r\n const matchedFirstMenu = findActiveTopMenu(menuList);\r\n if (matchedFirstMenu) {\r\n activeFirstMenu.value = matchedFirstMenu.path || \"\";\r\n // 悬浮模式下,如果当前一级菜单有子菜单,自动展示二级菜单\r\n if (toValue(floatingSecondMenu) && matchedFirstMenu.children?.length) {\r\n showSecondMenu.value = true;\r\n }\r\n } else if (menuList.length > 0 && !activeFirstMenu.value) {\r\n activeFirstMenu.value = menuList[0].path || \"\";\r\n }\r\n };\r\n\r\n watch(\r\n () => route.path,\r\n () => updateActiveMenuByRoute(),\r\n { immediate: true },\r\n );\r\n\r\n watch(\r\n menus,\r\n (newMenus) => {\r\n if (newMenus && newMenus.length > 0) updateActiveMenuByRoute();\r\n },\r\n { immediate: true },\r\n );\r\n\r\n onMounted(() => updateActiveMenuByRoute());\r\n\r\n return {\r\n activeFirstMenu,\r\n activeFirstMenuItem,\r\n currentSecondMenus,\r\n hoveredMenuItem,\r\n /** 实际在悬浮面板上展示的菜单项(hovered 优先,fallback 到 active) */\r\n displayMenuItem,\r\n showSecondMenu,\r\n handleFirstMenuClick,\r\n handleSecondMenuClick,\r\n isMenuItemActive,\r\n };\r\n}\r\n","<!--\n * @robot-admin/layout - MixLayout\n *\n * 混合布局骨架\n * 左侧一级菜单图标栏 + 悬浮二级菜单弹出面板 + 右侧内容区\n *\n * Slots:\n * #logo - Logo/品牌区域(侧边栏顶部)\n * #header - 头部区域\n * #footer - 页脚区域\n -->\n<template>\n <div class=\"mix-layout-container\">\n <!-- 左侧一级菜单 -->\n <div\n class=\"first-level-menu\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- Logo -->\n <div class=\"logo-container\">\n <slot name=\"logo\">\n <div class=\"logo-glow\"></div>\n <video\n v-if=\"brand.logoType === 'video'\"\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 40\"\n :height=\"brand.logoSize || 40\"\n autoplay\n loop\n muted\n playsinline\n class=\"logo-video\"\n >\n 您的浏览器不支持 video 标签。\n </video>\n <img\n v-else\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 40\"\n :height=\"brand.logoSize || 40\"\n class=\"logo-video\"\n />\n </slot>\n </div>\n\n <!-- 一级菜单列表 -->\n <div class=\"first-menu-list\">\n <div\n v-for=\"item in menus\"\n :key=\"item.path\"\n class=\"first-menu-item\"\n :class=\"{\n active: menuSplit.activeFirstMenu.value === item.path,\n }\"\n @click=\"menuSplit.handleFirstMenuClick(item)\"\n >\n <div class=\"menu-item-content\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"item.meta?.icon\"\n :name=\"item.meta.icon\"\n :size=\"22\"\n />\n <span v-else class=\"menu-item-text\">{{\n (item.meta?.title || \"\")[0]\n }}</span>\n </div>\n <span class=\"menu-item-label\">{{ item.meta?.title }}</span>\n </div>\n </div>\n </div>\n\n <!-- 悬浮二级菜单 -->\n <Transition name=\"slide-fade\">\n <div\n v-if=\"menuSplit.showSecondMenu.value\"\n class=\"second-level-menu-popup\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <div class=\"second-menu-header\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"menuSplit.displayMenuItem.value?.meta?.icon\"\n :name=\"menuSplit.displayMenuItem.value.meta.icon\"\n :size=\"20\"\n />\n <span class=\"menu-title\">{{\n menuSplit.displayMenuItem.value?.meta?.title\n }}</span>\n </div>\n <div class=\"second-menu-list\">\n <div\n v-for=\"child in menuSplit.displayMenuItem.value?.children || []\"\n :key=\"child.path\"\n class=\"second-menu-item\"\n :class=\"{ active: menuSplit.isMenuItemActive(child.path) }\"\n @click=\"menuSplit.handleSecondMenuClick(child)\"\n >\n <component\n :is=\"LayoutIcon\"\n v-if=\"child.meta?.icon\"\n :name=\"child.meta.icon\"\n :size=\"16\"\n />\n <span class=\"menu-item-label\">{{ child.meta?.title }}</span>\n </div>\n </div>\n </div>\n </Transition>\n\n <!-- 右侧主内容区 -->\n <div class=\"main-layout\">\n <slot name=\"header\" />\n\n <NLayout>\n <NLayoutContent class=\"content-with-header p16px app-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"transitionName\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </NLayoutContent>\n\n <template v-if=\"showFooter\">\n <slot name=\"footer\" />\n </template>\n </NLayout>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport \"./index.scss\";\nimport { computed, h, defineComponent } from \"vue\";\nimport { NLayout, NLayoutContent } from \"naive-ui\";\nimport {\n useLayoutContext,\n DEFAULT_BRAND_CONFIG,\n} from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\nimport { useMenuSplit } from \"../../../composables/useMenuSplit\";\n\ndefineOptions({ name: \"MixLayout\" });\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\n\nconst isDarkMode = ctx.isDark;\nconst menus = computed(() => ctx.menus.value);\nconst showFooter = computed(() => ctx.showFooter.value);\nconst transitionName = computed(() => ctx.transitionName.value);\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\n\nconst menuSplit = useMenuSplit({\n menus: ctx.menus,\n floatingSecondMenu: computed(() => true),\n});\n\n// 图标组件:优先使用消费方提供的,否则用 CSS class 渲染\nconst LayoutIcon =\n ctx.iconComponent ??\n defineComponent({\n name: \"LayoutIcon\",\n props: { name: String, size: { type: Number, default: 18 } },\n setup(props) {\n return () =>\n h(\"i\", {\n class: props.name,\n style: {\n fontSize: `${props.size}px`,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n },\n });\n</script>\n","<!--\n * @robot-admin/layout - MixTopLayout\n *\n * 顶部混合布局骨架\n * 左侧一级菜单 + 顶部二级水平菜单 + 内容区\n *\n * Slots:\n * #logo - Logo/品牌区域(侧边栏顶部)\n * #brand - 顶部导航品牌区\n * #top-menu - 二级水平菜单(默认使用 ResponsiveMenu)\n * #header-extra - 头部右侧操作区\n * #tags-view - 标签页区域\n * #footer - 页脚区域\n -->\n<template>\n <div class=\"mix-top-layout-container\">\n <!-- 左侧一级菜单 -->\n <div\n class=\"first-level-sidebar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- Logo -->\n <div class=\"logo-container\">\n <slot name=\"logo\">\n <div class=\"logo-glow\"></div>\n <video\n v-if=\"brand.logoType === 'video'\"\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 40\"\n :height=\"brand.logoSize || 40\"\n autoplay\n loop\n muted\n playsinline\n class=\"logo-video\"\n >\n 您的浏览器不支持 video 标签。\n </video>\n <img\n v-else\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 40\"\n :height=\"brand.logoSize || 40\"\n class=\"logo-video\"\n />\n </slot>\n </div>\n\n <!-- 一级菜单列表 -->\n <div class=\"first-menu-list\">\n <div\n v-for=\"item in menus\"\n :key=\"item.path\"\n class=\"first-menu-item\"\n :class=\"{\n active: menuSplit.activeFirstMenu.value === item.path,\n }\"\n @click=\"menuSplit.handleFirstMenuClick(item)\"\n >\n <div class=\"menu-item-content\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"item.meta?.icon\"\n :name=\"item.meta.icon\"\n :size=\"22\"\n />\n <span v-else class=\"menu-item-text\">{{\n (item.meta?.title || \"\")[0]\n }}</span>\n </div>\n <span class=\"menu-item-label\">{{ item.meta?.title }}</span>\n </div>\n </div>\n </div>\n\n <!-- 右侧主区域 -->\n <div class=\"main-area\">\n <!-- 顶部导航栏 -->\n <div\n class=\"top-navbar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- 左侧:品牌 -->\n <div class=\"navbar-left\">\n <slot name=\"brand\">\n <div class=\"brand-name\">\n <span class=\"brand-title\">{{ brand.name }}</span>\n <span class=\"brand-subtitle\">{{ brand.subtitle }}</span>\n </div>\n <div class=\"navbar-divider\"></div>\n </slot>\n </div>\n\n <!-- 中间:二级水平菜单 -->\n <div class=\"navbar-center\">\n <slot name=\"top-menu\">\n <ResponsiveMenu\n v-if=\"menuSplit.currentSecondMenus.value.length > 0\"\n :data=\"menuSplit.currentSecondMenus.value\"\n />\n </slot>\n </div>\n\n <!-- 右侧:操作区 -->\n <slot name=\"header-extra\" />\n </div>\n\n <!-- 标签页区域 -->\n <div\n v-if=\"showTagsView\"\n class=\"tags-view-container\"\n :style=\"{ height: `${tagsViewHeight}px` }\"\n >\n <slot name=\"tags-view\" />\n </div>\n\n <!-- 内容区 -->\n <NLayout class=\"content-layout\">\n <NLayoutContent class=\"main-content\">\n <div class=\"page-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"transitionName\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </div>\n </NLayoutContent>\n\n <template v-if=\"showFooter\">\n <slot name=\"footer\" />\n </template>\n </NLayout>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport \"./index.scss\";\nimport { computed, h, defineComponent } from \"vue\";\nimport { NLayout, NLayoutContent } from \"naive-ui\";\nimport {\n useLayoutContext,\n DEFAULT_BRAND_CONFIG,\n} from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\nimport { useMenuSplit } from \"../../../composables/useMenuSplit\";\nimport ResponsiveMenu from \"../../ResponsiveMenu/index.vue\";\n\ndefineOptions({ name: \"MixTopLayout\" });\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\n\nconst isDarkMode = ctx.isDark;\nconst menus = computed(() => ctx.menus.value);\nconst showTagsView = computed(() => ctx.showTagsView.value);\nconst tagsViewHeight = computed(() => ctx.tagsViewHeight.value);\nconst showFooter = computed(() => ctx.showFooter.value);\nconst transitionName = computed(() => ctx.transitionName.value);\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\n\nconst menuSplit = useMenuSplit({\n menus: ctx.menus,\n floatingSecondMenu: computed(() => false),\n});\n\nconst LayoutIcon =\n ctx.iconComponent ??\n defineComponent({\n name: \"LayoutIcon\",\n props: { name: String, size: { type: Number, default: 18 } },\n setup(props) {\n return () =>\n h(\"i\", {\n class: props.name,\n style: {\n fontSize: `${props.size}px`,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n },\n });\n</script>\n","<!--\n * @robot-admin/layout - ReverseHorizontalMixLayout\n *\n * 反转混合布局骨架\n * 顶部一级菜单 + 右侧二级菜单侧边栏 + 左侧内容区\n *\n * Slots:\n * #logo - Logo/品牌区域\n * #top-menu - 一级水平菜单(默认使用 ResponsiveMenu)\n * #header-extra - 头部右侧操作区\n * #tags-view - 标签页区域\n * #footer - 页脚区域\n -->\n<template>\n <div class=\"reverse-horizontal-mix-layout-container\">\n <!-- 顶部导航栏 -->\n <div\n class=\"top-navbar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- 左侧:Logo 和品牌 -->\n <div class=\"navbar-left\">\n <slot name=\"logo\">\n <div class=\"logo-container\">\n <div class=\"logo-glow\"></div>\n <video\n v-if=\"brand.logoType === 'video'\"\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n autoplay\n loop\n muted\n playsinline\n class=\"logo-video\"\n >\n 您的浏览器不支持 video 标签。\n </video>\n <img\n v-else\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n class=\"logo-video\"\n />\n </div>\n <div class=\"brand-name\">\n <span class=\"brand-title\">{{ brand.name }}</span>\n <span class=\"brand-subtitle\">{{ brand.subtitle }}</span>\n </div>\n <div class=\"navbar-divider\"></div>\n </slot>\n </div>\n\n <!-- 中间:一级水平菜单 -->\n <div class=\"navbar-center\">\n <slot name=\"top-menu\">\n <ResponsiveMenu :data=\"menus\" />\n </slot>\n </div>\n\n <!-- 右侧:操作区 -->\n <slot name=\"header-extra\" />\n </div>\n\n <!-- 标签页区域 -->\n <div\n v-if=\"showTagsView\"\n class=\"tags-view-container\"\n :style=\"{ height: `${tagsViewHeight}px` }\"\n >\n <slot name=\"tags-view\" />\n </div>\n\n <!-- 主区域:左侧内容 + 右侧菜单 -->\n <div class=\"main-area\">\n <!-- 左侧:主内容区 -->\n <NLayout class=\"content-layout\">\n <NLayoutContent class=\"main-content\">\n <div class=\"page-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"transitionName\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </div>\n </NLayoutContent>\n\n <template v-if=\"showFooter\">\n <slot name=\"footer\" />\n </template>\n </NLayout>\n\n <!-- 右侧折叠/展开按钮 - 始终可见 -->\n <div\n v-if=\"menuSplit.currentSecondMenus.value.length > 0\"\n class=\"sidebar-toggle\"\n :class=\"[\n isDarkMode ? 'dark-theme' : 'light-theme',\n { active: !isCollapsed },\n ]\"\n @click=\"toggleCollapse\"\n >\n <span\n :class=\"[\n 'collapse-arrow',\n 'toggle-icon',\n isCollapsed ? 'collapsed' : 'expanded',\n ]\"\n >\n <span class=\"arrow-line\"></span>\n <span class=\"arrow-line\"></span>\n </span>\n </div>\n\n <!-- 右侧:二级菜单侧边栏 -->\n <div\n v-if=\"menuSplit.currentSecondMenus.value.length > 0\"\n class=\"right-sidebar-wrapper\"\n :class=\"{ collapsed: isCollapsed }\"\n >\n <div\n class=\"right-sidebar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <!-- 侧边栏标题 -->\n <div\n class=\"sidebar-header\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <div class=\"header-icon\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"menuSplit.activeFirstMenuItem.value?.meta?.icon\"\n :name=\"menuSplit.activeFirstMenuItem.value.meta.icon\"\n :size=\"20\"\n />\n </div>\n <span class=\"header-title\">{{\n menuSplit.activeFirstMenuItem.value?.meta?.title || \"菜单\"\n }}</span>\n </div>\n\n <!-- 二级菜单列表 -->\n <div class=\"sidebar-menu-list\">\n <template\n v-for=\"child in menuSplit.currentSecondMenus.value\"\n :key=\"child.path\"\n >\n <!-- 有子菜单的项 -->\n <div\n v-if=\"child.children && child.children.length > 0\"\n class=\"menu-group\"\n >\n <div class=\"group-title\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"child.meta?.icon\"\n :name=\"child.meta.icon\"\n :size=\"16\"\n />\n <span>{{ child.meta?.title }}</span>\n </div>\n <div\n v-for=\"subChild in child.children\"\n :key=\"subChild.path\"\n class=\"menu-item sub-item\"\n :class=\"{\n active: menuSplit.isMenuItemActive(subChild.path),\n }\"\n @click=\"menuSplit.handleSecondMenuClick(subChild)\"\n >\n <component\n :is=\"LayoutIcon\"\n v-if=\"subChild.meta?.icon\"\n :name=\"subChild.meta.icon\"\n :size=\"16\"\n />\n <span class=\"item-title\">{{ subChild.meta?.title }}</span>\n </div>\n </div>\n <!-- 没有子菜单的项 -->\n <div\n v-else\n class=\"menu-item\"\n :class=\"{\n active: menuSplit.isMenuItemActive(child.path),\n }\"\n @click=\"menuSplit.handleSecondMenuClick(child)\"\n >\n <component\n :is=\"LayoutIcon\"\n v-if=\"child.meta?.icon\"\n :name=\"child.meta.icon\"\n :size=\"18\"\n />\n <span class=\"item-title\">{{ child.meta?.title }}</span>\n </div>\n </template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport \"./index.scss\";\nimport { ref, computed, h, defineComponent } from \"vue\";\nimport { NLayout, NLayoutContent } from \"naive-ui\";\nimport {\n useLayoutContext,\n DEFAULT_BRAND_CONFIG,\n} from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\nimport { useMenuSplit } from \"../../../composables/useMenuSplit\";\nimport ResponsiveMenu from \"../../ResponsiveMenu/index.vue\";\n\ndefineOptions({ name: \"ReverseHorizontalMixLayout\" });\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\n\nconst isDarkMode = ctx.isDark;\nconst menus = computed(() => ctx.menus.value);\nconst showTagsView = computed(() => ctx.showTagsView.value);\nconst tagsViewHeight = computed(() => ctx.tagsViewHeight.value);\nconst showFooter = computed(() => ctx.showFooter.value);\nconst transitionName = computed(() => ctx.transitionName.value);\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\n\nconst menuSplit = useMenuSplit({\n menus: ctx.menus,\n floatingSecondMenu: computed(() => false),\n});\n\n// 右侧边栏折叠状态\nconst isCollapsed = ref(false);\nconst toggleCollapse = () => {\n isCollapsed.value = !isCollapsed.value;\n};\n\nconst LayoutIcon =\n ctx.iconComponent ??\n defineComponent({\n name: \"LayoutIcon\",\n props: { name: String, size: { type: Number, default: 18 } },\n setup(props) {\n return () =>\n h(\"i\", {\n class: props.name,\n style: {\n fontSize: `${props.size}px`,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n },\n });\n</script>\n","<!--\n * @robot-admin/layout - CardLayout\n *\n * 卡片式布局骨架\n * 顶部导航 + hover 触发抽屉式菜单 + 内容区\n *\n * Slots:\n * #menu-trigger - 菜单触发区域(hover 弹出抽屉)\n * #logo - Logo/品牌区域\n * #header-extra - 头部右侧操作区\n * #tags-view - 标签页区域\n * #drawer-menu - 抽屉式菜单内容\n * #footer - 页脚区域\n -->\n<template>\n <div class=\"card-layout-container\">\n <!-- 顶部导航栏 -->\n <div\n class=\"top-navbar\"\n :class=\"[isDarkMode ? 'dark-theme' : 'light-theme']\"\n >\n <div class=\"navbar-left\">\n <!-- 悬停触发区域 -->\n <div\n class=\"hover-trigger-area\"\n @mouseenter=\"cancelHideTimer\"\n @mouseleave=\"hideDrawerMenu\"\n >\n <slot name=\"menu-trigger\">\n <div class=\"menu-indicator\">\n <!-- 纯 CSS 三横线菜单图标 -->\n <span class=\"hamburger-icon\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </div>\n </slot>\n </div>\n\n <slot name=\"logo\">\n <div class=\"logo-container\">\n <div class=\"logo-glow\"></div>\n <video\n v-if=\"brand.logoType === 'video'\"\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n autoplay\n loop\n muted\n playsinline\n class=\"logo-video\"\n >\n 您的浏览器不支持 video 标签。\n </video>\n <img\n v-else\n :src=\"brand.logoSrc\"\n :width=\"brand.logoSize || 36\"\n :height=\"brand.logoSize || 36\"\n class=\"logo-video\"\n />\n </div>\n <div class=\"brand-name\">\n <span class=\"brand-title\">{{ brand.name }}</span>\n <span class=\"brand-subtitle\">{{ brand.subtitle }}</span>\n </div>\n <div class=\"navbar-divider\"></div>\n </slot>\n </div>\n\n <!-- 右侧:操作区 -->\n <slot name=\"header-extra\" />\n </div>\n\n <!-- 标签页区域 -->\n <div\n v-if=\"showTagsView\"\n class=\"tags-view-container\"\n :style=\"{ height: `${tagsViewHeight}px` }\"\n >\n <slot name=\"tags-view\" />\n </div>\n\n <!-- 抽屉式菜单 -->\n <div\n class=\"drawer-menu\"\n :class=\"[\n isDarkMode ? 'dark-theme' : 'light-theme',\n { visible: showDrawerMenu },\n ]\"\n @mouseenter=\"cancelHideTimer\"\n @mouseleave=\"hideDrawerMenu\"\n >\n <slot name=\"drawer-menu\">\n <!-- 菜单头部 -->\n <div class=\"drawer-header\">\n <div class=\"drawer-title\">\n <!-- 纯 CSS 网格图标 -->\n <span class=\"grid-icon\">\n <span></span>\n <span></span>\n <span></span>\n <span></span>\n </span>\n <span>功能导航</span>\n </div>\n </div>\n\n <!-- 菜单内容 - 阿里云风格铺开布局 -->\n <div class=\"drawer-content\">\n <div class=\"menu-grid\">\n <div\n v-for=\"category in menus\"\n :key=\"category.path\"\n class=\"menu-category\"\n >\n <!-- 分类标题 -->\n <div class=\"category-header\" @click=\"navigateToPage(category)\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"category.meta?.icon\"\n :name=\"category.meta.icon\"\n :size=\"18\"\n />\n <span>{{ category.meta?.title }}</span>\n </div>\n\n <!-- 分类下的菜单项 -->\n <div\n class=\"category-items\"\n v-if=\"category.children && category.children.length > 0\"\n >\n <div\n v-for=\"item in category.children\"\n :key=\"item.path\"\n class=\"menu-item\"\n @click=\"navigateToPage(item)\"\n >\n <component\n :is=\"LayoutIcon\"\n v-if=\"item.meta?.icon\"\n :name=\"item.meta.icon\"\n :size=\"16\"\n />\n <span class=\"item-title\">{{ item.meta?.title }}</span>\n </div>\n\n <!-- 3级菜单项 -->\n <template\n v-for=\"item in category.children\"\n :key=\"'sub-' + item.path\"\n >\n <div\n v-if=\"item.children && item.children.length > 0\"\n class=\"submenu-items\"\n >\n <div class=\"submenu-title\">{{ item.meta?.title }}</div>\n <div\n v-for=\"subItem in item.children\"\n :key=\"subItem.path\"\n class=\"menu-item submenu-item\"\n @click=\"navigateToPage(subItem)\"\n >\n <component\n :is=\"LayoutIcon\"\n v-if=\"subItem.meta?.icon\"\n :name=\"subItem.meta.icon\"\n :size=\"14\"\n />\n <span class=\"item-title\">{{ subItem.meta?.title }}</span>\n </div>\n </div>\n </template>\n </div>\n </div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- 主内容区域 -->\n <div class=\"main-content-area\">\n <NLayout class=\"content-layout\">\n <NLayoutContent class=\"main-content p16px app-content\">\n <div class=\"page-content\">\n <RouterView v-slot=\"{ Component, route }\">\n <Transition :name=\"transitionName\" mode=\"out-in\">\n <KeepAlive :include=\"cachedViews\" :max=\"maxCacheCount\">\n <component :is=\"Component\" :key=\"route.path\" />\n </KeepAlive>\n </Transition>\n </RouterView>\n </div>\n </NLayoutContent>\n\n <template v-if=\"showFooter\">\n <slot name=\"footer\" />\n </template>\n </NLayout>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport \"./index.scss\";\nimport { ref, computed, onUnmounted, h, defineComponent } from \"vue\";\nimport { useRouter } from \"vue-router\";\nimport { NLayout, NLayoutContent } from \"naive-ui\";\nimport {\n useLayoutContext,\n DEFAULT_BRAND_CONFIG,\n} from \"../../../composables/useLayoutContext\";\nimport { useLayoutCache } from \"../../../composables/useLayoutCache\";\nimport type { MenuOptions } from \"../../../types/menu\";\n\ndefineOptions({ name: \"CardLayout\" });\n\nconst ctx = useLayoutContext();\nconst { cachedViews, maxCacheCount } = useLayoutCache();\nconst router = useRouter();\n\nconst isDarkMode = ctx.isDark;\nconst menus = computed(() => ctx.menus.value);\nconst showTagsView = computed(() => ctx.showTagsView.value);\nconst tagsViewHeight = computed(() => ctx.tagsViewHeight.value);\nconst showFooter = computed(() => ctx.showFooter.value);\nconst transitionName = computed(() => ctx.transitionName.value);\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\n\n// 抽屉菜单状态\nconst showDrawerMenu = ref(false);\nconst hideTimer = ref<ReturnType<typeof setTimeout> | null>(null);\n\nconst hideDrawerMenu = () => {\n if (hideTimer.value) clearTimeout(hideTimer.value);\n hideTimer.value = setTimeout(() => {\n showDrawerMenu.value = false;\n }, 300);\n};\n\nconst cancelHideTimer = () => {\n if (hideTimer.value) {\n clearTimeout(hideTimer.value);\n hideTimer.value = null;\n }\n showDrawerMenu.value = true;\n};\n\nconst navigateToPage = (item: MenuOptions) => {\n if (item.path) {\n router.push(item.path);\n showDrawerMenu.value = false;\n }\n};\n\nconst LayoutIcon =\n ctx.iconComponent ??\n defineComponent({\n name: \"LayoutIcon\",\n props: { name: String, size: { type: Number, default: 18 } },\n setup(props) {\n return () =>\n h(\"i\", {\n class: props.name,\n style: {\n fontSize: `${props.size}px`,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n });\n },\n });\n\nonUnmounted(() => {\n if (hideTimer.value) clearTimeout(hideTimer.value);\n});\n</script>\n\n<style scoped lang=\"scss\">\n/* 纯 CSS 网格图标 (2x2) */\n.grid-icon {\n display: inline-grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 2.5px;\n width: 18px;\n height: 18px;\n padding: 1px;\n}\n\n.grid-icon span {\n background-color: currentColor;\n border-radius: 2px;\n opacity: 0.85;\n}\n\n/* 纯 CSS 三横线汉堡菜单图标 */\n.hamburger-icon {\n display: inline-flex;\n flex-direction: column;\n justify-content: space-between;\n width: 20px;\n height: 16px;\n padding: 2px 0;\n}\n\n.hamburger-icon span {\n display: block;\n width: 100%;\n height: 2px;\n background-color: currentColor;\n border-radius: 1px;\n opacity: 0.85;\n transition: all 0.2s ease;\n}\n</style>\n","<!--\r\n * @robot-admin/layout - C_LayoutContainer\r\n *\r\n * 智能布局容器\r\n * 根据 layoutMode 自动切换 6 种布局骨架,消费方仅需提供业务组件\r\n *\r\n * Slots:\r\n * #logo - 品牌 Logo 区域(各骨架有内置默认实现)\r\n * #menu - Side 布局的垂直菜单(需消费方提供)\r\n * #header - Side/Mix 布局的完整头部(需消费方提供)\r\n * #header-extra - Top/MixTop/Reverse/Card 头部右侧操作区\r\n * #tags-view - 标签页区域(需消费方提供)\r\n * #footer - 页脚区域(需消费方提供)\r\n * #top-menu - Top/MixTop/Reverse 水平菜单(骨架有默认)\r\n * #brand - MixTop 顶部导航品牌区(骨架有默认)\r\n * #menu-trigger - Card 菜单触发区域(骨架有默认)\r\n * #drawer-menu - Card 抽屉式菜单(骨架有默认)\r\n -->\r\n<template>\r\n <div :class=\"['layout-container', isDark ? 'dark-mode' : 'light-mode']\">\r\n <!-- ═══════ Side 左侧菜单布局 ═══════ -->\r\n <SideLayout v-if=\"layoutMode === 'side'\" v-model:collapsed=\"sideCollapsed\">\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template #menu>\r\n <slot name=\"menu\" :collapsed=\"sideCollapsed\" />\r\n </template>\r\n <template #header><slot name=\"header\" /></template>\r\n <template #footer><slot name=\"footer\" /></template>\r\n </SideLayout>\r\n\r\n <!-- ═══════ Top 顶部菜单布局 ═══════ -->\r\n <TopLayout v-else-if=\"layoutMode === 'top'\">\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template v-if=\"$slots['top-menu']\" #menu\r\n ><slot name=\"top-menu\"\r\n /></template>\r\n <template v-if=\"$slots['header-extra']\" #header-extra\r\n ><slot name=\"header-extra\"\r\n /></template>\r\n <template v-if=\"$slots['tags-view']\" #tags-view\r\n ><slot name=\"tags-view\"\r\n /></template>\r\n <template v-if=\"$slots.footer\" #footer><slot name=\"footer\" /></template>\r\n </TopLayout>\r\n\r\n <!-- ═══════ Mix 混合布局 ═══════ -->\r\n <MixLayout v-else-if=\"layoutMode === 'mix'\">\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template #header><slot name=\"header\" /></template>\r\n <template v-if=\"$slots.footer\" #footer><slot name=\"footer\" /></template>\r\n </MixLayout>\r\n\r\n <!-- ═══════ MixTop 顶部混合布局 ═══════ -->\r\n <MixTopLayout v-else-if=\"layoutMode === 'mix-top'\">\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template v-if=\"$slots.brand\" #brand><slot name=\"brand\" /></template>\r\n <template v-if=\"$slots['top-menu']\" #top-menu\r\n ><slot name=\"top-menu\"\r\n /></template>\r\n <template v-if=\"$slots['header-extra']\" #header-extra\r\n ><slot name=\"header-extra\"\r\n /></template>\r\n <template v-if=\"$slots['tags-view']\" #tags-view\r\n ><slot name=\"tags-view\"\r\n /></template>\r\n <template v-if=\"$slots.footer\" #footer><slot name=\"footer\" /></template>\r\n </MixTopLayout>\r\n\r\n <!-- ═══════ ReverseHorizontalMix 反转混合布局 ═══════ -->\r\n <ReverseHorizontalMixLayout\r\n v-else-if=\"layoutMode === 'reverse-horizontal-mix'\"\r\n >\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template v-if=\"$slots['top-menu']\" #top-menu\r\n ><slot name=\"top-menu\"\r\n /></template>\r\n <template v-if=\"$slots['header-extra']\" #header-extra\r\n ><slot name=\"header-extra\"\r\n /></template>\r\n <template v-if=\"$slots['tags-view']\" #tags-view\r\n ><slot name=\"tags-view\"\r\n /></template>\r\n <template v-if=\"$slots.footer\" #footer><slot name=\"footer\" /></template>\r\n </ReverseHorizontalMixLayout>\r\n\r\n <!-- ═══════ CardLayout 卡片布局 ═══════ -->\r\n <CardLayout v-else-if=\"layoutMode === 'card-layout'\">\r\n <template v-if=\"$slots['menu-trigger']\" #menu-trigger\r\n ><slot name=\"menu-trigger\"\r\n /></template>\r\n <template v-if=\"$slots.logo\" #logo><slot name=\"logo\" /></template>\r\n <template v-if=\"$slots['header-extra']\" #header-extra\r\n ><slot name=\"header-extra\"\r\n /></template>\r\n <template v-if=\"$slots['tags-view']\" #tags-view\r\n ><slot name=\"tags-view\"\r\n /></template>\r\n <template v-if=\"$slots['drawer-menu']\" #drawer-menu\r\n ><slot name=\"drawer-menu\"\r\n /></template>\r\n <template v-if=\"$slots.footer\" #footer><slot name=\"footer\" /></template>\r\n </CardLayout>\r\n\r\n <!-- ═══════ Fallback ═══════ -->\r\n <div v-else class=\"layout-coming-soon\">\r\n <div class=\"coming-soon-content\">\r\n <div class=\"coming-soon-icon\">🚧</div>\r\n <div class=\"coming-soon-title\">布局开发中</div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, provide } from \"vue\";\r\nimport { useSettingsStore } from \"../../stores/settings\";\r\nimport { useLayoutContext } from \"../../composables/useLayoutContext\";\r\n\r\n// 骨架布局全局样式\r\nimport \"../../styles/layouts.scss\";\r\n\r\n// 骨架组件\r\nimport SideLayout from \"../layouts/SideLayout/index.vue\";\r\nimport TopLayout from \"../layouts/TopLayout/index.vue\";\r\nimport MixLayout from \"../layouts/MixLayout/index.vue\";\r\nimport MixTopLayout from \"../layouts/MixTopLayout/index.vue\";\r\nimport ReverseHorizontalMixLayout from \"../layouts/ReverseHorizontalMixLayout/index.vue\";\r\nimport CardLayout from \"../layouts/CardLayout/index.vue\";\r\n\r\ndefineOptions({ name: \"C_LayoutContainer\" });\r\n\r\nconst settingsStore = useSettingsStore();\r\nconst ctx = useLayoutContext();\r\n\r\nconst layoutMode = computed(() => settingsStore.layoutMode);\r\nconst isDark = ctx.isDark;\r\n\r\n// Side 布局折叠状态\r\nconst sideCollapsed = ref(false);\r\n\r\n// 提供折叠状态给子组件(如 C_Header 的汉堡按钮)\r\nprovide(\"menuCollapse\", {\r\n isCollapsed: sideCollapsed,\r\n handleCollapsedChange: (collapsed: boolean) => {\r\n sideCollapsed.value = collapsed;\r\n },\r\n});\r\n</script>\r\n","/**\n * SettingsDrawer - 常量数据\n */\n\nimport { THEME_PRESETS, COLOR_SWATCHES } from \"../../constants\";\nimport type { ThemePreset } from \"../../types\";\n\n// 重新导出(内部使用)\nexport { COLOR_SWATCHES, THEME_PRESETS };\nexport type { ThemePreset };\n\n// 布局模式选项 - 完整的 6 种布局(含 SVG 图标,仅 UI 内部使用)\nexport const LAYOUT_MODE_OPTIONS = [\n {\n label: \"左侧菜单(默认)\",\n value: \"side\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"16\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"18\" y=\"0\" width=\"38\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"18\" y=\"12\" width=\"38\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n {\n label: \"顶部菜单(清爽)\",\n value: \"top\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"56\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"0\" y=\"12\" width=\"56\" height=\"8\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"0\" y=\"22\" width=\"56\" height=\"24\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n {\n label: \"左侧混合(灵巧)\",\n value: \"mix\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"10\" y=\"0\" width=\"14\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"26\" y=\"0\" width=\"30\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.6\"/>\n <rect x=\"26\" y=\"12\" width=\"30\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n {\n label: \"顶部混合(侧优)\",\n value: \"mix-top\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"8\" height=\"48\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"10\" y=\"0\" width=\"46\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"10\" y=\"12\" width=\"46\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n {\n label: \"反转混合(另类)\",\n value: \"reverse-horizontal-mix\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"56\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"44\" y=\"12\" width=\"12\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"0\" y=\"12\" width=\"42\" height=\"34\" rx=\"1\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n {\n label: \"卡片网格(新颖)\",\n value: \"card-layout\",\n disabled: false,\n svg: `\n <rect x=\"0\" y=\"0\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.9\"/>\n <rect x=\"32\" y=\"0\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.7\"/>\n <rect x=\"0\" y=\"24\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.6\"/>\n <rect x=\"32\" y=\"24\" width=\"24\" height=\"20\" rx=\"2\" fill=\"currentColor\" fill-opacity=\"0.4\"/>\n `,\n },\n];\n","<!--\n * @robot-admin/layout - SettingsDrawer\n *\n * 布局配置抽屉\n * 包含外观/布局/功能三大模块,支持主题预设、布局切换、配置导入导出等\n -->\n<template>\n <NDrawer\n v-model:show=\"visible\"\n :width=\"380\"\n placement=\"right\"\n :trap-focus=\"false\"\n :block-scroll=\"false\"\n >\n <NDrawerContent title=\"⚙️ 布局配置\" closable>\n <NTabs v-model:value=\"activeTab\" animated class=\"settings-tabs\">\n <!-- 外观 Tab -->\n <NTabPane name=\"appearance\" tab=\"🎨 外观\">\n <!-- 预设方案网格 -->\n <div class=\"settings-section\">\n <div class=\"preset-grid\">\n <div\n v-for=\"preset in THEME_PRESETS\"\n :key=\"preset.name\"\n class=\"preset-card\"\n :class=\"{ active: isCurrentPreset(preset) }\"\n @click=\"handleApplyPreset(preset)\"\n >\n <div class=\"preset-icon\">{{ preset.icon }}</div>\n <div class=\"preset-name\">{{ preset.name }}</div>\n <div class=\"preset-color\">\n <span\n class=\"color-dot\"\n :style=\"{ backgroundColor: preset.primaryColor }\"\n ></span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- 主题模式 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">主题模式</div>\n <NRadioGroup\n v-model:value=\"settingsStore.themeMode\"\n class=\"mode-group\"\n >\n <NRadioButton value=\"light\">\n <span class=\"i-mdi:white-balance-sunny mr-1\"></span>\n 浅色\n </NRadioButton>\n <NRadioButton value=\"dark\">\n <span class=\"i-mdi:moon-waning-crescent mr-1\"></span>\n 深色\n </NRadioButton>\n <NRadioButton value=\"auto\">\n <span class=\"i-mdi:theme-light-dark mr-1\"></span>\n 自动\n </NRadioButton>\n </NRadioGroup>\n </div>\n\n <!-- 主题色 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">主题色</div>\n <div class=\"color-picker-wrapper\">\n <NColorPicker\n v-model:value=\"settingsStore.primaryColor\"\n :show-alpha=\"false\"\n :swatches=\"COLOR_SWATCHES\"\n :actions=\"['confirm']\"\n />\n <span class=\"color-value\">{{ settingsStore.primaryColor }}</span>\n </div>\n </div>\n\n <!-- 圆角大小 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">圆角大小</div>\n <NRadioGroup\n v-model:value=\"settingsStore.borderRadius\"\n class=\"radius-group\"\n >\n <NRadioButton value=\"small\">小 (4px)</NRadioButton>\n <NRadioButton value=\"medium\">中 (6px)</NRadioButton>\n <NRadioButton value=\"large\">大 (8px)</NRadioButton>\n </NRadioGroup>\n </div>\n\n <!-- 页面动画 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">页面动画</div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm\">启用动画</span>\n <NSwitch v-model:value=\"settingsStore.enableTransition\" />\n </div>\n <NRadioGroup\n v-model:value=\"settingsStore.transitionType\"\n :disabled=\"!settingsStore.enableTransition\"\n class=\"transition-group\"\n >\n <NRadioButton value=\"fade\">淡入</NRadioButton>\n <NRadioButton value=\"slide\">滑动</NRadioButton>\n <NRadioButton value=\"zoom\">缩放</NRadioButton>\n <NRadioButton value=\"none\">无</NRadioButton>\n </NRadioGroup>\n </div>\n\n <!-- 恢复默认 -->\n <div class=\"settings-section\">\n <NButton block secondary @click=\"handleResetAppearance\">\n <template #icon>\n <span class=\"i-mdi:restore\"></span>\n </template>\n 恢复外观默认设置\n </NButton>\n </div>\n </NTabPane>\n\n <!-- 布局 Tab -->\n <NTabPane name=\"layout\" tab=\"📐 布局\">\n <!-- 布局模式 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">布局模式</div>\n <div class=\"layout-grid\">\n <div\n v-for=\"mode in LAYOUT_MODE_OPTIONS\"\n :key=\"mode.value\"\n class=\"layout-item\"\n :class=\"{\n active: settingsStore.layoutMode === mode.value,\n disabled: mode.disabled,\n }\"\n @click.stop=\"handleLayoutChange(mode.value, mode.disabled)\"\n >\n <div class=\"layout-screenshot\">\n <svg\n class=\"layout-svg\"\n viewBox=\"0 0 56 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g v-html=\"mode.svg\"></g>\n </svg>\n </div>\n <div class=\"layout-label\">\n {{ mode.label }}\n <span v-if=\"mode.disabled\" class=\"badge-soon\">敬请期待</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- 界面元素 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">界面元素</div>\n <div class=\"setting-item\">\n <span>显示面包屑</span>\n <NSwitch v-model:value=\"settingsStore.showBreadcrumb\" />\n </div>\n <div class=\"setting-item\">\n <span>显示面包屑图标</span>\n <NSwitch\n v-model:value=\"settingsStore.showBreadcrumbIcon\"\n :disabled=\"!settingsStore.showBreadcrumb\"\n />\n </div>\n <div class=\"setting-item\">\n <span>显示标签页</span>\n <NSwitch v-model:value=\"settingsStore.showTagsView\" />\n </div>\n <div class=\"setting-item\">\n <span>显示页脚</span>\n <NSwitch v-model:value=\"settingsStore.showFooter\" />\n </div>\n </div>\n\n <!-- 尺寸调整 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">尺寸调整</div>\n <div class=\"slider-item\">\n <div class=\"slider-label\">\n <span>侧边栏宽度</span>\n <span class=\"slider-value\"\n >{{ settingsStore.sidebarWidth }}px</span\n >\n </div>\n <NSlider\n v-model:value=\"settingsStore.sidebarWidth\"\n :min=\"180\"\n :max=\"280\"\n :step=\"10\"\n :marks=\"{ 180: '180', 220: '220', 280: '280' }\"\n />\n </div>\n <div class=\"slider-item\">\n <div class=\"slider-label\">\n <span>头部高度</span>\n <span class=\"slider-value\"\n >{{ settingsStore.headerHeight }}px</span\n >\n </div>\n <NSlider\n v-model:value=\"settingsStore.headerHeight\"\n :min=\"48\"\n :max=\"64\"\n :step=\"4\"\n :marks=\"{ 48: '48', 56: '56', 64: '64' }\"\n />\n </div>\n </div>\n\n <!-- 恢复默认 -->\n <div class=\"settings-section\">\n <NButton block secondary @click=\"handleResetLayout\">\n <template #icon>\n <span class=\"i-mdi:restore\"></span>\n </template>\n 恢复布局默认设置\n </NButton>\n </div>\n </NTabPane>\n\n <!-- 功能 Tab -->\n <NTabPane name=\"features\" tab=\"🔧 功能\">\n <!-- 缓存管理 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">缓存管理</div>\n <div class=\"action-buttons-grid\">\n <NButton secondary @click=\"handleClearCache\">\n <template #icon>\n <span class=\"i-mdi:delete-sweep\"></span>\n </template>\n 清除缓存\n </NButton>\n <NButton secondary @click=\"handleReload\">\n <template #icon>\n <span class=\"i-mdi:refresh\"></span>\n </template>\n 重新加载\n </NButton>\n </div>\n </div>\n\n <!-- 配置管理 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">配置管理</div>\n <div class=\"action-buttons-grid\">\n <NButton secondary @click=\"handleExportConfig\">\n <template #icon>\n <span class=\"i-mdi:download\"></span>\n </template>\n 导出配置\n </NButton>\n <NButton secondary @click=\"handleImportConfig\">\n <template #icon>\n <span class=\"i-mdi:upload\"></span>\n </template>\n 导入配置\n </NButton>\n </div>\n <NButton\n block\n type=\"error\"\n secondary\n class=\"mt-2\"\n @click=\"handleReset\"\n >\n <template #icon>\n <span class=\"i-mdi:restore\"></span>\n </template>\n 重置所有配置\n </NButton>\n </div>\n\n <!-- 系统模式 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">系统模式</div>\n <div class=\"setting-item\">\n <div class=\"setting-label\">\n <span>灰色模式</span>\n <span class=\"setting-desc\">用于哀悼日场景</span>\n </div>\n <NSwitch v-model:value=\"grayMode\" />\n </div>\n <div class=\"setting-item\">\n <div class=\"setting-label\">\n <span>色弱模式</span>\n <span class=\"setting-desc\">提供无障碍访问支持</span>\n </div>\n <NSwitch v-model:value=\"colorWeakMode\" />\n </div>\n </div>\n\n <!-- 水印设置 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">水印设置</div>\n <div class=\"setting-item\">\n <span>启用水印</span>\n <NSwitch v-model:value=\"watermarkEnabled\" />\n </div>\n <div v-if=\"watermarkEnabled\" class=\"mt-2\">\n <NInput\n v-model:value=\"watermarkText\"\n placeholder=\"请输入水印内容\"\n size=\"small\"\n />\n </div>\n </div>\n\n <!-- 系统信息 -->\n <div class=\"settings-section\">\n <div class=\"section-title\">系统信息</div>\n <div class=\"system-info\">\n <div class=\"info-item\">\n <span class=\"info-label\">浏览器</span>\n <span class=\"info-value\">{{ systemInfo.browser }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">操作系统</span>\n <span class=\"info-value\">{{ systemInfo.os }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">屏幕分辨率</span>\n <span class=\"info-value\">{{ systemInfo.resolution }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">设备像素比</span>\n <span class=\"info-value\">{{ systemInfo.pixelRatio }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">语言</span>\n <span class=\"info-value\">{{ systemInfo.language }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">时区</span>\n <span class=\"info-value\">{{ systemInfo.timezone }}</span>\n </div>\n </div>\n </div>\n </NTabPane>\n </NTabs>\n </NDrawerContent>\n </NDrawer>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from \"vue\";\nimport {\n NDrawer,\n NDrawerContent,\n NTabs,\n NTabPane,\n NRadioGroup,\n NRadioButton,\n NColorPicker,\n NSwitch,\n NButton,\n NSlider,\n NInput,\n useMessage,\n useDialog,\n} from \"naive-ui\";\nimport { useSettingsStore } from \"../../stores/settings\";\nimport { DEFAULT_SETTINGS } from \"../../constants\";\nimport { COLOR_SWATCHES, LAYOUT_MODE_OPTIONS, THEME_PRESETS } from \"./data\";\nimport type { ThemePreset } from \"../../types\";\n\n// ============ 数据定义 ============\n\nconst message = useMessage();\nconst dialog = useDialog();\nconst settingsStore = useSettingsStore();\nconst visible = defineModel<boolean>(\"show\", { default: false });\nconst activeTab = ref(\"appearance\");\n\n// 功能开关\nconst grayMode = ref(false);\nconst colorWeakMode = ref(false);\nconst watermarkEnabled = ref(false);\nconst watermarkText = ref(\"Robot Admin\");\n\n// 水印元素引用\nlet watermarkEl: HTMLElement | null = null;\n\n// 创建水印函数\nconst createWatermark = (text: string) => {\n // 移除旧水印\n if (watermarkEl) {\n document.body.removeChild(watermarkEl);\n watermarkEl = null;\n }\n\n // 创建 canvas\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n canvas.width = 200;\n canvas.height = 150;\n\n ctx.font = \"14px Microsoft JhengHei\";\n ctx.fillStyle = \"rgba(120, 120, 120, 0.15)\";\n ctx.rotate((-20 * Math.PI) / 180);\n ctx.fillText(text, 0, 80);\n\n // 创建水印容器\n watermarkEl = document.createElement(\"div\");\n watermarkEl.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-image: url(${canvas.toDataURL()});\n background-repeat: repeat;\n z-index: 9999;\n user-select: none;\n `;\n\n document.body.appendChild(watermarkEl);\n};\n\n// 移除水印函数\nconst removeWatermark = () => {\n if (watermarkEl) {\n document.body.removeChild(watermarkEl);\n watermarkEl = null;\n }\n};\n\n// 监听灰色模式\nwatch(grayMode, (val) => {\n document.documentElement.classList.toggle(\"gray-mode\", val);\n});\n\n// 监听色弱模式\nwatch(colorWeakMode, (val) => {\n document.documentElement.classList.toggle(\"color-weak-mode\", val);\n});\n\n// 监听水印开关\nwatch(watermarkEnabled, (val) => {\n if (val) {\n createWatermark(watermarkText.value);\n } else {\n removeWatermark();\n }\n});\n\n// 监听水印文本\nwatch(watermarkText, (val) => {\n if (watermarkEnabled.value) {\n createWatermark(val);\n }\n});\n\n// 获取系统信息\nconst systemInfo = computed(() => {\n const ua = navigator.userAgent;\n let browser = \"Unknown\";\n let os = \"Unknown\";\n\n // 检测浏览器\n if (ua.includes(\"Chrome\")) browser = \"Chrome\";\n else if (ua.includes(\"Firefox\")) browser = \"Firefox\";\n else if (ua.includes(\"Safari\")) browser = \"Safari\";\n else if (ua.includes(\"Edge\")) browser = \"Edge\";\n\n // 检测操作系统\n if (ua.includes(\"Windows\")) os = \"Windows\";\n else if (ua.includes(\"Mac\")) os = \"macOS\";\n else if (ua.includes(\"Linux\")) os = \"Linux\";\n else if (ua.includes(\"Android\")) os = \"Android\";\n else if (ua.includes(\"iOS\")) os = \"iOS\";\n\n return {\n browser,\n os,\n resolution: `${window.screen.width} × ${window.screen.height}`,\n pixelRatio: window.devicePixelRatio + \"x\",\n language: navigator.language,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n});\n\n// 组件卸载时清理水印\nonUnmounted(() => {\n removeWatermark();\n});\n\n// 处理布局切换 - 阻止抽屉关闭\nconst handleLayoutChange = (value: string, disabled?: boolean) => {\n if (disabled) return;\n settingsStore.layoutMode = value as any;\n};\n\n// ============ 方法 ============\n\n/**\n * 判断是否是当前预设\n */\nconst isCurrentPreset = (preset: ThemePreset) => {\n return settingsStore.primaryColor === preset.primaryColor;\n};\n\n/**\n * 应用预设方案\n */\nconst handleApplyPreset = (preset: ThemePreset) => {\n settingsStore.applyPreset(preset);\n message.success(`已应用「${preset.name}」主题方案`);\n};\n\n/**\n * 恢复外观默认设置\n */\nconst handleResetAppearance = () => {\n settingsStore.themeMode = DEFAULT_SETTINGS.themeMode;\n settingsStore.primaryColor = DEFAULT_SETTINGS.primaryColor;\n settingsStore.borderRadius = DEFAULT_SETTINGS.borderRadius;\n settingsStore.transitionType = DEFAULT_SETTINGS.transitionType;\n settingsStore.enableTransition = DEFAULT_SETTINGS.enableTransition;\n message.success(\"已恢复外观默认设置\");\n};\n\n/**\n * 恢复布局默认设置\n */\nconst handleResetLayout = () => {\n settingsStore.layoutMode = DEFAULT_SETTINGS.layoutMode;\n settingsStore.fixedHeader = DEFAULT_SETTINGS.fixedHeader;\n settingsStore.showBreadcrumb = DEFAULT_SETTINGS.showBreadcrumb;\n settingsStore.showBreadcrumbIcon = DEFAULT_SETTINGS.showBreadcrumbIcon;\n settingsStore.showTagsView = DEFAULT_SETTINGS.showTagsView;\n settingsStore.tagsViewHeight = DEFAULT_SETTINGS.tagsViewHeight;\n settingsStore.tagsViewStyle = DEFAULT_SETTINGS.tagsViewStyle;\n settingsStore.showFooter = DEFAULT_SETTINGS.showFooter;\n settingsStore.sidebarWidth = DEFAULT_SETTINGS.sidebarWidth;\n settingsStore.sidebarCollapsedWidth = DEFAULT_SETTINGS.sidebarCollapsedWidth;\n settingsStore.headerHeight = DEFAULT_SETTINGS.headerHeight;\n message.success(\"已恢复布局默认设置\");\n};\n\n/**\n * 重置配置\n */\nconst handleReset = () => {\n dialog.warning({\n title: \"确认重置\",\n content: \"确定要恢复默认配置吗?此操作不可撤销。\",\n positiveText: \"确认\",\n negativeText: \"取消\",\n onPositiveClick: () => {\n settingsStore.resetSettings();\n message.success(\"已恢复默认配置\");\n },\n });\n};\n\n/**\n * 清除缓存\n */\nconst handleClearCache = () => {\n dialog.warning({\n title: \"确认清除\",\n content: \"确定要清除浏览器缓存吗?\",\n positiveText: \"确认\",\n negativeText: \"取消\",\n onPositiveClick: () => {\n // 清除 localStorage\n const keysToKeep = [\"theme-mode\", \"robot-admin-settings\"];\n const allKeys = Object.keys(localStorage);\n allKeys.forEach((key) => {\n if (!keysToKeep.includes(key)) {\n localStorage.removeItem(key);\n }\n });\n // 清除 sessionStorage\n sessionStorage.clear();\n message.success(\"缓存已清除\");\n },\n });\n};\n\n/**\n * 重新加载页面\n */\nconst handleReload = () => {\n location.reload();\n};\n\n/**\n * 导出配置\n */\nconst handleExportConfig = () => {\n const config = {\n settings: settingsStore.settingsState,\n gray: grayMode.value,\n colorWeak: colorWeakMode.value,\n watermark: {\n enabled: watermarkEnabled.value,\n text: watermarkText.value,\n },\n exportTime: new Date().toISOString(),\n };\n const blob = new Blob([JSON.stringify(config, null, 2)], {\n type: \"application/json\",\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `robot-admin-config-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n message.success(\"配置已导出\");\n};\n\n/**\n * 导入配置\n */\nconst handleImportConfig = () => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"application/json\";\n input.onchange = async (e: Event) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const config = JSON.parse(text);\n\n // 应用配置\n if (config.settings) {\n settingsStore.$patch(config.settings);\n }\n if (config.gray !== undefined) {\n grayMode.value = config.gray;\n }\n if (config.colorWeak !== undefined) {\n colorWeakMode.value = config.colorWeak;\n }\n if (config.watermark) {\n watermarkEnabled.value = config.watermark.enabled;\n watermarkText.value = config.watermark.text;\n }\n\n message.success(\"配置已导入\");\n } catch (error) {\n message.error(\"配置文件格式错误\");\n }\n };\n input.click();\n};\n</script>\n\n<style scoped lang=\"scss\">\n@use \"../../styles/settings.scss\" as *;\n</style>\n","<!--\r\n * @robot-admin/layout - BrandLogo\r\n *\r\n * 品牌 Logo 组件\r\n * 从 LayoutContext.brand 读取配置,自动渲染 Logo + 品牌名\r\n * 支持折叠状态、横向/纵向布局\r\n -->\r\n<template>\r\n <div\r\n class=\"brand-logo\"\r\n :class=\"{\r\n 'brand-logo--collapsed': collapsed,\r\n 'brand-logo--horizontal': variant === 'horizontal',\r\n }\"\r\n >\r\n <div class=\"brand-logo__icon\">\r\n <div class=\"brand-logo__glow\"></div>\r\n <video\r\n v-if=\"brandConfig.logoType === 'video' && brandConfig.logoSrc\"\r\n :src=\"brandConfig.logoSrc\"\r\n :width=\"size\"\r\n :height=\"size\"\r\n autoplay\r\n loop\r\n muted\r\n playsinline\r\n class=\"brand-logo__media\"\r\n />\r\n <img\r\n v-else-if=\"brandConfig.logoSrc\"\r\n :src=\"brandConfig.logoSrc\"\r\n :width=\"size\"\r\n :height=\"size\"\r\n class=\"brand-logo__media\"\r\n alt=\"Logo\"\r\n />\r\n </div>\r\n <template v-if=\"showName && !collapsed\">\r\n <div class=\"brand-logo__name\">\r\n <span class=\"brand-logo__title\">{{ brandConfig.name }}</span>\r\n <span v-if=\"brandConfig.subtitle\" class=\"brand-logo__subtitle\">{{\r\n brandConfig.subtitle\r\n }}</span>\r\n </div>\r\n <div v-if=\"showDivider\" class=\"brand-logo__divider\"></div>\r\n </template>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n useLayoutContext,\r\n DEFAULT_BRAND_CONFIG,\r\n} from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"BrandLogo\" });\r\n\r\nwithDefaults(\r\n defineProps<{\r\n /** 是否显示品牌名称 */\r\n showName?: boolean;\r\n /** 是否显示分隔线 */\r\n showDivider?: boolean;\r\n /** Logo 尺寸 */\r\n size?: number;\r\n /** 是否折叠状态 */\r\n collapsed?: boolean;\r\n /** 布局方向 */\r\n variant?: \"vertical\" | \"horizontal\";\r\n }>(),\r\n {\r\n showName: false,\r\n showDivider: false,\r\n size: 36,\r\n collapsed: false,\r\n variant: \"horizontal\",\r\n },\r\n);\r\n\r\nconst ctx = useLayoutContext();\r\nconst brandConfig = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\r\n</script>\r\n\r\n<style scoped>\r\n.brand-logo {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n cursor: pointer;\r\n user-select: none;\r\n}\r\n\r\n.brand-logo--collapsed {\r\n justify-content: center;\r\n}\r\n\r\n.brand-logo__icon {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n}\r\n\r\n.brand-logo__glow {\r\n position: absolute;\r\n inset: -4px;\r\n border-radius: 50%;\r\n background: radial-gradient(\r\n circle,\r\n rgba(99, 102, 241, 0.15) 0%,\r\n transparent 70%\r\n );\r\n pointer-events: none;\r\n}\r\n\r\n.brand-logo__media {\r\n border-radius: 8px;\r\n object-fit: contain;\r\n}\r\n\r\n.brand-logo__name {\r\n display: flex;\r\n flex-direction: column;\r\n line-height: 1.2;\r\n white-space: nowrap;\r\n}\r\n\r\n.brand-logo__title {\r\n font-size: 15px;\r\n font-weight: 700;\r\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\r\n background-clip: text;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n}\r\n\r\n.brand-logo__subtitle {\r\n font-size: 10px;\r\n opacity: 0.6;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.brand-logo__divider {\r\n width: 1px;\r\n height: 24px;\r\n margin: 0 6px;\r\n background: linear-gradient(\r\n 180deg,\r\n transparent 0%,\r\n rgba(128, 128, 128, 0.3) 50%,\r\n transparent 100%\r\n );\r\n}\r\n</style>\r\n","<!--\r\n * @robot-admin/layout - IconMenu\r\n *\r\n * 一级图标菜单\r\n * 用于 Mix / MixTop 布局的左侧一级菜单栏\r\n * 显示图标 + 标签,支持激活状态\r\n -->\r\n<template>\r\n <div class=\"icon-menu\">\r\n <div\r\n v-for=\"item in menus\"\r\n :key=\"item.path\"\r\n class=\"icon-menu__item\"\r\n :class=\"{ 'icon-menu__item--active': active === item.path }\"\r\n @click=\"emit('click', item)\"\r\n >\r\n <div class=\"icon-menu__icon\">\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && item.meta?.icon\"\r\n :name=\"item.meta.icon\"\r\n :size=\"20\"\r\n />\r\n <span v-else class=\"icon-menu__fallback\">\r\n {{ item.meta?.title?.charAt(0) || \"?\" }}\r\n </span>\r\n </div>\r\n <div class=\"icon-menu__label\">\r\n {{ item.meta?.title }}\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { MenuOptions } from \"../../types/menu\";\r\nimport { useLayoutContext } from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"IconMenu\" });\r\n\r\ndefineProps<{\r\n /** 菜单数据 */\r\n menus: MenuOptions[];\r\n /** 当前激活的菜单路径 */\r\n active?: string;\r\n}>();\r\n\r\nconst emit = defineEmits<{\r\n click: [item: MenuOptions];\r\n}>();\r\n\r\nconst ctx = useLayoutContext();\r\n</script>\r\n\r\n<style scoped>\r\n.icon-menu {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 2px;\r\n padding: 4px 0;\r\n width: 100%;\r\n}\r\n\r\n.icon-menu__item {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n width: calc(100% - 12px);\r\n padding: 10px 4px 8px;\r\n margin: 0 6px;\r\n border-radius: 10px;\r\n cursor: pointer;\r\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n position: relative;\r\n opacity: 0.7;\r\n}\r\n\r\n.icon-menu__item:hover {\r\n opacity: 1;\r\n background: rgba(99, 102, 241, 0.08);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.icon-menu__item--active {\r\n opacity: 1;\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(99, 102, 241, 0.15) 0%,\r\n rgba(139, 92, 246, 0.1) 100%\r\n );\r\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.2);\r\n}\r\n\r\n.icon-menu__item--active::before {\r\n content: \"\";\r\n position: absolute;\r\n left: 0;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 3px;\r\n height: 60%;\r\n border-radius: 0 3px 3px 0;\r\n background: linear-gradient(180deg, #667eea, #764ba2);\r\n}\r\n\r\n.icon-menu__icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n font-size: 20px;\r\n}\r\n\r\n.icon-menu__fallback {\r\n font-size: 14px;\r\n font-weight: 600;\r\n width: 28px;\r\n height: 28px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 8px;\r\n background: rgba(128, 128, 128, 0.1);\r\n}\r\n\r\n.icon-menu__label {\r\n font-size: 11px;\r\n font-weight: 500;\r\n line-height: 1.2;\r\n text-align: center;\r\n max-width: 100%;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n</style>\r\n","<!--\r\n * @robot-admin/layout - FloatingMenu\r\n *\r\n * 悬浮二级菜单面板\r\n * 用于 MixLayout 的悬浮二级菜单(点击一级菜单后展开)\r\n -->\r\n<template>\r\n <Transition name=\"slide-fade\">\r\n <div\r\n v-if=\"show && menuItem\"\r\n class=\"floating-menu\"\r\n :class=\"[ctx.isDark.value ? 'dark-theme' : 'light-theme']\"\r\n >\r\n <!-- 标题 -->\r\n <div class=\"floating-menu__header\">\r\n <div class=\"floating-menu__brand\">\r\n <span class=\"floating-menu__brand-title\">{{ brand.name }}</span>\r\n <span class=\"floating-menu__brand-subtitle\">{{\r\n brand.subtitle\r\n }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- 菜单列表 -->\r\n <div class=\"floating-menu__list\">\r\n <template v-for=\"child in menuItem.children\" :key=\"child.path\">\r\n <!-- 有子菜单的项 -->\r\n <div\r\n v-if=\"child.children && child.children.length > 0\"\r\n class=\"floating-menu__group\"\r\n >\r\n <div class=\"floating-menu__group-title\">\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && child.meta?.icon\"\r\n :name=\"child.meta.icon\"\r\n :size=\"16\"\r\n />\r\n <span>{{ child.meta?.title }}</span>\r\n </div>\r\n <div\r\n v-for=\"subChild in child.children\"\r\n :key=\"subChild.path\"\r\n class=\"floating-menu__item floating-menu__item--sub\"\r\n :class=\"{ active: isActive?.(subChild.path) }\"\r\n @click=\"emit('click', subChild)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && subChild.meta?.icon\"\r\n :name=\"subChild.meta.icon\"\r\n :size=\"16\"\r\n />\r\n <span class=\"floating-menu__item-text\">{{\r\n subChild.meta?.title\r\n }}</span>\r\n </div>\r\n </div>\r\n <!-- 无子菜单的项 -->\r\n <div\r\n v-else\r\n class=\"floating-menu__item\"\r\n :class=\"{ active: isActive?.(child.path) }\"\r\n @click=\"emit('click', child)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && child.meta?.icon\"\r\n :name=\"child.meta.icon\"\r\n :size=\"18\"\r\n />\r\n <span class=\"floating-menu__item-text\">{{\r\n child.meta?.title\r\n }}</span>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </Transition>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { MenuOptions } from \"../../types/menu\";\r\nimport {\r\n useLayoutContext,\r\n DEFAULT_BRAND_CONFIG,\r\n} from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"FloatingMenu\" });\r\n\r\ndefineProps<{\r\n /** 是否显示 */\r\n show: boolean;\r\n /** 当前悬浮的一级菜单项(包含 children) */\r\n menuItem: MenuOptions | null;\r\n /** 判断菜单项是否激活 */\r\n isActive?: (path: string | undefined) => boolean;\r\n}>();\r\n\r\nconst emit = defineEmits<{\r\n click: [item: MenuOptions];\r\n}>();\r\n\r\nconst ctx = useLayoutContext();\r\nconst brand = { ...DEFAULT_BRAND_CONFIG, ...ctx.brand };\r\n</script>\r\n\r\n<style scoped>\r\n.floating-menu {\r\n position: absolute;\r\n top: 0;\r\n left: 100%;\r\n width: 240px;\r\n height: 100%;\r\n z-index: 100;\r\n overflow-y: auto;\r\n border-right: 1px solid rgba(128, 128, 128, 0.1);\r\n backdrop-filter: blur(20px);\r\n -webkit-backdrop-filter: blur(20px);\r\n}\r\n\r\n.floating-menu.light-theme {\r\n background: rgba(255, 255, 255, 0.95);\r\n box-shadow: 4px 0 24px rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.floating-menu.dark-theme {\r\n background: rgba(30, 30, 36, 0.95);\r\n box-shadow: 4px 0 24px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.floating-menu__header {\r\n padding: 16px 20px 12px;\r\n border-bottom: 1px solid rgba(128, 128, 128, 0.1);\r\n}\r\n\r\n.floating-menu__brand-title {\r\n font-size: 14px;\r\n font-weight: 700;\r\n background: linear-gradient(135deg, #667eea, #764ba2);\r\n background-clip: text;\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n}\r\n\r\n.floating-menu__brand-subtitle {\r\n display: block;\r\n font-size: 11px;\r\n opacity: 0.5;\r\n margin-top: 2px;\r\n}\r\n\r\n.floating-menu__list {\r\n padding: 8px 12px;\r\n}\r\n\r\n.floating-menu__group {\r\n margin-bottom: 8px;\r\n}\r\n\r\n.floating-menu__group-title {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 8px 8px 4px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n opacity: 0.5;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.floating-menu__item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 10px 12px;\r\n margin: 2px 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n font-size: 14px;\r\n}\r\n\r\n.floating-menu__item:hover {\r\n background: rgba(99, 102, 241, 0.08);\r\n}\r\n\r\n.floating-menu__item.active {\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(99, 102, 241, 0.12),\r\n rgba(139, 92, 246, 0.08)\r\n );\r\n color: #667eea;\r\n}\r\n\r\n.floating-menu__item--sub {\r\n padding-left: 20px;\r\n font-size: 13px;\r\n}\r\n\r\n.floating-menu__item-text {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* Transition */\r\n.slide-fade-enter-active,\r\n.slide-fade-leave-active {\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.slide-fade-enter-from {\r\n opacity: 0;\r\n transform: translateX(-12px);\r\n}\r\n\r\n.slide-fade-leave-to {\r\n opacity: 0;\r\n transform: translateX(-12px);\r\n}\r\n</style>\r\n","<!--\r\n * @robot-admin/layout - SideMenu\r\n *\r\n * 右侧二级菜单侧边栏\r\n * 用于 ReverseHorizontalMixLayout 的右侧二级菜单\r\n -->\r\n<template>\r\n <template v-if=\"menus.length > 0\">\r\n <!-- 折叠/展开按钮 -->\r\n <div\r\n class=\"side-menu-toggle\"\r\n :class=\"[\r\n ctx.isDark.value ? 'dark-theme' : 'light-theme',\r\n { active: !isCollapsed },\r\n ]\"\r\n @click=\"isCollapsed = !isCollapsed\"\r\n >\r\n <i\r\n :class=\"[\r\n 'toggle-icon',\r\n isCollapsed ? 'i-ri:side-bar-line' : 'i-ri:arrow-right-s-line',\r\n ]\"\r\n ></i>\r\n </div>\r\n\r\n <!-- 侧边栏内容 -->\r\n <Transition name=\"glass-slide\">\r\n <div\r\n v-if=\"!isCollapsed\"\r\n class=\"side-menu\"\r\n :class=\"[ctx.isDark.value ? 'dark-theme' : 'light-theme']\"\r\n >\r\n <!-- 标题 -->\r\n <div class=\"side-menu__header\">\r\n <div class=\"side-menu__header-icon\">\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && activeItem?.meta?.icon\"\r\n :name=\"activeItem.meta.icon\"\r\n :size=\"17\"\r\n />\r\n </div>\r\n <span class=\"side-menu__header-title\">{{\r\n activeItem?.meta?.title || \"菜单\"\r\n }}</span>\r\n </div>\r\n\r\n <!-- 菜单列表 -->\r\n <div class=\"side-menu__list\">\r\n <template v-for=\"child in menus\" :key=\"child.path\">\r\n <!-- 有子菜单 -->\r\n <div\r\n v-if=\"child.children && child.children.length > 0\"\r\n class=\"side-menu__group\"\r\n >\r\n <div class=\"side-menu__group-label\">\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && child.meta?.icon\"\r\n :name=\"child.meta.icon\"\r\n :size=\"14\"\r\n />\r\n <span>{{ child.meta?.title }}</span>\r\n </div>\r\n <div\r\n v-for=\"subChild in child.children\"\r\n :key=\"subChild.path\"\r\n class=\"side-menu__item\"\r\n :class=\"{ active: isActive?.(subChild.path) }\"\r\n @click=\"emit('click', subChild)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && subChild.meta?.icon\"\r\n :name=\"subChild.meta.icon\"\r\n :size=\"15\"\r\n />\r\n <span class=\"side-menu__item-text\">{{\r\n subChild.meta?.title\r\n }}</span>\r\n </div>\r\n </div>\r\n <!-- 无子菜单 -->\r\n <div\r\n v-else\r\n class=\"side-menu__item\"\r\n :class=\"{ active: isActive?.(child.path) }\"\r\n @click=\"emit('click', child)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && child.meta?.icon\"\r\n :name=\"child.meta.icon\"\r\n :size=\"16\"\r\n />\r\n <span class=\"side-menu__item-text\">{{ child.meta?.title }}</span>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </Transition>\r\n </template>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from \"vue\";\r\nimport type { MenuOptions } from \"../../types/menu\";\r\nimport { useLayoutContext } from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"SideMenu\" });\r\n\r\ndefineProps<{\r\n /** 二级菜单列表 */\r\n menus: MenuOptions[];\r\n /** 当前一级菜单项(显示标题和图标) */\r\n activeItem?: MenuOptions;\r\n /** 判断菜单项是否激活 */\r\n isActive?: (path: string | undefined) => boolean;\r\n}>();\r\n\r\nconst emit = defineEmits<{\r\n click: [item: MenuOptions];\r\n}>();\r\n\r\nconst ctx = useLayoutContext();\r\nconst isCollapsed = ref(false);\r\n</script>\r\n\r\n<style scoped>\r\n.side-menu-toggle {\r\n position: absolute;\r\n right: 0;\r\n top: 50%;\r\n transform: translateY(-50%) translateX(50%);\r\n width: 24px;\r\n height: 48px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 12px;\r\n cursor: pointer;\r\n z-index: 10;\r\n transition: all 0.25s ease;\r\n font-size: 14px;\r\n}\r\n\r\n.side-menu-toggle.light-theme {\r\n background: rgba(255, 255, 255, 0.9);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.side-menu-toggle.dark-theme {\r\n background: rgba(40, 40, 46, 0.9);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.side-menu-toggle:hover {\r\n transform: translateY(-50%) translateX(50%) scale(1.1);\r\n}\r\n\r\n.side-menu {\r\n width: 100%;\r\n height: 100%;\r\n overflow-y: auto;\r\n padding: 0 8px;\r\n}\r\n\r\n.side-menu.light-theme {\r\n background: rgba(255, 255, 255, 0.95);\r\n border-left: 1px solid rgba(0, 0, 0, 0.06);\r\n}\r\n\r\n.side-menu.dark-theme {\r\n background: rgba(30, 30, 36, 0.95);\r\n border-left: 1px solid rgba(255, 255, 255, 0.06);\r\n}\r\n\r\n.side-menu__header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 16px 12px 12px;\r\n border-bottom: 1px solid rgba(128, 128, 128, 0.1);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.side-menu__header-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 8px;\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(99, 102, 241, 0.12),\r\n rgba(139, 92, 246, 0.08)\r\n );\r\n}\r\n\r\n.side-menu__header-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n}\r\n\r\n.side-menu__list {\r\n padding: 4px 0;\r\n}\r\n\r\n.side-menu__group {\r\n margin-bottom: 8px;\r\n}\r\n\r\n.side-menu__group-label {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n opacity: 0.5;\r\n}\r\n\r\n.side-menu__item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 9px 12px;\r\n margin: 2px 0;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.side-menu__item:hover {\r\n background: rgba(99, 102, 241, 0.06);\r\n}\r\n\r\n.side-menu__item.active {\r\n background: linear-gradient(\r\n 135deg,\r\n rgba(99, 102, 241, 0.1),\r\n rgba(139, 92, 246, 0.06)\r\n );\r\n color: #667eea;\r\n font-weight: 500;\r\n}\r\n\r\n.side-menu__item-text {\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n/* Transition */\r\n.glass-slide-enter-active,\r\n.glass-slide-leave-active {\r\n transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.glass-slide-enter-from,\r\n.glass-slide-leave-to {\r\n opacity: 0;\r\n transform: translateX(20px);\r\n}\r\n</style>\r\n","<!--\r\n * @robot-admin/layout - DrawerMenu\r\n *\r\n * 抽屉式网格菜单\r\n * 用于 CardLayout 的 hover 触发的抽屉式功能导航\r\n -->\r\n<template>\r\n <div\r\n class=\"drawer-menu\"\r\n :class=\"[\r\n ctx.isDark.value ? 'dark-theme' : 'light-theme',\r\n { visible: show },\r\n ]\"\r\n @mouseenter=\"handlers.show()\"\r\n @mouseleave=\"handlers.startHide()\"\r\n >\r\n <div class=\"drawer-menu__header\">\r\n <div class=\"drawer-menu__title\">\r\n <!-- 纯 CSS 网格图标 -->\r\n <span class=\"grid-icon\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </span>\r\n <span>功能导航</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-menu__content\">\r\n <div class=\"drawer-menu__grid\">\r\n <div\r\n v-for=\"category in menus\"\r\n :key=\"category.path\"\r\n class=\"drawer-menu__category\"\r\n >\r\n <div class=\"drawer-menu__category-header\" @click=\"navigate(category)\">\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && category.meta?.icon\"\r\n :name=\"category.meta.icon\"\r\n :size=\"18\"\r\n />\r\n <span>{{ category.meta?.title }}</span>\r\n </div>\r\n\r\n <div\r\n v-if=\"category.children && category.children.length > 0\"\r\n class=\"drawer-menu__items\"\r\n >\r\n <div\r\n v-for=\"item in category.children\"\r\n :key=\"item.path\"\r\n class=\"drawer-menu__item\"\r\n @click=\"navigate(item)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && item.meta?.icon\"\r\n :name=\"item.meta.icon\"\r\n :size=\"16\"\r\n />\r\n <span class=\"drawer-menu__item-text\">{{ item.meta?.title }}</span>\r\n </div>\r\n\r\n <template v-for=\"item in category.children\" :key=\"item.path\">\r\n <div\r\n v-if=\"item.children && item.children.length > 0\"\r\n class=\"drawer-menu__sub-items\"\r\n >\r\n <div class=\"drawer-menu__sub-title\">\r\n {{ item.meta?.title }}\r\n </div>\r\n <div\r\n v-for=\"subItem in item.children\"\r\n :key=\"subItem.path\"\r\n class=\"drawer-menu__item drawer-menu__item--sub\"\r\n @click=\"navigate(subItem)\"\r\n >\r\n <component\r\n :is=\"ctx.iconComponent\"\r\n v-if=\"ctx.iconComponent && subItem.meta?.icon\"\r\n :name=\"subItem.meta.icon\"\r\n :size=\"14\"\r\n />\r\n <span class=\"drawer-menu__item-text\">{{\r\n subItem.meta?.title\r\n }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject } from \"vue\";\r\nimport { useRouter } from \"vue-router\";\r\nimport type { MenuOptions } from \"../../types/menu\";\r\nimport { useLayoutContext } from \"../../composables/useLayoutContext\";\r\nimport {\r\n DRAWER_HANDLER_KEY,\r\n type DrawerHandlers,\r\n} from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"DrawerMenu\" });\r\n\r\ndefineProps<{\r\n /** 菜单数据 */\r\n menus: MenuOptions[];\r\n /** 是否显示 */\r\n show: boolean;\r\n}>();\r\n\r\nconst ctx = useLayoutContext();\r\nconst router = useRouter();\r\n\r\n// 使用共享的 drawer 控制器(由 C_LayoutContainer provide)\r\nconst handlers = inject<DrawerHandlers>(DRAWER_HANDLER_KEY, {\r\n show: () => {},\r\n startHide: () => {},\r\n hide: () => {},\r\n});\r\n\r\nconst navigate = (item: MenuOptions) => {\r\n if (item.path) {\r\n router.push(item.path);\r\n handlers.hide();\r\n }\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.drawer-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n z-index: 100;\r\n max-height: 60vh;\r\n overflow-y: auto;\r\n opacity: 0;\r\n transform: translateY(-8px);\r\n pointer-events: none;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n backdrop-filter: blur(20px);\r\n -webkit-backdrop-filter: blur(20px);\r\n border-bottom-left-radius: 16px;\r\n border-bottom-right-radius: 16px;\r\n}\r\n\r\n.drawer-menu.visible {\r\n opacity: 1;\r\n transform: translateY(0);\r\n pointer-events: all;\r\n}\r\n\r\n.drawer-menu.light-theme {\r\n background: rgba(255, 255, 255, 0.96);\r\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\r\n border: 1px solid rgba(0, 0, 0, 0.06);\r\n border-top: none;\r\n}\r\n\r\n.drawer-menu.dark-theme {\r\n background: rgba(30, 30, 36, 0.96);\r\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);\r\n border: 1px solid rgba(255, 255, 255, 0.06);\r\n border-top: none;\r\n}\r\n\r\n.drawer-menu__header {\r\n padding: 16px 24px 8px;\r\n}\r\n\r\n.drawer-menu__title {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n font-size: 15px;\r\n font-weight: 600;\r\n}\r\n\r\n.drawer-menu__content {\r\n padding: 8px 24px 20px;\r\n}\r\n\r\n.drawer-menu__grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\r\n gap: 16px;\r\n}\r\n\r\n.drawer-menu__category {\r\n padding: 0;\r\n}\r\n\r\n.drawer-menu__category-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n border-radius: 8px;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.drawer-menu__category-header:hover {\r\n background: rgba(99, 102, 241, 0.06);\r\n}\r\n\r\n.drawer-menu__items {\r\n padding-left: 8px;\r\n}\r\n\r\n.drawer-menu__item {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 7px 12px;\r\n margin: 1px 0;\r\n border-radius: 6px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.drawer-menu__item:hover {\r\n background: rgba(99, 102, 241, 0.08);\r\n color: #667eea;\r\n}\r\n\r\n.drawer-menu__item--sub {\r\n padding-left: 16px;\r\n font-size: 12px;\r\n}\r\n\r\n.drawer-menu__item-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.drawer-menu__sub-items {\r\n padding: 4px 0;\r\n}\r\n\r\n.drawer-menu__sub-title {\r\n padding: 4px 12px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n opacity: 0.4;\r\n}\r\n\r\n/* 纯 CSS 网格图标 (2x2) */\r\n.grid-icon {\r\n display: inline-grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 2.5px;\r\n width: 18px;\r\n height: 18px;\r\n padding: 1px;\r\n}\r\n\r\n.grid-icon span {\r\n background-color: currentColor;\r\n border-radius: 2px;\r\n opacity: 0.85;\r\n}\r\n</style>\r\n","<!--\r\n * @robot-admin/layout - MenuTrigger\r\n *\r\n * 菜单触发区域\r\n * 用于 CardLayout 的 hover 触发抽屉式菜单\r\n * 使用共享的 drawer 控制器避免与 DrawerMenu 定时器竞争\r\n -->\r\n<template>\r\n <div\r\n class=\"menu-trigger\"\r\n @mouseenter=\"handlers.show()\"\r\n @mouseleave=\"handlers.startHide()\"\r\n >\r\n <div class=\"menu-trigger__indicator\">\r\n <!-- 纯 CSS 三横线菜单图标 -->\r\n <span class=\"hamburger-icon\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </span>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { inject } from \"vue\";\r\nimport {\r\n DRAWER_HANDLER_KEY,\r\n type DrawerHandlers,\r\n} from \"../../composables/useLayoutContext\";\r\n\r\ndefineOptions({ name: \"MenuTrigger\" });\r\n\r\ndefineProps<{\r\n show?: boolean;\r\n}>();\r\n\r\n// 使用共享控制器(由 C_LayoutContainer provide)\r\nconst handlers = inject<DrawerHandlers>(DRAWER_HANDLER_KEY, {\r\n show: () => {},\r\n startHide: () => {},\r\n hide: () => {},\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.menu-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0 8px;\r\n height: 100%;\r\n cursor: pointer;\r\n}\r\n\r\n.menu-trigger__indicator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n border-radius: 8px;\r\n font-size: 18px;\r\n transition: all 0.25s ease;\r\n opacity: 0.6;\r\n}\r\n\r\n.menu-trigger__indicator:hover {\r\n opacity: 1;\r\n background: rgba(99, 102, 241, 0.08);\r\n}\r\n\r\n/* 纯 CSS 三横线汉堡菜单图标 */\r\n.hamburger-icon {\r\n display: inline-flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n width: 20px;\r\n height: 16px;\r\n padding: 2px 0;\r\n}\r\n\r\n.hamburger-icon span {\r\n display: block;\r\n width: 100%;\r\n height: 2px;\r\n background-color: currentColor;\r\n border-radius: 1px;\r\n opacity: 0.85;\r\n transition: all 0.2s ease;\r\n}\r\n</style>\r\n","/**\n * @robot-admin/layout\n *\n * 布局系统一键初始化\n */\n\nimport type { App } from \"vue\";\nimport type { SettingsStoreOptions } from \"./types\";\nimport { createSettingsStore } from \"./stores/settings\";\n\n/**\n * 初始化布局系统\n *\n * @example\n * ```ts\n * import { setupLayout } from '@robot-admin/layout'\n * setupLayout(app, {\n * onThemeModeChange: async (mode) => {\n * const themeStore = useThemeStore()\n * await themeStore.setMode(mode)\n * }\n * })\n * ```\n */\nexport function setupLayout(_app: App, options: SettingsStoreOptions = {}) {\n // 注册 settings store\n const settingsStore = createSettingsStore(options);\n\n // 初始化 CSS Variables\n settingsStore().syncCSSVariables();\n\n return settingsStore;\n}\n"],"names":["PRESET_COLORS","THEME_PRESETS","LAYOUT_MODES","BORDER_RADIUS_MAP","TRANSITION_MAP","DEFAULT_SETTINGS","COLOR_SWATCHES","c","adjustColor","color","amount","num","r","g","b","createSettingsStore","options","defaults","onThemeModeChange","finalDefaults","defineStore","themeMode","ref","primaryColor","borderRadius","transitionType","enableTransition","layoutMode","collapsed","fixedHeader","showBreadcrumb","showBreadcrumbIcon","showTagsView","tagsViewHeight","tagsViewStyle","showFooter","sidebarWidth","sidebarCollapsedWidth","headerHeight","enableHotkeys","version","borderRadiusValue","computed","transitionName","shouldEnableTransition","settingsState","syncCSSVariables","root","applyPreset","preset","resetSettings","updateThemeMode","mode","toggleCollapse","watch","useSettingsStore","LAYOUT_CONTEXT_KEY","DRAWER_HANDLER_KEY","useLayoutContext","ctx","inject","DEFAULT_BRAND_CONFIG","useLayoutCache","maxCount","enableDevLog","expose","route","useRoute","cachedViews","maxCacheCount","shouldCache","routeName","addCache","name","removeCache","index","clearAllCache","newName","props","__props","emit","__emit","_collapsed","v","handleCollapsedUpdate","val","__expose","next","_createBlock","_unref","NLayout","_createVNode","NLayoutSider","_normalizeClass","_renderSlot","_ctx","NLayoutContent","_component_RouterView","Component","_Transition","_KeepAlive","_openBlock","_resolveDynamicComponent","router","useRouter","menuData","activeKey","isDarkMode","lightTheme","darkTheme","menuThemeOverrides","renderIcon","icon","size","h","convertToMenuOption","item","containerRef","visibleItems","hiddenItems","visibleOptions","dropdownOptions","child","handleSelect","key","estimateItemWidth","title","textWidth","char","code","iconWidth","calculateVisibleCount","containerWidth","MORE_BTN_WIDTH","SAFETY","totalWidth","usedWidth","count","available","w","calculateVisibleItems","nextTick","resizeTimer","debouncedCalculate","resizeObserver","onMounted","onUnmounted","_createElementBlock","_createElementVNode","_hoisted_1","NMenu","NDropdown","_hoisted_2","NButton","_cache","menus","brand","_hoisted_3","_hoisted_4","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","_hoisted_9","ResponsiveMenu","_hoisted_10","useMenuSplit","floatingSecondMenu","activeFirstMenu","hoveredMenuItem","showSecondMenu","displayMenuItem","activeFirstMenuItem","normalizePath","path","isMenuItemActive","menuPath","currentPath","normalizedMenuPath","normalizedCurrentPath","findActiveTopMenu","items","currentSecondMenus","handleFirstMenuClick","toValue","handleSecondMenuClick","updateActiveMenuByRoute","menuList","matchedFirstMenu","newMenus","menuSplit","LayoutIcon","defineComponent","_hoisted_5","_Fragment","_renderList","$event","_hoisted_11","_hoisted_12","_hoisted_14","_hoisted_15","_hoisted_13","_hoisted_16","isCollapsed","subChild","_hoisted_18","_hoisted_20","showDrawerMenu","hideTimer","hideDrawerMenu","cancelHideTimer","navigateToPage","category","subItem","_hoisted_19","settingsStore","isDark","sideCollapsed","provide","SideLayout","$slots","TopLayout","_createSlots","MixLayout","MixTopLayout","ReverseHorizontalMixLayout","CardLayout","LAYOUT_MODE_OPTIONS","message","useMessage","dialog","useDialog","visible","_useModel","activeTab","grayMode","colorWeakMode","watermarkEnabled","watermarkText","watermarkEl","createWatermark","text","canvas","removeWatermark","systemInfo","ua","browser","os","handleLayoutChange","value","disabled","isCurrentPreset","handleApplyPreset","handleResetAppearance","handleResetLayout","handleReset","handleClearCache","keysToKeep","handleReload","handleExportConfig","config","blob","url","a","handleImportConfig","input","e","file","NDrawer","NDrawerContent","NTabs","NTabPane","_normalizeStyle","NRadioGroup","NRadioButton","NColorPicker","NSwitch","_withModifiers","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","NSlider","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","NInput","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","brandConfig","handlers","navigate","setupLayout","_app"],"mappings":";;;;AAYO,MAAMA,KAA+B;AAAA,EAC1C,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,MAAM,OAAO,UAAA;AAAA,EACrB,EAAE,MAAM,OAAO,OAAO,UAAA;AAAA,EACtB,EAAE,MAAM,MAAM,OAAO,UAAA;AACvB,GAGaC,KAA+B;AAAA,EAC1C;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAAA,EAEhB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,EAAA;AAElB,GAGaC,KAA6B;AAAA,EACxC;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA;AAEV,GAGaC,KAAoB;AAAA,EAC/B,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT,GAGaC,KAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR,GAGaC,IAAkC;AAAA;AAAA,EAE7C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AAAA;AAAA,EAGlB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,cAAc;AAAA;AAAA,EAGd,eAAe;AAAA,EACf,SAAS;AACX,GAKaC,KAAiBN,GAAc,IAAI,CAACO,MAAMA,EAAE,KAAK;ACxHvD,SAASC,GAAYC,GAAeC,GAAwB;AACjE,QAAMC,IAAM,SAASF,EAAM,QAAQ,KAAK,EAAE,GAAG,EAAE,GACzCG,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAID,KAAO,MAAMD,CAAM,CAAC,GACnDG,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAKF,KAAO,IAAK,OAAUD,CAAM,CAAC,GAC7DI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAIH,IAAM,OAAYD,CAAM,CAAC;AAC9D,SAAO,KAAME,KAAK,KAAOC,KAAK,IAAKC,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACrE;AAMO,SAASC,GAAoBC,IAAgC,IAAI;AACtE,QAAM,EAAE,UAAAC,IAAW,IAAI,mBAAAC,MAAsBF,GAGvCG,IAAgB;AAAA,IACpB,GAAGd;AAAA,IACH,GAAGY;AAAA,EAAA;AAGL,SAAOG,GAAY,YAAY,MAAM;AAInC,UAAMC,IAAYC,EAAeH,EAAc,SAAS,GAClDI,IAAeD,EAAYH,EAAc,YAAY,GACrDK,IAAeF,EAAsBH,EAAc,YAAY,GAC/DM,IAAiBH,EAAoBH,EAAc,cAAc,GACjEO,IAAmBJ,EAAaH,EAAc,gBAAgB,GAG9DQ,IAAaL,EAAgBH,EAAc,UAAU,GACrDS,IAAYN,EAAaH,EAAc,SAAS,GAChDU,IAAcP,EAAaH,EAAc,WAAW,GACpDW,IAAiBR,EAAaH,EAAc,cAAc,GAC1DY,IAAqBT,EAAaH,EAAc,kBAAkB,GAClEa,IAAeV,EAAaH,EAAc,YAAY,GACtDc,IAAiBX,EAAYH,EAAc,cAAc,GACzDe,IAAgBZ,EAAmBH,EAAc,aAAa,GAC9DgB,IAAab,EAAaH,EAAc,UAAU,GAClDiB,IAAed,EAAYH,EAAc,YAAY,GACrDkB,IAAwBf;AAAA,MAC5BH,EAAc;AAAA,IAAA,GAEVmB,IAAehB,EAAYH,EAAc,YAAY,GAGrDoB,IAAgBjB,EAAaH,EAAc,aAAa,GACxDqB,IAAUlB,EAAYH,EAAc,OAAO,GAK3CsB,IAAoBC;AAAA,MACxB,MAAMvC,GAAkBqB,EAAa,KAAK;AAAA,IAAA,GAItCmB,IAAiBD,EAAS,MAAMtC,GAAeqB,EAAe,KAAK,CAAC,GAGpEmB,IAAyBF;AAAA,MAC7B,MAAMhB,EAAiB,SAASD,EAAe,UAAU;AAAA,IAAA,GAIrDoB,IAAgBH,EAAwB,OAAO;AAAA,MACnD,WAAWrB,EAAU;AAAA,MACrB,cAAcE,EAAa;AAAA,MAC3B,cAAcC,EAAa;AAAA,MAC3B,gBAAgBC,EAAe;AAAA,MAC/B,kBAAkBC,EAAiB;AAAA,MACnC,YAAYC,EAAW;AAAA,MACvB,WAAWC,EAAU;AAAA,MACrB,aAAaC,EAAY;AAAA,MACzB,gBAAgBC,EAAe;AAAA,MAC/B,oBAAoBC,EAAmB;AAAA,MACvC,cAAcC,EAAa;AAAA,MAC3B,gBAAgBC,EAAe;AAAA,MAC/B,eAAeC,EAAc;AAAA,MAC7B,YAAYC,EAAW;AAAA,MACvB,cAAcC,EAAa;AAAA,MAC3B,uBAAuBC,EAAsB;AAAA,MAC7C,cAAcC,EAAa;AAAA,MAC3B,eAAeC,EAAc;AAAA,MAC7B,SAASC,EAAQ;AAAA,IAAA,EACjB,GAOIM,IAAmB,MAAM;AAC7B,UAAI,OAAO,WAAa,IAAa;AAErC,YAAMC,IAAO,SAAS;AAGtB,MAAAA,EAAK,MAAM,YAAY,mBAAmBxB,EAAa,KAAK,GAC5DwB,EAAK,MAAM;AAAA,QACT;AAAA,QACAvC,GAAYe,EAAa,OAAO,EAAE;AAAA,MAAA,GAEpCwB,EAAK,MAAM;AAAA,QACT;AAAA,QACAvC,GAAYe,EAAa,OAAO,GAAG;AAAA,MAAA,GAIrCwB,EAAK,MAAM,YAAY,mBAAmBN,EAAkB,KAAK,GAGjEM,EAAK,MAAM,YAAY,mBAAmB,GAAGX,EAAa,KAAK,IAAI,GACnEW,EAAK,MAAM;AAAA,QACT;AAAA,QACA,GAAGV,EAAsB,KAAK;AAAA,MAAA,GAEhCU,EAAK,MAAM,YAAY,mBAAmB,GAAGT,EAAa,KAAK,IAAI,GACnES,EAAK,MAAM,YAAY,sBAAsB,GAAGd,EAAe,KAAK,IAAI;AAAA,IAC1E,GAMMe,IAAc,OAAOC,MAAwB;AAEjD,MAAA1B,EAAa,QAAQ0B,EAAO,cAGxBA,EAAO,aACLA,EAAO,SAAS,iBAClBzB,EAAa,QAAQyB,EAAO,SAAS,eACnCA,EAAO,SAAS,mBAClBxB,EAAe,QAAQwB,EAAO,SAAS,iBACrCA,EAAO,SAAS,mBAAmB,WACrCnB,EAAe,QAAQmB,EAAO,SAAS,iBACrCA,EAAO,SAAS,iBAAiB,WACnCjB,EAAa,QAAQiB,EAAO,SAAS,eACnCA,EAAO,SAAS,kBAClBf,EAAc,QAAQe,EAAO,SAAS;AAAA,IAE5C,GAKMC,KAAgB,MAAM;AAC1B,MAAA7B,EAAU,QAAQF,EAAc,WAChCI,EAAa,QAAQJ,EAAc,cACnCK,EAAa,QAAQL,EAAc,cACnCM,EAAe,QAAQN,EAAc,gBACrCO,EAAiB,QAAQP,EAAc,kBAEvCQ,EAAW,QAAQR,EAAc,YACjCS,EAAU,QAAQT,EAAc,WAChCU,EAAY,QAAQV,EAAc,aAClCW,EAAe,QAAQX,EAAc,gBACrCY,EAAmB,QAAQZ,EAAc,oBACzCa,EAAa,QAAQb,EAAc,cACnCc,EAAe,QAAQd,EAAc,gBACrCe,EAAc,QAAQf,EAAc,eACpCgB,EAAW,QAAQhB,EAAc,YACjCiB,EAAa,QAAQjB,EAAc,cACnCkB,EAAsB,QAAQlB,EAAc,uBAC5CmB,EAAa,QAAQnB,EAAc,cAEnCoB,EAAc,QAAQpB,EAAc;AAAA,IACtC,GAKMgC,KAAkB,OAAOC,MAAoB;AACjD,MAAA/B,EAAU,QAAQ+B,GACdlC,KACF,MAAMA,EAAkBkC,CAAI;AAAA,IAEhC,GAKMC,KAAiB,MAAM;AAC3B,MAAAzB,EAAU,QAAQ,CAACA,EAAU;AAAA,IAC/B;AAKA,WAAA0B;AAAA,MACE;AAAA,QACE/B;AAAA,QACAkB;AAAA,QACAL;AAAA,QACAC;AAAA,QACAC;AAAA,QACAL;AAAA,MAAA;AAAA,MAEF,MAAM;AACJ,QAAAa,EAAA;AAAA,MACF;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAKb;AAAA;AAAA,MAEL,WAAAzB;AAAA,MACA,cAAAE;AAAA,MACA,cAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,WAAAC;AAAA,MACA,aAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,YAAAC;AAAA,MACA,cAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,SAAAC;AAAA;AAAA,MAGA,mBAAAC;AAAA,MACA,gBAAAE;AAAA,MACA,wBAAAC;AAAA,MACA,eAAAC;AAAA;AAAA,MAGA,kBAAAC;AAAA,MACA,aAAAE;AAAA,MACA,eAAAE;AAAA,MACA,iBAAAC;AAAA,MACA,gBAAAE;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAKO,MAAME,KAAmBxC,GAAA,GC1LnByC,4BACJ,gBAAgB,GAmBZC,4BACJ,iBAAiB;AAiBnB,SAASC,IAAkC;AAChD,QAAMC,IAAMC,GAAOJ,EAAkB;AACrC,MAAI,CAACG;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,SAAOA;AACT;AAKO,MAAME,KAAoD;AAAA,EAC/D,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb;AC1GO,SAASC,GAAe9C,IAA8B,IAAI;AAC/D,QAAM;AAAA,IACJ,eAAe+C,IAAW;AAAA,IAC1B,cAAAC,IAAe;AAAA,IACf,gBAAgBC,IAAS;AAAA,EAAA,IACvBjD,GAEEkD,IAAQC,GAAA,GACRC,IAAc9C,EAAc,EAAE,GAC9B+C,IAAgB/C,EAAIyC,CAAQ,GAU5BO,IAAc,CAACC,MACf,CAACA,KAAa,OAAOA,KAAc,WAAiB,KACjDL,EAAM,MAAM,cAAc,IAI7BM,IAAW,CAACC,MAAiB;AACjC,IAAI,CAACL,EAAY,MAAM,SAASK,CAAI,KAAKH,EAAYG,CAAI,MACvDL,EAAY,MAAM,KAAKK,CAAI,GAGvBL,EAAY,MAAM,SAASC,EAAc,SAC3CD,EAAY,MAAM,MAAA;AAAA,EASxB,GAGMM,IAAc,CAACD,MAAiB;AACpC,UAAME,IAAQP,EAAY,MAAM,QAAQK,CAAI;AAC5C,IAAIE,IAAQ,MACVP,EAAY,MAAM,OAAOO,GAAO,CAAC;AAAA,EAKrC,GAGMC,IAAgB,MAAM;AAC1B,IAAAR,EAAY,QAAQ,CAAA;AAAA,EAItB;AAUA,SAAAd;AAAA,IACE,MAAMY,EAAM;AAAA,IACZ,CAACW,MAAY;AACX,MAAIA,KAAW,OAAOA,KAAY,YAChCL,EAASK,CAAO;AAAA,IAEpB;AAAA,IACA,EAAE,WAAW,GAAA;AAAA,EAAK,GAGb;AAAA,IACL,aAAAT;AAAA,IACA,eAAAC;AAAA,IACA,UAAAG;AAAA,IACA,aAAAE;AAAA,IACA,eAAAE;AAAA,EAAA;AAEJ;;;;;;;;;ACpEA,UAAME,IAAQC,GAQRC,IAAOC,GAIPtB,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GAGjCoB,IAAa5D,EAAIwD,EAAM,SAAS;AACtC,IAAAxB;AAAA,MACE,MAAMwB,EAAM;AAAA,MACZ,CAACK,MAAM;AACL,QAAAD,EAAW,QAAQC;AAAA,MACrB;AAAA,IAAA;AAGF,UAAMvD,IAAYc,EAAS,MAAMwC,EAAW,KAAK,GAE3CE,IAAwB,CAACC,MAAiB;AAC9C,MAAAH,EAAW,QAAQG,GACnBL,EAAK,oBAAoBK,CAAG;AAAA,IAC9B;AASA,WAAAC,EAAa;AAAA,MACX,WAAA1D;AAAA,MACA,gBARqB,MAAM;AAC3B,cAAM2D,IAAO,CAACL,EAAW;AACzB,QAAAA,EAAW,QAAQK,GACnBP,EAAK,oBAAoBO,CAAI;AAAA,MAC/B;AAAA,IAIE,CACD;;kBAtFCC,EAkCUC,EAAAC,EAAA,GAAA,EAlCD,aAAA,MAAS;AAAA,mBAChB,MAgBe;AAAA,UAhBfC,EAgBeF,EAAAG,EAAA,GAAA;AAAA,YAfb,UAAA;AAAA,YACA,iBAAc;AAAA,YACb,mBAAiBH,EAAA9B,CAAA,EAAI,sBAAsB;AAAA,YAC3C,OAAO8B,EAAA9B,CAAA,EAAI,aAAa;AAAA,YACxB,oBAAkB;AAAA,YAClB,WAAW/B,EAAA;AAAA,YACX,sBAAkBwD;AAAA,YAClB,OAAKS,EAAA;AAAA;;cAAoEJ,EAAA9B,CAAA,EAAI,OAAO,QAAK,eAAA;AAAA,YAAA;;uBAM1F,MAAoB;AAAA,cAApBmC,EAAoBC,EAAA,QAAA,MAAA;AAAA,cACpBD,EAA2CC,EAAA,QAAA,QAAA,EAAxB,WAAWnE,EAAA,OAAS;AAAA,YAAA;;;UAGzC+D,EAcUF,EAAAC,EAAA,GAAA,MAAA;AAAA,uBAbR,MAAsB;AAAA,cAAtBI,EAAsBC,EAAA,QAAA,QAAA;AAAA,cAEtBJ,EAQiBF,EAAAO,EAAA,GAAA,EARD,OAAM,2CAAuC;AAAA,2BAC3D,MAMa;AAAA,kBANbL,EAMaM,GAAA,MAAA;AAAA,+BALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,sBACpCyB,EAIaQ,GAAA;AAAA,wBAJA,MAAMV,EAAA9B,CAAA,EAAI,eAAe;AAAA,wBAAO,MAAK;AAAA,sBAAA;mCAChD,MAEY;AAAA,gCAFZ6B,EAEYY,IAAA;AAAA,4BAFA,SAASX,EAAArB,CAAA;AAAA,4BAAc,KAAKqB,EAAApB,CAAA;AAAA,0BAAA;6BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,8BAAG,KAAKhC,EAAM;AAAA,4BAAA;;;;;;;;;;;cAM/C4B,EAAsBC,EAAA,QAAA,QAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;ACK5B,UAAMjB,IAAQC,GAKRb,IAAQC,GAAA,GACRoC,IAASC,GAAA,GACT7C,IAAMD,EAAA,GAGN+C,IAAW/D,EAAS,MAAMoC,EAAM,QAAQ,CAAA,CAAE,GAC1C4B,IAAYhE,EAAS,MAAMwB,EAAM,IAAI,GAGrCyC,IAAahD,EAAI,QAEjBiD,IAAa;AAAA,MACjB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,0BAA0B;AAAA,MAC1B,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA,GAGZC,IAAY;AAAA,MAChB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,0BAA0B;AAAA,MAC1B,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,MACvB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA,GAGZC,IAAqBpE;AAAA,MAAS,MAClCiE,EAAW,QAAQE,IAAYD;AAAA,IAAA,GAK3BG,IAAa,CAACC,GAAcC,IAAO,OACnCtD,EAAI,gBACC,MAAMuD,GAAEvD,EAAI,eAAgB,EAAE,MAAMqD,GAAM,MAAAC,GAAM,IAElD,MACLC,GAAE,KAAK;AAAA,MACL,OAAOF;AAAA,MACP,OAAO;AAAA,QACL,UAAU,GAAGC,CAAI;AAAA,QACjB,SAAS;AAAA,QACT,YAAY;AAAA,MAAA;AAAA,IACd,CACD,GAKCE,IAAsB,CAACC,OAAmC;AAAA,MAC9D,KAAKA,EAAK,QAAQ;AAAA,MAClB,OAAOA,EAAK,MAAM,SAASA,EAAK,QAAQ;AAAA,MACxC,MAAMA,EAAK,MAAM,OAAOL,EAAWK,EAAK,KAAK,MAAM,EAAE,IAAI;AAAA,MACzD,UAAUA,EAAK,UAAU,SACrBA,EAAK,SAAS,IAAID,CAAmB,IACrC;AAAA,IAAA,IAKAE,IAAe/F,EAAA,GACfgG,IAAehG,EAAmB,EAAE,GACpCiG,IAAcjG,EAAmB,EAAE,GAEnCkG,IAAiB9E;AAAA,MAAuB,MAC5C4E,EAAa,MAAM,IAAIH,CAAmB;AAAA,IAAA,GAGtCM,IAAkB/E;AAAA,MAA2B,MACjD6E,EAAY,MAAM,IAAI,CAACH,OAAU;AAAA,QAC/B,KAAKA,EAAK,QAAQ;AAAA,QAClB,OAAOA,EAAK,MAAM,SAASA,EAAK,QAAQ;AAAA,QACxC,MAAMA,EAAK,MAAM,OAAOL,EAAWK,EAAK,KAAK,MAAM,EAAE,IAAI;AAAA,QACzD,UAAUA,EAAK,UAAU,SACrBA,EAAK,SAAS,IAAI,CAACM,OAAW;AAAA,UAC5B,KAAKA,EAAM,QAAQ;AAAA,UACnB,OAAOA,EAAM,MAAM,SAASA,EAAM,QAAQ;AAAA,UAC1C,MAAMA,EAAM,MAAM,OAAOX,EAAWW,EAAM,KAAK,MAAM,EAAE,IAAI;AAAA,QAAA,EAC3D,IACF;AAAA,MAAA,EACJ;AAAA,IAAA,GAGEC,IAAe,CAACC,MAAgB;AACpC,MAAIA,KAAKrB,EAAO,KAAKqB,CAAG;AAAA,IAC1B,GAIMC,IAAoB,CAACT,MAA8B;AAMvD,YAAMU,KAAQV,EAAK,MAAM,SAASA,EAAK,QAAQ;AAC/C,UAAIW,KAAY;AAChB,iBAAWC,MAAQF,IAAO;AACxB,cAAMG,IAAOD,GAAK,WAAW,CAAC;AAE9B,QACGC,KAAQ,SAAUA,KAAQ;AAAA,QAC1BA,KAAQ,SAAUA,KAAQ;AAAA,QAC1BA,KAAQ,SAAUA,KAAQ;AAAA,QAC1BA,KAAQ,SAAUA,KAAQ;AAAA,QAC1BA,KAAQ,SAAUA,KAAQ;AAAA,QAC1BA,KAAQ,SAAUA,KAAQ,QAE3BF,MAAa,KAEbA,MAAa;AAAA,MAEjB;AACA,YAAMG,IAAYd,EAAK,MAAM,OAAO,KAAa;AAEjD,aAAOW,KAAYG,IAAY,KAAe,IAAc;AAAA,IAC9D,GAEMC,IAAwB,CAACC,MAAmC;AAChE,UAAI,CAAC3B,EAAS,MAAM,OAAQ,QAAO;AAEnC,YAAM4B,IAAiB,IACjBC,IAAS;AAEf,UAAIC,IAAa;AACjB,iBAAWnB,KAAQX,EAAS;AAC1B,QAAA8B,KAAcV,EAAkBT,CAAI;AAGtC,UAAImB,IAAaD,KAAUF;AACzB,eAAO3B,EAAS,MAAM;AAGxB,UAAI+B,KAAY,GACZC,KAAQ;AACZ,YAAMC,KAAYN,IAAiBC,IAAiBC;AAEpD,iBAAWlB,KAAQX,EAAS,OAAO;AACjC,cAAMkC,KAAId,EAAkBT,CAAI;AAChC,YAAIoB,KAAYG,MAAKD;AACnB,UAAAF,MAAaG,IACbF;AAAA,YACK;AAAA,MACT;AAEA,aAAO,KAAK,IAAIA,IAAO,CAAC;AAAA,IAC1B,GAEMG,IAAwB,MAAM;AAClC,UAAI,CAACvB,EAAa,SAAS,CAACZ,EAAS,MAAM,OAAQ;AAEnD,YAAM2B,IAAiBf,EAAa,MAAM;AAC1C,UAAIe,MAAmB,GAAG;AACxB,QAAAS,GAAS,MAAMD,GAAuB;AACtC;AAAA,MACF;AAEA,YAAMH,IAAQN,EAAsBC,CAAc;AAClD,MAAAd,EAAa,QAAQb,EAAS,MAAM,MAAM,GAAGgC,CAAK,GAClDlB,EAAY,QAAQd,EAAS,MAAM,MAAMgC,CAAK;AAAA,IAChD;AAIA,QAAIK,IAA6B;AACjC,UAAMC,IAAqB,MAAM;AAC/B,MAAID,kBAA0BA,CAAW,GACzCA,IAAc,OAAO,WAAW,MAAMF,EAAA,GAAyB,GAAG;AAAA,IACpE;AAEA,QAAII,IAAwC;AAE5C,WAAAC,GAAU,MAAM;AACd,MAAAJ,GAAS,MAAMD,GAAuB,GAClCvB,EAAa,UACf2B,IAAiB,IAAI,eAAe,MAAMD,GAAoB,GAC9DC,EAAe,QAAQ3B,EAAa,KAAK;AAAA,IAE7C,CAAC,GAED6B,GAAY,MAAM;AAChB,MAAAF,GAAgB,WAAA,GACZF,kBAA0BA,CAAW;AAAA,IAC3C,CAAC,GAEDxF;AAAA,MACE,MAAMwB,EAAM;AAAA,MACZ,MAAM+D,GAAS,MAAMD,GAAuB;AAAA,MAC5C;AAAA,QACE,MAAM;AAAA,MAAA;AAAA,IACR,mBAjRAO,EA8BM,OAAA;AAAA,eA9BG;AAAA,MAAJ,KAAI9B;AAAA,MAAe,OAAM;AAAA,IAAA;MAC5B+B,EASM,OATNC,IASM;AAAA,QAPI7B,EAAA,MAAe,SAAM,UAD7BhC,EAOEC,EAAA6D,EAAA,GAAA;AAAA;UALA,MAAK;AAAA,UACJ,OAAO5C,EAAA;AAAA,UACP,SAASc,EAAA;AAAA,UACT,mBAAiBV,EAAA;AAAA,UACjB,kBAAca;AAAA,QAAA;;MAKXJ,EAAA,MAAY,SAAM,UAD1B/B,EAiBYC,EAAA8D,EAAA,GAAA;AAAA;QAfT,SAAS9B,EAAA;AAAA,QACV,WAAU;AAAA,QACV,SAAQ;AAAA,QACP,UAAQE;AAAA,MAAA;mBAET,MASM;AAAA,UATNyB,EASM,OATNI,IASM;AAAA,YARJ7D,EAOUF,EAAAgE,EAAA,GAAA;AAAA,cAPD,MAAA;AAAA,cAAK,OAAM;AAAA,YAAA;yBAElB,MAIO,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,gBAJPN,EAIO,QAAA,EAJD,OAAM,eAAW;AAAA,kBACrBA,EAAa,MAAA;AAAA,kBACbA,EAAa,MAAA;AAAA,kBACbA,EAAa,MAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;AC4EzB,UAAMzF,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GAEjC6C,IAAahD,EAAI,QACjBgG,IAAQjH,EAAS,MAAMiB,EAAI,MAAM,KAAK,GACtC3B,IAAeU,EAAS,MAAMiB,EAAI,aAAa,KAAK,GACpD1B,IAAiBS,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDxB,IAAaO,EAAS,MAAMiB,EAAI,WAAW,KAAK,GAChDhB,IAAiBD,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDiG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA;;;AAxG9C,aAAA0C,EAAA,GAAA8C,EA+EM,OA/ENE,IA+EM;AAAA,QA7EJD,EA+CM,OAAA;AAAA,UA9CJ,OAAKvD,EAAA,CAAC,cAAY,CACTJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAGnByC,EA+BM,OA/BNI,IA+BM;AAAA,YA9BJ1D,EA6BOC,sBA7BP,MA6BO;AAAA,cA5BLqD,EAsBM,OAtBNS,IAsBM;AAAA,gCArBJT,EAA6B,OAAA,EAAxB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,gBAEdQ,EAAM,aAAQ,gBADtBT,EAYQ,SAAA;AAAA;kBAVL,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,UAAA;AAAA,kBACA,MAAA;AAAA,kBACA,OAAA;AAAA,kBACA,aAAA;AAAA,kBACA,OAAM;AAAA,gBAAA,GACP,wBAED,GAAAE,EAAA,WACAX,EAME,OAAA;AAAA;kBAJC,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,OAAM;AAAA,gBAAA;;cAGVR,EAGM,OAHNW,IAGM;AAAA,gBAFJX,EAAiD,QAAjDY,IAAiDC,EAApBL,EAAM,IAAI,GAAA,CAAA;AAAA,gBACvCR,EAAwD,QAAxDc,IAAwDD,EAAxBL,EAAM,QAAQ,GAAA,CAAA;AAAA,cAAA;8BAEhDR,EAAkC,OAAA,EAA7B,OAAM,oBAAgB,MAAA,EAAA;AAAA,YAAA;;UAK/BA,EAIM,OAJNe,IAIM;AAAA,YAHJrE,EAEOC,sBAFP,MAEO;AAAA,cADLJ,EAAgCyE,IAAA,EAAf,MAAMT,EAAA,MAAA,GAAK,MAAA,GAAA,CAAA,MAAA,CAAA;AAAA,YAAA;;UAKhC7D,EAA4BC,EAAA,QAAA,cAAA;AAAA,QAAA;QAKtB/D,EAAA,cADRmH,EAMM,OAAA;AAAA;UAJJ,OAAM;AAAA,UACL,uBAAoBlH,EAAA,KAAc,MAAA;AAAA,QAAA;UAEnC6D,EAAyBC,EAAA,QAAA,WAAA;AAAA,QAAA;QAI3BJ,EAiBUF,EAAAC,EAAA,GAAA,MAAA;AAAA,qBAhBR,MAUiB;AAAA,YAVjBC,EAUiBF,EAAAO,EAAA,GAAA,EAVD,OAAM,kBAAc;AAAA,yBAClC,MAQM;AAAA,gBARNoD,EAQM,OARNiB,IAQM;AAAA,kBAPJ1E,EAMaM,GAAA,MAAA;AAAA,+BALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,sBACpCyB,EAIaQ,GAAA;AAAA,wBAJA,MAAMxD,EAAA;AAAA,wBAAgB,MAAK;AAAA,sBAAA;mCACtC,MAEY;AAAA,gCAFZ6C,EAEYY,IAAA;AAAA,4BAFA,SAASX,EAAArB,CAAA;AAAA,4BAAc,KAAKqB,EAAApB,CAAA;AAAA,0BAAA;6BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,8BAAG,KAAKhC,EAAM;AAAA,4BAAA;;;;;;;;;;;;YAQjC/B,EAAA,QACd2D,EAAsBC,EAAA,QAAA,UAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;AC5BvB,SAASuE,GAAatJ,GAAkD;AAC7E,QAAM,EAAE,OAAA2I,GAAO,oBAAAY,IAAqB,GAAA,IAAUvJ,GACxCkD,IAAQC,GAAA,GACRoC,IAASC,GAAA,GAETgE,IAAkBlJ,EAAY,EAAE,GAChCmJ,IAAkBnJ,EAAwB,IAAI,GAC9CoJ,IAAiBpJ,EAAI,EAAK,GAG1BqJ,IAAkBjI;AAAA,IACtB,MAAM+H,EAAgB,SAASG,EAAoB,SAAS;AAAA,EAAA,GAKxDC,IAAgB,CAACC,MACrBA,EAAK,WAAW,GAAG,IAAIA,IAAO,IAAIA,CAAI,IAElCC,IAAmB,CAACC,MAA0C;AAClE,QAAI,CAACA,EAAU,QAAO;AACtB,UAAMC,IAAc/G,EAAM;AAC1B,QAAI+G,MAAgBD,EAAU,QAAO;AACrC,UAAME,IAAqBL,EAAcG,CAAQ,GAC3CG,IAAwBN,EAAcI,CAAW;AACvD,WAAIE,MAA0BD,IAA2B,KAClDC,EAAsB,SAAS,IAAIH,CAAQ,EAAE;AAAA,EACtD,GAIMI,IAAoB,CAACC,MAA6C;AACtE,eAAWjE,KAAQiE;AAEjB,UADIN,EAAiB3D,EAAK,IAAI,KAC1BA,EAAK,UAAU,UACHgE,EAAkBhE,EAAK,QAAQ;AAClC,eAAOA;AAGtB,WAAO;AAAA,EACT,GAIMwD,IAAsBlI;AAAA,IAAS,MACnCiH,EAAM,MAAM,KAAK,CAACvC,MAASA,EAAK,SAASoD,EAAgB,KAAK;AAAA,EAAA,GAG1Dc,IAAqB5I;AAAA,IACzB,MAAMkI,EAAoB,OAAO,YAAY,CAAA;AAAA,EAAC,GAK1CW,IAAuB,CAACnE,MAAsB;AAClD,IAAIoE,GAAQjB,CAAkB,IAExBnD,EAAK,YAAYA,EAAK,SAAS,SAAS,IACtCsD,EAAe,SAASF,EAAgB,UAAUpD,EAAK,OAEzDsD,EAAe,QAAQ,MAGvBF,EAAgB,QAAQpD,EAAK,QAAQ,IACrCsD,EAAe,QAAQ,OAIzBF,EAAgB,QAAQpD,EAAK,QAAQ,IACrCsD,EAAe,QAAQ,IACnBtD,EAAK,QAAMb,EAAO,KAAKa,EAAK,IAAI,MAIlC,CAACA,EAAK,YAAYA,EAAK,SAAS,WAAW,MACzCA,EAAK,QAAMb,EAAO,KAAKa,EAAK,IAAI;AAAA,EAG1C,GAEMqE,IAAwB,CAACrE,MAAsB;AACnD,IAAIA,EAAK,QAAMb,EAAO,KAAKa,EAAK,IAAI;AAAA,EACtC,GAIMsE,IAA0B,MAAM;AACpC,UAAMC,IAAWhC,EAAM,OACjBiC,IAAmBR,EAAkBO,CAAQ;AACnD,IAAIC,KACFpB,EAAgB,QAAQoB,EAAiB,QAAQ,IAE7CJ,GAAQjB,CAAkB,KAAKqB,EAAiB,UAAU,WAC5DlB,EAAe,QAAQ,OAEhBiB,EAAS,SAAS,KAAK,CAACnB,EAAgB,UACjDA,EAAgB,QAAQmB,EAAS,CAAC,EAAE,QAAQ;AAAA,EAEhD;AAEA,SAAArI;AAAA,IACE,MAAMY,EAAM;AAAA,IACZ,MAAMwH,EAAA;AAAA,IACN,EAAE,WAAW,GAAA;AAAA,EAAK,GAGpBpI;AAAA,IACEqG;AAAA,IACA,CAACkC,MAAa;AACZ,MAAIA,KAAYA,EAAS,SAAS,KAAGH,EAAA;AAAA,IACvC;AAAA,IACA,EAAE,WAAW,GAAA;AAAA,EAAK,GAGpBzC,GAAU,MAAMyC,GAAyB,GAElC;AAAA,IACL,iBAAAlB;AAAA,IACA,qBAAAI;AAAA,IACA,oBAAAU;AAAA,IACA,iBAAAb;AAAA;AAAA,IAEA,iBAAAE;AAAA,IACA,gBAAAD;AAAA,IACA,sBAAAa;AAAA,IACA,uBAAAE;AAAA,IACA,kBAAAV;AAAA,EAAA;AAEJ;;;;;;;;AC5CA,UAAMpH,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GAEjC6C,IAAahD,EAAI,QACjBgG,IAAQjH,EAAS,MAAMiB,EAAI,MAAM,KAAK,GACtCxB,IAAaO,EAAS,MAAMiB,EAAI,WAAW,KAAK,GAChDhB,IAAiBD,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDiG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA,GAE1CmI,IAAYxB,GAAa;AAAA,MAC7B,OAAO3G,EAAI;AAAA,MACX,oBAAoBjB,EAAS,MAAM,EAAI;AAAA,IAAA,CACxC,GAGKqJ,IACJpI,EAAI,iBACJqI,EAAgB;AAAA,MACd,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAG;AAAA,MACzD,MAAMlH,GAAO;AACX,eAAO,MACLoC,GAAE,KAAK;AAAA,UACL,OAAOpC,EAAM;AAAA,UACb,OAAO;AAAA,YACL,UAAU,GAAGA,EAAM,IAAI;AAAA,YACvB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAAA;AAAA,QAClB,CACD;AAAA,MACL;AAAA,IAAA,CACD;;;AAtKD,aAAAuB,EAAA,GAAA8C,EAsHM,OAtHNE,IAsHM;AAAA,QApHJD,EAwDM,OAAA;AAAA,UAvDJ,OAAKvD,EAAA,CAAC,oBAAkB,CACfJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAGnByC,EAwBM,OAxBNI,IAwBM;AAAA,YAvBJ1D,EAsBOC,sBAtBP,MAsBO;AAAA,8BArBLqD,EAA6B,OAAA,EAAxB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,cAEdQ,EAAM,aAAQ,gBADtBT,EAYQ,SAAA;AAAA;gBAVL,KAAKS,EAAM;AAAA,gBACX,OAAOA,EAAM,YAAQ;AAAA,gBACrB,QAAQA,EAAM,YAAQ;AAAA,gBACvB,UAAA;AAAA,gBACA,MAAA;AAAA,gBACA,OAAA;AAAA,gBACA,aAAA;AAAA,gBACA,OAAM;AAAA,cAAA,GACP,wBAED,GAAAC,EAAA,WACAV,EAME,OAAA;AAAA;gBAJC,KAAKS,EAAM;AAAA,gBACX,OAAOA,EAAM,YAAQ;AAAA,gBACrB,QAAQA,EAAM,YAAQ;AAAA,gBACvB,OAAM;AAAA,cAAA;;;UAMZR,EAuBM,OAvBN6C,IAuBM;AAAA,oBAtBJ9C,EAqBM+C,GAAA,MAAAC,EApBWxC,EAAA,OAAK,CAAbvC,YADT+B,EAqBM,OAAA;AAAA,cAnBH,KAAK/B,EAAK;AAAA,cACX,UAAM,mBAAiB;AAAA,gBACO,QAAA3B,EAAAqG,CAAA,EAAU,gBAAgB,UAAU1E,EAAK;AAAA,cAAA;cAGtE,SAAK,CAAAgF,MAAE3G,EAAAqG,CAAA,EAAU,qBAAqB1E,CAAI;AAAA,YAAA;cAE3CgC,EAUM,OAVNY,IAUM;AAAA,gBAPI5C,EAAK,MAAM,QAFnBf,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;kBAEd,MAAM3E,EAAK,KAAK;AAAA,kBAChB,MAAM;AAAA,gBAAA,0BAETf,KAAA8C,EAES,QAFTe,IAESD,GADN7C,EAAK,MAAM,SAAK,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,cAAA;cAGrBgC,EAA2D,QAA3De,IAA2DF,EAA1B7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,YAAA;;;QAMvDzB,EAmCaQ,GAAA,EAnCD,MAAK,gBAAY;AAAA,qBAC3B,MAiCM;AAAA,YAhCEV,EAAAqG,CAAA,EAAU,eAAe,cADjC3C,EAiCM,OAAA;AAAA;cA/BJ,OAAKtD,EAAA,CAAC,2BAAyB,CACtBJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,YAAA;cAEnByC,EAUM,OAVNiB,IAUM;AAAA,gBAPI5E,EAAAqG,CAAA,EAAU,gBAAgB,OAAO,MAAM,QAF/CzF,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;kBAEd,MAAMtG,KAAU,gBAAgB,MAAM,KAAK;AAAA,kBAC3C,MAAM;AAAA,gBAAA;gBAET2D,EAES,QAFTiD,IAESpC,EADPxE,EAAAqG,CAAA,EAAU,gBAAgB,OAAO,MAAM,KAAK,GAAA,CAAA;AAAA,cAAA;cAGhD1C,EAgBM,OAhBNkD,IAgBM;AAAA,wBAfJnD,EAcM+C,GAAA,MAAAC,EAbY1G,KAAU,gBAAgB,OAAO,YAAQ,CAAA,GAAA,CAAlDiC,YADTyB,EAcM,OAAA;AAAA,kBAZH,KAAKzB,EAAM;AAAA,kBACZ,OAAK7B,EAAA,CAAC,oBAAkB,EAAA,QACNJ,EAAAqG,CAAA,EAAU,iBAAiBpE,EAAM,IAAI,EAAA,CAAA,CAAA;AAAA,kBACtD,SAAK,CAAA0E,MAAE3G,EAAAqG,CAAA,EAAU,sBAAsBpE,CAAK;AAAA,gBAAA;kBAIrCA,EAAM,MAAM,QAFpBrB,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;oBAEd,MAAMrE,EAAM,KAAK;AAAA,oBACjB,MAAM;AAAA,kBAAA;kBAET0B,EAA4D,QAA5DmD,IAA4DtC,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;QAO1D0B,EAkBM,OAlBNoD,IAkBM;AAAA,UAjBJ1G,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAEtBJ,EAcUF,EAAAC,EAAA,GAAA,MAAA;AAAA,uBAbR,MAQiB;AAAA,cARjBC,EAQiBF,EAAAO,EAAA,GAAA,EARD,OAAM,2CAAuC;AAAA,2BAC3D,MAMa;AAAA,kBANbL,EAMaM,GAAA,MAAA;AAAA,+BALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,sBACpCyB,EAIaQ,GAAA;AAAA,wBAJA,MAAMxD,EAAA;AAAA,wBAAgB,MAAK;AAAA,sBAAA;mCACtC,MAEY;AAAA,gCAFZ6C,EAEYY,IAAA;AAAA,4BAFA,SAASX,EAAArB,CAAA;AAAA,4BAAc,KAAKqB,EAAApB,CAAA;AAAA,0BAAA;6BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,8BAAG,KAAKhC,EAAM;AAAA,4BAAA;;;;;;;;;;;cAM/B/B,EAAA,QACd2D,EAAsBC,EAAA,QAAA,UAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;;;;;;;;AC0BhC,UAAMpC,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GAEjC6C,IAAahD,EAAI,QACjBgG,IAAQjH,EAAS,MAAMiB,EAAI,MAAM,KAAK,GACtC3B,IAAeU,EAAS,MAAMiB,EAAI,aAAa,KAAK,GACpD1B,IAAiBS,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDxB,IAAaO,EAAS,MAAMiB,EAAI,WAAW,KAAK,GAChDhB,IAAiBD,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDiG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA,GAE1CmI,IAAYxB,GAAa;AAAA,MAC7B,OAAO3G,EAAI;AAAA,MACX,oBAAoBjB,EAAS,MAAM,EAAK;AAAA,IAAA,CACzC,GAEKqJ,IACJpI,EAAI,iBACJqI,EAAgB;AAAA,MACd,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAG;AAAA,MACzD,MAAMlH,GAAO;AACX,eAAO,MACLoC,GAAE,KAAK;AAAA,UACL,OAAOpC,EAAM;AAAA,UACb,OAAO;AAAA,YACL,UAAU,GAAGA,EAAM,IAAI;AAAA,YACvB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAAA;AAAA,QAClB,CACD;AAAA,MACL;AAAA,IAAA,CACD;;;AA1KD,aAAAuB,EAAA,GAAA8C,EAwHM,OAxHNE,IAwHM;AAAA,QAtHJD,EAwDM,OAAA;AAAA,UAvDJ,OAAKvD,EAAA,CAAC,uBAAqB,CAClBJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAGnByC,EAwBM,OAxBNI,IAwBM;AAAA,YAvBJ1D,EAsBOC,sBAtBP,MAsBO;AAAA,8BArBLqD,EAA6B,OAAA,EAAxB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,cAEdQ,EAAM,aAAQ,gBADtBT,EAYQ,SAAA;AAAA;gBAVL,KAAKS,EAAM;AAAA,gBACX,OAAOA,EAAM,YAAQ;AAAA,gBACrB,QAAQA,EAAM,YAAQ;AAAA,gBACvB,UAAA;AAAA,gBACA,MAAA;AAAA,gBACA,OAAA;AAAA,gBACA,aAAA;AAAA,gBACA,OAAM;AAAA,cAAA,GACP,wBAED,GAAAC,EAAA,WACAV,EAME,OAAA;AAAA;gBAJC,KAAKS,EAAM;AAAA,gBACX,OAAOA,EAAM,YAAQ;AAAA,gBACrB,QAAQA,EAAM,YAAQ;AAAA,gBACvB,OAAM;AAAA,cAAA;;;UAMZR,EAuBM,OAvBN6C,IAuBM;AAAA,oBAtBJ9C,EAqBM+C,GAAA,MAAAC,EApBWxC,EAAA,OAAK,CAAbvC,YADT+B,EAqBM,OAAA;AAAA,cAnBH,KAAK/B,EAAK;AAAA,cACX,UAAM,mBAAiB;AAAA,gBACO,QAAA3B,EAAAqG,CAAA,EAAU,gBAAgB,UAAU1E,EAAK;AAAA,cAAA;cAGtE,SAAK,CAAAgF,MAAE3G,EAAAqG,CAAA,EAAU,qBAAqB1E,CAAI;AAAA,YAAA;cAE3CgC,EAUM,OAVNY,IAUM;AAAA,gBAPI5C,EAAK,MAAM,QAFnBf,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;kBAEd,MAAM3E,EAAK,KAAK;AAAA,kBAChB,MAAM;AAAA,gBAAA,0BAETf,KAAA8C,EAES,QAFTe,IAESD,GADN7C,EAAK,MAAM,SAAK,IAAA,CAAA,CAAA,GAAA,CAAA;AAAA,cAAA;cAGrBgC,EAA2D,QAA3De,IAA2DF,EAA1B7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,YAAA;;;QAMvDgC,EA0DM,OA1DNiB,IA0DM;AAAA,UAxDJjB,EA2BM,OAAA;AAAA,YA1BJ,OAAKvD,EAAA,CAAC,cAAY,CACTJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,UAAA;YAGnByC,EAQM,OARNiD,IAQM;AAAA,cAPJvG,EAMOC,uBANP,MAMO;AAAA,gBALLqD,EAGM,OAHNkD,IAGM;AAAA,kBAFJlD,EAAiD,QAAjDqD,IAAiDxC,EAApBL,EAAM,IAAI,GAAA,CAAA;AAAA,kBACvCR,EAAwD,QAAxDmD,IAAwDtC,EAAxBL,EAAM,QAAQ,GAAA,CAAA;AAAA,gBAAA;gCAEhDR,EAAkC,OAAA,EAA7B,OAAM,oBAAgB,MAAA,EAAA;AAAA,cAAA;;YAK/BA,EAOM,OAPNoD,IAOM;AAAA,cANJ1G,EAKOC,0BALP,MAKO;AAAA,gBAHGN,EAAAqG,CAAA,EAAU,mBAAmB,MAAM,SAAM,UADjDtG,EAGE4E,IAAA;AAAA;kBADC,MAAM3E,EAAAqG,CAAA,EAAU,mBAAmB;AAAA,gBAAA;;;YAM1ChG,EAA4BC,EAAA,QAAA,cAAA;AAAA,UAAA;UAKtB/D,EAAA,cADRmH,EAMM,OAAA;AAAA;YAJJ,OAAM;AAAA,YACL,uBAAoBlH,EAAA,KAAc,MAAA;AAAA,UAAA;YAEnC6D,EAAyBC,EAAA,QAAA,WAAA;AAAA,UAAA;UAI3BJ,EAgBUF,EAAAC,EAAA,GAAA,EAhBD,OAAM,oBAAgB;AAAA,uBAC7B,MAUiB;AAAA,cAVjBC,EAUiBF,EAAAO,EAAA,GAAA,EAVD,OAAM,kBAAc;AAAA,2BAClC,MAQM;AAAA,kBARNoD,EAQM,OARNsD,IAQM;AAAA,oBAPJ/G,EAMaM,GAAA,MAAA;AAAA,iCALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,wBACpCyB,EAIaQ,GAAA;AAAA,0BAJA,MAAMxD,EAAA;AAAA,0BAAgB,MAAK;AAAA,wBAAA;qCACtC,MAEY;AAAA,kCAFZ6C,EAEYY,IAAA;AAAA,8BAFA,SAASX,EAAArB,CAAA;AAAA,8BAAc,KAAKqB,EAAApB,CAAA;AAAA,4BAAA;+BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,gCAAG,KAAKhC,EAAM;AAAA,8BAAA;;;;;;;;;;;;cAOjC/B,EAAA,QACd2D,EAAsBC,EAAA,QAAA,UAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;;;;;;;;AC2FhC,UAAMpC,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GAEjC6C,IAAahD,EAAI,QACjBgG,IAAQjH,EAAS,MAAMiB,EAAI,MAAM,KAAK,GACtC3B,IAAeU,EAAS,MAAMiB,EAAI,aAAa,KAAK,GACpD1B,IAAiBS,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDxB,IAAaO,EAAS,MAAMiB,EAAI,WAAW,KAAK,GAChDhB,IAAiBD,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDiG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA,GAE1CmI,IAAYxB,GAAa;AAAA,MAC7B,OAAO3G,EAAI;AAAA,MACX,oBAAoBjB,EAAS,MAAM,EAAK;AAAA,IAAA,CACzC,GAGKiK,IAAcrL,EAAI,EAAK,GACvB+B,IAAiB,MAAM;AAC3B,MAAAsJ,EAAY,QAAQ,CAACA,EAAY;AAAA,IACnC,GAEMZ,IACJpI,EAAI,iBACJqI,EAAgB;AAAA,MACd,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAG;AAAA,MACzD,MAAMlH,GAAO;AACX,eAAO,MACLoC,GAAE,KAAK;AAAA,UACL,OAAOpC,EAAM;AAAA,UACb,OAAO;AAAA,YACL,UAAU,GAAGA,EAAM,IAAI;AAAA,YACvB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAAA;AAAA,QAClB,CACD;AAAA,MACL;AAAA,IAAA,CACD;;;AAvPD,aAAAuB,EAAA,GAAA8C,EA+LM,OA/LNE,IA+LM;AAAA,QA7LJD,EA+CM,OAAA;AAAA,UA9CJ,OAAKvD,EAAA,CAAC,cAAY,CACTJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAGnByC,EA+BM,OA/BNI,IA+BM;AAAA,YA9BJ1D,EA6BOC,sBA7BP,MA6BO;AAAA,cA5BLqD,EAsBM,OAtBNS,IAsBM;AAAA,gCArBJT,EAA6B,OAAA,EAAxB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,gBAEdQ,EAAM,aAAQ,gBADtBT,EAYQ,SAAA;AAAA;kBAVL,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,UAAA;AAAA,kBACA,MAAA;AAAA,kBACA,OAAA;AAAA,kBACA,aAAA;AAAA,kBACA,OAAM;AAAA,gBAAA,GACP,wBAED,GAAAE,EAAA,WACAX,EAME,OAAA;AAAA;kBAJC,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,OAAM;AAAA,gBAAA;;cAGVR,EAGM,OAHNW,IAGM;AAAA,gBAFJX,EAAiD,QAAjDY,IAAiDC,EAApBL,EAAM,IAAI,GAAA,CAAA;AAAA,gBACvCR,EAAwD,QAAxDc,IAAwDD,EAAxBL,EAAM,QAAQ,GAAA,CAAA;AAAA,cAAA;8BAEhDR,EAAkC,OAAA,EAA7B,OAAM,oBAAgB,MAAA,EAAA;AAAA,YAAA;;UAK/BA,EAIM,OAJNe,IAIM;AAAA,YAHJrE,EAEOC,0BAFP,MAEO;AAAA,cADLJ,EAAgCyE,IAAA,EAAf,MAAMT,EAAA,MAAA,GAAK,MAAA,GAAA,CAAA,MAAA,CAAA;AAAA,YAAA;;UAKhC7D,EAA4BC,EAAA,QAAA,cAAA;AAAA,QAAA;QAKtB/D,EAAA,cADRmH,EAMM,OAAA;AAAA;UAJJ,OAAM;AAAA,UACL,uBAAoBlH,EAAA,KAAc,MAAA;AAAA,QAAA;UAEnC6D,EAAyBC,EAAA,QAAA,WAAA;AAAA,QAAA;QAI3BqD,EAiIM,OAjINiB,IAiIM;AAAA,UA/HJ1E,EAgBUF,EAAAC,EAAA,GAAA,EAhBD,OAAM,oBAAgB;AAAA,uBAC7B,MAUiB;AAAA,cAVjBC,EAUiBF,EAAAO,EAAA,GAAA,EAVD,OAAM,kBAAc;AAAA,2BAClC,MAQM;AAAA,kBARNoD,EAQM,OARNiD,IAQM;AAAA,oBAPJ1G,EAMaM,GAAA,MAAA;AAAA,iCALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,wBACpCyB,EAIaQ,GAAA;AAAA,0BAJA,MAAMxD,EAAA;AAAA,0BAAgB,MAAK;AAAA,wBAAA;qCACtC,MAEY;AAAA,kCAFZ6C,EAEYY,IAAA;AAAA,8BAFA,SAASX,EAAArB,CAAA;AAAA,8BAAc,KAAKqB,EAAApB,CAAA;AAAA,4BAAA;+BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,gCAAG,KAAKhC,EAAM;AAAA,8BAAA;;;;;;;;;;;;cAOjC/B,EAAA,QACd2D,EAAsBC,EAAA,QAAA,UAAA,EAAA,KAAA,EAAA,CAAA;;;;UAMlBN,EAAAqG,CAAA,EAAU,mBAAmB,MAAM,SAAM,UADjD3C,EAmBM,OAAA;AAAA;YAjBJ,UAAM,kBAAgB;AAAA,cACF1D,EAAAkB,CAAA,IAAU,eAAA;AAAA,yBAAsDgG,EAAA,MAAA;AAAA,YAAW;YAI9F,SAAOtJ;AAAA,UAAA;YAER+F,EASO,QAAA;AAAA,cARJ,OAAKvD,EAAA;AAAA;;gBAAyE8G,EAAA,QAAW,cAAA;AAAA,cAAA;;cAM1FvD,EAAgC,QAAA,EAA1B,OAAM,aAAA,GAAY,MAAA,EAAA;AAAA,cACxBA,EAAgC,QAAA,EAA1B,OAAM,aAAA,GAAY,MAAA,EAAA;AAAA,YAAA;;UAMpB3D,EAAAqG,CAAA,EAAU,mBAAmB,MAAM,SAAM,UADjD3C,EAqFM,OAAA;AAAA;YAnFJ,OAAKtD,EAAA,CAAC,yBAAuB,EAAA,WACR8G,EAAA,OAAW,CAAA;AAAA,UAAA;YAEhCvD,EA+EM,OAAA;AAAA,cA9EJ,OAAKvD,EAAA,CAAC,iBAAe,CACZJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,YAAA;cAGnByC,EAeM,OAAA;AAAA,gBAdJ,OAAKvD,EAAA,CAAC,kBAAgB,CACbJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,cAAA;gBAEnByC,EAOM,OAPNkD,IAOM;AAAA,kBAJI7G,EAAAqG,CAAA,EAAU,oBAAoB,OAAO,MAAM,QAFnDzF,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;oBAEd,MAAMtG,KAAU,oBAAoB,MAAM,KAAK;AAAA,oBAC/C,MAAM;AAAA,kBAAA;;gBAGX2D,EAES,QAFTqD,IAESxC,EADPxE,EAAAqG,CAAA,EAAU,oBAAoB,OAAO,MAAM,SAAK,IAAA,GAAA,CAAA;AAAA,cAAA;cAKpD1C,EAuDM,OAvDNmD,IAuDM;AAAA,iBAtDJlG,EAAA,EAAA,GAAA8C,EAqDW+C,WApDOzG,EAAAqG,CAAA,EAAU,mBAAmB,QAAtCpE;kBACD,KAAAA,EAAM;AAAA,gBAAA;kBAIJA,EAAM,YAAYA,EAAM,SAAS,SAAM,KAD/CrB,KAAA8C,EA8BM,OA9BNqD,IA8BM;AAAA,oBA1BJpD,EAQM,OARNsD,IAQM;AAAA,sBALIhF,EAAM,MAAM,QAFpBrB,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;wBAEd,MAAMrE,EAAM,KAAK;AAAA,wBACjB,MAAM;AAAA,sBAAA;sBAET0B,EAAoC,QAAA,MAAAa,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,oBAAA;qBAE5BrB,EAAA,EAAA,GAAA8C,EAgBM+C,GAAA,MAAAC,EAfezE,EAAM,WAAlBkF,YADTzD,EAgBM,OAAA;AAAA,sBAdH,KAAKyD,EAAS;AAAA,sBACf,UAAM,sBAAoB;AAAA,wBACY,QAAAnH,EAAAqG,CAAA,EAAU,iBAAiBc,EAAS,IAAI;AAAA,sBAAA;sBAG7E,SAAK,CAAAR,MAAE3G,EAAAqG,CAAA,EAAU,sBAAsBc,CAAQ;AAAA,oBAAA;sBAIxCA,EAAS,MAAM,QAFvBvG,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;wBAEd,MAAMa,EAAS,KAAK;AAAA,wBACpB,MAAM;AAAA,sBAAA;sBAETxD,EAA0D,QAA1DyD,IAA0D5C,EAA9B2C,EAAS,MAAM,KAAK,GAAA,CAAA;AAAA,oBAAA;8BAIpDzD,EAeM,OAAA;AAAA;oBAbJ,UAAM,aAAW;AAAA,sBACmB,QAAA1D,EAAAqG,CAAA,EAAU,iBAAiBpE,EAAM,IAAI;AAAA,oBAAA;oBAGxE,SAAK,CAAA0E,MAAE3G,EAAAqG,CAAA,EAAU,sBAAsBpE,CAAK;AAAA,kBAAA;oBAIrCA,EAAM,MAAM,QAFpBrB,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;sBAEd,MAAMrE,EAAM,KAAK;AAAA,sBACjB,MAAM;AAAA,oBAAA;oBAET0B,EAAuD,QAAvD0D,IAAuD7C,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;;;;;;;;;;;;;;;;;;;ACqB7D,UAAM/D,IAAMD,EAAA,GACN,EAAE,aAAAU,GAAa,eAAAC,EAAA,IAAkBP,GAAA,GACjCyC,IAASC,GAAA,GAETG,IAAahD,EAAI,QACjBgG,IAAQjH,EAAS,MAAMiB,EAAI,MAAM,KAAK,GACtC3B,IAAeU,EAAS,MAAMiB,EAAI,aAAa,KAAK,GACpD1B,IAAiBS,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDxB,IAAaO,EAAS,MAAMiB,EAAI,WAAW,KAAK,GAChDhB,IAAiBD,EAAS,MAAMiB,EAAI,eAAe,KAAK,GACxDiG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA,GAG1CoJ,IAAiBzL,EAAI,EAAK,GAC1B0L,IAAY1L,EAA0C,IAAI,GAE1D2L,IAAiB,MAAM;AAC3B,MAAID,EAAU,SAAO,aAAaA,EAAU,KAAK,GACjDA,EAAU,QAAQ,WAAW,MAAM;AACjC,QAAAD,EAAe,QAAQ;AAAA,MACzB,GAAG,GAAG;AAAA,IACR,GAEMG,IAAkB,MAAM;AAC5B,MAAIF,EAAU,UACZ,aAAaA,EAAU,KAAK,GAC5BA,EAAU,QAAQ,OAEpBD,EAAe,QAAQ;AAAA,IACzB,GAEMI,IAAiB,CAAC/F,MAAsB;AAC5C,MAAIA,EAAK,SACPb,EAAO,KAAKa,EAAK,IAAI,GACrB2F,EAAe,QAAQ;AAAA,IAE3B,GAEMhB,IACJpI,EAAI,iBACJqI,EAAgB;AAAA,MACd,MAAM;AAAA,MACN,OAAO,EAAE,MAAM,QAAQ,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAG;AAAA,MACzD,MAAMlH,GAAO;AACX,eAAO,MACLoC,GAAE,KAAK;AAAA,UACL,OAAOpC,EAAM;AAAA,UACb,OAAO;AAAA,YACL,UAAU,GAAGA,EAAM,IAAI;AAAA,YACvB,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,UAAA;AAAA,QAClB,CACD;AAAA,MACL;AAAA,IAAA,CACD;AAEH,WAAAoE,GAAY,MAAM;AAChB,MAAI8D,EAAU,SAAO,aAAaA,EAAU,KAAK;AAAA,IACnD,CAAC;;AAvQC,aAAA3G,EAAA,GAAA8C,EA2LM,OA3LNE,IA2LM;AAAA,QAzLJD,EAyDM,OAAA;AAAA,UAxDJ,OAAKvD,EAAA,CAAC,cAAY,CACTJ,EAAAkB,CAAA,IAAU,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAEnByC,EAiDM,OAjDNI,IAiDM;AAAA,YA/CJJ,EAeM,OAAA;AAAA,cAdJ,OAAM;AAAA,cACL,cAAY8D;AAAA,cACZ,cAAYD;AAAA,YAAA;cAEbnH,EASOC,8BATP,MASO;AAAA,gCARLqD,EAOM,OAAA,EAPD,OAAM,oBAAgB;AAAA,kBAEzBA,EAIO,QAAA,EAJD,OAAM,oBAAgB;AAAA,oBAC1BA,EAAa,MAAA;AAAA,oBACbA,EAAa,MAAA;AAAA,oBACbA,EAAa,MAAA;AAAA,kBAAA;;;;YAMrBtD,EA6BOC,sBA7BP,MA6BO;AAAA,cA5BLqD,EAsBM,OAtBNS,IAsBM;AAAA,gCArBJT,EAA6B,OAAA,EAAxB,OAAM,YAAA,GAAW,MAAA,EAAA;AAAA,gBAEdQ,EAAM,aAAQ,gBADtBT,EAYQ,SAAA;AAAA;kBAVL,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,UAAA;AAAA,kBACA,MAAA;AAAA,kBACA,OAAA;AAAA,kBACA,aAAA;AAAA,kBACA,OAAM;AAAA,gBAAA,GACP,wBAED,GAAAE,EAAA,WACAX,EAME,OAAA;AAAA;kBAJC,KAAKS,EAAM;AAAA,kBACX,OAAOA,EAAM,YAAQ;AAAA,kBACrB,QAAQA,EAAM,YAAQ;AAAA,kBACvB,OAAM;AAAA,gBAAA;;cAGVR,EAGM,OAHNW,IAGM;AAAA,gBAFJX,EAAiD,QAAjDY,IAAiDC,EAApBL,EAAM,IAAI,GAAA,CAAA;AAAA,gBACvCR,EAAwD,QAAxDc,IAAwDD,EAAxBL,EAAM,QAAQ,GAAA,CAAA;AAAA,cAAA;8BAEhDR,EAAkC,OAAA,EAA7B,OAAM,oBAAgB,MAAA,EAAA;AAAA,YAAA;;UAK/BtD,EAA4BC,EAAA,QAAA,gBAAA,CAAA,GAAA,QAAA,EAAA;AAAA,QAAA;QAKtB/D,EAAA,cADRmH,EAMM,OAAA;AAAA;UAJJ,OAAM;AAAA,UACL,uBAAoBlH,EAAA,KAAc,MAAA;AAAA,QAAA;UAEnC6D,EAAyBC,EAAA,QAAA,aAAA,CAAA,GAAA,QAAA,EAAA;AAAA,QAAA;QAI3BqD,EA8FM,OAAA;AAAA,UA7FJ,UAAM,eAAa;AAAA,YACD3D,EAAAkB,CAAA,IAAU,eAAA;AAAA,uBAAoDoG,EAAA,MAAA;AAAA,UAAc;UAI7F,cAAYG;AAAA,UACZ,cAAYD;AAAA,QAAA;UAEbnH,EAoFOC,6BApFP,MAoFO;AAAA,4BAlFLqD,EAWM,OAAA,EAXD,OAAM,mBAAe;AAAA,cACxBA,EASM,OAAA,EATD,OAAM,kBAAc;AAAA,gBAEvBA,EAKO,QAAA,EALD,OAAM,eAAW;AAAA,kBACrBA,EAAa,MAAA;AAAA,kBACbA,EAAa,MAAA;AAAA,kBACbA,EAAa,MAAA;AAAA,kBACbA,EAAa,MAAA;AAAA,gBAAA;gBAEfA,EAAiB,cAAX,MAAI;AAAA,cAAA;;YAKdA,EAmEM,OAnENe,IAmEM;AAAA,cAlEJf,EAiEM,OAjENiB,IAiEM;AAAA,wBAhEJlB,EA+DM+C,GAAA,MAAAC,EA9DexC,EAAA,OAAK,CAAjByD,YADTjE,EA+DM,OAAA;AAAA,kBA7DH,KAAKiE,EAAS;AAAA,kBACf,OAAM;AAAA,gBAAA;kBAGNhE,EAQM,OAAA;AAAA,oBARD,OAAM;AAAA,oBAAmB,SAAK,CAAAgD,MAAEe,EAAeC,CAAQ;AAAA,kBAAA;oBAGlDA,EAAS,MAAM,QAFvB/G,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;sBAEd,MAAMqB,EAAS,KAAK;AAAA,sBACpB,MAAM;AAAA,oBAAA;oBAEThE,EAAuC,QAAA,MAAAa,EAA9BmD,EAAS,MAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;kBAMvBA,EAAS,YAAYA,EAAS,SAAS,SAAM,KAFrD/G,KAAA8C,EA6CM,OA7CNmD,IA6CM;AAAA,qBAzCJjG,EAAA,EAAA,GAAA8C,EAaM+C,GAAA,MAAAC,EAZWiB,EAAS,WAAjBhG,YADT+B,EAaM,OAAA;AAAA,sBAXH,KAAK/B,EAAK;AAAA,sBACX,OAAM;AAAA,sBACL,SAAK,CAAAgF,MAAEe,EAAe/F,CAAI;AAAA,oBAAA;sBAInBA,EAAK,MAAM,QAFnBf,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;wBAEd,MAAM3E,EAAK,KAAK;AAAA,wBAChB,MAAM;AAAA,sBAAA;sBAETgC,EAAsD,QAAtDmD,IAAsDtC,EAA1B7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,oBAAA;qBAI9Cf,EAAA,EAAA,GAAA8C,EAwBW+C,GAAA,MAAAC,EAvBMiB,EAAS,WAAjBhG;sBACQ,KAAA,SAAAA,EAAK;AAAA,oBAAA;sBAGZA,EAAK,YAAYA,EAAK,SAAS,SAAM,KAD7Cf,KAAA8C,EAmBM,OAnBNqD,IAmBM;AAAA,wBAfJpD,EAAuD,OAAvDsD,IAAuDzC,EAAzB7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,yBAC9Cf,EAAA,EAAA,GAAA8C,EAaM+C,GAAA,MAAAC,EAZc/E,EAAK,WAAhBiG,YADTlE,EAaM,OAAA;AAAA,0BAXH,KAAKkE,EAAQ;AAAA,0BACd,OAAM;AAAA,0BACL,SAAK,CAAAjB,MAAEe,EAAeE,CAAO;AAAA,wBAAA;0BAItBA,EAAQ,MAAM,QAFtBhH,EAAA,GAAAb,EAKEc,EAJKb,EAAAsG,CAAA,CAAU,GAAA;AAAA;4BAEd,MAAMsB,EAAQ,KAAK;AAAA,4BACnB,MAAM;AAAA,0BAAA;0BAETjE,EAAyD,QAAzDyD,IAAyD5C,EAA7BoD,EAAQ,MAAM,KAAK,GAAA,CAAA;AAAA,wBAAA;;;;;;;;;QAYjEjE,EAkBM,OAlBNkE,IAkBM;AAAA,UAjBJ3H,EAgBUF,EAAAC,EAAA,GAAA,EAhBD,OAAM,oBAAgB;AAAA,uBAC7B,MAUiB;AAAA,cAVjBC,EAUiBF,EAAAO,EAAA,GAAA,EAVD,OAAM,oCAAgC;AAAA,2BACpD,MAQM;AAAA,kBARNoD,EAQM,OARN0D,IAQM;AAAA,oBAPJnH,EAMaM,GAAA,MAAA;AAAA,iCALX,CAIa,EALO,WAAAC,GAAW,OAAAhC,QAAK;AAAA,wBACpCyB,EAIaQ,GAAA;AAAA,0BAJA,MAAMxD,EAAA;AAAA,0BAAgB,MAAK;AAAA,wBAAA;qCACtC,MAEY;AAAA,kCAFZ6C,EAEYY,IAAA;AAAA,8BAFA,SAASX,EAAArB,CAAA;AAAA,8BAAc,KAAKqB,EAAApB,CAAA;AAAA,4BAAA;+BACtCgC,KAAAb,EAA+Cc,EAA/BJ,CAAS,GAAA;AAAA,gCAAG,KAAKhC,EAAM;AAAA,8BAAA;;;;;;;;;;;;cAOjC/B,EAAA,QACd2D,EAAsBC,EAAA,QAAA,UAAA,EAAA,KAAA,EAAA,GAAA,QAAA,EAAA;;;;;;;;;;;;;;;ACnEhC,UAAMwH,IAAgBhK,GAAA,GAChBI,IAAMD,EAAA,GAEN/B,IAAae,EAAS,MAAM6K,EAAc,UAAU,GACpDC,IAAS7J,EAAI,QAGb8J,IAAgBnM,EAAI,EAAK;AAG/B,WAAAoM,GAAQ,gBAAgB;AAAA,MACtB,aAAaD;AAAA,MACb,uBAAuB,CAAC7L,MAAuB;AAC7C,QAAA6L,EAAc,QAAQ7L;AAAA,MACxB;AAAA,IAAA,CACD,mBA/HCuH,EA2FM,OAAA;AAAA,MA3FA,8BAA4B1D,EAAA+H,CAAA,IAAM,cAAA,YAAA,CAAA;AAAA,IAAA;MAEpB7L,EAAA,UAAU,eAA5B6D,EAOamI,IAAA;AAAA;QAPoC,WAAWF,EAAA;AAAA,qDAAAA,EAAa,QAAArB;AAAA,MAAA;QAE5D,QACT,MAA+C;AAAA,UAA/CtG,EAA+CC,EAAA,QAAA,QAAA,EAA5B,WAAW0H,EAAA,OAAa;AAAA,QAAA;QAElC,UAAO,MAAsB;AAAA,UAAtB3H,EAAsBC,EAAA,QAAA,QAAA;AAAA,QAAA;QAC7B,UAAO,MAAsB;AAAA,UAAtBD,EAAsBC,EAAA,QAAA,QAAA;AAAA,QAAA;;;QALxB6H,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;kCASnCpE,EAAA,UAAU,cAAhC6D,EAYYqI,IAAA,EAAA,KAAA,EAAA,GAAAC,GAAA,EAAA,GAAA,KAAA;AAAA,QAXMF,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;QACvC6H,EAAAA,OAAM,UAAA;gBAAe;AAAA,gBAClC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,UAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,cAAA;gBAAmB;AAAA,gBACtC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,cAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,WAAA;gBAAgB;AAAA,gBACnC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,WAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAO;gBAAS;AAAA,gBAAO,MAAsB;AAAA,YAAtB9H,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;mBAIzCpE,EAAA,UAAU,cAAhC6D,EAIYuI,IAAA,EAAA,KAAA,EAAA,GAAAD,GAAA;AAAA,QAFC,UAAO,MAAsB;AAAA,UAAtBhI,EAAsBC,EAAA,QAAA,QAAA;AAAA,QAAA;;;QADxB6H,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;QAEvC6H,EAAAA,OAAO;gBAAS;AAAA,gBAAO,MAAsB;AAAA,YAAtB9H,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;mBAItCpE,EAAA,UAAU,kBAAnC6D,EAaewI,IAAA,EAAA,KAAA,EAAA,GAAAF,GAAA,EAAA,GAAA,KAAA;AAAA,QAZGF,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;QACvC6H,EAAAA,OAAO;gBAAQ;AAAA,gBAAM,MAAqB;AAAA,YAArB9H,EAAqBC,EAAA,QAAA,OAAA;AAAA,UAAA;;;QAC1C6H,EAAAA,OAAM,UAAA;gBAAe;AAAA,gBAClC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,UAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,cAAA;gBAAmB;AAAA,gBACtC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,cAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,WAAA;gBAAgB;AAAA,gBACnC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,WAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAO;gBAAS;AAAA,gBAAO,MAAsB;AAAA,YAAtB9H,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;mBAKlDpE,EAAA,UAAU,iCADvB6D,EAc6ByI,IAAA,EAAA,KAAA,EAAA,GAAAH,GAAA,EAAA,GAAA,KAAA;AAAA,QAXXF,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;QACvC6H,EAAAA,OAAM,UAAA;gBAAe;AAAA,gBAClC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,UAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,cAAA;gBAAmB;AAAA,gBACtC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,cAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,WAAA;gBAAgB;AAAA,gBACnC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,WAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAO;gBAAS;AAAA,gBAAO,MAAsB;AAAA,YAAtB9H,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;mBAIxCpE,EAAA,UAAU,sBAAjC6D,EAea0I,IAAA,EAAA,KAAA,EAAA,GAAAJ,GAAA,EAAA,GAAA,KAAA;AAAA,QAdKF,EAAAA,OAAM,cAAA;gBAAmB;AAAA,gBACtC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,cAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAO;gBAAO;AAAA,gBAAK,MAAoB;AAAA,YAApB9H,EAAoBC,EAAA,QAAA,MAAA;AAAA,UAAA;;;QACvC6H,EAAAA,OAAM,cAAA;gBAAmB;AAAA,gBACtC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,cAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,WAAA;gBAAgB;AAAA,gBACnC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,WAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAM,aAAA;gBAAkB;AAAA,gBACrC,MACD;AAAA,YADC9H,EACDC,EAAA,QAAA,aAAA;AAAA,UAAA;;;QACc6H,EAAAA,OAAO;gBAAS;AAAA,gBAAO,MAAsB;AAAA,YAAtB9H,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;oBAI/DM,EAAA,GAAA8C,EAKM,OALNE,IAKM,CAAA,GAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,QAJJN,EAGM,OAAA,EAHD,OAAM,yBAAqB;AAAA,UAC9BA,EAAsC,OAAA,EAAjC,OAAM,mBAAA,GAAmB,IAAE;AAAA,UAChCA,EAA0C,OAAA,EAArC,OAAM,oBAAA,GAAoB,OAAK;AAAA,QAAA;;;;IC/F/B+E,KAAsB;AAAA,EACjC;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAOP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAOT;;;;;;;;;;;;;;;;;;;ACuSA,UAAMC,IAAUC,GAAA,GACVC,IAASC,GAAA,GACThB,IAAgBhK,GAAA,GAChBiL,IAAUC,GAAoB1J,GAAC,MAA0B,GACzD2J,IAAYpN,EAAI,YAAY,GAG5BqN,IAAWrN,EAAI,EAAK,GACpBsN,IAAgBtN,EAAI,EAAK,GACzBuN,IAAmBvN,EAAI,EAAK,GAC5BwN,IAAgBxN,EAAI,aAAa;AAGvC,QAAIyN,IAAkC;AAGtC,UAAMC,IAAkB,CAACC,MAAiB;AAExC,MAAIF,MACF,SAAS,KAAK,YAAYA,CAAW,GACrCA,IAAc;AAIhB,YAAMG,IAAS,SAAS,cAAc,QAAQ,GACxCvL,IAAMuL,EAAO,WAAW,IAAI;AAClC,MAAAA,EAAO,QAAQ,KACfA,EAAO,SAAS,KAEhBvL,EAAI,OAAO,2BACXA,EAAI,YAAY,6BAChBA,EAAI,OAAQ,MAAM,KAAK,KAAM,GAAG,GAChCA,EAAI,SAASsL,GAAM,GAAG,EAAE,GAGxBF,IAAc,SAAS,cAAc,KAAK,GAC1CA,EAAY,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOFG,EAAO,WAAW;AAAA;AAAA;AAAA;AAAA,KAM5C,SAAS,KAAK,YAAYH,CAAW;AAAA,IACvC,GAGMI,IAAkB,MAAM;AAC5B,MAAIJ,MACF,SAAS,KAAK,YAAYA,CAAW,GACrCA,IAAc;AAAA,IAElB;AAGA,IAAAzL,EAAMqL,GAAU,CAACtJ,MAAQ;AACvB,eAAS,gBAAgB,UAAU,OAAO,aAAaA,CAAG;AAAA,IAC5D,CAAC,GAGD/B,EAAMsL,GAAe,CAACvJ,MAAQ;AAC5B,eAAS,gBAAgB,UAAU,OAAO,mBAAmBA,CAAG;AAAA,IAClE,CAAC,GAGD/B,EAAMuL,GAAkB,CAACxJ,MAAQ;AAC/B,MAAIA,IACF2J,EAAgBF,EAAc,KAAK,IAEnCK,EAAA;AAAA,IAEJ,CAAC,GAGD7L,EAAMwL,GAAe,CAACzJ,MAAQ;AAC5B,MAAIwJ,EAAiB,SACnBG,EAAgB3J,CAAG;AAAA,IAEvB,CAAC;AAGD,UAAM+J,IAAa1M,EAAS,MAAM;AAChC,YAAM2M,IAAK,UAAU;AACrB,UAAIC,IAAU,WACVC,IAAK;AAGT,aAAIF,EAAG,SAAS,QAAQ,IAAGC,IAAU,WAC5BD,EAAG,SAAS,SAAS,IAAGC,IAAU,YAClCD,EAAG,SAAS,QAAQ,IAAGC,IAAU,WACjCD,EAAG,SAAS,MAAM,MAAGC,IAAU,SAGpCD,EAAG,SAAS,SAAS,IAAGE,IAAK,YACxBF,EAAG,SAAS,KAAK,IAAGE,IAAK,UACzBF,EAAG,SAAS,OAAO,IAAGE,IAAK,UAC3BF,EAAG,SAAS,SAAS,IAAGE,IAAK,YAC7BF,EAAG,SAAS,KAAK,MAAGE,IAAK,QAE3B;AAAA,QACL,SAAAD;AAAA,QACA,IAAAC;AAAA,QACA,YAAY,GAAG,OAAO,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM;AAAA,QAC5D,YAAY,OAAO,mBAAmB;AAAA,QACtC,UAAU,UAAU;AAAA,QACpB,UAAU,KAAK,eAAA,EAAiB,kBAAkB;AAAA,MAAA;AAAA,IAEtD,CAAC;AAGD,IAAArG,GAAY,MAAM;AAChB,MAAAiG,EAAA;AAAA,IACF,CAAC;AAGD,UAAMK,IAAqB,CAACC,GAAeC,MAAuB;AAChE,MAAIA,MACJnC,EAAc,aAAakC;AAAA,IAC7B,GAOME,IAAkB,CAAC1M,MAChBsK,EAAc,iBAAiBtK,EAAO,cAMzC2M,IAAoB,CAAC3M,MAAwB;AACjD,MAAAsK,EAAc,YAAYtK,CAAM,GAChCmL,EAAQ,QAAQ,OAAOnL,EAAO,IAAI,OAAO;AAAA,IAC3C,GAKM4M,IAAwB,MAAM;AAClC,MAAAtC,EAAc,YAAYlN,EAAiB,WAC3CkN,EAAc,eAAelN,EAAiB,cAC9CkN,EAAc,eAAelN,EAAiB,cAC9CkN,EAAc,iBAAiBlN,EAAiB,gBAChDkN,EAAc,mBAAmBlN,EAAiB,kBAClD+N,EAAQ,QAAQ,WAAW;AAAA,IAC7B,GAKM0B,IAAoB,MAAM;AAC9B,MAAAvC,EAAc,aAAalN,EAAiB,YAC5CkN,EAAc,cAAclN,EAAiB,aAC7CkN,EAAc,iBAAiBlN,EAAiB,gBAChDkN,EAAc,qBAAqBlN,EAAiB,oBACpDkN,EAAc,eAAelN,EAAiB,cAC9CkN,EAAc,iBAAiBlN,EAAiB,gBAChDkN,EAAc,gBAAgBlN,EAAiB,eAC/CkN,EAAc,aAAalN,EAAiB,YAC5CkN,EAAc,eAAelN,EAAiB,cAC9CkN,EAAc,wBAAwBlN,EAAiB,uBACvDkN,EAAc,eAAelN,EAAiB,cAC9C+N,EAAQ,QAAQ,WAAW;AAAA,IAC7B,GAKM2B,IAAc,MAAM;AACxB,MAAAzB,EAAO,QAAQ;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,iBAAiB,MAAM;AACrB,UAAAf,EAAc,cAAA,GACda,EAAQ,QAAQ,SAAS;AAAA,QAC3B;AAAA,MAAA,CACD;AAAA,IACH,GAKM4B,IAAmB,MAAM;AAC7B,MAAA1B,EAAO,QAAQ;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,iBAAiB,MAAM;AAErB,gBAAM2B,IAAa,CAAC,cAAc,sBAAsB;AAExD,UADgB,OAAO,KAAK,YAAY,EAChC,QAAQ,CAACrI,MAAQ;AACvB,YAAKqI,EAAW,SAASrI,CAAG,KAC1B,aAAa,WAAWA,CAAG;AAAA,UAE/B,CAAC,GAED,eAAe,MAAA,GACfwG,EAAQ,QAAQ,OAAO;AAAA,QACzB;AAAA,MAAA,CACD;AAAA,IACH,GAKM8B,IAAe,MAAM;AACzB,eAAS,OAAA;AAAA,IACX,GAKMC,IAAqB,MAAM;AAC/B,YAAMC,IAAS;AAAA,QACb,UAAU7C,EAAc;AAAA,QACxB,MAAMoB,EAAS;AAAA,QACf,WAAWC,EAAc;AAAA,QACzB,WAAW;AAAA,UACT,SAASC,EAAiB;AAAA,UAC1B,MAAMC,EAAc;AAAA,QAAA;AAAA,QAEtB,aAAY,oBAAI,KAAA,GAAO,YAAA;AAAA,MAAY,GAE/BuB,IAAO,IAAI,KAAK,CAAC,KAAK,UAAUD,GAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,QACvD,MAAM;AAAA,MAAA,CACP,GACKE,IAAM,IAAI,gBAAgBD,CAAI,GAC9BE,IAAI,SAAS,cAAc,GAAG;AACpC,MAAAA,EAAE,OAAOD,GACTC,EAAE,WAAW,sBAAsB,KAAK,IAAA,CAAK,SAC7CA,EAAE,MAAA,GACF,IAAI,gBAAgBD,CAAG,GACvBlC,EAAQ,QAAQ,OAAO;AAAA,IACzB,GAKMoC,IAAqB,MAAM;AAC/B,YAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,OAAO,QACbA,EAAM,SAAS,oBACfA,EAAM,WAAW,OAAOC,MAAa;AACnC,cAAMC,IAAQD,EAAE,OAA4B,QAAQ,CAAC;AACrD,YAAKC;AAEL,cAAI;AACF,kBAAM1B,IAAO,MAAM0B,EAAK,KAAA,GAClBP,IAAS,KAAK,MAAMnB,CAAI;AAG9B,YAAImB,EAAO,YACT7C,EAAc,OAAO6C,EAAO,QAAQ,GAElCA,EAAO,SAAS,WAClBzB,EAAS,QAAQyB,EAAO,OAEtBA,EAAO,cAAc,WACvBxB,EAAc,QAAQwB,EAAO,YAE3BA,EAAO,cACTvB,EAAiB,QAAQuB,EAAO,UAAU,SAC1CtB,EAAc,QAAQsB,EAAO,UAAU,OAGzChC,EAAQ,QAAQ,OAAO;AAAA,UACzB,QAAgB;AACd,YAAAA,EAAQ,MAAM,UAAU;AAAA,UAC1B;AAAA,MACF,GACAqC,EAAM,MAAA;AAAA,IACR;2BAtoBEjL,EAgVUC,EAAAmL,EAAA,GAAA;AAAA,MA/UA,MAAMpC,EAAA;AAAA,gDAAAA,EAAO,QAAApC;AAAA,MACpB,OAAO;AAAA,MACR,WAAU;AAAA,MACT,cAAY;AAAA,MACZ,gBAAc;AAAA,IAAA;iBAEf,MAwUiB;AAAA,QAxUjBzG,EAwUiBF,EAAAoL,EAAA,GAAA;AAAA,UAxUD,OAAM;AAAA,UAAU,UAAA;AAAA,QAAA;qBAC9B,MAsUQ;AAAA,YAtURlL,EAsUQF,EAAAqL,EAAA,GAAA;AAAA,cAtUO,OAAOpC,EAAA;AAAA,yDAAAA,EAAS,QAAAtC;AAAA,cAAE,UAAA;AAAA,cAAS,OAAM;AAAA,YAAA;yBAE9C,MAoGW;AAAA,gBApGXzG,EAoGWF,EAAAsL,EAAA,GAAA;AAAA,kBApGD,MAAK;AAAA,kBAAa,KAAI;AAAA,gBAAA;6BAE9B,MAmBM;AAAA,oBAnBN3H,EAmBM,OAnBNC,IAmBM;AAAA,sBAlBJD,EAiBM,OAjBNI,IAiBM;AAAA,gCAhBJL,EAeM+C,GAAA,MAAAC,EAda1G,EAAAxF,EAAA,GAAa,CAAvBgD,YADTkG,EAeM,OAAA;AAAA,0BAbH,KAAKlG,EAAO;AAAA,0BACb,OAAK4C,EAAA,CAAC,eAAa,EAAA,QACD8J,EAAgB1M,CAAM,EAAA,CAAA,CAAA;AAAA,0BACvC,SAAK,CAAAmJ,MAAEwD,EAAkB3M,CAAM;AAAA,wBAAA;0BAEhCmG,EAAgD,OAAhDU,IAAgDG,EAApBhH,EAAO,IAAI,GAAA,CAAA;AAAA,0BACvCmG,EAAgD,OAAhD6C,IAAgDhC,EAApBhH,EAAO,IAAI,GAAA,CAAA;AAAA,0BACvCmG,EAKM,OALNW,IAKM;AAAA,4BAJJX,EAGQ,QAAA;AAAA,8BAFN,OAAM;AAAA,8BACL,OAAK4H,GAAA,EAAA,iBAAqB/N,EAAO,cAAY;AAAA,4BAAA;;;;;oBAQxDmG,EAmBM,OAnBNY,IAmBM;AAAA,sBAlBJN,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BzD,EAgBcF,EAAAwL,EAAA,GAAA;AAAA,wBAfJ,OAAOxL,EAAA8H,CAAA,EAAc;AAAA,wBAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,YAASnB;AAAA,wBACtC,OAAM;AAAA,sBAAA;mCAEN,MAGe;AAAA,0BAHfzG,EAGeF,EAAAyL,CAAA,GAAA,EAHD,OAAM,WAAO;AAAA,uCACzB,MAAoD,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAApDN,EAAoD,QAAA,EAA9C,OAAM,iCAAA,GAAgC,MAAA,EAAA;AAAA,gCAAQ,QAEtD,EAAA;AAAA,4BAAA;;;0BACAzD,EAGeF,EAAAyL,CAAA,GAAA,EAHD,OAAM,UAAM;AAAA,uCACxB,MAAqD,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAArDN,EAAqD,QAAA,EAA/C,OAAM,kCAAA,GAAiC,MAAA,EAAA;AAAA,gCAAQ,QAEvD,EAAA;AAAA,4BAAA;;;0BACAzD,EAGeF,EAAAyL,CAAA,GAAA,EAHD,OAAM,UAAM;AAAA,uCACxB,MAAiD,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAAjDN,EAAiD,QAAA,EAA3C,OAAM,8BAAA,GAA6B,MAAA,EAAA;AAAA,gCAAQ,QAEnD,EAAA;AAAA,4BAAA;;;;;;;oBAKJA,EAWM,OAXNc,IAWM;AAAA,sBAVJR,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAoC,OAAA,EAA/B,OAAM,gBAAA,GAAgB,OAAG,EAAA;AAAA,sBAC9BA,EAQM,OARNe,IAQM;AAAA,wBAPJxE,EAKEF,EAAA0L,EAAA,GAAA;AAAA,0BAJQ,OAAO1L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,eAAYnB;AAAA,0BACxC,cAAY;AAAA,0BACZ,UAAU3G,EAAAnF,EAAA;AAAA,0BACV,SAAS,CAAA,SAAA;AAAA,wBAAA;wBAEZ8I,EAAiE,QAAjEiB,IAAiEJ,EAApCxE,EAAA8H,CAAA,EAAc,YAAY,GAAA,CAAA;AAAA,sBAAA;;oBAK3DnE,EAUM,OAVNiD,IAUM;AAAA,sBATJ3C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BzD,EAOcF,EAAAwL,EAAA,GAAA;AAAA,wBANJ,OAAOxL,EAAA8H,CAAA,EAAc;AAAA,wBAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,eAAYnB;AAAA,wBACzC,OAAM;AAAA,sBAAA;mCAEN,MAAkD;AAAA,0BAAlDzG,EAAkDF,EAAAyL,CAAA,GAAA,EAApC,OAAM,WAAO;AAAA,uCAAC,MAAO,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;0BACnC/D,EAAmDF,EAAAyL,CAAA,GAAA,EAArC,OAAM,YAAQ;AAAA,uCAAC,MAAO,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;0BACpC/D,EAAkDF,EAAAyL,CAAA,GAAA,EAApC,OAAM,WAAO;AAAA,uCAAC,MAAO,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;;;;;oBAKvCN,EAgBM,OAhBNkD,IAgBM;AAAA,sBAfJ5C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHNqD,IAGM;AAAA,wBAFJ/C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAiC,QAAA,EAA3B,OAAM,UAAA,GAAU,QAAI,EAAA;AAAA,wBAC1BzD,EAA0DF,EAAA2L,EAAA,GAAA;AAAA,0BAAzC,OAAO3L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,mBAAgBnB;AAAA,wBAAA;;sBAExDzG,EAScF,EAAAwL,EAAA,GAAA;AAAA,wBARJ,OAAOxL,EAAA8H,CAAA,EAAc;AAAA,wBAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,iBAAcnB;AAAA,wBAC1C,UAAQ,CAAG3G,EAAA8H,CAAA,EAAc;AAAA,wBAC1B,OAAM;AAAA,sBAAA;mCAEN,MAA4C;AAAA,0BAA5C5H,EAA4CF,EAAAyL,CAAA,GAAA,EAA9B,OAAM,UAAM;AAAA,uCAAC,MAAE,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC7B/D,EAA6CF,EAAAyL,CAAA,GAAA,EAA/B,OAAM,WAAO;AAAA,uCAAC,MAAE,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC9B/D,EAA4CF,EAAAyL,CAAA,GAAA,EAA9B,OAAM,UAAM;AAAA,uCAAC,MAAE,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC7B/D,EAA2CF,EAAAyL,CAAA,GAAA,EAA7B,OAAM,UAAM;AAAA,uCAAC,MAAC,CAAA,GAAAxH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAD,KAAC,EAAA;AAAA,4BAAA;;;;;;;oBAKhCN,EAOM,OAPNmD,IAOM;AAAA,sBANJ5G,EAKUF,EAAAgE,EAAA,GAAA;AAAA,wBALD,OAAA;AAAA,wBAAM,WAAA;AAAA,wBAAW,SAAOoG;AAAA,sBAAA;wBACpB,QACT,MAAmC,CAAA,GAAAnG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCN,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,cAEb,EAAA;AAAA,wBAAA;;;;;;;gBAKJzD,EAqGWF,EAAAsL,EAAA,GAAA;AAAA,kBArGD,MAAK;AAAA,kBAAS,KAAI;AAAA,gBAAA;6BAE1B,MA6BM;AAAA,oBA7BN3H,EA6BM,OA7BNoD,IA6BM;AAAA,sBA5BJ9C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EA0BM,OA1BNsD,IA0BM;AAAA,gCAzBJvD,EAwBM+C,GAAA,MAAAC,EAvBW1G,EAAA0I,EAAA,GAAmB,CAA3B/K,YADT+F,EAwBM,OAAA;AAAA,0BAtBH,KAAK/F,EAAK;AAAA,0BACX,UAAM,eAAa;AAAA,4BACiB,QAAAqC,EAAA8H,CAAA,EAAc,eAAenK,EAAK;AAAA,4BAAmC,UAAAA,EAAK;AAAA,0BAAA;0BAI7G,SAAKiO,GAAA,CAAAjF,MAAOoD,EAAmBpM,EAAK,OAAOA,EAAK,QAAQ,GAAA,CAAA,MAAA,CAAA;AAAA,wBAAA;0BAEzDgG,EASM,OATNyD,IASM;AAAA,6BARJxG,KAAA8C,EAOM,OAPNmE,IAOM;AAAA,8BADJlE,EAAyB,KAAA;AAAA,gCAAtB,WAAQhG,EAAK;AAAA,8BAAA;;;0BAGpBgG,EAGM,OAHNkI,IAGM;AAAA,gCAFDlO,EAAK,KAAK,IAAG,KAChB,CAAA;AAAA,4BAAYA,EAAK,iBAAjB+F,EAAyD,QAAzDoI,IAA8C,MAAI;;;;;oBAO1DnI,EAqBM,OArBNoI,IAqBM;AAAA,sBApBJ9H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHNqI,IAGM;AAAA,wBAFJ/H,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAkB,cAAZ,SAAK,EAAA;AAAA,wBACXzD,EAAwDF,EAAA2L,EAAA,GAAA;AAAA,0BAAvC,OAAO3L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,iBAAcnB;AAAA,wBAAA;;sBAEtDhD,EAMM,OANNsI,IAMM;AAAA,wBALJhI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAoB,cAAd,WAAO,EAAA;AAAA,wBACbzD,EAGEF,EAAA2L,EAAA,GAAA;AAAA,0BAFQ,OAAO3L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,qBAAkBnB;AAAA,0BAC9C,UAAQ,CAAG3G,EAAA8H,CAAA,EAAc;AAAA,wBAAA;;sBAG9BnE,EAGM,OAHNuI,IAGM;AAAA,wBAFJjI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAkB,cAAZ,SAAK,EAAA;AAAA,wBACXzD,EAAsDF,EAAA2L,EAAA,GAAA;AAAA,0BAArC,OAAO3L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,eAAYnB;AAAA,wBAAA;;sBAEpDhD,EAGM,OAHNwI,IAGM;AAAA,wBAFJlI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAiB,cAAX,QAAI,EAAA;AAAA,wBACVzD,EAAoDF,EAAA2L,EAAA,GAAA;AAAA,0BAAnC,OAAO3L,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,aAAUnB;AAAA,wBAAA;;;oBAKpDhD,EAgCM,OAhCNyI,IAgCM;AAAA,sBA/BJnI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAcM,OAdN0I,IAcM;AAAA,wBAbJ1I,EAKM,OALN2I,IAKM;AAAA,0BAJJrI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAkB,cAAZ,SAAK,EAAA;AAAA,0BACXA,EAEC,QAFD4I,IAEC/H,EADKxE,KAAc,YAAY,IAAG,MAAE,CAAA;AAAA,wBAAA;wBAGvCE,EAMEF,EAAAwM,EAAA,GAAA;AAAA,0BALQ,OAAOxM,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,eAAYnB;AAAA,0BACxC,KAAK;AAAA,0BACL,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO,EAAA,KAAA,OAAA,KAAA,OAAA,KAAA,MAAA;AAAA,wBAAA;;sBAGZhD,EAcM,OAdN8I,IAcM;AAAA,wBAbJ9I,EAKM,OALN+I,IAKM;AAAA,0BAJJzI,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAiB,cAAX,QAAI,EAAA;AAAA,0BACVA,EAEC,QAFDgJ,IAECnI,EADKxE,KAAc,YAAY,IAAG,MAAE,CAAA;AAAA,wBAAA;wBAGvCE,EAMEF,EAAAwM,EAAA,GAAA;AAAA,0BALQ,OAAOxM,EAAA8H,CAAA,EAAc;AAAA,0BAAd,kBAAA7D,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAA0C,MAAA3G,EAAA8H,CAAA,EAAc,eAAYnB;AAAA,0BACxC,KAAK;AAAA,0BACL,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO,EAAA,IAAA,MAAA,IAAA,MAAA,IAAA,KAAA;AAAA,wBAAA;;;oBAMdhD,EAOM,OAPNiJ,IAOM;AAAA,sBANJ1M,EAKUF,EAAAgE,EAAA,GAAA;AAAA,wBALD,OAAA;AAAA,wBAAM,WAAA;AAAA,wBAAW,SAAOqG;AAAA,sBAAA;wBACpB,QACT,MAAmC,CAAA,GAAApG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCN,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,cAEb,EAAA;AAAA,wBAAA;;;;;;;gBAKJzD,EAoHWF,EAAAsL,EAAA,GAAA;AAAA,kBApHD,MAAK;AAAA,kBAAW,KAAI;AAAA,gBAAA;6BAE5B,MAgBM;AAAA,oBAhBN3H,EAgBM,OAhBNkJ,IAgBM;AAAA,sBAfJ5I,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAaM,OAbNmJ,IAaM;AAAA,wBAZJ5M,EAKUF,EAAAgE,EAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAOuG;AAAA,wBAAA;0BACd,QACT,MAAwC,CAAA,GAAAtG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAxCN,EAAwC,QAAA,EAAlC,OAAM,qBAAA,GAAoB,MAAA,EAAA;AAAA,0BAAA;qCACvB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;wBACAzD,EAKUF,EAAAgE,EAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAOyG;AAAA,wBAAA;0BACd,QACT,MAAmC,CAAA,GAAAxG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAnCN,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,0BAAA;qCAClB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;;;oBAKJA,EA4BM,OA5BNoJ,IA4BM;AAAA,sBA3BJ9I,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAaM,OAbNqJ,IAaM;AAAA,wBAZJ9M,EAKUF,EAAAgE,EAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAO0G;AAAA,wBAAA;0BACd,QACT,MAAoC,CAAA,GAAAzG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAApCN,EAAoC,QAAA,EAA9B,OAAM,iBAAA,GAAgB,MAAA,EAAA;AAAA,0BAAA;qCACnB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;wBACAzD,EAKUF,EAAAgE,EAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAO+G;AAAA,wBAAA;0BACd,QACT,MAAkC,CAAA,GAAA9G,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAlCN,EAAkC,QAAA,EAA5B,OAAM,eAAA,GAAc,MAAA,EAAA;AAAA,0BAAA;qCACjB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;;sBAEFzD,EAWUF,EAAAgE,EAAA,GAAA;AAAA,wBAVR,OAAA;AAAA,wBACA,MAAK;AAAA,wBACL,WAAA;AAAA,wBACA,OAAM;AAAA,wBACL,SAAOsG;AAAA,sBAAA;wBAEG,QACT,MAAmC,CAAA,GAAArG,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCN,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,YAEb,EAAA;AAAA,wBAAA;;;;oBAIFA,EAgBM,OAhBNsJ,IAgBM;AAAA,sBAfJhJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAMM,OANNuJ,IAMM;AAAA,0CALJvJ,EAGM,OAAA,EAHD,OAAM,mBAAe;AAAA,0BACxBA,EAAiB,cAAX,MAAI;AAAA,0BACVA,EAAyC,QAAA,EAAnC,OAAM,eAAA,GAAe,SAAO;AAAA,wBAAA;wBAEpCzD,EAAoCF,EAAA2L,EAAA,GAAA;AAAA,0BAAnB,OAAOzC,EAAA;AAAA,qEAAAA,EAAQ,QAAAvC;AAAA,wBAAA;;sBAElChD,EAMM,OANNwJ,IAMM;AAAA,0CALJxJ,EAGM,OAAA,EAHD,OAAM,mBAAe;AAAA,0BACxBA,EAAiB,cAAX,MAAI;AAAA,0BACVA,EAA2C,QAAA,EAArC,OAAM,eAAA,GAAe,WAAS;AAAA,wBAAA;wBAEtCzD,EAAyCF,EAAA2L,EAAA,GAAA;AAAA,0BAAxB,OAAOxC,EAAA;AAAA,qEAAAA,EAAa,QAAAxC;AAAA,wBAAA;;;oBAKzChD,EAaM,OAbNyJ,IAaM;AAAA,sBAZJnJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHN0J,IAGM;AAAA,wBAFJpJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAiB,cAAX,QAAI,EAAA;AAAA,wBACVzD,EAA4CF,EAAA2L,EAAA,GAAA;AAAA,0BAA3B,OAAOvC,EAAA;AAAA,qEAAAA,EAAgB,QAAAzC;AAAA,wBAAA;;sBAE/ByC,EAAA,SAAXxI,EAAA,GAAA8C,EAMM,OANN4J,IAMM;AAAA,wBALJpN,EAIEF,EAAAuN,EAAA,GAAA;AAAA,0BAHQ,OAAOlE,EAAA;AAAA,qEAAAA,EAAa,QAAA1C;AAAA,0BAC5B,aAAY;AAAA,0BACZ,MAAK;AAAA,wBAAA;;;oBAMXhD,EA4BM,OA5BN6J,IA4BM;AAAA,sBA3BJvJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAyBM,OAzBN8J,IAyBM;AAAA,wBAxBJ9J,EAGM,OAHN+J,IAGM;AAAA,0BAFJzJ,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAmC,QAAA,EAA7B,OAAM,aAAA,GAAa,OAAG,EAAA;AAAA,0BAC5BA,EAAwD,QAAxDgK,IAAwDnJ,EAA5BmF,EAAA,MAAW,OAAO,GAAA,CAAA;AAAA,wBAAA;wBAEhDhG,EAGM,OAHNiK,IAGM;AAAA,0BAFJ3J,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAoC,QAAA,EAA9B,OAAM,aAAA,GAAa,QAAI,EAAA;AAAA,0BAC7BA,EAAmD,QAAnDkK,IAAmDrJ,EAAvBmF,EAAA,MAAW,EAAE,GAAA,CAAA;AAAA,wBAAA;wBAE3ChG,EAGM,OAHNmK,IAGM;AAAA,0BAFJ7J,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,QAAA,EAA/B,OAAM,aAAA,GAAa,SAAK,EAAA;AAAA,0BAC9BA,EAA2D,QAA3DoK,IAA2DvJ,EAA/BmF,EAAA,MAAW,UAAU,GAAA,CAAA;AAAA,wBAAA;wBAEnDhG,EAGM,OAHNqK,IAGM;AAAA,0BAFJ/J,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAqC,QAAA,EAA/B,OAAM,aAAA,GAAa,SAAK,EAAA;AAAA,0BAC9BA,EAA2D,QAA3DsK,IAA2DzJ,EAA/BmF,EAAA,MAAW,UAAU,GAAA,CAAA;AAAA,wBAAA;wBAEnDhG,EAGM,OAHNuK,IAGM;AAAA,0BAFJjK,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAkC,QAAA,EAA5B,OAAM,aAAA,GAAa,MAAE,EAAA;AAAA,0BAC3BA,EAAyD,QAAzDwK,IAAyD3J,EAA7BmF,EAAA,MAAW,QAAQ,GAAA,CAAA;AAAA,wBAAA;wBAEjDhG,EAGM,OAHNyK,IAGM;AAAA,0BAFJnK,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAN,EAAkC,QAAA,EAA5B,OAAM,aAAA,GAAa,MAAE,EAAA;AAAA,0BAC3BA,EAAyD,QAAzD0K,IAAyD7J,EAA7BmF,EAAA,MAAW,QAAQ,GAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjQ/D,UAAMzL,IAAMD,EAAA,GACNqQ,IAAc,EAAE,GAAGlQ,IAAsB,GAAGF,EAAI,MAAA;2BAxEpDwF,EAsCM,OAAA;AAAA,MArCJ,UAAM,cAAY;AAAA,iCACwBpE,EAAA;AAAA,kCAA4CA,EAAA,YAAO;AAAA,MAAA;;MAK7FqE,EAqBM,OArBNC,IAqBM;AAAA,wBApBJD,EAAoC,OAAA,EAA/B,OAAM,mBAAA,GAAkB,MAAA,EAAA;AAAA,QAErB2K,EAAY,aAAQ,WAAgBA,EAAY,gBADxD5K,EAUE,SAAA;AAAA;UARC,KAAK4K,EAAY;AAAA,UACjB,OAAOhP,EAAA;AAAA,UACP,QAAQA,EAAA;AAAA,UACT,UAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA;AAAA,UACA,aAAA;AAAA,UACA,OAAM;AAAA,QAAA,mBAGKgP,EAAY,gBADzB5K,EAOE,OAAA;AAAA;UALC,KAAK4K,EAAY;AAAA,UACjB,OAAOhP,EAAA;AAAA,UACP,QAAQA,EAAA;AAAA,UACT,OAAM;AAAA,UACN,KAAI;AAAA,QAAA;;MAGQA,EAAA,aAAaA,EAAA,kBAA7BoE,EAQW+C,GAAA,EAAA,KAAA,EAAA,GAAA;AAAA,QAPT9C,EAKM,OALNU,IAKM;AAAA,UAJJV,EAA6D,QAA7D6C,IAA6DhC,EAA1B8J,EAAY,IAAI,GAAA,CAAA;AAAA,UACvCA,EAAY,YAAxB1N,EAAA,GAAA8C,EAES,QAFTY,IAESE,EADP8J,EAAY,QAAQ,GAAA,CAAA;;QAGbhP,EAAA,eAAXsB,EAAA,GAAA8C,EAA0D,OAA1Da,EAA0D;;;;;;;;;;;;;;;;ACGhE,UAAMhF,IAAOC,GAIPtB,IAAMD,EAAA;sBA3CV2C,EAAA,GAAA8C,EAuBM,OAvBNE,IAuBM;AAAA,cAtBJF,EAqBM+C,GAAA,MAAAC,EApBWpH,EAAA,OAAK,CAAbqC,YADT+B,EAqBM,OAAA;AAAA,QAnBH,KAAK/B,EAAK;AAAA,QACX,UAAM,mBAAiB,EAAA,2BACcrC,aAAWqC,EAAK,KAAA,CAAI,CAAA;AAAA,QACxD,SAAK,CAAAgF,MAAEpH,EAAI,SAAUoC,CAAI;AAAA,MAAA;QAE1BgC,EAUM,OAVNS,IAUM;AAAA,UAPIpE,EAAA9B,CAAA,EAAI,iBAAiByD,EAAK,MAAM,aAFxC5B,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;YAErB,MAAMyD,EAAK,KAAK;AAAA,YAChB,MAAM;AAAA,UAAA,+BAET+B,EAEO,QAFPW,IAEOG,EADF7C,EAAK,MAAM,OAAO,OAAM,CAAA,KAAA,GAAA,GAAA,CAAA;AAAA,QAAA;QAG/BgC,EAEM,OAFN6C,IAEMhC,EADD7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;;;;;ACuE3B,UAAMpC,IAAOC,GAIPtB,IAAMD,EAAA,GACNkG,IAAQ,EAAE,GAAG/F,IAAsB,GAAGF,EAAI,MAAA;2BAjG9C6B,EAuEaW,GAAA,EAvED,MAAK,gBAAY;AAAA,iBAC3B,MAqEM;AAAA,QApEEpB,EAAA,QAAQA,EAAA,iBADhBoE,EAqEM,OAAA;AAAA;UAnEJ,UAAM,iBAAe,CACZ1D,KAAI,OAAO,QAAK,eAAA,aAAA,CAAA,CAAA;AAAA,QAAA;UAGzB2D,EAOM,OAPNC,IAOM;AAAA,YANJD,EAKM,OALNI,IAKM;AAAA,cAJJJ,EAAgE,QAAhES,IAAgEI,EAApBL,EAAM,IAAI,GAAA,CAAA;AAAA,cACtDR,EAES,QAFTU,IAESG,EADPL,EAAM,QAAQ,GAAA,CAAA;AAAA,YAAA;;UAMpBR,EAoDM,OApDN6C,IAoDM;AAAA,aAnDJ5F,EAAA,EAAA,GAAA8C,EAkDW+C,GAAA,MAAAC,EAlDepH,EAAA,SAAS,WAAlB2C;cAAkC,KAAAA,EAAM;AAAA,YAAA;cAG/CA,EAAM,YAAYA,EAAM,SAAS,SAAM,KAD/CrB,KAAA8C,EA8BM,OA9BNY,IA8BM;AAAA,gBA1BJX,EAQM,OARNY,IAQM;AAAA,kBALIvE,EAAA9B,CAAA,EAAI,iBAAiB+D,EAAM,MAAM,aAFzClC,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;oBAErB,MAAM+D,EAAM,KAAK;AAAA,oBACjB,MAAM;AAAA,kBAAA;kBAET0B,EAAoC,QAAA,MAAAa,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,gBAAA;iBAE5BrB,EAAA,EAAA,GAAA8C,EAgBM+C,GAAA,MAAAC,EAfezE,EAAM,WAAlBkF,YADTzD,EAgBM,OAAA;AAAA,kBAdH,KAAKyD,EAAS;AAAA,kBACf,UAAM,gDAA8C,EAAA,QAClC7H,aAAW6H,EAAS,IAAI,EAAA,CAAA,CAAA;AAAA,kBACzC,SAAK,CAAAR,MAAEpH,EAAI,SAAU4H,CAAQ;AAAA,gBAAA;kBAItBnH,EAAA9B,CAAA,EAAI,iBAAiBiJ,EAAS,MAAM,aAF5CpH,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;oBAErB,MAAMiJ,EAAS,KAAK;AAAA,oBACpB,MAAM;AAAA,kBAAA;kBAETxD,EAES,QAFTe,IAESF,EADP2C,EAAS,MAAM,KAAK,GAAA,CAAA;AAAA,gBAAA;0BAK1BzD,EAeM,OAAA;AAAA;gBAbJ,UAAM,uBAAqB,EAAA,QACTpE,aAAW2C,EAAM,IAAI,EAAA,CAAA,CAAA;AAAA,gBACtC,SAAK,CAAA0E,MAAEpH,EAAI,SAAU0C,CAAK;AAAA,cAAA;gBAInBjC,EAAA9B,CAAA,EAAI,iBAAiB+D,EAAM,MAAM,aAFzClC,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;kBAErB,MAAM+D,EAAM,KAAK;AAAA,kBACjB,MAAM;AAAA,gBAAA;gBAET0B,EAES,QAFTiD,IAESpC,EADPvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;ACgD/B,UAAM1C,IAAOC,GAIPtB,IAAMD,EAAA,GACNiJ,IAAcrL,EAAI,EAAK;qBAtHXyD,EAAA,MAAM,SAAM,UAA5BoE,EA8FW+C,GAAA,EAAA,KAAA,EAAA,GAAA;AAAA,MA5FT9C,EAcM,OAAA;AAAA,QAbJ,UAAM,oBAAkB;AAAA,UACL3D,EAAA9B,CAAA,EAAI,OAAO,QAAK,eAAA;AAAA,qBAAqDgJ,EAAA,MAAA;AAAA,QAAW;QAIlG,SAAKjD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAEO,EAAA,QAAW,CAAIA,EAAA;AAAA,MAAA;QAEvBvD,EAKK,KAAA;AAAA,UAJF,OAAKvD,EAAA;AAAA;YAAyC8G,EAAA,QAAW,uBAAA;AAAA,UAAA;;;MAQ9DhH,EA0EaQ,GAAA,EA1ED,MAAK,iBAAa;AAAA,mBAC5B,MAwEM;AAAA,UAvEGwG,EAAA,0BADTxD,EAwEM,OAAA;AAAA;YAtEJ,UAAM,aAAW,CACR1D,KAAI,OAAO,QAAK,eAAA,aAAA,CAAA,CAAA;AAAA,UAAA;YAGzB2D,EAYM,OAZNC,IAYM;AAAA,cAXJD,EAOM,OAPNI,IAOM;AAAA,gBAJI/D,EAAA9B,CAAA,EAAI,iBAAiBoB,cAAY,MAAM,aAF/CS,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;kBAErB,MAAMoB,EAAA,WAAW,KAAK;AAAA,kBACtB,MAAM;AAAA,gBAAA;;cAGXqE,EAES,QAFTS,IAESI,EADPlF,cAAY,MAAM,SAAK,IAAA,GAAA,CAAA;AAAA,YAAA;YAK3BqE,EAkDM,OAlDNU,IAkDM;AAAA,sBAjDJX,EAgDW+C,GAAA,MAAAC,EAhDepH,EAAA,OAAK,CAAd2C;gBAAsB,KAAAA,EAAM;AAAA,cAAA;gBAGnCA,EAAM,YAAYA,EAAM,SAAS,SAAM,KAD/CrB,KAAA8C,EA8BM,OA9BN8C,IA8BM;AAAA,kBA1BJ7C,EAQM,OARNW,IAQM;AAAA,oBALItE,EAAA9B,CAAA,EAAI,iBAAiB+D,EAAM,MAAM,aAFzClC,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;sBAErB,MAAM+D,EAAM,KAAK;AAAA,sBACjB,MAAM;AAAA,oBAAA;oBAET0B,EAAoC,QAAA,MAAAa,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;mBAE5BrB,EAAA,EAAA,GAAA8C,EAgBM+C,GAAA,MAAAC,EAfezE,EAAM,WAAlBkF,YADTzD,EAgBM,OAAA;AAAA,oBAdH,KAAKyD,EAAS;AAAA,oBACf,UAAM,mBAAiB,EAAA,QACL7H,aAAW6H,EAAS,IAAI,EAAA,CAAA,CAAA;AAAA,oBACzC,SAAK,CAAAR,MAAEpH,EAAI,SAAU4H,CAAQ;AAAA,kBAAA;oBAItBnH,EAAA9B,CAAA,EAAI,iBAAiBiJ,EAAS,MAAM,aAF5CpH,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;sBAErB,MAAMiJ,EAAS,KAAK;AAAA,sBACpB,MAAM;AAAA,oBAAA;oBAETxD,EAES,QAFTc,IAESD,EADP2C,EAAS,MAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;4BAK1BzD,EAaM,OAAA;AAAA;kBAXJ,UAAM,mBAAiB,EAAA,QACLpE,aAAW2C,EAAM,IAAI,EAAA,CAAA,CAAA;AAAA,kBACtC,SAAK,CAAA0E,MAAEpH,EAAI,SAAU0C,CAAK;AAAA,gBAAA;kBAInBjC,EAAA9B,CAAA,EAAI,iBAAiB+D,EAAM,MAAM,aAFzClC,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;oBAErB,MAAM+D,EAAM,KAAK;AAAA,oBACjB,MAAM;AAAA,kBAAA;kBAET0B,EAAiE,QAAjEiB,IAAiEJ,EAA3BvC,EAAM,MAAM,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;ACsBrE,UAAM/D,IAAMD,EAAA,GACN6C,IAASC,GAAA,GAGTwN,IAAWpQ,GAAuBH,IAAoB;AAAA,MAC1D,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,WAAW,MAAM;AAAA,MAAC;AAAA,MAClB,MAAM,MAAM;AAAA,MAAC;AAAA,IAAA,CACd,GAEKwQ,IAAW,CAAC7M,MAAsB;AACtC,MAAIA,EAAK,SACPb,EAAO,KAAKa,EAAK,IAAI,GACrB4M,EAAS,KAAA;AAAA,IAEb;2BA7HE7K,EAwFM,OAAA;AAAA,MAvFJ,UAAM,eAAa;AAAA,QACF1D,EAAA9B,CAAA,EAAI,OAAO,QAAK,eAAA;AAAA,mBAAmDoB,EAAA,KAAA;AAAA,MAAI;MAIvF,cAAU2E,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAE3G,EAAAuO,CAAA,EAAS,KAAA;AAAA,MACrB,cAAUtK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAE3G,EAAAuO,CAAA,EAAS,UAAA;AAAA,IAAS;sBAE/B5K,EAWM,OAAA,EAXD,OAAM,yBAAqB;AAAA,QAC9BA,EASM,OAAA,EATD,OAAM,wBAAoB;AAAA,UAE7BA,EAKO,QAAA,EALD,OAAM,eAAW;AAAA,YACrBA,EAAa,MAAA;AAAA,YACbA,EAAa,MAAA;AAAA,YACbA,EAAa,MAAA;AAAA,YACbA,EAAa,MAAA;AAAA,UAAA;UAEfA,EAAiB,cAAX,MAAI;AAAA,QAAA;;MAIdA,EAiEM,OAjENC,IAiEM;AAAA,QAhEJD,EA+DM,OA/DNI,IA+DM;AAAA,kBA9DJL,EA6DM+C,GAAA,MAAAC,EA5DepH,EAAA,OAAK,CAAjBqI,YADTjE,EA6DM,OAAA;AAAA,YA3DH,KAAKiE,EAAS;AAAA,YACf,OAAM;AAAA,UAAA;YAENhE,EAQM,OAAA;AAAA,cARD,OAAM;AAAA,cAAgC,SAAK,CAAAgD,MAAE6H,EAAS7G,CAAQ;AAAA,YAAA;cAGzD3H,EAAA9B,CAAA,EAAI,iBAAiByJ,EAAS,MAAM,aAF5C5H,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;gBAErB,MAAMyJ,EAAS,KAAK;AAAA,gBACpB,MAAM;AAAA,cAAA;cAEThE,EAAuC,QAAA,MAAAa,EAA9BmD,EAAS,MAAM,KAAK,GAAA,CAAA;AAAA,YAAA;YAIvBA,EAAS,YAAYA,EAAS,SAAS,SAAM,KADrD/G,KAAA8C,EA6CM,OA7CNW,IA6CM;AAAA,eAzCJzD,EAAA,EAAA,GAAA8C,EAaM+C,GAAA,MAAAC,EAZWiB,EAAS,WAAjBhG,YADT+B,EAaM,OAAA;AAAA,gBAXH,KAAK/B,EAAK;AAAA,gBACX,OAAM;AAAA,gBACL,SAAK,CAAAgF,MAAE6H,EAAS7M,CAAI;AAAA,cAAA;gBAIb3B,EAAA9B,CAAA,EAAI,iBAAiByD,EAAK,MAAM,aAFxC5B,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;kBAErB,MAAMyD,EAAK,KAAK;AAAA,kBAChB,MAAM;AAAA,gBAAA;gBAETgC,EAAkE,QAAlEW,IAAkEE,EAA1B7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,cAAA;eAG1Df,EAAA,EAAA,GAAA8C,EAyBW+C,GAAA,MAAAC,EAzBciB,EAAS,WAAjBhG;gBAAiC,KAAAA,EAAK;AAAA,cAAA;gBAE7CA,EAAK,YAAYA,EAAK,SAAS,SAAM,KAD7Cf,KAAA8C,EAuBM,OAvBNa,IAuBM;AAAA,kBAnBJZ,EAEM,OAFNc,IAEMD,EADD7C,EAAK,MAAM,KAAK,GAAA,CAAA;AAAA,mBAErBf,EAAA,EAAA,GAAA8C,EAeM+C,GAAA,MAAAC,EAdc/E,EAAK,WAAhBiG,YADTlE,EAeM,OAAA;AAAA,oBAbH,KAAKkE,EAAQ;AAAA,oBACd,OAAM;AAAA,oBACL,SAAK,CAAAjB,MAAE6H,EAAS5G,CAAO;AAAA,kBAAA;oBAIhB5H,EAAA9B,CAAA,EAAI,iBAAiB0J,EAAQ,MAAM,aAF3C7H,EAKEc,EAJKb,EAAA9B,CAAA,EAAI,aAAa,GAAA;AAAA;sBAErB,MAAM0J,EAAQ,KAAK;AAAA,sBACnB,MAAM;AAAA,oBAAA;oBAETjE,EAES,QAFTiB,IAESJ,EADPoD,EAAQ,MAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;;;;;;;;;;;;;;;;AChDvC,UAAM2G,IAAWpQ,GAAuBH,IAAoB;AAAA,MAC1D,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,WAAW,MAAM;AAAA,MAAC;AAAA,MAClB,MAAM,MAAM;AAAA,MAAC;AAAA,IAAA,CACd;2BAlCC0F,EAaM,OAAA;AAAA,MAZJ,OAAM;AAAA,MACL,cAAUO,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAE3G,EAAAuO,CAAA,EAAS,KAAA;AAAA,MACrB,cAAUtK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAA0C,MAAE3G,EAAAuO,CAAA,EAAS,UAAA;AAAA,IAAS;MAE/B5K,EAOM,OAAA,EAPD,OAAM,6BAAyB;AAAA,QAElCA,EAIO,QAAA,EAJD,OAAM,oBAAgB;AAAA,UAC1BA,EAAa,MAAA;AAAA,UACbA,EAAa,MAAA;AAAA,UACbA,EAAa,MAAA;AAAA,QAAA;;;;;ACMd,SAAS8K,GAAYC,GAAWnT,IAAgC,IAAI;AAEzE,QAAMuM,IAAgBxM,GAAoBC,CAAO;AAGjD,SAAAuM,EAAA,EAAgB,iBAAA,GAETA;AACT;"}
|