lanre-ds 0.0.0-stage → 0.2.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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/components/buttons/Button.d.ts +28 -0
  3. package/components/buttons/Button.jsx +50 -0
  4. package/components/buttons/Button.prompt.md +16 -0
  5. package/components/buttons/IconButton.d.ts +23 -0
  6. package/components/buttons/IconButton.jsx +53 -0
  7. package/components/buttons/IconButton.prompt.md +12 -0
  8. package/components/buttons/SegmentedTabs.d.ts +21 -0
  9. package/components/buttons/SegmentedTabs.jsx +15 -0
  10. package/components/buttons/SegmentedTabs.prompt.md +10 -0
  11. package/components/contributor/AudioRecorder.d.ts +27 -0
  12. package/components/contributor/AudioRecorder.jsx +79 -0
  13. package/components/contributor/AudioRecorder.prompt.md +13 -0
  14. package/components/contributor/RadioCard.d.ts +17 -0
  15. package/components/contributor/RadioCard.jsx +30 -0
  16. package/components/contributor/RadioCard.prompt.md +12 -0
  17. package/components/contributor/RecorderPanel.d.ts +30 -0
  18. package/components/contributor/RecorderPanel.jsx +49 -0
  19. package/components/contributor/RecorderPanel.prompt.md +11 -0
  20. package/components/contributor/StepBar.d.ts +17 -0
  21. package/components/contributor/StepBar.jsx +55 -0
  22. package/components/contributor/StepBar.prompt.md +12 -0
  23. package/components/contributor/TextField.d.ts +25 -0
  24. package/components/contributor/TextField.jsx +29 -0
  25. package/components/contributor/TextField.prompt.md +7 -0
  26. package/components/contributor/UploadTile.d.ts +39 -0
  27. package/components/contributor/UploadTile.jsx +116 -0
  28. package/components/contributor/UploadTile.prompt.md +21 -0
  29. package/components/contributor/WorldChip.d.ts +18 -0
  30. package/components/contributor/WorldChip.jsx +16 -0
  31. package/components/contributor/WorldChip.prompt.md +9 -0
  32. package/components/contributor/WorldOption.d.ts +19 -0
  33. package/components/contributor/WorldOption.jsx +19 -0
  34. package/components/contributor/WorldOption.prompt.md +11 -0
  35. package/components/contributor/WorldSign.d.ts +25 -0
  36. package/components/contributor/WorldSign.jsx +32 -0
  37. package/components/contributor/WorldSign.prompt.md +14 -0
  38. package/components/contributor/WorldSigns.d.ts +13 -0
  39. package/components/contributor/WorldSigns.jsx +12 -0
  40. package/components/contributor/WorldSigns.prompt.md +8 -0
  41. package/components/effects/Confetti.d.ts +14 -0
  42. package/components/effects/Confetti.jsx +38 -0
  43. package/components/effects/Confetti.prompt.md +12 -0
  44. package/components/effects/Sparkles.d.ts +9 -0
  45. package/components/effects/Sparkles.jsx +13 -0
  46. package/components/effects/Sparkles.prompt.md +11 -0
  47. package/components/effects/Sunburst.d.ts +23 -0
  48. package/components/effects/Sunburst.jsx +26 -0
  49. package/components/effects/Sunburst.prompt.md +12 -0
  50. package/components/feedback/Badge.d.ts +17 -0
  51. package/components/feedback/Badge.jsx +16 -0
  52. package/components/feedback/Badge.prompt.md +10 -0
  53. package/components/feedback/ErrorText.d.ts +11 -0
  54. package/components/feedback/ErrorText.jsx +8 -0
  55. package/components/feedback/ErrorText.prompt.md +9 -0
  56. package/components/feedback/LoadingScreen.d.ts +14 -0
  57. package/components/feedback/LoadingScreen.jsx +24 -0
  58. package/components/feedback/LoadingScreen.prompt.md +9 -0
  59. package/components/feedback/Notice.d.ts +15 -0
  60. package/components/feedback/Notice.jsx +16 -0
  61. package/components/feedback/Notice.prompt.md +10 -0
  62. package/components/feedback/SaveAlert.d.ts +15 -0
  63. package/components/feedback/SaveAlert.jsx +24 -0
  64. package/components/feedback/SaveAlert.prompt.md +9 -0
  65. package/components/feedback/SavePill.d.ts +13 -0
  66. package/components/feedback/SavePill.jsx +29 -0
  67. package/components/feedback/SavePill.prompt.md +8 -0
  68. package/components/feedback/SoundToggle.d.ts +16 -0
  69. package/components/feedback/SoundToggle.jsx +15 -0
  70. package/components/feedback/SoundToggle.prompt.md +6 -0
  71. package/components/feedback/Sticker.d.ts +15 -0
  72. package/components/feedback/Sticker.jsx +12 -0
  73. package/components/feedback/Sticker.prompt.md +9 -0
  74. package/components/feedback/Tag.d.ts +15 -0
  75. package/components/feedback/Tag.jsx +15 -0
  76. package/components/feedback/Tag.prompt.md +10 -0
  77. package/components/feedback/Toast.d.ts +21 -0
  78. package/components/feedback/Toast.jsx +19 -0
  79. package/components/feedback/Toast.prompt.md +7 -0
  80. package/components/forms/Slider.d.ts +24 -0
  81. package/components/forms/Slider.jsx +28 -0
  82. package/components/forms/Slider.prompt.md +6 -0
  83. package/components/forms/Switch.d.ts +19 -0
  84. package/components/forms/Switch.jsx +20 -0
  85. package/components/forms/Switch.prompt.md +6 -0
  86. package/components/games/MatchCard.d.ts +18 -0
  87. package/components/games/MatchCard.jsx +27 -0
  88. package/components/games/MatchCard.prompt.md +11 -0
  89. package/components/hud/Countdown.d.ts +33 -0
  90. package/components/hud/Countdown.jsx +74 -0
  91. package/components/hud/Countdown.prompt.md +15 -0
  92. package/components/hud/CurrencyPill.d.ts +24 -0
  93. package/components/hud/CurrencyPill.jsx +34 -0
  94. package/components/hud/CurrencyPill.prompt.md +12 -0
  95. package/components/hud/HudBar.d.ts +18 -0
  96. package/components/hud/HudBar.jsx +14 -0
  97. package/components/hud/HudBar.prompt.md +15 -0
  98. package/components/hud/HudChip.d.ts +25 -0
  99. package/components/hud/HudChip.jsx +30 -0
  100. package/components/hud/HudChip.prompt.md +13 -0
  101. package/components/hud/ProgressBar.d.ts +27 -0
  102. package/components/hud/ProgressBar.jsx +39 -0
  103. package/components/hud/ProgressBar.prompt.md +11 -0
  104. package/components/hud/TimerChip.d.ts +19 -0
  105. package/components/hud/TimerChip.jsx +17 -0
  106. package/components/hud/TimerChip.prompt.md +7 -0
  107. package/components/icons/GameIcon.d.ts +25 -0
  108. package/components/icons/GameIcon.jsx +43 -0
  109. package/components/icons/GameIcon.prompt.md +13 -0
  110. package/components/identity/Avatar.d.ts +26 -0
  111. package/components/identity/Avatar.jsx +31 -0
  112. package/components/identity/Avatar.prompt.md +11 -0
  113. package/components/identity/AvatarButton.d.ts +19 -0
  114. package/components/identity/AvatarButton.jsx +13 -0
  115. package/components/identity/AvatarButton.prompt.md +8 -0
  116. package/components/identity/Gemstone.d.ts +28 -0
  117. package/components/identity/Gemstone.jsx +46 -0
  118. package/components/identity/Gemstone.prompt.md +15 -0
  119. package/components/identity/PersonTile.d.ts +22 -0
  120. package/components/identity/PersonTile.jsx +27 -0
  121. package/components/identity/PersonTile.prompt.md +10 -0
  122. package/components/levels/ChoiceButton.d.ts +20 -0
  123. package/components/levels/ChoiceButton.jsx +31 -0
  124. package/components/levels/ChoiceButton.prompt.md +10 -0
  125. package/components/map/DiscoveryMarker.d.ts +19 -0
  126. package/components/map/DiscoveryMarker.jsx +31 -0
  127. package/components/map/DiscoveryMarker.prompt.md +11 -0
  128. package/components/map/LevelNode.d.ts +19 -0
  129. package/components/map/LevelNode.jsx +37 -0
  130. package/components/map/LevelNode.prompt.md +11 -0
  131. package/components/map/PortraitMedallion.d.ts +27 -0
  132. package/components/map/PortraitMedallion.jsx +29 -0
  133. package/components/map/PortraitMedallion.prompt.md +14 -0
  134. package/components/map/StarRating.d.ts +22 -0
  135. package/components/map/StarRating.jsx +21 -0
  136. package/components/map/StarRating.prompt.md +6 -0
  137. package/components/map/Tile.d.ts +22 -0
  138. package/components/map/Tile.jsx +32 -0
  139. package/components/map/Tile.prompt.md +8 -0
  140. package/components/map/WorldGate.d.ts +21 -0
  141. package/components/map/WorldGate.jsx +27 -0
  142. package/components/map/WorldGate.prompt.md +13 -0
  143. package/components/map/worlds.d.ts +18 -0
  144. package/components/map/worlds.js +9 -0
  145. package/components/media/Album.d.ts +33 -0
  146. package/components/media/Album.jsx +157 -0
  147. package/components/media/Album.prompt.md +16 -0
  148. package/components/media/Cassette.d.ts +23 -0
  149. package/components/media/Cassette.jsx +64 -0
  150. package/components/media/Cassette.prompt.md +13 -0
  151. package/components/media/Film.d.ts +20 -0
  152. package/components/media/Film.jsx +39 -0
  153. package/components/media/Film.prompt.md +14 -0
  154. package/components/media/MemoryText.d.ts +20 -0
  155. package/components/media/MemoryText.jsx +14 -0
  156. package/components/media/MemoryText.prompt.md +9 -0
  157. package/components/media/Unavailable.d.ts +13 -0
  158. package/components/media/Unavailable.jsx +13 -0
  159. package/components/media/Unavailable.prompt.md +10 -0
  160. package/components/media/Words.d.ts +21 -0
  161. package/components/media/Words.jsx +57 -0
  162. package/components/media/Words.prompt.md +12 -0
  163. package/components/media/shared.js +19 -0
  164. package/components/panels/Modal.d.ts +25 -0
  165. package/components/panels/Modal.jsx +68 -0
  166. package/components/panels/Modal.prompt.md +20 -0
  167. package/components/panels/Panel.d.ts +29 -0
  168. package/components/panels/Panel.jsx +109 -0
  169. package/components/panels/Panel.prompt.md +13 -0
  170. package/components/quiz/LeaderboardRow.d.ts +26 -0
  171. package/components/quiz/LeaderboardRow.jsx +24 -0
  172. package/components/quiz/LeaderboardRow.prompt.md +10 -0
  173. package/components/rewards/ItemCell.d.ts +24 -0
  174. package/components/rewards/ItemCell.jsx +24 -0
  175. package/components/rewards/ItemCell.prompt.md +9 -0
  176. package/components/rewards/RewardCard.d.ts +24 -0
  177. package/components/rewards/RewardCard.jsx +34 -0
  178. package/components/rewards/RewardCard.prompt.md +8 -0
  179. package/components/rewards/ShopRow.d.ts +23 -0
  180. package/components/rewards/ShopRow.jsx +26 -0
  181. package/components/rewards/ShopRow.prompt.md +7 -0
  182. package/components/text/Heading.d.ts +19 -0
  183. package/components/text/Heading.jsx +15 -0
  184. package/components/text/Heading.prompt.md +10 -0
  185. package/components/text/OutlineText.d.ts +24 -0
  186. package/components/text/OutlineText.jsx +20 -0
  187. package/components/text/OutlineText.prompt.md +11 -0
  188. package/components/toolbar/FastTravelDock.d.ts +50 -0
  189. package/components/toolbar/FastTravelDock.jsx +36 -0
  190. package/components/toolbar/FastTravelDock.prompt.md +12 -0
  191. package/components/toolbar/Toolbar.d.ts +16 -0
  192. package/components/toolbar/Toolbar.jsx +8 -0
  193. package/components/toolbar/Toolbar.prompt.md +14 -0
  194. package/components/toolbar/ToolbarNext.d.ts +21 -0
  195. package/components/toolbar/ToolbarNext.jsx +21 -0
  196. package/components/toolbar/ToolbarNext.prompt.md +13 -0
  197. package/components/toolbar/ToolbarTab.d.ts +15 -0
  198. package/components/toolbar/ToolbarTab.jsx +12 -0
  199. package/components/toolbar/ToolbarTab.prompt.md +9 -0
  200. package/components/viewer/ClueCard.d.ts +18 -0
  201. package/components/viewer/ClueCard.jsx +14 -0
  202. package/components/viewer/ClueCard.prompt.md +9 -0
  203. package/components/viewer/ClueTab.d.ts +16 -0
  204. package/components/viewer/ClueTab.jsx +12 -0
  205. package/components/viewer/ClueTab.prompt.md +8 -0
  206. package/components/viewer/RevealTray.d.ts +54 -0
  207. package/components/viewer/RevealTray.jsx +58 -0
  208. package/components/viewer/RevealTray.prompt.md +21 -0
  209. package/components/viewer/RoadsideViewer.d.ts +60 -0
  210. package/components/viewer/RoadsideViewer.jsx +96 -0
  211. package/components/viewer/RoadsideViewer.prompt.md +20 -0
  212. package/components/viewer/ViewerKeys.d.ts +26 -0
  213. package/components/viewer/ViewerKeys.jsx +22 -0
  214. package/components/viewer/ViewerKeys.prompt.md +14 -0
  215. package/components/viewer/ViewerKnob.d.ts +20 -0
  216. package/components/viewer/ViewerKnob.jsx +12 -0
  217. package/components/viewer/ViewerKnob.prompt.md +11 -0
  218. package/components/viewer/WhoButton.d.ts +21 -0
  219. package/components/viewer/WhoButton.jsx +15 -0
  220. package/components/viewer/WhoButton.prompt.md +10 -0
  221. package/package.json +62 -4
  222. package/readme.md +145 -0
  223. package/styles.css +15 -0
  224. package/tokens/colors.css +140 -0
  225. package/tokens/effects.css +40 -0
  226. package/tokens/fonts.css +3 -0
  227. package/tokens/fx.css +186 -0
  228. package/tokens/gems.css +8 -0
  229. package/tokens/hud.css +510 -0
  230. package/tokens/icons.css +7 -0
  231. package/tokens/media.css +774 -0
  232. package/tokens/signs.css +459 -0
  233. package/tokens/spacing.css +38 -0
  234. package/tokens/typography.css +34 -0
  235. package/tokens/ui.css +432 -0
  236. package/tokens/utilities.css +34 -0
  237. package/tokens/viewer.css +1176 -0
  238. package/tokens/worlds.css +73 -0
  239. package/tools/ds-loader.js +60 -0
  240. package/README.md +0 -3
package/tokens/ui.css ADDED
@@ -0,0 +1,432 @@
1
+ /* Small interface pieces: a heading with its plate, a sticker, a notice and error text, the autosave pill and alert, an avatar
2
+ button with a pencil, segmented tabs, the voice recorder card and the portrait medallion. Used by Heading, Sticker, Notice,
3
+ ErrorText, SavePill, SaveAlert, AvatarButton, SegmentedTabs, RecorderPanel and PortraitMedallion. */
4
+
5
+ /* The friend's avatar in the HUD, with a small pencil to say it can be changed. */
6
+ .mp-avatar-button {
7
+ appearance: none;
8
+ position: relative;
9
+ flex: none;
10
+ width: 48px;
11
+ height: 48px;
12
+ padding: 0;
13
+ border: 0;
14
+ background: none;
15
+ cursor: pointer;
16
+ border-radius: 50%;
17
+ transition: transform var(--dur-fast) var(--ease-out);
18
+ -webkit-tap-highlight-color: transparent;
19
+ }
20
+
21
+ .mp-avatar-button:active {
22
+ transform: translateY(2px) scale(0.97);
23
+ }
24
+
25
+ .mp-avatar-badge {
26
+ position: absolute;
27
+ right: -4px;
28
+ bottom: -4px;
29
+ width: 22px;
30
+ height: 22px;
31
+ box-sizing: border-box;
32
+ border-radius: 50%;
33
+ border: 2px solid #fff;
34
+ display: grid;
35
+ place-items: center;
36
+ background: linear-gradient(180deg, var(--wood-300), var(--wood-500) 55%);
37
+ box-shadow: 0 2px 0 var(--wood-700);
38
+ color: #fff;
39
+ font-size: 11px;
40
+ }
41
+
42
+ .mp-save-pill {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: 6px;
46
+ height: 36px;
47
+ margin-top: 6px;
48
+ padding: 0 12px 0 8px;
49
+ border-radius: 999px;
50
+ background: var(--surface-hud);
51
+ box-shadow: inset 0 2px 0 oklch(1 0 0 / 0.12), 0 3px 0 oklch(0.2 0.05 60 / 0.35);
52
+ font-family: var(--font-display);
53
+ font-size: 12px;
54
+ letter-spacing: 0.06em;
55
+ text-transform: uppercase;
56
+ color: #fff;
57
+ white-space: nowrap;
58
+ flex: none;
59
+ }
60
+
61
+ .mp-save-pill i {
62
+ font-size: 20px;
63
+ color: var(--green-300);
64
+ }
65
+
66
+ /* Tappable: the same pill, as a button */
67
+ .mp-save-pill[type='button'] {
68
+ appearance: none;
69
+ border: 0;
70
+ cursor: pointer;
71
+ font: inherit;
72
+ font-family: var(--font-display);
73
+ font-size: 12px;
74
+ letter-spacing: 0.06em;
75
+ text-transform: uppercase;
76
+ -webkit-tap-highlight-color: transparent;
77
+ transition: padding var(--dur-fast) var(--ease-out);
78
+ }
79
+
80
+ .mp-save-pill-icon {
81
+ padding: 0 8px;
82
+ }
83
+
84
+ .mp-save-word {
85
+ animation: mp-word-in var(--dur-base) var(--ease-out) both;
86
+ }
87
+
88
+ .mp-save-pill-busy i {
89
+ color: var(--blue-300);
90
+ }
91
+
92
+ .mp-save-pill-warn {
93
+ background: var(--coral-700);
94
+ }
95
+
96
+ .mp-save-pill-warn i {
97
+ color: var(--coral-100);
98
+ }
99
+
100
+ /* ---------- Headings and copy ---------- */
101
+ .mp-heading {
102
+ display: flex;
103
+ flex-direction: column;
104
+ align-items: center;
105
+ gap: 10px;
106
+ text-align: center;
107
+ }
108
+
109
+ .mp-heading-title {
110
+ margin: 0;
111
+ max-width: 340px;
112
+ font-family: var(--font-display);
113
+ font-weight: 400;
114
+ font-size: 34px;
115
+ line-height: 1.05;
116
+ letter-spacing: var(--tracking-display);
117
+ text-transform: uppercase;
118
+ color: #fff;
119
+ -webkit-text-stroke: 0.16em var(--world-stroke);
120
+ paint-order: stroke fill;
121
+ text-shadow: 0 3px 0 oklch(0 0 0 / 0.22);
122
+ text-wrap: balance;
123
+ }
124
+
125
+ .mp-plate {
126
+ margin: 0;
127
+ max-width: 340px;
128
+ padding: 10px 16px;
129
+ box-sizing: border-box;
130
+ border-radius: var(--radius-md);
131
+ background: var(--cream-50);
132
+ box-shadow: 0 3px 0 var(--cream-300), 0 8px 16px oklch(0.2 0.05 60 / 0.18);
133
+ font-size: 15px;
134
+ line-height: 1.4;
135
+ font-weight: 700;
136
+ color: var(--ink-700);
137
+ text-wrap: pretty;
138
+ }
139
+
140
+ .mp-sticker {
141
+ width: 40px;
142
+ height: 40px;
143
+ flex: none;
144
+ border-radius: 50%;
145
+ display: grid;
146
+ place-items: center;
147
+ background: linear-gradient(180deg, var(--tone-hi), var(--tone-face) 50%);
148
+ box-shadow: 0 3px 0 var(--tone-side), inset 0 2px 0 oklch(1 0 0 / 0.45);
149
+ color: #fff;
150
+ font-size: 20px;
151
+ text-shadow: 0 1px 0 var(--tone-side);
152
+ }
153
+
154
+ .mp-notice {
155
+ /* Above a celebration glow on the Sent and quiz result screens. */
156
+ position: relative;
157
+ animation: mp-arrive var(--dur-base) var(--ease-out) both;
158
+ z-index: 1;
159
+ display: grid;
160
+ grid-template-columns: 40px 1fr;
161
+ gap: var(--space-3);
162
+ align-items: center;
163
+ padding: 12px 16px;
164
+ border-radius: var(--radius-md);
165
+ background: var(--cream-50);
166
+ box-shadow: 0 3px 0 var(--cream-300), 0 8px 16px oklch(0.2 0.05 60 / 0.18);
167
+ font-size: 14px;
168
+ line-height: 1.45;
169
+ color: var(--ink-700);
170
+ }
171
+
172
+ .mp-notice-warn {
173
+ background: var(--coral-100);
174
+ border: 3px solid var(--coral-500);
175
+ box-shadow: 0 4px 0 var(--coral-700);
176
+ color: var(--coral-900);
177
+ }
178
+
179
+ .mp-notice-gold {
180
+ background: linear-gradient(180deg, var(--gold-100), var(--cream-50));
181
+ border: 4px solid var(--gold-500);
182
+ box-shadow: 0 5px 0 var(--gold-700), 0 14px 24px oklch(0.22 0.05 60 / 0.3);
183
+ color: var(--gold-900);
184
+ }
185
+
186
+ .mp-error-text {
187
+ margin: 0;
188
+ justify-self: center;
189
+ padding: 6px 12px;
190
+ border-radius: var(--radius-sm);
191
+ background: var(--coral-100);
192
+ color: var(--coral-900);
193
+ font-size: 13px;
194
+ line-height: 1.45;
195
+ font-weight: 700;
196
+ }
197
+
198
+ .mp-save-alert {
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ flex-wrap: wrap;
203
+ gap: 4px 8px;
204
+ padding: 6px 12px;
205
+ border-radius: var(--radius-sm);
206
+ background: var(--coral-100);
207
+ color: var(--coral-900);
208
+ font-size: 13px;
209
+ font-weight: 700;
210
+ }
211
+
212
+ /* The save pill: bobs while saving, pops when saved. */
213
+ .mp-save-pill-busy i {
214
+ animation: mp-float 1.2s ease-in-out infinite;
215
+ }
216
+
217
+ .mp-save-pill-pop i {
218
+ animation: mp-pop var(--dur-base) var(--ease-bounce) both;
219
+ }
220
+
221
+ /* ---- Link button (inside the save alert) ---- */
222
+
223
+ .mp-link-button {
224
+ appearance: none;
225
+ border: 0;
226
+ background: none;
227
+ padding: 8px 4px;
228
+ min-height: 44px;
229
+ font-weight: 700;
230
+ font-size: 15px;
231
+ color: var(--blue-700);
232
+ text-decoration: underline;
233
+ text-underline-offset: 3px;
234
+ cursor: pointer;
235
+ }
236
+
237
+ .mp-save-alert .mp-link-button {
238
+ min-height: 32px;
239
+ padding: 0 4px;
240
+ font-size: 13px;
241
+ color: var(--coral-900);
242
+ }
243
+
244
+ /* ---- Segmented tabs ---- */
245
+
246
+ .mp-seg {
247
+ display: flex;
248
+ gap: 6px;
249
+ padding: 5px;
250
+ margin: 0 auto 18px;
251
+ width: max-content;
252
+ max-width: 100%;
253
+ border-radius: 999px;
254
+ background: var(--cream-200);
255
+ box-shadow: inset 0 2px 6px oklch(0.3 0.05 60 / 0.12);
256
+ }
257
+
258
+ .mp-seg-tab {
259
+ appearance: none;
260
+ border: 0;
261
+ height: 44px;
262
+ padding: 0 18px;
263
+ border-radius: 999px;
264
+ background: transparent;
265
+ font-family: var(--font-display);
266
+ font-size: 14px;
267
+ letter-spacing: 0.04em;
268
+ text-transform: uppercase;
269
+ color: var(--ink-700);
270
+ cursor: pointer;
271
+ transition: background var(--dur-fast), box-shadow var(--dur-fast), transform var(--dur-fast);
272
+ }
273
+
274
+ .mp-seg-on {
275
+ background: #fff;
276
+ box-shadow: 0 3px 0 var(--cream-300);
277
+ color: var(--ink-900);
278
+ }
279
+
280
+ @keyframes mp-word-in {
281
+ from {
282
+ opacity: 0;
283
+ translate: -6px 0;
284
+ }
285
+ to {
286
+ opacity: 1;
287
+ translate: 0 0;
288
+ }
289
+ }
290
+
291
+ @keyframes mp-arrive {
292
+ from {
293
+ opacity: 0;
294
+ transform: translateY(14px);
295
+ }
296
+ to {
297
+ opacity: 1;
298
+ transform: translateY(0);
299
+ }
300
+ }
301
+
302
+ @media (prefers-reduced-motion: reduce) {
303
+ .mp-save-pill-busy i,
304
+ .mp-save-pill-pop i,
305
+ .mp-save-word,
306
+ .mp-notice {
307
+ animation: none;
308
+ }
309
+ }
310
+
311
+ /* ---------- Voice recorder ---------- */
312
+
313
+ /* A cream card that holds the recorder's steps, centred in a column. */
314
+ .mp-recorder {
315
+ background: linear-gradient(180deg, var(--cream-50), var(--cream-100));
316
+ border: var(--border-panel) solid var(--cream-300);
317
+ border-radius: var(--radius-xl);
318
+ padding: var(--space-4);
319
+ box-shadow: 0 5px 0 var(--cream-300), 0 14px 24px oklch(0.22 0.05 60 / 0.3);
320
+ transition: border-color var(--dur-slow) var(--ease-out), box-shadow var(--dur-slow) var(--ease-out);
321
+ display: grid;
322
+ gap: var(--space-3);
323
+ justify-items: center;
324
+ text-align: center;
325
+ }
326
+
327
+ .mp-recorder-lede {
328
+ margin: 0;
329
+ font-size: 16px;
330
+ line-height: 1.45;
331
+ color: var(--ink-700);
332
+ }
333
+
334
+ .mp-recorder-small {
335
+ margin: 0;
336
+ font-size: 13px;
337
+ line-height: 1.45;
338
+ color: var(--ink-500);
339
+ }
340
+
341
+ .mp-recorder-row {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: var(--space-3);
345
+ }
346
+
347
+ /* The red dot that blinks while recording. */
348
+ .mp-rec-dot {
349
+ width: 14px;
350
+ height: 14px;
351
+ border-radius: 50%;
352
+ background: var(--coral-500);
353
+ animation: mp-sparkle 1.2s infinite;
354
+ }
355
+
356
+ /* ---------- Portrait medallion ---------- */
357
+
358
+ /* The tappable wrapper: it takes the press, the hover and the keyboard focus for the medallion inside it. */
359
+ .mp-medallion-button {
360
+ appearance: none;
361
+ background: none;
362
+ border: 0;
363
+ padding: 0;
364
+ cursor: pointer;
365
+ -webkit-tap-highlight-color: transparent;
366
+ }
367
+
368
+ /* Every tap answers back: the medallion presses down like a bevelled button. */
369
+ .mp-medallion-button:hover .mp-medallion-ring {
370
+ filter: brightness(1.06);
371
+ }
372
+
373
+ .mp-medallion-button:active .mp-medallion-ring {
374
+ transform: translateY(5px);
375
+ box-shadow: 0 2px 0 var(--gold-900), 0 6px 10px oklch(0.2 0.05 60 / 0.3), inset 0 3px 0 oklch(1 0 0 / 0.6);
376
+ }
377
+
378
+ .mp-medallion-button:active .mp-medallion-number {
379
+ transform: translateY(4px);
380
+ }
381
+
382
+ .mp-medallion-button:focus-visible {
383
+ outline: 4px solid #fff;
384
+ outline-offset: 4px;
385
+ border-radius: 999px;
386
+ }
387
+
388
+ /* Set --m to the medallion's size. The shadow and the number plate stay the same at every size. */
389
+ .mp-medallion {
390
+ position: relative;
391
+ display: inline-grid;
392
+ justify-items: center;
393
+ width: var(--m);
394
+ }
395
+
396
+ .mp-medallion-ring {
397
+ display: grid;
398
+ place-items: center;
399
+ width: var(--m);
400
+ height: var(--m);
401
+ border-radius: 50%;
402
+ background: radial-gradient(circle at 50% 30%, var(--gold-300), var(--gold-500) 60%, var(--gold-700));
403
+ box-shadow: 0 7px 0 var(--gold-900), 0 14px 18px oklch(0.2 0.05 60 / 0.35), inset 0 3px 0 oklch(1 0 0 / 0.6);
404
+ transition: transform var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out), filter var(--dur-fast);
405
+ }
406
+
407
+ .mp-medallion-number {
408
+ margin-top: -14px;
409
+ min-width: 36px;
410
+ height: 30px;
411
+ padding: 0 10px;
412
+ border-radius: 999px;
413
+ background: linear-gradient(180deg, #fff, var(--cream-100));
414
+ box-shadow: 0 3px 0 var(--cream-300), 0 6px 10px oklch(0 0 0 / 0.2);
415
+ font-family: var(--font-display);
416
+ font-size: 17px;
417
+ line-height: 30px;
418
+ color: var(--ink-900);
419
+ text-align: center;
420
+ z-index: 1;
421
+ transition: transform var(--dur-fast) var(--ease-out);
422
+ }
423
+
424
+ .mp-medallion-pop {
425
+ animation: mp-medallion-pop 900ms var(--ease-out) both;
426
+ }
427
+
428
+ @media (prefers-reduced-motion: reduce) {
429
+ .mp-medallion-pop {
430
+ animation: none;
431
+ }
432
+ }
@@ -0,0 +1,34 @@
1
+ /* Tiny helper classes for hand-written HTML. Components inline the same rules. */
2
+ .mp-display { font-family: var(--font-display); font-weight: 400; line-height: var(--leading-tight); letter-spacing: var(--tracking-display); }
3
+ .mp-ui { font-family: var(--font-ui); font-weight: var(--weight-ui); line-height: var(--leading-normal); }
4
+ .mp-label { font-family: var(--font-ui); font-weight: var(--weight-ui-bold); font-size: var(--text-label); letter-spacing: var(--tracking-caps); text-transform: uppercase; }
5
+ /* Outlined display text: white fill, dark stroke painted behind the fill */
6
+ .mp-outline { color: var(--white); -webkit-text-stroke: var(--stroke-display) var(--text-outline); paint-order: stroke fill; text-shadow: 0 0.12em 0 oklch(0 0 0 / 0.22); }
7
+ .mp-outline-stone { -webkit-text-stroke-color: var(--text-outline-stone); }
8
+ .mp-outline-blue { -webkit-text-stroke-color: var(--text-outline-blue); }
9
+ @keyframes mp-float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
10
+ @keyframes mp-pulse-ring { 0% { box-shadow: 0 0 0 0 oklch(0.68 0.17 240 / 0.7); } 100% { box-shadow: 0 0 0 16px oklch(0.68 0.17 240 / 0); } }
11
+ @keyframes mp-pop { 0% { transform: scale(0.6); opacity: 0; } 70% { transform: scale(1.08); opacity: 1; } 100% { transform: scale(1); } }
12
+ @keyframes mp-sparkle { 0%, 100% { opacity: 0.4; transform: scale(0.8) rotate(0deg); } 50% { opacity: 1; transform: scale(1.15) rotate(20deg); } }
13
+ @keyframes mp-shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
14
+ @keyframes mp-shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-6px); } 75% { transform: translateX(6px); } }
15
+ /* PortraitMedallion arriving on the road, and Modal coming and going */
16
+ @keyframes mp-medallion-pop { 0% { transform: scale(0.3) rotate(-20deg); opacity: 0; } 55% { transform: scale(1.18) rotate(6deg); opacity: 1; } 75% { transform: scale(0.95) rotate(-2deg); } 100% { transform: scale(1) rotate(0); } }
17
+ @keyframes mp-sheet-in { from { opacity: 0; transform: scale(1.03); } to { opacity: 1; transform: none; } }
18
+ @keyframes mp-sheet-out { from { opacity: 1; transform: none; } to { opacity: 0; transform: scale(0.97); } }
19
+ /* StepBar: the green fill grows to the new marker (set --from and --to). RadioCard: the tick pops in. */
20
+ @keyframes mp-trail-grow { from { width: var(--from); } to { width: var(--to); } }
21
+ @keyframes mp-radio-pop { 0% { scale: 0.6; } 70% { scale: 1.15; } 100% { scale: 1; } }
22
+ /* Accessibility: keyboard focus ring (outline, so bevels keep their box-shadows), screen-reader-only text, reduced motion */
23
+ :focus-visible { outline: 4px solid var(--gold-300); outline-offset: 3px; }
24
+ .mp-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
25
+ .mp-world { background: var(--world-bg); }
26
+ /* Step marker: a small numbered marker built from --step-* (colors.css). Add -done or -current for the state, -lg for memory blocks. */
27
+ .mp-step { --step-highlight: var(--step-ahead-highlight); --step-fill: var(--step-ahead-fill); --step-edge: var(--step-ahead-edge); --step-outline: var(--step-ahead-outline); position: relative; width: 34px; height: 21px; flex: none; display: grid; place-items: center; box-sizing: border-box; border-radius: 50%; border: 3px solid var(--step-fill); background: radial-gradient(ellipse at 50% 30%, var(--step-highlight), var(--step-fill) 80%); box-shadow: 0 4px 0 var(--step-edge), 0 8px 10px oklch(0.2 0.05 60 / 0.3), inset 0 3px 0 oklch(1 0 0 / 0.55); font-family: var(--font-display); font-size: 15px; line-height: 1; color: #fff; -webkit-text-stroke: 2.5px var(--step-outline); paint-order: stroke fill; }
28
+ .mp-step i { font-size: 14px; -webkit-text-stroke: 1px var(--step-outline); }
29
+ .mp-step-done { --step-highlight: var(--step-done-highlight); --step-fill: var(--step-done-fill); --step-edge: var(--step-done-edge); --step-outline: var(--step-done-outline); }
30
+ .mp-step-current { --step-highlight: var(--step-current-highlight); --step-fill: var(--step-current-fill); --step-edge: var(--step-current-edge); --step-outline: var(--step-current-outline); transform: translateY(-3px); }
31
+ .mp-step-lg { width: 40px; height: 25px; font-size: 17px; transform: none; }
32
+ @media (prefers-reduced-motion: reduce) {
33
+ *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; }
34
+ }