style.css 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. /* 编辑器区域滚动条 */
  2. #yaml-editor::-webkit-scrollbar,
  3. #frequency-editor::-webkit-scrollbar,
  4. #timeline-editor::-webkit-scrollbar,
  5. #yaml-backdrop::-webkit-scrollbar,
  6. #frequency-backdrop::-webkit-scrollbar,
  7. #timeline-backdrop::-webkit-scrollbar {
  8. width: 10px;
  9. height: 10px;
  10. }
  11. #yaml-editor::-webkit-scrollbar-track,
  12. #frequency-editor::-webkit-scrollbar-track,
  13. #timeline-editor::-webkit-scrollbar-track,
  14. #yaml-backdrop::-webkit-scrollbar-track,
  15. #frequency-backdrop::-webkit-scrollbar-track,
  16. #timeline-backdrop::-webkit-scrollbar-track {
  17. background: #1e1e1e;
  18. }
  19. #yaml-editor::-webkit-scrollbar-thumb,
  20. #frequency-editor::-webkit-scrollbar-thumb,
  21. #timeline-editor::-webkit-scrollbar-thumb,
  22. #yaml-backdrop::-webkit-scrollbar-thumb,
  23. #frequency-backdrop::-webkit-scrollbar-thumb,
  24. #timeline-backdrop::-webkit-scrollbar-thumb {
  25. background: #424242;
  26. border-radius: 0;
  27. }
  28. #yaml-editor::-webkit-scrollbar-thumb:hover,
  29. #frequency-editor::-webkit-scrollbar-thumb:hover,
  30. #timeline-editor::-webkit-scrollbar-thumb:hover,
  31. #yaml-backdrop::-webkit-scrollbar-thumb:hover,
  32. #frequency-backdrop::-webkit-scrollbar-thumb:hover,
  33. #timeline-backdrop::-webkit-scrollbar-thumb:hover {
  34. background: #4f4f4f;
  35. }
  36. /* 高亮编辑器容器 */
  37. .highlight-editor-wrap {
  38. position: relative;
  39. flex: 1;
  40. display: flex;
  41. overflow: hidden;
  42. }
  43. /* 高亮背景层 */
  44. .highlight-backdrop {
  45. position: absolute;
  46. top: 0;
  47. left: 0;
  48. right: 0;
  49. bottom: 0;
  50. padding: 1rem;
  51. margin: 0;
  52. border: none;
  53. font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
  54. font-size: 0.75rem;
  55. line-height: 1.625;
  56. white-space: pre-wrap;
  57. word-wrap: break-word;
  58. overflow: auto;
  59. background: #1e1e1e;
  60. color: #d4d4d4;
  61. pointer-events: none;
  62. z-index: 1;
  63. }
  64. /* 透明输入层 */
  65. .highlight-textarea {
  66. position: absolute;
  67. top: 0;
  68. left: 0;
  69. right: 0;
  70. bottom: 0;
  71. padding: 1rem;
  72. margin: 0;
  73. border: none;
  74. font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
  75. font-size: 0.75rem;
  76. line-height: 1.625;
  77. overflow: auto;
  78. background: transparent;
  79. color: transparent;
  80. caret-color: #d4d4d4;
  81. resize: none;
  82. outline: none;
  83. z-index: 2;
  84. }
  85. /* 注释样式 - 灰色 */
  86. .syntax-comment {
  87. color: #6a9955;
  88. }
  89. /* 右侧面板滚动条 */
  90. #modules-container::-webkit-scrollbar {
  91. width: 8px;
  92. }
  93. #modules-container::-webkit-scrollbar-track {
  94. background: transparent;
  95. }
  96. #modules-container::-webkit-scrollbar-thumb {
  97. background: #cbd5e1;
  98. border-radius: 4px;
  99. }
  100. /* 模块卡片样式 */
  101. .module-card {
  102. background: white;
  103. border-radius: 0.5rem; /* rounded-lg */
  104. border: 1px solid #e5e7eb; /* border-gray-200 */
  105. overflow: hidden;
  106. transition: all 0.2s;
  107. }
  108. /* 激活态(可编辑) */
  109. .module-card.active {
  110. box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
  111. }
  112. .module-card.active:hover {
  113. box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
  114. border-color: #bfdbfe; /* blue-200 */
  115. }
  116. .module-card.active .module-header {
  117. background-color: #fff;
  118. border-bottom: 1px solid #f3f4f6;
  119. color: #111827;
  120. }
  121. /* 禁用态(灰色/只读) */
  122. .module-card.disabled {
  123. background-color: #f9fafb; /* gray-50 */
  124. opacity: 0.8;
  125. }
  126. .module-card.disabled .module-header {
  127. background-color: #f3f4f6; /* gray-100 */
  128. color: #6b7280; /* gray-500 */
  129. cursor: not-allowed;
  130. }
  131. .module-card.disabled .module-body {
  132. display: none;
  133. }
  134. .module-card.disabled .locked-badge {
  135. display: inline-flex;
  136. }
  137. /* 输入控件统一 */
  138. input[type="text"],
  139. input[type="password"],
  140. input[type="number"],
  141. select {
  142. font-size: 0.875rem; /* text-sm */
  143. line-height: 1.25rem;
  144. padding: 0.5rem 0.75rem;
  145. border-radius: 0.375rem;
  146. border-width: 1px;
  147. border-color: #d1d5db; /* gray-300 */
  148. width: 100%;
  149. outline: 2px solid transparent;
  150. transition: all 0.15s;
  151. }
  152. input:focus, select:focus {
  153. border-color: #3b82f6; /* blue-500 */
  154. box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
  155. }
  156. /* 开关样式 (Checkbox Toggle) */
  157. .toggle-checkbox:checked {
  158. right: 0;
  159. border-color: #3b82f6;
  160. }
  161. .toggle-checkbox:checked + .toggle-label {
  162. background-color: #3b82f6;
  163. }
  164. /* 列表样式 (Platforms & RSS & Sortable) */
  165. .sortable-list-item {
  166. background: #f8fafc;
  167. border: 1px solid #e2e8f0;
  168. margin-bottom: 0.5rem;
  169. border-radius: 0.375rem;
  170. transition: all 0.2s;
  171. }
  172. .sortable-list-item:hover {
  173. border-color: #cbd5e1;
  174. background: #f1f5f9;
  175. }
  176. .sortable-handle {
  177. cursor: grab;
  178. color: #94a3b8;
  179. }
  180. .sortable-handle:hover {
  181. color: #64748b;
  182. }
  183. .sortable-ghost {
  184. background: #e2e8f0;
  185. opacity: 0.5;
  186. }
  187. /* 禁用状态的勾选框 */
  188. input[type="checkbox"]:disabled {
  189. cursor: not-allowed;
  190. opacity: 0.5;
  191. }
  192. /* Tab 切换样式 */
  193. .tab-button {
  194. transition: all 0.2s;
  195. }
  196. .tab-button.active {
  197. color: #d4d4d4;
  198. border-color: #3b82f6;
  199. }
  200. .tab-content.hidden {
  201. display: none;
  202. }
  203. /* 标签输入样式 */
  204. .tag-input-container {
  205. display: flex;
  206. flex-wrap: wrap;
  207. gap: 0.5rem;
  208. padding: 0.5rem;
  209. border: 1px solid #d1d5db;
  210. border-radius: 0.375rem;
  211. background: white;
  212. min-height: 42px;
  213. }
  214. .tag-item {
  215. display: inline-flex;
  216. align-items: center;
  217. gap: 0.25rem;
  218. padding: 0.25rem 0.5rem;
  219. background: #3b82f6;
  220. color: white;
  221. border-radius: 0.25rem;
  222. font-size: 0.875rem;
  223. }
  224. .tag-item button {
  225. background: none;
  226. border: none;
  227. color: white;
  228. cursor: pointer;
  229. padding: 0;
  230. font-size: 1rem;
  231. line-height: 1;
  232. }
  233. .tag-input {
  234. flex: 1;
  235. border: none;
  236. outline: none;
  237. min-width: 120px;
  238. font-size: 0.875rem;
  239. }
  240. /* 词组卡片样式 */
  241. .word-group-card {
  242. background: white;
  243. border: 1px solid #e5e7eb;
  244. border-radius: 0.5rem;
  245. padding: 1rem;
  246. transition: all 0.2s;
  247. }
  248. .word-group-card:hover {
  249. border-color: #3b82f6;
  250. box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  251. }
  252. /* 插入区域样式 */
  253. .insert-zone {
  254. position: relative;
  255. height: 8px;
  256. margin: 0.5rem 0;
  257. display: flex;
  258. align-items: center;
  259. justify-content: center;
  260. transition: all 0.2s;
  261. }
  262. .insert-zone:hover {
  263. height: 32px;
  264. }
  265. .insert-button {
  266. opacity: 0;
  267. visibility: hidden;
  268. width: 32px;
  269. height: 32px;
  270. border-radius: 50%;
  271. background: linear-gradient(135deg, #3b82f6, #2563eb);
  272. color: white;
  273. border: 2px solid white;
  274. box-shadow: 0 2px 8px rgba(59, 130, 246, 0.4);
  275. display: flex;
  276. align-items: center;
  277. justify-content: center;
  278. cursor: pointer;
  279. transition: all 0.2s;
  280. font-size: 14px;
  281. }
  282. .insert-zone:hover .insert-button {
  283. opacity: 1;
  284. visibility: visible;
  285. }
  286. .insert-button:hover {
  287. transform: scale(1.1);
  288. box-shadow: 0 4px 12px rgba(59, 130, 246, 0.6);
  289. background: linear-gradient(135deg, #2563eb, #1d4ed8);
  290. }
  291. .insert-button:active {
  292. transform: scale(0.95);
  293. }
  294. /* 编辑区域恢复默认鼠标样式 */
  295. .word-group-card .editable-area {
  296. cursor: default;
  297. }
  298. .word-group-card .editable-area input {
  299. cursor: text;
  300. }
  301. .word-group-card .editable-area button {
  302. cursor: pointer;
  303. }
  304. .word-group-card .editable-area .tag-item {
  305. cursor: pointer;
  306. }
  307. /* 拖拽手柄样式 */
  308. .drag-handle {
  309. cursor: grab;
  310. transition: all 0.2s;
  311. }
  312. .drag-handle:active {
  313. cursor: grabbing;
  314. }
  315. /* SortableJS 拖拽样式 */
  316. .sortable-ghost {
  317. opacity: 0.4;
  318. background: #dbeafe;
  319. border: 2px dashed #3b82f6;
  320. }
  321. .sortable-chosen {
  322. background: #f0f9ff;
  323. border-color: #3b82f6;
  324. }
  325. .sortable-drag {
  326. opacity: 0.8;
  327. box-shadow: 0 10px 20px rgba(0,0,0,0.2);
  328. transform: rotate(2deg);
  329. }
  330. /* 独立区域复选框组 */
  331. .checkbox-grid {
  332. display: grid;
  333. grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  334. gap: 0.75rem;
  335. }
  336. .checkbox-card {
  337. display: flex;
  338. align-items: center;
  339. padding: 0.5rem;
  340. border: 1px solid #e5e7eb;
  341. border-radius: 0.375rem;
  342. background-color: #fff;
  343. cursor: pointer;
  344. transition: all 0.15s;
  345. }
  346. .checkbox-card:hover {
  347. border-color: #93c5fd;
  348. background-color: #eff6ff;
  349. }
  350. .checkbox-card input:checked + span {
  351. color: #2563eb;
  352. font-weight: 500;
  353. }
  354. /* ==========================================
  355. 拖拽上传遮罩层
  356. ========================================== */
  357. .drop-overlay {
  358. position: absolute;
  359. top: 0;
  360. left: 0;
  361. right: 0;
  362. bottom: 0;
  363. background: rgba(59, 130, 246, 0.9);
  364. display: flex;
  365. align-items: center;
  366. justify-content: center;
  367. z-index: 100;
  368. pointer-events: all;
  369. }
  370. .drop-overlay.hidden {
  371. display: none;
  372. }
  373. .drop-overlay-content {
  374. text-align: center;
  375. color: white;
  376. }
  377. .drop-overlay-content i {
  378. font-size: 3rem;
  379. margin-bottom: 0.5rem;
  380. animation: bounce 1s infinite;
  381. }
  382. @keyframes bounce {
  383. 0%, 100% { transform: translateY(0); }
  384. 50% { transform: translateY(-10px); }
  385. }
  386. /* ==========================================
  387. Toast 提示
  388. ========================================== */
  389. .toast-notification {
  390. position: fixed;
  391. bottom: 24px;
  392. right: 24px;
  393. display: flex;
  394. align-items: center;
  395. gap: 0.75rem;
  396. padding: 0.875rem 1.25rem;
  397. border-radius: 0.5rem;
  398. font-size: 0.875rem;
  399. font-weight: 500;
  400. box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
  401. z-index: 9999;
  402. opacity: 0;
  403. transform: translateY(20px);
  404. transition: all 0.3s ease;
  405. }
  406. .toast-notification.show {
  407. opacity: 1;
  408. transform: translateY(0);
  409. }
  410. .toast-notification i {
  411. font-size: 1.125rem;
  412. }
  413. /* Toast 类型样式 */
  414. .toast-success {
  415. background: #10b981;
  416. color: white;
  417. }
  418. .toast-error {
  419. background: #ef4444;
  420. color: white;
  421. }
  422. .toast-info {
  423. background: #3b82f6;
  424. color: white;
  425. }
  426. .toast-warning {
  427. background: #f59e0b;
  428. color: white;
  429. }
  430. /* ==========================================
  431. 弹窗样式
  432. ========================================== */
  433. .modal-overlay {
  434. position: fixed;
  435. top: 0;
  436. left: 0;
  437. right: 0;
  438. bottom: 0;
  439. background: rgba(0, 0, 0, 0.5);
  440. display: flex;
  441. align-items: center;
  442. justify-content: center;
  443. z-index: 1000;
  444. }
  445. .modal-overlay.hidden {
  446. display: none;
  447. }
  448. .modal-content {
  449. background: white;
  450. border-radius: 0.75rem;
  451. padding: 1.5rem;
  452. max-width: 450px;
  453. width: 90%;
  454. max-height: 90vh;
  455. overflow-y: auto;
  456. box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
  457. }
  458. /* 弹簧跳动动画 */
  459. @keyframes spring-in {
  460. 0% { transform: scale(0.5); opacity: 0; }
  461. 60% { transform: scale(1.1); }
  462. 80% { transform: scale(0.95); }
  463. 100% { transform: scale(1); opacity: 1; }
  464. }
  465. .support-modal-content {
  466. animation: spring-in 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  467. background: #ffffff;
  468. border: none;
  469. border-radius: 1.5rem;
  470. }
  471. /* 柔软卡片设计 */
  472. .support-card {
  473. position: relative;
  474. display: flex;
  475. flex-direction: column;
  476. align-items: center;
  477. padding: 1.5rem;
  478. background: #fdfdfd;
  479. border: 1px solid #f3f4f6;
  480. border-radius: 1.25rem;
  481. transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  482. text-decoration: none;
  483. cursor: pointer;
  484. overflow: hidden;
  485. }
  486. .support-card:hover {
  487. transform: translateY(-8px) scale(1.02);
  488. background: white;
  489. box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.05), 0 10px 10px -5px rgba(0, 0, 0, 0.02);
  490. border-color: #e5e7eb;
  491. }
  492. .support-card-num {
  493. position: absolute;
  494. top: 1rem;
  495. right: 1.25rem;
  496. font-size: 0.75rem;
  497. font-weight: 800;
  498. color: #f3f4f6;
  499. font-style: italic;
  500. transition: color 0.3s;
  501. }
  502. .support-card:hover .support-card-num {
  503. color: #e5e7eb;
  504. }
  505. .support-icon {
  506. width: 3.5rem;
  507. height: 3.5rem;
  508. border-radius: 1rem;
  509. display: flex;
  510. align-items: center;
  511. justify-content: center;
  512. font-size: 1.5rem;
  513. margin-bottom: 1rem;
  514. transition: all 0.3s ease;
  515. }
  516. .support-card:hover .support-icon {
  517. transform: rotate(12deg) scale(1.1);
  518. }
  519. .support-btn {
  520. margin-top: auto;
  521. width: 100%;
  522. text-align: center;
  523. padding: 0.5rem;
  524. border-radius: 0.75rem;
  525. font-size: 0.75rem;
  526. font-weight: bold;
  527. color: white;
  528. transition: all 0.3s;
  529. }
  530. /* ==========================================
  531. Timeline 编辑器样式
  532. ========================================== */
  533. /* 预设模式选择卡片 */
  534. .tl-preset-card {
  535. border: 2px solid #e5e7eb;
  536. border-radius: 0.75rem;
  537. padding: 0.875rem;
  538. cursor: pointer;
  539. transition: all 0.2s;
  540. background: white;
  541. position: relative;
  542. }
  543. .tl-preset-card:hover {
  544. border-color: #93c5fd;
  545. background: #f0f7ff;
  546. }
  547. .tl-preset-card.selected {
  548. border-color: #3b82f6;
  549. background: #eff6ff;
  550. box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
  551. }
  552. .tl-preset-card .tl-card-icon {
  553. width: 2rem;
  554. height: 2rem;
  555. border-radius: 0.5rem;
  556. display: flex;
  557. align-items: center;
  558. justify-content: center;
  559. font-size: 0.875rem;
  560. flex-shrink: 0;
  561. }
  562. .tl-preset-card .tl-recommend-badge {
  563. position: absolute;
  564. top: -1px;
  565. right: -1px;
  566. background: linear-gradient(135deg, #f59e0b, #ef4444);
  567. color: white;
  568. font-size: 0.625rem;
  569. font-weight: 700;
  570. padding: 0.125rem 0.5rem;
  571. border-radius: 0 0.625rem 0 0.5rem;
  572. }
  573. /* 周视图时间线 */
  574. .tl-week-view {
  575. background: white;
  576. border: 1px solid #e5e7eb;
  577. border-radius: 0.75rem;
  578. padding: 1rem;
  579. overflow-x: auto;
  580. }
  581. .tl-week-row {
  582. display: flex;
  583. align-items: center;
  584. height: 2.25rem;
  585. margin-bottom: 0.25rem;
  586. }
  587. .tl-week-row:last-child {
  588. margin-bottom: 0;
  589. }
  590. .tl-day-label {
  591. width: 2.5rem;
  592. flex-shrink: 0;
  593. font-size: 0.6875rem;
  594. font-weight: 600;
  595. color: #6b7280;
  596. text-align: right;
  597. padding-right: 0.5rem;
  598. }
  599. .tl-day-label.today {
  600. color: #3b82f6;
  601. font-weight: 700;
  602. }
  603. .tl-timeline-bar {
  604. flex: 1;
  605. height: 1.75rem;
  606. background: #f1f5f9;
  607. border-radius: 0.25rem;
  608. position: relative;
  609. min-width: 480px;
  610. overflow: hidden;
  611. }
  612. .tl-period-block {
  613. position: absolute;
  614. top: 2px;
  615. bottom: 2px;
  616. border-radius: 0.1875rem;
  617. cursor: pointer;
  618. transition: filter 0.15s, transform 0.15s;
  619. display: flex;
  620. align-items: center;
  621. justify-content: center;
  622. overflow: hidden;
  623. z-index: 1;
  624. }
  625. .tl-period-block:hover {
  626. filter: brightness(1.1);
  627. transform: scaleY(1.15);
  628. z-index: 2;
  629. }
  630. .tl-period-block .tl-block-label {
  631. font-size: 0.5625rem;
  632. font-weight: 600;
  633. color: rgba(255,255,255,0.9);
  634. white-space: nowrap;
  635. text-overflow: ellipsis;
  636. overflow: hidden;
  637. padding: 0 0.25rem;
  638. text-shadow: 0 1px 2px rgba(0,0,0,0.2);
  639. }
  640. /* 时间段颜色 */
  641. .tl-block-push { background: #3b82f6; }
  642. .tl-block-analyze { background: #8b5cf6; }
  643. .tl-block-push-analyze { background: #6366f1; }
  644. .tl-block-collect { background: #94a3b8; }
  645. .tl-block-silent { background: #cbd5e1; }
  646. /* 时间刻度 */
  647. .tl-hour-markers {
  648. display: flex;
  649. padding-left: 2.5rem;
  650. margin-bottom: 0.25rem;
  651. }
  652. .tl-hour-marker {
  653. font-size: 0.5625rem;
  654. color: #9ca3af;
  655. text-align: center;
  656. }
  657. /* 图例 */
  658. .tl-legend {
  659. display: flex;
  660. gap: 0.75rem;
  661. flex-wrap: wrap;
  662. padding-top: 0.5rem;
  663. border-top: 1px solid #f3f4f6;
  664. margin-top: 0.5rem;
  665. }
  666. .tl-legend-item {
  667. display: flex;
  668. align-items: center;
  669. gap: 0.25rem;
  670. font-size: 0.625rem;
  671. color: #6b7280;
  672. }
  673. .tl-legend-color {
  674. width: 0.75rem;
  675. height: 0.5rem;
  676. border-radius: 0.125rem;
  677. }
  678. /* 时间段 Tooltip */
  679. .tl-tooltip {
  680. position: fixed;
  681. background: #1f2937;
  682. color: white;
  683. padding: 0.5rem 0.75rem;
  684. border-radius: 0.375rem;
  685. font-size: 0.75rem;
  686. z-index: 1000;
  687. pointer-events: none;
  688. box-shadow: 0 4px 12px rgba(0,0,0,0.2);
  689. max-width: 220px;
  690. }
  691. .tl-tooltip::after {
  692. content: '';
  693. position: absolute;
  694. bottom: -4px;
  695. left: 50%;
  696. transform: translateX(-50%);
  697. border-left: 5px solid transparent;
  698. border-right: 5px solid transparent;
  699. border-top: 5px solid #1f2937;
  700. }
  701. /* Custom 模式编辑面板 */
  702. .tl-section-title {
  703. font-size: 0.75rem;
  704. font-weight: 700;
  705. color: #374151;
  706. display: flex;
  707. align-items: center;
  708. gap: 0.5rem;
  709. margin-bottom: 0.75rem;
  710. }
  711. .tl-section-title i {
  712. color: #3b82f6;
  713. font-size: 0.6875rem;
  714. }
  715. .tl-period-card {
  716. background: white;
  717. border: 1px solid #e5e7eb;
  718. border-radius: 0.5rem;
  719. padding: 0.75rem;
  720. transition: all 0.2s;
  721. }
  722. .tl-period-card:hover {
  723. border-color: #93c5fd;
  724. box-shadow: 0 2px 4px rgba(0,0,0,0.05);
  725. }
  726. .tl-toggle-row {
  727. display: flex;
  728. align-items: center;
  729. gap: 0.75rem;
  730. flex-wrap: wrap;
  731. }
  732. .tl-toggle-item {
  733. display: flex;
  734. align-items: center;
  735. gap: 0.375rem;
  736. font-size: 0.6875rem;
  737. color: #4b5563;
  738. }
  739. .tl-toggle-item.on { color: #2563eb; font-weight: 600; }
  740. .tl-toggle-item.off { color: #9ca3af; }
  741. /* Timeline 小型 toggle 开关 */
  742. .tl-toggle-item .toggle-checkbox {
  743. width: 1rem;
  744. height: 1rem;
  745. border-width: 3px;
  746. }
  747. .tl-toggle-item .toggle-label {
  748. height: 1rem;
  749. }
  750. .tl-toggle-item .toggle-checkbox:checked {
  751. right: 0;
  752. border-color: #3b82f6;
  753. }
  754. .tl-toggle-item .toggle-checkbox:checked + .toggle-label {
  755. background-color: #3b82f6;
  756. }
  757. /* 日计划和周映射 */
  758. .tl-dayplan-row {
  759. display: flex;
  760. align-items: center;
  761. gap: 0.5rem;
  762. padding: 0.375rem 0;
  763. }
  764. .tl-dayplan-label {
  765. width: 3.5rem;
  766. font-size: 0.6875rem;
  767. font-weight: 600;
  768. color: #374151;
  769. flex-shrink: 0;
  770. }
  771. .tl-weekmap-select {
  772. font-size: 0.75rem;
  773. padding: 0.25rem 0.5rem;
  774. border: 1px solid #d1d5db;
  775. border-radius: 0.25rem;
  776. background: white;
  777. flex: 1;
  778. max-width: 200px;
  779. }
  780. .tl-weekmap-select:focus {
  781. border-color: #3b82f6;
  782. box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
  783. outline: none;
  784. }
  785. /* Default 配置折叠面板 */
  786. .tl-collapsible {
  787. border: 1px solid #e5e7eb;
  788. border-radius: 0.5rem;
  789. overflow: hidden;
  790. }
  791. .tl-collapsible-header {
  792. background: #f9fafb;
  793. padding: 0.625rem 0.75rem;
  794. cursor: pointer;
  795. display: flex;
  796. align-items: center;
  797. justify-content: space-between;
  798. font-size: 0.75rem;
  799. font-weight: 600;
  800. color: #4b5563;
  801. transition: background 0.15s;
  802. }
  803. .tl-collapsible-header:hover {
  804. background: #f3f4f6;
  805. }
  806. .tl-collapsible-body {
  807. padding: 0.75rem;
  808. border-top: 1px solid #e5e7eb;
  809. }
  810. .tl-collapsible-body.collapsed {
  811. display: none;
  812. }
  813. .tl-collapsible-header .fa-chevron-down {
  814. transition: transform 0.2s;
  815. }
  816. .tl-collapsible-header.is-collapsed .fa-chevron-down {
  817. transform: rotate(-90deg);
  818. }
  819. /* Timeline CRUD 新增样式 */
  820. /* 预设卡片操作按钮 */
  821. .tl-card-actions {
  822. display: none;
  823. position: absolute;
  824. top: 0.375rem;
  825. right: 0.375rem;
  826. gap: 0.25rem;
  827. z-index: 2;
  828. }
  829. .tl-preset-card:hover .tl-card-actions {
  830. display: flex;
  831. }
  832. .tl-card-action-btn {
  833. width: 1.5rem;
  834. height: 1.5rem;
  835. display: flex;
  836. align-items: center;
  837. justify-content: center;
  838. border-radius: 0.375rem;
  839. font-size: 0.625rem;
  840. color: #9ca3af;
  841. background: rgba(255,255,255,0.9);
  842. border: 1px solid #e5e7eb;
  843. cursor: pointer;
  844. transition: all 0.15s;
  845. }
  846. .tl-card-action-btn:hover {
  847. color: #3b82f6;
  848. background: white;
  849. border-color: #93c5fd;
  850. }
  851. .tl-card-action-btn.text-red-400:hover {
  852. color: #ef4444;
  853. border-color: #fca5a5;
  854. }
  855. /* 新建模式卡片 */
  856. .tl-new-preset-card {
  857. border-style: dashed;
  858. border-color: #d1d5db;
  859. background: #fafafa;
  860. }
  861. .tl-new-preset-card:hover {
  862. border-color: #a78bfa;
  863. background: #faf5ff;
  864. }
  865. /* section 内的新增按钮 */
  866. .tl-add-btn {
  867. font-size: 0.625rem;
  868. font-weight: 600;
  869. color: #3b82f6;
  870. background: #eff6ff;
  871. border: 1px solid #bfdbfe;
  872. border-radius: 0.375rem;
  873. padding: 0.125rem 0.5rem;
  874. cursor: pointer;
  875. transition: all 0.15s;
  876. }
  877. .tl-add-btn:hover {
  878. background: #dbeafe;
  879. border-color: #93c5fd;
  880. }
  881. /* period 卡片内联操作 */
  882. .tl-inline-btn {
  883. width: 1.375rem;
  884. height: 1.375rem;
  885. display: inline-flex;
  886. align-items: center;
  887. justify-content: center;
  888. border-radius: 0.25rem;
  889. font-size: 0.625rem;
  890. color: #9ca3af;
  891. background: transparent;
  892. border: none;
  893. cursor: pointer;
  894. transition: all 0.15s;
  895. opacity: 0;
  896. }
  897. .tl-period-card:hover .tl-inline-btn,
  898. .tl-dayplan-card:hover .tl-inline-btn {
  899. opacity: 1;
  900. }
  901. .tl-inline-btn:hover {
  902. color: #3b82f6;
  903. background: #eff6ff;
  904. }
  905. .tl-inline-btn.text-red-400:hover {
  906. color: #ef4444;
  907. background: #fef2f2;
  908. }
  909. /* 日计划中的 period tag */
  910. .tl-period-tag {
  911. display: inline-flex;
  912. align-items: center;
  913. gap: 0.25rem;
  914. font-size: 0.625rem;
  915. padding: 0.125rem 0.5rem;
  916. border-radius: 9999px;
  917. color: white;
  918. white-space: nowrap;
  919. }
  920. .tl-tag-remove {
  921. font-size: 0.75rem;
  922. font-weight: 700;
  923. line-height: 1;
  924. color: rgba(255,255,255,0.7);
  925. background: none;
  926. border: none;
  927. cursor: pointer;
  928. padding: 0;
  929. margin-left: 0.125rem;
  930. }
  931. .tl-tag-remove:hover {
  932. color: white;
  933. }
  934. /* 添加时间段到日计划的 select */
  935. .tl-add-period-select {
  936. font-size: 0.625rem;
  937. padding: 0.0625rem 0.375rem;
  938. border: 1px dashed #d1d5db;
  939. border-radius: 9999px;
  940. background: #f9fafb;
  941. color: #6b7280;
  942. cursor: pointer;
  943. transition: all 0.15s;
  944. }
  945. .tl-add-period-select:hover {
  946. border-color: #93c5fd;
  947. color: #3b82f6;
  948. }
  949. /* 周映射快捷按钮 */
  950. .tl-quick-btn {
  951. font-size: 0.625rem;
  952. font-weight: 500;
  953. color: #6b7280;
  954. background: #f3f4f6;
  955. border: 1px solid #e5e7eb;
  956. border-radius: 0.375rem;
  957. padding: 0.25rem 0.5rem;
  958. cursor: pointer;
  959. transition: all 0.15s;
  960. }
  961. .tl-quick-btn:hover {
  962. color: #3b82f6;
  963. background: #eff6ff;
  964. border-color: #93c5fd;
  965. }
  966. /* 当前时间指示线 */
  967. .tl-now-line {
  968. position: absolute;
  969. top: -2px;
  970. bottom: -2px;
  971. width: 2px;
  972. background: #ef4444;
  973. z-index: 5;
  974. pointer-events: none;
  975. }
  976. .tl-now-line::before {
  977. content: '';
  978. position: absolute;
  979. top: -3px;
  980. left: -3px;
  981. width: 8px;
  982. height: 8px;
  983. border-radius: 50%;
  984. background: #ef4444;
  985. }
  986. /* 周视图色块点击态 */
  987. .tl-period-block {
  988. cursor: pointer;
  989. }
  990. .tl-period-block:hover {
  991. filter: brightness(1.1);
  992. box-shadow: 0 0 0 2px rgba(255,255,255,0.6);
  993. }
  994. /* period 卡片高亮动画 */
  995. .tl-period-highlight {
  996. animation: tl-highlight-pulse 1.5s ease-out;
  997. }
  998. @keyframes tl-highlight-pulse {
  999. 0% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.5); }
  1000. 30% { box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.3); }
  1001. 100% { box-shadow: none; }
  1002. }
  1003. /* 内联编辑输入框 */
  1004. .tl-inline-input {
  1005. background: white;
  1006. border: 1px solid #93c5fd;
  1007. border-radius: 0.25rem;
  1008. padding: 0 0.25rem;
  1009. outline: none;
  1010. box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
  1011. color: #1f2937;
  1012. }
  1013. .tl-editable {
  1014. cursor: text;
  1015. border-radius: 0.25rem;
  1016. transition: background 0.15s;
  1017. }
  1018. .tl-editable:hover {
  1019. background: rgba(59, 130, 246, 0.06);
  1020. }
  1021. /* 日计划 Tag 拖拽排序 */
  1022. .tl-period-tag {
  1023. cursor: grab;
  1024. }
  1025. .tl-period-tag:active {
  1026. cursor: grabbing;
  1027. }
  1028. .tl-tag-ghost {
  1029. opacity: 0.4;
  1030. }
  1031. .tl-tag-drag {
  1032. transform: rotate(2deg);
  1033. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  1034. }