@tonycodes-ui/mortar 0.0.0-stage → 0.12.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 (107) hide show
  1. package/AGENTS.md +10 -0
  2. package/CHANGELOG.md +268 -0
  3. package/CONTRIBUTING.md +60 -0
  4. package/DESIGN.md +51 -0
  5. package/LICENSE +21 -0
  6. package/README.md +155 -2
  7. package/TESTING.md +83 -0
  8. package/baseline-policy.json +16 -0
  9. package/bin/mortar.mjs +258 -0
  10. package/catalog.json +9900 -0
  11. package/cli/audit.mjs +943 -0
  12. package/cli/data.mjs +176 -0
  13. package/cli/mcp.mjs +216 -0
  14. package/cli/migrations.mjs +128 -0
  15. package/cli/packet.mjs +267 -0
  16. package/cli/search.mjs +246 -0
  17. package/cli/tools.mjs +229 -0
  18. package/design-principles.json +30 -0
  19. package/dist/agent-data.json +1 -0
  20. package/dist/application.d.ts +340 -0
  21. package/dist/application.js +240 -0
  22. package/dist/auth.d.ts +121 -0
  23. package/dist/auth.js +97 -0
  24. package/dist/brand.d.ts +69 -0
  25. package/dist/brand.js +266 -0
  26. package/dist/calendar.d.ts +75 -0
  27. package/dist/calendar.js +310 -0
  28. package/dist/choice.d.ts +36 -0
  29. package/dist/choice.js +36 -0
  30. package/dist/composer.d.ts +28 -0
  31. package/dist/composer.js +47 -0
  32. package/dist/display.d.ts +136 -0
  33. package/dist/display.js +75 -0
  34. package/dist/docs.d.ts +145 -0
  35. package/dist/docs.js +141 -0
  36. package/dist/ecommerce.d.ts +261 -0
  37. package/dist/ecommerce.js +177 -0
  38. package/dist/feedback.d.ts +80 -0
  39. package/dist/feedback.js +98 -0
  40. package/dist/foundation.d.ts +42 -0
  41. package/dist/foundation.js +121 -0
  42. package/dist/heading.d.ts +5 -0
  43. package/dist/heading.js +9 -0
  44. package/dist/icons.d.ts +50 -0
  45. package/dist/icons.js +70 -0
  46. package/dist/illustration.d.ts +47 -0
  47. package/dist/illustration.js +47 -0
  48. package/dist/index.d.ts +36 -0
  49. package/dist/index.js +18 -0
  50. package/dist/inspection.d.ts +24 -0
  51. package/dist/inspection.js +14 -0
  52. package/dist/internal.d.ts +514 -0
  53. package/dist/internal.js +332 -0
  54. package/dist/layout.d.ts +107 -0
  55. package/dist/layout.js +66 -0
  56. package/dist/marketing-sections.d.ts +161 -0
  57. package/dist/marketing-sections.js +58 -0
  58. package/dist/marketing.d.ts +277 -0
  59. package/dist/marketing.js +163 -0
  60. package/dist/navigation.d.ts +35 -0
  61. package/dist/navigation.js +44 -0
  62. package/dist/primitives.d.ts +258 -0
  63. package/dist/primitives.js +244 -0
  64. package/dist/showcase.d.ts +29 -0
  65. package/dist/showcase.js +10 -0
  66. package/dist/workspace.d.ts +80 -0
  67. package/dist/workspace.js +48 -0
  68. package/docs/agents.md +127 -0
  69. package/docs/auth-flows.md +71 -0
  70. package/docs/migrating-to-0.6.md +94 -0
  71. package/docs/theming.md +170 -0
  72. package/package.json +94 -4
  73. package/skills/mortar/SKILL.md +36 -0
  74. package/src/application.css +1487 -0
  75. package/src/application.tsx +1413 -0
  76. package/src/auth.tsx +452 -0
  77. package/src/brand.ts +335 -0
  78. package/src/calendar.css +468 -0
  79. package/src/calendar.tsx +868 -0
  80. package/src/choice.tsx +240 -0
  81. package/src/composer.tsx +158 -0
  82. package/src/data.css +690 -0
  83. package/src/display.tsx +452 -0
  84. package/src/docs.css +704 -0
  85. package/src/docs.tsx +737 -0
  86. package/src/ecommerce.css +810 -0
  87. package/src/ecommerce.tsx +1033 -0
  88. package/src/feedback.tsx +388 -0
  89. package/src/foundation.css +1867 -0
  90. package/src/foundation.tsx +227 -0
  91. package/src/heading.ts +13 -0
  92. package/src/icons.tsx +237 -0
  93. package/src/illustration.tsx +169 -0
  94. package/src/index.ts +233 -0
  95. package/src/inspection.tsx +91 -0
  96. package/src/internal.tsx +700 -0
  97. package/src/layout.tsx +342 -0
  98. package/src/marketing-sections.tsx +621 -0
  99. package/src/marketing.css +2579 -0
  100. package/src/marketing.tsx +1235 -0
  101. package/src/navigation.tsx +118 -0
  102. package/src/overlays.css +350 -0
  103. package/src/primitives.tsx +1135 -0
  104. package/src/showcase.tsx +120 -0
  105. package/src/tokens.css +449 -0
  106. package/src/workspace.tsx +333 -0
  107. package/styles.css +56 -0
@@ -0,0 +1,810 @@
1
+ /* Ecommerce: products, cart, filters, reviews and orders.
2
+ Every rule sits in @layer components, so equal-specificity rules resolve by source
3
+ order. styles.css loads tokens, foundation, overlays, application, data, calendar,
4
+ marketing, docs and ecommerce in that order; inside a file each component keeps
5
+ one section, ordered base, then variants and states, then media and container
6
+ queries, except where that would change which equal-specificity rule wins. */
7
+ @layer components {
8
+ /* == ProductList == */
9
+ .m-product-list {
10
+ display: grid;
11
+ grid-template-columns: repeat(var(--m-product-columns, 4), minmax(0, 1fr));
12
+ gap: 32px 24px;
13
+ }
14
+ .m-product-list > li {
15
+ position: relative;
16
+ display: grid;
17
+ grid-template-columns: minmax(0, 1fr) auto;
18
+ gap: 4px 12px;
19
+ min-width: 0;
20
+ }
21
+ .m-product-list .m-product-image {
22
+ grid-column: 1 / -1;
23
+ margin-bottom: 8px;
24
+ }
25
+ .m-product-image {
26
+ position: relative;
27
+ aspect-ratio: 1;
28
+ overflow: hidden;
29
+ border-radius: var(--m-radius-lg);
30
+ background: var(--m-sunken);
31
+ }
32
+ .m-product-image img {
33
+ display: block;
34
+ width: 100%;
35
+ height: 100%;
36
+ object-fit: cover;
37
+ }
38
+ .m-product-badge {
39
+ position: absolute;
40
+ top: 10px;
41
+ left: 10px;
42
+ padding: 2px 8px;
43
+ border-radius: var(--m-radius-full);
44
+ background: var(--m-surface);
45
+ color: var(--m-ink);
46
+ font-size: 12px;
47
+ font-weight: var(--m-weight-semibold);
48
+ }
49
+ .m-product-info {
50
+ min-width: 0;
51
+ }
52
+ .m-product-info > .m-product-name {
53
+ margin: 0;
54
+ font-size: var(--m-font-size);
55
+ font-weight: var(--m-weight-medium);
56
+ }
57
+ .m-product-info a {
58
+ color: var(--m-ink);
59
+ text-decoration: none;
60
+ }
61
+ /* The name link covers the card. */
62
+ .m-product-info a::after {
63
+ content: "";
64
+ position: absolute;
65
+ inset: 0;
66
+ }
67
+ .m-product-meta {
68
+ margin: 2px 0 0;
69
+ color: var(--m-muted);
70
+ font-size: 13px;
71
+ }
72
+ .m-product-price {
73
+ margin: 0;
74
+ color: var(--m-ink);
75
+ font-weight: var(--m-weight-semibold);
76
+ font-variant-numeric: tabular-nums;
77
+ }
78
+ .m-product-summary {
79
+ margin: 6px 0 0;
80
+ color: var(--m-muted);
81
+ font-size: 13px;
82
+ }
83
+ .m-product-list > li > :is(.m-product-swatches, .m-product-card-action) {
84
+ grid-column: 1 / -1;
85
+ }
86
+ .m-product-swatches {
87
+ display: flex;
88
+ flex-wrap: wrap;
89
+ gap: 6px;
90
+ margin: 6px 0 0;
91
+ }
92
+ .m-product-swatches .m-swatch {
93
+ display: block;
94
+ width: 16px;
95
+ height: 16px;
96
+ border-radius: 50%;
97
+ box-shadow: inset 0 0 0 1px var(--m-line-strong);
98
+ }
99
+ .m-product-card-action {
100
+ position: relative;
101
+ z-index: 1;
102
+ margin-top: 8px;
103
+ }
104
+ .m-product-card-action > :is(.m-button, button, a) {
105
+ width: 100%;
106
+ }
107
+ .m-product-overlay {
108
+ display: flex;
109
+ grid-area: 1 / 1;
110
+ align-self: end;
111
+ align-items: baseline;
112
+ justify-content: space-between;
113
+ gap: 4px 12px;
114
+ flex-wrap: wrap;
115
+ margin: 10px;
116
+ padding: 10px 12px;
117
+ border-radius: var(--m-radius);
118
+ background: color-mix(in srgb, var(--m-surface) 90%, transparent);
119
+ backdrop-filter: blur(8px);
120
+ }
121
+ .m-product-overlay > .m-product-info {
122
+ flex: 1 1 auto;
123
+ }
124
+ .m-product-list[data-columns="2"] {
125
+ --m-product-columns: 2;
126
+ }
127
+ .m-product-list[data-columns="3"] {
128
+ --m-product-columns: 3;
129
+ }
130
+ .m-product-list > li:hover .m-product-image img {
131
+ opacity: 0.88;
132
+ }
133
+ .m-product-list > li:has(a:focus-visible) {
134
+ outline: 2px solid var(--m-focus);
135
+ outline-offset: 4px;
136
+ border-radius: var(--m-radius-lg);
137
+ }
138
+ .m-product-info a:focus-visible {
139
+ outline: none;
140
+ }
141
+ .m-product-list[data-variant="cards"] > li > .m-product-swatches {
142
+ grid-row: 3;
143
+ }
144
+ .m-product-list[data-variant="cards"] > li > .m-product-card-action {
145
+ grid-row: 5;
146
+ }
147
+ /* Fixed rows keep each card's action on its bottom edge across a row of cards. */
148
+ .m-product-list[data-variant="cards"] > li {
149
+ grid-template-rows: auto auto auto 1fr auto;
150
+ padding-bottom: 16px;
151
+ overflow: hidden;
152
+ }
153
+ .m-product-list[data-variant="cards"] > li:has(a:hover) {
154
+ border-color: var(--m-line-strong);
155
+ }
156
+ .m-product-list[data-variant="cards"] .m-product-image {
157
+ border-radius: 0;
158
+ border-bottom: 1px solid var(--m-line);
159
+ }
160
+ .m-product-list[data-variant="cards"] > li > :not(.m-product-image) {
161
+ margin-inline: 16px;
162
+ }
163
+ .m-product-list[data-variant="cards"] > li > .m-product-info {
164
+ margin-right: 0;
165
+ }
166
+ /* ProductList overlay: name and price on a panel over the image. */
167
+ .m-product-list[data-variant="overlay"] .m-product-image {
168
+ display: grid;
169
+ margin-bottom: 0;
170
+ }
171
+ .m-product-list[data-variant="overlay"] .m-product-image > img {
172
+ grid-area: 1 / 1;
173
+ }
174
+ @media (max-width: 900px) {
175
+ .m-product-list[data-columns] {
176
+ --m-product-columns: 2;
177
+ }
178
+ }
179
+ @media (max-width: 560px) {
180
+ .m-product-list[data-variant="cards"][data-columns] {
181
+ --m-product-columns: 1;
182
+ }
183
+ }
184
+
185
+ /* == ProductOverview == */
186
+ .m-product-overview {
187
+ display: grid;
188
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
189
+ gap: 32px 48px;
190
+ align-items: start;
191
+ }
192
+ .m-product-gallery {
193
+ display: grid;
194
+ gap: 12px;
195
+ min-width: 0;
196
+ }
197
+ .m-product-thumbs {
198
+ display: grid;
199
+ grid-template-columns: repeat(4, minmax(0, 1fr));
200
+ gap: 10px;
201
+ }
202
+ .m-product-thumbs button {
203
+ aspect-ratio: 1;
204
+ padding: 0;
205
+ overflow: hidden;
206
+ border: 1px solid var(--m-line);
207
+ border-radius: var(--m-radius);
208
+ background: var(--m-sunken);
209
+ cursor: pointer;
210
+ }
211
+ .m-product-thumbs img {
212
+ display: block;
213
+ width: 100%;
214
+ height: 100%;
215
+ object-fit: cover;
216
+ }
217
+ .m-product-details {
218
+ display: grid;
219
+ gap: 16px;
220
+ min-width: 0;
221
+ }
222
+ .m-product-details > .m-product-name {
223
+ margin: 0;
224
+ font-size: clamp(24px, 3vw, 32px);
225
+ font-weight: var(--m-weight-semibold);
226
+ letter-spacing: var(--m-tracking-heading);
227
+ }
228
+ .m-product-details > .m-product-price {
229
+ font-size: 22px;
230
+ font-weight: var(--m-weight-medium);
231
+ }
232
+ .m-rating {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 10px;
236
+ font-size: 13px;
237
+ }
238
+ .m-rating [role="img"] {
239
+ display: inline-flex;
240
+ gap: 2px;
241
+ }
242
+ .m-rating svg {
243
+ color: var(--m-line-strong);
244
+ }
245
+ .m-rating a {
246
+ color: var(--m-link);
247
+ }
248
+ .m-product-description {
249
+ color: var(--m-secondary);
250
+ }
251
+ .m-product-form {
252
+ display: grid;
253
+ gap: 20px;
254
+ margin-top: 4px;
255
+ }
256
+ .m-product-form > .m-button {
257
+ width: 100%;
258
+ min-height: 44px;
259
+ }
260
+ .m-product-option {
261
+ margin: 0;
262
+ padding: 0;
263
+ border: 0;
264
+ min-width: 0;
265
+ }
266
+ .m-product-option legend {
267
+ margin-bottom: 10px;
268
+ padding: 0;
269
+ font-size: 13px;
270
+ font-weight: var(--m-weight-semibold);
271
+ }
272
+ .m-product-option > div {
273
+ display: flex;
274
+ flex-wrap: wrap;
275
+ gap: 8px;
276
+ }
277
+ .m-product-option label {
278
+ position: relative;
279
+ cursor: pointer;
280
+ }
281
+ .m-product-option input {
282
+ position: absolute;
283
+ opacity: 0;
284
+ inset: 0;
285
+ margin: 0;
286
+ cursor: inherit;
287
+ }
288
+ .m-product-option label > span:not(.m-sr-only) {
289
+ display: inline-grid;
290
+ place-items: center;
291
+ min-width: 52px;
292
+ min-height: 40px;
293
+ padding: 0 14px;
294
+ border: 1px solid var(--m-line-strong);
295
+ border-radius: var(--m-radius);
296
+ background: var(--m-surface);
297
+ font-size: 13px;
298
+ font-weight: var(--m-weight-semibold);
299
+ }
300
+ .m-product-highlights {
301
+ display: grid;
302
+ list-style: disc;
303
+ gap: 6px;
304
+ margin: 4px 0 0;
305
+ padding: 16px 0 0 18px;
306
+ border-top: 1px solid var(--m-line);
307
+ color: var(--m-secondary);
308
+ font-size: var(--m-font-size);
309
+ }
310
+ .m-product-thumbs button[aria-pressed="true"] {
311
+ border-color: var(--m-ink);
312
+ box-shadow: 0 0 0 1px var(--m-ink);
313
+ }
314
+ .m-rating [data-filled] svg {
315
+ color: var(--m-ink);
316
+ }
317
+ .m-product-option input:checked + span {
318
+ border-color: var(--m-primary);
319
+ background: var(--m-primary);
320
+ color: var(--m-on-primary);
321
+ }
322
+ .m-product-option input:focus-visible + span {
323
+ outline: 2px solid var(--m-focus);
324
+ outline-offset: 2px;
325
+ }
326
+ .m-product-option label[data-disabled] {
327
+ cursor: not-allowed;
328
+ }
329
+ .m-product-option label[data-disabled] > span:not(.m-sr-only) {
330
+ color: var(--m-muted);
331
+ background: var(--m-sunken);
332
+ text-decoration: line-through;
333
+ }
334
+ .m-product-option[data-swatches] label > .m-swatch {
335
+ width: 36px;
336
+ min-width: 36px;
337
+ height: 36px;
338
+ min-height: 36px;
339
+ padding: 0;
340
+ border-radius: 50%;
341
+ box-shadow: inset 0 0 0 1px var(--m-swatch-ring);
342
+ }
343
+ .m-product-option[data-swatches] input:checked + .m-swatch {
344
+ border-color: var(--m-surface);
345
+ outline: 2px solid var(--m-ink);
346
+ outline-offset: 2px;
347
+ }
348
+ .m-product-gallery[data-gallery="grid"] {
349
+ grid-template-columns: repeat(2, minmax(0, 1fr));
350
+ }
351
+ .m-product-gallery[data-gallery="grid"] > .m-product-image:first-child {
352
+ grid-column: 1 / -1;
353
+ }
354
+ .m-product-gallery[data-gallery="grid"]
355
+ > .m-product-image:last-child:nth-child(even) {
356
+ grid-column: 1 / -1;
357
+ aspect-ratio: 2;
358
+ }
359
+ @media (max-width: 900px) {
360
+ .m-product-overview {
361
+ grid-template-columns: minmax(0, 1fr);
362
+ }
363
+ }
364
+
365
+ /* == ShoppingCart == */
366
+ .m-cart {
367
+ border-top: 1px solid var(--m-line);
368
+ }
369
+ .m-cart > li {
370
+ display: grid;
371
+ grid-template-columns: 96px minmax(0, 1fr) auto;
372
+ gap: 16px;
373
+ align-items: start;
374
+ padding: 20px 0;
375
+ border-bottom: 1px solid var(--m-line);
376
+ }
377
+ .m-cart .m-product-image {
378
+ border-radius: var(--m-radius);
379
+ }
380
+ .m-cart-info {
381
+ display: grid;
382
+ gap: 2px;
383
+ min-width: 0;
384
+ }
385
+ .m-cart-item-title {
386
+ margin: 0;
387
+ font-size: var(--m-font-size);
388
+ font-weight: var(--m-weight-semibold);
389
+ }
390
+ .m-cart-info a {
391
+ color: var(--m-ink);
392
+ text-decoration: none;
393
+ }
394
+ .m-cart-stock {
395
+ margin: 6px 0 0;
396
+ color: var(--m-success);
397
+ font-size: 13px;
398
+ }
399
+ .m-cart-controls {
400
+ display: flex;
401
+ flex-direction: column;
402
+ align-items: flex-end;
403
+ gap: 10px;
404
+ }
405
+ .m-cart-controls select {
406
+ min-height: var(--m-control);
407
+ padding: 0 calc(var(--m-pad) + 24px) 0 var(--m-pad);
408
+ border: 1px solid var(--m-line-strong);
409
+ border-radius: var(--m-radius);
410
+ background: var(--m-surface);
411
+ font-size: var(--m-font-size);
412
+ }
413
+ .m-cart-remove {
414
+ padding: 4px 0;
415
+ color: var(--m-link);
416
+ font-size: 13px;
417
+ font-weight: var(--m-weight-semibold);
418
+ }
419
+ /* ShoppingCart with a summary column and related products. */
420
+ .m-cart-layout {
421
+ container: m-cart-layout / inline-size;
422
+ display: flex;
423
+ flex-wrap: wrap;
424
+ align-items: flex-start;
425
+ gap: 40px 48px;
426
+ }
427
+ .m-cart-layout > * {
428
+ flex: 1 1 100%;
429
+ min-width: 0;
430
+ }
431
+ .m-cart-related {
432
+ display: grid;
433
+ gap: 20px;
434
+ margin-top: 24px;
435
+ }
436
+ .m-cart-related-title {
437
+ margin: 0;
438
+ font-size: 17px;
439
+ font-weight: var(--m-weight-semibold);
440
+ }
441
+ .m-cart-info a:hover {
442
+ text-decoration: underline;
443
+ }
444
+ .m-cart-remove:hover {
445
+ text-decoration: underline;
446
+ }
447
+ @media (max-width: 560px) {
448
+ .m-cart > li {
449
+ grid-template-columns: 72px minmax(0, 1fr);
450
+ }
451
+ .m-cart-controls {
452
+ grid-column: 2;
453
+ flex-direction: row;
454
+ align-items: center;
455
+ justify-content: space-between;
456
+ }
457
+ }
458
+ @container m-cart-layout (min-width: 800px) {
459
+ .m-cart-layout > :is(.m-cart, .m-cart-empty) {
460
+ flex: 7 1 0;
461
+ }
462
+ .m-cart-layout > .m-cart-summary {
463
+ flex: 5 1 0;
464
+ }
465
+ }
466
+
467
+ /* == OrderSummary == */
468
+ .m-order-summary {
469
+ display: grid;
470
+ gap: 16px;
471
+ padding: 24px;
472
+ border-radius: var(--m-radius-lg);
473
+ background: var(--m-sunken);
474
+ }
475
+ .m-order-summary-title {
476
+ margin: 0;
477
+ font-size: 17px;
478
+ font-weight: var(--m-weight-semibold);
479
+ }
480
+ .m-order-summary dl {
481
+ margin: 0;
482
+ }
483
+ .m-order-summary dl > div {
484
+ display: flex;
485
+ justify-content: space-between;
486
+ gap: 16px;
487
+ padding: 12px 0;
488
+ border-bottom: 1px solid var(--m-line);
489
+ font-size: var(--m-font-size);
490
+ }
491
+ .m-order-summary dt {
492
+ color: var(--m-secondary);
493
+ }
494
+ .m-order-summary dd {
495
+ margin: 0;
496
+ color: var(--m-ink);
497
+ font-weight: var(--m-weight-medium);
498
+ font-variant-numeric: tabular-nums;
499
+ }
500
+ .m-order-summary .m-order-total {
501
+ border-bottom: 0;
502
+ font-size: 16px;
503
+ }
504
+ .m-order-summary .m-order-total :is(dt, dd) {
505
+ color: var(--m-ink);
506
+ font-weight: var(--m-weight-semibold);
507
+ }
508
+ .m-order-action > :is(.m-button, button, a) {
509
+ width: 100%;
510
+ min-height: 44px;
511
+ }
512
+
513
+ /* == ProductQuickView == */
514
+ .m-quick-view {
515
+ display: grid;
516
+ gap: 16px;
517
+ }
518
+ .m-quick-view > .m-button {
519
+ justify-self: start;
520
+ }
521
+ .m-quick-view .m-product-overview {
522
+ gap: 24px 32px;
523
+ }
524
+
525
+ /* == ProductFilters == */
526
+ .m-filters {
527
+ display: grid;
528
+ gap: 4px;
529
+ min-width: 0;
530
+ }
531
+ .m-filter-chips {
532
+ display: flex;
533
+ flex-wrap: wrap;
534
+ align-items: center;
535
+ gap: 8px;
536
+ padding-bottom: 12px;
537
+ }
538
+ .m-filter-clear {
539
+ padding: 4px 6px;
540
+ color: var(--m-link);
541
+ font-size: 13px;
542
+ font-weight: var(--m-weight-semibold);
543
+ }
544
+ .m-filters details {
545
+ border-bottom: 1px solid var(--m-line);
546
+ }
547
+ .m-filters summary {
548
+ display: flex;
549
+ align-items: center;
550
+ gap: 8px;
551
+ padding: 14px 0;
552
+ color: var(--m-ink);
553
+ font-size: var(--m-font-size);
554
+ font-weight: var(--m-weight-semibold);
555
+ cursor: pointer;
556
+ list-style: none;
557
+ }
558
+ .m-filters summary::-webkit-details-marker {
559
+ display: none;
560
+ }
561
+ .m-filters summary::after {
562
+ content: "+";
563
+ margin-left: auto;
564
+ color: var(--m-muted);
565
+ font-weight: var(--m-weight-regular);
566
+ }
567
+ .m-filters fieldset {
568
+ display: grid;
569
+ gap: 10px;
570
+ margin: 0;
571
+ padding: 0 0 16px;
572
+ border: 0;
573
+ }
574
+ .m-filter-count {
575
+ margin-left: 6px;
576
+ color: var(--m-muted);
577
+ font-size: 12px;
578
+ }
579
+ .m-filters details[open] summary::after {
580
+ content: "−";
581
+ }
582
+
583
+ /* == ProductReviews == */
584
+ .m-reviews {
585
+ display: grid;
586
+ grid-template-columns: minmax(0, 320px) minmax(0, 1fr);
587
+ gap: 32px 64px;
588
+ align-items: start;
589
+ }
590
+ .m-reviews-summary {
591
+ display: grid;
592
+ gap: 16px;
593
+ }
594
+ .m-reviews-title {
595
+ margin: 0;
596
+ font-size: 22px;
597
+ font-weight: var(--m-weight-semibold);
598
+ letter-spacing: var(--m-tracking-heading);
599
+ }
600
+ .m-stars {
601
+ display: inline-flex;
602
+ gap: 2px;
603
+ }
604
+ .m-stars svg {
605
+ color: var(--m-line-strong);
606
+ }
607
+ .m-reviews-distribution {
608
+ display: grid;
609
+ gap: 6px;
610
+ margin: 0;
611
+ }
612
+ .m-reviews-distribution > div {
613
+ display: grid;
614
+ grid-template-columns: 56px minmax(0, 1fr);
615
+ align-items: center;
616
+ gap: 12px;
617
+ font-size: 13px;
618
+ }
619
+ .m-reviews-distribution dt {
620
+ color: var(--m-secondary);
621
+ }
622
+ .m-reviews-distribution dd {
623
+ display: grid;
624
+ grid-template-columns: minmax(0, 1fr) 32px;
625
+ align-items: center;
626
+ gap: 10px;
627
+ margin: 0;
628
+ color: var(--m-muted);
629
+ font-variant-numeric: tabular-nums;
630
+ text-align: end;
631
+ }
632
+ .m-reviews-distribution meter {
633
+ width: 100%;
634
+ height: 8px;
635
+ appearance: none;
636
+ border: 0;
637
+ border-radius: var(--m-radius-full);
638
+ background: var(--m-sunken);
639
+ overflow: hidden;
640
+ }
641
+ .m-reviews-distribution meter::-webkit-meter-bar {
642
+ border: 0;
643
+ border-radius: var(--m-radius-full);
644
+ background: var(--m-sunken);
645
+ }
646
+ .m-reviews-distribution meter::-webkit-meter-optimum-value {
647
+ border-radius: var(--m-radius-full);
648
+ background: var(--m-ink);
649
+ }
650
+ .m-reviews-distribution meter::-moz-meter-bar {
651
+ border-radius: var(--m-radius-full);
652
+ background: var(--m-ink);
653
+ }
654
+ .m-review-list {
655
+ min-width: 0;
656
+ }
657
+ .m-review {
658
+ display: grid;
659
+ gap: 10px;
660
+ padding: 24px 0;
661
+ border-bottom: 1px solid var(--m-line);
662
+ }
663
+ .m-review:first-child {
664
+ padding-top: 0;
665
+ }
666
+ .m-review header {
667
+ display: grid;
668
+ gap: 6px;
669
+ }
670
+ .m-review-title {
671
+ margin: 0;
672
+ font-size: var(--m-font-size);
673
+ font-weight: var(--m-weight-semibold);
674
+ }
675
+ .m-review-meta {
676
+ margin: 0;
677
+ color: var(--m-muted);
678
+ font-size: 13px;
679
+ }
680
+ .m-review-body {
681
+ color: var(--m-secondary);
682
+ font-size: var(--m-font-size);
683
+ }
684
+ .m-stars [data-filled] svg {
685
+ color: var(--m-ink);
686
+ }
687
+ /* ProductReviews with reviewer avatars. */
688
+ .m-reviews[data-avatars] .m-review header {
689
+ grid-template-columns: auto minmax(0, 1fr);
690
+ column-gap: 12px;
691
+ align-items: center;
692
+ }
693
+ .m-reviews[data-avatars] .m-review header > * {
694
+ grid-column: 2;
695
+ }
696
+ .m-reviews[data-avatars] .m-review header > .m-review-avatar {
697
+ grid-column: 1;
698
+ grid-row: 1 / span 3;
699
+ align-self: start;
700
+ }
701
+ @media (max-width: 900px) {
702
+ .m-reviews {
703
+ grid-template-columns: minmax(0, 1fr);
704
+ }
705
+ }
706
+
707
+ /* == OrderHistory == */
708
+ .m-order-history {
709
+ display: grid;
710
+ gap: 32px;
711
+ }
712
+ .m-order {
713
+ overflow: hidden;
714
+ }
715
+ .m-order-header {
716
+ display: flex;
717
+ flex-wrap: wrap;
718
+ align-items: center;
719
+ gap: 12px 32px;
720
+ padding: 16px 20px;
721
+ border-bottom: 1px solid var(--m-line);
722
+ background: var(--m-sunken);
723
+ }
724
+ .m-order-title {
725
+ margin: 0;
726
+ font-size: var(--m-font-size);
727
+ font-weight: var(--m-weight-semibold);
728
+ }
729
+ .m-order-header dl {
730
+ display: flex;
731
+ flex-wrap: wrap;
732
+ gap: 8px 32px;
733
+ margin: 0;
734
+ font-size: 13px;
735
+ }
736
+ .m-order-header dt {
737
+ color: var(--m-muted);
738
+ }
739
+ .m-order-header dd {
740
+ margin: 0;
741
+ color: var(--m-ink);
742
+ font-weight: var(--m-weight-medium);
743
+ }
744
+ .m-order-header > a {
745
+ margin-left: auto;
746
+ color: var(--m-link);
747
+ font-size: 13px;
748
+ font-weight: var(--m-weight-semibold);
749
+ }
750
+ .m-order-status {
751
+ margin: 0;
752
+ padding: 12px 20px 0;
753
+ color: var(--m-success);
754
+ font-size: 13px;
755
+ font-weight: var(--m-weight-semibold);
756
+ }
757
+ .m-order-items {
758
+ padding: 0 20px;
759
+ }
760
+ .m-order-items > li {
761
+ display: grid;
762
+ grid-template-columns: 64px minmax(0, 1fr) auto;
763
+ align-items: center;
764
+ gap: 16px;
765
+ padding: 16px 0;
766
+ border-bottom: 1px solid var(--m-line);
767
+ }
768
+ .m-order-items > li:last-child {
769
+ border-bottom: 0;
770
+ }
771
+ .m-order-items .m-product-image {
772
+ border-radius: var(--m-radius);
773
+ }
774
+ .m-order-item-name {
775
+ margin: 0;
776
+ font-size: var(--m-font-size);
777
+ font-weight: var(--m-weight-semibold);
778
+ }
779
+ .m-order-item-name a {
780
+ color: var(--m-ink);
781
+ }
782
+ .m-order-actions {
783
+ display: flex;
784
+ flex-wrap: wrap;
785
+ gap: 8px;
786
+ }
787
+ .m-order-item-actions {
788
+ display: flex;
789
+ flex-wrap: wrap;
790
+ gap: 8px;
791
+ grid-column: 2 / -1;
792
+ }
793
+ .m-order-progress {
794
+ padding: 16px 20px 4px;
795
+ }
796
+ .m-order-hint {
797
+ display: block;
798
+ margin-top: 2px;
799
+ color: var(--m-muted);
800
+ font-size: 12px;
801
+ }
802
+ .m-order-hint a {
803
+ color: var(--m-link);
804
+ }
805
+ @media (max-width: 560px) {
806
+ .m-order-header > a {
807
+ margin-left: 0;
808
+ }
809
+ }
810
+ }