styles.css 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744
  1. :root {
  2. --brand: #0a66ff;
  3. --brand-600: #0952cc;
  4. --text: #0b0c0f;
  5. --muted: #55637a;
  6. --border: #e6e8eb;
  7. --bg: #ffffff;
  8. --bg2: #f7f8fa;
  9. --bg-page: #f4f6fb;
  10. --danger: #e03131;
  11. --success: #2f9e44;
  12. --warning: #f08c00;
  13. --radius: 12px;
  14. --shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.1);
  15. --shadow-lg: 0 8px 24px rgba(16, 24, 40, 0.12);
  16. --ring: 0 0 0 4px rgba(10, 102, 255, 0.16);
  17. --space-1: 4px;
  18. --space-2: 8px;
  19. --space-3: 12px;
  20. --space-4: 16px;
  21. --space-6: 24px;
  22. --space-8: 32px;
  23. }
  24. * {
  25. box-sizing: border-box;
  26. }
  27. html, body {
  28. height: 100%;
  29. }
  30. body {
  31. margin: 0;
  32. font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial;
  33. color: var(--text);
  34. background: var(--bg-page);
  35. line-height: 1.5;
  36. }
  37. .container a {
  38. color: inherit;
  39. }
  40. .container a:hover {
  41. color: var(--text);
  42. }
  43. .container {
  44. max-width: 1180px;
  45. margin: 0 auto;
  46. padding: 0 var(--space-4);
  47. }
  48. .topbar {
  49. position: sticky;
  50. top: 0;
  51. z-index: 50;
  52. border-bottom: 1px solid var(--border);
  53. background: rgba(255,255,255,0.9);
  54. backdrop-filter: saturate(150%) blur(8px);
  55. box-shadow: 0 1px 0 rgba(16, 24, 40, 0.04);
  56. }
  57. .topbar-inner {
  58. display: flex;
  59. align-items: center;
  60. justify-content: space-between;
  61. height: 60px;
  62. }
  63. .brand {
  64. font-weight: 800;
  65. font-size: 18px;
  66. text-decoration: none;
  67. color: var(--text);
  68. display: flex;
  69. align-items: center;
  70. }
  71. .nav {
  72. display: flex;
  73. align-items: center;
  74. justify-content: space-between;
  75. gap: var(--space-3);
  76. flex: 1;
  77. min-width: 0;
  78. }
  79. .nav-group {
  80. display: flex;
  81. gap: var(--space-3);
  82. align-items: center;
  83. flex-wrap: wrap;
  84. }
  85. .nav-right {
  86. justify-content: flex-end;
  87. }
  88. .nav-auth {
  89. display: flex;
  90. gap: var(--space-2);
  91. align-items: center;
  92. }
  93. .nav-user {
  94. display: inline-flex;
  95. align-items: center;
  96. gap: var(--space-2);
  97. padding: 6px 10px;
  98. border-radius: 999px;
  99. border: 1px solid var(--border);
  100. background: var(--bg2);
  101. color: var(--text);
  102. }
  103. .nav-badge {
  104. display: inline-flex;
  105. align-items: center;
  106. padding: 2px 8px;
  107. border-radius: 999px;
  108. font-size: 12px;
  109. line-height: 18px;
  110. border: 1px solid var(--border);
  111. background: var(--bg);
  112. color: var(--muted);
  113. }
  114. .nav-badge-vip {
  115. color: #b45309;
  116. border-color: rgba(180, 83, 9, 0.25);
  117. background: rgba(180, 83, 9, 0.08);
  118. }
  119. .nav-msg {
  120. position: relative;
  121. display: inline-flex;
  122. align-items: center;
  123. justify-content: center;
  124. width: 36px;
  125. height: 36px;
  126. border-radius: 10px;
  127. }
  128. .nav-msg-badge {
  129. position: absolute;
  130. top: -4px;
  131. right: -4px;
  132. min-width: 18px;
  133. height: 18px;
  134. padding: 0 5px;
  135. border-radius: 999px;
  136. background: #ef4444;
  137. color: #fff;
  138. font-size: 12px;
  139. line-height: 18px;
  140. text-align: center;
  141. border: 2px solid var(--bg);
  142. display: none;
  143. }
  144. .nav-admin {
  145. color: var(--muted);
  146. }
  147. .nav a {
  148. text-decoration: none;
  149. color: var(--muted);
  150. padding: 6px 10px;
  151. border-radius: 8px;
  152. transition: all 0.2s ease;
  153. }
  154. .nav a:hover {
  155. background: var(--bg2);
  156. color: var(--text);
  157. transform: translateY(-1px);
  158. }
  159. .nav a.active {
  160. color: var(--brand);
  161. background: #eef4ff;
  162. }
  163. main.container {
  164. padding-top: var(--space-6);
  165. padding-bottom: var(--space-6);
  166. animation: pageFadeIn 0.4s ease-out;
  167. }
  168. @keyframes pageFadeIn {
  169. from { opacity: 0; transform: translateY(10px); }
  170. to { opacity: 1; transform: translateY(0); }
  171. }
  172. .container h1 {
  173. font-size: 28px;
  174. letter-spacing: -0.02em;
  175. margin: 0 0 var(--space-3);
  176. }
  177. .container h2 {
  178. font-size: 18px;
  179. margin: 0 0 var(--space-3);
  180. letter-spacing: -0.01em;
  181. }
  182. .container h3 {
  183. font-size: 16px;
  184. margin: 0 0 var(--space-2);
  185. }
  186. .section-title {
  187. font-weight: 700;
  188. color: var(--text);
  189. margin: 0 0 var(--space-2);
  190. }
  191. .footer {
  192. border-top: 1px solid var(--border);
  193. background: var(--bg);
  194. padding: var(--space-6) 0;
  195. color: var(--muted);
  196. font-size: 14px;
  197. }
  198. /* Admin page: remove container max-width limit */
  199. body[data-page="admin"] .container {
  200. max-width: none;
  201. }
  202. /* Hero & Swiper Styles */
  203. .hero-swiper {
  204. width: 100%;
  205. border-radius: 20px;
  206. overflow: hidden;
  207. box-shadow: var(--shadow-lg);
  208. margin-top: 16px;
  209. margin-bottom: 24px;
  210. }
  211. .hero {
  212. padding: 80px 20px;
  213. text-align: center;
  214. background-size: cover;
  215. background-position: center;
  216. position: relative;
  217. min-height: 400px;
  218. display: flex;
  219. align-items: center;
  220. justify-content: center;
  221. }
  222. .hero::before {
  223. content: "";
  224. position: absolute;
  225. top: 0; left: 0; right: 0; bottom: 0;
  226. background: linear-gradient(to bottom, rgba(244,246,251,0.9), rgba(244,246,251,0.6));
  227. z-index: 1;
  228. }
  229. .hero-slide-1 {
  230. background-image: url('/static/images/hero/hero-slide-1.jpg');
  231. }
  232. .hero-slide-2 {
  233. background-image: url('/static/images/hero/hero-slide-2.jpg');
  234. }
  235. .hero-slide-3 {
  236. background-image: url('/static/images/hero/hero-slide-3.jpg');
  237. }
  238. .hero-content {
  239. position: relative;
  240. z-index: 2;
  241. max-width: 800px;
  242. margin: 0 auto;
  243. }
  244. .hero-title {
  245. font-size: 2.8rem;
  246. font-weight: 800;
  247. margin-bottom: 20px;
  248. color: var(--text);
  249. text-shadow: 0 2px 4px rgba(255,255,255,0.8);
  250. }
  251. .hero-desc {
  252. font-size: 1.25rem;
  253. color: var(--text-muted);
  254. margin-bottom: 40px;
  255. font-weight: 500;
  256. }
  257. @media (max-width: 768px) {
  258. .hero {
  259. padding: 60px 20px;
  260. min-height: 320px;
  261. }
  262. .hero-title {
  263. font-size: 2rem;
  264. }
  265. .hero-desc {
  266. font-size: 1.1rem;
  267. }
  268. .hero-toolbar {
  269. flex-direction: column;
  270. gap: 12px;
  271. }
  272. }
  273. .hero-toolbar {
  274. justify-content: center;
  275. gap: 20px;
  276. }
  277. .swiper-button-next, .swiper-button-prev {
  278. color: var(--brand) !important;
  279. background: rgba(255,255,255,0.8);
  280. width: 48px !important;
  281. height: 48px !important;
  282. border-radius: 50%;
  283. backdrop-filter: blur(4px);
  284. }
  285. .swiper-button-next:after, .swiper-button-prev:after {
  286. font-size: 20px !important;
  287. font-weight: bold;
  288. }
  289. .swiper-pagination-bullet-active {
  290. background: var(--brand) !important;
  291. }
  292. .toolbar {
  293. display: flex;
  294. gap: var(--space-2);
  295. align-items: center;
  296. flex-wrap: wrap;
  297. margin: var(--space-3) 0;
  298. }
  299. .toolbar-tight {
  300. margin: 0;
  301. }
  302. .input {
  303. padding: 10px 12px;
  304. border: 1px solid var(--border);
  305. border-radius: 10px;
  306. background: var(--bg);
  307. min-width: 0;
  308. color: var(--text);
  309. transition: border-color 160ms ease, box-shadow 160ms ease;
  310. }
  311. input.input,
  312. select.input {
  313. height: 40px;
  314. }
  315. textarea.input {
  316. padding: 12px 12px;
  317. min-height: 120px;
  318. resize: vertical;
  319. }
  320. .form {
  321. max-width: 480px;
  322. width: 100%;
  323. }
  324. .form .input {
  325. width: 100%;
  326. }
  327. .form input.input,
  328. .form select.input {
  329. height: 48px;
  330. padding: 0 16px;
  331. border-radius: 12px;
  332. font-size: 15px;
  333. }
  334. .form textarea.input {
  335. border-radius: 12px;
  336. font-size: 14px;
  337. }
  338. .modal .input {
  339. width: 100%;
  340. }
  341. .input::placeholder {
  342. color: rgba(85, 99, 122, 0.88);
  343. opacity: 1;
  344. }
  345. .page-header .input::placeholder {
  346. color: rgba(255, 255, 255, 0.85);
  347. }
  348. .input:focus {
  349. outline: none;
  350. border-color: rgba(10, 102, 255, 0.45);
  351. box-shadow: var(--ring);
  352. }
  353. .btn, a.btn {
  354. padding: 10px 14px;
  355. border: 1px solid var(--border);
  356. border-radius: 10px;
  357. background: var(--bg2);
  358. color: var(--text);
  359. text-decoration: none;
  360. cursor: pointer;
  361. font-weight: 650;
  362. transition: transform 120ms ease, box-shadow 160ms ease, background 160ms ease, border-color 160ms ease, color 160ms ease;
  363. display: inline-flex;
  364. align-items: center;
  365. justify-content: center;
  366. }
  367. .btn[disabled], a.btn[disabled] {
  368. cursor: not-allowed;
  369. opacity: 0.6;
  370. }
  371. .btn:hover, a.btn:hover {
  372. background: #eef1f6;
  373. transform: translateY(-1px);
  374. color: var(--text);
  375. text-decoration: none;
  376. }
  377. .btn-primary, a.btn-primary {
  378. border-color: transparent;
  379. background: linear-gradient(180deg, #1a73ff 0%, var(--brand) 100%);
  380. color: #fff;
  381. text-decoration: none;
  382. box-shadow: 0 6px 16px rgba(10, 102, 255, 0.22);
  383. }
  384. .btn-primary:hover, a.btn-primary:hover {
  385. background: linear-gradient(180deg, #1468f0 0%, var(--brand-600) 100%);
  386. color: #fff;
  387. text-decoration: none;
  388. box-shadow: 0 10px 22px rgba(10, 102, 255, 0.26);
  389. }
  390. .btn-ghost, a.btn-ghost {
  391. background: transparent;
  392. border-color: transparent;
  393. color: var(--brand);
  394. text-decoration: none;
  395. }
  396. .btn-ghost:hover, a.btn-ghost:hover {
  397. background: rgba(10, 102, 255, 0.05);
  398. color: var(--brand);
  399. text-decoration: none;
  400. }
  401. .btn-danger, a.btn-danger {
  402. border-color: transparent;
  403. background: linear-gradient(180deg, #fa5252 0%, var(--danger) 100%);
  404. color: #fff;
  405. text-decoration: none;
  406. box-shadow: 0 6px 16px rgba(224, 49, 49, 0.22);
  407. }
  408. .btn-danger:hover, a.btn-danger:hover {
  409. background: linear-gradient(180deg, #f03e3e 0%, #c92a2a 100%);
  410. color: #fff;
  411. text-decoration: none;
  412. box-shadow: 0 10px 22px rgba(224, 49, 49, 0.26);
  413. }
  414. .btn-block {
  415. width: 100%;
  416. }
  417. .btn-lg {
  418. padding: 14px 24px;
  419. font-size: 1.1rem;
  420. border-radius: 12px;
  421. }
  422. .btn-sm, a.btn-sm {
  423. padding: 6px 10px;
  424. border-radius: 8px;
  425. font-size: 13px;
  426. }
  427. .btn-toggle.active {
  428. border-color: rgba(10, 102, 255, 0.35);
  429. background: rgba(10, 102, 255, 0.08);
  430. color: var(--brand);
  431. }
  432. .btn-group {
  433. display: inline-flex;
  434. gap: var(--space-2);
  435. align-items: center;
  436. flex-wrap: wrap;
  437. }
  438. .segmented {
  439. display: inline-flex;
  440. padding: 4px;
  441. gap: 4px;
  442. border: 1px solid var(--border);
  443. border-radius: 12px;
  444. background: var(--bg2);
  445. flex-wrap: wrap;
  446. }
  447. .segmented.nowrap {
  448. flex-wrap: nowrap;
  449. overflow-x: auto;
  450. }
  451. .segmented.nowrap .btn {
  452. white-space: nowrap;
  453. flex: 0 0 auto;
  454. }
  455. .segmented .btn {
  456. border-radius: 10px;
  457. }
  458. .segmented .btn.active {
  459. border-color: rgba(10, 102, 255, 0.35);
  460. background: rgba(10, 102, 255, 0.08);
  461. color: var(--brand);
  462. }
  463. .input.is-invalid,
  464. .modal .input.is-invalid {
  465. border-color: rgba(224, 49, 49, 0.7);
  466. box-shadow: 0 0 0 4px rgba(224, 49, 49, 0.12);
  467. }
  468. .segmented.is-invalid {
  469. border-color: rgba(224, 49, 49, 0.7);
  470. box-shadow: 0 0 0 4px rgba(224, 49, 49, 0.12);
  471. }
  472. .help {
  473. margin-top: 8px;
  474. color: rgba(85, 99, 122, 0.92);
  475. font-size: 13px;
  476. line-height: 1.35;
  477. }
  478. .checkbox-row {
  479. display: flex;
  480. gap: 8px;
  481. align-items: center;
  482. margin-top: 8px;
  483. }
  484. .collapse {
  485. border: 1px solid var(--border);
  486. background: var(--bg);
  487. border-radius: 12px;
  488. overflow: hidden;
  489. }
  490. .collapse + .collapse {
  491. margin-top: var(--space-3);
  492. }
  493. .collapse-head {
  494. display: flex;
  495. align-items: center;
  496. justify-content: space-between;
  497. width: 100%;
  498. padding: 12px 12px;
  499. background: var(--bg2);
  500. border: 0;
  501. cursor: pointer;
  502. font-weight: 750;
  503. text-align: left;
  504. }
  505. .collapse-body {
  506. padding: 12px;
  507. }
  508. .collapse[data-open="0"] .collapse-body {
  509. display: none;
  510. }
  511. .collapse-icon {
  512. transition: transform 160ms ease;
  513. }
  514. .collapse[data-open="0"] .collapse-icon {
  515. transform: rotate(-90deg);
  516. }
  517. .form-section {
  518. border: 1px solid var(--border);
  519. background: var(--bg);
  520. border-radius: 12px;
  521. padding: var(--space-3);
  522. }
  523. .form-section-title {
  524. font-weight: 700;
  525. margin: 0 0 var(--space-2);
  526. }
  527. .form-grid {
  528. display: grid;
  529. grid-template-columns: repeat(2, minmax(0, 1fr));
  530. gap: var(--space-3);
  531. }
  532. .form-grid .label {
  533. margin-top: 0;
  534. }
  535. .form-grid .input {
  536. min-width: 0;
  537. width: 100%;
  538. }
  539. .md-editor {
  540. border: 1px solid var(--border);
  541. border-radius: 12px;
  542. overflow: hidden;
  543. background: var(--bg);
  544. }
  545. .md-editor-toolbar {
  546. padding: 10px;
  547. background: var(--bg2);
  548. border-bottom: 1px solid var(--border);
  549. }
  550. .md-editor-body {
  551. display: grid;
  552. grid-template-columns: 1fr;
  553. gap: var(--space-3);
  554. padding: 12px;
  555. }
  556. .md-editor-preview {
  557. border: 1px solid var(--border);
  558. border-radius: 10px;
  559. padding: 12px;
  560. background: var(--bg);
  561. min-height: 220px;
  562. }
  563. .md-toc {
  564. border: 1px solid var(--border);
  565. background: var(--bg2);
  566. border-radius: 10px;
  567. padding: 10px 12px;
  568. margin-bottom: 10px;
  569. }
  570. .md-toc-title {
  571. font-weight: 750;
  572. margin-bottom: 6px;
  573. display: flex;
  574. align-items: center;
  575. justify-content: space-between;
  576. }
  577. .md-toc-items {
  578. display: grid;
  579. gap: 6px;
  580. }
  581. .md-toc-item {
  582. display: inline-flex;
  583. align-items: center;
  584. gap: 8px;
  585. padding: 6px 8px;
  586. border-radius: 10px;
  587. border: 1px solid transparent;
  588. background: transparent;
  589. cursor: pointer;
  590. color: var(--text);
  591. text-align: left;
  592. }
  593. .md-toc-item:hover {
  594. border-color: rgba(10, 102, 255, 0.18);
  595. background: rgba(10, 102, 255, 0.06);
  596. }
  597. .md-editor[data-view="edit"] .md-editor-preview {
  598. display: none;
  599. }
  600. .md-editor[data-view="preview"] .md-editor-input {
  601. display: none;
  602. }
  603. .md-editor[data-view="split"] .md-editor-body {
  604. grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  605. }
  606. @media (max-width: 720px) {
  607. .md-editor[data-view="split"] .md-editor-body {
  608. grid-template-columns: 1fr;
  609. }
  610. }
  611. @media (max-width: 720px) {
  612. .form-grid {
  613. grid-template-columns: 1fr;
  614. }
  615. }
  616. .form-msg {
  617. padding: 10px 12px;
  618. border-radius: 12px;
  619. border: 1px solid var(--border);
  620. background: var(--bg2);
  621. margin-top: var(--space-2);
  622. white-space: pre-wrap;
  623. word-break: break-word;
  624. }
  625. .toast-error {
  626. position: fixed;
  627. left: 16px;
  628. right: 16px;
  629. bottom: 16px;
  630. z-index: 100;
  631. max-width: 560px;
  632. margin: 0 auto;
  633. padding: 12px 14px;
  634. border-radius: 14px;
  635. border: 1px solid rgba(224, 49, 49, 0.25);
  636. background: rgba(224, 49, 49, 0.06);
  637. color: var(--danger);
  638. box-shadow: var(--shadow);
  639. }
  640. .toast-success {
  641. position: fixed;
  642. left: 16px;
  643. right: 16px;
  644. bottom: 16px;
  645. z-index: 100;
  646. max-width: 560px;
  647. margin: 0 auto;
  648. padding: 12px 14px;
  649. border-radius: 14px;
  650. border: 1px solid rgba(47, 158, 68, 0.25);
  651. background: rgba(47, 158, 68, 0.06);
  652. color: var(--success);
  653. box-shadow: var(--shadow);
  654. }
  655. .section-label {
  656. margin-top: 16px;
  657. }
  658. .grid {
  659. display: grid;
  660. grid-template-columns: repeat(3, minmax(0, 1fr));
  661. gap: var(--space-4);
  662. }
  663. @media (max-width: 980px) {
  664. .grid {
  665. grid-template-columns: repeat(2, minmax(0, 1fr));
  666. }
  667. }
  668. @media (max-width: 768px) {
  669. .topbar-inner {
  670. flex-direction: column;
  671. height: auto;
  672. padding: 12px 0;
  673. gap: 12px;
  674. }
  675. .nav {
  676. width: 100%;
  677. justify-content: center;
  678. flex-wrap: wrap;
  679. gap: 12px;
  680. }
  681. .nav-group {
  682. justify-content: center;
  683. }
  684. .brand {
  685. margin-right: 0;
  686. }
  687. }
  688. @media (max-width: 640px) {
  689. .grid {
  690. grid-template-columns: 1fr;
  691. }
  692. }
  693. .card {
  694. border: 1px solid var(--border);
  695. border-radius: var(--radius);
  696. padding: var(--space-4);
  697. background: var(--bg);
  698. box-shadow: var(--shadow);
  699. transition: transform 140ms ease, box-shadow 160ms ease, border-color 160ms ease;
  700. }
  701. .card:hover {
  702. transform: translateY(-1px);
  703. box-shadow: var(--shadow-lg);
  704. border-color: rgba(10, 102, 255, 0.18);
  705. }
  706. body[data-page="admin"] .card:hover,
  707. body[data-page="admin_login"] .card:hover {
  708. transform: none;
  709. box-shadow: var(--shadow);
  710. border-color: var(--border);
  711. }
  712. .skeleton {
  713. background: linear-gradient(90deg, rgba(0,0,0,0.06) 0%, rgba(0,0,0,0.03) 20%, rgba(0,0,0,0.06) 40%);
  714. background-size: 200% 100%;
  715. animation: shimmer 1.2s ease-in-out infinite;
  716. }
  717. .skeleton-line {
  718. height: 14px;
  719. border-radius: 10px;
  720. margin: 10px 0;
  721. }
  722. .skeleton-pill {
  723. height: 18px;
  724. width: 88px;
  725. border-radius: 999px;
  726. }
  727. @keyframes shimmer {
  728. 0% { background-position: 200% 0; }
  729. 100% { background-position: -200% 0; }
  730. }
  731. .card h3 {
  732. margin: 0 0 var(--space-2);
  733. font-size: 18px;
  734. }
  735. .muted {
  736. color: var(--muted);
  737. }
  738. .list {
  739. display: grid;
  740. gap: var(--space-3);
  741. }
  742. .label {
  743. display: block;
  744. margin: 10px 0 6px;
  745. color: var(--muted);
  746. }
  747. .split {
  748. display: grid;
  749. grid-template-columns: 320px 1fr;
  750. gap: var(--space-4);
  751. }
  752. @media (max-width: 1000px) {
  753. .split {
  754. grid-template-columns: 1fr;
  755. }
  756. }
  757. .me-info-grid {
  758. display: grid;
  759. gap: 12px;
  760. }
  761. .me-info-row {
  762. display: grid;
  763. grid-template-columns: 120px 1fr;
  764. align-items: center;
  765. gap: 16px;
  766. padding: 12px 14px;
  767. border: 1px solid var(--border);
  768. border-radius: 12px;
  769. background: var(--bg2);
  770. }
  771. .me-info-label {
  772. display: inline-flex;
  773. align-items: center;
  774. gap: 8px;
  775. color: var(--muted);
  776. font-size: 0.95rem;
  777. }
  778. .me-info-label i {
  779. color: var(--muted);
  780. }
  781. .me-info-value {
  782. display: flex;
  783. align-items: center;
  784. gap: 10px;
  785. min-width: 0;
  786. font-weight: 600;
  787. }
  788. @media (max-width: 640px) {
  789. .me-info-row {
  790. grid-template-columns: 1fr;
  791. gap: 8px;
  792. }
  793. .me-info-value {
  794. font-weight: 550;
  795. }
  796. }
  797. .code {
  798. white-space: pre-wrap;
  799. border: 1px solid var(--border);
  800. border-radius: var(--radius);
  801. padding: var(--space-4);
  802. background: var(--bg2);
  803. min-height: 300px;
  804. overflow: auto;
  805. }
  806. .pager {
  807. display: flex;
  808. gap: var(--space-2);
  809. align-items: center;
  810. margin-top: var(--space-3);
  811. }
  812. .admin-layout .pager {
  813. justify-content: flex-end;
  814. }
  815. .breadcrumb {
  816. display: flex;
  817. gap: var(--space-2);
  818. flex-wrap: wrap;
  819. margin: var(--space-2) 0 var(--space-3);
  820. }
  821. .breadcrumb a {
  822. color: var(--muted);
  823. text-decoration: none;
  824. }
  825. .badge {
  826. display: inline-flex;
  827. align-items: center;
  828. padding: 2px 8px;
  829. border-radius: 999px;
  830. font-size: 12px;
  831. line-height: 18px;
  832. border: 1px solid var(--border);
  833. color: var(--muted);
  834. background: var(--bg2);
  835. }
  836. .badge-free {
  837. color: var(--success);
  838. border-color: rgba(47, 158, 68, 0.25);
  839. background: rgba(47, 158, 68, 0.06);
  840. }
  841. .badge-vip {
  842. color: #b45309;
  843. border-color: rgba(180, 83, 9, 0.25);
  844. background: rgba(180, 83, 9, 0.08);
  845. }
  846. .badge-success {
  847. color: var(--success);
  848. border-color: rgba(47, 158, 68, 0.25);
  849. background: rgba(47, 158, 68, 0.06);
  850. }
  851. .badge-danger {
  852. color: var(--danger);
  853. border-color: rgba(224, 49, 49, 0.25);
  854. background: rgba(224, 49, 49, 0.06);
  855. }
  856. .badge-warning {
  857. color: var(--warning);
  858. border-color: rgba(240, 140, 0, 0.25);
  859. background: rgba(240, 140, 0, 0.08);
  860. }
  861. .badge-info {
  862. color: var(--brand);
  863. border-color: rgba(10, 102, 255, 0.25);
  864. background: rgba(10, 102, 255, 0.06);
  865. }
  866. .table {
  867. width: 100%;
  868. min-width: 800px;
  869. border-collapse: separate;
  870. border-spacing: 0;
  871. table-layout: fixed;
  872. }
  873. .table th, .table td {
  874. padding: 10px 12px;
  875. border-bottom: 1px solid var(--border);
  876. text-align: left;
  877. vertical-align: top;
  878. white-space: nowrap;
  879. overflow: hidden;
  880. text-overflow: ellipsis;
  881. }
  882. .table td.table-empty {
  883. padding: 18px 12px;
  884. text-align: center;
  885. white-space: normal;
  886. }
  887. .table thead th {
  888. background: var(--bg2);
  889. color: var(--muted);
  890. font-weight: 600;
  891. position: sticky;
  892. top: 0;
  893. z-index: 1;
  894. }
  895. .table tbody tr {
  896. transition: background 160ms ease;
  897. }
  898. .table tbody tr:nth-child(even) {
  899. background: #fbfcfe;
  900. }
  901. .table tbody tr:hover {
  902. background: #f1f5f9;
  903. }
  904. .kpis {
  905. display: grid;
  906. grid-template-columns: repeat(4, minmax(0, 1fr));
  907. gap: var(--space-4);
  908. }
  909. .kpi {
  910. border: 1px solid var(--border);
  911. border-radius: var(--radius);
  912. padding: var(--space-4);
  913. background: var(--bg);
  914. box-shadow: var(--shadow);
  915. }
  916. .admin-layout {
  917. display: grid;
  918. grid-template-columns: 220px 1fr;
  919. gap: var(--space-4);
  920. }
  921. .table-wrap {
  922. width: 100%;
  923. overflow-x: auto;
  924. overflow-y: auto;
  925. border: 1px solid var(--border);
  926. border-radius: var(--radius);
  927. background: var(--bg);
  928. box-shadow: var(--shadow);
  929. }
  930. .sider {
  931. border: 1px solid var(--border);
  932. border-radius: var(--radius);
  933. background: var(--bg);
  934. padding: var(--space-4);
  935. height: fit-content;
  936. position: sticky;
  937. top: 80px;
  938. }
  939. @media (max-width: 980px) {
  940. .kpis {
  941. grid-template-columns: repeat(2, minmax(0, 1fr));
  942. }
  943. .admin-layout {
  944. grid-template-columns: 1fr;
  945. }
  946. .sider {
  947. position: static;
  948. top: 0;
  949. }
  950. }
  951. @media (max-width: 640px) {
  952. .kpis {
  953. grid-template-columns: 1fr;
  954. }
  955. }
  956. .sider-title {
  957. font-weight: 700;
  958. margin-bottom: var(--space-3);
  959. }
  960. .menu {
  961. display: grid;
  962. gap: var(--space-2);
  963. }
  964. .menu-item {
  965. display: block;
  966. text-decoration: none;
  967. color: var(--text);
  968. padding: 10px 12px;
  969. border-radius: 10px;
  970. }
  971. .menu-item:hover {
  972. background: var(--bg2);
  973. }
  974. .menu-item.active {
  975. background: #eef4ff;
  976. color: var(--brand);
  977. }
  978. .sider-footer {
  979. margin-top: var(--space-4);
  980. }
  981. .content {
  982. min-height: 60vh;
  983. }
  984. body[data-page="admin"] .content {
  985. min-height: 0;
  986. }
  987. body[data-page="admin"] .footer {
  988. display: none;
  989. }
  990. .admin-layout .content-section {
  991. border: 1px solid var(--border);
  992. border-radius: var(--radius);
  993. background: var(--bg);
  994. box-shadow: var(--shadow);
  995. padding: var(--space-4);
  996. }
  997. .admin-layout .content-section .toolbar {
  998. margin: 0 0 var(--space-3);
  999. }
  1000. .admin-layout .content-section .table-wrap {
  1001. box-shadow: none;
  1002. }
  1003. .admin-layout .content-section .card {
  1004. box-shadow: none;
  1005. }
  1006. .admin-layout .metric-card {
  1007. display: flex;
  1008. flex-direction: column;
  1009. gap: 6px;
  1010. min-height: 96px;
  1011. }
  1012. .admin-layout .metric-label {
  1013. font-size: 13px;
  1014. }
  1015. .admin-layout .metric-value {
  1016. font-size: 28px;
  1017. font-weight: 800;
  1018. letter-spacing: -0.4px;
  1019. }
  1020. .admin-layout .metric-sub {
  1021. font-size: 13px;
  1022. }
  1023. .admin-layout .settings-card {
  1024. padding: var(--space-4);
  1025. }
  1026. .admin-layout .settings-toolbar {
  1027. gap: var(--space-2);
  1028. }
  1029. .admin-layout .settings-search {
  1030. flex: 1;
  1031. min-width: 220px;
  1032. }
  1033. .admin-layout .settings-nav {
  1034. width: 100%;
  1035. }
  1036. .admin-layout .settings-nav .btn {
  1037. white-space: nowrap;
  1038. }
  1039. .admin-layout #settingsGroups.is-tabs .settings-group {
  1040. display: none;
  1041. }
  1042. .admin-layout #settingsGroups.is-tabs .settings-group.is-active {
  1043. display: block;
  1044. }
  1045. .admin-layout .collapse-head-left {
  1046. display: flex;
  1047. flex-direction: column;
  1048. gap: 2px;
  1049. min-width: 0;
  1050. }
  1051. .admin-layout .settings-group-title {
  1052. font-weight: 800;
  1053. }
  1054. .admin-layout .settings-group-desc {
  1055. font-weight: 550;
  1056. font-size: 13px;
  1057. overflow: hidden;
  1058. text-overflow: ellipsis;
  1059. white-space: nowrap;
  1060. }
  1061. .admin-layout .settings-group .collapse-head {
  1062. gap: 10px;
  1063. }
  1064. .admin-layout .settings-checkbox {
  1065. margin-top: 6px;
  1066. }
  1067. .admin-layout .settings-group-toolbar {
  1068. margin: 0 0 var(--space-3);
  1069. justify-content: flex-end;
  1070. gap: var(--space-2);
  1071. }
  1072. .secret-textarea {
  1073. font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  1074. -webkit-text-security: disc;
  1075. }
  1076. .secret-textarea.is-revealed {
  1077. -webkit-text-security: none;
  1078. }
  1079. .table td.td-actions {
  1080. white-space: nowrap;
  1081. overflow: visible;
  1082. }
  1083. .td-actions .btn-group {
  1084. justify-content: flex-end;
  1085. flex-wrap: nowrap;
  1086. }
  1087. .admin-layout #userTable {
  1088. min-width: 0;
  1089. }
  1090. .admin-layout #userTable td.td-actions {
  1091. white-space: nowrap;
  1092. }
  1093. .admin-layout #userTable .td-actions .btn-group {
  1094. flex-wrap: nowrap;
  1095. }
  1096. .admin-layout .table td .btn,
  1097. .modal .table td .btn {
  1098. padding: 6px 10px;
  1099. border-radius: 8px;
  1100. font-size: 13px;
  1101. }
  1102. .upload-thumb {
  1103. width: 56px;
  1104. height: 40px;
  1105. object-fit: cover;
  1106. border-radius: 10px;
  1107. border: 1px solid var(--border);
  1108. background: var(--bg2);
  1109. }
  1110. .upload-name {
  1111. font-weight: 600;
  1112. word-break: break-all;
  1113. }
  1114. .upload-url {
  1115. font-size: 12px;
  1116. word-break: break-all;
  1117. }
  1118. .auth-card {
  1119. max-width: 520px;
  1120. margin: 0 auto;
  1121. }
  1122. .auth-card-title {
  1123. margin: 0 0 var(--space-3);
  1124. font-size: 20px;
  1125. }
  1126. .auth-card-form {
  1127. max-width: none;
  1128. }
  1129. .auth-card-actions {
  1130. margin: var(--space-3) 0 0;
  1131. }
  1132. .auth-card-msg {
  1133. margin-top: var(--space-2);
  1134. }
  1135. .content-header {
  1136. display: flex;
  1137. align-items: center;
  1138. justify-content: space-between;
  1139. margin-bottom: var(--space-3);
  1140. }
  1141. .md {
  1142. color: var(--text);
  1143. }
  1144. .md h1, .md h2, .md h3 {
  1145. margin: 0 0 var(--space-2);
  1146. }
  1147. .md p {
  1148. margin: 0 0 var(--space-3);
  1149. color: var(--text);
  1150. }
  1151. .md code {
  1152. background: var(--bg2);
  1153. border: 1px solid var(--border);
  1154. border-radius: 8px;
  1155. padding: 2px 6px;
  1156. }
  1157. .md .code code {
  1158. background: transparent;
  1159. border: none;
  1160. padding: 0;
  1161. }
  1162. .md-img, .md-video {
  1163. display: block;
  1164. max-width: 100%;
  1165. border-radius: 12px;
  1166. border: 1px solid var(--border);
  1167. background: var(--bg2);
  1168. margin: var(--space-2) 0 var(--space-3);
  1169. }
  1170. .resource-card-cover {
  1171. border-radius: 12px;
  1172. border: 1px solid var(--border);
  1173. background: var(--bg2);
  1174. overflow: hidden;
  1175. aspect-ratio: 16 / 9;
  1176. margin-bottom: var(--space-3);
  1177. }
  1178. .resource-card-cover-img {
  1179. width: 100%;
  1180. height: 100%;
  1181. object-fit: cover;
  1182. display: block;
  1183. }
  1184. .resource-card-tags {
  1185. display: flex;
  1186. gap: var(--space-2);
  1187. flex-wrap: wrap;
  1188. margin: var(--space-2) 0 var(--space-2);
  1189. }
  1190. .resource-detail-head {
  1191. display: flex;
  1192. gap: var(--space-4);
  1193. align-items: flex-start;
  1194. flex-wrap: wrap;
  1195. }
  1196. .resource-detail-cover {
  1197. width: min(280px, 100%);
  1198. border-radius: 12px;
  1199. border: 1px solid var(--border);
  1200. background: var(--bg2);
  1201. object-fit: cover;
  1202. }
  1203. .cover-picker-img {
  1204. cursor: pointer;
  1205. aspect-ratio: 16 / 9;
  1206. }
  1207. .cover-picker-img:hover {
  1208. border-color: rgba(10, 102, 255, 0.35);
  1209. box-shadow: 0 0 0 4px rgba(10, 102, 255, 0.12);
  1210. }
  1211. .cover-picker-img.is-placeholder {
  1212. object-fit: contain;
  1213. padding: 18px;
  1214. }
  1215. .resource-detail-meta {
  1216. flex: 1 1 360px;
  1217. min-width: 0;
  1218. }
  1219. .resource-detail-meta h1 {
  1220. margin: 0 0 var(--space-2);
  1221. }
  1222. .resource-browser {
  1223. padding-top: 0;
  1224. }
  1225. .resource-browser-toolbar {
  1226. position: sticky;
  1227. top: 0;
  1228. z-index: 10;
  1229. padding: var(--space-2);
  1230. border: 1px solid var(--border);
  1231. border-radius: 14px;
  1232. background: rgba(255,255,255,0.92);
  1233. backdrop-filter: blur(8px) saturate(140%);
  1234. box-shadow: 0 6px 16px rgba(16, 24, 40, 0.08);
  1235. }
  1236. .resource-browser #tree .card {
  1237. padding: 12px 16px;
  1238. border-radius: 8px;
  1239. display: flex;
  1240. justify-content: space-between;
  1241. align-items: center;
  1242. gap: 12px;
  1243. transition: background-color 0.2s ease 0s, border-color 0.2s ease 0s, transform 0.2s ease 0s;
  1244. border: 1px solid transparent;
  1245. cursor: pointer;
  1246. height: 40px;
  1247. box-shadow: none;
  1248. }
  1249. .resource-browser #tree.list {
  1250. display: flex;
  1251. flex-direction: column;
  1252. gap: 8px;
  1253. }
  1254. .resource-browser #tree .card > div {
  1255. min-width: 0;
  1256. white-space: nowrap;
  1257. }
  1258. .resource-browser #tree .card > div:first-child {
  1259. overflow: hidden;
  1260. text-overflow: ellipsis;
  1261. }
  1262. .resource-browser #tree .card > .muted {
  1263. max-width: 52%;
  1264. overflow: hidden;
  1265. text-overflow: ellipsis;
  1266. text-align: right;
  1267. }
  1268. .resource-browser #tree .card:hover {
  1269. transform: translateY(-1px);
  1270. background-color: rgba(14, 165, 233, 0.05);
  1271. border-color: rgba(14, 165, 233, 0.2);
  1272. }
  1273. .resource-browser #tree .card.is-locked {
  1274. opacity: 0.7;
  1275. }
  1276. .resource-browser #tree .card.is-locked:hover {
  1277. transform: none;
  1278. }
  1279. .resource-browser .split {
  1280. height: 500px;
  1281. max-height: 500px;
  1282. overflow: hidden;
  1283. }
  1284. .resource-browser .split > div {
  1285. min-width: 0;
  1286. min-height: 0;
  1287. display: flex;
  1288. flex-direction: column;
  1289. overflow: hidden;
  1290. }
  1291. .resource-browser #tree {
  1292. flex: 1 1 auto;
  1293. min-height: 0;
  1294. overflow-y: auto;
  1295. overflow-x: hidden;
  1296. -webkit-overflow-scrolling: touch;
  1297. }
  1298. .resource-browser #fileContent {
  1299. flex: 1 1 auto;
  1300. min-height: 0;
  1301. overflow-y: auto;
  1302. overflow-x: hidden;
  1303. -webkit-overflow-scrolling: touch;
  1304. white-space: pre-wrap;
  1305. overflow-wrap: anywhere;
  1306. word-break: break-word;
  1307. }
  1308. .resource-browser #tree,
  1309. .resource-browser #fileContent {
  1310. scrollbar-width: thin;
  1311. scrollbar-color: rgba(16, 24, 40, 0.28) transparent;
  1312. }
  1313. .resource-browser #tree::-webkit-scrollbar,
  1314. .resource-browser #fileContent::-webkit-scrollbar {
  1315. width: 10px;
  1316. }
  1317. .resource-browser #tree::-webkit-scrollbar-track,
  1318. .resource-browser #fileContent::-webkit-scrollbar-track {
  1319. background: transparent;
  1320. }
  1321. .resource-browser #tree::-webkit-scrollbar-thumb,
  1322. .resource-browser #fileContent::-webkit-scrollbar-thumb {
  1323. background: rgba(16, 24, 40, 0.28);
  1324. border-radius: 999px;
  1325. border: 3px solid transparent;
  1326. background-clip: padding-box;
  1327. }
  1328. .resource-browser #tree:hover::-webkit-scrollbar-thumb,
  1329. .resource-browser #fileContent:hover::-webkit-scrollbar-thumb {
  1330. background: rgba(16, 24, 40, 0.38);
  1331. border: 3px solid transparent;
  1332. background-clip: padding-box;
  1333. }
  1334. @media (max-width: 1000px) {
  1335. .resource-browser .split {
  1336. height: auto;
  1337. max-height: none;
  1338. overflow: visible;
  1339. }
  1340. }
  1341. .resource-browser .code {
  1342. font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  1343. font-size: 13px;
  1344. line-height: 1.6;
  1345. }
  1346. .toolbar .input {
  1347. min-width: 160px;
  1348. }
  1349. @media (max-width: 1000px) {
  1350. .admin-layout {
  1351. grid-template-columns: 1fr;
  1352. }
  1353. .sider {
  1354. position: static;
  1355. top: auto;
  1356. }
  1357. .toolbar .input {
  1358. flex: 1;
  1359. min-width: 0;
  1360. }
  1361. }
  1362. .modal {
  1363. max-height: 80vh;
  1364. }
  1365. #adminModalBody {
  1366. max-height: 60vh;
  1367. overflow: auto;
  1368. }
  1369. .modal-backdrop {
  1370. position: fixed;
  1371. inset: 0;
  1372. background: rgba(18, 24, 40, 0.6);
  1373. backdrop-filter: blur(4px);
  1374. display: grid;
  1375. place-items: center;
  1376. padding: var(--space-4);
  1377. z-index: 1000;
  1378. animation: fadeIn 0.2s ease-out;
  1379. }
  1380. @keyframes fadeIn {
  1381. from { opacity: 0; }
  1382. to { opacity: 1; }
  1383. }
  1384. @keyframes slideUp {
  1385. from { transform: translateY(20px); opacity: 0; }
  1386. to { transform: translateY(0); opacity: 1; }
  1387. }
  1388. .modal {
  1389. width: min(720px, 100%);
  1390. border: 1px solid rgba(255,255,255,0.8);
  1391. border-radius: 20px;
  1392. background: var(--bg);
  1393. box-shadow: 0 20px 40px rgba(16, 24, 40, 0.2);
  1394. padding: 32px;
  1395. max-height: 85vh;
  1396. display: flex;
  1397. flex-direction: column;
  1398. animation: slideUp 0.3s cubic-bezier(0.16, 1, 0.3, 1);
  1399. }
  1400. .modal[data-size="sm"] {
  1401. width: min(640px, 100%);
  1402. }
  1403. .modal[data-size="lg"] {
  1404. width: min(1180px, 100%);
  1405. }
  1406. .modal .table-wrap {
  1407. box-shadow: none;
  1408. }
  1409. .modal-header {
  1410. display: flex;
  1411. align-items: center;
  1412. justify-content: space-between;
  1413. gap: var(--space-2);
  1414. margin-bottom: 24px;
  1415. padding-bottom: 16px;
  1416. border-bottom: 1px solid var(--border);
  1417. }
  1418. .modal-header-right {
  1419. display: flex;
  1420. align-items: center;
  1421. gap: var(--space-2);
  1422. }
  1423. .modal-title {
  1424. font-weight: 700;
  1425. font-size: 1.25rem;
  1426. color: var(--text);
  1427. display: flex;
  1428. align-items: center;
  1429. }
  1430. .modal-title i {
  1431. color: var(--brand);
  1432. margin-right: 8px;
  1433. }
  1434. #adminModalBody, #repoModalBody {
  1435. overflow: auto;
  1436. flex: 1 1 auto;
  1437. padding-right: 8px; /* for scrollbar */
  1438. }
  1439. /* Custom scrollbar for modal body */
  1440. #adminModalBody::-webkit-scrollbar, #repoModalBody::-webkit-scrollbar {
  1441. width: 6px;
  1442. }
  1443. #adminModalBody::-webkit-scrollbar-thumb, #repoModalBody::-webkit-scrollbar-thumb {
  1444. background: #cbd5e1;
  1445. border-radius: 4px;
  1446. }
  1447. .modal-footer {
  1448. display: flex;
  1449. justify-content: flex-end;
  1450. gap: 12px;
  1451. margin-top: 24px;
  1452. padding-top: 16px;
  1453. border-top: 1px solid var(--border);
  1454. }
  1455. .res-form-layout {
  1456. display: grid;
  1457. grid-template-columns: 1fr;
  1458. gap: var(--space-3);
  1459. }
  1460. .modal[data-size="lg"] .res-form-layout {
  1461. grid-template-columns: 360px minmax(0, 1fr);
  1462. align-items: start;
  1463. }
  1464. .res-form-side,
  1465. .res-form-main {
  1466. min-width: 0;
  1467. }
  1468. .res-form-side {
  1469. display: flex;
  1470. flex-direction: column;
  1471. gap: var(--space-3);
  1472. }
  1473. .collapse + .collapse {
  1474. margin-top: 0;
  1475. }
  1476. .modal[data-size="sm"] .md-editor[data-view="split"] .md-editor-body {
  1477. grid-template-columns: 1fr;
  1478. }