fresh-mint-view-dialog-demos.html 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Fresh Mint · 查看弹窗风格 Demo</title>
  7. <link rel="preconnect" href="https://fonts.googleapis.com" />
  8. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  9. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
  10. <style>
  11. :root {
  12. --primary: #10b981;
  13. --primary-dark: #059669;
  14. --primary-bg: #ecfdf5;
  15. --text: #1e293b;
  16. --text-muted: #64748b;
  17. --border: #d9e8e2;
  18. --surface: #ffffff;
  19. --table-head: #f8fafc;
  20. --shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
  21. --shadow-lg: 0 8px 24px rgba(15, 23, 42, 0.08);
  22. --radius: 10px;
  23. --warn: #d97706;
  24. --warn-bg: #fffbeb;
  25. --danger: #dc2626;
  26. }
  27. * { box-sizing: border-box; }
  28. body {
  29. margin: 0;
  30. min-height: 100vh;
  31. font-family: Inter, -apple-system, sans-serif;
  32. font-size: 14px;
  33. line-height: 1.5;
  34. color: var(--text);
  35. background: #f8fafc;
  36. }
  37. /* ── 展示页骨架 ── */
  38. .demo-page { max-width: 1200px; margin: 0 auto; padding: 32px 24px 80px; }
  39. .demo-head { margin-bottom: 32px; }
  40. .demo-head h1 {
  41. margin: 0 0 8px;
  42. font-size: 24px;
  43. font-weight: 700;
  44. letter-spacing: -0.02em;
  45. }
  46. .demo-head h1 span { color: var(--primary); }
  47. .demo-head p { margin: 0; color: var(--text-muted); max-width: 640px; }
  48. .demo-grid {
  49. display: grid;
  50. grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  51. gap: 20px;
  52. }
  53. .demo-card {
  54. background: var(--surface);
  55. border: 1px solid var(--border);
  56. border-radius: var(--radius);
  57. overflow: hidden;
  58. box-shadow: var(--shadow);
  59. transition: box-shadow 0.2s, transform 0.2s;
  60. }
  61. .demo-card:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); }
  62. .demo-card-preview {
  63. height: 200px;
  64. position: relative;
  65. overflow: hidden;
  66. background: linear-gradient(135deg, var(--primary-bg) 0%, #fff 60%);
  67. border-bottom: 1px solid var(--border);
  68. }
  69. .demo-card-preview::after {
  70. content: "";
  71. position: absolute;
  72. inset: 0;
  73. background: linear-gradient(to top, rgba(255,255,255,0.9) 0%, transparent 50%);
  74. }
  75. .demo-card-body { padding: 16px 18px 18px; }
  76. .demo-card-body h2 { margin: 0 0 6px; font-size: 16px; font-weight: 600; }
  77. .demo-card-body p { margin: 0 0 14px; font-size: 13px; color: var(--text-muted); line-height: 1.5; }
  78. .demo-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 14px; }
  79. .demo-tag {
  80. font-size: 11px;
  81. font-weight: 600;
  82. padding: 2px 8px;
  83. border-radius: 6px;
  84. background: var(--primary-bg);
  85. color: var(--primary-dark);
  86. }
  87. .demo-tag.muted { background: var(--table-head); color: var(--text-muted); }
  88. .btn {
  89. display: inline-flex;
  90. align-items: center;
  91. gap: 6px;
  92. height: 36px;
  93. padding: 0 14px;
  94. border-radius: 8px;
  95. font-size: 13px;
  96. font-weight: 600;
  97. font-family: inherit;
  98. cursor: pointer;
  99. border: 1px solid var(--border);
  100. background: var(--surface);
  101. color: var(--text);
  102. transition: background 0.15s;
  103. }
  104. .btn:hover { background: var(--table-head); }
  105. .btn-primary {
  106. background: var(--primary);
  107. border-color: var(--primary);
  108. color: #fff;
  109. }
  110. .btn-primary:hover { background: var(--primary-dark); }
  111. .btn-ghost { background: transparent; }
  112. .ic { width: 16px; height: 16px; flex-shrink: 0; }
  113. /* 缩略预览(各风格 mini 版) */
  114. .mini-dialog {
  115. position: absolute;
  116. left: 50%;
  117. top: 50%;
  118. transform: translate(-50%, -42%);
  119. width: 88%;
  120. max-width: 280px;
  121. background: #fff;
  122. border-radius: 8px;
  123. box-shadow: 0 4px 20px rgba(0,0,0,0.12);
  124. overflow: hidden;
  125. pointer-events: none;
  126. }
  127. .mini-hero { height: 48px; background: linear-gradient(135deg, var(--primary-bg), #fff); border-bottom: 1px solid var(--border); }
  128. .mini-body { padding: 8px 10px; }
  129. .mini-line { height: 6px; background: #e2e8f0; border-radius: 3px; margin-bottom: 6px; }
  130. .mini-line.short { width: 60%; }
  131. .mini-line.green { background: var(--primary); opacity: 0.3; width: 40%; }
  132. /* ── 弹窗通用 ── */
  133. .backdrop {
  134. position: fixed;
  135. inset: 0;
  136. background: rgba(15, 23, 42, 0.45);
  137. display: none;
  138. align-items: center;
  139. justify-content: center;
  140. padding: 24px;
  141. z-index: 1000;
  142. /* 无背景模糊 — 对齐规范 */
  143. backdrop-filter: none;
  144. }
  145. .backdrop.open { display: flex; }
  146. .dialog {
  147. background: var(--surface);
  148. border-radius: var(--radius);
  149. box-shadow: var(--shadow-lg);
  150. width: 100%;
  151. display: flex;
  152. flex-direction: column;
  153. overflow: hidden;
  154. animation: dlgIn 0.22s ease;
  155. }
  156. @keyframes dlgIn {
  157. from { opacity: 0; transform: scale(0.96) translateY(8px); }
  158. to { opacity: 1; transform: none; }
  159. }
  160. .dialog-scroll { overflow-y: auto; flex: 1; }
  161. .dialog-foot {
  162. padding: 12px 22px;
  163. border-top: 1px solid var(--border);
  164. display: flex;
  165. justify-content: flex-end;
  166. gap: 8px;
  167. flex-shrink: 0;
  168. background: var(--table-head);
  169. }
  170. /* 通用 tag */
  171. .tag {
  172. display: inline-flex;
  173. align-items: center;
  174. padding: 2px 10px;
  175. border-radius: 6px;
  176. font-size: 12px;
  177. font-weight: 600;
  178. background: var(--primary-bg);
  179. color: var(--primary-dark);
  180. border: 1px solid rgba(16, 185, 129, 0.25);
  181. }
  182. .tag.warn { background: var(--warn-bg); color: var(--warn); border-color: rgba(217,119,6,0.25); }
  183. .tag.danger { background: #fef2f2; color: var(--danger); border-color: rgba(220,38,38,0.2); }
  184. .tag.muted { background: var(--table-head); color: var(--text-muted); border-color: var(--border); }
  185. .tag.info { background: #eff6ff; color: #2563eb; border-color: rgba(37,99,235,0.2); }
  186. .money-val { color: var(--danger); font-weight: 600; }
  187. /* ═══════════════════════════════════════
  188. 风格 A · 经典 Hero + KV(当前 SystemViewDialog)
  189. ═══════════════════════════════════════ */
  190. .style-a { max-width: 720px; max-height: calc(100vh - 48px); }
  191. .style-a .view-hero {
  192. display: flex;
  193. gap: 16px;
  194. padding: 20px 22px;
  195. background: linear-gradient(135deg, var(--primary-bg) 0%, #fff 55%);
  196. border-bottom: 1px solid var(--border);
  197. align-items: center;
  198. }
  199. .style-a .view-hero-icon {
  200. width: 72px; height: 72px;
  201. border-radius: 12px;
  202. border: 1px solid rgba(16,185,129,0.2);
  203. background: rgba(16,185,129,0.08);
  204. color: var(--primary-dark);
  205. display: flex; align-items: center; justify-content: center;
  206. flex-shrink: 0;
  207. }
  208. .style-a .view-hero-main h2 { margin: 0 0 6px; font-size: 18px; font-weight: 700; }
  209. .style-a .view-hero-meta { margin: 0; font-size: 13px; color: var(--text-muted); }
  210. .style-a .view-section { padding: 18px 22px; border-bottom: 1px solid #ebeef5; }
  211. .style-a .view-section:last-child { border-bottom: none; }
  212. .style-a .view-section h3 {
  213. margin: 0 0 14px;
  214. padding-left: 10px;
  215. font-size: 14px;
  216. font-weight: 600;
  217. border-left: 3px solid var(--primary);
  218. line-height: 1;
  219. }
  220. .style-a .view-kv-grid {
  221. display: grid;
  222. grid-template-columns: repeat(2, 1fr);
  223. gap: 12px 20px;
  224. }
  225. .style-a .view-kv dt { margin: 0; font-size: 11px; color: var(--text-muted); }
  226. .style-a .view-kv dd { margin: 4px 0 0; font-size: 13px; font-weight: 600; }
  227. /* ═══════════════════════════════════════
  228. 风格 B · 数据看板(Bento 指标卡)
  229. ═══════════════════════════════════════ */
  230. .style-b { max-width: 920px; max-height: calc(100vh - 48px); }
  231. .style-b .view-hero {
  232. padding: 20px 22px;
  233. background: linear-gradient(135deg, var(--primary-bg) 0%, #fff 55%);
  234. border-bottom: 1px solid var(--border);
  235. }
  236. .style-b .view-hero-top {
  237. display: flex;
  238. align-items: flex-start;
  239. justify-content: space-between;
  240. gap: 16px;
  241. flex-wrap: wrap;
  242. }
  243. .style-b .view-hero-top h2 { margin: 0 0 8px; font-size: 20px; font-weight: 700; }
  244. .style-b .view-hero-tags { display: flex; flex-wrap: wrap; gap: 8px; }
  245. .style-b .view-stat-row {
  246. display: grid;
  247. grid-template-columns: repeat(4, 1fr);
  248. gap: 12px;
  249. margin-top: 16px;
  250. }
  251. @media (max-width: 720px) { .style-b .view-stat-row { grid-template-columns: repeat(2, 1fr); } }
  252. .style-b .stat-chip {
  253. background: #fff;
  254. border: 1px solid var(--border);
  255. border-radius: 8px;
  256. padding: 12px 14px;
  257. text-align: center;
  258. }
  259. .style-b .stat-chip .label { font-size: 11px; color: var(--text-muted); margin-bottom: 4px; }
  260. .style-b .stat-chip .value { font-size: 20px; font-weight: 700; color: var(--primary-dark); }
  261. .style-b .stat-chip.warn .value { color: var(--warn); }
  262. .style-b .view-section { padding: 18px 22px; border-bottom: 1px solid var(--border); }
  263. .style-b .view-section h3 {
  264. margin: 0 0 14px;
  265. font-size: 13px;
  266. font-weight: 700;
  267. color: var(--text-muted);
  268. letter-spacing: 0.04em;
  269. }
  270. .style-b .view-bento { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
  271. .style-b .view-card {
  272. border: 1px solid var(--border);
  273. border-radius: var(--radius);
  274. padding: 14px 16px;
  275. }
  276. .style-b .view-card h4 { margin: 0 0 6px; font-size: 12px; color: var(--text-muted); font-weight: 600; }
  277. .style-b .view-card p { margin: 0; font-size: 13px; line-height: 1.55; }
  278. .style-b .view-route-bar {
  279. height: 100px;
  280. border-radius: var(--radius);
  281. background: linear-gradient(90deg, #ecfdf5, #d1fae5, #a7f3d0);
  282. border: 1px solid var(--border);
  283. display: flex;
  284. align-items: center;
  285. justify-content: space-between;
  286. padding: 0 20px;
  287. }
  288. .style-b .route-pin { text-align: center; font-size: 12px; }
  289. .style-b .route-pin strong { display: block; font-size: 13px; margin-bottom: 2px; }
  290. .style-b .route-line { flex: 1; height: 3px; background: var(--primary); opacity: 0.4; margin: 0 10px; border-radius: 2px; }
  291. /* ═══════════════════════════════════════
  292. 风格 C · 左右分栏(Split Panel)
  293. ═══════════════════════════════════════ */
  294. .style-c { max-width: 960px; max-height: calc(100vh - 48px); }
  295. .style-c .view-split { display: flex; min-height: 480px; max-height: calc(100vh - 120px); }
  296. .style-c .view-split-left {
  297. flex: 0 0 380px;
  298. border-right: 1px solid var(--border);
  299. overflow-y: auto;
  300. }
  301. .style-c .view-split-right {
  302. flex: 1;
  303. overflow-y: auto;
  304. padding: 16px 20px;
  305. background: var(--table-head);
  306. }
  307. .style-c .view-hero {
  308. display: flex;
  309. gap: 14px;
  310. padding: 18px 20px;
  311. background: linear-gradient(135deg, var(--primary-bg), #fff);
  312. border-bottom: 1px solid var(--border);
  313. align-items: center;
  314. }
  315. .style-c .view-hero-icon {
  316. width: 56px; height: 56px;
  317. border-radius: 10px;
  318. background: rgba(16,185,129,0.1);
  319. color: var(--primary-dark);
  320. display: flex; align-items: center; justify-content: center;
  321. }
  322. .style-c .view-hero-main h2 { margin: 0 0 4px; font-size: 17px; font-weight: 700; }
  323. .style-c .view-hero-meta { margin: 0; font-size: 12px; color: var(--text-muted); }
  324. .style-c .view-section { padding: 16px 20px; border-bottom: 1px solid #ebeef5; }
  325. .style-c .view-section h3 {
  326. margin: 0 0 12px;
  327. padding-left: 10px;
  328. font-size: 13px;
  329. font-weight: 600;
  330. border-left: 3px solid var(--primary);
  331. line-height: 1;
  332. }
  333. .style-c .view-kv { margin-bottom: 10px; }
  334. .style-c .view-kv dt { font-size: 11px; color: var(--text-muted); margin-bottom: 2px; }
  335. .style-c .view-kv dd { margin: 0; font-size: 13px; font-weight: 600; }
  336. .style-c .right-panel-title {
  337. margin: 0 0 14px;
  338. font-size: 14px;
  339. font-weight: 600;
  340. }
  341. .style-c .view-timeline {
  342. position: relative;
  343. padding-left: 18px;
  344. border-left: 2px solid var(--border);
  345. margin-left: 6px;
  346. }
  347. .style-c .view-tl-item { position: relative; padding-bottom: 18px; font-size: 13px; }
  348. .style-c .view-tl-item:last-child { padding-bottom: 0; }
  349. .style-c .view-tl-item::before {
  350. content: "";
  351. position: absolute;
  352. left: -25px; top: 4px;
  353. width: 10px; height: 10px;
  354. border-radius: 50%;
  355. background: var(--primary);
  356. border: 2px solid #fff;
  357. box-shadow: 0 0 0 1px var(--primary);
  358. }
  359. .style-c .view-tl-item.muted::before { background: var(--border); box-shadow: none; }
  360. .style-c .view-tl-time { font-size: 12px; color: var(--text-muted); margin-bottom: 2px; }
  361. .style-c .view-tl-title { font-weight: 600; }
  362. .style-c .view-tl-desc { color: var(--text-muted); margin-top: 2px; font-size: 12px; }
  363. @media (max-width: 768px) {
  364. .style-c .view-split { flex-direction: column; max-height: none; }
  365. .style-c .view-split-left { flex: none; border-right: none; border-bottom: 1px solid var(--border); }
  366. }
  367. /* ═══════════════════════════════════════
  368. 风格 D · 紧凑清单(Compact List)
  369. ═══════════════════════════════════════ */
  370. .style-d { max-width: 560px; max-height: calc(100vh - 48px); }
  371. .style-d .view-compact-head {
  372. display: flex;
  373. align-items: center;
  374. justify-content: space-between;
  375. gap: 12px;
  376. padding: 16px 20px;
  377. border-bottom: 1px solid var(--border);
  378. }
  379. .style-d .view-compact-head h2 { margin: 0; font-size: 16px; font-weight: 700; }
  380. .style-d .view-compact-head .sub { font-size: 12px; color: var(--text-muted); margin-top: 2px; }
  381. .style-d .view-compact-body { padding: 4px 0; }
  382. .style-d .view-row {
  383. display: flex;
  384. align-items: baseline;
  385. justify-content: space-between;
  386. gap: 16px;
  387. padding: 11px 20px;
  388. border-bottom: 1px solid #f1f5f9;
  389. font-size: 13px;
  390. }
  391. .style-d .view-row:last-child { border-bottom: none; }
  392. .style-d .view-row dt { margin: 0; color: var(--text-muted); flex-shrink: 0; }
  393. .style-d .view-row dd { margin: 0; font-weight: 600; text-align: right; word-break: break-word; }
  394. .style-d .view-row-group {
  395. padding: 12px 20px 4px;
  396. font-size: 11px;
  397. font-weight: 700;
  398. color: var(--text-muted);
  399. letter-spacing: 0.06em;
  400. text-transform: uppercase;
  401. background: var(--table-head);
  402. border-bottom: 1px solid var(--border);
  403. border-top: 1px solid var(--border);
  404. }
  405. .style-d .view-row-group:first-child { border-top: none; }
  406. /* ═══════════════════════════════════════
  407. 风格 E · 票据档案(Document Archive)
  408. ═══════════════════════════════════════ */
  409. .style-e { max-width: 780px; max-height: calc(100vh - 48px); }
  410. .style-e .doc-header {
  411. position: relative;
  412. padding: 24px 28px 20px;
  413. background: #fff;
  414. border-bottom: 2px solid var(--primary);
  415. overflow: hidden;
  416. }
  417. .style-e .doc-watermark {
  418. position: absolute;
  419. right: -20px;
  420. top: 50%;
  421. transform: translateY(-50%) rotate(-12deg);
  422. font-size: 72px;
  423. font-weight: 800;
  424. color: rgba(16,185,129,0.06);
  425. letter-spacing: 0.1em;
  426. pointer-events: none;
  427. user-select: none;
  428. }
  429. .style-e .doc-header-top {
  430. display: flex;
  431. align-items: flex-start;
  432. justify-content: space-between;
  433. gap: 16px;
  434. position: relative;
  435. }
  436. .style-e .doc-header h2 {
  437. margin: 0 0 4px;
  438. font-size: 20px;
  439. font-weight: 700;
  440. letter-spacing: 0.02em;
  441. }
  442. .style-e .doc-no { font-size: 13px; color: var(--text-muted); font-family: ui-monospace, monospace; }
  443. .style-e .doc-stamp {
  444. width: 72px; height: 72px;
  445. border: 3px solid var(--primary);
  446. border-radius: 50%;
  447. display: flex;
  448. align-items: center;
  449. justify-content: center;
  450. font-size: 13px;
  451. font-weight: 700;
  452. color: var(--primary-dark);
  453. transform: rotate(-15deg);
  454. flex-shrink: 0;
  455. opacity: 0.85;
  456. }
  457. .style-e .doc-meta-bar {
  458. display: flex;
  459. flex-wrap: wrap;
  460. gap: 20px;
  461. margin-top: 14px;
  462. padding-top: 14px;
  463. border-top: 1px dashed var(--border);
  464. font-size: 12px;
  465. color: var(--text-muted);
  466. }
  467. .style-e .doc-meta-bar strong { color: var(--text); font-weight: 600; }
  468. .style-e .doc-body { padding: 20px 28px; }
  469. .style-e .doc-section { margin-bottom: 20px; }
  470. .style-e .doc-section:last-child { margin-bottom: 0; }
  471. .style-e .doc-section h3 {
  472. margin: 0 0 12px;
  473. font-size: 13px;
  474. font-weight: 600;
  475. color: var(--primary-dark);
  476. display: flex;
  477. align-items: center;
  478. gap: 8px;
  479. }
  480. .style-e .doc-section h3::before {
  481. content: "";
  482. width: 6px; height: 6px;
  483. border-radius: 50%;
  484. background: var(--primary);
  485. }
  486. .style-e .doc-kv-table {
  487. width: 100%;
  488. border-collapse: collapse;
  489. font-size: 13px;
  490. }
  491. .style-e .doc-kv-table td {
  492. padding: 8px 0;
  493. border-bottom: 1px dotted #e2e8f0;
  494. vertical-align: top;
  495. }
  496. .style-e .doc-kv-table td:first-child {
  497. width: 120px;
  498. color: var(--text-muted);
  499. font-weight: 500;
  500. }
  501. .style-e .doc-kv-table td:last-child { font-weight: 600; }
  502. .style-e .doc-kv-table tr:last-child td { border-bottom: none; }
  503. .style-e .doc-sign {
  504. margin-top: 24px;
  505. padding-top: 16px;
  506. border-top: 1px solid var(--border);
  507. display: flex;
  508. justify-content: space-between;
  509. font-size: 12px;
  510. color: var(--text-muted);
  511. }
  512. /* ═══════════════════════════════════════
  513. 风格 F · 标签页(Tabbed View)
  514. ═══════════════════════════════════════ */
  515. .style-f { max-width: 880px; max-height: calc(100vh - 48px); }
  516. .style-f .view-tab-head {
  517. padding: 16px 22px 0;
  518. border-bottom: 1px solid var(--border);
  519. background: linear-gradient(180deg, var(--primary-bg) 0%, #fff 100%);
  520. }
  521. .style-f .view-tab-head-top {
  522. display: flex;
  523. align-items: center;
  524. justify-content: space-between;
  525. gap: 12px;
  526. margin-bottom: 14px;
  527. }
  528. .style-f .view-tab-head h2 { margin: 0; font-size: 18px; font-weight: 700; }
  529. .style-f .view-tab-head .code { font-size: 12px; color: var(--text-muted); margin-top: 2px; }
  530. .style-f .view-tabs {
  531. display: flex;
  532. gap: 4px;
  533. overflow-x: auto;
  534. }
  535. .style-f .view-tab {
  536. padding: 8px 16px;
  537. font-size: 13px;
  538. font-weight: 600;
  539. color: var(--text-muted);
  540. background: transparent;
  541. border: none;
  542. border-bottom: 2px solid transparent;
  543. cursor: pointer;
  544. font-family: inherit;
  545. white-space: nowrap;
  546. margin-bottom: -1px;
  547. transition: color 0.15s, border-color 0.15s;
  548. }
  549. .style-f .view-tab:hover { color: var(--text); }
  550. .style-f .view-tab.active {
  551. color: var(--primary-dark);
  552. border-bottom-color: var(--primary);
  553. }
  554. .style-f .view-tab-panel { display: none; padding: 18px 22px; }
  555. .style-f .view-tab-panel.active { display: block; }
  556. .style-f .view-kv-grid {
  557. display: grid;
  558. grid-template-columns: repeat(2, 1fr);
  559. gap: 12px 24px;
  560. }
  561. .style-f .view-kv dt { font-size: 11px; color: var(--text-muted); margin-bottom: 2px; }
  562. .style-f .view-kv dd { margin: 0; font-size: 13px; font-weight: 600; }
  563. .style-f .view-subtable-wrap {
  564. border: 1px solid var(--border);
  565. border-radius: 8px;
  566. overflow: hidden;
  567. }
  568. .style-f .view-subtable {
  569. width: 100%;
  570. border-collapse: collapse;
  571. font-size: 13px;
  572. }
  573. .style-f .view-subtable th,
  574. .style-f .view-subtable td {
  575. padding: 8px 12px;
  576. text-align: center;
  577. border-bottom: 1px solid var(--border);
  578. }
  579. .style-f .view-subtable th {
  580. background: var(--table-head);
  581. color: var(--text-muted);
  582. font-weight: 600;
  583. font-size: 12px;
  584. }
  585. .style-f .view-subtable .ta-left { text-align: left; }
  586. .style-f .view-subtable tr:last-child td { border-bottom: none; }
  587. .style-f .attach-grid {
  588. display: grid;
  589. grid-template-columns: repeat(3, 1fr);
  590. gap: 10px;
  591. }
  592. .style-f .attach-card {
  593. border: 1px dashed #a7f3d0;
  594. border-radius: 8px;
  595. padding: 14px;
  596. text-align: center;
  597. font-size: 12px;
  598. color: var(--text-muted);
  599. background: var(--primary-bg);
  600. }
  601. .style-f .attach-card strong { display: block; color: var(--text); font-size: 13px; margin-bottom: 4px; }
  602. /* ═══════════════════════════════════════
  603. 风格 G · 卡片堆叠(Card Stack)
  604. ═══════════════════════════════════════ */
  605. .style-g { max-width: 800px; max-height: calc(100vh - 48px); }
  606. .style-g .dialog-scroll { padding: 20px 22px; background: #f1f5f9; }
  607. .style-g .stack-hero {
  608. background: #fff;
  609. border-radius: var(--radius);
  610. padding: 18px 20px;
  611. box-shadow: var(--shadow);
  612. margin-bottom: 14px;
  613. display: flex;
  614. align-items: center;
  615. gap: 14px;
  616. }
  617. .style-g .stack-hero-avatar {
  618. width: 64px; height: 64px;
  619. border-radius: 12px;
  620. background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  621. color: #fff;
  622. display: flex;
  623. align-items: center;
  624. justify-content: center;
  625. font-size: 24px;
  626. font-weight: 700;
  627. flex-shrink: 0;
  628. }
  629. .style-g .stack-hero h2 { margin: 0 0 4px; font-size: 17px; font-weight: 700; }
  630. .style-g .stack-hero p { margin: 0; font-size: 13px; color: var(--text-muted); }
  631. .style-g .stack-card {
  632. background: #fff;
  633. border-radius: var(--radius);
  634. padding: 16px 18px;
  635. box-shadow: var(--shadow);
  636. margin-bottom: 14px;
  637. }
  638. .style-g .stack-card:last-child { margin-bottom: 0; }
  639. .style-g .stack-card h3 {
  640. margin: 0 0 12px;
  641. font-size: 13px;
  642. font-weight: 600;
  643. color: var(--text);
  644. display: flex;
  645. align-items: center;
  646. gap: 8px;
  647. }
  648. .style-g .stack-card h3 .dot {
  649. width: 8px; height: 8px;
  650. border-radius: 50%;
  651. background: var(--primary);
  652. }
  653. .style-g .stack-kv-grid {
  654. display: grid;
  655. grid-template-columns: repeat(2, 1fr);
  656. gap: 10px 16px;
  657. }
  658. .style-g .stack-kv .k { font-size: 11px; color: var(--text-muted); }
  659. .style-g .stack-kv .v { font-size: 13px; font-weight: 600; margin-top: 2px; }
  660. .style-g .stack-highlight {
  661. background: var(--primary-bg);
  662. border: 1px solid rgba(16,185,129,0.2);
  663. border-radius: 8px;
  664. padding: 12px 14px;
  665. display: flex;
  666. justify-content: space-between;
  667. align-items: center;
  668. }
  669. .style-g .stack-highlight .amount { font-size: 22px; font-weight: 700; color: var(--primary-dark); }
  670. @media (max-width: 640px) {
  671. .style-a .view-kv-grid,
  672. .style-f .view-kv-grid,
  673. .style-g .stack-kv-grid { grid-template-columns: 1fr; }
  674. .style-b .view-bento { grid-template-columns: 1fr; }
  675. }
  676. </style>
  677. </head>
  678. <body>
  679. <div class="demo-page">
  680. <header class="demo-head">
  681. <h1><span>Fresh Mint</span> · 查看弹窗风格 Demo</h1>
  682. <p>
  683. 基于 <code>web-admin</code> 设计规范(主色 <code>#10b981</code>、无遮罩模糊、查看态仅关闭按钮)的 6 套查看弹窗方案。
  684. 点击下方卡片预览各风格,或在业务选型时对照适用场景。
  685. 另见 <a href="fresh-mint-view-kv-layout-demos.html">KV 字段布局对比 Demo</a>(上下 vs 左右 vs 表格)·
  686. <a href="fresh-mint-view-wide-dialog-demos.html">宽弹窗多列 Demo</a>(920~1120px)。
  687. </p>
  688. </header>
  689. <div class="demo-grid">
  690. <!-- A -->
  691. <article class="demo-card">
  692. <div class="demo-card-preview">
  693. <div class="mini-dialog">
  694. <div class="mini-hero"></div>
  695. <div class="mini-body">
  696. <div class="mini-line green"></div>
  697. <div class="mini-line"></div>
  698. <div class="mini-line short"></div>
  699. </div>
  700. </div>
  701. </div>
  702. <div class="demo-card-body">
  703. <div class="demo-tags">
  704. <span class="demo-tag">A · 经典 Hero</span>
  705. <span class="demo-tag muted">SystemViewDialog</span>
  706. </div>
  707. <h2>经典 Hero + KV 分块</h2>
  708. <p>当前 <code>SystemViewDialog</code> 标准方案:渐变 Hero 区 + 绿条区块标题 + 双列键值。适合用户、角色、主数据等通用 CRUD 查看。</p>
  709. <button type="button" class="btn btn-primary" data-open="dlgA">
  710. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  711. 预览弹窗
  712. </button>
  713. </div>
  714. </article>
  715. <!-- B -->
  716. <article class="demo-card">
  717. <div class="demo-card-preview" style="background:linear-gradient(135deg,#ecfdf5,#d1fae5)">
  718. <div class="mini-dialog">
  719. <div class="mini-body" style="padding-top:12px">
  720. <div style="display:grid;grid-template-columns:1fr 1fr;gap:4px">
  721. <div class="mini-line" style="height:24px;background:#ecfdf5;border:1px solid #d9e8e2"></div>
  722. <div class="mini-line" style="height:24px;background:#ecfdf5;border:1px solid #d9e8e2"></div>
  723. </div>
  724. <div class="mini-line" style="margin-top:8px"></div>
  725. </div>
  726. </div>
  727. </div>
  728. <div class="demo-card-body">
  729. <div class="demo-tags">
  730. <span class="demo-tag">B · 数据看板</span>
  731. <span class="demo-tag muted">订单/配送</span>
  732. </div>
  733. <h2>数据看板 + Bento 指标</h2>
  734. <p>Hero 内嵌 4 格指标卡 + Bento 信息卡 + 路由示意条。适合订单、配送任务、运单等含数量/金额/路线的业务详情。</p>
  735. <button type="button" class="btn btn-primary" data-open="dlgB">
  736. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  737. 预览弹窗
  738. </button>
  739. </div>
  740. </article>
  741. <!-- C -->
  742. <article class="demo-card">
  743. <div class="demo-card-preview">
  744. <div class="mini-dialog" style="display:flex;max-width:300px">
  745. <div style="width:38%;background:#ecfdf5;border-right:1px solid #d9e8e2">
  746. <div class="mini-hero" style="height:36px"></div>
  747. <div class="mini-body"><div class="mini-line short"></div></div>
  748. </div>
  749. <div style="flex:1;background:#f8fafc">
  750. <div class="mini-body"><div class="mini-line"></div><div class="mini-line short"></div></div>
  751. </div>
  752. </div>
  753. </div>
  754. <div class="demo-card-body">
  755. <div class="demo-tags">
  756. <span class="demo-tag">C · 左右分栏</span>
  757. <span class="demo-tag muted">Split Layout</span>
  758. </div>
  759. <h2>左右分栏 + 时间轴</h2>
  760. <p>左侧固定摘要与 KV,右侧展示审批流/轨迹/子表。对应 <code>layout="split"</code>,适合工作流待办、检测任务等「摘要 + 过程」场景。</p>
  761. <button type="button" class="btn btn-primary" data-open="dlgC">
  762. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  763. 预览弹窗
  764. </button>
  765. </div>
  766. </article>
  767. <!-- D -->
  768. <article class="demo-card">
  769. <div class="demo-card-preview" style="background:#fff">
  770. <div class="mini-dialog" style="max-width:220px">
  771. <div style="padding:8px 10px;border-bottom:1px solid #d9e8e2;display:flex;justify-content:space-between;align-items:center">
  772. <div class="mini-line short" style="width:50%;margin:0"></div>
  773. <div style="width:40px;height:16px;background:#ecfdf5;border-radius:4px;border:1px solid rgba(16,185,129,0.3)"></div>
  774. </div>
  775. <div class="mini-body">
  776. <div class="mini-line"></div>
  777. <div class="mini-line"></div>
  778. <div class="mini-line short"></div>
  779. </div>
  780. </div>
  781. </div>
  782. <div class="demo-card-body">
  783. <div class="demo-tags">
  784. <span class="demo-tag">D · 紧凑清单</span>
  785. <span class="demo-tag muted">轻量实体</span>
  786. </div>
  787. <h2>紧凑行式清单</h2>
  788. <p>无 Hero 渐变,单行 label-value 对齐,分组灰底标题。宽度 560px,适合字典项、单位、岗位等字段少、无需视觉强调的轻量查看。</p>
  789. <button type="button" class="btn btn-primary" data-open="dlgD">
  790. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  791. 预览弹窗
  792. </button>
  793. </div>
  794. </article>
  795. <!-- E -->
  796. <article class="demo-card">
  797. <div class="demo-card-preview" style="background:linear-gradient(180deg,#fff,#f8fafc)">
  798. <div class="mini-dialog">
  799. <div style="height:8px;background:var(--primary)"></div>
  800. <div class="mini-body" style="padding-top:10px">
  801. <div class="mini-line" style="width:70%"></div>
  802. <div class="mini-line short"></div>
  803. </div>
  804. </div>
  805. </div>
  806. <div class="demo-card-body">
  807. <div class="demo-tags">
  808. <span class="demo-tag">E · 票据档案</span>
  809. <span class="demo-tag muted">合同/证书</span>
  810. </div>
  811. <h2>票据档案风</h2>
  812. <p>正式文档头 + 水印 + 圆形印章态 + 表格式 KV + 签章区。适合合同、报价单、运输计划证、质检报告等需「归档感」的只读详情。</p>
  813. <button type="button" class="btn btn-primary" data-open="dlgE">
  814. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  815. 预览弹窗
  816. </button>
  817. </div>
  818. </article>
  819. <!-- F -->
  820. <article class="demo-card">
  821. <div class="demo-card-preview">
  822. <div class="mini-dialog">
  823. <div style="padding:6px 8px 0;border-bottom:1px solid #d9e8e2">
  824. <div class="mini-line short" style="margin-bottom:6px"></div>
  825. <div style="display:flex;gap:4px">
  826. <div style="width:28px;height:4px;background:#10b981;border-radius:2px"></div>
  827. <div style="width:28px;height:4px;background:#e2e8f0;border-radius:2px"></div>
  828. <div style="width:28px;height:4px;background:#e2e8f0;border-radius:2px"></div>
  829. </div>
  830. </div>
  831. <div class="mini-body"><div class="mini-line"></div></div>
  832. </div>
  833. </div>
  834. <div class="demo-card-body">
  835. <div class="demo-tags">
  836. <span class="demo-tag">F · 标签页</span>
  837. <span class="demo-tag muted">复杂业务</span>
  838. </div>
  839. <h2>标签页分区查看</h2>
  840. <p>顶部 Tab 切换基本信息 / 明细 / 审批 / 附件,避免单页过长滚动。适合 CRM 合同、报价、商机等多区块复杂对象。</p>
  841. <button type="button" class="btn btn-primary" data-open="dlgF">
  842. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  843. 预览弹窗
  844. </button>
  845. </div>
  846. </article>
  847. <!-- G -->
  848. <article class="demo-card">
  849. <div class="demo-card-preview" style="background:#f1f5f9">
  850. <div class="mini-dialog" style="background:transparent;box-shadow:none">
  851. <div style="background:#fff;border-radius:6px;height:28px;margin-bottom:4px;box-shadow:0 1px 3px rgba(0,0,0,0.08)"></div>
  852. <div style="background:#fff;border-radius:6px;height:36px;margin-bottom:4px;box-shadow:0 1px 3px rgba(0,0,0,0.08)"></div>
  853. <div style="background:#fff;border-radius:6px;height:28px;box-shadow:0 1px 3px rgba(0,0,0,0.08)"></div>
  854. </div>
  855. </div>
  856. <div class="demo-card-body">
  857. <div class="demo-tags">
  858. <span class="demo-tag">G · 卡片堆叠</span>
  859. <span class="demo-tag muted">客户/供应商</span>
  860. </div>
  861. <h2>卡片堆叠分区</h2>
  862. <p>灰底容器 + 独立浮卡,每卡一个主题区块,视觉层次清晰。适合客户档案、供应商资质、人员档案等「多维度画像」类查看。</p>
  863. <button type="button" class="btn btn-primary" data-open="dlgG">
  864. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
  865. 预览弹窗
  866. </button>
  867. </div>
  868. </article>
  869. </div>
  870. </div>
  871. <!-- ═══ 弹窗 A · 经典 Hero ═══ -->
  872. <div class="backdrop" id="dlgA" role="dialog" aria-modal="true">
  873. <div class="dialog style-a">
  874. <div class="dialog-scroll">
  875. <div class="view-hero">
  876. <div class="view-hero-icon">
  877. <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
  878. </div>
  879. <div class="view-hero-main">
  880. <h2>张三</h2>
  881. <p class="view-hero-meta">工号:SX-2024-0086 · 华东区域 · 调度员</p>
  882. </div>
  883. <span class="tag">正常</span>
  884. </div>
  885. <div class="view-section">
  886. <h3>账号信息</h3>
  887. <dl class="view-kv-grid">
  888. <div class="view-kv"><dt>用户名</dt><dd>zhangsan</dd></div>
  889. <div class="view-kv"><dt>手机号</dt><dd>138****6688</dd></div>
  890. <div class="view-kv"><dt>所属角色</dt><dd>调度主管、区域管理员</dd></div>
  891. <div class="view-kv"><dt>所属部门</dt><dd>运营中心 / 华东调度组</dd></div>
  892. </dl>
  893. </div>
  894. <div class="view-section">
  895. <h3>状态与审计</h3>
  896. <dl class="view-kv-grid">
  897. <div class="view-kv"><dt>账号状态</dt><dd><span class="tag">正常</span></dd></div>
  898. <div class="view-kv"><dt>最后登录</dt><dd>2026-06-18 09:32:15</dd></div>
  899. <div class="view-kv"><dt>创建时间</dt><dd>2024-03-12 14:20:00</dd></div>
  900. <div class="view-kv"><dt>备注</dt><dd>—</dd></div>
  901. </dl>
  902. </div>
  903. </div>
  904. <div class="dialog-foot">
  905. <button type="button" class="btn btn-ghost" data-close>
  906. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  907. 关闭
  908. </button>
  909. </div>
  910. </div>
  911. </div>
  912. <!-- ═══ 弹窗 B · 数据看板 ═══ -->
  913. <div class="backdrop" id="dlgB" role="dialog" aria-modal="true">
  914. <div class="dialog style-b">
  915. <div class="dialog-scroll">
  916. <div class="view-hero">
  917. <div class="view-hero-top">
  918. <div>
  919. <h2>配送任务 PS-20260620-0031</h2>
  920. <div class="view-hero-tags">
  921. <span class="tag">执行中</span>
  922. <span class="tag muted">优先级 · 高</span>
  923. <span class="tag muted">华东区域</span>
  924. </div>
  925. </div>
  926. </div>
  927. <div class="view-stat-row">
  928. <div class="stat-chip"><div class="label">配送件数</div><div class="value">128</div></div>
  929. <div class="stat-chip"><div class="label">本单金额</div><div class="value">¥4,860</div></div>
  930. <div class="stat-chip warn"><div class="label">在途时长</div><div class="value">2.5h</div></div>
  931. <div class="stat-chip"><div class="label">站点数</div><div class="value">6</div></div>
  932. </div>
  933. </div>
  934. <div class="view-section">
  935. <h3>基础信息</h3>
  936. <dl class="view-kv-grid" style="display:grid;grid-template-columns:repeat(2,1fr);gap:12px 28px">
  937. <div class="view-kv"><dt>任务号</dt><dd>PS-20260620-0031</dd></div>
  938. <div class="view-kv"><dt>计划时间</dt><dd>2026-06-20 08:00 — 14:00</dd></div>
  939. <div class="view-kv"><dt>司机 / 车辆</dt><dd>李师傅 · 浙A·8K326</dd></div>
  940. <div class="view-kv"><dt>线路</dt><dd>华东中心仓 → 城配集散 → 6 门店</dd></div>
  941. </dl>
  942. </div>
  943. <div class="view-section">
  944. <h3>费用说明</h3>
  945. <div class="view-bento">
  946. <div class="view-card">
  947. <h4>路桥费(元)</h4>
  948. <p style="font-size:18px;font-weight:700;color:var(--primary-dark)">¥186.00</p>
  949. </div>
  950. <div class="view-card">
  951. <h4>装卸费(元)</h4>
  952. <p style="font-size:18px;font-weight:700;color:var(--primary-dark)">¥320.00</p>
  953. </div>
  954. <div class="view-card" style="grid-column:1/-1">
  955. <h4>备注</h4>
  956. <p>含温控附加费;实际结算以回单签收后财务对账为准。</p>
  957. </div>
  958. </div>
  959. </div>
  960. <div class="view-section">
  961. <h3>路由示意</h3>
  962. <div class="view-route-bar">
  963. <div class="route-pin"><strong>始发仓</strong>华东中心仓</div>
  964. <div class="route-line"></div>
  965. <div class="route-pin"><strong>经停</strong>城配集散</div>
  966. <div class="route-line"></div>
  967. <div class="route-pin"><strong>目的地</strong>6 门店</div>
  968. </div>
  969. </div>
  970. </div>
  971. <div class="dialog-foot">
  972. <button type="button" class="btn btn-ghost" data-close>
  973. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  974. 关闭
  975. </button>
  976. </div>
  977. </div>
  978. </div>
  979. <!-- ═══ 弹窗 C · 左右分栏 ═══ -->
  980. <div class="backdrop" id="dlgC" role="dialog" aria-modal="true">
  981. <div class="dialog style-c">
  982. <div class="view-split">
  983. <div class="view-split-left">
  984. <div class="view-hero">
  985. <div class="view-hero-icon">
  986. <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>
  987. </div>
  988. <div class="view-hero-main">
  989. <h2>质检工单 QC-0618-042</h2>
  990. <p class="view-hero-meta">样品编码:SP-2026-A0186</p>
  991. </div>
  992. </div>
  993. <div class="view-section">
  994. <h3>任务信息</h3>
  995. <dl>
  996. <div class="view-kv"><dt>检测项目</dt><dd>纯度 · 水分 · 重金属</dd></div>
  997. <div class="view-kv"><dt>委托方</dt><dd>山峡化工 · 生产一部</dd></div>
  998. <div class="view-kv"><dt>优先级</dt><dd><span class="tag warn">加急</span></dd></div>
  999. <div class="view-kv"><dt>当前状态</dt><dd><span class="tag">检测中</span></dd></div>
  1000. </dl>
  1001. </div>
  1002. <div class="view-section">
  1003. <h3>样品信息</h3>
  1004. <dl>
  1005. <div class="view-kv"><dt>采样时间</dt><dd>2026-06-18 07:45</dd></div>
  1006. <div class="view-kv"><dt>采样地点</dt><dd>3 号产线 · 成品罐</dd></div>
  1007. <div class="view-kv"><dt>留样编号</dt><dd>LY-20260618-009</dd></div>
  1008. </dl>
  1009. </div>
  1010. </div>
  1011. <div class="view-split-right">
  1012. <h3 class="right-panel-title">执行轨迹</h3>
  1013. <div class="view-timeline">
  1014. <div class="view-tl-item">
  1015. <div class="view-tl-time">2026-06-18 08:00</div>
  1016. <div class="view-tl-title">样品接收 · 已入库</div>
  1017. <div class="view-tl-desc">收样员:王芳 · 冷库 2℃ 暂存</div>
  1018. </div>
  1019. <div class="view-tl-item">
  1020. <div class="view-tl-time">2026-06-18 09:30</div>
  1021. <div class="view-tl-title">前处理完成 · 进入检测</div>
  1022. <div class="view-tl-desc">分配至理化组 · 仪器 GC-2024</div>
  1023. </div>
  1024. <div class="view-tl-item">
  1025. <div class="view-tl-time">2026-06-18 11:15</div>
  1026. <div class="view-tl-title">纯度检测 · 进行中</div>
  1027. <div class="view-tl-desc">预计 14:00 出初步结果</div>
  1028. </div>
  1029. <div class="view-tl-item muted">
  1030. <div class="view-tl-time">待发生</div>
  1031. <div class="view-tl-title">报告签发 · 审核归档</div>
  1032. <div class="view-tl-desc">需 QC 主管复核后发布</div>
  1033. </div>
  1034. </div>
  1035. </div>
  1036. </div>
  1037. <div class="dialog-foot">
  1038. <button type="button" class="btn btn-ghost" data-close>
  1039. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  1040. 关闭
  1041. </button>
  1042. </div>
  1043. </div>
  1044. </div>
  1045. <!-- ═══ 弹窗 D · 紧凑清单 ═══ -->
  1046. <div class="backdrop" id="dlgD" role="dialog" aria-modal="true">
  1047. <div class="dialog style-d">
  1048. <div class="view-compact-head">
  1049. <div>
  1050. <h2>计量单位 · 吨(t)</h2>
  1051. <div class="sub">编码 unit_t · 排序 10</div>
  1052. </div>
  1053. <span class="tag">启用</span>
  1054. </div>
  1055. <div class="dialog-scroll view-compact-body">
  1056. <div class="view-row-group">基本信息</div>
  1057. <dl class="view-row"><dt>单位名称</dt><dd>吨</dd></dl>
  1058. <dl class="view-row"><dt>单位符号</dt><dd>t</dd></dl>
  1059. <dl class="view-row"><dt>单位编码</dt><dd>unit_t</dd></dl>
  1060. <div class="view-row-group">系统信息</div>
  1061. <dl class="view-row"><dt>状态</dt><dd><span class="tag">启用</span></dd></dl>
  1062. <dl class="view-row"><dt>创建人</dt><dd>系统管理员</dd></dl>
  1063. <dl class="view-row"><dt>创建时间</dt><dd>2024-01-08 10:00:00</dd></dl>
  1064. <dl class="view-row"><dt>备注</dt><dd>地磅称重默认单位</dd></dl>
  1065. </div>
  1066. <div class="dialog-foot">
  1067. <button type="button" class="btn btn-ghost" data-close>
  1068. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  1069. 关闭
  1070. </button>
  1071. </div>
  1072. </div>
  1073. </div>
  1074. <!-- ═══ 弹窗 E · 票据档案 ═══ -->
  1075. <div class="backdrop" id="dlgE" role="dialog" aria-modal="true">
  1076. <div class="dialog style-e">
  1077. <div class="dialog-scroll">
  1078. <div class="doc-header">
  1079. <div class="doc-watermark">合同</div>
  1080. <div class="doc-header-top">
  1081. <div>
  1082. <h2>产品销售合同</h2>
  1083. <div class="doc-no">HT-2026-SX-00428</div>
  1084. </div>
  1085. <div class="doc-stamp">已生效</div>
  1086. </div>
  1087. <div class="doc-meta-bar">
  1088. <span>签订日期:<strong>2026-06-01</strong></span>
  1089. <span>有效期至:<strong>2027-05-31</strong></span>
  1090. <span>甲方:<strong>山峡化工有限公司</strong></span>
  1091. <span>乙方:<strong>华东精细化工贸易公司</strong></span>
  1092. </div>
  1093. </div>
  1094. <div class="doc-body">
  1095. <div class="doc-section">
  1096. <h3>合同概要</h3>
  1097. <table class="doc-kv-table">
  1098. <tr><td>合同类型</td><td>年度框架 · 化工原料</td></tr>
  1099. <tr><td>合同金额</td><td class="money-val">¥ 2,580,000.00</td></tr>
  1100. <tr><td>付款方式</td><td>月结 30 天 · 银行承兑</td></tr>
  1101. <tr><td>交货方式</td><td>卖方送货 · 华东区域仓</td></tr>
  1102. </table>
  1103. </div>
  1104. <div class="doc-section">
  1105. <h3>主要条款</h3>
  1106. <table class="doc-kv-table">
  1107. <tr><td>质量标准</td><td>GB/T 标准 · 每批次附质检报告</td></tr>
  1108. <tr><td>违约责任</td><td>逾期交货按日 0.5‰ 计罚 · 上限 5%</td></tr>
  1109. <tr><td>争议解决</td><td>协商不成提交杭州仲裁委员会</td></tr>
  1110. </table>
  1111. </div>
  1112. <div class="doc-sign">
  1113. <span>生成时间:2026-06-01 16:30:00</span>
  1114. <span>系统归档编号:ARC-20260601-00428</span>
  1115. </div>
  1116. </div>
  1117. </div>
  1118. <div class="dialog-foot">
  1119. <button type="button" class="btn btn-ghost" data-close>
  1120. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  1121. 关闭
  1122. </button>
  1123. </div>
  1124. </div>
  1125. </div>
  1126. <!-- ═══ 弹窗 F · 标签页 ═══ -->
  1127. <div class="backdrop" id="dlgF" role="dialog" aria-modal="true">
  1128. <div class="dialog style-f">
  1129. <div class="view-tab-head">
  1130. <div class="view-tab-head-top">
  1131. <div>
  1132. <h2>报价单 QO-20260615-008</h2>
  1133. <div class="code">客户:华东精细化工 · 商机:年产 500 吨催化剂项目</div>
  1134. </div>
  1135. <span class="tag">已审批</span>
  1136. </div>
  1137. <div class="view-tabs" role="tablist">
  1138. <button type="button" class="view-tab active" data-tab="tab-info" role="tab">基本信息</button>
  1139. <button type="button" class="view-tab" data-tab="tab-items" role="tab">产品明细</button>
  1140. <button type="button" class="view-tab" data-tab="tab-flow" role="tab">审批记录</button>
  1141. <button type="button" class="view-tab" data-tab="tab-files" role="tab">附件</button>
  1142. </div>
  1143. </div>
  1144. <div class="dialog-scroll">
  1145. <div class="view-tab-panel active" id="tab-info">
  1146. <dl class="view-kv-grid">
  1147. <div class="view-kv"><dt>报价编号</dt><dd>QO-20260615-008</dd></div>
  1148. <div class="view-kv"><dt>报价状态</dt><dd><span class="tag">已审批</span></dd></div>
  1149. <div class="view-kv"><dt>报价金额</dt><dd class="money-val">¥ 186,500.00</dd></div>
  1150. <div class="view-kv"><dt>有效期</dt><dd>2026-06-15 — 2026-07-15</dd></div>
  1151. <div class="view-kv"><dt>销售负责人</dt><dd>陈经理</dd></div>
  1152. <div class="view-kv"><dt>创建时间</dt><dd>2026-06-15 10:22:00</dd></div>
  1153. </dl>
  1154. </div>
  1155. <div class="view-tab-panel" id="tab-items">
  1156. <div class="view-subtable-wrap">
  1157. <table class="view-subtable">
  1158. <thead>
  1159. <tr>
  1160. <th class="ta-left">产品名称</th>
  1161. <th>规格</th>
  1162. <th>数量</th>
  1163. <th>单价</th>
  1164. <th>小计</th>
  1165. </tr>
  1166. </thead>
  1167. <tbody>
  1168. <tr>
  1169. <td class="ta-left">催化剂 A 型</td>
  1170. <td>25kg/桶</td>
  1171. <td>200</td>
  1172. <td class="money-val">¥680.00</td>
  1173. <td class="money-val">¥136,000</td>
  1174. </tr>
  1175. <tr>
  1176. <td class="ta-left">助剂 B 型</td>
  1177. <td>10kg/袋</td>
  1178. <td>100</td>
  1179. <td class="money-val">¥505.00</td>
  1180. <td class="money-val">¥50,500</td>
  1181. </tr>
  1182. </tbody>
  1183. </table>
  1184. </div>
  1185. </div>
  1186. <div class="view-tab-panel" id="tab-flow">
  1187. <div class="view-timeline" style="padding-left:18px;border-left:2px solid var(--border);margin-left:6px">
  1188. <div class="view-tl-item" style="position:relative;padding-bottom:16px;font-size:13px">
  1189. <div style="font-size:12px;color:var(--text-muted)">2026-06-15 14:30</div>
  1190. <div style="font-weight:600">销售总监 · 已通过</div>
  1191. <div style="color:var(--text-muted);font-size:12px;margin-top:2px">同意报价,注意交货周期。</div>
  1192. </div>
  1193. <div class="view-tl-item" style="position:relative;padding-bottom:0;font-size:13px">
  1194. <div style="font-size:12px;color:var(--text-muted)">2026-06-15 11:05</div>
  1195. <div style="font-weight:600">陈经理 · 提交审批</div>
  1196. </div>
  1197. </div>
  1198. </div>
  1199. <div class="view-tab-panel" id="tab-files">
  1200. <div class="attach-grid">
  1201. <div class="attach-card"><strong>报价单.pdf</strong>2.4 MB · 2026-06-15</div>
  1202. <div class="attach-card"><strong>产品规格书.pdf</strong>1.8 MB · 2026-06-14</div>
  1203. <div class="attach-card"><strong>客户询价函.jpg</strong>856 KB · 2026-06-12</div>
  1204. </div>
  1205. </div>
  1206. </div>
  1207. <div class="dialog-foot">
  1208. <button type="button" class="btn btn-ghost" data-close>
  1209. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  1210. 关闭
  1211. </button>
  1212. </div>
  1213. </div>
  1214. </div>
  1215. <!-- ═══ 弹窗 G · 卡片堆叠 ═══ -->
  1216. <div class="backdrop" id="dlgG" role="dialog" aria-modal="true">
  1217. <div class="dialog style-g">
  1218. <div class="dialog-scroll">
  1219. <div class="stack-hero">
  1220. <div class="stack-hero-avatar">华</div>
  1221. <div>
  1222. <h2>华东精细化工贸易公司</h2>
  1223. <p>客户编码 KH-2023-0186 · <span class="tag" style="font-size:11px">战略客户</span></p>
  1224. </div>
  1225. </div>
  1226. <div class="stack-card">
  1227. <h3><span class="dot"></span>联系信息</h3>
  1228. <div class="stack-kv-grid">
  1229. <div class="stack-kv"><div class="k">联系人</div><div class="v">刘总 · 采购部</div></div>
  1230. <div class="stack-kv"><div class="k">手机</div><div class="v">139****8821</div></div>
  1231. <div class="stack-kv"><div class="k">地址</div><div class="v">浙江省杭州市 · 滨江区</div></div>
  1232. <div class="stack-kv"><div class="k">所属行业</div><div class="v">精细化工 / 贸易</div></div>
  1233. </div>
  1234. </div>
  1235. <div class="stack-card">
  1236. <h3><span class="dot"></span>业务概览</h3>
  1237. <div class="stack-highlight">
  1238. <div>
  1239. <div style="font-size:12px;color:var(--text-muted)">累计成交额(近 12 月)</div>
  1240. <div class="amount">¥ 8,620,000</div>
  1241. </div>
  1242. <div style="text-align:right">
  1243. <div style="font-size:12px;color:var(--text-muted)">进行中商机</div>
  1244. <div style="font-size:18px;font-weight:700;color:var(--primary-dark)">3 个</div>
  1245. </div>
  1246. </div>
  1247. </div>
  1248. <div class="stack-card">
  1249. <h3><span class="dot"></span>最近跟进</h3>
  1250. <p style="margin:0;font-size:13px;line-height:1.6;color:var(--text)">
  1251. 2026-06-12 · 陈经理:客户对催化剂 A 型报价满意,计划下周签约框架合同。需协调技术部提供样品检测报告。
  1252. </p>
  1253. </div>
  1254. </div>
  1255. <div class="dialog-foot">
  1256. <button type="button" class="btn btn-ghost" data-close>
  1257. <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
  1258. 关闭
  1259. </button>
  1260. </div>
  1261. </div>
  1262. </div>
  1263. <script>
  1264. document.querySelectorAll("[data-open]").forEach(function (btn) {
  1265. btn.addEventListener("click", function () {
  1266. var id = btn.getAttribute("data-open");
  1267. var dlg = document.getElementById(id);
  1268. if (dlg) dlg.classList.add("open");
  1269. });
  1270. });
  1271. document.querySelectorAll("[data-close]").forEach(function (btn) {
  1272. btn.addEventListener("click", function () {
  1273. btn.closest(".backdrop").classList.remove("open");
  1274. });
  1275. });
  1276. document.querySelectorAll(".backdrop").forEach(function (backdrop) {
  1277. backdrop.addEventListener("click", function (e) {
  1278. if (e.target === backdrop) backdrop.classList.remove("open");
  1279. });
  1280. });
  1281. document.addEventListener("keydown", function (e) {
  1282. if (e.key === "Escape") {
  1283. document.querySelectorAll(".backdrop.open").forEach(function (b) {
  1284. b.classList.remove("open");
  1285. });
  1286. }
  1287. });
  1288. document.querySelectorAll(".style-f .view-tab").forEach(function (tab) {
  1289. tab.addEventListener("click", function () {
  1290. var panelId = tab.getAttribute("data-tab");
  1291. var dialog = tab.closest(".style-f");
  1292. dialog.querySelectorAll(".view-tab").forEach(function (t) { t.classList.remove("active"); });
  1293. dialog.querySelectorAll(".view-tab-panel").forEach(function (p) { p.classList.remove("active"); });
  1294. tab.classList.add("active");
  1295. var panel = document.getElementById(panelId);
  1296. if (panel) panel.classList.add("active");
  1297. });
  1298. });
  1299. </script>
  1300. </body>
  1301. </html>