styles.css 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719
  1. /* Root Variables */
  2. :root {
  3. --primary-color: #3b82f6;
  4. --secondary-color: #6366f1;
  5. --success-color: #10b981;
  6. --danger-color: #ef4444;
  7. --warning-color: #f59e0b;
  8. --bg-primary: #ffffff;
  9. --bg-secondary: #f3f4f6;
  10. --bg-tertiary: #e5e7eb;
  11. --text-primary: #111827;
  12. --text-secondary: #6b7280;
  13. --border-color: #d1d5db;
  14. --shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  15. --shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.1);
  16. --radius: 8px;
  17. }
  18. [data-theme="dark"] {
  19. --bg-primary: #1f2937;
  20. --bg-secondary: #111827;
  21. --bg-tertiary: #374151;
  22. --text-primary: #f9fafb;
  23. --text-secondary: #9ca3af;
  24. --border-color: #4b5563;
  25. --shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
  26. --shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.5);
  27. }
  28. /* Reset & Base */
  29. * {
  30. margin: 0;
  31. padding: 0;
  32. box-sizing: border-box;
  33. }
  34. body {
  35. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  36. background: var(--bg-secondary);
  37. color: var(--text-primary);
  38. line-height: 1.6;
  39. transition: background-color 0.3s, color 0.3s;
  40. }
  41. /* Layout */
  42. .app {
  43. display: flex;
  44. height: 100vh;
  45. overflow: hidden;
  46. }
  47. .sidebar {
  48. width: 250px;
  49. background: var(--bg-primary);
  50. border-right: 1px solid var(--border-color);
  51. display: flex;
  52. flex-direction: column;
  53. transition: background-color 0.3s;
  54. }
  55. .logo {
  56. padding: 2rem 1.5rem;
  57. border-bottom: 1px solid var(--border-color);
  58. }
  59. .logo h1 {
  60. font-size: 1.5rem;
  61. margin-bottom: 0.25rem;
  62. }
  63. .logo p {
  64. font-size: 0.875rem;
  65. color: var(--text-secondary);
  66. }
  67. .nav {
  68. flex: 1;
  69. padding: 1rem 0;
  70. }
  71. .nav-item {
  72. display: flex;
  73. align-items: center;
  74. gap: 0.75rem;
  75. padding: 0.75rem 1.5rem;
  76. color: var(--text-secondary);
  77. text-decoration: none;
  78. transition: all 0.2s;
  79. }
  80. .nav-item:hover {
  81. background: var(--bg-secondary);
  82. color: var(--text-primary);
  83. }
  84. .nav-item.active {
  85. background: var(--primary-color);
  86. color: white;
  87. border-left: 3px solid var(--secondary-color);
  88. }
  89. .nav-item .icon {
  90. font-size: 1.25rem;
  91. }
  92. .theme-toggle {
  93. padding: 1rem 1.5rem;
  94. border-top: 1px solid var(--border-color);
  95. }
  96. .theme-btn {
  97. display: flex;
  98. align-items: center;
  99. gap: 0.75rem;
  100. width: 100%;
  101. padding: 0.75rem;
  102. background: var(--bg-secondary);
  103. border: 1px solid var(--border-color);
  104. border-radius: var(--radius);
  105. cursor: pointer;
  106. color: var(--text-primary);
  107. font-size: 0.875rem;
  108. transition: all 0.2s;
  109. }
  110. .theme-btn:hover {
  111. background: var(--bg-tertiary);
  112. }
  113. .main {
  114. flex: 1;
  115. display: flex;
  116. flex-direction: column;
  117. overflow: hidden;
  118. }
  119. .header {
  120. padding: 1.5rem 2rem;
  121. background: var(--bg-primary);
  122. border-bottom: 1px solid var(--border-color);
  123. display: flex;
  124. gap: 1rem;
  125. align-items: center;
  126. }
  127. .search-bar {
  128. flex: 1;
  129. display: flex;
  130. gap: 0.5rem;
  131. }
  132. .search-input {
  133. flex: 1;
  134. padding: 0.625rem 1rem;
  135. border: 1px solid var(--border-color);
  136. border-radius: var(--radius);
  137. background: var(--bg-secondary);
  138. color: var(--text-primary);
  139. font-size: 0.875rem;
  140. }
  141. .search-input:focus {
  142. outline: none;
  143. border-color: var(--primary-color);
  144. }
  145. .content {
  146. flex: 1;
  147. overflow-y: auto;
  148. padding: 2rem;
  149. }
  150. .view {
  151. display: none;
  152. }
  153. .view.active {
  154. display: block;
  155. }
  156. /* Buttons */
  157. .btn {
  158. padding: 0.625rem 1.25rem;
  159. border: none;
  160. border-radius: var(--radius);
  161. font-size: 0.875rem;
  162. font-weight: 500;
  163. cursor: pointer;
  164. transition: all 0.2s;
  165. white-space: nowrap;
  166. }
  167. .btn-primary {
  168. background: var(--primary-color);
  169. color: white;
  170. }
  171. .btn-primary:hover {
  172. background: #2563eb;
  173. }
  174. .btn-secondary {
  175. background: var(--bg-tertiary);
  176. color: var(--text-primary);
  177. }
  178. .btn-secondary:hover {
  179. background: var(--border-color);
  180. }
  181. .btn-success {
  182. background: var(--success-color);
  183. color: white;
  184. }
  185. .btn-success:hover {
  186. background: #059669;
  187. }
  188. .btn-danger {
  189. background: var(--danger-color);
  190. color: white;
  191. }
  192. .btn-danger:hover {
  193. background: #dc2626;
  194. }
  195. .btn-sm {
  196. padding: 0.5rem 0.875rem;
  197. font-size: 0.8125rem;
  198. }
  199. .btn:disabled {
  200. opacity: 0.5;
  201. cursor: not-allowed;
  202. }
  203. /* Filters */
  204. .filters {
  205. display: flex;
  206. gap: 1rem;
  207. margin-bottom: 1.5rem;
  208. flex-wrap: wrap;
  209. }
  210. .filter-select {
  211. padding: 0.5rem 1rem;
  212. border: 1px solid var(--border-color);
  213. border-radius: var(--radius);
  214. background: var(--bg-primary);
  215. color: var(--text-primary);
  216. font-size: 0.875rem;
  217. cursor: pointer;
  218. }
  219. /* Bulk Actions */
  220. .bulk-actions {
  221. display: flex;
  222. gap: 1rem;
  223. align-items: center;
  224. padding: 1rem;
  225. background: var(--bg-primary);
  226. border: 1px solid var(--border-color);
  227. border-radius: var(--radius);
  228. margin-bottom: 1.5rem;
  229. }
  230. .bulk-actions.hidden {
  231. display: none;
  232. }
  233. .bulk-actions span {
  234. font-weight: 500;
  235. color: var(--text-secondary);
  236. }
  237. /* Memories List */
  238. .memories-list {
  239. display: grid;
  240. gap: 1rem;
  241. }
  242. .memory-card {
  243. background: var(--bg-primary);
  244. border: 1px solid var(--border-color);
  245. border-radius: var(--radius);
  246. padding: 1.5rem;
  247. transition: all 0.2s;
  248. position: relative;
  249. }
  250. .memory-card:hover {
  251. box-shadow: var(--shadow-lg);
  252. border-color: var(--primary-color);
  253. }
  254. .memory-card.selected {
  255. border-color: var(--primary-color);
  256. background: rgba(59, 130, 246, 0.05);
  257. }
  258. .memory-header {
  259. display: flex;
  260. justify-content: space-between;
  261. align-items: flex-start;
  262. margin-bottom: 1rem;
  263. }
  264. .memory-meta {
  265. flex: 1;
  266. }
  267. .memory-project {
  268. display: inline-block;
  269. padding: 0.25rem 0.75rem;
  270. background: var(--primary-color);
  271. color: white;
  272. border-radius: 1rem;
  273. font-size: 0.75rem;
  274. font-weight: 500;
  275. margin-bottom: 0.5rem;
  276. }
  277. .memory-date {
  278. font-size: 0.8125rem;
  279. color: var(--text-secondary);
  280. }
  281. .memory-actions {
  282. display: flex;
  283. gap: 0.5rem;
  284. }
  285. .memory-text {
  286. margin-bottom: 1rem;
  287. line-height: 1.7;
  288. color: var(--text-primary);
  289. }
  290. .memory-tags {
  291. display: flex;
  292. flex-wrap: wrap;
  293. gap: 0.5rem;
  294. }
  295. .tag {
  296. padding: 0.25rem 0.75rem;
  297. background: var(--bg-secondary);
  298. border: 1px solid var(--border-color);
  299. border-radius: 1rem;
  300. font-size: 0.75rem;
  301. color: var(--text-secondary);
  302. }
  303. .memory-score {
  304. position: absolute;
  305. top: 1rem;
  306. right: 1rem;
  307. padding: 0.25rem 0.5rem;
  308. background: var(--success-color);
  309. color: white;
  310. border-radius: 0.25rem;
  311. font-size: 0.75rem;
  312. font-weight: 600;
  313. }
  314. .bulk-checkbox {
  315. position: absolute;
  316. top: 1rem;
  317. left: 1rem;
  318. width: 20px;
  319. height: 20px;
  320. cursor: pointer;
  321. }
  322. /* Pagination */
  323. .pagination {
  324. display: flex;
  325. justify-content: center;
  326. align-items: center;
  327. gap: 1rem;
  328. margin-top: 2rem;
  329. padding: 1rem;
  330. }
  331. #pageInfo {
  332. color: var(--text-secondary);
  333. font-size: 0.875rem;
  334. }
  335. /* Statistics */
  336. .stats-grid {
  337. display: grid;
  338. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  339. gap: 1.5rem;
  340. margin-bottom: 2rem;
  341. }
  342. .stat-card {
  343. background: var(--bg-primary);
  344. border: 1px solid var(--border-color);
  345. border-radius: var(--radius);
  346. padding: 1.5rem;
  347. text-align: center;
  348. }
  349. .stat-card h3 {
  350. font-size: 0.875rem;
  351. font-weight: 500;
  352. color: var(--text-secondary);
  353. margin-bottom: 0.5rem;
  354. }
  355. .stat-value {
  356. font-size: 2rem;
  357. font-weight: 700;
  358. color: var(--primary-color);
  359. }
  360. .charts-grid {
  361. display: grid;
  362. grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
  363. gap: 1.5rem;
  364. }
  365. .chart-card {
  366. background: var(--bg-primary);
  367. border: 1px solid var(--border-color);
  368. border-radius: var(--radius);
  369. padding: 1.5rem;
  370. }
  371. .chart-card h3 {
  372. margin-bottom: 1.5rem;
  373. font-size: 1.125rem;
  374. }
  375. .chart {
  376. height: 300px;
  377. }
  378. .chart-bar {
  379. display: flex;
  380. align-items: center;
  381. gap: 1rem;
  382. margin-bottom: 1rem;
  383. }
  384. .chart-label {
  385. min-width: 100px;
  386. font-size: 0.875rem;
  387. color: var(--text-secondary);
  388. }
  389. .chart-bar-fill {
  390. flex: 1;
  391. height: 30px;
  392. background: var(--primary-color);
  393. border-radius: 0.25rem;
  394. position: relative;
  395. transition: width 0.3s;
  396. }
  397. .chart-value {
  398. position: absolute;
  399. right: 0.5rem;
  400. top: 50%;
  401. transform: translateY(-50%);
  402. color: white;
  403. font-size: 0.75rem;
  404. font-weight: 600;
  405. }
  406. .tag-cloud {
  407. display: flex;
  408. flex-wrap: wrap;
  409. gap: 0.75rem;
  410. padding: 1rem 0;
  411. }
  412. .tag-cloud-item {
  413. padding: 0.5rem 1rem;
  414. background: var(--bg-secondary);
  415. border: 1px solid var(--border-color);
  416. border-radius: 1rem;
  417. font-size: 0.875rem;
  418. color: var(--text-primary);
  419. transition: all 0.2s;
  420. cursor: pointer;
  421. }
  422. .tag-cloud-item:hover {
  423. background: var(--primary-color);
  424. color: white;
  425. transform: scale(1.05);
  426. }
  427. .tag-cloud-item.large {
  428. font-size: 1.25rem;
  429. }
  430. .tag-cloud-item.medium {
  431. font-size: 1rem;
  432. }
  433. /* Settings */
  434. .settings-section {
  435. background: var(--bg-primary);
  436. border: 1px solid var(--border-color);
  437. border-radius: var(--radius);
  438. padding: 2rem;
  439. margin-bottom: 1.5rem;
  440. }
  441. .settings-section h2 {
  442. margin-bottom: 1.5rem;
  443. font-size: 1.25rem;
  444. }
  445. .form-group {
  446. margin-bottom: 1.5rem;
  447. }
  448. .form-group label {
  449. display: block;
  450. margin-bottom: 0.5rem;
  451. font-size: 0.875rem;
  452. font-weight: 500;
  453. color: var(--text-secondary);
  454. }
  455. .form-input {
  456. width: 100%;
  457. padding: 0.625rem 1rem;
  458. border: 1px solid var(--border-color);
  459. border-radius: var(--radius);
  460. background: var(--bg-secondary);
  461. color: var(--text-primary);
  462. font-size: 0.875rem;
  463. }
  464. .form-input:focus {
  465. outline: none;
  466. border-color: var(--primary-color);
  467. }
  468. textarea.form-input {
  469. resize: vertical;
  470. font-family: inherit;
  471. }
  472. .form-row {
  473. display: grid;
  474. grid-template-columns: 1fr 1fr;
  475. gap: 1rem;
  476. }
  477. /* Modal */
  478. .modal {
  479. display: none;
  480. position: fixed;
  481. top: 0;
  482. left: 0;
  483. right: 0;
  484. bottom: 0;
  485. background: rgba(0, 0, 0, 0.5);
  486. z-index: 1000;
  487. align-items: center;
  488. justify-content: center;
  489. }
  490. .modal.active {
  491. display: flex;
  492. }
  493. .modal-content {
  494. background: var(--bg-primary);
  495. border-radius: var(--radius);
  496. width: 90%;
  497. max-width: 600px;
  498. max-height: 90vh;
  499. display: flex;
  500. flex-direction: column;
  501. box-shadow: var(--shadow-lg);
  502. }
  503. .modal-header {
  504. padding: 1.5rem;
  505. border-bottom: 1px solid var(--border-color);
  506. display: flex;
  507. justify-content: space-between;
  508. align-items: center;
  509. }
  510. .modal-header h2 {
  511. font-size: 1.25rem;
  512. }
  513. .modal-close {
  514. background: none;
  515. border: none;
  516. font-size: 1.5rem;
  517. cursor: pointer;
  518. color: var(--text-secondary);
  519. padding: 0;
  520. width: 30px;
  521. height: 30px;
  522. display: flex;
  523. align-items: center;
  524. justify-content: center;
  525. border-radius: 50%;
  526. transition: all 0.2s;
  527. }
  528. .modal-close:hover {
  529. background: var(--bg-secondary);
  530. color: var(--text-primary);
  531. }
  532. .modal-body {
  533. padding: 1.5rem;
  534. overflow-y: auto;
  535. flex: 1;
  536. }
  537. .modal-footer {
  538. padding: 1.5rem;
  539. border-top: 1px solid var(--border-color);
  540. display: flex;
  541. gap: 1rem;
  542. justify-content: flex-end;
  543. }
  544. .preview-section {
  545. margin-top: 1.5rem;
  546. }
  547. .preview-section h4 {
  548. margin-bottom: 0.75rem;
  549. font-size: 0.875rem;
  550. color: var(--text-secondary);
  551. }
  552. .preview {
  553. padding: 1rem;
  554. background: var(--bg-secondary);
  555. border: 1px solid var(--border-color);
  556. border-radius: var(--radius);
  557. min-height: 100px;
  558. color: var(--text-primary);
  559. white-space: pre-wrap;
  560. }
  561. /* Loading & Empty States */
  562. .loading {
  563. text-align: center;
  564. padding: 3rem;
  565. color: var(--text-secondary);
  566. }
  567. .empty-state {
  568. text-align: center;
  569. padding: 3rem;
  570. color: var(--text-secondary);
  571. }
  572. .empty-state h3 {
  573. margin-bottom: 0.5rem;
  574. color: var(--text-primary);
  575. }
  576. /* Responsive */
  577. @media (max-width: 768px) {
  578. .app {
  579. flex-direction: column;
  580. }
  581. .sidebar {
  582. width: 100%;
  583. border-right: none;
  584. border-bottom: 1px solid var(--border-color);
  585. }
  586. .nav {
  587. display: flex;
  588. overflow-x: auto;
  589. padding: 0;
  590. }
  591. .nav-item {
  592. flex-direction: column;
  593. gap: 0.25rem;
  594. padding: 0.75rem;
  595. font-size: 0.75rem;
  596. text-align: center;
  597. }
  598. .header {
  599. flex-direction: column;
  600. align-items: stretch;
  601. }
  602. .search-bar {
  603. flex-direction: column;
  604. }
  605. .filters {
  606. flex-direction: column;
  607. }
  608. .form-row {
  609. grid-template-columns: 1fr;
  610. }
  611. .charts-grid {
  612. grid-template-columns: 1fr;
  613. }
  614. }