styles.scss 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  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. /* Shared student read-only vocabulary card used from study history and companion center. */
  58. .readonly-word-card {
  59. margin: 14px 14px 20px;
  60. overflow: hidden;
  61. background: white;
  62. border: 1px solid var(--line);
  63. border-radius: var(--radius-lg);
  64. box-shadow: var(--shadow-sm);
  65. }
  66. .readonly-word-header { display: flex; min-height: 106px; align-items: center; justify-content: space-between; padding: 20px 18px; color: white; background: var(--brand-strong); gap: 14px; }
  67. .readonly-word-header > div { display: flex; min-width: 0; flex-direction: column; gap: 5px; }
  68. .readonly-word-header strong { font-size: 22px; line-height: 1.25; }
  69. .readonly-word-header span { color: rgb(255 255 255 / 78%); font-size: 13px; }
  70. .readonly-word-header em { flex: 0 0 auto; padding: 7px 12px; color: var(--brand-deep); background: var(--brand-pale); border-radius: 999px; font-size: 12px; font-style: normal; font-weight: 750; white-space: nowrap; }
  71. .readonly-word-list article { display: grid; min-height: 88px; grid-template-columns: minmax(112px, .72fr) minmax(0, 1.28fr); align-items: center; padding: 16px 18px; border-bottom: 1px solid var(--line); gap: 18px; }
  72. .readonly-word-list article:last-child { border-bottom: 0; }
  73. .readonly-word-list article > div { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  74. .readonly-word-list strong { overflow-wrap: anywhere; color: var(--ink); font-size: 18px; line-height: 1.3; }
  75. .readonly-word-list small { color: var(--ink-soft); font-size: 12px; }
  76. .readonly-word-list p { margin: 0; overflow-wrap: anywhere; color: var(--ink); font-size: 15px; line-height: 1.6; }
  77. .readonly-word-note { margin: 0; padding: 13px 18px; color: var(--ink-soft); background: var(--surface-muted); font-size: 12px; line-height: 1.6; }
  78. @media (max-width: 360px) {
  79. .readonly-word-card { margin-inline: 10px; }
  80. .readonly-word-list article { grid-template-columns: minmax(92px, .7fr) minmax(0, 1.3fr); padding-inline: 14px; gap: 12px; }
  81. }
  82. button { cursor: pointer; }
  83. .spin { animation: spin .8s linear infinite; }
  84. @keyframes spin { to { transform: rotate(360deg); } }
  85. app-learning-page .memory-loading-label { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
  86. app-learning-page .memory-list-loading { display: flex; min-height: 150px; align-items: center; justify-content: center; padding: 28px 20px; color: var(--brand-strong); text-align: center; flex-direction: column; gap: 7px; }
  87. app-learning-page .memory-list-loading strong { color: var(--ink); font-size: 14px; }
  88. app-learning-page .memory-list-loading span { color: var(--ink-soft); font-size: 11px; }
  89. app-learning-page .memory-list-loading.error { color: #b14f45; }
  90. app-learning-page .memory-list-loading button { min-height: 36px; margin-top: 4px; padding: 0 14px; color: var(--brand-strong); font-weight: 700; background: white; border: 1px solid var(--line); border-radius: 7px; }
  91. a,
  92. button,
  93. input,
  94. textarea,
  95. select { transition: color 160ms ease, background-color 160ms ease, border-color 160ms ease, box-shadow 160ms ease, opacity 160ms ease, transform 160ms ease; }
  96. :focus-visible {
  97. outline: 3px solid rgb(245 155 35 / 48%);
  98. outline-offset: 2px;
  99. }
  100. img {
  101. max-width: 100%;
  102. object-fit: cover;
  103. }
  104. .page { padding: 16px; }
  105. .section {
  106. padding: 18px 16px;
  107. background: var(--surface);
  108. border-bottom: 1px solid var(--line-soft);
  109. }
  110. .section + .section { margin-top: 10px; }
  111. .section-title {
  112. margin: 0 0 14px;
  113. font-size: 17px;
  114. letter-spacing: 0;
  115. }
  116. .muted { color: var(--ink-soft); }
  117. .primary-button,
  118. .secondary-button,
  119. .danger-button {
  120. min-height: 46px;
  121. padding: 10px 18px;
  122. border: 1px solid transparent;
  123. border-radius: var(--radius-md);
  124. font-weight: 700;
  125. letter-spacing: 0;
  126. }
  127. .primary-button {
  128. color: white;
  129. background: var(--brand-strong);
  130. box-shadow: 0 6px 14px rgb(31 123 104 / 17%);
  131. }
  132. .secondary-button {
  133. color: var(--brand-strong);
  134. background: white;
  135. border-color: var(--brand);
  136. }
  137. .danger-button {
  138. color: white;
  139. background: var(--danger);
  140. }
  141. .primary-button:disabled,
  142. .secondary-button:disabled,
  143. .danger-button:disabled {
  144. cursor: not-allowed;
  145. opacity: 0.48;
  146. box-shadow: none;
  147. }
  148. .field { display: grid; gap: 7px; }
  149. .field + .field { margin-top: 15px; }
  150. .field label {
  151. color: var(--ink-soft);
  152. font-size: 13px;
  153. font-weight: 550;
  154. }
  155. .field input,
  156. .field textarea,
  157. .field select,
  158. input:not([type='checkbox']):not([type='radio']):not([type='range']),
  159. textarea,
  160. select {
  161. width: 100%;
  162. min-height: 46px;
  163. padding: 10px 12px;
  164. color: var(--ink);
  165. background: white;
  166. border: 1px solid var(--line);
  167. border-radius: var(--radius-sm);
  168. outline: none;
  169. }
  170. .field textarea,
  171. textarea { min-height: 110px; resize: vertical; }
  172. .field input:focus,
  173. .field textarea:focus,
  174. .field select:focus,
  175. input:focus,
  176. textarea:focus,
  177. select:focus {
  178. border-color: var(--brand);
  179. box-shadow: 0 0 0 3px rgb(47 155 130 / 12%);
  180. }
  181. /* The course-history month picker has a leading calendar icon outside the
  182. shared dropdown trigger. Keep independent space for the icon and arrow. */
  183. body app-course-center-page .history-filter-control.month-control > button.xs-dropdown-trigger,
  184. body app-course-center-page .history-filter-control.student-control > button.xs-dropdown-trigger {
  185. height: 46px;
  186. min-height: 46px;
  187. padding-right: 18px;
  188. padding-left: 42px;
  189. border-radius: 11px;
  190. box-shadow: 0 3px 10px rgb(20 53 45 / 4%);
  191. font-size: 13px;
  192. }
  193. .empty-state,
  194. .center-state {
  195. display: grid;
  196. min-height: 220px;
  197. padding: 28px 20px;
  198. place-items: center;
  199. color: var(--ink-soft);
  200. text-align: center;
  201. }
  202. .empty-state lucide-icon,
  203. .center-state lucide-icon { color: var(--ink-faint); }
  204. .empty-state > *,
  205. .center-state > * {
  206. min-width: 0;
  207. max-width: 100%;
  208. }
  209. .empty-state p,
  210. .center-state p {
  211. max-width: 100%;
  212. overflow-wrap: anywhere;
  213. word-break: break-word;
  214. }
  215. @media (hover: hover) {
  216. .primary-button:hover { background: var(--brand-deep); transform: translateY(-1px); }
  217. .secondary-button:hover { background: var(--brand-wash); }
  218. }
  219. @media (prefers-reduced-motion: reduce) {
  220. *,
  221. *::before,
  222. *::after {
  223. scroll-behavior: auto !important;
  224. animation-duration: 0.01ms !important;
  225. animation-iteration-count: 1 !important;
  226. transition-duration: 0.01ms !important;
  227. }
  228. }
  229. /* Shared visual language for the route families that implement the 95 migrated pages. */
  230. app-account-page .profile-header,
  231. app-appointment-page .appointment-status,
  232. app-finance-page .finance-summary,
  233. app-merchant-page :is(.stock-summary, .settle-summary),
  234. app-study-records-page :is(.mastery, .income-summary),
  235. app-team-page .team-summary,
  236. app-game-page .game-intro {
  237. background: linear-gradient(135deg, var(--brand-deep), var(--brand-strong));
  238. box-shadow: var(--shadow-brand);
  239. }
  240. app-account-page :is(.wallet-strip, .order-strip, .role-panel, .service-section, .settings-list),
  241. app-course-center-page :is(.course-band, .schedule-band),
  242. app-study-records-page :is(.filter-row, .record-tabs, .record-list),
  243. app-team-page :is(.team-stats, .detail-link, .members),
  244. app-merchant-page :is(.stock-list, .settlement-list, .settlement-preview, .sales-group),
  245. app-order-page :is(.order-tabs, .order-list),
  246. app-finance-page :is(.finance-list, .finance-actions),
  247. app-resource-page :is(.description, .action-row, .tabs, .resource-list, .detail-list),
  248. app-checkout-page :is(.checkout-section, .totals),
  249. app-product-page :is(.product-info, .product-tools, .product-content, .comments) {
  250. border-color: var(--line-soft);
  251. }
  252. app-product-list-page .product-grid article,
  253. app-appointment-page .unit-grid article,
  254. app-game-page .game-menu button,
  255. app-support-feedback-page :is(.agent-header, .message-intro),
  256. app-form-page .order-context,
  257. app-english-reading-page .question-block,
  258. app-reading-exercise .question-block {
  259. border-color: var(--line);
  260. border-radius: var(--radius-md);
  261. box-shadow: var(--shadow-xs);
  262. }
  263. app-product-list-page .product-grid article,
  264. app-game-page .game-menu button,
  265. app-appointment-page .unit-grid article { transition: border-color 160ms ease, box-shadow 160ms ease, transform 160ms ease; }
  266. app-resource-page :is(.resource-item, .detail-list div),
  267. app-study-records-page :is(.learning-item, .history-item, .progress-item, .income-item),
  268. app-course-center-page :is(.course-list li, .schedule-list article),
  269. app-team-page .members article,
  270. app-order-page .order-card,
  271. app-finance-page .finance-item { border-color: var(--line-soft); }
  272. app-resource-page :is(.resource-item:hover, .resource-item:focus-within),
  273. app-study-records-page :is(.learning-item:hover, .progress-item:hover),
  274. app-course-center-page .schedule-list article:hover,
  275. app-team-page .members article:hover { background: var(--surface-hover); }
  276. app-product-list-page .node-list button.active,
  277. app-study-records-page .record-tabs button.active,
  278. app-resource-page .tabs button.active,
  279. app-auth-page .mode-tabs button.active,
  280. app-login-page .mode-tabs button.active {
  281. color: var(--brand-strong);
  282. border-color: var(--brand-strong);
  283. }
  284. app-form-page :is(.audit-line, .status-line),
  285. app-auth-page .audit-notice,
  286. app-login-page .audit-notice { border-radius: var(--radius-md); }
  287. app-form-page :is(.load-error, .upload-control, .image-item),
  288. app-support-feedback-page :is(.error-state, input, textarea),
  289. app-reading-setup :is(input, select, textarea),
  290. app-english-reading-page :is(input, select, textarea) { border-radius: var(--radius-sm); }
  291. app-product-page :is(.purchase-bar),
  292. app-checkout-page footer,
  293. app-appointment-page .appointment-actions,
  294. app-reading-exercise .answer-footer {
  295. border-color: var(--line);
  296. box-shadow: 0 -8px 24px rgb(24 54 47 / 6%);
  297. backdrop-filter: blur(12px);
  298. }
  299. app-support-page .messages p,
  300. app-support-page :is(.image-message, .file-message),
  301. app-support-page form textarea { border-radius: var(--radius-md); }
  302. app-auth-page,
  303. app-login-page {
  304. background: linear-gradient(180deg, var(--brand-pale) 0, var(--surface-muted) 42%, var(--surface) 100%);
  305. }
  306. @media (hover: hover) {
  307. app-product-list-page .product-grid article:hover,
  308. app-game-page .game-menu button:hover,
  309. app-appointment-page .unit-grid article:hover {
  310. border-color: color-mix(in srgb, var(--brand) 55%, var(--line));
  311. box-shadow: var(--shadow-sm);
  312. transform: translateY(-1px);
  313. }
  314. }
  315. /* Shared page geometry: business subpages use the same inset surfaces as the main tabs. */
  316. app-learning-page .catalog-tabs {
  317. display: grid;
  318. margin: var(--panel-gap) var(--page-gutter) 0;
  319. overflow: hidden;
  320. grid-template-columns: repeat(5, minmax(0, 1fr));
  321. background: var(--surface);
  322. border: 1px solid var(--line);
  323. border-radius: var(--panel-radius);
  324. box-shadow: var(--shadow-sm);
  325. }
  326. app-learning-page .catalog-tabs button {
  327. min-width: 0;
  328. min-height: 44px;
  329. padding: 0 4px;
  330. color: var(--ink-soft);
  331. background: transparent;
  332. border: 0;
  333. border-right: 1px solid var(--line);
  334. font-size: 12px;
  335. }
  336. app-learning-page .catalog-tabs button:last-child { border-right: 0; }
  337. app-learning-page .catalog-tabs button.active { color: white; background: var(--brand-strong); font-weight: 700; }
  338. app-learning-page .unit-selection-summary {
  339. display: flex;
  340. min-height: 48px;
  341. align-items: center;
  342. justify-content: space-between;
  343. margin: var(--panel-gap) var(--page-gutter) 0;
  344. padding: 0 14px;
  345. color: var(--ink-soft);
  346. background: var(--surface);
  347. border: 1px solid var(--line);
  348. border-radius: var(--panel-radius);
  349. box-shadow: var(--shadow-sm);
  350. gap: 10px;
  351. }
  352. app-learning-page .unit-selection-summary span { font-size: 13px; }
  353. app-learning-page .unit-selection-summary strong { color: var(--brand-strong); font-size: 17px; }
  354. app-learning-page .unit-selection-summary small { font-size: 11px; }
  355. app-learning-page .node-list > button.selected { background: var(--brand-pale); }
  356. app-learning-page .node-list > button.unit-node { justify-content: flex-start !important; }
  357. app-learning-page .node-list .node-check {
  358. display: grid !important;
  359. width: 24px;
  360. height: 24px;
  361. flex: 0 0 24px;
  362. color: white;
  363. background: white;
  364. border: 1px solid #b5c6c1;
  365. border-radius: 6px;
  366. place-items: center;
  367. }
  368. app-learning-page .node-list > button.selected .node-check { background: var(--brand-strong); border-color: var(--brand-strong); }
  369. app-learning-page .node-list .node-copy { flex: 1; }
  370. app-learning-page .memory-student-filter {
  371. display: grid;
  372. align-items: end;
  373. margin: var(--panel-gap) var(--page-gutter) 0;
  374. padding: 14px;
  375. background: var(--surface);
  376. border: 1px solid var(--line);
  377. border-radius: var(--panel-radius);
  378. box-shadow: var(--shadow-sm);
  379. grid-template-columns: minmax(0, 1fr) minmax(220px, .8fr);
  380. gap: 14px;
  381. }
  382. app-learning-page .memory-student-filter > div,
  383. app-learning-page .memory-student-filter label { display: flex; min-width: 0; flex-direction: column; gap: 5px; }
  384. app-learning-page .memory-student-filter span { color: var(--ink-soft); font-size: 11px; }
  385. app-learning-page .memory-student-filter strong { color: var(--ink); font-size: 18px; }
  386. app-learning-page .memory-student-filter select { min-height: 42px; padding-block: 7px; }
  387. app-learning-page .bulk-size-label { font-size: 12px; white-space: nowrap; }
  388. app-learning-page .bulk-select-size { width: auto; }
  389. app-learning-page .teacher-spelling-actions { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  390. @media (max-width: 520px) {
  391. app-learning-page .memory-student-filter { grid-template-columns: 1fr; gap: 10px; }
  392. }
  393. app-learning-page .node-list .unit-progress-ring {
  394. display: grid;
  395. width: 44px;
  396. height: 44px;
  397. flex: 0 0 44px;
  398. margin-left: auto;
  399. position: relative;
  400. color: var(--brand-deep);
  401. background: conic-gradient(var(--brand) var(--progress, 0%), #e3ebe8 0);
  402. border-radius: 50%;
  403. place-items: center;
  404. }
  405. app-learning-page .node-list .unit-progress-ring::before {
  406. position: absolute;
  407. background: white;
  408. border-radius: 50%;
  409. content: '';
  410. inset: 5px;
  411. }
  412. app-learning-page .node-list .unit-progress-ring.complete { background: var(--brand-strong); }
  413. app-learning-page .node-list .unit-progress-ring strong { z-index: 1; font-size: 9px; }
  414. app-learning-page .unit-actions { grid-template-columns: minmax(0, 1fr) minmax(150px, 1.4fr); align-items: center; }
  415. app-learning-page .unit-actions > span { color: var(--ink-soft); font-size: 13px; text-align: center; }
  416. app-learning-page .repeat-list > button {
  417. touch-action: pan-y;
  418. user-select: none;
  419. -webkit-user-select: none;
  420. -webkit-touch-callout: none;
  421. }
  422. app-learning-page .repeat-list .study-copy {
  423. display: flex;
  424. flex: 1;
  425. min-width: 0;
  426. align-items: baseline;
  427. gap: 12px;
  428. }
  429. app-learning-page .repeat-list .study-headword,
  430. app-learning-page .repeat-list .study-answer { font-size: 1.5em; line-height: 1.4; overflow-wrap: anywhere; }
  431. app-learning-page .repeat-list .study-headword { flex: 0 1 auto; max-width: 45%; }
  432. app-learning-page .repeat-list .study-hints { flex: 1; min-width: 0; color: var(--ink-soft); overflow-wrap: anywhere; }
  433. app-learning-page .repeat-list .study-phonetic { font-size: 1em; line-height: 1.4; }
  434. app-learning-page .repeat-list .study-phonetic + .study-answer { margin-left: 10px; }
  435. app-learning-page .repeat-list .repeat-dots { flex: 0 0 auto; }
  436. app-resource-page .resource-page > :is(.description, .order-context, .action-row, .tabs, .state-line, .error-state, .resource-list, .detail-list, .empty-state),
  437. app-appointment-page .appointment-page > :is(.course-section, .comment-panel, .report-panel),
  438. app-article-page .article-page > :is(header, .article-content),
  439. app-checkout-page .checkout-section,
  440. app-finance-page .balance-band,
  441. app-form-page .form-page,
  442. app-order-page .order-page > :is(header, .timeline, .order-card, .order-links),
  443. app-product-page .product-page > :is(.gallery-strip, .product-summary, .product-tools, .product-content, .comments),
  444. app-study-records-page .records-page > :is(.mastery, .income-summary, .filter-row, .record-tabs, .record-list),
  445. app-team-page :is(.team-summary, .team-stats, .detail-link, .members),
  446. app-merchant-page :is(.stock-summary, .settle-summary, .stock-list, .settlement-list, .settlement-preview, .sales-group),
  447. 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) {
  448. overflow: hidden;
  449. border: 1px solid var(--line);
  450. border-radius: var(--panel-radius);
  451. box-shadow: var(--shadow-sm);
  452. }
  453. app-resource-page .resource-page {
  454. padding: var(--panel-gap) var(--page-gutter) 24px;
  455. }
  456. app-resource-page .resource-page > :is(.description, .order-context, .action-row, .tabs, .state-line, .error-state, .resource-list, .detail-list, .empty-state) {
  457. margin: 0 0 var(--panel-gap);
  458. background: white;
  459. }
  460. app-resource-page :is(.resource-item, .detail-list div):last-child { border-bottom: 0; }
  461. app-learning-page .learning-page > :is(.node-intro, .node-list, .game-heading, .review-summary, .record-overview, .anti-heading, .exam-status) {
  462. margin: var(--panel-gap) var(--page-gutter) 0;
  463. }
  464. app-learning-page .learning-page > .node-list { margin-bottom: var(--panel-gap); }
  465. app-learning-page .learning-page > .selection-header,
  466. app-learning-page .learning-page > .stage-banner,
  467. app-learning-page .learning-page > .record-tip {
  468. margin: var(--panel-gap) var(--page-gutter) 0;
  469. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  470. }
  471. app-learning-page .learning-page > .selection-header { top: 52px; }
  472. app-learning-page .learning-page > :is(.word-select-list, .repeat-list, .record-list) {
  473. margin: 0 var(--page-gutter) var(--panel-gap);
  474. border-top: 0;
  475. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  476. }
  477. app-learning-page :is(.node-list, .word-select-list, .repeat-list, .record-list) > :last-child { border-bottom: 0; }
  478. app-learning-page .learning-page > :is(.review-list, .match-grid, .anti-grid, .option-list) {
  479. padding-right: var(--page-gutter);
  480. padding-left: var(--page-gutter);
  481. }
  482. app-learning-page .learning-page > :is(.memory-calendar, .memory-date-tasks) {
  483. margin-right: var(--page-gutter);
  484. margin-left: var(--page-gutter);
  485. }
  486. app-appointment-page .appointment-page > .appointment-status {
  487. margin: var(--panel-gap) var(--page-gutter) 0;
  488. overflow: hidden;
  489. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  490. }
  491. app-appointment-page .appointment-page > .appointment-info {
  492. margin: 0 var(--page-gutter);
  493. overflow: hidden;
  494. border: 1px solid var(--line);
  495. border-top: 0;
  496. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  497. box-shadow: var(--shadow-sm);
  498. }
  499. app-appointment-page .appointment-page > :is(.course-section, .comment-panel, .report-panel) {
  500. margin: var(--panel-gap) var(--page-gutter) 0;
  501. border-block: 1px solid var(--line);
  502. }
  503. app-article-page .article-page > :is(header, .article-content) {
  504. margin: var(--panel-gap) var(--page-gutter) 0;
  505. }
  506. app-article-page .article-video {
  507. width: calc(100% - (2 * var(--page-gutter)));
  508. margin: var(--panel-gap) var(--page-gutter) 0;
  509. overflow: hidden;
  510. border-radius: var(--panel-radius);
  511. box-shadow: var(--shadow-sm);
  512. }
  513. app-checkout-page .checkout-page { padding-top: var(--panel-gap); }
  514. app-checkout-page .checkout-section { margin: 0 var(--page-gutter) var(--panel-gap); }
  515. app-finance-page .balance-band {
  516. margin: var(--panel-gap) var(--page-gutter) 0;
  517. }
  518. app-finance-page .log-heading {
  519. margin: var(--panel-gap) var(--page-gutter) 0;
  520. overflow: hidden;
  521. border: 1px solid var(--line);
  522. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  523. box-shadow: var(--shadow-sm);
  524. }
  525. app-finance-page .finance-logs {
  526. margin: 0 var(--page-gutter) 24px;
  527. overflow: hidden;
  528. border: 1px solid var(--line);
  529. border-top: 0;
  530. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  531. box-shadow: var(--shadow-sm);
  532. }
  533. app-finance-page .finance-logs article:last-child { border-bottom: 0; }
  534. app-form-page {
  535. display: block;
  536. min-height: 100%;
  537. padding-top: 1px;
  538. background: var(--surface-muted);
  539. }
  540. app-form-page .form-page {
  541. margin: var(--panel-gap) var(--page-gutter) 24px;
  542. padding: 18px 16px 24px;
  543. background: white;
  544. }
  545. app-order-page .order-page { padding-top: 1px; }
  546. app-order-page .order-page > :is(header, .timeline, .order-card, .order-links) { margin: var(--panel-gap) var(--page-gutter) 0; }
  547. app-product-page .hero-image {
  548. display: block;
  549. width: calc(100% - (2 * var(--page-gutter)));
  550. margin: var(--panel-gap) var(--page-gutter) 0;
  551. overflow: hidden;
  552. border: 1px solid var(--line);
  553. border-radius: var(--panel-radius);
  554. box-shadow: var(--shadow-sm);
  555. }
  556. app-product-page .product-page > :is(.gallery-strip, .product-summary, .product-tools, .product-content, .comments) {
  557. margin: var(--panel-gap) var(--page-gutter) 0;
  558. }
  559. app-product-list-page .browse-page:not(.with-nodes) > .search-row {
  560. margin: var(--panel-gap) var(--page-gutter) 0;
  561. overflow: hidden;
  562. border: 1px solid var(--line);
  563. border-radius: var(--panel-radius);
  564. box-shadow: var(--shadow-sm);
  565. }
  566. app-product-list-page .browse-page:not(.with-nodes) > .product-region {
  567. padding-right: var(--page-gutter);
  568. padding-left: var(--page-gutter);
  569. }
  570. app-product-list-page .browse-page.with-nodes {
  571. width: calc(100% - (2 * var(--page-gutter)));
  572. height: calc(100dvh - 52px - (2 * var(--panel-gap)));
  573. margin: var(--panel-gap) var(--page-gutter);
  574. overflow: hidden;
  575. border: 1px solid var(--line);
  576. border-radius: var(--panel-radius);
  577. box-shadow: var(--shadow-sm);
  578. }
  579. app-team-page .team-summary { margin: var(--panel-gap) var(--page-gutter) 0; }
  580. app-team-page .team-stats {
  581. margin: var(--panel-gap) var(--page-gutter) 0;
  582. border-radius: var(--panel-radius) var(--panel-radius) 0 0;
  583. }
  584. app-team-page .detail-link {
  585. margin: 0 var(--page-gutter);
  586. border-top: 0;
  587. border-radius: 0 0 var(--panel-radius) var(--panel-radius);
  588. }
  589. app-team-page .members { margin: var(--panel-gap) var(--page-gutter) 24px; }
  590. app-team-page .members article:last-child { border-bottom: 0; }
  591. app-merchant-page :is(.stock-summary, .settle-summary) { margin: var(--panel-gap) var(--page-gutter) 0; }
  592. 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); }
  593. app-merchant-page :is(.stock-list, .settlement-list, .sales-group) article:last-child { border-bottom: 0; }
  594. app-study-records-page .records-page > :is(.mastery, .income-summary, .filter-row, .record-tabs, .record-list) {
  595. margin: var(--panel-gap) var(--page-gutter) 0;
  596. }
  597. app-study-records-page .records-page > .record-list { margin-bottom: 24px; }
  598. app-study-records-page .current-learning-card {
  599. margin: var(--panel-gap) var(--page-gutter) 0;
  600. overflow: hidden;
  601. background: white;
  602. border: 1px solid var(--line);
  603. border-radius: var(--panel-radius);
  604. box-shadow: var(--shadow-sm);
  605. }
  606. app-study-records-page .current-learning-card > header {
  607. display: flex;
  608. min-height: 58px;
  609. align-items: center;
  610. justify-content: space-between;
  611. padding: 10px 14px;
  612. color: white;
  613. background: var(--brand-strong);
  614. gap: 12px;
  615. }
  616. app-study-records-page .current-learning-card > header > div {
  617. display: flex;
  618. min-width: 0;
  619. flex-direction: column;
  620. gap: 2px;
  621. }
  622. app-study-records-page .current-learning-card > header span { color: rgb(255 255 255 / 78%); font-size: 10px; }
  623. app-study-records-page .current-learning-card > header strong { font-size: 16px; }
  624. app-study-records-page .current-learning-list button {
  625. display: grid;
  626. width: 100%;
  627. min-height: 66px;
  628. grid-template-columns: 36px minmax(0, 1fr) auto;
  629. align-items: center;
  630. padding: 9px 14px;
  631. color: var(--ink);
  632. text-align: left;
  633. background: white;
  634. border: 0;
  635. border-bottom: 1px solid var(--line);
  636. gap: 10px;
  637. }
  638. app-study-records-page .current-learning-list button:last-child { border-bottom: 0; }
  639. app-study-records-page .current-learning-list button > i {
  640. display: grid;
  641. width: 36px;
  642. height: 36px;
  643. color: var(--brand-strong);
  644. background: var(--brand-pale);
  645. border-radius: var(--radius-md);
  646. place-items: center;
  647. }
  648. app-study-records-page .current-learning-list button > span { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  649. app-study-records-page .current-learning-list button strong,
  650. app-study-records-page .current-learning-list button small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  651. app-study-records-page .current-learning-list button strong { font-size: 13px; }
  652. app-study-records-page .current-learning-list button small { color: var(--ink-soft); font-size: 10px; }
  653. app-study-records-page .current-learning-list button:disabled { cursor: not-allowed; opacity: .58; }
  654. app-study-records-page .current-learning-list button.readonly:not(:disabled) { cursor: pointer; }
  655. app-study-records-page .current-learning-list button.readonly:disabled { opacity: .58; }
  656. app-learning-page .node-list > button.readonly { cursor: pointer; }
  657. 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; }
  658. app-learning-page .readonly-word-header > div { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  659. app-learning-page .readonly-word-header strong { font-size: 18px; }
  660. app-learning-page .readonly-word-header span { color: rgb(255 255 255 / 76%); font-size: 11px; }
  661. 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; }
  662. app-learning-page .readonly-word-list { background: white; }
  663. 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; }
  664. app-learning-page .readonly-word-list article > div { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  665. app-learning-page .readonly-word-list strong { overflow: hidden; font-size: 17px; text-overflow: ellipsis; white-space: nowrap; }
  666. app-learning-page .readonly-word-list small { color: var(--ink-soft); font-size: 12px; }
  667. app-learning-page .readonly-word-list p { margin: 0; color: var(--ink); font-size: 14px; line-height: 1.5; }
  668. 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; }
  669. app-learning-page .history-word-audio {
  670. display: flex;
  671. min-width: 0;
  672. min-height: 44px;
  673. align-items: center;
  674. justify-content: space-between;
  675. padding: 0;
  676. color: var(--brand-strong);
  677. background: transparent;
  678. border: 0;
  679. border-radius: 6px;
  680. text-align: left;
  681. gap: 8px;
  682. cursor: pointer;
  683. > span { display: flex; min-width: 0; flex-direction: column; gap: 4px; }
  684. strong { white-space: normal; overflow-wrap: anywhere; }
  685. lucide-icon { flex-shrink: 0; }
  686. &:focus-visible { outline: 2px solid var(--brand-strong); outline-offset: 3px; }
  687. &:disabled { cursor: default; }
  688. &:disabled lucide-icon { opacity: .35; }
  689. }
  690. app-study-records-page .current-learning-toggle {
  691. display: flex;
  692. width: 100%;
  693. min-height: 44px;
  694. align-items: center;
  695. justify-content: center;
  696. color: var(--brand-strong);
  697. background: var(--brand-pale);
  698. border: 0;
  699. border-top: 1px solid var(--line);
  700. font-size: 12px;
  701. font-weight: 750;
  702. gap: 6px;
  703. }
  704. app-study-records-page .current-learning-toggle lucide-icon { transition: transform .18s ease; transform: rotate(90deg); }
  705. app-study-records-page .current-learning-toggle.expanded lucide-icon { transform: rotate(-90deg); }
  706. app-learning-page .memory-watermark { position: absolute; top: -28px; right: -26px; color: white; opacity: .07; pointer-events: none; }
  707. app-learning-page .memory-copy { min-width: 0; }
  708. app-learning-page .memory-copy strong,
  709. app-learning-page .memory-copy small { display: block; }
  710. 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; }
  711. app-learning-page .memory-copy strong { margin-top: 7px; color: white; font-size: 21px; line-height: 1.2; }
  712. app-learning-page .memory-copy small { margin-top: 6px; color: rgb(255 255 255 / 72%); font-size: 10px; }
  713. 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; }
  714. app-learning-page .memory-score b { font-size: 18px; line-height: 1; }
  715. app-learning-page .memory-score small { margin-top: 5px; color: rgb(255 255 255 / 70%); font-size: 8px; }
  716. 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; }
  717. 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; }
  718. app-learning-page .memory-curve figcaption strong { display: inline-flex; align-items: center; color: #b8ef9f; font-size: 10px; gap: 5px; }
  719. 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%); }
  720. app-learning-page .memory-curve-chart { position: absolute; top: 136px; right: 8px; bottom: 61px; left: 8px; }
  721. app-learning-page .memory-curve-chart svg { display: block; width: 100%; height: 100%; overflow: visible; }
  722. app-learning-page .memory-curve-chart text { fill: rgb(255 255 255 / 62%); font-family: inherit; font-size: 7px; }
  723. app-learning-page .memory-chart-axis { stroke: rgb(255 255 255 / 24%); stroke-width: 1; vector-effect: non-scaling-stroke; }
  724. app-learning-page .memory-forgetting-line,
  725. app-learning-page .memory-learning-line,
  726. app-learning-page .memory-review-decay { fill: none; stroke-linecap: round; vector-effect: non-scaling-stroke; }
  727. app-learning-page .memory-forgetting-line { stroke: #e58b72; stroke-dasharray: 4 4; stroke-width: 1.7; }
  728. app-learning-page .memory-learning-line { stroke: #8bd47a; stroke-width: 2.7; }
  729. app-learning-page .memory-review-decay { stroke: #ffd084; stroke-width: 1.8; }
  730. 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); }
  731. app-learning-page .memory-review-dot { fill: #ffad32; stroke: #126c5d; stroke-width: 1.2; }
  732. app-learning-page .memory-reset-dot { fill: #8bd47a; stroke: #126c5d; stroke-width: 1.1; }
  733. 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); }
  734. app-learning-page .memory-review-label { fill: #ffdba0; font-size: 6px; font-weight: 700; }
  735. app-learning-page .memory-line-label { font-size: 6px; font-weight: 700; }
  736. app-learning-page .memory-line-label.forgetting { fill: #f2aa96; }
  737. app-learning-page .memory-line-label.learning { fill: #b8ef9f; }
  738. 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); }
  739. 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); }
  740. @keyframes memory-day-pulse { 0%, 9%, 100% { fill: rgb(255 255 255 / 58%); transform: scale(1); } 4.5% { fill: #ffad32; transform: scale(1.8); } }
  741. @keyframes memory-day-ripple { 0%, 100% { opacity: 0; transform: scale(.6); } 3% { opacity: .8; } 10% { opacity: 0; transform: scale(3); } }
  742. @keyframes memory-review-lift { 0%, 100% { opacity: .2; stroke-dashoffset: 90; } 5%, 14% { opacity: 1; stroke-dashoffset: 0; } 22% { opacity: .52; stroke-dashoffset: 0; } }
  743. @keyframes memory-review-ripple { 0%, 100% { opacity: 0; transform: scale(.7); } 5% { opacity: .9; } 15% { opacity: 0; transform: scale(4); } }
  744. @media (prefers-reduced-motion: reduce) {
  745. app-learning-page .memory-day-dot,
  746. app-learning-page .memory-day-ripple,
  747. app-learning-page .memory-review-lift,
  748. app-learning-page .memory-review-ripple { animation: none; }
  749. }
  750. 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); }
  751. app-study-records-page .ai-reading-visual { position: relative; min-height: 230px; overflow: hidden; background: #116b5a; }
  752. app-study-records-page .ai-reading-visual > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: left center; }
  753. 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; }
  754. app-study-records-page .ai-reading-eyebrow { display: inline-flex; align-items: center; color: #dff8ef; font-size: 11px; font-weight: 700; gap: 6px; }
  755. app-study-records-page .ai-reading-copy h2 { margin: 10px 0 7px; font-size: 23px; line-height: 1.28; letter-spacing: 0; }
  756. 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; }
  757. 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; }
  758. 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; }
  759. 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)); }
  760. 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; }
  761. 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: ''; }
  762. 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; }
  763. app-study-records-page .ai-reading-flow span { overflow: hidden; max-width: 100%; text-overflow: ellipsis; white-space: nowrap; }
  764. app-learning-page .word-refine-item { background: white; border-bottom: 1px solid var(--line); }
  765. app-learning-page .word-refine-item.selected { background: var(--brand-pale); }
  766. app-learning-page .word-refine-item:last-child { border-bottom: 0; }
  767. app-learning-page .word-refine-main { display: grid; min-height: 72px; align-items: center; padding: 8px 14px; grid-template-columns: 32px minmax(0, 1fr) auto 40px; gap: 8px; }
  768. 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; }
  769. app-learning-page .word-select-check[aria-pressed='true'] { background: var(--brand-strong); border-color: var(--brand-strong); }
  770. app-learning-page .word-reveal { display: flex; min-width: 0; min-height: 52px; padding: 5px 0; align-items: flex-start; justify-content: center; color: var(--ink); text-align: left; background: transparent; border: 0; flex-direction: column; gap: 5px; }
  771. app-learning-page .word-reveal strong { max-width: 100%; font-size: 18px; overflow-wrap: anywhere; }
  772. app-learning-page .word-reveal small { overflow: hidden; max-width: 100%; color: var(--ink-faint); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
  773. app-learning-page .word-reveal small.revealed { color: var(--ink-soft); font-size: 13px; }
  774. app-learning-page .word-refine-main .audio { display: grid; width: 40px; height: 44px; min-width: 40px; min-height: 44px; color: var(--brand-strong); place-items: center; }
  775. app-learning-page .word-assessment { display: flex; align-items: center; gap: 4px; }
  776. app-learning-page .word-assessment button, app-learning-page .bulk-assessment button, app-learning-page .bulk-select-toggle { display: inline-flex; min-width: 0; min-height: 32px; padding: 0 8px; align-items: center; justify-content: center; color: var(--brand-strong); background: white; border: 1px solid var(--line); border-radius: var(--radius-sm); font-size: 12px; font-weight: 650; white-space: nowrap; }
  777. app-learning-page .word-assessment .unknown-button, app-learning-page .bulk-assessment .unknown-button { color: #9a6407; }
  778. app-learning-page .word-assessment .known-button.active { color: white; background: var(--brand-strong); border-color: var(--brand-strong); }
  779. app-learning-page .word-assessment .unknown-button.active { color: #4d3100; background: var(--accent-pale); border-color: var(--accent); }
  780. app-learning-page .course-bulk-toolbar { display: grid; position: sticky; top: 0; z-index: 2; padding: 12px 14px; align-items: center; grid-template-columns: auto minmax(0, 1fr) auto; gap: 8px 12px; background: var(--brand-wash); border-bottom: 1px solid var(--line); }
  781. app-learning-page .bulk-assessment { display: flex; align-items: center; justify-self: end; gap: 8px; }
  782. app-learning-page .bulk-count { min-width: 0; color: var(--ink-soft); font-size: 12px; line-height: 1.6; }
  783. app-learning-page .bulk-count b { color: var(--brand-strong); font-weight: 750; }
  784. app-learning-page .course-bulk-toolbar small { grid-column: 1 / -1; color: var(--ink-soft); font-size: 11px; line-height: 1.6; }
  785. app-learning-page .bulk-assessment button { min-height: 38px; padding: 0 12px; gap: 6px; font-size: 13px; font-weight: 750; transition: filter .15s, box-shadow .15s; }
  786. app-learning-page .bulk-assessment .known-button { color: white; background: var(--brand-strong); border-color: var(--brand-strong); box-shadow: 0 3px 8px rgba(23,108,85,.16); }
  787. app-learning-page .bulk-assessment .unknown-button { color: #795007; background: var(--accent-pale); border-color: #d6b56e; }
  788. app-learning-page .bulk-assessment button:focus-visible { outline: 2px solid var(--brand-strong); outline-offset: 3px; }
  789. @media (hover: hover) { app-learning-page .bulk-assessment button:not(:disabled):hover { filter: brightness(1.06); } }
  790. @media (max-width: 350px) { app-learning-page .course-bulk-toolbar { grid-template-columns: auto minmax(0,1fr); } app-learning-page .bulk-count { justify-self: end; } app-learning-page .bulk-assessment { grid-column: 1 / -1; } }
  791. app-learning-page .selection-retry-note { margin: 10px 14px; padding: 12px; color: #704500; background: var(--accent-pale); border-radius: var(--radius-sm); font-size: 13px; line-height: 1.6; }
  792. app-learning-page .word-refine-main:has(.word-assessment) .audio { width: 40px; }
  793. app-learning-page .word-refine-main:not(:has(.word-assessment)) { grid-template-columns: 32px minmax(0, 1fr) 40px; }
  794. app-learning-page .word-refine-main button:disabled, app-learning-page .course-bulk-toolbar button:disabled { opacity: .55; cursor: default; }
  795. @media (pointer: coarse) { app-learning-page .word-assessment button, app-learning-page .bulk-assessment button, app-learning-page .bulk-select-toggle { min-height: 44px; } }
  796. @media (max-width: 380px) { app-learning-page .word-refine-main { padding-inline: 10px; gap: 6px; } app-learning-page .word-assessment button { padding-inline: 6px; font-size: 11px; } }
  797. app-learning-page .word-selection-panel { padding: 14px; background: var(--surface-muted); }
  798. app-learning-page .word-selection-list { overflow: hidden; background: white; border: solid var(--line); border-width: 0 1px 1px; border-radius: 0 0 var(--radius-lg) var(--radius-lg); box-shadow: var(--shadow-sm); }
  799. app-learning-page .word-selection-tabs { display: grid; overflow: hidden; background: white; border: 1px solid var(--line); border-radius: var(--radius-lg) var(--radius-lg) 0 0; box-shadow: var(--shadow-sm); grid-template-columns: repeat(2, minmax(0, 1fr)); }
  800. app-learning-page .word-selection-tabs button { display: flex; min-height: 58px; padding: 0 14px; align-items: center; justify-content: center; color: var(--ink-soft); background: white; border: 0; border-bottom: 3px solid transparent; font-size: 15px; font-weight: 700; gap: 8px; }
  801. app-learning-page .word-selection-tabs button + button { border-left: 1px solid var(--line); }
  802. app-learning-page .word-selection-tabs button.active { color: var(--brand-strong); background: var(--brand-wash); border-bottom-color: var(--brand-strong); }
  803. app-learning-page .word-selection-tabs b { min-width: 25px; padding: 3px 7px; color: inherit; background: var(--surface-muted); border-radius: 999px; font-size: 11px; }
  804. app-learning-page .word-selection-tabs button.active b { background: var(--brand-pale); }
  805. app-learning-page .word-selection-tabs.course-pass-tabs { grid-template-columns: repeat(4,minmax(0,1fr)); }
  806. app-learning-page .course-pass-tabs button { min-width: 0; min-height: 72px; padding: 8px 4px; flex-direction: column; gap: 5px; font-size: 14px; }
  807. app-learning-page .course-pass-tabs button span { text-align: center; overflow-wrap: anywhere; }
  808. app-learning-page .word-column-help { min-height: 51px; margin: 0; padding: 10px 14px; color: var(--ink-soft); border-bottom: 1px solid var(--line); font-size: 11px; line-height: 1.45; }
  809. app-learning-page .word-complete-check { display: grid; width: 32px; height: 32px; color: white; background: var(--brand-strong); border-radius: 50%; place-items: center; }
  810. app-learning-page .word-pending-mark { display: grid; width: 32px; height: 32px; color: #9a6407; background: var(--accent-pale); border-radius: 50%; place-items: center; }
  811. app-learning-page .completed-word { background: color-mix(in srgb, var(--brand-pale) 58%, white); }
  812. app-learning-page .word-column-empty { display: flex; min-height: 150px; padding: 24px; align-items: center; justify-content: center; color: var(--ink-faint); flex-direction: column; gap: 8px; }
  813. @media (hover: hover) { app-study-records-page .ai-reading-cta:not(:disabled):hover { filter: brightness(1.04); transform: translateY(-1px); } }
  814. @media (prefers-reduced-motion: reduce) { app-study-records-page .ai-reading-cta { transition: none; } }
  815. @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; } }
  816. @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; } }
  817. @media (max-width: 360px) {
  818. :root { --page-gutter: 10px; }
  819. }
  820. .mobile-pagination{display:flex;align-items:center;justify-content:center;gap:16px;padding:20px;flex-wrap:wrap}.mobile-pagination button{border:1px solid #dce6e2;border-radius:10px;background:#fff;color:#18745d;padding:10px 16px;font:inherit;cursor:pointer}.mobile-pagination button:disabled{opacity:.45;cursor:default}
  821. /* Keep the generated dropdown trigger aligned with the fee filter's calendar icon. */
  822. body app-study-records-page .fee-month-select > button.xs-dropdown-trigger {
  823. min-height: 48px;
  824. height: auto;
  825. padding: 10px 16px 10px 40px;
  826. font-size: 16px;
  827. border-radius: 10px;
  828. }
  829. body app-study-records-page .fee-month-select > .fee-select-chevron { display: none; }
  830. /* Keep the full meaning readable in the end-of-lesson assessment. */
  831. app-learning-page .review-list .word-audio.assessment-word small { white-space: normal; overflow-wrap: anywhere; }
  832. app-study-records-page .record-number, app-course-center-page .record-number { display: inline-flex; min-width: 28px; min-height: 28px; align-items: center; justify-content: center; padding: 2px 5px; color: var(--brand-strong); background: var(--brand-pale); border-radius: 7px; font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }
  833. app-course-center-page .record-time { display: flex; align-items: flex-start; flex-direction: column; gap: 5px; }