@axewo/fin-micro 1.0.0 → 2.0.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/README.md +181 -4
- package/cli/index.mjs +22 -6
- package/dist/browser.cjs +1 -1
- package/dist/browser.mjs +68 -66
- package/dist/core.cjs +1 -1
- package/dist/core.mjs +459 -441
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +31 -24
- package/dist/layout.cjs +1 -0
- package/dist/layout.css +1 -0
- package/dist/layout.mjs +719 -0
- package/dist/{router-view-impl-C1KG6mxu.mjs → router-view-impl-B1NzCGKV.mjs} +18 -18
- package/dist/router-view-impl-BvOToV_Z.cjs +1 -0
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.mjs +40 -39
- package/dist/sdk.cjs +1 -1
- package/dist/sdk.mjs +92 -56
- package/dist/types/browser/index.d.ts +4 -0
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/layout/HostShell.vue.d.ts +528 -0
- package/dist/types/layout/ShellHeader.vue.d.ts +46 -0
- package/dist/types/layout/ShellMenu.vue.d.ts +12 -0
- package/dist/types/layout/ShellTabs.vue.d.ts +23 -0
- package/dist/types/layout/StandaloneMenuItem.vue.d.ts +11 -0
- package/dist/types/layout/StandaloneShell.vue.d.ts +40 -0
- package/dist/types/layout/index.d.ts +5 -0
- package/dist/types/layout/types.d.ts +65 -0
- package/dist/types/runtime/lifecycle.d.ts +1 -1
- package/dist/types/sdk/index.d.ts +65 -4
- package/dist/types/vue/index.d.ts +13 -2
- package/dist/types/vue/router-view-impl.d.ts +1 -1
- package/dist/types/watermark/FinWatermark.vue.d.ts +16 -0
- package/dist/types/watermark/config.d.ts +36 -0
- package/dist/types/watermark/index.d.ts +4 -0
- package/dist/vue.cjs +1 -1
- package/dist/vue.mjs +49 -35
- package/dist/watermark.cjs +2 -0
- package/dist/watermark.mjs +119 -0
- package/package.json +29 -4
- package/scaffold/base/index.html +2 -1
- package/scaffold/base/package.json.template +5 -1
- package/scaffold/base/pnpm-workspace.yaml +6 -0
- package/scaffold/base/scripts/check-runtime.mjs +43 -0
- package/scaffold/base/src/locales/en.ts +12 -0
- package/scaffold/base/src/locales/index.ts +7 -1
- package/scaffold/base/src/locales/zh-CN.ts +12 -0
- package/scaffold/base/src/main.ts +13 -5
- package/scaffold/base/src/router/demo.ts +6 -0
- package/scaffold/base/src/router/index.ts +13 -0
- package/scaffold/base/src/stores/demo.ts +12 -0
- package/scaffold/base/src/stores/index.ts +11 -0
- package/scaffold/base/src/utils/appConfig.ts +49 -0
- package/scaffold/base/src/utils/errorUtils.ts +109 -0
- package/scaffold/base/src/utils/requestUtils.ts +32 -11
- package/scaffold/base/src/utils/watermarkConfig.ts +18 -0
- package/scaffold/base/src/views/demo/index.vue +26 -0
- package/scaffold/host/.env.example +11 -3
- package/scaffold/host/src/App.vue +1 -13
- package/scaffold/host/src/bootstrap.ts +40 -8
- package/scaffold/host/src/hooks/usePlatformSession.ts +40 -8
- package/scaffold/host/src/layout/HostHeader.vue +65 -5
- package/scaffold/host/src/layout/HostLayout.vue +65 -21
- package/scaffold/host/src/layout/HostMenu.vue +11 -2
- package/scaffold/host/src/layout/HostTabs.vue +91 -8
- package/scaffold/host/src/layout/HostWorkspace.vue +29 -7
- package/scaffold/host/src/localPages.ts +45 -0
- package/scaffold/host/src/platform.ts +51 -14
- package/scaffold/host/src/router/guards.ts +128 -0
- package/scaffold/host/src/router/index.ts +25 -0
- package/scaffold/host/src/router/targets.ts +30 -0
- package/scaffold/host/src/router/workspace.ts +63 -0
- package/scaffold/host/src/styles/shell.css +776 -0
- package/scaffold/host/src/utils/request.ts +30 -3
- package/scaffold/host/src/views/home/index.vue +19 -0
- package/scaffold/host/src/views/login/components/LoginForm.vue +83 -0
- package/scaffold/host/src/views/login/index.vue +16 -0
- package/scaffold/host/src/views/not-found/index.vue +1 -0
- package/scaffold/host/src/views/profile/index.vue +24 -0
- package/scaffold/host/src/views/workspace/index.vue +11 -0
- package/scaffold/layouts/standard/host/src/layout/HostLayout.vue +116 -0
- package/scaffold/layouts/standard/host/src/styles/shell.css +168 -0
- package/scaffold/layouts/standard/vue/src/layout/StandaloneLayout.vue +26 -0
- package/scaffold/vue/src/App.vue +13 -7
- package/scaffold/vue/src/bootstrap.ts +25 -24
- package/scaffold/vue/src/bridge/auth.ts +23 -0
- package/scaffold/vue/src/bridge/session.ts +2 -2
- package/scaffold/vue/src/layout/Header.vue +15 -0
- package/scaffold/vue/src/layout/Sidebar.vue +21 -0
- package/scaffold/vue/src/layout/SidebarItem.vue +21 -0
- package/scaffold/vue/src/layout/StandaloneLayout.vue +34 -0
- package/scaffold/vue/src/main.ts +5 -2
- package/scaffold/vue/src/router/index.ts +9 -4
- package/scaffold/vue/src/router/menu.ts +38 -0
- package/scaffold/vue/src/views/demo/configs/table.ts +24 -0
- package/scaffold/vue/src/views/demo/hooks/useRecordNavigation.ts +32 -0
- package/scaffold/vue/src/views/demo/index.vue +17 -0
- package/scaffold/vue/src/views/{DetailView.vue → demo/modules/detail/index.vue} +15 -6
- package/scaffold/vue/src/views/demo/types.ts +5 -0
- package/dist/router-view-impl-CgLEalx4.cjs +0 -1
- package/scaffold/host/src/views/LoginView.vue +0 -38
- package/scaffold/vue/src/views/ListView.vue +0 -51
- /package/scaffold/vue/src/views/{NotFoundView.vue → not-found/index.vue} +0 -0
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./sdk.cjs"),c=require("./core.cjs"),r=require("./runtime.cjs"),o=require("./vue.cjs"),i=require("./browser.cjs");exports.HostCallError=e.HostCallError;exports.NavigationError=e.NavigationError;exports.TokenError=e.TokenError;exports.createNotificationBus=e.createNotificationBus;exports.createTokenCapability=e.createTokenCapability;exports.getMicroBridge=e.getMicroBridge;exports.getToken=e.getToken;exports.createMicroHost=c.createMicroHost;exports.createWujieRuntime=r.createWujieRuntime;exports.isMicroFrontend=r.isMicroFrontend;exports.setupWujieLifecycle=r.setupWujieLifecycle;exports.MicroAppContainer=o.MicroAppContainer;exports.MicroRouteView=o.MicroRouteView;exports.MicroTabCache=o.MicroTabCache;exports.connectMicroRouter=o.connectMicroRouter;exports.useMicroHost=o.useMicroHost;exports.useMicroPage=o.useMicroPage;exports.useMicroTab=o.useMicroTab;exports.connectMicroBrowser=i.connectMicroBrowser;exports.decodeMicroLocation=i.decodeMicroLocation;exports.encodeMicroLocation=i.encodeMicroLocation;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./sdk.cjs"),c=require("./core.cjs"),r=require("./runtime.cjs"),o=require("./vue.cjs"),i=require("./browser.cjs"),t=1;exports.HostCallError=e.HostCallError;exports.NavigationError=e.NavigationError;exports.TokenError=e.TokenError;exports.createAuthFailureCapabilities=e.createAuthFailureCapabilities;exports.createNotificationBus=e.createNotificationBus;exports.createTokenCapability=e.createTokenCapability;exports.getMicroBridge=e.getMicroBridge;exports.getToken=e.getToken;exports.hasAll=e.hasAll;exports.hasAny=e.hasAny;exports.hasPermission=e.hasPermission;exports.createMicroHost=c.createMicroHost;exports.createWujieRuntime=r.createWujieRuntime;exports.isMicroFrontend=r.isMicroFrontend;exports.setupWujieLifecycle=r.setupWujieLifecycle;exports.MicroAppContainer=o.MicroAppContainer;exports.MicroRouteView=o.MicroRouteView;exports.MicroTabCache=o.MicroTabCache;exports.connectMicroRouter=o.connectMicroRouter;exports.useMicroHost=o.useMicroHost;exports.useMicroPage=o.useMicroPage;exports.useMicroTab=o.useMicroTab;exports.usePermission=o.usePermission;exports.connectMicroBrowser=i.connectMicroBrowser;exports.decodeMicroLocation=i.decodeMicroLocation;exports.encodeMicroLocation=i.encodeMicroLocation;exports.hostRouterProtocol=t;
|
package/dist/index.mjs
CHANGED
|
@@ -1,28 +1,35 @@
|
|
|
1
|
-
import { HostCallError as
|
|
2
|
-
import { createMicroHost as
|
|
3
|
-
import { createWujieRuntime as
|
|
4
|
-
import { MicroAppContainer as
|
|
5
|
-
import { connectMicroBrowser as
|
|
1
|
+
import { HostCallError as i, NavigationError as t, TokenError as c, createAuthFailureCapabilities as a, createNotificationBus as n, createTokenCapability as s, getMicroBridge as u, getToken as M, hasAll as p, hasAny as l, hasPermission as m } from "./sdk.mjs";
|
|
2
|
+
import { createMicroHost as h } from "./core.mjs";
|
|
3
|
+
import { createWujieRuntime as d, isMicroFrontend as g, setupWujieLifecycle as C } from "./runtime.mjs";
|
|
4
|
+
import { MicroAppContainer as b, MicroRouteView as A, MicroTabCache as P, connectMicroRouter as R, useMicroHost as k, useMicroPage as y, useMicroTab as B, usePermission as E } from "./vue.mjs";
|
|
5
|
+
import { connectMicroBrowser as L, decodeMicroLocation as j, encodeMicroLocation as w } from "./browser.mjs";
|
|
6
|
+
const o = 1;
|
|
6
7
|
export {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
i as HostCallError,
|
|
9
|
+
b as MicroAppContainer,
|
|
10
|
+
A as MicroRouteView,
|
|
11
|
+
P as MicroTabCache,
|
|
12
|
+
t as NavigationError,
|
|
12
13
|
c as TokenError,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
L as connectMicroBrowser,
|
|
15
|
+
R as connectMicroRouter,
|
|
16
|
+
a as createAuthFailureCapabilities,
|
|
17
|
+
h as createMicroHost,
|
|
18
|
+
n as createNotificationBus,
|
|
19
|
+
s as createTokenCapability,
|
|
20
|
+
d as createWujieRuntime,
|
|
21
|
+
j as decodeMicroLocation,
|
|
22
|
+
w as encodeMicroLocation,
|
|
23
|
+
u as getMicroBridge,
|
|
22
24
|
M as getToken,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
p as hasAll,
|
|
26
|
+
l as hasAny,
|
|
27
|
+
m as hasPermission,
|
|
28
|
+
o as hostRouterProtocol,
|
|
29
|
+
g as isMicroFrontend,
|
|
30
|
+
C as setupWujieLifecycle,
|
|
31
|
+
k as useMicroHost,
|
|
32
|
+
y as useMicroPage,
|
|
33
|
+
B as useMicroTab,
|
|
34
|
+
E as usePermission
|
|
28
35
|
};
|
package/dist/layout.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),g=require("element-plus"),k=require("@element-plus/icons-vue"),S=["inert"],I={class:"brand"},M={class:"brand-icon","aria-hidden":"true"},D=["aria-label","aria-expanded"],P={class:"shell-breadcrumb"},F={class:"menu-search"},L={key:0,class:"shell-popover search-results"},O=["onClick"],T={key:0,class:"popover-empty"},K={class:"topbar-action"},z=["aria-expanded"],R={key:0,class:"shell-popover message-popover"},H={class:"topbar-action"},U=["aria-expanded"],W={class:"avatar"},J={key:0,class:"shell-popover user-popover"},q=["disabled"],A=["disabled"],j=e.defineComponent({__name:"ShellHeader",props:{userName:{},activeTitle:{},pending:{type:Boolean},collapsed:{type:Boolean},apps:{},brand:{}},emits:["logout","profile","update:collapsed","open","popover-opened"],setup($,{expose:B,emit:E}){const a=$,u=E,s=e.ref(""),d=e.ref(null),c=e.computed(()=>{const i=(r,h,m)=>h.flatMap(y=>{const C=`${m} / ${y.name}`;return[...y.target?[{appId:r,menu:y,path:C}]:[],...i(r,y.children??[],C)]});return a.apps.flatMap(r=>i(r.appId,r.menus??[],r.name))}),v=e.computed(()=>c.value.filter(i=>i.path.toLowerCase().includes(s.value.trim().toLowerCase())));function b(){d.value=null}function p(i){a.pending||(d.value=d.value===i&&i!=="search"?null:i,d.value&&u("popover-opened"))}function V(i){a.pending||(b(),s.value="",u("open",i.appId,i.menu))}return e.watch(()=>a.pending,i=>{i&&b()}),B({closePopovers:b}),(i,r)=>{var h;return e.openBlock(),e.createElementBlock(e.Fragment,null,[d.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"popover-backdrop","aria-label":"关闭弹出菜单",tabindex:"-1",onClick:b})):e.createCommentVNode("",!0),e.createElementVNode("header",{class:"shell-topbar",inert:i.pending||void 0,onKeydown:e.withKeys(b,["esc"])},[e.createElementVNode("div",I,[e.renderSlot(i.$slots,"brand",{brand:i.brand??{}},()=>{var m,y;return[e.createElementVNode("span",M,e.toDisplayString(((m=i.brand)==null?void 0:m.mark)??"F"),1),e.createElementVNode("strong",null,e.toDisplayString(((y=i.brand)==null?void 0:y.title)??"FIN"),1)]})]),e.createElementVNode("button",{class:"icon-button collapse-toggle","aria-label":i.collapsed?"展开侧栏":"折叠侧栏","aria-expanded":!i.collapsed,onClick:r[0]||(r[0]=m=>!i.pending&&u("update:collapsed",!i.collapsed))},[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(i.collapsed?e.unref(k.Expand):e.unref(k.Fold))))]),_:1})],8,D),e.createElementVNode("div",P,[e.createElementVNode("span",null,e.toDisplayString(((h=i.brand)==null?void 0:h.workspaceTitle)??"工作空间"),1),r[8]||(r[8]=e.createElementVNode("span",null,"/",-1)),e.createElementVNode("strong",null,e.toDisplayString(a.activeTitle),1)]),r[13]||(r[13]=e.createElementVNode("div",{class:"topbar-spacer"},null,-1)),e.createElementVNode("div",F,[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.Search))]),_:1}),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":r[1]||(r[1]=m=>s.value=m),"aria-label":"搜索菜单",placeholder:"搜索菜单、应用…",onFocus:r[2]||(r[2]=m=>p("search")),onKeydown:r[3]||(r[3]=e.withKeys(e.withModifiers(m=>!m.isComposing&&v.value[0]&&V(v.value[0]),["prevent"]),["enter"]))},null,544),[[e.vModelText,s.value]]),d.value==="search"?(e.openBlock(),e.createElementBlock("div",L,[r[9]||(r[9]=e.createElementVNode("p",{class:"popover-label"},"菜单搜索",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(v.value,m=>(e.openBlock(),e.createElementBlock("button",{key:JSON.stringify([m.appId,m.menu.menuId]),onClick:y=>V(m)},[e.createElementVNode("strong",null,e.toDisplayString(m.menu.name),1),e.createElementVNode("small",null,e.toDisplayString(m.path),1)],8,O))),128)),v.value.length?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("p",T,"未找到匹配的菜单"))])):e.createCommentVNode("",!0)]),e.renderSlot(i.$slots,"header-actions"),e.createElementVNode("div",K,[e.createElementVNode("button",{class:"icon-button","aria-label":"消息通知","aria-expanded":d.value==="messages",onClick:r[4]||(r[4]=m=>p("messages"))},[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.Bell))]),_:1})],8,z),d.value==="messages"?(e.openBlock(),e.createElementBlock("div",R,r[10]||(r[10]=[e.createElementVNode("h3",null,"消息通知",-1),e.createElementVNode("div",{class:"empty-state"},[e.createElementVNode("strong",null,"尚未接入消息服务"),e.createElementVNode("p",null,"接入后将在这里显示真实的通知消息。")],-1)]))):e.createCommentVNode("",!0)]),e.createElementVNode("div",H,[e.createElementVNode("button",{class:"user-trigger","aria-expanded":d.value==="user",onClick:r[5]||(r[5]=m=>p("user"))},[e.createElementVNode("span",W,e.toDisplayString(i.userName.slice(0,1)),1),e.createElementVNode("span",null,e.toDisplayString(i.userName),1),e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.ArrowDown))]),_:1})],8,U),d.value==="user"?(e.openBlock(),e.createElementBlock("div",J,[e.createElementVNode("strong",null,e.toDisplayString(i.userName),1),r[12]||(r[12]=e.createElementVNode("hr",null,null,-1)),e.createElementVNode("button",{disabled:i.pending,onClick:r[6]||(r[6]=m=>{b(),!i.pending&&u("profile")})},[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.User))]),_:1}),r[11]||(r[11]=e.createTextVNode("个人中心"))],8,q),e.createElementVNode("button",{disabled:i.pending,onClick:r[7]||(r[7]=m=>!i.pending&&u("logout"))},[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[e.createVNode(e.unref(k.SwitchButton))]),_:1}),e.createTextVNode(e.toDisplayString(i.pending?"正在确认退出…":"退出登录"),1)],8,A)])):e.createCommentVNode("",!0)])],40,S)],64)}}}),X=e.defineComponent({__name:"ShellMenu",props:{appId:{},menus:{}},emits:["open"],setup($,{emit:B}){const E=B,a=new Map(Object.entries({Document:k.Document,Folder:k.Folder,HomeFilled:k.HomeFilled,List:k.List,Menu:k.Menu,Setting:k.Setting,Tickets:k.Tickets,User:k.User})),u=s=>{var d;return a.get(s.icon??"")??((d=s.children)!=null&&d.length?k.Folder:k.Document)};return(s,d)=>{const c=e.resolveComponent("ShellMenu",!0);return e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.menus,v=>{var b;return e.openBlock(),e.createElementBlock(e.Fragment,{key:JSON.stringify([s.appId,v.menuId])},[(b=v.children)!=null&&b.length?(e.openBlock(),e.createBlock(e.unref(g.ElSubMenu),{key:0,index:JSON.stringify([s.appId,v.menuId])},{title:e.withCtx(()=>[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(u(v))))]),_:2},1024),e.createElementVNode("span",null,e.toDisplayString(v.name),1)]),default:e.withCtx(()=>[e.createVNode(c,{"app-id":s.appId,menus:v.children,onOpen:d[0]||(d[0]=(p,V)=>E("open",p,V))},null,8,["app-id","menus"])]),_:2},1032,["index"])):v.target?(e.openBlock(),e.createBlock(e.unref(g.ElMenuItem),{key:1,index:JSON.stringify([s.appId,v.menuId]),onClick:p=>E("open",s.appId,v)},{default:e.withCtx(()=>[e.createVNode(e.unref(g.ElIcon),{"aria-hidden":"true"},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(u(v))))]),_:2},1024),e.createElementVNode("span",null,e.toDisplayString(v.name),1)]),_:2},1032,["index","onClick"])):e.createCommentVNode("",!0)],64)}),128)}}}),Y=["inert"],G=["disabled"],Q=["onContextmenu"],Z=["aria-selected","title","onClick"],_=["aria-label","onClick"],x=["disabled"],ee=["aria-expanded","disabled"],te={class:"popover-label"},ne=["disabled"],oe=["disabled"],le=e.defineComponent({__name:"ShellTabs",props:{tabs:{},activeKey:{},pending:{type:Boolean},isFixedTab:{type:Function}},emits:["operate","popover-opened","error"],setup($,{expose:B,emit:E}){const a=$,u=t=>{var n;return((n=a.isFixedTab)==null?void 0:n.call(a,t))??!1},s=E,d=e.ref(),c=e.ref(null);function v(){c.value=null}function b(t,n){a.pending||(c.value={tab:t,...n?{x:Math.max(8,Math.min(n.clientX,window.innerWidth-184)),y:Math.max(8,Math.min(n.clientY,window.innerHeight-264))}:{}},s("popover-opened"))}function p(t){var f;const n=(f=c.value)==null?void 0:f.tab;if(v(),!n||a.pending||u(n)&&(t==="close"||t==="refresh"))return;const l={tabId:n.tabId,key:n.key};s("operate",t==="refresh"||t==="close"?{type:t,target:l}:{type:"closeMany",scope:t,anchor:l})}const V=e.ref(!1),i=e.ref(!1),r=e.ref(!1);let h,m=!1;function y(){const t=d.value;!t||m||(V.value=t.scrollWidth>t.clientWidth+(V.value?64:0)+1,i.value=t.scrollLeft>1,r.value=t.scrollLeft+t.clientWidth<t.scrollWidth-1)}function C(){var w;const t=d.value,n=(w=t==null?void 0:t.querySelector('[aria-selected="true"]'))==null?void 0:w.parentElement;if(!t||!n||m)return;const l=t.getBoundingClientRect(),f=n.getBoundingClientRect();f.left<l.left?t.scrollLeft+=f.left-l.left:f.right>l.right&&(t.scrollLeft+=Math.min(f.right-l.right,f.left-l.left)),y()}function N(t){var n;a.pending||(n=d.value)==null||n.scrollBy({left:t*Math.max(80,d.value.clientWidth*.8),behavior:"smooth"})}function o(){e.nextTick().then(()=>{if(!m)return y(),e.nextTick().then(C)}).catch(t=>s("error",t))}return e.onMounted(()=>{typeof ResizeObserver<"u"&&(h=new ResizeObserver(o),d.value&&h.observe(d.value)),typeof window<"u"&&window.addEventListener("resize",o),o()}),e.onBeforeUnmount(()=>{m=!0,h==null||h.disconnect(),typeof window<"u"&&window.removeEventListener("resize",o)}),e.watch(()=>[a.activeKey,...a.tabs.map(t=>`${t.key}:${t.title}`)],o),e.watch(()=>a.pending,t=>{t&&v()}),B({closePopovers:v}),(t,n)=>(e.openBlock(),e.createElementBlock("div",{class:"shell-tabbar",inert:t.pending||void 0,onKeydown:e.withKeys(v,["esc"])},[c.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"popover-backdrop","aria-label":"关闭页签菜单",tabindex:"-1",onClick:v})):e.createCommentVNode("",!0),V.value?(e.openBlock(),e.createElementBlock("button",{key:1,class:"tab-scroll","aria-label":"向左查看页签",title:"向左查看页签",disabled:t.pending||!i.value,onClick:n[0]||(n[0]=l=>N(-1))},[e.createVNode(e.unref(k.ArrowLeft),{"aria-hidden":"true"})],8,G)):e.createCommentVNode("",!0),e.createElementVNode("div",{ref_key:"strip",ref:d,class:"tab-strip",role:"tablist","aria-label":"已打开页面",onScroll:y},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.tabs,l=>(e.openBlock(),e.createElementBlock("div",{key:l.key,class:e.normalizeClass(["shell-tab",{active:l.key===t.activeKey}]),onContextmenu:e.withModifiers(f=>b(l,f),["prevent"])},[e.createElementVNode("button",{role:"tab","aria-selected":l.key===t.activeKey,title:l.title,onClick:f=>!t.pending&&s("operate",{type:"activate",target:{tabId:l.tabId,key:l.key}})},e.toDisplayString(l.title),9,Z),u(l)?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("button",{key:0,class:"tab-close","aria-label":`关闭 ${l.title}`,onClick:f=>!t.pending&&s("operate",{type:"close",target:{tabId:l.tabId,key:l.key}})},"×",8,_))],42,Q))),128))],544),V.value?(e.openBlock(),e.createElementBlock("button",{key:2,class:"tab-scroll","aria-label":"向右查看页签",title:"向右查看页签",disabled:t.pending||!r.value,onClick:n[1]||(n[1]=l=>N(1))},[e.createVNode(e.unref(k.ArrowRight),{"aria-hidden":"true"})],8,x)):e.createCommentVNode("",!0),e.createElementVNode("button",{class:"tab-more","aria-label":"更多页签操作","aria-expanded":!!c.value,disabled:!t.tabs.length||t.pending,onClick:n[2]||(n[2]=l=>t.tabs.find(f=>f.key===t.activeKey)&&b(t.tabs.find(f=>f.key===t.activeKey)))},"···",8,ee),c.value?(e.openBlock(),e.createElementBlock("div",{key:3,class:e.normalizeClass(["shell-popover tab-actions",{"context-actions":c.value.x!==void 0}]),style:e.normalizeStyle(c.value.x!==void 0?{left:`${c.value.x}px`,top:`${c.value.y}px`}:void 0),role:"menu","aria-label":"页签操作菜单"},[e.createElementVNode("p",te,e.toDisplayString(c.value.tab.title),1),e.createElementVNode("button",{role:"menuitem",disabled:u(c.value.tab),onClick:n[3]||(n[3]=l=>p("refresh"))},"刷新页面",8,ne),e.createElementVNode("button",{role:"menuitem",disabled:u(c.value.tab),onClick:n[4]||(n[4]=l=>p("close"))},"关闭当前",8,oe),n[9]||(n[9]=e.createElementVNode("hr",null,null,-1)),e.createElementVNode("button",{role:"menuitem",onClick:n[5]||(n[5]=l=>p("others"))},"关闭其他"),e.createElementVNode("button",{role:"menuitem",onClick:n[6]||(n[6]=l=>p("left"))},"关闭左侧"),e.createElementVNode("button",{role:"menuitem",onClick:n[7]||(n[7]=l=>p("right"))},"关闭右侧"),e.createElementVNode("button",{role:"menuitem",onClick:n[8]||(n[8]=l=>p("all"))},"关闭全部业务页")],6)):e.createCommentVNode("",!0)],40,Y))}}),ae=["aria-busy"],re=["inert"],ie=["title","aria-label"],se={class:"shell-main"},de={key:0,class:"shell-feedback",role:"status"},ue=e.defineComponent({__name:"HostShell",props:{apps:{},tabs:{},activeKey:{},userName:{},pending:{type:Boolean,default:!1},notice:{default:""},brand:{},collapsed:{type:Boolean,default:void 0},isFixedTab:{}},emits:["open","operate","logout","profile","update:collapsed","dismiss-notice","error"],setup($,{expose:B,emit:E}){const a=$,u=E,s=e.ref(!1),d=e.computed({get:()=>a.collapsed??s.value,set:o=>{s.value=o,u("update:collapsed",o)}}),c=e.ref(),v=e.ref(),b=e.ref(),p=e.computed(()=>a.tabs.find(o=>o.key===a.activeKey)),V=(o,t)=>JSON.stringify([o,t]),i=e.computed(()=>{var o;return(o=p.value)!=null&&o.activeMenuId?V(p.value.appId,p.value.activeMenuId):""}),r=e.ref(!1);function h(o,t){for(const n of o){if(n.menuId===t)return[n.menuId];const l=h(n.children??[],t);if(l.length)return[n.menuId,...l]}return[]}const m=e.computed(()=>a.apps.flatMap(o=>{var t;return h(o.menus??[],((t=p.value)==null?void 0:t.appId)===o.appId?p.value.activeMenuId:void 0).slice(0,-1).map(n=>V(o.appId,n))}));e.watch(i,()=>{var t,n;const o=a.apps.find(l=>{var f;return l.appId===((f=p.value)==null?void 0:f.appId)});if(o)for(const l of h(o.menus??[],(t=p.value)==null?void 0:t.activeMenuId).slice(0,-1))(n=b.value)==null||n.open(V(o.appId,l))},{flush:"post",immediate:!0});async function y(){r.value=!0,await e.nextTick(),r.value=!1}function C(){var o,t;(o=c.value)==null||o.closePopovers(),(t=v.value)==null||t.closePopovers()}const N={open:(o,t)=>{a.pending||u("open",o,t)},operate:o=>{a.pending||u("operate",o)},logout:()=>{a.pending||(C(),u("logout"))},profile:()=>{a.pending||u("profile")},toggleCollapsed:()=>{a.pending||(d.value=!d.value)}};return e.watch(()=>a.pending,o=>{o&&C()}),B({closePopovers:C}),(o,t)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["host-shell fin-micro-shell",{"is-collapsed":d.value}]),"aria-busy":o.pending,onKeydown:e.withKeys(C,["esc"])},[e.renderSlot(o.$slots,"header",e.normalizeProps(e.guardReactiveProps({...N,active:p.value,collapsed:d.value,pending:o.pending})),()=>{var n;return[e.createVNode(j,{ref_key:"header",ref:c,collapsed:d.value,"onUpdate:collapsed":t[0]||(t[0]=l=>d.value=l),brand:o.brand,apps:o.apps,"user-name":o.userName,"active-title":((n=p.value)==null?void 0:n.title)??"工作台",pending:o.pending,onLogout:N.logout,onProfile:N.profile,onOpen:N.open,onPopoverOpened:t[1]||(t[1]=l=>{var f;return(f=v.value)==null?void 0:f.closePopovers()})},e.createSlots({"header-actions":e.withCtx(()=>[e.renderSlot(o.$slots,"header-actions",e.normalizeProps(e.guardReactiveProps(N)))]),_:2},[o.$slots.brand?{name:"brand",fn:e.withCtx(l=>[e.renderSlot(o.$slots,"brand",e.normalizeProps(e.guardReactiveProps(l)))]),key:"0"}:void 0]),1032,["collapsed","brand","apps","user-name","active-title","pending","onLogout","onProfile","onOpen"])]}),e.createElementVNode("aside",{class:"shell-sidebar","aria-label":"主导航",inert:o.pending||void 0},[e.renderSlot(o.$slots,"sidebar",e.normalizeProps(e.guardReactiveProps({...N,active:p.value,collapsed:d.value,pending:o.pending})),()=>[d.value?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(o.apps.filter(n=>{var l;return(l=n.menus)==null?void 0:l.length}),n=>{var l;return e.openBlock(),e.createElementBlock("button",{key:n.appId,class:e.normalizeClass(["collapsed-entry",{selected:((l=p.value)==null?void 0:l.appId)===n.appId}]),title:n.name,"aria-label":`展开 ${n.name} 菜单`,onClick:t[2]||(t[2]=(...f)=>N.toggleCollapsed&&N.toggleCollapsed(...f))},e.toDisplayString(n.name.slice(0,1)),11,ie)}),128)):e.createCommentVNode("",!0),e.withDirectives(e.createVNode(e.unref(g.ElMenu),{ref_key:"menu",ref:b,"collapse-transition":!1,class:"sidebar-menu","default-active":r.value?"__reset__":i.value,"default-openeds":m.value,router:!1,onSelect:y},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.apps,n=>(e.openBlock(),e.createBlock(X,{key:n.appId,"app-id":n.appId,menus:n.menus??[],onOpen:N.open},null,8,["app-id","menus","onOpen"]))),128))]),_:1},8,["default-active","default-openeds"]),[[e.vShow,!d.value]]),t[6]||(t[6]=e.createElementVNode("div",{class:"sidebar-footer"},[e.createElementVNode("span",{class:"status-dot"}),e.createElementVNode("span",{class:"sidebar-label"},"工作空间已就绪")],-1))])],8,re),e.createElementVNode("main",se,[e.renderSlot(o.$slots,"tabs",e.normalizeProps(e.guardReactiveProps({...N,active:p.value,pending:o.pending})),()=>[e.createVNode(le,{ref_key:"tabBar",ref:v,tabs:o.tabs,"active-key":o.activeKey,pending:o.pending,"is-fixed-tab":o.isFixedTab,onOperate:N.operate,onError:t[3]||(t[3]=n=>u("error",n)),onPopoverOpened:t[4]||(t[4]=n=>{var l;return(l=c.value)==null?void 0:l.closePopovers()})},null,8,["tabs","active-key","pending","is-fixed-tab","onOperate"])]),o.notice?(e.openBlock(),e.createElementBlock("div",de,[e.createElementVNode("span",null,e.toDisplayString(o.notice),1),e.createElementVNode("button",{"aria-label":"关闭操作提示",onClick:t[5]||(t[5]=n=>u("dismiss-notice"))},"×")])):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"default",{active:p.value})])],42,ae))}}),ce=e.defineComponent({__name:"StandaloneMenuItem",props:{item:{}},emits:["navigate"],setup($,{emit:B}){const E=B;return(a,u)=>{const s=e.resolveComponent("StandaloneMenuItem",!0);return a.item.children.length?(e.openBlock(),e.createBlock(e.unref(g.ElSubMenu),{key:0,index:a.item.path},{title:e.withCtx(()=>[a.item.icon?(e.openBlock(),e.createBlock(e.unref(g.ElIcon),{key:0},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(a.item.icon)))]),_:1})):e.createCommentVNode("",!0),e.createElementVNode("span",null,e.toDisplayString(a.item.title),1)]),default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.item.children,d=>(e.openBlock(),e.createBlock(s,{key:d.path,item:d,onNavigate:u[0]||(u[0]=c=>E("navigate",c))},null,8,["item"]))),128))]),_:1},8,["index"])):(e.openBlock(),e.createBlock(e.unref(g.ElMenuItem),{key:1,index:a.item.path,onClick:u[1]||(u[1]=d=>E("navigate",a.item.path))},{default:e.withCtx(()=>[a.item.icon?(e.openBlock(),e.createBlock(e.unref(g.ElIcon),{key:0},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(a.item.icon)))]),_:1})):e.createCommentVNode("",!0),e.createElementVNode("span",null,e.toDisplayString(a.item.title),1)]),_:1},8,["index"]))}}}),pe={class:"fin-micro-standalone"},me={class:"standalone-header"},ve={class:"standalone-sidebar","aria-label":"独立应用导航"},fe={class:"standalone-viewport"},ke={class:"standalone-content"},ge=e.defineComponent({__name:"StandaloneShell",props:{title:{},menus:{},activeMenu:{},brand:{}},emits:["navigate"],setup($,{emit:B}){const E=B,a=e.ref(!1);async function u(s){E("navigate",s),a.value=!0,await e.nextTick(),a.value=!1}return(s,d)=>(e.openBlock(),e.createElementBlock("div",pe,[e.createElementVNode("header",me,[e.renderSlot(s.$slots,"brand",{brand:s.brand??{}},()=>{var c;return[e.createElementVNode("strong",null,e.toDisplayString(((c=s.brand)==null?void 0:c.title)??"业务应用"),1)]}),e.createElementVNode("span",null,e.toDisplayString(s.title)+" · 独立运行",1),e.renderSlot(s.$slots,"header-actions")]),e.createElementVNode("aside",ve,[e.renderSlot(s.$slots,"sidebar",{menus:s.menus,navigate:u},()=>[e.createVNode(e.unref(g.ElMenu),{router:!1,"default-active":a.value?"__reset__":s.activeMenu,"collapse-transition":!1},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.menus,c=>(e.openBlock(),e.createBlock(ce,{key:c.path,item:c,onNavigate:u},null,8,["item"]))),128))]),_:1},8,["default-active"])])]),e.createElementVNode("div",fe,[e.createElementVNode("main",ke,[e.renderSlot(s.$slots,"default")]),e.renderSlot(s.$slots,"workspace-overlay")])]))}}),be=1;exports.HostShell=ue;exports.StandaloneShell=ge;exports.layoutProtocol=be;
|
package/dist/layout.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.fin-micro-shell{--shell-accent: var(--fin-shell-accent, #3267e3);--shell-border: var(--fin-shell-border, #e8ebf1);--shell-muted: var(--fin-shell-muted, #8791a3);color:#263248;font:14px/1.5 Inter,PingFang SC,Microsoft YaHei,sans-serif;background:#f5f7fa;height:100vh;height:100dvh;min-height:0;overflow:hidden;position:relative}.fin-micro-shell>:not(.shell-main) *,.fin-micro-shell>:not(.shell-main) *:before,.fin-micro-shell>:not(.shell-main) *:after{box-sizing:border-box}.fin-micro-shell :is(.shell-topbar,.shell-sidebar,.shell-tabbar,.shell-feedback) button,.fin-micro-shell .shell-topbar input{font:inherit}.fin-micro-shell :is(.shell-topbar,.shell-sidebar,.shell-tabbar,.shell-feedback) button{cursor:pointer;color:inherit}.fin-micro-shell :is(.shell-topbar,.shell-sidebar,.shell-tabbar,.shell-feedback) button:disabled{cursor:not-allowed;opacity:.4}.fin-micro-shell :is(.shell-topbar,.shell-sidebar,.shell-tabbar,.shell-feedback) button:focus-visible,.fin-micro-shell .shell-topbar a:focus-visible,.fin-micro-shell .shell-topbar input:focus-visible{outline:2px solid #3267e3;outline-offset:2px}.fin-micro-shell .shell-topbar{height:56px;display:flex;align-items:center;padding:0 24px 0 20px;gap:18px;border-bottom:1px solid var(--shell-border);background:#fff;position:relative;z-index:30;flex:0 0 56px}.fin-micro-shell .brand{width:184px;flex-shrink:0;display:flex;align-items:center;gap:10px;text-decoration:none;color:#1b2a45;letter-spacing:1px}.fin-micro-shell .brand-icon{display:grid;place-items:center;width:30px;height:30px;border-radius:8px;background:#3267e3;color:#fff;font-size:21px;font-weight:800}.fin-micro-shell .brand strong{font-size:16px;white-space:nowrap}.fin-micro-shell .brand strong span{margin-left:7px;font-weight:500;font-size:13px;letter-spacing:0}.fin-micro-shell .icon-button{border:0;background:transparent;width:32px;height:32px;border-radius:6px;font-size:20px;color:#647087;display:inline-flex;align-items:center;justify-content:center}.fin-micro-shell .icon-button .el-icon{font-size:18px}.fin-micro-shell .icon-button:hover,.fin-micro-shell .user-trigger:hover{background:#f1f5fc}.fin-micro-shell .menu-search{width:300px;flex:0 1 300px;min-width:0;position:relative;display:flex;align-items:center;gap:8px;background:#f5f7fa;border:1px solid #edf0f5;border-radius:6px;padding:5px 10px;color:#8791a3}.fin-micro-shell .menu-search>.el-icon{font-size:18px;flex-shrink:0}.fin-micro-shell .menu-search input{min-width:0;flex:1;width:100%;border:0;background:transparent;outline:0;font-size:12px;color:#263248}.fin-micro-shell .menu-search input::placeholder{color:#929bab}.fin-micro-shell .menu-search kbd{border:1px solid #dde3ee;background:#fff;border-radius:3px;width:18px;text-align:center;font-size:11px}.fin-micro-shell .topbar-spacer{flex:1}.fin-micro-shell .topbar-action{position:relative}.fin-micro-shell .demo-badge{font-size:11px;padding:2px 7px;background:#fff7e8;color:#9b681d;border:1px solid #f5e5c6;border-radius:4px;white-space:nowrap}.fin-micro-shell .user-trigger{display:flex;align-items:center;gap:9px;background:transparent;border:0;padding:3px;border-radius:6px;font-size:13px!important;flex-shrink:0}.fin-micro-shell .user-trigger .el-icon{font-size:15px}.fin-micro-shell .avatar{width:30px;height:30px;display:grid;place-items:center;border-radius:50%;background:#eaf0ff;color:#3267e3;font-weight:600}.fin-micro-shell .shell-sidebar{position:absolute;top:56px;bottom:0;left:0;width:224px;min-height:0;padding:20px 12px;border-right:1px solid var(--shell-border);background:#fff;display:flex;flex-direction:column;overflow:auto}.fin-micro-shell .shell-sidebar button{border:0;background:transparent;text-align:left;width:100%;padding:9px 12px;border-radius:6px;font-size:13px}.fin-micro-shell .shell-sidebar button:hover{background:#f5f7fc}.fin-micro-shell .shell-sidebar .selected{background:#edf3ff;color:#3267e3;font-weight:600}.fin-micro-shell .sidebar-home{display:flex;gap:12px;align-items:center}.fin-micro-shell .sidebar-home>span:first-child{font-size:18px}.fin-micro-shell .sidebar-caption{color:#9ca4b2;font-size:11px;padding:24px 12px 3px}.fin-micro-shell .sidebar-app h2{font-size:12px;font-weight:600;color:#79849a;margin:17px 12px 6px}.fin-micro-shell .sidebar-menu{--el-menu-bg-color: #fff;--el-menu-text-color: #263248;--el-menu-active-color: var(--shell-accent);--el-menu-hover-bg-color: #f5f7fc;--el-menu-item-height: 38px;--el-menu-sub-item-height: 36px;--el-menu-base-level-padding: 10px;--el-menu-level-padding: 12px;--el-menu-item-font-size: 12px;border-right:0}.fin-micro-shell .sidebar-menu .el-menu-item,.fin-micro-shell .sidebar-menu .el-sub-menu__title{border-radius:6px;margin:2px 0}.fin-micro-shell .sidebar-footer{margin-top:auto;padding:32px 12px 0;display:flex;gap:8px;align-items:center;color:#8d97a8;font-size:11px}.fin-micro-shell .status-dot{width:6px;height:6px;border-radius:50%;background:#5ab695;flex-shrink:0}.fin-micro-shell .shell-main{margin-left:224px;min-width:0;min-height:0;height:calc(100vh - 56px);height:calc(100dvh - 56px);display:flex;flex-direction:column;overflow:hidden}.fin-micro-shell.is-collapsed .shell-sidebar{width:64px;padding:20px 8px}.fin-micro-shell.is-collapsed .shell-main{margin-left:64px}.fin-micro-shell.is-collapsed .sidebar-label,.fin-micro-shell.is-collapsed .sidebar-caption{display:none}.fin-micro-shell.is-collapsed .sidebar-home{justify-content:center;padding:9px 0}.fin-micro-shell.is-collapsed .sidebar-app{margin-top:14px}.fin-micro-shell.is-collapsed .collapsed-entry{text-align:center;padding:10px 0}.fin-micro-shell.is-collapsed .sidebar-footer{justify-content:center;padding-left:0;padding-right:0}.fin-micro-shell .shell-tabbar{display:flex;flex:0 0 40px;height:40px;position:relative;background:#fff;border-bottom:1px solid var(--shell-border);padding-left:16px}.fin-micro-shell .tab-strip{display:flex;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;flex:1;min-width:0;gap:4px;align-items:stretch}.fin-micro-shell .shell-tab{display:flex;flex-shrink:0;position:relative;align-items:center;border-right:1px solid #f0f2f6}.fin-micro-shell .shell-tab>button{height:100%;border:0;background:transparent;padding:0 13px;font-size:12px;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fin-micro-shell .shell-tab.active{background:#f2f6ff;color:#3267e3}.fin-micro-shell .shell-tab.active:after{content:"";position:absolute;bottom:0;left:8px;right:8px;height:2px;background:#3267e3}.fin-micro-shell .shell-tab .tab-close{padding:0 8px;max-width:none;color:#9aa4b6}.fin-micro-shell .shell-tab .tab-close:hover{color:#cf4b4b}.fin-micro-shell .tab-strip::-webkit-scrollbar{display:none}.fin-micro-shell .tab-scroll{flex:0 0 32px;width:32px;padding:0;border:0;border-right:1px solid var(--shell-border);background:#fff;display:inline-flex;align-items:center;justify-content:center}.fin-micro-shell .tab-scroll svg{width:14px;height:14px}.fin-micro-shell .tab-scroll:not(:disabled):hover{background:#f0f5ff;color:#3267e3}.fin-micro-shell .tab-more{border:0;border-left:1px solid var(--shell-border);width:44px;background:#fff;font-size:20px!important;flex-shrink:0}.fin-micro-shell .shell-breadcrumb{display:flex;align-items:center;gap:8px;min-width:0;color:#939cab;font-size:12px}.fin-micro-shell .shell-breadcrumb strong{color:#536079;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fin-micro-shell .shell-content{flex:1 1 auto;min-height:0;overflow:auto;overscroll-behavior:contain;padding:20px 28px 32px}.fin-micro-shell .shell-app-container{min-height:0!important;height:auto!important}.fin-micro-shell .shell-app-container>div{min-height:0!important;height:auto!important}.fin-micro-shell .shell-feedback{margin:14px 28px 0;flex:0 0 auto;padding:9px 13px;display:flex;align-items:center;justify-content:space-between;gap:16px;color:#3267e3;background:#eaf1ff;border:1px solid #d7e5ff;border-radius:6px;font-size:12px}.fin-micro-shell .shell-feedback.warning{color:#91681e;background:#fff9ec;border-color:#f3e6c3}.fin-micro-shell .shell-feedback button{border:0;background:transparent;font-size:18px}.fin-micro-shell .popover-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;border:0;background:transparent;cursor:default!important}.fin-micro-shell .shell-popover{position:absolute;z-index:40;background:#fff;border:1px solid #e5eaf2;box-shadow:0 10px 34px #20395e1a;border-radius:8px;padding:8px;text-align:left}.fin-micro-shell .shell-popover button{display:block;width:100%;text-align:left;background:transparent;border:0;padding:8px 10px;border-radius:4px;font-size:12px}.fin-micro-shell .shell-popover button:hover:not(:disabled){background:#eff4ff;color:#3267e3}.fin-micro-shell .shell-popover small{display:block;font-size:11px;color:#909aad}.fin-micro-shell .shell-popover hr{border:0;border-top:1px solid #eef0f5;margin:6px 0}.fin-micro-shell .popover-label{color:#939cab;font-size:11px;margin:2px 10px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fin-micro-shell .popover-empty{text-align:center;color:#9aa4b4;padding:16px;font-size:12px}.fin-micro-shell .search-results{top:40px;left:0;width:360px;max-height:360px;overflow:auto}.fin-micro-shell .search-results button strong{font-weight:500}.fin-micro-shell .search-results button small{margin-top:3px}.fin-micro-shell .message-popover{right:0;top:42px;width:300px}.fin-micro-shell .message-popover h3{font-size:14px;margin:8px 10px}.fin-micro-shell .user-popover{right:0;top:43px;width:180px;padding:14px 8px 8px}.fin-micro-shell .user-popover>strong,.fin-micro-shell .user-popover>small{padding:0 10px}.fin-micro-shell .tab-actions{right:8px;top:44px;width:176px}.fin-micro-shell .tab-actions.context-actions{position:fixed;right:auto}@media (max-width: 1100px){.fin-micro-shell .menu-search{width:230px}.fin-micro-shell .shell-content{padding:18px}}@media (max-width: 760px){.fin-micro-shell .shell-sidebar{width:180px}.fin-micro-shell .shell-main{margin-left:180px}.fin-micro-shell .brand{width:auto}.fin-micro-shell .brand strong span{display:none}.fin-micro-shell .shell-topbar{padding:0 12px;gap:8px}.fin-micro-shell .menu-search{width:180px;min-width:0;flex:0 1 180px;margin-left:auto}.fin-micro-shell .shell-breadcrumb{flex:1;overflow:hidden;white-space:nowrap}.fin-micro-shell .menu-search kbd,.fin-micro-shell .demo-badge,.fin-micro-shell .topbar-spacer{display:none}.fin-micro-shell .search-results{width:280px}.fin-micro-shell .shell-content{padding:14px}.fin-micro-shell .shell-feedback{margin-left:14px;margin-right:14px}}.fin-micro-standalone{display:grid;grid-template:64px minmax(0,1fr) / var(--fin-shell-sidebar-width, 220px) minmax(0,1fr);height:100vh;height:100dvh;overflow:hidden}.fin-micro-standalone>.standalone-header{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 24px;background:var(--fin-shell-surface, #fff);border-bottom:1px solid var(--fin-shell-border, #e5e7eb)}.fin-micro-standalone>.standalone-sidebar{overflow:auto;background:var(--fin-shell-surface, #fff);border-right:1px solid var(--fin-shell-border, #e5e7eb)}.fin-micro-standalone>.standalone-sidebar>.el-menu{border-right:0}.fin-micro-standalone>.standalone-viewport{position:relative;isolation:isolate;display:flex;min-width:0;min-height:0;overflow:hidden}.fin-micro-standalone .standalone-viewport>.standalone-content{flex:1 1 auto;min-width:0;min-height:0;overflow:auto}@media (max-width: 760px){.fin-micro-standalone{grid-template-columns:160px minmax(0,1fr)}}
|