@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
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),a=require("naive-ui"),A=require("pinia"),O=[{name:"拂晓蓝",value:"#409eff"},{name:"薄暮红",value:"#f5222d"},{name:"火山橙",value:"#fa541c"},{name:"日暮黄",value:"#faad14"},{name:"极光绿",value:"#52c41a"},{name:"明青",value:"#13c2c2"},{name:"极客蓝",value:"#2f54eb"},{name:"酱紫",value:"#722ed1"}],P=[{name:"科技蓝",icon:"💙",primaryColor:"#409eff"},{name:"清新绿",icon:"💚",primaryColor:"#52c41a"},{name:"商务灰",icon:"🖤",primaryColor:"#595959"},{name:"活力橙",icon:"🧡",primaryColor:"#fa8c16"},{name:"优雅紫",icon:"💜",primaryColor:"#722ed1"},{name:"经典红",icon:"❤️",primaryColor:"#f5222d"}],F=[{mode:"side",label:"左侧菜单",description:"经典的左侧导航布局",icon:"i-mdi:page-layout-sidebar-left"},{mode:"top",label:"顶部菜单",description:"顶部水平导航布局",icon:"i-mdi:page-layout-header"},{mode:"mix",label:"混合菜单",description:"顶部 + 侧边混合布局",icon:"i-mdi:page-layout-header-sidebar-left"},{mode:"mix-top",label:"顶部混合",description:"侧边优先的混合布局",icon:"i-mdi:page-layout-sidebar-left-header"},{mode:"reverse-horizontal-mix",label:"反转混合",description:"反转的水平混合布局",icon:"i-mdi:page-layout-header-footer"},{mode:"card-layout",label:"卡片布局",description:"卡片式布局风格",icon:"i-mdi:card-outline"}],D={small:"4px",medium:"6px",large:"8px"},W={fade:"fade-transform",slide:"fade-slide",zoom:"fade-zoom",none:""},r={themeMode:"light",primaryColor:"#409eff",borderRadius:"medium",transitionType:"slide",enableTransition:!0,layoutMode:"side",fixedHeader:!0,showBreadcrumb:!0,showBreadcrumbIcon:!0,showTagsView:!0,tagsViewHeight:44,tagsViewStyle:"default",showFooter:!0,sidebarWidth:220,sidebarCollapsedWidth:64,headerHeight:56,enableHotkeys:!0,version:"1.0.0"},$=O.map(v=>v.value);function U(v,i){const d=parseInt(v.replace("#",""),16),o=Math.min(255,Math.max(0,(d>>16)+i)),p=Math.min(255,Math.max(0,(d>>8&255)+i)),u=Math.min(255,Math.max(0,(d&255)+i));return`#${(o<<16|p<<8|u).toString(16).padStart(6,"0")}`}function H(v={}){const{defaults:i={},onThemeModeChange:d}=v,o={...r,...i};return A.defineStore("settings",()=>{const p=e.ref(o.themeMode),u=e.ref(o.primaryColor),g=e.ref(o.borderRadius),m=e.ref(o.transitionType),f=e.ref(o.enableTransition),y=e.ref(o.layoutMode),c=e.ref(o.fixedHeader),V=e.ref(o.showBreadcrumb),S=e.ref(o.showBreadcrumbIcon),N=e.ref(o.showTagsView),b=e.ref(o.tagsViewHeight),T=e.ref(o.tagsViewStyle),k=e.ref(o.showFooter),x=e.ref(o.sidebarWidth),E=e.ref(o.sidebarCollapsedWidth),C=e.ref(o.headerHeight),B=e.ref(o.enableHotkeys),M=e.ref(o.version),R=e.computed(()=>D[g.value]),_=e.computed(()=>W[m.value]),s=e.computed(()=>f.value&&m.value!=="none"),t=e.computed(()=>({themeMode:p.value,primaryColor:u.value,borderRadius:g.value,transitionType:m.value,enableTransition:f.value,layoutMode:y.value,fixedHeader:c.value,showBreadcrumb:V.value,showBreadcrumbIcon:S.value,showTagsView:N.value,tagsViewHeight:b.value,tagsViewStyle:T.value,showFooter:k.value,sidebarWidth:x.value,sidebarCollapsedWidth:E.value,headerHeight:C.value,enableHotkeys:B.value,version:M.value})),l=()=>{if(typeof document>"u")return;const n=document.documentElement;n.style.setProperty("--primary-color",u.value),n.style.setProperty("--primary-color-hover",U(u.value,10)),n.style.setProperty("--primary-color-pressed",U(u.value,-10)),n.style.setProperty("--border-radius",R.value),n.style.setProperty("--sidebar-width",`${x.value}px`),n.style.setProperty("--sidebar-collapsed-width",`${E.value}px`),n.style.setProperty("--header-height",`${C.value}px`),n.style.setProperty("--tags-view-height",`${b.value}px`)},h=async n=>{u.value=n.primaryColor,n.settings&&(n.settings.borderRadius&&(g.value=n.settings.borderRadius),n.settings.transitionType&&(m.value=n.settings.transitionType),n.settings.showBreadcrumb!==void 0&&(V.value=n.settings.showBreadcrumb),n.settings.showTagsView!==void 0&&(N.value=n.settings.showTagsView),n.settings.tagsViewStyle&&(T.value=n.settings.tagsViewStyle))},w=()=>{p.value=o.themeMode,u.value=o.primaryColor,g.value=o.borderRadius,m.value=o.transitionType,f.value=o.enableTransition,y.value=o.layoutMode,c.value=o.fixedHeader,V.value=o.showBreadcrumb,S.value=o.showBreadcrumbIcon,N.value=o.showTagsView,b.value=o.tagsViewHeight,T.value=o.tagsViewStyle,k.value=o.showFooter,x.value=o.sidebarWidth,E.value=o.sidebarCollapsedWidth,C.value=o.headerHeight,B.value=o.enableHotkeys},I=async n=>{p.value=n,d&&await d(n)};return e.watch([u,R,x,E,C,b],()=>{l()},{immediate:!0}),{themeMode:p,primaryColor:u,borderRadius:g,transitionType:m,enableTransition:f,layoutMode:y,fixedHeader:c,showBreadcrumb:V,showBreadcrumbIcon:S,showTagsView:N,tagsViewHeight:b,tagsViewStyle:T,showFooter:k,sidebarWidth:x,sidebarCollapsedWidth:E,headerHeight:C,enableHotkeys:B,version:M,borderRadiusValue:R,transitionName:_,shouldEnableTransition:s,settingsState:t,syncCSSVariables:l,applyPreset:h,resetSettings:w,updateThemeMode:I}})}const L=H(),z=["#409eff","#f5222d","#fa541c","#faad14","#52c41a","#13c2c2","#2f54eb","#722ed1"],j=[{label:"左侧菜单(默认)",value:"side",disabled:!1,svg:`
|
|
2
|
+
<rect x="0" y="0" width="16" height="48" rx="1" fill="currentColor" fill-opacity="0.9"/>
|
|
3
|
+
<rect x="18" y="0" width="38" height="10" rx="1" fill="currentColor" fill-opacity="0.7"/>
|
|
4
|
+
<rect x="18" y="12" width="38" height="34" rx="1" fill="currentColor" fill-opacity="0.4"/>
|
|
5
|
+
`},{label:"顶部菜单(清爽)",value:"top",disabled:!1,svg:`
|
|
6
|
+
<rect x="0" y="0" width="56" height="10" rx="1" fill="currentColor" fill-opacity="0.9"/>
|
|
7
|
+
<rect x="0" y="12" width="56" height="8" rx="1" fill="currentColor" fill-opacity="0.7"/>
|
|
8
|
+
<rect x="0" y="22" width="56" height="24" rx="1" fill="currentColor" fill-opacity="0.4"/>
|
|
9
|
+
`},{label:"左侧混合(灵巧)",value:"mix",disabled:!1,svg:`
|
|
10
|
+
<rect x="0" y="0" width="8" height="48" rx="1" fill="currentColor" fill-opacity="0.9"/>
|
|
11
|
+
<rect x="10" y="0" width="14" height="48" rx="1" fill="currentColor" fill-opacity="0.7"/>
|
|
12
|
+
<rect x="26" y="0" width="30" height="10" rx="1" fill="currentColor" fill-opacity="0.6"/>
|
|
13
|
+
<rect x="26" y="12" width="30" height="34" rx="1" fill="currentColor" fill-opacity="0.4"/>
|
|
14
|
+
`},{label:"顶部混合(侧优)",value:"mix-top",disabled:!1,svg:`
|
|
15
|
+
<rect x="0" y="0" width="8" height="48" rx="1" fill="currentColor" fill-opacity="0.9"/>
|
|
16
|
+
<rect x="10" y="0" width="46" height="10" rx="1" fill="currentColor" fill-opacity="0.7"/>
|
|
17
|
+
<rect x="10" y="12" width="46" height="34" rx="1" fill="currentColor" fill-opacity="0.4"/>
|
|
18
|
+
`},{label:"反转混合(另类)",value:"reverse-horizontal-mix",disabled:!1,svg:`
|
|
19
|
+
<rect x="0" y="0" width="56" height="10" rx="1" fill="currentColor" fill-opacity="0.9"/>
|
|
20
|
+
<rect x="44" y="12" width="12" height="34" rx="1" fill="currentColor" fill-opacity="0.7"/>
|
|
21
|
+
<rect x="0" y="12" width="42" height="34" rx="1" fill="currentColor" fill-opacity="0.4"/>
|
|
22
|
+
`},{label:"卡片网格(新颖)",value:"card-layout",disabled:!1,svg:`
|
|
23
|
+
<rect x="0" y="0" width="24" height="20" rx="2" fill="currentColor" fill-opacity="0.9"/>
|
|
24
|
+
<rect x="32" y="0" width="24" height="20" rx="2" fill="currentColor" fill-opacity="0.7"/>
|
|
25
|
+
<rect x="0" y="24" width="24" height="20" rx="2" fill="currentColor" fill-opacity="0.6"/>
|
|
26
|
+
<rect x="32" y="24" width="24" height="20" rx="2" fill="currentColor" fill-opacity="0.4"/>
|
|
27
|
+
`}],G={class:"settings-section"},K={class:"preset-grid"},q=["onClick"],J={class:"preset-icon"},Y={class:"preset-name"},X={class:"preset-color"},Q={class:"settings-section"},Z={class:"settings-section"},ee={class:"color-picker-wrapper"},te={class:"color-value"},oe={class:"settings-section"},le={class:"settings-section"},ae={class:"flex items-center justify-between mb-2"},se={class:"settings-section"},ne={class:"settings-section"},ie={class:"layout-grid"},re=["onClick"],de={class:"layout-screenshot"},ue={class:"layout-svg",viewBox:"0 0 56 48",fill:"none",xmlns:"http://www.w3.org/2000/svg"},ce=["innerHTML"],me={class:"layout-label"},fe={key:0,class:"badge-soon"},ve={class:"settings-section"},pe={class:"setting-item"},ge={class:"setting-item"},Ne={class:"setting-item"},he={class:"setting-item"},we={class:"settings-section"},ye={class:"slider-item"},Ve={class:"slider-label"},be={class:"slider-value"},xe={class:"slider-item"},Ee={class:"slider-label"},Ce={class:"slider-value"},Se={class:"settings-section"},Te={class:"settings-section"},ke={class:"action-buttons-grid"},Be={class:"settings-section"},Re={class:"action-buttons-grid"},Me={class:"settings-section"},_e={class:"setting-item"},He={class:"setting-item"},Ue={class:"settings-section"},Oe={class:"setting-item"},Pe={key:0,class:"mt-2"},De={class:"settings-section"},We={class:"system-info"},Le={class:"info-item"},Ie={class:"info-value"},Ae={class:"info-item"},Fe={class:"info-value"},$e={class:"info-item"},ze={class:"info-value"},je={class:"info-item"},Ge={class:"info-value"},Ke={class:"info-item"},qe={class:"info-value"},Je={class:"info-item"},Ye={class:"info-value"},Xe=e.defineComponent({__name:"index",props:e.mergeModels({storageKey:{}},{show:{type:Boolean,default:!1},showModifiers:{}}),emits:["update:show"],setup(v){const i=a.useMessage(),d=a.useDialog(),o=L(),p=e.useModel(v,"show"),u=e.ref("appearance"),g=e.ref(!1),m=e.ref(!1),f=e.ref(!1),y=e.ref("Robot Admin");let c=null;const V=s=>{c&&(document.body.removeChild(c),c=null);const t=document.createElement("canvas"),l=t.getContext("2d");t.width=200,t.height=150,l.font="14px Microsoft JhengHei",l.fillStyle="rgba(120, 120, 120, 0.15)",l.rotate(-20*Math.PI/180),l.fillText(s,0,80),c=document.createElement("div"),c.style.cssText=`
|
|
28
|
+
position: fixed;
|
|
29
|
+
top: 0;
|
|
30
|
+
left: 0;
|
|
31
|
+
width: 100%;
|
|
32
|
+
height: 100%;
|
|
33
|
+
pointer-events: none;
|
|
34
|
+
background-image: url(${t.toDataURL()});
|
|
35
|
+
background-repeat: repeat;
|
|
36
|
+
z-index: 9999;
|
|
37
|
+
user-select: none;
|
|
38
|
+
`,document.body.appendChild(c)},S=()=>{c&&(document.body.removeChild(c),c=null)};e.watch(g,s=>{document.documentElement.classList.toggle("gray-mode",s)}),e.watch(m,s=>{document.documentElement.classList.toggle("color-weak-mode",s)}),e.watch(f,s=>{s?V(y.value):S()}),e.watch(y,s=>{f.value&&V(s)});const N=e.computed(()=>{const s=navigator.userAgent;let t="Unknown",l="Unknown";return s.includes("Chrome")?t="Chrome":s.includes("Firefox")?t="Firefox":s.includes("Safari")?t="Safari":s.includes("Edge")&&(t="Edge"),s.includes("Windows")?l="Windows":s.includes("Mac")?l="macOS":s.includes("Linux")?l="Linux":s.includes("Android")?l="Android":s.includes("iOS")&&(l="iOS"),{browser:t,os:l,resolution:`${window.screen.width} × ${window.screen.height}`,pixelRatio:window.devicePixelRatio+"x",language:navigator.language,timezone:"XIAn"}});e.onUnmounted(()=>{S()});const b=(s,t)=>{s.stopPropagation(),o.layoutMode=t},T=s=>o.primaryColor===s.primaryColor,k=s=>{o.applyPreset(s),i.success(`已应用「${s.name}」主题方案`)},x=()=>{o.themeMode=r.themeMode,o.primaryColor=r.primaryColor,o.borderRadius=r.borderRadius,o.transitionType=r.transitionType,o.enableTransition=r.enableTransition,i.success("已恢复外观默认设置")},E=()=>{o.layoutMode=r.layoutMode,o.showBreadcrumb=r.showBreadcrumb,o.showBreadcrumbIcon=r.showBreadcrumbIcon,o.showTagsView=r.showTagsView,o.showFooter=r.showFooter,o.sidebarWidth=r.sidebarWidth,o.sidebarCollapsedWidth=r.sidebarCollapsedWidth,o.headerHeight=r.headerHeight,o.tagsViewHeight=r.tagsViewHeight,i.success("已恢复布局默认设置")},C=()=>{d.warning({title:"确认重置",content:"确定要恢复默认配置吗?此操作不可撤销。",positiveText:"确认",negativeText:"取消",onPositiveClick:()=>{o.resetSettings(),i.success("已恢复默认配置")}})},B=()=>{d.warning({title:"确认清除",content:"确定要清除浏览器缓存吗?",positiveText:"确认",negativeText:"取消",onPositiveClick:()=>{const s=["theme-mode","robot-admin-settings"];Object.keys(localStorage).forEach(l=>{s.includes(l)||localStorage.removeItem(l)}),sessionStorage.clear(),i.success("缓存已清除")}})},M=()=>{location.reload()},R=()=>{const s={settings:o.settingsState,gray:g.value,colorWeak:m.value,watermark:{enabled:f.value,text:y.value},exportTime:new Date().toISOString()},t=new Blob([JSON.stringify(s,null,2)],{type:"application/json"}),l=URL.createObjectURL(t),h=document.createElement("a");h.href=l,h.download=`robot-admin-config-${Date.now()}.json`,h.click(),URL.revokeObjectURL(l),i.success("配置已导出")},_=()=>{const s=document.createElement("input");s.type="file",s.accept="application/json",s.onchange=async t=>{const l=t.target.files?.[0];if(l)try{const h=await l.text(),w=JSON.parse(h);w.settings&&Object.assign(o,w.settings),w.gray!==void 0&&(g.value=w.gray),w.colorWeak!==void 0&&(m.value=w.colorWeak),w.watermark&&(f.value=w.watermark.enabled,y.value=w.watermark.text),i.success("配置已导入")}catch{i.error("配置文件格式错误")}},s.click()};return(s,t)=>(e.openBlock(),e.createBlock(e.unref(a.NDrawer),{show:p.value,"onUpdate:show":t[16]||(t[16]=l=>p.value=l),width:380,placement:"right","trap-focus":!1,"block-scroll":!1},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NDrawerContent),{title:"⚙️ 布局配置",closable:""},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NTabs),{value:u.value,"onUpdate:value":t[15]||(t[15]=l=>u.value=l),animated:"",class:"settings-tabs"},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NTabPane),{name:"appearance",tab:"🎨 外观"},{default:e.withCtx(()=>[e.createElementVNode("div",G,[e.createElementVNode("div",K,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(P),l=>(e.openBlock(),e.createElementBlock("div",{key:l.name,class:e.normalizeClass(["preset-card",{active:T(l)}]),onClick:h=>k(l)},[e.createElementVNode("div",J,e.toDisplayString(l.icon),1),e.createElementVNode("div",Y,e.toDisplayString(l.name),1),e.createElementVNode("div",X,[e.createElementVNode("span",{class:"color-dot",style:e.normalizeStyle({backgroundColor:l.primaryColor})},null,4)])],10,q))),128))])]),e.createElementVNode("div",Q,[t[20]||(t[20]=e.createElementVNode("div",{class:"section-title"},"主题模式",-1)),e.createVNode(e.unref(a.NRadioGroup),{value:e.unref(o).themeMode,"onUpdate:value":t[0]||(t[0]=l=>e.unref(o).themeMode=l),class:"mode-group"},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NRadioButton),{value:"light"},{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createElementVNode("span",{class:"i-mdi:white-balance-sunny mr-1"},null,-1),e.createTextVNode(" 浅色 ",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"dark"},{default:e.withCtx(()=>[...t[18]||(t[18]=[e.createElementVNode("span",{class:"i-mdi:moon-waning-crescent mr-1"},null,-1),e.createTextVNode(" 深色 ",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"auto"},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createElementVNode("span",{class:"i-mdi:theme-light-dark mr-1"},null,-1),e.createTextVNode(" 自动 ",-1)])]),_:1})]),_:1},8,["value"])]),e.createElementVNode("div",Z,[t[21]||(t[21]=e.createElementVNode("div",{class:"section-title"},"主题色",-1)),e.createElementVNode("div",ee,[e.createVNode(e.unref(a.NColorPicker),{value:e.unref(o).primaryColor,"onUpdate:value":t[1]||(t[1]=l=>e.unref(o).primaryColor=l),"show-alpha":!1,swatches:e.unref(z),actions:["confirm"]},null,8,["value","swatches"]),e.createElementVNode("span",te,e.toDisplayString(e.unref(o).primaryColor),1)])]),e.createElementVNode("div",oe,[t[25]||(t[25]=e.createElementVNode("div",{class:"section-title"},"圆角大小",-1)),e.createVNode(e.unref(a.NRadioGroup),{value:e.unref(o).borderRadius,"onUpdate:value":t[2]||(t[2]=l=>e.unref(o).borderRadius=l),class:"radius-group"},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NRadioButton),{value:"small"},{default:e.withCtx(()=>[...t[22]||(t[22]=[e.createTextVNode("小 (4px)",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"medium"},{default:e.withCtx(()=>[...t[23]||(t[23]=[e.createTextVNode("中 (6px)",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"large"},{default:e.withCtx(()=>[...t[24]||(t[24]=[e.createTextVNode("大 (8px)",-1)])]),_:1})]),_:1},8,["value"])]),e.createElementVNode("div",le,[t[31]||(t[31]=e.createElementVNode("div",{class:"section-title"},"页面动画",-1)),e.createElementVNode("div",ae,[t[26]||(t[26]=e.createElementVNode("span",{class:"text-sm"},"启用动画",-1)),e.createVNode(e.unref(a.NSwitch),{value:e.unref(o).enableTransition,"onUpdate:value":t[3]||(t[3]=l=>e.unref(o).enableTransition=l)},null,8,["value"])]),e.createVNode(e.unref(a.NRadioGroup),{value:e.unref(o).transitionType,"onUpdate:value":t[4]||(t[4]=l=>e.unref(o).transitionType=l),disabled:!e.unref(o).enableTransition,class:"transition-group"},{default:e.withCtx(()=>[e.createVNode(e.unref(a.NRadioButton),{value:"fade"},{default:e.withCtx(()=>[...t[27]||(t[27]=[e.createTextVNode("淡入",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"slide"},{default:e.withCtx(()=>[...t[28]||(t[28]=[e.createTextVNode("滑动",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"zoom"},{default:e.withCtx(()=>[...t[29]||(t[29]=[e.createTextVNode("缩放",-1)])]),_:1}),e.createVNode(e.unref(a.NRadioButton),{value:"none"},{default:e.withCtx(()=>[...t[30]||(t[30]=[e.createTextVNode("无",-1)])]),_:1})]),_:1},8,["value","disabled"])]),e.createElementVNode("div",se,[e.createVNode(e.unref(a.NButton),{block:"",secondary:"",onClick:x},{icon:e.withCtx(()=>[...t[32]||(t[32]=[e.createElementVNode("span",{class:"i-mdi:restore"},null,-1)])]),default:e.withCtx(()=>[t[33]||(t[33]=e.createTextVNode(" 恢复外观默认设置 ",-1))]),_:1})])]),_:1}),e.createVNode(e.unref(a.NTabPane),{name:"layout",tab:"📐 布局"},{default:e.withCtx(()=>[e.createElementVNode("div",ne,[t[34]||(t[34]=e.createElementVNode("div",{class:"section-title"},"布局模式",-1)),e.createElementVNode("div",ie,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(j),l=>(e.openBlock(),e.createElementBlock("div",{key:l.value,class:e.normalizeClass(["layout-item",{active:e.unref(o).layoutMode===l.value,disabled:l.disabled}]),onClick:h=>!l.disabled&&b(h,l.value)},[e.createElementVNode("div",de,[(e.openBlock(),e.createElementBlock("svg",ue,[e.createElementVNode("g",{innerHTML:l.svg},null,8,ce)]))]),e.createElementVNode("div",me,[e.createTextVNode(e.toDisplayString(l.label)+" ",1),l.disabled?(e.openBlock(),e.createElementBlock("span",fe,"敬请期待")):e.createCommentVNode("",!0)])],10,re))),128))])]),e.createElementVNode("div",ve,[t[39]||(t[39]=e.createElementVNode("div",{class:"section-title"},"界面元素",-1)),e.createElementVNode("div",pe,[t[35]||(t[35]=e.createElementVNode("span",null,"显示面包屑",-1)),e.createVNode(e.unref(a.NSwitch),{value:e.unref(o).showBreadcrumb,"onUpdate:value":t[5]||(t[5]=l=>e.unref(o).showBreadcrumb=l)},null,8,["value"])]),e.createElementVNode("div",ge,[t[36]||(t[36]=e.createElementVNode("span",null,"显示面包屑图标",-1)),e.createVNode(e.unref(a.NSwitch),{value:e.unref(o).showBreadcrumbIcon,"onUpdate:value":t[6]||(t[6]=l=>e.unref(o).showBreadcrumbIcon=l),disabled:!e.unref(o).showBreadcrumb},null,8,["value","disabled"])]),e.createElementVNode("div",Ne,[t[37]||(t[37]=e.createElementVNode("span",null,"显示标签页",-1)),e.createVNode(e.unref(a.NSwitch),{value:e.unref(o).showTagsView,"onUpdate:value":t[7]||(t[7]=l=>e.unref(o).showTagsView=l)},null,8,["value"])]),e.createElementVNode("div",he,[t[38]||(t[38]=e.createElementVNode("span",null,"显示页脚",-1)),e.createVNode(e.unref(a.NSwitch),{value:e.unref(o).showFooter,"onUpdate:value":t[8]||(t[8]=l=>e.unref(o).showFooter=l)},null,8,["value"])])]),e.createElementVNode("div",we,[t[42]||(t[42]=e.createElementVNode("div",{class:"section-title"},"尺寸调整",-1)),e.createElementVNode("div",ye,[e.createElementVNode("div",Ve,[t[40]||(t[40]=e.createElementVNode("span",null,"侧边栏宽度",-1)),e.createElementVNode("span",be,e.toDisplayString(e.unref(o).sidebarWidth)+"px",1)]),e.createVNode(e.unref(a.NSlider),{value:e.unref(o).sidebarWidth,"onUpdate:value":t[9]||(t[9]=l=>e.unref(o).sidebarWidth=l),min:180,max:280,step:10,marks:{180:"180",220:"220",280:"280"}},null,8,["value"])]),e.createElementVNode("div",xe,[e.createElementVNode("div",Ee,[t[41]||(t[41]=e.createElementVNode("span",null,"头部高度",-1)),e.createElementVNode("span",Ce,e.toDisplayString(e.unref(o).headerHeight)+"px",1)]),e.createVNode(e.unref(a.NSlider),{value:e.unref(o).headerHeight,"onUpdate:value":t[10]||(t[10]=l=>e.unref(o).headerHeight=l),min:48,max:64,step:4,marks:{48:"48",56:"56",64:"64"}},null,8,["value"])])]),e.createElementVNode("div",Se,[e.createVNode(e.unref(a.NButton),{block:"",secondary:"",onClick:E},{icon:e.withCtx(()=>[...t[43]||(t[43]=[e.createElementVNode("span",{class:"i-mdi:restore"},null,-1)])]),default:e.withCtx(()=>[t[44]||(t[44]=e.createTextVNode(" 恢复布局默认设置 ",-1))]),_:1})])]),_:1}),e.createVNode(e.unref(a.NTabPane),{name:"features",tab:"🔧 功能"},{default:e.withCtx(()=>[e.createElementVNode("div",Te,[t[49]||(t[49]=e.createElementVNode("div",{class:"section-title"},"缓存管理",-1)),e.createElementVNode("div",ke,[e.createVNode(e.unref(a.NButton),{secondary:"",onClick:B},{icon:e.withCtx(()=>[...t[45]||(t[45]=[e.createElementVNode("span",{class:"i-mdi:delete-sweep"},null,-1)])]),default:e.withCtx(()=>[t[46]||(t[46]=e.createTextVNode(" 清除缓存 ",-1))]),_:1}),e.createVNode(e.unref(a.NButton),{secondary:"",onClick:M},{icon:e.withCtx(()=>[...t[47]||(t[47]=[e.createElementVNode("span",{class:"i-mdi:refresh"},null,-1)])]),default:e.withCtx(()=>[t[48]||(t[48]=e.createTextVNode(" 重新加载 ",-1))]),_:1})])]),e.createElementVNode("div",Be,[t[56]||(t[56]=e.createElementVNode("div",{class:"section-title"},"配置管理",-1)),e.createElementVNode("div",Re,[e.createVNode(e.unref(a.NButton),{secondary:"",onClick:R},{icon:e.withCtx(()=>[...t[50]||(t[50]=[e.createElementVNode("span",{class:"i-mdi:download"},null,-1)])]),default:e.withCtx(()=>[t[51]||(t[51]=e.createTextVNode(" 导出配置 ",-1))]),_:1}),e.createVNode(e.unref(a.NButton),{secondary:"",onClick:_},{icon:e.withCtx(()=>[...t[52]||(t[52]=[e.createElementVNode("span",{class:"i-mdi:upload"},null,-1)])]),default:e.withCtx(()=>[t[53]||(t[53]=e.createTextVNode(" 导入配置 ",-1))]),_:1})]),e.createVNode(e.unref(a.NButton),{block:"",type:"error",secondary:"",class:"mt-2",onClick:C},{icon:e.withCtx(()=>[...t[54]||(t[54]=[e.createElementVNode("span",{class:"i-mdi:restore"},null,-1)])]),default:e.withCtx(()=>[t[55]||(t[55]=e.createTextVNode(" 重置所有配置 ",-1))]),_:1})]),e.createElementVNode("div",Me,[t[59]||(t[59]=e.createElementVNode("div",{class:"section-title"},"系统模式",-1)),e.createElementVNode("div",_e,[t[57]||(t[57]=e.createElementVNode("div",{class:"setting-label"},[e.createElementVNode("span",null,"灰色模式"),e.createElementVNode("span",{class:"setting-desc"},"用于哀悼日场景")],-1)),e.createVNode(e.unref(a.NSwitch),{value:g.value,"onUpdate:value":t[11]||(t[11]=l=>g.value=l)},null,8,["value"])]),e.createElementVNode("div",He,[t[58]||(t[58]=e.createElementVNode("div",{class:"setting-label"},[e.createElementVNode("span",null,"色弱模式"),e.createElementVNode("span",{class:"setting-desc"},"提供无障碍访问支持")],-1)),e.createVNode(e.unref(a.NSwitch),{value:m.value,"onUpdate:value":t[12]||(t[12]=l=>m.value=l)},null,8,["value"])])]),e.createElementVNode("div",Ue,[t[61]||(t[61]=e.createElementVNode("div",{class:"section-title"},"水印设置",-1)),e.createElementVNode("div",Oe,[t[60]||(t[60]=e.createElementVNode("span",null,"启用水印",-1)),e.createVNode(e.unref(a.NSwitch),{value:f.value,"onUpdate:value":t[13]||(t[13]=l=>f.value=l)},null,8,["value"])]),f.value?(e.openBlock(),e.createElementBlock("div",Pe,[e.createVNode(e.unref(a.NInput),{value:y.value,"onUpdate:value":t[14]||(t[14]=l=>y.value=l),placeholder:"请输入水印内容",size:"small"},null,8,["value"])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",De,[t[68]||(t[68]=e.createElementVNode("div",{class:"section-title"},"系统信息",-1)),e.createElementVNode("div",We,[e.createElementVNode("div",Le,[t[62]||(t[62]=e.createElementVNode("span",{class:"info-label"},"浏览器",-1)),e.createElementVNode("span",Ie,e.toDisplayString(N.value.browser),1)]),e.createElementVNode("div",Ae,[t[63]||(t[63]=e.createElementVNode("span",{class:"info-label"},"操作系统",-1)),e.createElementVNode("span",Fe,e.toDisplayString(N.value.os),1)]),e.createElementVNode("div",$e,[t[64]||(t[64]=e.createElementVNode("span",{class:"info-label"},"屏幕分辨率",-1)),e.createElementVNode("span",ze,e.toDisplayString(N.value.resolution),1)]),e.createElementVNode("div",je,[t[65]||(t[65]=e.createElementVNode("span",{class:"info-label"},"设备像素比",-1)),e.createElementVNode("span",Ge,e.toDisplayString(N.value.pixelRatio),1)]),e.createElementVNode("div",Ke,[t[66]||(t[66]=e.createElementVNode("span",{class:"info-label"},"语言",-1)),e.createElementVNode("span",qe,e.toDisplayString(N.value.language),1)]),e.createElementVNode("div",Je,[t[67]||(t[67]=e.createElementVNode("span",{class:"info-label"},"时区",-1)),e.createElementVNode("span",Ye,e.toDisplayString(N.value.timezone),1)])])])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1},8,["show"]))}}),Qe=(v,i)=>{const d=v.__vccOpts||v;for(const[o,p]of i)d[o]=p;return d},Ze=Qe(Xe,[["__scopeId","data-v-918513ca"]]);function et(v,i={}){const d=H(i);return d().syncCSSVariables(),d}exports.BORDER_RADIUS_MAP=D;exports.COLOR_SWATCHES=$;exports.DEFAULT_SETTINGS=r;exports.LAYOUT_MODES=F;exports.PRESET_COLORS=O;exports.SettingsDrawer=Ze;exports.THEME_PRESETS=P;exports.TRANSITION_MAP=W;exports.createSettingsStore=H;exports.setupLayout=et;exports.useSettingsStore=L;
|
|
39
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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/dist/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";.settings-tabs[data-v-918513ca] .n-tabs-nav{padding:0 4px}.settings-section[data-v-918513ca]{margin-bottom:24px;padding-bottom:20px;border-bottom:1px solid var(--n-border-color)}.settings-section[data-v-918513ca]:last-child{border-bottom:none}.section-title[data-v-918513ca]{display:flex;justify-content:space-between;align-items:center;font-size:14px;font-weight:600;margin-bottom:8px;color:var(--n-text-color)}.preset-grid[data-v-918513ca]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:12px}.preset-card[data-v-918513ca]{position:relative;padding:18px 14px;border-radius:12px;border:2px solid var(--n-border-color);background:var(--n-color);cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);text-align:center;overflow:hidden}.preset-card[data-v-918513ca]:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--n-color-target),var(--n-color-target));opacity:0;transition:opacity .3s ease;border-radius:3px 3px 0 0}.preset-card[data-v-918513ca]:hover{border-color:var(--n-color-target);transform:translateY(-4px);box-shadow:0 8px 16px #2080f01f}.preset-card[data-v-918513ca]:hover:before{opacity:1}.preset-card:hover .preset-icon[data-v-918513ca]{transform:scale(1.1)}.preset-card:hover .preset-name[data-v-918513ca]{color:var(--n-color-target)}.preset-card.active[data-v-918513ca]{border-color:var(--n-color-target);background:var(--n-color-target-light);box-shadow:0 8px 20px #2080f033}.preset-card.active[data-v-918513ca]:before{opacity:1}.preset-card.active .preset-name[data-v-918513ca]{color:var(--n-color-target);font-weight:600}.preset-icon[data-v-918513ca]{font-size:36px;margin-bottom:10px;transition:all .3s ease}.preset-name[data-v-918513ca]{font-size:14px;font-weight:500;margin-bottom:8px;color:var(--n-text-color);transition:all .3s ease}.preset-color[data-v-918513ca]{display:flex;justify-content:center}.color-dot[data-v-918513ca]{width:24px;height:24px;border-radius:50%;border:2px solid #fff;box-shadow:0 2px 8px #00000026;transition:all .3s ease}.color-dot[data-v-918513ca]:hover{transform:scale(1.1);box-shadow:0 4px 12px #0003}.mode-group[data-v-918513ca]{width:100%}.mode-group[data-v-918513ca] .n-radio-button{flex:1}.color-picker-wrapper[data-v-918513ca]{display:flex;align-items:center;gap:12px}.color-value[data-v-918513ca]{width:80px;font-size:13px;font-family:Courier New,monospace;color:var(--n-text-color-2)}.radius-group[data-v-918513ca],.transition-group[data-v-918513ca]{width:100%}.radius-group[data-v-918513ca] .n-radio-button,.transition-group[data-v-918513ca] .n-radio-button{flex:1}.layout-grid[data-v-918513ca]{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.layout-item[data-v-918513ca]{position:relative;display:flex;flex-direction:column;align-items:center;gap:10px;padding:16px 12px;border-radius:12px;border:2px solid var(--n-border-color);background:var(--n-color);cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);overflow:hidden}.layout-item[data-v-918513ca]:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--n-color-target),var(--n-color-target));opacity:0;transition:opacity .3s ease;border-radius:3px 3px 0 0}.layout-item[data-v-918513ca]:hover:not(.disabled){border-color:var(--n-color-target);box-shadow:0 8px 16px #2080f01f;transform:translateY(-4px)}.layout-item[data-v-918513ca]:hover:not(.disabled):before{opacity:1}.layout-item:hover:not(.disabled) .layout-svg[data-v-918513ca]{transform:scale(1.05);color:var(--n-color-target)}.layout-item:hover:not(.disabled) .layout-label[data-v-918513ca]{color:var(--n-color-target)}.layout-item.active[data-v-918513ca]{border-color:var(--n-color-target);background:var(--n-color-target-light);box-shadow:0 8px 20px #2080f033}.layout-item.active[data-v-918513ca]:before{opacity:1}.layout-item.active .layout-label[data-v-918513ca]{color:var(--n-color-target);font-weight:600}.layout-item.active .layout-svg[data-v-918513ca]{color:var(--n-color-target)}.layout-item.disabled[data-v-918513ca]{cursor:not-allowed;opacity:.5;filter:grayscale(.8)}.layout-item.disabled[data-v-918513ca]:hover{transform:none;box-shadow:none;border-color:var(--n-border-color)}.layout-item.disabled[data-v-918513ca]:hover:before{opacity:0}.layout-screenshot[data-v-918513ca]{width:100%;height:56px;display:flex;align-items:center;justify-content:center;background:var(--n-color-modal);border-radius:8px;padding:8px;transition:all .3s ease}.layout-svg[data-v-918513ca]{width:64px;height:48px;color:var(--n-text-color-2);transition:all .3s ease}.layout-label[data-v-918513ca]{font-size:13px;color:var(--n-text-color);font-weight:500;text-align:center;transition:all .3s ease;display:flex;flex-direction:column;align-items:center;gap:6px;line-height:1.4}.badge-soon[data-v-918513ca]{font-size:10px;padding:1px 5px;border-radius:3px;background:linear-gradient(135deg,#faad14,#fa8c16);color:#fff;font-weight:600;white-space:nowrap;box-shadow:0 1px 3px #faad144d}.setting-item[data-v-918513ca]{display:flex;justify-content:space-between;align-items:center;padding:10px 0;font-size:13px;color:var(--n-text-color)}.slider-item[data-v-918513ca]{margin-bottom:20px}.slider-label[data-v-918513ca]{display:flex;justify-content:space-between;margin-bottom:8px;font-size:13px;color:var(--n-text-color)}.slider-value[data-v-918513ca]{font-weight:600;color:var(--n-color-target)}.action-buttons-grid[data-v-918513ca]{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.setting-label[data-v-918513ca]{display:flex;flex-direction:column;gap:4px}.setting-label .setting-desc[data-v-918513ca]{font-size:12px;color:var(--n-text-color-2);opacity:.8}.system-info[data-v-918513ca]{display:flex;flex-direction:column;gap:12px;margin-top:12px}.info-item[data-v-918513ca]{display:flex;justify-content:space-between;align-items:center;padding:10px 12px;background:var(--n-color);border-radius:8px;border:1px solid var(--n-border-color);transition:all .2s ease}.info-item[data-v-918513ca]:hover{border-color:var(--n-color-target);background:var(--n-color-target-light)}.info-label[data-v-918513ca]{font-size:13px;color:var(--n-text-color-2);font-weight:500}.info-value[data-v-918513ca]{font-size:13px;color:var(--n-text-color);font-weight:600;font-family:Consolas,Monaco,monospace}
|