Files
saasshop/public/css/admin-components.css

840 lines
18 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* SaaSShop Admin Components
* 说明:用于承接 Blade 中零散的 inline style便于后续统一美化与治理。
*
* 美化方向Ant Design Pro 风格(规整、企业中后台范式)
*/
/* Toast渐进增强配合 admin.js 展示更友好的反馈提示) */
.toast-container{
position:fixed;
top:16px;
right:16px;
z-index:999;
display:flex;
flex-direction:column;
gap:10px;
width:min(420px, calc(100vw - 32px));
}
.toast{
background:var(--adm-bg-container, #ffffff);
border:1px solid var(--adm-border-color, #e5e7eb);
border-left-width:4px;
border-radius:var(--adm-radius, 12px);
padding:12px 12px;
color:var(--adm-text, #0f172a);
box-shadow:var(--adm-shadow-popover);
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:12px;
}
.toast-success{border-left-color:var(--adm-success, #16a34a);}
.toast-warning{border-left-color:var(--adm-warning, #f59e0b);}
.toast-error{border-left-color:var(--adm-error, #ef4444);}
.toast-content{
font-size:13px;
line-height:1.45;
word-break:break-word;
}
.toast-close{
appearance:none;
border:none;
background:transparent;
color:var(--adm-text-muted, #94a3b8);
font-size:18px;
line-height:1;
cursor:pointer;
padding:2px 6px;
border-radius:8px;
}
.toast-close:hover{
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
color:var(--adm-text, #0f172a);
}
.form-inline-row{
display:flex;
align-items:center;
gap:8px;
}
.text-danger{
color:#b42318;
}
/* 平台订单:退款状态治理区块 */
.refund-governance-block{
margin-top:12px;
border:1px dashed var(--adm-error-border-strong, rgba(239, 68, 68, .45));
background:var(--adm-error-bg, #fef2f2);
}
.refund-governance-title{
margin-bottom:6px;
}
.refund-governance-meta{
margin-bottom:8px;
}
/* 平台订单:治理提示块(用于 BMPA / 同步订阅 等动作前的安全阀说明) */
.governance-block{
margin-top:10px;
width:100%;
border:1px solid var(--adm-error-border-soft, rgba(239, 68, 68, .25));
background:var(--adm-error-bg, #fef2f2);
}
.governance-block-title{
margin:0;
}
.governance-block-body{
margin-top:6px;
font-size:12px;
line-height:1.5;
}
/* 可复用:治理提示块内的说明/脚注文本 */
.governance-block-footnote{
margin-top:6px;
font-size:12px;
line-height:1.5;
}
/* 可复用:折叠面板(参考 Ant Design Pro 的筛选区交互:可折叠、摘要做成一条可点 Header */
/* 可复用Filters Card平台订单/订阅等列表页共用:统一筛选区观感) */
.filters-card{
padding:0;
}
.filters-summary{
padding:14px 16px;
}
.filters-body{
padding:14px 16px 16px;
border-top:1px solid var(--adm-border-color, #e5e7eb);
}
.filters-grid{
margin:0;
}
/* 可复用List Card列表页统一卡片标题区/操作区/表格区) */
.list-card{
padding:0;
}
/* 可复用Pagination中后台分页参考 Ant Design Pro */
.adm-pagination{
margin-top:16px;
}
/* 强制去掉分页区域下划线:避免被全局 a:hover{text-decoration:underline;} 影响 */
.adm-pagination a,
.adm-pagination a:hover,
.adm-pagination a:focus,
.adm-pagination a:active{
text-decoration:none !important;
}
.adm-pagination-inner{
display:flex;
align-items:center;
justify-content:space-between;
gap:12px;
flex-wrap:wrap;
}
.adm-page-list{
display:flex;
align-items:center;
gap:6px;
flex-wrap:wrap;
}
.adm-page-btn,
.adm-page-num,
.adm-page-ellipsis{
display:inline-flex;
align-items:center;
justify-content:center;
min-width:32px;
height:32px;
padding:0 10px;
border-radius:10px;
border:1px solid var(--adm-border-color, #e5e7eb);
background:var(--adm-bg-container, #ffffff);
color:var(--adm-text, #0f172a);
text-decoration:none;
box-shadow:var(--adm-shadow-sm);
}
.adm-page-ellipsis{
border-color:transparent;
background:transparent;
box-shadow:none;
min-width:auto;
padding:0 6px;
color:var(--adm-text-muted, #94a3b8);
}
.adm-page-num.is-active{
border-color:var(--adm-primary-border-45, rgba(22, 119, 255, .45));
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
color:var(--adm-text, #0f172a);
font-weight:700;
}
.adm-page-btn:hover,
.adm-page-num:hover{
text-decoration:none;
border-color:var(--adm-primary-border-35, rgba(22, 119, 255, .35));
background:var(--adm-primary-tint-06, rgba(22, 119, 255, .06));
}
.adm-page-btn.is-disabled{
opacity:.55;
cursor:not-allowed;
}
.adm-page-meta{
margin-left:auto;
}
.list-card-header{
padding:14px 16px;
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:12px;
}
.list-card-title{
margin:0;
}
.list-card-subtitle{
margin-top:6px;
}
.list-card-body{
border-top:1px solid var(--adm-border-color, #e5e7eb);
padding:0;
overflow:hidden;
}
.list-card-table{
margin:0;
border-collapse:separate;
border-spacing:0;
}
.list-card-table tbody tr:last-child td{
border-bottom:none;
}
.list-card-table th,
.list-card-table td{
padding:12px 12px;
}
.list-card-table thead th{
background:var(--adm-table-header-bg, #fafafa);
}
.list-card-table tbody tr:hover td{
background:var(--adm-table-row-hover-bg, rgba(22, 119, 255, .04));
}
.list-card-table .table-empty{
padding:24px 12px;
text-align:center;
background:var(--adm-surface-tint);
}
/* 可复用PageHeader参考 Ant Design Pro标题区 + 描述 + 右侧操作区) */
.page-header{
width:100%;
padding:16px;
border:1px solid var(--adm-border-color, #e5e7eb);
border-radius:var(--adm-radius, 12px);
background:var(--adm-bg-container, #ffffff);
}
.page-header-main{
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:12px;
}
.page-header-title{
font-size:18px;
font-weight:700;
color:var(--adm-text, #0f172a);
line-height:1.2;
}
.page-header-subtitle{
margin-top:6px;
font-size:13px;
color:var(--adm-text-secondary, #64748b);
line-height:1.45;
}
.page-header-actions{
display:flex;
align-items:center;
gap:10px;
flex-wrap:wrap;
}
.page-header-meta{
margin-top:12px;
display:flex;
flex-wrap:wrap;
gap:12px;
color:var(--adm-text-secondary, #64748b);
font-size:12px;
}
/* 可复用KPI 卡片栅格(参考 Ant Design Pro Analysis第一行 4 个等宽卡片) */
/* 可复用:迷你图表/排行/占比(渐进增强:由 admin.js 渲染,页面无 JS 时为空但不影响表格) */
.adm-mini-chart,
.adm-mini-rank,
.adm-mini-share{
margin-top:10px;
width:100%;
padding:10px 10px;
border:1px solid var(--adm-border-color, #e5e7eb);
border-radius:var(--adm-radius, 12px);
background:var(--adm-surface-tint);
box-shadow:var(--adm-shadow-sm);
}
/* 迷你图表的摘要行(用于展示合计/峰值等口径,参考 Ant Design Pro 的 card extra/meta 文案) */
.adm-mini-meta{
margin-top:8px;
display:flex;
flex-wrap:wrap;
gap:6px;
align-items:center;
color:var(--adm-text-secondary, #64748b);
font-size:12px;
}
.adm-mini-meta-item strong{
color:var(--adm-text, #0f172a);
}
.adm-mini-meta-sep{
color:var(--adm-text-muted, #94a3b8);
}
.adm-mini-chart.is-empty,
.adm-mini-rank.is-empty,
.adm-mini-share.is-empty{
align-items:center;
justify-content:center;
color:var(--adm-text-muted, #94a3b8);
font-size:12px;
}
.adm-mini-chart{
/* 高度加大:避免 bar 与容器 padding/边框挤压,提升可读性 */
height:110px;
display:flex;
align-items:flex-end;
gap:8px;
}
.adm-mini-chart-bar{
flex:1;
min-width:0;
height:10px;
border-radius:10px 10px 4px 4px;
border:1px solid var(--adm-primary-border-35, rgba(22, 119, 255, .35));
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
position:relative;
overflow:hidden;
}
.adm-mini-chart-bar::after{
content:"";
position:absolute;
inset:0;
background:linear-gradient(180deg, rgba(22, 119, 255, .22), rgba(22, 119, 255, .04));
}
.adm-mini-chart-bar:hover{
border-color:var(--adm-primary-border-45, rgba(22, 119, 255, .45));
background:var(--adm-primary-tint-06, rgba(22, 119, 255, .06));
}
/* 可复用:迷你排行(渐进增强:由 admin.js 渲染,页面无 JS 时为空但不影响表格) */
.adm-mini-rank{
display:flex;
flex-direction:column;
gap:8px;
}
.adm-mini-rank-row{
display:flex;
align-items:center;
gap:10px;
}
.adm-mini-rank-name{
width:72px;
min-width:72px;
max-width:72px;
font-size:12px;
color:var(--adm-text-secondary, #64748b);
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.adm-mini-rank-bar-wrap{
flex:1;
min-width:0;
height:12px;
border-radius:999px;
background:rgba(15, 23, 42, .06);
overflow:hidden;
}
.adm-mini-rank-bar{
height:100%;
border-radius:999px;
background:linear-gradient(90deg, rgba(22, 119, 255, .55), rgba(22, 119, 255, .18));
}
.adm-mini-rank-value{
width:92px;
min-width:92px;
text-align:right;
font-size:12px;
color:var(--adm-text, #0f172a);
}
/* 可复用迷你占比Top5渐进增强由 admin.js 渲染,页面无 JS 时为空但不影响表格) */
.adm-mini-share{
display:flex;
flex-direction:column;
gap:8px;
}
.adm-mini-share-row{
display:flex;
align-items:center;
gap:10px;
}
.adm-mini-share-name{
width:72px;
min-width:72px;
max-width:72px;
font-size:12px;
color:var(--adm-text-secondary, #64748b);
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.adm-mini-share-bar-wrap{
flex:1;
min-width:0;
height:12px;
border-radius:999px;
background:rgba(15, 23, 42, .06);
overflow:hidden;
}
.adm-mini-share-bar{
height:100%;
border-radius:999px;
background:linear-gradient(90deg, rgba(245, 158, 11, .45), rgba(245, 158, 11, .16));
}
.adm-mini-share-value{
width:92px;
min-width:92px;
text-align:right;
font-size:12px;
color:var(--adm-text, #0f172a);
}
.kpi-grid{
display:grid;
grid-template-columns:repeat(4,minmax(0,1fr));
gap:12px;
align-items:stretch; /* 关键:保证同一行 KPI 卡片等高 */
}
/*
* 重要admin-base.css 有全局规则 `.card + .card{margin-top:20px;}` 用于“纵向堆叠卡片”。
* 但在 gridKPI / two-col 等)里会导致“第二张卡片整体下沉”,出现你看到的“站点在中间、其它在底部”的错位。
* 因此:在 KPI grid 场景显式清零 margin-top。
*/
.kpi-grid .card{
margin-top:0;
}
/* KPI 卡片:统一为竖向 flex保证标题/数值/脚注布局稳定且等高 */
.kpi-grid .card{
display:flex;
flex-direction:column;
height:100%;
}
.kpi-grid .stat-card-footnote{
margin-top:auto; /* 把脚注推到底部,进一步锁定等高视觉 */
}
/* Dashboard 两列卡片:同样清理“纵向堆叠 margin-top”对 grid 的干扰,确保“趋势/排行/工作台/定位/最近订单/占比”顶边对齐 */
.two-col .card{
margin-top:0;
}
/* 通用:所有 grid 容器内的卡片,都应清理 `.card + .card{margin-top:20px;}` 的纵向堆叠规则。
* 否则会出现“同一行/同一网格里的第2张卡开始整体下沉”的错位。
*/
.grid > .card,
.grid-2 > .card,
.grid-3 > .card,
.grid-4 > .card,
.grid-5 > .card,
.grid-6 > .card{
margin-top:0;
}
@media (max-width: 1024px){
.kpi-grid{
grid-template-columns:repeat(2,minmax(0,1fr));
}
}
@media (max-width: 640px){
.kpi-grid{
grid-template-columns:1fr;
}
}
.stat-card-title{
font-size:12px;
color:var(--adm-text-secondary, #64748b);
}
.stat-card-value{
margin-top:10px;
font-size:22px;
font-weight:800;
color:var(--adm-text, #0f172a);
letter-spacing:.2px;
}
.stat-card-footnote{
margin-top:8px;
font-size:12px;
color:var(--adm-text-muted, #94a3b8);
}
.collapsible > summary{
list-style:none;
cursor:pointer;
}
.collapsible > summary::-webkit-details-marker{
display:none;
}
.collapsible-summary{
user-select:none;
}
.collapsible-body{
margin-top:10px;
}
/* 平台订单:工具区(两列分组卡片化,避免表单散落) */
.tool-grid{
display:grid;
grid-template-columns:repeat(2,minmax(0,1fr));
gap:12px;
align-items:stretch;
}
/* 防止 focus-boxborder + 内部 form 宽度造成列间“压线/重叠” */
.tool-grid > *{
min-width:0;
}
@media (max-width: 768px){
.tool-grid{
grid-template-columns:1fr;
}
}
.tool-group{
width:100%;
height:100%;
display:flex;
flex-direction:column;
}
.tool-group-title{
font-size:12px;
color:#94a3b8;
text-transform:uppercase;
letter-spacing:.08em;
font-weight:700;
margin:0 0 10px;
}
.tool-group-subtitle{
margin:0 0 6px;
}
/* 平台订单列表:避免列太多导致内容挤压成“竖排/断字” */
.table-wrap{
width:100%;
overflow-x:auto;
}
.table-wrap table.platform-orders-table{
min-width:1600px;
}
/* 平台订单列表:根据视图控制 min-width精简视图更紧凑full 视图更宽) */
.platform-orders-table.is-compact{
min-width:1400px;
}
.platform-orders-table.is-full{
min-width:2000px;
}
.table-nowrap th,
.table-nowrap td{
white-space:nowrap;
word-break:normal;
}
/* 平台订单列表:精简视图(默认隐藏部分列,避免列表过长) */
.platform-orders-table .col-optional{
display:none;
}
.platform-orders-table.is-full .col-optional{
display:table-cell;
}
/* 平台订单列表(精简视图):进一步收敛信息密度 */
.platform-orders-table.is-compact td{
padding-top:8px;
padding-bottom:8px;
}
.platform-orders-table.is-compact .muted-xs{
font-size:12px;
}
/* 平台订单列表:二行辅助信息(例如 线索/订阅ID */
.platform-orders-table .row-meta{
margin-top:2px;
}
/* 平台订单列表:行内治理提示(精简视图主要入口) */
.platform-orders-table .row-warn{
margin-top:4px;
padding:4px 6px;
border-left:3px solid var(--adm-error, #ef4444);
background:var(--adm-error-bg, #fef2f2);
border-radius:4px;
}
.platform-orders-table .row-warn a.link{
color:var(--adm-error, #ef4444);
text-decoration:underline;
}
.platform-orders-table .row-warn a.link:hover{
text-decoration:none;
}
.platform-orders-table .row-warn-prefix{
font-weight:600;
display:inline-block;
padding:1px 6px;
border-radius:10px;
background:var(--adm-error-tint, rgba(239, 68, 68, .12));
color:var(--adm-error, #ef4444);
margin-right:4px;
}
/* 平台订单列表:精简视图也要可达的治理提示(对账/退款不一致) */
.platform-orders-table .governance-hints{
margin-bottom:6px;
}
.platform-orders-table .governance-hint{
line-height:1.4;
}
/* 总台管理:顶部导航(顶部主菜单保留,但视觉对齐 Ant Design Pro Header */
.sidebar.topnav{
white-space:normal;
overflow-x:visible;
background:var(--adm-bg-header, #ffffff);
border-bottom:1px solid var(--adm-border-color, #e5e7eb);
box-shadow:var(--adm-shadow-header, none);
}
.topnav-row{
display:flex;
align-items:center;
gap:16px;
flex-wrap:wrap;
}
.topnav-brand{
display:inline-flex;
align-items:center;
font-weight:800;
color:var(--adm-text, #0f172a);
padding:8px 10px;
border-radius:var(--adm-radius-sm, 10px);
}
.topnav-brand:hover{
text-decoration:none;
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
}
.topnav-menu{
display:flex;
align-items:center;
gap:8px;
flex:1;
flex-wrap:wrap;
}
.topnav-link,
.topnav-summary{
display:inline-flex;
align-items:center;
gap:6px;
padding:8px 10px;
border-radius:var(--adm-radius-sm, 10px);
color:var(--adm-text-secondary, #64748b);
}
.topnav-link:hover,
.topnav-summary:hover{
text-decoration:none;
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
color:var(--adm-text, #0f172a);
}
.topnav-item{
position:relative;
}
.topnav-item > summary::-webkit-details-marker{
display:none;
}
.topnav-item > summary{
list-style:none;
cursor:pointer;
user-select:none;
}
.topnav-dropdown{
position:absolute;
top:calc(100% + 8px);
left:0;
min-width:180px;
background:var(--adm-bg-container, #ffffff);
border:1px solid var(--adm-border-color, #e5e7eb);
border-radius:var(--adm-radius, 12px);
padding:10px;
box-shadow:var(--adm-shadow-popover);
z-index:100;
}
/* details 未展开时不展示下拉 */
.topnav-item:not([open]) .topnav-dropdown{
display:none;
}
.topnav-sub{
display:block;
padding:9px 10px;
border-radius:var(--adm-radius-sm, 10px);
color:var(--adm-text, #0f172a);
margin:0;
}
.topnav-sub:hover{
text-decoration:none;
background:var(--adm-primary-tint-08, rgba(22, 119, 255, .08));
}
.topnav-actions{
display:flex;
align-items:center;
gap:10px;
}
.topnav-meta{
margin-top:6px;
}
/* 移动端:下拉改为文档流(避免 absolute 导致溢出) */
@media (max-width: 768px){
.topnav-row{gap:10px;}
.topnav-dropdown{
position:static;
min-width:auto;
box-shadow:none;
margin-top:6px;
}
}
/* 兼容:旧的左侧导航二级分组样式(保留但不再作为主形态) */
.sidebar .nav-group{
margin:10px 0;
}
.sidebar .nav-group-title{
cursor:pointer;
user-select:none;
color:#94a3b8;
font-size:12px;
text-transform:uppercase;
letter-spacing:.08em;
font-weight:700;
margin:0 0 6px;
list-style:none;
}
.sidebar .nav-group summary::-webkit-details-marker{
display:none;
}
.sidebar .nav-item--sub{
display:block;
padding-left:12px;
}