styles.scss 31 KB

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