@robot-admin/layout 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +588 -0
- package/dist/index.js +2160 -430
- package/dist/index.js.map +1 -1
- package/package.json +76 -72
- package/src/styles/layouts.scss +662 -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":";;;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,EAAYC,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,EAAoBC,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,EAAYe,EAAa,OAAO,EAAE;AAAA,MAAA,GAEpCwB,EAAK,MAAM;AAAA,QACT;AAAA,QACAvC,EAAYe,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,EAAA,GCrQnByC,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;;;;;;;;;;;;;;;;;;;ACiSA,UAAMC,IAAUC,GAAA,GACVC,IAASC,GAAA,GACTC,IAAgBN,GAAA,GAChBO,IAAUC,GAAoBC,GAAC,MAA0B,GACzDC,IAAY3C,EAAI,YAAY,GAG5B4C,IAAW5C,EAAI,EAAK,GACpB6C,IAAgB7C,EAAI,EAAK,GACzB8C,IAAmB9C,EAAI,EAAK,GAC5B+C,IAAgB/C,EAAI,aAAa;AAGvC,QAAIgD,IAAkC;AAGtC,UAAMC,IAAkB,CAACC,MAAiB;AAExC,MAAIF,MACF,SAAS,KAAK,YAAYA,CAAW,GACrCA,IAAc;AAIhB,YAAMG,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAMD,EAAO,WAAW,IAAI;AAClC,MAAAA,EAAO,QAAQ,KACfA,EAAO,SAAS,KAEhBC,EAAI,OAAO,2BACXA,EAAI,YAAY,6BAChBA,EAAI,OAAQ,MAAM,KAAK,KAAM,GAAG,GAChCA,EAAI,SAASF,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,GAGMK,IAAkB,MAAM;AAC5B,MAAIL,MACF,SAAS,KAAK,YAAYA,CAAW,GACrCA,IAAc;AAAA,IAElB;AAGA,IAAAhB,EAAMY,GAAU,CAACU,MAAQ;AACvB,eAAS,gBAAgB,UAAU,OAAO,aAAaA,CAAG;AAAA,IAC5D,CAAC,GAGDtB,EAAMa,GAAe,CAACS,MAAQ;AAC5B,eAAS,gBAAgB,UAAU,OAAO,mBAAmBA,CAAG;AAAA,IAClE,CAAC,GAGDtB,EAAMc,GAAkB,CAACQ,MAAQ;AAC/B,MAAIA,IACFL,EAAgBF,EAAc,KAAK,IAEnCM,EAAA;AAAA,IAEJ,CAAC,GAGDrB,EAAMe,GAAe,CAACO,MAAQ;AAC5B,MAAIR,EAAiB,SACnBG,EAAgBK,CAAG;AAAA,IAEvB,CAAC;AAGD,UAAMC,IAAanC,EAAS,MAAM;AAChC,YAAMoC,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,IAAAC,GAAY,MAAM;AAChB,MAAAN,EAAA;AAAA,IACF,CAAC;AAGD,UAAMO,IAAqB,CAACC,GAAeC,MAAuB;AAChE,MAAIA,MACJvB,EAAc,aAAasB;AAAA,IAC7B,GAOME,IAAkB,CAACpC,MAChBY,EAAc,iBAAiBZ,EAAO,cAMzCqC,IAAoB,CAACrC,MAAwB;AACjD,MAAAY,EAAc,YAAYZ,CAAM,GAChCQ,EAAQ,QAAQ,OAAOR,EAAO,IAAI,OAAO;AAAA,IAC3C,GAKMsC,IAAwB,MAAM;AAClC,MAAA1B,EAAc,YAAYxD,EAAiB,WAC3CwD,EAAc,eAAexD,EAAiB,cAC9CwD,EAAc,eAAexD,EAAiB,cAC9CwD,EAAc,iBAAiBxD,EAAiB,gBAChDwD,EAAc,mBAAmBxD,EAAiB,kBAClDoD,EAAQ,QAAQ,WAAW;AAAA,IAC7B,GAKM+B,IAAoB,MAAM;AAC9B,MAAA3B,EAAc,aAAaxD,EAAiB,YAC5CwD,EAAc,cAAcxD,EAAiB,aAC7CwD,EAAc,iBAAiBxD,EAAiB,gBAChDwD,EAAc,qBAAqBxD,EAAiB,oBACpDwD,EAAc,eAAexD,EAAiB,cAC9CwD,EAAc,iBAAiBxD,EAAiB,gBAChDwD,EAAc,gBAAgBxD,EAAiB,eAC/CwD,EAAc,aAAaxD,EAAiB,YAC5CwD,EAAc,eAAexD,EAAiB,cAC9CwD,EAAc,wBAAwBxD,EAAiB,uBACvDwD,EAAc,eAAexD,EAAiB,cAC9CoD,EAAQ,QAAQ,WAAW;AAAA,IAC7B,GAKMgC,IAAc,MAAM;AACxB,MAAA9B,EAAO,QAAQ;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,iBAAiB,MAAM;AACrB,UAAAE,EAAc,cAAA,GACdJ,EAAQ,QAAQ,SAAS;AAAA,QAC3B;AAAA,MAAA,CACD;AAAA,IACH,GAKMiC,IAAmB,MAAM;AAC7B,MAAA/B,EAAO,QAAQ;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,QACT,cAAc;AAAA,QACd,cAAc;AAAA,QACd,iBAAiB,MAAM;AAErB,gBAAMgC,IAAa,CAAC,cAAc,sBAAsB;AAExD,UADgB,OAAO,KAAK,YAAY,EAChC,QAAQ,CAACC,MAAQ;AACvB,YAAKD,EAAW,SAASC,CAAG,KAC1B,aAAa,WAAWA,CAAG;AAAA,UAE/B,CAAC,GAED,eAAe,MAAA,GACfnC,EAAQ,QAAQ,OAAO;AAAA,QACzB;AAAA,MAAA,CACD;AAAA,IACH,GAKMoC,IAAe,MAAM;AACzB,eAAS,OAAA;AAAA,IACX,GAKMC,IAAqB,MAAM;AAC/B,YAAMC,IAAS;AAAA,QACb,UAAUlC,EAAc;AAAA,QACxB,MAAMK,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/B2B,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,GACvBxC,EAAQ,QAAQ,OAAO;AAAA,IACzB,GAKM0C,IAAqB,MAAM;AAC/B,YAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,MAAAA,EAAM,OAAO,QACbA,EAAM,SAAS,oBACfA,EAAM,WAAW,OAAO,MAAa;AACnC,cAAMC,IAAQ,EAAE,OAA4B,QAAQ,CAAC;AACrD,YAAKA;AAEL,cAAI;AACF,kBAAM7B,IAAO,MAAM6B,EAAK,KAAA,GAClBN,IAAS,KAAK,MAAMvB,CAAI;AAG9B,YAAIuB,EAAO,YACTlC,EAAc,OAAOkC,EAAO,QAAQ,GAElCA,EAAO,SAAS,WAClB7B,EAAS,QAAQ6B,EAAO,OAEtBA,EAAO,cAAc,WACvB5B,EAAc,QAAQ4B,EAAO,YAE3BA,EAAO,cACT3B,EAAiB,QAAQ2B,EAAO,UAAU,SAC1C1B,EAAc,QAAQ0B,EAAO,UAAU,OAGzCtC,EAAQ,QAAQ,OAAO;AAAA,UACzB,QAAgB;AACd,YAAAA,EAAQ,MAAM,UAAU;AAAA,UAC1B;AAAA,MACF,GACA2C,EAAM,MAAA;AAAA,IACR;2BAtoBEE,GAgVUC,EAAAC,EAAA,GAAA;AAAA,MA/UA,MAAM1C,EAAA;AAAA,gDAAAA,EAAO,QAAA2C;AAAA,MACpB,OAAO;AAAA,MACR,WAAU;AAAA,MACT,cAAY;AAAA,MACZ,gBAAc;AAAA,IAAA;iBAEf,MAwUiB;AAAA,QAxUjBC,EAwUiBH,EAAAI,EAAA,GAAA;AAAA,UAxUD,OAAM;AAAA,UAAU,UAAA;AAAA,QAAA;qBAC9B,MAsUQ;AAAA,YAtURD,EAsUQH,EAAAK,EAAA,GAAA;AAAA,cAtUO,OAAO3C,EAAA;AAAA,yDAAAA,EAAS,QAAAwC;AAAA,cAAE,UAAA;AAAA,cAAS,OAAM;AAAA,YAAA;yBAE9C,MAoGW;AAAA,gBApGXC,EAoGWH,EAAAM,CAAA,GAAA;AAAA,kBApGD,MAAK;AAAA,kBAAa,KAAI;AAAA,gBAAA;6BAE9B,MAmBM;AAAA,oBAnBNC,EAmBM,OAnBNC,IAmBM;AAAA,sBAlBJD,EAiBM,OAjBNE,IAiBM;AAAA,gCAhBJC,EAeMC,GAAA,MAAAC,EAdaZ,EAAAtG,EAAA,GAAa,CAAvBgD,YADTgE,EAeM,OAAA;AAAA,0BAbH,KAAKhE,EAAO;AAAA,0BACb,OAAKmE,EAAA,CAAC,eAAa,EAAA,QACD/B,EAAgBpC,CAAM,EAAA,CAAA,CAAA;AAAA,0BACvC,SAAK,CAAAwD,MAAEnB,EAAkBrC,CAAM;AAAA,wBAAA;0BAEhC6D,EAAgD,OAAhDO,IAAgDC,EAApBrE,EAAO,IAAI,GAAA,CAAA;AAAA,0BACvC6D,EAAgD,OAAhDS,IAAgDD,EAApBrE,EAAO,IAAI,GAAA,CAAA;AAAA,0BACvC6D,EAKM,OALNU,IAKM;AAAA,4BAJJV,EAGQ,QAAA;AAAA,8BAFN,OAAM;AAAA,8BACL,OAAKW,GAAA,EAAA,iBAAqBxE,EAAO,cAAY;AAAA,4BAAA;;;;;oBAQxD6D,EAmBM,OAnBNY,IAmBM;AAAA,sBAlBJC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BJ,EAgBcH,EAAAqB,CAAA,GAAA;AAAA,wBAfJ,OAAOrB,EAAA1C,CAAA,EAAc;AAAA,wBAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,YAAS4C;AAAA,wBACtC,OAAM;AAAA,sBAAA;mCAEN,MAGe;AAAA,0BAHfC,EAGeH,EAAAsB,CAAA,GAAA,EAHD,OAAM,WAAO;AAAA,uCACzB,MAAoD,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAApDb,EAAoD,QAAA,EAA9C,OAAM,iCAAA,GAAgC,MAAA,EAAA;AAAA,gCAAQ,QAEtD,EAAA;AAAA,4BAAA;;;0BACAJ,EAGeH,EAAAsB,CAAA,GAAA,EAHD,OAAM,UAAM;AAAA,uCACxB,MAAqD,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAArDb,EAAqD,QAAA,EAA/C,OAAM,kCAAA,GAAiC,MAAA,EAAA;AAAA,gCAAQ,QAEvD,EAAA;AAAA,4BAAA;;;0BACAJ,EAGeH,EAAAsB,CAAA,GAAA,EAHD,OAAM,UAAM;AAAA,uCACxB,MAAiD,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,8BAAjDb,EAAiD,QAAA,EAA3C,OAAM,8BAAA,GAA6B,MAAA,EAAA;AAAA,gCAAQ,QAEnD,EAAA;AAAA,4BAAA;;;;;;;oBAKJA,EAWM,OAXNgB,IAWM;AAAA,sBAVJH,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAoC,OAAA,EAA/B,OAAM,gBAAA,GAAgB,OAAG,EAAA;AAAA,sBAC9BA,EAQM,OARNiB,IAQM;AAAA,wBAPJrB,EAKEH,EAAAyB,EAAA,GAAA;AAAA,0BAJQ,OAAOzB,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,eAAY4C;AAAA,0BACxC,cAAY;AAAA,0BACZ,UAAUF,EAAAjG,EAAA;AAAA,0BACV,SAAS,CAAA,SAAA;AAAA,wBAAA;wBAEZwG,EAAiE,QAAjEmB,IAAiEX,EAApCf,EAAA1C,CAAA,EAAc,YAAY,GAAA,CAAA;AAAA,sBAAA;;oBAK3DiD,EAUM,OAVNoB,IAUM;AAAA,sBATJP,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BJ,EAOcH,EAAAqB,CAAA,GAAA;AAAA,wBANJ,OAAOrB,EAAA1C,CAAA,EAAc;AAAA,wBAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,eAAY4C;AAAA,wBACzC,OAAM;AAAA,sBAAA;mCAEN,MAAkD;AAAA,0BAAlDC,EAAkDH,EAAAsB,CAAA,GAAA,EAApC,OAAM,WAAO;AAAA,uCAAC,MAAO,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;0BACnCjB,EAAmDH,EAAAsB,CAAA,GAAA,EAArC,OAAM,YAAQ;AAAA,uCAAC,MAAO,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;0BACpCjB,EAAkDH,EAAAsB,CAAA,GAAA,EAApC,OAAM,WAAO;AAAA,uCAAC,MAAO,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAP,WAAO,EAAA;AAAA,4BAAA;;;;;;;oBAKvCb,EAgBM,OAhBNqB,IAgBM;AAAA,sBAfJR,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHNsB,IAGM;AAAA,wBAFJT,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAiC,QAAA,EAA3B,OAAM,UAAA,GAAU,QAAI,EAAA;AAAA,wBAC1BJ,EAA0DH,EAAA8B,CAAA,GAAA;AAAA,0BAAzC,OAAO9B,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,mBAAgB4C;AAAA,wBAAA;;sBAExDC,EAScH,EAAAqB,CAAA,GAAA;AAAA,wBARJ,OAAOrB,EAAA1C,CAAA,EAAc;AAAA,wBAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,iBAAc4C;AAAA,wBAC1C,UAAQ,CAAGF,EAAA1C,CAAA,EAAc;AAAA,wBAC1B,OAAM;AAAA,sBAAA;mCAEN,MAA4C;AAAA,0BAA5C6C,EAA4CH,EAAAsB,CAAA,GAAA,EAA9B,OAAM,UAAM;AAAA,uCAAC,MAAE,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC7BjB,EAA6CH,EAAAsB,CAAA,GAAA,EAA/B,OAAM,WAAO;AAAA,uCAAC,MAAE,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC9BjB,EAA4CH,EAAAsB,CAAA,GAAA,EAA9B,OAAM,UAAM;AAAA,uCAAC,MAAE,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAF,MAAE,EAAA;AAAA,4BAAA;;;0BAC7BjB,EAA2CH,EAAAsB,CAAA,GAAA,EAA7B,OAAM,UAAM;AAAA,uCAAC,MAAC,CAAA,GAAAF,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,gCAAD,KAAC,EAAA;AAAA,4BAAA;;;;;;;oBAKhCb,EAOM,OAPNwB,IAOM;AAAA,sBANJ5B,EAKUH,EAAAgC,CAAA,GAAA;AAAA,wBALD,OAAA;AAAA,wBAAM,WAAA;AAAA,wBAAW,SAAOhD;AAAA,sBAAA;wBACpB,QACT,MAAmC,CAAA,GAAAoC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCb,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,cAEb,EAAA;AAAA,wBAAA;;;;;;;gBAKJJ,EAqGWH,EAAAM,CAAA,GAAA;AAAA,kBArGD,MAAK;AAAA,kBAAS,KAAI;AAAA,gBAAA;6BAE1B,MA6BM;AAAA,oBA7BNC,EA6BM,OA7BN0B,IA6BM;AAAA,sBA5BJb,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EA0BM,OA1BN2B,IA0BM;AAAA,gCAzBJxB,EAwBMC,GAAA,MAAAC,EAvBWZ,EAAA/C,EAAA,GAAmB,CAA3BJ,YADT6D,EAwBM,OAAA;AAAA,0BAtBH,KAAK7D,EAAK;AAAA,0BACX,UAAM,eAAa;AAAA,4BACkB,QAAAmD,EAAA1C,CAAA,EAAc,eAAeT,EAAK;AAAA,4BAAoC,UAAAA,EAAK;AAAA,0BAAA;0BAI/G,SAAKsF,GAAA,CAAAjC,MAAOvB,EAAmB9B,EAAK,OAAOA,EAAK,QAAQ,GAAA,CAAA,MAAA,CAAA;AAAA,wBAAA;0BAEzD0D,EASM,OATN6B,IASM;AAAA,6BARJC,KAAA3B,EAOM,OAPN4B,IAOM;AAAA,8BADJ/B,EAAyB,KAAA;AAAA,gCAAtB,WAAQ1D,EAAK;AAAA,8BAAA;;;0BAGpB0D,EAGM,OAHNgC,IAGM;AAAA,gCAFD1F,EAAK,KAAK,IAAG,KAChB,CAAA;AAAA,4BAAYA,EAAK,iBAAjB6D,EAAyD,QAAzD8B,IAA8C,MAAI;;;;;oBAO1DjC,EAqBM,OArBNkC,IAqBM;AAAA,sBApBJrB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHNmC,IAGM;AAAA,wBAFJtB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAkB,cAAZ,SAAK,EAAA;AAAA,wBACXJ,EAAwDH,EAAA8B,CAAA,GAAA;AAAA,0BAAvC,OAAO9B,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,iBAAc4C;AAAA,wBAAA;;sBAEtDK,EAMM,OANNoC,IAMM;AAAA,wBALJvB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAoB,cAAd,WAAO,EAAA;AAAA,wBACbJ,EAGEH,EAAA8B,CAAA,GAAA;AAAA,0BAFQ,OAAO9B,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,qBAAkB4C;AAAA,0BAC9C,UAAQ,CAAGF,EAAA1C,CAAA,EAAc;AAAA,wBAAA;;sBAG9BiD,EAGM,OAHNqC,IAGM;AAAA,wBAFJxB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAkB,cAAZ,SAAK,EAAA;AAAA,wBACXJ,EAAsDH,EAAA8B,CAAA,GAAA;AAAA,0BAArC,OAAO9B,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,eAAY4C;AAAA,wBAAA;;sBAEpDK,EAGM,OAHNsC,IAGM;AAAA,wBAFJzB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAiB,cAAX,QAAI,EAAA;AAAA,wBACVJ,EAAoDH,EAAA8B,CAAA,GAAA;AAAA,0BAAnC,OAAO9B,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,aAAU4C;AAAA,wBAAA;;;oBAKpDK,EAgCM,OAhCNuC,IAgCM;AAAA,sBA/BJ1B,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAcM,OAdNwC,IAcM;AAAA,wBAbJxC,EAKM,OALNyC,IAKM;AAAA,0BAJJ5B,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAkB,cAAZ,SAAK,EAAA;AAAA,0BACXA,EAC8D,QAD9D0C,IAC8DlC,EAAxDf,KAAc,YAAY,IAAG,MAAE,CAAA;AAAA,wBAAA;wBAGvCG,EAMEH,EAAAkD,CAAA,GAAA;AAAA,0BALQ,OAAOlD,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,eAAY4C;AAAA,0BACxC,KAAK;AAAA,0BACL,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO,EAAA,KAAA,OAAA,KAAA,OAAA,KAAA,MAAA;AAAA,wBAAA;;sBAGZK,EAcM,OAdN4C,IAcM;AAAA,wBAbJ5C,EAKM,OALN6C,IAKM;AAAA,0BAJJhC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAiB,cAAX,QAAI,EAAA;AAAA,0BACVA,EAC8D,QAD9D8C,IAC8DtC,EAAxDf,KAAc,YAAY,IAAG,MAAE,CAAA;AAAA,wBAAA;wBAGvCG,EAMEH,EAAAkD,CAAA,GAAA;AAAA,0BALQ,OAAOlD,EAAA1C,CAAA,EAAc;AAAA,0BAAd,kBAAA8D,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA,CAAAlB,MAAAF,EAAA1C,CAAA,EAAc,eAAY4C;AAAA,0BACxC,KAAK;AAAA,0BACL,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO,EAAA,IAAA,MAAA,IAAA,MAAA,IAAA,KAAA;AAAA,wBAAA;;;oBAMdK,EAOM,OAPN+C,IAOM;AAAA,sBANJnD,EAKUH,EAAAgC,CAAA,GAAA;AAAA,wBALD,OAAA;AAAA,wBAAM,WAAA;AAAA,wBAAW,SAAO/C;AAAA,sBAAA;wBACpB,QACT,MAAmC,CAAA,GAAAmC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCb,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,cAEb,EAAA;AAAA,wBAAA;;;;;;;gBAKJJ,EAoHWH,EAAAM,CAAA,GAAA;AAAA,kBApHD,MAAK;AAAA,kBAAW,KAAI;AAAA,gBAAA;6BAE5B,MAgBM;AAAA,oBAhBNC,EAgBM,OAhBNgD,IAgBM;AAAA,sBAfJnC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAaM,OAbNiD,IAaM;AAAA,wBAZJrD,EAKUH,EAAAgC,CAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAO7C;AAAA,wBAAA;0BACd,QACT,MAAwC,CAAA,GAAAiC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAxCb,EAAwC,QAAA,EAAlC,OAAM,qBAAA,GAAoB,MAAA,EAAA;AAAA,0BAAA;qCACvB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;wBACAJ,EAKUH,EAAAgC,CAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAO1C;AAAA,wBAAA;0BACd,QACT,MAAmC,CAAA,GAAA8B,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAnCb,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,0BAAA;qCAClB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;;;oBAKJA,EA4BM,OA5BNkD,IA4BM;AAAA,sBA3BJrC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAaM,OAbNmD,IAaM;AAAA,wBAZJvD,EAKUH,EAAAgC,CAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAOzC;AAAA,wBAAA;0BACd,QACT,MAAoC,CAAA,GAAA6B,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAApCb,EAAoC,QAAA,EAA9B,OAAM,iBAAA,GAAgB,MAAA,EAAA;AAAA,0BAAA;qCACnB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;wBACAJ,EAKUH,EAAAgC,CAAA,GAAA;AAAA,0BALD,WAAA;AAAA,0BAAW,SAAOpC;AAAA,wBAAA;0BACd,QACT,MAAkC,CAAA,GAAAwB,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,4BAAlCb,EAAkC,QAAA,EAA5B,OAAM,eAAA,GAAc,MAAA,EAAA;AAAA,0BAAA;qCACjB,MAEb;AAAA,gDAFa,UAEb,EAAA;AAAA,0BAAA;;;;sBAEFJ,EAWUH,EAAAgC,CAAA,GAAA;AAAA,wBAVR,OAAA;AAAA,wBACA,MAAK;AAAA,wBACL,WAAA;AAAA,wBACA,OAAM;AAAA,wBACL,SAAO9C;AAAA,sBAAA;wBAEG,QACT,MAAmC,CAAA,GAAAkC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAA;AAAA,0BAAnCb,EAAmC,QAAA,EAA7B,OAAM,gBAAA,GAAe,MAAA,EAAA;AAAA,wBAAA;mCAClB,MAEb;AAAA,8CAFa,YAEb,EAAA;AAAA,wBAAA;;;;oBAIFA,EAgBM,OAhBNoD,IAgBM;AAAA,sBAfJvC,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAMM,OANNqD,IAMM;AAAA,0CALJrD,EAGM,OAAA,EAHD,OAAM,mBAAe;AAAA,0BACxBA,EAAiB,cAAX,MAAI;AAAA,0BACVA,EAAyC,QAAA,EAAnC,OAAM,eAAA,GAAe,SAAO;AAAA,wBAAA;wBAEpCJ,EAAoCH,EAAA8B,CAAA,GAAA;AAAA,0BAAnB,OAAOnE,EAAA;AAAA,qEAAAA,EAAQ,QAAAuC;AAAA,wBAAA;;sBAElCK,EAMM,OANNsD,IAMM;AAAA,0CALJtD,EAGM,OAAA,EAHD,OAAM,mBAAe;AAAA,0BACxBA,EAAiB,cAAX,MAAI;AAAA,0BACVA,EAA2C,QAAA,EAArC,OAAM,eAAA,GAAe,WAAS;AAAA,wBAAA;wBAEtCJ,EAAyCH,EAAA8B,CAAA,GAAA;AAAA,0BAAxB,OAAOlE,EAAA;AAAA,qEAAAA,EAAa,QAAAsC;AAAA,wBAAA;;;oBAKzCK,EAaM,OAbNuD,IAaM;AAAA,sBAZJ1C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAGM,OAHNwD,IAGM;AAAA,wBAFJ3C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAiB,cAAX,QAAI,EAAA;AAAA,wBACVJ,EAA4CH,EAAA8B,CAAA,GAAA;AAAA,0BAA3B,OAAOjE,EAAA;AAAA,qEAAAA,EAAgB,QAAAqC;AAAA,wBAAA;;sBAE/BrC,EAAA,SAAXwE,EAAA,GAAA3B,EAMM,OANNsD,IAMM;AAAA,wBALJ7D,EAIEH,EAAAiE,EAAA,GAAA;AAAA,0BAHQ,OAAOnG,EAAA;AAAA,qEAAAA,EAAa,QAAAoC;AAAA,0BAC5B,aAAY;AAAA,0BACZ,MAAK;AAAA,wBAAA;;;oBAMXK,EA4BM,OA5BN2D,IA4BM;AAAA,sBA3BJ9C,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,OAAA,EAAhC,OAAM,gBAAA,GAAgB,QAAI,EAAA;AAAA,sBAC/BA,EAyBM,OAzBN4D,IAyBM;AAAA,wBAxBJ5D,EAGM,OAHN6D,IAGM;AAAA,0BAFJhD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAmC,QAAA,EAA7B,OAAM,aAAA,GAAa,OAAG,EAAA;AAAA,0BAC5BA,EAAwD,QAAxD8D,IAAwDtD,EAA5BzC,EAAA,MAAW,OAAO,GAAA,CAAA;AAAA,wBAAA;wBAEhDiC,EAGM,OAHN+D,IAGM;AAAA,0BAFJlD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAoC,QAAA,EAA9B,OAAM,aAAA,GAAa,QAAI,EAAA;AAAA,0BAC7BA,EAAmD,QAAnDgE,IAAmDxD,EAAvBzC,EAAA,MAAW,EAAE,GAAA,CAAA;AAAA,wBAAA;wBAE3CiC,EAGM,OAHNiE,IAGM;AAAA,0BAFJpD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,QAAA,EAA/B,OAAM,aAAA,GAAa,SAAK,EAAA;AAAA,0BAC9BA,EAA2D,QAA3DkE,IAA2D1D,EAA/BzC,EAAA,MAAW,UAAU,GAAA,CAAA;AAAA,wBAAA;wBAEnDiC,EAGM,OAHNmE,IAGM;AAAA,0BAFJtD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAqC,QAAA,EAA/B,OAAM,aAAA,GAAa,SAAK,EAAA;AAAA,0BAC9BA,EAA2D,QAA3DoE,IAA2D5D,EAA/BzC,EAAA,MAAW,UAAU,GAAA,CAAA;AAAA,wBAAA;wBAEnDiC,EAGM,OAHNqE,IAGM;AAAA,0BAFJxD,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAkC,QAAA,EAA5B,OAAM,aAAA,GAAa,MAAE,EAAA;AAAA,0BAC3BA,EAAyD,QAAzDsE,IAAyD9D,EAA7BzC,EAAA,MAAW,QAAQ,GAAA,CAAA;AAAA,wBAAA;wBAEjDiC,EAGM,OAHNuE,IAGM;AAAA,0BAFJ1D,EAAA,EAAA,MAAAA,EAAA,EAAA,IAAAb,EAAkC,QAAA,EAA5B,OAAM,aAAA,GAAa,MAAE,EAAA;AAAA,0BAC3BA,EAAyD,QAAzDwE,IAAyDhE,EAA7BzC,EAAA,MAAW,QAAQ,GAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;;;;;;;;;AClTxD,SAAS0G,GAAYC,GAAWxK,IAAgC,IAAI;AAEzE,QAAM6C,IAAgB9C,EAAoBC,CAAO;AAGjD,SAAA6C,EAAA,EAAgB,iBAAA,GAETA;AACT;"}
|
|
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 <span class=\"i-mdi:dots-horizontal\" style=\"font-size: 20px\"></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;\r\n const ITEM_MARGIN = 8;\r\n const CHAR_WIDTH = 12;\r\n const ICON_WIDTH = 26;\r\n const EXTRA = 5;\r\n\r\n const title = item.meta?.title || item.name || \"\";\r\n const textWidth = title.length * CHAR_WIDTH;\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.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</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 /** 是否显示悬浮二级菜单(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 // ============ 路径匹配 ============\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 activeFirstMenu.value = item.path || \"\";\r\n\r\n if (toValue(floatingSecondMenu)) {\r\n // MixLayout: toggle 悬浮二级菜单\r\n if (item.children && item.children.length > 0) {\r\n if (showSecondMenu.value && hoveredMenuItem.value?.path === item.path) {\r\n showSecondMenu.value = false;\r\n hoveredMenuItem.value = null;\r\n } else {\r\n hoveredMenuItem.value = item;\r\n showSecondMenu.value = true;\r\n }\r\n } else {\r\n showSecondMenu.value = false;\r\n hoveredMenuItem.value = null;\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 } 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 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 @mouseenter=\"menuSplit.hoveredMenuItem.value = 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 @mouseleave=\"menuSplit.hoveredMenuItem.value = null\"\n >\n <div class=\"second-menu-header\">\n <component\n :is=\"LayoutIcon\"\n v-if=\"menuSplit.hoveredMenuItem.value?.meta?.icon\"\n :name=\"menuSplit.hoveredMenuItem.value.meta.icon\"\n :size=\"20\"\n />\n <span class=\"menu-title\">{{\n menuSplit.hoveredMenuItem.value?.meta?.title\n }}</span>\n </div>\n <div class=\"second-menu-list\">\n <div\n v-for=\"child in menuSplit.hoveredMenuItem.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=\"right-sidebar\"\n :class=\"[\n isDarkMode ? 'dark-theme' : 'light-theme',\n { collapsed: isCollapsed },\n ]\"\n >\n <!-- 折叠按钮 -->\n <div class=\"collapse-trigger\" @click=\"toggleCollapse\">\n <i\n :class=\"[\n 'transition-all duration-300 ease-in-out',\n isCollapsed ? 'i-ri:menu-fold-4-fill' : 'i-ri:menu-fold-3-fill',\n ]\"\n ></i>\n </div>\n\n <!-- 菜单内容 -->\n <div v-show=\"!isCollapsed\" class=\"sidebar-content\">\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 <i class=\"i-ri:menu-3-line\"></i>\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 <i class=\"i-ri:apps-2-line\"></i>\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","<!--\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 <i class=\"i-ri:apps-2-line\"></i>\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</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 <i class=\"i-ri:menu-3-line\"></i>\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</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","textWidth","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","normalizePath","path","isMenuItemActive","menuPath","currentPath","normalizedMenuPath","normalizedCurrentPath","findActiveTopMenu","items","activeFirstMenuItem","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","_withDirectives","_hoisted_17","subChild","_hoisted_19","_hoisted_21","showDrawerMenu","hideTimer","hideDrawerMenu","cancelHideTimer","navigateToPage","category","subItem","_hoisted_18","_hoisted_20","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_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":"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"}
|