@crvouga/atlas 0.10.2 → 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 (99) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +7 -0
  3. package/dist/server/src/settings-page.d.ts +4 -4
  4. package/dist/server/src/settings-page.js +17 -78
  5. package/docs/reference/server.md +4 -4
  6. package/docs/ui.md +142 -0
  7. package/docs/workspaces.md +130 -0
  8. package/llms-full.txt +278 -0
  9. package/llms.txt +2 -0
  10. package/package.json +17 -10
  11. package/packages/visualizer/src/admin/SettingsPage.tsx +456 -0
  12. package/packages/visualizer/src/admin/main.tsx +11 -0
  13. package/packages/visualizer/src/app/AppShell.tsx +62 -38
  14. package/packages/visualizer/src/app/gazetteer.tsx +90 -83
  15. package/packages/visualizer/src/app/router.tsx +33 -15
  16. package/packages/visualizer/src/components/ActivityIndicator.tsx +4 -5
  17. package/packages/visualizer/src/components/DataIssues.tsx +36 -54
  18. package/packages/visualizer/src/components/Header.tsx +197 -125
  19. package/packages/visualizer/src/components/Legend.tsx +13 -41
  20. package/packages/visualizer/src/components/ProjectPicker.tsx +61 -26
  21. package/packages/visualizer/src/components/Screen.tsx +80 -71
  22. package/packages/visualizer/src/components/SpecLogo.tsx +15 -0
  23. package/packages/visualizer/src/components/Status.tsx +20 -34
  24. package/packages/visualizer/src/components/labels.tsx +8 -3
  25. package/packages/visualizer/src/components/spec-logos/APACHE-2.0.txt +206 -0
  26. package/packages/visualizer/src/components/spec-logos/CAMUNDA-MIT.txt +21 -0
  27. package/packages/visualizer/src/components/spec-logos/FILE-ICONS-ISC.txt +13 -0
  28. package/packages/visualizer/src/components/spec-logos/README.md +23 -0
  29. package/packages/visualizer/src/components/spec-logos/SIMPLE-ICONS-CC0.txt +30 -0
  30. package/packages/visualizer/src/components/spec-logos/alloy.svg +1 -0
  31. package/packages/visualizer/src/components/spec-logos/dmn.svg +3 -0
  32. package/packages/visualizer/src/components/spec-logos/gherkin.svg +1 -0
  33. package/packages/visualizer/src/components/spec-logos/openslo.svg +63 -0
  34. package/packages/visualizer/src/components/spec-logos/quint.svg +1 -0
  35. package/packages/visualizer/src/evidence/artifacts.tsx +263 -110
  36. package/packages/visualizer/src/evidence/chart-source.tsx +18 -0
  37. package/packages/visualizer/src/evidence/check-detail.tsx +283 -139
  38. package/packages/visualizer/src/evidence/decision-table.tsx +35 -26
  39. package/packages/visualizer/src/evidence/document-page.tsx +51 -29
  40. package/packages/visualizer/src/evidence/feature-page.tsx +121 -53
  41. package/packages/visualizer/src/evidence/marks.tsx +112 -79
  42. package/packages/visualizer/src/evidence/model-page.tsx +77 -46
  43. package/packages/visualizer/src/evidence/model-trace.tsx +55 -35
  44. package/packages/visualizer/src/evidence/overview.tsx +137 -69
  45. package/packages/visualizer/src/evidence/recording-page.tsx +70 -31
  46. package/packages/visualizer/src/evidence/recording.tsx +135 -68
  47. package/packages/visualizer/src/evidence/snapshot.tsx +99 -43
  48. package/packages/visualizer/src/evidence/source-text.tsx +33 -0
  49. package/packages/visualizer/src/evidence/sources-panel.tsx +138 -144
  50. package/packages/visualizer/src/evidence/spec-header.tsx +52 -36
  51. package/packages/visualizer/src/evidence/spec-index.tsx +61 -32
  52. package/packages/visualizer/src/evidence/spec-page.tsx +56 -25
  53. package/packages/visualizer/src/evidence/test-filter.tsx +38 -14
  54. package/packages/visualizer/src/explorer/Explorer.tsx +688 -261
  55. package/packages/visualizer/src/explorer/ExplorerIndex.tsx +136 -68
  56. package/packages/visualizer/src/explorer/RunsView.tsx +307 -94
  57. package/packages/visualizer/src/explorer/TestDetail.tsx +393 -118
  58. package/packages/visualizer/src/explorer/parts.tsx +35 -13
  59. package/packages/visualizer/src/find/Finder.tsx +106 -90
  60. package/packages/visualizer/src/find/open.ts +17 -20
  61. package/packages/visualizer/src/live/test-progress.tsx +60 -22
  62. package/packages/visualizer/src/looks/Stage.tsx +223 -110
  63. package/packages/visualizer/src/main.tsx +9 -11
  64. package/packages/visualizer/src/map/ChartMap.tsx +125 -69
  65. package/packages/visualizer/src/map/EventEdge.tsx +59 -37
  66. package/packages/visualizer/src/map/map.module.css +12 -546
  67. package/packages/visualizer/src/map/nodes.tsx +124 -70
  68. package/packages/visualizer/src/reachable.test.ts +3 -2
  69. package/packages/visualizer/src/spec-kind.ts +2 -2
  70. package/packages/visualizer/src/ui/grammars/ALLOY-MIT.txt +21 -0
  71. package/packages/visualizer/src/ui/grammars/QUINT-APACHE-2.0.txt +206 -0
  72. package/packages/visualizer/src/ui/grammars/README.md +14 -0
  73. package/packages/visualizer/src/ui/grammars/alloy.json +71 -0
  74. package/packages/visualizer/src/ui/grammars/quint.json +152 -0
  75. package/packages/visualizer/src/ui/highlight.ts +50 -0
  76. package/packages/visualizer/src/ui/theme.tsx +109 -0
  77. package/packages/visualizer/src/views/ChartPage.tsx +46 -26
  78. package/packages/visualizer/src/views/ChartTests.tsx +59 -22
  79. package/packages/visualizer/src/views/ProductPage.tsx +16 -15
  80. package/packages/visualizer/src/views/SidePanel.tsx +241 -131
  81. package/packages/visualizer/src/app/gazetteer.module.css +0 -107
  82. package/packages/visualizer/src/components/ActivityIndicator.module.css +0 -4
  83. package/packages/visualizer/src/components/DataIssues.module.css +0 -136
  84. package/packages/visualizer/src/components/Header.module.css +0 -114
  85. package/packages/visualizer/src/components/Legend.module.css +0 -84
  86. package/packages/visualizer/src/components/Screen.module.css +0 -312
  87. package/packages/visualizer/src/components/Status.module.css +0 -116
  88. package/packages/visualizer/src/components/icons.tsx +0 -156
  89. package/packages/visualizer/src/evidence/artifacts.module.css +0 -213
  90. package/packages/visualizer/src/evidence/evidence.module.css +0 -907
  91. package/packages/visualizer/src/evidence/recording.module.css +0 -460
  92. package/packages/visualizer/src/evidence/sources.module.css +0 -168
  93. package/packages/visualizer/src/evidence/spec-snapshot.tsx +0 -26
  94. package/packages/visualizer/src/explorer/explorer.module.css +0 -1238
  95. package/packages/visualizer/src/find/Finder.module.css +0 -168
  96. package/packages/visualizer/src/looks/stage.module.css +0 -300
  97. package/packages/visualizer/src/styles/global.css +0 -105
  98. package/packages/visualizer/src/styles/tokens.css +0 -80
  99. package/packages/visualizer/src/views/views.module.css +0 -546
@@ -1,168 +0,0 @@
1
- .overlay {
2
- position: fixed;
3
- inset: 0;
4
- z-index: 40;
5
- background: rgba(15, 20, 25, 0.28);
6
- }
7
-
8
- .content {
9
- position: fixed;
10
- z-index: 41;
11
- top: 12vh;
12
- left: 50%;
13
- width: min(40rem, calc(100vw - 1.5rem));
14
- transform: translateX(-50%);
15
- border: 1px solid var(--line);
16
- border-radius: var(--radius-lg);
17
- background: var(--bg);
18
- box-shadow: var(--shadow-pop);
19
- overflow: hidden;
20
- }
21
-
22
- .command {
23
- display: flex;
24
- flex-direction: column;
25
- max-height: min(32rem, 70vh);
26
- }
27
-
28
- .input {
29
- width: 100%;
30
- height: 3.25rem;
31
- padding: 0 1rem;
32
- border: 0;
33
- border-bottom: 1px solid var(--line);
34
- background: transparent;
35
- font-size: 1rem;
36
- }
37
-
38
- .input:focus {
39
- outline: none;
40
- }
41
-
42
- .list {
43
- min-height: 0;
44
- overflow: auto;
45
- padding: 0.35rem;
46
- }
47
-
48
- .empty {
49
- margin: 0;
50
- padding: 1.25rem 0.75rem;
51
- color: var(--ink-3);
52
- }
53
-
54
- .item {
55
- display: flex;
56
- align-items: center;
57
- gap: 0.65rem;
58
- width: 100%;
59
- padding: 0.45rem 0.6rem;
60
- border-radius: var(--radius-sm);
61
- cursor: pointer;
62
- }
63
-
64
- .item[data-selected='true'] {
65
- background: var(--place-soft);
66
- }
67
-
68
- .text {
69
- display: flex;
70
- flex-direction: column;
71
- min-width: 0;
72
- flex: 1;
73
- }
74
-
75
- .title {
76
- overflow: hidden;
77
- color: var(--ink);
78
- font-weight: 600;
79
- text-overflow: ellipsis;
80
- white-space: nowrap;
81
- }
82
-
83
- .snippet {
84
- overflow: hidden;
85
- color: var(--ink-3);
86
- font-size: 0.8125rem;
87
- text-overflow: ellipsis;
88
- white-space: nowrap;
89
- }
90
-
91
- .meta {
92
- display: flex;
93
- align-items: center;
94
- gap: 0.5rem;
95
- flex: none;
96
- max-width: 45%;
97
- color: var(--ink-3);
98
- font-size: 0.75rem;
99
- }
100
-
101
- .subtitle {
102
- overflow: hidden;
103
- text-overflow: ellipsis;
104
- white-space: nowrap;
105
- }
106
-
107
- .kind {
108
- flex: none;
109
- font-weight: 600;
110
- }
111
-
112
- .footer {
113
- display: flex;
114
- gap: 1rem;
115
- padding: 0.45rem 0.9rem;
116
- border-top: 1px solid var(--line);
117
- color: var(--ink-3);
118
- font-size: 0.75rem;
119
- }
120
-
121
- .help {
122
- position: fixed;
123
- z-index: 42;
124
- top: 18vh;
125
- left: 50%;
126
- width: min(26rem, calc(100vw - 1.5rem));
127
- transform: translateX(-50%);
128
- padding: 1.25rem 1.35rem 1rem;
129
- border: 1px solid var(--line);
130
- border-radius: var(--radius-lg);
131
- background: var(--bg);
132
- box-shadow: var(--shadow-pop);
133
- }
134
-
135
- .help h2 {
136
- margin: 0 0 0.75rem;
137
- font-size: 1rem;
138
- }
139
-
140
- .help ul {
141
- margin: 0;
142
- padding: 0;
143
- list-style: none;
144
- }
145
-
146
- .help li {
147
- display: flex;
148
- justify-content: space-between;
149
- gap: 1rem;
150
- padding: 0.35rem 0;
151
- border-top: 1px solid var(--line);
152
- }
153
-
154
- .help kbd {
155
- color: var(--ink);
156
- font-family: var(--font);
157
- font-weight: 600;
158
- }
159
-
160
- .help button {
161
- margin-top: 0.85rem;
162
- padding: 0.35rem 0.8rem;
163
- border: 1px solid var(--line-2);
164
- border-radius: var(--pill);
165
- background: var(--bg);
166
- font-weight: 600;
167
- cursor: pointer;
168
- }
@@ -1,300 +0,0 @@
1
- .stage {
2
- --look-h: min(58vh, 620px);
3
- display: grid;
4
- gap: 12px;
5
- min-width: 0;
6
- margin: 4px 0 8px;
7
- }
8
-
9
- .modes {
10
- display: flex;
11
- gap: 4px;
12
- border-bottom: 1px solid var(--line);
13
- }
14
-
15
- .modes button {
16
- padding: 8px 12px;
17
- border: 0;
18
- background: none;
19
- color: var(--ink-3);
20
- font-size: 0.875rem;
21
- font-weight: 500;
22
- cursor: pointer;
23
- }
24
-
25
- .modes button[aria-selected='true'] {
26
- color: var(--ink);
27
- font-weight: 600;
28
- box-shadow: inset 0 -2px 0 var(--place);
29
- }
30
-
31
- .viewport {
32
- display: grid;
33
- justify-items: center;
34
- align-content: start;
35
- gap: 10px;
36
- min-height: 12rem;
37
- padding: 16px;
38
- border: 1px solid var(--line);
39
- border-radius: 16px;
40
- background:
41
- linear-gradient(180deg, var(--bg-2) 0%, var(--bg) 100%);
42
- }
43
-
44
- .viewport:has(.moment) {
45
- min-height: 0;
46
- padding: 28px 20px;
47
- }
48
-
49
- .shot,
50
- .film {
51
- display: block;
52
- max-width: 100%;
53
- max-height: var(--look-h);
54
- object-fit: contain;
55
- border-radius: 12px;
56
- background: #fff;
57
- box-shadow: var(--shadow-raised);
58
- }
59
-
60
- .film {
61
- /* Phone clips stay phone-shaped. A wide clip uses the width of the plate. --ar is width / height, set once the file is known. */
62
- --ar: 0.462;
63
- width: min(100%, calc(var(--look-h) * var(--ar)));
64
- height: auto;
65
- background: #0e1216;
66
- }
67
-
68
- .shotFrame {
69
- position: relative;
70
- display: inline-block;
71
- max-width: 100%;
72
- line-height: 0;
73
- }
74
-
75
- .mark {
76
- position: absolute;
77
- width: 28px;
78
- height: 28px;
79
- margin: -14px 0 0 -14px;
80
- border: 2px solid #fff;
81
- border-radius: 50%;
82
- background: color-mix(in srgb, var(--place) 72%, transparent);
83
- box-shadow:
84
- 0 0 0 7px color-mix(in srgb, var(--place) 28%, transparent),
85
- var(--shadow-raised);
86
- pointer-events: none;
87
- }
88
-
89
- .caption {
90
- margin: 0;
91
- color: var(--ink-2);
92
- font-size: 0.8125rem;
93
- text-align: center;
94
- }
95
-
96
- .caption[data-status='failed'] {
97
- color: var(--failed-ink);
98
- font-weight: 600;
99
- }
100
-
101
- .moment {
102
- width: min(100%, 36rem);
103
- margin: 0;
104
- padding: 20px 22px;
105
- border-radius: 12px;
106
- background: var(--bg);
107
- box-shadow: var(--shadow-raised);
108
- }
109
-
110
- .moment p {
111
- margin: 0 0 6px;
112
- color: var(--ink-3);
113
- font-size: 0.75rem;
114
- font-weight: 600;
115
- letter-spacing: 0.02em;
116
- text-transform: uppercase;
117
- }
118
-
119
- .moment h3 {
120
- margin: 0;
121
- font-size: 1.25rem;
122
- font-weight: 650;
123
- letter-spacing: -0.01em;
124
- line-height: 1.3;
125
- }
126
-
127
- .story {
128
- display: grid;
129
- justify-items: center;
130
- gap: 10px;
131
- width: 100%;
132
- margin: 0;
133
- }
134
-
135
- .storyCaption {
136
- display: grid;
137
- justify-items: center;
138
- gap: 2px;
139
- margin: 0;
140
- text-align: center;
141
- }
142
-
143
- .storyCaption span {
144
- color: var(--ink-3);
145
- font-size: 0.75rem;
146
- font-weight: 600;
147
- letter-spacing: 0.04em;
148
- text-transform: uppercase;
149
- }
150
-
151
- .storyCaption strong {
152
- color: var(--ink);
153
- font-size: 1rem;
154
- font-weight: 650;
155
- letter-spacing: -0.01em;
156
- }
157
-
158
- .storyCaption[data-status='failed'] strong {
159
- color: var(--failed-ink);
160
- }
161
-
162
- .moment[data-status='failed'] h3 {
163
- color: var(--failed-ink);
164
- }
165
-
166
- .body {
167
- width: 100%;
168
- min-width: 0;
169
- }
170
-
171
- .transport {
172
- display: flex;
173
- flex-wrap: wrap;
174
- align-items: center;
175
- gap: 8px;
176
- }
177
-
178
- .control {
179
- display: inline-flex;
180
- align-items: center;
181
- justify-content: center;
182
- height: 2rem;
183
- padding: 0 12px;
184
- border: 1px solid var(--line-2);
185
- border-radius: var(--pill);
186
- background: var(--bg);
187
- color: var(--ink);
188
- font-size: 0.8125rem;
189
- font-weight: 600;
190
- cursor: pointer;
191
- }
192
-
193
- .stepper {
194
- width: 2rem;
195
- padding: 0;
196
- }
197
-
198
- .back {
199
- transform: rotate(180deg);
200
- }
201
-
202
- .control:hover:enabled {
203
- background: var(--bg-2);
204
- }
205
-
206
- .control:disabled {
207
- opacity: 0.45;
208
- cursor: default;
209
- }
210
-
211
- .scrub {
212
- flex: 1;
213
- min-width: 8rem;
214
- accent-color: var(--place);
215
- }
216
-
217
- .position {
218
- color: var(--ink-3);
219
- font-size: 0.8125rem;
220
- white-space: nowrap;
221
- font-variant-numeric: tabular-nums;
222
- }
223
-
224
- .strip,
225
- .chapters {
226
- display: flex;
227
- gap: 8px;
228
- margin: 0;
229
- padding: 2px;
230
- overflow-x: auto;
231
- list-style: none;
232
- scroll-snap-type: x mandatory;
233
- }
234
-
235
- .strip button,
236
- .chapters button {
237
- flex: none;
238
- padding: 0;
239
- border: 2px solid transparent;
240
- border-radius: 10px;
241
- background: var(--bg);
242
- cursor: pointer;
243
- scroll-snap-align: start;
244
- }
245
-
246
- .strip button {
247
- width: 76px;
248
- overflow: hidden;
249
- }
250
-
251
- .strip button[aria-current='true'],
252
- .chapters button[aria-current='true'] {
253
- border-color: var(--place);
254
- }
255
-
256
- .strip img {
257
- display: block;
258
- width: 100%;
259
- height: 96px;
260
- object-fit: contain;
261
- background: var(--bg-2);
262
- }
263
-
264
- .chip {
265
- display: block;
266
- height: 64px;
267
- padding: 8px;
268
- overflow: hidden;
269
- color: var(--ink-2);
270
- font-size: 0.6875rem;
271
- font-weight: 600;
272
- line-height: 1.3;
273
- text-align: left;
274
- }
275
-
276
- .chapters button {
277
- max-width: 16rem;
278
- padding: 6px 10px;
279
- border-width: 1px;
280
- border-color: var(--line-2);
281
- border-radius: var(--pill);
282
- color: var(--ink-2);
283
- font-size: 0.75rem;
284
- text-align: left;
285
- }
286
-
287
- .chapters button:hover {
288
- background: var(--bg-2);
289
- }
290
-
291
- .notice,
292
- .quiet {
293
- margin: 0;
294
- color: var(--ink-3);
295
- font-size: 0.8125rem;
296
- }
297
-
298
- .empty {
299
- width: min(100%, 20rem);
300
- }
@@ -1,105 +0,0 @@
1
- @import './tokens.css';
2
-
3
- * {
4
- box-sizing: border-box;
5
- }
6
-
7
- html,
8
- body,
9
- #root {
10
- height: 100%;
11
- }
12
-
13
- @media (max-width: 760px) {
14
- html,
15
- body,
16
- #root {
17
- height: auto;
18
- min-height: 100%;
19
- }
20
- }
21
-
22
- body {
23
- margin: 0;
24
- font-family: var(--font);
25
- color: var(--ink);
26
- background: var(--bg);
27
- font-size: 0.9375rem;
28
- line-height: 1.45;
29
- -webkit-font-smoothing: antialiased;
30
- }
31
-
32
- a {
33
- color: var(--place);
34
- }
35
-
36
- ::selection {
37
- background: var(--place-soft);
38
- }
39
-
40
- input,
41
- textarea {
42
- caret-color: var(--place);
43
- }
44
-
45
- button,
46
- input,
47
- select {
48
- font: inherit;
49
- color: inherit;
50
- }
51
-
52
- :focus-visible {
53
- outline: 2px solid var(--focus);
54
- outline-offset: 2px;
55
- border-radius: 0.375rem;
56
- }
57
-
58
- code,
59
- pre {
60
- font-family: var(--mono);
61
- font-size: 0.8rem;
62
- }
63
-
64
- .sr-only {
65
- position: absolute;
66
- width: 1px;
67
- height: 1px;
68
- padding: 0;
69
- margin: -1px;
70
- overflow: hidden;
71
- clip: rect(0, 0, 0, 0);
72
- white-space: nowrap;
73
- border: 0;
74
- }
75
-
76
- .react-flow__attribution {
77
- font-size: 9px;
78
- opacity: 0.6;
79
- background: transparent;
80
- }
81
-
82
- .react-flow__node:focus-visible {
83
- outline: none;
84
- }
85
-
86
- .react-flow__node:focus-visible > * {
87
- outline: 3px solid var(--focus);
88
- outline-offset: 3px;
89
- }
90
-
91
- .react-flow__minimap {
92
- border-radius: var(--radius);
93
- border: 1px solid var(--line);
94
- overflow: hidden;
95
- box-shadow: var(--shadow-card);
96
- }
97
-
98
- @media (prefers-reduced-motion: reduce) {
99
- *,
100
- *::before,
101
- *::after {
102
- transition: none !important;
103
- animation: none !important;
104
- }
105
- }
@@ -1,80 +0,0 @@
1
- :root {
2
- /* Neutral surfaces and text. One blue marks what is chosen or can be followed. */
3
- --ink: #0f1419;
4
- --ink-2: #2f3336;
5
- --ink-3: #536471;
6
- --muted: #536471;
7
- --faint: #8b98a5;
8
- --line: #eff3f4;
9
- --line-2: #cfd9de;
10
- --bg: #ffffff;
11
- --bg-2: #f7f9f9;
12
- --card: #ffffff;
13
- --place: #0b63ce;
14
- --place-soft: #e8f1fd;
15
-
16
- /* Who caused an event on the map. The person is the accent; everything else is gray. */
17
- --user: #0b63ce;
18
- --user-ink: #0a4fa6;
19
- --user-soft: #e8f1fd;
20
- --user-line: #b9d4f7;
21
- --user-deep: #0a4fa6;
22
- --user-ring: #d3e4fb;
23
-
24
- --system: #536471;
25
- --system-ink: #2f3336;
26
- --system-soft: #f7f9f9;
27
- --system-line: #cfd9de;
28
- --system-wash: rgba(247, 249, 249, 0.97);
29
-
30
- --time: #536471;
31
- --time-ink: #2f3336;
32
- --time-soft: #eff3f4;
33
- --time-line: #cfd9de;
34
-
35
- --handoff: #2f3336;
36
- --handoff-ink: #0f1419;
37
- --handoff-soft: #eff3f4;
38
- --handoff-line: #cfd9de;
39
-
40
- --passed: #1a7f37;
41
- --passed-ink: #116329;
42
- --passed-soft: #e6f4ea;
43
- --passed-line: #b4dcc0;
44
- --failed: #cf222e;
45
- --failed-ink: #a40e26;
46
- --failed-soft: #ffebe9;
47
- --failed-line: #f7b9b5;
48
- --flaky: #9a6700;
49
- --flaky-ink: #7d4e00;
50
- --flaky-soft: #fff8c5;
51
- --not-reached: #cfd9de;
52
- --unrun: #eff3f4;
53
-
54
- --radius-sm: 0.5rem;
55
- --radius: 0.75rem;
56
- --radius-lg: 1rem;
57
- --radius-xl: 1.25rem;
58
- --pill: 999px;
59
-
60
- --shadow-card: 0 1px 2px rgba(15, 20, 25, 0.06);
61
- --shadow-raised: 0 2px 8px rgba(15, 20, 25, 0.06);
62
- --shadow-sheet: 0 0 0 1px var(--line);
63
- --shadow-pop: 0 8px 28px rgba(15, 20, 25, 0.14);
64
- --focus: #0b63ce;
65
-
66
- --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
67
- --mono: ui-monospace, SFMono-Regular, Menlo, monospace;
68
-
69
- --header-h: 3.25rem;
70
- --index-w: 20rem;
71
- --panel-w: min(30rem, 40vw);
72
- --ease: cubic-bezier(0.2, 0.7, 0.2, 1);
73
- --fade: 160ms;
74
- }
75
-
76
- @media (prefers-reduced-motion: reduce) {
77
- :root {
78
- --fade: 0ms;
79
- }
80
- }