@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
package/src/docs.css ADDED
@@ -0,0 +1,704 @@
1
+ /* Docs: shell, navigation, reference blocks and prose.
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
+ /* == DocsShell == */
9
+ /* Docs */
10
+ .m-docs-shell {
11
+ min-height: 100vh;
12
+ background: var(--m-paper);
13
+ }
14
+ .m-docs-header {
15
+ position: sticky;
16
+ top: 0;
17
+ z-index: var(--m-z-sticky);
18
+ display: flex;
19
+ align-items: center;
20
+ gap: 20px;
21
+ min-height: 56px;
22
+ padding: 0 20px;
23
+ border-bottom: 1px solid var(--m-line);
24
+ background: var(--m-paper);
25
+ }
26
+ .m-docs-header > .m-actions {
27
+ margin-left: auto;
28
+ }
29
+ .m-docs-version {
30
+ font: var(--m-weight-medium) 12px var(--m-mono);
31
+ }
32
+ .m-docs-sections {
33
+ display: flex;
34
+ gap: 20px;
35
+ font-size: 14px;
36
+ }
37
+ .m-docs-sections a {
38
+ color: var(--m-muted);
39
+ text-decoration: none;
40
+ }
41
+ .m-docs-body {
42
+ display: grid;
43
+ grid-template-columns: 240px minmax(0, 1fr) 210px;
44
+ max-width: 1440px;
45
+ margin: auto;
46
+ }
47
+ .m-docs-nav {
48
+ position: sticky;
49
+ top: 56px;
50
+ align-self: start;
51
+ max-height: calc(100vh - 56px);
52
+ overflow-y: auto;
53
+ padding: 20px 12px 32px;
54
+ border-right: 1px solid var(--m-line);
55
+ }
56
+ :is(.m-docs-nav, .m-mobile-sidebar) nav [role="group"] + [role="group"] {
57
+ margin-top: 20px;
58
+ }
59
+ :is(.m-docs-nav, .m-mobile-sidebar) nav .m-nav-group-title {
60
+ padding: 0 10px 6px;
61
+ font-size: 12px;
62
+ font-weight: var(--m-weight-semibold);
63
+ }
64
+ :is(.m-docs-nav, .m-mobile-sidebar) nav a {
65
+ display: block;
66
+ margin: 1px 0;
67
+ padding: 5px 10px;
68
+ border-radius: 6px;
69
+ font-size: var(--m-font-size);
70
+ color: var(--m-muted);
71
+ text-decoration: none;
72
+ }
73
+ .m-docs-body > main {
74
+ min-width: 0;
75
+ max-width: 760px;
76
+ padding: 40px 56px 48px;
77
+ }
78
+ .m-docs-toc {
79
+ position: sticky;
80
+ top: 56px;
81
+ align-self: start;
82
+ padding: 40px 20px 32px 0;
83
+ }
84
+ .m-docs-toc h2 {
85
+ margin-bottom: 10px;
86
+ font-size: 12px;
87
+ font-weight: var(--m-weight-semibold);
88
+ }
89
+ .m-docs-toc nav {
90
+ display: flex;
91
+ flex-direction: column;
92
+ }
93
+ .m-docs-toc nav a {
94
+ padding: 4px 0 4px 12px;
95
+ border-left: 1px solid var(--m-line);
96
+ font-size: 13px;
97
+ color: var(--m-muted);
98
+ text-decoration: none;
99
+ }
100
+ .m-docs-toc-footer {
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 8px;
104
+ margin-top: 24px;
105
+ padding-top: 16px;
106
+ border-top: 1px solid var(--m-line);
107
+ font-size: 13px;
108
+ }
109
+ .m-docs-toc-footer a {
110
+ color: var(--m-muted);
111
+ }
112
+ :is(.m-docs-nav, .m-mobile-sidebar) nav a,
113
+ :is(.m-docs-nav, .m-mobile-sidebar) .m-nav-group > summary {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 8px;
117
+ }
118
+ :is(.m-docs-nav, .m-mobile-sidebar) .m-nav-group > summary {
119
+ min-height: 0;
120
+ margin: 1px 0;
121
+ padding: 5px 10px;
122
+ border-radius: 6px;
123
+ color: var(--m-muted);
124
+ font-weight: var(--m-weight-regular);
125
+ }
126
+ .m-docs-sections a[aria-current="page"] {
127
+ color: var(--m-ink);
128
+ font-weight: var(--m-weight-semibold);
129
+ }
130
+ :is(.m-docs-nav, .m-mobile-sidebar) nav a:hover {
131
+ color: var(--m-ink);
132
+ }
133
+ :is(.m-docs-nav, .m-mobile-sidebar) nav a[aria-current="page"] {
134
+ background: var(--m-sunken);
135
+ color: var(--m-ink);
136
+ font-weight: var(--m-weight-semibold);
137
+ }
138
+ .m-docs-shell[data-layout="wide"] > .m-docs-header {
139
+ position: static;
140
+ }
141
+ .m-docs-shell[data-layout="wide"] > .m-docs-body {
142
+ max-width: none;
143
+ grid-template-columns: 240px minmax(0, 1fr);
144
+ }
145
+ .m-docs-shell[data-layout="wide"] > .m-docs-body > main {
146
+ max-width: none;
147
+ padding: 24px;
148
+ }
149
+ .m-docs-toc nav a[aria-current] {
150
+ border-left-color: var(--m-ink);
151
+ color: var(--m-ink);
152
+ font-weight: var(--m-weight-medium);
153
+ }
154
+ @media (max-width: 900px) {
155
+ .m-docs-shell[data-layout="wide"] > .m-docs-body {
156
+ grid-template-columns: minmax(0, 1fr);
157
+ }
158
+ }
159
+ @media (max-width: 1100px) {
160
+ .m-docs-body {
161
+ grid-template-columns: 220px minmax(0, 1fr);
162
+ }
163
+ .m-docs-toc {
164
+ display: none;
165
+ }
166
+ }
167
+ @media (max-width: 900px) {
168
+ .m-docs-header {
169
+ flex-wrap: wrap;
170
+ gap: 12px;
171
+ padding-block: 12px;
172
+ }
173
+ .m-docs-body {
174
+ grid-template-columns: minmax(0, 1fr);
175
+ }
176
+ .m-docs-nav,
177
+ .m-docs-sections {
178
+ display: none;
179
+ }
180
+ .m-docs-body > main {
181
+ padding: 32px 20px;
182
+ }
183
+ }
184
+
185
+ /* == SearchTrigger == */
186
+ .m-search-trigger {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: 8px;
190
+ width: 260px;
191
+ min-height: calc(var(--m-control) - 4px);
192
+ padding: 0 10px;
193
+ border: 1px solid var(--m-line);
194
+ border-radius: var(--m-radius);
195
+ background: var(--m-sunken);
196
+ color: var(--m-muted);
197
+ font-size: 13px;
198
+ cursor: pointer;
199
+ }
200
+ .m-search-trigger > span:first-child {
201
+ flex: 1;
202
+ text-align: left;
203
+ }
204
+ @media (max-width: 900px) {
205
+ .m-search-trigger {
206
+ width: auto;
207
+ }
208
+ }
209
+ @media (max-width: 560px) {
210
+ .m-search-trigger > span:first-child {
211
+ position: absolute;
212
+ width: 1px;
213
+ height: 1px;
214
+ overflow: hidden;
215
+ clip-path: inset(50%);
216
+ }
217
+ }
218
+
219
+ /* == Steps == */
220
+ .m-steps {
221
+ margin: 40px 0 0;
222
+ }
223
+ .m-steps li {
224
+ position: relative;
225
+ display: grid;
226
+ grid-template-columns: 28px minmax(0, 1fr);
227
+ gap: 16px;
228
+ padding-bottom: 32px;
229
+ }
230
+ .m-steps li:not(:last-child)::before {
231
+ content: "";
232
+ position: absolute;
233
+ left: 13.5px;
234
+ top: 34px;
235
+ bottom: 6px;
236
+ width: 1px;
237
+ background: var(--m-line);
238
+ }
239
+ /* The last step's marker is filled (ProcessSteps and ProgressSteps fill theirs the same way). */
240
+ .m-steps li:last-child .m-step-number {
241
+ border-color: var(--m-primary);
242
+ background: var(--m-primary);
243
+ color: var(--m-on-primary);
244
+ }
245
+ .m-step-number {
246
+ font-size: 13px;
247
+ --m-marker-size: 26px;
248
+ }
249
+ .m-steps :is(h2, h3, h4, h5, h6) {
250
+ margin: 0;
251
+ padding-top: 2px;
252
+ font-size: 17px;
253
+ font-weight: var(--m-weight-semibold);
254
+ letter-spacing: -0.01em;
255
+ }
256
+ .m-step-description {
257
+ margin: 6px 0 14px;
258
+ font-size: 15px;
259
+ color: var(--m-secondary);
260
+ }
261
+ /* Step markers (docs Steps, ProcessSteps, circle ProgressSteps): one circle sized by
262
+ --m-marker-size, and one filled state for the done or leading step. */
263
+ :where(
264
+ .m-step-number,
265
+ .m-process-number,
266
+ .m-progress-steps[data-variant="circles"] .m-progress-step-marker
267
+ ) {
268
+ display: grid;
269
+ place-items: center;
270
+ flex-shrink: 0;
271
+ width: var(--m-marker-size);
272
+ height: var(--m-marker-size);
273
+ border: var(--m-marker-border, 1px) solid var(--m-line-strong);
274
+ border-radius: 50%;
275
+ font-weight: var(--m-weight-semibold);
276
+ }
277
+
278
+ /* == Callout == */
279
+ .m-callout {
280
+ display: block;
281
+ padding: 12px 14px;
282
+ border: 1px solid var(--m-line);
283
+ border-radius: var(--m-radius);
284
+ font-size: 14px;
285
+ color: var(--m-secondary);
286
+ }
287
+ .m-callout > div {
288
+ display: inline;
289
+ }
290
+ .m-callout > strong {
291
+ color: var(--m-ink);
292
+ }
293
+ .m-callout:not([data-tone]) {
294
+ background: var(--m-sunken);
295
+ }
296
+ .m-callout[data-tone] {
297
+ border-color: var(--m-tone);
298
+ }
299
+ .m-callout[data-tone] > strong {
300
+ color: var(--m-tone);
301
+ }
302
+
303
+ /* == FileTree == */
304
+ .m-file-tree {
305
+ margin: 0;
306
+ padding: 12px 6px;
307
+ border: 1px solid var(--m-line);
308
+ border-radius: var(--m-radius);
309
+ font: 13px/1 var(--m-mono);
310
+ }
311
+ .m-file-tree ul ul {
312
+ padding-left: 18px;
313
+ }
314
+ .m-file-row {
315
+ display: flex;
316
+ align-items: center;
317
+ gap: 8px;
318
+ min-height: 28px;
319
+ padding: 0 10px;
320
+ border-radius: 6px;
321
+ color: var(--m-secondary);
322
+ }
323
+ .m-file-caret {
324
+ width: 12px;
325
+ font-size: 10px;
326
+ color: var(--m-muted);
327
+ }
328
+ .m-file-row small {
329
+ margin-left: auto;
330
+ font: 11px var(--m-brand-font, var(--m-font));
331
+ color: var(--m-muted);
332
+ }
333
+ [data-folder] > .m-file-row {
334
+ color: var(--m-ink);
335
+ font-weight: var(--m-weight-semibold);
336
+ }
337
+ [data-highlighted] > .m-file-row {
338
+ background: var(--m-selected);
339
+ color: var(--m-ink);
340
+ }
341
+
342
+ /* == CodeTabs == */
343
+ .m-code-tabs {
344
+ margin: 0;
345
+ min-width: 0;
346
+ border: 1px solid var(--m-code-line);
347
+ border-radius: 10px;
348
+ background: var(--m-code-bg);
349
+ color: var(--m-code-ink);
350
+ overflow: hidden;
351
+ }
352
+ .m-code-bar {
353
+ display: flex;
354
+ align-items: center;
355
+ gap: 8px;
356
+ min-height: 38px;
357
+ padding: 0 6px 0 8px;
358
+ border-bottom: 1px solid var(--m-code-line);
359
+ font: var(--m-weight-medium) 12px var(--m-mono);
360
+ color: var(--m-code-dim);
361
+ }
362
+ .m-code-bar figcaption {
363
+ flex: 1;
364
+ padding-left: 6px;
365
+ color: var(--m-code-ink);
366
+ }
367
+ .m-code-bar [role="tablist"] {
368
+ display: flex;
369
+ gap: 2px;
370
+ flex: 1;
371
+ }
372
+ .m-code-bar [role="tab"] {
373
+ padding: 4px 10px;
374
+ border-radius: 6px;
375
+ color: var(--m-code-dim);
376
+ font: inherit;
377
+ min-height: var(--m-touch-target);
378
+ }
379
+ .m-code-copy {
380
+ padding: 4px 8px;
381
+ border-radius: 6px;
382
+ color: var(--m-code-dim);
383
+ font: 12px var(--m-brand-font, var(--m-font));
384
+ min-height: var(--m-touch-target);
385
+ }
386
+ .m-code-tabs pre {
387
+ margin: 0;
388
+ padding: 16px 0;
389
+ overflow-x: auto;
390
+ font: 13px/1.7 var(--m-mono);
391
+ }
392
+ .m-code-line {
393
+ display: block;
394
+ padding: 0 18px;
395
+ }
396
+ .m-code-number {
397
+ display: inline-block;
398
+ width: 28px;
399
+ color: var(--m-code-dim);
400
+ user-select: none;
401
+ }
402
+ .m-code-prompt {
403
+ color: var(--m-code-dim);
404
+ user-select: none;
405
+ }
406
+ .m-code-bar [aria-selected="true"] {
407
+ background: var(--m-code-line);
408
+ color: var(--m-code-ink);
409
+ }
410
+ .m-code-copy:hover {
411
+ color: var(--m-code-ink);
412
+ }
413
+ .m-code-tabs :focus-visible {
414
+ outline-color: var(--m-code-ink);
415
+ }
416
+ .m-code-line[data-highlighted] {
417
+ background: var(--m-code-line);
418
+ box-shadow: inset 2px 0 0 var(--m-code-ink);
419
+ }
420
+
421
+ /* == Release == */
422
+ .m-release {
423
+ display: grid;
424
+ grid-template-columns: 110px minmax(0, 1fr);
425
+ gap: 20px;
426
+ padding: 24px 0;
427
+ border-bottom: 1px solid var(--m-line);
428
+ }
429
+ .m-release .m-release-version {
430
+ font: var(--m-weight-semibold) 14px var(--m-mono);
431
+ }
432
+ .m-release time {
433
+ font-size: 13px;
434
+ color: var(--m-muted);
435
+ }
436
+ .m-release > div {
437
+ display: grid;
438
+ gap: 14px;
439
+ }
440
+ .m-release .m-release-type {
441
+ margin: 0 0 4px;
442
+ font-size: 12px;
443
+ font-weight: var(--m-weight-semibold);
444
+ color: var(--m-muted);
445
+ }
446
+ .m-release ul {
447
+ margin: 0;
448
+ padding-left: 18px;
449
+ font-size: 14px;
450
+ color: var(--m-secondary);
451
+ }
452
+ .m-release [data-type="deprecated"] .m-release-type,
453
+ .m-release [data-type="removed"] .m-release-type {
454
+ color: var(--m-danger);
455
+ }
456
+
457
+ /* == ApiEndpoint == */
458
+ .m-api-endpoint {
459
+ display: grid;
460
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
461
+ border: 1px solid var(--m-line);
462
+ border-radius: var(--m-radius-lg);
463
+ overflow: hidden;
464
+ }
465
+ .m-api-text {
466
+ padding: 40px;
467
+ min-width: 0;
468
+ }
469
+ .m-api-route {
470
+ display: flex;
471
+ align-items: center;
472
+ gap: 10px;
473
+ font: var(--m-weight-medium) 13px var(--m-mono);
474
+ }
475
+ .m-api-text .m-api-title {
476
+ margin-top: 16px;
477
+ font-size: 32px;
478
+ font-weight: var(--m-weight-bold);
479
+ letter-spacing: -0.03em;
480
+ line-height: var(--m-leading-display);
481
+ }
482
+ .m-api-description {
483
+ margin-top: 10px;
484
+ font-size: 15px;
485
+ color: var(--m-secondary);
486
+ }
487
+ .m-api-text .m-api-params-title {
488
+ margin-top: 32px;
489
+ padding-bottom: 10px;
490
+ border-bottom: 1px solid var(--m-line);
491
+ font-size: 13px;
492
+ font-weight: var(--m-weight-semibold);
493
+ }
494
+ .m-param-list > div {
495
+ padding: 14px 0;
496
+ border-bottom: 1px solid var(--m-line);
497
+ }
498
+ .m-param-list dt {
499
+ display: flex;
500
+ align-items: baseline;
501
+ flex-wrap: wrap;
502
+ gap: 10px;
503
+ font: 12px var(--m-mono);
504
+ color: var(--m-muted);
505
+ }
506
+ .m-param-list dt code {
507
+ font-weight: var(--m-weight-semibold);
508
+ font-size: 13px;
509
+ color: var(--m-ink);
510
+ }
511
+ .m-param-list dt span:last-child {
512
+ font: var(--m-weight-semibold) 12px var(--m-brand-font, var(--m-font));
513
+ }
514
+ .m-param-list dd {
515
+ margin: 4px 0 0;
516
+ font-size: 14px;
517
+ color: var(--m-secondary);
518
+ }
519
+ .m-api-examples {
520
+ display: flex;
521
+ flex-direction: column;
522
+ gap: 16px;
523
+ min-width: 0;
524
+ padding: 40px;
525
+ background: var(--m-sunken);
526
+ border-left: 1px solid var(--m-line);
527
+ }
528
+ .m-api-route [data-method] {
529
+ padding: 2px 7px;
530
+ border-radius: 5px;
531
+ background: var(--m-primary);
532
+ color: var(--m-on-primary);
533
+ font-weight: var(--m-weight-semibold);
534
+ }
535
+ .m-api-route [data-method="DELETE"] {
536
+ background: var(--m-danger);
537
+ color: var(--m-on-feedback);
538
+ }
539
+ .m-param-list dt [data-required] {
540
+ color: var(--m-danger);
541
+ }
542
+ @media (max-width: 1100px) {
543
+ .m-api-endpoint {
544
+ grid-template-columns: minmax(0, 1fr);
545
+ }
546
+ .m-api-examples {
547
+ border-left: 0;
548
+ border-top: 1px solid var(--m-line);
549
+ }
550
+ }
551
+ @media (max-width: 560px) {
552
+ .m-api-text,
553
+ .m-api-examples {
554
+ padding: 24px 20px;
555
+ }
556
+ }
557
+
558
+ /* == PageFeedback == */
559
+ .m-page-feedback {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: space-between;
563
+ flex-wrap: wrap;
564
+ gap: 16px;
565
+ margin-top: 48px;
566
+ padding-top: 20px;
567
+ border-top: 1px solid var(--m-line);
568
+ font-size: 13px;
569
+ color: var(--m-muted);
570
+ }
571
+ .m-page-feedback [role="group"] {
572
+ display: flex;
573
+ align-items: center;
574
+ gap: 10px;
575
+ font-size: 14px;
576
+ }
577
+ .m-page-feedback button {
578
+ min-height: max(28px, var(--m-touch-target));
579
+ padding: 0 12px;
580
+ border: 1px solid var(--m-line);
581
+ border-radius: 7px;
582
+ background: transparent;
583
+ font-size: 13px;
584
+ font-weight: var(--m-weight-medium);
585
+ cursor: pointer;
586
+ }
587
+ .m-page-feedback [aria-pressed="true"] {
588
+ background: var(--m-primary);
589
+ border-color: var(--m-primary);
590
+ color: var(--m-on-primary);
591
+ }
592
+
593
+ /* == PagerLinks and LinkCards == */
594
+ .m-pager,
595
+ .m-link-cards {
596
+ display: grid;
597
+ grid-template-columns: repeat(2, minmax(0, 1fr));
598
+ gap: 12px;
599
+ margin-top: 20px;
600
+ }
601
+ :is(.m-pager, .m-link-cards) a {
602
+ display: block;
603
+ padding: 14px 16px;
604
+ border: 1px solid var(--m-line);
605
+ border-radius: 10px;
606
+ color: var(--m-ink);
607
+ text-decoration: none;
608
+ }
609
+ .m-pager small,
610
+ .m-link-cards a > span {
611
+ display: block;
612
+ color: var(--m-muted);
613
+ }
614
+ .m-pager small {
615
+ font-size: 12px;
616
+ }
617
+ .m-link-cards a > span {
618
+ font-size: 14px;
619
+ margin-top: 2px;
620
+ }
621
+ .m-pager a > span,
622
+ .m-link-cards strong {
623
+ font-weight: var(--m-weight-semibold);
624
+ }
625
+ :is(.m-pager, .m-link-cards) a:hover {
626
+ border-color: var(--m-ink);
627
+ }
628
+ .m-pager [data-next] {
629
+ text-align: right;
630
+ grid-column: 2;
631
+ }
632
+ @media (max-width: 560px) {
633
+ .m-pager,
634
+ .m-link-cards,
635
+ .m-release {
636
+ grid-template-columns: minmax(0, 1fr);
637
+ }
638
+ .m-pager [data-next] {
639
+ grid-column: auto;
640
+ }
641
+ }
642
+
643
+ /* == Prose == */
644
+ .m-prose {
645
+ --m-cell-pad-y: 10px;
646
+ --m-cell-pad-x: 14px;
647
+ font-size: 15px;
648
+ color: var(--m-secondary);
649
+ max-width: 68ch;
650
+ }
651
+ /* Prose styles stop at nested Mortar components: every component root carries
652
+ data-m-component, so a utility class such as m-4 does not opt out. */
653
+ .m-prose
654
+ :is(h2, h3):where(:not([data-m-component], .m-prose [data-m-component] *)) {
655
+ color: var(--m-ink);
656
+ letter-spacing: var(--m-tracking-heading);
657
+ margin: 1.6em 0 0.5em;
658
+ }
659
+ .m-prose h2:where(:not([data-m-component], .m-prose [data-m-component] *)) {
660
+ font-size: 24px;
661
+ font-weight: var(--m-weight-bold);
662
+ }
663
+ .m-prose h3:where(:not([data-m-component], .m-prose [data-m-component] *)) {
664
+ font-size: 17px;
665
+ font-weight: var(--m-weight-semibold);
666
+ }
667
+ .m-prose
668
+ :is(p, ul, ol):where(
669
+ :not([data-m-component], .m-prose [data-m-component] *)
670
+ ) {
671
+ margin: 0.75em 0;
672
+ }
673
+ .m-prose
674
+ li:where(:not([data-m-component], .m-prose [data-m-component] *))
675
+ + li {
676
+ margin-top: 4px;
677
+ }
678
+ .m-prose a:where(:not([data-m-component], .m-prose [data-m-component] *)) {
679
+ text-decoration: underline;
680
+ text-underline-offset: 3px;
681
+ text-decoration-color: var(--m-line-strong);
682
+ }
683
+ .m-prose
684
+ :not(pre)
685
+ > code:where(:not([data-m-component], .m-prose [data-m-component] *)) {
686
+ font: var(--m-weight-medium) 0.875em var(--m-mono);
687
+ padding: 1px 5px;
688
+ border: 1px solid var(--m-line);
689
+ border-radius: var(--m-radius-sm);
690
+ background: var(--m-sunken);
691
+ color: var(--m-ink);
692
+ }
693
+ .m-prose
694
+ strong:where(:not([data-m-component], .m-prose [data-m-component] *)) {
695
+ color: var(--m-ink);
696
+ }
697
+ .m-prose
698
+ table:where(:not([data-m-component], .m-prose [data-m-component] *)) {
699
+ display: block;
700
+ margin: 20px 0;
701
+ width: fit-content;
702
+ max-width: 100%;
703
+ }
704
+ }