@usequeek/theme-kit 0.1.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 (120) hide show
  1. package/README.md +37 -0
  2. package/api/collections.ts +93 -0
  3. package/api/orders.ts +23 -0
  4. package/apps/analytics-events.ts +32 -0
  5. package/apps/apps.css +613 -0
  6. package/apps/follow-card.tsx +192 -0
  7. package/apps/gtag.ts +19 -0
  8. package/apps/subscribe-form.tsx +124 -0
  9. package/client.ts +52 -0
  10. package/components/auth/auth-email-login-step.tsx +46 -0
  11. package/components/auth/auth-email-otp-step.tsx +54 -0
  12. package/components/auth/auth-email-otp-verify-step.tsx +82 -0
  13. package/components/auth/auth-email-register-step.tsx +59 -0
  14. package/components/auth/auth-flow.tsx +26 -0
  15. package/components/auth/auth-signup-step.tsx +53 -0
  16. package/components/blog/category-filter.tsx +92 -0
  17. package/components/blog/index.ts +12 -0
  18. package/components/blog/pagination.tsx +73 -0
  19. package/components/blog/post-categories.tsx +42 -0
  20. package/components/blog/post-meta.tsx +49 -0
  21. package/components/blog/related-posts.tsx +54 -0
  22. package/components/blog/share-buttons.tsx +89 -0
  23. package/components/cart/cart-panel-controller.tsx +67 -0
  24. package/components/cart/default-cart-shell.tsx +207 -0
  25. package/components/checkout/checkout-contact.tsx +84 -0
  26. package/components/checkout/default-checkout-shell.tsx +177 -0
  27. package/components/checkout/policy-links.tsx +98 -0
  28. package/components/image.tsx +149 -0
  29. package/components/markdown.tsx +54 -0
  30. package/components/product-media-frame.tsx +56 -0
  31. package/components/variant-picker.css +84 -0
  32. package/components/variant-picker.tsx +107 -0
  33. package/design-token-preview.tsx +81 -0
  34. package/edit-mode-active.tsx +324 -0
  35. package/edit-mode.tsx +80 -0
  36. package/hooks/use-address-autocomplete.ts +62 -0
  37. package/hooks/use-auth-flow.tsx +346 -0
  38. package/hooks/use-auth.ts +17 -0
  39. package/hooks/use-cart.ts +14 -0
  40. package/hooks/use-categories.ts +112 -0
  41. package/hooks/use-collection-params.ts +67 -0
  42. package/hooks/use-href.ts +15 -0
  43. package/hooks/use-posts.ts +75 -0
  44. package/hooks/use-product-detail.ts +69 -0
  45. package/hooks/use-product-questions.ts +77 -0
  46. package/hooks/use-product-sections.ts +165 -0
  47. package/hooks/use-products.ts +216 -0
  48. package/hooks/use-related-products.ts +56 -0
  49. package/hooks/use-resolve-coordinates.ts +48 -0
  50. package/hooks/use-reviews.ts +167 -0
  51. package/hooks/use-search.ts +55 -0
  52. package/hooks/use-shop-cart.ts +31 -0
  53. package/hooks/use-shop-params.ts +68 -0
  54. package/hooks/use-shop.ts +186 -0
  55. package/hooks/use-variant-selection.ts +98 -0
  56. package/index.ts +49 -0
  57. package/package.json +41 -0
  58. package/page-renderer.tsx +365 -0
  59. package/provider.tsx +91 -0
  60. package/sdk/client.ts +221 -0
  61. package/sdk/error-handler.ts +37 -0
  62. package/sdk/platform.ts +78 -0
  63. package/sdk/queek-client.ts +104 -0
  64. package/sdk/reauth-guard.ts +27 -0
  65. package/sdk/server-store-client.ts +165 -0
  66. package/shared-blocks/button.tsx +41 -0
  67. package/shared-blocks/callout.tsx +35 -0
  68. package/shared-blocks/content-default.tsx +23 -0
  69. package/shared-blocks/core-blocks.css +1792 -0
  70. package/shared-blocks/divider.tsx +17 -0
  71. package/shared-blocks/embed.tsx +40 -0
  72. package/shared-blocks/faq.tsx +44 -0
  73. package/shared-blocks/image.tsx +29 -0
  74. package/shared-blocks/index.ts +24 -0
  75. package/shared-blocks/manifest.ts +76 -0
  76. package/shared-blocks/product-qa.tsx +203 -0
  77. package/shared-blocks/quote.tsx +20 -0
  78. package/shared-blocks/reviews.tsx +436 -0
  79. package/shared-blocks/table.tsx +45 -0
  80. package/shared-blocks/video.tsx +60 -0
  81. package/stores/address-modal-store.ts +15 -0
  82. package/stores/auth-modal-store.ts +17 -0
  83. package/stores/cart-panel-store.ts +17 -0
  84. package/stores/cart-store.ts +172 -0
  85. package/stores/checkout-store.ts +167 -0
  86. package/stores/edit-preview-store.ts +61 -0
  87. package/stores/location-store.ts +41 -0
  88. package/stores/orders-sheet-store.ts +21 -0
  89. package/stores/policy-modal-store.ts +15 -0
  90. package/stores/product-modal-store.ts +18 -0
  91. package/stores/search-modal-store.ts +17 -0
  92. package/stores/toast-store.ts +46 -0
  93. package/stores/user-store.ts +88 -0
  94. package/theme-context.tsx +28 -0
  95. package/theme-variant-resolver.ts +44 -0
  96. package/types/block.ts +292 -0
  97. package/types/cart.ts +21 -0
  98. package/types/media.ts +55 -0
  99. package/types/menu.ts +27 -0
  100. package/types/order.ts +119 -0
  101. package/types/page.ts +86 -0
  102. package/types/product.ts +279 -0
  103. package/types/theme.ts +380 -0
  104. package/types/vendor.ts +243 -0
  105. package/utils/addon-selection.ts +31 -0
  106. package/utils/benefit-icon.tsx +145 -0
  107. package/utils/brand-palette.ts +64 -0
  108. package/utils/brand.ts +518 -0
  109. package/utils/contact-location.ts +44 -0
  110. package/utils/format.ts +64 -0
  111. package/utils/hero-content.ts +35 -0
  112. package/utils/image-srcset.ts +157 -0
  113. package/utils/markdown.tsx +237 -0
  114. package/utils/match-variant.ts +31 -0
  115. package/utils/menu-link.ts +41 -0
  116. package/utils/placeholder-resolver.ts +184 -0
  117. package/utils/product-media.ts +77 -0
  118. package/utils/product-normalizer.ts +323 -0
  119. package/utils/vendor-host.ts +173 -0
  120. package/utils/video-embed.ts +38 -0
@@ -0,0 +1,1792 @@
1
+ /* ──────────────────────────────────────────────────────────────
2
+ * Core Block Base Styles
3
+ *
4
+ * Framework-owned blocks use semantic class names under `.core-block-*`.
5
+ * These base styles provide sensible defaults so unstyled themes still
6
+ * render readable blocks. Themes override freely via scoped selectors:
7
+ *
8
+ * .theme-my-theme .core-block-table th {
9
+ * font-family: var(--ql-font-display);
10
+ * }
11
+ *
12
+ * Everything here uses CSS variables. No hardcoded colors, no hardcoded
13
+ * fonts. Tinting comes from theme.css.
14
+ * ──────────────────────────────────────────────────────────── */
15
+
16
+ .core-block {
17
+ margin: 0 auto;
18
+ padding: clamp(1.5rem, 4vw, 3rem) 1.25rem;
19
+ width: 100%;
20
+ max-width: var(--core-block-max-width, 1200px);
21
+ box-sizing: border-box;
22
+ /* Ties core-owned corner radii to the vendor's actual shape token instead
23
+ of a hardcoded 8px — a theme on the "sharp" shape token gets sharp
24
+ core blocks too, not rounded ones that clash with its own design. */
25
+ --core-block-radius: var(--radius-md, 8px);
26
+ }
27
+
28
+ /* ── Divider ─────────────────────────────────────────────────── */
29
+ .core-block-divider {
30
+ padding: clamp(0.5rem, 2vw, 1.5rem) 1.25rem;
31
+ display: flex;
32
+ justify-content: center;
33
+ }
34
+
35
+ .core-block-divider--line .core-block-divider__line {
36
+ width: 100%;
37
+ max-width: var(--core-block-max-width, 1200px);
38
+ border: 0;
39
+ border-top: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
40
+ margin: 0;
41
+ opacity: 0.6;
42
+ }
43
+
44
+ .core-block-divider--space {
45
+ min-height: 2.5rem;
46
+ }
47
+
48
+ /* ── Embed ───────────────────────────────────────────────────── */
49
+ .core-block-embed__wrap {
50
+ width: 100%;
51
+ position: relative;
52
+ aspect-ratio: 16 / 9;
53
+ border-radius: var(--core-block-radius, 4px);
54
+ overflow: hidden;
55
+ background: var(--brand-surface, #f3f3f3);
56
+ }
57
+
58
+ .core-block-embed__frame {
59
+ position: absolute;
60
+ inset: 0;
61
+ width: 100%;
62
+ height: 100%;
63
+ border: 0;
64
+ display: block;
65
+ }
66
+
67
+ /* ── Video ───────────────────────────────────────────────────── */
68
+ .core-block-video__wrap {
69
+ width: 100%;
70
+ position: relative;
71
+ aspect-ratio: 16 / 9;
72
+ border-radius: var(--core-block-radius, 4px);
73
+ overflow: hidden;
74
+ background: #000;
75
+ }
76
+
77
+ .core-block-video__frame,
78
+ .core-block-video__el {
79
+ position: absolute;
80
+ inset: 0;
81
+ width: 100%;
82
+ height: 100%;
83
+ border: 0;
84
+ display: block;
85
+ object-fit: cover;
86
+ }
87
+
88
+ .core-block-video__wrap--empty {
89
+ background: linear-gradient(135deg, var(--brand-surface, #2a2a2a), var(--brand-background, #1a1a1a));
90
+ }
91
+
92
+ .core-block-video__placeholder,
93
+ .core-block-embed__placeholder {
94
+ position: absolute;
95
+ inset: 0;
96
+ display: flex;
97
+ flex-direction: column;
98
+ align-items: center;
99
+ justify-content: center;
100
+ gap: 0.85rem;
101
+ color: var(--brand-text-muted, rgba(255, 255, 255, 0.6));
102
+ font-family: var(--font-body, system-ui, sans-serif);
103
+ font-size: 0.85rem;
104
+ letter-spacing: 0.04em;
105
+ }
106
+
107
+ .core-block-embed__wrap--empty {
108
+ background: linear-gradient(135deg, var(--brand-surface, #f5f5f5), var(--brand-background, #eeeeee));
109
+ }
110
+
111
+ .core-block-embed__placeholder {
112
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.5));
113
+ }
114
+
115
+ /* ── Table ───────────────────────────────────────────────────── */
116
+ .core-block-table__wrap {
117
+ width: 100%;
118
+ overflow-x: auto;
119
+ }
120
+
121
+ .core-block-table__table {
122
+ width: 100%;
123
+ border-collapse: collapse;
124
+ font-family: var(--font-body, system-ui, -apple-system, sans-serif);
125
+ color: var(--brand-text, #1a1a1a);
126
+ }
127
+
128
+ .core-block-table__th {
129
+ text-align: left;
130
+ padding: 0.75rem 1rem;
131
+ font-weight: 500;
132
+ text-transform: uppercase;
133
+ letter-spacing: 0.08em;
134
+ font-size: 0.75rem;
135
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
136
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.15));
137
+ }
138
+
139
+ .core-block-table__cell {
140
+ padding: 0.875rem 1rem;
141
+ font-size: 0.9rem;
142
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
143
+ }
144
+
145
+ .core-block-table__row:last-child .core-block-table__cell {
146
+ border-bottom: 0;
147
+ }
148
+
149
+ /* ── Button ──────────────────────────────────────────────────── */
150
+ .core-block-button-wrap {
151
+ padding: clamp(1rem, 3vw, 2rem) 1.25rem;
152
+ display: flex;
153
+ /* A standalone CTA is the only thing in its band — left-aligned, it reads
154
+ as an accident (a control "hanging on nothing" next to empty space),
155
+ not a deliberate section. Centered, the same band reads as a promo/CTA
156
+ band, a legitimate section shape. */
157
+ justify-content: center;
158
+ max-width: var(--core-block-max-width, 1200px);
159
+ margin: 0 auto;
160
+ }
161
+
162
+ .core-block-button {
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ gap: 0.5rem;
167
+ padding: 0.85rem 1.75rem;
168
+ background: var(--brand-button, var(--brand-accent, #000));
169
+ color: var(--brand-button-text, #fff);
170
+ font-family: var(--font-body, system-ui, sans-serif);
171
+ font-size: 0.875rem;
172
+ font-weight: 500;
173
+ letter-spacing: 0.06em;
174
+ text-transform: uppercase;
175
+ text-decoration: none;
176
+ border: 0;
177
+ border-radius: var(--core-block-button-radius, 2px);
178
+ cursor: pointer;
179
+ transition: transform 0.2s ease, opacity 0.2s ease;
180
+ }
181
+
182
+ .core-block-button:hover {
183
+ opacity: 0.9;
184
+ transform: translateY(-1px);
185
+ }
186
+
187
+ /* ── Image ───────────────────────────────────────────────────── */
188
+ .core-block-image__figure {
189
+ margin: 0;
190
+ }
191
+
192
+ .core-block-image__img {
193
+ display: block;
194
+ width: 100%;
195
+ height: auto;
196
+ max-width: 100%;
197
+ border-radius: var(--core-block-radius, 0);
198
+ }
199
+
200
+ .core-block-image__caption {
201
+ margin-top: 0.75rem;
202
+ font-family: var(--font-body, system-ui, sans-serif);
203
+ font-size: 0.85rem;
204
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
205
+ text-align: center;
206
+ font-style: italic;
207
+ }
208
+
209
+ /* ── Content (default markdown) ─────────────────────────────── */
210
+ .core-block-content__body {
211
+ font-family: var(--font-body, system-ui, -apple-system, sans-serif);
212
+ color: var(--brand-text, #1a1a1a);
213
+ line-height: 1.65;
214
+ font-size: 1rem;
215
+ max-width: 720px;
216
+ }
217
+
218
+ .core-block-content__body h1,
219
+ .core-block-content__body h2,
220
+ .core-block-content__body h3 {
221
+ font-family: var(--font-heading, var(--font-body, sans-serif));
222
+ color: var(--brand-text, inherit);
223
+ margin-top: 1.5rem;
224
+ margin-bottom: 0.75rem;
225
+ line-height: 1.2;
226
+ }
227
+
228
+ .core-block-content__body h1 { font-size: 2rem; }
229
+ .core-block-content__body h2 { font-size: 1.5rem; }
230
+ .core-block-content__body h3 { font-size: 1.2rem; }
231
+
232
+ .core-block-content__body p {
233
+ margin: 0 0 1rem;
234
+ }
235
+
236
+ .core-block-content__body ul,
237
+ .core-block-content__body ol {
238
+ margin: 0 0 1rem;
239
+ padding-left: 1.25rem;
240
+ }
241
+
242
+ .core-block-content__body li {
243
+ margin-bottom: 0.35rem;
244
+ }
245
+
246
+ .core-block-content__body strong {
247
+ font-weight: 600;
248
+ color: inherit;
249
+ }
250
+
251
+ /* ── Reviews ─────────────────────────────────────────────────── */
252
+ .core-block-reviews {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 1.5rem;
256
+ }
257
+
258
+ .core-block-reviews__header {
259
+ display: flex;
260
+ flex-wrap: wrap;
261
+ align-items: baseline;
262
+ gap: 0.75rem 1.5rem;
263
+ }
264
+
265
+ .core-block-reviews__title {
266
+ margin: 0;
267
+ font-family: var(--font-heading, var(--font-body, sans-serif));
268
+ font-size: clamp(1.4rem, 2.5vw, 2rem);
269
+ color: var(--brand-text, #1a1a1a);
270
+ letter-spacing: -0.01em;
271
+ line-height: 1.15;
272
+ }
273
+
274
+ .core-block-reviews__summary {
275
+ display: inline-flex;
276
+ align-items: center;
277
+ gap: 0.5rem;
278
+ color: var(--brand-text, #1a1a1a);
279
+ }
280
+
281
+ .core-block-reviews__summary-text {
282
+ display: inline-flex;
283
+ align-items: center;
284
+ gap: 0.35rem;
285
+ font-size: 0.95rem;
286
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.65));
287
+ }
288
+
289
+ .core-block-reviews__summary-text strong {
290
+ color: var(--brand-text, #1a1a1a);
291
+ font-weight: 600;
292
+ }
293
+
294
+ .core-block-reviews__stars {
295
+ display: inline-flex;
296
+ gap: 2px;
297
+ color: var(--brand-accent, #f5a524);
298
+ }
299
+
300
+ .core-block-reviews__star {
301
+ width: 16px;
302
+ height: 16px;
303
+ fill: currentColor;
304
+ opacity: 0.25;
305
+ }
306
+
307
+ .core-block-reviews__star[data-filled='true'] {
308
+ opacity: 1;
309
+ }
310
+
311
+ .core-block-reviews__stars--sm .core-block-reviews__star {
312
+ width: 12px;
313
+ height: 12px;
314
+ }
315
+
316
+ .core-block-reviews__empty {
317
+ margin: 0;
318
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
319
+ font-size: 0.95rem;
320
+ }
321
+
322
+ .core-block-reviews__list {
323
+ display: grid;
324
+ gap: 1.25rem;
325
+ }
326
+
327
+ .core-block-reviews__list--grid {
328
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
329
+ }
330
+
331
+ .core-block-reviews__list--carousel {
332
+ display: flex;
333
+ gap: 1rem;
334
+ overflow-x: auto;
335
+ scroll-snap-type: x mandatory;
336
+ padding-bottom: 0.5rem;
337
+ -webkit-overflow-scrolling: touch;
338
+ }
339
+
340
+ .core-block-reviews__list--carousel .core-block-reviews__card {
341
+ flex: 0 0 min(320px, 85vw);
342
+ scroll-snap-align: start;
343
+ }
344
+
345
+ /* Carousel with prev/next controls. The wrapper positions the arrows over the
346
+ * rail edges; token-driven so each theme's palette carries through. */
347
+ .core-block-reviews__carousel {
348
+ position: relative;
349
+ }
350
+
351
+ .core-block-reviews__nav {
352
+ position: absolute;
353
+ top: 50%;
354
+ transform: translateY(-50%);
355
+ z-index: 2;
356
+ display: inline-flex;
357
+ align-items: center;
358
+ justify-content: center;
359
+ width: 2.75rem;
360
+ height: 2.75rem;
361
+ border-radius: 999px;
362
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
363
+ background: var(--brand-bg, #fff);
364
+ color: var(--brand-text, #111);
365
+ cursor: pointer;
366
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.1);
367
+ transition: background 0.2s ease, transform 0.2s ease;
368
+ }
369
+
370
+ .core-block-reviews__nav--prev {
371
+ left: 0.25rem;
372
+ }
373
+
374
+ .core-block-reviews__nav--next {
375
+ right: 0.25rem;
376
+ }
377
+
378
+ .core-block-reviews__nav svg {
379
+ width: 18px;
380
+ height: 18px;
381
+ }
382
+
383
+ .core-block-reviews__nav:hover {
384
+ background: var(--brand-muted, #f5f5f5);
385
+ transform: translateY(-50%) scale(1.06);
386
+ }
387
+
388
+ .core-block-reviews__nav:focus-visible {
389
+ outline: 2px solid var(--brand-accent, #111);
390
+ outline-offset: 2px;
391
+ }
392
+
393
+ @media (max-width: 640px) {
394
+ .core-block-reviews__nav {
395
+ display: none;
396
+ }
397
+ }
398
+
399
+ .core-block-reviews__list--wall {
400
+ columns: 280px;
401
+ column-gap: 1.25rem;
402
+ display: block;
403
+ }
404
+
405
+ .core-block-reviews__list--wall .core-block-reviews__card {
406
+ break-inside: avoid;
407
+ margin-bottom: 1.25rem;
408
+ display: inline-block;
409
+ width: 100%;
410
+ }
411
+
412
+ .core-block-reviews__card {
413
+ position: relative;
414
+ background: var(--brand-surface, #fff);
415
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
416
+ border-radius: var(--core-block-radius, 8px);
417
+ padding: 1.5rem 1.375rem 1.25rem;
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: 0.75rem;
421
+ overflow: hidden;
422
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
423
+ transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.35s cubic-bezier(0.16, 1, 0.3, 1),
424
+ border-color 0.35s ease;
425
+ }
426
+
427
+ .core-block-reviews__card:hover {
428
+ transform: translateY(-3px);
429
+ border-color: var(--brand-accent-soft, rgba(0, 0, 0, 0.16));
430
+ box-shadow: 0 24px 44px -30px rgba(0, 0, 0, 0.35);
431
+ }
432
+
433
+ /* Large decorative quote glyph — atmospheric, never competes with content. */
434
+ .core-block-reviews__card::before {
435
+ content: '\201C';
436
+ position: absolute;
437
+ top: -0.35rem;
438
+ right: 0.75rem;
439
+ font-family: Georgia, 'Times New Roman', serif;
440
+ font-size: 4.5rem;
441
+ line-height: 1;
442
+ color: var(--brand-accent, #999);
443
+ opacity: 0.08;
444
+ pointer-events: none;
445
+ }
446
+
447
+ .core-block-reviews__card-head {
448
+ display: flex;
449
+ align-items: center;
450
+ gap: 0.75rem;
451
+ position: relative;
452
+ }
453
+
454
+ .core-block-reviews__avatar {
455
+ width: 40px;
456
+ height: 40px;
457
+ border-radius: 50%;
458
+ overflow: hidden;
459
+ background: linear-gradient(135deg, var(--brand-accent-soft, rgba(0, 0, 0, 0.08)), transparent);
460
+ border: 1px solid var(--brand-accent-soft, rgba(0, 0, 0, 0.12));
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ flex-shrink: 0;
465
+ }
466
+
467
+ .core-block-reviews__avatar-img {
468
+ width: 100%;
469
+ height: 100%;
470
+ object-fit: cover;
471
+ }
472
+
473
+ .core-block-reviews__avatar-initials {
474
+ font-weight: 700;
475
+ font-size: 0.85rem;
476
+ color: var(--brand-accent, var(--brand-text, #1a1a1a));
477
+ }
478
+
479
+ .core-block-reviews__card-meta {
480
+ display: flex;
481
+ flex-direction: column;
482
+ flex: 1;
483
+ min-width: 0;
484
+ }
485
+
486
+ .core-block-reviews__author {
487
+ margin: 0;
488
+ font-weight: 600;
489
+ font-size: 0.95rem;
490
+ color: var(--brand-text, #1a1a1a);
491
+ font-family: var(--font-body, system-ui, sans-serif);
492
+ }
493
+
494
+ .core-block-reviews__date {
495
+ margin: 0;
496
+ font-size: 0.8rem;
497
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
498
+ }
499
+
500
+ .core-block-reviews__card-title {
501
+ margin: 0;
502
+ font-family: var(--font-heading, var(--font-body, sans-serif));
503
+ font-size: 1rem;
504
+ font-weight: 600;
505
+ color: var(--brand-text, #1a1a1a);
506
+ line-height: 1.3;
507
+ }
508
+
509
+ .core-block-reviews__card-body {
510
+ margin: 0;
511
+ color: var(--brand-text, #1a1a1a);
512
+ font-size: 0.92rem;
513
+ line-height: 1.55;
514
+ font-family: var(--font-body, system-ui, sans-serif);
515
+ }
516
+
517
+ .core-block-reviews__media {
518
+ display: flex;
519
+ gap: 0.5rem;
520
+ flex-wrap: wrap;
521
+ }
522
+
523
+ .core-block-reviews__media-img,
524
+ .core-block-reviews__media-video {
525
+ width: 64px;
526
+ height: 64px;
527
+ object-fit: cover;
528
+ border-radius: 6px;
529
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
530
+ }
531
+
532
+ .core-block-reviews__reply {
533
+ margin-left: 1.5rem;
534
+ padding: 0.75rem 1rem;
535
+ background: var(--brand-muted, rgba(0, 0, 0, 0.04));
536
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
537
+ border-radius: var(--core-block-radius, 8px);
538
+ display: flex;
539
+ flex-direction: column;
540
+ gap: 0.3rem;
541
+ }
542
+
543
+ .core-block-reviews__reply-label {
544
+ margin: 0;
545
+ font-weight: 600;
546
+ font-size: 0.8rem;
547
+ color: var(--brand-text, #1a1a1a);
548
+ font-family: var(--font-body, system-ui, sans-serif);
549
+ }
550
+
551
+ .core-block-reviews__reply-body {
552
+ margin: 0;
553
+ font-size: 0.88rem;
554
+ line-height: 1.55;
555
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.7));
556
+ font-family: var(--font-body, system-ui, sans-serif);
557
+ }
558
+
559
+ .core-block-reviews__card-foot {
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 0.75rem;
563
+ flex-wrap: wrap;
564
+ margin-top: auto;
565
+ padding-top: 0.25rem;
566
+ }
567
+
568
+ .core-block-reviews__pill {
569
+ display: inline-flex;
570
+ align-items: center;
571
+ gap: 0.3rem;
572
+ font-size: 0.75rem;
573
+ font-weight: 500;
574
+ padding: 0.25rem 0.55rem;
575
+ border-radius: 999px;
576
+ background: var(--brand-muted, rgba(34, 139, 34, 0.08));
577
+ color: var(--brand-success, #1e7e34);
578
+ letter-spacing: 0.01em;
579
+ }
580
+
581
+ .core-block-reviews__product {
582
+ display: inline-flex;
583
+ align-items: center;
584
+ gap: 0.4rem;
585
+ font-size: 0.78rem;
586
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
587
+ margin-left: auto;
588
+ min-width: 0;
589
+ }
590
+
591
+ .core-block-reviews__product-thumb {
592
+ width: 24px;
593
+ height: 24px;
594
+ border-radius: 4px;
595
+ object-fit: cover;
596
+ }
597
+
598
+ .core-block-reviews__product-title {
599
+ overflow: hidden;
600
+ text-overflow: ellipsis;
601
+ white-space: nowrap;
602
+ max-width: 140px;
603
+ }
604
+
605
+ /* Compact layout */
606
+ .core-block-reviews__compact {
607
+ display: grid;
608
+ grid-template-columns: minmax(180px, 240px) 1fr;
609
+ gap: 2rem;
610
+ align-items: start;
611
+ }
612
+
613
+ @media (max-width: 640px) {
614
+ .core-block-reviews__compact {
615
+ grid-template-columns: 1fr;
616
+ gap: 1.25rem;
617
+ }
618
+ }
619
+
620
+ .core-block-reviews__compact-breakdown {
621
+ display: flex;
622
+ flex-direction: column;
623
+ gap: 0.4rem;
624
+ }
625
+
626
+ .core-block-reviews__compact-row {
627
+ display: grid;
628
+ grid-template-columns: 28px 1fr 32px;
629
+ align-items: center;
630
+ gap: 0.5rem;
631
+ font-size: 0.8rem;
632
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.65));
633
+ }
634
+
635
+ .core-block-reviews__compact-bar {
636
+ height: 6px;
637
+ background: var(--brand-muted, rgba(0, 0, 0, 0.08));
638
+ border-radius: 999px;
639
+ overflow: hidden;
640
+ }
641
+
642
+ .core-block-reviews__compact-fill {
643
+ display: block;
644
+ height: 100%;
645
+ background: var(--brand-accent, #f5a524);
646
+ }
647
+
648
+ .core-block-reviews__compact-count {
649
+ text-align: right;
650
+ font-variant-numeric: tabular-nums;
651
+ }
652
+
653
+ .core-block-reviews__compact-list {
654
+ list-style: none;
655
+ margin: 0;
656
+ padding: 0;
657
+ display: flex;
658
+ flex-direction: column;
659
+ gap: 1.25rem;
660
+ }
661
+
662
+ .core-block-reviews__compact-item {
663
+ padding-bottom: 1.25rem;
664
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
665
+ }
666
+
667
+ .core-block-reviews__compact-item:last-child {
668
+ border-bottom: 0;
669
+ padding-bottom: 0;
670
+ }
671
+
672
+ .core-block-reviews__compact-head {
673
+ display: flex;
674
+ align-items: center;
675
+ gap: 0.55rem;
676
+ flex-wrap: wrap;
677
+ margin-bottom: 0.35rem;
678
+ }
679
+
680
+ .core-block-reviews__compact-author {
681
+ font-weight: 600;
682
+ font-size: 0.9rem;
683
+ color: var(--brand-text, #1a1a1a);
684
+ }
685
+
686
+ .core-block-reviews__compact-title {
687
+ margin: 0 0 0.25rem;
688
+ font-weight: 600;
689
+ color: var(--brand-text, #1a1a1a);
690
+ font-size: 0.95rem;
691
+ }
692
+
693
+ .core-block-reviews__compact-body {
694
+ margin: 0;
695
+ color: var(--brand-text, #1a1a1a);
696
+ font-size: 0.9rem;
697
+ line-height: 1.55;
698
+ }
699
+
700
+ /* ── Spotlight layout — one quote at a time, editorial and large ─── */
701
+ .core-block-reviews__spotlight {
702
+ display: flex;
703
+ flex-direction: column;
704
+ align-items: center;
705
+ gap: 1.5rem;
706
+ }
707
+
708
+ .core-block-reviews__spotlight-row {
709
+ display: flex;
710
+ align-items: center;
711
+ gap: 1.5rem;
712
+ width: 100%;
713
+ max-width: 720px;
714
+ margin: 0 auto;
715
+ }
716
+
717
+ .core-block-reviews__spotlight-stage {
718
+ flex: 1;
719
+ min-width: 0;
720
+ }
721
+
722
+ .core-block-reviews__spotlight-slide {
723
+ margin: 0;
724
+ display: flex;
725
+ flex-direction: column;
726
+ align-items: center;
727
+ text-align: center;
728
+ gap: 1rem;
729
+ animation: core-reviews-spotlight-in 0.5s cubic-bezier(0.16, 1, 0.3, 1) both;
730
+ }
731
+
732
+ @media (prefers-reduced-motion: reduce) {
733
+ .core-block-reviews__spotlight-slide {
734
+ animation: none;
735
+ }
736
+ }
737
+
738
+ @keyframes core-reviews-spotlight-in {
739
+ from {
740
+ opacity: 0;
741
+ transform: translateY(10px);
742
+ }
743
+ to {
744
+ opacity: 1;
745
+ transform: translateY(0);
746
+ }
747
+ }
748
+
749
+ .core-block-reviews__spotlight-glyph {
750
+ font-family: Georgia, 'Times New Roman', serif;
751
+ font-size: 3rem;
752
+ line-height: 1;
753
+ color: var(--brand-accent, #999);
754
+ opacity: 0.35;
755
+ }
756
+
757
+ .core-block-reviews__spotlight-title {
758
+ margin: 0;
759
+ font-family: var(--font-heading, var(--font-body, sans-serif));
760
+ font-size: clamp(1.3rem, 2.4vw, 1.75rem);
761
+ font-weight: 600;
762
+ line-height: 1.3;
763
+ color: var(--brand-text, #1a1a1a);
764
+ }
765
+
766
+ .core-block-reviews__spotlight-body {
767
+ margin: 0;
768
+ font-family: var(--font-heading, var(--font-body, sans-serif));
769
+ font-size: clamp(1.05rem, 1.8vw, 1.25rem);
770
+ line-height: 1.55;
771
+ color: var(--brand-text, #1a1a1a);
772
+ max-width: 46ch;
773
+ }
774
+
775
+ .core-block-reviews__spotlight-footer {
776
+ display: flex;
777
+ flex-direction: column;
778
+ align-items: center;
779
+ gap: 0.5rem;
780
+ margin-top: 0.5rem;
781
+ }
782
+
783
+ .core-block-reviews__spotlight-meta {
784
+ display: flex;
785
+ flex-direction: column;
786
+ align-items: center;
787
+ gap: 0.35rem;
788
+ }
789
+
790
+ .core-block-reviews__spotlight-arrow {
791
+ flex-shrink: 0;
792
+ display: inline-flex;
793
+ align-items: center;
794
+ justify-content: center;
795
+ width: 2.75rem;
796
+ height: 2.75rem;
797
+ border-radius: 999px;
798
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
799
+ background: var(--brand-bg, #fff);
800
+ color: var(--brand-text, #111);
801
+ cursor: pointer;
802
+ transition: background 0.2s ease, transform 0.2s ease;
803
+ }
804
+
805
+ .core-block-reviews__spotlight-arrow svg {
806
+ width: 18px;
807
+ height: 18px;
808
+ }
809
+
810
+ .core-block-reviews__spotlight-arrow:hover {
811
+ background: var(--brand-muted, #f5f5f5);
812
+ transform: scale(1.06);
813
+ }
814
+
815
+ .core-block-reviews__spotlight-arrow:focus-visible {
816
+ outline: 2px solid var(--brand-accent, #111);
817
+ outline-offset: 2px;
818
+ }
819
+
820
+ @media (max-width: 640px) {
821
+ .core-block-reviews__spotlight-arrow {
822
+ display: none;
823
+ }
824
+ }
825
+
826
+ .core-block-reviews__spotlight-dots {
827
+ display: flex;
828
+ align-items: center;
829
+ gap: 0.5rem;
830
+ }
831
+
832
+ .core-block-reviews__spotlight-dot {
833
+ width: 6px;
834
+ height: 6px;
835
+ border-radius: 999px;
836
+ border: none;
837
+ padding: 0;
838
+ background: var(--brand-border, rgba(0, 0, 0, 0.18));
839
+ cursor: pointer;
840
+ transition: background 0.25s ease, transform 0.25s ease, width 0.25s ease;
841
+ }
842
+
843
+ .core-block-reviews__spotlight-dot.is-active {
844
+ width: 20px;
845
+ background: var(--brand-accent, #111);
846
+ }
847
+
848
+ .core-block-reviews__spotlight-dot:focus-visible {
849
+ outline: 2px solid var(--brand-accent, #111);
850
+ outline-offset: 2px;
851
+ }
852
+
853
+ /* ── Minimal layout — no card chrome, a tight divided list ───────── */
854
+ .core-block-reviews__minimal {
855
+ list-style: none;
856
+ margin: 0;
857
+ padding: 0;
858
+ display: flex;
859
+ flex-direction: column;
860
+ max-width: 760px;
861
+ }
862
+
863
+ .core-block-reviews__minimal-item {
864
+ padding: 1.5rem 0;
865
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
866
+ display: flex;
867
+ flex-direction: column;
868
+ gap: 0.4rem;
869
+ }
870
+
871
+ .core-block-reviews__minimal-item:first-child {
872
+ padding-top: 0;
873
+ }
874
+
875
+ .core-block-reviews__minimal-item:last-child {
876
+ border-bottom: none;
877
+ }
878
+
879
+ .core-block-reviews__minimal-head {
880
+ display: flex;
881
+ align-items: center;
882
+ gap: 0.75rem;
883
+ flex-wrap: wrap;
884
+ }
885
+
886
+ .core-block-reviews__minimal-head .core-block-reviews__author {
887
+ font-size: 0.9rem;
888
+ }
889
+
890
+ .core-block-reviews__minimal-title {
891
+ margin: 0;
892
+ font-weight: 600;
893
+ font-size: 0.95rem;
894
+ color: var(--brand-text, #1a1a1a);
895
+ }
896
+
897
+ .core-block-reviews__minimal-body {
898
+ margin: 0;
899
+ font-size: 0.92rem;
900
+ line-height: 1.6;
901
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.68));
902
+ max-width: 65ch;
903
+ }
904
+
905
+ /* ── Product Q&A ─────────────────────────────────────────────── */
906
+ .core-block-product-qa {
907
+ display: flex;
908
+ flex-direction: column;
909
+ gap: 1.5rem;
910
+ }
911
+
912
+ .core-block-product-qa__header {
913
+ display: flex;
914
+ flex-wrap: wrap;
915
+ align-items: center;
916
+ justify-content: space-between;
917
+ gap: 0.75rem 1.5rem;
918
+ }
919
+
920
+ .core-block-product-qa__title {
921
+ margin: 0;
922
+ font-family: var(--font-heading, var(--font-body, sans-serif));
923
+ font-size: clamp(1.4rem, 2.5vw, 2rem);
924
+ color: var(--brand-text, #1a1a1a);
925
+ letter-spacing: -0.01em;
926
+ line-height: 1.15;
927
+ }
928
+
929
+ .core-block-product-qa__empty {
930
+ margin: 0;
931
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
932
+ font-size: 0.95rem;
933
+ }
934
+
935
+ .core-block-product-qa__list {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 1.25rem;
939
+ }
940
+
941
+ .core-block-product-qa__card {
942
+ background: var(--brand-surface, #fff);
943
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
944
+ border-radius: var(--core-block-radius, 8px);
945
+ padding: 1.25rem;
946
+ display: flex;
947
+ flex-direction: column;
948
+ gap: 0.75rem;
949
+ }
950
+
951
+ .core-block-product-qa__card-head {
952
+ display: flex;
953
+ align-items: center;
954
+ gap: 0.75rem;
955
+ }
956
+
957
+ .core-block-product-qa__avatar {
958
+ width: 38px;
959
+ height: 38px;
960
+ border-radius: 50%;
961
+ overflow: hidden;
962
+ background: var(--brand-muted, rgba(0, 0, 0, 0.06));
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: center;
966
+ flex-shrink: 0;
967
+ }
968
+
969
+ .core-block-product-qa__avatar-img {
970
+ width: 100%;
971
+ height: 100%;
972
+ object-fit: cover;
973
+ }
974
+
975
+ .core-block-product-qa__avatar-initials {
976
+ font-weight: 600;
977
+ font-size: 0.85rem;
978
+ color: var(--brand-text, #1a1a1a);
979
+ }
980
+
981
+ .core-block-product-qa__card-meta {
982
+ display: flex;
983
+ flex-direction: column;
984
+ flex: 1;
985
+ min-width: 0;
986
+ }
987
+
988
+ .core-block-product-qa__author {
989
+ margin: 0;
990
+ font-weight: 600;
991
+ font-size: 0.95rem;
992
+ color: var(--brand-text, #1a1a1a);
993
+ font-family: var(--font-body, system-ui, sans-serif);
994
+ }
995
+
996
+ .core-block-product-qa__date {
997
+ margin: 0;
998
+ font-size: 0.8rem;
999
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
1000
+ }
1001
+
1002
+ .core-block-product-qa__question {
1003
+ margin: 0;
1004
+ color: var(--brand-text, #1a1a1a);
1005
+ font-size: 0.95rem;
1006
+ font-weight: 500;
1007
+ line-height: 1.5;
1008
+ font-family: var(--font-body, system-ui, sans-serif);
1009
+ }
1010
+
1011
+ .core-block-product-qa__answer {
1012
+ margin-left: 1.5rem;
1013
+ padding: 0.75rem 1rem;
1014
+ background: var(--brand-muted, rgba(0, 0, 0, 0.04));
1015
+ border-left: 2px solid var(--brand-accent, #f5a524);
1016
+ border-radius: 0 var(--core-block-radius, 8px) var(--core-block-radius, 8px) 0;
1017
+ display: flex;
1018
+ flex-direction: column;
1019
+ gap: 0.3rem;
1020
+ }
1021
+
1022
+ .core-block-product-qa__answer-label {
1023
+ margin: 0;
1024
+ font-weight: 600;
1025
+ font-size: 0.8rem;
1026
+ color: var(--brand-text, #1a1a1a);
1027
+ font-family: var(--font-body, system-ui, sans-serif);
1028
+ }
1029
+
1030
+ .core-block-product-qa__answer-body {
1031
+ margin: 0;
1032
+ font-size: 0.88rem;
1033
+ line-height: 1.55;
1034
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.7));
1035
+ font-family: var(--font-body, system-ui, sans-serif);
1036
+ }
1037
+
1038
+ .core-block-product-qa__ask {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ gap: 0.6rem;
1042
+ width: 100%;
1043
+ }
1044
+
1045
+ .core-block-product-qa__ask:not(.core-block-product-qa__ask--open) {
1046
+ width: auto;
1047
+ }
1048
+
1049
+ .core-block-product-qa__ask-btn {
1050
+ display: inline-flex;
1051
+ align-items: center;
1052
+ justify-content: center;
1053
+ gap: 0.5rem;
1054
+ padding: 0.6rem 1.25rem;
1055
+ background: var(--brand-button, var(--brand-accent, #000));
1056
+ color: var(--brand-button-text, #fff);
1057
+ font-family: var(--font-body, system-ui, sans-serif);
1058
+ font-size: 0.85rem;
1059
+ font-weight: 500;
1060
+ border: 0;
1061
+ border-radius: var(--core-block-button-radius, 2px);
1062
+ cursor: pointer;
1063
+ transition: opacity 0.2s ease;
1064
+ align-self: flex-start;
1065
+ }
1066
+
1067
+ .core-block-product-qa__ask-btn:hover {
1068
+ opacity: 0.9;
1069
+ }
1070
+
1071
+ .core-block-product-qa__ask--open {
1072
+ max-width: 420px;
1073
+ }
1074
+
1075
+ .core-block-product-qa__textarea {
1076
+ width: 100%;
1077
+ box-sizing: border-box;
1078
+ padding: 0.65rem 0.85rem;
1079
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.15));
1080
+ border-radius: var(--core-block-radius, 8px);
1081
+ background: var(--brand-surface, #fff);
1082
+ color: var(--brand-text, #1a1a1a);
1083
+ font-family: var(--font-body, system-ui, sans-serif);
1084
+ font-size: 0.9rem;
1085
+ line-height: 1.5;
1086
+ resize: vertical;
1087
+ min-height: 72px;
1088
+ }
1089
+
1090
+ .core-block-product-qa__textarea:focus {
1091
+ outline: none;
1092
+ border-color: var(--brand-accent, #1a1a1a);
1093
+ }
1094
+
1095
+ .core-block-product-qa__textarea:disabled {
1096
+ background: var(--brand-muted, rgba(0, 0, 0, 0.04));
1097
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
1098
+ }
1099
+
1100
+ .core-block-product-qa__error {
1101
+ margin: 0;
1102
+ font-size: 0.82rem;
1103
+ color: var(--brand-danger, #b91c1c);
1104
+ }
1105
+
1106
+ .core-block-product-qa__ask-actions {
1107
+ display: flex;
1108
+ justify-content: flex-end;
1109
+ gap: 0.6rem;
1110
+ }
1111
+
1112
+ .core-block-product-qa__cancel-btn,
1113
+ .core-block-product-qa__submit-btn {
1114
+ display: inline-flex;
1115
+ align-items: center;
1116
+ justify-content: center;
1117
+ padding: 0.55rem 1.1rem;
1118
+ font-family: var(--font-body, system-ui, sans-serif);
1119
+ font-size: 0.85rem;
1120
+ font-weight: 500;
1121
+ border-radius: var(--core-block-button-radius, 2px);
1122
+ cursor: pointer;
1123
+ transition: opacity 0.2s ease, background 0.2s ease;
1124
+ }
1125
+
1126
+ .core-block-product-qa__cancel-btn {
1127
+ background: transparent;
1128
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.15));
1129
+ color: var(--brand-text, #1a1a1a);
1130
+ }
1131
+
1132
+ .core-block-product-qa__cancel-btn:hover:not(:disabled) {
1133
+ background: var(--brand-muted, rgba(0, 0, 0, 0.04));
1134
+ }
1135
+
1136
+ .core-block-product-qa__submit-btn {
1137
+ background: var(--brand-button, var(--brand-accent, #000));
1138
+ color: var(--brand-button-text, #fff);
1139
+ border: 0;
1140
+ }
1141
+
1142
+ .core-block-product-qa__submit-btn:hover:not(:disabled) {
1143
+ opacity: 0.9;
1144
+ }
1145
+
1146
+ .core-block-product-qa__cancel-btn:disabled,
1147
+ .core-block-product-qa__submit-btn:disabled {
1148
+ opacity: 0.5;
1149
+ cursor: not-allowed;
1150
+ }
1151
+
1152
+ .core-block-product-qa__thanks {
1153
+ margin: 0;
1154
+ padding: 0.6rem 0.9rem;
1155
+ background: var(--brand-muted, rgba(34, 139, 34, 0.08));
1156
+ color: var(--brand-success, #1e7e34);
1157
+ border-radius: var(--core-block-radius, 8px);
1158
+ font-size: 0.85rem;
1159
+ }
1160
+
1161
+ /* ── FAQ ─────────────────────────────────────────────────────── */
1162
+ .core-block-faq {
1163
+ max-width: min(100%, 760px);
1164
+ }
1165
+
1166
+ .core-block-faq__heading {
1167
+ margin: 0 0 1.5rem;
1168
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1169
+ font-size: clamp(1.4rem, 2.5vw, 2rem);
1170
+ color: var(--brand-text, #1a1a1a);
1171
+ letter-spacing: -0.01em;
1172
+ line-height: 1.15;
1173
+ }
1174
+
1175
+ .core-block-faq__list {
1176
+ display: flex;
1177
+ flex-direction: column;
1178
+ }
1179
+
1180
+ .core-block-faq__item {
1181
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1182
+ padding: 1rem 0;
1183
+ }
1184
+
1185
+ .core-block-faq__item:first-child {
1186
+ border-top: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1187
+ }
1188
+
1189
+ .core-block-faq__question {
1190
+ display: flex;
1191
+ align-items: center;
1192
+ justify-content: space-between;
1193
+ gap: 1rem;
1194
+ cursor: pointer;
1195
+ list-style: none;
1196
+ font-family: var(--font-body, system-ui, -apple-system, sans-serif);
1197
+ font-weight: 500;
1198
+ font-size: 1rem;
1199
+ color: var(--brand-text, #1a1a1a);
1200
+ padding: 0.25rem 0;
1201
+ }
1202
+
1203
+ .core-block-faq__question::-webkit-details-marker {
1204
+ display: none;
1205
+ }
1206
+
1207
+ .core-block-faq__chevron {
1208
+ flex-shrink: 0;
1209
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.5));
1210
+ transition: transform 0.2s ease;
1211
+ }
1212
+
1213
+ .core-block-faq__item[open] .core-block-faq__chevron {
1214
+ transform: rotate(180deg);
1215
+ }
1216
+
1217
+ .core-block-faq__answer {
1218
+ margin-top: 0.75rem;
1219
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.7));
1220
+ font-family: var(--font-body, system-ui, -apple-system, sans-serif);
1221
+ font-size: 0.92rem;
1222
+ line-height: 1.6;
1223
+ }
1224
+
1225
+ /* ── Policies listing (core fallback for /policies) ──────────────
1226
+ * Themeable via `.theme-<slug> .core-policies__*` overrides. Pure CSS
1227
+ * variables — tint follows the active theme automatically.
1228
+ * ──────────────────────────────────────────────────────────── */
1229
+ .core-policies {
1230
+ margin: 0 auto;
1231
+ padding: clamp(2.5rem, 6vw, 5rem) 1.25rem clamp(3rem, 7vw, 6rem);
1232
+ width: 100%;
1233
+ max-width: var(--core-policies-max-width, 760px);
1234
+ box-sizing: border-box;
1235
+ font-family: var(--font-body, system-ui, -apple-system, sans-serif);
1236
+ }
1237
+
1238
+ .core-policies__head {
1239
+ margin-bottom: clamp(1.75rem, 4vw, 2.75rem);
1240
+ padding-bottom: clamp(1.25rem, 3vw, 2rem);
1241
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1242
+ }
1243
+
1244
+ .core-policies__eyebrow {
1245
+ margin: 0 0 0.75rem;
1246
+ font-size: 0.72rem;
1247
+ font-weight: 600;
1248
+ letter-spacing: 0.18em;
1249
+ text-transform: uppercase;
1250
+ color: var(--brand-accent, var(--brand-text-muted, rgba(0, 0, 0, 0.55)));
1251
+ }
1252
+
1253
+ .core-policies__title {
1254
+ margin: 0;
1255
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1256
+ font-size: clamp(1.9rem, 5vw, 2.9rem);
1257
+ line-height: 1.05;
1258
+ font-weight: 600;
1259
+ color: var(--brand-text, #1a1a1a);
1260
+ }
1261
+
1262
+ .core-policies__lede {
1263
+ margin: 0.85rem 0 0;
1264
+ max-width: 46ch;
1265
+ font-size: 1rem;
1266
+ line-height: 1.6;
1267
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
1268
+ }
1269
+
1270
+ .core-policies__empty {
1271
+ padding: clamp(2.5rem, 6vw, 4rem) 0;
1272
+ text-align: center;
1273
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.5));
1274
+ font-size: 0.95rem;
1275
+ }
1276
+
1277
+ .core-policies__list {
1278
+ list-style: none;
1279
+ margin: 0;
1280
+ padding: 0;
1281
+ }
1282
+
1283
+ .core-policies__item {
1284
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
1285
+ }
1286
+
1287
+ .core-policies__link {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: 1.25rem;
1291
+ padding: clamp(1.1rem, 3vw, 1.6rem) 0.25rem;
1292
+ text-decoration: none;
1293
+ color: inherit;
1294
+ transition: color 0.2s ease, padding-left 0.25s ease;
1295
+ }
1296
+
1297
+ .core-policies__link:hover,
1298
+ .core-policies__link:focus-visible {
1299
+ color: var(--brand-accent, var(--brand-text, #1a1a1a));
1300
+ padding-left: 0.75rem;
1301
+ outline: none;
1302
+ }
1303
+
1304
+ .core-policies__text {
1305
+ display: flex;
1306
+ flex-direction: column;
1307
+ gap: 0.3rem;
1308
+ min-width: 0;
1309
+ }
1310
+
1311
+ .core-policies__name {
1312
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1313
+ font-size: clamp(1.05rem, 2.4vw, 1.3rem);
1314
+ font-weight: 600;
1315
+ color: var(--brand-text, #1a1a1a);
1316
+ transition: color 0.2s ease;
1317
+ }
1318
+
1319
+ .core-policies__link:hover .core-policies__name,
1320
+ .core-policies__link:focus-visible .core-policies__name {
1321
+ color: var(--brand-accent, var(--brand-text, #1a1a1a));
1322
+ }
1323
+
1324
+ .core-policies__excerpt {
1325
+ font-size: 0.92rem;
1326
+ line-height: 1.5;
1327
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
1328
+ display: -webkit-box;
1329
+ -webkit-line-clamp: 2;
1330
+ -webkit-box-orient: vertical;
1331
+ overflow: hidden;
1332
+ }
1333
+
1334
+ .core-policies__chevron {
1335
+ flex: 0 0 auto;
1336
+ margin-left: auto;
1337
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.4));
1338
+ transition: transform 0.25s ease, color 0.2s ease;
1339
+ }
1340
+
1341
+ .core-policies__chevron svg {
1342
+ display: block;
1343
+ width: 22px;
1344
+ height: 22px;
1345
+ }
1346
+
1347
+ .core-policies__link:hover .core-policies__chevron,
1348
+ .core-policies__link:focus-visible .core-policies__chevron {
1349
+ transform: translateX(4px);
1350
+ color: var(--brand-accent, var(--brand-text, #1a1a1a));
1351
+ }
1352
+
1353
+ /* ── Content: rich markdown extras (code, tables, quotes, images) ── */
1354
+ .core-block-content__body a {
1355
+ color: var(--brand-accent, var(--brand-text, #1a1a1a));
1356
+ text-decoration: underline;
1357
+ text-underline-offset: 2px;
1358
+ }
1359
+
1360
+ .core-block-content__body img,
1361
+ .core-markdown__img {
1362
+ display: block;
1363
+ max-width: 100%;
1364
+ height: auto;
1365
+ border-radius: var(--image-radius, 8px);
1366
+ margin: 1.25rem 0;
1367
+ }
1368
+
1369
+ .core-block-content__body blockquote {
1370
+ margin: 1.25rem 0;
1371
+ padding: 0.5rem 0 0.5rem 1.1rem;
1372
+ border-left: 3px solid var(--brand-accent, var(--brand-border, rgba(0, 0, 0, 0.15)));
1373
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.7));
1374
+ font-style: italic;
1375
+ }
1376
+
1377
+ .core-block-content__body blockquote p:last-child {
1378
+ margin-bottom: 0;
1379
+ }
1380
+
1381
+ .core-block-content__body code {
1382
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1383
+ font-size: 0.88em;
1384
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.05));
1385
+ padding: 0.15em 0.4em;
1386
+ border-radius: 4px;
1387
+ }
1388
+
1389
+ .core-block-content__body pre {
1390
+ margin: 1.25rem 0;
1391
+ padding: 1rem 1.15rem;
1392
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.05));
1393
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.08));
1394
+ border-radius: 8px;
1395
+ overflow-x: auto;
1396
+ }
1397
+
1398
+ .core-block-content__body pre code {
1399
+ background: none;
1400
+ padding: 0;
1401
+ font-size: 0.85rem;
1402
+ line-height: 1.6;
1403
+ }
1404
+
1405
+ .core-block-content__body ul ul,
1406
+ .core-block-content__body ul ol,
1407
+ .core-block-content__body ol ul,
1408
+ .core-block-content__body ol ol {
1409
+ margin: 0.35rem 0 0.35rem;
1410
+ }
1411
+
1412
+ .core-block-content__body table {
1413
+ width: 100%;
1414
+ border-collapse: collapse;
1415
+ margin: 1.25rem 0;
1416
+ font-size: 0.95rem;
1417
+ }
1418
+
1419
+ .core-block-content__body th,
1420
+ .core-block-content__body td {
1421
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.12));
1422
+ padding: 0.55rem 0.75rem;
1423
+ text-align: left;
1424
+ }
1425
+
1426
+ .core-block-content__body th {
1427
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.04));
1428
+ font-weight: 600;
1429
+ }
1430
+
1431
+ .core-block-content__body hr {
1432
+ border: 0;
1433
+ border-top: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1434
+ margin: 2rem 0;
1435
+ }
1436
+
1437
+ /* ── Callout ─────────────────────────────────────────────────── */
1438
+ .core-block-callout {
1439
+ max-width: 720px;
1440
+ }
1441
+
1442
+ .core-block-callout__inner {
1443
+ display: flex;
1444
+ gap: 0.85rem;
1445
+ padding: 1rem 1.15rem;
1446
+ border-radius: 10px;
1447
+ border: 1px solid var(--callout-border, rgba(0, 0, 0, 0.12));
1448
+ background: var(--callout-bg, rgba(0, 0, 0, 0.03));
1449
+ color: var(--brand-text, #1a1a1a);
1450
+ }
1451
+
1452
+ .core-block-callout__icon {
1453
+ flex: 0 0 auto;
1454
+ font-size: 1.1rem;
1455
+ line-height: 1.5;
1456
+ color: var(--callout-accent, var(--brand-accent, #1a1a1a));
1457
+ }
1458
+
1459
+ .core-block-callout__content {
1460
+ min-width: 0;
1461
+ }
1462
+
1463
+ .core-block-callout__title {
1464
+ margin: 0 0 0.35rem;
1465
+ font-weight: 600;
1466
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1467
+ }
1468
+
1469
+ .core-block-callout__body p:last-child {
1470
+ margin-bottom: 0;
1471
+ }
1472
+
1473
+ .core-block-callout[data-tone='info'] .core-block-callout__inner {
1474
+ --callout-bg: rgba(37, 99, 235, 0.08);
1475
+ --callout-border: rgba(37, 99, 235, 0.28);
1476
+ --callout-accent: #2563eb;
1477
+ }
1478
+
1479
+ .core-block-callout[data-tone='warn'] .core-block-callout__inner {
1480
+ --callout-bg: rgba(217, 119, 6, 0.1);
1481
+ --callout-border: rgba(217, 119, 6, 0.3);
1482
+ --callout-accent: #d97706;
1483
+ }
1484
+
1485
+ .core-block-callout[data-tone='success'] .core-block-callout__inner {
1486
+ --callout-bg: rgba(22, 163, 74, 0.1);
1487
+ --callout-border: rgba(22, 163, 74, 0.3);
1488
+ --callout-accent: #16a34a;
1489
+ }
1490
+
1491
+ .core-block-callout[data-tone='note'] .core-block-callout__inner {
1492
+ --callout-bg: rgba(0, 0, 0, 0.04);
1493
+ --callout-border: rgba(0, 0, 0, 0.14);
1494
+ --callout-accent: var(--brand-accent, #444);
1495
+ }
1496
+
1497
+ /* ── Quote ───────────────────────────────────────────────────── */
1498
+ .core-block-quote {
1499
+ max-width: 720px;
1500
+ }
1501
+
1502
+ .core-block-quote__inner {
1503
+ margin: 0;
1504
+ padding: 0.5rem 0 0.5rem 1.25rem;
1505
+ border-left: 4px solid var(--brand-accent, var(--brand-border, rgba(0, 0, 0, 0.2)));
1506
+ }
1507
+
1508
+ .core-block-quote__text {
1509
+ margin: 0;
1510
+ font-family: var(--font-heading, var(--font-body, serif));
1511
+ font-size: clamp(1.2rem, 2.5vw, 1.6rem);
1512
+ line-height: 1.4;
1513
+ color: var(--brand-text, #1a1a1a);
1514
+ }
1515
+
1516
+ .core-block-quote__cite {
1517
+ display: block;
1518
+ margin-top: 0.75rem;
1519
+ font-size: 0.9rem;
1520
+ font-style: normal;
1521
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
1522
+ }
1523
+
1524
+ /* ── Blog: post meta byline ──────────────────────────────────── */
1525
+ .core-post-meta {
1526
+ display: flex;
1527
+ flex-wrap: wrap;
1528
+ align-items: center;
1529
+ gap: 0.5rem 1rem;
1530
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
1531
+ font-size: 0.9rem;
1532
+ }
1533
+
1534
+ .core-post-meta__author {
1535
+ display: inline-flex;
1536
+ align-items: center;
1537
+ gap: 0.5rem;
1538
+ }
1539
+
1540
+ .core-post-meta__avatar {
1541
+ width: 32px;
1542
+ height: 32px;
1543
+ border-radius: 50%;
1544
+ object-fit: cover;
1545
+ }
1546
+
1547
+ .core-post-meta__author-name {
1548
+ color: var(--brand-text, #1a1a1a);
1549
+ font-weight: 600;
1550
+ }
1551
+
1552
+ .core-post-meta__date,
1553
+ .core-post-meta__reading {
1554
+ position: relative;
1555
+ }
1556
+
1557
+ .core-post-meta > *:not(:first-child)::before {
1558
+ content: '·';
1559
+ margin-right: 1rem;
1560
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.4));
1561
+ }
1562
+
1563
+ /* ── Blog: share buttons ─────────────────────────────────────── */
1564
+ .core-share {
1565
+ display: flex;
1566
+ flex-wrap: wrap;
1567
+ align-items: center;
1568
+ gap: 0.5rem 0.75rem;
1569
+ margin: 2rem 0;
1570
+ }
1571
+
1572
+ .core-share__label {
1573
+ font-size: 0.85rem;
1574
+ font-weight: 600;
1575
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
1576
+ text-transform: uppercase;
1577
+ letter-spacing: 0.05em;
1578
+ }
1579
+
1580
+ .core-share__actions {
1581
+ display: flex;
1582
+ flex-wrap: wrap;
1583
+ gap: 0.5rem;
1584
+ }
1585
+
1586
+ .core-share__btn {
1587
+ display: inline-flex;
1588
+ align-items: center;
1589
+ gap: 0.35rem;
1590
+ padding: 0.4rem 0.85rem;
1591
+ font-size: 0.85rem;
1592
+ font-family: inherit;
1593
+ color: var(--brand-text, #1a1a1a);
1594
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.04));
1595
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.12));
1596
+ border-radius: 999px;
1597
+ cursor: pointer;
1598
+ text-decoration: none;
1599
+ transition: background 0.18s ease, border-color 0.18s ease;
1600
+ }
1601
+
1602
+ .core-share__btn:hover {
1603
+ background: var(--brand-accent, rgba(0, 0, 0, 0.08));
1604
+ color: var(--brand-accent-contrast, #fff);
1605
+ border-color: transparent;
1606
+ }
1607
+
1608
+ /* ── Blog: related posts ─────────────────────────────────────── */
1609
+ .core-related {
1610
+ margin: 3rem 0 0;
1611
+ padding-top: 2rem;
1612
+ border-top: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1613
+ }
1614
+
1615
+ .core-related__heading {
1616
+ margin: 0 0 1.25rem;
1617
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1618
+ font-size: clamp(1.2rem, 2.5vw, 1.6rem);
1619
+ color: var(--brand-text, #1a1a1a);
1620
+ }
1621
+
1622
+ .core-related__grid {
1623
+ display: grid;
1624
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
1625
+ gap: 1.5rem;
1626
+ }
1627
+
1628
+ .core-related__card {
1629
+ display: flex;
1630
+ flex-direction: column;
1631
+ gap: 0.65rem;
1632
+ text-decoration: none;
1633
+ color: inherit;
1634
+ }
1635
+
1636
+ .core-related__media {
1637
+ aspect-ratio: 3 / 2;
1638
+ overflow: hidden;
1639
+ border-radius: var(--image-radius, 8px);
1640
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.04));
1641
+ }
1642
+
1643
+ .core-related__img {
1644
+ width: 100%;
1645
+ height: 100%;
1646
+ object-fit: cover;
1647
+ transition: transform 0.3s ease;
1648
+ }
1649
+
1650
+ .core-related__card:hover .core-related__img {
1651
+ transform: scale(1.04);
1652
+ }
1653
+
1654
+ .core-related__cat {
1655
+ font-size: 0.72rem;
1656
+ text-transform: uppercase;
1657
+ letter-spacing: 0.08em;
1658
+ color: var(--brand-accent, var(--brand-text-muted, rgba(0, 0, 0, 0.6)));
1659
+ }
1660
+
1661
+ .core-related__title {
1662
+ margin: 0;
1663
+ font-size: 1rem;
1664
+ line-height: 1.35;
1665
+ color: var(--brand-text, #1a1a1a);
1666
+ font-family: var(--font-heading, var(--font-body, sans-serif));
1667
+ }
1668
+
1669
+ /* ── Blog: category filter bar ───────────────────────────────── */
1670
+ .core-cat-filter {
1671
+ display: flex;
1672
+ flex-wrap: wrap;
1673
+ gap: 0.5rem;
1674
+ margin: 0 0 2rem;
1675
+ }
1676
+
1677
+ .core-cat-filter__item {
1678
+ padding: 0.4rem 0.95rem;
1679
+ font-size: 0.85rem;
1680
+ border-radius: 999px;
1681
+ text-decoration: none;
1682
+ color: var(--brand-text, #1a1a1a);
1683
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.04));
1684
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.12));
1685
+ transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
1686
+ }
1687
+
1688
+ .core-cat-filter__item:hover {
1689
+ border-color: var(--brand-accent, rgba(0, 0, 0, 0.3));
1690
+ }
1691
+
1692
+ .core-cat-filter__item.is-active {
1693
+ background: var(--brand-accent, #1a1a1a);
1694
+ color: var(--brand-accent-contrast, #fff);
1695
+ border-color: transparent;
1696
+ }
1697
+
1698
+ /* ── Blog: category tab bar ──────────────────────────────────── */
1699
+ .core-cat-tabs {
1700
+ display: flex;
1701
+ gap: 0.35rem;
1702
+ margin: 0 0 2rem;
1703
+ padding-bottom: 1px;
1704
+ border-bottom: 1px solid var(--brand-border, rgba(0, 0, 0, 0.12));
1705
+ overflow-x: auto;
1706
+ scrollbar-width: none;
1707
+ -webkit-overflow-scrolling: touch;
1708
+ }
1709
+
1710
+ .core-cat-tabs::-webkit-scrollbar {
1711
+ display: none;
1712
+ }
1713
+
1714
+ .core-cat-tabs__item {
1715
+ display: inline-flex;
1716
+ align-items: center;
1717
+ gap: 0.4rem;
1718
+ flex: 0 0 auto;
1719
+ padding: 0.65rem 0.95rem;
1720
+ font-size: 0.9rem;
1721
+ line-height: 1;
1722
+ white-space: nowrap;
1723
+ text-decoration: none;
1724
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.55));
1725
+ border-bottom: 2px solid transparent;
1726
+ margin-bottom: -1px;
1727
+ transition: color 0.18s ease, border-color 0.18s ease;
1728
+ }
1729
+
1730
+ .core-cat-tabs__item:hover {
1731
+ color: var(--brand-text, #1a1a1a);
1732
+ }
1733
+
1734
+ .core-cat-tabs__item.is-active {
1735
+ color: var(--brand-accent, #1a1a1a);
1736
+ border-bottom-color: var(--brand-accent, #1a1a1a);
1737
+ font-weight: 600;
1738
+ }
1739
+
1740
+ .core-cat-tabs__count {
1741
+ font-size: 0.72rem;
1742
+ font-weight: 500;
1743
+ padding: 0.1rem 0.4rem;
1744
+ border-radius: 999px;
1745
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.5));
1746
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.05));
1747
+ }
1748
+
1749
+ .core-cat-tabs__item.is-active .core-cat-tabs__count {
1750
+ color: var(--brand-accent, #1a1a1a);
1751
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.08));
1752
+ }
1753
+
1754
+ /* ── Blog: pagination ────────────────────────────────────────── */
1755
+ .core-pagination {
1756
+ display: flex;
1757
+ align-items: center;
1758
+ justify-content: space-between;
1759
+ gap: 1rem;
1760
+ margin: 2.5rem 0 0;
1761
+ padding-top: 1.5rem;
1762
+ border-top: 1px solid var(--brand-border, rgba(0, 0, 0, 0.1));
1763
+ }
1764
+
1765
+ .core-pagination__link {
1766
+ display: inline-flex;
1767
+ align-items: center;
1768
+ padding: 0.5rem 1rem;
1769
+ font-size: 0.9rem;
1770
+ border-radius: 999px;
1771
+ text-decoration: none;
1772
+ color: var(--brand-text, #1a1a1a);
1773
+ background: var(--brand-surface-alt, rgba(0, 0, 0, 0.04));
1774
+ border: 1px solid var(--brand-border, rgba(0, 0, 0, 0.12));
1775
+ transition: background 0.18s ease;
1776
+ }
1777
+
1778
+ .core-pagination__link:hover {
1779
+ background: var(--brand-accent, rgba(0, 0, 0, 0.08));
1780
+ color: var(--brand-accent-contrast, #fff);
1781
+ border-color: transparent;
1782
+ }
1783
+
1784
+ .core-pagination__link.is-disabled {
1785
+ opacity: 0.4;
1786
+ pointer-events: none;
1787
+ }
1788
+
1789
+ .core-pagination__status {
1790
+ font-size: 0.85rem;
1791
+ color: var(--brand-text-muted, rgba(0, 0, 0, 0.6));
1792
+ }