create-magic-storefront 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/package.json +3 -3
  2. package/template/.claude/skills/storefront-design/SKILL.md +14 -10
  3. package/template/.env.example +5 -0
  4. package/template/AGENTS.md +36 -17
  5. package/template/DESIGN.md +117 -0
  6. package/template/PAGES.md +116 -29
  7. package/template/README.md +15 -3
  8. package/template/app/account/addresses/page.tsx +16 -0
  9. package/template/app/account/layout.tsx +14 -0
  10. package/template/app/account/loading.tsx +15 -0
  11. package/template/app/account/orders/[id]/page.tsx +15 -0
  12. package/template/app/account/page.tsx +12 -244
  13. package/template/app/account/profile/page.tsx +16 -0
  14. package/template/app/blog/(index)/loading.tsx +22 -0
  15. package/template/app/blog/{page.tsx → (index)/page.tsx} +42 -25
  16. package/template/app/blog/[handle]/page.tsx +92 -56
  17. package/template/app/blog/author/[handle]/page.tsx +1 -1
  18. package/template/app/cart/layout.tsx +14 -0
  19. package/template/app/cart/page.tsx +49 -101
  20. package/template/app/checkout/layout.tsx +14 -0
  21. package/template/app/checkout/page.tsx +98 -281
  22. package/template/app/collections/[handle]/layout.tsx +20 -0
  23. package/template/app/collections/[handle]/loading.tsx +23 -0
  24. package/template/app/collections/[handle]/page.tsx +131 -15
  25. package/template/app/collections/page.tsx +49 -0
  26. package/template/app/contacts/page.tsx +196 -0
  27. package/template/app/error.tsx +19 -8
  28. package/template/app/fonts/OFL.txt +93 -0
  29. package/template/app/fonts/index.ts +14 -0
  30. package/template/app/fonts/onest-variable.woff2 +0 -0
  31. package/template/app/globals.css +14 -518
  32. package/template/app/layout.tsx +74 -50
  33. package/template/app/not-found.tsx +34 -4
  34. package/template/app/page.tsx +1 -1
  35. package/template/app/pages/[handle]/page.tsx +1 -1
  36. package/template/app/products/[handle]/layout.tsx +20 -0
  37. package/template/app/products/[handle]/loading.tsx +25 -0
  38. package/template/app/products/[handle]/page.tsx +112 -15
  39. package/template/app/providers.tsx +20 -7
  40. package/template/app/search/loading.tsx +12 -0
  41. package/template/app/search/page.tsx +138 -25
  42. package/template/app/sitemap.ts +5 -1
  43. package/template/app/storefront-api/[...path]/route.ts +11 -66
  44. package/template/app/styles/base.css +138 -0
  45. package/template/app/styles/components.css +1108 -0
  46. package/template/app/styles/layout.css +455 -0
  47. package/template/app/styles/pages.css +1839 -0
  48. package/template/app/styles/reset.css +55 -0
  49. package/template/app/styles/sections.css +415 -0
  50. package/template/app/styles/tokens.css +167 -0
  51. package/template/app/styles/utilities.css +37 -0
  52. package/template/app/wishlist/page.tsx +26 -0
  53. package/template/components/account/account-shell.tsx +100 -0
  54. package/template/components/account/addresses.tsx +247 -0
  55. package/template/components/account/order-detail.tsx +281 -0
  56. package/template/components/account/order-list.tsx +94 -0
  57. package/template/components/account/order-status.tsx +19 -0
  58. package/template/components/account/profile.tsx +129 -0
  59. package/template/components/account/sign-in.tsx +164 -0
  60. package/template/components/article-body.tsx +3 -2
  61. package/template/components/article-card.tsx +37 -12
  62. package/template/components/cart/cart-drawer.tsx +149 -0
  63. package/template/components/cart/cart-lines.tsx +89 -0
  64. package/template/components/cart/cart-summary.tsx +191 -0
  65. package/template/components/catalog/catalog-form.tsx +107 -0
  66. package/template/components/catalog/catalog-layout.tsx +82 -0
  67. package/template/components/catalog/facets-shell.tsx +60 -0
  68. package/template/components/catalog/facets.tsx +216 -0
  69. package/template/components/checkout/order-summary.tsx +84 -0
  70. package/template/components/checkout/radio-card.tsx +34 -0
  71. package/template/components/checkout/step-indicator.tsx +56 -0
  72. package/template/components/checkout/steps.tsx +264 -0
  73. package/template/components/checkout/thank-you.tsx +48 -0
  74. package/template/components/checkout/use-checkout.ts +90 -0
  75. package/template/components/footer/site-footer.tsx +132 -0
  76. package/template/components/header/cart-button.tsx +43 -0
  77. package/template/components/header/desktop-nav.tsx +133 -0
  78. package/template/components/header/mobile-menu.tsx +102 -0
  79. package/template/components/header/site-header.tsx +78 -0
  80. package/template/components/page-loading.tsx +20 -0
  81. package/template/components/pager.tsx +3 -1
  82. package/template/components/product/buy-box.tsx +148 -0
  83. package/template/components/product/gallery.tsx +179 -0
  84. package/template/components/product/pre-order-form.tsx +93 -0
  85. package/template/components/product/product-selection.tsx +31 -0
  86. package/template/components/product/recommendations.tsx +26 -0
  87. package/template/components/product/review-list.tsx +159 -0
  88. package/template/components/product/reviews.tsx +80 -0
  89. package/template/components/product/variant-picker.tsx +75 -0
  90. package/template/components/product-card.tsx +103 -0
  91. package/template/components/product-grid.tsx +27 -57
  92. package/template/components/quick-add.tsx +62 -0
  93. package/template/components/search/predictive-search.tsx +282 -0
  94. package/template/components/sections/announcement-bar.tsx +1 -1
  95. package/template/components/sections/banner.tsx +1 -1
  96. package/template/components/sections/collections.tsx +50 -13
  97. package/template/components/sections/deal-of-day.tsx +2 -2
  98. package/template/components/sections/product-shelves.tsx +13 -5
  99. package/template/components/sections/shoppable-stories.tsx +2 -2
  100. package/template/components/sections/store-reviews.tsx +10 -4
  101. package/template/components/share-button.tsx +42 -0
  102. package/template/components/ui/accordion.tsx +35 -0
  103. package/template/components/ui/badge.tsx +20 -0
  104. package/template/components/ui/breadcrumbs.tsx +31 -0
  105. package/template/components/ui/button.tsx +90 -0
  106. package/template/components/ui/drawer.tsx +84 -0
  107. package/template/components/ui/empty-state.tsx +27 -0
  108. package/template/components/ui/field.tsx +33 -0
  109. package/template/components/ui/icon.tsx +112 -0
  110. package/template/components/ui/price.tsx +35 -0
  111. package/template/components/ui/quantity-stepper.tsx +91 -0
  112. package/template/components/ui/rating.tsx +48 -0
  113. package/template/components/ui/skeleton.tsx +46 -0
  114. package/template/components/wishlist/wishlist-view.tsx +134 -0
  115. package/template/lib/article-outline.ts +35 -0
  116. package/template/lib/catalog-params.ts +170 -0
  117. package/template/lib/contacts.ts +34 -0
  118. package/template/lib/errors.ts +29 -0
  119. package/template/lib/i18n.ts +484 -0
  120. package/template/lib/menu.ts +70 -0
  121. package/template/lib/theme-settings.ts +36 -0
  122. package/template/lib/upstream.ts +21 -0
  123. package/template/llms.txt +13 -0
  124. package/template/theme/index.ts +7 -1
  125. package/template/theme/sections/collapsible-content.tsx +75 -0
  126. package/template/theme/sections/collection-list.tsx +32 -4
  127. package/template/theme/sections/featured-collection.tsx +22 -2
  128. package/template/theme/sections/hero.tsx +94 -7
  129. package/template/theme/sections/image-with-text.tsx +19 -3
  130. package/template/theme/sections/multicolumn.tsx +113 -0
  131. package/template/theme/sections/page-content.tsx +10 -4
  132. package/template/theme/sections/product-shelf.tsx +26 -4
  133. package/template/theme/sections/rich-text.tsx +13 -1
  134. package/template/theme/sections/testimonials.tsx +14 -9
  135. package/template/theme/settings.ts +85 -1
  136. package/template/theme/templates/index.json +4 -2
  137. package/template/.screenshots/home-1280.png +0 -0
  138. package/template/.screenshots/home-390.png +0 -0
  139. package/template/.screenshots/home-filled-1280.png +0 -0
  140. package/template/.screenshots/home-filled-390.png +0 -0
  141. package/template/.screenshots/page-1280.png +0 -0
  142. package/template/components/buy-box.tsx +0 -89
  143. package/template/components/cart-link.tsx +0 -15
@@ -0,0 +1,1839 @@
1
+ /* Page layouts: product, blog, content pages, account, checkout. */
2
+ @layer pages {
3
+ .page-title {
4
+ margin-bottom: var(--space-5);
5
+ }
6
+
7
+ /* Product page: gallery beside a sticky info column from 990px, stacked below. */
8
+ .product-page {
9
+ display: grid;
10
+ gap: var(--space-5);
11
+ }
12
+ @media (min-width: 990px) {
13
+ .product-page {
14
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
15
+ gap: var(--space-8);
16
+ align-items: start;
17
+ }
18
+ .product-page__info {
19
+ position: sticky;
20
+ top: calc(var(--header-h) + var(--space-5));
21
+ }
22
+ }
23
+ .product-page__media {
24
+ min-width: 0;
25
+ }
26
+ /* Phones: the gallery runs edge to edge. */
27
+ @media (max-width: 749px) {
28
+ .product-page__media {
29
+ margin-inline: calc(var(--gutter) * -1);
30
+ }
31
+ }
32
+ .product-page__info {
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: var(--space-4);
36
+ min-width: 0;
37
+ }
38
+ @media (max-width: 749px) {
39
+ .product-page {
40
+ gap: var(--space-4);
41
+ }
42
+ .product-page__info,
43
+ .buy-box {
44
+ gap: var(--space-3);
45
+ }
46
+ }
47
+ .product-page__header {
48
+ display: flex;
49
+ flex-direction: column;
50
+ gap: var(--space-1);
51
+ }
52
+ .product-page__vendor {
53
+ color: var(--muted);
54
+ font-size: var(--text-xs);
55
+ font-weight: var(--weight-medium);
56
+ letter-spacing: 0.08em;
57
+ text-transform: uppercase;
58
+ }
59
+ .product-page__title {
60
+ font-size: var(--text-xl);
61
+ line-height: var(--leading-snug);
62
+ }
63
+ @media (min-width: 750px) {
64
+ .product-page__title {
65
+ font-size: var(--text-2xl);
66
+ }
67
+ }
68
+ .product-page__rating {
69
+ align-self: flex-start;
70
+ text-decoration: none;
71
+ }
72
+ .product-page__details {
73
+ border-top: 1px solid var(--line);
74
+ }
75
+ .product-page__details .prose {
76
+ max-width: none;
77
+ }
78
+
79
+ /* Gallery */
80
+ .gallery__viewport {
81
+ position: relative;
82
+ }
83
+ .gallery__track {
84
+ display: flex;
85
+ overflow-x: auto;
86
+ scroll-snap-type: x mandatory;
87
+ scroll-behavior: smooth;
88
+ scrollbar-width: none;
89
+ overscroll-behavior-x: contain;
90
+ }
91
+ .gallery__track::-webkit-scrollbar {
92
+ display: none;
93
+ }
94
+ @media (prefers-reduced-motion: reduce) {
95
+ .gallery__track {
96
+ scroll-behavior: auto;
97
+ }
98
+ }
99
+ .gallery__slide {
100
+ position: relative;
101
+ flex: 0 0 100%;
102
+ overflow: hidden;
103
+ aspect-ratio: var(--media-ratio);
104
+ background: var(--placeholder);
105
+ scroll-snap-align: start;
106
+ }
107
+ /* Phones: the price and the add button stay above the fold. */
108
+ @media (max-width: 749px) {
109
+ .gallery__slide {
110
+ max-height: 44svh;
111
+ }
112
+ }
113
+ @media (min-width: 750px) {
114
+ .gallery__slide {
115
+ border-radius: var(--radius-md);
116
+ }
117
+ }
118
+ .gallery__slide img,
119
+ .gallery__slide video,
120
+ .gallery__slide .media-fallback {
121
+ position: absolute;
122
+ inset: 0;
123
+ width: 100%;
124
+ height: 100%;
125
+ object-fit: contain;
126
+ }
127
+ .gallery__counter {
128
+ position: absolute;
129
+ right: var(--space-3);
130
+ bottom: var(--space-3);
131
+ padding: 2px var(--space-2);
132
+ border-radius: var(--radius-pill);
133
+ background: rgb(0 0 0 / 0.55);
134
+ color: #fff;
135
+ font-size: var(--text-xs);
136
+ font-variant-numeric: tabular-nums;
137
+ }
138
+ .gallery__arrow {
139
+ position: absolute;
140
+ top: 50%;
141
+ display: none;
142
+ border: 1px solid var(--line);
143
+ border-radius: 50%;
144
+ background: var(--surface);
145
+ box-shadow: var(--shadow-1);
146
+ transform: translateY(-50%);
147
+ }
148
+ .gallery__arrow--prev {
149
+ left: var(--space-3);
150
+ }
151
+ .gallery__arrow--next {
152
+ right: var(--space-3);
153
+ }
154
+ .gallery__arrow:disabled {
155
+ visibility: hidden;
156
+ }
157
+ .gallery__thumbs {
158
+ display: none;
159
+ gap: var(--space-2);
160
+ margin: var(--space-3) 0 0;
161
+ padding: 0 0 var(--space-1);
162
+ overflow-x: auto;
163
+ list-style: none;
164
+ scrollbar-width: thin;
165
+ }
166
+ @media (min-width: 750px) {
167
+ .gallery__counter {
168
+ display: none;
169
+ }
170
+ .gallery__arrow {
171
+ display: inline-flex;
172
+ }
173
+ .gallery__thumbs {
174
+ display: flex;
175
+ }
176
+ }
177
+ .gallery__thumb {
178
+ display: grid;
179
+ place-items: center;
180
+ width: 64px;
181
+ height: 64px;
182
+ padding: 0;
183
+ overflow: hidden;
184
+ border: 1px solid var(--line);
185
+ border-radius: var(--radius-sm);
186
+ background: var(--placeholder);
187
+ }
188
+ .gallery__thumb img {
189
+ width: 100%;
190
+ height: 100%;
191
+ object-fit: cover;
192
+ }
193
+ .gallery__thumb[aria-current='true'] {
194
+ border-color: var(--fg);
195
+ box-shadow: inset 0 0 0 1px var(--fg);
196
+ }
197
+
198
+ /* Buy box */
199
+ .buy-box {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: var(--space-4);
203
+ }
204
+ .buy-box__actions {
205
+ display: flex;
206
+ gap: var(--space-2);
207
+ }
208
+ .buy-box__add {
209
+ flex: 1 1 0;
210
+ min-width: 0;
211
+ }
212
+ .buy-box__wishlist {
213
+ width: 48px;
214
+ height: 48px;
215
+ border: 1px solid var(--line-strong);
216
+ border-radius: var(--radius-sm);
217
+ }
218
+ .buy-box__wishlist[aria-pressed='true'] {
219
+ border-color: var(--line-strong);
220
+ box-shadow: none;
221
+ color: var(--danger);
222
+ }
223
+ .buy-box__wishlist[aria-pressed='true'] svg {
224
+ fill: currentColor;
225
+ }
226
+ .buy-box .quantity {
227
+ height: 48px;
228
+ }
229
+ .buy-box__delivery {
230
+ display: flex;
231
+ gap: var(--space-2);
232
+ align-items: flex-start;
233
+ padding: var(--space-3) var(--space-4);
234
+ border-radius: var(--radius-md);
235
+ background: var(--subtle);
236
+ color: var(--muted);
237
+ font-size: var(--text-sm);
238
+ white-space: pre-line;
239
+ }
240
+ .buy-box__delivery svg {
241
+ flex: none;
242
+ color: var(--fg);
243
+ }
244
+ .buy-box__note {
245
+ padding: var(--space-3) var(--space-4);
246
+ border-radius: var(--radius-md);
247
+ background: var(--subtle);
248
+ }
249
+ .stock-note {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: var(--space-2);
253
+ font-size: var(--text-sm);
254
+ }
255
+ .stock-note__dot {
256
+ width: 8px;
257
+ height: 8px;
258
+ border-radius: 50%;
259
+ background: var(--success);
260
+ }
261
+ .stock-note--low .stock-note__dot {
262
+ background: var(--warning);
263
+ }
264
+
265
+ /* Variant picker */
266
+ .variant-picker {
267
+ margin: 0;
268
+ padding: 0;
269
+ border: 0;
270
+ }
271
+ .variant-picker__legend {
272
+ margin-bottom: var(--space-2);
273
+ padding: 0;
274
+ font-size: var(--text-sm);
275
+ font-weight: var(--weight-medium);
276
+ }
277
+ .variant-picker__value {
278
+ color: var(--muted);
279
+ font-weight: var(--weight-regular);
280
+ }
281
+ .variant-picker__values {
282
+ display: flex;
283
+ flex-wrap: wrap;
284
+ gap: var(--space-2);
285
+ }
286
+ /* Phones: one row that scrolls sideways, so the add button stays in view. */
287
+ @media (max-width: 749px) {
288
+ .variant-picker__values {
289
+ flex-wrap: nowrap;
290
+ margin-inline: calc(var(--gutter) * -1);
291
+ padding-inline: var(--gutter);
292
+ overflow-x: auto;
293
+ scrollbar-width: none;
294
+ }
295
+ .variant-picker__values::-webkit-scrollbar {
296
+ display: none;
297
+ }
298
+ .pill {
299
+ flex: none;
300
+ }
301
+ }
302
+ .pill {
303
+ position: relative;
304
+ display: inline-flex;
305
+ align-items: center;
306
+ min-height: 44px;
307
+ padding: 0 var(--space-4);
308
+ border: 1px solid var(--line-strong);
309
+ border-radius: var(--radius-pill);
310
+ font-size: var(--text-sm);
311
+ cursor: pointer;
312
+ transition: border-color var(--duration-fast) var(--ease);
313
+ }
314
+ .pill:hover {
315
+ border-color: var(--fg);
316
+ }
317
+ .pill:has(input:checked) {
318
+ background: var(--fg);
319
+ border-color: var(--fg);
320
+ color: var(--bg);
321
+ }
322
+ .pill:has(input:focus-visible) {
323
+ outline: 2px solid var(--accent);
324
+ outline-offset: 2px;
325
+ }
326
+ .pill--unavailable {
327
+ color: var(--muted);
328
+ text-decoration: line-through;
329
+ }
330
+
331
+ /* Share */
332
+ .share {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: var(--space-3);
336
+ }
337
+ .share__button {
338
+ display: inline-flex;
339
+ align-items: center;
340
+ gap: var(--space-2);
341
+ }
342
+ .share__status {
343
+ color: var(--muted);
344
+ font-size: var(--text-sm);
345
+ }
346
+
347
+ /* Reviews and recommendations under the product */
348
+ .product-reviews,
349
+ .product-recommendations {
350
+ margin-top: var(--space-9);
351
+ }
352
+ .product-reviews__layout {
353
+ display: grid;
354
+ gap: var(--space-6);
355
+ }
356
+ @media (min-width: 990px) {
357
+ .product-reviews__layout {
358
+ grid-template-columns: 16rem minmax(0, 1fr);
359
+ gap: var(--space-8);
360
+ align-items: start;
361
+ }
362
+ }
363
+ .review-summary {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: var(--space-2);
367
+ }
368
+ .review-summary__average {
369
+ font-size: var(--text-4xl);
370
+ font-weight: var(--weight-heading);
371
+ line-height: 1;
372
+ }
373
+ .review-summary__breakdown {
374
+ display: grid;
375
+ gap: var(--space-1);
376
+ margin: var(--space-2) 0 0;
377
+ padding: 0;
378
+ list-style: none;
379
+ font-size: var(--text-sm);
380
+ }
381
+ .review-summary__breakdown li {
382
+ display: grid;
383
+ grid-template-columns: 1ch 1fr 3ch;
384
+ gap: var(--space-2);
385
+ align-items: center;
386
+ }
387
+ .review-summary__bar {
388
+ height: 6px;
389
+ overflow: hidden;
390
+ border-radius: var(--radius-pill);
391
+ background: var(--subtle);
392
+ }
393
+ .review-summary__bar span {
394
+ display: block;
395
+ height: 100%;
396
+ background: var(--fg);
397
+ }
398
+ .review-list {
399
+ display: flex;
400
+ flex-direction: column;
401
+ gap: var(--space-4);
402
+ align-items: flex-start;
403
+ }
404
+ .review-list__items {
405
+ align-self: stretch;
406
+ margin: 0;
407
+ padding: 0;
408
+ list-style: none;
409
+ }
410
+ .review {
411
+ display: flex;
412
+ flex-direction: column;
413
+ gap: var(--space-2);
414
+ padding: var(--space-5) 0;
415
+ border-bottom: 1px solid var(--line);
416
+ }
417
+ .review:first-child {
418
+ padding-top: 0;
419
+ }
420
+ .review__header {
421
+ display: flex;
422
+ flex-wrap: wrap;
423
+ align-items: center;
424
+ gap: var(--space-2) var(--space-3);
425
+ }
426
+ .review__author {
427
+ font-weight: var(--weight-medium);
428
+ }
429
+ .review__body {
430
+ max-width: 65ch;
431
+ }
432
+ .review__images {
433
+ display: flex;
434
+ flex-wrap: wrap;
435
+ gap: var(--space-2);
436
+ margin: 0;
437
+ padding: 0;
438
+ list-style: none;
439
+ }
440
+ .review__images img {
441
+ border-radius: var(--radius-sm);
442
+ object-fit: cover;
443
+ }
444
+ .review__reply {
445
+ padding: var(--space-3) var(--space-4);
446
+ border-left: 2px solid var(--line-strong);
447
+ background: var(--subtle);
448
+ }
449
+ .review__reply-title {
450
+ font-size: var(--text-sm);
451
+ font-weight: var(--weight-medium);
452
+ }
453
+
454
+ /* Prose: merchant HTML (pages, articles, descriptions), at a readable measure. */
455
+ .prose {
456
+ max-width: 65ch;
457
+ line-height: 1.7;
458
+ overflow-wrap: break-word;
459
+ }
460
+ .prose > * + *,
461
+ .prose > div > * + * {
462
+ margin-top: 1em;
463
+ }
464
+ .prose h2,
465
+ .prose h3,
466
+ .prose h4 {
467
+ margin-top: 1.8em;
468
+ line-height: var(--leading-snug);
469
+ scroll-margin-top: calc(var(--header-h) + var(--space-5));
470
+ }
471
+ .prose h2 {
472
+ font-size: var(--text-2xl);
473
+ }
474
+ .prose h3 {
475
+ font-size: var(--text-xl);
476
+ }
477
+ .prose h4 {
478
+ font-size: var(--text-lg);
479
+ }
480
+ .prose a {
481
+ color: var(--accent-text);
482
+ text-underline-offset: 3px;
483
+ }
484
+ .prose ul,
485
+ .prose ol {
486
+ padding-left: 1.25em;
487
+ }
488
+ .prose li + li {
489
+ margin-top: 0.35em;
490
+ }
491
+ .prose img {
492
+ max-width: 100%;
493
+ height: auto;
494
+ border-radius: var(--radius-md);
495
+ }
496
+ .prose figure {
497
+ margin-inline: 0;
498
+ }
499
+ .prose figcaption {
500
+ margin-top: var(--space-2);
501
+ color: var(--muted);
502
+ font-size: var(--text-sm);
503
+ text-align: center;
504
+ }
505
+ .prose table {
506
+ display: block;
507
+ max-width: 100%;
508
+ overflow-x: auto;
509
+ border-collapse: collapse;
510
+ font-size: var(--text-sm);
511
+ }
512
+ .prose th,
513
+ .prose td {
514
+ padding: var(--space-2) var(--space-3);
515
+ border: 1px solid var(--line);
516
+ text-align: left;
517
+ }
518
+ .prose th {
519
+ background: var(--subtle);
520
+ font-weight: var(--weight-medium);
521
+ }
522
+ .prose blockquote {
523
+ margin-inline: 0;
524
+ padding-left: var(--space-4);
525
+ border-left: 3px solid var(--line-strong);
526
+ color: var(--muted);
527
+ font-style: italic;
528
+ }
529
+ .prose hr {
530
+ border: 0;
531
+ border-top: 1px solid var(--line);
532
+ }
533
+
534
+ /* Content page (about, delivery, offer): a readable column. */
535
+ .content-page {
536
+ max-width: 48rem;
537
+ margin-inline: auto;
538
+ }
539
+ .content-page__title {
540
+ margin-bottom: var(--space-5);
541
+ }
542
+
543
+ /* Blog */
544
+ .blog {
545
+ display: flex;
546
+ flex-direction: column;
547
+ gap: var(--space-5);
548
+ }
549
+ .blog > h2 {
550
+ margin-top: var(--space-4);
551
+ }
552
+ .blog-header {
553
+ display: flex;
554
+ flex-direction: column;
555
+ gap: var(--space-2);
556
+ }
557
+ .blog-header p {
558
+ max-width: 60ch;
559
+ }
560
+ .blog-toolbar {
561
+ display: flex;
562
+ flex-wrap: wrap;
563
+ align-items: center;
564
+ justify-content: space-between;
565
+ gap: var(--space-3) var(--space-5);
566
+ }
567
+ .blog-toolbar .blog-toolbar__search {
568
+ flex: 1 1 20rem;
569
+ margin: 0;
570
+ }
571
+ .blog-featured {
572
+ display: flex;
573
+ flex-direction: column;
574
+ gap: var(--space-6);
575
+ margin-bottom: var(--space-4);
576
+ }
577
+ .article-grid {
578
+ display: grid;
579
+ grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
580
+ gap: var(--space-7) var(--space-5);
581
+ }
582
+ .article-card {
583
+ display: flex;
584
+ flex-direction: column;
585
+ gap: var(--space-3);
586
+ text-decoration: none;
587
+ }
588
+ .article-card__media {
589
+ overflow: hidden;
590
+ aspect-ratio: 16 / 9;
591
+ border-radius: var(--radius-md);
592
+ background: var(--placeholder);
593
+ }
594
+ .article-card__media img,
595
+ .article-card__media .media-fallback {
596
+ display: block;
597
+ width: 100%;
598
+ height: 100%;
599
+ object-fit: cover;
600
+ transition: transform var(--duration) var(--ease);
601
+ }
602
+ .article-card__body {
603
+ display: flex;
604
+ flex-direction: column;
605
+ gap: var(--space-2);
606
+ }
607
+ .article-card__category,
608
+ .article__category {
609
+ color: var(--accent-text);
610
+ font-size: var(--text-xs);
611
+ font-weight: var(--weight-medium);
612
+ letter-spacing: 0.06em;
613
+ text-decoration: none;
614
+ text-transform: uppercase;
615
+ }
616
+ .article-card__title {
617
+ font-size: var(--text-lg);
618
+ font-weight: var(--weight-heading);
619
+ line-height: var(--leading-snug);
620
+ }
621
+ .article-card__excerpt {
622
+ display: -webkit-box;
623
+ overflow: hidden;
624
+ color: var(--muted);
625
+ -webkit-box-orient: vertical;
626
+ -webkit-line-clamp: 2;
627
+ }
628
+ @media (hover: hover) {
629
+ .article-card:hover .article-card__title {
630
+ text-decoration: underline;
631
+ }
632
+ .article-card:hover .article-card__media img {
633
+ transform: scale(1.03);
634
+ }
635
+ }
636
+ .article-card__meta,
637
+ .article__meta {
638
+ display: flex;
639
+ flex-wrap: wrap;
640
+ gap: var(--space-1) var(--space-3);
641
+ color: var(--muted);
642
+ font-size: var(--text-sm);
643
+ }
644
+ .article-card__meta > * + *::before,
645
+ .article__meta > * + *::before {
646
+ content: '·';
647
+ margin-right: var(--space-3);
648
+ }
649
+ @media (min-width: 750px) {
650
+ .article-card--feature {
651
+ display: grid;
652
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
653
+ gap: var(--space-7);
654
+ align-items: center;
655
+ }
656
+ .article-card--feature .article-card__title {
657
+ font-size: var(--text-3xl);
658
+ line-height: var(--leading-tight);
659
+ }
660
+ .article-card--feature .article-card__excerpt {
661
+ -webkit-line-clamp: 4;
662
+ font-size: var(--text-lg);
663
+ }
664
+ }
665
+
666
+ /* Article */
667
+ /* One reading column; wider when a table of contents sits beside the body. */
668
+ .article {
669
+ display: flex;
670
+ flex-direction: column;
671
+ gap: var(--space-5);
672
+ max-width: 48rem;
673
+ margin: 0 auto;
674
+ }
675
+ @media (min-width: 990px) {
676
+ .article:has(.article__layout--toc) {
677
+ max-width: 64rem;
678
+ }
679
+ }
680
+ .article__header {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: var(--space-3);
684
+ max-width: 48rem;
685
+ }
686
+ .article__title {
687
+ font-size: var(--text-4xl);
688
+ line-height: var(--leading-tight);
689
+ }
690
+ .article__meta a {
691
+ color: inherit;
692
+ }
693
+ .article__cover {
694
+ width: 100%;
695
+ height: auto;
696
+ aspect-ratio: 16 / 9;
697
+ object-fit: cover;
698
+ border-radius: var(--radius-lg);
699
+ }
700
+ .article__layout {
701
+ display: grid;
702
+ gap: var(--space-6);
703
+ }
704
+ @media (min-width: 990px) {
705
+ .article__layout--toc {
706
+ grid-template-columns: 14rem minmax(0, 48rem);
707
+ gap: var(--space-8);
708
+ align-items: start;
709
+ }
710
+ .article__toc {
711
+ position: sticky;
712
+ top: calc(var(--header-h) + var(--space-5));
713
+ }
714
+ }
715
+ .article__main {
716
+ display: flex;
717
+ flex-direction: column;
718
+ gap: var(--space-6);
719
+ max-width: 48rem;
720
+ min-width: 0;
721
+ }
722
+ .article__main .prose {
723
+ max-width: none;
724
+ font-size: var(--text-lg);
725
+ }
726
+ .article__toc {
727
+ padding: var(--space-4);
728
+ border-radius: var(--radius-md);
729
+ background: var(--subtle);
730
+ font-size: var(--text-sm);
731
+ }
732
+ .article__toc-title {
733
+ margin-bottom: var(--space-2);
734
+ font-weight: var(--weight-medium);
735
+ }
736
+ .article__toc ol {
737
+ display: grid;
738
+ gap: var(--space-2);
739
+ margin: 0;
740
+ padding: 0;
741
+ list-style: none;
742
+ }
743
+ .article__toc a {
744
+ color: var(--muted);
745
+ text-decoration: none;
746
+ }
747
+ .article__toc a:hover {
748
+ color: var(--fg);
749
+ }
750
+ .article__toc-item--h3 {
751
+ padding-left: var(--space-3);
752
+ }
753
+ .article__actions {
754
+ display: flex;
755
+ flex-wrap: wrap;
756
+ align-items: center;
757
+ justify-content: space-between;
758
+ gap: var(--space-4);
759
+ padding-block: var(--space-4);
760
+ border-block: 1px solid var(--line);
761
+ }
762
+ .article__related {
763
+ margin-top: var(--space-6);
764
+ }
765
+ .article-product {
766
+ max-width: 16rem;
767
+ margin: var(--space-4) 0;
768
+ }
769
+ .callout {
770
+ margin: var(--space-4) 0;
771
+ padding: var(--space-3) var(--space-4);
772
+ border-left: 3px solid var(--accent);
773
+ border-radius: var(--radius-sm);
774
+ background: var(--subtle);
775
+ }
776
+ .callout[data-callout='warning'] {
777
+ border-left-color: var(--danger);
778
+ }
779
+ .author-card {
780
+ display: flex;
781
+ gap: var(--space-4);
782
+ align-items: flex-start;
783
+ padding: var(--space-5);
784
+ border-radius: var(--radius-md);
785
+ background: var(--subtle);
786
+ }
787
+ .author-card img {
788
+ flex: none;
789
+ border-radius: 50%;
790
+ object-fit: cover;
791
+ }
792
+ .author-card h1 {
793
+ margin: 0;
794
+ }
795
+
796
+ /* Catalog pages (collection, search): facets beside the grid at desktop width. */
797
+ .collection-hero {
798
+ display: grid;
799
+ gap: var(--space-5);
800
+ margin: var(--space-4) 0 var(--space-6);
801
+ }
802
+ .collection-hero--image {
803
+ align-items: center;
804
+ }
805
+ @media (min-width: 750px) {
806
+ .collection-hero--image {
807
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
808
+ gap: var(--space-8);
809
+ }
810
+ }
811
+ .collection-hero__media {
812
+ overflow: hidden;
813
+ aspect-ratio: 16 / 9;
814
+ border-radius: var(--radius-md);
815
+ background: var(--placeholder);
816
+ }
817
+ .collection-hero__media img {
818
+ width: 100%;
819
+ height: 100%;
820
+ object-fit: cover;
821
+ }
822
+ .collection-hero__text {
823
+ display: flex;
824
+ flex-direction: column;
825
+ gap: var(--space-3);
826
+ }
827
+ .collection-hero__description {
828
+ max-width: 65ch;
829
+ color: var(--muted);
830
+ }
831
+ .collection-children {
832
+ margin-bottom: var(--space-6);
833
+ }
834
+ .collection-faq {
835
+ max-width: 48rem;
836
+ margin-top: var(--space-8);
837
+ }
838
+ .collection-faq h2 {
839
+ margin-bottom: var(--space-3);
840
+ }
841
+
842
+ .catalog {
843
+ display: grid;
844
+ gap: var(--space-4);
845
+ }
846
+ .catalog__facets:not(:has(.facets-button)) {
847
+ display: none;
848
+ }
849
+ @media (min-width: 990px) {
850
+ .catalog--with-facets {
851
+ grid-template-columns: 15rem minmax(0, 1fr);
852
+ gap: var(--space-7);
853
+ align-items: start;
854
+ }
855
+ .catalog__facets {
856
+ position: sticky;
857
+ top: calc(var(--header-h) + var(--space-4));
858
+ max-height: calc(100dvh - var(--header-h) - var(--space-6));
859
+ overflow-y: auto;
860
+ overscroll-behavior: contain;
861
+ }
862
+ }
863
+ .catalog__main {
864
+ min-width: 0;
865
+ }
866
+ .catalog__toolbar {
867
+ display: flex;
868
+ flex-wrap: wrap;
869
+ align-items: center;
870
+ justify-content: space-between;
871
+ gap: var(--space-3);
872
+ margin-bottom: var(--space-4);
873
+ }
874
+ .catalog__count {
875
+ color: var(--muted);
876
+ font-size: var(--text-sm);
877
+ }
878
+ .sort-select {
879
+ display: flex;
880
+ align-items: center;
881
+ gap: var(--space-2);
882
+ font-size: var(--text-sm);
883
+ }
884
+ .sort-select__label {
885
+ color: var(--muted);
886
+ white-space: nowrap;
887
+ }
888
+ @media (max-width: 749px) {
889
+ .sort-select__label {
890
+ position: absolute;
891
+ width: 1px;
892
+ height: 1px;
893
+ overflow: hidden;
894
+ clip: rect(0 0 0 0);
895
+ white-space: nowrap;
896
+ }
897
+ }
898
+ .sort-select select {
899
+ width: auto;
900
+ min-height: 40px;
901
+ padding-block: 0;
902
+ }
903
+ .active-filters {
904
+ display: flex;
905
+ flex-wrap: wrap;
906
+ align-items: center;
907
+ gap: var(--space-2) var(--space-4);
908
+ margin-bottom: var(--space-5);
909
+ }
910
+ .active-filters .chips {
911
+ margin: 0;
912
+ padding: 0;
913
+ list-style: none;
914
+ }
915
+ .active-filters .chips a {
916
+ min-height: 36px;
917
+ background: var(--subtle);
918
+ }
919
+ .active-filters__clear {
920
+ font-size: var(--text-sm);
921
+ }
922
+
923
+ /* Search */
924
+ .search-form {
925
+ position: relative;
926
+ display: flex;
927
+ gap: var(--space-2);
928
+ max-width: 40rem;
929
+ margin-bottom: var(--space-6);
930
+ }
931
+ .search-form__icon {
932
+ position: absolute;
933
+ top: 50%;
934
+ left: var(--space-3);
935
+ color: var(--muted);
936
+ transform: translateY(-50%);
937
+ pointer-events: none;
938
+ }
939
+ .search-form input {
940
+ flex: 1;
941
+ min-width: 0;
942
+ padding-left: calc(var(--space-3) * 2 + 20px);
943
+ }
944
+ .search-trending {
945
+ margin-top: var(--space-6);
946
+ }
947
+ .search-trending__title {
948
+ margin-bottom: var(--space-3);
949
+ font-size: var(--text-lg);
950
+ }
951
+
952
+ /* Wishlist */
953
+ .wishlist__hint {
954
+ padding: var(--space-3) var(--space-4);
955
+ border-radius: var(--radius-md);
956
+ background: var(--subtle);
957
+ font-size: var(--text-sm);
958
+ }
959
+ .wishlist__item {
960
+ position: relative;
961
+ }
962
+ .wishlist__remove {
963
+ position: absolute;
964
+ z-index: 2;
965
+ top: var(--space-2);
966
+ right: var(--space-2);
967
+ width: 36px;
968
+ height: 36px;
969
+ border-radius: 50%;
970
+ background: var(--surface);
971
+ box-shadow: var(--shadow-1);
972
+ }
973
+
974
+ /* Cart page: lines beside a sticky summary from 990px. */
975
+ .cart-page {
976
+ display: grid;
977
+ gap: var(--space-6);
978
+ }
979
+ @media (min-width: 990px) {
980
+ .cart-page {
981
+ grid-template-columns: minmax(0, 1fr) 24rem;
982
+ gap: var(--space-8);
983
+ align-items: start;
984
+ }
985
+ .cart-summary {
986
+ position: sticky;
987
+ top: calc(var(--header-h) + var(--space-5));
988
+ }
989
+ }
990
+ @container cart-lines (min-width: 480px) {
991
+ .cart-page__lines .cart-line__media {
992
+ width: 96px;
993
+ }
994
+ .cart-page__lines .cart-line {
995
+ grid-template-columns: 96px minmax(0, 1fr) auto;
996
+ }
997
+ }
998
+ .cart-summary {
999
+ display: flex;
1000
+ flex-direction: column;
1001
+ gap: var(--space-4);
1002
+ padding: var(--space-5);
1003
+ border: 1px solid var(--line);
1004
+ border-radius: var(--radius-lg);
1005
+ background: var(--surface);
1006
+ }
1007
+ .cart-summary__title {
1008
+ font-size: var(--text-lg);
1009
+ }
1010
+ .cart-summary__rows {
1011
+ display: grid;
1012
+ gap: var(--space-2);
1013
+ margin: 0;
1014
+ padding-top: var(--space-4);
1015
+ border-top: 1px solid var(--line);
1016
+ }
1017
+ .cart-summary__row {
1018
+ display: flex;
1019
+ justify-content: space-between;
1020
+ gap: var(--space-4);
1021
+ }
1022
+ .cart-summary__row dd {
1023
+ margin: 0;
1024
+ font-variant-numeric: tabular-nums;
1025
+ }
1026
+ .cart-summary__row--total {
1027
+ padding-top: var(--space-3);
1028
+ border-top: 1px solid var(--line);
1029
+ font-size: var(--text-lg);
1030
+ font-weight: var(--weight-heading);
1031
+ }
1032
+ .cart-summary__continue {
1033
+ display: inline-flex;
1034
+ align-items: center;
1035
+ min-height: 44px;
1036
+ align-self: center;
1037
+ font-size: var(--text-sm);
1038
+ }
1039
+ .discount-codes {
1040
+ display: flex;
1041
+ flex-direction: column;
1042
+ gap: var(--space-2);
1043
+ }
1044
+ .discount-codes__form {
1045
+ display: flex;
1046
+ gap: var(--space-2);
1047
+ }
1048
+ .discount-codes__form input {
1049
+ flex: 1;
1050
+ min-width: 0;
1051
+ }
1052
+ .discount-codes__list {
1053
+ margin: 0;
1054
+ padding: 0;
1055
+ list-style: none;
1056
+ }
1057
+ .discount-codes__list button {
1058
+ min-height: 32px;
1059
+ padding-inline: var(--space-3);
1060
+ background: var(--subtle);
1061
+ }
1062
+ .discount-codes__refused {
1063
+ color: var(--danger);
1064
+ text-decoration: line-through;
1065
+ }
1066
+
1067
+ /* Checkout: steps on the left, the order on the right from 990px; a summary bar on phones. */
1068
+ .checkout {
1069
+ display: grid;
1070
+ gap: var(--space-5);
1071
+ }
1072
+ @media (min-width: 990px) {
1073
+ .checkout {
1074
+ grid-template-columns: minmax(0, 1fr) 26rem;
1075
+ gap: var(--space-8);
1076
+ align-items: start;
1077
+ }
1078
+ }
1079
+ .checkout__main {
1080
+ display: flex;
1081
+ flex-direction: column;
1082
+ gap: var(--space-5);
1083
+ min-width: 0;
1084
+ }
1085
+ .checkout__main .page-title {
1086
+ margin-bottom: 0;
1087
+ }
1088
+ .checkout__aside {
1089
+ display: none;
1090
+ }
1091
+ @media (min-width: 990px) {
1092
+ .checkout__aside {
1093
+ position: sticky;
1094
+ top: calc(var(--header-h) + var(--space-5));
1095
+ display: flex;
1096
+ flex-direction: column;
1097
+ gap: var(--space-4);
1098
+ padding: var(--space-5);
1099
+ border-radius: var(--radius-lg);
1100
+ background: var(--subtle);
1101
+ }
1102
+ .checkout__summary-toggle {
1103
+ display: none;
1104
+ }
1105
+ }
1106
+ .checkout__aside-title {
1107
+ font-size: var(--text-lg);
1108
+ }
1109
+ .checkout__summary-toggle {
1110
+ /* Flush under the header: it is the page's first row on phones. */
1111
+ margin: calc(var(--space-5) * -1) calc(var(--gutter) * -1) 0;
1112
+ border-block: 1px solid var(--line);
1113
+ background: var(--subtle);
1114
+ }
1115
+ .checkout__summary-toggle > summary {
1116
+ display: flex;
1117
+ align-items: center;
1118
+ justify-content: space-between;
1119
+ gap: var(--space-3);
1120
+ min-height: 56px;
1121
+ padding: 0 var(--gutter);
1122
+ cursor: pointer;
1123
+ list-style: none;
1124
+ }
1125
+ .checkout__summary-toggle > summary::-webkit-details-marker {
1126
+ display: none;
1127
+ }
1128
+ .checkout__summary-label {
1129
+ display: inline-flex;
1130
+ align-items: center;
1131
+ gap: var(--space-2);
1132
+ color: var(--accent-text);
1133
+ font-size: var(--text-sm);
1134
+ }
1135
+ .checkout__summary-toggle[open] .checkout__summary-chevron {
1136
+ transform: rotate(180deg);
1137
+ }
1138
+ .checkout__summary-toggle > .order-summary {
1139
+ padding: 0 var(--gutter) var(--space-5);
1140
+ }
1141
+ .checkout__back {
1142
+ display: inline-flex;
1143
+ align-items: center;
1144
+ min-height: 44px;
1145
+ gap: var(--space-1);
1146
+ align-self: center;
1147
+ font-size: var(--text-sm);
1148
+ }
1149
+
1150
+ .checkout-steps {
1151
+ display: flex;
1152
+ flex-wrap: wrap;
1153
+ gap: var(--space-2) var(--space-5);
1154
+ margin: 0;
1155
+ padding: 0;
1156
+ list-style: none;
1157
+ color: var(--muted);
1158
+ font-size: var(--text-sm);
1159
+ }
1160
+ .checkout-steps__step {
1161
+ display: inline-flex;
1162
+ align-items: center;
1163
+ gap: var(--space-2);
1164
+ }
1165
+ .checkout-steps__number {
1166
+ display: inline-grid;
1167
+ place-items: center;
1168
+ width: 22px;
1169
+ height: 22px;
1170
+ border: 1px solid var(--line-strong);
1171
+ border-radius: 50%;
1172
+ font-size: var(--text-xs);
1173
+ }
1174
+ .checkout-steps__step[aria-current='step'] {
1175
+ color: var(--fg);
1176
+ font-weight: var(--weight-medium);
1177
+ }
1178
+ .checkout-steps__step[aria-current='step'] .checkout-steps__number,
1179
+ .checkout-steps__step--done .checkout-steps__number {
1180
+ border-color: var(--fg);
1181
+ background: var(--fg);
1182
+ color: var(--bg);
1183
+ }
1184
+
1185
+ .checkout-section {
1186
+ display: flex;
1187
+ flex-direction: column;
1188
+ gap: var(--space-4);
1189
+ padding: var(--space-5);
1190
+ border: 1px solid var(--line);
1191
+ border-radius: var(--radius-lg);
1192
+ background: var(--surface);
1193
+ }
1194
+ .checkout-section__title {
1195
+ display: flex;
1196
+ align-items: center;
1197
+ gap: var(--space-3);
1198
+ font-size: var(--text-lg);
1199
+ }
1200
+ .checkout-section__number {
1201
+ display: inline-grid;
1202
+ flex: none;
1203
+ place-items: center;
1204
+ width: 28px;
1205
+ height: 28px;
1206
+ border-radius: 50%;
1207
+ background: var(--subtle);
1208
+ font-size: var(--text-sm);
1209
+ }
1210
+ .checkout-form {
1211
+ display: flex;
1212
+ flex-direction: column;
1213
+ gap: var(--space-3);
1214
+ align-items: flex-start;
1215
+ }
1216
+ .checkout-form > .field {
1217
+ align-self: stretch;
1218
+ }
1219
+ .checkout-form__row {
1220
+ display: grid;
1221
+ gap: var(--space-3);
1222
+ align-self: stretch;
1223
+ }
1224
+ @media (min-width: 750px) {
1225
+ .checkout-form__row {
1226
+ grid-template-columns: 1fr 1fr;
1227
+ }
1228
+ .checkout-form__row--location {
1229
+ grid-template-columns: 1fr 1fr auto;
1230
+ align-items: end;
1231
+ }
1232
+ }
1233
+ .checkout-form__locate {
1234
+ display: inline-flex;
1235
+ gap: var(--space-2);
1236
+ align-items: center;
1237
+ }
1238
+ .checkout-choices {
1239
+ display: grid;
1240
+ gap: var(--space-2);
1241
+ margin: 0;
1242
+ padding: 0;
1243
+ border: 0;
1244
+ }
1245
+ .checkout-choices__legend {
1246
+ margin-bottom: var(--space-2);
1247
+ padding: 0;
1248
+ font-size: var(--text-sm);
1249
+ font-weight: var(--weight-medium);
1250
+ }
1251
+
1252
+ .radio-card {
1253
+ display: flex;
1254
+ gap: var(--space-3);
1255
+ align-items: flex-start;
1256
+ padding: var(--space-3) var(--space-4);
1257
+ border: 1px solid var(--line-strong);
1258
+ border-radius: var(--radius-md);
1259
+ cursor: pointer;
1260
+ }
1261
+ .radio-card input {
1262
+ flex: none;
1263
+ margin-top: 3px;
1264
+ }
1265
+ .radio-card:has(input:checked) {
1266
+ border-color: var(--fg);
1267
+ box-shadow: inset 0 0 0 1px var(--fg);
1268
+ }
1269
+ .radio-card:has(input:focus-visible) {
1270
+ outline: 2px solid var(--accent);
1271
+ outline-offset: 2px;
1272
+ }
1273
+ .radio-card--disabled {
1274
+ opacity: 0.5;
1275
+ cursor: not-allowed;
1276
+ }
1277
+ .radio-card__body {
1278
+ display: flex;
1279
+ flex: 1;
1280
+ flex-direction: column;
1281
+ gap: 2px;
1282
+ min-width: 0;
1283
+ }
1284
+ .radio-card__title {
1285
+ font-weight: var(--weight-medium);
1286
+ }
1287
+ .radio-card__detail {
1288
+ color: var(--muted);
1289
+ font-size: var(--text-sm);
1290
+ }
1291
+ .radio-card__aside {
1292
+ font-weight: var(--weight-medium);
1293
+ white-space: nowrap;
1294
+ }
1295
+
1296
+ .order-summary {
1297
+ display: flex;
1298
+ flex-direction: column;
1299
+ gap: var(--space-4);
1300
+ }
1301
+ .order-summary__lines {
1302
+ display: grid;
1303
+ gap: var(--space-3);
1304
+ margin: 0;
1305
+ padding: 0;
1306
+ list-style: none;
1307
+ }
1308
+ .order-summary__line {
1309
+ display: grid;
1310
+ grid-template-columns: 56px minmax(0, 1fr) auto;
1311
+ gap: var(--space-3);
1312
+ align-items: center;
1313
+ font-size: var(--text-sm);
1314
+ }
1315
+ .order-summary__media {
1316
+ position: relative;
1317
+ width: 56px;
1318
+ height: 56px;
1319
+ border: 1px solid var(--line);
1320
+ border-radius: var(--radius-sm);
1321
+ background: var(--surface);
1322
+ }
1323
+ .order-summary__media img,
1324
+ .order-summary__media .media-fallback {
1325
+ width: 100%;
1326
+ height: 100%;
1327
+ border-radius: inherit;
1328
+ object-fit: cover;
1329
+ }
1330
+ .order-summary__quantity {
1331
+ position: absolute;
1332
+ top: -8px;
1333
+ right: -8px;
1334
+ display: grid;
1335
+ place-items: center;
1336
+ min-width: 20px;
1337
+ height: 20px;
1338
+ padding: 0 5px;
1339
+ border-radius: var(--radius-pill);
1340
+ background: var(--muted);
1341
+ color: var(--bg);
1342
+ font-size: var(--text-xs);
1343
+ }
1344
+ .order-summary__name {
1345
+ display: flex;
1346
+ flex-direction: column;
1347
+ }
1348
+ .order-summary__price {
1349
+ font-variant-numeric: tabular-nums;
1350
+ white-space: nowrap;
1351
+ }
1352
+ .order-summary__rows {
1353
+ display: grid;
1354
+ gap: var(--space-2);
1355
+ margin: 0;
1356
+ padding-top: var(--space-4);
1357
+ border-top: 1px solid var(--line);
1358
+ }
1359
+ .order-summary__row {
1360
+ display: flex;
1361
+ justify-content: space-between;
1362
+ gap: var(--space-4);
1363
+ }
1364
+ .order-summary__row dd {
1365
+ margin: 0;
1366
+ font-variant-numeric: tabular-nums;
1367
+ }
1368
+ .order-summary__row--total {
1369
+ padding-top: var(--space-3);
1370
+ border-top: 1px solid var(--line);
1371
+ font-size: var(--text-lg);
1372
+ font-weight: var(--weight-heading);
1373
+ }
1374
+
1375
+ .thank-you {
1376
+ display: flex;
1377
+ flex-direction: column;
1378
+ gap: var(--space-3);
1379
+ align-items: center;
1380
+ max-width: 32rem;
1381
+ margin: var(--space-8) auto;
1382
+ text-align: center;
1383
+ }
1384
+ .thank-you__icon {
1385
+ display: grid;
1386
+ place-items: center;
1387
+ width: 56px;
1388
+ height: 56px;
1389
+ border-radius: 50%;
1390
+ background: var(--success);
1391
+ color: var(--bg);
1392
+ }
1393
+ .thank-you__order {
1394
+ font-size: var(--text-lg);
1395
+ }
1396
+ .thank-you__actions {
1397
+ display: flex;
1398
+ flex-wrap: wrap;
1399
+ justify-content: center;
1400
+ gap: var(--space-3);
1401
+ margin-top: var(--space-3);
1402
+ }
1403
+
1404
+ /* Sign-in card */
1405
+ .auth-card {
1406
+ display: flex;
1407
+ flex-direction: column;
1408
+ gap: var(--space-4);
1409
+ max-width: 26rem;
1410
+ margin: var(--space-6) auto;
1411
+ padding: var(--space-6);
1412
+ border: 1px solid var(--line);
1413
+ border-radius: var(--radius-lg);
1414
+ background: var(--surface);
1415
+ }
1416
+ .auth-card__title {
1417
+ font-size: var(--text-2xl);
1418
+ }
1419
+ .auth-card__divider {
1420
+ display: flex;
1421
+ align-items: center;
1422
+ gap: var(--space-3);
1423
+ color: var(--muted);
1424
+ font-size: var(--text-sm);
1425
+ }
1426
+ .auth-card__divider::before,
1427
+ .auth-card__divider::after {
1428
+ content: '';
1429
+ flex: 1;
1430
+ border-top: 1px solid var(--line);
1431
+ }
1432
+
1433
+ /* Account */
1434
+ .account {
1435
+ display: grid;
1436
+ gap: var(--space-5);
1437
+ }
1438
+ @media (min-width: 990px) {
1439
+ .account {
1440
+ grid-template-columns: 14rem minmax(0, 1fr);
1441
+ grid-template-areas:
1442
+ 'header header'
1443
+ 'notice notice'
1444
+ 'nav content';
1445
+ gap: var(--space-6) var(--space-8);
1446
+ align-items: start;
1447
+ }
1448
+ .account__header {
1449
+ grid-area: header;
1450
+ }
1451
+ .account__notice {
1452
+ grid-area: notice;
1453
+ }
1454
+ .account__nav {
1455
+ position: sticky;
1456
+ top: calc(var(--header-h) + var(--space-5));
1457
+ grid-area: nav;
1458
+ flex-direction: column;
1459
+ overflow: visible;
1460
+ margin: 0;
1461
+ padding: 0;
1462
+ border-bottom: 0;
1463
+ }
1464
+ .account__content {
1465
+ grid-area: content;
1466
+ }
1467
+ }
1468
+ .account__name {
1469
+ font-size: var(--text-3xl);
1470
+ }
1471
+ .account__notice {
1472
+ display: flex;
1473
+ flex-direction: column;
1474
+ gap: var(--space-3);
1475
+ align-items: flex-start;
1476
+ padding: var(--space-4);
1477
+ border-radius: var(--radius-md);
1478
+ background: var(--subtle);
1479
+ }
1480
+ .account__nav {
1481
+ display: flex;
1482
+ gap: var(--space-1);
1483
+ margin-inline: calc(var(--gutter) * -1);
1484
+ padding: 0 var(--gutter);
1485
+ overflow-x: auto;
1486
+ border-bottom: 1px solid var(--line);
1487
+ scrollbar-width: none;
1488
+ }
1489
+ .account__nav a {
1490
+ flex: none;
1491
+ padding: var(--space-3) var(--space-3);
1492
+ border-bottom: 2px solid transparent;
1493
+ color: var(--muted);
1494
+ text-decoration: none;
1495
+ }
1496
+ .account__nav a:hover {
1497
+ color: var(--fg);
1498
+ }
1499
+ .account__nav a[aria-current='page'] {
1500
+ border-bottom-color: var(--fg);
1501
+ color: var(--fg);
1502
+ font-weight: var(--weight-medium);
1503
+ }
1504
+ @media (min-width: 990px) {
1505
+ .account__nav a {
1506
+ padding: var(--space-2) var(--space-3);
1507
+ border-bottom: 0;
1508
+ border-radius: var(--radius-sm);
1509
+ }
1510
+ .account__nav a[aria-current='page'] {
1511
+ background: var(--subtle);
1512
+ }
1513
+ }
1514
+ .account__content {
1515
+ min-width: 0;
1516
+ }
1517
+ .account__section-title {
1518
+ margin-bottom: var(--space-4);
1519
+ font-size: var(--text-xl);
1520
+ }
1521
+
1522
+ .order-list {
1523
+ display: grid;
1524
+ gap: var(--space-3);
1525
+ margin: 0;
1526
+ padding: 0;
1527
+ list-style: none;
1528
+ }
1529
+ .order-card {
1530
+ display: grid;
1531
+ grid-template-columns: minmax(0, 1fr) auto 20px;
1532
+ grid-template-areas:
1533
+ 'main total arrow'
1534
+ 'status status arrow';
1535
+ gap: var(--space-2) var(--space-4);
1536
+ align-items: center;
1537
+ padding: var(--space-4);
1538
+ border: 1px solid var(--line);
1539
+ border-radius: var(--radius-md);
1540
+ text-decoration: none;
1541
+ }
1542
+ .order-card:hover {
1543
+ border-color: var(--line-strong);
1544
+ }
1545
+ @media (min-width: 750px) {
1546
+ .order-card {
1547
+ grid-template-columns: minmax(0, 1fr) auto auto 20px;
1548
+ grid-template-areas: 'main status total arrow';
1549
+ }
1550
+ }
1551
+ .order-card__main {
1552
+ display: flex;
1553
+ flex-direction: column;
1554
+ grid-area: main;
1555
+ }
1556
+ .order-card__number {
1557
+ font-weight: var(--weight-medium);
1558
+ }
1559
+ .order-card .order-status {
1560
+ grid-area: status;
1561
+ justify-self: start;
1562
+ }
1563
+ .order-card__total {
1564
+ grid-area: total;
1565
+ font-weight: var(--weight-medium);
1566
+ white-space: nowrap;
1567
+ }
1568
+ .order-card__arrow {
1569
+ grid-area: arrow;
1570
+ color: var(--muted);
1571
+ }
1572
+ .order-status {
1573
+ display: inline-flex;
1574
+ padding: 2px var(--space-2);
1575
+ border-radius: var(--radius-pill);
1576
+ background: var(--subtle);
1577
+ font-size: var(--text-xs);
1578
+ font-weight: var(--weight-medium);
1579
+ white-space: nowrap;
1580
+ }
1581
+ .order-status--delivered {
1582
+ background: color-mix(in srgb, var(--success) 14%, transparent);
1583
+ color: var(--success);
1584
+ }
1585
+ .order-status--cancelled {
1586
+ color: var(--muted);
1587
+ text-decoration: line-through;
1588
+ }
1589
+
1590
+ .order-detail {
1591
+ display: flex;
1592
+ flex-direction: column;
1593
+ gap: var(--space-5);
1594
+ }
1595
+ .order-detail__back {
1596
+ display: inline-flex;
1597
+ align-items: center;
1598
+ gap: var(--space-1);
1599
+ align-self: flex-start;
1600
+ font-size: var(--text-sm);
1601
+ }
1602
+ .order-detail__header {
1603
+ display: flex;
1604
+ flex-wrap: wrap;
1605
+ align-items: flex-start;
1606
+ justify-content: space-between;
1607
+ gap: var(--space-3);
1608
+ }
1609
+ .order-detail__title {
1610
+ font-size: var(--text-xl);
1611
+ }
1612
+ .order-detail__lines {
1613
+ display: grid;
1614
+ gap: var(--space-3);
1615
+ margin: 0;
1616
+ padding: 0;
1617
+ list-style: none;
1618
+ }
1619
+ .order-detail__line {
1620
+ display: grid;
1621
+ grid-template-columns: 64px minmax(0, 1fr) auto;
1622
+ gap: var(--space-3);
1623
+ align-items: center;
1624
+ }
1625
+ .order-detail__media {
1626
+ overflow: hidden;
1627
+ width: 64px;
1628
+ height: 64px;
1629
+ border-radius: var(--radius-sm);
1630
+ background: var(--placeholder);
1631
+ }
1632
+ .order-detail__media img,
1633
+ .order-detail__media .media-fallback {
1634
+ width: 100%;
1635
+ height: 100%;
1636
+ object-fit: cover;
1637
+ }
1638
+ .order-detail__name {
1639
+ display: flex;
1640
+ flex-direction: column;
1641
+ }
1642
+ .order-detail__price {
1643
+ white-space: nowrap;
1644
+ }
1645
+ .order-detail__grid {
1646
+ display: grid;
1647
+ gap: var(--space-5);
1648
+ }
1649
+ @media (min-width: 750px) {
1650
+ .order-detail__grid {
1651
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1652
+ gap: var(--space-7);
1653
+ }
1654
+ }
1655
+ .order-detail__facts {
1656
+ display: flex;
1657
+ flex-direction: column;
1658
+ gap: var(--space-4);
1659
+ }
1660
+ .order-detail__fact-title {
1661
+ margin-bottom: var(--space-1);
1662
+ font-size: var(--text-sm);
1663
+ }
1664
+ .order-detail__actions {
1665
+ display: flex;
1666
+ flex-wrap: wrap;
1667
+ gap: var(--space-3);
1668
+ align-items: center;
1669
+ }
1670
+ .order-detail__confirm {
1671
+ display: flex;
1672
+ flex-direction: column;
1673
+ gap: var(--space-3);
1674
+ padding: var(--space-4);
1675
+ border: 1px solid var(--danger);
1676
+ border-radius: var(--radius-md);
1677
+ }
1678
+
1679
+ .address-list {
1680
+ display: grid;
1681
+ gap: var(--space-3);
1682
+ margin: 0;
1683
+ padding: 0;
1684
+ list-style: none;
1685
+ }
1686
+ .address-card {
1687
+ display: flex;
1688
+ flex-wrap: wrap;
1689
+ align-items: flex-start;
1690
+ justify-content: space-between;
1691
+ gap: var(--space-3);
1692
+ padding: var(--space-4);
1693
+ border: 1px solid var(--line);
1694
+ border-radius: var(--radius-md);
1695
+ }
1696
+ .address-card__text {
1697
+ display: flex;
1698
+ flex-direction: column;
1699
+ gap: var(--space-2);
1700
+ align-items: flex-start;
1701
+ }
1702
+ .address-card__actions {
1703
+ display: flex;
1704
+ flex-wrap: wrap;
1705
+ gap: var(--space-3);
1706
+ }
1707
+ .address-form,
1708
+ .profile-form {
1709
+ display: flex;
1710
+ flex-direction: column;
1711
+ gap: var(--space-3);
1712
+ max-width: 32rem;
1713
+ }
1714
+ .address-form {
1715
+ padding: var(--space-4);
1716
+ border: 1px solid var(--line-strong);
1717
+ border-radius: var(--radius-md);
1718
+ }
1719
+
1720
+ /* Contacts */
1721
+ .contacts-page__grid {
1722
+ display: grid;
1723
+ gap: var(--space-5);
1724
+ }
1725
+ @media (min-width: 750px) {
1726
+ .contacts-page__grid {
1727
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1728
+ }
1729
+ .contacts-card--wide,
1730
+ .contacts-page__disclaimer {
1731
+ grid-column: 1 / -1;
1732
+ }
1733
+ }
1734
+ .contacts-card {
1735
+ display: flex;
1736
+ flex-direction: column;
1737
+ gap: var(--space-4);
1738
+ padding: var(--space-5);
1739
+ border: 1px solid var(--line);
1740
+ border-radius: var(--radius-lg);
1741
+ }
1742
+ .contacts-card__title {
1743
+ font-size: var(--text-lg);
1744
+ }
1745
+ .contacts-list {
1746
+ display: grid;
1747
+ gap: var(--space-3);
1748
+ margin: 0;
1749
+ padding: 0;
1750
+ list-style: none;
1751
+ }
1752
+ .contacts-list li {
1753
+ display: flex;
1754
+ gap: var(--space-3);
1755
+ align-items: flex-start;
1756
+ }
1757
+ .contacts-list svg {
1758
+ flex: none;
1759
+ margin-top: 3px;
1760
+ color: var(--muted);
1761
+ }
1762
+ .contacts-card .chips {
1763
+ margin: 0;
1764
+ padding: 0;
1765
+ list-style: none;
1766
+ }
1767
+ .contacts-card .chips a {
1768
+ gap: var(--space-2);
1769
+ }
1770
+ .contacts-hours {
1771
+ display: grid;
1772
+ gap: var(--space-1);
1773
+ margin: 0;
1774
+ font-size: var(--text-sm);
1775
+ }
1776
+ .contacts-hours div,
1777
+ .contacts-requisites div {
1778
+ display: flex;
1779
+ justify-content: space-between;
1780
+ gap: var(--space-4);
1781
+ }
1782
+ .contacts-hours dt::first-letter {
1783
+ text-transform: uppercase;
1784
+ }
1785
+ .contacts-hours dd,
1786
+ .contacts-requisites dd {
1787
+ margin: 0;
1788
+ font-variant-numeric: tabular-nums;
1789
+ text-align: right;
1790
+ }
1791
+ .contacts-requisites {
1792
+ display: grid;
1793
+ gap: var(--space-2);
1794
+ margin: 0;
1795
+ }
1796
+ .contacts-requisites dt {
1797
+ color: var(--muted);
1798
+ }
1799
+ .contacts-branches {
1800
+ display: grid;
1801
+ grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
1802
+ gap: var(--space-4);
1803
+ margin: 0;
1804
+ padding: 0;
1805
+ list-style: none;
1806
+ }
1807
+ .contacts-branch {
1808
+ display: flex;
1809
+ flex-direction: column;
1810
+ gap: var(--space-1);
1811
+ align-items: flex-start;
1812
+ padding: var(--space-4);
1813
+ border-radius: var(--radius-md);
1814
+ background: var(--subtle);
1815
+ }
1816
+ .contacts-branch__name {
1817
+ font-size: var(--text-base);
1818
+ }
1819
+
1820
+ /* Not found */
1821
+ .not-found__actions {
1822
+ display: flex;
1823
+ flex-direction: column;
1824
+ gap: var(--space-4);
1825
+ align-items: center;
1826
+ width: min(100%, 32rem);
1827
+ }
1828
+ .not-found__actions .search-form {
1829
+ width: 100%;
1830
+ margin: 0;
1831
+ }
1832
+
1833
+ /* Loading: the product image keeps the gallery's place. */
1834
+ .product-loading__media {
1835
+ position: absolute;
1836
+ inset: 0;
1837
+ border-radius: 0;
1838
+ }
1839
+ }