=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}var l=f[n],h=r/2+l,d=n+1,p=e-1;for(;d>>1;f[g]c-o){var _=r?(i*v+a*y)/r:a;t(n,d,y,i,o,_,c),t(d,e,v,_,o,a,c)}else{var b=r?(o*v+c*y)/r:c;t(n,d,y,i,o,a,b),t(d,e,v,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=Ap,t.treemapResquarify=Lp,t.treemapSlice=Ip,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?Ip:Ap)(t,n,e,r,i)},t.treemapSquarify=Yp,t.tsv=Mc,t.tsvFormat=lc,t.tsvFormatBody=hc,t.tsvFormatRow=pc,t.tsvFormatRows=dc,t.tsvFormatValue=gc,t.tsvParse=fc,t.tsvParseRows=sc,t.union=function(...t){const n=new InternSet;for(const e of t)for(const t of e)n.add(t);return n},t.unixDay=_y,t.unixDays=by,t.utcDay=yy,t.utcDays=vy,t.utcFriday=By,t.utcFridays=Vy,t.utcHour=hy,t.utcHours=dy,t.utcMillisecond=Wg,t.utcMilliseconds=Zg,t.utcMinute=cy,t.utcMinutes=fy,t.utcMonday=qy,t.utcMondays=jy,t.utcMonth=Qy,t.utcMonths=Jy,t.utcSaturday=Yy,t.utcSaturdays=Wy,t.utcSecond=iy,t.utcSeconds=oy,t.utcSunday=Fy,t.utcSundays=Ly,t.utcThursday=Oy,t.utcThursdays=Gy,t.utcTickInterval=av,t.utcTicks=ov,t.utcTuesday=Uy,t.utcTuesdays=Hy,t.utcWednesday=Iy,t.utcWednesdays=Xy,t.utcWeek=Fy,t.utcWeeks=Ly,t.utcYear=ev,t.utcYears=rv,t.variance=x,t.version="7.9.0",t.window=pn,t.xml=Sc,t.zip=function(){return gt(arguments)},t.zoom=function(){var t,n,e,r=Ew,i=Nw,o=zw,a=Cw,u=Pw,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=ri,h=$t("start","zoom","end"),d=500,p=150,g=0,y=10;function v(t){t.property("__zoom",kw).on("wheel.zoom",T,{passive:!1}).on("mousedown.zoom",A).on("dblclick.zoom",S).filter(u).on("touchstart.zoom",E).on("touchmove.zoom",N).on("touchend.zoom touchcancel.zoom",k).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function _(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new ww(n,t.x,t.y)}function b(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new ww(t.k,r,i)}function m(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function x(t,n,e,r){t.on("start.zoom",(function(){w(this,arguments).event(r).start()})).on("interrupt.zoom end.zoom",(function(){w(this,arguments).event(r).end()})).tween("zoom",(function(){var t=this,o=arguments,a=w(t,o).event(r),u=i.apply(t,o),c=null==e?m(u):"function"==typeof e?e.apply(t,o):e,f=Math.max(u[1][0]-u[0][0],u[1][1]-u[0][1]),s=t.__zoom,h="function"==typeof n?n.apply(t,o):n,d=l(s.invert(c).concat(f/s.k),h.invert(c).concat(f/h.k));return function(t){if(1===t)t=h;else{var n=d(t),e=f/n[2];t=new ww(e,c[0]-n[0]*e,c[1]-n[1]*e)}a.zoom(null,t)}}))}function w(t,n,e){return!e&&t.__zooming||new M(t,n)}function M(t,n){this.that=t,this.args=n,this.active=0,this.sourceEvent=null,this.extent=i.apply(t,n),this.taps=0}function T(t,...n){if(r.apply(this,arguments)){var e=w(this,n).event(t),i=this.__zoom,u=Math.max(c[0],Math.min(c[1],i.k*Math.pow(2,a.apply(this,arguments)))),s=ne(t);if(e.wheel)e.mouse[0][0]===s[0]&&e.mouse[0][1]===s[1]||(e.mouse[1]=i.invert(e.mouse[0]=s)),clearTimeout(e.wheel);else{if(i.k===u)return;e.mouse=[s,i.invert(s)],Gi(this),e.start()}Sw(t),e.wheel=setTimeout((function(){e.wheel=null,e.end()}),p),e.zoom("mouse",o(b(_(i,u),e.mouse[0],e.mouse[1]),e.extent,f))}}function A(t,...n){if(!e&&r.apply(this,arguments)){var i=t.currentTarget,a=w(this,n,!0).event(t),u=Zn(t.view).on("mousemove.zoom",(function(t){if(Sw(t),!a.moved){var n=t.clientX-s,e=t.clientY-l;a.moved=n*n+e*e>g}a.event(t).zoom("mouse",o(b(a.that.__zoom,a.mouse[0]=ne(t,i),a.mouse[1]),a.extent,f))}),!0).on("mouseup.zoom",(function(t){u.on("mousemove.zoom mouseup.zoom",null),ue(t.view,a.moved),Sw(t),a.event(t).end()}),!0),c=ne(t,i),s=t.clientX,l=t.clientY;ae(t.view),Aw(t),a.mouse=[c,this.__zoom.invert(c)],Gi(this),a.start()}}function S(t,...n){if(r.apply(this,arguments)){var e=this.__zoom,a=ne(t.changedTouches?t.changedTouches[0]:t,this),u=e.invert(a),c=e.k*(t.shiftKey?.5:2),l=o(b(_(e,c),a,u),i.apply(this,n),f);Sw(t),s>0?Zn(this).transition().duration(s).call(x,l,a,t):Zn(this).call(v.transform,l,a,t)}}function E(e,...i){if(r.apply(this,arguments)){var o,a,u,c,f=e.touches,s=f.length,l=w(this,i,e.changedTouches.length===s).event(e);for(Aw(e),a=0;a this._renderTree());
+ onWillUpdateProps(() => {
+ // 等待 owl 完成 DOM patch 后再重绘 d3,避免直接操作 DOM 与 owl 冲突
+ Promise.resolve().then(() => this._renderTree());
+ });
}
get treeData() {
return this.props.treeData;
}
- onMounted() {
- this._renderTree();
- }
-
- onWillUpdateProps() {
- // 等待 owl 完成 DOM patch 后再重绘 d3,避免直接操作 DOM 与 owl 冲突
- Promise.resolve().then(() => this._renderTree());
- }
-
_renderTree() {
const d3 = window.d3;
if (!d3) {
@@ -29,7 +26,7 @@ export class MindmapRenderer extends Component {
if (!container || !this.treeData) return;
const width = Math.max(container.clientWidth, 900);
- const height = 560;
+ const height = Math.max(container.clientHeight || 560, 560);
// 清空后重绘
container.innerHTML = "";
@@ -75,7 +72,6 @@ export class MindmapRenderer extends Component {
.append("path")
.attr("class", "mindmap-link")
.attr("fill", "none")
- .attr("stroke", "#90A4AE")
.attr("stroke-width", 1.5)
.attr("opacity", 0.6)
.attr("d", (d) => {
@@ -103,8 +99,18 @@ export class MindmapRenderer extends Component {
.attr("height", 36)
.attr("x", -80)
.attr("y", -18)
- .attr("fill", (d) => (d.children ? "#1E88E5" : "#43A047"))
- .attr("stroke", (d) => (d.children ? "#1565C0" : "#2E7D32"))
+ .attr("fill", (d) => {
+ const k = d.data.kind;
+ if (k === "project") return "#5E35B1";
+ if (k === "stage") return "#1E88E5";
+ return "#43A047";
+ })
+ .attr("stroke", (d) => {
+ const k = d.data.kind;
+ if (k === "project") return "#4527A0";
+ if (k === "stage") return "#1565C0";
+ return "#2E7D32";
+ })
.attr("stroke-width", 1.5)
.style("filter", "drop-shadow(1px 2px 3px rgba(0,0,0,0.2))")
.on("mouseenter", function () {
@@ -135,9 +141,9 @@ export class MindmapRenderer extends Component {
return name.length > 14 ? name.substring(0, 13) + "…" : name;
});
- // 进度环(有进度的叶子任务)
+ // 进度环(任意带进度的节点:任务/阶段/项目 都显示"进行到哪一步")
nodes
- .filter((d) => !d.children && d.data.progress && d.data.progress > 0)
+ .filter((d) => d.data.progress && d.data.progress > 0)
.append("circle")
.attr("cx", 66)
.attr("cy", -14)
@@ -154,10 +160,11 @@ export class MindmapRenderer extends Component {
.attr("stroke-dashoffset", circ * (1 - p));
});
- // 点击 → 冒泡事件给 Controller
+ // 点击 → 把整个 node(含 kind/resId)冒泡给 Controller 决定导航
+ // 注意事件名必须与模板 t-on-node-click-ed 一致,否则不触发
nodes.on("click", (event, d) => {
- if (d.data.id) {
- this.trigger("node-clicked", { id: d.data.id });
+ if (d.data && d.data.kind) {
+ this.trigger("node-click-ed", { node: d.data });
}
});
}
diff --git a/project_md/static/src/js/mindmap_view.js b/project_md/static/src/js/mindmap_view.js
index ec349dc..73eeb71 100644
--- a/project_md/static/src/js/mindmap_view.js
+++ b/project_md/static/src/js/mindmap_view.js
@@ -7,7 +7,7 @@ import { MindmapRenderer } from "./mindmap_renderer";
export const mindmapView = {
type: "mindmap",
- display_name: "Mindmap",
+ display_name: "思维导图",
icon: "fa fa-sitemap",
multiRecord: true,
ArchParser: MindmapArchParser,
diff --git a/project_md/static/src/scss/mindmap.scss b/project_md/static/src/scss/mindmap.scss
index d0ce2b6..833b20d 100644
--- a/project_md/static/src/scss/mindmap.scss
+++ b/project_md/static/src/scss/mindmap.scss
@@ -1,10 +1,16 @@
.o_controller_mindmap {
+ display: flex;
+ flex-direction: column;
height: 100%;
padding: 12px;
box-sizing: border-box;
+ overflow: hidden;
}
.mindmap-renderer-root {
+ flex: 1 1 auto;
+ min-height: 560px;
+ overflow: auto;
background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);
border: 1px solid #d0d7de;
border-radius: 10px;
@@ -25,6 +31,25 @@
filter: drop-shadow(2px 4px 8px rgba(0, 0, 0, 0.3));
}
+/* 连接线颜色交给 CSS 控制,便于夜色模式覆盖(d3 不再写死 stroke) */
.mindmap-link {
pointer-events: none;
+ stroke: #90a4ae;
+}
+
+.mindmap-node text {
+ fill: #ffffff;
+}
+
+/* 深色模式适配:深色主题下容器与连线都不要纯白/浅灰 */
+.o_web_client.o_dark_theme .mindmap-renderer-root,
+.o_web_client.dark .mindmap-renderer-root {
+ background: linear-gradient(135deg, #1e2228 0%, #262a30 100%);
+ border-color: #3a4048;
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.4);
+}
+
+.o_web_client.o_dark_theme .mindmap-link,
+.o_web_client.dark .mindmap-link {
+ stroke: #5b6470;
}
diff --git a/project_md/static/src/xml/mindmap_template.xml b/project_md/static/src/xml/mindmap_template.xml
index a3018fc..ea04456 100644
--- a/project_md/static/src/xml/mindmap_template.xml
+++ b/project_md/static/src/xml/mindmap_template.xml
@@ -1,11 +1,11 @@
-
+
+ t-on-node-click-ed="onNodeClicked"/>
加载中…
@@ -15,6 +15,6 @@
+ style="width:100%;position:relative;"/>
diff --git a/project_md/views/project_md_views.xml b/project_md/views/project_md_views.xml
index 06891cf..9fb53de 100644
--- a/project_md/views/project_md_views.xml
+++ b/project_md/views/project_md_views.xml
@@ -1,6 +1,6 @@
-
+
project.task.mindmap
project.task
@@ -10,23 +10,26 @@
-
-
- 任务思维导图
- project.task
- kanban,list,form,calendar,pivot,graph,activity,mindmap
-
- {'default_view_mode': 'mindmap'}
+
+
+ project.project.mindmap
+ project.project
+ mindmap
+
+
+
-
-
+
+
+ kanban,list,form,mindmap
+
-
+
+ kanban,list,form,mindmap
+
+
+
kanban,list,form,calendar,pivot,graph,activity,mindmap
diff --git a/udoo_om_ux/__pycache__/__init__.cpython-314.pyc b/udoo_om_ux/__pycache__/__init__.cpython-314.pyc
new file mode 100644
index 0000000..802fb93
Binary files /dev/null and b/udoo_om_ux/__pycache__/__init__.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/__init__.cpython-314.pyc b/udoo_om_ux/models/__pycache__/__init__.cpython-314.pyc
new file mode 100644
index 0000000..220a201
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/__init__.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/ir_http.cpython-314.pyc b/udoo_om_ux/models/__pycache__/ir_http.cpython-314.pyc
new file mode 100644
index 0000000..9b504a9
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/ir_http.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/ir_ui_menu.cpython-314.pyc b/udoo_om_ux/models/__pycache__/ir_ui_menu.cpython-314.pyc
new file mode 100644
index 0000000..e08ea29
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/ir_ui_menu.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/res_company.cpython-314.pyc b/udoo_om_ux/models/__pycache__/res_company.cpython-314.pyc
new file mode 100644
index 0000000..b1cc7a4
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/res_company.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/res_users_settings.cpython-314.pyc b/udoo_om_ux/models/__pycache__/res_users_settings.cpython-314.pyc
new file mode 100644
index 0000000..2fbde1f
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/res_users_settings.cpython-314.pyc differ
diff --git a/udoo_om_ux/models/__pycache__/web_editor.cpython-314.pyc b/udoo_om_ux/models/__pycache__/web_editor.cpython-314.pyc
new file mode 100644
index 0000000..97623b5
Binary files /dev/null and b/udoo_om_ux/models/__pycache__/web_editor.cpython-314.pyc differ
diff --git a/udoo_om_ux/static/src/webclient/navbar/menu_center.js b/udoo_om_ux/static/src/webclient/navbar/menu_center.js
new file mode 100644
index 0000000..a03eef4
--- /dev/null
+++ b/udoo_om_ux/static/src/webclient/navbar/menu_center.js
@@ -0,0 +1,88 @@
+/** @odoo-module **/
+
+import { patch } from "@web/core/utils/patch";
+import { useEffect, onMounted } from "@odoo/owl";
+import { NavBar } from "@web/webclient/navbar/navbar";
+import { ActionContainer } from "@web/webclient/actions/action_container";
+import { cookie } from "@web/core/browser/cookie";
+
+// 菜单栏居中(原 omux_menu_center,已合并进 udoo_om_ux)
+// 常开:所有页面导航栏菜单项居中,仅适配 udoo_om_ux 暗色模式
+
+export function getCurrentColorScheme() {
+ const COLOR_SCHEME_COOKIE_NAME = 'color_scheme';
+ return cookie.get(COLOR_SCHEME_COOKIE_NAME) || 'light';
+}
+
+export function dnNavBarAddClasses(){
+ document.querySelector('body')?.classList.add('ks_body_class');
+ document.querySelector('.o_main_navbar')?.classList.add('navbar', 'navbar-expand-md');
+ document.querySelector('.ks-mobile-burger-menu')?.classList.remove('d-none');
+ document.querySelector('.mobile-burger-menu-default')?.classList.add('d-none');
+}
+
+export function themeAddClasses(){
+ const currentScheme = getCurrentColorScheme();
+ if(currentScheme == 'dark'){
+ if (!document.querySelector('body').classList.contains('darkness')){
+ document.querySelector('body')?.classList.add('darkness');
+ }
+ }
+}
+
+patch(NavBar.prototype, {
+ setup(){
+ super.setup();
+
+ onMounted(() => {
+ this.applyNavbarStyle();
+ themeAddClasses()
+ });
+
+ useEffect(() => {
+ this.applyNavbarStyle();
+ themeAddClasses()
+ });
+ },
+
+ async adapt(){
+ const result = await super.adapt();
+ this.applyNavbarStyle();
+ return result;
+ },
+
+ onNavBarDropdownItemSelection(menu) {
+ super.onNavBarDropdownItemSelection(menu);
+ this.applyNavbarStyle();
+ },
+
+ applyNavbarStyle() {
+ const body = document.body;
+ if (body && !body.classList.contains('ks_body_class')) {
+ dnNavBarAddClasses();
+ }
+ },
+});
+
+patch(ActionContainer.prototype, {
+ setup(){
+ super.setup();
+
+ onMounted(() => {
+ this.applyNavbarStyle();
+ themeAddClasses()
+ });
+
+ useEffect(() => {
+ this.applyNavbarStyle();
+ themeAddClasses()
+ });
+ },
+
+ applyNavbarStyle() {
+ const body = document.body;
+ if (body && !body.classList.contains('ks_body_class')) {
+ dnNavBarAddClasses();
+ }
+ },
+});
diff --git a/udoo_om_ux/static/src/webclient/navbar/menu_center.scss b/udoo_om_ux/static/src/webclient/navbar/menu_center.scss
new file mode 100644
index 0000000..9ef850b
--- /dev/null
+++ b/udoo_om_ux/static/src/webclient/navbar/menu_center.scss
@@ -0,0 +1,394 @@
+// ============================================================
+// 菜单栏居中(原 omux_menu_center,已合并进 udoo_om_ux)
+// 常开:所有页面导航栏菜单项居中
+// 暗色模式通过 body.darkness 适配
+// 变量/mixin 使用 omc- 前缀,避免与 omux/ks 变量冲突
+// ============================================================
+
+// ---- SCSS 变量 ----
+$omc-color-black: #241C1D;
+$omc-color-white: #FFFFFF;
+$omc-color-nav-bg: #E2E9F0;
+$omc-color-bg-main: #F5F8FB;
+$omc-color-E5E7EB: #E5E7EB;
+$omc-color-D9F1FD: #D9F1FD;
+$omc-color-E7495E: #E7495E;
+
+// 暗色模式色板
+$omc-dark-bg-main: #131325;
+$omc-dark-surface: #1C1C2E;
+$omc-dark-text: #D8D8E0;
+$omc-dark-border: #2E2E42;
+$omc-dark-hover: #252540;
+
+$omc-f-w-400: 400;
+$omc-f-w-500: 500;
+
+$omc-font-10: 10px;
+$omc-font-12: 12px;
+$omc-font-16: 16px;
+$omc-font-18: 18px;
+$omc-font-20: 20px;
+$omc-font-22: 22px;
+
+// ---- Mixins ----
+@mixin omc-min-1600 {
+ @media screen and (min-width: 1600px) { @content; }
+}
+@mixin omc-max-992 {
+ @media screen and (max-width: 992px) { @content; }
+}
+@mixin omc-max-768 {
+ @media screen and (max-width: 768px) { @content; }
+}
+@mixin omc-max-575 {
+ @media screen and (max-width: 575.8px) { @content; }
+}
+
+// ---- Body 基础 ----
+body.ks_body_class {
+ font-family: "Poppins", sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ height: 100vh;
+ background-color: $omc-color-bg-main;
+}
+
+body.ks_body_class.darkness {
+ background-color: $omc-dark-bg-main;
+}
+
+// ---- Header / 导航栏 ----
+.ks_body_class header {
+ position: sticky;
+ top: 0;
+ z-index: 10;
+ width: 100%;
+
+ .o_menu_systray {
+ align-items: center;
+ }
+
+ .o_main_navbar {
+ padding: 0px 40px;
+ min-height: 66px;
+
+ @include omc-min-1600 {
+ min-height: 76px;
+ }
+
+ background: $omc-color-white;
+ display: flex;
+ justify-content: space-between;
+ border-bottom: 1px solid $omc-color-E5E7EB !important;
+
+ // 核心:菜单居中
+ .o_menu_sections {
+ justify-content: center;
+ align-items: center;
+
+ // 菜单文字稍微大一点
+ .o_nav_entry,
+ .dropdown-toggle {
+ font-size: 15px;
+ }
+ }
+
+ .o_menu_brand {
+ color: $omc-color-black;
+ font-size: $omc-font-22;
+ font-weight: $omc-f-w-400;
+ line-height: 30.8px;
+
+ @include omc-max-992 {
+ font-size: $omc-font-18;
+ }
+ @include omc-max-575 {
+ font-size: $omc-font-12;
+ line-height: 16px;
+ margin-left: 4px !important;
+ }
+ }
+
+ // 移动端折叠菜单
+ @include omc-max-768 {
+ .navbar-collapse {
+ position: fixed;
+ top: 62px;
+ right: -100%;
+ height: 100%;
+ width: 80%;
+ transition: right 0.3s ease-in-out;
+ background-color: $omc-color-white;
+
+ &.show {
+ right: 0;
+ }
+ }
+ }
+
+ @include omc-max-992 {
+ padding: 0px 20px;
+ }
+ @include omc-max-575 {
+ padding: 0 10px;
+ }
+ }
+}
+
+// ---- 暗色模式:Header / 导航栏 ----
+body.darkness.ks_body_class header {
+ .o_main_navbar {
+ background: $omc-dark-surface;
+ border-bottom: 1px solid $omc-dark-border !important;
+
+ // 去掉白色背景底色:菜单项 & systray 背景跟随暗色,hover/focus/active 用暗色高亮
+ --NavBar-entry-backgroundColor: transparent;
+ --NavBar-entry-backgroundColor--hover: #{$omc-dark-hover};
+ --NavBar-entry-backgroundColor--focus: #{$omc-dark-hover};
+ --NavBar-entry-backgroundColor--active: #{$omc-dark-hover};
+
+ .o_menu_brand {
+ color: $omc-dark-text;
+ }
+
+ .navbar-collapse {
+ background-color: $omc-dark-surface;
+ }
+
+ // 导航栏菜单项文字
+ .o_menu_sections .dropdown-toggle,
+ .o_menu_sections a {
+ color: $omc-dark-text;
+ }
+
+ // systray 图标 / 按钮暗色适配
+ .o_menu_systray {
+ .o_nav_entry,
+ .dropdown-toggle,
+ .btn,
+ button,
+ .o-dropdown,
+ .o-dropdown-toggle {
+ color: $omc-dark-text;
+
+ &:hover,
+ &:focus,
+ &.show {
+ background-color: $omc-dark-hover;
+ color: $omc-color-white;
+ }
+ }
+
+ .o-dropdown--menu,
+ .o_MessagingMenu,
+ .o_ActivityMenu,
+ .o_UserMenu {
+ color: $omc-dark-text;
+ }
+
+ // 通知角标
+ .badge {
+ background-color: $omc-color-E7495E;
+ color: $omc-color-white;
+ }
+ }
+ }
+}
+
+// ---- 文字颜色 ----
+.ks_body_class .oe_topbar_name {
+ color: $omc-color-black !important;
+}
+body.darkness.ks_body_class .oe_topbar_name {
+ color: $omc-dark-text !important;
+}
+
+.ks_body_class .o_debug_manager button {
+ color: $omc-color-black !important;
+}
+body.darkness.ks_body_class .o_debug_manager button {
+ color: $omc-dark-text !important;
+}
+
+// ---- 用户名缩写圆圈 ----
+.ks_body_class .user-name {
+ font-size: $omc-font-20;
+ font-weight: $omc-f-w-500;
+ line-height: 32px;
+ min-width: 52px;
+ color: $omc-color-black;
+ border-radius: 10px;
+ background-color: $omc-color-D9F1FD;
+ padding: 7px 11px;
+
+ @include omc-max-768 {
+ border-radius: 5px;
+ border: 0.5px solid $omc-color-E5E7EB;
+ background-color: $omc-color-white;
+ font-size: $omc-font-12;
+ font-weight: $omc-f-w-400;
+ line-height: 14px;
+ width: 23px !important;
+ height: 23px;
+ min-width: 23px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 7px 14px;
+ }
+}
+
+body.darkness.ks_body_class .user-name {
+ color: $omc-dark-text;
+ background-color: rgba(217, 241, 253, 0.12);
+ border-color: $omc-dark-border;
+
+ @include omc-max-768 {
+ background-color: $omc-dark-surface;
+ }
+}
+
+// ---- Burger 菜单 ----
+.ks_body_class .o_burger_menu {
+ width: 69% !important;
+}
+
+.ks_body_class .modal-backdrop.show {
+ opacity: 0.2;
+}
+
+.ks_body_class .cross {
+ padding-left: 16px;
+ padding-right: 16px;
+}
+
+// 暗色模式:Burger 菜单
+body.darkness.ks_body_class .o_burger_menu {
+ background-color: $omc-dark-surface !important;
+
+ .o_burger_menu_content {
+ background-color: $omc-dark-surface;
+
+ .o_burger_menu_user {
+ color: $omc-dark-text;
+ }
+ }
+}
+
+// ---- 公司切换器 ----
+.ks_body_class .o_switch_company_menu {
+ border-radius: 50px;
+ border: 1px solid $omc-color-E5E7EB;
+ justify-content: center;
+ align-items: center;
+ min-height: 44px;
+ padding: 8px 10px 8px 10px !important;
+ display: flex !important;
+
+ @include omc-max-768 {
+ display: none !important;
+ }
+
+ // 下拉箭头(纯 CSS,不依赖外部图片)
+ .dropdown-toggle::after {
+ content: "";
+ display: inline-block;
+ margin-left: .4em;
+ vertical-align: middle;
+ width: 0;
+ height: 0;
+ border-left: 4px solid transparent;
+ border-right: 4px solid transparent;
+ border-top: 5px solid $omc-color-black;
+ border-radius: 1px;
+ transition: transform 0.3s ease-in-out;
+
+ @include omc-max-768 {
+ display: none;
+ }
+ }
+
+ .dropdown-toggle.show::after {
+ transform: rotate(-180deg);
+ }
+
+ .dropdown-toggle {
+ height: fit-content;
+
+ .oe_topbar_name {
+ font-size: $omc-font-12;
+ height: 100%;
+ padding-right: 6px;
+ line-height: normal !important;
+ }
+ }
+
+ .fa-check-square {
+ color: $omc-color-E7495E !important;
+ }
+}
+
+// 暗色模式:公司切换器
+body.darkness.ks_body_class .o_switch_company_menu {
+ border-color: $omc-dark-border;
+
+ .dropdown-toggle::after {
+ border-top-color: $omc-dark-text;
+ }
+
+ .dropdown-menu {
+ background-color: $omc-dark-surface;
+ border-color: $omc-dark-border;
+
+ .dropdown-item {
+ color: $omc-dark-text;
+
+ &:hover {
+ background-color: $omc-dark-hover;
+ }
+ }
+ }
+}
+
+// ---- 暗色模式:导航栏下拉菜单 ----
+body.darkness.ks_body_class {
+ .o_main_navbar .dropdown-menu {
+ background-color: $omc-dark-surface;
+ border-color: $omc-dark-border;
+
+ .dropdown-item {
+ color: $omc-dark-text;
+
+ &:hover,
+ &:focus {
+ background-color: $omc-dark-hover;
+ color: $omc-color-white;
+ }
+ }
+ }
+
+ // 导航栏品牌区域、菜单链接
+ .o_main_navbar a,
+ .o_main_navbar .o-nav-link {
+ color: $omc-dark-text;
+
+ &:hover {
+ color: $omc-color-white;
+ }
+ }
+
+ // systray 下拉
+ .o_menu_systray .dropdown-menu {
+ background-color: $omc-dark-surface;
+ border-color: $omc-dark-border;
+
+ .dropdown-item {
+ color: $omc-dark-text;
+
+ &:hover {
+ background-color: $omc-dark-hover;
+ }
+ }
+ }
+}