style.css 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. body {
  7. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
  8. line-height: 1.6;
  9. color: #333;
  10. background-color: #f5f5f5;
  11. }
  12. .container {
  13. max-width: 1200px;
  14. margin: 0 auto;
  15. padding: 20px;
  16. }
  17. header {
  18. text-align: center;
  19. margin-bottom: 40px;
  20. padding: 30px 0;
  21. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  22. color: white;
  23. border-radius: 10px;
  24. }
  25. header h1 {
  26. font-size: 2.5rem;
  27. margin-bottom: 10px;
  28. }
  29. .subtitle {
  30. font-size: 1.1rem;
  31. opacity: 0.9;
  32. }
  33. .actions {
  34. display: flex;
  35. gap: 15px;
  36. justify-content: center;
  37. margin-bottom: 30px;
  38. }
  39. .btn {
  40. padding: 12px 24px;
  41. font-size: 1rem;
  42. border: none;
  43. border-radius: 6px;
  44. cursor: pointer;
  45. transition: all 0.3s ease;
  46. font-weight: 500;
  47. }
  48. .btn-primary {
  49. background-color: #667eea;
  50. color: white;
  51. }
  52. .btn-primary:hover {
  53. background-color: #5568d3;
  54. transform: translateY(-2px);
  55. }
  56. .btn-secondary {
  57. background-color: #764ba2;
  58. color: white;
  59. }
  60. .btn-secondary:hover {
  61. background-color: #643a8a;
  62. transform: translateY(-2px);
  63. }
  64. .message {
  65. padding: 15px 20px;
  66. border-radius: 6px;
  67. margin-bottom: 20px;
  68. text-align: center;
  69. }
  70. .message.success {
  71. background-color: #d4edda;
  72. color: #155724;
  73. border: 1px solid #c3e6cb;
  74. }
  75. .message.error {
  76. background-color: #f8d7da;
  77. color: #721c24;
  78. border: 1px solid #f5c6cb;
  79. }
  80. .message.hidden {
  81. display: none;
  82. }
  83. .section {
  84. background: white;
  85. padding: 30px;
  86. border-radius: 10px;
  87. margin-bottom: 30px;
  88. box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  89. }
  90. .section h2 {
  91. font-size: 1.8rem;
  92. margin-bottom: 20px;
  93. color: #667eea;
  94. }
  95. .recommendations-grid {
  96. display: grid;
  97. grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  98. gap: 20px;
  99. }
  100. .recommendation-card {
  101. background: #f9f9f9;
  102. padding: 20px;
  103. border-radius: 8px;
  104. border: 1px solid #e0e0e0;
  105. transition: transform 0.2s ease, box-shadow 0.2s ease;
  106. }
  107. .recommendation-card:hover {
  108. transform: translateY(-4px);
  109. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  110. }
  111. .recommendation-card h3 {
  112. font-size: 1.3rem;
  113. margin-bottom: 5px;
  114. color: #333;
  115. }
  116. .author {
  117. color: #666;
  118. font-style: italic;
  119. margin-bottom: 10px;
  120. }
  121. .description {
  122. margin-bottom: 15px;
  123. line-height: 1.5;
  124. }
  125. .reason {
  126. background: #fff;
  127. padding: 10px;
  128. border-left: 3px solid #667eea;
  129. margin-bottom: 10px;
  130. }
  131. .reason strong {
  132. color: #667eea;
  133. }
  134. .reason p {
  135. margin-top: 5px;
  136. font-size: 0.95rem;
  137. }
  138. .genres {
  139. display: flex;
  140. flex-wrap: wrap;
  141. gap: 8px;
  142. margin-top: 10px;
  143. }
  144. .genre-tag {
  145. background: #667eea;
  146. color: white;
  147. padding: 4px 12px;
  148. border-radius: 20px;
  149. font-size: 0.85rem;
  150. }
  151. .history-list {
  152. display: flex;
  153. flex-direction: column;
  154. gap: 15px;
  155. }
  156. .history-item {
  157. display: flex;
  158. justify-content: space-between;
  159. align-items: center;
  160. padding: 15px;
  161. background: #f9f9f9;
  162. border-radius: 8px;
  163. border: 1px solid #e0e0e0;
  164. }
  165. .book-info h3 {
  166. font-size: 1.1rem;
  167. margin-bottom: 5px;
  168. }
  169. .status {
  170. padding: 6px 12px;
  171. border-radius: 20px;
  172. font-size: 0.9rem;
  173. font-weight: 500;
  174. }
  175. .status.finished {
  176. background-color: #d4edda;
  177. color: #155724;
  178. }
  179. .status.in-progress {
  180. background-color: #fff3cd;
  181. color: #856404;
  182. }
  183. .empty-state {
  184. text-align: center;
  185. color: #999;
  186. padding: 40px;
  187. font-size: 1.1rem;
  188. }
  189. /* ==================== Navigation ====================*/
  190. .navbar {
  191. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  192. color: white;
  193. padding: 0;
  194. margin-bottom: 20px;
  195. box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  196. }
  197. .nav-container {
  198. max-width: 1200px;
  199. margin: 0 auto;
  200. padding: 15px 20px;
  201. display: flex;
  202. justify-content: space-between;
  203. align-items: center;
  204. }
  205. .nav-brand a {
  206. color: white;
  207. text-decoration: none;
  208. font-size: 1.3rem;
  209. font-weight: 600;
  210. }
  211. .nav-links {
  212. display: flex;
  213. list-style: none;
  214. gap: 30px;
  215. }
  216. .nav-links a {
  217. color: white;
  218. text-decoration: none;
  219. transition: opacity 0.3s ease;
  220. }
  221. .nav-links a:hover {
  222. opacity: 0.8;
  223. }
  224. .nav-user {
  225. display: flex;
  226. align-items: center;
  227. gap: 15px;
  228. }
  229. .user-name {
  230. font-weight: 500;
  231. }
  232. .btn-text {
  233. background: transparent;
  234. color: white;
  235. border: 1px solid rgba(255,255,255,0.3);
  236. padding: 8px 16px;
  237. }
  238. .btn-text:hover {
  239. background: rgba(255,255,255,0.1);
  240. }
  241. /* ==================== Authentication Pages ====================*/
  242. .auth-container {
  243. min-height: 100vh;
  244. display: flex;
  245. align-items: center;
  246. justify-content: center;
  247. padding: 20px;
  248. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  249. }
  250. .auth-card {
  251. background: white;
  252. padding: 40px;
  253. border-radius: 12px;
  254. box-shadow: 0 8px 24px rgba(0,0,0,0.15);
  255. max-width: 480px;
  256. width: 100%;
  257. }
  258. .auth-card h1 {
  259. text-align: center;
  260. color: #333;
  261. margin-bottom: 10px;
  262. font-size: 2rem;
  263. }
  264. .auth-subtitle {
  265. text-align: center;
  266. color: #666;
  267. margin-bottom: 30px;
  268. }
  269. .form-group {
  270. margin-bottom: 20px;
  271. }
  272. .form-group label {
  273. display: block;
  274. margin-bottom: 8px;
  275. color: #333;
  276. font-weight: 500;
  277. }
  278. .form-group input {
  279. width: 100%;
  280. padding: 12px;
  281. border: 1px solid #ddd;
  282. border-radius: 6px;
  283. font-size: 1rem;
  284. transition: border-color 0.3s ease;
  285. }
  286. .form-group input:focus {
  287. outline: none;
  288. border-color: #667eea;
  289. box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
  290. }
  291. .form-group small {
  292. display: block;
  293. margin-top: 5px;
  294. color: #666;
  295. font-size: 0.85rem;
  296. }
  297. .form-section {
  298. margin-top: 30px;
  299. padding-top: 30px;
  300. border-top: 1px solid #e0e0e0;
  301. }
  302. .form-section h3 {
  303. color: #667eea;
  304. margin-bottom: 10px;
  305. }
  306. .form-help {
  307. color: #666;
  308. font-size: 0.9rem;
  309. margin-bottom: 20px;
  310. }
  311. .btn-full {
  312. width: 100%;
  313. padding: 14px;
  314. font-size: 1.1rem;
  315. }
  316. .auth-footer {
  317. text-align: center;
  318. margin-top: 20px;
  319. padding-top: 20px;
  320. border-top: 1px solid #e0e0e0;
  321. }
  322. .auth-footer a {
  323. color: #667eea;
  324. text-decoration: none;
  325. font-weight: 500;
  326. }
  327. .auth-footer a:hover {
  328. text-decoration: underline;
  329. }
  330. /* ==================== Landing Page ====================*/
  331. .landing-container {
  332. min-height: 100vh;
  333. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  334. color: white;
  335. padding: 40px 20px;
  336. }
  337. .landing-hero {
  338. text-align: center;
  339. max-width: 800px;
  340. margin: 0 auto 80px;
  341. padding-top: 80px;
  342. }
  343. .landing-hero h1 {
  344. font-size: 3.5rem;
  345. margin-bottom: 20px;
  346. }
  347. .landing-subtitle {
  348. font-size: 1.3rem;
  349. opacity: 0.95;
  350. margin-bottom: 40px;
  351. }
  352. .landing-actions {
  353. display: flex;
  354. gap: 20px;
  355. justify-content: center;
  356. }
  357. .btn-large {
  358. padding: 16px 40px;
  359. font-size: 1.2rem;
  360. text-decoration: none;
  361. display: inline-block;
  362. }
  363. .landing-features {
  364. max-width: 1000px;
  365. margin: 0 auto;
  366. }
  367. .landing-features h2 {
  368. text-align: center;
  369. font-size: 2.5rem;
  370. margin-bottom: 40px;
  371. }
  372. .features-grid {
  373. display: grid;
  374. grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  375. gap: 30px;
  376. }
  377. .feature-card {
  378. background: rgba(255,255,255,0.1);
  379. padding: 30px;
  380. border-radius: 12px;
  381. backdrop-filter: blur(10px);
  382. border: 1px solid rgba(255,255,255,0.2);
  383. }
  384. .feature-card h3 {
  385. font-size: 1.5rem;
  386. margin-bottom: 15px;
  387. }
  388. .feature-card p {
  389. opacity: 0.9;
  390. line-height: 1.6;
  391. }
  392. /* ==================== Reading Log ====================*/
  393. .stats-grid {
  394. display: grid;
  395. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  396. gap: 20px;
  397. margin-bottom: 30px;
  398. }
  399. .stat-card {
  400. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  401. color: white;
  402. padding: 25px;
  403. border-radius: 10px;
  404. text-align: center;
  405. box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  406. }
  407. .stat-value {
  408. font-size: 2.5rem;
  409. font-weight: bold;
  410. margin-bottom: 5px;
  411. }
  412. .stat-label {
  413. font-size: 0.95rem;
  414. opacity: 0.9;
  415. }
  416. .charts-container {
  417. display: grid;
  418. grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
  419. gap: 30px;
  420. }
  421. .chart-card {
  422. background: white;
  423. padding: 20px;
  424. border-radius: 10px;
  425. box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  426. }
  427. .chart-card h3 {
  428. color: #667eea;
  429. margin-bottom: 20px;
  430. text-align: center;
  431. }
  432. .books-grid {
  433. display: grid;
  434. grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  435. gap: 20px;
  436. }
  437. .book-card {
  438. background: #f9f9f9;
  439. padding: 20px;
  440. border-radius: 8px;
  441. border: 1px solid #e0e0e0;
  442. transition: transform 0.2s ease, box-shadow 0.2s ease;
  443. }
  444. .book-card:hover {
  445. transform: translateY(-4px);
  446. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  447. }
  448. .book-cover {
  449. width: 100%;
  450. height: 200px;
  451. object-fit: cover;
  452. border-radius: 6px;
  453. margin-bottom: 15px;
  454. }
  455. .book-title {
  456. font-size: 1.2rem;
  457. margin-bottom: 5px;
  458. color: #333;
  459. }
  460. .book-author {
  461. color: #666;
  462. font-style: italic;
  463. margin-bottom: 10px;
  464. }
  465. .book-meta {
  466. display: flex;
  467. justify-content: space-between;
  468. font-size: 0.85rem;
  469. color: #666;
  470. margin-bottom: 10px;
  471. }
  472. .book-rating {
  473. display: flex;
  474. justify-content: space-between;
  475. align-items: center;
  476. margin-top: 15px;
  477. padding-top: 15px;
  478. border-top: 1px solid #e0e0e0;
  479. }
  480. .rating-stars {
  481. color: #f59e0b;
  482. font-size: 1.2rem;
  483. }
  484. .btn-small {
  485. padding: 6px 14px;
  486. font-size: 0.85rem;
  487. }
  488. .loading {
  489. text-align: center;
  490. padding: 40px;
  491. color: #999;
  492. }
  493. /* ==================== Responsive Design ====================*/
  494. @media (max-width: 768px) {
  495. header h1 {
  496. font-size: 2rem;
  497. }
  498. .actions {
  499. flex-direction: column;
  500. }
  501. .recommendations-grid {
  502. grid-template-columns: 1fr;
  503. }
  504. .history-item {
  505. flex-direction: column;
  506. align-items: flex-start;
  507. gap: 10px;
  508. }
  509. .nav-container {
  510. flex-direction: column;
  511. gap: 15px;
  512. }
  513. .nav-links {
  514. gap: 15px;
  515. }
  516. .landing-hero h1 {
  517. font-size: 2.5rem;
  518. }
  519. .landing-actions {
  520. flex-direction: column;
  521. align-items: center;
  522. }
  523. .charts-container {
  524. grid-template-columns: 1fr;
  525. }
  526. .stats-grid {
  527. grid-template-columns: repeat(2, 1fr);
  528. }
  529. }
  530. /* ==================== Admin Panel Styles ==================== */
  531. .settings-grid {
  532. display: grid;
  533. gap: 20px;
  534. margin-top: 20px;
  535. }
  536. .setting-item {
  537. background: white;
  538. padding: 20px;
  539. border-radius: 8px;
  540. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  541. }
  542. .setting-item label {
  543. display: flex;
  544. align-items: center;
  545. gap: 10px;
  546. cursor: pointer;
  547. font-size: 1rem;
  548. }
  549. .setting-item input[type="checkbox"] {
  550. width: 20px;
  551. height: 20px;
  552. cursor: pointer;
  553. }
  554. .section-actions {
  555. display: flex;
  556. gap: 10px;
  557. margin-bottom: 20px;
  558. }
  559. .users-table {
  560. width: 100%;
  561. background: white;
  562. border-radius: 8px;
  563. overflow: hidden;
  564. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  565. border-collapse: collapse;
  566. }
  567. .users-table thead {
  568. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  569. color: white;
  570. }
  571. .users-table th {
  572. padding: 15px;
  573. text-align: left;
  574. font-weight: 600;
  575. }
  576. .users-table td {
  577. padding: 15px;
  578. border-bottom: 1px solid #e0e0e0;
  579. }
  580. .users-table tbody tr:hover {
  581. background-color: #f5f5f5;
  582. }
  583. .users-table tbody tr:last-child td {
  584. border-bottom: none;
  585. }
  586. .badge {
  587. display: inline-block;
  588. padding: 4px 8px;
  589. border-radius: 4px;
  590. font-size: 0.85rem;
  591. font-weight: 600;
  592. }
  593. .badge-admin {
  594. background-color: #fbbf24;
  595. color: #78350f;
  596. }
  597. .badge-active {
  598. background-color: #34d399;
  599. color: #064e3b;
  600. }
  601. .badge-inactive {
  602. background-color: #f87171;
  603. color: #7f1d1d;
  604. }
  605. .btn-danger {
  606. background-color: #ef4444;
  607. }
  608. .btn-danger:hover {
  609. background-color: #dc2626;
  610. }
  611. .text-muted {
  612. color: #999;
  613. font-style: italic;
  614. }