@robot-admin/layout 0.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 +635 -0
- package/dist/index.cjs +39 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +427 -0
- package/dist/index.js +888 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
- package/src/styles/settings.scss +380 -0
|
@@ -0,0 +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 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: \"1.0.0\",\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\nfunction 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 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 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 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 // 监听配置变化,同步 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 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 };\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 } from \"../../constants\";\r\nimport type { ThemePreset } from \"../../types\";\r\n\r\n// 颜色快速选择\r\nexport const COLOR_SWATCHES = [\r\n \"#409eff\",\r\n \"#f5222d\",\r\n \"#fa541c\",\r\n \"#faad14\",\r\n \"#52c41a\",\r\n \"#13c2c2\",\r\n \"#2f54eb\",\r\n \"#722ed1\",\r\n];\r\n\r\n// 布局模式选项 - 完整的 6 种布局\r\nexport const LAYOUT_MODES = [\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\r\n// 导出主题预设\r\nexport { THEME_PRESETS };\r\n\r\n// 导出类型\r\nexport type { ThemePreset };\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_MODES\"\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=\"\r\n !mode.disabled && handleLayoutChange($event, mode.value)\r\n \"\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_MODES, THEME_PRESETS } from \"./data\";\r\nimport type { ThemePreset } from \"../../types\";\r\n\r\n// Props\r\ndefineProps<{\r\n storageKey?: string;\r\n}>();\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: \"XIAn\",\r\n };\r\n});\r\n\r\n// 组件卸载时清理水印\r\nonUnmounted(() => {\r\n removeWatermark();\r\n});\r\n\r\n// 处理布局切换 - 阻止抽屉关闭\r\nconst handleLayoutChange = (e: MouseEvent, value: string) => {\r\n e.stopPropagation();\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.showBreadcrumb = DEFAULT_SETTINGS.showBreadcrumb;\r\n settingsStore.showBreadcrumbIcon = DEFAULT_SETTINGS.showBreadcrumbIcon;\r\n settingsStore.showTagsView = DEFAULT_SETTINGS.showTagsView;\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 settingsStore.tagsViewHeight = DEFAULT_SETTINGS.tagsViewHeight;\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 Object.assign(settingsStore, 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","fixedHeader","showBreadcrumb","showBreadcrumbIcon","showTagsView","tagsViewHeight","tagsViewStyle","showFooter","sidebarWidth","sidebarCollapsedWidth","headerHeight","enableHotkeys","version","borderRadiusValue","computed","transitionName","shouldEnableTransition","settingsState","syncCSSVariables","root","applyPreset","preset","resetSettings","updateThemeMode","mode","watch","useSettingsStore","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","e","value","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","_hoisted_18","_openBlock","_hoisted_19","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","NSlider","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","NInput","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","setupLayout","_app"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@robot-admin/layout",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Layout and settings management system for Robot Admin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"vue",
|
|
8
|
+
"layout",
|
|
9
|
+
"settings",
|
|
10
|
+
"pinia",
|
|
11
|
+
"admin"
|
|
12
|
+
],
|
|
13
|
+
"author": "ChenYu <ycyplus@gmail.com>",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/ChenyCHENYU/robot-admin-packages",
|
|
18
|
+
"directory": "packages/layout"
|
|
19
|
+
},
|
|
20
|
+
"main": "./dist/index.cjs",
|
|
21
|
+
"module": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js",
|
|
27
|
+
"require": "./dist/index.cjs"
|
|
28
|
+
},
|
|
29
|
+
"./style.scss": "./src/styles/settings.scss",
|
|
30
|
+
"./style.css": "./dist/index.css"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"src/styles",
|
|
35
|
+
"README.md"
|
|
36
|
+
],
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public",
|
|
39
|
+
"registry": "https://registry.npmjs.org/"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"dev": "vite build --watch",
|
|
43
|
+
"build": "vue-tsc --noEmit && vite build",
|
|
44
|
+
"clean": "rm -rf dist",
|
|
45
|
+
"type-check": "vue-tsc --noEmit",
|
|
46
|
+
"prepublishOnly": "bun run build"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"vue": "^3.4.0",
|
|
50
|
+
"pinia": "^2.0.0 || ^3.0.0",
|
|
51
|
+
"naive-ui": "^2.38.0",
|
|
52
|
+
"@robot-admin/theme": "^0.1.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@robot-admin/theme": "0.1.0",
|
|
56
|
+
"@types/node": "^22.13.9",
|
|
57
|
+
"@vitejs/plugin-vue": "^5.2.1",
|
|
58
|
+
"naive-ui": "^2.41.0",
|
|
59
|
+
"pinia": "^3.0.1",
|
|
60
|
+
"sass": "^1.83.4",
|
|
61
|
+
"typescript": "~5.8.0",
|
|
62
|
+
"vite": "^7.0.0",
|
|
63
|
+
"vite-plugin-dts": "^4.3.0",
|
|
64
|
+
"vue": "^3.5.13",
|
|
65
|
+
"vue-tsc": "^2.1.6"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SettingsDrawer 组件样式
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Tab 样式
|
|
6
|
+
.settings-tabs {
|
|
7
|
+
:deep(.n-tabs-nav) {
|
|
8
|
+
padding: 0 4px;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// 章节样式
|
|
13
|
+
.settings-section {
|
|
14
|
+
margin-bottom: 24px;
|
|
15
|
+
padding-bottom: 20px;
|
|
16
|
+
border-bottom: 1px solid var(--n-border-color);
|
|
17
|
+
|
|
18
|
+
&:last-child {
|
|
19
|
+
border-bottom: none;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.section-title {
|
|
24
|
+
display: flex;
|
|
25
|
+
justify-content: space-between;
|
|
26
|
+
align-items: center;
|
|
27
|
+
font-size: 14px;
|
|
28
|
+
font-weight: 600;
|
|
29
|
+
margin-bottom: 8px;
|
|
30
|
+
color: var(--n-text-color);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 预设方案网格
|
|
34
|
+
.preset-grid {
|
|
35
|
+
display: grid;
|
|
36
|
+
grid-template-columns: repeat(3, 1fr);
|
|
37
|
+
gap: 16px;
|
|
38
|
+
margin-top: 12px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.preset-card {
|
|
42
|
+
position: relative;
|
|
43
|
+
padding: 18px 14px;
|
|
44
|
+
border-radius: 12px;
|
|
45
|
+
border: 2px solid var(--n-border-color);
|
|
46
|
+
background: var(--n-color);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
49
|
+
text-align: center;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
|
|
52
|
+
&::before {
|
|
53
|
+
content: '';
|
|
54
|
+
position: absolute;
|
|
55
|
+
top: 0;
|
|
56
|
+
left: 0;
|
|
57
|
+
right: 0;
|
|
58
|
+
height: 3px;
|
|
59
|
+
background: linear-gradient(90deg, var(--n-color-target), var(--n-color-target));
|
|
60
|
+
opacity: 0;
|
|
61
|
+
transition: opacity 0.3s ease;
|
|
62
|
+
border-radius: 3px 3px 0 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
&:hover {
|
|
66
|
+
border-color: var(--n-color-target);
|
|
67
|
+
transform: translateY(-4px);
|
|
68
|
+
box-shadow: 0 8px 16px rgba(32, 128, 240, 0.12);
|
|
69
|
+
|
|
70
|
+
&::before {
|
|
71
|
+
opacity: 1;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.preset-icon {
|
|
75
|
+
transform: scale(1.1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.preset-name {
|
|
79
|
+
color: var(--n-color-target);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&.active {
|
|
84
|
+
border-color: var(--n-color-target);
|
|
85
|
+
background: var(--n-color-target-light);
|
|
86
|
+
box-shadow: 0 8px 20px rgba(32, 128, 240, 0.2);
|
|
87
|
+
|
|
88
|
+
&::before {
|
|
89
|
+
opacity: 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.preset-name {
|
|
93
|
+
color: var(--n-color-target);
|
|
94
|
+
font-weight: 600;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.preset-icon {
|
|
100
|
+
font-size: 36px;
|
|
101
|
+
margin-bottom: 10px;
|
|
102
|
+
transition: all 0.3s ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.preset-name {
|
|
106
|
+
font-size: 14px;
|
|
107
|
+
font-weight: 500;
|
|
108
|
+
margin-bottom: 8px;
|
|
109
|
+
color: var(--n-text-color);
|
|
110
|
+
transition: all 0.3s ease;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.preset-color {
|
|
114
|
+
display: flex;
|
|
115
|
+
justify-content: center;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.color-dot {
|
|
119
|
+
width: 24px;
|
|
120
|
+
height: 24px;
|
|
121
|
+
border-radius: 50%;
|
|
122
|
+
border: 2px solid #fff;
|
|
123
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
|
124
|
+
transition: all 0.3s ease;
|
|
125
|
+
|
|
126
|
+
&:hover {
|
|
127
|
+
transform: scale(1.1);
|
|
128
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// 主题模式
|
|
133
|
+
.mode-group {
|
|
134
|
+
width: 100%;
|
|
135
|
+
|
|
136
|
+
:deep(.n-radio-button) {
|
|
137
|
+
flex: 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 颜色选择器
|
|
142
|
+
.color-picker-wrapper {
|
|
143
|
+
display: flex;
|
|
144
|
+
align-items: center;
|
|
145
|
+
gap: 12px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.color-value {
|
|
149
|
+
width: 80px;
|
|
150
|
+
font-size: 13px;
|
|
151
|
+
font-family: 'Courier New', monospace;
|
|
152
|
+
color: var(--n-text-color-2);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 圆角/动画选择
|
|
156
|
+
.radius-group,
|
|
157
|
+
.transition-group {
|
|
158
|
+
width: 100%;
|
|
159
|
+
|
|
160
|
+
:deep(.n-radio-button) {
|
|
161
|
+
flex: 1;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 布局模式网格
|
|
166
|
+
.layout-grid {
|
|
167
|
+
display: grid;
|
|
168
|
+
grid-template-columns: repeat(3, 1fr);
|
|
169
|
+
gap: 16px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.layout-item {
|
|
173
|
+
position: relative;
|
|
174
|
+
display: flex;
|
|
175
|
+
flex-direction: column;
|
|
176
|
+
align-items: center;
|
|
177
|
+
gap: 10px;
|
|
178
|
+
padding: 16px 12px;
|
|
179
|
+
border-radius: 12px;
|
|
180
|
+
border: 2px solid var(--n-border-color);
|
|
181
|
+
background: var(--n-color);
|
|
182
|
+
cursor: pointer;
|
|
183
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
184
|
+
overflow: hidden;
|
|
185
|
+
|
|
186
|
+
&::before {
|
|
187
|
+
content: '';
|
|
188
|
+
position: absolute;
|
|
189
|
+
top: 0;
|
|
190
|
+
left: 0;
|
|
191
|
+
right: 0;
|
|
192
|
+
height: 3px;
|
|
193
|
+
background: linear-gradient(90deg, var(--n-color-target), var(--n-color-target));
|
|
194
|
+
opacity: 0;
|
|
195
|
+
transition: opacity 0.3s ease;
|
|
196
|
+
border-radius: 3px 3px 0 0;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
&:hover:not(.disabled) {
|
|
200
|
+
border-color: var(--n-color-target);
|
|
201
|
+
box-shadow: 0 8px 16px rgba(32, 128, 240, 0.12);
|
|
202
|
+
transform: translateY(-4px);
|
|
203
|
+
|
|
204
|
+
&::before {
|
|
205
|
+
opacity: 1;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.layout-svg {
|
|
209
|
+
transform: scale(1.05);
|
|
210
|
+
color: var(--n-color-target);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.layout-label {
|
|
214
|
+
color: var(--n-color-target);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
&.active {
|
|
219
|
+
border-color: var(--n-color-target);
|
|
220
|
+
background: var(--n-color-target-light);
|
|
221
|
+
box-shadow: 0 8px 20px rgba(32, 128, 240, 0.2);
|
|
222
|
+
|
|
223
|
+
&::before {
|
|
224
|
+
opacity: 1;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.layout-label {
|
|
228
|
+
color: var(--n-color-target);
|
|
229
|
+
font-weight: 600;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.layout-svg {
|
|
233
|
+
color: var(--n-color-target);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
&.disabled {
|
|
238
|
+
cursor: not-allowed;
|
|
239
|
+
opacity: 0.5;
|
|
240
|
+
filter: grayscale(0.8);
|
|
241
|
+
|
|
242
|
+
&:hover {
|
|
243
|
+
transform: none;
|
|
244
|
+
box-shadow: none;
|
|
245
|
+
border-color: var(--n-border-color);
|
|
246
|
+
|
|
247
|
+
&::before {
|
|
248
|
+
opacity: 0;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.layout-screenshot {
|
|
255
|
+
width: 100%;
|
|
256
|
+
height: 56px;
|
|
257
|
+
display: flex;
|
|
258
|
+
align-items: center;
|
|
259
|
+
justify-content: center;
|
|
260
|
+
background: var(--n-color-modal);
|
|
261
|
+
border-radius: 8px;
|
|
262
|
+
padding: 8px;
|
|
263
|
+
transition: all 0.3s ease;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.layout-svg {
|
|
267
|
+
width: 64px;
|
|
268
|
+
height: 48px;
|
|
269
|
+
color: var(--n-text-color-2);
|
|
270
|
+
transition: all 0.3s ease;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.layout-label {
|
|
274
|
+
font-size: 13px;
|
|
275
|
+
color: var(--n-text-color);
|
|
276
|
+
font-weight: 500;
|
|
277
|
+
text-align: center;
|
|
278
|
+
transition: all 0.3s ease;
|
|
279
|
+
display: flex;
|
|
280
|
+
flex-direction: column;
|
|
281
|
+
align-items: center;
|
|
282
|
+
gap: 6px;
|
|
283
|
+
line-height: 1.4;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.badge-soon {
|
|
287
|
+
font-size: 10px;
|
|
288
|
+
padding: 1px 5px;
|
|
289
|
+
border-radius: 3px;
|
|
290
|
+
background: linear-gradient(135deg, #faad14 0%, #fa8c16 100%);
|
|
291
|
+
color: #fff;
|
|
292
|
+
font-weight: 600;
|
|
293
|
+
white-space: nowrap;
|
|
294
|
+
box-shadow: 0 1px 3px rgba(250, 173, 20, 0.3);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// 设置项
|
|
298
|
+
.setting-item {
|
|
299
|
+
display: flex;
|
|
300
|
+
justify-content: space-between;
|
|
301
|
+
align-items: center;
|
|
302
|
+
padding: 10px 0;
|
|
303
|
+
font-size: 13px;
|
|
304
|
+
color: var(--n-text-color);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// 滑块
|
|
308
|
+
.slider-item {
|
|
309
|
+
margin-bottom: 20px;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.slider-label {
|
|
313
|
+
display: flex;
|
|
314
|
+
justify-content: space-between;
|
|
315
|
+
margin-bottom: 8px;
|
|
316
|
+
font-size: 13px;
|
|
317
|
+
color: var(--n-text-color);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.slider-value {
|
|
321
|
+
font-weight: 600;
|
|
322
|
+
color: var(--n-color-target);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// 操作按钮网格布局
|
|
326
|
+
.action-buttons-grid {
|
|
327
|
+
display: grid;
|
|
328
|
+
grid-template-columns: repeat(2, 1fr);
|
|
329
|
+
gap: 10px;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// 设置项标签
|
|
333
|
+
.setting-label {
|
|
334
|
+
display: flex;
|
|
335
|
+
flex-direction: column;
|
|
336
|
+
gap: 4px;
|
|
337
|
+
|
|
338
|
+
.setting-desc {
|
|
339
|
+
font-size: 12px;
|
|
340
|
+
color: var(--n-text-color-2);
|
|
341
|
+
opacity: 0.8;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// 系统信息
|
|
346
|
+
.system-info {
|
|
347
|
+
display: flex;
|
|
348
|
+
flex-direction: column;
|
|
349
|
+
gap: 12px;
|
|
350
|
+
margin-top: 12px;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.info-item {
|
|
354
|
+
display: flex;
|
|
355
|
+
justify-content: space-between;
|
|
356
|
+
align-items: center;
|
|
357
|
+
padding: 10px 12px;
|
|
358
|
+
background: var(--n-color);
|
|
359
|
+
border-radius: 8px;
|
|
360
|
+
border: 1px solid var(--n-border-color);
|
|
361
|
+
transition: all 0.2s ease;
|
|
362
|
+
|
|
363
|
+
&:hover {
|
|
364
|
+
border-color: var(--n-color-target);
|
|
365
|
+
background: var(--n-color-target-light);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.info-label {
|
|
370
|
+
font-size: 13px;
|
|
371
|
+
color: var(--n-text-color-2);
|
|
372
|
+
font-weight: 500;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.info-value {
|
|
376
|
+
font-size: 13px;
|
|
377
|
+
color: var(--n-text-color);
|
|
378
|
+
font-weight: 600;
|
|
379
|
+
font-family: 'Consolas', 'Monaco', monospace;
|
|
380
|
+
}
|