store.css 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /* 商店页面样式 */
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. }
  7. body {
  8. margin: 0;
  9. padding: 0;
  10. height: 100vh;
  11. overflow-x: hidden;
  12. overflow-y: auto;
  13. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
  14. "Noto Sans", sans-serif;
  15. background: linear-gradient(135deg, #fdfcfb 0%, #f7f7f8 50%, #fdfcfb 100%);
  16. }
  17. .store-root {
  18. width: 100%;
  19. min-height: 100vh;
  20. display: flex;
  21. flex-direction: column;
  22. overflow-x: hidden;
  23. overflow-y: auto;
  24. }
  25. .store-container {
  26. flex: 1;
  27. display: flex;
  28. flex-direction: column;
  29. padding: 16px;
  30. overflow-x: hidden;
  31. min-width: 0;
  32. width: 100%;
  33. box-sizing: border-box;
  34. }
  35. /* 搜索栏 */
  36. .store-header {
  37. margin-bottom: 16px;
  38. }
  39. .search-bar {
  40. display: flex;
  41. gap: 10px;
  42. max-width: 600px;
  43. }
  44. .search-input {
  45. flex: 1;
  46. padding: 12px 16px;
  47. border: 2px solid rgba(139, 92, 246, 0.2);
  48. border-radius: 8px;
  49. font-size: 14px;
  50. outline: none;
  51. transition: all 0.3s ease;
  52. background: #ffffff;
  53. }
  54. .search-input:focus {
  55. border-color: #8b5cf6;
  56. box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
  57. }
  58. .search-button {
  59. padding: 12px 20px;
  60. background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
  61. color: white;
  62. border: none;
  63. border-radius: 8px;
  64. cursor: pointer;
  65. transition: all 0.3s ease;
  66. display: flex;
  67. align-items: center;
  68. justify-content: center;
  69. }
  70. .search-button:hover {
  71. background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
  72. transform: translateY(-1px);
  73. box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
  74. }
  75. .search-button:active {
  76. transform: translateY(0);
  77. }
  78. /* 分类栏 */
  79. .category-bar {
  80. display: flex;
  81. gap: 10px;
  82. margin-bottom: 16px;
  83. flex-wrap: wrap;
  84. }
  85. .category-item {
  86. padding: 10px 20px;
  87. background: #ffffff;
  88. border: 2px solid rgba(139, 92, 246, 0.2);
  89. border-radius: 8px;
  90. font-size: 14px;
  91. font-weight: 500;
  92. color: #6b7280;
  93. cursor: pointer;
  94. transition: all 0.3s ease;
  95. }
  96. .category-item:hover {
  97. border-color: #8b5cf6;
  98. color: #8b5cf6;
  99. transform: translateY(-1px);
  100. }
  101. .category-item.active {
  102. background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
  103. border-color: #8b5cf6;
  104. color: white;
  105. box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
  106. }
  107. /* 资源网格 - 瀑布流布局 */
  108. .resources-grid {
  109. flex: 1;
  110. position: relative;
  111. overflow-x: hidden;
  112. overflow-y: auto;
  113. padding: 0;
  114. min-width: 0;
  115. width: 100%;
  116. box-sizing: border-box;
  117. }
  118. .resources-grid-masonry {
  119. display: flex;
  120. flex-direction: row;
  121. align-items: flex-start;
  122. gap: 16px;
  123. }
  124. .masonry-column {
  125. flex: 1;
  126. min-width: 200px;
  127. display: flex;
  128. flex-direction: column;
  129. gap: 16px;
  130. }
  131. .resources-grid::-webkit-scrollbar {
  132. width: 8px;
  133. }
  134. .resources-grid::-webkit-scrollbar-track {
  135. background: rgba(0, 0, 0, 0.05);
  136. border-radius: 4px;
  137. }
  138. .resources-grid::-webkit-scrollbar-thumb {
  139. background: rgba(139, 92, 246, 0.3);
  140. border-radius: 4px;
  141. }
  142. .resources-grid::-webkit-scrollbar-thumb:hover {
  143. background: rgba(139, 92, 246, 0.5);
  144. }
  145. /* 空状态 */
  146. .empty-state {
  147. display: flex;
  148. flex-direction: column;
  149. align-items: center;
  150. justify-content: center;
  151. padding: 60px 20px;
  152. color: #9ca3af;
  153. }
  154. .empty-icon {
  155. font-size: 64px;
  156. margin-bottom: 16px;
  157. opacity: 0.5;
  158. }
  159. .empty-text {
  160. font-size: 18px;
  161. font-weight: 500;
  162. }
  163. /* 加载状态 */
  164. .loading-state {
  165. display: flex;
  166. flex-direction: column;
  167. align-items: center;
  168. justify-content: center;
  169. padding: 60px 20px;
  170. color: #9ca3af;
  171. }
  172. .loading-spinner {
  173. width: 40px;
  174. height: 40px;
  175. border: 4px solid rgba(139, 92, 246, 0.1);
  176. border-top-color: #8b5cf6;
  177. border-radius: 50%;
  178. animation: spin 1s linear infinite;
  179. margin-bottom: 16px;
  180. }
  181. @keyframes spin {
  182. to {
  183. transform: rotate(360deg);
  184. }
  185. }
  186. .loading-text {
  187. font-size: 16px;
  188. font-weight: 500;
  189. }
  190. /* 预览弹窗 */
  191. .preview-modal {
  192. position: fixed;
  193. top: 0;
  194. left: 0;
  195. width: 100%;
  196. height: 100%;
  197. background: rgba(0, 0, 0, 0.7);
  198. display: flex;
  199. align-items: center;
  200. justify-content: center;
  201. z-index: 10000;
  202. backdrop-filter: blur(4px);
  203. }
  204. .preview-modal-content {
  205. background: #ffffff;
  206. border-radius: 16px;
  207. width: 90%;
  208. max-width: 800px;
  209. max-height: 90vh;
  210. display: flex;
  211. flex-direction: column;
  212. box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  213. overflow: hidden;
  214. }
  215. .preview-modal-header {
  216. display: flex;
  217. align-items: center;
  218. justify-content: space-between;
  219. padding: 20px 24px;
  220. border-bottom: 1px solid rgba(0, 0, 0, 0.1);
  221. }
  222. .preview-modal-title {
  223. font-size: 20px;
  224. font-weight: 600;
  225. color: #1f2937;
  226. }
  227. .preview-modal-close {
  228. background: none;
  229. border: none;
  230. cursor: pointer;
  231. padding: 8px;
  232. color: #6b7280;
  233. transition: all 0.2s ease;
  234. border-radius: 4px;
  235. display: flex;
  236. align-items: center;
  237. justify-content: center;
  238. }
  239. .preview-modal-close:hover {
  240. background: rgba(0, 0, 0, 0.05);
  241. color: #1f2937;
  242. }
  243. .preview-modal-body {
  244. flex: 1;
  245. padding: 24px;
  246. display: flex;
  247. align-items: center;
  248. justify-content: center;
  249. overflow: auto;
  250. }
  251. .preview-animation-container {
  252. width: 100%;
  253. max-width: 600px;
  254. display: flex;
  255. align-items: center;
  256. justify-content: center;
  257. background: #f9fafb;
  258. border-radius: 12px;
  259. padding: 40px;
  260. min-height: 400px;
  261. }
  262. .preview-animation-image {
  263. max-width: 100%;
  264. max-height: 500px;
  265. object-fit: contain;
  266. image-rendering: pixelated;
  267. }
  268. /* 预览弹窗底部控制栏 */
  269. .preview-modal-footer {
  270. padding: 16px 24px;
  271. border-top: 1px solid rgba(0, 0, 0, 0.1);
  272. background: #f9fafb;
  273. display: flex;
  274. align-items: center;
  275. justify-content: center;
  276. }
  277. .fps-control {
  278. display: flex;
  279. align-items: center;
  280. gap: 12px;
  281. width: 100%;
  282. max-width: 400px;
  283. }
  284. .fps-label {
  285. font-size: 14px;
  286. font-weight: 500;
  287. color: #6b7280;
  288. white-space: nowrap;
  289. }
  290. .fps-slider {
  291. flex: 1;
  292. height: 6px;
  293. border-radius: 3px;
  294. background: #e5e7eb;
  295. outline: none;
  296. -webkit-appearance: none;
  297. appearance: none;
  298. }
  299. .fps-slider::-webkit-slider-thumb {
  300. -webkit-appearance: none;
  301. appearance: none;
  302. width: 18px;
  303. height: 18px;
  304. border-radius: 50%;
  305. background: #8b5cf6;
  306. cursor: pointer;
  307. transition: all 0.2s ease;
  308. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
  309. }
  310. .fps-slider::-webkit-slider-thumb:hover {
  311. background: #7c3aed;
  312. transform: scale(1.1);
  313. }
  314. .fps-slider::-moz-range-thumb {
  315. width: 18px;
  316. height: 18px;
  317. border-radius: 50%;
  318. background: #8b5cf6;
  319. cursor: pointer;
  320. border: none;
  321. transition: all 0.2s ease;
  322. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
  323. }
  324. .fps-slider::-moz-range-thumb:hover {
  325. background: #7c3aed;
  326. transform: scale(1.1);
  327. }
  328. .fps-display {
  329. font-size: 14px;
  330. font-weight: 600;
  331. color: #1f2937;
  332. background: #ffffff;
  333. padding: 6px 12px;
  334. border-radius: 6px;
  335. min-width: 60px;
  336. text-align: center;
  337. border: 1px solid #e5e7eb;
  338. font-family: 'Courier New', monospace;
  339. image-rendering: pixelated;
  340. }