refactor(frontend): split large reimbursement and audit modules

This commit is contained in:
caoxiaozhu
2026-05-21 23:53:03 +08:00
parent 2908dda024
commit f6f787ff38
53 changed files with 15637 additions and 14179 deletions

View File

@@ -0,0 +1,336 @@
.opinion-wrap textarea {
width: 100%;
min-height: 100px;
resize: none;
border: 1px solid #d7e0ea;
border-radius: 4px;
padding: 10px 12px;
color: #0f172a;
font-size: 13px;
line-height: 1.55;
transition: border-color 160ms ease, box-shadow 160ms ease;
}
.opinion-wrap textarea::placeholder {
color: #94a3b8;
}
.opinion-wrap textarea:focus {
border-color: #10b981;
box-shadow: 0 0 0 3px rgba(16, 185, 129, .12);
outline: none;
}
/* ── Side Cards ── */
.side-card {
border-radius: 4px;
background: #fff;
border: 1px solid #edf2f7;
box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
overflow: hidden;
transition: box-shadow 200ms ease;
}
.side-card:hover { box-shadow: 0 4px 16px rgba(15, 23, 42, .06); }
.side-card .card-header {
padding: 12px 16px;
}
.side-card.compact {
border-radius: 4px;
}
/* ── Risk Card ── */
.risk-total {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
padding: 5px 12px;
border-radius: 3px;
font-size: 11px;
}
.risk-total span { font-weight: 750; }
.risk-total.high {
background: #fee2e2;
color: #dc2626;
}
.risk-total.high strong { font-size: 16px; font-weight: 900; }
.risk-items {
padding: 4px 14px 14px;
display: grid;
gap: 8px;
}
.risk-row {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 4px;
border: 1px solid #f1f5f9;
transition: all 160ms ease;
}
.risk-row:hover { border-color: #e2e8f0; background: #fafbfd; }
.risk-icon {
width: 30px; height: 30px;
display: grid; place-items: center;
border-radius: 4px;
font-size: 16px;
flex-shrink: 0;
}
.risk-row.high .risk-icon { background: #fef2f2; color: #ef4444; }
.risk-row.medium .risk-icon { background: #fff7ed; color: #f97316; }
.risk-text {
flex: 1;
color: #334155;
font-size: 13px;
line-height: 1.4;
}
.risk-level {
padding: 3px 8px;
border-radius: 3px;
font-size: 12px;
font-weight: 800;
flex-shrink: 0;
}
.risk-level.high { background: #fef2f2; color: #ef4444; }
.risk-level.medium { background: #fff7ed; color: #f97316; }
/* ── Side Dual ── */
.side-dual {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.reminder-list {
margin: 0;
padding: 10px 16px 14px;
display: grid;
gap: 8px;
list-style: none;
}
.reminder-list li {
display: flex;
align-items: flex-start;
gap: 8px;
color: #334155;
font-size: 12px;
line-height: 1.5;
}
.reminder-list li i {
margin-top: 2px;
color: #f59e0b;
font-size: 14px;
flex-shrink: 0;
}
.info-list {
display: grid;
grid-template-columns: auto 1fr;
gap: 6px 14px;
margin: 0;
padding: 10px 16px 14px;
font-size: 13px;
}
.info-list dt { color: #94a3b8; font-weight: 700; }
.info-list dd { margin: 0; color: #0f172a; font-weight: 850; }
/* ── Modal Footer ── */
.modal-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 16px 28px;
background: #fff;
border-top: 1px solid #e8eef6;
}
.footer-right {
display: flex;
gap: 10px;
}
.action-btn {
height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 0 20px;
border-radius: 4px;
font-size: 14px;
font-weight: 800;
transition: all 180ms ease;
border: 1px solid transparent;
}
.action-btn.back {
background: #f8fafc;
border-color: #e2e8f0;
color: #475569;
}
.action-btn.back:hover {
background: #f1f5f9;
border-color: #cbd5e1;
color: #0f172a;
}
.action-btn.supplement {
background: #fff;
border-color: #fed7aa;
color: #ea580c;
}
.action-btn.supplement:hover {
background: #fff7ed;
box-shadow: 0 4px 12px rgba(234, 88, 12, .12);
}
.action-btn.reject {
background: #fff;
border-color: #fecaca;
color: #ef4444;
}
.action-btn.reject:hover {
background: #fef2f2;
box-shadow: 0 4px 12px rgba(239, 68, 68, .12);
}
.action-btn.approve {
background: #059669;
color: #fff;
box-shadow: 0 4px 16px rgba(5, 150, 105, .25);
}
.action-btn.approve:hover {
background: #047857;
box-shadow: 0 8px 24px rgba(5, 150, 105, .30);
}
.action-btn:active { transform: scale(.97); }
/* ── Modal Transitions ── */
.detail-modal-enter-active { transition: opacity 260ms ease; }
.detail-modal-enter-active .detail-modal { transition: transform 320ms cubic-bezier(.2, .8, .2, 1), opacity 280ms ease; }
.detail-modal-leave-active { transition: opacity 200ms ease; }
.detail-modal-leave-active .detail-modal { transition: transform 220ms ease, opacity 200ms ease; }
.detail-modal-enter-from { opacity: 0; }
.detail-modal-enter-from .detail-modal { transform: translateY(16px); opacity: 0; }
.detail-modal-leave-to { opacity: 0; }
.detail-modal-leave-to .detail-modal { transform: translateY(8px); opacity: 0; }
/* ── Responsive ── */
@media (max-width: 1320px) {
.list-toolbar, .list-foot { grid-template-columns: 1fr; }
.detail-hero {
grid-template-columns: minmax(0, 1.8fr) repeat(4, minmax(0, 1fr));
}
.hero-summary-panel {
grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
}
.detail-expense-table {
overflow-x: auto;
}
.detail-expense-table table {
min-width: 980px;
}
.detail-modal {
width: calc(100vw - 40px);
height: calc(100vh - 40px);
}
.body-grid { grid-template-columns: 1fr; }
.metrics-strip { grid-template-columns: repeat(2, 1fr); }
.side-dual { grid-template-columns: 1fr; }
}
@media (max-width: 760px) {
.approval-list { padding: 16px; }
.status-tabs { gap: 18px; overflow-x: auto; }
.filter-set { width: 100%; }
.filter-btn, .page-size { width: 100%; }
.list-foot { justify-items: stretch; }
.pager, .page-size { justify-self: stretch; }
.detail-hero {
grid-template-columns: 1fr 1fr;
gap: 12px;
padding: 16px;
}
.applicant-card,
.hero-summary-panel,
.progress-line {
grid-column: 1 / -1;
}
.hero-summary-panel {
grid-template-columns: 1fr;
}
.hero-summary-item {
padding: 14px 0;
}
.detail-card {
padding: 14px 16px;
}
.detail-card-head {
flex-direction: column;
align-items: stretch;
}
.detail-total {
align-self: flex-start;
}
.detail-expense-table table {
min-width: 980px;
}
.detail-modal {
width: 100vw;
height: 100vh;
max-width: 100vw;
max-height: 100vh;
border-radius: 0;
}
.modal-header { padding: 16px 18px; flex-wrap: wrap; }
.header-right { width: 100%; justify-content: flex-end; }
.metrics-strip { grid-template-columns: 1fr 1fr; }
.summary-grid { grid-template-columns: 1fr; }
.progress-track { overflow-x: auto; padding-bottom: 8px; }
.node-label strong { font-size: 11px; }
.modal-footer { flex-direction: column; padding: 14px 18px; }
.footer-right { width: 100%; }
.action-btn { flex: 1; }
}

View File

@@ -1477,339 +1477,3 @@ tbody tr:last-child td { border-bottom: 0; }
padding: 12px 14px;
}
.opinion-wrap textarea {
width: 100%;
min-height: 100px;
resize: none;
border: 1px solid #d7e0ea;
border-radius: 4px;
padding: 10px 12px;
color: #0f172a;
font-size: 13px;
line-height: 1.55;
transition: border-color 160ms ease, box-shadow 160ms ease;
}
.opinion-wrap textarea::placeholder {
color: #94a3b8;
}
.opinion-wrap textarea:focus {
border-color: #10b981;
box-shadow: 0 0 0 3px rgba(16, 185, 129, .12);
outline: none;
}
/* ── Side Cards ── */
.side-card {
border-radius: 4px;
background: #fff;
border: 1px solid #edf2f7;
box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
overflow: hidden;
transition: box-shadow 200ms ease;
}
.side-card:hover { box-shadow: 0 4px 16px rgba(15, 23, 42, .06); }
.side-card .card-header {
padding: 12px 16px;
}
.side-card.compact {
border-radius: 4px;
}
/* ── Risk Card ── */
.risk-total {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
padding: 5px 12px;
border-radius: 3px;
font-size: 11px;
}
.risk-total span { font-weight: 750; }
.risk-total.high {
background: #fee2e2;
color: #dc2626;
}
.risk-total.high strong { font-size: 16px; font-weight: 900; }
.risk-items {
padding: 4px 14px 14px;
display: grid;
gap: 8px;
}
.risk-row {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 4px;
border: 1px solid #f1f5f9;
transition: all 160ms ease;
}
.risk-row:hover { border-color: #e2e8f0; background: #fafbfd; }
.risk-icon {
width: 30px; height: 30px;
display: grid; place-items: center;
border-radius: 4px;
font-size: 16px;
flex-shrink: 0;
}
.risk-row.high .risk-icon { background: #fef2f2; color: #ef4444; }
.risk-row.medium .risk-icon { background: #fff7ed; color: #f97316; }
.risk-text {
flex: 1;
color: #334155;
font-size: 13px;
line-height: 1.4;
}
.risk-level {
padding: 3px 8px;
border-radius: 3px;
font-size: 12px;
font-weight: 800;
flex-shrink: 0;
}
.risk-level.high { background: #fef2f2; color: #ef4444; }
.risk-level.medium { background: #fff7ed; color: #f97316; }
/* ── Side Dual ── */
.side-dual {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.reminder-list {
margin: 0;
padding: 10px 16px 14px;
display: grid;
gap: 8px;
list-style: none;
}
.reminder-list li {
display: flex;
align-items: flex-start;
gap: 8px;
color: #334155;
font-size: 12px;
line-height: 1.5;
}
.reminder-list li i {
margin-top: 2px;
color: #f59e0b;
font-size: 14px;
flex-shrink: 0;
}
.info-list {
display: grid;
grid-template-columns: auto 1fr;
gap: 6px 14px;
margin: 0;
padding: 10px 16px 14px;
font-size: 13px;
}
.info-list dt { color: #94a3b8; font-weight: 700; }
.info-list dd { margin: 0; color: #0f172a; font-weight: 850; }
/* ── Modal Footer ── */
.modal-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 16px 28px;
background: #fff;
border-top: 1px solid #e8eef6;
}
.footer-right {
display: flex;
gap: 10px;
}
.action-btn {
height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 0 20px;
border-radius: 4px;
font-size: 14px;
font-weight: 800;
transition: all 180ms ease;
border: 1px solid transparent;
}
.action-btn.back {
background: #f8fafc;
border-color: #e2e8f0;
color: #475569;
}
.action-btn.back:hover {
background: #f1f5f9;
border-color: #cbd5e1;
color: #0f172a;
}
.action-btn.supplement {
background: #fff;
border-color: #fed7aa;
color: #ea580c;
}
.action-btn.supplement:hover {
background: #fff7ed;
box-shadow: 0 4px 12px rgba(234, 88, 12, .12);
}
.action-btn.reject {
background: #fff;
border-color: #fecaca;
color: #ef4444;
}
.action-btn.reject:hover {
background: #fef2f2;
box-shadow: 0 4px 12px rgba(239, 68, 68, .12);
}
.action-btn.approve {
background: #059669;
color: #fff;
box-shadow: 0 4px 16px rgba(5, 150, 105, .25);
}
.action-btn.approve:hover {
background: #047857;
box-shadow: 0 8px 24px rgba(5, 150, 105, .30);
}
.action-btn:active { transform: scale(.97); }
/* ── Modal Transitions ── */
.detail-modal-enter-active { transition: opacity 260ms ease; }
.detail-modal-enter-active .detail-modal { transition: transform 320ms cubic-bezier(.2, .8, .2, 1), opacity 280ms ease; }
.detail-modal-leave-active { transition: opacity 200ms ease; }
.detail-modal-leave-active .detail-modal { transition: transform 220ms ease, opacity 200ms ease; }
.detail-modal-enter-from { opacity: 0; }
.detail-modal-enter-from .detail-modal { transform: translateY(16px); opacity: 0; }
.detail-modal-leave-to { opacity: 0; }
.detail-modal-leave-to .detail-modal { transform: translateY(8px); opacity: 0; }
/* ── Responsive ── */
@media (max-width: 1320px) {
.list-toolbar, .list-foot { grid-template-columns: 1fr; }
.detail-hero {
grid-template-columns: minmax(0, 1.8fr) repeat(4, minmax(0, 1fr));
}
.hero-summary-panel {
grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
}
.detail-expense-table {
overflow-x: auto;
}
.detail-expense-table table {
min-width: 980px;
}
.detail-modal {
width: calc(100vw - 40px);
height: calc(100vh - 40px);
}
.body-grid { grid-template-columns: 1fr; }
.metrics-strip { grid-template-columns: repeat(2, 1fr); }
.side-dual { grid-template-columns: 1fr; }
}
@media (max-width: 760px) {
.approval-list { padding: 16px; }
.status-tabs { gap: 18px; overflow-x: auto; }
.filter-set { width: 100%; }
.filter-btn, .page-size { width: 100%; }
.list-foot { justify-items: stretch; }
.pager, .page-size { justify-self: stretch; }
.detail-hero {
grid-template-columns: 1fr 1fr;
gap: 12px;
padding: 16px;
}
.applicant-card,
.hero-summary-panel,
.progress-line {
grid-column: 1 / -1;
}
.hero-summary-panel {
grid-template-columns: 1fr;
}
.hero-summary-item {
padding: 14px 0;
}
.detail-card {
padding: 14px 16px;
}
.detail-card-head {
flex-direction: column;
align-items: stretch;
}
.detail-total {
align-self: flex-start;
}
.detail-expense-table table {
min-width: 980px;
}
.detail-modal {
width: 100vw;
height: 100vh;
max-width: 100vw;
max-height: 100vh;
border-radius: 0;
}
.modal-header { padding: 16px 18px; flex-wrap: wrap; }
.header-right { width: 100%; justify-content: flex-end; }
.metrics-strip { grid-template-columns: 1fr 1fr; }
.summary-grid { grid-template-columns: 1fr; }
.progress-track { overflow-x: auto; padding-bottom: 8px; }
.node-label strong { font-size: 11px; }
.modal-footer { flex-direction: column; padding: 14px 18px; }
.footer-right { width: 100%; }
.action-btn { flex: 1; }
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,465 @@
.review-preview-modal {
width: min(980px, calc(100vw - 40px));
max-height: min(92vh, calc(100vh - 32px));
display: grid;
grid-template-rows: auto minmax(0, 1fr);
overflow: hidden;
border-radius: 24px;
background:
radial-gradient(circle at top right, rgba(16, 185, 129, 0.08), transparent 28%),
linear-gradient(180deg, #fbfdff 0%, #f6f9fc 100%);
box-shadow:
0 24px 80px rgba(15, 23, 42, 0.22),
0 2px 12px rgba(15, 23, 42, 0.08);
border: 1px solid #e7eef6;
}
.review-preview-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
padding: 22px 24px 18px;
border-bottom: 1px solid #eef2f7;
}
.review-preview-head h3 {
margin-top: 12px;
color: #0f172a;
font-size: 22px;
font-weight: 900;
line-height: 1.35;
}
.review-preview-body {
min-height: 0;
display: grid;
place-items: center;
padding: 18px;
background: rgba(248, 250, 252, 0.88);
}
.review-preview-body.image img {
max-width: 100%;
max-height: calc(92vh - 170px);
display: block;
border-radius: 20px;
object-fit: contain;
box-shadow: 0 16px 34px rgba(148, 163, 184, 0.26);
}
.review-preview-body.pdf iframe {
width: 100%;
height: min(78vh, 820px);
border: 0;
border-radius: 18px;
background: #fff;
}
.welcome-quick-actions {
margin-top: 14px;
padding-top: 12px;
border-top: 1px dashed rgba(203, 213, 225, 0.82);
}
.welcome-quick-actions-title {
margin: 0 0 22px;
color: #64748b;
font-size: 12px;
font-weight: 800;
}
.welcome-quick-action-grid {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.welcome-quick-action-btn {
min-height: 30px;
display: inline-flex;
align-items: center;
gap: 5px;
padding: 0 11px;
border: 1px solid rgba(191, 219, 254, 0.92);
border-radius: 999px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(239, 246, 255, 0.94) 100%);
color: #1d4ed8;
font-size: var(--wb-fs-chip);
font-weight: 700;
line-height: 1.2;
box-shadow: 0 4px 10px rgba(59, 130, 246, 0.07);
transition: transform 0.16s ease, box-shadow 0.16s ease, border-color 0.16s ease;
}
.welcome-quick-action-btn i {
font-size: 13px;
color: #2563eb;
}
.welcome-quick-action-btn:hover:not(:disabled) {
transform: translateY(-1px);
border-color: rgba(59, 130, 246, 0.34);
box-shadow: 0 7px 14px rgba(59, 130, 246, 0.12);
}
.welcome-quick-action-btn:disabled {
opacity: 0.48;
cursor: not-allowed;
}
.welcome-grid {
display: grid;
gap: 12px;
}
.welcome-card {
padding: 14px;
border-radius: 18px;
background: #f8fafc;
}
.welcome-card i {
color: #10b981;
font-size: var(--wb-fs-welcome);
}
.welcome-card strong {
display: block;
margin-top: 10px;
}
.assistant-modal-enter-active,
.assistant-modal-leave-active {
transition: opacity 220ms ease;
}
.assistant-modal-enter-active .assistant-modal,
.assistant-modal-leave-active .assistant-modal {
transition: transform 260ms ease, opacity 220ms ease;
}
.assistant-modal-enter-from,
.assistant-modal-leave-to {
opacity: 0;
}
.assistant-modal-enter-from .assistant-modal,
.assistant-modal-leave-to .assistant-modal {
transform: translateY(10px) scale(0.985);
opacity: 0;
}
.insight-switch-enter-active,
.insight-switch-leave-active {
transition: opacity 180ms ease, transform 180ms ease;
}
.insight-switch-enter-from,
.insight-switch-leave-to {
opacity: 0;
transform: translateY(8px);
}
/* 笔记本 / 中等屏:工作台正文字号整体下调一档 */
@media (max-width: 1680px) {
.assistant-modal-stage {
--wb-fs-title: 19px;
--wb-fs-desc: 12px;
--wb-fs-badge: 11px;
--wb-fs-bubble: 12px;
--wb-fs-bubble-meta: 11px;
--wb-fs-bubble-time: 11px;
--wb-fs-chip: 11px;
--wb-fs-composer: 13px;
--wb-fs-tool-icon: 16px;
--wb-fs-md-h1: 12px;
--wb-fs-md-h2: 12px;
--wb-fs-md-h3: 12px;
--wb-fs-insight-title: 17px;
--wb-fs-insight-num: 17px;
--wb-fs-insight-body: 11px;
--wb-fs-insight-h4: 14px;
--wb-fs-metric: 12px;
--wb-fs-metric-strong: 12px;
--wb-fs-welcome: 16px;
}
.assistant-modal-stage .message-answer-markdown table {
font-size: 12px;
}
.assistant-modal-stage .intent-pill {
font-size: var(--wb-fs-chip);
}
}
@media (max-width: 1440px) {
.assistant-modal-stage {
--wb-fs-title: 18px;
--wb-fs-bubble: 12px;
--wb-fs-bubble-meta: 11px;
--wb-fs-composer: 12px;
--wb-fs-insight-title: 16px;
--wb-fs-insight-num: 16px;
--wb-fs-md-h1: 12px;
--wb-fs-md-h2: 12px;
--wb-fs-md-h3: 12px;
--wb-fs-insight-h4: 13px;
--wb-fs-welcome: 16px;
}
}
/* 大屏:左右分栏;右侧详情区宽度随视口收缩 */
@media (min-width: 1441px) and (max-width: 1680px) {
.insight-panel-shell {
width: clamp(280px, 26vw, 360px);
}
}
/* 笔记本常见宽度:改为上下布局,对话区占满宽度,避免侧栏挤占 */
@media (max-width: 1440px) {
.assistant-layout {
flex-direction: column;
}
.dialog-panel {
flex: 1 1 auto;
min-height: 0;
}
.insight-panel-shell {
width: 100%;
flex: 0 0 auto;
max-height: min(38dvh, 400px);
transition:
max-height 320ms cubic-bezier(0.22, 1, 0.36, 1),
opacity 240ms cubic-bezier(0.22, 1, 0.36, 1),
transform 280ms cubic-bezier(0.22, 1, 0.36, 1);
}
.insight-panel-shell.collapsed {
max-height: 0;
}
.insight-panel {
width: 100%;
min-height: min(280px, 32dvh);
}
.insight-panel-shell.collapsed .insight-panel {
transform: translateY(-12px);
}
.review-side-grid.compact {
grid-template-columns: 1fr;
}
}
/* 矮屏笔记本(如 1366×768压缩顶栏与间距把高度留给对话列表 */
@media (max-height: 820px) {
.assistant-modal-stage {
--wb-fs-title: 17px;
--wb-fs-bubble: 12px;
--wb-fs-composer: 12px;
--wb-fs-insight-title: 15px;
--wb-fs-insight-num: 15px;
}
.assistant-header {
padding-top: 12px;
padding-bottom: 10px;
}
.assistant-header-actions {
top: 12px;
right: 12px;
}
.assistant-layout {
padding: 10px;
gap: 10px;
}
.dialog-toolbar {
padding: 12px 14px 10px;
}
.message-list {
padding: 12px;
gap: 10px;
}
.composer-shell-body {
padding: 4px 10px;
}
}
@media (max-width: 1280px) {
.insight-panel-shell:not(.collapsed) {
max-height: min(34dvh, 360px);
}
}
@media (max-width: 760px) {
.assistant-overlay {
--assistant-viewport-inset: 10px;
}
.assistant-modal,
.assistant-modal-stage {
border-radius: 18px;
}
.assistant-header {
padding: 18px 18px 16px;
align-items: flex-start;
flex-direction: column;
}
.assistant-header-actions {
top: 18px;
right: 18px;
gap: 10px;
width: auto;
justify-content: space-between;
}
.assistant-toggle-btn,
.session-trash-btn,
.assistant-close-btn,
.close-btn {
width: 40px;
height: 40px;
border-radius: 14px;
font-size: 16px;
}
.flow-step-card header {
align-items: flex-start;
}
.assistant-layout {
padding: 14px;
}
.composer-row {
gap: 8px;
--composer-control-size: 40px;
}
.composer-shell textarea {
min-height: 32px;
}
.travel-calculator-form {
grid-template-columns: 1fr;
}
.dialog-toolbar {
padding: 16px 16px 12px;
}
.shortcut-chip {
width: 100%;
justify-content: center;
}
.message-list {
padding: 16px;
}
.message-row,
.message-row.user {
grid-template-columns: 34px minmax(0, 1fr);
}
.message-row.user .message-avatar {
order: 0;
}
.message-row.user .message-bubble {
order: 0;
justify-self: stretch;
}
.message-suggested-actions {
grid-template-columns: 1fr;
}
.composer {
padding: 0 16px 16px;
}
.composer-files-head,
.review-insight-title-row,
.review-document-stage-head,
.review-document-switch-head {
align-items: flex-start;
flex-direction: column;
}
.composer-files-actions,
.review-document-nav {
width: 100%;
justify-content: space-between;
}
.metric-grid {
grid-template-columns: 1fr;
}
.review-side-grid,
.review-side-category-grid,
.review-document-edit-grid {
grid-template-columns: 1fr;
}
.review-pending-item {
grid-template-columns: 42px minmax(0, 1fr);
}
.review-pending-status {
grid-column: 2;
justify-self: start;
}
.review-footer-btn-row {
flex-direction: column;
}
.review-footer-btn {
width: 100%;
}
.review-slot-grid,
.review-doc-field-grid,
.review-mini-grid {
grid-template-columns: 1fr;
}
.review-document-plain,
.review-document-bubble {
grid-template-columns: 1fr;
}
.review-preview-modal {
width: calc(100vw - 24px);
}
.review-confirm-actions {
padding: 0 18px 18px;
justify-content: stretch;
}
.review-upload-decision-actions {
width: 100%;
}
.primary-dialog-btn,
.secondary-dialog-btn,
.danger-dialog-btn {
width: 100%;
}
}

View File

@@ -0,0 +1,945 @@
.validation-pill.pending {
background: #fff7ed;
border-color: #fed7aa;
color: #c2410c;
}
.validation-pill.warning {
background: #fef2f2;
border-color: #fecaca;
color: #b91c1c;
}
.validation-summary {
margin: 0;
color: #475569;
font-size: 13px;
line-height: 1.6;
}
.validation-sections {
display: grid;
gap: 18px;
margin-top: 16px;
}
.validation-section {
display: grid;
gap: 10px;
padding-top: 14px;
border-top: 1px solid #e5e7eb;
}
.validation-section:first-child {
padding-top: 0;
border-top: none;
}
.validation-section-title {
display: flex;
align-items: center;
gap: 8px;
margin: 0;
color: #0f172a;
font-size: 13px;
font-weight: 800;
line-height: 1.4;
}
.validation-section-title::before {
content: '';
width: 6px;
height: 6px;
border-radius: 999px;
background: #10b981;
box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.12);
}
.validation-section--risk .validation-section-title {
color: #b91c1c;
}
.validation-section--risk .validation-section-title::before {
background: #ef4444;
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
}
.validation-list {
display: grid;
gap: 6px;
margin: 0;
padding: 0 0 0 18px;
color: #0f766e;
font-size: 13px;
line-height: 1.55;
}
.validation-list li::marker {
color: #14b8a6;
}
.validation-section--risk .risk-advice-list {
display: grid;
gap: 10px;
margin-top: 0;
}
.validation-section--risk .risk-advice-card-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.validation-section--risk .risk-advice-card-head span {
min-height: 20px;
display: inline-flex;
align-items: center;
padding: 0 8px;
border-radius: 999px;
background: #fef2f2;
color: #b91c1c;
font-size: 10px;
font-weight: 800;
white-space: nowrap;
}
.validation-section--risk .risk-advice-card.medium .risk-advice-card-head span {
background: #fff7ed;
color: #c2410c;
}
.validation-section--risk .risk-advice-card.low .risk-advice-card-head span {
background: #eff6ff;
color: #2563eb;
}
.validation-section--risk .risk-advice-card-head strong {
min-width: 0;
color: #0f172a;
font-size: 12px;
line-height: 1.4;
text-align: right;
}
.validation-section--risk .risk-advice-point {
margin: 0;
color: #334155;
font-size: 13px;
line-height: 1.5;
}
.validation-section--risk .risk-advice-meta {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 8px;
}
.validation-section--risk .risk-advice-meta > div {
min-width: 0;
display: grid;
gap: 4px;
padding: 8px 9px;
border-radius: 8px;
background: #f8fafc;
}
.validation-section--risk .risk-advice-meta span {
color: #64748b;
font-size: 10px;
font-weight: 800;
}
.risk-advice-card.medium {
border-color: #fed7aa;
background: #fffaf2;
}
.risk-advice-card.low {
border-color: #bfdbfe;
background: #f8fbff;
}
.risk-advice-card-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.risk-advice-card-head span {
min-height: 24px;
display: inline-flex;
align-items: center;
padding: 0 9px;
border-radius: 999px;
background: #fee2e2;
color: #b91c1c;
font-size: 11px;
font-weight: 850;
white-space: nowrap;
}
.risk-advice-card.medium .risk-advice-card-head span {
background: #ffedd5;
color: #c2410c;
}
.risk-advice-card.low .risk-advice-card-head span {
background: #dbeafe;
color: #2563eb;
}
.risk-advice-card-head strong {
min-width: 0;
color: #0f172a;
font-size: 13px;
line-height: 1.45;
text-align: right;
}
.risk-advice-point {
margin: 0;
color: #7f1d1d;
font-size: 14px;
font-weight: 800;
line-height: 1.5;
}
.risk-advice-card.medium .risk-advice-point {
color: #9a3412;
}
.risk-advice-meta {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 12px;
}
.risk-advice-meta > div {
min-width: 0;
display: grid;
gap: 6px;
padding: 10px;
border-radius: 8px;
background: rgba(255, 255, 255, .72);
}
.risk-advice-meta span {
color: #64748b;
font-size: 11px;
font-weight: 850;
}
.risk-advice-meta ul {
display: grid;
gap: 4px;
margin: 0;
padding-left: 16px;
color: #334155;
font-size: 12px;
line-height: 1.55;
}
.risk-advice-meta p {
margin: 0;
color: #334155;
font-size: 12px;
line-height: 1.55;
}
.detail-overlay {
position: fixed;
inset: 0;
z-index: 9999;
display: grid;
place-items: center;
background: rgba(15, 23, 42, .45);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
}
.detail-modal {
position: relative;
width: calc(100vw - 80px);
max-width: 1440px;
height: calc(100vh - 64px);
max-height: 960px;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
border-radius: 28px;
background: #f8fafc;
box-shadow:
0 0 0 1px rgba(15, 23, 42, .08),
0 20px 60px rgba(15, 23, 42, .18),
0 4px 16px rgba(15, 23, 42, .06);
overflow: hidden;
}
.ai-entry-modal {
max-width: 1320px;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding: 24px 28px;
background: linear-gradient(135deg, #fff 0%, #f9fbff 100%);
border-bottom: 1px solid #e8eef6;
}
.header-left {
display: flex;
align-items: center;
gap: 16px;
}
.req-badge {
padding: 6px 14px;
border-radius: 999px;
background: #eff6ff;
border: 1px solid rgba(29, 78, 216, .16);
color: #1d4ed8;
font-size: 13px;
font-weight: 850;
letter-spacing: .02em;
}
.header-title-group h2 {
color: #0f172a;
font-size: 20px;
font-weight: 900;
letter-spacing: -.01em;
}
.header-title-group p {
margin-top: 3px;
color: #64748b;
font-size: 13px;
}
.header-right {
display: flex;
align-items: center;
gap: 10px;
}
.close-btn {
width: 36px;
height: 36px;
display: grid;
place-items: center;
border: 1px solid #e2e8f0;
border-radius: 999px;
background: #fff;
color: #64748b;
font-size: 18px;
transition: all 160ms ease;
}
.close-btn:hover {
border-color: #cbd5e1;
background: #f1f5f9;
color: #0f172a;
}
.modal-body {
min-height: 0;
padding: 20px 28px;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: #cbd5e1 transparent;
}
.ai-entry-grid {
min-height: 100%;
display: grid;
grid-template-columns: minmax(0, 1.2fr) 360px;
gap: 20px;
}
.ai-chat-card,
.ai-preview-card {
min-height: 0;
border-radius: 22px;
background: #fff;
border: 1px solid #edf2f7;
box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
}
.ai-chat-card {
display: grid;
grid-template-rows: minmax(0, 1fr) auto;
overflow: hidden;
}
.ai-chat-scroll {
min-height: 0;
display: grid;
align-content: start;
gap: 12px;
padding: 18px;
overflow: auto;
background:
linear-gradient(180deg, rgba(240, 253, 244, .5) 0%, rgba(255, 255, 255, 0) 140px),
#fff;
}
.ai-chat-bubble {
display: grid;
grid-template-columns: 34px minmax(0, 1fr);
gap: 10px;
}
.ai-chat-bubble.user {
grid-template-columns: minmax(0, 1fr) 34px;
}
.ai-chat-bubble.user .ai-chat-avatar {
order: 2;
background: #dbeafe;
color: #2563eb;
}
.ai-chat-bubble.user .ai-chat-content {
order: 1;
justify-self: end;
background: #eff6ff;
}
.ai-chat-avatar {
width: 34px;
height: 34px;
display: grid;
place-items: center;
border-radius: 999px;
background: #ecfdf5;
color: #059669;
font-size: 18px;
}
.ai-chat-content {
max-width: min(100%, 640px);
padding: 12px 14px;
border-radius: 18px;
background: #f8fafc;
border: 1px solid #edf2f7;
}
.ai-chat-content header {
margin-bottom: 6px;
}
.ai-chat-content strong {
color: #0f172a;
font-size: 13px;
font-weight: 850;
}
.ai-chat-content p {
color: #334155;
font-size: 13px;
line-height: 1.6;
}
.ai-composer {
display: grid;
gap: 12px;
padding: 14px 16px 16px;
border-top: 1px solid #edf2f7;
background: linear-gradient(180deg, #fff, #fbfdff);
}
.ai-file-input {
display: none;
}
.ai-composer-surface {
min-height: 78px;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
gap: 12px;
padding: 8px 8px 8px 14px;
border: 1px solid #cbd8e5;
border-radius: 22px;
background: linear-gradient(180deg, #fff, #fbfdff);
box-shadow: 0 1px 2px rgba(15, 23, 42, .04);
transition: border-color 160ms ease, box-shadow 160ms ease, background 160ms ease;
}
.ai-composer-surface:focus-within {
border-color: rgba(16, 185, 129, .58);
background: #fff;
box-shadow: 0 0 0 3px rgba(16, 185, 129, .11), 0 10px 24px rgba(15, 23, 42, .06);
}
.ai-composer textarea {
width: 100%;
min-height: 60px;
height: 60px;
resize: none;
border: 0;
border-radius: 0;
padding: 8px 0;
background: transparent;
color: #0f172a;
font-size: 14px;
line-height: 1.6;
}
.ai-composer textarea:focus {
outline: none;
}
.ai-composer-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 8px;
padding-bottom: 2px;
}
.ai-upload-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.ai-upload-chip {
display: inline-flex;
align-items: center;
gap: 6px;
min-height: 32px;
padding: 0 12px;
border-radius: 999px;
background: #eef6ff;
border: 1px solid #d7e8fb;
color: #334155;
font-size: 12px;
font-weight: 700;
}
.ai-upload-chip i {
color: #2563eb;
}
.ai-upload-btn,
.ai-send-btn {
width: 48px;
height: 48px;
display: grid;
place-items: center;
padding: 0;
border-radius: 12px;
font-size: 20px;
transition: background 160ms ease, transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease, color 160ms ease;
}
.ai-upload-btn {
border: 0;
background: #f1f5f9;
color: #475569;
box-shadow: none;
}
.ai-upload-btn:hover {
background: #e2e8f0;
color: #0f172a;
}
.ai-send-btn {
border: 0;
background: #10b981;
color: #fff;
box-shadow: 0 8px 18px rgba(16, 185, 129, .20);
}
.ai-send-btn:hover {
background: #0ea672;
box-shadow: 0 10px 22px rgba(16, 185, 129, .24);
}
.ai-upload-btn:active,
.ai-send-btn:active {
transform: scale(.96);
}
.ai-preview-card {
padding: 18px;
display: grid;
align-content: start;
gap: 16px;
}
.ai-preview-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.ai-preview-head h3 {
margin: 0;
color: #0f172a;
font-size: 16px;
font-weight: 850;
}
.ai-preview-head p {
margin-top: 4px;
color: #64748b;
font-size: 12px;
line-height: 1.5;
}
.ai-preview-fields {
display: grid;
gap: 10px;
}
.preview-field {
padding: 12px 14px;
border-radius: 18px;
background: #f8fafc;
border: 1px solid #edf2f7;
}
.preview-field.full {
min-height: 90px;
}
.preview-field span {
display: block;
color: #64748b;
font-size: 11px;
font-weight: 800;
text-transform: uppercase;
letter-spacing: .04em;
}
.preview-field strong {
display: block;
margin-top: 5px;
color: #0f172a;
font-size: 14px;
font-weight: 850;
line-height: 1.5;
}
.preview-field p {
margin-top: 4px;
color: #475569;
font-size: 12px;
line-height: 1.55;
}
.ai-preview-empty {
min-height: 280px;
display: grid;
place-items: center;
gap: 10px;
padding: 24px;
border: 1px dashed #cbd5e1;
border-radius: 20px;
color: #94a3b8;
text-align: center;
}
.ai-preview-empty i {
font-size: 32px;
color: #10b981;
}
.ai-preview-actions {
display: flex;
gap: 10px;
margin-top: 4px;
}
.ai-preview-secondary,
.ai-preview-primary {
height: 40px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
padding: 0 20px;
border-radius: 999px;
font-size: 13px;
font-weight: 800;
transition: all 180ms ease;
flex: 1;
}
.ai-preview-secondary {
border: 1px solid #fed7aa;
background: #fff7ed;
color: #c2410c;
}
.ai-preview-primary {
border: 1px solid #059669;
background: #059669;
color: #fff;
box-shadow: 0 8px 20px rgba(5, 150, 105, .18);
}
.ai-preview-secondary:hover {
background: #ffedd5;
}
.ai-preview-primary:hover {
background: #047857;
}
.ai-preview-secondary:disabled,
.ai-preview-primary:disabled,
.approve-action:disabled,
.return-action:disabled,
.ai-send-btn:disabled {
opacity: .45;
cursor: not-allowed;
box-shadow: none;
}
.detail-modal-enter-active { transition: opacity 260ms ease; }
.detail-modal-enter-active .detail-modal { transition: transform 320ms cubic-bezier(.2, .8, .2, 1), opacity 280ms ease; }
.detail-modal-leave-active { transition: opacity 200ms ease; }
.detail-modal-leave-active .detail-modal { transition: transform 220ms ease, opacity 200ms ease; }
.detail-modal-enter-from { opacity: 0; }
.detail-modal-enter-from .detail-modal { transform: translateY(16px); opacity: 0; }
.detail-modal-leave-to { opacity: 0; }
.detail-modal-leave-to .detail-modal { transform: translateY(8px); opacity: 0; }
@media (max-width: 1320px) {
.hero-banner-main {
grid-template-columns: 1fr;
gap: 16px;
min-height: 0;
}
.hero-fact-grid {
grid-template-columns: repeat(5, minmax(132px, 1fr));
overflow-x: auto;
}
.hero-fact {
min-width: 132px;
}
.detail-expense-table {
overflow-x: auto;
}
.detail-expense-table table {
min-width: 1080px;
}
.ai-entry-grid {
grid-template-columns: 1fr;
}
.detail-modal {
width: calc(100vw - 40px);
height: calc(100vh - 40px);
}
}
@media (max-width: 760px) {
.detail-hero { gap: 10px; padding: 16px; }
.progress-card { padding: 16px; }
.applicant-card {
grid-template-columns: 60px minmax(0, 1fr);
gap: 12px;
}
.portrait {
width: 60px;
height: 60px;
}
.applicant-copy {
gap: 8px;
}
.applicant-card h2 {
font-size: 16px;
}
.applicant-profile-meta {
display: grid;
gap: 10px;
}
.applicant-profile-meta__role {
display: grid;
gap: 6px;
}
.applicant-profile-meta__role .applicant-meta-item + .applicant-meta-item {
margin-left: 0;
}
.applicant-profile-meta__role .applicant-meta-item + .applicant-meta-item::before {
content: none;
}
.hero-fact-grid {
grid-template-columns: 1fr 1fr;
gap: 0;
overflow: hidden;
border-top: 1px solid #edf2f7;
}
.hero-fact {
min-width: 0;
min-height: 78px;
padding: 14px 12px 12px;
border-left: 0;
border-bottom: 1px solid #edf2f7;
}
.hero-fact:nth-child(2n) {
border-left: 1px solid #edf2f7;
}
.hero-fact:last-child:nth-child(odd) {
grid-column: 1 / -1;
}
.hero-fact:nth-last-child(-n + 2) {
border-bottom: 0;
}
.hero-fact strong {
white-space: normal;
}
.detail-card {
padding: 14px 16px;
}
.detail-card-head {
flex-direction: column;
align-items: stretch;
}
.detail-card-actions {
width: 100%;
justify-content: flex-start;
}
.smart-entry-btn { align-self: flex-start; }
.detail-expense-table table {
min-width: 1080px;
}
.detail-actions {
flex-direction: column;
}
.approval-action-group {
width: 100%;
}
.validation-head {
flex-direction: column;
}
.detail-modal {
width: 100vw;
height: 100vh;
max-width: 100vw;
max-height: 100vh;
border-radius: 0;
}
.modal-header { padding: 16px 18px; flex-wrap: wrap; }
.modal-body { padding: 16px 18px; }
.ai-composer-actions { flex-direction: column; align-items: stretch; }
.ai-preview-actions { flex-direction: column; }
.attachment-preview-mask {
padding: 14px;
}
.attachment-preview-card {
width: min(calc(100vw - 28px), 920px);
max-height: calc(100vh - 28px);
padding: 18px;
border-radius: 20px;
}
.attachment-preview-head {
flex-wrap: wrap;
}
.attachment-preview-toolbar {
order: 2;
width: 100%;
justify-content: flex-start;
}
.attachment-preview-body {
grid-template-columns: minmax(0, 1fr);
}
.attachment-insight-pane {
max-height: 320px;
}
.risk-advice-meta {
grid-template-columns: minmax(0, 1fr);
}
.attachment-preview-image,
.attachment-preview-frame {
min-height: 360px;
}
}
.validation-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 10px;
}
.validation-head h3 {
margin-bottom: 4px;
color: #0f172a;
font-size: 15px;
font-weight: 800;
}
.validation-head p {
margin: 0;
color: #64748b;
font-size: 12px;
line-height: 1.55;
}
.validation-pill {
min-height: 24px;
display: inline-flex;
align-items: center;
padding: 0 10px;
border-radius: 999px;
border: 1px solid transparent;
font-size: 11px;
font-weight: 800;
}
.validation-pill.ready {
background: #f0fdf4;
border-color: #bbf7d0;
color: #166534;
}

File diff suppressed because it is too large Load Diff