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.
- package/DESIGN.md +197 -0
- package/dist/components/AnalyzerExplorer.js +0 -11
- package/dist/components/JamlAestheticSelector.js +1 -3
- package/dist/components/JamlAnalyzerFullscreen.js +3 -3
- package/dist/components/JamlIde.js +0 -2
- package/dist/components/JamlSeedInput.js +1 -2
- package/dist/components/JamlSpeedometer.js +1 -1
- package/dist/ui/codeBlock.js +1 -1
- package/dist/ui/jimboCopyRow.js +1 -2
- package/dist/ui/jimboFilterBar.js +2 -4
- package/dist/ui/showcase.js +4 -4
- package/package.json +8 -5
- package/assets/Balatro Seed Curator (DesignsV2)/.design-canvas.state.json +0 -1
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/BlindChips.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters/Boosters.json +0 -303
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters/boosters.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Boosters.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Bosses/BlindChips.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Bosses/blinds_metadata.json +0 -51
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/8BitDeck.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/Enhancers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/balatro-stake-chips.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/enhancers_metadata.json +0 -52
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/playing_cards_metadata.json +0 -249
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/stakes.json +0 -19
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Editions.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Enhancers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/Editions.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/Jokers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/jokers.json +0 -1087
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/stickers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers/stickers_metadata.json +0 -25
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Jokers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tags/tags.json +0 -191
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tags/tags.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/Tarots.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/planets.json +0 -15
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/spectrals.json +0 -21
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots/tarots.json +0 -163
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Tarots.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers/Vouchers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers/vouchers.json +0 -130
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/Vouchers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/blinds.json +0 -51
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/boosters.json +0 -303
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/fonts/m6x11plusplus.otf +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/jokers.json +0 -1087
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/planets.json +0 -15
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/spectrals.json +0 -21
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/stakes.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/stickers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/tags.json +0 -191
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/tags.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/tarots.json +0 -163
- package/assets/Balatro Seed Curator (DesignsV2)/Assets/vouchers.json +0 -130
- package/assets/Balatro Seed Curator (DesignsV2)/Seed Detail v2.html +0 -40
- package/assets/Balatro Seed Curator (DesignsV2)/Seed Detail.html +0 -34
- package/assets/Balatro Seed Curator (DesignsV2)/public/fonts/m6x11plusplus.otf +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/src/AntePage.jsx +0 -228
- package/assets/Balatro Seed Curator (DesignsV2)/src/SeedDetail.jsx +0 -222
- package/assets/Balatro Seed Curator (DesignsV2)/src/app.jsx +0 -35
- package/assets/Balatro Seed Curator (DesignsV2)/src/mockData.js +0 -185
- package/assets/Balatro Seed Curator (DesignsV2)/src/sprites.jsx +0 -259
- package/assets/Balatro Seed Curator (DesignsV2)/src/tokens.js +0 -49
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/AntePageV2.jsx +0 -290
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/BalButton.jsx +0 -107
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/JamlBuilderV2.jsx +0 -594
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/JamlIde.jsx +0 -302
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SearchResultsV2.jsx +0 -286
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SeedDetailV2.jsx +0 -336
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/SeedOGCard.jsx +0 -251
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/Showcase.jsx +0 -131
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/app.jsx +0 -55
- package/assets/Balatro Seed Curator (DesignsV2)/src/v2/data.js +0 -296
- package/assets/Balatro Seed Curator (DesignsV2)/starters/design-canvas.jsx +0 -622
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/8BitDeck.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/BlindChips.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/Boosters.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/Editions.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/Enhancers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/Jokers.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/Tarots.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749540653-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749644934-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749661871-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749674748-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749703076-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776749882759-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776750354200-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776750733265-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776751928925-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/pasted-1776800975060-0.png +0 -0
- package/assets/Balatro Seed Curator (DesignsV2)/uploads/stickers.png +0 -0
- 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",
|
|
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: "
|
|
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
|
|
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: "
|
|
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",
|
|
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,
|
|
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
|
}
|
package/dist/ui/codeBlock.js
CHANGED
|
@@ -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,
|
|
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
|
}
|
package/dist/ui/jimboCopyRow.js
CHANGED
|
@@ -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",
|
|
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 = '
|
|
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",
|
|
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 })] }));
|
package/dist/ui/showcase.js
CHANGED
|
@@ -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: "
|
|
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
|
|
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: "
|
|
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: "
|
|
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.
|
|
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": "
|
|
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"}}}}
|
|
Binary file
|