/* 鑫盛云财务系统 - 全局品牌样式 | 作者：Dengfawang | 日期：2026-08-18 */
:root {
	--xs-primary: #6366f1;
	--xs-primary-dark: #4f46e5;
	--xs-primary-light: #8b5cf6;
	--xs-gradient: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
	--xs-card-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
}

/* ---------- 登录页 ---------- */
/* v3：左右分栏布局见文末 v16 重构块（锚点：#page-login / body[data-path="/login"] / body.xs-login-page） */

.page-card {
	border-radius: 16px !important;
	box-shadow: var(--xs-card-shadow) !important;
	border: none !important;
	overflow: hidden;
}

.page-card .login-header {
	text-align: center;
	padding: 30px 30px 10px;
}

.page-card .login-header .app-logo {
	max-height: 70px !important;
	width: auto !important;
	margin: 0 auto;
	display: block;
}

.xinsheng-login-logo {
	display: block;
	margin: 0 auto 20px;
	max-height: 70px;
	width: auto;
}

.page-card .login-content h2,
.page-card .form-signin h2 {
	color: #1e293b;
	font-size: 22px;
	font-weight: 600;
	text-align: center;
	margin-bottom: 24px;
}

.page-card input[type="text"],
.page-card input[type="email"],
.page-card input[type="password"],
.page-card select {
	border-radius: 8px !important;
	border: 1px solid #e2e8f0 !important;
	padding: 10px 14px !important;
	font-size: 14px !important;
}

.page-card input:focus,
.page-card select:focus {
	border-color: var(--xs-primary) !important;
	box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15) !important;
	outline: none !important;
}

.page-card .btn-primary,
.page-card .btn-login,
.btn-primary {
	background: var(--xs-gradient) !important;
	border: none !important;
	border-radius: 8px !important;
	padding: 10px 24px !important;
	font-weight: 600 !important;
	font-size: 15px !important;
	color: #fff !important;
}

.page-card .btn-primary:hover,
.page-card .btn-login:hover {
	background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%) !important;
	transform: translateY(-1px);
	box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
}

.page-card .forgot-password a {
	color: var(--xs-primary) !important;
	text-decoration: none;
}

.xinsheng-copyright {
	text-align: center;
	color: rgba(255, 255, 255, 0.8);
	font-size: 13px;
	margin-top: 20px;
}

.page-card .powered-by {
	display: none !important;
}

/* ---------- Desk 导航栏 ---------- */
.navbar {
	background: #fff !important;
	border-bottom: 1px solid #e2e8f0 !important;
	box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04) !important;
}

.navbar .navbar-brand {
	display: flex !important;
	align-items: center !important;
	gap: 8px;
}

.xinsheng-navbar-logo {
	height: 28px;
	width: auto;
	vertical-align: middle;
}

.xinsheng-navbar-text {
	font-size: 15px;
	font-weight: 600;
	color: #1e293b;
	vertical-align: middle;
}

.btn-primary {
	background: var(--xs-gradient) !important;
	border-color: transparent !important;
}

.btn-primary:hover {
	background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%) !important;
}

/* ---------- 滚动条 ---------- */
::-webkit-scrollbar {
	width: 8px;
	height: 8px;
}

::-webkit-scrollbar-thumb {
	background: #cbd5e1;
	border-radius: 4px;
}

::-webkit-scrollbar-thumb:hover {
	background: var(--xs-primary-light);
}

/* ========== 登录页：左右分栏布局 v2（修复窄竖线问题）| 2026-08-19 ==========
   修复要点：
   1) 最外层用 body.page-login 限定（v14/v15 的 body 类名是 page-login，不是 login）
   2) 不再以 .login-content 作为 flex 容器 —— v14/v15 中 .login-content 与 .page-card 是同一元素
   3) flex 容器 = JS 注入时标记的 .xs-login-wrap（即 .page-card 的 parentNode）
   4) .page-card 由固定 width:380px 改为 flex: 0 0 40%，与品牌区共同铺满整屏 */
body.page-login .main-section,
body.page-login .container {
	width: 100% !important;
	max-width: none !important;
	padding: 0 !important;
}

/* 共同父容器：display:flex + row + min-height:100vh */
body.page-login .xs-login-wrap,
body.page-login .login-content {
	background: #ffffff !important;
	min-height: 100vh;
	display: flex !important;
	flex-direction: row !important;
	align-items: stretch;
	justify-content: flex-start;
	margin: 0 !important;
	padding: 0 !important;
	width: 100% !important;
	max-width: none !important;
	flex: 0 0 100% !important; /* 覆盖 Bootstrap col-* 的限宽 */
}

/* 左侧品牌展示区（60%） */
body.page-login .xs-login-wrap > .xs-login-brand,
body.page-login .login-content > .xs-login-brand {
	flex: 0 0 60% !important;
	max-width: 60% !important;
	background: linear-gradient(135deg, #1677ff 0%, #7b61ff 100%);
	display: flex;
	align-items: center;
	justify-content: center;
	position: relative;
	min-height: 100vh;
	color: #fff;
	overflow: hidden;
}

/* 几何装饰圆 */
.xs-login-brand::before {
	content: "";
	position: absolute;
	width: 420px;
	height: 420px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.08);
	top: -120px;
	right: -120px;
}
.xs-login-brand::after {
	content: "";
	position: absolute;
	width: 260px;
	height: 260px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.06);
	bottom: -80px;
	left: -80px;
}

.xs-brand-inner {
	position: relative;
	z-index: 2;
	max-width: 560px;
	padding: 40px;
	text-align: left;
}

.xs-brand-top {
	margin-bottom: 90px;
}
.xs-brand-logo {
	/* 历史尺寸（v3.3 覆盖为 400px 宽）—— 背景/内边距/圆角已于 v3.3 移除（透明 PNG 直出） */
	height: 46px;
	width: auto;
}

.xs-brand-hero h1 {
	font-size: 48px;
	font-weight: 700;
	color: #fff;
	margin: 0 0 10px;
	line-height: 1.25;
}
.xs-brand-hero h2 {
	font-size: 32px;
	font-weight: 600;
	color: #fff;
	margin: 0 0 18px;
	line-height: 1.3;
}
.xs-brand-sub {
	font-size: 18px;
	color: rgba(255, 255, 255, 0.85);
	margin: 0 0 40px;
}

.xs-brand-features {
	display: flex;
	flex-direction: column;
	gap: 18px;
	margin-bottom: 70px;
}
.xs-feature-item {
	background: rgba(255, 255, 255, 0.16);
	border: 1px solid rgba(255, 255, 255, 0.3);
	color: #fff;
	border-radius: 12px;
	padding: 14px 18px;
	backdrop-filter: blur(4px);
}
.xs-feature-item h3 {
	font-size: 16px;
	font-weight: 600;
	color: #ffffff;
	margin: 0 0 4px;
	line-height: 1.3;
}
.xs-feature-item p {
	font-size: 13px;
	color: rgba(255, 255, 255, 0.85);
	margin: 0;
	line-height: 1.5;
}

.xs-brand-footer .xs-brand-verified {
	font-size: 18px;
	color: #ffffff;
	font-weight: 400;
	margin: 0 0 18px;
	line-height: 1.5;
}
.xs-brand-footer p {
	font-size: 13px;
	color: #ffffff;
	margin: 0 0 4px;
}
.xs-brand-copyright {
	text-align: center;
}
.xs-brand-copyright p {
	font-size: 12px;
	color: #ffffff;
	margin: 0 0 6px;
	line-height: 1.6;
}

/* 右侧登录表单区（40%） */
body.page-login .xs-login-wrap > .page-card,
body.page-login .login-content > .page-card {
	background: #ffffff !important;
	border: none !important;
	box-shadow: none !important;
	flex: 0 0 40% !important;
	max-width: 40% !important;
	width: auto !important;
	margin: 0 !important;
	border-radius: 12px !important;
	align-self: center;
}

.page-card .login-header {
	text-align: center;
	padding: 20px 30px 10px;
}

.page-card .login-header .app-logo {
	max-height: 64px !important;
	width: auto !important;
	margin: 0 auto 8px;
	display: block;
	border-radius: 14px;
}

.page-card .login-header h2 {
	font-size: 24px;
	font-weight: 600;
	color: #1a1a1a;
	text-align: center;
	margin: 8px 0 6px;
}

.page-card .login-header p {
	font-size: 14px;
	color: #8c8c8c;
	text-align: center;
	margin-bottom: 20px;
}

.page-card .login-label {
	font-size: 14px;
	color: #333;
	font-weight: 500;
}

.page-card input[type="text"],
.page-card input[type="email"],
.page-card input[type="password"],
.page-card select {
	border-radius: 6px !important;
	border: 1px solid #d9d9d9 !important;
	padding: 10px 12px !important;
	font-size: 14px !important;
	width: 100%;
}

.page-card input:focus,
.page-card select:focus {
	border-color: #1677ff !important;
	box-shadow: 0 0 0 3px rgba(22, 119, 255, 0.15) !important;
	outline: none !important;
}

.page-card .btn-primary,
.page-card .btn-login,
.btn-primary {
	background: #1677ff !important;
	border: none !important;
	border-radius: 6px !important;
	padding: 10px 24px !important;
	font-weight: 600 !important;
	font-size: 15px !important;
	color: #fff !important;
	width: 100%;
}

.page-card .btn-primary:hover,
.page-card .btn-login:hover {
	background: #0958d9 !important;
	box-shadow: 0 4px 12px rgba(22, 119, 255, 0.3);
}

.page-card .forgot-password a {
	color: #1677ff !important;
	text-decoration: none;
	font-size: 14px;
}

.or-login-with-email-link .btn-default {
	border-radius: 6px !important;
	border-color: #d9d9d9 !important;
	color: #333 !important;
}

.divider span {
	color: #999;
}

.page-card .sign-up-message a {
	color: #1677ff !important;
}

/* 响应式：移动端自动切换单栏 */
@media (max-width: 768px) {
	body.page-login .xs-login-wrap > .xs-login-brand,
	body.page-login .login-content > .xs-login-brand {
		display: none;
	}
	body.page-login .xs-login-wrap,
	body.page-login .login-content {
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	body.page-login .xs-login-wrap > .page-card,
	body.page-login .login-content > .page-card {
		flex: 0 0 auto;
		max-width: 92%;
		width: 100%;
	}
}

/* ========== 登录页左右分栏 v3 —— 基于 ERPNext v16.31 真实 DOM 重构 | 2026-08-19 ==========
   v16 源码级事实（frappe/templates/base.html、web.html、login.html、login.js、web.scss）：
   1) base.html: <body class="{{ body_class or '' }}" data-path="{{ path }}"> → body class 为空，
      旧版 body.page-login 选择器全部失效 ← 之前"窄竖线"的根本原因
   2) web.html: 登录页外层 <div id="page-login" data-path="/login">（container_attributes），
      内部结构 .page-content-wrapper > .page-breadcrumbs + main.container +
      .page-header-wrapper + .page_content + .page-footer
   3) login.html: 5 个 <section class="for-*"> 共存（同一时间仅一个可见），
      卡片是 <div class="login-content page-card">（flex-column），父容器 = section
   4) login.js 用 jQuery toggle 切换各 section 的 inline style="display"，
      CSS 必须用 [style*="display: none"] 区分可见性，不能无条件 display:flex !important
   锚点：#page-login（web.html 渲染 id，最可靠）+ body[data-path="/login"] + body.xs-login-page（JS 添加） */

/* 1) 隐藏登录页导航栏（Standard Navbar web_block）与横幅 */
body[data-path="/login"] .navbar,
body.xs-login-page .navbar,
body[data-path="/login"] .banner-extension,
body.xs-login-page .banner-extension {
	display: none !important;
}

/* 2) 覆盖 web.html 布局壳：全宽、去 padding、隐藏空壳容器（v16 web.scss 给 .page-content-wrapper 加了 padding-top:60px） */
#page-login .page-content-wrapper,
body.xs-login-page .page-content-wrapper {
	padding-top: 0 !important;
	min-height: 100vh !important;
}
#page-login main.container,
body.xs-login-page main.container {
	width: 100% !important;
	max-width: none !important;
	padding: 0 !important;
}
#page-login .page-breadcrumbs,
#page-login .page-header-wrapper,
#page-login .page-footer,
body.xs-login-page .page-breadcrumbs,
body.xs-login-page .page-header-wrapper,
body.xs-login-page .page-footer {
	display: none !important;
}
#page-login .page_content,
body.xs-login-page .page_content {
	margin: 0 !important;
}

/* 3) 兜底：无 JS 时默认隐藏非登录 section（不加 !important，避免阻止 login.js 的 jQuery toggle 显示它们） */
#page-login section.for-email-login,
#page-login section.for-signup,
#page-login section.for-forgot,
#page-login section.for-login-with-email-link {
	display: none;
}

/* 4) for-* section（JS 统一打 xs-login-wrap 类）：
      被 login.js 隐藏的（inline style="display: none"）保持隐藏；可见的设为横向分栏 */
#page-login section.xs-login-wrap[style*="display: none"],
body.xs-login-page section.xs-login-wrap[style*="display: none"] {
	display: none !important;
}
#page-login section.xs-login-wrap:not([style*="display: none"]),
body.xs-login-page section.xs-login-wrap:not([style*="display: none"]) {
	display: flex !important;
	flex-direction: row !important;
	align-items: stretch;
	min-height: 100vh;
	width: 100%;
	margin: 0;
	background: #ffffff;
}

/* 5) 左侧品牌展示区（60%） */
#page-login section.xs-login-wrap > .xs-login-brand,
body.xs-login-page section.xs-login-wrap > .xs-login-brand {
	flex: 0 0 60% !important;
	max-width: 60% !important;
	min-height: 100vh;
	background: linear-gradient(135deg, #1677ff 0%, #7b61ff 100%);
	display: flex;
	align-items: center;
	justify-content: center;
	position: relative;
	color: #fff;
	overflow: hidden;
}

/* 6) 右侧登录表单区（40%）—— v16 卡片本身就是 flex-column，保持 column，仅调整尺寸与居中 */
#page-login section.xs-login-wrap > .page-card,
body.xs-login-page section.xs-login-wrap > .page-card {
	flex: 0 0 40% !important;
	max-width: 40% !important;
	width: auto !important;
	margin: 0 !important;
	border-radius: 0 !important;
	box-shadow: none !important;
	border: none !important;
	background: #ffffff !important;
	display: flex !important;
	flex-direction: column !important;
	justify-content: center;
	padding: 48px 64px;
}
/* 卡片内容限宽居中（40% 面板在宽屏下较宽，表单保持舒适阅读宽度） */
#page-login section.xs-login-wrap > .page-card .page-card-head,
#page-login section.xs-login-wrap > .page-card form.form-signin,
#page-login section.xs-login-wrap > .page-card .sign-up-message,
body.xs-login-page section.xs-login-wrap > .page-card .page-card-head,
body.xs-login-page section.xs-login-wrap > .page-card form.form-signin,
body.xs-login-page section.xs-login-wrap > .page-card .sign-up-message {
	width: 100%;
	max-width: 400px;
	margin-left: auto;
	margin-right: auto;
}

/* 7) 响应式：移动端自动切换单栏 */
@media (max-width: 768px) {
	#page-login section.xs-login-wrap > .xs-login-brand,
	body.xs-login-page section.xs-login-wrap > .xs-login-brand {
		display: none !important;
	}
	#page-login section.xs-login-wrap:not([style*="display: none"]),
	body.xs-login-page section.xs-login-wrap:not([style*="display: none"]) {
		flex-direction: column;
		align-items: stretch;
		min-height: 100svh;
	}
	#page-login section.xs-login-wrap > .page-card,
	body.xs-login-page section.xs-login-wrap > .page-card {
		flex: 0 0 auto;
		max-width: 100%;
		width: 100%;
		min-height: 100svh;
		padding: 48px 24px;
	}
}

/* ========== 登录页 Logo 优化 v3.1（尺寸于 v3.3 翻倍）| 2026-08-19 ==========
   1) 左侧品牌区 Logo：46px 高 → 200px 宽 → 400px 宽（v3.3，透明 PNG 直出）
   2) 右侧表单区 Logo：.xs-form-logo（方形完整 logo 192px 居中，透明 PNG 直出），
      默认 espresso/E 图标由 JS + CSS 双重隐藏 */

/* 左侧品牌区 Logo（v3.3 覆盖为 400px 宽、无 padding） */
.xs-login-brand .xs-brand-logo {
	width: 200px !important;
	height: auto !important;
}

/* 右侧表单区 Logo（v3.3 覆盖为 192px 宽、居中） */
#page-login .xs-form-logo,
body.xs-login-page .xs-form-logo {
	width: 96px !important;
	height: 96px !important;
	display: block !important;
	margin: 0 auto 20px !important;
	object-fit: contain !important;
}

/* 隐藏原 indicator 后，让"欢迎登录"标题在 400px 限宽容器内居中 */
#page-login .page-card-head-text,
body.xs-login-page .page-card-head-text {
	text-align: center;
}

/* ========== 登录页 Logo 最终调整 v3.3 | 2026-08-19 ==========
   背景：用户已将 public/images/ 图片替换为透明背景 PNG
   （xinsheng_logo.png 横版 / xinsheng_logo_square.png 方形完整 / xinsheng_favicon.png）
   → 移除 v3.2 的全部滤镜/混合模式（filter: brightness(0) invert(1)、mix-blend-mode 备选），
     图片透明直出，只保留布局属性
   → 左侧 Logo 200px → 400px（翻倍）；右侧 Logo 96px → 192px（翻倍）
   → 保留 ERPNext 原图标隐藏兜底（JS + CSS 双保险） */

/* 左侧品牌区 Logo：透明 PNG 直出，400px 宽等比放大，无任何滤镜/混合 */
.xs-login-brand .xs-brand-logo {
	width: 400px !important;
	max-width: 100% !important; /* 窄屏 60% 面板收缩时等比缩小，防溢出 */
	height: auto !important;
	background: transparent !important;
	padding: 0 !important;
	border-radius: 0 !important;
	margin: 0 !important;
	display: block !important;
}

/* 右侧表单区 Logo：透明 PNG 直出，192px 居中（与"欢迎登录"间距 24px） */
#page-login .xs-form-logo,
body.xs-login-page .xs-form-logo {
	width: 192px !important;
	height: auto !important;
	display: block !important;
	margin: 0 auto 24px !important;
	object-fit: contain !important;
	background: transparent !important;
}

/* 兜底隐藏 ERPNext 默认图标（v16: .page-card-head .indicator / espresso SVG；含各种 img 候选） */
#page-login .page-card-head .indicator,
body.xs-login-page .page-card-head .indicator,
#page-login .page-card-head img:not(.xs-form-logo),
body.xs-login-page .page-card-head img:not(.xs-form-logo),
#page-login .page-card img[src*="erpnext"],
body.xs-login-page .page-card img[src*="erpnext"],
#page-login .page-card img[alt*="ERPNext"],
#page-login .page-card img[alt*="erpnext"] {
	display: none !important;
}

/* ========== 登录页左上角品牌头 v3.4 | 2026-08-19 ==========
   背景：用户用 AI 重新生成 xinsheng_logo.png（圆形 XS 图标 + "鑫盛云财务"文字的组合图），
   该图以 400px 宽显示时标题被放大，且图片右下角带"豆包AI生成"内嵌水印（在图片文件里，非 DOM，
   无法用 CSS/JS 删除）。→ 左上角改为 DOM 结构：48px 圆形 logo（favicon）+ 30px 文字标题，
   flex 垂直居中；登录页不再引用 xinsheng_logo.png，水印随之消失。 */

/* 品牌头横排：圆形 logo + 标题，垂直居中对齐 */
.xs-brand-top {
	display: flex !important;
	align-items: center !important;
	gap: 14px !important;
	flex-wrap: nowrap !important;
	margin-bottom: 90px !important;
}

/* 左上角圆形 logo：48px 直径（高特异性 + !important 覆盖 v3.3 的 400px 横版规则） */
.xs-brand-top .xs-brand-logo {
	width: 48px !important;
	height: 48px !important;
	max-width: 48px !important;
	border-radius: 50% !important;
	object-fit: cover !important;
	background: transparent !important;
	padding: 0 !important;
	margin: 0 !important;
	display: block !important;
}

/* "鑫盛云财务"标题：30px、加粗、字距 1px，与 logo 垂直居中对齐 */
.xs-brand-top .xs-brand-title {
	font-size: 30px !important;
	font-weight: bold !important;
	color: #fff !important;
	letter-spacing: 1px !important;
	line-height: 1 !important;
	white-space: nowrap !important;
}

/* 豆包水印兜底：AI 生成图右下角水印内嵌在 xinsheng_logo.png 文件中（非 DOM 元素），
   登录页已不再引用该图；若 navbar.js 的 .xinsheng-login-logo 或其他残留引用它，一并隐藏 */
.xs-login-brand img[src*="xinsheng_logo.png"],
.page-card img[src*="xinsheng_logo.png"],
img.xinsheng-login-logo[src*="xinsheng_logo.png"] {
	display: none !important;
}

/* ========== 登录页品牌修复 v3.5（图标与文字分离）| 2026-08-19 ==========
   背景（二轮勘察结论，非猜测）：
   1) public/images/ 下只有 2 个文件：xinsheng_favicon.png、xinsheng_logo.png
   2) xinsheng_favicon.png 实为 384x106 横版组合图（PNG IHDR 头解析），不是纯图标 ——
      左上角 48px 圆形裁剪（object-fit:cover 居中）会露出图中"盛云"字样（用户截图所见）
   3) xinsheng_logo.png 含"豆包AI生成"内嵌水印，已禁用
   4) 不存在独立的"纯 XS 圆形图标"文件 → 图标统一指向 xinsheng_icon.png（需用户提供，
      建议 256x256 透明底紫色圆形 XS，放入 public/images/xinsheng_icon.png）
   JS 侧（xinsheng_login.js v3.5）：
   - 左上角：48px 圆形图标 + 30px"鑫盛云财务"文字（结构不变，src 换 xinsheng_icon.png）
   - 右侧表单：新增 .xs-form-brand 容器 = 80px 圆形图标 + 26px"鑫盛云财务系统"文字（竖排居中），
     onerror 时只隐藏图标、保留文字（问题2 验收项是文字必须显示） */

/* 右侧表单区品牌头：竖排容器（图标在上、文字在下，整体居中），深色文字适配白色卡片 */
#page-login .xs-form-brand,
body.xs-login-page .xs-form-brand {
	display: flex !important;
	flex-direction: column !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 10px !important;
	width: 100% !important;
	max-width: 400px !important;
	margin: 0 auto 18px !important; /* 与下方"欢迎登录"标题拉开间距 */
	text-align: center !important;
}

/* 右侧图标：80px 方形（object-fit:contain 等比缩放；纯图标若自带圆形底可去掉 border-radius） */
#page-login .xs-form-brand .xs-form-logo,
body.xs-login-page .xs-form-brand .xs-form-logo {
	width: 80px !important;
	height: 80px !important;
	max-width: 80px !important;
	display: block !important;
	margin: 0 auto !important; /* 覆盖 v3.1/v3.3 的 96px/192px 规则 */
	object-fit: contain !important;
	border-radius: 50% !important;
	background: transparent !important;
	padding: 0 !important;
}

/* 右侧标题文字：26px bold 深色，白色卡片上的品牌标题（问题2 核心修复） */
#page-login .xs-form-brand .xs-form-title,
body.xs-login-page .xs-form-brand .xs-form-title {
	display: block !important;
	font-size: 26px !important;
	font-weight: bold !important;
	color: #1f272e !important;
	letter-spacing: 1px !important;
	line-height: 1.3 !important;
}

/* 兜底：图标加载失败（JS onerror 置 display:none）时，文字仍垂直居中显示 */
#page-login .xs-form-brand img[style*="display: none"] + .xs-form-title,
body.xs-login-page .xs-form-brand img[style*="display: none"] + .xs-form-title {
	margin-top: 6px !important;
}

/* ========== 登录页品牌修复 v3.6（按用户五项反馈任务）| 2026-08-19 ==========
   任务1：左上角破损图标删除 —— JS 已不再注入并 DOM 清理，此处 CSS 兜底隐藏任何残留 img
   任务2：右侧表单区图标改用 /assets/mynewapp/images/tubiao.png（紫色圆形 XS 图标），
          44px，横排（图标左、文字右），图标与"鑫盛云财务系统"文字垂直居中对齐
   任务3：左侧内容块整体上移（margin-top 负值），使其顶部与右侧 XS 图标水平持平
   任务4：左上角"鑫盛云财务"字号 30px → 28px，letter-spacing 1px → 2px（保持 bold）
   任务5：豆包水印 JS 已 DOM 删除，此处兜底隐藏一切水印源图片（xinsheng_logo.png 等） */

/* 任务1：左上角品牌头内任何 img 一律隐藏（JS cleanupBrand 已删除，此为旧缓存/旧注入兜底）。
   注意：选择器必须压过 v3.4 的 .xs-brand-top .xs-brand-logo（display:block !important，特异性 0,2,0），
   故用 .xs-login-brand 前缀 + 类名组合提升至 0,3,1 */
.xs-brand-top img,
.xs-login-brand .xs-brand-top img.xs-brand-logo {
	display: none !important;
}

/* 任务2：右侧品牌头改横排 —— 图标在左、文字在右，垂直居中对齐（覆盖 v3.5 的竖排 column） */
#page-login .xs-form-brand,
body.xs-login-page .xs-form-brand {
	flex-direction: row !important;
	align-items: center !important;
	justify-content: center !important;
	gap: 12px !important;
	margin: 0 auto 18px !important;
}

/* 任务2：图标 44px（40-48px 建议区间）；tubiao.png 为紫色圆形图标，contain 等比缩放 + 圆形裁剪 */
#page-login .xs-form-brand .xs-form-logo,
body.xs-login-page .xs-form-brand .xs-form-logo {
	width: 44px !important;
	height: 44px !important;
	max-width: 44px !important;
	max-height: 44px !important;
	min-width: 44px !important; /* 横排 flex 项防压缩 */
	display: block !important;
	margin: 0 !important; /* 横排时取消 auto 居中 */
	object-fit: contain !important;
	border-radius: 50% !important;
	background: transparent !important;
	padding: 0 !important;
}

/* 任务4：左上角"鑫盛云财务"缩至 28px（30→28），bold 保持，字距 2px（1→2）更精致 */
.xs-brand-top .xs-brand-title {
	font-size: 28px !important;
	letter-spacing: 2px !important;
}

/* 任务3：左侧内容块整体上移，使其顶部与右侧 XS 图标水平持平。
   注意：-80px 可按实际截图微调（-40px 上移较少、-120px 上移较多），
   以"智能财务管理"标题顶部与右侧 44px 图标顶部对齐为准；不改变内部元素间距 */
.xs-login-brand .xs-brand-inner {
	margin-top: -80px !important;
}

/* 任务5 兜底：隐藏一切水印源图片（xinsheng_logo.png / doubao 相关），防任何位置残留 */
.xs-login-brand img[src*="xinsheng_logo.png"],
.xs-login-brand img[src*="doubao"],
.xs-login-brand img[src*="ai-generated"],
.page-card img[src*="xinsheng_logo.png"],
img[src*="xinsheng_logo.png"] {
	display: none !important;
}

/* ========== 注册弹窗样式 v1 | 2026-08-20 ========== */
.xs-reg-modal-mask {
  position: fixed; inset: 0; background: rgba(0,0,0,.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 9999; padding: 16px;
}
.xs-reg-modal {
  position: relative; background: #fff; width: 100%; max-width: 400px;
  border-radius: 14px; padding: 28px 26px 22px;
  box-shadow: 0 12px 40px rgba(0,0,0,.18);
  max-height: 92vh; overflow-y: auto;
}
.xs-reg-close {
  position: absolute; top: 10px; right: 12px;
  background: none; border: none; font-size: 22px; color: #999;
  cursor: pointer; line-height: 1; padding: 4px 8px;
}
.xs-reg-close:hover { color: #333; }
.xs-reg-title {
  text-align: center; font-size: 20px; font-weight: 700;
  color: #333; margin: 0 0 20px;
}
.xs-reg-field { margin-bottom: 14px; }
.xs-reg-row {
  display: flex; align-items: center; gap: 8px;
  border: 1px solid #d9d9d9; border-radius: 8px;
  padding: 0 12px; background: #fff;
  transition: border-color .2s, box-shadow .2s;
}
.xs-reg-row:focus-within {
  border-color: #1677ff;
  box-shadow: 0 0 0 3px rgba(22,119,255,.15);
}
.xs-reg-row.xs-reg-invalid {
  border-color: #f5222d;
  box-shadow: 0 0 0 3px rgba(245,34,45,.1);
}
.xs-reg-icon { color: #999; display: inline-flex; flex: none; }
.xs-reg-prefix {
  color: #333; font-size: 14px; flex: none;
  padding-right: 8px; border-right: 1px solid #eee;
}
.xs-reg-input {
  flex: 1; border: none; outline: none; padding: 11px 0;
  font-size: 14px; color: #333; background: transparent; min-width: 0;
}
.xs-reg-code-btn {
  flex: none; background: #e6f4ff; color: #1677ff;
  border: none; border-radius: 6px; padding: 7px 12px;
  font-size: 13px; cursor: pointer; white-space: nowrap;
}
.xs-reg-code-btn:disabled,
.xs-reg-code-btn.xs-reg-code-btn-disabled {
  background: #f5f5f5; color: #bbb; cursor: not-allowed;
}
.xs-reg-error {
  display: none; color: #f5222d; font-size: 12px; margin: 5px 2px 0;
}
.xs-reg-agree {
  display: flex; align-items: flex-start; gap: 6px;
  font-size: 13px; color: #666; margin: 14px 0 16px;
  cursor: pointer; line-height: 1.5;
}
.xs-reg-agree input { margin-top: 3px; accent-color: #1677ff; }
.xs-reg-link { color: #1677ff; text-decoration: none; }
.xs-reg-link:hover { text-decoration: underline; }
.xs-reg-submit {
  width: 100%; background: #1677ff; color: #fff;
  border: none; border-radius: 8px; padding: 12px;
  font-size: 15px; font-weight: 600; cursor: pointer;
}
.xs-reg-submit:hover { background: #0958d9; }
.xs-reg-foot {
  text-align: center; font-size: 13px; color: #666; margin: 16px 0 0;
}
.xs-reg-foot a { color: #1677ff; text-decoration: none; }
.xs-reg-foot a:hover { text-decoration: underline; }
@media (max-width: 480px) {
  .xs-reg-modal { padding: 22px 16px 18px; }
}

/* ========== 独立【注册】按钮 v5 | 2026-08-22 ==========
   背景：不再依赖 System Settings → "Login with email link"，注册按钮由 JS
   （xinsheng_login.js → ensureRegisterButton）复用登录按钮 className 注入，
   视觉（颜色/尺寸/圆角/hover/宽度）与登录按钮完全一致，此处仅控制间距。
   注：btn-block 自带 100% 宽度（与登录按钮一致），不再额外设置宽度或 margin:0 auto。
   v16 的 .page-card-actions 为 flex column + gap:12px，登录按钮下方已有 12px 间距；
   margin-top 仅在个别无 flex gap 的环境中兜底，此处用较小值避免叠加过多。 */
.xinsheng-register-btn {
  margin-top: 4px; /* 与 .page-card-actions 的 gap:12px 叠加后约 16px，间距合理 */
}
@media (max-width: 480px) {
  .xinsheng-register-btn { margin-top: 4px; }
}

/* ========== 注册弹窗：邮箱字段 + 图形验证码（2026-08-23） ========== */

/* 邮箱输入框：与手机号输入框样式完全一致（.xs-reg-row / .xs-reg-input 已统一样式，
   此处无需额外覆盖；仅保证邮箱字段占位文字颜色与其余输入框一致） */
.xs-reg-field-email .xs-reg-row {
  gap: 8px; /* 与手机号字段一致 */
}

/* 验证码区域：输入框 + 验证码图片同行，间距合理 */
.xs-reg-captcha-wrap {
  gap: 10px; /* 输入框与图片间距 */
}
.xs-reg-captcha-wrap .xs-reg-input {
  flex: 1;
}
.xs-reg-captcha-img {
  width: 100px;
  height: 36px;
  flex-shrink: 0;
  border-radius: 4px;
  border: 1px solid #d9d9d9;
  object-fit: cover;
  cursor: pointer;
  /* 点击刷新提示（hover 时轻微描边高亮 + 蒙层提示） */
  transition: border-color .2s, box-shadow .2s;
}
.xs-reg-captcha-img:hover {
  border-color: #1677ff;
  box-shadow: 0 0 0 3px rgba(22,119,255,.12);
}

/* 字段级错误提示：红色小字，输入框下方（原有 .xs-reg-error 已定义，这里强化间距与字号） */
.xs-reg-error {
  color: #f5222d;
  font-size: 12px;
  line-height: 1.4;
  margin: 5px 2px 0;
  min-height: 0; /* 无错误时隐藏（由 JS display:none 控制） */
}

/* 弹窗内容自适应高度：防止内容溢出/被裁切。
   .xs-reg-modal 已有 max-height:92vh; overflow-y:auto，此处明确内容区内边距，
   确保新增邮箱字段后表单也能在弹窗内滚动，不会溢出到弹窗外。 */
.xs-reg-modal .xs-reg-form {
  max-height: calc(92vh - 120px); /* 减去标题/页脚高度，保证可滚动 */
  overflow-y: auto;
  padding-right: 4px; /* 为滚动条留出空隙，避免压字 */
}

/* 弹窗顶部统一错误区（2026-08-23）：
   注册失败/验证码校验接口异常等非字段级错误在此展示；红色圆角条，位于标题与表单之间 */
.xs-reg-top-error {
  display: none;
  color: #f5222d;
  background: #fff1f0;
  border: 1px solid #ffccc7;
  border-radius: 6px;
  font-size: 13px;
  line-height: 1.5;
  margin: 0 0 14px;
  padding: 9px 12px;
}

/* ========== 登录页 FOUC（无样式内容闪烁）修复 | 2026-08-23 ==========
   根因：
   v16 登录页的左右分栏布局几乎全部依赖 JS 注入的类与 DOM 元素：
     - body.xs-login-page（JS init() 添加）
     - section.xs-login-wrap（JS ensureBrandPanel 添加）
     - .xs-login-brand 左侧蓝色面板、.xs-form-brand 右侧品牌头、.xinsheng-register-btn 注册按钮
       （均为 JS 向 DOM 注入）
   而 web_include_css 虽在 <head> 同步加载（head.html），web_include_js 却在 <body> 底部才执行
   （base.html 在 content/navbar 之后）。于是浏览器首帧渲染时这些类/元素尚不存在，
   对应 CSS 选择器不匹配 → 先显示 ERPNext 默认居中白卡片，JS 跑完后才切成分栏 → 闪烁。

   修复策略（用户指定的"兜底方案"）：
   首帧时把默认登录卡片整体 visibility:hidden（保留布局占位、不触发 focus 丢失），
   待 JS 完成注入并打上 body.xs-login-page 后，用更高优先级规则恢复 visible。
   —— 用极短空白/遮挡替代样式闪烁；JS 是从 body 底部同步执行的 IIFE，
      init() 在首帧绘制前大概率已完成，闪烁被压缩到几乎不可见。 */
#page-login .login-content.page-card,
body[data-path="/login"] .login-content.page-card {
	visibility: hidden !important;
}
body.xs-login-page #page-login .login-content.page-card,
body.xs-login-page .login-content.page-card {
	visibility: visible !important;
}


/* ========== 登录页布局调整：70/30分栏 + 标题对齐 + 功能卡片横排 ========== */
/* 纯CSS追加覆盖，不修改JS/HTML，右侧登录区100%保留原样 */

/* 1. 分栏比例：左侧70%，右侧30% */
body.xs-login-page #page-login section.xs-login-wrap > .xs-login-brand {
    flex: 0 0 70% !important;
    max-width: 70% !important;
    width: 70% !important;
}
body.xs-login-page #page-login section.xs-login-wrap > .page-card {
    flex: 0 0 30% !important;
    max-width: 30% !important;
    width: 30% !important;
}

/* 2. 左右标题基线对齐：取消原-80px上移，标题组整体下移 */
body.xs-login-page .xs-login-brand .xs-brand-inner {
    margin-top: 0 !important;
    max-width: 1000px !important;
    width: 85% !important;
}

/* 3. 功能卡片改为横向并排，等宽等高，均匀间距，水平居中 */
body.xs-login-page .xs-login-brand .xs-brand-features {
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    justify-content: center !important;
    align-items: stretch !important;
    gap: 24px !important;
    width: 100% !important;
    margin-bottom: 50px !important;
}
body.xs-login-page .xs-login-brand .xs-feature-item {
    flex: 1 1 0% !important;
    min-width: 0 !important;
    width: auto !important;
}

/* 4. 底部版权信息完整保留，居中显示 */
body.xs-login-page .xs-login-brand .xs-brand-footer {
    text-align: center !important;
    width: 100% !important;
}

/* ========== 登录页CSS三次调整（纯CSS追加，不修改原代码）| 2026-09-04 ========== */

/* ① 左侧标题组水平居中 */
.xs-login-brand .xs-brand-hero {
	text-align: center !important;
}

/* ② 功能卡片强制4行垂直布局：标题1行 + 功能描述各独占1行 */
body.xs-login-page .xs-login-brand .xs-feature-item {
	flex-direction: column !important;
	align-items: center !important;
	justify-content: center !important;
	text-align: center !important;
	display: flex !important;
}
body.xs-login-page .xs-login-brand .xs-feature-item h3,
body.xs-login-page .xs-feature-item h3 {
	display: block !important;
	text-align: center !important;
	width: 100% !important;
	font-size: 16px !important;
	font-weight: 600 !important;
	line-height: 1.4 !important;
	margin: 0 0 8px !important;
}
body.xs-login-page .xs-login-brand .xs-feature-item p,
body.xs-login-page .xs-feature-item p {
	display: block !important;
	width: 100% !important;
	text-align: center !important;
	font-size: 13px !important;
	line-height: 1.6 !important;
	margin: 0 !important;
	padding: 0 !important;
}
/* 每个卡片内部所有 p 段落均强制独占一行（white-space 允许文本内换行保留） */
body.xs-login-page .xs-login-brand .xs-feature-item p,
body.xs-login-page .xs-feature-item p {
	white-space: pre-line !important;
}

/* ③ 底部版权保持居中显示（原文案已完整，此处不做任何改动） */

/* ========== 登录页多语言切换条（简体中文 / 繁體中文 / English）| 2026-09 ==========
   背景：登录页需在"默认简体"基础上支持一键切换为 繁體中文 / English，且切换后
   整页（含注入的品牌面板与右侧表单）都由 Frappe 服务端按下一次请求携带的
   preferred_language cookie 渲染为对应语言。
   本块为两个语言标签按钮提供轻量 pill 样式：
   - 始终水平居中于登录卡片顶部、品牌头之上（JS ensureLangSwitcher 把
     .xs-lang-switcher 插到 .page-card 直接子元素、.page-card-head 之前）。
   - 当前语言高亮为品牌蓝 #1677ff 实心；未选中采用浅灰描边 hover 变蓝。 */
body.xs-login-page .xs-lang-switcher,
#page-login .xs-lang-switcher {
	display: flex !important;
	flex-wrap: wrap !important;
	gap: 6px !important;
	justify-content: center !important;
	align-items: center !important;
	margin: 0 auto 14px !important;
	width: 100% !important;
	max-width: 280px !important;
}
body.xs-login-page .xs-lang-switcher .xs-lang-btn,
#page-login .xs-lang-switcher .xs-lang-btn {
	flex: 0 0 auto !important;
	background: #f5f7fa !important;
	border: 1px solid #e2e8f0 !important;
	color: #334155 !important;
	border-radius: 999px !important;
	padding: 5px 14px !important;
	font-size: 13px !important;
	font-weight: 600 !important;
	line-height: 1.2 !important;
	cursor: pointer !important;
	transition: border-color .15s ease, background .15s ease, color .15s ease !important;
	box-shadow: none !important;
	outline: none !important;
	margin: 0 !important;
	white-space: nowrap !important;
	width: auto !important;
}
body.xs-login-page .xs-lang-switcher .xs-lang-btn:hover,
#page-login .xs-lang-switcher .xs-lang-btn:hover {
	border-color: #1677ff !important;
	color: #1677ff !important;
	background: #e6f4ff !important;
}
body.xs-login-page .xs-lang-switcher .xs-lang-btn.is-active,
body.xs-login-page .xs-lang-switcher .xs-lang-btn[aria-pressed="true"],
#page-login .xs-lang-switcher .xs-lang-btn.is-active,
#page-login .xs-lang-switcher .xs-lang-btn[aria-pressed="true"] {
	background: #1677ff !important;
	border-color: #1677ff !important;
	color: #ffffff !important;
}
/* 窄屏折叠时语言条随卡片内边距收紧，保持可点按 */
@media (max-width: 480px) {
	body.xs-login-page .xs-lang-switcher,
	#page-login .xs-lang-switcher {
		max-width: 100% !important;
	}
	body.xs-login-page .xs-lang-switcher .xs-lang-btn,
	#page-login .xs-lang-switcher .xs-lang-btn {
		padding: 5px 10px !important;
		font-size: 12px !important;
	}
}

/* ========== 隐藏原生登录页底部语言切换条，避免与自定义 pill 重复 | 2026-09 ==========
   现场采用自定义三语 pill（.xs-lang-switcher，见上方本块），
   Frappe/ERPNext 自带语言条会与之并列造成两个切换入口 —— 统一隐藏。
   目标选择器含两层保险：
   1) 用户指定片段 .page-login .login-language-switcher（旧版 body class）;
   2) v16 实际页面锚点 body.xs-login-page / #page-login（本 app JS 挂的 body 类与现实容器）。 */
.page-login .login-language-switcher,
body.xs-login-page .login-language-switcher,
#page-login .login-language-switcher,
.page-login .language-switcher,
body.xs-login-page .language-switcher,
#page-login .language-switcher {
	display: none !important;
}
/* 兜底：v16 footer / desktop 下拉可能有残留在 .page-footer 两侧的语言区块 */
body.xs-login-page footer .languages,
body.xs-login-page .page-footer .language,
body.xs-login-page nav .language-switcher,
body.xs-login-page .navbar-collapse .language-switcher {
	display: none !important;
}
