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
@@ -0,0 +1,140 @@
1
+ /* Lanre color tokens. Base ramps in oklch (100 = lightest, 900 = darkest), then semantic aliases. */
2
+ :root {
3
+ /* Meadow: environment green (grass, bushes, board tiles) */
4
+ --green-100: oklch(0.94 0.08 128);
5
+ --green-300: oklch(0.85 0.17 132);
6
+ --green-500: oklch(0.74 0.19 136);
7
+ --green-700: oklch(0.58 0.16 140);
8
+ --green-900: oklch(0.40 0.10 142);
9
+
10
+ /* Sky: action blue (play, current level, water) */
11
+ --blue-100: oklch(0.94 0.05 228);
12
+ --blue-300: oklch(0.83 0.11 232);
13
+ --blue-500: oklch(0.68 0.17 240);
14
+ --blue-700: oklch(0.52 0.17 250);
15
+ --blue-900: oklch(0.36 0.12 255);
16
+
17
+ /* Gold: reward, currency, stars, primary CTA */
18
+ --gold-100: oklch(0.97 0.06 92);
19
+ --gold-300: oklch(0.92 0.14 90);
20
+ --gold-500: oklch(0.86 0.17 85);
21
+ --gold-700: oklch(0.71 0.16 68);
22
+ --gold-900: oklch(0.44 0.10 58);
23
+
24
+ /* Coral: danger, urgency, hearts, notification */
25
+ --coral-100: oklch(0.94 0.04 30);
26
+ --coral-300: oklch(0.83 0.11 30);
27
+ --coral-500: oklch(0.68 0.20 30);
28
+ --coral-700: oklch(0.55 0.19 28);
29
+ --coral-900: oklch(0.38 0.13 26);
30
+
31
+ /* Teal: confirm / OK / positive secondary */
32
+ --teal-100: oklch(0.95 0.04 185);
33
+ --teal-300: oklch(0.88 0.09 184);
34
+ --teal-500: oklch(0.76 0.13 180);
35
+ --teal-700: oklch(0.58 0.11 182);
36
+ --teal-900: oklch(0.40 0.08 184);
37
+
38
+ /* Berry: premium, boosts, special offers */
39
+ --berry-100: oklch(0.95 0.04 340);
40
+ --berry-300: oklch(0.85 0.11 340);
41
+ --berry-500: oklch(0.66 0.22 340);
42
+ --berry-700: oklch(0.50 0.20 340);
43
+ --berry-900: oklch(0.34 0.13 340);
44
+
45
+ /* Wood: frames, fences, signposts */
46
+ --wood-100: oklch(0.93 0.06 80);
47
+ --wood-300: oklch(0.80 0.10 70);
48
+ --wood-500: oklch(0.62 0.12 60);
49
+ --wood-700: oklch(0.46 0.10 54);
50
+ --wood-900: oklch(0.30 0.07 50);
51
+
52
+ /* Stone: locked, disabled, inactive */
53
+ --stone-100: oklch(0.96 0.01 250);
54
+ --stone-300: oklch(0.86 0.02 250);
55
+ --stone-500: oklch(0.71 0.03 250);
56
+ --stone-700: oklch(0.55 0.04 255);
57
+ --stone-900: oklch(0.36 0.04 260);
58
+
59
+ /* Parchment: panel surfaces */
60
+ --cream-50: oklch(0.99 0.01 85);
61
+ --cream-100: oklch(0.97 0.03 85);
62
+ --cream-200: oklch(0.93 0.05 80);
63
+ --cream-300: oklch(0.88 0.07 70);
64
+
65
+ /* Ink: warm brown text */
66
+ --ink-900: oklch(0.27 0.05 55);
67
+ --ink-700: oklch(0.41 0.06 55);
68
+ --ink-500: oklch(0.57 0.05 55);
69
+ --white: #ffffff;
70
+
71
+ /* Night: the summit letter and the credits, after dark above the clouds */
72
+ --night-ink: oklch(0.182 0.05 289.7);
73
+ --night-sky: oklch(0.229 0.064 289.9);
74
+ --night-lilac: oklch(0.807 0.067 303.7);
75
+ --night-cream: oklch(0.964 0.032 78.2);
76
+ --night-gold: oklch(0.8543 0.1685 86.58);
77
+ --night-gold-hi: oklch(0.91 0.138 94.4);
78
+
79
+ /* ---- Semantic aliases ---- */
80
+ --bg-meadow: linear-gradient(180deg, var(--green-300) 0%, var(--green-500) 100%);
81
+ --bg-sky: linear-gradient(180deg, oklch(0.78 0.11 232) 0%, oklch(0.92 0.05 220) 100%);
82
+ --bg-dusk: linear-gradient(180deg, oklch(0.52 0.14 290) 0%, oklch(0.72 0.13 40) 100%);
83
+ --bg-scrim: oklch(0.22 0.05 260 / 0.55);
84
+
85
+ --surface-panel: var(--cream-100);
86
+ --surface-panel-border: var(--cream-300);
87
+ --surface-panel-tab: var(--white);
88
+ --surface-inset: var(--cream-200);
89
+ --surface-hud: oklch(0.30 0.06 55 / 0.82);
90
+ --surface-cell: oklch(0.34 0.09 145 / 0.30);
91
+ --surface-cell-active: oklch(0.34 0.09 200 / 0.45);
92
+ --surface-wood: var(--wood-500);
93
+ --surface-wood-plank: var(--wood-100);
94
+
95
+ --text-primary: var(--ink-900);
96
+ --text-secondary: var(--ink-700);
97
+ --text-muted: var(--ink-500);
98
+ --text-on-dark: var(--white);
99
+ --text-on-gold: var(--gold-900);
100
+ --text-outline: var(--ink-900);
101
+ --text-outline-stone: var(--stone-700);
102
+ --text-outline-blue: var(--blue-700);
103
+
104
+ --action-primary: var(--gold-500);
105
+ --action-primary-shade: var(--gold-700);
106
+ --action-play: var(--blue-500);
107
+ --action-play-shade: var(--blue-700);
108
+ --action-confirm: var(--teal-500);
109
+ --action-confirm-shade: var(--teal-700);
110
+ --action-danger: var(--coral-500);
111
+ --action-danger-shade: var(--coral-700);
112
+ --action-premium: var(--berry-500);
113
+ --action-premium-shade: var(--berry-700);
114
+
115
+ --state-locked: var(--stone-500);
116
+ --state-locked-shade: var(--stone-700);
117
+ --state-current: var(--blue-500);
118
+ --state-complete: var(--green-500);
119
+ --state-perfect: var(--gold-500);
120
+
121
+ --star-fill: var(--gold-500);
122
+ --star-fill-light: var(--gold-300);
123
+ --star-outline: var(--gold-700);
124
+ --star-empty: var(--stone-500);
125
+ --star-empty-outline: var(--stone-700);
126
+
127
+ --currency-coin: var(--gold-500);
128
+ --currency-gem: var(--coral-500);
129
+ --currency-gem-alt: var(--blue-500);
130
+ --currency-heart: var(--coral-500);
131
+ --currency-energy: var(--teal-500);
132
+
133
+ --focus-ring: 0 0 0 4px oklch(0.86 0.17 85 / 0.85);
134
+
135
+ /* Step marker (.mp-step): the small numbered marker on the contributor trail, memory blocks and world signs.
136
+ highlight = the light spot on top, fill = the top surface, edge = the darker bevel underneath, outline = the stroke behind the number. */
137
+ --step-ahead-highlight: var(--stone-100); --step-ahead-fill: var(--stone-300); --step-ahead-edge: var(--stone-500); --step-ahead-outline: var(--stone-700);
138
+ --step-done-highlight: var(--green-300); --step-done-fill: var(--green-500); --step-done-edge: var(--green-700); --step-done-outline: var(--green-900);
139
+ --step-current-highlight: var(--blue-300); --step-current-fill: var(--blue-500); --step-current-edge: var(--blue-700); --step-current-outline: var(--blue-700);
140
+ }
@@ -0,0 +1,40 @@
1
+ /* Lanre radii, borders, bevels, shadows, glows, motion. */
2
+ :root {
3
+ --radius-xs: 6px;
4
+ --radius-sm: 10px;
5
+ --radius-md: 16px;
6
+ --radius-lg: 22px;
7
+ --radius-xl: 28px;
8
+ --radius-pill: 999px;
9
+
10
+ --border-panel: 4px;
11
+ --border-cell: 3px;
12
+ --border-hairline: 2px;
13
+
14
+ /* Bevel: every pressable has a solid darker bottom edge (a "0 Npx 0 shade" box-shadow) */
15
+ --bevel-sm: 3px;
16
+ --bevel-md: 5px;
17
+ --bevel-lg: 7px;
18
+ --press-travel: 4px;
19
+
20
+ --highlight-top: inset 0 2px 0 oklch(1 0 0 / 0.5);
21
+ --shadow-drop-sm: 0 4px 10px oklch(0.25 0.05 60 / 0.22);
22
+ --shadow-drop: 0 10px 24px oklch(0.25 0.05 60 / 0.28);
23
+ --shadow-panel: 0 20px 44px oklch(0.22 0.05 60 / 0.38);
24
+ --shadow-text: 0 2px 0 oklch(0 0 0 / 0.25);
25
+
26
+ /* The scrim behind a modal softens the world by this much. Surfaces never blur. */
27
+ --scrim-blur: 3px;
28
+
29
+ --glow-gold: 0 0 0 4px oklch(0.86 0.17 85 / 0.5), 0 0 28px oklch(0.86 0.17 85 / 0.7);
30
+ --glow-blue: 0 0 0 4px oklch(0.68 0.17 240 / 0.5), 0 0 28px oklch(0.68 0.17 240 / 0.7);
31
+ --glow-berry: 0 0 0 4px oklch(0.66 0.22 340 / 0.5), 0 0 28px oklch(0.66 0.22 340 / 0.7);
32
+
33
+ --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
34
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
35
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
36
+ --dur-fast: 120ms;
37
+ --dur-base: 220ms;
38
+ --dur-slow: 420ms;
39
+ --dur-idle: 2400ms;
40
+ }
@@ -0,0 +1,3 @@
1
+ /* Lanre webfonts: served from Google Fonts (no binaries were provided; see readme.md "Caveats").
2
+ Display: Titan One (single weight). UI: Quicksand 500/600/700. */
3
+ @import url("https://fonts.googleapis.com/css2?family=Titan+One&family=Quicksand:wght@500;600;700&display=swap");
package/tokens/fx.css ADDED
@@ -0,0 +1,186 @@
1
+ /* Effects and the loading screen: a confetti burst, a few twinkles, turning sun rays, and the boot screen.
2
+ Used by Confetti, Sparkles, Sunburst and LoadingScreen. The twinkle uses mp-sparkle from utilities.css. */
3
+
4
+ /* ---------- Confetti ---------- */
5
+
6
+ .mp-confetti {
7
+ position: absolute;
8
+ left: 50%;
9
+ top: 40%;
10
+ width: 0;
11
+ height: 0;
12
+ pointer-events: none;
13
+ z-index: 5;
14
+ }
15
+
16
+ .mp-confetti span {
17
+ position: absolute;
18
+ left: 0;
19
+ top: 0;
20
+ opacity: 0;
21
+ animation: mp-confetti-burst 1500ms cubic-bezier(0.15, 0.7, 0.3, 1) both;
22
+ }
23
+
24
+ @keyframes mp-confetti-burst {
25
+ 0% { opacity: 1; transform: translate(0, 0) rotate(0) scale(0.4); }
26
+ 70% { opacity: 1; }
27
+ 100% { opacity: 0; transform: translate(var(--dx), calc(var(--dy) + 160px)) rotate(var(--rot)) scale(1); }
28
+ }
29
+
30
+ /* ---------- Sparkles ---------- */
31
+
32
+ .mp-sparkle-spot {
33
+ position: absolute;
34
+ color: var(--gold-300);
35
+ font-size: 22px;
36
+ text-shadow: 0 0 10px oklch(0.92 0.14 90 / 0.9);
37
+ pointer-events: none;
38
+ animation: mp-sparkle 1.6s ease-in-out infinite;
39
+ animation-delay: calc(var(--i, 0) * 260ms);
40
+ z-index: 1;
41
+ }
42
+
43
+ /* ---------- Sunburst ---------- */
44
+
45
+ .mp-sunburst-motion { transform-origin: 0 0; }
46
+ .mp-sunburst-motion[data-sunburst-motion='continuous'] { animation: mp-sunburst-turn var(--sunburst-duration, 120s) linear infinite; }
47
+ .mp-sunburst-motion[data-sunburst-motion='once'] { animation: mp-sunburst-reveal var(--sunburst-duration, 2s) ease-out both; }
48
+ @keyframes mp-sunburst-turn { to { transform: rotate(360deg); } }
49
+ @keyframes mp-sunburst-reveal {
50
+ 0% { opacity: 0; transform: rotate(-12deg) scale(0.85); }
51
+ 25% { opacity: 1; }
52
+ 100% { opacity: 0; transform: rotate(12deg) scale(1.05); }
53
+ }
54
+ @media (prefers-reduced-motion: reduce) { .mp-sunburst-motion { animation: none !important; } }
55
+
56
+ /* ---------- Loading screen ---------- */
57
+
58
+ .mp-loading {
59
+ position: relative;
60
+ min-height: 100dvh;
61
+ display: grid;
62
+ place-items: center;
63
+ overflow: hidden;
64
+ background: var(--bg-sky);
65
+ }
66
+
67
+ .mp-loading-stack {
68
+ position: relative;
69
+ z-index: 1;
70
+ display: grid;
71
+ justify-items: center;
72
+ gap: 22px;
73
+ padding: 0 24px 120px;
74
+ max-width: 420px;
75
+ }
76
+
77
+ /* Boot bar: dark track, striped gold fill that grows and shrinks. */
78
+ .mp-loading-track {
79
+ width: 180px;
80
+ height: 22px;
81
+ border-radius: 999px;
82
+ background: oklch(0.3 0.06 55 / 0.85);
83
+ border: 2px solid oklch(0.2 0.05 55 / 0.9);
84
+ box-shadow: inset 0 2px 4px oklch(0 0 0 / 0.35);
85
+ overflow: hidden;
86
+ margin-top: 26px;
87
+ }
88
+
89
+ .mp-loading-fill {
90
+ display: block;
91
+ position: relative;
92
+ height: 100%;
93
+ width: 60%;
94
+ border-radius: 999px;
95
+ background: linear-gradient(180deg, var(--gold-300), var(--gold-500) 55%, var(--gold-700));
96
+ animation: mp-loading-grow 1.6s var(--ease-out) infinite alternate;
97
+ }
98
+
99
+ .mp-loading-fill::after {
100
+ content: '';
101
+ position: absolute;
102
+ inset: 0;
103
+ opacity: 0.35;
104
+ background: repeating-linear-gradient(-55deg, transparent 0 8px, oklch(1 0 0 / 0.55) 8px 14px);
105
+ }
106
+
107
+ @keyframes mp-loading-grow {
108
+ from { width: 25%; }
109
+ to { width: 85%; }
110
+ }
111
+
112
+ .mp-loading-cloud {
113
+ position: absolute;
114
+ height: 26px;
115
+ border-radius: 999px;
116
+ background: oklch(1 0 0 / 0.85);
117
+ animation: mp-cloud-drift 18s linear infinite;
118
+ }
119
+
120
+ .mp-loading-cloud::before {
121
+ content: '';
122
+ position: absolute;
123
+ left: 22%;
124
+ top: -12px;
125
+ width: 40%;
126
+ height: 30px;
127
+ border-radius: 50%;
128
+ background: inherit;
129
+ }
130
+
131
+ .mp-loading-cloud-a { left: 8%; top: 10%; width: 96px; }
132
+ .mp-loading-cloud-b { left: 70%; top: 18%; width: 72px; animation-duration: 24s; }
133
+ .mp-loading-cloud-c { left: 40%; top: 6%; width: 56px; animation-duration: 30s; }
134
+
135
+ @keyframes mp-cloud-drift {
136
+ from { translate: 0 0; }
137
+ to { translate: 40px 0; }
138
+ }
139
+
140
+ /* Mango Grove peeking in from below, with the road setting off. */
141
+ .mp-loading-ground {
142
+ position: absolute;
143
+ left: -10%;
144
+ right: -10%;
145
+ bottom: -60px;
146
+ height: 200px;
147
+ border-radius: 50% 50% 0 0 / 100% 100% 0 0;
148
+ background: linear-gradient(180deg, #c3e77f, #a6d85b 60%, #8cc446);
149
+ box-shadow: inset 0 6px 0 oklch(1 0 0 / 0.35);
150
+ }
151
+
152
+ .mp-loading-hill {
153
+ position: absolute;
154
+ left: 55%;
155
+ bottom: 70px;
156
+ width: 60%;
157
+ height: 160px;
158
+ border-radius: 50%;
159
+ background: #8cc446;
160
+ opacity: 0.6;
161
+ }
162
+
163
+ .mp-loading-road {
164
+ position: absolute;
165
+ left: 50%;
166
+ bottom: 0;
167
+ width: 70px;
168
+ height: 150px;
169
+ margin-left: -35px;
170
+ border-radius: 40px 40px 0 0;
171
+ background: #f6e1ad;
172
+ box-shadow: 0 0 0 6px #d8b173;
173
+ rotate: -12deg;
174
+ transform-origin: bottom;
175
+ }
176
+
177
+ @media (prefers-reduced-motion: reduce) {
178
+ .mp-loading-fill,
179
+ .mp-loading-cloud,
180
+ .mp-sparkle-spot {
181
+ animation: none;
182
+ }
183
+ .mp-confetti {
184
+ display: none;
185
+ }
186
+ }
@@ -0,0 +1,8 @@
1
+ /* Quiz gemstones. Score 0–2 → Amber I/II/III · 3–5 → Emerald · 6–8 → Amethyst · quiz skipped → Pearl keepsake (unranked).
2
+ Tier I plain · II adds a sparkle · III adds a halo (proposed: III keeps the sparkle too). Shape + name always accompany colour. */
3
+ :root {
4
+ --gem-amber: oklch(0.80 0.16 70); --gem-amber-light: oklch(0.92 0.12 85); --gem-amber-deep: oklch(0.56 0.15 55);
5
+ --gem-emerald: oklch(0.70 0.18 155); --gem-emerald-light: oklch(0.86 0.14 150); --gem-emerald-deep: oklch(0.46 0.14 158);
6
+ --gem-amethyst: oklch(0.62 0.20 305);--gem-amethyst-light: oklch(0.80 0.13 310);--gem-amethyst-deep: oklch(0.40 0.16 300);
7
+ --gem-pearl: oklch(0.95 0.02 90); --gem-pearl-light: #ffffff; --gem-pearl-deep: oklch(0.76 0.04 260);
8
+ }