@mailwoman/react 0.0.1 → 7.5.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 (143) hide show
  1. package/README.md +34 -4
  2. package/common/ClientOnly.tsx +30 -0
  3. package/common/CopyButton.tsx +44 -0
  4. package/common/KindBadge.tsx +44 -0
  5. package/common/LoadingIndicator.tsx +104 -0
  6. package/common/PresetChips.tsx +43 -0
  7. package/common/cx.ts +34 -0
  8. package/common/useClipboard.ts +73 -0
  9. package/common/useDebouncedValue.ts +23 -0
  10. package/index.ts +86 -4
  11. package/out/common/ClientOnly.d.ts +22 -0
  12. package/out/common/ClientOnly.d.ts.map +1 -0
  13. package/out/common/ClientOnly.js +20 -0
  14. package/out/common/ClientOnly.js.map +1 -0
  15. package/out/common/CopyButton.d.ts +21 -0
  16. package/out/common/CopyButton.d.ts.map +1 -0
  17. package/out/common/CopyButton.js +7 -0
  18. package/out/common/CopyButton.js.map +1 -0
  19. package/out/common/KindBadge.d.ts +24 -0
  20. package/out/common/KindBadge.d.ts.map +1 -0
  21. package/out/common/KindBadge.js +6 -0
  22. package/out/common/KindBadge.js.map +1 -0
  23. package/out/common/LoadingIndicator.d.ts +27 -0
  24. package/out/common/LoadingIndicator.d.ts.map +1 -0
  25. package/out/common/LoadingIndicator.js +41 -0
  26. package/out/common/LoadingIndicator.js.map +1 -0
  27. package/out/common/PresetChips.d.ts +22 -0
  28. package/out/common/PresetChips.d.ts.map +1 -0
  29. package/out/common/PresetChips.js +5 -0
  30. package/out/common/PresetChips.js.map +1 -0
  31. package/out/common/cx.d.ts +13 -0
  32. package/out/common/cx.d.ts.map +1 -0
  33. package/out/common/cx.js +28 -0
  34. package/out/common/cx.js.map +1 -0
  35. package/out/common/useClipboard.d.ts +16 -0
  36. package/out/common/useClipboard.d.ts.map +1 -0
  37. package/out/common/useClipboard.js +56 -0
  38. package/out/common/useClipboard.js.map +1 -0
  39. package/out/common/useDebouncedValue.d.ts +11 -0
  40. package/out/common/useDebouncedValue.d.ts.map +1 -0
  41. package/out/common/useDebouncedValue.js +19 -0
  42. package/out/common/useDebouncedValue.js.map +1 -0
  43. package/out/index.d.ts +57 -4
  44. package/out/index.d.ts.map +1 -1
  45. package/out/index.js +37 -4
  46. package/out/index.js.map +1 -1
  47. package/out/pipeline/CandidatePicker.d.ts +17 -0
  48. package/out/pipeline/CandidatePicker.d.ts.map +1 -0
  49. package/out/pipeline/CandidatePicker.js +6 -0
  50. package/out/pipeline/CandidatePicker.js.map +1 -0
  51. package/out/pipeline/ComponentTable.d.ts +14 -0
  52. package/out/pipeline/ComponentTable.d.ts.map +1 -0
  53. package/out/pipeline/ComponentTable.js +6 -0
  54. package/out/pipeline/ComponentTable.js.map +1 -0
  55. package/out/pipeline/ConfidenceCell.d.ts +13 -0
  56. package/out/pipeline/ConfidenceCell.d.ts.map +1 -0
  57. package/out/pipeline/ConfidenceCell.js +22 -0
  58. package/out/pipeline/ConfidenceCell.js.map +1 -0
  59. package/out/pipeline/PipelineExplorer.d.ts +25 -0
  60. package/out/pipeline/PipelineExplorer.d.ts.map +1 -0
  61. package/out/pipeline/PipelineExplorer.js +27 -0
  62. package/out/pipeline/PipelineExplorer.js.map +1 -0
  63. package/out/pipeline/QueryForm.d.ts +19 -0
  64. package/out/pipeline/QueryForm.d.ts.map +1 -0
  65. package/out/pipeline/QueryForm.js +9 -0
  66. package/out/pipeline/QueryForm.js.map +1 -0
  67. package/out/pipeline/ResolvedPlace.d.ts +16 -0
  68. package/out/pipeline/ResolvedPlace.d.ts.map +1 -0
  69. package/out/pipeline/ResolvedPlace.js +14 -0
  70. package/out/pipeline/ResolvedPlace.js.map +1 -0
  71. package/out/pipeline/copy.d.ts +11 -0
  72. package/out/pipeline/copy.d.ts.map +1 -0
  73. package/out/pipeline/copy.js +31 -0
  74. package/out/pipeline/copy.js.map +1 -0
  75. package/out/pipeline/presets.d.ts +12 -0
  76. package/out/pipeline/presets.d.ts.map +1 -0
  77. package/out/pipeline/presets.js +21 -0
  78. package/out/pipeline/presets.js.map +1 -0
  79. package/out/pipeline/types.d.ts +110 -0
  80. package/out/pipeline/types.d.ts.map +1 -0
  81. package/out/pipeline/types.js +12 -0
  82. package/out/pipeline/types.js.map +1 -0
  83. package/out/pipeline/useParsePipeline.d.ts +34 -0
  84. package/out/pipeline/useParsePipeline.d.ts.map +1 -0
  85. package/out/pipeline/useParsePipeline.js +55 -0
  86. package/out/pipeline/useParsePipeline.js.map +1 -0
  87. package/out/poi/AbstainPanel.d.ts +14 -0
  88. package/out/poi/AbstainPanel.d.ts.map +1 -0
  89. package/out/poi/AbstainPanel.js +5 -0
  90. package/out/poi/AbstainPanel.js.map +1 -0
  91. package/out/poi/LiveResultsBlock.d.ts +21 -0
  92. package/out/poi/LiveResultsBlock.d.ts.map +1 -0
  93. package/out/poi/LiveResultsBlock.js +7 -0
  94. package/out/poi/LiveResultsBlock.js.map +1 -0
  95. package/out/poi/OverpassBlock.d.ts +15 -0
  96. package/out/poi/OverpassBlock.d.ts.map +1 -0
  97. package/out/poi/OverpassBlock.js +11 -0
  98. package/out/poi/OverpassBlock.js.map +1 -0
  99. package/out/poi/POIExplorer.d.ts +31 -0
  100. package/out/poi/POIExplorer.d.ts.map +1 -0
  101. package/out/poi/POIExplorer.js +43 -0
  102. package/out/poi/POIExplorer.js.map +1 -0
  103. package/out/poi/QueryInput.d.ts +17 -0
  104. package/out/poi/QueryInput.d.ts.map +1 -0
  105. package/out/poi/QueryInput.js +5 -0
  106. package/out/poi/QueryInput.js.map +1 -0
  107. package/out/poi/SubjectPanel.d.ts +16 -0
  108. package/out/poi/SubjectPanel.d.ts.map +1 -0
  109. package/out/poi/SubjectPanel.js +12 -0
  110. package/out/poi/SubjectPanel.js.map +1 -0
  111. package/out/poi/runtime.d.ts +43 -0
  112. package/out/poi/runtime.d.ts.map +1 -0
  113. package/out/poi/runtime.js +67 -0
  114. package/out/poi/runtime.js.map +1 -0
  115. package/out/poi/types.d.ts +113 -0
  116. package/out/poi/types.d.ts.map +1 -0
  117. package/out/poi/types.js +12 -0
  118. package/out/poi/types.js.map +1 -0
  119. package/out/poi/usePOISearch.d.ts +42 -0
  120. package/out/poi/usePOISearch.d.ts.map +1 -0
  121. package/out/poi/usePOISearch.js +158 -0
  122. package/out/poi/usePOISearch.js.map +1 -0
  123. package/package.json +52 -8
  124. package/pipeline/CandidatePicker.tsx +45 -0
  125. package/pipeline/ComponentTable.tsx +41 -0
  126. package/pipeline/ConfidenceCell.tsx +33 -0
  127. package/pipeline/PipelineExplorer.tsx +148 -0
  128. package/pipeline/QueryForm.tsx +52 -0
  129. package/pipeline/ResolvedPlace.tsx +50 -0
  130. package/pipeline/copy.ts +37 -0
  131. package/pipeline/presets.ts +24 -0
  132. package/pipeline/types.ts +118 -0
  133. package/pipeline/useParsePipeline.ts +84 -0
  134. package/poi/AbstainPanel.tsx +22 -0
  135. package/poi/LiveResultsBlock.tsx +70 -0
  136. package/poi/OverpassBlock.tsx +37 -0
  137. package/poi/POIExplorer.tsx +133 -0
  138. package/poi/QueryInput.tsx +26 -0
  139. package/poi/SubjectPanel.tsx +79 -0
  140. package/poi/runtime.ts +78 -0
  141. package/poi/types.ts +112 -0
  142. package/poi/usePOISearch.ts +234 -0
  143. package/styles.css +648 -0
package/styles.css ADDED
@@ -0,0 +1,648 @@
1
+ /* ---------------------------------------------------------------------------
2
+ * @mailwoman/react — component styles.
3
+ *
4
+ * Plain, `mw-`-prefixed classes ported from the docs-site CSS modules. Every
5
+ * Infima (`--ifm-*`) token carries an inline fallback, so the components render
6
+ * correctly BOTH inside Docusaurus (where the real theme tokens win) and
7
+ * standalone (Storybook, tests, any React app). No CSS module hashing — the
8
+ * class names are stable and namespaced, and no component imports this file, so
9
+ * the bare package import stays node-safe.
10
+ * --------------------------------------------------------------------------- */
11
+
12
+ .mw-poi-explorer,
13
+ .mw-pipeline-explorer {
14
+ max-width: 720px;
15
+ font-size: 0.95rem;
16
+ }
17
+
18
+ /* ── Field (label + input + button) ──────────────────────────────────────── */
19
+
20
+ .mw-field {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: 0.5rem;
24
+ }
25
+
26
+ .mw-field label {
27
+ font-weight: 600;
28
+ font-size: 0.9rem;
29
+ }
30
+
31
+ .mw-field input {
32
+ padding: 0.5rem 0.75rem;
33
+ font: inherit;
34
+ border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
35
+ border-radius: 6px;
36
+ background: var(--ifm-background-surface-color, #fff);
37
+ color: var(--ifm-font-color-base, inherit);
38
+ }
39
+
40
+ .mw-field input:disabled {
41
+ opacity: 0.5;
42
+ }
43
+
44
+ .mw-field button[type="submit"] {
45
+ padding: 0.5rem 0.75rem;
46
+ background: var(--ifm-color-primary, #e0367c);
47
+ color: #fff;
48
+ border: 0;
49
+ border-radius: 6px;
50
+ font-weight: 600;
51
+ cursor: pointer;
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: 0.4rem;
55
+ align-self: flex-start;
56
+ }
57
+
58
+ .mw-field button[type="submit"]:disabled {
59
+ background: var(--ifm-color-emphasis-400, #b3b3b3);
60
+ cursor: not-allowed;
61
+ }
62
+
63
+ /* ── Preset chips ────────────────────────────────────────────────────────── */
64
+
65
+ .mw-presets {
66
+ margin-top: 0.75rem;
67
+ display: flex;
68
+ flex-wrap: wrap;
69
+ gap: 0.4rem;
70
+ align-items: baseline;
71
+ }
72
+
73
+ .mw-presets__label {
74
+ font-size: 0.85rem;
75
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
76
+ margin-right: 0.25rem;
77
+ }
78
+
79
+ .mw-chip {
80
+ font-size: 0.8rem;
81
+ padding: 0.25rem 0.55rem;
82
+ background: var(--ifm-color-emphasis-100, #f5f6f7);
83
+ color: var(--ifm-color-emphasis-800, #303846);
84
+ border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
85
+ border-radius: 4px;
86
+ font-weight: 500;
87
+ cursor: pointer;
88
+ font-family: inherit;
89
+ }
90
+
91
+ .mw-chip:hover:not(:disabled) {
92
+ background: var(--ifm-color-emphasis-200, #ebedf0);
93
+ border-color: var(--ifm-color-primary, #e0367c);
94
+ }
95
+
96
+ .mw-chip:disabled {
97
+ opacity: 0.5;
98
+ cursor: not-allowed;
99
+ }
100
+
101
+ /* ── Generic button (copy / search) ──────────────────────────────────────── */
102
+
103
+ .mw-btn {
104
+ font-size: 0.8rem;
105
+ padding: 0.25rem 0.55rem;
106
+ background: var(--ifm-color-emphasis-100, #f5f6f7);
107
+ color: var(--ifm-color-emphasis-800, #303846);
108
+ border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
109
+ border-radius: 4px;
110
+ cursor: pointer;
111
+ font-family: inherit;
112
+ }
113
+
114
+ .mw-btn:hover:not(:disabled) {
115
+ background: var(--ifm-color-emphasis-200, #ebedf0);
116
+ }
117
+
118
+ .mw-btn:disabled {
119
+ opacity: 0.5;
120
+ cursor: not-allowed;
121
+ }
122
+
123
+ /* ── Result panel + errors ───────────────────────────────────────────────── */
124
+
125
+ .mw-result {
126
+ margin-top: 1.5rem;
127
+ }
128
+
129
+ .mw-result__header {
130
+ display: flex;
131
+ justify-content: space-between;
132
+ align-items: center;
133
+ margin-bottom: 0.75rem;
134
+ }
135
+
136
+ .mw-result__header h2 {
137
+ margin: 0;
138
+ font-size: 1.1rem;
139
+ }
140
+
141
+ .mw-panel__header {
142
+ display: flex;
143
+ justify-content: space-between;
144
+ align-items: center;
145
+ margin-bottom: 0.4rem;
146
+ }
147
+
148
+ .mw-panel__header h3 {
149
+ margin: 0;
150
+ font-size: 0.95rem;
151
+ }
152
+
153
+ .mw-muted {
154
+ font-style: italic;
155
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
156
+ }
157
+
158
+ .mw-error {
159
+ color: var(--ifm-color-danger, #d9364c);
160
+ font-family: var(--ifm-font-family-monospace, monospace);
161
+ white-space: pre-wrap;
162
+ }
163
+
164
+ /* ── KindBadge ───────────────────────────────────────────────────────────── */
165
+
166
+ .mw-kind {
167
+ margin-bottom: 0.5rem;
168
+ font-size: 0.9rem;
169
+ }
170
+
171
+ .mw-kind__summary {
172
+ cursor: pointer;
173
+ user-select: none;
174
+ }
175
+
176
+ .mw-kind__confidence {
177
+ opacity: 0.7;
178
+ }
179
+
180
+ .mw-kind__alternatives {
181
+ margin: 0.25rem 0 0 1rem;
182
+ padding: 0;
183
+ list-style: disc;
184
+ }
185
+
186
+ /* ── POI subject panel ───────────────────────────────────────────────────── */
187
+
188
+ .mw-subject__row {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 0.5rem;
192
+ margin-bottom: 0.5rem;
193
+ }
194
+
195
+ .mw-subject__chip {
196
+ display: inline-block;
197
+ padding: 0.2rem 0.6rem;
198
+ border-radius: 999px;
199
+ background: var(--ifm-color-primary-contrast-background, rgba(224, 54, 124, 0.12));
200
+ color: var(--ifm-color-primary, #e0367c);
201
+ font-weight: 600;
202
+ font-size: 0.85rem;
203
+ }
204
+
205
+ .mw-subject__badge {
206
+ display: inline-block;
207
+ padding: 0.2rem 0.5rem;
208
+ border-radius: 999px;
209
+ background: var(--ifm-color-warning-contrast-background, rgba(245, 158, 11, 0.15));
210
+ color: var(--ifm-color-warning-darkest, #92400e);
211
+ font-size: 0.75rem;
212
+ font-weight: 600;
213
+ text-transform: uppercase;
214
+ letter-spacing: 0.02em;
215
+ }
216
+
217
+ .mw-subject__badge--brand {
218
+ background: var(--ifm-color-info-contrast-background, rgba(84, 199, 236, 0.15));
219
+ color: var(--ifm-color-info-darkest, #14657d);
220
+ }
221
+
222
+ .mw-subject__qid {
223
+ display: inline-block;
224
+ padding: 0.2rem 0.5rem;
225
+ border-radius: 999px;
226
+ background: var(--ifm-color-emphasis-200, #ebedf0);
227
+ color: var(--ifm-color-emphasis-800, #303846);
228
+ font-family: var(--ifm-font-family-monospace, monospace);
229
+ font-size: 0.75rem;
230
+ font-weight: 600;
231
+ text-decoration: none;
232
+ }
233
+
234
+ .mw-subject__qid:hover {
235
+ text-decoration: underline;
236
+ }
237
+
238
+ .mw-subject__note {
239
+ margin: 0 0 0.75rem;
240
+ font-size: 0.85rem;
241
+ opacity: 0.8;
242
+ }
243
+
244
+ .mw-subject__detail {
245
+ display: grid;
246
+ grid-template-columns: auto 1fr;
247
+ gap: 0.25rem 0.75rem;
248
+ margin: 0 0 0.75rem;
249
+ font-size: 0.9rem;
250
+ }
251
+
252
+ .mw-subject__detail dt {
253
+ font-weight: 600;
254
+ color: var(--ifm-color-emphasis-700, #4a5163);
255
+ }
256
+
257
+ .mw-subject__detail dd {
258
+ margin: 0;
259
+ }
260
+
261
+ /* ── OverpassQL block ────────────────────────────────────────────────────── */
262
+
263
+ .mw-overpass {
264
+ margin-top: 0.75rem;
265
+ }
266
+
267
+ .mw-overpass__code {
268
+ margin: 0;
269
+ padding: 0.75rem;
270
+ border-radius: 6px;
271
+ background: var(--ifm-color-emphasis-100, #f5f6f7);
272
+ font-family: var(--ifm-font-family-monospace, monospace);
273
+ font-size: 0.85rem;
274
+ white-space: pre-wrap;
275
+ overflow-x: auto;
276
+ }
277
+
278
+ /* ── Live results ────────────────────────────────────────────────────────── */
279
+
280
+ .mw-live {
281
+ margin-top: 1rem;
282
+ }
283
+
284
+ .mw-live__caption {
285
+ margin: 0 0 0.4rem;
286
+ font-size: 0.85rem;
287
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
288
+ }
289
+
290
+ .mw-live__results {
291
+ list-style: none;
292
+ margin: 0;
293
+ padding: 0;
294
+ display: flex;
295
+ flex-direction: column;
296
+ gap: 0.35rem;
297
+ }
298
+
299
+ .mw-live__results li {
300
+ display: flex;
301
+ justify-content: space-between;
302
+ align-items: baseline;
303
+ gap: 0.75rem;
304
+ padding: 0.4rem 0.6rem;
305
+ border-radius: 6px;
306
+ background: var(--ifm-color-emphasis-100, #f5f6f7);
307
+ font-size: 0.9rem;
308
+ }
309
+
310
+ .mw-live__name {
311
+ font-weight: 600;
312
+ }
313
+
314
+ .mw-live__meta {
315
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
316
+ font-size: 0.8rem;
317
+ white-space: nowrap;
318
+ }
319
+
320
+ /* ── Component table ─────────────────────────────────────────────────────── */
321
+
322
+ .mw-components {
323
+ width: 100%;
324
+ border-collapse: collapse;
325
+ margin: 0.75rem 0;
326
+ font-size: 0.9rem;
327
+ }
328
+
329
+ .mw-components th,
330
+ .mw-components td {
331
+ padding: 0.4rem 0.6rem;
332
+ text-align: left;
333
+ border-bottom: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
334
+ }
335
+
336
+ .mw-components th {
337
+ font-weight: 600;
338
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
339
+ font-size: 0.8rem;
340
+ text-transform: uppercase;
341
+ }
342
+
343
+ /* ── Confidence cell ─────────────────────────────────────────────────────── */
344
+
345
+ .mw-conf__dash {
346
+ color: var(--ifm-color-emphasis-500, #8c8c8c);
347
+ }
348
+
349
+ .mw-conf {
350
+ display: flex;
351
+ align-items: center;
352
+ gap: 0.35rem;
353
+ min-width: 80px;
354
+ }
355
+
356
+ .mw-conf__bar {
357
+ height: 6px;
358
+ border-radius: 3px;
359
+ min-width: 4px;
360
+ transition: width 0.2s ease;
361
+ }
362
+
363
+ .mw-conf__bar--high {
364
+ background: #22c55e;
365
+ }
366
+
367
+ .mw-conf__bar--mid {
368
+ background: #f59e0b;
369
+ }
370
+
371
+ .mw-conf__bar--low {
372
+ background: #ef4444;
373
+ }
374
+
375
+ .mw-conf__value {
376
+ font-family: var(--ifm-font-family-monospace, monospace);
377
+ font-size: 0.8rem;
378
+ }
379
+
380
+ /* ── Resolved place ──────────────────────────────────────────────────────── */
381
+
382
+ .mw-resolved {
383
+ margin-top: 1rem;
384
+ padding: 0.75rem;
385
+ border: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
386
+ border-radius: 6px;
387
+ background: var(--ifm-color-emphasis-0, #fff);
388
+ }
389
+
390
+ .mw-resolved h2 {
391
+ margin: 0 0 0.5rem;
392
+ font-size: 1rem;
393
+ }
394
+
395
+ .mw-resolved dl {
396
+ display: grid;
397
+ grid-template-columns: auto 1fr;
398
+ gap: 0.25rem 0.75rem;
399
+ margin: 0;
400
+ }
401
+
402
+ .mw-resolved dt {
403
+ font-weight: 600;
404
+ color: var(--ifm-color-emphasis-700, #4a5163);
405
+ }
406
+
407
+ .mw-resolved dd {
408
+ margin: 0;
409
+ }
410
+
411
+ .mw-resolved__dual {
412
+ margin: 0.5rem 0 0;
413
+ padding: 0.4rem 0.6rem;
414
+ border-radius: 6px;
415
+ background: var(--ifm-color-info-contrast-background, rgba(54, 122, 246, 0.1));
416
+ font-size: 0.9rem;
417
+ }
418
+
419
+ /* ── Candidate picker ────────────────────────────────────────────────────── */
420
+
421
+ .mw-candidates {
422
+ margin-top: 1rem;
423
+ }
424
+
425
+ .mw-candidates h2 {
426
+ font-size: 1rem;
427
+ margin: 0 0 0.5rem;
428
+ }
429
+
430
+ .mw-candidates__list {
431
+ list-style: none;
432
+ margin: 0;
433
+ padding: 0;
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 0.35rem;
437
+ }
438
+
439
+ .mw-candidates__btn {
440
+ display: flex;
441
+ align-items: baseline;
442
+ gap: 0.6rem;
443
+ width: 100%;
444
+ text-align: left;
445
+ padding: 0.4rem 0.6rem;
446
+ border: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
447
+ border-radius: 6px;
448
+ background: transparent;
449
+ cursor: pointer;
450
+ font: inherit;
451
+ }
452
+
453
+ .mw-candidates__btn--active {
454
+ border-color: var(--ifm-color-primary, #e0367c);
455
+ background: var(--ifm-color-primary-contrast-background, rgba(224, 54, 124, 0.1));
456
+ }
457
+
458
+ .mw-candidates__rank {
459
+ font-family: var(--ifm-font-family-monospace, monospace);
460
+ font-size: 0.8rem;
461
+ opacity: 0.6;
462
+ }
463
+
464
+ .mw-candidates__name {
465
+ font-weight: 600;
466
+ }
467
+
468
+ .mw-candidates__meta {
469
+ margin-left: auto;
470
+ font-size: 0.8rem;
471
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
472
+ }
473
+
474
+ /* ── LoadingIndicator ────────────────────────────────────────────────────── */
475
+
476
+ .mw-loading {
477
+ display: flex;
478
+ flex-direction: column;
479
+ align-items: center;
480
+ justify-content: center;
481
+ gap: 0.75rem;
482
+ padding: 1.5rem;
483
+ }
484
+
485
+ .mw-loading__label {
486
+ font-size: 0.85rem;
487
+ color: var(--ifm-color-emphasis-600, #6e6e6e);
488
+ font-family: var(--ifm-font-family-monospace, monospace);
489
+ text-align: center;
490
+ }
491
+
492
+ .mw-pulse {
493
+ display: flex;
494
+ flex-direction: column;
495
+ gap: 0.5rem;
496
+ width: 100%;
497
+ max-width: 320px;
498
+ }
499
+
500
+ .mw-pulse__bar {
501
+ height: 0.75rem;
502
+ border-radius: 4px;
503
+ background: var(--ifm-color-emphasis-200, #ebedf0);
504
+ animation: mw-pulse-fade 1.4s ease-in-out infinite;
505
+ }
506
+
507
+ .mw-pulse__bar:nth-child(1) {
508
+ animation-delay: 0s;
509
+ }
510
+ .mw-pulse__bar:nth-child(2) {
511
+ animation-delay: 0.15s;
512
+ }
513
+ .mw-pulse__bar:nth-child(3) {
514
+ animation-delay: 0.3s;
515
+ }
516
+ .mw-pulse__bar:nth-child(4) {
517
+ animation-delay: 0.45s;
518
+ }
519
+ .mw-pulse__bar:nth-child(5) {
520
+ animation-delay: 0.6s;
521
+ }
522
+ .mw-pulse__bar:nth-child(odd) {
523
+ width: 100%;
524
+ }
525
+ .mw-pulse__bar:nth-child(even) {
526
+ width: 72%;
527
+ }
528
+
529
+ @keyframes mw-pulse-fade {
530
+ 0%,
531
+ 100% {
532
+ opacity: 0.35;
533
+ }
534
+ 50% {
535
+ opacity: 1;
536
+ }
537
+ }
538
+
539
+ .mw-spinner {
540
+ width: 2rem;
541
+ height: 2rem;
542
+ border: 3px solid var(--ifm-color-emphasis-200, #ebedf0);
543
+ border-top-color: var(--ifm-color-primary, #e0367c);
544
+ border-radius: 50%;
545
+ animation: mw-spin 0.7s linear infinite;
546
+ }
547
+
548
+ .mw-spinner--small {
549
+ width: 1.25rem;
550
+ height: 1.25rem;
551
+ border-width: 2px;
552
+ }
553
+
554
+ .mw-spinner--large {
555
+ width: 3rem;
556
+ height: 3rem;
557
+ border-width: 4px;
558
+ }
559
+
560
+ @keyframes mw-spin {
561
+ to {
562
+ transform: rotate(360deg);
563
+ }
564
+ }
565
+
566
+ .mw-staged {
567
+ display: flex;
568
+ flex-direction: column;
569
+ gap: 0.5rem;
570
+ width: 100%;
571
+ max-width: 360px;
572
+ list-style: none;
573
+ margin: 0;
574
+ padding: 0;
575
+ }
576
+
577
+ .mw-staged__step {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 0.6rem;
581
+ padding: 0.4rem 0.6rem;
582
+ border-radius: 4px;
583
+ font-size: 0.85rem;
584
+ transition:
585
+ background 0.3s,
586
+ color 0.3s;
587
+ }
588
+
589
+ .mw-staged__step--pending {
590
+ color: var(--ifm-color-emphasis-500, #8c8c8c);
591
+ }
592
+
593
+ .mw-staged__step--active {
594
+ color: var(--ifm-color-primary, #e0367c);
595
+ background: color-mix(in srgb, var(--ifm-color-primary, #e0367c) 8%, transparent);
596
+ font-weight: 600;
597
+ }
598
+
599
+ .mw-staged__step--complete {
600
+ color: var(--ifm-color-success, #1aa84d);
601
+ }
602
+
603
+ .mw-staged__icon {
604
+ display: flex;
605
+ align-items: center;
606
+ justify-content: center;
607
+ width: 1.25rem;
608
+ height: 1.25rem;
609
+ flex-shrink: 0;
610
+ }
611
+
612
+ .mw-staged__dot {
613
+ width: 0.55rem;
614
+ height: 0.55rem;
615
+ border-radius: 50%;
616
+ background: var(--ifm-color-primary, #e0367c);
617
+ animation: mw-pulse-dot 1s ease-in-out infinite;
618
+ }
619
+
620
+ @keyframes mw-pulse-dot {
621
+ 0%,
622
+ 100% {
623
+ opacity: 0.3;
624
+ transform: scale(0.8);
625
+ }
626
+ 50% {
627
+ opacity: 1;
628
+ transform: scale(1.2);
629
+ }
630
+ }
631
+
632
+ .mw-staged__check {
633
+ width: 1rem;
634
+ height: 1rem;
635
+ position: relative;
636
+ }
637
+
638
+ .mw-staged__check::before {
639
+ content: "";
640
+ position: absolute;
641
+ top: 50%;
642
+ left: 25%;
643
+ width: 0.35rem;
644
+ height: 0.65rem;
645
+ border: solid var(--ifm-color-success, #1aa84d);
646
+ border-width: 0 2px 2px 0;
647
+ transform: translateY(-60%) rotate(45deg);
648
+ }