styles.scss 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. @use '../../shared/ui/dropdown';
  2. :root {
  3. --brand: #2f9b82;
  4. --brand-strong: #1f7b68;
  5. --brand-deep: #155d50;
  6. --brand-pale: #e8f5f1;
  7. --brand-wash: #f1f8f6;
  8. --accent: #f59b23;
  9. --accent-strong: #df8211;
  10. --accent-pale: #fff3dc;
  11. --rose: #a34d67;
  12. --rose-pale: #faeaf0;
  13. --blue: #4f73aa;
  14. --blue-pale: #eaf0f9;
  15. --danger: #c94f4f;
  16. --danger-pale: #fff0ef;
  17. --success: #2f8b61;
  18. --ink: #172522;
  19. --ink-soft: #697673;
  20. --ink-faint: #96a29f;
  21. --surface: #ffffff;
  22. --surface-muted: #f4f7f6;
  23. --surface-hover: #f1f6f4;
  24. --line: #dce5e2;
  25. --line-soft: #eaf0ee;
  26. --radius-xs: 4px;
  27. --radius-sm: 6px;
  28. --radius-md: 8px;
  29. --radius-lg: 8px;
  30. --shadow-xs: 0 2px 8px rgb(24 54 47 / 5%);
  31. --shadow-sm: 0 5px 18px rgb(24 54 47 / 7%);
  32. --shadow-lg: 0 16px 40px rgb(24 54 47 / 16%);
  33. --shadow-brand: 0 14px 30px rgb(24 89 74 / 20%);
  34. --page-gutter: 14px;
  35. --panel-gap: 12px;
  36. --panel-radius: 8px;
  37. color-scheme: light;
  38. font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", sans-serif;
  39. font-synthesis: none;
  40. text-rendering: optimizeLegibility;
  41. }
  42. * { box-sizing: border-box; }
  43. html,
  44. body {
  45. min-height: 100%;
  46. margin: 0;
  47. color: var(--ink);
  48. background: var(--surface-muted);
  49. }
  50. body { min-width: 320px; }
  51. button,
  52. input,
  53. textarea,
  54. select { font: inherit; }
  55. button,
  56. a { -webkit-tap-highlight-color: transparent; }
  57. button { cursor: pointer; }
  58. a,
  59. button,
  60. input,
  61. textarea,
  62. select { transition: color 160ms ease, background-color 160ms ease, border-color 160ms ease, box-shadow 160ms ease, opacity 160ms ease, transform 160ms ease; }
  63. :focus-visible {
  64. outline: 3px solid rgb(245 155 35 / 48%);
  65. outline-offset: 2px;
  66. }
  67. img {
  68. max-width: 100%;
  69. object-fit: cover;
  70. }
  71. .page { padding: 16px; }
  72. .section {
  73. padding: 18px 16px;
  74. background: var(--surface);
  75. border-bottom: 1px solid var(--line-soft);
  76. }
  77. .section + .section { margin-top: 10px; }
  78. .section-title {
  79. margin: 0 0 14px;
  80. font-size: 17px;
  81. letter-spacing: 0;
  82. }
  83. .muted { color: var(--ink-soft); }
  84. .primary-button,
  85. .secondary-button,
  86. .danger-button {
  87. min-height: 46px;
  88. padding: 10px 18px;
  89. border: 1px solid transparent;
  90. border-radius: var(--radius-md);
  91. font-weight: 700;
  92. letter-spacing: 0;
  93. }
  94. .primary-button {
  95. color: white;
  96. background: var(--brand-strong);
  97. box-shadow: 0 6px 14px rgb(31 123 104 / 17%);
  98. }
  99. .secondary-button {
  100. color: var(--brand-strong);
  101. background: white;
  102. border-color: var(--brand);
  103. }
  104. .danger-button {
  105. color: white;
  106. background: var(--danger);
  107. }
  108. .primary-button:disabled,
  109. .secondary-button:disabled,
  110. .danger-button:disabled {
  111. cursor: not-allowed;
  112. opacity: 0.48;
  113. box-shadow: none;
  114. }
  115. .field { display: grid; gap: 7px; }
  116. .field + .field { margin-top: 15px; }
  117. .field label {
  118. color: var(--ink-soft);
  119. font-size: 13px;
  120. font-weight: 550;
  121. }
  122. .field input,
  123. .field textarea,
  124. .field select,
  125. input:not([type='checkbox']):not([type='radio']):not([type='range']),
  126. textarea,
  127. select {
  128. width: 100%;
  129. min-height: 46px;
  130. padding: 10px 12px;
  131. color: var(--ink);
  132. background: white;
  133. border: 1px solid var(--line);
  134. border-radius: var(--radius-sm);
  135. outline: none;
  136. }
  137. .field textarea,
  138. textarea { min-height: 110px; resize: vertical; }
  139. .field input:focus,
  140. .field textarea:focus,
  141. .field select:focus,
  142. input:focus,
  143. textarea:focus,
  144. select:focus {
  145. border-color: var(--brand);
  146. box-shadow: 0 0 0 3px rgb(47 155 130 / 12%);
  147. }
  148. .empty-state,
  149. .center-state {
  150. display: grid;
  151. min-height: 220px;
  152. padding: 28px 20px;
  153. place-items: center;
  154. color: var(--ink-soft);
  155. text-align: center;
  156. }
  157. .empty-state lucide-icon,
  158. .center-state lucide-icon { color: var(--ink-faint); }
  159. .empty-state > *,
  160. .center-state > * {
  161. min-width: 0;
  162. max-width: 100%;
  163. }
  164. .empty-state p,
  165. .center-state p {
  166. max-width: 100%;
  167. overflow-wrap: anywhere;
  168. word-break: break-word;
  169. }
  170. @media (hover: hover) {
  171. .primary-button:hover { background: var(--brand-deep); transform: translateY(-1px); }
  172. .secondary-button:hover { background: var(--brand-wash); }
  173. }
  174. @media (prefers-reduced-motion: reduce) {
  175. *,
  176. *::before,
  177. *::after {
  178. scroll-behavior: auto !important;
  179. animation-duration: 0.01ms !important;
  180. animation-iteration-count: 1 !important;
  181. transition-duration: 0.01ms !important;
  182. }
  183. }
  184. /* Shared visual language for the route families that implement the 95 migrated pages. */
  185. app-account-page .profile-header,
  186. app-appointment-page .appointment-status,
  187. app-finance-page .finance-summary,
  188. app-merchant-page :is(.stock-summary, .settle-summary),
  189. app-study-records-page :is(.mastery, .income-summary),
  190. app-team-page .team-summary,
  191. app-game-page .game-intro {
  192. background: linear-gradient(135deg, var(--brand-deep), var(--brand-strong));
  193. box-shadow: var(--shadow-brand);
  194. }
  195. app-account-page :is(.wallet-strip, .order-strip, .role-panel, .service-section, .settings-list),
  196. app-course-center-page :is(.course-band, .schedule-band),
  197. app-study-records-page :is(.filter-row, .record-tabs, .record-list),
  198. app-team-page :is(.team-stats, .detail-link, .members),
  199. app-merchant-page :is(.stock-list, .settlement-list, .settlement-preview, .sales-group),
  200. app-order-page :is(.order-tabs, .order-list),
  201. app-finance-page :is(.finance-list, .finance-actions),
  202. app-resource-page :is(.description, .action-row, .tabs, .resource-list, .detail-list),
  203. app-checkout-page :is(.checkout-section, .totals),
  204. app-product-page :is(.product-info, .product-tools, .product-content, .comments) {
  205. border-color: var(--line-soft);
  206. }
  207. app-product-list-page .product-grid article,
  208. app-appointment-page .unit-grid article,
  209. app-game-page .game-menu button,
  210. app-support-feedback-page :is(.agent-header, .message-intro),
  211. app-form-page .order-context,
  212. app-english-reading-page .question-block,
  213. app-reading-exercise .question-block {
  214. border-color: var(--line);
  215. border-radius: var(--radius-md);
  216. box-shadow: var(--shadow-xs);
  217. }
  218. app-product-list-page .product-grid article,
  219. app-game-page .game-menu button,
  220. app-appointment-page .unit-grid article { transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease; }
  221. app-resource-page :is(.resource-item, .detail-list div),
  222. app-study-records-page :is(.learning-item, .history-item, .progress-item, .income-item),
  223. app-course-center-page :is(.course-list li, .schedule-list article),
  224. app-team-page .members article,
  225. app-order-page .order-card,
  226. app-finance-page .finance-item { border-color: var(--line-soft); }
  227. app-resource-page :is(.resource-item:hover, .resource-item:focus-within),
  228. app-study-records-page :is(.learning-item:hover, .progress-item:hover),
  229. app-course-center-page .schedule-list article:hover,
  230. app-team-page .members article:hover { background: var(--surface-hover); }
  231. app-product-list-page .node-list button.active,
  232. app-study-records-page .record-tabs button.active,
  233. app-resource-page .tabs button.active,
  234. app-auth-page .mode-tabs button.active,
  235. app-login-page .mode-tabs button.active {
  236. color: var(--brand-strong);
  237. border-color: var(--brand-strong);
  238. }
  239. app-form-page :is(.audit-line, .status-line),
  240. app-auth-page .audit-notice,
  241. app-login-page .audit-notice { border-radius: var(--radius-md); }
  242. app-form-page :is(.load-error, .upload-control, .image-item),
  243. app-support-feedback-page :is(.error-state, input, textarea),
  244. app-reading-setup :is(input, select, textarea),
  245. app-english-reading-page :is(input, select, textarea) { border-radius: var(--radius-sm); }
  246. app-product-page :is(.purchase-bar),
  247. app-checkout-page footer,
  248. app-appointment-page .appointment-actions,
  249. app-reading-exercise .answer-footer {
  250. border-color: var(--line);
  251. box-shadow: 0 -8px 24px rgb(24 54 47 / 6%);
  252. backdrop-filter: blur(12px);
  253. }
  254. app-support-page .messages p,
  255. app-support-page :is(.image-message, .file-message),
  256. app-support-page form textarea { border-radius: var(--radius-md); }
  257. app-auth-page,
  258. app-login-page {
  259. background: linear-gradient(180deg, var(--brand-pale) 0, var(--surface-muted) 42%, var(--surface) 100%);
  260. }
  261. @media (hover: hover) {
  262. app-product-list-page .product-grid article:hover,
  263. app-game-page .game-menu button:hover,
  264. app-appointment-page .unit-grid article:hover {
  265. border-color: color-mix(in srgb, var(--brand) 55%, var(--line));
  266. box-shadow: var(--shadow-sm);
  267. transform: translateY(-1px);
  268. }
  269. }
  270. /* Shared page geometry: business subpages use the same inset surfaces as the main tabs. */
  271. app-learning-page .catalog-tabs {
  272. display: grid;
  273. margin: var(--panel-gap) var(--page-gutter) 0;
  274. overflow: hidden;
  275. grid-template-columns: repeat(5, minmax(0, 1fr));
  276. background: var(--surface);
  277. border: 1px solid var(--line);
  278. border-radius: var(--panel-radius);
  279. box-shadow: var(--shadow-sm);
  280. }
  281. app-learning-page .catalog-tabs button {
  282. min-width: 0;
  283. min-height: 44px;
  284. padding: 0 4px;
  285. color: var(--ink-soft);
  286. background: transparent;
  287. border: 0;
  288. border-right: 1px solid var(--line);
  289. font-size: 12px;
  290. }
  291. app-learning-page .catalog-tabs button:last-child { border-right: 0; }
  292. app-learning-page .catalog-tabs button.active { color: white; background: var(--brand-strong); font-weight: 700; }
  293. app-learning-page .unit-selection-summary {
  294. display: flex;
  295. min-height: 48px;
  296. align-items: center;
  297. justify-content: space-between;
  298. margin: var(--panel-gap) var(--page-gutter) 0;
  299. padding: 0 14px;
  300. color: var(--ink-soft);
  301. background: var(--surface);
  302. border: 1px solid var(--line);
  303. border-radius: var(--panel-radius);
  304. box-shadow: var(--shadow-sm);
  305. gap: 10px;
  306. }
  307. app-learning-page .unit-selection-summary span { font-size: 13px; }
  308. app-learning-page .unit-selection-summary strong { color: var(--brand-strong); font-size: 17px; }
  309. app-learning-page .unit-selection-summary small { font-size: 11px; }
  310. app-learning-page .node-list > button.selected { background: var(--brand-pale); }
  311. app-learning-page .node-list > button.unit-node { justify-content: flex-start !important; }
  312. app-learning-page .node-list .node-check {
  313. display: grid !important;
  314. width: 24px;
  315. height: 24px;
  316. flex: 0 0 24px;
  317. color: white;
  318. background: white;
  319. border: 1px solid #b5c6c1;
  320. border-radius: 6px;
  321. place-items: center;
  322. }
  323. app-learning-page .node-list > button.selected .node-check { background: var(--brand-strong); border-color: var(--brand-strong); }
  324. app-learning-page .node-list .node-copy { flex: 1; }
  325. app-learning-page .node-list .unit-progress-ring {
  326. display: grid;
  327. width: 44px;
  328. height: 44px;
  329. flex: 0 0 44px;
  330. margin-left: auto;
  331. position: relative;
  332. color: var(--brand-deep);
  333. background: conic-gradient(var(--brand) var(--progress, 0%), #e3ebe8 0);
  334. border-radius: 50%;
  335. place-items: center;
  336. }
  337. app-learning-page .node-list .unit-progress-ring::before {
  338. position: absolute;
  339. background: white;
  340. border-radius: 50%;
  341. content: '';
  342. inset: 5px;
  343. }
  344. app-learning-page .node-list .unit-progress-ring.complete { background: var(--brand-strong); }
  345. app-learning-page .node-list .unit-progress-ring strong { z-index: 1; font-size: 9px; }
  346. app-learning-page .unit-actions { grid-template-columns: minmax(0, 1fr) minmax(150px, 1.4fr); align-items: center; }
  347. app-learning-page .unit-actions > span { color: var(--ink-soft); font-size: 13px; text-align: center; }
  348. app-resource-page .resource-page > :is(.description, .order-context, .action-row, .tabs, .state-line, .error-state, .resource-list, .detail-list, .empty-state),
  349. app-appointment-page .appointment-page > :is(.course-section, .comment-panel, .report-panel),
  350. app-article-page .article-page > :is(header, .article-content),
  351. app-checkout-page .checkout-section,
  352. app-finance-page .balance-band,
  353. app-form-page .form-page,
  354. app-order-page .order-page > :is(header, .timeline, .order-card, .order-links),
  355. app-product-page .product-page > :is(.gallery-strip, .product-summary, .product-tools, .product-content, .comments),
  356. app-study-records-page .records-page > :is(.mastery, .income-summary, .filter-row, .record-tabs, .record-list),
  357. app-team-page :is(.team-summary, .team-stats, .detail-link, .members),
  358. app-merchant-page :is(.stock-summary, .settle-summary, .stock-list, .settlement-list, .settlement-preview, .sales-group),
  359. app-learning-page .learning-page > :is(.node-intro, .node-list, .selection-header, .word-select-list, .stage-banner, .repeat-list, .game-heading, .review-summary, .record-overview, .record-tip, .record-list, .anti-heading, .exam-status) {
  360. overflow: hidden;
  361. border: 1px solid var(--line);
  362. border-radius: var(--panel-radius);
  363. box-shadow: var(--shadow-sm);
  364. }
  365. app-resource-page .resource-page {
  366. padding: var(--panel-gap) var(--page-gutter) 24px;
  367. }
  368. app-resource-page .resource-page > :is(.description, .order-context, .action-row, .tabs, .state-line, .error-state, .resource-list, .detail-list, .empty-state) {
  369. margin: 0 0 var(--panel-gap);
  370. background: white;
  371. }
  372. app-resource-page :is(.resource-item, .detail-list div):last-child { border-bottom: 0; }
  373. app-learning-page .learning-page > :is(.node-intro, .node-list, .game-heading, .review-summary, .record-overview, .anti-heading, .exam-status) {
  374. margin: var(--panel-gap) var(--page-gutter) 0;
  375. }
  376. app-learning-page .learning-page > .node-list { margin-bottom: var(--panel-gap); }
  377. app-learning-page .learning-page > .selection-header,
  378. app-learning-page .learning-page > .stage-banner,
  379. app-learning-page .learning-page > .record-tip {
  380. margin: var(--panel-gap) var(--page-gutter) 0;
  381. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  382. }
  383. app-learning-page .learning-page > .selection-header { top: 52px; }
  384. app-learning-page .learning-page > :is(.word-select-list, .repeat-list, .record-list) {
  385. margin: 0 var(--page-gutter) var(--panel-gap);
  386. border-top: 0;
  387. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  388. }
  389. app-learning-page :is(.node-list, .word-select-list, .repeat-list, .record-list) > :last-child { border-bottom: 0; }
  390. app-learning-page .learning-page > :is(.review-list, .match-grid, .anti-grid, .option-list) {
  391. padding-right: var(--page-gutter);
  392. padding-left: var(--page-gutter);
  393. }
  394. app-learning-page .learning-page > :is(.memory-calendar, .memory-date-tasks) {
  395. margin-right: var(--page-gutter);
  396. margin-left: var(--page-gutter);
  397. }
  398. app-appointment-page .appointment-page > .appointment-status {
  399. margin: var(--panel-gap) var(--page-gutter) 0;
  400. overflow: hidden;
  401. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  402. }
  403. app-appointment-page .appointment-page > .appointment-info {
  404. margin: 0 var(--page-gutter);
  405. overflow: hidden;
  406. border: 1px solid var(--line);
  407. border-top: 0;
  408. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  409. box-shadow: var(--shadow-sm);
  410. }
  411. app-appointment-page .appointment-page > :is(.course-section, .comment-panel, .report-panel) {
  412. margin: var(--panel-gap) var(--page-gutter) 0;
  413. border-block: 1px solid var(--line);
  414. }
  415. app-article-page .article-page > :is(header, .article-content) {
  416. margin: var(--panel-gap) var(--page-gutter) 0;
  417. }
  418. app-article-page .article-video {
  419. width: calc(100% - (2 * var(--page-gutter)));
  420. margin: var(--panel-gap) var(--page-gutter) 0;
  421. overflow: hidden;
  422. border-radius: var(--panel-radius);
  423. box-shadow: var(--shadow-sm);
  424. }
  425. app-checkout-page .checkout-page { padding-top: var(--panel-gap); }
  426. app-checkout-page .checkout-section { margin: 0 var(--page-gutter) var(--panel-gap); }
  427. app-finance-page .balance-band {
  428. margin: var(--panel-gap) var(--page-gutter) 0;
  429. }
  430. app-finance-page .log-heading {
  431. margin: var(--panel-gap) var(--page-gutter) 0;
  432. overflow: hidden;
  433. border: 1px solid var(--line);
  434. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  435. box-shadow: var(--shadow-sm);
  436. }
  437. app-finance-page .finance-logs {
  438. margin: 0 var(--page-gutter) 24px;
  439. overflow: hidden;
  440. border: 1px solid var(--line);
  441. border-top: 0;
  442. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  443. box-shadow: var(--shadow-sm);
  444. }
  445. app-finance-page .finance-logs article:last-child { border-bottom: 0; }
  446. app-form-page {
  447. display: block;
  448. min-height: 100%;
  449. padding-top: 1px;
  450. background: var(--surface-muted);
  451. }
  452. app-form-page .form-page {
  453. margin: var(--panel-gap) var(--page-gutter) 24px;
  454. padding: 18px 16px 24px;
  455. background: white;
  456. }
  457. app-order-page .order-page { padding-top: 1px; }
  458. app-order-page .order-page > :is(header, .timeline, .order-card, .order-links) { margin: var(--panel-gap) var(--page-gutter) 0; }
  459. app-product-page .hero-image {
  460. display: block;
  461. width: calc(100% - (2 * var(--page-gutter)));
  462. margin: var(--panel-gap) var(--page-gutter) 0;
  463. overflow: hidden;
  464. border: 1px solid var(--line);
  465. border-radius: var(--panel-radius);
  466. box-shadow: var(--shadow-sm);
  467. }
  468. app-product-page .product-page > :is(.gallery-strip, .product-summary, .product-tools, .product-content, .comments) {
  469. margin: var(--panel-gap) var(--page-gutter) 0;
  470. }
  471. app-product-list-page .browse-page:not(.with-nodes) > .search-row {
  472. margin: var(--panel-gap) var(--page-gutter) 0;
  473. overflow: hidden;
  474. border: 1px solid var(--line);
  475. border-radius: var(--panel-radius);
  476. box-shadow: var(--shadow-sm);
  477. }
  478. app-product-list-page .browse-page:not(.with-nodes) > .product-region {
  479. padding-right: var(--page-gutter);
  480. padding-left: var(--page-gutter);
  481. }
  482. app-product-list-page .browse-page.with-nodes {
  483. width: calc(100% - (2 * var(--page-gutter)));
  484. height: calc(100dvh - 52px - (2 * var(--panel-gap)));
  485. margin: var(--panel-gap) var(--page-gutter);
  486. overflow: hidden;
  487. border: 1px solid var(--line);
  488. border-radius: var(--panel-radius);
  489. box-shadow: var(--shadow-sm);
  490. }
  491. app-team-page .team-summary { margin: var(--panel-gap) var(--page-gutter) 0; }
  492. app-team-page .team-stats {
  493. margin: var(--panel-gap) var(--page-gutter) 0;
  494. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  495. }
  496. app-team-page .detail-link {
  497. margin: 0 var(--page-gutter);
  498. border-top: 0;
  499. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  500. }
  501. app-team-page .members { margin: var(--panel-gap) var(--page-gutter) 24px; }
  502. app-team-page .members article:last-child { border-bottom: 0; }
  503. app-merchant-page :is(.stock-summary, .settle-summary) { margin: var(--panel-gap) var(--page-gutter) 0; }
  504. app-merchant-page :is(.stock-list, .settlement-list, .settlement-preview, .sales-group) { margin: var(--panel-gap) var(--page-gutter) 0; border-block: 1px solid var(--line); }
  505. app-merchant-page :is(.stock-list, .settlement-list, .sales-group) article:last-child { border-bottom: 0; }
  506. app-study-records-page .records-page > :is(.mastery, .income-summary, .filter-row, .record-tabs, .record-list) {
  507. margin: var(--panel-gap) var(--page-gutter) 0;
  508. }
  509. app-study-records-page .records-page > .record-list { margin-bottom: 24px; }
  510. app-study-records-page .current-learning-card {
  511. margin: var(--panel-gap) var(--page-gutter) 0;
  512. overflow: hidden;
  513. background: white;
  514. border: 1px solid var(--line);
  515. border-radius: var(--panel-radius);
  516. box-shadow: var(--shadow-sm);
  517. }
  518. app-study-records-page .current-learning-card > header {
  519. display: flex;
  520. min-height: 58px;
  521. align-items: center;
  522. justify-content: space-between;
  523. padding: 10px 14px;
  524. color: white;
  525. background: var(--brand-strong);
  526. gap: 12px;
  527. }
  528. app-study-records-page .current-learning-card > header > div {
  529. display: flex;
  530. min-width: 0;
  531. flex-direction: column;
  532. gap: 2px;
  533. }
  534. app-study-records-page .current-learning-card > header span { color: rgb(255 255 255 / 78%); font-size: 10px; }
  535. app-study-records-page .current-learning-card > header strong { font-size: 16px; }
  536. app-study-records-page .current-learning-list button {
  537. display: grid;
  538. width: 100%;
  539. min-height: 66px;
  540. grid-template-columns: 36px minmax(0, 1fr) auto;
  541. align-items: center;
  542. padding: 9px 14px;
  543. color: var(--ink);
  544. text-align: left;
  545. background: white;
  546. border: 0;
  547. border-bottom: 1px solid var(--line);
  548. gap: 10px;
  549. }
  550. app-study-records-page .current-learning-list button:last-child { border-bottom: 0; }
  551. app-study-records-page .current-learning-list button > i {
  552. display: grid;
  553. width: 36px;
  554. height: 36px;
  555. color: var(--brand-strong);
  556. background: var(--brand-pale);
  557. border-radius: var(--radius-md);
  558. place-items: center;
  559. }
  560. app-study-records-page .current-learning-list button > span { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  561. app-study-records-page .current-learning-list button strong,
  562. app-study-records-page .current-learning-list button small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  563. app-study-records-page .current-learning-list button strong { font-size: 13px; }
  564. app-study-records-page .current-learning-list button small { color: var(--ink-soft); font-size: 10px; }
  565. app-study-records-page .current-learning-list button:disabled { cursor: not-allowed; opacity: .58; }
  566. app-study-records-page .current-learning-list button.readonly:not(:disabled) { cursor: pointer; }
  567. app-study-records-page .current-learning-list button.readonly:disabled { opacity: .58; }
  568. app-learning-page .node-list > button.readonly { cursor: pointer; }
  569. app-learning-page .readonly-word-header { display: flex; min-height: 70px; align-items: center; justify-content: space-between; padding: 12px 16px; color: white; background: var(--brand-strong); gap: 12px; }
  570. app-learning-page .readonly-word-header > div { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  571. app-learning-page .readonly-word-header strong { font-size: 18px; }
  572. app-learning-page .readonly-word-header span { color: rgb(255 255 255 / 76%); font-size: 11px; }
  573. app-learning-page .readonly-word-header em { padding: 5px 9px; color: var(--brand-deep); background: var(--brand-pale); border-radius: 999px; font-size: 10px; font-style: normal; font-weight: 750; white-space: nowrap; }
  574. app-learning-page .readonly-word-list { background: white; }
  575. app-learning-page .readonly-word-list article { display: grid; min-height: 72px; grid-template-columns: minmax(120px, .7fr) minmax(0, 1.3fr); align-items: center; padding: 10px 16px; border-bottom: 1px solid var(--line); gap: 14px; }
  576. app-learning-page .readonly-word-list article > div { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  577. app-learning-page .readonly-word-list strong { overflow: hidden; font-size: 17px; text-overflow: ellipsis; white-space: nowrap; }
  578. app-learning-page .readonly-word-list small { color: var(--ink-soft); font-size: 12px; }
  579. app-learning-page .readonly-word-list p { margin: 0; color: var(--ink); font-size: 14px; line-height: 1.5; }
  580. app-learning-page .readonly-word-note { margin: 12px 14px 0; padding: 10px 12px; color: var(--ink-soft); background: var(--brand-wash); border: 1px solid var(--line); border-radius: var(--radius-md); font-size: 11px; line-height: 1.5; text-align: center; }
  581. app-study-records-page .current-learning-toggle {
  582. display: flex;
  583. width: 100%;
  584. min-height: 44px;
  585. align-items: center;
  586. justify-content: center;
  587. color: var(--brand-strong);
  588. background: var(--brand-pale);
  589. border: 0;
  590. border-top: 1px solid var(--line);
  591. font-size: 12px;
  592. font-weight: 750;
  593. gap: 6px;
  594. }
  595. app-study-records-page .current-learning-toggle lucide-icon { transition: transform .18s ease; transform: rotate(90deg); }
  596. app-study-records-page .current-learning-toggle.expanded lucide-icon { transform: rotate(-90deg); }
  597. app-learning-page .memory-watermark { position: absolute; top: -28px; right: -26px; color: white; opacity: .07; pointer-events: none; }
  598. app-learning-page .memory-copy { min-width: 0; }
  599. app-learning-page .memory-copy strong,
  600. app-learning-page .memory-copy small { display: block; }
  601. app-learning-page .memory-kicker { display: inline-flex; align-items: center; color: rgb(255 255 255 / 72%); font-size: 11px; font-weight: 650; gap: 5px; }
  602. app-learning-page .memory-copy strong { margin-top: 7px; color: white; font-size: 21px; line-height: 1.2; }
  603. app-learning-page .memory-copy small { margin-top: 6px; color: rgb(255 255 255 / 72%); font-size: 10px; }
  604. app-learning-page .memory-score { display: flex; width: 68px; height: 68px; flex: 0 0 68px; align-items: center; justify-content: center; color: white; background: rgb(255 255 255 / 12%); border: 1px solid rgb(255 255 255 / 32%); border-radius: 50%; box-shadow: 0 0 0 5px rgb(255 255 255 / 5%); flex-direction: column; }
  605. app-learning-page .memory-score b { font-size: 18px; line-height: 1; }
  606. app-learning-page .memory-score small { margin-top: 5px; color: rgb(255 255 255 / 70%); font-size: 8px; }
  607. app-learning-page .memory-curve { position: absolute; inset: 0; margin: 0; overflow: hidden; background: rgb(3 45 39 / 12%); pointer-events: none; z-index: 0; }
  608. app-learning-page .memory-curve figcaption { position: absolute; top: 116px; right: 20px; left: 20px; display: flex; align-items: center; justify-content: space-between; color: rgb(255 255 255 / 78%); font-size: 11px; z-index: 2; }
  609. app-learning-page .memory-curve figcaption strong { display: inline-flex; align-items: center; color: #b8ef9f; font-size: 10px; gap: 5px; }
  610. app-learning-page .memory-curve figcaption strong i { width: 6px; height: 6px; background: #8bd47a; border-radius: 50%; box-shadow: 0 0 0 3px rgb(139 212 122 / 14%); }
  611. app-learning-page .memory-curve-chart { position: absolute; top: 136px; right: 8px; bottom: 61px; left: 8px; }
  612. app-learning-page .memory-curve-chart svg { display: block; width: 100%; height: 100%; overflow: visible; }
  613. app-learning-page .memory-curve-chart text { fill: rgb(255 255 255 / 62%); font-family: inherit; font-size: 7px; }
  614. app-learning-page .memory-chart-axis { stroke: rgb(255 255 255 / 24%); stroke-width: 1; vector-effect: non-scaling-stroke; }
  615. app-learning-page .memory-forgetting-line,
  616. app-learning-page .memory-learning-line,
  617. app-learning-page .memory-review-decay { fill: none; stroke-linecap: round; vector-effect: non-scaling-stroke; }
  618. app-learning-page .memory-forgetting-line { stroke: #e58b72; stroke-dasharray: 4 4; stroke-width: 1.7; }
  619. app-learning-page .memory-learning-line { stroke: #8bd47a; stroke-width: 2.7; }
  620. app-learning-page .memory-review-decay { stroke: #ffd084; stroke-width: 1.8; }
  621. app-learning-page .memory-review-lift { stroke: #b8ef9f; stroke-dasharray: 90; stroke-dashoffset: 90; stroke-linecap: round; stroke-width: 2; vector-effect: non-scaling-stroke; animation: memory-review-lift 15s ease-out infinite; animation-delay: var(--pulse-delay); }
  622. app-learning-page .memory-review-dot { fill: #ffad32; stroke: #126c5d; stroke-width: 1.2; }
  623. app-learning-page .memory-reset-dot { fill: #8bd47a; stroke: #126c5d; stroke-width: 1.1; }
  624. app-learning-page .memory-review-ripple { fill: none; stroke: #ffd084; stroke-width: 1.2; opacity: 0; transform-box: fill-box; transform-origin: center; animation: memory-review-ripple 15s ease-out infinite; animation-delay: var(--pulse-delay); }
  625. app-learning-page .memory-review-label { fill: #ffdba0; font-size: 6px; font-weight: 700; }
  626. app-learning-page .memory-line-label { font-size: 6px; font-weight: 700; }
  627. app-learning-page .memory-line-label.forgetting { fill: #f2aa96; }
  628. app-learning-page .memory-line-label.learning { fill: #b8ef9f; }
  629. app-learning-page .memory-day-dot { fill: rgb(255 255 255 / 58%); transform-box: fill-box; transform-origin: center; animation: memory-day-pulse 12s ease-in-out infinite; animation-delay: var(--pulse-delay); }
  630. app-learning-page .memory-day-ripple { fill: none; stroke: #ffd084; stroke-width: .8; opacity: 0; transform-box: fill-box; transform-origin: center; animation: memory-day-ripple 12s ease-out infinite; animation-delay: var(--pulse-delay); }
  631. @keyframes memory-day-pulse { 0%, 9%, 100% { fill: rgb(255 255 255 / 58%); transform: scale(1); } 4.5% { fill: #ffad32; transform: scale(1.8); } }
  632. @keyframes memory-day-ripple { 0%, 100% { opacity: 0; transform: scale(.6); } 3% { opacity: .8; } 10% { opacity: 0; transform: scale(3); } }
  633. @keyframes memory-review-lift { 0%, 100% { opacity: .2; stroke-dashoffset: 90; } 5%, 14% { opacity: 1; stroke-dashoffset: 0; } 22% { opacity: .52; stroke-dashoffset: 0; } }
  634. @keyframes memory-review-ripple { 0%, 100% { opacity: 0; transform: scale(.7); } 5% { opacity: .9; } 15% { opacity: 0; transform: scale(4); } }
  635. @media (prefers-reduced-motion: reduce) {
  636. app-learning-page .memory-day-dot,
  637. app-learning-page .memory-day-ripple,
  638. app-learning-page .memory-review-lift,
  639. app-learning-page .memory-review-ripple { animation: none; }
  640. }
  641. app-study-records-page .ai-reading-feature { margin: 12px 14px 0; overflow: hidden; background: white; border: 1px solid color-mix(in srgb, var(--brand-strong) 34%, var(--line)); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
  642. app-study-records-page .ai-reading-visual { position: relative; min-height: 230px; overflow: hidden; background: #116b5a; }
  643. app-study-records-page .ai-reading-visual > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: left center; }
  644. app-study-records-page .ai-reading-copy { display: flex; width: 52%; min-height: 230px; padding: 18px 0 18px 18px; position: relative; z-index: 1; align-items: flex-start; color: white; flex-direction: column; }
  645. app-study-records-page .ai-reading-eyebrow { display: inline-flex; align-items: center; color: #dff8ef; font-size: 11px; font-weight: 700; gap: 6px; }
  646. app-study-records-page .ai-reading-copy h2 { margin: 10px 0 7px; font-size: 23px; line-height: 1.28; letter-spacing: 0; }
  647. app-study-records-page .ai-reading-copy p { width: 185px; margin: 0; color: rgb(255 255 255 / 82%); font-size: 12px; line-height: 1.6; }
  648. app-study-records-page .ai-reading-cta { display: inline-flex; min-height: 44px; margin-top: auto; padding: 0 12px; align-items: center; justify-content: center; color: #14352f; background: var(--accent); border: 0; border-radius: var(--radius-sm); box-shadow: 0 6px 16px rgb(6 47 39 / 24%); font-size: 12px; font-weight: 750; gap: 7px; }
  649. app-study-records-page .ai-reading-cta:disabled { color: rgb(255 255 255 / 72%); background: rgb(255 255 255 / 14%); box-shadow: none; cursor: not-allowed; }
  650. app-study-records-page .ai-reading-flow { display: grid; min-height: 62px; margin: 0; padding: 0 8px; list-style: none; grid-template-columns: repeat(4, minmax(0, 1fr)); }
  651. app-study-records-page .ai-reading-flow li { display: flex; min-width: 0; align-items: center; justify-content: center; position: relative; color: var(--ink-soft); font-size: 10px; flex-direction: column; gap: 4px; }
  652. app-study-records-page .ai-reading-flow li:not(:last-child)::after { width: 1px; height: 24px; position: absolute; top: 19px; right: 0; background: var(--line); content: ''; }
  653. app-study-records-page .ai-reading-flow b { display: grid; width: 20px; height: 20px; color: white; background: var(--brand-strong); border-radius: 50%; font-size: 10px; place-items: center; }
  654. app-study-records-page .ai-reading-flow span { overflow: hidden; max-width: 100%; text-overflow: ellipsis; white-space: nowrap; }
  655. app-learning-page .word-refine-item { background: white; border-bottom: 1px solid var(--line); }
  656. app-learning-page .word-refine-item.selected { background: var(--brand-pale); }
  657. app-learning-page .word-refine-item:last-child { border-bottom: 0; }
  658. app-learning-page .word-refine-main { display: grid; min-height: 72px; align-items: center; padding: 8px 14px; grid-template-columns: 32px minmax(0, 1fr) 34px; gap: 10px; }
  659. app-learning-page .word-select-check { display: grid; width: 32px; height: 32px; padding: 0; color: white; background: white; border: 1px solid var(--line); border-radius: var(--radius-sm); place-items: center; }
  660. app-learning-page .word-select-check[aria-pressed='true'] { background: var(--brand-strong); border-color: var(--brand-strong); }
  661. app-learning-page .word-reveal { display: flex; min-width: 0; min-height: 52px; padding: 5px 0; align-items: flex-start; color: var(--ink); text-align: left; background: transparent; border: 0; flex-direction: column; gap: 5px; }
  662. app-learning-page .word-reveal strong { font-size: 18px; }
  663. app-learning-page .word-reveal small { overflow: hidden; max-width: 100%; color: var(--ink-faint); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
  664. app-learning-page .word-reveal small.revealed { color: var(--ink-soft); font-size: 13px; }
  665. app-learning-page .word-refine-main .audio { display: grid; width: 34px; height: 34px; color: var(--brand-strong); place-items: center; }
  666. app-learning-page .word-assessment { display: grid; padding: 0 14px 12px 56px; grid-template-columns: minmax(0, .85fr) minmax(0, 1.45fr); gap: 7px; }
  667. app-learning-page .word-assessment > span { grid-column: 1 / -1; color: var(--ink-soft); font-size: 10px; }
  668. app-learning-page .word-assessment button { display: inline-flex; min-width: 0; min-height: 38px; padding: 0 9px; align-items: center; justify-content: center; background: white; border: 1px solid var(--line); border-radius: var(--radius-sm); font-size: 11px; font-weight: 650; gap: 5px; }
  669. app-learning-page .word-assessment .known-button { color: var(--brand-strong); }
  670. app-learning-page .word-assessment .unknown-button { color: #9a6407; }
  671. app-learning-page .word-assessment .known-button.active { color: white; background: var(--brand-strong); border-color: var(--brand-strong); }
  672. app-learning-page .word-assessment .unknown-button.active { color: #4d3100; background: var(--accent-soft); border-color: var(--accent); }
  673. @media (hover: hover) { app-study-records-page .ai-reading-cta:not(:disabled):hover { filter: brightness(1.04); transform: translateY(-1px); } }
  674. @media (prefers-reduced-motion: reduce) { app-study-records-page .ai-reading-cta { transition: none; } }
  675. @media (max-width: 360px) { app-study-records-page .ai-reading-feature { margin-inline: 10px; } app-study-records-page .ai-reading-copy { width: 58%; padding-left: 14px; } app-study-records-page .ai-reading-copy h2 { font-size: 21px; } app-study-records-page .ai-reading-copy p { width: 160px; } app-study-records-page .ai-reading-cta { padding-inline: 9px; } }
  676. @media (max-width: 360px) { app-learning-page .word-assessment { padding-left: 14px; } }
  677. @media (min-width: 500px) { app-study-records-page .ai-reading-copy { width: 44%; max-width: 334px; } app-study-records-page .ai-reading-copy p { width: 230px; } }
  678. @media (max-width: 360px) {
  679. :root { --page-gutter: 10px; }
  680. }
  681. /* Compact selectors in technical resource toolbars keep their horizontal layout. */
  682. body .bulk-toolbar > button.xs-dropdown-trigger { flex: 0 0 auto; width: auto; min-width: 130px; min-height: 38px; padding-block: 8px; font-size: 12px; }