@tonycodes-ui/mortar 0.0.0-stage → 0.12.0

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