jaml-ui 0.14.2 → 0.14.4

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 (94) hide show
  1. package/DESIGN.md +197 -0
  2. package/dist/components/AnalyzerExplorer.js +0 -11
  3. package/dist/components/JamlAestheticSelector.js +1 -3
  4. package/dist/components/JamlAnalyzerFullscreen.js +3 -3
  5. package/dist/components/JamlIde.js +0 -2
  6. package/dist/components/JamlSeedInput.js +1 -2
  7. package/dist/components/JamlSpeedometer.js +1 -1
  8. package/dist/ui/codeBlock.js +1 -1
  9. package/dist/ui/jimboCopyRow.js +1 -2
  10. package/dist/ui/jimboFilterBar.js +2 -4
  11. package/dist/ui/showcase.js +4 -4
  12. package/package.json +8 -5
  13. package/assets/Balatro Seed Curator (DesignsV2)/.design-canvas.state.json +0 -1
  14. package/assets/Balatro Seed Curator (DesignsV2)/Assets/BlindChips.png +0 -0
  15. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters/Boosters.json +0 -303
  16. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters/boosters.png +0 -0
  17. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters.png +0 -0
  18. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Bosses/BlindChips.png +0 -0
  19. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Bosses/blinds_metadata.json +0 -51
  20. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/8BitDeck.png +0 -0
  21. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/Enhancers.png +0 -0
  22. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/balatro-stake-chips.png +0 -0
  23. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/enhancers_metadata.json +0 -52
  24. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/playing_cards_metadata.json +0 -249
  25. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/stakes.json +0 -19
  26. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Editions.png +0 -0
  27. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Enhancers.png +0 -0
  28. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/Editions.png +0 -0
  29. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/Jokers.png +0 -0
  30. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/jokers.json +0 -1087
  31. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/stickers.png +0 -0
  32. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/stickers_metadata.json +0 -25
  33. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers.png +0 -0
  34. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tags/tags.json +0 -191
  35. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tags/tags.png +0 -0
  36. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/Tarots.png +0 -0
  37. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/planets.json +0 -15
  38. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/spectrals.json +0 -21
  39. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/tarots.json +0 -163
  40. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots.png +0 -0
  41. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers/Vouchers.png +0 -0
  42. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers/vouchers.json +0 -130
  43. package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers.png +0 -0
  44. package/assets/Balatro Seed Curator (DesignsV2)/Assets/blinds.json +0 -51
  45. package/assets/Balatro Seed Curator (DesignsV2)/Assets/boosters.json +0 -303
  46. package/assets/Balatro Seed Curator (DesignsV2)/Assets/fonts/m6x11plusplus.otf +0 -0
  47. package/assets/Balatro Seed Curator (DesignsV2)/Assets/jokers.json +0 -1087
  48. package/assets/Balatro Seed Curator (DesignsV2)/Assets/planets.json +0 -15
  49. package/assets/Balatro Seed Curator (DesignsV2)/Assets/spectrals.json +0 -21
  50. package/assets/Balatro Seed Curator (DesignsV2)/Assets/stakes.png +0 -0
  51. package/assets/Balatro Seed Curator (DesignsV2)/Assets/stickers.png +0 -0
  52. package/assets/Balatro Seed Curator (DesignsV2)/Assets/tags.json +0 -191
  53. package/assets/Balatro Seed Curator (DesignsV2)/Assets/tags.png +0 -0
  54. package/assets/Balatro Seed Curator (DesignsV2)/Assets/tarots.json +0 -163
  55. package/assets/Balatro Seed Curator (DesignsV2)/Assets/vouchers.json +0 -130
  56. package/assets/Balatro Seed Curator (DesignsV2)/Seed Detail v2.html +0 -40
  57. package/assets/Balatro Seed Curator (DesignsV2)/Seed Detail.html +0 -34
  58. package/assets/Balatro Seed Curator (DesignsV2)/public/fonts/m6x11plusplus.otf +0 -0
  59. package/assets/Balatro Seed Curator (DesignsV2)/src/AntePage.jsx +0 -228
  60. package/assets/Balatro Seed Curator (DesignsV2)/src/SeedDetail.jsx +0 -222
  61. package/assets/Balatro Seed Curator (DesignsV2)/src/app.jsx +0 -35
  62. package/assets/Balatro Seed Curator (DesignsV2)/src/mockData.js +0 -185
  63. package/assets/Balatro Seed Curator (DesignsV2)/src/sprites.jsx +0 -259
  64. package/assets/Balatro Seed Curator (DesignsV2)/src/tokens.js +0 -49
  65. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/AntePageV2.jsx +0 -290
  66. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/BalButton.jsx +0 -107
  67. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/JamlBuilderV2.jsx +0 -594
  68. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/JamlIde.jsx +0 -302
  69. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SearchResultsV2.jsx +0 -286
  70. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SeedDetailV2.jsx +0 -336
  71. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SeedOGCard.jsx +0 -251
  72. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/Showcase.jsx +0 -131
  73. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/app.jsx +0 -55
  74. package/assets/Balatro Seed Curator (DesignsV2)/src/v2/data.js +0 -296
  75. package/assets/Balatro Seed Curator (DesignsV2)/starters/design-canvas.jsx +0 -622
  76. package/assets/Balatro Seed Curator (DesignsV2)/uploads/8BitDeck.png +0 -0
  77. package/assets/Balatro Seed Curator (DesignsV2)/uploads/BlindChips.png +0 -0
  78. package/assets/Balatro Seed Curator (DesignsV2)/uploads/Boosters.png +0 -0
  79. package/assets/Balatro Seed Curator (DesignsV2)/uploads/Editions.png +0 -0
  80. package/assets/Balatro Seed Curator (DesignsV2)/uploads/Enhancers.png +0 -0
  81. package/assets/Balatro Seed Curator (DesignsV2)/uploads/Jokers.png +0 -0
  82. package/assets/Balatro Seed Curator (DesignsV2)/uploads/Tarots.png +0 -0
  83. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749540653-0.png +0 -0
  84. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749644934-0.png +0 -0
  85. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749661871-0.png +0 -0
  86. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749674748-0.png +0 -0
  87. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749703076-0.png +0 -0
  88. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749882759-0.png +0 -0
  89. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776750354200-0.png +0 -0
  90. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776750733265-0.png +0 -0
  91. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776751928925-0.png +0 -0
  92. package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776800975060-0.png +0 -0
  93. package/assets/Balatro Seed Curator (DesignsV2)/uploads/stickers.png +0 -0
  94. package/assets/Balatro Seed Curator (DesignsV2)/uploads/tags.png +0 -0
package/DESIGN.md ADDED
@@ -0,0 +1,197 @@
1
+ ---
2
+ name: Jimbo
3
+ description: Balatro-inspired design system for JAML seed finder tools. Eyedropped from actual game shader output — not Lua hex values.
4
+ colors:
5
+ red: "#ff4c40"
6
+ blue: "#0093ff"
7
+ green: "#429f79"
8
+ orange: "#ff9800"
9
+ gold: "#e4b643"
10
+ purple: "#9e74ce"
11
+ dark-red: "#a02721"
12
+ dark-blue: "#0057a1"
13
+ dark-orange: "#a05b00"
14
+ dark-green: "#215f46"
15
+ dark-purple: "#5e437e"
16
+ dark-grey: "#3a5055"
17
+ darkest: "#1e2b2d"
18
+ grey: "#708386"
19
+ teal-grey: "#404c4e"
20
+ panel-edge: "#1e2e32"
21
+ inner-border: "#334461"
22
+ border-silver: "#b9c2d2"
23
+ border-south: "#777e89"
24
+ gold-text: "#e4b643"
25
+ green-text: "#35bd86"
26
+ orange-text: "#ff8f00"
27
+ white: "#ffffff"
28
+ black: "#000000"
29
+ tarot-button: "#9e74ce"
30
+ planet-button: "#00a7ca"
31
+ spectral-button: "#2e76fd"
32
+ typography:
33
+ display:
34
+ fontFamily: m6x11plus, monospace
35
+ fontSize: 26px
36
+ fontWeight: 400
37
+ lineHeight: 1
38
+ letterSpacing: 0.04em
39
+ heading:
40
+ fontFamily: m6x11plus, monospace
41
+ fontSize: 14px
42
+ fontWeight: 400
43
+ lineHeight: 1.2
44
+ letterSpacing: 0.08em
45
+ body:
46
+ fontFamily: m6x11plus, monospace
47
+ fontSize: 11px
48
+ fontWeight: 400
49
+ lineHeight: 1.3
50
+ letterSpacing: 0.05em
51
+ label:
52
+ fontFamily: m6x11plus, monospace
53
+ fontSize: 9px
54
+ fontWeight: 400
55
+ lineHeight: 1
56
+ letterSpacing: 0.1em
57
+ micro:
58
+ fontFamily: m6x11plus, monospace
59
+ fontSize: 8px
60
+ fontWeight: 400
61
+ lineHeight: 1
62
+ letterSpacing: 0.08em
63
+ rounded:
64
+ sm: 4px
65
+ md: 6px
66
+ lg: 8px
67
+ pill: 10px
68
+ spacing:
69
+ xs: 2px
70
+ sm: 4px
71
+ md: 8px
72
+ lg: 12px
73
+ xl: 16px
74
+ components:
75
+ panel:
76
+ backgroundColor: "{colors.dark-grey}"
77
+ rounded: "{rounded.md}"
78
+ panel-edge:
79
+ backgroundColor: "{colors.panel-edge}"
80
+ panel-darkest:
81
+ backgroundColor: "{colors.darkest}"
82
+ rounded: "{rounded.md}"
83
+ button-primary:
84
+ backgroundColor: "{colors.red}"
85
+ textColor: "{colors.white}"
86
+ rounded: "{rounded.md}"
87
+ padding: 8px
88
+ button-primary-hover:
89
+ backgroundColor: "{colors.dark-red}"
90
+ button-secondary:
91
+ backgroundColor: "{colors.blue}"
92
+ textColor: "{colors.white}"
93
+ rounded: "{rounded.md}"
94
+ padding: 8px
95
+ button-secondary-hover:
96
+ backgroundColor: "{colors.dark-blue}"
97
+ button-back:
98
+ backgroundColor: "{colors.orange}"
99
+ textColor: "{colors.white}"
100
+ rounded: "{rounded.md}"
101
+ padding: 8px
102
+ button-back-hover:
103
+ backgroundColor: "{colors.dark-orange}"
104
+ tab-active:
105
+ backgroundColor: "{colors.gold}"
106
+ textColor: "{colors.black}"
107
+ rounded: "{rounded.sm}"
108
+ tab-inactive:
109
+ backgroundColor: "transparent"
110
+ textColor: "{colors.grey}"
111
+ score-must:
112
+ backgroundColor: "{colors.blue}"
113
+ textColor: "{colors.white}"
114
+ score-should:
115
+ backgroundColor: "{colors.red}"
116
+ textColor: "{colors.white}"
117
+ glow-must:
118
+ backgroundColor: "{colors.gold}"
119
+ glow-should:
120
+ backgroundColor: "{colors.green-text}"
121
+ ---
122
+
123
+ ## Overview
124
+
125
+ Jimbo is the design system for Balatro seed finder tools (JAML-UI, WeeJoker, Seed Finder). It recreates the cozy, tactile, chunky feel of LocalThunk's Balatro — dark panels with silver borders, 3D-press buttons, pixel typography, juice animations. Everything feels like a physical object you can poke.
126
+
127
+ The system targets iPhone SE portrait (375x667) as the minimum viewport. No fat padding, no bloated margins — every pixel earns its place.
128
+
129
+ ## Colors
130
+
131
+ All colors are eyedropped from Balatro's actual rendered shader output. Do NOT substitute with Lua source hex values — the game's shader pipeline transforms them.
132
+
133
+ - **Red (#ff4c40):** Primary action, mult scoring, should-clause hits. The "play" color.
134
+ - **Blue (#0093ff):** Secondary action, chips scoring, must-clause gates. The "requirement" color.
135
+ - **Green (#429f79):** Success, positive state, money.
136
+ - **Orange (#ff9800):** Back/return actions, warning.
137
+ - **Gold (#e4b643):** Seed text, premium highlights, active tab. The "treasure" color.
138
+ - **Purple (#9e74ce):** Joker rarity, tarot cards.
139
+ - **Dark Grey (#3a5055):** Panel backgrounds — the primary surface.
140
+ - **Darkest (#1e2b2d):** Deepest background, inset areas.
141
+ - **Grey (#708386):** Disabled text, labels, inactive elements.
142
+ - **Border Silver (#b9c2d2):** Panel top/side borders — the "silver frame."
143
+ - **Border South (#777e89):** Panel bottom border — creates the 3D depth illusion.
144
+ - **Panel Edge (#1e2e32):** Thin outer edge on panels.
145
+
146
+ Must-clause items glow blue. Should-clause items glow gold/green. Non-matching items render at 40-60% opacity with slight grayscale.
147
+
148
+ ## Typography
149
+
150
+ m6x11plus (m6x11plusplus.otf) is the ONLY font. It is a single-weight pixel font. NEVER apply font-weight bold, semibold, or any weight other than 400. Bold makes it look muddy. Use size and letter-spacing for hierarchy instead.
151
+
152
+ All text is uppercase with generous letter-spacing (0.04em-0.1em) for labels and micro text. Seed codes use the display size (26px) in gold (#e4b643) with 0.04em tracking.
153
+
154
+ ## Layout
155
+
156
+ Target: iPhone SE portrait (375x667). Components must fit without horizontal scroll. Vertical snap-scroll for ante pages. Horizontal swipe for seed navigation.
157
+
158
+ Panels use 2px solid borders with border-silver on top/sides and border-south on bottom, creating a subtle 3D card effect. Inner shadow: `inset 0 0 0 1px rgba(255,255,255,0.04)`. Outer shadow: `0 2px 0 #000`.
159
+
160
+ ## Elevation & Depth
161
+
162
+ Buttons have a colored "underside" via box-shadow (not blur). On press, translateY increases by 2-3px and the shadow collapses — the button physically sinks. On hover, translateY decreases by 2px (lifts) with a tiny brightness bump.
163
+
164
+ Panels sit on a dark south-shadow (`0 3px 0 rgba(0,0,0,0.55)`). Translucent panels (for swirl-background contexts) use `rgba(15, 24, 26, 0.78)` with `backdrop-filter: blur(2px)`.
165
+
166
+ JAML-hit items get a GlowRing: `box-shadow: 0 0 0 2px [color], 0 0 10px [color]` with a 1.6s pulse animation. Must = blue glow, should = gold/green glow.
167
+
168
+ ## Components
169
+
170
+ **Button:** Chunky 3D press. Colored underside via box-shadow. Hover lifts -2px + brightness. Press sinks +2-3px + shadow collapse. Variants: primary (red), secondary (blue), back (orange), ghost (transparent). Sizes via padding, not font-size. Easing: `cubic-bezier(0.34, 1.56, 0.64, 1)`.
171
+
172
+ **Panel:** Dark grey (#3a5055) background, 2px solid border (silver top/sides, south bottom), border-radius 6px. Inner highlight: `inset 0 0 0 1px rgba(255,255,255,0.04)`. Drop: `0 2px 0 #000`.
173
+
174
+ **Tabs (JimboTabs):** Active tab = gold background + black text. Inactive = transparent + grey text. No bold. Small radius (4px). Tabs are the ONLY navigation — no hamburger menus, no sidebars on mobile.
175
+
176
+ **ScoreCol:** Must-clauses show as blue-framed boxes with checkmark/cross badge. Should-clauses show as bare sprites with a red corner count badge (x2, x3...). Unlit = 40% opacity + grayscale.
177
+
178
+ **ShopTape:** Horizontal grab-scrollable strip of item sprites. Edge fades (linear-gradient masks) on left/right. Hidden scrollbar. Cursor: grab/grabbing.
179
+
180
+ **PackCell:** Tap to fan — cards explode out with springy stagger (40ms delay, juice easing). Tap again to collapse. Closed state = single pack sprite with type label.
181
+
182
+ **GlowRing:** Pulsing outline around JAML-hit items. `0 0 0 2px [color], 0 0 10px [color]`. Animation: opacity 0.55 → 1.0 over 1.6s ease-in-out infinite.
183
+
184
+ **SeedPagerHeader:** Three columns: [left stride arrow] [identity panel with seed + copy + deck/stake] [right stride arrow]. Stride arrows are tall red bars with dark-red inset shadow. Identity panel is translucent with counter pip.
185
+
186
+ ## Do's and Don'ts
187
+
188
+ - DO use m6x11plus for everything. No fallback display fonts.
189
+ - DO eyedrop colors from the game. Never guess or approximate.
190
+ - DO design for iPhone SE portrait first. Desktop is a stretched phone.
191
+ - DO use translateY + box-shadow for button depth. Not CSS 3D transforms.
192
+ - DO dim non-matching items (opacity 0.4 + grayscale 0.6). They stay visible for context.
193
+ - DON'T use font-weight bold. m6x11plus is single-weight. Bold = muddy.
194
+ - DON'T use fat padding or margins. Balatro UI is dense and cozy.
195
+ - DON'T add horizontal scroll. Vertical snap-scroll + horizontal swipe only.
196
+ - DON'T use rounded corners larger than 10px. Balatro is chunky, not bubbly.
197
+ - DON'T use blur-based shadows for depth. Use solid colored box-shadows.
@@ -157,7 +157,6 @@ const styles = {
157
157
  highlightTitle: {
158
158
  fontSize: 12,
159
159
  color: "#6f6fa1",
160
- textTransform: "uppercase",
161
160
  letterSpacing: "0.05em",
162
161
  },
163
162
  highlightSubtitle: {
@@ -212,7 +211,6 @@ const styles = {
212
211
  highlightAnte: {
213
212
  fontSize: 11,
214
213
  color: "#a855f7",
215
- textTransform: "uppercase",
216
214
  letterSpacing: "0.05em",
217
215
  },
218
216
  highlightLabel: {
@@ -248,14 +246,12 @@ const styles = {
248
246
  navLabel: {
249
247
  fontSize: 13,
250
248
  color: "#a855f7",
251
- textTransform: "uppercase",
252
249
  letterSpacing: "0.05em",
253
250
  minWidth: 110,
254
251
  textAlign: "center",
255
252
  },
256
253
  navSubLabel: {
257
254
  color: "#5a5a88",
258
- textTransform: "none",
259
255
  letterSpacing: "normal",
260
256
  fontSize: 11,
261
257
  marginLeft: 4,
@@ -287,7 +283,6 @@ const styles = {
287
283
  anteHeading: {
288
284
  fontSize: 14,
289
285
  color: "#a855f7",
290
- textTransform: "uppercase",
291
286
  letterSpacing: "0.05em",
292
287
  },
293
288
  bossRow: {
@@ -305,7 +300,6 @@ const styles = {
305
300
  rowLabel: {
306
301
  fontSize: 11,
307
302
  color: "#5a5a88",
308
- textTransform: "uppercase",
309
303
  letterSpacing: "0.05em",
310
304
  marginBottom: 4,
311
305
  },
@@ -335,7 +329,6 @@ const styles = {
335
329
  color: "#7f7fa7",
336
330
  border: "1px solid #2a2a55",
337
331
  fontSize: 11,
338
- textTransform: "uppercase",
339
332
  },
340
333
  itemCard: {
341
334
  display: "flex",
@@ -386,7 +379,6 @@ const styles = {
386
379
  color: "#c7c7ef",
387
380
  border: "1px solid #35356d",
388
381
  fontSize: 11,
389
- textTransform: "uppercase",
390
382
  },
391
383
  badgeAccent: {
392
384
  padding: "1px 4px",
@@ -395,7 +387,6 @@ const styles = {
395
387
  color: "#f5c842",
396
388
  border: "1px solid rgba(245,200,66,0.35)",
397
389
  fontSize: 11,
398
- textTransform: "uppercase",
399
390
  },
400
391
  badgeMuted: {
401
392
  padding: "1px 4px",
@@ -404,7 +395,6 @@ const styles = {
404
395
  color: "#7f7fa7",
405
396
  border: "1px solid #2a2a55",
406
397
  fontSize: 11,
407
- textTransform: "uppercase",
408
398
  },
409
399
  packChip: {
410
400
  fontSize: 13,
@@ -427,7 +417,6 @@ const styles = {
427
417
  factLabel: {
428
418
  fontSize: 11,
429
419
  color: "#7f7fa7",
430
- textTransform: "uppercase",
431
420
  },
432
421
  factValue: {
433
422
  fontSize: 13,
@@ -16,7 +16,7 @@ export function JamlAestheticSelector({ value, onChange, className, style }) {
16
16
  flexDirection: "column",
17
17
  gap: 4,
18
18
  ...style,
19
- }, children: [_jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, children: "Seed Aesthetics" }), _jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 4 }, children: AESTHETICS.map((a) => {
19
+ }, children: [_jsx(JimboText, { size: "xs", tone: "grey", children: "Seed Aesthetics" }), _jsx("div", { style: { display: "flex", flexWrap: "wrap", gap: 4 }, children: AESTHETICS.map((a) => {
20
20
  const isActive = value === a.id;
21
21
  return (_jsx("button", { type: "button", onClick: () => onChange(isActive ? null : a.id, a.value), title: a.desc, style: {
22
22
  padding: "4px 10px",
@@ -26,9 +26,7 @@ export function JamlAestheticSelector({ value, onChange, className, style }) {
26
26
  color: isActive ? JimboColorOption.GOLD_TEXT : JimboColorOption.GREY,
27
27
  cursor: "pointer",
28
28
  fontSize: 11,
29
- fontWeight: 700,
30
29
  fontFamily: "m6x11plus, monospace",
31
- textTransform: "uppercase",
32
30
  letterSpacing: 0.5,
33
31
  transition: "border-color 100ms, background 100ms",
34
32
  }, children: a.label }, a.id));
@@ -52,7 +52,7 @@ export function JamlAnalyzerFullscreen({ antes, live, enabledStreams, onEnabledS
52
52
  } }, ante.ante))) }), _jsx(SideRail, { antes: antes.map((a) => a.ante), currentAnte: currentAnte, onJump: scrollToAnte }), !hidePicker && (_jsx(StreamPicker, { enabled: effectiveEnabled, onChange: setEnabled, open: pickerOpen, onToggle: () => setPickerOpen((v) => !v) }))] }));
53
53
  }
54
54
  function AnteSection({ ante, live, enabledStreams, chunkSize, registerRef }) {
55
- return (_jsxs("section", { ref: registerRef, "data-ante": ante.ante, style: styles.section, children: [_jsxs("header", { style: styles.header, children: [_jsxs("div", { children: [_jsx("div", { style: styles.anteLabel, children: "ANTE" }), _jsx("div", { style: styles.anteNumber, children: ante.ante })] }), ante.voucher && (_jsxs("div", { style: styles.voucherBlock, children: [_jsx(JamlVoucher, { voucherName: ante.voucher, scale: 0.85 }), _jsx("div", { style: styles.voucherCaption, children: ante.voucher })] }))] }), _jsxs("div", { style: styles.blindRow, children: [_jsx(BlindCell, { label: "SMALL", tag: ante.smallBlindTag }), _jsx(BlindCell, { label: "BIG", tag: ante.bigBlindTag }), ante.boss && (_jsxs("div", { style: styles.bossCell, children: [_jsx("div", { style: styles.cellLabel, children: "BOSS" }), _jsx(JamlBoss, { bossName: ante.boss, scale: 0.7 }), _jsx("div", { style: styles.cellCaption, children: ante.boss })] }))] }), ante.packs && ante.packs.length > 0 && (_jsxs("div", { style: styles.streamLane, children: [_jsx("div", { style: styles.streamLabel, children: "PACKS" }), _jsx("div", { style: styles.packRow, children: ante.packs.map((pack, i) => (_jsx("div", { style: styles.packPill, children: pack }, `${ante.ante}-pack-${i}`))) })] })), enabledStreams.map((key) => {
55
+ return (_jsxs("section", { ref: registerRef, "data-ante": ante.ante, style: styles.section, children: [_jsxs("header", { style: styles.header, children: [_jsxs("div", { children: [_jsx("div", { style: styles.anteLabel, children: "Ante" }), _jsx("div", { style: styles.anteNumber, children: ante.ante })] }), ante.voucher && (_jsxs("div", { style: styles.voucherBlock, children: [_jsx(JamlVoucher, { voucherName: ante.voucher, scale: 0.85 }), _jsx("div", { style: styles.voucherCaption, children: ante.voucher })] }))] }), _jsxs("div", { style: styles.blindRow, children: [_jsx(BlindCell, { label: "Small", tag: ante.smallBlindTag }), _jsx(BlindCell, { label: "Big", tag: ante.bigBlindTag }), ante.boss && (_jsxs("div", { style: styles.bossCell, children: [_jsx("div", { style: styles.cellLabel, children: "Boss" }), _jsx(JamlBoss, { bossName: ante.boss, scale: 0.7 }), _jsx("div", { style: styles.cellCaption, children: ante.boss })] }))] }), ante.packs && ante.packs.length > 0 && (_jsxs("div", { style: styles.streamLane, children: [_jsx("div", { style: styles.streamLabel, children: "Packs" }), _jsx("div", { style: styles.packRow, children: ante.packs.map((pack, i) => (_jsx("div", { style: styles.packPill, children: pack }, `${ante.ante}-pack-${i}`))) })] })), enabledStreams.map((key) => {
56
56
  const isShop = key === "shop";
57
57
  const initialItems = isShop
58
58
  ? (ante.shop ?? []).map((item) => ({
@@ -70,7 +70,7 @@ function StreamLane({ ante, streamKey, live, chunkSize, initialItems }) {
70
70
  const stream = useMotelyStream(handle?.initStream ?? null, handle?.nextItem ?? null, [ante, streamKey, live?.seed, live?.deck, live?.stake], initialItems);
71
71
  const desired = live?.desiredNames ?? new Set();
72
72
  const toneColor = TONE_COLORS[meta.tone] ?? TONE_COLORS.default;
73
- return (_jsxs("div", { style: styles.streamLane, children: [_jsxs("div", { style: { ...styles.streamLabel, color: toneColor }, children: [meta.label.toUpperCase(), stream.items.length > 0 ? ` · ${stream.items.length}` : ""] }), _jsx(ShopRow, { items: stream.items, desired: desired, loadingMore: stream.loadingMore, ready: stream.ready, onPullMore: () => stream.pullMore(chunkSize) }), stream.error && _jsxs("div", { style: styles.errorLine, children: ["stream error: ", stream.error] })] }));
73
+ return (_jsxs("div", { style: styles.streamLane, children: [_jsxs("div", { style: { ...styles.streamLabel, color: toneColor }, children: [meta.label, stream.items.length > 0 ? ` · ${stream.items.length}` : ""] }), _jsx(ShopRow, { items: stream.items, desired: desired, loadingMore: stream.loadingMore, ready: stream.ready, onPullMore: () => stream.pullMore(chunkSize) }), stream.error && _jsxs("div", { style: styles.errorLine, children: ["stream error: ", stream.error] })] }));
74
74
  }
75
75
  function BlindCell({ label, tag }) {
76
76
  if (!tag)
@@ -139,7 +139,7 @@ function StreamPicker({ enabled, onChange, open, onToggle }) {
139
139
  next.add(key);
140
140
  onChange(all.map((m) => m.key).filter((k) => next.has(k)));
141
141
  }
142
- return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onToggle, style: styles.pickerButton, "aria-label": "Toggle stream picker", children: open ? "✕" : "≡" }), open && (_jsxs("div", { style: styles.pickerPanel, children: [_jsx("div", { style: styles.pickerHeader, children: "STREAMS" }), all.map((meta) => {
142
+ return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: onToggle, style: styles.pickerButton, "aria-label": "Toggle stream picker", children: open ? "✕" : "≡" }), open && (_jsxs("div", { style: styles.pickerPanel, children: [_jsx("div", { style: styles.pickerHeader, children: "Streams" }), all.map((meta) => {
143
143
  const isOn = enabledSet.has(meta.key);
144
144
  const tone = TONE_COLORS[meta.tone] ?? TONE_COLORS.default;
145
145
  return (_jsxs("button", { type: "button", onClick: () => toggle(meta.key), style: {
@@ -61,7 +61,6 @@ function ResultsView({ results }) {
61
61
  minWidth: 80,
62
62
  }, children: result.seed }), result.score !== undefined ? (_jsxs(_Fragment, { children: [_jsx(TallyBar, { value: result.score, max: maxScore }), _jsx("span", { style: {
63
63
  fontSize: 12,
64
- fontWeight: 700,
65
64
  color: result.score > 0 ? JimboColorOption.GREEN_TEXT : JimboColorOption.GREY,
66
65
  minWidth: 36,
67
66
  textAlign: "right",
@@ -83,7 +82,6 @@ function ResultsView({ results }) {
83
82
  whiteSpace: "nowrap",
84
83
  }, children: label }), _jsx(TallyBar, { value: val, max: maxVal }), _jsx("span", { style: {
85
84
  fontSize: 11,
86
- fontWeight: 700,
87
85
  color: val > 0 ? JimboColorOption.GREEN_TEXT : JimboColorOption.DARK_GREY,
88
86
  minWidth: 24,
89
87
  textAlign: "right",
@@ -13,14 +13,13 @@ export function JamlSeedInput({ value, onChange, placeholder = "Enter seed (e.g.
13
13
  setInternal(raw);
14
14
  onChange?.(raw);
15
15
  };
16
- return (_jsxs("div", { className: className, style: { display: "flex", flexDirection: "column", gap: 4, ...style }, children: [_jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, children: "Seed" }), _jsx("input", { type: "text", value: display, onChange: handleChange, placeholder: placeholder, maxLength: 8, spellCheck: false, autoComplete: "off", style: {
16
+ return (_jsxs("div", { className: className, style: { display: "flex", flexDirection: "column", gap: 4, ...style }, children: [_jsx(JimboText, { size: "xs", tone: "grey", children: "Seed" }), _jsx("input", { type: "text", value: display, onChange: handleChange, placeholder: placeholder, maxLength: 8, spellCheck: false, autoComplete: "off", style: {
17
17
  padding: "6px 10px",
18
18
  borderRadius: 6,
19
19
  border: `2px solid ${!isValid ? JimboColorOption.RED : display.length === 8 ? JimboColorOption.GREEN : JimboColorOption.PANEL_EDGE}`,
20
20
  background: JimboColorOption.DARKEST,
21
21
  color: JimboColorOption.GOLD_TEXT,
22
22
  fontSize: 16,
23
- fontWeight: 900,
24
23
  fontFamily: "m6x11plus, monospace",
25
24
  letterSpacing: 2,
26
25
  textTransform: "uppercase",
@@ -50,5 +50,5 @@ export function JamlSpeedometer({ seedsPerSecond, totalSearched, matchingSeeds,
50
50
  transformOrigin: "60px 65px",
51
51
  transform: `rotate(${angle}deg)`,
52
52
  transition: "transform 300ms ease",
53
- } }), _jsx("circle", { cx: 60, cy: 65, r: 4, fill: JimboColorOption.RED })] }) }), _jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 20, fontWeight: 900, fontFamily: "m6x11plus, monospace", color: isActive ? speedColor : JimboColorOption.GREY }, children: isActive ? formatSpeed(seedsPerSecond) : "---" }), _jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, children: "seeds / sec" })] }), _jsxs("div", { style: { display: "flex", gap: 16, marginTop: 2 }, children: [_jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 13, fontWeight: 700, fontFamily: "m6x11plus, monospace", color: JimboColorOption.WHITE }, children: formatCount(totalSearched) }), _jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, children: "searched" })] }), _jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 13, fontWeight: 700, fontFamily: "m6x11plus, monospace", color: JimboColorOption.GREEN_TEXT }, children: formatCount(matchingSeeds) }), _jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, children: "matches" })] })] })] }));
53
+ } }), _jsx("circle", { cx: 60, cy: 65, r: 4, fill: JimboColorOption.RED })] }) }), _jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 20, fontFamily: "m6x11plus, monospace", color: isActive ? speedColor : JimboColorOption.GREY }, children: isActive ? formatSpeed(seedsPerSecond) : "---" }), _jsx(JimboText, { size: "xs", tone: "grey", children: "seeds / sec" })] }), _jsxs("div", { style: { display: "flex", gap: 16, marginTop: 2 }, children: [_jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 13, fontFamily: "m6x11plus, monospace", color: JimboColorOption.WHITE }, children: formatCount(totalSearched) }), _jsx(JimboText, { size: "xs", tone: "grey", children: "searched" })] }), _jsxs("div", { style: { textAlign: "center" }, children: [_jsx("div", { style: { fontSize: 13, fontFamily: "m6x11plus, monospace", color: JimboColorOption.GREEN_TEXT }, children: formatCount(matchingSeeds) }), _jsx(JimboText, { size: "xs", tone: "grey", children: "matches" })] })] })] }));
54
54
  }
@@ -9,7 +9,7 @@ export function JimboCodeBlock({ code, language, filename, className = '' }) {
9
9
  setCopied(true);
10
10
  setTimeout(() => setCopied(false), 2000);
11
11
  };
12
- return (_jsxs("div", { className: 'rounded-xl overflow-hidden flex flex-col border-2 ' + className, style: { backgroundColor: JimboColorOption.DARKEST, borderColor: JimboColorOption.PANEL_EDGE, boxShadow: '0 3px 0 0 rgba(0,0,0,0.5)' }, children: [_jsxs("div", { style: { padding: '0.5rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: `1px solid ${JimboColorOption.INNER_BORDER}` }, children: [_jsxs("div", { style: { display: 'flex', gap: '0.5rem', alignItems: 'center' }, children: [filename && _jsx("span", { style: { fontSize: 10, textTransform: 'uppercase', opacity: 0.6 }, children: filename }), language && _jsx("span", { style: { fontSize: 9, padding: '1px 6px', borderRadius: 3, background: 'rgba(0,0,0,0.4)', color: '#60a5fa', textTransform: 'uppercase' }, children: language })] }), _jsx("button", { onClick: copy, title: "Copy", style: { padding: 4, background: 'none', border: 'none', cursor: 'pointer', color: copied ? '#4ade80' : 'rgba(255,255,255,0.5)', display: 'flex' }, children: copied
12
+ return (_jsxs("div", { className: 'rounded-xl overflow-hidden flex flex-col border-2 ' + className, style: { backgroundColor: JimboColorOption.DARKEST, borderColor: JimboColorOption.PANEL_EDGE, boxShadow: '0 3px 0 0 rgba(0,0,0,0.5)' }, children: [_jsxs("div", { style: { padding: '0.5rem 1rem', display: 'flex', alignItems: 'center', justifyContent: 'space-between', borderBottom: `1px solid ${JimboColorOption.INNER_BORDER}` }, children: [_jsxs("div", { style: { display: 'flex', gap: '0.5rem', alignItems: 'center' }, children: [filename && _jsx("span", { style: { fontSize: 10, opacity: 0.6 }, children: filename }), language && _jsx("span", { style: { fontSize: 9, padding: '1px 6px', borderRadius: 3, background: 'rgba(0,0,0,0.4)', color: '#60a5fa' }, children: language })] }), _jsx("button", { onClick: copy, title: "Copy", style: { padding: 4, background: 'none', border: 'none', cursor: 'pointer', color: copied ? '#4ade80' : 'rgba(255,255,255,0.5)', display: 'flex' }, children: copied
13
13
  ? _jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) })
14
14
  : _jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }) })] }), _jsx("pre", { style: { padding: '1rem', overflowX: 'auto', fontFamily: 'monospace', fontSize: '0.875rem', lineHeight: 1.6, color: '#f6f0d5', margin: 0 }, children: _jsx("code", { children: code }) })] }));
15
15
  }
@@ -12,7 +12,7 @@ export function JimboCopyRow({ value, label }) {
12
12
  setTimeout(() => setCopied(false), 1500);
13
13
  });
14
14
  }
15
- return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 4 }, children: [label && (_jsx(JimboText, { size: "xs", tone: "grey", uppercase: true, style: { letterSpacing: 2 }, children: label })), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx("div", { style: {
15
+ return (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 4 }, children: [label && (_jsx(JimboText, { size: "xs", tone: "grey", style: { letterSpacing: 2 }, children: label })), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx("div", { style: {
16
16
  flex: 1,
17
17
  padding: '6px 10px',
18
18
  background: C.DARKEST,
@@ -31,6 +31,5 @@ export function JimboCopyRow({ value, label }) {
31
31
  cursor: 'pointer',
32
32
  flexShrink: 0,
33
33
  transition: 'color 0.15s, background 0.15s, border-color 0.15s',
34
- textTransform: 'uppercase',
35
34
  }, children: copied ? 'Copied' : 'Copy' })] })] }));
36
35
  }
@@ -9,7 +9,7 @@ import { JimboText } from './jimboText.js';
9
9
  *
10
10
  * Pass `sortOptions` to show the sort side; omit to show search only.
11
11
  */
12
- export function JimboFilterBar({ search, onSearchChange, searchPlaceholder = 'SEARCH...', searchLabel = 'Search', sort, onSortChange, sortLabel = 'Sort By', sortOptions, className = '', style, }) {
12
+ export function JimboFilterBar({ search, onSearchChange, searchPlaceholder = 'Search...', searchLabel = 'Search', sort, onSortChange, sortLabel = 'Sort By', sortOptions, className = '', style, }) {
13
13
  return (_jsxs("div", { className: className, style: {
14
14
  display: 'flex',
15
15
  gap: 24,
@@ -35,7 +35,6 @@ export function JimboFilterBar({ search, onSearchChange, searchPlaceholder = 'SE
35
35
  fontFamily: "'m6x11plus', 'Courier New', monospace",
36
36
  fontSize: 20,
37
37
  letterSpacing: 2,
38
- textTransform: 'uppercase',
39
38
  outline: 'none',
40
39
  } })] }) })) : null, sortOptions && onSortChange ? (_jsx(FloatingLabelField, { label: sortLabel, children: _jsxs("div", { style: { position: 'relative' }, children: [_jsx("select", { value: sort ?? sortOptions[0]?.value, onChange: (e) => onSortChange(e.target.value), style: {
41
40
  appearance: 'none',
@@ -50,7 +49,6 @@ export function JimboFilterBar({ search, onSearchChange, searchPlaceholder = 'SE
50
49
  fontFamily: "'m6x11plus', 'Courier New', monospace",
51
50
  fontSize: 18,
52
51
  letterSpacing: 2,
53
- textTransform: 'uppercase',
54
52
  padding: '14px 48px 14px 24px',
55
53
  minWidth: 200,
56
54
  textAlign: 'center',
@@ -67,7 +65,7 @@ function FloatingLabelField({ label, children }) {
67
65
  borderRadius: 6,
68
66
  padding: '4px 12px',
69
67
  zIndex: 2,
70
- }, children: _jsx(JimboText, { size: "xs", uppercase: true, children: label }) }), children] }));
68
+ }, children: _jsx(JimboText, { size: "xs", children: label }) }), children] }));
71
69
  }
72
70
  function SearchIcon() {
73
71
  return (_jsxs("svg", { width: 24, height: 24, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 3, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: [_jsx("circle", { cx: 11, cy: 11, r: 8 }), _jsx("line", { x1: 21, y1: 21, x2: 16.65, y2: 16.65 })] }));
@@ -16,7 +16,7 @@ export function Showcase({ hotFilters = [], recentFinds = [], stats = DEFAULT_ST
16
16
  width: '100%', height: '100%', background: C.DARKEST,
17
17
  display: 'flex', flexDirection: 'column',
18
18
  fontFamily: 'm6x11plus, monospace', color: C.WHITE, overflow: 'hidden',
19
- }, children: [_jsxs("div", { style: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '18px 14px 10px' }, children: [_jsxs("div", { style: { textAlign: 'center', marginBottom: 18 }, children: [_jsx("div", { style: { fontSize: 32, letterSpacing: 3, lineHeight: 1, color: C.GOLD, textShadow: '2px 2px 0 rgba(0,0,0,.8)' }, children: "Balatro" }), _jsx("div", { style: { fontSize: 14, letterSpacing: 4, color: C.GREY, marginTop: 4, textShadow: '1px 1px 0 rgba(0,0,0,.8)' }, children: "SEED \u00B7 CURATOR" })] }), _jsx("div", { style: {
19
+ }, children: [_jsxs("div", { style: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '18px 14px 10px' }, children: [_jsxs("div", { style: { textAlign: 'center', marginBottom: 18 }, children: [_jsx("div", { style: { fontSize: 32, letterSpacing: 3, lineHeight: 1, color: C.GOLD, textShadow: '2px 2px 0 rgba(0,0,0,.8)' }, children: "Balatro" }), _jsx("div", { style: { fontSize: 14, letterSpacing: 4, color: C.GREY, marginTop: 4, textShadow: '1px 1px 0 rgba(0,0,0,.8)' }, children: "Seed \u00B7 Curator" })] }), _jsx("div", { style: {
20
20
  background: C.DARK_GREY, borderRadius: 6, padding: 10,
21
21
  border: `2px solid ${C.PANEL_EDGE}`, boxShadow: `0 2px 0 ${C.BLACK}`,
22
22
  display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 8, textAlign: 'center', marginBottom: 16,
@@ -24,11 +24,11 @@ export function Showcase({ hotFilters = [], recentFinds = [], stats = DEFAULT_ST
24
24
  [stats.searched, 'searched'],
25
25
  [stats.matches, 'matches'],
26
26
  [stats.speed, 'speed'],
27
- ].map(([n, l]) => (_jsxs("div", { children: [_jsx("div", { style: { fontSize: 16, color: C.GOLD, textShadow: '1px 1px 0 rgba(0,0,0,.8)' }, children: n }), _jsx("div", { style: { fontSize: 9, color: C.GREY, letterSpacing: 2, marginTop: 2 }, children: l.toUpperCase() })] }, l))) }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }, children: [_jsx("div", { style: {
27
+ ].map(([n, l]) => (_jsxs("div", { children: [_jsx("div", { style: { fontSize: 16, color: C.GOLD, textShadow: '1px 1px 0 rgba(0,0,0,.8)' }, children: n }), _jsx("div", { style: { fontSize: 9, color: C.GREY, letterSpacing: 2, marginTop: 2 }, children: l })] }, l))) }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8, marginBottom: 8 }, children: [_jsx("div", { style: {
28
28
  fontSize: 11, letterSpacing: 2, padding: '2px 8px',
29
29
  background: C.BLUE, color: C.WHITE, borderRadius: 3,
30
30
  textShadow: '1px 1px 0 rgba(0,0,0,.8)',
31
- }, children: "HOT FILTERS" }), _jsx("div", { style: { flex: 1, height: 2, background: `${C.BLUE}55`, borderRadius: 1 } })] }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 16 }, children: hotFilters.map((f, i) => {
31
+ }, children: "Hot Filters" }), _jsx("div", { style: { flex: 1, height: 2, background: `${C.BLUE}55`, borderRadius: 1 } })] }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 16 }, children: hotFilters.map((f, i) => {
32
32
  const tColor = TONE_COLOR[f.tone];
33
33
  return (_jsxs("div", { style: {
34
34
  background: C.DARK_GREY, borderRadius: 6, padding: 10,
@@ -43,7 +43,7 @@ export function Showcase({ hotFilters = [], recentFinds = [], stats = DEFAULT_ST
43
43
  fontSize: 11, letterSpacing: 2, padding: '2px 8px',
44
44
  background: C.GREEN, color: C.WHITE, borderRadius: 3,
45
45
  textShadow: '1px 1px 0 rgba(0,0,0,.8)',
46
- }, children: "RECENT FINDS" }), _jsx("div", { style: { flex: 1, height: 2, background: `${C.GREEN}55`, borderRadius: 1 } })] }), _jsx("div", { style: {
46
+ }, children: "Recent Finds" }), _jsx("div", { style: { flex: 1, height: 2, background: `${C.GREEN}55`, borderRadius: 1 } })] }), _jsx("div", { style: {
47
47
  background: C.DARK_GREY, borderRadius: 6, padding: '8px 10px',
48
48
  border: `2px solid ${C.PANEL_EDGE}`, boxShadow: `0 2px 0 ${C.BLACK}`,
49
49
  fontSize: 11, color: C.GREY, letterSpacing: 1, lineHeight: 1.7,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaml-ui",
3
- "version": "0.14.2",
3
+ "version": "0.14.4",
4
4
  "description": "Balatro rendering components, sprite metadata, and optional Motely helpers for React apps.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,9 +34,11 @@
34
34
  ],
35
35
  "files": [
36
36
  "dist",
37
- "assets",
37
+ "assets/*.png",
38
+ "assets/fonts",
38
39
  "fonts.css",
39
40
  "README.md",
41
+ "DESIGN.md",
40
42
  "LICENSE"
41
43
  ],
42
44
  "scripts": {
@@ -108,12 +110,13 @@
108
110
  "@types/three": "^0.184.0",
109
111
  "@vitejs/plugin-react": "^5.0.4",
110
112
  "monaco-editor": "^0.55.1",
111
- "motely-wasm": "link:../JammySeedFinder/src/MotelyJAML/Motely.Wasm/bin/motely-wasm",
112
- "react": "^19.2.4",
113
+ "motely-wasm": "^14.0.2",
114
+ "react": "^19.2.4",
113
115
  "react-dom": "^19.2.4",
114
116
  "react-icons": "^5.6.0",
115
117
  "three": "^0.184.0",
116
118
  "typescript": "^5.9.3",
117
- "vite": "^8.0.9"
119
+ "vite": "^8.0.9",
120
+ "@google/design.md": "^0.1.1"
118
121
  }
119
122
  }
@@ -1 +0,0 @@
1
- {"sections":{"seed-detail":{"labels":{"hifi":"Hi-fi · Balatro native"}}}}