@robot-admin/layout 3.2.0 → 3.2.1
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/CHANGELOG.md +10 -3
- package/README.md +2 -2
- package/dist/core/index.cjs +1 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -13
- package/dist/index.d.ts +5 -13
- package/dist/index.js +2 -2
- package/dist/naive/index.cjs +1 -1
- package/dist/naive/index.d.cts +5 -13
- package/dist/naive/index.d.ts +5 -13
- package/dist/naive/index.js +2 -2
- package/dist/{naive-Bd8pxcrF.js → naive-AliKeHvO.js} +2 -2
- package/dist/{naive-Bd8pxcrF.js.map → naive-AliKeHvO.js.map} +1 -1
- package/dist/{naive-BfZUS_c8.cjs → naive-CuOhPLBc.cjs} +2 -2
- package/dist/{naive-BfZUS_c8.cjs.map → naive-CuOhPLBc.cjs.map} +1 -1
- package/dist/vue/index.cjs +1 -1
- package/dist/vue/index.d.cts +5 -5
- package/dist/vue/index.d.ts +5 -5
- package/dist/vue/index.js +1 -1
- package/dist/{vue-DhbxgFgz.cjs → vue-DVWXVFUx.cjs} +2 -2
- package/dist/vue-DVWXVFUx.cjs.map +1 -0
- package/dist/{vue-BRQ1Fg0b.js → vue-h8jl2I5K.js} +2 -2
- package/dist/vue-h8jl2I5K.js.map +1 -0
- package/package.json +1 -1
- package/dist/vue-BRQ1Fg0b.js.map +0 -1
- package/dist/vue-DhbxgFgz.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## 3.2.
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 3.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Restore the 3.x `MenuOptions.type` contract to `group | divider`, preventing the
|
|
8
|
+
normalized menu result from becoming wider than existing consumer menu components.
|
|
9
|
+
|
|
10
|
+
## 3.2.0
|
|
4
11
|
|
|
5
12
|
### Minor Changes
|
|
6
13
|
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/@robot-admin/layout)
|
|
6
6
|
[](https://github.com/ChenyCHENYU/robot-admin-packages/blob/main/LICENSE)
|
|
7
7
|
|
|
8
|
-
当前版本:`3.2.
|
|
8
|
+
当前版本:`3.2.1`。
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -314,7 +314,7 @@ settings.resetSettings();
|
|
|
314
314
|
| `sidebarCollapsedWidth` | `64` | 包内 | 折叠宽度 (px) |
|
|
315
315
|
| `headerHeight` | `56` | 包内/宿主 | 头部高度 (px) |
|
|
316
316
|
| `enableHotkeys` | `true` | 宿主扩展 | 是否启用宿主快捷键 |
|
|
317
|
-
| `version` | `'3.2.
|
|
317
|
+
| `version` | `'3.2.1'` | 兼容字段 | 已废弃;配置迁移请使用 schemaVersion |
|
|
318
318
|
|
|
319
319
|
“宿主”字段由 Store 和导入导出协议统一维护,但布局包不会越权修改宿主业务组件;这种边界
|
|
320
320
|
避免重复实现面包屑、快捷键和标签页等业务能力。
|
package/dist/core/index.cjs
CHANGED
|
@@ -296,7 +296,7 @@ var DEFAULT_SETTINGS = {
|
|
|
296
296
|
headerHeight: 56,
|
|
297
297
|
// 高级
|
|
298
298
|
enableHotkeys: true,
|
|
299
|
-
version: "3.2.
|
|
299
|
+
version: "3.2.1"
|
|
300
300
|
};
|
|
301
301
|
var COLOR_SWATCHES = PRESET_COLORS.map((c) => c.value);
|
|
302
302
|
// Annotate the CommonJS export names for ESM import in node:
|
package/dist/core/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/index.ts","../../src/core/settings.ts","../../src/constants/index.ts"],"sourcesContent":["export {\r\n adjustColor,\r\n assertLayoutSettingsRelationships,\r\n sanitizeLayoutSettingsConfig,\r\n sanitizeSettingsPatch,\r\n SETTINGS_CONFIG_SCHEMA_VERSION,\r\n} from \"./settings\";\r\nexport type { LayoutSettingsConfig, LayoutVisualEffects } from \"./settings\";\r\n\r\nexport {\r\n BORDER_RADIUS_MAP,\r\n COLOR_SWATCHES,\r\n DEFAULT_SETTINGS,\r\n LAYOUT_MODES,\r\n PRESET_COLORS,\r\n THEME_PRESETS,\r\n TRANSITION_MAP,\r\n} from \"../constants\";\r\n\r\nexport type {\r\n BorderRadiusSize,\r\n LayoutInfo,\r\n LayoutMode,\r\n MenuExpandMode,\r\n PresetColor,\r\n SettingsDrawerActions,\r\n SettingsState,\r\n SettingsStoreOptions,\r\n TagsViewStyle,\r\n ThemeMode,\r\n ThemePreset,\r\n TransitionType,\r\n} from \"./types\";\r\n","import type { SettingsState } from \"./types\";\r\n\r\nconst ENUM_SETTINGS = {\r\n themeMode: new Set([\"light\", \"dark\", \"system\"]),\r\n borderRadius: new Set([\"small\", \"medium\", \"large\"]),\r\n transitionType: new Set([\"fade\", \"slide\", \"zoom\", \"none\"]),\r\n layoutMode: new Set([\r\n \"side\",\r\n \"top\",\r\n \"mix\",\r\n \"mix-top\",\r\n \"reverse-horizontal-mix\",\r\n \"card-layout\",\r\n ]),\r\n menuExpandMode: new Set([\"inline\", \"panel\"]),\r\n tagsViewStyle: new Set([\"default\", \"card\", \"smart\"]),\r\n} as const;\r\n\r\nconst BOOLEAN_SETTINGS: ReadonlySet<keyof SettingsState> = new Set([\r\n \"enableTransition\",\r\n \"collapsed\",\r\n \"fixedHeader\",\r\n \"showBreadcrumb\",\r\n \"showBreadcrumbIcon\",\r\n \"showTagsView\",\r\n \"showFooter\",\r\n \"enableHotkeys\",\r\n]);\r\n\r\nconst NUMBER_RANGES: Partial<\r\n Record<keyof SettingsState, readonly [number, number]>\r\n> = {\r\n tagsViewHeight: [24, 100],\r\n sidebarWidth: [120, 480],\r\n sidebarCollapsedWidth: [32, 160],\r\n headerHeight: [32, 160],\r\n};\r\n\r\n/** 当前导入导出配置格式版本。 */\r\nexport const SETTINGS_CONFIG_SCHEMA_VERSION = 1 as const;\r\n\r\nexport interface LayoutVisualEffects {\r\n gray?: boolean;\r\n colorWeak?: boolean;\r\n watermark?: {\r\n enabled: boolean;\r\n text: string;\r\n };\r\n}\r\n\r\n/** 经校验后可原子应用的布局配置。 */\r\nexport interface LayoutSettingsConfig extends LayoutVisualEffects {\r\n schemaVersion?: number;\r\n settings?: Partial<SettingsState>;\r\n}\r\n\r\n/** 校验需要跨字段判断的布局尺寸约束。 */\r\nexport function assertLayoutSettingsRelationships(\r\n settings: Pick<SettingsState, \"sidebarCollapsedWidth\" | \"sidebarWidth\">,\r\n): void {\r\n if (settings.sidebarCollapsedWidth > settings.sidebarWidth) {\r\n throw new RangeError(\"sidebarCollapsedWidth 不能大于 sidebarWidth\");\r\n }\r\n}\r\n\r\n/**\r\n * 校验来自配置文件等不可信来源的设置。\r\n * 未知键为向前兼容而忽略;已知键的非法值会让整次导入失败。\r\n */\r\nexport function sanitizeSettingsPatch(input: unknown): Partial<SettingsState> {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"settings 必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: Partial<SettingsState> = {};\r\n const assign = (key: keyof SettingsState, value: unknown) => {\r\n (result as Record<string, unknown>)[key] = value;\r\n };\r\n\r\n for (const [key, allowed] of Object.entries(ENUM_SETTINGS)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"string\" || !allowed.has(value as never)) {\r\n throw new RangeError(`无效的设置项 ${key}: ${String(value)}`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n for (const key of BOOLEAN_SETTINGS) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`设置项 ${key} 必须是布尔值`);\r\n }\r\n assign(key, value);\r\n }\r\n\r\n for (const [key, range] of Object.entries(NUMBER_RANGES)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < range[0] ||\r\n value > range[1]\r\n ) {\r\n throw new RangeError(`设置项 ${key} 超出允许范围`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n if (source.primaryColor !== undefined) {\r\n if (\r\n typeof source.primaryColor !== \"string\" ||\r\n !/^#[0-9a-fA-F]{6}$/.test(source.primaryColor)\r\n ) {\r\n throw new RangeError(\"primaryColor 必须是 #rrggbb 格式\");\r\n }\r\n result.primaryColor = source.primaryColor;\r\n }\r\n\r\n if (source.version !== undefined) {\r\n if (typeof source.version !== \"string\" || source.version.length > 50) {\r\n throw new TypeError(\"version 必须是长度不超过 50 的字符串\");\r\n }\r\n result.version = source.version;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 一次性校验完整导入文件。此函数不修改任何响应式状态或浏览器 API,\r\n * 消费方可以在成功返回后再原子应用结果。\r\n */\r\nexport function sanitizeLayoutSettingsConfig(\r\n input: unknown,\r\n): LayoutSettingsConfig {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"配置文件根节点必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: LayoutSettingsConfig = {};\r\n\r\n if (source.schemaVersion !== undefined) {\r\n if (\r\n typeof source.schemaVersion !== \"number\" ||\r\n !Number.isInteger(source.schemaVersion) ||\r\n source.schemaVersion < 1 ||\r\n source.schemaVersion > SETTINGS_CONFIG_SCHEMA_VERSION\r\n ) {\r\n throw new RangeError(\"不支持的配置格式版本\");\r\n }\r\n result.schemaVersion = source.schemaVersion;\r\n }\r\n\r\n if (source.settings !== undefined) {\r\n result.settings = sanitizeSettingsPatch(source.settings);\r\n }\r\n\r\n for (const key of [\"gray\", \"colorWeak\"] as const) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`${key} 必须是布尔值`);\r\n }\r\n result[key] = value;\r\n }\r\n\r\n if (source.watermark !== undefined) {\r\n if (\r\n !source.watermark ||\r\n typeof source.watermark !== \"object\" ||\r\n Array.isArray(source.watermark)\r\n ) {\r\n throw new TypeError(\"watermark 必须是对象\");\r\n }\r\n const watermark = source.watermark as Record<string, unknown>;\r\n if (\r\n typeof watermark.enabled !== \"boolean\" ||\r\n typeof watermark.text !== \"string\" ||\r\n watermark.text.length > 200\r\n ) {\r\n throw new TypeError(\"watermark 配置无效\");\r\n }\r\n result.watermark = {\r\n enabled: watermark.enabled,\r\n text: watermark.text,\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 调整颜色亮度。\r\n * @returns 调整后的 #rrggbb;输入非法时原样返回。\r\n */\r\nexport function adjustColor(color: string, amount: number): string {\r\n if (typeof color !== \"string\") return \"#000000\";\r\n if (!Number.isFinite(amount)) return color;\r\n const normalizedAmount = Math.round(amount);\r\n const trimmedColor = color.trim();\r\n let hex = trimmedColor.startsWith(\"#\") ? trimmedColor.slice(1) : trimmedColor;\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split(\"\")\r\n .map((character) => character + character)\r\n .join(\"\");\r\n }\r\n if (!/^[0-9a-fA-F]{6}$/.test(hex)) return color;\r\n\r\n const value = parseInt(hex, 16);\r\n const red = Math.min(255, Math.max(0, (value >> 16) + normalizedAmount));\r\n const green = Math.min(\r\n 255,\r\n Math.max(0, ((value >> 8) & 0x00ff) + normalizedAmount),\r\n );\r\n const blue = Math.min(\r\n 255,\r\n Math.max(0, (value & 0x0000ff) + normalizedAmount),\r\n );\r\n return `#${((red << 16) | (green << 8) | blue).toString(16).padStart(6, \"0\")}`;\r\n}\r\n","/**\r\n * 布局和设置系统 - 常量定义\r\n */\r\n\r\nimport type {\r\n ThemePreset,\r\n SettingsState,\r\n LayoutInfo,\r\n PresetColor,\r\n} from \"../core/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:view-dashboard-outline\",\r\n },\r\n {\r\n mode: \"mix-top\",\r\n label: \"顶部混合\",\r\n description: \"侧边优先的混合布局\",\r\n icon: \"i-mdi:view-dashboard-variant-outline\",\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 menuExpandMode: \"inline\",\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: \"3.2.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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts","../../src/core/settings.ts","../../src/constants/index.ts"],"sourcesContent":["export {\r\n adjustColor,\r\n assertLayoutSettingsRelationships,\r\n sanitizeLayoutSettingsConfig,\r\n sanitizeSettingsPatch,\r\n SETTINGS_CONFIG_SCHEMA_VERSION,\r\n} from \"./settings\";\r\nexport type { LayoutSettingsConfig, LayoutVisualEffects } from \"./settings\";\r\n\r\nexport {\r\n BORDER_RADIUS_MAP,\r\n COLOR_SWATCHES,\r\n DEFAULT_SETTINGS,\r\n LAYOUT_MODES,\r\n PRESET_COLORS,\r\n THEME_PRESETS,\r\n TRANSITION_MAP,\r\n} from \"../constants\";\r\n\r\nexport type {\r\n BorderRadiusSize,\r\n LayoutInfo,\r\n LayoutMode,\r\n MenuExpandMode,\r\n PresetColor,\r\n SettingsDrawerActions,\r\n SettingsState,\r\n SettingsStoreOptions,\r\n TagsViewStyle,\r\n ThemeMode,\r\n ThemePreset,\r\n TransitionType,\r\n} from \"./types\";\r\n","import type { SettingsState } from \"./types\";\r\n\r\nconst ENUM_SETTINGS = {\r\n themeMode: new Set([\"light\", \"dark\", \"system\"]),\r\n borderRadius: new Set([\"small\", \"medium\", \"large\"]),\r\n transitionType: new Set([\"fade\", \"slide\", \"zoom\", \"none\"]),\r\n layoutMode: new Set([\r\n \"side\",\r\n \"top\",\r\n \"mix\",\r\n \"mix-top\",\r\n \"reverse-horizontal-mix\",\r\n \"card-layout\",\r\n ]),\r\n menuExpandMode: new Set([\"inline\", \"panel\"]),\r\n tagsViewStyle: new Set([\"default\", \"card\", \"smart\"]),\r\n} as const;\r\n\r\nconst BOOLEAN_SETTINGS: ReadonlySet<keyof SettingsState> = new Set([\r\n \"enableTransition\",\r\n \"collapsed\",\r\n \"fixedHeader\",\r\n \"showBreadcrumb\",\r\n \"showBreadcrumbIcon\",\r\n \"showTagsView\",\r\n \"showFooter\",\r\n \"enableHotkeys\",\r\n]);\r\n\r\nconst NUMBER_RANGES: Partial<\r\n Record<keyof SettingsState, readonly [number, number]>\r\n> = {\r\n tagsViewHeight: [24, 100],\r\n sidebarWidth: [120, 480],\r\n sidebarCollapsedWidth: [32, 160],\r\n headerHeight: [32, 160],\r\n};\r\n\r\n/** 当前导入导出配置格式版本。 */\r\nexport const SETTINGS_CONFIG_SCHEMA_VERSION = 1 as const;\r\n\r\nexport interface LayoutVisualEffects {\r\n gray?: boolean;\r\n colorWeak?: boolean;\r\n watermark?: {\r\n enabled: boolean;\r\n text: string;\r\n };\r\n}\r\n\r\n/** 经校验后可原子应用的布局配置。 */\r\nexport interface LayoutSettingsConfig extends LayoutVisualEffects {\r\n schemaVersion?: number;\r\n settings?: Partial<SettingsState>;\r\n}\r\n\r\n/** 校验需要跨字段判断的布局尺寸约束。 */\r\nexport function assertLayoutSettingsRelationships(\r\n settings: Pick<SettingsState, \"sidebarCollapsedWidth\" | \"sidebarWidth\">,\r\n): void {\r\n if (settings.sidebarCollapsedWidth > settings.sidebarWidth) {\r\n throw new RangeError(\"sidebarCollapsedWidth 不能大于 sidebarWidth\");\r\n }\r\n}\r\n\r\n/**\r\n * 校验来自配置文件等不可信来源的设置。\r\n * 未知键为向前兼容而忽略;已知键的非法值会让整次导入失败。\r\n */\r\nexport function sanitizeSettingsPatch(input: unknown): Partial<SettingsState> {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"settings 必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: Partial<SettingsState> = {};\r\n const assign = (key: keyof SettingsState, value: unknown) => {\r\n (result as Record<string, unknown>)[key] = value;\r\n };\r\n\r\n for (const [key, allowed] of Object.entries(ENUM_SETTINGS)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"string\" || !allowed.has(value as never)) {\r\n throw new RangeError(`无效的设置项 ${key}: ${String(value)}`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n for (const key of BOOLEAN_SETTINGS) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`设置项 ${key} 必须是布尔值`);\r\n }\r\n assign(key, value);\r\n }\r\n\r\n for (const [key, range] of Object.entries(NUMBER_RANGES)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < range[0] ||\r\n value > range[1]\r\n ) {\r\n throw new RangeError(`设置项 ${key} 超出允许范围`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n if (source.primaryColor !== undefined) {\r\n if (\r\n typeof source.primaryColor !== \"string\" ||\r\n !/^#[0-9a-fA-F]{6}$/.test(source.primaryColor)\r\n ) {\r\n throw new RangeError(\"primaryColor 必须是 #rrggbb 格式\");\r\n }\r\n result.primaryColor = source.primaryColor;\r\n }\r\n\r\n if (source.version !== undefined) {\r\n if (typeof source.version !== \"string\" || source.version.length > 50) {\r\n throw new TypeError(\"version 必须是长度不超过 50 的字符串\");\r\n }\r\n result.version = source.version;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 一次性校验完整导入文件。此函数不修改任何响应式状态或浏览器 API,\r\n * 消费方可以在成功返回后再原子应用结果。\r\n */\r\nexport function sanitizeLayoutSettingsConfig(\r\n input: unknown,\r\n): LayoutSettingsConfig {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"配置文件根节点必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: LayoutSettingsConfig = {};\r\n\r\n if (source.schemaVersion !== undefined) {\r\n if (\r\n typeof source.schemaVersion !== \"number\" ||\r\n !Number.isInteger(source.schemaVersion) ||\r\n source.schemaVersion < 1 ||\r\n source.schemaVersion > SETTINGS_CONFIG_SCHEMA_VERSION\r\n ) {\r\n throw new RangeError(\"不支持的配置格式版本\");\r\n }\r\n result.schemaVersion = source.schemaVersion;\r\n }\r\n\r\n if (source.settings !== undefined) {\r\n result.settings = sanitizeSettingsPatch(source.settings);\r\n }\r\n\r\n for (const key of [\"gray\", \"colorWeak\"] as const) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`${key} 必须是布尔值`);\r\n }\r\n result[key] = value;\r\n }\r\n\r\n if (source.watermark !== undefined) {\r\n if (\r\n !source.watermark ||\r\n typeof source.watermark !== \"object\" ||\r\n Array.isArray(source.watermark)\r\n ) {\r\n throw new TypeError(\"watermark 必须是对象\");\r\n }\r\n const watermark = source.watermark as Record<string, unknown>;\r\n if (\r\n typeof watermark.enabled !== \"boolean\" ||\r\n typeof watermark.text !== \"string\" ||\r\n watermark.text.length > 200\r\n ) {\r\n throw new TypeError(\"watermark 配置无效\");\r\n }\r\n result.watermark = {\r\n enabled: watermark.enabled,\r\n text: watermark.text,\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 调整颜色亮度。\r\n * @returns 调整后的 #rrggbb;输入非法时原样返回。\r\n */\r\nexport function adjustColor(color: string, amount: number): string {\r\n if (typeof color !== \"string\") return \"#000000\";\r\n if (!Number.isFinite(amount)) return color;\r\n const normalizedAmount = Math.round(amount);\r\n const trimmedColor = color.trim();\r\n let hex = trimmedColor.startsWith(\"#\") ? trimmedColor.slice(1) : trimmedColor;\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split(\"\")\r\n .map((character) => character + character)\r\n .join(\"\");\r\n }\r\n if (!/^[0-9a-fA-F]{6}$/.test(hex)) return color;\r\n\r\n const value = parseInt(hex, 16);\r\n const red = Math.min(255, Math.max(0, (value >> 16) + normalizedAmount));\r\n const green = Math.min(\r\n 255,\r\n Math.max(0, ((value >> 8) & 0x00ff) + normalizedAmount),\r\n );\r\n const blue = Math.min(\r\n 255,\r\n Math.max(0, (value & 0x0000ff) + normalizedAmount),\r\n );\r\n return `#${((red << 16) | (green << 8) | blue).toString(16).padStart(6, \"0\")}`;\r\n}\r\n","/**\r\n * 布局和设置系统 - 常量定义\r\n */\r\n\r\nimport type {\r\n ThemePreset,\r\n SettingsState,\r\n LayoutInfo,\r\n PresetColor,\r\n} from \"../core/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:view-dashboard-outline\",\r\n },\r\n {\r\n mode: \"mix-top\",\r\n label: \"顶部混合\",\r\n description: \"侧边优先的混合布局\",\r\n icon: \"i-mdi:view-dashboard-variant-outline\",\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 menuExpandMode: \"inline\",\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: \"3.2.1\",\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"],"mappings":"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","names":[]}
|
package/dist/core/index.js
CHANGED
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/settings.ts","../../src/constants/index.ts"],"sourcesContent":["import type { SettingsState } from \"./types\";\r\n\r\nconst ENUM_SETTINGS = {\r\n themeMode: new Set([\"light\", \"dark\", \"system\"]),\r\n borderRadius: new Set([\"small\", \"medium\", \"large\"]),\r\n transitionType: new Set([\"fade\", \"slide\", \"zoom\", \"none\"]),\r\n layoutMode: new Set([\r\n \"side\",\r\n \"top\",\r\n \"mix\",\r\n \"mix-top\",\r\n \"reverse-horizontal-mix\",\r\n \"card-layout\",\r\n ]),\r\n menuExpandMode: new Set([\"inline\", \"panel\"]),\r\n tagsViewStyle: new Set([\"default\", \"card\", \"smart\"]),\r\n} as const;\r\n\r\nconst BOOLEAN_SETTINGS: ReadonlySet<keyof SettingsState> = new Set([\r\n \"enableTransition\",\r\n \"collapsed\",\r\n \"fixedHeader\",\r\n \"showBreadcrumb\",\r\n \"showBreadcrumbIcon\",\r\n \"showTagsView\",\r\n \"showFooter\",\r\n \"enableHotkeys\",\r\n]);\r\n\r\nconst NUMBER_RANGES: Partial<\r\n Record<keyof SettingsState, readonly [number, number]>\r\n> = {\r\n tagsViewHeight: [24, 100],\r\n sidebarWidth: [120, 480],\r\n sidebarCollapsedWidth: [32, 160],\r\n headerHeight: [32, 160],\r\n};\r\n\r\n/** 当前导入导出配置格式版本。 */\r\nexport const SETTINGS_CONFIG_SCHEMA_VERSION = 1 as const;\r\n\r\nexport interface LayoutVisualEffects {\r\n gray?: boolean;\r\n colorWeak?: boolean;\r\n watermark?: {\r\n enabled: boolean;\r\n text: string;\r\n };\r\n}\r\n\r\n/** 经校验后可原子应用的布局配置。 */\r\nexport interface LayoutSettingsConfig extends LayoutVisualEffects {\r\n schemaVersion?: number;\r\n settings?: Partial<SettingsState>;\r\n}\r\n\r\n/** 校验需要跨字段判断的布局尺寸约束。 */\r\nexport function assertLayoutSettingsRelationships(\r\n settings: Pick<SettingsState, \"sidebarCollapsedWidth\" | \"sidebarWidth\">,\r\n): void {\r\n if (settings.sidebarCollapsedWidth > settings.sidebarWidth) {\r\n throw new RangeError(\"sidebarCollapsedWidth 不能大于 sidebarWidth\");\r\n }\r\n}\r\n\r\n/**\r\n * 校验来自配置文件等不可信来源的设置。\r\n * 未知键为向前兼容而忽略;已知键的非法值会让整次导入失败。\r\n */\r\nexport function sanitizeSettingsPatch(input: unknown): Partial<SettingsState> {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"settings 必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: Partial<SettingsState> = {};\r\n const assign = (key: keyof SettingsState, value: unknown) => {\r\n (result as Record<string, unknown>)[key] = value;\r\n };\r\n\r\n for (const [key, allowed] of Object.entries(ENUM_SETTINGS)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"string\" || !allowed.has(value as never)) {\r\n throw new RangeError(`无效的设置项 ${key}: ${String(value)}`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n for (const key of BOOLEAN_SETTINGS) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`设置项 ${key} 必须是布尔值`);\r\n }\r\n assign(key, value);\r\n }\r\n\r\n for (const [key, range] of Object.entries(NUMBER_RANGES)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < range[0] ||\r\n value > range[1]\r\n ) {\r\n throw new RangeError(`设置项 ${key} 超出允许范围`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n if (source.primaryColor !== undefined) {\r\n if (\r\n typeof source.primaryColor !== \"string\" ||\r\n !/^#[0-9a-fA-F]{6}$/.test(source.primaryColor)\r\n ) {\r\n throw new RangeError(\"primaryColor 必须是 #rrggbb 格式\");\r\n }\r\n result.primaryColor = source.primaryColor;\r\n }\r\n\r\n if (source.version !== undefined) {\r\n if (typeof source.version !== \"string\" || source.version.length > 50) {\r\n throw new TypeError(\"version 必须是长度不超过 50 的字符串\");\r\n }\r\n result.version = source.version;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 一次性校验完整导入文件。此函数不修改任何响应式状态或浏览器 API,\r\n * 消费方可以在成功返回后再原子应用结果。\r\n */\r\nexport function sanitizeLayoutSettingsConfig(\r\n input: unknown,\r\n): LayoutSettingsConfig {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"配置文件根节点必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: LayoutSettingsConfig = {};\r\n\r\n if (source.schemaVersion !== undefined) {\r\n if (\r\n typeof source.schemaVersion !== \"number\" ||\r\n !Number.isInteger(source.schemaVersion) ||\r\n source.schemaVersion < 1 ||\r\n source.schemaVersion > SETTINGS_CONFIG_SCHEMA_VERSION\r\n ) {\r\n throw new RangeError(\"不支持的配置格式版本\");\r\n }\r\n result.schemaVersion = source.schemaVersion;\r\n }\r\n\r\n if (source.settings !== undefined) {\r\n result.settings = sanitizeSettingsPatch(source.settings);\r\n }\r\n\r\n for (const key of [\"gray\", \"colorWeak\"] as const) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`${key} 必须是布尔值`);\r\n }\r\n result[key] = value;\r\n }\r\n\r\n if (source.watermark !== undefined) {\r\n if (\r\n !source.watermark ||\r\n typeof source.watermark !== \"object\" ||\r\n Array.isArray(source.watermark)\r\n ) {\r\n throw new TypeError(\"watermark 必须是对象\");\r\n }\r\n const watermark = source.watermark as Record<string, unknown>;\r\n if (\r\n typeof watermark.enabled !== \"boolean\" ||\r\n typeof watermark.text !== \"string\" ||\r\n watermark.text.length > 200\r\n ) {\r\n throw new TypeError(\"watermark 配置无效\");\r\n }\r\n result.watermark = {\r\n enabled: watermark.enabled,\r\n text: watermark.text,\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 调整颜色亮度。\r\n * @returns 调整后的 #rrggbb;输入非法时原样返回。\r\n */\r\nexport function adjustColor(color: string, amount: number): string {\r\n if (typeof color !== \"string\") return \"#000000\";\r\n if (!Number.isFinite(amount)) return color;\r\n const normalizedAmount = Math.round(amount);\r\n const trimmedColor = color.trim();\r\n let hex = trimmedColor.startsWith(\"#\") ? trimmedColor.slice(1) : trimmedColor;\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split(\"\")\r\n .map((character) => character + character)\r\n .join(\"\");\r\n }\r\n if (!/^[0-9a-fA-F]{6}$/.test(hex)) return color;\r\n\r\n const value = parseInt(hex, 16);\r\n const red = Math.min(255, Math.max(0, (value >> 16) + normalizedAmount));\r\n const green = Math.min(\r\n 255,\r\n Math.max(0, ((value >> 8) & 0x00ff) + normalizedAmount),\r\n );\r\n const blue = Math.min(\r\n 255,\r\n Math.max(0, (value & 0x0000ff) + normalizedAmount),\r\n );\r\n return `#${((red << 16) | (green << 8) | blue).toString(16).padStart(6, \"0\")}`;\r\n}\r\n","/**\r\n * 布局和设置系统 - 常量定义\r\n */\r\n\r\nimport type {\r\n ThemePreset,\r\n SettingsState,\r\n LayoutInfo,\r\n PresetColor,\r\n} from \"../core/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:view-dashboard-outline\",\r\n },\r\n {\r\n mode: \"mix-top\",\r\n label: \"顶部混合\",\r\n description: \"侧边优先的混合布局\",\r\n icon: \"i-mdi:view-dashboard-variant-outline\",\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 menuExpandMode: \"inline\",\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: \"3.2.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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/settings.ts","../../src/constants/index.ts"],"sourcesContent":["import type { SettingsState } from \"./types\";\r\n\r\nconst ENUM_SETTINGS = {\r\n themeMode: new Set([\"light\", \"dark\", \"system\"]),\r\n borderRadius: new Set([\"small\", \"medium\", \"large\"]),\r\n transitionType: new Set([\"fade\", \"slide\", \"zoom\", \"none\"]),\r\n layoutMode: new Set([\r\n \"side\",\r\n \"top\",\r\n \"mix\",\r\n \"mix-top\",\r\n \"reverse-horizontal-mix\",\r\n \"card-layout\",\r\n ]),\r\n menuExpandMode: new Set([\"inline\", \"panel\"]),\r\n tagsViewStyle: new Set([\"default\", \"card\", \"smart\"]),\r\n} as const;\r\n\r\nconst BOOLEAN_SETTINGS: ReadonlySet<keyof SettingsState> = new Set([\r\n \"enableTransition\",\r\n \"collapsed\",\r\n \"fixedHeader\",\r\n \"showBreadcrumb\",\r\n \"showBreadcrumbIcon\",\r\n \"showTagsView\",\r\n \"showFooter\",\r\n \"enableHotkeys\",\r\n]);\r\n\r\nconst NUMBER_RANGES: Partial<\r\n Record<keyof SettingsState, readonly [number, number]>\r\n> = {\r\n tagsViewHeight: [24, 100],\r\n sidebarWidth: [120, 480],\r\n sidebarCollapsedWidth: [32, 160],\r\n headerHeight: [32, 160],\r\n};\r\n\r\n/** 当前导入导出配置格式版本。 */\r\nexport const SETTINGS_CONFIG_SCHEMA_VERSION = 1 as const;\r\n\r\nexport interface LayoutVisualEffects {\r\n gray?: boolean;\r\n colorWeak?: boolean;\r\n watermark?: {\r\n enabled: boolean;\r\n text: string;\r\n };\r\n}\r\n\r\n/** 经校验后可原子应用的布局配置。 */\r\nexport interface LayoutSettingsConfig extends LayoutVisualEffects {\r\n schemaVersion?: number;\r\n settings?: Partial<SettingsState>;\r\n}\r\n\r\n/** 校验需要跨字段判断的布局尺寸约束。 */\r\nexport function assertLayoutSettingsRelationships(\r\n settings: Pick<SettingsState, \"sidebarCollapsedWidth\" | \"sidebarWidth\">,\r\n): void {\r\n if (settings.sidebarCollapsedWidth > settings.sidebarWidth) {\r\n throw new RangeError(\"sidebarCollapsedWidth 不能大于 sidebarWidth\");\r\n }\r\n}\r\n\r\n/**\r\n * 校验来自配置文件等不可信来源的设置。\r\n * 未知键为向前兼容而忽略;已知键的非法值会让整次导入失败。\r\n */\r\nexport function sanitizeSettingsPatch(input: unknown): Partial<SettingsState> {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"settings 必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: Partial<SettingsState> = {};\r\n const assign = (key: keyof SettingsState, value: unknown) => {\r\n (result as Record<string, unknown>)[key] = value;\r\n };\r\n\r\n for (const [key, allowed] of Object.entries(ENUM_SETTINGS)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"string\" || !allowed.has(value as never)) {\r\n throw new RangeError(`无效的设置项 ${key}: ${String(value)}`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n for (const key of BOOLEAN_SETTINGS) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`设置项 ${key} 必须是布尔值`);\r\n }\r\n assign(key, value);\r\n }\r\n\r\n for (const [key, range] of Object.entries(NUMBER_RANGES)) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < range[0] ||\r\n value > range[1]\r\n ) {\r\n throw new RangeError(`设置项 ${key} 超出允许范围`);\r\n }\r\n assign(key as keyof SettingsState, value);\r\n }\r\n\r\n if (source.primaryColor !== undefined) {\r\n if (\r\n typeof source.primaryColor !== \"string\" ||\r\n !/^#[0-9a-fA-F]{6}$/.test(source.primaryColor)\r\n ) {\r\n throw new RangeError(\"primaryColor 必须是 #rrggbb 格式\");\r\n }\r\n result.primaryColor = source.primaryColor;\r\n }\r\n\r\n if (source.version !== undefined) {\r\n if (typeof source.version !== \"string\" || source.version.length > 50) {\r\n throw new TypeError(\"version 必须是长度不超过 50 的字符串\");\r\n }\r\n result.version = source.version;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 一次性校验完整导入文件。此函数不修改任何响应式状态或浏览器 API,\r\n * 消费方可以在成功返回后再原子应用结果。\r\n */\r\nexport function sanitizeLayoutSettingsConfig(\r\n input: unknown,\r\n): LayoutSettingsConfig {\r\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\r\n throw new TypeError(\"配置文件根节点必须是对象\");\r\n }\r\n\r\n const source = input as Record<string, unknown>;\r\n const result: LayoutSettingsConfig = {};\r\n\r\n if (source.schemaVersion !== undefined) {\r\n if (\r\n typeof source.schemaVersion !== \"number\" ||\r\n !Number.isInteger(source.schemaVersion) ||\r\n source.schemaVersion < 1 ||\r\n source.schemaVersion > SETTINGS_CONFIG_SCHEMA_VERSION\r\n ) {\r\n throw new RangeError(\"不支持的配置格式版本\");\r\n }\r\n result.schemaVersion = source.schemaVersion;\r\n }\r\n\r\n if (source.settings !== undefined) {\r\n result.settings = sanitizeSettingsPatch(source.settings);\r\n }\r\n\r\n for (const key of [\"gray\", \"colorWeak\"] as const) {\r\n const value = source[key];\r\n if (value === undefined) continue;\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(`${key} 必须是布尔值`);\r\n }\r\n result[key] = value;\r\n }\r\n\r\n if (source.watermark !== undefined) {\r\n if (\r\n !source.watermark ||\r\n typeof source.watermark !== \"object\" ||\r\n Array.isArray(source.watermark)\r\n ) {\r\n throw new TypeError(\"watermark 必须是对象\");\r\n }\r\n const watermark = source.watermark as Record<string, unknown>;\r\n if (\r\n typeof watermark.enabled !== \"boolean\" ||\r\n typeof watermark.text !== \"string\" ||\r\n watermark.text.length > 200\r\n ) {\r\n throw new TypeError(\"watermark 配置无效\");\r\n }\r\n result.watermark = {\r\n enabled: watermark.enabled,\r\n text: watermark.text,\r\n };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 调整颜色亮度。\r\n * @returns 调整后的 #rrggbb;输入非法时原样返回。\r\n */\r\nexport function adjustColor(color: string, amount: number): string {\r\n if (typeof color !== \"string\") return \"#000000\";\r\n if (!Number.isFinite(amount)) return color;\r\n const normalizedAmount = Math.round(amount);\r\n const trimmedColor = color.trim();\r\n let hex = trimmedColor.startsWith(\"#\") ? trimmedColor.slice(1) : trimmedColor;\r\n if (hex.length === 3) {\r\n hex = hex\r\n .split(\"\")\r\n .map((character) => character + character)\r\n .join(\"\");\r\n }\r\n if (!/^[0-9a-fA-F]{6}$/.test(hex)) return color;\r\n\r\n const value = parseInt(hex, 16);\r\n const red = Math.min(255, Math.max(0, (value >> 16) + normalizedAmount));\r\n const green = Math.min(\r\n 255,\r\n Math.max(0, ((value >> 8) & 0x00ff) + normalizedAmount),\r\n );\r\n const blue = Math.min(\r\n 255,\r\n Math.max(0, (value & 0x0000ff) + normalizedAmount),\r\n );\r\n return `#${((red << 16) | (green << 8) | blue).toString(16).padStart(6, \"0\")}`;\r\n}\r\n","/**\r\n * 布局和设置系统 - 常量定义\r\n */\r\n\r\nimport type {\r\n ThemePreset,\r\n SettingsState,\r\n LayoutInfo,\r\n PresetColor,\r\n} from \"../core/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:view-dashboard-outline\",\r\n },\r\n {\r\n mode: \"mix-top\",\r\n label: \"顶部混合\",\r\n description: \"侧边优先的混合布局\",\r\n icon: \"i-mdi:view-dashboard-variant-outline\",\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 menuExpandMode: \"inline\",\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: \"3.2.1\",\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"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./vue-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./vue-DVWXVFUx.cjs`),t=require(`./naive-CuOhPLBc.cjs`);exports.BORDER_RADIUS_MAP=e.d,exports.BrandLogo=t.v,exports.COLOR_SWATCHES=e.f,exports.C_CardLayout=t.t,exports.C_LayoutContainer=t.b,exports.C_MixLayout=t.n,exports.C_MixTopLayout=t.r,exports.C_ReverseHorizontalMixLayout=t.i,exports.C_SideLayout=t.a,exports.C_TopLayout=t.o,exports.CardLayout=t.s,exports.DEFAULT_BRAND_CONFIG=e.j,exports.DEFAULT_SETTINGS=e.p,exports.DRAWER_HANDLER_KEY=e.M,exports.DrawerMenu=t.m,exports.FloatingMenu=t.g,exports.IconMenu=t._,exports.LAYOUT_CONTEXT_KEY=e.N,exports.LAYOUT_MODES=e.m,exports.LAYOUT_SETTINGS_KEY=e.P,exports.LayoutActionUnavailableError=e.t,exports.MENU_COLLAPSE_KEY=e.F,exports.MenuTrigger=t.p,exports.MixLayout=t.c,exports.MixTopLayout=t.l,exports.PRESET_COLORS=e.h,exports.ResponsiveMenu=t.x,exports.ReverseHorizontalMixLayout=t.u,exports.SETTINGS_CONFIG_SCHEMA_VERSION=e.v,exports.SettingsDrawer=t.y,exports.SideLayout=t.d,exports.SideMenu=t.h,exports.THEME_PRESETS=e.g,exports.TRANSITION_MAP=e._,exports.TopLayout=t.f,exports.adjustColor=e.y,exports.assertLayoutSettingsRelationships=e.b,exports.bindLayoutCssVariables=e.l,exports.calculateVisibleMenuCount=e.E,exports.createLayoutContext=e.r,exports.createSettingsStore=e.s,exports.estimateMenuItemWidth=e.D,exports.isPathSegmentPrefix=e.w,exports.normalizeLayoutMenus=e.a,exports.provideLayout=e.i,exports.provideLayoutContext=e.I,exports.sanitizeLayoutSettingsConfig=e.x,exports.sanitizeSettingsPatch=e.S,exports.setupLayout=e.o,exports.shouldCacheRoute=e.k,exports.useLayoutCache=e.A,exports.useLayoutContext=e.L,exports.useLayoutCssVariables=e.u,exports.useLayoutIcon=e.C,exports.useMenuSplit=e.T,exports.useResponsiveMenu=e.O,exports.useSettingsController=e.n,exports.useSettingsStore=e.c;
|
package/dist/index.d.cts
CHANGED
|
@@ -1949,14 +1949,6 @@ declare type MenuExpandMode_2 = "inline" | "panel";
|
|
|
1949
1949
|
*/
|
|
1950
1950
|
export declare type MenuItemType = "group" | "divider" | "item";
|
|
1951
1951
|
|
|
1952
|
-
/**
|
|
1953
|
-
* 菜单项类型
|
|
1954
|
-
* - `group` 分组
|
|
1955
|
-
* - `divider` 分割线
|
|
1956
|
-
* - `item` 普通菜单项
|
|
1957
|
-
*/
|
|
1958
|
-
declare type MenuItemType_2 = "group" | "divider" | "item";
|
|
1959
|
-
|
|
1960
1952
|
/** 可由宿主通过交叉类型安全扩展的菜单元数据。 */
|
|
1961
1953
|
export declare interface MenuMeta extends Record<string, unknown> {
|
|
1962
1954
|
/** 页面标题 */
|
|
@@ -1998,7 +1990,7 @@ declare interface MenuMeta_2 extends Record<string, unknown> {
|
|
|
1998
1990
|
*/
|
|
1999
1991
|
export declare interface MenuOptions<TMeta extends MenuMeta = MenuMeta> {
|
|
2000
1992
|
/** 菜单项类型(分组/分割线) */
|
|
2001
|
-
type?:
|
|
1993
|
+
type?: "group" | "divider";
|
|
2002
1994
|
/** 唯一标识 */
|
|
2003
1995
|
key?: string;
|
|
2004
1996
|
/** 菜单跳转路径 */
|
|
@@ -2629,7 +2621,7 @@ export declare interface UseMenuSplitReturn {
|
|
|
2629
2621
|
export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
2630
2622
|
containerRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
|
|
2631
2623
|
hiddenItems: Ref< {
|
|
2632
|
-
type?:
|
|
2624
|
+
type?: "group" | "divider" | undefined;
|
|
2633
2625
|
key?: string | undefined;
|
|
2634
2626
|
path?: string | undefined;
|
|
2635
2627
|
name?: string | undefined;
|
|
@@ -2650,7 +2642,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2650
2642
|
} | undefined;
|
|
2651
2643
|
children?: /*elided*/ any[] | undefined;
|
|
2652
2644
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2653
|
-
type?:
|
|
2645
|
+
type?: "group" | "divider" | undefined;
|
|
2654
2646
|
key?: string | undefined;
|
|
2655
2647
|
path?: string | undefined;
|
|
2656
2648
|
name?: string | undefined;
|
|
@@ -2673,7 +2665,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2673
2665
|
}[]>;
|
|
2674
2666
|
refresh: () => void;
|
|
2675
2667
|
visibleItems: Ref< {
|
|
2676
|
-
type?:
|
|
2668
|
+
type?: "group" | "divider" | undefined;
|
|
2677
2669
|
key?: string | undefined;
|
|
2678
2670
|
path?: string | undefined;
|
|
2679
2671
|
name?: string | undefined;
|
|
@@ -2694,7 +2686,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2694
2686
|
} | undefined;
|
|
2695
2687
|
children?: /*elided*/ any[] | undefined;
|
|
2696
2688
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2697
|
-
type?:
|
|
2689
|
+
type?: "group" | "divider" | undefined;
|
|
2698
2690
|
key?: string | undefined;
|
|
2699
2691
|
path?: string | undefined;
|
|
2700
2692
|
name?: string | undefined;
|
package/dist/index.d.ts
CHANGED
|
@@ -1949,14 +1949,6 @@ declare type MenuExpandMode_2 = "inline" | "panel";
|
|
|
1949
1949
|
*/
|
|
1950
1950
|
export declare type MenuItemType = "group" | "divider" | "item";
|
|
1951
1951
|
|
|
1952
|
-
/**
|
|
1953
|
-
* 菜单项类型
|
|
1954
|
-
* - `group` 分组
|
|
1955
|
-
* - `divider` 分割线
|
|
1956
|
-
* - `item` 普通菜单项
|
|
1957
|
-
*/
|
|
1958
|
-
declare type MenuItemType_2 = "group" | "divider" | "item";
|
|
1959
|
-
|
|
1960
1952
|
/** 可由宿主通过交叉类型安全扩展的菜单元数据。 */
|
|
1961
1953
|
export declare interface MenuMeta extends Record<string, unknown> {
|
|
1962
1954
|
/** 页面标题 */
|
|
@@ -1998,7 +1990,7 @@ declare interface MenuMeta_2 extends Record<string, unknown> {
|
|
|
1998
1990
|
*/
|
|
1999
1991
|
export declare interface MenuOptions<TMeta extends MenuMeta = MenuMeta> {
|
|
2000
1992
|
/** 菜单项类型(分组/分割线) */
|
|
2001
|
-
type?:
|
|
1993
|
+
type?: "group" | "divider";
|
|
2002
1994
|
/** 唯一标识 */
|
|
2003
1995
|
key?: string;
|
|
2004
1996
|
/** 菜单跳转路径 */
|
|
@@ -2629,7 +2621,7 @@ export declare interface UseMenuSplitReturn {
|
|
|
2629
2621
|
export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
2630
2622
|
containerRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
|
|
2631
2623
|
hiddenItems: Ref< {
|
|
2632
|
-
type?:
|
|
2624
|
+
type?: "group" | "divider" | undefined;
|
|
2633
2625
|
key?: string | undefined;
|
|
2634
2626
|
path?: string | undefined;
|
|
2635
2627
|
name?: string | undefined;
|
|
@@ -2650,7 +2642,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2650
2642
|
} | undefined;
|
|
2651
2643
|
children?: /*elided*/ any[] | undefined;
|
|
2652
2644
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2653
|
-
type?:
|
|
2645
|
+
type?: "group" | "divider" | undefined;
|
|
2654
2646
|
key?: string | undefined;
|
|
2655
2647
|
path?: string | undefined;
|
|
2656
2648
|
name?: string | undefined;
|
|
@@ -2673,7 +2665,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2673
2665
|
}[]>;
|
|
2674
2666
|
refresh: () => void;
|
|
2675
2667
|
visibleItems: Ref< {
|
|
2676
|
-
type?:
|
|
2668
|
+
type?: "group" | "divider" | undefined;
|
|
2677
2669
|
key?: string | undefined;
|
|
2678
2670
|
path?: string | undefined;
|
|
2679
2671
|
name?: string | undefined;
|
|
@@ -2694,7 +2686,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2694
2686
|
} | undefined;
|
|
2695
2687
|
children?: /*elided*/ any[] | undefined;
|
|
2696
2688
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2697
|
-
type?:
|
|
2689
|
+
type?: "group" | "divider" | undefined;
|
|
2698
2690
|
key?: string | undefined;
|
|
2699
2691
|
path?: string | undefined;
|
|
2700
2692
|
name?: string | undefined;
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, S as d, T as f, _ as p, a as m, b as h, c as g, d as _, f as v, g as y, h as b, i as x, j as S, k as C, l as w, m as T, n as E, o as D, p as O, r as k, s as A, t as j, u as M, v as N, w as P, x as F, y as I } from "./vue-
|
|
2
|
-
import { _ as L, a as R, b as z, c as B, d as V, f as H, g as U, h as W, i as G, l as K, m as q, n as J, o as Y, p as X, r as Z, s as Q, t as $, u as ee, v as te, x as ne, y as re } from "./naive-
|
|
1
|
+
import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, S as d, T as f, _ as p, a as m, b as h, c as g, d as _, f as v, g as y, h as b, i as x, j as S, k as C, l as w, m as T, n as E, o as D, p as O, r as k, s as A, t as j, u as M, v as N, w as P, x as F, y as I } from "./vue-h8jl2I5K.js";
|
|
2
|
+
import { _ as L, a as R, b as z, c as B, d as V, f as H, g as U, h as W, i as G, l as K, m as q, n as J, o as Y, p as X, r as Z, s as Q, t as $, u as ee, v as te, x as ne, y as re } from "./naive-AliKeHvO.js";
|
|
3
3
|
export { _ as BORDER_RADIUS_MAP, te as BrandLogo, v as COLOR_SWATCHES, $ as C_CardLayout, z as C_LayoutContainer, J as C_MixLayout, Z as C_MixTopLayout, G as C_ReverseHorizontalMixLayout, R as C_SideLayout, Y as C_TopLayout, Q as CardLayout, S as DEFAULT_BRAND_CONFIG, O as DEFAULT_SETTINGS, s as DRAWER_HANDLER_KEY, q as DrawerMenu, U as FloatingMenu, L as IconMenu, c as LAYOUT_CONTEXT_KEY, T as LAYOUT_MODES, u as LAYOUT_SETTINGS_KEY, j as LayoutActionUnavailableError, i as MENU_COLLAPSE_KEY, X as MenuTrigger, B as MixLayout, K as MixTopLayout, b as PRESET_COLORS, ne as ResponsiveMenu, ee as ReverseHorizontalMixLayout, N as SETTINGS_CONFIG_SCHEMA_VERSION, re as SettingsDrawer, V as SideLayout, W as SideMenu, y as THEME_PRESETS, p as TRANSITION_MAP, H as TopLayout, I as adjustColor, h as assertLayoutSettingsRelationships, w as bindLayoutCssVariables, r as calculateVisibleMenuCount, k as createLayoutContext, A as createSettingsStore, n as estimateMenuItemWidth, P as isPathSegmentPrefix, m as normalizeLayoutMenus, x as provideLayout, a as provideLayoutContext, F as sanitizeLayoutSettingsConfig, d as sanitizeSettingsPatch, D as setupLayout, C as shouldCacheRoute, e as useLayoutCache, o as useLayoutContext, M as useLayoutCssVariables, t as useLayoutIcon, f as useMenuSplit, l as useResponsiveMenu, E as useSettingsController, g as useSettingsStore };
|
package/dist/naive/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../vue-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../vue-DVWXVFUx.cjs`),t=require(`../naive-CuOhPLBc.cjs`);exports.BORDER_RADIUS_MAP=e.d,exports.BrandLogo=t.v,exports.COLOR_SWATCHES=e.f,exports.C_CardLayout=t.t,exports.C_LayoutContainer=t.b,exports.C_MixLayout=t.n,exports.C_MixTopLayout=t.r,exports.C_ReverseHorizontalMixLayout=t.i,exports.C_SideLayout=t.a,exports.C_TopLayout=t.o,exports.CardLayout=t.s,exports.DEFAULT_BRAND_CONFIG=e.j,exports.DEFAULT_SETTINGS=e.p,exports.DRAWER_HANDLER_KEY=e.M,exports.DrawerMenu=t.m,exports.FloatingMenu=t.g,exports.IconMenu=t._,exports.LAYOUT_CONTEXT_KEY=e.N,exports.LAYOUT_MODES=e.m,exports.LAYOUT_SETTINGS_KEY=e.P,exports.LayoutActionUnavailableError=e.t,exports.MENU_COLLAPSE_KEY=e.F,exports.MenuTrigger=t.p,exports.MixLayout=t.c,exports.MixTopLayout=t.l,exports.PRESET_COLORS=e.h,exports.ResponsiveMenu=t.x,exports.ReverseHorizontalMixLayout=t.u,exports.SETTINGS_CONFIG_SCHEMA_VERSION=e.v,exports.SettingsDrawer=t.y,exports.SideLayout=t.d,exports.SideMenu=t.h,exports.THEME_PRESETS=e.g,exports.TRANSITION_MAP=e._,exports.TopLayout=t.f,exports.adjustColor=e.y,exports.assertLayoutSettingsRelationships=e.b,exports.bindLayoutCssVariables=e.l,exports.calculateVisibleMenuCount=e.E,exports.createLayoutContext=e.r,exports.createSettingsStore=e.s,exports.estimateMenuItemWidth=e.D,exports.isPathSegmentPrefix=e.w,exports.normalizeLayoutMenus=e.a,exports.provideLayout=e.i,exports.provideLayoutContext=e.I,exports.sanitizeLayoutSettingsConfig=e.x,exports.sanitizeSettingsPatch=e.S,exports.setupLayout=e.o,exports.shouldCacheRoute=e.k,exports.useLayoutCache=e.A,exports.useLayoutContext=e.L,exports.useLayoutCssVariables=e.u,exports.useLayoutIcon=e.C,exports.useMenuSplit=e.T,exports.useResponsiveMenu=e.O,exports.useSettingsController=e.n,exports.useSettingsStore=e.c;
|
package/dist/naive/index.d.cts
CHANGED
|
@@ -1949,14 +1949,6 @@ declare type MenuExpandMode_2 = "inline" | "panel";
|
|
|
1949
1949
|
*/
|
|
1950
1950
|
export declare type MenuItemType = "group" | "divider" | "item";
|
|
1951
1951
|
|
|
1952
|
-
/**
|
|
1953
|
-
* 菜单项类型
|
|
1954
|
-
* - `group` 分组
|
|
1955
|
-
* - `divider` 分割线
|
|
1956
|
-
* - `item` 普通菜单项
|
|
1957
|
-
*/
|
|
1958
|
-
declare type MenuItemType_2 = "group" | "divider" | "item";
|
|
1959
|
-
|
|
1960
1952
|
/** 可由宿主通过交叉类型安全扩展的菜单元数据。 */
|
|
1961
1953
|
export declare interface MenuMeta extends Record<string, unknown> {
|
|
1962
1954
|
/** 页面标题 */
|
|
@@ -1998,7 +1990,7 @@ declare interface MenuMeta_2 extends Record<string, unknown> {
|
|
|
1998
1990
|
*/
|
|
1999
1991
|
export declare interface MenuOptions<TMeta extends MenuMeta = MenuMeta> {
|
|
2000
1992
|
/** 菜单项类型(分组/分割线) */
|
|
2001
|
-
type?:
|
|
1993
|
+
type?: "group" | "divider";
|
|
2002
1994
|
/** 唯一标识 */
|
|
2003
1995
|
key?: string;
|
|
2004
1996
|
/** 菜单跳转路径 */
|
|
@@ -2629,7 +2621,7 @@ export declare interface UseMenuSplitReturn {
|
|
|
2629
2621
|
export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
2630
2622
|
containerRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
|
|
2631
2623
|
hiddenItems: Ref< {
|
|
2632
|
-
type?:
|
|
2624
|
+
type?: "group" | "divider" | undefined;
|
|
2633
2625
|
key?: string | undefined;
|
|
2634
2626
|
path?: string | undefined;
|
|
2635
2627
|
name?: string | undefined;
|
|
@@ -2650,7 +2642,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2650
2642
|
} | undefined;
|
|
2651
2643
|
children?: /*elided*/ any[] | undefined;
|
|
2652
2644
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2653
|
-
type?:
|
|
2645
|
+
type?: "group" | "divider" | undefined;
|
|
2654
2646
|
key?: string | undefined;
|
|
2655
2647
|
path?: string | undefined;
|
|
2656
2648
|
name?: string | undefined;
|
|
@@ -2673,7 +2665,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2673
2665
|
}[]>;
|
|
2674
2666
|
refresh: () => void;
|
|
2675
2667
|
visibleItems: Ref< {
|
|
2676
|
-
type?:
|
|
2668
|
+
type?: "group" | "divider" | undefined;
|
|
2677
2669
|
key?: string | undefined;
|
|
2678
2670
|
path?: string | undefined;
|
|
2679
2671
|
name?: string | undefined;
|
|
@@ -2694,7 +2686,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2694
2686
|
} | undefined;
|
|
2695
2687
|
children?: /*elided*/ any[] | undefined;
|
|
2696
2688
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2697
|
-
type?:
|
|
2689
|
+
type?: "group" | "divider" | undefined;
|
|
2698
2690
|
key?: string | undefined;
|
|
2699
2691
|
path?: string | undefined;
|
|
2700
2692
|
name?: string | undefined;
|
package/dist/naive/index.d.ts
CHANGED
|
@@ -1949,14 +1949,6 @@ declare type MenuExpandMode_2 = "inline" | "panel";
|
|
|
1949
1949
|
*/
|
|
1950
1950
|
export declare type MenuItemType = "group" | "divider" | "item";
|
|
1951
1951
|
|
|
1952
|
-
/**
|
|
1953
|
-
* 菜单项类型
|
|
1954
|
-
* - `group` 分组
|
|
1955
|
-
* - `divider` 分割线
|
|
1956
|
-
* - `item` 普通菜单项
|
|
1957
|
-
*/
|
|
1958
|
-
declare type MenuItemType_2 = "group" | "divider" | "item";
|
|
1959
|
-
|
|
1960
1952
|
/** 可由宿主通过交叉类型安全扩展的菜单元数据。 */
|
|
1961
1953
|
export declare interface MenuMeta extends Record<string, unknown> {
|
|
1962
1954
|
/** 页面标题 */
|
|
@@ -1998,7 +1990,7 @@ declare interface MenuMeta_2 extends Record<string, unknown> {
|
|
|
1998
1990
|
*/
|
|
1999
1991
|
export declare interface MenuOptions<TMeta extends MenuMeta = MenuMeta> {
|
|
2000
1992
|
/** 菜单项类型(分组/分割线) */
|
|
2001
|
-
type?:
|
|
1993
|
+
type?: "group" | "divider";
|
|
2002
1994
|
/** 唯一标识 */
|
|
2003
1995
|
key?: string;
|
|
2004
1996
|
/** 菜单跳转路径 */
|
|
@@ -2629,7 +2621,7 @@ export declare interface UseMenuSplitReturn {
|
|
|
2629
2621
|
export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
2630
2622
|
containerRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
|
|
2631
2623
|
hiddenItems: Ref< {
|
|
2632
|
-
type?:
|
|
2624
|
+
type?: "group" | "divider" | undefined;
|
|
2633
2625
|
key?: string | undefined;
|
|
2634
2626
|
path?: string | undefined;
|
|
2635
2627
|
name?: string | undefined;
|
|
@@ -2650,7 +2642,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2650
2642
|
} | undefined;
|
|
2651
2643
|
children?: /*elided*/ any[] | undefined;
|
|
2652
2644
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2653
|
-
type?:
|
|
2645
|
+
type?: "group" | "divider" | undefined;
|
|
2654
2646
|
key?: string | undefined;
|
|
2655
2647
|
path?: string | undefined;
|
|
2656
2648
|
name?: string | undefined;
|
|
@@ -2673,7 +2665,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2673
2665
|
}[]>;
|
|
2674
2666
|
refresh: () => void;
|
|
2675
2667
|
visibleItems: Ref< {
|
|
2676
|
-
type?:
|
|
2668
|
+
type?: "group" | "divider" | undefined;
|
|
2677
2669
|
key?: string | undefined;
|
|
2678
2670
|
path?: string | undefined;
|
|
2679
2671
|
name?: string | undefined;
|
|
@@ -2694,7 +2686,7 @@ export declare function useResponsiveMenu(options: UseResponsiveMenuOptions): {
|
|
|
2694
2686
|
} | undefined;
|
|
2695
2687
|
children?: /*elided*/ any[] | undefined;
|
|
2696
2688
|
}[], MenuOptions<MenuMeta_2>[] | {
|
|
2697
|
-
type?:
|
|
2689
|
+
type?: "group" | "divider" | undefined;
|
|
2698
2690
|
key?: string | undefined;
|
|
2699
2691
|
path?: string | undefined;
|
|
2700
2692
|
name?: string | undefined;
|
package/dist/naive/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, S as d, T as f, _ as p, a as m, b as h, c as g, d as _, f as v, g as y, h as b, i as x, j as S, k as C, l as w, m as T, n as E, o as D, p as O, r as k, s as A, t as j, u as M, v as N, w as P, x as F, y as I } from "../vue-
|
|
2
|
-
import { _ as L, a as R, b as z, c as B, d as V, f as H, g as U, h as W, i as G, l as K, m as q, n as J, o as Y, p as X, r as Z, s as Q, t as $, u as ee, v as te, x as ne, y as re } from "../naive-
|
|
1
|
+
import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, S as d, T as f, _ as p, a as m, b as h, c as g, d as _, f as v, g as y, h as b, i as x, j as S, k as C, l as w, m as T, n as E, o as D, p as O, r as k, s as A, t as j, u as M, v as N, w as P, x as F, y as I } from "../vue-h8jl2I5K.js";
|
|
2
|
+
import { _ as L, a as R, b as z, c as B, d as V, f as H, g as U, h as W, i as G, l as K, m as q, n as J, o as Y, p as X, r as Z, s as Q, t as $, u as ee, v as te, x as ne, y as re } from "../naive-AliKeHvO.js";
|
|
3
3
|
export { _ as BORDER_RADIUS_MAP, te as BrandLogo, v as COLOR_SWATCHES, $ as C_CardLayout, z as C_LayoutContainer, J as C_MixLayout, Z as C_MixTopLayout, G as C_ReverseHorizontalMixLayout, R as C_SideLayout, Y as C_TopLayout, Q as CardLayout, S as DEFAULT_BRAND_CONFIG, O as DEFAULT_SETTINGS, s as DRAWER_HANDLER_KEY, q as DrawerMenu, U as FloatingMenu, L as IconMenu, c as LAYOUT_CONTEXT_KEY, T as LAYOUT_MODES, u as LAYOUT_SETTINGS_KEY, j as LayoutActionUnavailableError, i as MENU_COLLAPSE_KEY, X as MenuTrigger, B as MixLayout, K as MixTopLayout, b as PRESET_COLORS, ne as ResponsiveMenu, ee as ReverseHorizontalMixLayout, N as SETTINGS_CONFIG_SCHEMA_VERSION, re as SettingsDrawer, V as SideLayout, W as SideMenu, y as THEME_PRESETS, p as TRANSITION_MAP, H as TopLayout, I as adjustColor, h as assertLayoutSettingsRelationships, w as bindLayoutCssVariables, r as calculateVisibleMenuCount, k as createLayoutContext, A as createSettingsStore, n as estimateMenuItemWidth, P as isPathSegmentPrefix, m as normalizeLayoutMenus, x as provideLayout, a as provideLayoutContext, F as sanitizeLayoutSettingsConfig, d as sanitizeSettingsPatch, D as setupLayout, C as shouldCacheRoute, e as useLayoutCache, o as useLayoutContext, M as useLayoutCssVariables, t as useLayoutIcon, f as useMenuSplit, l as useResponsiveMenu, E as useSettingsController, g as useSettingsStore };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as e, C as t, F as n, L as r, M as i, O as a, P as o, T as s, c, f as l, g as u, j as d, n as f, t as p } from "./vue-
|
|
1
|
+
import { A as e, C as t, F as n, L as r, M as i, O as a, P as o, T as s, c, f as l, g as u, j as d, n as f, t as p } from "./vue-h8jl2I5K.js";
|
|
2
2
|
import { Fragment as m, KeepAlive as h, Transition as g, computed as _, createBlock as v, createCommentVNode as y, createElementBlock as b, createElementVNode as x, createSlots as S, createTextVNode as C, createVNode as w, defineComponent as T, h as E, inject as D, isRef as O, mergeModels as k, normalizeClass as A, normalizeStyle as j, onUnmounted as M, openBlock as N, provide as P, ref as F, renderList as I, renderSlot as L, resolveComponent as ee, resolveDynamicComponent as R, toDisplayString as z, unref as B, useModel as te, watch as ne, withCtx as V, withKeys as H, withModifiers as U } from "vue";
|
|
3
3
|
import { NButton as W, NColorPicker as re, NDrawer as ie, NDrawerContent as ae, NDropdown as oe, NInput as se, NLayout as G, NLayoutContent as K, NLayoutSider as ce, NMenu as le, NRadioButton as q, NRadioGroup as J, NSlider as ue, NSwitch as Y, NTabPane as X, NTabs as de, useDialog as fe, useMessage as pe } from "naive-ui";
|
|
4
4
|
import { useRoute as me, useRouter as he } from "vue-router";
|
|
@@ -1632,4 +1632,4 @@ var Z = /* @__PURE__ */ T({
|
|
|
1632
1632
|
//#endregion
|
|
1633
1633
|
export { Cr as _, oi as a, en as b, mi as c, fi as d, pi as f, Fr as g, Kr as h, ui as i, hi as l, ii as m, ci as n, si as o, ai as p, li as r, _i as s, di as t, gi as u, _r as v, $ as x, lr as y };
|
|
1634
1634
|
|
|
1635
|
-
//# sourceMappingURL=naive-
|
|
1635
|
+
//# sourceMappingURL=naive-AliKeHvO.js.map
|