base.css 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. * {
  2. box-sizing: border-box;
  3. }
  4. body {
  5. margin: 0;
  6. background: var(--brand-bg);
  7. color: var(--brand-text);
  8. font-family: var(--font-body);
  9. line-height: 1.6;
  10. }
  11. a {
  12. color: var(--brand-accent);
  13. text-decoration: none;
  14. }
  15. a:hover,
  16. a:focus-visible {
  17. color: #e0d700;
  18. }
  19. .container {
  20. width: 100%;
  21. max-width: 1200px;
  22. margin: 0 auto;
  23. padding: 0 20px;
  24. }
  25. body.admin-page .container {
  26. max-width: none;
  27. padding: 0 20px;
  28. }
  29. main {
  30. min-height: calc(100vh - 200px);
  31. padding: 2rem 0;
  32. }
  33. h1,
  34. h2,
  35. h3,
  36. h4,
  37. h5,
  38. h6 {
  39. margin-top: 0;
  40. color: var(--brand-text);
  41. }
  42. p {
  43. margin-top: 0;
  44. }
  45. .site-header {
  46. padding: 0.85rem 0;
  47. background: var(--brand-primary);
  48. color: #ffffff;
  49. box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
  50. }
  51. .header-inner {
  52. display: flex;
  53. align-items: center;
  54. justify-content: space-between;
  55. gap: 1rem;
  56. }
  57. .brand {
  58. display: inline-flex;
  59. align-items: center;
  60. gap: 0.8rem;
  61. color: #ffffff;
  62. text-decoration: none;
  63. }
  64. .brand-logo {
  65. height: 52px;
  66. width: auto;
  67. filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.25));
  68. }
  69. .brand-title {
  70. font-size: 1.3rem;
  71. font-weight: 700;
  72. letter-spacing: 0.02em;
  73. line-height: 1.1;
  74. }
  75. .brand-subtitle {
  76. margin-top: 0.15rem;
  77. font-size: 0.9rem;
  78. font-weight: 500;
  79. opacity: 0.9;
  80. line-height: 1.1;
  81. }
  82. .site-nav {
  83. display: flex;
  84. align-items: center;
  85. gap: 0.8rem;
  86. }
  87. .site-nav a {
  88. color: #ffffff;
  89. font-weight: 600;
  90. letter-spacing: 0.02em;
  91. }
  92. .site-nav a:hover,
  93. .site-nav a:focus-visible {
  94. color: var(--brand-accent);
  95. }
  96. .card,
  97. .panel {
  98. background: var(--brand-surface);
  99. border: 1px solid var(--brand-border);
  100. border-radius: 8px;
  101. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.35);
  102. padding: 1.5rem;
  103. margin-bottom: 1.5rem;
  104. }
  105. .panel-compact {
  106. padding: 1rem;
  107. }
  108. .panel-spacious {
  109. padding: 2rem;
  110. margin: 2rem 0;
  111. }
  112. .admin-header {
  113. display: flex;
  114. align-items: center;
  115. justify-content: space-between;
  116. gap: 1rem;
  117. flex-wrap: wrap;
  118. }
  119. .admin-stats {
  120. display: grid;
  121. grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  122. gap: 1rem;
  123. }
  124. .stat-card {
  125. background: var(--brand-surface-alt);
  126. border: 1px solid var(--brand-border);
  127. border-radius: 8px;
  128. padding: 1rem;
  129. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.35);
  130. }
  131. .stat-value {
  132. font-size: 1.4rem;
  133. font-weight: 700;
  134. }
  135. .form-group,
  136. .field {
  137. margin-bottom: 1rem;
  138. }
  139. label {
  140. display: block;
  141. margin-bottom: 0.5rem;
  142. font-weight: 600;
  143. }
  144. .checkbox-label {
  145. display: inline-flex;
  146. align-items: center;
  147. gap: 0.5rem;
  148. font-weight: 500;
  149. }
  150. input,
  151. select,
  152. textarea,
  153. button {
  154. font: inherit;
  155. }
  156. .form-group input,
  157. .form-group textarea,
  158. .form-group select,
  159. .field input,
  160. .field textarea,
  161. .field select,
  162. input,
  163. select,
  164. textarea {
  165. width: 100%;
  166. padding: 0.65rem 0.75rem;
  167. color: var(--brand-text);
  168. background: var(--brand-surface-alt);
  169. border: 1px solid var(--brand-border);
  170. border-radius: 4px;
  171. }
  172. input[type='checkbox'] {
  173. width: auto;
  174. accent-color: var(--brand-accent);
  175. }
  176. textarea {
  177. min-height: 110px;
  178. resize: vertical;
  179. }
  180. input:focus-visible,
  181. select:focus-visible,
  182. textarea:focus-visible,
  183. button:focus-visible,
  184. .btn:focus-visible {
  185. outline: none;
  186. border-color: var(--brand-accent);
  187. box-shadow: 0 0 0 3px rgba(202, 195, 0, 0.2);
  188. }
  189. .btn,
  190. button {
  191. display: inline-block;
  192. width: 100%;
  193. padding: 0.65rem 0.9rem;
  194. border: 1px solid var(--brand-danger);
  195. border-radius: 4px;
  196. color: #ffffff;
  197. background: var(--brand-danger);
  198. cursor: pointer;
  199. transition: background-color 0.3s;
  200. }
  201. .btn:hover,
  202. button:hover {
  203. background: var(--brand-danger-dark);
  204. }
  205. .btn:disabled,
  206. button:disabled {
  207. opacity: 0.6;
  208. cursor: not-allowed;
  209. }
  210. .btn-secondary {
  211. border-color: var(--brand-border);
  212. color: var(--brand-text);
  213. background: transparent;
  214. }
  215. .btn-secondary:hover {
  216. background: var(--brand-surface-alt);
  217. }
  218. .btn-small {
  219. width: auto;
  220. padding: 0.45rem 0.7rem;
  221. font-size: 0.9rem;
  222. }
  223. .btn-block {
  224. width: 100%;
  225. text-align: center;
  226. }
  227. .disclaimer-text {
  228. white-space: pre-line;
  229. color: var(--brand-text);
  230. }
  231. .progress {
  232. margin-bottom: 1rem;
  233. color: var(--brand-muted);
  234. }
  235. .wizard-actions,
  236. .inline-actions,
  237. .upload-actions {
  238. display: grid;
  239. grid-template-columns: 1fr;
  240. gap: 0.75rem;
  241. }
  242. .error,
  243. .error-text {
  244. color: var(--brand-danger);
  245. }
  246. .error {
  247. min-height: 1.2rem;
  248. margin-top: 0.2rem;
  249. font-size: 0.9rem;
  250. }
  251. .hint,
  252. small {
  253. display: block;
  254. margin-top: 0.25rem;
  255. color: var(--brand-muted);
  256. font-size: 0.85rem;
  257. }
  258. .hidden,
  259. .hp-field {
  260. display: none;
  261. }
  262. .upload-control {
  263. border: 1px dashed var(--brand-border);
  264. border-radius: 8px;
  265. padding: 0.8rem;
  266. background: var(--brand-surface-alt);
  267. }
  268. .upload-action-btn {
  269. display: block;
  270. width: 100%;
  271. text-align: center;
  272. padding: 0.65rem 0.9rem;
  273. border: 1px solid var(--brand-border);
  274. border-radius: 4px;
  275. color: var(--brand-text);
  276. background: transparent;
  277. font-weight: 600;
  278. cursor: pointer;
  279. transition: background-color 0.3s;
  280. }
  281. .upload-action-btn:hover {
  282. background: var(--brand-surface);
  283. }
  284. .upload-action-btn-camera {
  285. border-color: var(--brand-accent);
  286. }
  287. .upload-native-input {
  288. display: none;
  289. }
  290. .upload-selected {
  291. margin: 0.75rem 0 0;
  292. color: var(--brand-muted);
  293. font-size: 0.9rem;
  294. }
  295. .upload-list {
  296. margin-top: 0.75rem;
  297. padding: 0.75rem;
  298. border: 1px solid var(--brand-border);
  299. border-radius: 8px;
  300. background: var(--brand-surface-alt);
  301. }
  302. .upload-list:empty {
  303. display: none;
  304. }
  305. .upload-item {
  306. margin-top: 0.35rem;
  307. padding: 0.45rem 0.6rem;
  308. border: 1px solid var(--brand-border);
  309. border-radius: 8px;
  310. background: var(--brand-surface);
  311. color: var(--brand-text);
  312. font-size: 0.9rem;
  313. }
  314. .upload-item:first-child {
  315. margin-top: 0;
  316. }
  317. .status-text {
  318. min-height: 1.2rem;
  319. margin-top: 1rem;
  320. color: var(--brand-muted);
  321. }
  322. .compact-status {
  323. margin-top: 1rem;
  324. padding: 1rem;
  325. border: 1px solid var(--brand-border);
  326. border-radius: 8px;
  327. background: var(--brand-surface-alt);
  328. }
  329. .compact-status p {
  330. margin: 0 0 0.35rem;
  331. }
  332. .compact-status p:last-of-type {
  333. margin-bottom: 1rem;
  334. }
  335. .alert {
  336. margin-bottom: 1rem;
  337. padding: 0.8rem 1rem;
  338. border: 1px solid var(--brand-border);
  339. border-radius: 4px;
  340. background: var(--brand-surface-alt);
  341. }
  342. .alert-success,
  343. .alert-warning {
  344. border-color: var(--brand-accent);
  345. }
  346. .alert-error {
  347. border-color: var(--brand-danger);
  348. }
  349. .alert-info {
  350. border-color: #ffffff;
  351. }
  352. .status {
  353. display: inline-flex;
  354. align-items: center;
  355. gap: 0.35rem;
  356. padding: 0.2rem 0.75rem;
  357. border: 1px solid var(--brand-border);
  358. border-radius: 999px;
  359. font-size: 0.85rem;
  360. font-weight: 600;
  361. letter-spacing: 0.02em;
  362. }
  363. .status-open {
  364. color: var(--brand-accent);
  365. border-color: var(--brand-accent);
  366. }
  367. .status-notified,
  368. .status-picked {
  369. color: #ffffff;
  370. border-color: #ffffff;
  371. }
  372. .status-expired {
  373. color: var(--brand-danger);
  374. border-color: var(--brand-danger);
  375. }
  376. .status-hidden {
  377. color: #9ca3af;
  378. border-color: #6b7280;
  379. }
  380. .table-responsive {
  381. width: 100%;
  382. overflow-x: auto;
  383. }
  384. table {
  385. width: 100%;
  386. border-collapse: collapse;
  387. border: 1px solid var(--brand-border);
  388. border-radius: 8px;
  389. overflow: hidden;
  390. background: var(--brand-surface);
  391. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.35);
  392. }
  393. th,
  394. td {
  395. padding: 0.75rem;
  396. border-bottom: 1px solid var(--brand-border);
  397. text-align: left;
  398. vertical-align: top;
  399. }
  400. th {
  401. background: var(--brand-primary);
  402. color: #ffffff;
  403. }
  404. tr:hover td {
  405. background: var(--brand-surface-alt);
  406. }
  407. .table-compact th,
  408. .table-compact td {
  409. padding: 0.5rem;
  410. font-size: 0.9rem;
  411. }
  412. .products-grid {
  413. display: grid;
  414. grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  415. gap: 1rem;
  416. }
  417. .product-card {
  418. background: var(--brand-surface);
  419. border: 1px solid var(--brand-border);
  420. border-radius: 8px;
  421. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
  422. transition: transform 0.3s, box-shadow 0.3s;
  423. }
  424. .product-card:hover {
  425. transform: translateY(-5px);
  426. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  427. }
  428. .product-card-content {
  429. padding: 1rem;
  430. }
  431. .product-detail-grid,
  432. .checkout-grid {
  433. display: grid;
  434. grid-template-columns: 1fr 1fr;
  435. gap: 1rem;
  436. }
  437. .price {
  438. font-size: 1.2rem;
  439. font-weight: 700;
  440. }
  441. .stock.in-stock {
  442. color: var(--brand-accent);
  443. }
  444. .stock.out-of-stock {
  445. color: var(--brand-danger);
  446. }
  447. .cart-item {
  448. display: flex;
  449. align-items: center;
  450. justify-content: space-between;
  451. gap: 1rem;
  452. padding: 1rem;
  453. border: 1px solid var(--brand-border);
  454. border-radius: 8px;
  455. }
  456. .cart-actions {
  457. display: flex;
  458. align-items: center;
  459. justify-content: flex-end;
  460. gap: 1rem;
  461. }
  462. .modal {
  463. position: fixed;
  464. inset: 0;
  465. z-index: 1000;
  466. display: none;
  467. align-items: center;
  468. justify-content: center;
  469. padding: 1.25rem;
  470. background: rgba(0, 0, 0, 0.6);
  471. }
  472. .modal-content {
  473. position: relative;
  474. width: 100%;
  475. max-width: 1000px;
  476. max-height: 95vh;
  477. overflow: auto;
  478. background: var(--brand-surface);
  479. border: 1px solid var(--brand-border);
  480. border-radius: 8px;
  481. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.35);
  482. padding: 1.5rem;
  483. }
  484. .modal-close {
  485. position: absolute;
  486. top: 0.5rem;
  487. right: 0.5rem;
  488. width: auto;
  489. }
  490. .media-hero-image {
  491. width: 100%;
  492. border-radius: 8px;
  493. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  494. }
  495. .auth-container {
  496. max-width: 400px;
  497. margin-top: 4rem;
  498. }
  499. .inline-form {
  500. display: inline;
  501. }
  502. .filter-form {
  503. display: flex;
  504. gap: 1rem;
  505. align-items: end;
  506. flex-wrap: wrap;
  507. }
  508. .filter-field-grow {
  509. flex: 1;
  510. min-width: 200px;
  511. }
  512. .quantity-input {
  513. width: 90px;
  514. text-align: center;
  515. }
  516. .text-center {
  517. text-align: center;
  518. }
  519. .u-w-full {
  520. width: 100%;
  521. }
  522. .list-indent {
  523. margin-left: 1.5rem;
  524. }
  525. .ml-2 {
  526. margin-left: 1rem;
  527. }
  528. .mt-1 {
  529. margin-top: 0.5rem;
  530. }
  531. .mt-2 {
  532. margin-top: 1rem;
  533. }
  534. .mt-3 {
  535. margin-top: 1.5rem;
  536. }
  537. .mb-1 {
  538. margin-bottom: 0.5rem;
  539. }
  540. .mb-2 {
  541. margin-bottom: 1rem;
  542. }
  543. .mb-3 {
  544. margin-bottom: 1.5rem;
  545. }
  546. #startSection.compact-mode {
  547. padding-top: 1rem;
  548. padding-bottom: 1rem;
  549. }
  550. @media (max-width: 768px) {
  551. .header-inner {
  552. flex-direction: column;
  553. align-items: flex-start;
  554. }
  555. .site-nav {
  556. flex-wrap: wrap;
  557. }
  558. .brand-logo {
  559. height: 46px;
  560. }
  561. .products-grid {
  562. grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  563. }
  564. .product-detail-grid,
  565. .checkout-grid {
  566. grid-template-columns: 1fr;
  567. }
  568. .cart-item {
  569. flex-direction: column;
  570. align-items: stretch;
  571. }
  572. .cart-actions {
  573. justify-content: flex-start;
  574. flex-direction: column;
  575. align-items: stretch;
  576. }
  577. .wizard-actions {
  578. grid-template-columns: repeat(3, 1fr);
  579. }
  580. .inline-actions,
  581. .upload-actions {
  582. grid-template-columns: repeat(2, 1fr);
  583. }
  584. .admin-header {
  585. flex-direction: column;
  586. align-items: flex-start;
  587. }
  588. th,
  589. td {
  590. padding: 0.65rem;
  591. font-size: 0.95rem;
  592. }
  593. .admin-stats {
  594. grid-template-columns: 1fr;
  595. }
  596. body.admin-page .table-responsive {
  597. margin: 0 -20px;
  598. padding: 0 20px;
  599. }
  600. .table-responsive .btn {
  601. white-space: normal;
  602. }
  603. body.admin-page table.responsive-table,
  604. body.admin-page table.responsive-table thead,
  605. body.admin-page table.responsive-table tbody,
  606. body.admin-page table.responsive-table tr,
  607. body.admin-page table.responsive-table th,
  608. body.admin-page table.responsive-table td {
  609. display: block;
  610. width: 100%;
  611. }
  612. body.admin-page table.responsive-table thead {
  613. display: none;
  614. }
  615. body.admin-page table.responsive-table tr {
  616. margin-bottom: 0.85rem;
  617. border: 1px solid var(--brand-border);
  618. border-radius: 8px;
  619. overflow: hidden;
  620. background: var(--brand-surface);
  621. }
  622. body.admin-page table.responsive-table td {
  623. border: 0;
  624. border-bottom: 1px solid var(--brand-border);
  625. padding: 0.65rem 0.75rem;
  626. }
  627. body.admin-page table.responsive-table td:last-child {
  628. border-bottom: 0;
  629. }
  630. body.admin-page table.responsive-table td::before {
  631. content: attr(data-label);
  632. display: block;
  633. margin-bottom: 0.2rem;
  634. color: var(--brand-muted);
  635. font-size: 0.8rem;
  636. font-weight: 600;
  637. letter-spacing: 0.02em;
  638. text-transform: uppercase;
  639. }
  640. }
  641. @media (max-width: 480px) {
  642. .container,
  643. body.admin-page .container {
  644. padding: 0 12px;
  645. }
  646. main {
  647. padding: 1.25rem 0;
  648. }
  649. .brand-title {
  650. font-size: 1.1rem;
  651. }
  652. .brand-subtitle {
  653. font-size: 0.8rem;
  654. }
  655. .products-grid {
  656. grid-template-columns: 1fr;
  657. }
  658. .table-responsive table:not(.responsive-table) {
  659. min-width: 520px;
  660. }
  661. }
  662. @media print {
  663. header,
  664. footer,
  665. .btn,
  666. nav {
  667. display: none !important;
  668. }
  669. body {
  670. padding: 20px;
  671. background: #ffffff;
  672. color: #000000;
  673. }
  674. .order-number,
  675. table {
  676. page-break-inside: avoid;
  677. }
  678. }