@tonycodes-ui/mortar 0.0.0-stage → 0.11.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 (104) hide show
  1. package/AGENTS.md +10 -0
  2. package/CHANGELOG.md +276 -0
  3. package/CONTRIBUTING.md +48 -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 +9703 -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/index.d.ts +34 -0
  47. package/dist/index.js +17 -0
  48. package/dist/inspection.d.ts +24 -0
  49. package/dist/inspection.js +14 -0
  50. package/dist/internal.d.ts +492 -0
  51. package/dist/internal.js +273 -0
  52. package/dist/layout.d.ts +107 -0
  53. package/dist/layout.js +66 -0
  54. package/dist/marketing-sections.d.ts +161 -0
  55. package/dist/marketing-sections.js +58 -0
  56. package/dist/marketing.d.ts +254 -0
  57. package/dist/marketing.js +150 -0
  58. package/dist/navigation.d.ts +35 -0
  59. package/dist/navigation.js +44 -0
  60. package/dist/primitives.d.ts +258 -0
  61. package/dist/primitives.js +244 -0
  62. package/dist/showcase.d.ts +29 -0
  63. package/dist/showcase.js +10 -0
  64. package/dist/workspace.d.ts +80 -0
  65. package/dist/workspace.js +48 -0
  66. package/docs/agents.md +127 -0
  67. package/docs/auth-flows.md +71 -0
  68. package/docs/migrating-to-0.6.md +94 -0
  69. package/docs/theming.md +170 -0
  70. package/package.json +94 -4
  71. package/skills/mortar/SKILL.md +36 -0
  72. package/src/application.css +1487 -0
  73. package/src/application.tsx +1413 -0
  74. package/src/auth.tsx +452 -0
  75. package/src/brand.ts +335 -0
  76. package/src/calendar.css +468 -0
  77. package/src/calendar.tsx +868 -0
  78. package/src/choice.tsx +240 -0
  79. package/src/composer.tsx +158 -0
  80. package/src/data.css +690 -0
  81. package/src/display.tsx +452 -0
  82. package/src/docs.css +704 -0
  83. package/src/docs.tsx +737 -0
  84. package/src/ecommerce.css +810 -0
  85. package/src/ecommerce.tsx +1033 -0
  86. package/src/feedback.tsx +388 -0
  87. package/src/foundation.css +1867 -0
  88. package/src/foundation.tsx +227 -0
  89. package/src/heading.ts +13 -0
  90. package/src/icons.tsx +237 -0
  91. package/src/index.ts +230 -0
  92. package/src/inspection.tsx +91 -0
  93. package/src/internal.tsx +614 -0
  94. package/src/layout.tsx +342 -0
  95. package/src/marketing-sections.tsx +621 -0
  96. package/src/marketing.css +2400 -0
  97. package/src/marketing.tsx +1156 -0
  98. package/src/navigation.tsx +118 -0
  99. package/src/overlays.css +350 -0
  100. package/src/primitives.tsx +1135 -0
  101. package/src/showcase.tsx +120 -0
  102. package/src/tokens.css +449 -0
  103. package/src/workspace.tsx +333 -0
  104. package/styles.css +56 -0
@@ -0,0 +1,2400 @@
1
+ /* Marketing: header, sections and page blocks.
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
+ /* == MarketingHeader == */
9
+ .m-marketing-header {
10
+ max-width: 1280px;
11
+ margin: auto;
12
+ padding: 18px 32px;
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 28px;
16
+ border-bottom: 1px solid var(--m-line);
17
+ }
18
+ .m-brand {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: 10px;
22
+ text-decoration: none;
23
+ font-size: 17px;
24
+ font-weight: var(--m-weight-bold);
25
+ letter-spacing: var(--m-tracking-heading);
26
+ }
27
+ .m-marketing-header nav {
28
+ display: flex;
29
+ gap: 22px;
30
+ flex: 1;
31
+ font-size: 13px;
32
+ }
33
+ .m-marketing-header nav a {
34
+ text-decoration: none;
35
+ color: var(--m-secondary);
36
+ }
37
+ .m-marketing-header > .m-actions {
38
+ margin-left: auto;
39
+ }
40
+ .m-flyout {
41
+ position: relative;
42
+ }
43
+ .m-flyout-trigger {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ gap: 4px;
47
+ padding: 0;
48
+ color: var(--m-secondary);
49
+ font: inherit;
50
+ --m-icon-size: 14px;
51
+ }
52
+ .m-flyout-trigger svg {
53
+ transition: transform 120ms;
54
+ }
55
+ .m-flyout-panel {
56
+ z-index: var(--m-z-popover);
57
+ width: min(420px, calc(100vw - 32px));
58
+ overflow: hidden;
59
+ box-shadow: var(--m-float);
60
+ --anchor-gap: 14px;
61
+ --anchor-padding: 16px;
62
+ }
63
+ .m-flyout-panel ul {
64
+ display: grid;
65
+ gap: 2px;
66
+ padding: 8px;
67
+ }
68
+ .m-flyout-panel li > a {
69
+ display: flex;
70
+ align-items: flex-start;
71
+ gap: 12px;
72
+ padding: 10px 12px;
73
+ border-radius: var(--m-radius);
74
+ color: var(--m-ink);
75
+ text-decoration: none;
76
+ }
77
+ .m-flyout-icon {
78
+ display: inline-grid;
79
+ place-items: center;
80
+ flex-shrink: 0;
81
+ width: 36px;
82
+ height: 36px;
83
+ border: 1px solid var(--m-line);
84
+ border-radius: var(--m-radius);
85
+ background: var(--m-sunken);
86
+ --m-icon-size: 18px;
87
+ }
88
+ .m-flyout-text {
89
+ display: flex;
90
+ flex-direction: column;
91
+ gap: 2px;
92
+ min-width: 0;
93
+ }
94
+ .m-flyout-text strong {
95
+ font-size: var(--m-font-size);
96
+ font-weight: var(--m-weight-semibold);
97
+ }
98
+ .m-flyout-text span {
99
+ color: var(--m-muted);
100
+ font-size: 13px;
101
+ }
102
+ .m-flyout-footer {
103
+ display: flex;
104
+ flex-wrap: wrap;
105
+ gap: 4px 20px;
106
+ padding: 12px 20px;
107
+ border-top: 1px solid var(--m-line);
108
+ background: var(--m-sunken);
109
+ font-size: 13px;
110
+ }
111
+ .m-flyout-footer a {
112
+ color: var(--m-ink);
113
+ font-weight: var(--m-weight-semibold);
114
+ text-decoration: none;
115
+ }
116
+ /* Full-screen menu panel for narrow screens. */
117
+ .m-marketing-panel {
118
+ position: fixed;
119
+ inset: 0;
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: 16px;
123
+ padding: 16px 20px 24px;
124
+ overflow-y: auto;
125
+ background: var(--m-paper);
126
+ color: var(--m-ink);
127
+ }
128
+ .m-marketing-panel .m-dialog-heading {
129
+ margin: 0;
130
+ }
131
+ .m-marketing-panel .m-dialog-heading .m-brand {
132
+ font-size: 17px;
133
+ font-weight: var(--m-weight-bold);
134
+ }
135
+ .m-marketing-panel-nav {
136
+ display: flex;
137
+ flex-direction: column;
138
+ padding-block: 8px;
139
+ border-block: 1px solid var(--m-line);
140
+ }
141
+ .m-marketing-panel-nav > a,
142
+ .m-marketing-panel-nav summary {
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: space-between;
146
+ min-height: max(44px, var(--m-touch-target));
147
+ padding: 8px 4px;
148
+ border-radius: var(--m-radius);
149
+ color: var(--m-ink);
150
+ font-size: 16px;
151
+ font-weight: var(--m-weight-semibold);
152
+ text-decoration: none;
153
+ cursor: pointer;
154
+ list-style: none;
155
+ }
156
+ .m-marketing-panel-nav summary::-webkit-details-marker {
157
+ display: none;
158
+ }
159
+ .m-marketing-panel-nav summary svg {
160
+ width: 18px;
161
+ height: 18px;
162
+ transition: transform 120ms;
163
+ }
164
+ .m-marketing-panel-nav details > a {
165
+ display: flex;
166
+ align-items: center;
167
+ min-height: max(40px, var(--m-touch-target));
168
+ padding: 6px 4px 6px 16px;
169
+ border-radius: var(--m-radius);
170
+ color: var(--m-secondary);
171
+ text-decoration: none;
172
+ }
173
+ .m-marketing-panel > .m-actions > .m-button {
174
+ flex: 1;
175
+ }
176
+ .m-flyout-trigger:hover,
177
+ .m-flyout-trigger[data-open] {
178
+ color: var(--m-ink);
179
+ }
180
+ .m-flyout-trigger[data-open] svg {
181
+ transform: rotate(180deg);
182
+ }
183
+ .m-flyout-panel li > a:hover {
184
+ background: var(--m-sunken);
185
+ }
186
+ /* Header: links at the start, the brand centred, actions at the end. */
187
+ .m-marketing-header[data-layout="center"] {
188
+ display: grid;
189
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
190
+ }
191
+ .m-marketing-header[data-layout="center"] > nav {
192
+ grid-column: 1;
193
+ grid-row: 1;
194
+ }
195
+ .m-marketing-header[data-layout="center"] > .m-brand {
196
+ grid-column: 2;
197
+ grid-row: 1;
198
+ }
199
+ .m-marketing-header[data-layout="center"] > .m-actions {
200
+ grid-column: 3;
201
+ grid-row: 1;
202
+ justify-self: end;
203
+ margin-left: 0;
204
+ }
205
+ .m-marketing-panel-nav details[open] > summary svg {
206
+ transform: rotate(180deg);
207
+ }
208
+ .m-marketing-panel-nav :is(a, summary):hover {
209
+ background: var(--m-sunken);
210
+ }
211
+ /* Flyout: two columns, or a panel as wide as the viewport allows. The
212
+ anchor keeps it inside the viewport padding. */
213
+ .m-flyout-panel[data-layout="columns"] {
214
+ width: min(640px, calc(100vw - 32px));
215
+ }
216
+ .m-flyout-panel[data-layout="columns"] ul {
217
+ grid-template-columns: repeat(2, minmax(0, 1fr));
218
+ }
219
+ .m-flyout-panel[data-layout="full"] {
220
+ width: min(1248px, calc(100vw - 32px));
221
+ }
222
+ .m-flyout-panel[data-layout="full"] ul {
223
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
224
+ gap: 8px;
225
+ padding: 16px;
226
+ }
227
+ @media (max-width: 900px) {
228
+ .m-marketing-header {
229
+ flex-wrap: wrap;
230
+ padding: 16px 20px;
231
+ gap: 16px;
232
+ }
233
+ .m-marketing-header .m-menu-trigger {
234
+ margin-left: auto;
235
+ }
236
+ .m-marketing-header > .m-actions {
237
+ margin-left: 0;
238
+ }
239
+ .m-marketing-header nav {
240
+ display: none;
241
+ order: 4;
242
+ flex-basis: 100%;
243
+ flex-direction: column;
244
+ }
245
+ .m-marketing-header nav[data-open="true"] {
246
+ display: flex;
247
+ }
248
+ .m-flyout-trigger {
249
+ width: 100%;
250
+ justify-content: space-between;
251
+ }
252
+ /* Menu, brand and actions keep one row; the brand takes the spare width. */
253
+ .m-marketing-header[data-layout="center"] {
254
+ grid-template-columns: auto minmax(0, 1fr) auto;
255
+ }
256
+ .m-marketing-header[data-layout="center"] > .m-brand {
257
+ justify-self: center;
258
+ }
259
+ .m-marketing-header[data-layout="center"] > .m-actions .m-button {
260
+ white-space: nowrap;
261
+ }
262
+ .m-marketing-header[data-layout="center"] > .m-menu-trigger {
263
+ grid-column: 1;
264
+ grid-row: 1;
265
+ justify-self: start;
266
+ margin-left: 0;
267
+ }
268
+ .m-marketing-header[data-layout="center"] > nav {
269
+ grid-column: 1 / -1;
270
+ grid-row: 2;
271
+ }
272
+ }
273
+ @media (max-width: 560px) {
274
+ .m-flyout-panel[data-layout="columns"] ul {
275
+ grid-template-columns: minmax(0, 1fr);
276
+ }
277
+ }
278
+
279
+ /* == Banner == */
280
+ .m-banner {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 12px;
284
+ min-height: 44px;
285
+ padding: 8px 16px;
286
+ background: var(--m-paper);
287
+ color: var(--m-ink);
288
+ border-bottom: 1px solid var(--m-line);
289
+ font-size: var(--m-font-size);
290
+ }
291
+ .m-banner > p {
292
+ flex: 1;
293
+ min-width: 0;
294
+ margin: 0;
295
+ text-align: center;
296
+ }
297
+ .m-banner a {
298
+ color: var(--m-link);
299
+ font-weight: var(--m-weight-semibold);
300
+ text-underline-offset: 3px;
301
+ }
302
+ /* Banner: an inset floating panel, and a bar fixed to the viewport bottom. */
303
+ .m-banner[data-variant="floating"] {
304
+ width: calc(100% - 32px);
305
+ max-width: 960px;
306
+ margin: 16px auto;
307
+ border: 1px solid var(--m-line);
308
+ border-radius: var(--m-radius-lg);
309
+ box-shadow: var(--m-float);
310
+ }
311
+ .m-banner[data-placement="bottom"] {
312
+ position: fixed;
313
+ inset-inline: 0;
314
+ bottom: 0;
315
+ z-index: var(--m-z-sticky);
316
+ margin: 0;
317
+ padding-bottom: max(8px, env(safe-area-inset-bottom));
318
+ border-top: 1px solid var(--m-line);
319
+ border-bottom: 0;
320
+ }
321
+ .m-banner[data-placement="bottom"][data-variant="floating"] {
322
+ inset-inline: 16px;
323
+ bottom: max(16px, env(safe-area-inset-bottom));
324
+ width: auto;
325
+ margin-inline: auto;
326
+ padding-bottom: 8px;
327
+ border: 1px solid var(--m-line);
328
+ }
329
+
330
+ /* == Section == */
331
+ .m-marketing-section,
332
+ .m-feature-section,
333
+ .m-faq {
334
+ min-width: 0;
335
+ max-width: min(100%, 1280px);
336
+ margin: auto;
337
+ padding: 80px 32px;
338
+ border-top: 1px solid var(--m-line);
339
+ }
340
+ /* Section titles only: slot content keeps its own heading styles. The
341
+ m-section-title class keeps the style at any headingLevel. */
342
+ :is(
343
+ .m-marketing-section,
344
+ .m-cta,
345
+ .m-cta-copy,
346
+ .m-content-copy,
347
+ :where(.m-faq, .m-feature-section, .m-section-heading-row)
348
+ > :where(div:first-child)
349
+ )
350
+ > :is(h2, :where(.m-section-title)) {
351
+ font-size: clamp(30px, 3.5vw, 48px);
352
+ font-weight: var(--m-weight-semibold);
353
+ letter-spacing: -0.035em;
354
+ line-height: var(--m-leading-display);
355
+ text-wrap: balance;
356
+ max-width: 800px;
357
+ }
358
+ .m-section-description {
359
+ color: var(--m-secondary);
360
+ font-size: 16px;
361
+ margin-top: 18px;
362
+ max-width: 640px;
363
+ }
364
+ .m-section-heading-row {
365
+ display: flex;
366
+ align-items: flex-end;
367
+ justify-content: space-between;
368
+ flex-wrap: wrap;
369
+ gap: 20px;
370
+ }
371
+ .m-section-body {
372
+ margin-top: 40px;
373
+ min-width: 0;
374
+ }
375
+ .m-section[data-align="center"] {
376
+ text-align: center;
377
+ }
378
+ .m-section[data-align="center"]
379
+ :is(.m-section-title, .m-section-description) {
380
+ margin-inline: auto;
381
+ }
382
+ /* Section tones: full-bleed band without wrapper markup or horizontal overflow. */
383
+ :is(.m-marketing-section, .m-feature-section):is(
384
+ [data-tone="muted"],
385
+ [data-tone="inverse"]
386
+ ) {
387
+ border-top-color: transparent;
388
+ background: var(--m-band);
389
+ box-shadow: 0 0 0 100vmax var(--m-band);
390
+ clip-path: inset(0 -100vmax);
391
+ }
392
+ :is(.m-marketing-section, .m-feature-section)[data-tone="muted"] {
393
+ --m-band: var(--m-sunken);
394
+ }
395
+ /* Accent tone (CallToAction, Hero and Banner): the brand's accent fill (its
396
+ accent gradient, or flat accent) under on-accent copy and actions. A
397
+ gradient is an image, so it paints over the flat accent. Media and
398
+ previews keep the page's tokens. */
399
+ :is(.m-cta, .m-hero, .m-banner)[data-tone="accent"] {
400
+ background-color: var(--m-accent);
401
+ background-image: var(--m-accent-fill);
402
+ color: var(--m-on-accent);
403
+ }
404
+ :is(.m-cta, .m-hero)[data-tone="accent"]
405
+ > :not(.m-hero-preview, .m-hero-tiles, .m-cta-media),
406
+ .m-banner[data-tone="accent"] {
407
+ --m-ink: var(--m-on-accent);
408
+ --m-secondary: var(--m-on-accent);
409
+ --m-muted: var(--m-on-accent);
410
+ --m-link: var(--m-on-accent);
411
+ --m-focus: var(--m-on-accent);
412
+ --m-line: color-mix(in oklab, var(--m-on-accent) 35%, transparent);
413
+ --m-line-strong: var(--m-on-accent);
414
+ /* Primary actions invert: on-accent with accent text, the same pair. */
415
+ --m-primary: var(--m-on-accent);
416
+ --m-primary-hover: var(--m-on-accent);
417
+ --m-primary-active: var(--m-on-accent);
418
+ --m-on-primary: var(--m-accent);
419
+ /* Secondary actions are outlined on the fill. */
420
+ --m-surface: transparent;
421
+ --m-sunken: color-mix(in oklab, var(--m-on-accent) 14%, transparent);
422
+ }
423
+ .m-hero[data-tone="accent"] > :is(.m-hero-preview, .m-hero-tiles),
424
+ .m-cta[data-tone="accent"] > .m-cta-media {
425
+ color: var(--m-ink);
426
+ }
427
+ /* Hover keeps the colour pair, so contrast holds; an inner ring marks it. */
428
+ :is(.m-cta, .m-hero, .m-banner)[data-tone="accent"] .m-button-primary:hover {
429
+ box-shadow: inset 0 0 0 2px var(--m-accent);
430
+ }
431
+
432
+ /* == FeatureSection == */
433
+ .m-feature-section {
434
+ display: grid;
435
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
436
+ gap: 56px;
437
+ align-items: center;
438
+ }
439
+ .m-feature-preview {
440
+ border: 1px solid var(--m-line);
441
+ border-radius: var(--m-radius-lg);
442
+ padding: 28px;
443
+ background: var(--m-sunken);
444
+ min-width: 0;
445
+ }
446
+ .m-feature-section[data-reverse="true"] > div:first-child {
447
+ order: 2;
448
+ }
449
+ .m-feature-section[data-tone="muted"] .m-feature-preview[data-framed="true"] {
450
+ background: var(--m-surface);
451
+ }
452
+ .m-feature-preview:not([data-framed]) {
453
+ border: 0;
454
+ padding: 0;
455
+ background: none;
456
+ }
457
+ .m-feature-section[data-offset="true"] .m-feature-preview :is(img, video) {
458
+ display: block;
459
+ width: 100%;
460
+ height: auto;
461
+ }
462
+ @media (max-width: 900px) {
463
+ .m-feature-section[data-reverse="true"] > div:first-child {
464
+ order: 0;
465
+ }
466
+ }
467
+ /* Feature section with an offset screenshot that crops at the section edge. */
468
+ @media (min-width: 901px) {
469
+ .m-feature-section[data-offset="true"] {
470
+ overflow-x: clip;
471
+ }
472
+ .m-feature-section[data-offset="true"] .m-feature-preview {
473
+ width: 150%;
474
+ }
475
+ .m-feature-section[data-offset="true"][data-reverse="true"]
476
+ .m-feature-preview {
477
+ margin-inline-start: -50%;
478
+ }
479
+ }
480
+
481
+ /* == FAQ == */
482
+ .m-faq {
483
+ display: grid;
484
+ grid-template-columns: 1fr 2fr;
485
+ gap: 56px;
486
+ }
487
+ .m-faq > div > div {
488
+ color: var(--m-secondary);
489
+ margin-top: 14px;
490
+ }
491
+ .m-faq details {
492
+ border-bottom: 1px solid var(--m-line);
493
+ }
494
+ .m-faq details:first-child {
495
+ border-top: 1px solid var(--m-line);
496
+ }
497
+ .m-faq summary {
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: space-between;
501
+ gap: 20px;
502
+ font-size: 17px;
503
+ font-weight: var(--m-weight-semibold);
504
+ padding: 20px 0;
505
+ cursor: pointer;
506
+ list-style: none;
507
+ }
508
+ .m-faq summary::-webkit-details-marker {
509
+ display: none;
510
+ }
511
+ .m-faq summary span {
512
+ font-size: 22px;
513
+ color: var(--m-muted);
514
+ }
515
+ .m-faq details > div {
516
+ color: var(--m-secondary);
517
+ padding: 0 0 22px;
518
+ font-size: 15px;
519
+ }
520
+ .m-faq-grid {
521
+ display: grid;
522
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
523
+ gap: 40px 48px;
524
+ margin: 0;
525
+ }
526
+ .m-faq-grid dt {
527
+ font-size: 16px;
528
+ font-weight: var(--m-weight-semibold);
529
+ }
530
+ .m-faq-grid dd {
531
+ margin: 8px 0 0;
532
+ color: var(--m-secondary);
533
+ font-size: 15px;
534
+ }
535
+ .m-faq [open] summary span {
536
+ transform: rotate(45deg);
537
+ }
538
+ /* FAQ layouts. */
539
+ .m-faq[data-layout="center"],
540
+ .m-faq[data-layout="grid"] {
541
+ grid-template-columns: minmax(0, 1fr);
542
+ gap: 40px;
543
+ width: 100%;
544
+ }
545
+ .m-faq[data-layout="center"] > div {
546
+ width: 100%;
547
+ max-width: 768px;
548
+ margin-inline: auto;
549
+ }
550
+ .m-faq[data-layout="center"] > div:first-child {
551
+ text-align: center;
552
+ }
553
+ .m-faq[data-layout="center"] .m-section-title {
554
+ margin-inline: auto;
555
+ }
556
+
557
+ /* == Hero == */
558
+ .m-hero {
559
+ padding: 100px 32px 80px;
560
+ max-width: 1280px;
561
+ margin: auto;
562
+ }
563
+ .m-hero-center {
564
+ text-align: center;
565
+ }
566
+ .m-hero .m-section-title {
567
+ font-size: clamp(42px, 6vw, 80px);
568
+ font-weight: var(--m-weight-semibold);
569
+ letter-spacing: -0.045em;
570
+ line-height: 1.02;
571
+ text-wrap: balance;
572
+ max-width: 960px;
573
+ margin: auto;
574
+ }
575
+ .m-hero-description {
576
+ color: var(--m-secondary);
577
+ font-size: 18px;
578
+ max-width: 660px;
579
+ margin: 28px auto;
580
+ text-wrap: pretty;
581
+ }
582
+ .m-hero-center .m-actions {
583
+ justify-content: center;
584
+ }
585
+ .m-hero-split {
586
+ display: grid;
587
+ grid-template-columns: 1fr 1fr;
588
+ gap: 56px;
589
+ align-items: center;
590
+ }
591
+ .m-hero-split .m-section-title {
592
+ font-size: clamp(40px, 5vw, 64px);
593
+ }
594
+ .m-hero-preview {
595
+ margin-top: 48px;
596
+ text-align: left;
597
+ min-width: 0;
598
+ }
599
+ .m-hero-split .m-hero-preview {
600
+ margin-top: 0;
601
+ }
602
+ .m-hero-background {
603
+ position: absolute;
604
+ inset: 0;
605
+ z-index: -1;
606
+ }
607
+ .m-hero-background > * {
608
+ display: block;
609
+ width: 100%;
610
+ height: 100%;
611
+ }
612
+ .m-hero-background :is(img, video) {
613
+ width: 100%;
614
+ height: 100%;
615
+ object-fit: cover;
616
+ }
617
+ .m-hero-background::after {
618
+ content: "";
619
+ position: absolute;
620
+ inset: 0;
621
+ background: linear-gradient(
622
+ color-mix(in srgb, var(--m-paper) 80%, transparent),
623
+ color-mix(in srgb, var(--m-paper) 92%, transparent)
624
+ );
625
+ }
626
+ /* Hero image tiles: a staggered collage; offsets use transforms so every
627
+ column keeps even gaps. */
628
+ .m-hero-tiles {
629
+ display: grid;
630
+ grid-template-columns: repeat(3, minmax(0, 1fr));
631
+ gap: 16px;
632
+ padding-bottom: 48px;
633
+ min-width: 0;
634
+ }
635
+ .m-hero-center .m-hero-tiles {
636
+ max-width: 880px;
637
+ margin: 56px auto 0;
638
+ }
639
+ .m-hero-tiles > div {
640
+ aspect-ratio: 2 / 3;
641
+ overflow: hidden;
642
+ border-radius: var(--m-radius-lg);
643
+ background: var(--m-sunken);
644
+ box-shadow: inset 0 0 0 1px var(--m-line);
645
+ }
646
+ .m-hero-tiles > div:nth-child(3n + 1) {
647
+ translate: 0 48px;
648
+ }
649
+ .m-hero-tiles > div:nth-child(3n) {
650
+ translate: 0 24px;
651
+ }
652
+ .m-hero-tiles :is(img, video, svg) {
653
+ display: block;
654
+ width: 100%;
655
+ height: 100%;
656
+ object-fit: cover;
657
+ }
658
+ .m-hero-angled .m-section-title {
659
+ font-size: clamp(40px, 5vw, 64px);
660
+ }
661
+ .m-hero-angled .m-hero-preview {
662
+ position: absolute;
663
+ inset-block: 0;
664
+ inset-inline-end: 0;
665
+ width: 50%;
666
+ margin: 0;
667
+ overflow: hidden;
668
+ background: var(--m-sunken);
669
+ clip-path: polygon(14% 0, 100% 0, 100% 100%, 0 100%);
670
+ }
671
+ .m-hero-angled .m-hero-preview > *,
672
+ .m-hero-angled .m-hero-preview :is(img, video) {
673
+ display: block;
674
+ width: 100%;
675
+ height: 100%;
676
+ object-fit: cover;
677
+ }
678
+ /* Hero over a background image: inverse tone plus a scrim keeps text contrast. */
679
+ .m-hero[data-background] {
680
+ position: relative;
681
+ isolation: isolate;
682
+ overflow: hidden;
683
+ max-width: none;
684
+ padding-inline: max(32px, calc((100% - 1216px) / 2));
685
+ background: var(--m-paper);
686
+ }
687
+ .m-hero[data-background] .m-hero-preview {
688
+ color: var(--m-ink);
689
+ }
690
+ /* Hero in the accent tone: a full-bleed band of the accent fill. */
691
+ .m-hero[data-tone="accent"] {
692
+ max-width: none;
693
+ padding-inline: max(32px, calc((100% - 1216px) / 2));
694
+ }
695
+ @media (max-width: 900px) {
696
+ .m-hero-split,
697
+ .m-feature-section,
698
+ .m-faq {
699
+ grid-template-columns: minmax(0, 1fr);
700
+ gap: 32px;
701
+ }
702
+ }
703
+ @media (max-width: 560px) {
704
+ .m-hero,
705
+ .m-marketing-section,
706
+ .m-feature-section,
707
+ .m-faq {
708
+ padding: 48px 20px;
709
+ }
710
+ }
711
+ /* Hero angled: the image fills the end half to the edge, cut on a slant. */
712
+ .m-hero-angled {
713
+ position: relative;
714
+ display: grid;
715
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
716
+ gap: 56px;
717
+ align-items: center;
718
+ max-width: none;
719
+ min-height: 560px;
720
+ padding-inline: max(32px, calc((100% - 1216px) / 2));
721
+ }
722
+ @media (max-width: 560px) {
723
+ .m-hero-description {
724
+ font-size: 16px;
725
+ }
726
+ .m-hero:is([data-background], [data-tone="accent"]) {
727
+ padding-inline: 20px;
728
+ }
729
+ }
730
+ @media (max-width: 900px) {
731
+ .m-hero-angled {
732
+ grid-template-columns: minmax(0, 1fr);
733
+ gap: 32px;
734
+ min-height: 0;
735
+ }
736
+ .m-hero-angled .m-hero-preview {
737
+ position: static;
738
+ width: auto;
739
+ aspect-ratio: 16 / 10;
740
+ border-radius: var(--m-radius-lg);
741
+ clip-path: none;
742
+ }
743
+ }
744
+ @media (max-width: 560px) {
745
+ .m-hero-angled {
746
+ padding-inline: 20px;
747
+ }
748
+ .m-hero-tiles {
749
+ gap: 10px;
750
+ padding-bottom: 32px;
751
+ }
752
+ .m-hero-tiles > div:nth-child(3n + 1) {
753
+ translate: 0 32px;
754
+ }
755
+ .m-hero-tiles > div:nth-child(3n) {
756
+ translate: 0 16px;
757
+ }
758
+ }
759
+
760
+ /* == HeaderSection == */
761
+ .m-header-section > .m-section-title {
762
+ margin: 0;
763
+ font-size: clamp(36px, 5vw, 60px);
764
+ font-weight: var(--m-weight-semibold);
765
+ letter-spacing: var(--m-tracking-display);
766
+ line-height: 1.05;
767
+ text-wrap: balance;
768
+ max-width: 900px;
769
+ }
770
+ .m-header-links {
771
+ display: flex;
772
+ flex-wrap: wrap;
773
+ gap: 12px 28px;
774
+ margin-top: 32px;
775
+ }
776
+ .m-header-links a {
777
+ color: var(--m-ink);
778
+ font-weight: var(--m-weight-semibold);
779
+ text-decoration: none;
780
+ }
781
+ .m-header-stats {
782
+ display: grid;
783
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 160px), 1fr));
784
+ gap: 24px 32px;
785
+ margin: 48px 0 0;
786
+ }
787
+ .m-header-stats > div {
788
+ display: flex;
789
+ flex-direction: column-reverse;
790
+ gap: 4px;
791
+ padding-top: 16px;
792
+ border-top: 1px solid var(--m-line);
793
+ }
794
+ .m-header-stats dt {
795
+ color: var(--m-muted);
796
+ font-size: 13px;
797
+ }
798
+ .m-header-stats dd {
799
+ margin: 0;
800
+ font-size: 32px;
801
+ font-weight: var(--m-weight-semibold);
802
+ letter-spacing: -0.03em;
803
+ font-variant-numeric: tabular-nums;
804
+ }
805
+ .m-header-section[data-align="center"] {
806
+ text-align: center;
807
+ }
808
+ .m-header-section[data-align="center"]
809
+ > :is(.m-section-title, .m-section-description) {
810
+ margin-inline: auto;
811
+ }
812
+ .m-header-section[data-align="center"] .m-header-links {
813
+ justify-content: center;
814
+ }
815
+ .m-header-links a:hover {
816
+ text-decoration: underline;
817
+ text-underline-offset: 4px;
818
+ }
819
+
820
+ /* == ContentSection == */
821
+ .m-content-copy {
822
+ min-width: 0;
823
+ max-width: 720px;
824
+ }
825
+ .m-content-copy > .m-prose {
826
+ margin-top: 28px;
827
+ }
828
+ .m-content-media {
829
+ position: sticky;
830
+ top: 24px;
831
+ min-width: 0;
832
+ margin: 0;
833
+ }
834
+ .m-content-media :is(img, video) {
835
+ display: block;
836
+ width: 100%;
837
+ height: auto;
838
+ border-radius: var(--m-radius-lg);
839
+ }
840
+ .m-content-copy > .m-content-stats {
841
+ margin-top: 48px;
842
+ }
843
+ .m-content-section[data-media] {
844
+ display: grid;
845
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
846
+ gap: 48px 64px;
847
+ align-items: start;
848
+ }
849
+ .m-content-section[data-media="start"] .m-content-media {
850
+ order: -1;
851
+ }
852
+ @media (max-width: 900px) {
853
+ .m-content-section[data-media] {
854
+ grid-template-columns: minmax(0, 1fr);
855
+ }
856
+ .m-content-section[data-media="start"] .m-content-media {
857
+ order: 0;
858
+ }
859
+ .m-content-media {
860
+ position: static;
861
+ }
862
+ }
863
+
864
+ /* == FeatureGrid == */
865
+ .m-feature-grid {
866
+ display: grid;
867
+ grid-template-columns: repeat(3, minmax(0, 1fr));
868
+ gap: 48px 40px;
869
+ margin-top: 48px;
870
+ }
871
+ .m-feature-icon {
872
+ display: grid;
873
+ place-items: center;
874
+ width: 36px;
875
+ height: 36px;
876
+ border: 1px solid var(--m-line);
877
+ border-radius: var(--m-radius);
878
+ font: 12px var(--m-mono);
879
+ margin-bottom: 16px;
880
+ }
881
+ .m-feature-grid :is(h2, h3, h4, h5, h6) {
882
+ font-size: 16px;
883
+ font-weight: var(--m-weight-semibold);
884
+ }
885
+ .m-feature-grid p,
886
+ .m-feature-section > :where(div:first-child) > p:where(:not([class])) {
887
+ color: var(--m-secondary);
888
+ font-size: 15px;
889
+ margin-top: 10px;
890
+ }
891
+ .m-feature-details {
892
+ margin-top: 28px;
893
+ }
894
+ /* Feature grid markers and balanced columns. */
895
+ .m-feature-grid[data-columns="2"] {
896
+ grid-template-columns: repeat(2, minmax(0, 1fr));
897
+ }
898
+ .m-feature-grid[data-columns="4"] {
899
+ grid-template-columns: repeat(4, minmax(0, 1fr));
900
+ }
901
+ .m-feature-icon[data-marker="icon"] {
902
+ border-color: transparent;
903
+ background: var(--m-selected);
904
+ color: var(--m-primary);
905
+ --m-icon-size: 18px;
906
+ }
907
+ @media (max-width: 900px) {
908
+ .m-feature-grid {
909
+ grid-template-columns: repeat(2, minmax(0, 1fr));
910
+ gap: 32px;
911
+ }
912
+ }
913
+ @media (max-width: 560px) {
914
+ .m-feature-grid {
915
+ grid-template-columns: 1fr;
916
+ }
917
+ }
918
+ @media (max-width: 900px) {
919
+ .m-feature-grid[data-columns="4"] {
920
+ grid-template-columns: repeat(2, minmax(0, 1fr));
921
+ }
922
+ }
923
+ @media (max-width: 560px) {
924
+ .m-feature-grid[data-columns] {
925
+ grid-template-columns: 1fr;
926
+ }
927
+ }
928
+
929
+ /* == BentoGrid == */
930
+ /* Marketing sections */
931
+ .m-bento {
932
+ display: grid;
933
+ grid-template-columns: repeat(3, minmax(0, 1fr));
934
+ gap: 16px;
935
+ margin-top: 48px;
936
+ }
937
+ .m-bento > li {
938
+ display: flex;
939
+ min-width: 0;
940
+ }
941
+ .m-bento article {
942
+ display: flex;
943
+ flex: 1;
944
+ flex-direction: column;
945
+ gap: 8px;
946
+ padding: 28px;
947
+ border: 1px solid var(--m-line);
948
+ border-radius: var(--m-radius-lg);
949
+ background: var(--m-sunken);
950
+ min-width: 0;
951
+ }
952
+ .m-bento-visual {
953
+ margin-bottom: 16px;
954
+ min-height: 120px;
955
+ }
956
+ .m-bento :is(h2, h3, h4, h5, h6) {
957
+ margin: 0;
958
+ font-size: 17px;
959
+ font-weight: var(--m-weight-semibold);
960
+ }
961
+ .m-bento p {
962
+ color: var(--m-secondary);
963
+ font-size: 15px;
964
+ }
965
+ .m-bento > li[data-span="2"] {
966
+ grid-column: span 2;
967
+ }
968
+ /* Bento tiles that span two rows. */
969
+ .m-bento > li[data-row-span="2"] {
970
+ grid-row: span 2;
971
+ }
972
+ @media (max-width: 900px) {
973
+ .m-bento {
974
+ grid-template-columns: repeat(2, minmax(0, 1fr));
975
+ }
976
+ }
977
+ @media (max-width: 560px) {
978
+ .m-bento {
979
+ grid-template-columns: minmax(0, 1fr);
980
+ }
981
+ .m-bento > li[data-span="2"] {
982
+ grid-column: auto;
983
+ }
984
+ .m-bento > li[data-row-span="2"] {
985
+ grid-row: auto;
986
+ }
987
+ }
988
+
989
+ /* == ProcessSteps == */
990
+ /* The first step's number is filled (as in Steps and ProgressSteps). */
991
+ .m-process-steps li:first-child .m-process-number {
992
+ border-color: var(--m-primary);
993
+ background: var(--m-primary);
994
+ color: var(--m-on-primary);
995
+ }
996
+ /* Marketing process steps. */
997
+ .m-process-steps {
998
+ margin: 56px 0 0;
999
+ display: grid;
1000
+ grid-template-columns: repeat(var(--m-steps, 3), minmax(0, 1fr));
1001
+ gap: 32px;
1002
+ }
1003
+ .m-process-steps li {
1004
+ position: relative;
1005
+ min-width: 0;
1006
+ }
1007
+ .m-process-steps li:not(:last-child)::after {
1008
+ content: "";
1009
+ position: absolute;
1010
+ top: 18px;
1011
+ left: 52px;
1012
+ right: -16px;
1013
+ height: 1px;
1014
+ background: var(--m-line);
1015
+ }
1016
+ .m-process-number {
1017
+ background: var(--m-paper);
1018
+ font-size: 14px;
1019
+ margin-bottom: 20px;
1020
+ --m-marker-size: 36px;
1021
+ }
1022
+ .m-process-steps :is(h2, h3, h4, h5, h6) {
1023
+ margin: 0;
1024
+ font-size: 16px;
1025
+ font-weight: var(--m-weight-semibold);
1026
+ }
1027
+ .m-process-steps p {
1028
+ margin-top: 8px;
1029
+ color: var(--m-secondary);
1030
+ font-size: 15px;
1031
+ }
1032
+ @media (max-width: 900px) {
1033
+ .m-process-steps {
1034
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1035
+ }
1036
+ .m-process-steps li::after {
1037
+ display: none;
1038
+ }
1039
+ }
1040
+ @media (max-width: 560px) {
1041
+ .m-process-steps,
1042
+ .m-check-list[data-columns="2"] {
1043
+ grid-template-columns: 1fr;
1044
+ }
1045
+ }
1046
+
1047
+ /* == StatGroup == */
1048
+ .m-stat-group {
1049
+ display: grid;
1050
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1051
+ gap: 32px;
1052
+ }
1053
+ .m-stat-group > div {
1054
+ display: flex;
1055
+ flex-direction: column-reverse;
1056
+ gap: 6px;
1057
+ border-top: 1px solid var(--m-ink);
1058
+ padding-top: 16px;
1059
+ }
1060
+ .m-stat-group dt {
1061
+ font-size: 14px;
1062
+ color: var(--m-secondary);
1063
+ }
1064
+ .m-stat-group dd {
1065
+ margin: 0;
1066
+ font-size: clamp(32px, 4vw, 48px);
1067
+ font-weight: var(--m-weight-semibold);
1068
+ letter-spacing: var(--m-tracking-display);
1069
+ line-height: 1;
1070
+ font-variant-numeric: tabular-nums;
1071
+ }
1072
+ /* Stat descriptions sit under the value (items are column-reversed). */
1073
+ .m-stat-group .m-stat-description {
1074
+ order: -1;
1075
+ font-size: 14px;
1076
+ font-weight: var(--m-weight-regular);
1077
+ letter-spacing: var(--m-tracking-body);
1078
+ line-height: 1.5;
1079
+ color: var(--m-secondary);
1080
+ margin-top: 4px;
1081
+ }
1082
+ .m-stat-band {
1083
+ position: relative;
1084
+ isolation: isolate;
1085
+ overflow: hidden;
1086
+ padding: 80px max(32px, calc((100% - 1216px) / 2));
1087
+ background: var(--m-paper);
1088
+ }
1089
+ /* Stat layouts. */
1090
+ .m-stat-group[data-layout="timeline"] {
1091
+ overflow-x: clip;
1092
+ }
1093
+ /* Items are column-reversed, so flex-end packs them against the top. */
1094
+ .m-stat-group[data-layout="timeline"] > div {
1095
+ position: relative;
1096
+ justify-content: flex-end;
1097
+ border-top: 0;
1098
+ padding-top: 32px;
1099
+ }
1100
+ .m-stat-group[data-layout="timeline"] > div::before {
1101
+ content: "";
1102
+ position: absolute;
1103
+ top: 5px;
1104
+ inset-inline: 0 -32px;
1105
+ height: 1px;
1106
+ background: var(--m-line-strong);
1107
+ }
1108
+ .m-stat-group[data-layout="timeline"] > div::after {
1109
+ content: "";
1110
+ position: absolute;
1111
+ top: 0;
1112
+ inset-inline-start: 0;
1113
+ width: 11px;
1114
+ height: 11px;
1115
+ border-radius: 50%;
1116
+ background: var(--m-primary);
1117
+ }
1118
+ .m-stat-group[data-layout="timeline"] dd:not(.m-stat-description) {
1119
+ font-size: 14px;
1120
+ font-weight: var(--m-weight-semibold);
1121
+ letter-spacing: var(--m-tracking-body);
1122
+ line-height: 1.4;
1123
+ color: var(--m-primary);
1124
+ }
1125
+ .m-stat-group[data-layout="timeline"] dt {
1126
+ font-size: 17px;
1127
+ font-weight: var(--m-weight-semibold);
1128
+ color: var(--m-ink);
1129
+ }
1130
+ .m-stat-group[data-layout="stepped"] {
1131
+ align-items: end;
1132
+ gap: 16px;
1133
+ }
1134
+ .m-stat-group[data-layout="stepped"] > div {
1135
+ min-height: 200px;
1136
+ padding: 24px;
1137
+ border: 1px solid var(--m-line);
1138
+ border-radius: var(--m-radius-lg);
1139
+ background: var(--m-sunken);
1140
+ }
1141
+ .m-stat-group[data-layout="stepped"] > div:nth-child(2) {
1142
+ min-height: 240px;
1143
+ }
1144
+ .m-stat-group[data-layout="stepped"] > div:nth-child(3) {
1145
+ min-height: 280px;
1146
+ }
1147
+ .m-stat-group[data-layout="stepped"] > div:nth-child(n + 4) {
1148
+ min-height: 320px;
1149
+ }
1150
+ /* The value sits at the top of the card; the label and note at the foot. */
1151
+ .m-stat-group[data-layout="stepped"] dd:first-of-type {
1152
+ margin-bottom: auto;
1153
+ }
1154
+ @media (max-width: 560px) {
1155
+ .m-stat-band {
1156
+ padding: 48px 20px;
1157
+ }
1158
+ /* Stacked cards no longer step, so they keep one compact height. */
1159
+ .m-stat-group[data-layout="stepped"] > div:nth-child(n) {
1160
+ min-height: 160px;
1161
+ }
1162
+ }
1163
+
1164
+ /* == Testimonial and TestimonialGrid == */
1165
+ .m-testimonial {
1166
+ padding: 64px 32px;
1167
+ text-align: center;
1168
+ max-width: 960px;
1169
+ margin: auto;
1170
+ }
1171
+ .m-testimonial blockquote {
1172
+ font-size: clamp(24px, 3vw, 36px);
1173
+ line-height: var(--m-leading-heading);
1174
+ letter-spacing: var(--m-tracking-heading);
1175
+ margin: 0 0 28px;
1176
+ }
1177
+ .m-testimonial figcaption {
1178
+ display: flex;
1179
+ flex-direction: column;
1180
+ font-size: 14px;
1181
+ }
1182
+ .m-testimonial figcaption span {
1183
+ color: var(--m-muted);
1184
+ }
1185
+ .m-testimonial-grid {
1186
+ columns: 3 280px;
1187
+ column-gap: 16px;
1188
+ margin-top: 40px;
1189
+ }
1190
+ .m-testimonial-grid figure {
1191
+ break-inside: avoid;
1192
+ margin: 0 0 16px;
1193
+ padding: 24px;
1194
+ border: 1px solid var(--m-line);
1195
+ border-radius: var(--m-radius-lg);
1196
+ }
1197
+ .m-testimonial-grid blockquote {
1198
+ margin: 0 0 20px;
1199
+ font-size: 15px;
1200
+ line-height: 1.55;
1201
+ text-wrap: pretty;
1202
+ }
1203
+ .m-testimonial-grid figcaption {
1204
+ display: flex;
1205
+ align-items: center;
1206
+ gap: 10px;
1207
+ font-size: 13px;
1208
+ }
1209
+ .m-testimonial-grid figcaption strong,
1210
+ .m-testimonial-grid figcaption span span {
1211
+ display: block;
1212
+ }
1213
+ .m-testimonial-grid figcaption span span {
1214
+ color: var(--m-muted);
1215
+ }
1216
+ .m-testimonial-logo {
1217
+ display: flex;
1218
+ justify-content: center;
1219
+ margin-bottom: 20px;
1220
+ }
1221
+ .m-testimonial-logo :is(img, svg) {
1222
+ display: block;
1223
+ height: 28px;
1224
+ width: auto;
1225
+ }
1226
+ .m-testimonial figcaption:has(.m-testimonial-avatar) {
1227
+ flex-direction: row;
1228
+ align-items: center;
1229
+ justify-content: center;
1230
+ gap: 12px;
1231
+ text-align: start;
1232
+ }
1233
+ /* The shared caption rule mutes every span; keep the name at full contrast. */
1234
+ .m-testimonial figcaption .m-testimonial-person {
1235
+ color: var(--m-ink);
1236
+ }
1237
+ .m-testimonial figcaption .m-testimonial-person > span {
1238
+ color: var(--m-muted);
1239
+ }
1240
+ .m-testimonial-avatar {
1241
+ display: inline-flex;
1242
+ flex-shrink: 0;
1243
+ }
1244
+ .m-testimonial-person {
1245
+ display: flex;
1246
+ flex-direction: column;
1247
+ min-width: 0;
1248
+ }
1249
+ /* ContentSection quote and stats under the copy. */
1250
+ .m-testimonial.m-content-quote {
1251
+ max-width: none;
1252
+ margin: 40px 0 0;
1253
+ padding: 0 0 0 24px;
1254
+ border-inline-start: 2px solid var(--m-line-strong);
1255
+ text-align: start;
1256
+ }
1257
+ .m-content-quote blockquote {
1258
+ margin: 0 0 20px;
1259
+ font-size: 18px;
1260
+ line-height: var(--m-leading-body);
1261
+ letter-spacing: var(--m-tracking-body);
1262
+ }
1263
+ .m-testimonial.m-content-quote figcaption {
1264
+ align-items: flex-start;
1265
+ justify-content: flex-start;
1266
+ }
1267
+ .m-testimonial.m-content-quote figcaption:has(.m-testimonial-avatar) {
1268
+ align-items: center;
1269
+ }
1270
+ /* Testimonials: an equal-height grid, and a larger featured quote. */
1271
+ .m-testimonial-grid[data-layout="grid"] {
1272
+ display: grid;
1273
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
1274
+ grid-auto-flow: dense;
1275
+ gap: 16px;
1276
+ columns: auto;
1277
+ }
1278
+ .m-testimonial-grid[data-layout="grid"] figure {
1279
+ display: flex;
1280
+ flex-direction: column;
1281
+ justify-content: space-between;
1282
+ margin: 0;
1283
+ }
1284
+ .m-testimonial-grid figure[data-featured="true"] {
1285
+ column-span: all;
1286
+ background: var(--m-sunken);
1287
+ }
1288
+ .m-testimonial-grid figure[data-featured="true"] blockquote {
1289
+ font-size: clamp(18px, 2vw, 22px);
1290
+ font-weight: var(--m-weight-medium);
1291
+ letter-spacing: -0.01em;
1292
+ }
1293
+ @media (min-width: 901px) {
1294
+ .m-testimonial-grid[data-layout="grid"] figure[data-featured="true"] {
1295
+ grid-column: span 2;
1296
+ grid-row: span 2;
1297
+ }
1298
+ }
1299
+
1300
+ /* == LogoCloud == */
1301
+ .m-logo-cloud {
1302
+ padding: 40px 32px;
1303
+ text-align: center;
1304
+ color: var(--m-muted);
1305
+ }
1306
+ .m-logo-cloud > p {
1307
+ font-size: 13px;
1308
+ }
1309
+ .m-logo-cloud ul {
1310
+ display: flex;
1311
+ justify-content: center;
1312
+ flex-wrap: wrap;
1313
+ gap: 48px;
1314
+ padding: 24px 0;
1315
+ font-size: 22px;
1316
+ font-weight: var(--m-weight-semibold);
1317
+ }
1318
+ .m-logo-cloud img {
1319
+ max-height: 32px;
1320
+ max-width: 140px;
1321
+ }
1322
+ .m-logo-cloud-copy .m-section-title {
1323
+ font-size: clamp(28px, 3vw, 40px);
1324
+ font-weight: var(--m-weight-semibold);
1325
+ letter-spacing: -0.035em;
1326
+ line-height: var(--m-leading-display);
1327
+ text-wrap: balance;
1328
+ }
1329
+ .m-logo-cloud-copy > p:not(.m-section-description) {
1330
+ font-size: 13px;
1331
+ color: var(--m-muted);
1332
+ }
1333
+ .m-logo-cloud-copy .m-actions {
1334
+ margin-top: 28px;
1335
+ }
1336
+ /* LogoCloud grid and split layouts. */
1337
+ .m-logo-cloud[data-layout="grid"] ul,
1338
+ .m-logo-cloud[data-layout="split"] ul {
1339
+ display: grid;
1340
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 100px), 1fr));
1341
+ gap: 8px;
1342
+ }
1343
+ .m-logo-cloud:is([data-layout="grid"], [data-layout="split"]) li {
1344
+ display: grid;
1345
+ place-items: center;
1346
+ min-height: 88px;
1347
+ padding: 16px;
1348
+ border-radius: var(--m-radius);
1349
+ background: var(--m-sunken);
1350
+ font-size: 18px;
1351
+ }
1352
+ .m-logo-cloud[data-layout="split"] {
1353
+ display: grid;
1354
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1355
+ gap: 48px;
1356
+ align-items: center;
1357
+ max-width: 1280px;
1358
+ margin: auto;
1359
+ padding: 80px 32px;
1360
+ text-align: left;
1361
+ color: var(--m-ink);
1362
+ }
1363
+ .m-logo-cloud[data-layout="split"] ul {
1364
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1365
+ padding: 0;
1366
+ color: var(--m-muted);
1367
+ }
1368
+ @media (max-width: 560px) {
1369
+ .m-logo-cloud[data-layout="split"] {
1370
+ padding: 48px 20px;
1371
+ }
1372
+ }
1373
+
1374
+ /* == Pricing == */
1375
+ .m-pricing > .m-segmented {
1376
+ margin-top: 28px;
1377
+ }
1378
+ .m-pricing-grid {
1379
+ display: grid;
1380
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
1381
+ gap: 18px;
1382
+ margin-top: 36px;
1383
+ }
1384
+ .m-pricing-grid article {
1385
+ border: 1px solid var(--m-line);
1386
+ border-radius: var(--m-radius-lg);
1387
+ padding: 28px;
1388
+ display: flex;
1389
+ flex-direction: column;
1390
+ }
1391
+ .m-pricing-grid :is(h2, h3, h4, h5, h6) {
1392
+ font-size: 18px;
1393
+ font-weight: var(--m-weight-semibold);
1394
+ }
1395
+ .m-pricing-grid p {
1396
+ font-size: 14px;
1397
+ margin-top: 6px;
1398
+ }
1399
+ .m-price {
1400
+ margin: 28px 0;
1401
+ display: flex;
1402
+ flex-direction: column;
1403
+ gap: 4px;
1404
+ }
1405
+ .m-price strong {
1406
+ font-size: 44px;
1407
+ line-height: 1;
1408
+ letter-spacing: var(--m-tracking-display);
1409
+ font-weight: var(--m-weight-semibold);
1410
+ }
1411
+ .m-price span {
1412
+ font-size: 13px;
1413
+ }
1414
+ .m-pricing-grid ul {
1415
+ margin: 0 0 28px;
1416
+ flex: 1;
1417
+ }
1418
+ .m-pricing-grid li {
1419
+ font-size: 14px;
1420
+ margin: 10px 0;
1421
+ }
1422
+ .m-pricing-grid li::before {
1423
+ content: "—";
1424
+ opacity: 0.6;
1425
+ margin-right: 10px;
1426
+ }
1427
+ .m-pricing-detail {
1428
+ padding: 28px;
1429
+ min-width: 0;
1430
+ }
1431
+ .m-pricing-grid .m-pricing-features-label {
1432
+ margin-top: 28px;
1433
+ font-size: 13px;
1434
+ font-weight: var(--m-weight-semibold);
1435
+ color: var(--m-ink);
1436
+ }
1437
+ .m-pricing-offer {
1438
+ display: flex;
1439
+ flex-direction: column;
1440
+ justify-content: center;
1441
+ align-items: center;
1442
+ gap: 8px;
1443
+ padding: 32px 28px;
1444
+ border-radius: var(--m-radius);
1445
+ background: var(--m-sunken);
1446
+ text-align: center;
1447
+ min-width: 0;
1448
+ }
1449
+ .m-pricing-offer .m-price {
1450
+ margin: 0 0 16px;
1451
+ align-items: center;
1452
+ }
1453
+ .m-pricing-offer > .m-button {
1454
+ align-self: stretch;
1455
+ justify-content: center;
1456
+ }
1457
+ .m-pricing-extra > div:first-child {
1458
+ flex: 1 1 280px;
1459
+ min-width: 0;
1460
+ }
1461
+ .m-pricing-extra .m-price {
1462
+ flex-direction: row;
1463
+ align-items: baseline;
1464
+ gap: 8px;
1465
+ margin: 0;
1466
+ }
1467
+ .m-pricing-extra .m-price strong {
1468
+ font-size: 32px;
1469
+ }
1470
+ .m-pricing-grid article[data-featured="true"] {
1471
+ background: var(--m-surface);
1472
+ color: var(--m-ink);
1473
+ }
1474
+ .m-pricing-grid article[data-featured="true"] .m-button-secondary {
1475
+ background: var(--m-sunken);
1476
+ border-color: var(--m-line);
1477
+ }
1478
+ /* Pricing: detailed single-price layout. */
1479
+ .m-pricing-grid[data-layout="detailed"] {
1480
+ grid-template-columns: minmax(0, 1fr);
1481
+ }
1482
+ .m-pricing-grid[data-layout="detailed"] article {
1483
+ display: grid;
1484
+ grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
1485
+ gap: 32px;
1486
+ padding: 8px;
1487
+ }
1488
+ .m-pricing-grid[data-layout="detailed"] ul {
1489
+ display: grid;
1490
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
1491
+ column-gap: 24px;
1492
+ margin: 8px 0 0;
1493
+ }
1494
+ /* Pricing: four tiers go 4, 2, then 1 across; the extra tier spans the row. */
1495
+ .m-pricing-grid[data-columns="4"] {
1496
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1497
+ }
1498
+ @media (max-width: 560px) {
1499
+ .m-pricing-grid article {
1500
+ padding: 24px;
1501
+ }
1502
+ }
1503
+ @media (max-width: 760px) {
1504
+ .m-pricing-grid[data-layout="detailed"] article,
1505
+ .m-logo-cloud[data-layout="split"] {
1506
+ grid-template-columns: minmax(0, 1fr);
1507
+ gap: 24px;
1508
+ }
1509
+ }
1510
+ .m-pricing-grid article.m-pricing-extra {
1511
+ grid-column: 1 / -1;
1512
+ flex-direction: row;
1513
+ flex-wrap: wrap;
1514
+ align-items: center;
1515
+ gap: 16px 32px;
1516
+ background: var(--m-sunken);
1517
+ }
1518
+ @media (max-width: 560px) {
1519
+ .m-pricing-detail {
1520
+ padding: 20px;
1521
+ }
1522
+ }
1523
+ @media (max-width: 1100px) {
1524
+ .m-pricing-grid[data-columns="4"] {
1525
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1526
+ }
1527
+ }
1528
+ @media (max-width: 560px) {
1529
+ .m-pricing-grid[data-columns="4"] {
1530
+ grid-template-columns: minmax(0, 1fr);
1531
+ }
1532
+ .m-pricing-grid article.m-pricing-extra {
1533
+ padding: 24px;
1534
+ }
1535
+ }
1536
+
1537
+ /* == PlanComparison == */
1538
+ .m-comparison {
1539
+ --m-cell-pad-y: 14px;
1540
+ --m-cell-pad-x: 16px;
1541
+ margin-top: 40px;
1542
+ }
1543
+ .m-comparison :is(th, td) {
1544
+ text-align: center;
1545
+ }
1546
+ .m-comparison :is(tbody th[scope="row"]) {
1547
+ text-align: left;
1548
+ font-weight: var(--m-weight-medium);
1549
+ color: var(--m-secondary);
1550
+ }
1551
+ .m-comparison thead th {
1552
+ font-size: 15px;
1553
+ font-weight: var(--m-weight-semibold);
1554
+ }
1555
+ .m-comparison-group th {
1556
+ text-align: left;
1557
+ padding-top: 28px;
1558
+ font-size: 13px;
1559
+ font-weight: var(--m-weight-semibold);
1560
+ border-bottom-color: var(--m-ink);
1561
+ }
1562
+ .m-comparison-no {
1563
+ color: var(--m-muted);
1564
+ }
1565
+ .m-comparison [data-featured] {
1566
+ background: var(--m-sunken);
1567
+ }
1568
+
1569
+ /* == CallToAction == */
1570
+ .m-cta {
1571
+ text-align: center;
1572
+ background: var(--m-surface);
1573
+ color: var(--m-ink);
1574
+ padding: 96px 32px;
1575
+ }
1576
+ :is(.m-cta, .m-cta-copy) > :is(h2, :where(.m-section-title)) {
1577
+ margin: auto;
1578
+ }
1579
+ :is(.m-cta, .m-cta-copy) > p {
1580
+ margin: 20px auto;
1581
+ max-width: 640px;
1582
+ }
1583
+ .m-cta .m-actions {
1584
+ justify-content: center;
1585
+ margin-top: 32px;
1586
+ }
1587
+ .m-cta-media {
1588
+ min-width: 0;
1589
+ }
1590
+ .m-cta-media :is(img, video) {
1591
+ display: block;
1592
+ width: 100%;
1593
+ height: auto;
1594
+ border-radius: var(--m-radius-lg);
1595
+ }
1596
+ .m-cta[data-layout="split"] {
1597
+ display: grid;
1598
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1599
+ gap: 40px 64px;
1600
+ align-items: center;
1601
+ max-width: 1280px;
1602
+ margin-inline: auto;
1603
+ text-align: start;
1604
+ }
1605
+ .m-cta[data-layout="split"] :is(.m-section-title, p) {
1606
+ margin-inline: 0;
1607
+ }
1608
+ .m-cta[data-layout="split"] .m-actions {
1609
+ justify-content: flex-start;
1610
+ }
1611
+ .m-cta[data-tone="muted"],
1612
+ .m-pricing-grid article[data-featured="true"][data-tone="muted"] {
1613
+ background: var(--m-sunken);
1614
+ }
1615
+ @media (max-width: 900px) {
1616
+ .m-cta[data-layout="split"] {
1617
+ grid-template-columns: minmax(0, 1fr);
1618
+ }
1619
+ }
1620
+
1621
+ /* == PostList == */
1622
+ .m-post-list {
1623
+ display: grid;
1624
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
1625
+ gap: 40px 24px;
1626
+ margin: 48px 0 0;
1627
+ }
1628
+ .m-post-image {
1629
+ aspect-ratio: 16 / 10;
1630
+ margin-bottom: 18px;
1631
+ border-radius: var(--m-radius-lg);
1632
+ background: var(--m-sunken);
1633
+ overflow: hidden;
1634
+ }
1635
+ .m-post-meta {
1636
+ display: flex;
1637
+ gap: 12px;
1638
+ font-size: 13px;
1639
+ color: var(--m-muted);
1640
+ }
1641
+ .m-post-meta span {
1642
+ color: var(--m-ink);
1643
+ font-weight: var(--m-weight-semibold);
1644
+ }
1645
+ .m-post-list .m-post-title {
1646
+ margin: 10px 0 8px;
1647
+ font-size: 19px;
1648
+ font-weight: var(--m-weight-semibold);
1649
+ letter-spacing: -0.015em;
1650
+ line-height: 1.25;
1651
+ }
1652
+ .m-post-list .m-post-title a {
1653
+ color: var(--m-ink);
1654
+ text-decoration: none;
1655
+ }
1656
+ .m-post-list p:last-child {
1657
+ font-size: 15px;
1658
+ color: var(--m-secondary);
1659
+ }
1660
+ .m-post-list .m-post-title a:hover {
1661
+ text-decoration: underline;
1662
+ text-underline-offset: 3px;
1663
+ }
1664
+ /* Posts: a featured post spans the row with its image beside the text. */
1665
+ .m-post-list > li[data-featured="true"] {
1666
+ grid-column: 1 / -1;
1667
+ }
1668
+ .m-post-list > li[data-featured="true"] > article:has(> .m-post-image) {
1669
+ display: grid;
1670
+ grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
1671
+ grid-template-rows: 1fr repeat(3, auto) 1fr;
1672
+ column-gap: 48px;
1673
+ }
1674
+ .m-post-list > li[data-featured="true"] .m-post-image {
1675
+ grid-column: 1;
1676
+ grid-row: 1 / -1;
1677
+ margin: 0;
1678
+ }
1679
+ .m-post-list > li[data-featured="true"] > article > :not(.m-post-image) {
1680
+ grid-column: 2;
1681
+ }
1682
+ .m-post-list > li[data-featured="true"] .m-post-meta {
1683
+ grid-row: 2;
1684
+ }
1685
+ .m-post-list > li[data-featured="true"] .m-post-title {
1686
+ grid-row: 3;
1687
+ font-size: clamp(22px, 2.6vw, 32px);
1688
+ letter-spacing: -0.025em;
1689
+ }
1690
+ .m-post-list > li[data-featured="true"] article > p:last-child {
1691
+ grid-row: 4;
1692
+ font-size: 16px;
1693
+ }
1694
+ @media (max-width: 900px) {
1695
+ .m-post-list > li[data-featured="true"] > article:has(> .m-post-image) {
1696
+ display: block;
1697
+ }
1698
+ .m-post-list > li[data-featured="true"] .m-post-image {
1699
+ margin-bottom: 18px;
1700
+ }
1701
+ }
1702
+
1703
+ /* == TeamGrid == */
1704
+ .m-team-grid {
1705
+ display: grid;
1706
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 200px), 1fr));
1707
+ gap: 32px 24px;
1708
+ margin: 48px 0 0;
1709
+ }
1710
+ .m-team-grid li {
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ gap: 2px;
1714
+ font-size: 14px;
1715
+ }
1716
+ .m-team-grid li > span {
1717
+ color: var(--m-muted);
1718
+ }
1719
+ .m-team-portrait {
1720
+ aspect-ratio: 1;
1721
+ margin-bottom: 14px;
1722
+ border-radius: var(--m-radius-lg);
1723
+ background: var(--m-sunken);
1724
+ overflow: hidden;
1725
+ display: grid;
1726
+ place-items: center;
1727
+ }
1728
+ .m-team-bio {
1729
+ margin: 8px 0 0;
1730
+ color: var(--m-secondary);
1731
+ font-size: var(--m-font-size);
1732
+ }
1733
+ .m-icon-links {
1734
+ display: flex;
1735
+ flex-wrap: wrap;
1736
+ align-items: center;
1737
+ gap: 4px 12px;
1738
+ margin: 12px 0 0;
1739
+ --m-icon-size: 20px;
1740
+ }
1741
+ .m-icon-links a {
1742
+ display: inline-flex;
1743
+ align-items: center;
1744
+ min-height: max(28px, var(--m-touch-target));
1745
+ color: var(--m-muted);
1746
+ font-size: 13px;
1747
+ min-width: var(--m-touch-target);
1748
+ justify-content: center;
1749
+ }
1750
+ .m-icon-links a:hover {
1751
+ color: var(--m-ink);
1752
+ }
1753
+ /* Team: tall portraits, and portraits beside the details. */
1754
+ .m-team-grid[data-layout="large"] {
1755
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr));
1756
+ gap: 48px 32px;
1757
+ }
1758
+ .m-team-grid[data-layout="large"] .m-team-portrait {
1759
+ aspect-ratio: 4 / 5;
1760
+ }
1761
+ .m-team-grid[data-layout="large"] strong {
1762
+ font-size: 17px;
1763
+ }
1764
+ .m-team-grid[data-layout="list"] {
1765
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 440px), 1fr));
1766
+ gap: 40px 32px;
1767
+ }
1768
+ .m-team-grid[data-layout="list"] > li {
1769
+ display: grid;
1770
+ grid-template-columns: 128px minmax(0, 1fr);
1771
+ grid-template-rows: repeat(4, auto) 1fr;
1772
+ gap: 2px 24px;
1773
+ align-items: start;
1774
+ }
1775
+ .m-team-grid[data-layout="list"] > li > .m-team-portrait {
1776
+ grid-row: 1 / -1;
1777
+ margin: 0;
1778
+ }
1779
+ .m-team-grid[data-layout="list"] > li > :not(.m-team-portrait) {
1780
+ grid-column: 2;
1781
+ }
1782
+ @media (max-width: 560px) {
1783
+ .m-team-grid[data-layout="list"] > li {
1784
+ grid-template-columns: 88px minmax(0, 1fr);
1785
+ column-gap: 16px;
1786
+ }
1787
+ }
1788
+
1789
+ /* == Footer == */
1790
+ .m-footer {
1791
+ max-width: 1280px;
1792
+ padding: 56px 32px 32px;
1793
+ margin: auto;
1794
+ }
1795
+ .m-footer-grid {
1796
+ display: grid;
1797
+ grid-template-columns: 1.5fr repeat(4, 1fr);
1798
+ gap: 32px;
1799
+ }
1800
+ .m-footer-grid p {
1801
+ color: var(--m-muted);
1802
+ margin-top: 10px;
1803
+ font-size: 14px;
1804
+ max-width: 260px;
1805
+ }
1806
+ .m-footer-grid :is(h2, h3, h4, h5, h6) {
1807
+ font-size: 13px;
1808
+ font-weight: var(--m-weight-semibold);
1809
+ margin: 0 0 12px;
1810
+ }
1811
+ .m-footer-grid nav a {
1812
+ display: block;
1813
+ font-size: 14px;
1814
+ color: var(--m-muted);
1815
+ text-decoration: none;
1816
+ margin-top: 8px;
1817
+ }
1818
+ .m-footer-bottom {
1819
+ display: flex;
1820
+ justify-content: space-between;
1821
+ flex-wrap: wrap;
1822
+ gap: 16px;
1823
+ border-top: 1px solid var(--m-line);
1824
+ margin-top: 56px;
1825
+ padding-top: 20px;
1826
+ color: var(--m-muted);
1827
+ font-size: 13px;
1828
+ }
1829
+ .m-footer-bottom > div {
1830
+ display: flex;
1831
+ gap: 20px;
1832
+ }
1833
+ .m-footer-grid .m-brand {
1834
+ font-size: 15px;
1835
+ }
1836
+ /* Footer: centred brand, link row and social links. */
1837
+ .m-footer-center {
1838
+ display: flex;
1839
+ flex-direction: column;
1840
+ align-items: center;
1841
+ gap: 16px;
1842
+ text-align: center;
1843
+ }
1844
+ .m-footer-center .m-brand {
1845
+ font-size: 15px;
1846
+ }
1847
+ .m-footer-center > p {
1848
+ max-width: 480px;
1849
+ margin: 0;
1850
+ color: var(--m-muted);
1851
+ font-size: 14px;
1852
+ }
1853
+ .m-footer-center > nav {
1854
+ display: flex;
1855
+ flex-wrap: wrap;
1856
+ justify-content: center;
1857
+ gap: 8px 28px;
1858
+ margin-top: 8px;
1859
+ font-size: 14px;
1860
+ }
1861
+ .m-footer-center > nav a {
1862
+ color: var(--m-muted);
1863
+ text-decoration: none;
1864
+ }
1865
+ .m-footer-center > .m-icon-links {
1866
+ justify-content: center;
1867
+ margin: 0;
1868
+ }
1869
+ /* A newsletter in the footer drops its section padding and rule. */
1870
+ .m-footer-newsletter {
1871
+ margin-top: 48px;
1872
+ padding-top: 32px;
1873
+ border-top: 1px solid var(--m-line);
1874
+ }
1875
+ .m-footer-newsletter .m-newsletter {
1876
+ max-width: none;
1877
+ margin: 0;
1878
+ padding: 0;
1879
+ border-top: 0;
1880
+ }
1881
+ .m-footer-newsletter .m-newsletter .m-section-title {
1882
+ font-size: 15px;
1883
+ letter-spacing: 0;
1884
+ }
1885
+ .m-footer-newsletter + .m-footer-bottom {
1886
+ margin-top: 32px;
1887
+ }
1888
+ .m-footer-center > nav a:hover {
1889
+ color: var(--m-ink);
1890
+ }
1891
+ .m-footer[data-layout="center"] .m-footer-bottom {
1892
+ justify-content: center;
1893
+ text-align: center;
1894
+ margin-top: 40px;
1895
+ }
1896
+ @media (max-width: 900px) {
1897
+ .m-footer-grid {
1898
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1899
+ }
1900
+ .m-footer-grid > div {
1901
+ grid-column: 1/-1;
1902
+ }
1903
+ }
1904
+
1905
+ /* == Newsletter == */
1906
+ .m-newsletter {
1907
+ max-width: 1280px;
1908
+ margin: auto;
1909
+ padding: 56px 32px;
1910
+ display: grid;
1911
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1912
+ gap: 40px;
1913
+ align-items: end;
1914
+ border-top: 1px solid var(--m-line);
1915
+ }
1916
+ .m-newsletter .m-section-title {
1917
+ font-size: 24px;
1918
+ font-weight: var(--m-weight-semibold);
1919
+ letter-spacing: var(--m-tracking-heading);
1920
+ }
1921
+ .m-newsletter p {
1922
+ margin-top: 8px;
1923
+ color: var(--m-secondary);
1924
+ }
1925
+ .m-newsletter form {
1926
+ display: flex;
1927
+ align-items: flex-end;
1928
+ gap: 10px;
1929
+ flex-wrap: wrap;
1930
+ }
1931
+ .m-newsletter form .m-field {
1932
+ flex: 1;
1933
+ }
1934
+ .m-newsletter-status {
1935
+ flex-basis: 100%;
1936
+ }
1937
+ /* Kept in the accessibility tree while empty so the message is announced. */
1938
+ .m-newsletter-status:empty {
1939
+ position: absolute;
1940
+ width: 1px;
1941
+ height: 1px;
1942
+ overflow: hidden;
1943
+ clip-path: inset(50%);
1944
+ }
1945
+ /* Newsletter: centred copy above the form, and a sunken panel. */
1946
+ .m-newsletter[data-layout="center"] {
1947
+ grid-template-columns: minmax(0, 1fr);
1948
+ justify-items: center;
1949
+ gap: 24px;
1950
+ text-align: center;
1951
+ }
1952
+ .m-newsletter[data-layout="center"] > div {
1953
+ max-width: 560px;
1954
+ }
1955
+ .m-newsletter[data-layout="center"] form {
1956
+ width: 100%;
1957
+ max-width: 480px;
1958
+ text-align: start;
1959
+ }
1960
+ .m-newsletter[data-variant="panel"] {
1961
+ width: calc(100% - 64px);
1962
+ max-width: 1216px;
1963
+ margin: 32px auto;
1964
+ padding: 48px;
1965
+ border: 1px solid var(--m-line);
1966
+ border-radius: var(--m-radius-lg);
1967
+ background: var(--m-sunken);
1968
+ }
1969
+ @media (max-width: 560px) {
1970
+ .m-newsletter form {
1971
+ flex-direction: column;
1972
+ align-items: stretch;
1973
+ }
1974
+ .m-newsletter[data-variant="panel"] {
1975
+ width: calc(100% - 32px);
1976
+ padding: 32px 20px;
1977
+ }
1978
+ }
1979
+
1980
+ /* == ContactSection == */
1981
+ .m-contact {
1982
+ max-width: 1280px;
1983
+ margin: auto;
1984
+ padding: 80px 32px;
1985
+ display: grid;
1986
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
1987
+ gap: 56px;
1988
+ border-top: 1px solid var(--m-line);
1989
+ }
1990
+ .m-contact .m-section-title {
1991
+ font-size: clamp(30px, 3.5vw, 48px);
1992
+ font-weight: var(--m-weight-semibold);
1993
+ letter-spacing: -0.035em;
1994
+ line-height: var(--m-leading-display);
1995
+ }
1996
+ .m-contact dl {
1997
+ display: grid;
1998
+ gap: 20px;
1999
+ margin-top: 40px;
2000
+ }
2001
+ .m-contact dt {
2002
+ font-size: 13px;
2003
+ font-weight: var(--m-weight-semibold);
2004
+ }
2005
+ .m-contact dd {
2006
+ margin: 4px 0 0;
2007
+ color: var(--m-secondary);
2008
+ }
2009
+ .m-contact-form {
2010
+ display: grid;
2011
+ gap: 18px;
2012
+ padding: 28px;
2013
+ border: 1px solid var(--m-line);
2014
+ border-radius: var(--m-radius-lg);
2015
+ }
2016
+ .m-contact-media {
2017
+ min-height: 320px;
2018
+ border-radius: var(--m-radius-lg);
2019
+ background: var(--m-sunken);
2020
+ overflow: hidden;
2021
+ }
2022
+ .m-contact-media > :is(img, svg, video, picture) {
2023
+ display: block;
2024
+ width: 100%;
2025
+ height: 100%;
2026
+ object-fit: cover;
2027
+ }
2028
+ .m-contact-body {
2029
+ display: grid;
2030
+ gap: 32px;
2031
+ align-content: start;
2032
+ }
2033
+ .m-contact-body dl {
2034
+ margin-top: 24px;
2035
+ }
2036
+ .m-contact-offices {
2037
+ grid-column: 1 / -1;
2038
+ display: grid;
2039
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
2040
+ gap: 32px 24px;
2041
+ margin: 0;
2042
+ padding: 40px 0 0;
2043
+ border-top: 1px solid var(--m-line);
2044
+ list-style: none;
2045
+ }
2046
+ .m-contact-offices :is(h3, h4, h5, h6) {
2047
+ margin: 0 0 8px;
2048
+ font-size: 15px;
2049
+ font-weight: var(--m-weight-semibold);
2050
+ }
2051
+ .m-contact-offices address {
2052
+ color: var(--m-secondary);
2053
+ font-size: 14px;
2054
+ font-style: normal;
2055
+ line-height: var(--m-leading-body);
2056
+ }
2057
+ /* Contact: an image beside the copy and form, and office locations. */
2058
+ .m-contact[data-media="true"] {
2059
+ align-items: stretch;
2060
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
2061
+ }
2062
+ /* Without a form, the offices sit beside the intro. */
2063
+ .m-contact:not([data-media]):not(:has(.m-contact-form)) > .m-contact-offices {
2064
+ grid-column: 2;
2065
+ grid-row: 1;
2066
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2067
+ align-self: start;
2068
+ padding-top: 0;
2069
+ border-top: 0;
2070
+ }
2071
+ @media (max-width: 900px) {
2072
+ .m-contact,
2073
+ .m-newsletter {
2074
+ grid-template-columns: minmax(0, 1fr);
2075
+ gap: 32px;
2076
+ }
2077
+ }
2078
+ @media (max-width: 560px) {
2079
+ .m-contact,
2080
+ .m-newsletter {
2081
+ padding: 48px 20px;
2082
+ }
2083
+ }
2084
+ @media (max-width: 900px) {
2085
+ .m-contact[data-media="true"] {
2086
+ grid-template-columns: minmax(0, 1fr);
2087
+ }
2088
+ .m-contact-media {
2089
+ min-height: 0;
2090
+ aspect-ratio: 16 / 9;
2091
+ }
2092
+ .m-contact:not([data-media]):not(:has(.m-contact-form))
2093
+ > .m-contact-offices {
2094
+ grid-column: 1;
2095
+ grid-row: auto;
2096
+ }
2097
+ }
2098
+ @media (max-width: 560px) {
2099
+ .m-contact-offices,
2100
+ .m-contact:not([data-media]):not(:has(.m-contact-form))
2101
+ > .m-contact-offices {
2102
+ grid-template-columns: minmax(0, 1fr);
2103
+ }
2104
+ }
2105
+
2106
+ /* == NotFound == */
2107
+ .m-not-found {
2108
+ max-width: 720px;
2109
+ margin: auto;
2110
+ padding: 120px 32px;
2111
+ text-align: center;
2112
+ }
2113
+ .m-not-found .m-section-title {
2114
+ font-size: clamp(36px, 5vw, 56px);
2115
+ font-weight: var(--m-weight-semibold);
2116
+ letter-spacing: var(--m-tracking-display);
2117
+ line-height: 1.05;
2118
+ text-wrap: balance;
2119
+ }
2120
+ .m-not-found > p:not(.m-eyebrow) {
2121
+ margin: 20px auto 32px;
2122
+ max-width: 480px;
2123
+ color: var(--m-secondary);
2124
+ }
2125
+ .m-not-found .m-actions {
2126
+ justify-content: center;
2127
+ }
2128
+ .m-not-found-art {
2129
+ display: flex;
2130
+ justify-content: center;
2131
+ margin-bottom: 32px;
2132
+ color: var(--m-muted);
2133
+ }
2134
+ .m-not-found-art :is(img, svg) {
2135
+ width: min(240px, 60%);
2136
+ height: auto;
2137
+ }
2138
+ .m-not-found[data-background] {
2139
+ position: relative;
2140
+ isolation: isolate;
2141
+ overflow: hidden;
2142
+ display: flex;
2143
+ flex-direction: column;
2144
+ align-items: center;
2145
+ justify-content: center;
2146
+ max-width: none;
2147
+ min-height: min(100svh, 720px);
2148
+ background: var(--m-paper);
2149
+ }
2150
+ .m-not-found[data-background] .m-section-title {
2151
+ max-width: 720px;
2152
+ }
2153
+ @media (max-width: 560px) {
2154
+ .m-not-found[data-background] {
2155
+ padding-inline: 20px;
2156
+ }
2157
+ }
2158
+
2159
+ /* == Cover background: StatGroup band and NotFound == */
2160
+ /* Full-cover decorative background with a scrim (StatGroup, NotFound). */
2161
+ .m-cover-background {
2162
+ position: absolute;
2163
+ inset: 0;
2164
+ z-index: -1;
2165
+ }
2166
+ .m-cover-background > * {
2167
+ display: block;
2168
+ width: 100%;
2169
+ height: 100%;
2170
+ }
2171
+ .m-cover-background :is(img, video) {
2172
+ object-fit: cover;
2173
+ }
2174
+ .m-cover-background::after {
2175
+ content: "";
2176
+ position: absolute;
2177
+ inset: 0;
2178
+ background: linear-gradient(
2179
+ color-mix(in srgb, var(--m-paper) 80%, transparent),
2180
+ color-mix(in srgb, var(--m-paper) 92%, transparent)
2181
+ );
2182
+ }
2183
+
2184
+ /* == MockWindow == */
2185
+ /* Mock window. */
2186
+ .m-mock-window {
2187
+ margin: 0;
2188
+ min-width: 0;
2189
+ box-shadow: var(--m-float);
2190
+ overflow: hidden;
2191
+ }
2192
+ .m-mock-bar {
2193
+ display: flex;
2194
+ align-items: center;
2195
+ gap: 12px;
2196
+ padding: 10px 14px;
2197
+ border-bottom: 1px solid var(--m-line);
2198
+ background: var(--m-sunken);
2199
+ }
2200
+ .m-mock-dots {
2201
+ display: flex;
2202
+ gap: 6px;
2203
+ }
2204
+ .m-mock-dots i {
2205
+ width: 10px;
2206
+ height: 10px;
2207
+ border-radius: 50%;
2208
+ background: var(--m-line-strong);
2209
+ opacity: 0.45;
2210
+ }
2211
+ .m-mock-address {
2212
+ flex: 1;
2213
+ min-width: 0;
2214
+ padding: 3px 10px;
2215
+ border-radius: 6px;
2216
+ background: var(--m-surface);
2217
+ color: var(--m-muted);
2218
+ font: 12px var(--m-mono);
2219
+ text-align: center;
2220
+ overflow: hidden;
2221
+ text-overflow: ellipsis;
2222
+ white-space: nowrap;
2223
+ }
2224
+ .m-mock-body {
2225
+ min-width: 0;
2226
+ padding: 20px;
2227
+ }
2228
+ .m-mock-window[data-variant="plain"] {
2229
+ box-shadow: none;
2230
+ }
2231
+ .m-mock-window[data-variant="app"] .m-mock-dots {
2232
+ display: none;
2233
+ }
2234
+ /* Phone mock: a portrait handset frame with a camera pill. */
2235
+ .m-mock-window[data-variant="phone"] {
2236
+ position: relative;
2237
+ width: min(100%, 300px);
2238
+ aspect-ratio: 9 / 19;
2239
+ margin-inline: auto;
2240
+ border: 10px solid var(--m-line-strong);
2241
+ border-radius: 44px;
2242
+ background: var(--m-surface);
2243
+ }
2244
+ .m-mock-window[data-variant="phone"]::before {
2245
+ content: "";
2246
+ position: absolute;
2247
+ top: 8px;
2248
+ left: 50%;
2249
+ z-index: 1;
2250
+ width: 32%;
2251
+ height: 22px;
2252
+ border-radius: var(--m-radius-full);
2253
+ background: var(--m-line-strong);
2254
+ translate: -50% 0;
2255
+ }
2256
+ .m-mock-window[data-variant="phone"] .m-mock-body {
2257
+ height: 100%;
2258
+ padding: 44px 16px 16px;
2259
+ overflow: hidden;
2260
+ }
2261
+
2262
+ /* == ChatPreview == */
2263
+ /* Chat preview. */
2264
+ .m-chat-preview {
2265
+ margin: 0;
2266
+ min-width: 0;
2267
+ display: flex;
2268
+ flex-direction: column;
2269
+ border: 1px solid var(--m-line);
2270
+ border-radius: var(--m-radius-xl);
2271
+ background: var(--m-surface);
2272
+ box-shadow: var(--m-float);
2273
+ overflow: hidden;
2274
+ }
2275
+ .m-chat-preview > header {
2276
+ display: flex;
2277
+ align-items: center;
2278
+ gap: 12px;
2279
+ padding: 14px 18px;
2280
+ background: var(--m-primary);
2281
+ color: var(--m-on-primary);
2282
+ }
2283
+ .m-chat-preview > header strong {
2284
+ display: block;
2285
+ font-size: 15px;
2286
+ }
2287
+ .m-chat-preview > header small {
2288
+ display: block;
2289
+ font-size: 12px;
2290
+ opacity: 0.8;
2291
+ }
2292
+ .m-chat-avatar {
2293
+ width: 32px;
2294
+ height: 32px;
2295
+ border-radius: 50%;
2296
+ background: var(--m-on-primary);
2297
+ opacity: 0.25;
2298
+ flex-shrink: 0;
2299
+ }
2300
+ .m-chat-log {
2301
+ padding: 18px;
2302
+ display: flex;
2303
+ flex-direction: column;
2304
+ gap: 10px;
2305
+ background: var(--m-paper);
2306
+ }
2307
+ .m-chat-log li {
2308
+ display: flex;
2309
+ min-width: 0;
2310
+ }
2311
+ .m-chat-bubble {
2312
+ max-width: 82%;
2313
+ padding: 10px 14px;
2314
+ border-radius: var(--m-radius-xl) var(--m-radius-xl) var(--m-radius-xl)
2315
+ var(--m-radius-sm);
2316
+ background: var(--m-sunken);
2317
+ color: var(--m-ink);
2318
+ font-size: 14px;
2319
+ line-height: 1.45;
2320
+ overflow-wrap: anywhere;
2321
+ }
2322
+ .m-chat-bubble :is(ul, ol) {
2323
+ margin: 6px 0;
2324
+ padding-left: 18px;
2325
+ }
2326
+ .m-chat-typing {
2327
+ display: inline-flex;
2328
+ gap: 4px;
2329
+ padding: 12px 14px;
2330
+ border-radius: var(--m-radius-xl) var(--m-radius-xl) var(--m-radius-xl)
2331
+ var(--m-radius-sm);
2332
+ background: var(--m-sunken);
2333
+ }
2334
+ .m-chat-typing i {
2335
+ width: 6px;
2336
+ height: 6px;
2337
+ border-radius: 50%;
2338
+ background: var(--m-muted);
2339
+ animation: m-chat-dot 1.2s infinite ease-in-out;
2340
+ }
2341
+ .m-chat-typing i:nth-of-type(2) {
2342
+ animation-delay: 0.15s;
2343
+ }
2344
+ .m-chat-typing i:nth-of-type(3) {
2345
+ animation-delay: 0.3s;
2346
+ }
2347
+ .m-chat-suggestions {
2348
+ padding: 0 18px 14px;
2349
+ display: flex;
2350
+ flex-wrap: wrap;
2351
+ gap: 8px;
2352
+ background: var(--m-paper);
2353
+ }
2354
+ .m-chat-suggestions li {
2355
+ padding: 5px 12px;
2356
+ border: 1px solid var(--m-line);
2357
+ border-radius: var(--m-radius-full);
2358
+ color: var(--m-secondary);
2359
+ font-size: 13px;
2360
+ }
2361
+ .m-chat-composer {
2362
+ display: flex;
2363
+ align-items: center;
2364
+ gap: 10px;
2365
+ padding: 12px 14px 12px 18px;
2366
+ border-top: 1px solid var(--m-line);
2367
+ color: var(--m-muted);
2368
+ font-size: 14px;
2369
+ }
2370
+ .m-chat-composer > span:first-child {
2371
+ flex: 1;
2372
+ }
2373
+ .m-chat-send {
2374
+ width: 28px;
2375
+ height: 28px;
2376
+ border-radius: 50%;
2377
+ background: var(--m-primary);
2378
+ }
2379
+ .m-chat-log li[data-from="user"] {
2380
+ justify-content: flex-end;
2381
+ }
2382
+ [data-from="user"] .m-chat-bubble {
2383
+ border-radius: var(--m-radius-xl) var(--m-radius-xl) var(--m-radius-sm)
2384
+ var(--m-radius-xl);
2385
+ background: var(--m-primary);
2386
+ color: var(--m-on-primary);
2387
+ }
2388
+ }
2389
+ @keyframes m-chat-dot {
2390
+ 0%,
2391
+ 80%,
2392
+ 100% {
2393
+ opacity: 0.3;
2394
+ transform: translateY(0);
2395
+ }
2396
+ 40% {
2397
+ opacity: 1;
2398
+ transform: translateY(-3px);
2399
+ }
2400
+ }