index.css 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. body {
  2. margin: 0;
  3. padding: 0;
  4. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  5. background-color: #f5f7fa;
  6. }
  7. .wrapper {
  8. padding-top: 10px;
  9. }
  10. /* 现代化导航栏样式 */
  11. .main-navbar {
  12. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  13. color: white;
  14. padding: 12px 20px;
  15. display: flex;
  16. justify-content: space-between;
  17. align-items: center;
  18. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  19. position: sticky;
  20. top: 0;
  21. z-index: 1000;
  22. margin-bottom: 0;
  23. }
  24. .navbar-brand {
  25. display: flex;
  26. align-items: center;
  27. }
  28. .brand-link {
  29. color: white;
  30. text-decoration: none;
  31. display: flex;
  32. align-items: center;
  33. transition: all 0.3s ease;
  34. }
  35. .brand-link:hover {
  36. color: rgba(255, 255, 255, 0.9);
  37. transform: translateY(-1px);
  38. }
  39. .brand-link img {
  40. margin-right: 8px;
  41. border-radius: 2px;
  42. }
  43. .brand-text {
  44. font-size: 18px;
  45. font-weight: 600;
  46. margin-right: 8px;
  47. }
  48. .brand-subtitle {
  49. font-size: 14px;
  50. opacity: 0.9;
  51. position: relative;
  52. padding-left: 8px;
  53. }
  54. .brand-subtitle::before {
  55. content: "·";
  56. position: absolute;
  57. left: 0;
  58. top: 50%;
  59. transform: translateY(-50%);
  60. font-weight: bold;
  61. opacity: 0.7;
  62. }
  63. .navbar-actions {
  64. display: flex;
  65. align-items: center;
  66. gap: 8px;
  67. }
  68. .nav-item {
  69. color: rgba(255, 255, 255, 0.9);
  70. text-decoration: none;
  71. padding: 8px 16px;
  72. border-radius: 6px;
  73. font-size: 14px;
  74. font-weight: 500;
  75. display: flex;
  76. align-items: center;
  77. gap: 6px;
  78. transition: all 0.3s ease;
  79. position: relative;
  80. overflow: hidden;
  81. cursor: pointer;
  82. }
  83. .nav-item:hover {
  84. background: rgba(255, 255, 255, 0.1);
  85. color: white;
  86. transform: translateY(-2px);
  87. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  88. }
  89. .nav-item:active {
  90. transform: translateY(0);
  91. }
  92. .nav-icon {
  93. font-style: normal;
  94. font-size: 16px;
  95. transition: transform 0.3s ease;
  96. }
  97. .nav-item:hover .nav-icon {
  98. transform: scale(1.1);
  99. }
  100. .nav-item::after {
  101. content: '';
  102. position: absolute;
  103. top: 0;
  104. left: -100%;
  105. width: 100%;
  106. height: 100%;
  107. background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  108. transition: left 0.5s;
  109. }
  110. .nav-item:hover::after {
  111. left: 100%;
  112. }
  113. .navbar-actions .donate-link {
  114. background: rgba(255, 107, 107, 0.2);
  115. border: 1px solid rgba(255, 107, 107, 0.3);
  116. }
  117. .navbar-actions .donate-link:hover {
  118. background: rgba(255, 107, 107, 0.3);
  119. border-color: rgba(255, 107, 107, 0.5);
  120. box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3);
  121. }
  122. .navbar-actions .donate-link .nav-icon {
  123. color: #ff6b6b;
  124. animation: heartbeat 2s ease-in-out infinite;
  125. }
  126. .navbar-actions .donate-link:hover .nav-icon {
  127. color: #ff5252;
  128. animation: heartbeat 1s ease-in-out infinite;
  129. }
  130. .navbar-actions .other-tools-link {
  131. background: rgba(255, 255, 255, 0.1);
  132. border: 1px solid rgba(255, 255, 255, 0.2);
  133. }
  134. .navbar-actions .other-tools-link:hover {
  135. background: rgba(255, 255, 255, 0.2);
  136. border-color: rgba(255, 255, 255, 0.3);
  137. }
  138. .navbar-actions .other-tools-link .nav-icon {
  139. color: #4ecdc4;
  140. font-weight: bold;
  141. }
  142. .navbar-actions .other-tools-link:hover .nav-icon {
  143. color: #26d0ce;
  144. animation: rotate 0.6s ease-in-out;
  145. }
  146. @keyframes heartbeat {
  147. 0%, 14%, 28%, 42%, 70% {
  148. transform: scale(1);
  149. }
  150. 7%, 21%, 35% {
  151. transform: scale(1.1);
  152. }
  153. }
  154. @keyframes rotate {
  155. 0% {
  156. transform: rotate(0deg);
  157. }
  158. 100% {
  159. transform: rotate(360deg);
  160. }
  161. }
  162. .tool-market-badge {
  163. background: rgba(255, 255, 255, 0.2);
  164. padding: 2px 8px;
  165. border-radius: 10px;
  166. font-size: 11px;
  167. font-weight: 500;
  168. margin-left: 4px;
  169. border: 1px solid rgba(255, 255, 255, 0.3);
  170. }
  171. /* 响应式导航栏 */
  172. @media (max-width: 768px) {
  173. .main-navbar {
  174. padding: 10px 15px;
  175. flex-direction: column;
  176. gap: 10px;
  177. }
  178. .navbar-actions {
  179. width: 100%;
  180. justify-content: center;
  181. flex-wrap: wrap;
  182. }
  183. .nav-item {
  184. font-size: 13px;
  185. padding: 6px 12px;
  186. }
  187. .brand-subtitle {
  188. display: none;
  189. }
  190. }
  191. @media (max-width: 600px) {
  192. .nav-item span {
  193. display: none;
  194. }
  195. .nav-icon {
  196. font-size: 18px;
  197. }
  198. .tool-market-badge {
  199. display: none;
  200. }
  201. }
  202. .panel {
  203. background: white;
  204. border-radius: 8px;
  205. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
  206. overflow: hidden;
  207. margin-top: 0;
  208. }
  209. .panel-heading {
  210. display: none; /* 隐藏旧的导航栏 */
  211. }
  212. .panel-title {
  213. display: none; /* 隐藏旧的标题样式 */
  214. }
  215. /* 移除旧的导航栏样式 */
  216. .x-a-high,
  217. .x-other-tools,
  218. .x-donate-link,
  219. .icon-plus-circle {
  220. display: none;
  221. }
  222. .panel-body {
  223. padding: 20px;
  224. }
  225. /* 主要内容布局 */
  226. .main-content-layout {
  227. display: flex;
  228. gap: 20px;
  229. height: calc(100vh - 120px);
  230. min-height: 600px;
  231. }
  232. /* 左侧配置区域 */
  233. .config-section {
  234. flex: 0 0 500px;
  235. min-width: 480px;
  236. overflow-y: auto;
  237. padding-right: 10px;
  238. }
  239. /* 配置区域滚动条样式 */
  240. .config-section::-webkit-scrollbar {
  241. width: 6px;
  242. }
  243. .config-section::-webkit-scrollbar-track {
  244. background: #f1f1f1;
  245. border-radius: 3px;
  246. }
  247. .config-section::-webkit-scrollbar-thumb {
  248. background: #c1c1c1;
  249. border-radius: 3px;
  250. }
  251. .config-section::-webkit-scrollbar-thumb:hover {
  252. background: #a8a8a8;
  253. }
  254. /* 右侧结果区域 */
  255. .result-section {
  256. flex: 1;
  257. display: flex;
  258. flex-direction: column;
  259. }
  260. .result-panel {
  261. background: #f8f9fa;
  262. border-radius: 8px;
  263. border: 1px solid #e9ecef;
  264. height: 100%;
  265. display: flex;
  266. flex-direction: column;
  267. overflow: hidden;
  268. }
  269. .result-header {
  270. background: linear-gradient(135deg, #ddd 0%, #eee 100%);
  271. color: #000;
  272. padding: 10px 20px;
  273. display: flex;
  274. justify-content: space-between;
  275. align-items: center;
  276. border-bottom: none;
  277. }
  278. .result-header h4 {
  279. margin: 0;
  280. color: #000;
  281. font-size: 16px;
  282. font-weight: 600;
  283. }
  284. .result-actions {
  285. display: flex;
  286. align-items: center;
  287. gap: 10px;
  288. }
  289. .data-size {
  290. background: rgba(255, 255, 255, 0.2);
  291. padding: 4px 8px;
  292. border-radius: 12px;
  293. font-size: 12px;
  294. font-weight: 500;
  295. }
  296. .btn-sm {
  297. padding: 6px 12px;
  298. font-size: 12px;
  299. border-radius: 4px;
  300. }
  301. .result-content {
  302. flex: 1;
  303. overflow: auto;
  304. background: white;
  305. }
  306. .result-content pre {
  307. margin: 0;
  308. padding: 20px;
  309. background: #282c34;
  310. color: #abb2bf;
  311. font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
  312. font-size: 13px;
  313. line-height: 1.5;
  314. overflow-x: auto;
  315. white-space: pre-wrap;
  316. word-wrap: break-word;
  317. height: 100%;
  318. box-sizing: border-box;
  319. }
  320. /* 空结果状态 */
  321. .empty-result {
  322. display: flex;
  323. flex-direction: column;
  324. align-items: center;
  325. justify-content: center;
  326. height: 100%;
  327. color: #6c757d;
  328. text-align: center;
  329. padding: 40px 20px;
  330. }
  331. .empty-icon {
  332. font-size: 48px;
  333. margin-bottom: 20px;
  334. opacity: 0.7;
  335. }
  336. .empty-text h5 {
  337. margin: 0 0 10px 0;
  338. color: #495057;
  339. font-size: 18px;
  340. font-weight: 600;
  341. }
  342. .empty-text p {
  343. margin: 0;
  344. color: #6c757d;
  345. font-size: 14px;
  346. }
  347. /* 数据类型选择区域 - 紧凑样式 */
  348. .data-type-section {
  349. margin-bottom: 20px;
  350. }
  351. .data-type-section h4 {
  352. margin: 0 0 10px 0;
  353. color: #333;
  354. font-size: 15px;
  355. font-weight: 600;
  356. }
  357. .data-type-tabs {
  358. display: flex;
  359. gap: 2px;
  360. background: #f1f3f4;
  361. border-radius: 6px;
  362. padding: 3px;
  363. }
  364. .data-tab {
  365. flex: 1;
  366. padding: 8px 12px;
  367. border: none;
  368. background: transparent;
  369. color: #666;
  370. border-radius: 4px;
  371. cursor: pointer;
  372. transition: all 0.3s ease;
  373. font-size: 13px;
  374. font-weight: 500;
  375. }
  376. .data-tab:hover {
  377. background: rgba(102, 126, 234, 0.1);
  378. color: #667eea;
  379. }
  380. .data-tab.active {
  381. background: #667eea;
  382. color: white;
  383. box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
  384. }
  385. /* 数据内容区域 - 紧凑样式 */
  386. .data-content {
  387. margin-bottom: 20px;
  388. }
  389. .field-group h5 {
  390. margin: 0 0 10px 0;
  391. color: #444;
  392. font-size: 13px;
  393. font-weight: 600;
  394. border-bottom: 1px solid #e9ecef;
  395. padding-bottom: 6px;
  396. }
  397. .field-row {
  398. display: flex;
  399. flex-wrap: wrap;
  400. gap: 12px;
  401. margin-bottom: 12px;
  402. }
  403. .field-row label {
  404. display: flex;
  405. align-items: center;
  406. cursor: pointer;
  407. font-size: 13px;
  408. color: #555;
  409. min-width: 110px;
  410. transition: color 0.3s ease;
  411. }
  412. .field-row label:hover {
  413. color: #667eea;
  414. }
  415. .field-row input[type="checkbox"] {
  416. margin-right: 6px;
  417. width: 14px;
  418. height: 14px;
  419. cursor: pointer;
  420. }
  421. /* 自定义数据区域 - 紧凑样式 */
  422. .custom-input {
  423. display: flex;
  424. align-items: center;
  425. margin-bottom: 10px;
  426. gap: 8px;
  427. }
  428. .custom-input label {
  429. min-width: 80px;
  430. font-size: 13px;
  431. color: #555;
  432. font-weight: 500;
  433. }
  434. .custom-input input,
  435. .custom-input select {
  436. flex: 1;
  437. padding: 6px 10px;
  438. border: 1px solid #ddd;
  439. border-radius: 4px;
  440. font-size: 13px;
  441. transition: border-color 0.3s ease;
  442. }
  443. .custom-input input:focus,
  444. .custom-input select:focus {
  445. outline: none;
  446. border-color: #667eea;
  447. box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.1);
  448. }
  449. .custom-fields-list {
  450. margin-top: 15px;
  451. padding: 12px;
  452. background: #f8f9fa;
  453. border-radius: 6px;
  454. }
  455. .custom-field-item {
  456. display: flex;
  457. justify-content: space-between;
  458. align-items: center;
  459. padding: 6px 0;
  460. border-bottom: 1px solid #e9ecef;
  461. font-size: 13px;
  462. }
  463. .custom-field-item:last-child {
  464. border-bottom: none;
  465. }
  466. .btn-remove {
  467. background: #dc3545;
  468. color: white;
  469. border: none;
  470. padding: 4px 8px;
  471. border-radius: 3px;
  472. font-size: 12px;
  473. cursor: pointer;
  474. transition: background 0.3s ease;
  475. }
  476. .btn-remove:hover {
  477. background: #c82333;
  478. }
  479. /* 生成配置 - 紧凑样式 */
  480. .generate-config {
  481. margin-bottom: 20px;
  482. padding: 12px;
  483. background: #f8f9fa;
  484. border-radius: 6px;
  485. border-left: 4px solid #667eea;
  486. }
  487. .generate-config .config-row {
  488. display: flex;
  489. align-items: center;
  490. gap: 8px;
  491. margin-bottom: 8px;
  492. }
  493. .generate-config .config-row:last-child {
  494. margin-bottom: 0;
  495. }
  496. /* 操作按钮 - 紧凑样式 */
  497. .action-buttons {
  498. display: flex;
  499. gap: 6px;
  500. margin-bottom: 20px;
  501. flex-wrap: wrap;
  502. }
  503. .action-buttons .btn {
  504. flex: 1;
  505. min-width: 70px;
  506. padding: 4px 14px;
  507. font-size: 13px;
  508. }
  509. /* 快速模板区域 - 顶部样式 */
  510. .template-section.template-top {
  511. margin-top: 0;
  512. margin-bottom: 15px;
  513. padding-top: 0;
  514. border-top: none;
  515. padding-bottom: 12px;
  516. border-bottom: 1px solid #e9ecef;
  517. }
  518. .template-section.template-top h4 {
  519. margin: 0 0 10px 0;
  520. color: #333;
  521. font-size: 15px;
  522. font-weight: 600;
  523. }
  524. /* 顶部操作按钮 - 特殊样式 */
  525. .action-buttons-top {
  526. margin-bottom: 15px;
  527. padding-bottom: 15px;
  528. border-bottom: 2px solid #e9ecef;
  529. display: flex;
  530. gap: 8px;
  531. flex-wrap: wrap;
  532. }
  533. .action-buttons-top .btn {
  534. flex: 1;
  535. min-width: 90px;
  536. padding: 10px 16px;
  537. font-size: 14px;
  538. font-weight: 600;
  539. border-radius: 6px;
  540. transition: all 0.3s ease;
  541. }
  542. .action-buttons-top .btn-success {
  543. background: linear-gradient(135deg, #28a745 0%, #20c997 100%);
  544. box-shadow: 0 2px 8px rgba(40, 167, 69, 0.3);
  545. }
  546. .action-buttons-top .btn-success:hover {
  547. transform: translateY(-2px);
  548. box-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
  549. }
  550. .action-buttons-top .btn-info {
  551. background: linear-gradient(135deg, #17a2b8 0%, #6f42c1 100%);
  552. box-shadow: 0 2px 8px rgba(23, 162, 184, 0.3);
  553. }
  554. .action-buttons-top .btn-info:hover {
  555. transform: translateY(-2px);
  556. box-shadow: 0 4px 15px rgba(23, 162, 184, 0.4);
  557. }
  558. .action-buttons-top .btn-warning {
  559. background: linear-gradient(135deg, #ffc107 0%, #fd7e14 100%);
  560. box-shadow: 0 2px 8px rgba(255, 193, 7, 0.3);
  561. }
  562. .action-buttons-top .btn-warning:hover {
  563. transform: translateY(-2px);
  564. box-shadow: 0 4px 15px rgba(255, 193, 7, 0.4);
  565. }
  566. .template-buttons {
  567. display: grid;
  568. grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
  569. gap: 6px;
  570. }
  571. .template-buttons .btn-template {
  572. padding: 6px 10px;
  573. font-size: 12px;
  574. min-width: 80px;
  575. margin-bottom: 0;
  576. }
  577. /* 基础配置样式 - 紧凑调整 */
  578. .config-row label {
  579. font-size: 13px;
  580. color: #555;
  581. font-weight: 500;
  582. min-width: 70px;
  583. }
  584. .config-row input,
  585. .config-row select {
  586. padding: 5px 8px;
  587. border: 1px solid #ddd;
  588. border-radius: 4px;
  589. font-size: 13px;
  590. flex: 1;
  591. min-width: 100px;
  592. }
  593. /* 按钮基础样式调整 */
  594. .btn {
  595. padding: 8px 16px;
  596. border: none;
  597. border-radius: 4px;
  598. cursor: pointer;
  599. font-size: 13px;
  600. font-weight: 500;
  601. transition: all 0.3s ease;
  602. text-decoration: none;
  603. display: inline-flex;
  604. align-items: center;
  605. justify-content: center;
  606. }
  607. .btn:disabled {
  608. opacity: 0.4;
  609. cursor: not-allowed;
  610. background: #6c757d !important;
  611. color: rgba(255, 255, 255, 0.6) !important;
  612. transform: none !important;
  613. box-shadow: none !important;
  614. }
  615. .btn-success {
  616. background: #28a745;
  617. color: white;
  618. }
  619. .btn-success:hover:not(:disabled) {
  620. background: #218838;
  621. transform: translateY(-1px);
  622. box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3);
  623. }
  624. .btn-info {
  625. background: #17a2b8;
  626. color: white;
  627. }
  628. .btn-info:hover:not(:disabled) {
  629. background: #138496;
  630. transform: translateY(-1px);
  631. box-shadow: 0 4px 12px rgba(23, 162, 184, 0.3);
  632. }
  633. .btn-warning {
  634. background: #ffc107;
  635. color: #212529;
  636. }
  637. .btn-warning:hover:not(:disabled) {
  638. background: #e0a800;
  639. transform: translateY(-1px);
  640. box-shadow: 0 4px 12px rgba(255, 193, 7, 0.3);
  641. }
  642. .btn-primary {
  643. background: #667eea;
  644. color: white;
  645. }
  646. .btn-primary:hover:not(:disabled) {
  647. background: #5a6fd8;
  648. transform: translateY(-1px);
  649. box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
  650. }
  651. .btn-secondary {
  652. background: #6c757d;
  653. color: white;
  654. }
  655. .btn-secondary:hover:not(:disabled) {
  656. background: #5a6268;
  657. transform: translateY(-1px);
  658. box-shadow: 0 4px 12px rgba(108, 117, 125, 0.3);
  659. }
  660. .btn-template {
  661. background: #e9ecef;
  662. color: #495057;
  663. border: 1px solid #ced4da;
  664. }
  665. .btn-template:hover {
  666. background: #667eea;
  667. color: white;
  668. border-color: #667eea;
  669. transform: translateY(-1px);
  670. }
  671. /* 移除原有的模板区域样式 */
  672. .template-section:not(.template-top) {
  673. display: none;
  674. }
  675. /* 响应式调整 */
  676. @media (max-width: 1200px) {
  677. .config-section {
  678. flex: 0 0 400px;
  679. min-width: 360px;
  680. }
  681. }
  682. @media (max-width: 1024px) {
  683. .main-content-layout {
  684. flex-direction: column;
  685. height: auto;
  686. gap: 15px;
  687. }
  688. .config-section {
  689. flex: none;
  690. width: 100%;
  691. max-height: none;
  692. overflow-y: visible;
  693. padding-right: 0;
  694. }
  695. .result-section {
  696. flex: none;
  697. min-height: 400px;
  698. }
  699. .result-panel {
  700. height: 400px;
  701. }
  702. }
  703. @media (max-width: 768px) {
  704. .panel-body {
  705. padding: 15px;
  706. }
  707. .main-content-layout {
  708. gap: 10px;
  709. }
  710. .data-type-tabs {
  711. flex-direction: column;
  712. gap: 2px;
  713. }
  714. .data-tab {
  715. width: 100%;
  716. }
  717. .field-row {
  718. flex-direction: column;
  719. gap: 8px;
  720. }
  721. .field-row label {
  722. min-width: auto;
  723. width: 100%;
  724. }
  725. .action-buttons,
  726. .action-buttons-top {
  727. flex-direction: column;
  728. }
  729. .action-buttons .btn,
  730. .action-buttons-top .btn {
  731. width: 100%;
  732. flex: none;
  733. }
  734. .template-buttons {
  735. grid-template-columns: 1fr;
  736. gap: 4px;
  737. }
  738. .template-buttons .btn-template {
  739. width: 100%;
  740. }
  741. .result-actions {
  742. flex-direction: column;
  743. gap: 5px;
  744. align-items: flex-end;
  745. }
  746. .config-row {
  747. flex-direction: column;
  748. align-items: flex-start;
  749. gap: 5px;
  750. }
  751. .config-row label {
  752. min-width: auto;
  753. }
  754. .config-row input,
  755. .config-row select {
  756. width: 100%;
  757. min-width: auto;
  758. }
  759. }
  760. /* Vue.js 过渡效果 */
  761. [v-cloak] {
  762. display: none;
  763. }
  764. /* 加载动画 */
  765. .loading {
  766. display: inline-block;
  767. width: 20px;
  768. height: 20px;
  769. border: 3px solid rgba(255, 255, 255, 0.3);
  770. border-radius: 50%;
  771. border-top-color: #fff;
  772. animation: spin 1s ease-in-out infinite;
  773. }
  774. @keyframes spin {
  775. to {
  776. transform: rotate(360deg);
  777. }
  778. }
  779. /* 成功提示 */
  780. .success-message {
  781. background: #d4edda;
  782. color: #155724;
  783. padding: 10px 15px;
  784. border-radius: 4px;
  785. margin-bottom: 15px;
  786. border: 1px solid #c3e6cb;
  787. }
  788. /* 错误提示 */
  789. .error-message {
  790. background: #f8d7da;
  791. color: #721c24;
  792. padding: 10px 15px;
  793. border-radius: 4px;
  794. margin-bottom: 15px;
  795. border: 1px solid #f5c6cb;
  796. }
  797. /* 暗色模式支持 */
  798. @media (prefers-color-scheme: dark) {
  799. body {
  800. background-color: #1a1a1a;
  801. color: #e0e0e0;
  802. }
  803. .main-navbar {
  804. background: linear-gradient(135deg, #434190 0%, #5a4b9d 100%);
  805. box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  806. }
  807. .panel {
  808. background: #2d2d2d;
  809. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
  810. }
  811. .panel-body {
  812. background: #2d2d2d;
  813. }
  814. .field-row label {
  815. color: #ccc;
  816. }
  817. .custom-input input,
  818. .custom-input select,
  819. .config-row input,
  820. .config-row select {
  821. background: #3d3d3d;
  822. border-color: #555;
  823. color: #e0e0e0;
  824. }
  825. .generate-config,
  826. .custom-fields-list {
  827. background: #3d3d3d;
  828. }
  829. .result-content pre {
  830. background: #1e1e1e;
  831. color: #d4d4d4;
  832. }
  833. .data-type-tabs {
  834. background: #3d3d3d;
  835. }
  836. .data-tab {
  837. color: #ccc;
  838. }
  839. .data-tab:hover {
  840. background: rgba(102, 126, 234, 0.3);
  841. color: #667eea;
  842. }
  843. .data-tab.active {
  844. background: #667eea;
  845. color: white;
  846. }
  847. .field-group h5 {
  848. color: #e0e0e0;
  849. border-bottom-color: #555;
  850. }
  851. .data-type-section h4,
  852. .template-section h4 {
  853. color: #e0e0e0;
  854. }
  855. .result-header {
  856. background: #3d3d3d;
  857. border-bottom-color: #555;
  858. color: #e0e0e0;
  859. }
  860. .result-header h4 {
  861. color: #e0e0e0;
  862. }
  863. .custom-field-item {
  864. border-bottom-color: #555;
  865. color: #ccc;
  866. }
  867. .btn-template {
  868. background: #3d3d3d;
  869. color: #ccc;
  870. border-color: #555;
  871. }
  872. .btn-template:hover {
  873. background: #667eea;
  874. color: white;
  875. border-color: #667eea;
  876. }
  877. .config-section::-webkit-scrollbar-track {
  878. background: #3d3d3d;
  879. }
  880. .config-section::-webkit-scrollbar-thumb {
  881. background: #666;
  882. }
  883. .config-section::-webkit-scrollbar-thumb:hover {
  884. background: #777;
  885. }
  886. .result-panel {
  887. background: #2d2d2d;
  888. border-color: #555;
  889. }
  890. .result-header {
  891. background: linear-gradient(135deg, #5a619d 0%, #6f5aab 100%);
  892. }
  893. .empty-result {
  894. color: #ccc;
  895. }
  896. .empty-text h5 {
  897. color: #e0e0e0;
  898. }
  899. .empty-text p {
  900. color: #aaa;
  901. }
  902. .config-row label {
  903. color: #ccc;
  904. }
  905. .template-section.template-top h4 {
  906. color: #e0e0e0;
  907. }
  908. .template-section.template-top {
  909. border-bottom-color: #555;
  910. }
  911. .action-buttons-top {
  912. border-bottom-color: #555;
  913. }
  914. .action-buttons-top .btn-success {
  915. background: linear-gradient(135deg, #1e7e34 0%, #17a2b8 100%);
  916. }
  917. .action-buttons-top .btn-info {
  918. background: linear-gradient(135deg, #138496 0%, #5a6fd8 100%);
  919. }
  920. .action-buttons-top .btn-warning {
  921. background: linear-gradient(135deg, #e0a800 0%, #dc3545 100%);
  922. }
  923. }