Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

199 řádky
8.0 KiB

  1. /* ===== Admin Layout - vue3-element-admin style ===== */
  2. /* 基础重置 - 使用较低优先级,不覆盖 Tailwind 工具类 */
  3. *,*::before,*::after{box-sizing:border-box;}
  4. ul,ol{list-style:none;margin:0;padding:0;}
  5. :root{
  6. --primary:#E8751A;
  7. --primary-dark:#C96012;
  8. --primary-light:#F5A623;
  9. --primary-bg:rgba(232,117,26,.08);
  10. --blue:#1A3550;
  11. --white:#fff;
  12. --bg:#f0f2f5;
  13. --card:#fff;
  14. --text:#303133;
  15. --text-regular:#606266;
  16. --text-secondary:#909399;
  17. --text-placeholder:#c0c4cc;
  18. --border:#e4e7ed;
  19. --border-light:#ebeef5;
  20. --success:#67c23a;
  21. --warning:#e6a23c;
  22. --danger:#f56c6c;
  23. --info:#909399;
  24. --sidebar-bg:#1d1e1f;
  25. --sidebar-text:rgba(255,255,255,.65);
  26. --sidebar-active-bg:var(--primary);
  27. --sidebar-width:210px;
  28. --header-height:50px;
  29. --font-cn:"Source Han Sans SC","Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
  30. --font-en:"Roboto",sans-serif;
  31. --radius:4px;
  32. --shadow:0 2px 12px rgba(0,0,0,.06);
  33. }
  34. html{font-size:14px;}
  35. body{font-family:var(--font-cn);color:var(--text);background:var(--bg);min-height:100vh;}
  36. a{text-decoration:none;color:inherit;}
  37. img{max-width:100%;display:block;}
  38. /* ===== Layout ===== */
  39. .admin-layout{display:flex;min-height:100vh;}
  40. /* ===== Sidebar ===== */
  41. .sidebar{
  42. width:var(--sidebar-width);background:var(--sidebar-bg);
  43. position:fixed;top:0;left:0;bottom:0;z-index:100;
  44. display:flex;flex-direction:column;transition:.3s;overflow:hidden;
  45. }
  46. .sidebar-logo{
  47. height:var(--header-height);display:flex;align-items:center;
  48. padding:0 16px;border-bottom:1px solid rgba(255,255,255,.08);gap:10px;flex-shrink:0;
  49. background:var(--white);
  50. }
  51. .sidebar-logo img{height:36px;width:auto;}
  52. .sidebar-logo svg{width:28px;height:28px;color:var(--primary);flex-shrink:0;}
  53. .sidebar-logo span{font-size:14px;font-weight:600;color:var(--white);white-space:nowrap;overflow:hidden;}
  54. .sidebar-menu{flex:1;overflow-y:auto;padding:6px 0;}
  55. .sidebar-menu::-webkit-scrollbar{width:0;}
  56. .menu-group{margin-bottom:2px;}
  57. .menu-group-title{
  58. padding:20px 16px 6px;font-size:11px;color:rgba(255,255,255,.3);
  59. text-transform:uppercase;letter-spacing:1px;font-weight:500;
  60. }
  61. .menu-item{
  62. display:flex;align-items:center;gap:10px;padding:0 16px;height:42px;
  63. color:var(--sidebar-text);cursor:pointer;transition:.15s;position:relative;
  64. font-size:13px;border-radius:0;
  65. }
  66. .menu-item:hover{color:rgba(255,255,255,.9);background:rgba(255,255,255,.06);}
  67. .menu-item.active{color:var(--white);background:var(--primary);}
  68. .menu-item svg{width:18px;height:18px;flex-shrink:0;opacity:.7;}
  69. .menu-item.active svg{opacity:1;}
  70. .menu-item span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  71. /* 子菜单 */
  72. .submenu-items{display:none;overflow:hidden;}
  73. .menu-parent.open .submenu-items{display:block;}
  74. .menu-parent>.menu-item .arrow{
  75. margin-left:auto;transition:.2s;opacity:.5;display:flex;align-items:center;
  76. }
  77. .menu-parent>.menu-item .arrow svg{width:10px;height:10px;}
  78. .menu-parent.open>.menu-item .arrow{transform:rotate(180deg);}
  79. .menu-parent.open>.menu-item .arrow{transform:rotate(90deg);}
  80. .submenu-items .menu-item{padding-left:46px;height:38px;font-size:12.5px;}
  81. /* ===== Main Area ===== */
  82. .main-area{flex:1;margin-left:var(--sidebar-width);display:flex;flex-direction:column;min-height:100vh;}
  83. /* ===== Top Header ===== */
  84. .top-header{
  85. height:var(--header-height);background:var(--white);
  86. border-bottom:1px solid var(--border-light);display:flex;
  87. align-items:center;justify-content:space-between;padding:0 20px;
  88. position:sticky;top:0;z-index:90;
  89. }
  90. .header-left{display:flex;align-items:center;gap:16px;}
  91. .breadcrumb{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary);}
  92. .breadcrumb a{color:var(--text-secondary);transition:.15s;}
  93. .breadcrumb a:hover{color:var(--primary);}
  94. .breadcrumb .sep{color:var(--text-placeholder);}
  95. .breadcrumb .current{color:var(--text);}
  96. .header-right{display:flex;align-items:center;gap:16px;}
  97. .header-btn{
  98. width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  99. cursor:pointer;transition:.15s;color:var(--text-secondary);background:none;border:none;
  100. }
  101. .header-btn:hover{background:var(--bg);color:var(--text);}
  102. .header-btn svg{width:18px;height:18px;}
  103. .header-avatar{
  104. display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;
  105. border-radius:var(--radius);transition:.15s;
  106. }
  107. .header-avatar:hover{background:var(--bg);}
  108. .header-avatar img{width:30px;height:30px;border-radius:50%;background:var(--border);}
  109. .avatar-placeholder{
  110. width:30px;height:30px;border-radius:50%;background:var(--primary);
  111. color:var(--white);display:flex;align-items:center;justify-content:center;
  112. font-size:12px;font-weight:600;
  113. }
  114. .header-avatar span{font-size:13px;color:var(--text-regular);}
  115. /* ===== Content ===== */
  116. .page-content{flex:1;padding:20px;}
  117. /* ===== Tags View ===== */
  118. .tags-view{
  119. display:flex;align-items:center;gap:6px;padding:6px 20px;
  120. background:var(--white);border-bottom:1px solid var(--border-light);
  121. overflow-x:auto;flex-shrink:0;
  122. }
  123. .tags-view::-webkit-scrollbar{height:0;}
  124. .tag-item{
  125. display:flex;align-items:center;gap:4px;padding:4px 12px;
  126. border-radius:3px;font-size:12px;cursor:pointer;white-space:nowrap;
  127. border:1px solid var(--border);color:var(--text-secondary);transition:.15s;
  128. background:var(--white);
  129. }
  130. .tag-item:hover{color:var(--primary);border-color:var(--primary);}
  131. .tag-item.active{background:var(--primary);color:var(--white);border-color:var(--primary);}
  132. .tag-item .tag-close{
  133. font-size:10px;margin-left:2px;opacity:.6;transition:.15s;
  134. width:14px;height:14px;display:flex;align-items:center;justify-content:center;
  135. border-radius:50%;
  136. }
  137. .tag-item .tag-close:hover{opacity:1;background:rgba(0,0,0,.1);}
  138. .tag-item.active .tag-close:hover{background:rgba(255,255,255,.3);}
  139. /* ===== Common Components ===== */
  140. .card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px;}
  141. .card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;}
  142. .card-title{font-size:15px;font-weight:600;color:var(--text);}
  143. /* Table - 仅保留颜色 */
  144. .el-table{font-size:13px;}
  145. /* Buttons - 仅保留颜色 */
  146. .el-btn{color:var(--text-regular);cursor:pointer;}
  147. .el-btn:hover{color:var(--primary);}
  148. .el-btn-primary{background:var(--primary);color:var(--white);}
  149. .el-btn-primary:hover{background:var(--primary-dark);color:var(--white);}
  150. .el-btn-success{background:var(--success);color:var(--white);}
  151. .el-btn-danger{background:var(--danger);color:var(--white);}
  152. .el-btn-text{color:var(--primary);cursor:pointer;}
  153. .el-btn-text:hover{color:var(--primary-dark);}
  154. /* Badge / Tag - 仅保留颜色 */
  155. .el-tag-success{background:#f0f9eb;color:var(--success);}
  156. .el-tag-warning{background:#fdf6ec;color:var(--warning);}
  157. .el-tag-danger{background:#fef0f0;color:var(--danger);}
  158. .el-tag-info{background:#f4f4f5;color:var(--info);}
  159. .el-tag-primary{background:var(--primary-bg);color:var(--primary);}
  160. /* Pagination */
  161. .pagination{display:flex;align-items:center;justify-content:flex-end;gap:4px;margin-top:16px;font-size:13px;}
  162. .pagination .page-info{color:var(--text-secondary);margin-right:8px;}
  163. .page-btn{
  164. min-width:30px;height:30px;display:flex;align-items:center;justify-content:center;
  165. border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;
  166. background:var(--white);color:var(--text-regular);font-size:13px;transition:.15s;
  167. padding:0 6px;
  168. }
  169. .page-btn:hover{color:var(--primary);border-color:var(--primary);}
  170. .page-btn.active{background:var(--primary);color:var(--white);border-color:var(--primary);}
  171. .page-btn.disabled{color:var(--text-placeholder);cursor:not-allowed;}
  172. /* Form inputs - 仅保留颜色 */
  173. .el-input:focus{border-color:var(--primary);}
  174. .el-input::placeholder{color:var(--text-placeholder);}
  175. /* Search bar */
  176. .filter-bar{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap;}
  177. .filter-bar label{font-size:13px;color:var(--text-secondary);white-space:nowrap;}
  178. /* ===== 页面标题栏(通用) ===== */
  179. .page-title-bar{display:flex;align-items:center;gap:12px;margin-bottom:16px;}
  180. .page-title-text{font-size:16px;font-weight:600;color:var(--text);}