@mailwoman/react 9.3.0 → 9.4.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 (159) hide show
  1. package/fonts.css +59 -0
  2. package/lib/common/About.tsx +89 -0
  3. package/lib/common/KindBadge.tsx +2 -7
  4. package/lib/common/confidence-tiers.ts +50 -0
  5. package/lib/common/text-tokens.ts +88 -0
  6. package/lib/index.ts +30 -28
  7. package/lib/map/CompareToggle.tsx +2 -2
  8. package/lib/map/{GeocoderDemo.tsx → Geocoder.tsx} +40 -40
  9. package/lib/map/{DemoControls.tsx → GeocoderControls.tsx} +16 -17
  10. package/lib/map/{DemoMap.tsx → MapCanvas.tsx} +15 -15
  11. package/lib/map/PlaceMarker.tsx +1 -1
  12. package/lib/map/ResolvedPlaceLayers.tsx +3 -3
  13. package/lib/map/ResultCamera.tsx +1 -1
  14. package/lib/map/ResultPanel.tsx +2 -2
  15. package/lib/map/VersionPicker.tsx +3 -3
  16. package/lib/map/fake-runtime.ts +122 -0
  17. package/lib/map/index.ts +16 -16
  18. package/lib/map/map-debug.ts +51 -0
  19. package/lib/map/place-render.ts +3 -2
  20. package/lib/map/types.ts +41 -39
  21. package/lib/map/{useDemoGeocode.ts → useGeocode.ts} +8 -8
  22. package/lib/pipeline/CandidatePicker.tsx +1 -1
  23. package/lib/pipeline/ComponentTable.tsx +1 -2
  24. package/lib/pipeline/ConfidenceCell.tsx +7 -19
  25. package/lib/pipeline/FailureDiagnostic.tsx +56 -0
  26. package/lib/pipeline/ResolvedPlace.tsx +17 -4
  27. package/lib/pipeline/SpanHighlight.tsx +97 -0
  28. package/lib/pipeline/TimingPanel.tsx +65 -0
  29. package/lib/pipeline/TreeView.tsx +55 -0
  30. package/lib/pipeline/copy.ts +1 -1
  31. package/lib/pipeline/types.ts +2 -75
  32. package/lib/pipeline/useParsePipeline.ts +2 -1
  33. package/lib/poi/types.ts +2 -1
  34. package/lib/runtime/{useDemoRuntime.ts → useReleaseRuntime.ts} +22 -24
  35. package/out/common/About.d.ts +12 -0
  36. package/out/common/About.d.ts.map +1 -0
  37. package/out/common/About.js +5 -0
  38. package/out/common/About.js.map +1 -0
  39. package/out/common/KindBadge.d.ts +2 -9
  40. package/out/common/KindBadge.d.ts.map +1 -1
  41. package/out/common/KindBadge.js.map +1 -1
  42. package/out/common/confidence-tiers.d.ts +36 -0
  43. package/out/common/confidence-tiers.d.ts.map +1 -0
  44. package/out/common/confidence-tiers.js +42 -0
  45. package/out/common/confidence-tiers.js.map +1 -0
  46. package/out/common/text-tokens.d.ts +46 -0
  47. package/out/common/text-tokens.d.ts.map +1 -0
  48. package/out/common/text-tokens.js +52 -0
  49. package/out/common/text-tokens.js.map +1 -0
  50. package/out/index.d.ts +14 -5
  51. package/out/index.d.ts.map +1 -1
  52. package/out/index.js +8 -2
  53. package/out/index.js.map +1 -1
  54. package/out/map/CompareToggle.d.ts +2 -2
  55. package/out/map/CompareToggle.d.ts.map +1 -1
  56. package/out/map/{GeocoderDemo.d.ts → Geocoder.d.ts} +17 -17
  57. package/out/map/Geocoder.d.ts.map +1 -0
  58. package/out/map/{GeocoderDemo.js → Geocoder.js} +25 -25
  59. package/out/map/Geocoder.js.map +1 -0
  60. package/out/map/{DemoControls.d.ts → GeocoderControls.d.ts} +16 -17
  61. package/out/map/GeocoderControls.d.ts.map +1 -0
  62. package/out/map/{DemoControls.js → GeocoderControls.js} +2 -2
  63. package/out/map/GeocoderControls.js.map +1 -0
  64. package/out/map/{DemoMap.d.ts → MapCanvas.d.ts} +15 -15
  65. package/out/map/MapCanvas.d.ts.map +1 -0
  66. package/out/map/{DemoMap.js → MapCanvas.js} +2 -2
  67. package/out/map/MapCanvas.js.map +1 -0
  68. package/out/map/PlaceMarker.d.ts +1 -1
  69. package/out/map/ResolvedPlaceLayers.d.ts +3 -3
  70. package/out/map/ResultCamera.d.ts +1 -1
  71. package/out/map/ResultCamera.js +1 -1
  72. package/out/map/ResultPanel.d.ts +2 -2
  73. package/out/map/ResultPanel.d.ts.map +1 -1
  74. package/out/map/ResultPanel.js.map +1 -1
  75. package/out/map/VersionPicker.d.ts +3 -3
  76. package/out/map/VersionPicker.d.ts.map +1 -1
  77. package/out/map/fake-runtime.d.ts +38 -0
  78. package/out/map/fake-runtime.d.ts.map +1 -0
  79. package/out/map/fake-runtime.js +107 -0
  80. package/out/map/fake-runtime.js.map +1 -0
  81. package/out/map/index.d.ts +10 -10
  82. package/out/map/index.d.ts.map +1 -1
  83. package/out/map/index.js +6 -6
  84. package/out/map/index.js.map +1 -1
  85. package/out/map/map-debug.d.ts +31 -0
  86. package/out/map/map-debug.d.ts.map +1 -0
  87. package/out/map/map-debug.js +31 -0
  88. package/out/map/map-debug.js.map +1 -0
  89. package/out/map/place-render.d.ts +2 -2
  90. package/out/map/place-render.d.ts.map +1 -1
  91. package/out/map/place-render.js +1 -1
  92. package/out/map/place-render.js.map +1 -1
  93. package/out/map/types.d.ts +41 -39
  94. package/out/map/types.d.ts.map +1 -1
  95. package/out/map/types.js +5 -5
  96. package/out/map/{useDemoGeocode.d.ts → useGeocode.d.ts} +9 -9
  97. package/out/map/useGeocode.d.ts.map +1 -0
  98. package/out/map/{useDemoGeocode.js → useGeocode.js} +4 -4
  99. package/out/map/useGeocode.js.map +1 -0
  100. package/out/pipeline/CandidatePicker.d.ts +1 -1
  101. package/out/pipeline/CandidatePicker.d.ts.map +1 -1
  102. package/out/pipeline/CandidatePicker.js.map +1 -1
  103. package/out/pipeline/ComponentTable.d.ts +1 -1
  104. package/out/pipeline/ComponentTable.d.ts.map +1 -1
  105. package/out/pipeline/ComponentTable.js.map +1 -1
  106. package/out/pipeline/ConfidenceCell.d.ts +2 -2
  107. package/out/pipeline/ConfidenceCell.d.ts.map +1 -1
  108. package/out/pipeline/ConfidenceCell.js +4 -16
  109. package/out/pipeline/ConfidenceCell.js.map +1 -1
  110. package/out/pipeline/FailureDiagnostic.d.ts +15 -0
  111. package/out/pipeline/FailureDiagnostic.d.ts.map +1 -0
  112. package/out/pipeline/FailureDiagnostic.js +21 -0
  113. package/out/pipeline/FailureDiagnostic.js.map +1 -0
  114. package/out/pipeline/ResolvedPlace.d.ts +1 -1
  115. package/out/pipeline/ResolvedPlace.d.ts.map +1 -1
  116. package/out/pipeline/ResolvedPlace.js +4 -10
  117. package/out/pipeline/ResolvedPlace.js.map +1 -1
  118. package/out/pipeline/SpanHighlight.d.ts +23 -0
  119. package/out/pipeline/SpanHighlight.d.ts.map +1 -0
  120. package/out/pipeline/SpanHighlight.js +31 -0
  121. package/out/pipeline/SpanHighlight.js.map +1 -0
  122. package/out/pipeline/TimingPanel.d.ts +16 -0
  123. package/out/pipeline/TimingPanel.d.ts.map +1 -0
  124. package/out/pipeline/TimingPanel.js +20 -0
  125. package/out/pipeline/TimingPanel.js.map +1 -0
  126. package/out/pipeline/TreeView.d.ts +17 -0
  127. package/out/pipeline/TreeView.d.ts.map +1 -0
  128. package/out/pipeline/TreeView.js +15 -0
  129. package/out/pipeline/TreeView.js.map +1 -0
  130. package/out/pipeline/copy.d.ts +1 -1
  131. package/out/pipeline/copy.d.ts.map +1 -1
  132. package/out/pipeline/types.d.ts +2 -68
  133. package/out/pipeline/types.d.ts.map +1 -1
  134. package/out/pipeline/types.js +1 -1
  135. package/out/pipeline/useParsePipeline.d.ts +2 -1
  136. package/out/pipeline/useParsePipeline.d.ts.map +1 -1
  137. package/out/pipeline/useParsePipeline.js.map +1 -1
  138. package/out/poi/types.d.ts +2 -1
  139. package/out/poi/types.d.ts.map +1 -1
  140. package/out/runtime/{useDemoRuntime.d.ts → useReleaseRuntime.d.ts} +18 -20
  141. package/out/runtime/useReleaseRuntime.d.ts.map +1 -0
  142. package/out/runtime/{useDemoRuntime.js → useReleaseRuntime.js} +4 -4
  143. package/out/runtime/useReleaseRuntime.js.map +1 -0
  144. package/package.json +139 -29
  145. package/styleframe.config.ts +321 -0
  146. package/styles.css +1074 -664
  147. package/tokens/index.css +115 -0
  148. package/tokens/tokens.json +521 -0
  149. package/tokens/tokens.resolver.json +185 -0
  150. package/out/map/DemoControls.d.ts.map +0 -1
  151. package/out/map/DemoControls.js.map +0 -1
  152. package/out/map/DemoMap.d.ts.map +0 -1
  153. package/out/map/DemoMap.js.map +0 -1
  154. package/out/map/GeocoderDemo.d.ts.map +0 -1
  155. package/out/map/GeocoderDemo.js.map +0 -1
  156. package/out/map/useDemoGeocode.d.ts.map +0 -1
  157. package/out/map/useDemoGeocode.js.map +0 -1
  158. package/out/runtime/useDemoRuntime.d.ts.map +0 -1
  159. package/out/runtime/useDemoRuntime.js.map +0 -1
package/styles.css CHANGED
@@ -1,823 +1,1233 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
  * @mailwoman/react — component styles.
3
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.
4
+ * Plain, `mw-`-prefixed classes. Every colour, family and radius here names a
5
+ * SEMANTIC token from `tokens.css`, which this file requires a host to load —
6
+ * `@mailwoman/react/tokens.css`, and `fonts.css` beside it for the brand face.
7
+ * There are no inline fallbacks, on purpose: a fallback is what let eight
8
+ * undefined names paint Infima's LIGHT values inside a dark app without
9
+ * anything failing. A token that is missing should look missing.
10
+ *
11
+ * A rule may read the semantic layer only. Reaching a primitive (`--neutral-*`,
12
+ * `--brand-*`) from here skips the layer that says what a value is FOR, which is
13
+ * how this stylesheet came to read a theme vocabulary it did not own.
14
+ *
15
+ * No CSS module hashing — the class names are stable and namespaced, and no
16
+ * component imports this file, so the bare package import stays node-safe.
10
17
  * --------------------------------------------------------------------------- */
11
18
 
12
- .mw-poi-explorer,
13
- .mw-pipeline-explorer {
14
- max-width: 720px;
15
- font-size: 0.95rem;
19
+ /*
20
+ * The layer order every consumer inherits. Naming the order here means a host's own rules can win by declaring a
21
+ * later layer rather than by out-specifying ours, which is what keeps this package embeddable in Docusaurus without
22
+ * either side fighting the other's selectors.
23
+ */
24
+ @layer reset, tokens, base, components, utilities, overrides;
25
+
26
+ /*
27
+ * The vocabulary these rules read, pulled in rather than left to the host to remember. A consumer that loaded the
28
+ * components and forgot the tokens is exactly the state that shipped: rules reading names nothing defined.
29
+ */
30
+ @import url("./tokens/index.css") layer(tokens);
31
+
32
+ @layer base {
33
+ /*
34
+ * Form controls do not inherit the document's font. Left alone, a `<button>` renders in the user agent's default
35
+ * — measured as Arial on the deployed Earth app, beside a body in system-ui and labels in ui-monospace, which is
36
+ * three families in one panel and none of them chosen.
37
+ */
38
+ button,
39
+ input,
40
+ select,
41
+ textarea {
42
+ font-family: inherit;
43
+ font-size: inherit;
44
+ line-height: inherit;
45
+ }
16
46
  }
17
47
 
18
- /* #region Field (label + input + button) */
48
+ @layer components {
49
+ .mw-poi-explorer,
50
+ .mw-pipeline-explorer {
51
+ max-width: 720px;
52
+ font-size: 0.95rem;
53
+ }
19
54
 
20
- .mw-field {
21
- display: flex;
22
- flex-direction: column;
23
- gap: 0.5rem;
24
- }
55
+ /* #region Field (label + input + button) */
25
56
 
26
- .mw-field label {
27
- font-weight: 600;
28
- font-size: 0.9rem;
29
- }
57
+ .mw-field {
58
+ display: flex;
59
+ flex-direction: column;
60
+ gap: 0.5rem;
61
+ }
30
62
 
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
- }
63
+ .mw-field label {
64
+ font-weight: 600;
65
+ font-size: 0.9rem;
66
+ }
39
67
 
40
- .mw-field input:disabled {
41
- opacity: 0.5;
42
- }
68
+ .mw-field input {
69
+ padding: 0.5rem 0.75rem;
70
+ font: inherit;
71
+ border: 1px solid var(--control-border);
72
+ border-radius: 6px;
73
+ background: var(--color-background-raised);
74
+ color: var(--color-text-primary);
75
+ }
43
76
 
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
- }
77
+ .mw-field input:disabled {
78
+ opacity: 0.5;
79
+ }
57
80
 
58
- .mw-field button[type="submit"]:disabled {
59
- background: var(--ifm-color-emphasis-400, #b3b3b3);
60
- cursor: not-allowed;
61
- }
81
+ .mw-field button[type="submit"] {
82
+ padding: 0.5rem 0.75rem;
83
+ background: var(--color-accent);
84
+ color: var(--color-accent-contrast);
85
+ border: 0;
86
+ border-radius: 6px;
87
+ font-weight: 600;
88
+ cursor: pointer;
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: 0.4rem;
92
+ align-self: flex-start;
93
+ }
62
94
 
63
- /* #endregion */
95
+ .mw-field button[type="submit"]:disabled {
96
+ background: var(--color-text-tertiary);
97
+ cursor: not-allowed;
98
+ }
64
99
 
65
- /* #region Preset chips */
100
+ /* #endregion */
66
101
 
67
- .mw-presets {
68
- margin-top: 0.75rem;
69
- display: flex;
70
- flex-wrap: wrap;
71
- gap: 0.4rem;
72
- align-items: baseline;
73
- }
102
+ /* #region Preset chips */
74
103
 
75
- .mw-presets__label {
76
- font-size: 0.85rem;
77
- color: var(--ifm-color-emphasis-600, #6e6e6e);
78
- margin-right: 0.25rem;
79
- }
104
+ .mw-presets {
105
+ margin-top: 0.75rem;
106
+ display: flex;
107
+ flex-wrap: wrap;
108
+ gap: 0.4rem;
109
+ align-items: baseline;
110
+ }
80
111
 
81
- .mw-chip {
82
- font-size: 0.8rem;
83
- padding: 0.25rem 0.55rem;
84
- background: var(--ifm-color-emphasis-100, #f5f6f7);
85
- color: var(--ifm-color-emphasis-800, #303846);
86
- border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
87
- border-radius: 4px;
88
- font-weight: 500;
89
- cursor: pointer;
90
- font-family: inherit;
91
- }
112
+ .mw-presets__label {
113
+ font-size: 0.85rem;
114
+ color: var(--color-text-secondary);
115
+ margin-right: 0.25rem;
116
+ }
92
117
 
93
- .mw-chip:hover:not(:disabled) {
94
- background: var(--ifm-color-emphasis-200, #ebedf0);
95
- border-color: var(--ifm-color-primary, #e0367c);
96
- }
118
+ .mw-chip {
119
+ font-size: 0.8rem;
120
+ padding: 0.25rem 0.55rem;
121
+ background: var(--control-background);
122
+ color: var(--color-text-primary);
123
+ border: 1px solid var(--control-border);
124
+ border-radius: 4px;
125
+ font-weight: 500;
126
+ cursor: pointer;
127
+ font-family: inherit;
128
+ }
97
129
 
98
- .mw-chip:disabled {
99
- opacity: 0.5;
100
- cursor: not-allowed;
101
- }
130
+ .mw-chip:hover:not(:disabled) {
131
+ background: var(--color-background-sunken);
132
+ border-color: var(--color-accent);
133
+ }
102
134
 
103
- /* #endregion */
135
+ .mw-chip:disabled {
136
+ opacity: 0.5;
137
+ cursor: not-allowed;
138
+ }
104
139
 
105
- /* #region Generic button (copy / search) */
140
+ /* #endregion */
106
141
 
107
- .mw-btn {
108
- font-size: 0.8rem;
109
- padding: 0.25rem 0.55rem;
110
- background: var(--ifm-color-emphasis-100, #f5f6f7);
111
- color: var(--ifm-color-emphasis-800, #303846);
112
- border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
113
- border-radius: 4px;
114
- cursor: pointer;
115
- font-family: inherit;
116
- }
142
+ /* #region Generic button (copy / search) */
117
143
 
118
- .mw-btn:hover:not(:disabled) {
119
- background: var(--ifm-color-emphasis-200, #ebedf0);
120
- }
144
+ .mw-btn {
145
+ font-size: 0.8rem;
146
+ padding: 0.25rem 0.55rem;
147
+ background: var(--control-background);
148
+ color: var(--color-text-primary);
149
+ border: 1px solid var(--control-border);
150
+ border-radius: 4px;
151
+ cursor: pointer;
152
+ font-family: inherit;
153
+ }
121
154
 
122
- .mw-btn:disabled {
123
- opacity: 0.5;
124
- cursor: not-allowed;
125
- }
155
+ .mw-btn:hover:not(:disabled) {
156
+ background: var(--color-background-sunken);
157
+ }
126
158
 
127
- /* #endregion */
159
+ .mw-btn:disabled {
160
+ opacity: 0.5;
161
+ cursor: not-allowed;
162
+ }
128
163
 
129
- /* #region Result panel + errors */
164
+ /* #endregion */
130
165
 
131
- .mw-result {
132
- margin-top: 1.5rem;
133
- }
166
+ /* #region Result panel + errors */
134
167
 
135
- .mw-result__header {
136
- display: flex;
137
- justify-content: space-between;
138
- align-items: center;
139
- margin-bottom: 0.75rem;
140
- }
168
+ .mw-result {
169
+ margin-top: 1.5rem;
170
+ }
141
171
 
142
- .mw-result__header h2 {
143
- margin: 0;
144
- font-size: 1.1rem;
145
- }
172
+ .mw-result__header {
173
+ display: flex;
174
+ justify-content: space-between;
175
+ align-items: center;
176
+ margin-bottom: 0.75rem;
177
+ }
146
178
 
147
- .mw-panel__header {
148
- display: flex;
149
- justify-content: space-between;
150
- align-items: center;
151
- margin-bottom: 0.4rem;
152
- }
179
+ .mw-result__header h2 {
180
+ margin: 0;
181
+ font-size: 1.1rem;
182
+ }
153
183
 
154
- .mw-panel__header h3 {
155
- margin: 0;
156
- font-size: 0.95rem;
157
- }
184
+ .mw-panel__header {
185
+ display: flex;
186
+ justify-content: space-between;
187
+ align-items: center;
188
+ margin-bottom: 0.4rem;
189
+ }
158
190
 
159
- .mw-muted {
160
- font-style: italic;
161
- color: var(--ifm-color-emphasis-600, #6e6e6e);
162
- }
191
+ .mw-panel__header h3 {
192
+ margin: 0;
193
+ font-size: 0.95rem;
194
+ }
163
195
 
164
- .mw-error {
165
- color: var(--ifm-color-danger, #d9364c);
166
- font-family: var(--ifm-font-family-monospace, monospace);
167
- white-space: pre-wrap;
168
- }
196
+ .mw-muted {
197
+ font-style: italic;
198
+ color: var(--color-text-secondary);
199
+ }
169
200
 
170
- /* #endregion */
201
+ .mw-error {
202
+ color: var(--color-state-danger);
203
+ font-family: var(--font-family-code);
204
+ white-space: pre-wrap;
205
+ }
171
206
 
172
- /* #region KindBadge */
207
+ /* #endregion */
173
208
 
174
- .mw-kind {
175
- margin-bottom: 0.5rem;
176
- font-size: 0.9rem;
177
- }
209
+ /* #region KindBadge */
178
210
 
179
- .mw-kind__summary {
180
- cursor: pointer;
181
- user-select: none;
182
- }
211
+ .mw-kind {
212
+ margin-bottom: 0.5rem;
213
+ font-size: 0.9rem;
214
+ }
183
215
 
184
- .mw-kind__confidence {
185
- opacity: 0.7;
186
- }
216
+ .mw-kind__summary {
217
+ cursor: pointer;
218
+ user-select: none;
219
+ }
187
220
 
188
- .mw-kind__alternatives {
189
- margin: 0.25rem 0 0 1rem;
190
- padding: 0;
191
- list-style: disc;
192
- }
221
+ .mw-kind__confidence {
222
+ opacity: 0.7;
223
+ }
193
224
 
194
- /* #endregion */
225
+ .mw-kind__alternatives {
226
+ margin: 0.25rem 0 0 1rem;
227
+ padding: 0;
228
+ list-style: disc;
229
+ }
195
230
 
196
- /* #region POI subject panel */
231
+ /* #endregion */
197
232
 
198
- .mw-subject__row {
199
- display: flex;
200
- align-items: center;
201
- gap: 0.5rem;
202
- margin-bottom: 0.5rem;
203
- }
233
+ /* #region POI subject panel */
204
234
 
205
- .mw-subject__chip {
206
- display: inline-block;
207
- padding: 0.2rem 0.6rem;
208
- border-radius: 999px;
209
- background: var(--ifm-color-primary-contrast-background, rgba(224, 54, 124, 0.12));
210
- color: var(--ifm-color-primary, #e0367c);
211
- font-weight: 600;
212
- font-size: 0.85rem;
213
- }
235
+ .mw-subject__row {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 0.5rem;
239
+ margin-bottom: 0.5rem;
240
+ }
214
241
 
215
- .mw-subject__badge {
216
- display: inline-block;
217
- padding: 0.2rem 0.5rem;
218
- border-radius: 999px;
219
- background: var(--ifm-color-warning-contrast-background, rgba(245, 158, 11, 0.15));
220
- color: var(--ifm-color-warning-darkest, #92400e);
221
- font-size: 0.75rem;
222
- font-weight: 600;
223
- text-transform: uppercase;
224
- letter-spacing: 0.02em;
225
- }
242
+ .mw-subject__chip {
243
+ display: inline-block;
244
+ padding: 0.2rem 0.6rem;
245
+ border-radius: 999px;
246
+ background: var(--color-accent-background);
247
+ color: var(--color-accent);
248
+ font-weight: 600;
249
+ font-size: 0.85rem;
250
+ }
226
251
 
227
- .mw-subject__badge--brand {
228
- background: var(--ifm-color-info-contrast-background, rgba(84, 199, 236, 0.15));
229
- color: var(--ifm-color-info-darkest, #14657d);
230
- }
252
+ .mw-subject__badge {
253
+ display: inline-block;
254
+ padding: 0.2rem 0.5rem;
255
+ border-radius: 999px;
256
+ background: var(--color-state-warning-background);
257
+ color: var(--color-state-warning);
258
+ font-size: 0.75rem;
259
+ font-weight: 600;
260
+ text-transform: uppercase;
261
+ letter-spacing: 0.02em;
262
+ }
231
263
 
232
- .mw-subject__qid {
233
- display: inline-block;
234
- padding: 0.2rem 0.5rem;
235
- border-radius: 999px;
236
- background: var(--ifm-color-emphasis-200, #ebedf0);
237
- color: var(--ifm-color-emphasis-800, #303846);
238
- font-family: var(--ifm-font-family-monospace, monospace);
239
- font-size: 0.75rem;
240
- font-weight: 600;
241
- text-decoration: none;
242
- }
264
+ .mw-subject__badge--brand {
265
+ background: var(--color-state-info-background);
266
+ color: var(--color-state-info);
267
+ }
243
268
 
244
- .mw-subject__qid:hover {
245
- text-decoration: underline;
246
- }
269
+ .mw-subject__qid {
270
+ display: inline-block;
271
+ padding: 0.2rem 0.5rem;
272
+ border-radius: 999px;
273
+ background: var(--color-background-sunken);
274
+ color: var(--color-text-primary);
275
+ font-family: var(--font-family-code);
276
+ font-size: 0.75rem;
277
+ font-weight: 600;
278
+ text-decoration: none;
279
+ }
247
280
 
248
- .mw-subject__note {
249
- margin: 0 0 0.75rem;
250
- font-size: 0.85rem;
251
- opacity: 0.8;
252
- }
281
+ .mw-subject__qid:hover {
282
+ text-decoration: underline;
283
+ }
253
284
 
254
- .mw-subject__detail {
255
- display: grid;
256
- grid-template-columns: auto 1fr;
257
- gap: 0.25rem 0.75rem;
258
- margin: 0 0 0.75rem;
259
- font-size: 0.9rem;
260
- }
285
+ .mw-subject__note {
286
+ margin: 0 0 0.75rem;
287
+ font-size: 0.85rem;
288
+ opacity: 0.8;
289
+ }
261
290
 
262
- .mw-subject__detail dt {
263
- font-weight: 600;
264
- color: var(--ifm-color-emphasis-700, #4a5163);
265
- }
291
+ .mw-subject__detail {
292
+ display: grid;
293
+ grid-template-columns: auto 1fr;
294
+ gap: 0.25rem 0.75rem;
295
+ margin: 0 0 0.75rem;
296
+ font-size: 0.9rem;
297
+ }
266
298
 
267
- .mw-subject__detail dd {
268
- margin: 0;
269
- }
299
+ .mw-subject__detail dt {
300
+ font-weight: 600;
301
+ color: var(--color-text-secondary);
302
+ }
270
303
 
271
- /* #endregion */
304
+ .mw-subject__detail dd {
305
+ margin: 0;
306
+ }
272
307
 
273
- /* #region OverpassQL block */
308
+ /* #endregion */
274
309
 
275
- .mw-overpass {
276
- margin-top: 0.75rem;
277
- }
310
+ /* #region OverpassQL block */
278
311
 
279
- .mw-overpass__code {
280
- margin: 0;
281
- padding: 0.75rem;
282
- border-radius: 6px;
283
- background: var(--ifm-color-emphasis-100, #f5f6f7);
284
- font-family: var(--ifm-font-family-monospace, monospace);
285
- font-size: 0.85rem;
286
- white-space: pre-wrap;
287
- overflow-x: auto;
288
- }
312
+ .mw-overpass {
313
+ margin-top: 0.75rem;
314
+ }
289
315
 
290
- /* #endregion */
316
+ .mw-overpass__code {
317
+ margin: 0;
318
+ padding: 0.75rem;
319
+ border-radius: 6px;
320
+ background: var(--control-background);
321
+ font-family: var(--font-family-code);
322
+ font-size: 0.85rem;
323
+ white-space: pre-wrap;
324
+ overflow-x: auto;
325
+ }
291
326
 
292
- /* #region Live results */
327
+ /* #endregion */
293
328
 
294
- .mw-live {
295
- margin-top: 1rem;
296
- }
329
+ /* #region Live results */
297
330
 
298
- .mw-live__caption {
299
- margin: 0 0 0.4rem;
300
- font-size: 0.85rem;
301
- color: var(--ifm-color-emphasis-600, #6e6e6e);
302
- }
331
+ .mw-live {
332
+ margin-top: 1rem;
333
+ }
303
334
 
304
- .mw-live__results {
305
- list-style: none;
306
- margin: 0;
307
- padding: 0;
308
- display: flex;
309
- flex-direction: column;
310
- gap: 0.35rem;
311
- }
335
+ .mw-live__caption {
336
+ margin: 0 0 0.4rem;
337
+ font-size: 0.85rem;
338
+ color: var(--color-text-secondary);
339
+ }
312
340
 
313
- .mw-live__results li {
314
- display: flex;
315
- justify-content: space-between;
316
- align-items: baseline;
317
- gap: 0.75rem;
318
- padding: 0.4rem 0.6rem;
319
- border-radius: 6px;
320
- background: var(--ifm-color-emphasis-100, #f5f6f7);
321
- font-size: 0.9rem;
322
- }
341
+ .mw-live__results {
342
+ list-style: none;
343
+ margin: 0;
344
+ padding: 0;
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: 0.35rem;
348
+ }
323
349
 
324
- .mw-live__name {
325
- font-weight: 600;
326
- }
350
+ .mw-live__results li {
351
+ display: flex;
352
+ justify-content: space-between;
353
+ align-items: baseline;
354
+ gap: 0.75rem;
355
+ padding: 0.4rem 0.6rem;
356
+ border-radius: 6px;
357
+ background: var(--control-background);
358
+ font-size: 0.9rem;
359
+ }
327
360
 
328
- .mw-live__meta {
329
- color: var(--ifm-color-emphasis-600, #6e6e6e);
330
- font-size: 0.8rem;
331
- white-space: nowrap;
332
- }
361
+ .mw-live__name {
362
+ font-weight: 600;
363
+ }
333
364
 
334
- /* #endregion */
365
+ .mw-live__meta {
366
+ color: var(--color-text-secondary);
367
+ font-size: 0.8rem;
368
+ white-space: nowrap;
369
+ }
335
370
 
336
- /* #region Component table */
371
+ /* #endregion */
337
372
 
338
- .mw-components {
339
- width: 100%;
340
- border-collapse: collapse;
341
- margin: 0.75rem 0;
342
- font-size: 0.9rem;
343
- }
373
+ /* #region Component table */
344
374
 
345
- .mw-components th,
346
- .mw-components td {
347
- padding: 0.4rem 0.6rem;
348
- text-align: left;
349
- border-bottom: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
350
- }
375
+ .mw-components {
376
+ width: 100%;
377
+ border-collapse: collapse;
378
+ margin: 0.75rem 0;
379
+ font-size: 0.9rem;
380
+ }
351
381
 
352
- .mw-components th {
353
- font-weight: 600;
354
- color: var(--ifm-color-emphasis-600, #6e6e6e);
355
- font-size: 0.8rem;
356
- text-transform: uppercase;
357
- }
382
+ .mw-components th,
383
+ .mw-components td {
384
+ padding: 0.4rem 0.6rem;
385
+ text-align: left;
386
+ border-bottom: 1px solid var(--color-separator);
387
+ }
358
388
 
359
- /* #endregion */
389
+ .mw-components th {
390
+ font-weight: 600;
391
+ color: var(--color-text-secondary);
392
+ font-size: 0.8rem;
393
+ text-transform: uppercase;
394
+ }
360
395
 
361
- /* #region Confidence cell */
396
+ /* #endregion */
362
397
 
363
- .mw-conf__dash {
364
- color: var(--ifm-color-emphasis-500, #8c8c8c);
365
- }
398
+ /* #region Confidence cell */
366
399
 
367
- .mw-conf {
368
- display: flex;
369
- align-items: center;
370
- gap: 0.35rem;
371
- min-width: 80px;
372
- }
400
+ .mw-conf__dash {
401
+ color: var(--color-text-tertiary);
402
+ }
373
403
 
374
- .mw-conf__bar {
375
- height: 6px;
376
- border-radius: 3px;
377
- min-width: 4px;
378
- transition: width 0.2s ease;
379
- }
404
+ .mw-conf {
405
+ display: flex;
406
+ align-items: center;
407
+ gap: 0.35rem;
408
+ min-width: 80px;
409
+ }
380
410
 
381
- .mw-conf__bar--high {
382
- background: #22c55e;
383
- }
411
+ .mw-conf__bar {
412
+ height: 6px;
413
+ border-radius: 3px;
414
+ min-width: 4px;
415
+ transition: width 0.2s ease;
416
+ }
384
417
 
385
- .mw-conf__bar--mid {
386
- background: #f59e0b;
387
- }
418
+ .mw-conf__bar--high {
419
+ background: #22c55e;
420
+ }
388
421
 
389
- .mw-conf__bar--low {
390
- background: #ef4444;
391
- }
422
+ .mw-conf__bar--mid {
423
+ background: #f59e0b;
424
+ }
392
425
 
393
- .mw-conf__value {
394
- font-family: var(--ifm-font-family-monospace, monospace);
395
- font-size: 0.8rem;
396
- }
426
+ .mw-conf__bar--low {
427
+ background: #ef4444;
428
+ }
397
429
 
398
- /* #endregion */
430
+ .mw-conf__value {
431
+ font-family: var(--font-family-code);
432
+ font-size: 0.8rem;
433
+ }
399
434
 
400
- /* #region Resolved place */
435
+ /* #endregion */
401
436
 
402
- .mw-resolved {
403
- margin-top: 1rem;
404
- padding: 0.75rem;
405
- border: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
406
- border-radius: 6px;
407
- background: var(--ifm-color-emphasis-0, #fff);
408
- }
437
+ /* #region Resolved place */
409
438
 
410
- .mw-resolved h2 {
411
- margin: 0 0 0.5rem;
412
- font-size: 1rem;
413
- }
439
+ .mw-resolved {
440
+ margin-top: 1rem;
441
+ padding: 0.75rem;
442
+ border: 1px solid var(--color-separator);
443
+ border-radius: 6px;
444
+ background: var(--color-background-canvas);
445
+ }
414
446
 
415
- .mw-resolved dl {
416
- display: grid;
417
- grid-template-columns: auto 1fr;
418
- gap: 0.25rem 0.75rem;
419
- margin: 0;
420
- }
447
+ .mw-resolved h2 {
448
+ margin: 0 0 0.5rem;
449
+ font-size: 1rem;
450
+ }
421
451
 
422
- .mw-resolved dt {
423
- font-weight: 600;
424
- color: var(--ifm-color-emphasis-700, #4a5163);
425
- }
452
+ .mw-resolved dl {
453
+ display: grid;
454
+ grid-template-columns: auto 1fr;
455
+ gap: 0.25rem 0.75rem;
456
+ margin: 0;
457
+ }
426
458
 
427
- .mw-resolved dd {
428
- margin: 0;
429
- }
459
+ .mw-resolved dt {
460
+ font-weight: 600;
461
+ color: var(--color-text-secondary);
462
+ }
430
463
 
431
- .mw-resolved__dual {
432
- margin: 0.5rem 0 0;
433
- padding: 0.4rem 0.6rem;
434
- border-radius: 6px;
435
- background: var(--ifm-color-info-contrast-background, rgba(54, 122, 246, 0.1));
436
- font-size: 0.9rem;
437
- }
464
+ .mw-resolved dd {
465
+ margin: 0;
466
+ }
438
467
 
439
- /* #endregion */
468
+ .mw-resolved__dual {
469
+ margin: 0.5rem 0 0;
470
+ padding: 0.4rem 0.6rem;
471
+ border-radius: 6px;
472
+ background: var(--color-state-info-background);
473
+ font-size: 0.9rem;
474
+ }
440
475
 
441
- /* #region Candidate picker */
476
+ /* #endregion */
442
477
 
443
- .mw-candidates {
444
- margin-top: 1rem;
445
- }
478
+ /* #region Candidate picker */
446
479
 
447
- .mw-candidates h2 {
448
- font-size: 1rem;
449
- margin: 0 0 0.5rem;
450
- }
480
+ .mw-candidates {
481
+ margin-top: 1rem;
482
+ }
451
483
 
452
- .mw-candidates__list {
453
- list-style: none;
454
- margin: 0;
455
- padding: 0;
456
- display: flex;
457
- flex-direction: column;
458
- gap: 0.35rem;
459
- }
484
+ .mw-candidates h2 {
485
+ font-size: 1rem;
486
+ margin: 0 0 0.5rem;
487
+ }
460
488
 
461
- .mw-candidates__btn {
462
- display: flex;
463
- align-items: baseline;
464
- gap: 0.6rem;
465
- width: 100%;
466
- text-align: left;
467
- padding: 0.4rem 0.6rem;
468
- border: 1px solid var(--ifm-color-emphasis-200, #ebedf0);
469
- border-radius: 6px;
470
- background: transparent;
471
- cursor: pointer;
472
- font: inherit;
473
- }
489
+ .mw-candidates__list {
490
+ list-style: none;
491
+ margin: 0;
492
+ padding: 0;
493
+ display: flex;
494
+ flex-direction: column;
495
+ gap: 0.35rem;
496
+ }
474
497
 
475
- .mw-candidates__btn--active {
476
- border-color: var(--ifm-color-primary, #e0367c);
477
- background: var(--ifm-color-primary-contrast-background, rgba(224, 54, 124, 0.1));
478
- }
498
+ .mw-candidates__btn {
499
+ display: flex;
500
+ align-items: baseline;
501
+ gap: 0.6rem;
502
+ width: 100%;
503
+ text-align: left;
504
+ padding: 0.4rem 0.6rem;
505
+ border: 1px solid var(--color-separator);
506
+ border-radius: 6px;
507
+ background: transparent;
508
+ cursor: pointer;
509
+ font: inherit;
510
+ }
479
511
 
480
- .mw-candidates__rank {
481
- font-family: var(--ifm-font-family-monospace, monospace);
482
- font-size: 0.8rem;
483
- opacity: 0.6;
484
- }
512
+ .mw-candidates__btn--active {
513
+ border-color: var(--color-accent);
514
+ background: var(--color-accent-background);
515
+ }
485
516
 
486
- .mw-candidates__name {
487
- font-weight: 600;
488
- }
517
+ .mw-candidates__rank {
518
+ font-family: var(--font-family-code);
519
+ font-size: 0.8rem;
520
+ opacity: 0.6;
521
+ }
489
522
 
490
- .mw-candidates__meta {
491
- margin-left: auto;
492
- font-size: 0.8rem;
493
- color: var(--ifm-color-emphasis-600, #6e6e6e);
494
- }
523
+ .mw-candidates__name {
524
+ font-weight: 600;
525
+ }
495
526
 
496
- /* #endregion */
527
+ .mw-candidates__meta {
528
+ margin-left: auto;
529
+ font-size: 0.8rem;
530
+ color: var(--color-text-secondary);
531
+ }
497
532
 
498
- /* #region LoadingIndicator */
533
+ /* #endregion */
499
534
 
500
- .mw-loading {
501
- display: flex;
502
- flex-direction: column;
503
- align-items: center;
504
- justify-content: center;
505
- gap: 0.75rem;
506
- padding: 1.5rem;
507
- }
535
+ /* #region LoadingIndicator */
508
536
 
509
- .mw-loading__label {
510
- font-size: 0.85rem;
511
- color: var(--ifm-color-emphasis-600, #6e6e6e);
512
- font-family: var(--ifm-font-family-monospace, monospace);
513
- text-align: center;
514
- }
537
+ .mw-loading {
538
+ display: flex;
539
+ flex-direction: column;
540
+ align-items: center;
541
+ justify-content: center;
542
+ gap: 0.75rem;
543
+ padding: 1.5rem;
544
+ }
515
545
 
516
- .mw-pulse {
517
- display: flex;
518
- flex-direction: column;
519
- gap: 0.5rem;
520
- width: 100%;
521
- max-width: 320px;
522
- }
546
+ .mw-loading__label {
547
+ font-size: 0.85rem;
548
+ color: var(--color-text-secondary);
549
+ font-family: var(--font-family-code);
550
+ text-align: center;
551
+ }
523
552
 
524
- .mw-pulse__bar {
525
- height: 0.75rem;
526
- border-radius: 4px;
527
- background: var(--ifm-color-emphasis-200, #ebedf0);
528
- animation: mw-pulse-fade 1.4s ease-in-out infinite;
529
- }
553
+ .mw-pulse {
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 0.5rem;
557
+ width: 100%;
558
+ max-width: 320px;
559
+ }
530
560
 
531
- .mw-pulse__bar:nth-child(1) {
532
- animation-delay: 0s;
533
- }
534
- .mw-pulse__bar:nth-child(2) {
535
- animation-delay: 0.15s;
536
- }
537
- .mw-pulse__bar:nth-child(3) {
538
- animation-delay: 0.3s;
539
- }
540
- .mw-pulse__bar:nth-child(4) {
541
- animation-delay: 0.45s;
542
- }
543
- .mw-pulse__bar:nth-child(5) {
544
- animation-delay: 0.6s;
545
- }
546
- .mw-pulse__bar:nth-child(odd) {
547
- width: 100%;
548
- }
549
- .mw-pulse__bar:nth-child(even) {
550
- width: 72%;
551
- }
561
+ .mw-pulse__bar {
562
+ height: 0.75rem;
563
+ border-radius: 4px;
564
+ background: var(--color-background-sunken);
565
+ animation: mw-pulse-fade 1.4s ease-in-out infinite;
566
+ }
552
567
 
553
- @keyframes mw-pulse-fade {
554
- 0%,
555
- 100% {
556
- opacity: 0.35;
568
+ .mw-pulse__bar:nth-child(1) {
569
+ animation-delay: 0s;
557
570
  }
558
- 50% {
559
- opacity: 1;
571
+ .mw-pulse__bar:nth-child(2) {
572
+ animation-delay: 0.15s;
573
+ }
574
+ .mw-pulse__bar:nth-child(3) {
575
+ animation-delay: 0.3s;
576
+ }
577
+ .mw-pulse__bar:nth-child(4) {
578
+ animation-delay: 0.45s;
579
+ }
580
+ .mw-pulse__bar:nth-child(5) {
581
+ animation-delay: 0.6s;
582
+ }
583
+ .mw-pulse__bar:nth-child(odd) {
584
+ width: 100%;
585
+ }
586
+ .mw-pulse__bar:nth-child(even) {
587
+ width: 72%;
560
588
  }
561
- }
562
589
 
563
- .mw-spinner {
564
- width: 2rem;
565
- height: 2rem;
566
- border: 3px solid var(--ifm-color-emphasis-200, #ebedf0);
567
- border-top-color: var(--ifm-color-primary, #e0367c);
568
- border-radius: 50%;
569
- animation: mw-spin 0.7s linear infinite;
570
- }
590
+ @keyframes mw-pulse-fade {
591
+ 0%,
592
+ 100% {
593
+ opacity: 0.35;
594
+ }
595
+ 50% {
596
+ opacity: 1;
597
+ }
598
+ }
571
599
 
572
- .mw-spinner--small {
573
- width: 1.25rem;
574
- height: 1.25rem;
575
- border-width: 2px;
576
- }
600
+ .mw-spinner {
601
+ width: 2rem;
602
+ height: 2rem;
603
+ border: 3px solid var(--color-separator);
604
+ border-top-color: var(--color-accent);
605
+ border-radius: 50%;
606
+ animation: mw-spin 0.7s linear infinite;
607
+ }
577
608
 
578
- .mw-spinner--large {
579
- width: 3rem;
580
- height: 3rem;
581
- border-width: 4px;
582
- }
609
+ .mw-spinner--small {
610
+ width: 1.25rem;
611
+ height: 1.25rem;
612
+ border-width: 2px;
613
+ }
583
614
 
584
- @keyframes mw-spin {
585
- to {
586
- transform: rotate(360deg);
615
+ .mw-spinner--large {
616
+ width: 3rem;
617
+ height: 3rem;
618
+ border-width: 4px;
587
619
  }
588
- }
589
620
 
590
- .mw-staged {
591
- display: flex;
592
- flex-direction: column;
593
- gap: 0.5rem;
594
- width: 100%;
595
- max-width: 360px;
596
- list-style: none;
597
- margin: 0;
598
- padding: 0;
599
- }
621
+ @keyframes mw-spin {
622
+ to {
623
+ transform: rotate(360deg);
624
+ }
625
+ }
600
626
 
601
- .mw-staged__step {
602
- display: flex;
603
- align-items: center;
604
- gap: 0.6rem;
605
- padding: 0.4rem 0.6rem;
606
- border-radius: 4px;
607
- font-size: 0.85rem;
608
- transition:
609
- background 0.3s,
610
- color 0.3s;
611
- }
627
+ .mw-staged {
628
+ display: flex;
629
+ flex-direction: column;
630
+ gap: 0.5rem;
631
+ width: 100%;
632
+ max-width: 360px;
633
+ list-style: none;
634
+ margin: 0;
635
+ padding: 0;
636
+ }
612
637
 
613
- .mw-staged__step--pending {
614
- color: var(--ifm-color-emphasis-500, #8c8c8c);
615
- }
638
+ .mw-staged__step {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 0.6rem;
642
+ padding: 0.4rem 0.6rem;
643
+ border-radius: 4px;
644
+ font-size: 0.85rem;
645
+ transition:
646
+ background 0.3s,
647
+ color 0.3s;
648
+ }
616
649
 
617
- .mw-staged__step--active {
618
- color: var(--ifm-color-primary, #e0367c);
619
- background: color-mix(in srgb, var(--ifm-color-primary, #e0367c) 8%, transparent);
620
- font-weight: 600;
621
- }
650
+ .mw-staged__step--pending {
651
+ color: var(--color-text-tertiary);
652
+ }
622
653
 
623
- .mw-staged__step--complete {
624
- color: var(--ifm-color-success, #1aa84d);
625
- }
654
+ .mw-staged__step--active {
655
+ color: var(--color-accent);
656
+ background: color-mix(in srgb, var(--color-accent) 8%, transparent);
657
+ font-weight: 600;
658
+ }
626
659
 
627
- .mw-staged__icon {
628
- display: flex;
629
- align-items: center;
630
- justify-content: center;
631
- width: 1.25rem;
632
- height: 1.25rem;
633
- flex-shrink: 0;
634
- }
660
+ .mw-staged__step--complete {
661
+ color: var(--color-state-success);
662
+ }
635
663
 
636
- .mw-staged__dot {
637
- width: 0.55rem;
638
- height: 0.55rem;
639
- border-radius: 50%;
640
- background: var(--ifm-color-primary, #e0367c);
641
- animation: mw-pulse-dot 1s ease-in-out infinite;
642
- }
664
+ .mw-staged__icon {
665
+ display: flex;
666
+ align-items: center;
667
+ justify-content: center;
668
+ width: 1.25rem;
669
+ height: 1.25rem;
670
+ flex-shrink: 0;
671
+ }
643
672
 
644
- @keyframes mw-pulse-dot {
645
- 0%,
646
- 100% {
647
- opacity: 0.3;
648
- transform: scale(0.8);
673
+ .mw-staged__dot {
674
+ width: 0.55rem;
675
+ height: 0.55rem;
676
+ border-radius: 50%;
677
+ background: var(--color-accent);
678
+ animation: mw-pulse-dot 1s ease-in-out infinite;
649
679
  }
650
- 50% {
651
- opacity: 1;
652
- transform: scale(1.2);
680
+
681
+ @keyframes mw-pulse-dot {
682
+ 0%,
683
+ 100% {
684
+ opacity: 0.3;
685
+ transform: scale(0.8);
686
+ }
687
+ 50% {
688
+ opacity: 1;
689
+ transform: scale(1.2);
690
+ }
653
691
  }
654
- }
655
692
 
656
- .mw-staged__check {
657
- width: 1rem;
658
- height: 1rem;
659
- position: relative;
660
- }
693
+ .mw-staged__check {
694
+ width: 1rem;
695
+ height: 1rem;
696
+ position: relative;
697
+ }
661
698
 
662
- .mw-staged__check::before {
663
- content: "";
664
- position: absolute;
665
- top: 50%;
666
- left: 25%;
667
- width: 0.35rem;
668
- height: 0.65rem;
669
- border: solid var(--ifm-color-success, #1aa84d);
670
- border-width: 0 2px 2px 0;
671
- transform: translateY(-60%) rotate(45deg);
672
- }
699
+ .mw-staged__check::before {
700
+ content: "";
701
+ position: absolute;
702
+ top: 50%;
703
+ left: 25%;
704
+ width: 0.35rem;
705
+ height: 0.65rem;
706
+ border: solid var(--color-state-success);
707
+ border-width: 0 2px 2px 0;
708
+ transform: translateY(-60%) rotate(45deg);
709
+ }
673
710
 
674
- /* #endregion */
711
+ /* #endregion */
675
712
 
676
- /* #region Demo map (react-map-gl/maplibre shell) */
713
+ /* #region Demo map (react-map-gl/maplibre shell) */
677
714
 
678
- /*
679
- * The <DemoMap> wrapper. Sizing is the host's call (pass `style`/`className`), but a min-height keeps
715
+ /*
716
+ * The <MapCanvas> wrapper. Sizing is the host's call (pass `style`/`className`), but a min-height keeps
680
717
  * the map from collapsing to zero when a consumer forgets. The inner <Map> fills 100% of this box.
681
718
  * The host must ALSO import `maplibre-gl/dist/maplibre-gl.css` for the map's own control/canvas styles.
682
719
  */
683
- .mw-demo-map {
684
- position: relative;
685
- width: 100%;
686
- min-height: 320px;
687
- overflow: hidden;
688
- }
720
+ .mw-demo-map {
721
+ position: relative;
722
+ width: 100%;
723
+ min-height: 320px;
724
+ overflow: hidden;
725
+ }
689
726
 
690
- /*
727
+ /*
691
728
  * The demo fills its positioning context; the host sizes it (a full-viewport wrapper in docs). The map is the
692
729
  * background layer, the control panel floats over the top-left (bottom on narrow screens). A host that wants a
693
730
  * different layout can restyle these classes without touching the components.
694
731
  */
695
- .mw-geocoder-demo {
696
- position: relative;
697
- width: 100%;
698
- height: 100%;
699
- min-height: 480px;
700
- }
701
-
702
- .mw-geocoder-demo__map {
703
- position: absolute;
704
- inset: 0;
705
- }
732
+ .mw-geocoder-demo {
733
+ position: relative;
734
+ width: 100%;
735
+ height: 100%;
736
+ min-height: 480px;
737
+ }
706
738
 
707
- .mw-demo-controls {
708
- position: absolute;
709
- top: 1rem;
710
- left: 1rem;
711
- z-index: 2;
712
- width: min(360px, calc(100% - 2rem));
713
- max-height: calc(100% - 2rem);
714
- overflow-y: auto;
715
- padding: 1rem;
716
- border-radius: 10px;
717
- background: color-mix(in srgb, var(--ifm-background-surface-color, #fff) 92%, transparent);
718
- box-shadow: 0 2px 16px rgba(0, 0, 0, 0.18);
719
- font-size: 0.95rem;
720
- }
739
+ .mw-geocoder-demo__map {
740
+ position: absolute;
741
+ inset: 0;
742
+ }
721
743
 
722
- @media (max-width: 600px) {
723
744
  .mw-demo-controls {
724
- top: auto;
725
- bottom: 1rem;
745
+ position: absolute;
746
+ top: 1rem;
726
747
  left: 1rem;
727
- right: 1rem;
728
- width: auto;
748
+ z-index: 2;
749
+ width: min(360px, calc(100% - 2rem));
750
+ max-height: calc(100% - 2rem);
751
+ overflow-y: auto;
752
+ padding: 1rem;
753
+ border-radius: 10px;
754
+ background: color-mix(in srgb, var(--color-background-raised) 92%, transparent);
755
+ box-shadow: 0 2px 16px rgba(0, 0, 0, 0.18);
756
+ font-size: 0.95rem;
729
757
  }
730
- }
731
758
 
732
- /* #endregion */
759
+ @media (max-width: 600px) {
760
+ .mw-demo-controls {
761
+ top: auto;
762
+ bottom: 1rem;
763
+ left: 1rem;
764
+ right: 1rem;
765
+ width: auto;
766
+ }
767
+ }
733
768
 
734
- /* #region Demo control field (version / compare-version selects) */
769
+ /* #endregion */
735
770
 
736
- .mw-demo-control {
737
- margin-bottom: 0.75rem;
738
- }
771
+ /* #region Demo control field (version / compare-version selects) */
739
772
 
740
- .mw-demo-control__label {
741
- display: block;
742
- margin-bottom: 0.25rem;
743
- font-weight: 600;
744
- font-size: 0.9rem;
745
- }
773
+ .mw-demo-control {
774
+ margin-bottom: 0.75rem;
775
+ }
746
776
 
747
- .mw-demo-control__select {
748
- width: 100%;
749
- padding: 0.4rem;
750
- font: inherit;
751
- border: 1px solid var(--ifm-color-emphasis-300, #d1d5db);
752
- border-radius: 6px;
753
- background: var(--ifm-background-surface-color, #fff);
754
- color: var(--ifm-font-color-base, inherit);
755
- }
777
+ .mw-demo-control__label {
778
+ display: block;
779
+ margin-bottom: 0.25rem;
780
+ font-weight: 600;
781
+ font-size: 0.9rem;
782
+ }
756
783
 
757
- .mw-demo-control__select:disabled {
758
- opacity: 0.5;
759
- }
784
+ .mw-demo-control__select {
785
+ width: 100%;
786
+ padding: 0.4rem;
787
+ font: inherit;
788
+ border: 1px solid var(--control-border);
789
+ border-radius: 6px;
790
+ background: var(--color-background-raised);
791
+ color: var(--color-text-primary);
792
+ }
760
793
 
761
- /* #endregion */
794
+ .mw-demo-control__select:disabled {
795
+ opacity: 0.5;
796
+ }
762
797
 
763
- /* #region Backend indicator + WASM toggle / compare toggle */
798
+ /* #endregion */
764
799
 
765
- .mw-demo-backend,
766
- .mw-demo-compare {
767
- display: flex;
768
- align-items: center;
769
- gap: 0.75rem;
770
- flex-wrap: wrap;
771
- margin-bottom: 0.75rem;
772
- font-size: 0.85rem;
773
- }
800
+ /* #region Backend indicator + WASM toggle / compare toggle */
774
801
 
775
- .mw-demo-compare {
776
- display: block;
777
- }
802
+ .mw-demo-backend,
803
+ .mw-demo-compare {
804
+ display: flex;
805
+ align-items: center;
806
+ gap: 0.75rem;
807
+ flex-wrap: wrap;
808
+ margin-bottom: 0.75rem;
809
+ font-size: 0.85rem;
810
+ }
778
811
 
779
- .mw-demo-backend__active {
780
- opacity: 0.7;
781
- }
812
+ .mw-demo-compare {
813
+ display: block;
814
+ }
782
815
 
783
- .mw-demo-backend__toggle,
784
- .mw-demo-compare__toggle {
785
- display: inline-flex;
786
- align-items: center;
787
- gap: 0.25rem;
788
- cursor: pointer;
789
- opacity: 0.8;
790
- }
816
+ .mw-demo-backend__active {
817
+ opacity: 0.7;
818
+ }
791
819
 
792
- .mw-demo-compare__toggle {
793
- margin-bottom: 0.5rem;
794
- }
820
+ .mw-demo-backend__toggle,
821
+ .mw-demo-compare__toggle {
822
+ display: inline-flex;
823
+ align-items: center;
824
+ gap: 0.25rem;
825
+ cursor: pointer;
826
+ opacity: 0.8;
827
+ }
795
828
 
796
- .mw-demo-compare__status {
797
- margin: 0.25rem 0 0;
798
- font-size: 0.8rem;
799
- color: var(--ifm-color-emphasis-600, #6e6e6e);
800
- }
829
+ .mw-demo-compare__toggle {
830
+ margin-bottom: 0.5rem;
831
+ }
801
832
 
802
- /* #endregion */
833
+ .mw-demo-compare__status {
834
+ margin: 0.25rem 0 0;
835
+ font-size: 0.8rem;
836
+ color: var(--color-text-secondary);
837
+ }
803
838
 
804
- /* #region Place autocomplete listbox (reuses .mw-chip) */
839
+ /* #endregion */
805
840
 
806
- .mw-demo-suggest {
807
- margin-top: 0.75rem;
808
- display: flex;
809
- flex-wrap: wrap;
810
- gap: 0.4rem;
811
- align-items: baseline;
812
- }
841
+ /* #region Place autocomplete listbox (reuses .mw-chip) */
813
842
 
814
- .mw-demo-suggest__label {
815
- font-size: 0.85rem;
816
- color: var(--ifm-color-emphasis-600, #6e6e6e);
817
- margin-right: 0.25rem;
818
- }
843
+ .mw-demo-suggest {
844
+ margin-top: 0.75rem;
845
+ display: flex;
846
+ flex-wrap: wrap;
847
+ gap: 0.4rem;
848
+ align-items: baseline;
849
+ }
850
+
851
+ .mw-demo-suggest__label {
852
+ font-size: 0.85rem;
853
+ color: var(--color-text-secondary);
854
+ margin-right: 0.25rem;
855
+ }
856
+
857
+ .mw-chip--active {
858
+ outline: 2px solid var(--color-accent);
859
+ outline-offset: 1px;
860
+ }
861
+
862
+ /* #endregion */
863
+
864
+ /* #region Span ribbon (SpanHighlight) — each tagged span is a column: the text on top, tinted by tier, the tag beneath */
865
+
866
+ .mw-spans {
867
+ margin: 0.5rem 0 1rem 0;
868
+ }
869
+
870
+ .mw-spans__legend {
871
+ display: flex;
872
+ align-items: center;
873
+ gap: 0.35rem;
874
+ font-size: 0.7rem;
875
+ text-transform: uppercase;
876
+ letter-spacing: 0.04em;
877
+ color: var(--color-text-secondary);
878
+ margin-bottom: 0.5rem;
879
+ }
880
+
881
+ .mw-spans__swatch {
882
+ display: inline-block;
883
+ width: 0.8rem;
884
+ height: 0.8rem;
885
+ border-radius: 2px;
886
+ margin-left: 0.4rem;
887
+ }
888
+
889
+ .mw-spans__track {
890
+ display: flex;
891
+ flex-wrap: wrap;
892
+ align-items: flex-end;
893
+ row-gap: 1.5rem;
894
+ padding: 0.5rem 0.6rem;
895
+ border: 1px solid var(--color-separator);
896
+ border-radius: 6px;
897
+ background: var(--color-background-raised);
898
+ font-family: var(--font-family-code);
899
+ font-size: 0.9rem;
900
+ line-height: 1.4;
901
+ }
902
+
903
+ .mw-spans__seg {
904
+ display: inline-flex;
905
+ flex-direction: column;
906
+ align-items: stretch;
907
+ }
908
+
909
+ .mw-spans__text {
910
+ padding: 0.05rem 0.1rem;
911
+ border-bottom: 2px solid transparent;
912
+ white-space: pre;
913
+ }
914
+
915
+ .mw-spans__tag {
916
+ margin-top: 0.15rem;
917
+ font-size: 0.6rem;
918
+ line-height: 1;
919
+ text-align: center;
920
+ letter-spacing: 0.02em;
921
+ color: var(--color-text-secondary);
922
+ white-space: nowrap;
923
+ }
924
+
925
+ .mw-spans__gap {
926
+ display: inline-flex;
927
+ align-items: flex-start;
928
+ white-space: pre;
929
+ color: var(--color-text-tertiary);
930
+ }
931
+
932
+ /* The tier tints match .mw-conf__bar--high/--mid/--low. */
933
+ .mw-spans__seg--high .mw-spans__text {
934
+ background: rgba(26, 168, 77, 0.18);
935
+ border-bottom-color: #1aa84d;
936
+ }
937
+
938
+ .mw-spans__seg--mid .mw-spans__text {
939
+ background: rgba(230, 168, 0, 0.18);
940
+ border-bottom-color: #e6a800;
941
+ }
942
+
943
+ .mw-spans__seg--low .mw-spans__text {
944
+ background: rgba(216, 80, 74, 0.18);
945
+ border-bottom-color: #d8504a;
946
+ }
947
+
948
+ .mw-spans__swatch--high {
949
+ background: #1aa84d;
950
+ }
819
951
 
820
- .mw-chip--active {
821
- outline: 2px solid var(--ifm-color-primary, #e0367c);
822
- outline-offset: 1px;
952
+ .mw-spans__swatch--mid {
953
+ background: #e6a800;
954
+ }
955
+
956
+ .mw-spans__swatch--low {
957
+ background: #d8504a;
958
+ }
959
+
960
+ /* #endregion */
961
+
962
+ /* #region Stage timing (TimingPanel) — a stacked bar by wall-clock, stage hues, never the confidence colours */
963
+
964
+ .mw-timing {
965
+ margin: 1rem 0;
966
+ font-size: 0.8rem;
967
+ }
968
+
969
+ .mw-timing__heading {
970
+ display: flex;
971
+ align-items: baseline;
972
+ justify-content: space-between;
973
+ text-transform: uppercase;
974
+ letter-spacing: 0.05em;
975
+ color: var(--color-text-secondary);
976
+ margin-bottom: 0.35rem;
977
+ }
978
+
979
+ .mw-timing__total {
980
+ font-family: var(--font-family-code);
981
+ text-transform: none;
982
+ letter-spacing: 0;
983
+ color: var(--color-text-secondary);
984
+ }
985
+
986
+ .mw-timing__bar {
987
+ display: flex;
988
+ width: 100%;
989
+ height: 0.7rem;
990
+ border-radius: 4px;
991
+ overflow: hidden;
992
+ background: var(--color-background-sunken);
993
+ }
994
+
995
+ .mw-timing__seg {
996
+ height: 100%;
997
+ }
998
+
999
+ .mw-timing__legend {
1000
+ display: flex;
1001
+ flex-wrap: wrap;
1002
+ gap: 0.25rem 1rem;
1003
+ margin-top: 0.4rem;
1004
+ color: var(--color-text-secondary);
1005
+ }
1006
+
1007
+ .mw-timing__item {
1008
+ display: inline-flex;
1009
+ align-items: center;
1010
+ gap: 0.35rem;
1011
+ }
1012
+
1013
+ .mw-timing__ms {
1014
+ font-family: var(--font-family-code);
1015
+ color: var(--color-text-secondary);
1016
+ }
1017
+
1018
+ .mw-timing__swatch {
1019
+ display: inline-block;
1020
+ width: 0.7rem;
1021
+ height: 0.7rem;
1022
+ border-radius: 2px;
1023
+ }
1024
+
1025
+ .mw-timing__seg--shape {
1026
+ background: #3578e5;
1027
+ }
1028
+
1029
+ .mw-timing__seg--classify {
1030
+ background: #8b5cf6;
1031
+ }
1032
+
1033
+ .mw-timing__seg--resolve {
1034
+ background: #14b8a6;
1035
+ }
1036
+
1037
+ /* #endregion */
1038
+
1039
+ /* #region Containment tree (TreeView) — nested lists with a guide rail per level */
1040
+
1041
+ .mw-tree {
1042
+ margin: 0.5rem 0 0 0;
1043
+ }
1044
+
1045
+ .mw-tree__children {
1046
+ list-style: none;
1047
+ margin: 0;
1048
+ padding-left: 1.1rem;
1049
+ }
1050
+
1051
+ /* Nested levels get a guide rail; the outermost list sits flush. */
1052
+ .mw-tree__children .mw-tree__children {
1053
+ border-left: 1px solid var(--control-border);
1054
+ margin-left: 0.3rem;
1055
+ }
1056
+
1057
+ .mw-tree__node {
1058
+ margin: 0.15rem 0;
1059
+ }
1060
+
1061
+ .mw-tree__row {
1062
+ display: inline-flex;
1063
+ align-items: baseline;
1064
+ gap: 0.5rem;
1065
+ font-size: 0.85rem;
1066
+ }
1067
+
1068
+ .mw-tree__tag {
1069
+ font-weight: 600;
1070
+ padding: 0 0.3rem;
1071
+ border-radius: 3px;
1072
+ border-bottom: 2px solid transparent;
1073
+ }
1074
+
1075
+ .mw-tree__value {
1076
+ font-family: var(--font-family-code);
1077
+ }
1078
+
1079
+ .mw-tree__conf {
1080
+ font-family: var(--font-family-code);
1081
+ font-size: 0.75rem;
1082
+ color: var(--color-text-secondary);
1083
+ }
1084
+
1085
+ .mw-tree__tag--high {
1086
+ background: rgba(26, 168, 77, 0.18);
1087
+ border-bottom-color: #1aa84d;
1088
+ }
1089
+
1090
+ .mw-tree__tag--mid {
1091
+ background: rgba(230, 168, 0, 0.18);
1092
+ border-bottom-color: #e6a800;
1093
+ }
1094
+
1095
+ .mw-tree__tag--low {
1096
+ background: rgba(216, 80, 74, 0.18);
1097
+ border-bottom-color: #d8504a;
1098
+ }
1099
+
1100
+ /* #endregion */
1101
+
1102
+ /* #region No-hit diagnostic (FailureDiagnostic) — a structured panel, tinted informational rather than red */
1103
+
1104
+ .mw-failure {
1105
+ margin-top: 1rem;
1106
+ padding: 0.75rem 1rem;
1107
+ background: var(--color-state-warning-background);
1108
+ border-left: 3px solid var(--color-state-warning);
1109
+ border-radius: 4px;
1110
+ }
1111
+
1112
+ .mw-failure h2 {
1113
+ font-size: 1rem;
1114
+ margin: 0 0 0.5rem 0;
1115
+ text-transform: uppercase;
1116
+ letter-spacing: 0.05em;
1117
+ color: var(--color-state-warning);
1118
+ }
1119
+
1120
+ .mw-failure ul {
1121
+ margin: 0;
1122
+ padding-left: 1.25rem;
1123
+ font-size: 0.875rem;
1124
+ color: var(--color-text-primary);
1125
+ }
1126
+
1127
+ .mw-failure li + li {
1128
+ margin-top: 0.35rem;
1129
+ }
1130
+
1131
+ /* #endregion */
1132
+
1133
+ /* #region About box (About) — the collapsible product explainer */
1134
+
1135
+ .mw-about {
1136
+ margin-bottom: 1rem;
1137
+ border: 1px solid var(--control-border);
1138
+ border-radius: 8px;
1139
+ background: var(--color-background-raised);
1140
+ font-size: 0.9rem;
1141
+ }
1142
+
1143
+ .mw-about[open] {
1144
+ background: var(--color-background-canvas);
1145
+ }
1146
+
1147
+ .mw-about__summary {
1148
+ padding: 0.65rem 0.75rem;
1149
+ cursor: pointer;
1150
+ user-select: none;
1151
+ font-weight: 600;
1152
+ display: flex;
1153
+ align-items: center;
1154
+ gap: 0.35rem;
1155
+ border-radius: 8px;
1156
+ }
1157
+
1158
+ .mw-about__summary:hover {
1159
+ background: var(--control-background);
1160
+ }
1161
+
1162
+ .mw-about__icon {
1163
+ font-size: 1.1rem;
1164
+ opacity: 0.7;
1165
+ }
1166
+
1167
+ .mw-about__body {
1168
+ padding: 0 0.75rem 0.75rem;
1169
+ }
1170
+
1171
+ .mw-about__section {
1172
+ margin-top: 0.75rem;
1173
+ }
1174
+
1175
+ .mw-about__section:first-child {
1176
+ margin-top: 0;
1177
+ }
1178
+
1179
+ .mw-about__heading {
1180
+ font-size: 0.9rem;
1181
+ font-weight: 700;
1182
+ margin: 0 0 0.3rem;
1183
+ color: var(--color-text-primary);
1184
+ }
1185
+
1186
+ .mw-about__section p {
1187
+ margin: 0;
1188
+ line-height: 1.6;
1189
+ color: var(--color-text-secondary);
1190
+ }
1191
+
1192
+ .mw-about__section code {
1193
+ font-size: 0.85rem;
1194
+ padding: 0.1rem 0.3rem;
1195
+ background: var(--color-background-sunken);
1196
+ border-radius: 3px;
1197
+ }
1198
+
1199
+ .mw-about__legend {
1200
+ list-style: none;
1201
+ margin: 0.5rem 0 0;
1202
+ padding: 0;
1203
+ display: flex;
1204
+ flex-direction: column;
1205
+ gap: 0.35rem;
1206
+ }
1207
+
1208
+ .mw-about__item {
1209
+ display: flex;
1210
+ align-items: center;
1211
+ gap: 0.4rem;
1212
+ font-size: 0.85rem;
1213
+ }
1214
+
1215
+ .mw-about__swatch {
1216
+ flex-shrink: 0;
1217
+ width: 10px;
1218
+ height: 10px;
1219
+ border-radius: 2px;
1220
+ }
1221
+
1222
+ .mw-about__swatch--high {
1223
+ background: #22c55e;
1224
+ }
1225
+
1226
+ .mw-about__swatch--mid {
1227
+ background: #f59e0b;
1228
+ }
1229
+
1230
+ .mw-about__swatch--low {
1231
+ background: #ef4444;
1232
+ }
823
1233
  }