jaml-ui 0.14.0 → 0.14.1
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/assets/Balatro Seed Curator (DesignsV2)/Assets/Decks/playing_cards_metadata.json +230 -55
- package/dist/components/AnalyzerExplorer.js +75 -90
- package/dist/components/CardFan.js +2 -2
- package/dist/components/GameCard.js +9 -9
- package/dist/components/JamlIde.d.ts +2 -1
- package/dist/components/JamlIde.js +6 -4
- package/dist/components/JamlIdeToolbar.js +1 -0
- package/dist/components/Standardcard.d.ts +18 -0
- package/dist/components/Standardcard.js +80 -0
- package/dist/decode/motelyItemDecoder.d.ts +3 -3
- package/dist/decode/motelyItemDecoder.js +12 -12
- package/dist/decode/packedBalatroItem.d.ts +1 -1
- package/dist/decode/packedBalatroItem.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/motely.d.ts +1 -1
- package/dist/motely.js +1 -1
- package/dist/ui/jimboTabs.js +1 -1
- package/dist/utils/fileSystem.d.ts +1 -0
- package/dist/utils/fileSystem.js +23 -0
- package/dist/utils/itemUtils.d.ts +1 -1
- package/dist/utils/itemUtils.js +3 -3
- package/package.json +4 -3
|
@@ -4,71 +4,246 @@
|
|
|
4
4
|
"spriteHeight": 190,
|
|
5
5
|
"columns": 13,
|
|
6
6
|
"rows": 4,
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "Standard card face patterns to overlay on enhancement cards",
|
|
8
8
|
"layout": {
|
|
9
|
-
"suits": [
|
|
10
|
-
|
|
9
|
+
"suits": [
|
|
10
|
+
"Hearts",
|
|
11
|
+
"Clubs",
|
|
12
|
+
"Diamonds",
|
|
13
|
+
"Spades"
|
|
14
|
+
],
|
|
15
|
+
"ranks": [
|
|
16
|
+
"2",
|
|
17
|
+
"3",
|
|
18
|
+
"4",
|
|
19
|
+
"5",
|
|
20
|
+
"6",
|
|
21
|
+
"7",
|
|
22
|
+
"8",
|
|
23
|
+
"9",
|
|
24
|
+
"10",
|
|
25
|
+
"Jack",
|
|
26
|
+
"Queen",
|
|
27
|
+
"King",
|
|
28
|
+
"Ace"
|
|
29
|
+
]
|
|
11
30
|
},
|
|
12
31
|
"sprites": {
|
|
13
32
|
"Hearts": {
|
|
14
|
-
"2": {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
33
|
+
"2": {
|
|
34
|
+
"x": 0,
|
|
35
|
+
"y": 0
|
|
36
|
+
},
|
|
37
|
+
"3": {
|
|
38
|
+
"x": 1,
|
|
39
|
+
"y": 0
|
|
40
|
+
},
|
|
41
|
+
"4": {
|
|
42
|
+
"x": 2,
|
|
43
|
+
"y": 0
|
|
44
|
+
},
|
|
45
|
+
"5": {
|
|
46
|
+
"x": 3,
|
|
47
|
+
"y": 0
|
|
48
|
+
},
|
|
49
|
+
"6": {
|
|
50
|
+
"x": 4,
|
|
51
|
+
"y": 0
|
|
52
|
+
},
|
|
53
|
+
"7": {
|
|
54
|
+
"x": 5,
|
|
55
|
+
"y": 0
|
|
56
|
+
},
|
|
57
|
+
"8": {
|
|
58
|
+
"x": 6,
|
|
59
|
+
"y": 0
|
|
60
|
+
},
|
|
61
|
+
"9": {
|
|
62
|
+
"x": 7,
|
|
63
|
+
"y": 0
|
|
64
|
+
},
|
|
65
|
+
"10": {
|
|
66
|
+
"x": 8,
|
|
67
|
+
"y": 0
|
|
68
|
+
},
|
|
69
|
+
"Jack": {
|
|
70
|
+
"x": 9,
|
|
71
|
+
"y": 0
|
|
72
|
+
},
|
|
73
|
+
"Queen": {
|
|
74
|
+
"x": 10,
|
|
75
|
+
"y": 0
|
|
76
|
+
},
|
|
77
|
+
"King": {
|
|
78
|
+
"x": 11,
|
|
79
|
+
"y": 0
|
|
80
|
+
},
|
|
81
|
+
"Ace": {
|
|
82
|
+
"x": 12,
|
|
83
|
+
"y": 0
|
|
84
|
+
}
|
|
27
85
|
},
|
|
28
86
|
"Clubs": {
|
|
29
|
-
"2": {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
87
|
+
"2": {
|
|
88
|
+
"x": 0,
|
|
89
|
+
"y": 1
|
|
90
|
+
},
|
|
91
|
+
"3": {
|
|
92
|
+
"x": 1,
|
|
93
|
+
"y": 1
|
|
94
|
+
},
|
|
95
|
+
"4": {
|
|
96
|
+
"x": 2,
|
|
97
|
+
"y": 1
|
|
98
|
+
},
|
|
99
|
+
"5": {
|
|
100
|
+
"x": 3,
|
|
101
|
+
"y": 1
|
|
102
|
+
},
|
|
103
|
+
"6": {
|
|
104
|
+
"x": 4,
|
|
105
|
+
"y": 1
|
|
106
|
+
},
|
|
107
|
+
"7": {
|
|
108
|
+
"x": 5,
|
|
109
|
+
"y": 1
|
|
110
|
+
},
|
|
111
|
+
"8": {
|
|
112
|
+
"x": 6,
|
|
113
|
+
"y": 1
|
|
114
|
+
},
|
|
115
|
+
"9": {
|
|
116
|
+
"x": 7,
|
|
117
|
+
"y": 1
|
|
118
|
+
},
|
|
119
|
+
"10": {
|
|
120
|
+
"x": 8,
|
|
121
|
+
"y": 1
|
|
122
|
+
},
|
|
123
|
+
"Jack": {
|
|
124
|
+
"x": 9,
|
|
125
|
+
"y": 1
|
|
126
|
+
},
|
|
127
|
+
"Queen": {
|
|
128
|
+
"x": 10,
|
|
129
|
+
"y": 1
|
|
130
|
+
},
|
|
131
|
+
"King": {
|
|
132
|
+
"x": 11,
|
|
133
|
+
"y": 1
|
|
134
|
+
},
|
|
135
|
+
"Ace": {
|
|
136
|
+
"x": 12,
|
|
137
|
+
"y": 1
|
|
138
|
+
}
|
|
42
139
|
},
|
|
43
140
|
"Diamonds": {
|
|
44
|
-
"2": {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
141
|
+
"2": {
|
|
142
|
+
"x": 0,
|
|
143
|
+
"y": 2
|
|
144
|
+
},
|
|
145
|
+
"3": {
|
|
146
|
+
"x": 1,
|
|
147
|
+
"y": 2
|
|
148
|
+
},
|
|
149
|
+
"4": {
|
|
150
|
+
"x": 2,
|
|
151
|
+
"y": 2
|
|
152
|
+
},
|
|
153
|
+
"5": {
|
|
154
|
+
"x": 3,
|
|
155
|
+
"y": 2
|
|
156
|
+
},
|
|
157
|
+
"6": {
|
|
158
|
+
"x": 4,
|
|
159
|
+
"y": 2
|
|
160
|
+
},
|
|
161
|
+
"7": {
|
|
162
|
+
"x": 5,
|
|
163
|
+
"y": 2
|
|
164
|
+
},
|
|
165
|
+
"8": {
|
|
166
|
+
"x": 6,
|
|
167
|
+
"y": 2
|
|
168
|
+
},
|
|
169
|
+
"9": {
|
|
170
|
+
"x": 7,
|
|
171
|
+
"y": 2
|
|
172
|
+
},
|
|
173
|
+
"10": {
|
|
174
|
+
"x": 8,
|
|
175
|
+
"y": 2
|
|
176
|
+
},
|
|
177
|
+
"Jack": {
|
|
178
|
+
"x": 9,
|
|
179
|
+
"y": 2
|
|
180
|
+
},
|
|
181
|
+
"Queen": {
|
|
182
|
+
"x": 10,
|
|
183
|
+
"y": 2
|
|
184
|
+
},
|
|
185
|
+
"King": {
|
|
186
|
+
"x": 11,
|
|
187
|
+
"y": 2
|
|
188
|
+
},
|
|
189
|
+
"Ace": {
|
|
190
|
+
"x": 12,
|
|
191
|
+
"y": 2
|
|
192
|
+
}
|
|
57
193
|
},
|
|
58
194
|
"Spades": {
|
|
59
|
-
"2": {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
195
|
+
"2": {
|
|
196
|
+
"x": 0,
|
|
197
|
+
"y": 3
|
|
198
|
+
},
|
|
199
|
+
"3": {
|
|
200
|
+
"x": 1,
|
|
201
|
+
"y": 3
|
|
202
|
+
},
|
|
203
|
+
"4": {
|
|
204
|
+
"x": 2,
|
|
205
|
+
"y": 3
|
|
206
|
+
},
|
|
207
|
+
"5": {
|
|
208
|
+
"x": 3,
|
|
209
|
+
"y": 3
|
|
210
|
+
},
|
|
211
|
+
"6": {
|
|
212
|
+
"x": 4,
|
|
213
|
+
"y": 3
|
|
214
|
+
},
|
|
215
|
+
"7": {
|
|
216
|
+
"x": 5,
|
|
217
|
+
"y": 3
|
|
218
|
+
},
|
|
219
|
+
"8": {
|
|
220
|
+
"x": 6,
|
|
221
|
+
"y": 3
|
|
222
|
+
},
|
|
223
|
+
"9": {
|
|
224
|
+
"x": 7,
|
|
225
|
+
"y": 3
|
|
226
|
+
},
|
|
227
|
+
"10": {
|
|
228
|
+
"x": 8,
|
|
229
|
+
"y": 3
|
|
230
|
+
},
|
|
231
|
+
"Jack": {
|
|
232
|
+
"x": 9,
|
|
233
|
+
"y": 3
|
|
234
|
+
},
|
|
235
|
+
"Queen": {
|
|
236
|
+
"x": 10,
|
|
237
|
+
"y": 3
|
|
238
|
+
},
|
|
239
|
+
"King": {
|
|
240
|
+
"x": 11,
|
|
241
|
+
"y": 3
|
|
242
|
+
},
|
|
243
|
+
"Ace": {
|
|
244
|
+
"x": 12,
|
|
245
|
+
"y": 3
|
|
246
|
+
}
|
|
72
247
|
}
|
|
73
248
|
}
|
|
74
249
|
}
|
|
@@ -140,9 +140,10 @@ const styles = {
|
|
|
140
140
|
flexDirection: "column",
|
|
141
141
|
height: "100%",
|
|
142
142
|
minHeight: 0,
|
|
143
|
+
fontFamily: "m6x11plus, monospace",
|
|
143
144
|
},
|
|
144
145
|
highlightSection: {
|
|
145
|
-
padding: "
|
|
146
|
+
padding: "6px 8px",
|
|
146
147
|
borderBottom: "1px solid #1a1a34",
|
|
147
148
|
background: "#0f0f22",
|
|
148
149
|
},
|
|
@@ -150,14 +151,14 @@ const styles = {
|
|
|
150
151
|
display: "flex",
|
|
151
152
|
alignItems: "center",
|
|
152
153
|
justifyContent: "space-between",
|
|
153
|
-
gap:
|
|
154
|
-
marginBottom:
|
|
154
|
+
gap: 8,
|
|
155
|
+
marginBottom: 4,
|
|
155
156
|
},
|
|
156
157
|
highlightTitle: {
|
|
157
|
-
fontSize:
|
|
158
|
+
fontSize: 12,
|
|
158
159
|
color: "#6f6fa1",
|
|
159
160
|
textTransform: "uppercase",
|
|
160
|
-
letterSpacing: "0.
|
|
161
|
+
letterSpacing: "0.05em",
|
|
161
162
|
},
|
|
162
163
|
highlightSubtitle: {
|
|
163
164
|
fontSize: 11,
|
|
@@ -165,32 +166,32 @@ const styles = {
|
|
|
165
166
|
},
|
|
166
167
|
highlightRail: {
|
|
167
168
|
display: "flex",
|
|
168
|
-
gap:
|
|
169
|
+
gap: 6,
|
|
169
170
|
overflowX: "auto",
|
|
170
|
-
paddingBottom:
|
|
171
|
+
paddingBottom: 2,
|
|
171
172
|
scrollSnapType: "x mandatory",
|
|
172
173
|
},
|
|
173
174
|
highlightCard: {
|
|
174
|
-
minWidth:
|
|
175
|
-
maxWidth:
|
|
175
|
+
minWidth: 120,
|
|
176
|
+
maxWidth: 120,
|
|
176
177
|
display: "flex",
|
|
177
178
|
flexDirection: "column",
|
|
178
|
-
gap:
|
|
179
|
-
padding:
|
|
180
|
-
borderRadius:
|
|
179
|
+
gap: 4,
|
|
180
|
+
padding: 4,
|
|
181
|
+
borderRadius: 8,
|
|
181
182
|
border: "1px solid #2a2a55",
|
|
182
183
|
background: "#131326",
|
|
183
184
|
scrollSnapAlign: "center",
|
|
184
185
|
cursor: "pointer",
|
|
185
186
|
},
|
|
186
187
|
highlightCardActive: {
|
|
187
|
-
minWidth:
|
|
188
|
-
maxWidth:
|
|
188
|
+
minWidth: 120,
|
|
189
|
+
maxWidth: 120,
|
|
189
190
|
display: "flex",
|
|
190
191
|
flexDirection: "column",
|
|
191
|
-
gap:
|
|
192
|
-
padding:
|
|
193
|
-
borderRadius:
|
|
192
|
+
gap: 4,
|
|
193
|
+
padding: 4,
|
|
194
|
+
borderRadius: 8,
|
|
194
195
|
border: "1px solid rgba(245,200,66,0.45)",
|
|
195
196
|
background: "rgba(245,200,66,0.08)",
|
|
196
197
|
scrollSnapAlign: "center",
|
|
@@ -200,25 +201,23 @@ const styles = {
|
|
|
200
201
|
display: "flex",
|
|
201
202
|
justifyContent: "center",
|
|
202
203
|
alignItems: "flex-start",
|
|
203
|
-
minHeight:
|
|
204
|
+
minHeight: 80,
|
|
204
205
|
},
|
|
205
206
|
highlightMeta: {
|
|
206
207
|
display: "flex",
|
|
207
208
|
flexDirection: "column",
|
|
208
|
-
gap:
|
|
209
|
+
gap: 2,
|
|
209
210
|
alignItems: "flex-start",
|
|
210
211
|
},
|
|
211
212
|
highlightAnte: {
|
|
212
|
-
fontSize:
|
|
213
|
+
fontSize: 11,
|
|
213
214
|
color: "#a855f7",
|
|
214
|
-
fontWeight: 700,
|
|
215
215
|
textTransform: "uppercase",
|
|
216
|
-
letterSpacing: "0.
|
|
216
|
+
letterSpacing: "0.05em",
|
|
217
217
|
},
|
|
218
218
|
highlightLabel: {
|
|
219
|
-
fontSize:
|
|
219
|
+
fontSize: 13,
|
|
220
220
|
color: "#ececff",
|
|
221
|
-
fontWeight: 700,
|
|
222
221
|
lineHeight: 1.2,
|
|
223
222
|
textAlign: "left",
|
|
224
223
|
},
|
|
@@ -232,32 +231,30 @@ const styles = {
|
|
|
232
231
|
display: "flex",
|
|
233
232
|
alignItems: "center",
|
|
234
233
|
justifyContent: "center",
|
|
235
|
-
gap:
|
|
236
|
-
padding: "8px
|
|
234
|
+
gap: 8,
|
|
235
|
+
padding: "4px 8px",
|
|
237
236
|
background: "#0f0f22",
|
|
238
237
|
borderBottom: "1px solid #1a1a34",
|
|
239
238
|
},
|
|
240
239
|
navButton: {
|
|
241
240
|
background: "none",
|
|
242
241
|
border: "1px solid #2a2a55",
|
|
243
|
-
borderRadius:
|
|
242
|
+
borderRadius: 4,
|
|
244
243
|
color: "#9898c0",
|
|
245
244
|
fontSize: 14,
|
|
246
|
-
padding: "
|
|
245
|
+
padding: "2px 8px",
|
|
247
246
|
cursor: "pointer",
|
|
248
247
|
},
|
|
249
248
|
navLabel: {
|
|
250
|
-
fontSize:
|
|
251
|
-
fontWeight: 700,
|
|
249
|
+
fontSize: 13,
|
|
252
250
|
color: "#a855f7",
|
|
253
251
|
textTransform: "uppercase",
|
|
254
|
-
letterSpacing: "0.
|
|
255
|
-
minWidth:
|
|
252
|
+
letterSpacing: "0.05em",
|
|
253
|
+
minWidth: 110,
|
|
256
254
|
textAlign: "center",
|
|
257
255
|
},
|
|
258
256
|
navSubLabel: {
|
|
259
257
|
color: "#5a5a88",
|
|
260
|
-
fontWeight: 500,
|
|
261
258
|
textTransform: "none",
|
|
262
259
|
letterSpacing: "normal",
|
|
263
260
|
fontSize: 11,
|
|
@@ -275,80 +272,76 @@ const styles = {
|
|
|
275
272
|
scrollSnapStop: "always",
|
|
276
273
|
minHeight: "100%",
|
|
277
274
|
boxSizing: "border-box",
|
|
278
|
-
paddingBottom:
|
|
275
|
+
paddingBottom: 8,
|
|
279
276
|
borderBottom: "1px solid #1a1a34",
|
|
280
277
|
},
|
|
281
278
|
anteSection: {
|
|
282
|
-
paddingBottom:
|
|
279
|
+
paddingBottom: 4,
|
|
283
280
|
},
|
|
284
281
|
anteHeader: {
|
|
285
282
|
display: "flex",
|
|
286
283
|
alignItems: "center",
|
|
287
|
-
gap:
|
|
288
|
-
padding: "8px
|
|
284
|
+
gap: 8,
|
|
285
|
+
padding: "6px 8px",
|
|
289
286
|
},
|
|
290
287
|
anteHeading: {
|
|
291
|
-
fontSize:
|
|
292
|
-
fontWeight: 700,
|
|
288
|
+
fontSize: 14,
|
|
293
289
|
color: "#a855f7",
|
|
294
290
|
textTransform: "uppercase",
|
|
295
|
-
letterSpacing: "0.
|
|
291
|
+
letterSpacing: "0.05em",
|
|
296
292
|
},
|
|
297
293
|
bossRow: {
|
|
298
294
|
display: "flex",
|
|
299
295
|
alignItems: "center",
|
|
300
|
-
gap:
|
|
296
|
+
gap: 4,
|
|
301
297
|
},
|
|
302
298
|
bossName: {
|
|
303
|
-
fontSize:
|
|
299
|
+
fontSize: 14,
|
|
304
300
|
color: "#e84040",
|
|
305
|
-
fontWeight: 600,
|
|
306
301
|
},
|
|
307
302
|
row: {
|
|
308
|
-
padding: "
|
|
303
|
+
padding: "2px 8px 4px",
|
|
309
304
|
},
|
|
310
305
|
rowLabel: {
|
|
311
|
-
fontSize:
|
|
306
|
+
fontSize: 11,
|
|
312
307
|
color: "#5a5a88",
|
|
313
308
|
textTransform: "uppercase",
|
|
314
|
-
letterSpacing: "0.
|
|
315
|
-
marginBottom:
|
|
309
|
+
letterSpacing: "0.05em",
|
|
310
|
+
marginBottom: 4,
|
|
316
311
|
},
|
|
317
312
|
cardFlow: {
|
|
318
313
|
display: "flex",
|
|
319
314
|
flexWrap: "wrap",
|
|
320
|
-
gap:
|
|
315
|
+
gap: 6,
|
|
321
316
|
alignItems: "flex-start",
|
|
322
317
|
},
|
|
323
318
|
denseGrid: {
|
|
324
319
|
display: "grid",
|
|
325
|
-
gridTemplateColumns: "repeat(auto-fit, minmax(
|
|
326
|
-
gap:
|
|
320
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(70px, 1fr))",
|
|
321
|
+
gap: 6,
|
|
327
322
|
alignItems: "start",
|
|
328
323
|
},
|
|
329
324
|
compactCard: {
|
|
330
325
|
display: "flex",
|
|
331
326
|
flexDirection: "column",
|
|
332
327
|
alignItems: "center",
|
|
333
|
-
gap:
|
|
334
|
-
minWidth:
|
|
328
|
+
gap: 2,
|
|
329
|
+
minWidth: 50,
|
|
335
330
|
},
|
|
336
331
|
compactLabel: {
|
|
337
|
-
padding: "
|
|
332
|
+
padding: "1px 4px",
|
|
338
333
|
borderRadius: 999,
|
|
339
334
|
background: "#18182e",
|
|
340
335
|
color: "#7f7fa7",
|
|
341
336
|
border: "1px solid #2a2a55",
|
|
342
|
-
fontSize:
|
|
343
|
-
fontWeight: 700,
|
|
337
|
+
fontSize: 11,
|
|
344
338
|
textTransform: "uppercase",
|
|
345
|
-
letterSpacing: "0.05em",
|
|
346
339
|
},
|
|
347
340
|
itemCard: {
|
|
348
341
|
display: "flex",
|
|
349
342
|
flexDirection: "column",
|
|
350
343
|
alignItems: "center",
|
|
351
|
-
gap:
|
|
344
|
+
gap: 2,
|
|
352
345
|
width: "100%",
|
|
353
346
|
minWidth: 0,
|
|
354
347
|
},
|
|
@@ -356,96 +349,88 @@ const styles = {
|
|
|
356
349
|
display: "flex",
|
|
357
350
|
flexDirection: "column",
|
|
358
351
|
alignItems: "center",
|
|
359
|
-
gap:
|
|
352
|
+
gap: 2,
|
|
360
353
|
width: "100%",
|
|
361
354
|
minWidth: 0,
|
|
362
|
-
padding: "
|
|
363
|
-
borderRadius:
|
|
364
|
-
border: "1px solid rgba(245,200,66,0.
|
|
365
|
-
background: "rgba(245,200,66,0.
|
|
355
|
+
padding: "2px",
|
|
356
|
+
borderRadius: 8,
|
|
357
|
+
border: "1px solid rgba(245,200,66,0.6)",
|
|
358
|
+
background: "rgba(245,200,66,0.15)",
|
|
366
359
|
},
|
|
367
360
|
itemText: {
|
|
368
|
-
fontSize:
|
|
361
|
+
fontSize: 11,
|
|
369
362
|
color: "#8e8eb6",
|
|
370
363
|
textAlign: "center",
|
|
371
|
-
lineHeight: 1.
|
|
364
|
+
lineHeight: 1.1,
|
|
372
365
|
maxWidth: 84,
|
|
373
366
|
overflow: "hidden",
|
|
374
367
|
textOverflow: "ellipsis",
|
|
375
368
|
whiteSpace: "nowrap",
|
|
376
369
|
},
|
|
377
370
|
itemDetail: {
|
|
378
|
-
fontSize:
|
|
371
|
+
fontSize: 11,
|
|
379
372
|
color: "#d8d8ea",
|
|
380
373
|
textAlign: "center",
|
|
381
|
-
lineHeight: 1.
|
|
374
|
+
lineHeight: 1.1,
|
|
382
375
|
},
|
|
383
376
|
badgeRow: {
|
|
384
377
|
display: "flex",
|
|
385
378
|
flexWrap: "wrap",
|
|
386
|
-
gap:
|
|
379
|
+
gap: 2,
|
|
387
380
|
justifyContent: "center",
|
|
388
381
|
},
|
|
389
382
|
badge: {
|
|
390
|
-
padding: "
|
|
383
|
+
padding: "1px 4px",
|
|
391
384
|
borderRadius: 999,
|
|
392
385
|
background: "#202043",
|
|
393
386
|
color: "#c7c7ef",
|
|
394
387
|
border: "1px solid #35356d",
|
|
395
|
-
fontSize:
|
|
396
|
-
fontWeight: 700,
|
|
388
|
+
fontSize: 11,
|
|
397
389
|
textTransform: "uppercase",
|
|
398
|
-
letterSpacing: "0.05em",
|
|
399
390
|
},
|
|
400
391
|
badgeAccent: {
|
|
401
|
-
padding: "
|
|
392
|
+
padding: "1px 4px",
|
|
402
393
|
borderRadius: 999,
|
|
403
394
|
background: "rgba(245,200,66,0.2)",
|
|
404
395
|
color: "#f5c842",
|
|
405
396
|
border: "1px solid rgba(245,200,66,0.35)",
|
|
406
|
-
fontSize:
|
|
407
|
-
fontWeight: 700,
|
|
397
|
+
fontSize: 11,
|
|
408
398
|
textTransform: "uppercase",
|
|
409
|
-
letterSpacing: "0.05em",
|
|
410
399
|
},
|
|
411
400
|
badgeMuted: {
|
|
412
|
-
padding: "
|
|
401
|
+
padding: "1px 4px",
|
|
413
402
|
borderRadius: 999,
|
|
414
403
|
background: "#18182e",
|
|
415
404
|
color: "#7f7fa7",
|
|
416
405
|
border: "1px solid #2a2a55",
|
|
417
|
-
fontSize:
|
|
418
|
-
fontWeight: 700,
|
|
406
|
+
fontSize: 11,
|
|
419
407
|
textTransform: "uppercase",
|
|
420
|
-
letterSpacing: "0.05em",
|
|
421
408
|
},
|
|
422
409
|
packChip: {
|
|
423
|
-
fontSize:
|
|
410
|
+
fontSize: 13,
|
|
424
411
|
color: "#5a5a88",
|
|
425
412
|
background: "#131326",
|
|
426
413
|
border: "1px solid #2a2a55",
|
|
427
|
-
borderRadius:
|
|
428
|
-
padding: "
|
|
414
|
+
borderRadius: 4,
|
|
415
|
+
padding: "2px 6px",
|
|
429
416
|
},
|
|
430
417
|
factCard: {
|
|
431
418
|
display: "flex",
|
|
432
419
|
flexDirection: "column",
|
|
433
|
-
gap:
|
|
434
|
-
minWidth:
|
|
435
|
-
padding: "
|
|
436
|
-
borderRadius:
|
|
420
|
+
gap: 1,
|
|
421
|
+
minWidth: 90,
|
|
422
|
+
padding: "4px 6px",
|
|
423
|
+
borderRadius: 6,
|
|
437
424
|
background: "#131326",
|
|
438
425
|
border: "1px solid #2a2a55",
|
|
439
426
|
},
|
|
440
427
|
factLabel: {
|
|
441
|
-
fontSize:
|
|
428
|
+
fontSize: 11,
|
|
442
429
|
color: "#7f7fa7",
|
|
443
430
|
textTransform: "uppercase",
|
|
444
|
-
letterSpacing: "0.07em",
|
|
445
431
|
},
|
|
446
432
|
factValue: {
|
|
447
|
-
fontSize:
|
|
433
|
+
fontSize: 13,
|
|
448
434
|
color: "#ececff",
|
|
449
|
-
fontWeight: 700,
|
|
450
435
|
},
|
|
451
436
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { RealStandardcard } from './Standardcard.js';
|
|
4
4
|
import { JimboColorOption } from '../ui/tokens.js';
|
|
5
5
|
import { JimboText } from '../ui/jimboText.js';
|
|
6
6
|
const RANK_MAP = {
|
|
@@ -66,7 +66,7 @@ export function CardFan({ count = 0, cards, className = '', style, label, showLa
|
|
|
66
66
|
transform: `translateX(calc(-50% + ${xPos}px)) translateY(${yOffset}px) rotate(${rotation}deg)`,
|
|
67
67
|
transformOrigin: 'bottom center',
|
|
68
68
|
zIndex: i,
|
|
69
|
-
}, children: _jsx(
|
|
69
|
+
}, children: _jsx(RealStandardcard, { rank: parsed.rank, suit: parsed.suit, size: cardSize, style: { filter: `drop-shadow(0 2px 3px ${JimboColorOption.BLACK}66)` } }) }, i));
|
|
70
70
|
})) : (_jsx("div", { style: {
|
|
71
71
|
display: 'flex',
|
|
72
72
|
alignItems: 'center',
|
|
@@ -28,7 +28,7 @@ function normalizeCardSuit(raw) {
|
|
|
28
28
|
return "Spades";
|
|
29
29
|
return raw.trim();
|
|
30
30
|
}
|
|
31
|
-
function
|
|
31
|
+
function parseStandardcardName(name) {
|
|
32
32
|
const trimmed = name.trim();
|
|
33
33
|
const ofMatch = /^(A|K|Q|J|10|[2-9]|Ace|King|Queen|Jack)\s+of\s+(Hearts|Clubs|Diamonds|Spades)$/i.exec(trimmed);
|
|
34
34
|
if (ofMatch) {
|
|
@@ -137,15 +137,15 @@ function resolvePackedAnalyzerItem(item, scale) {
|
|
|
137
137
|
return { kind: "voucher", voucherName: baseName };
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
|
-
const
|
|
141
|
-
if (
|
|
140
|
+
const standardcard = parseStandardcardName(displayName) ?? parseStandardcardName(baseName);
|
|
141
|
+
if (standardcard) {
|
|
142
142
|
return {
|
|
143
143
|
kind: "playing",
|
|
144
144
|
type: "playing",
|
|
145
145
|
card: {
|
|
146
146
|
name: displayName,
|
|
147
|
-
rank:
|
|
148
|
-
suit:
|
|
147
|
+
rank: standardcard.rank,
|
|
148
|
+
suit: standardcard.suit,
|
|
149
149
|
scale,
|
|
150
150
|
},
|
|
151
151
|
};
|
|
@@ -182,15 +182,15 @@ export function resolveAnalyzerShopItem(item, scale = 1) {
|
|
|
182
182
|
return { kind: "voucher", voucherName: baseName };
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
|
-
const
|
|
186
|
-
if (
|
|
185
|
+
const standardcard = parseStandardcardName(displayName) ?? parseStandardcardName(baseName);
|
|
186
|
+
if (standardcard) {
|
|
187
187
|
return {
|
|
188
188
|
kind: "playing",
|
|
189
189
|
type: "playing",
|
|
190
190
|
card: {
|
|
191
191
|
name: displayName,
|
|
192
|
-
rank:
|
|
193
|
-
suit:
|
|
192
|
+
rank: standardcard.rank,
|
|
193
|
+
suit: standardcard.suit,
|
|
194
194
|
scale,
|
|
195
195
|
},
|
|
196
196
|
};
|
|
@@ -17,6 +17,7 @@ export interface JamlIdeProps {
|
|
|
17
17
|
defaultMode?: JamlIdeMode;
|
|
18
18
|
searchResults?: JamlIdeSearchResult[];
|
|
19
19
|
className?: string;
|
|
20
|
+
style?: React.CSSProperties;
|
|
20
21
|
title?: string;
|
|
21
22
|
actions?: React.ReactNode;
|
|
22
23
|
codePlaceholder?: string;
|
|
@@ -31,4 +32,4 @@ export interface JamlIdeProps {
|
|
|
31
32
|
}
|
|
32
33
|
export type { JamlVisualFilter } from "./JamlIdeVisual.js";
|
|
33
34
|
export type { JamlVisualClause, JamlZone } from "./JamlIdeVisual.js";
|
|
34
|
-
export declare function JamlIde({ jaml, defaultJaml, onChange, defaultMode, searchResults, className, title, actions, codePlaceholder, onSearch, isSearching, visualFilter, onVisualFilterChange, }: JamlIdeProps): import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
export declare function JamlIde({ jaml, defaultJaml, onChange, defaultMode, searchResults, className, style, title, actions, codePlaceholder, onSearch, isSearching, visualFilter, onVisualFilterChange, }: JamlIdeProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -54,7 +54,7 @@ function ResultsView({ results }) {
|
|
|
54
54
|
textAlign: "left",
|
|
55
55
|
}, children: [_jsx("span", { style: {
|
|
56
56
|
fontFamily: "m6x11plus, monospace",
|
|
57
|
-
fontWeight:
|
|
57
|
+
fontWeight: "normal",
|
|
58
58
|
fontSize: 14,
|
|
59
59
|
letterSpacing: 1,
|
|
60
60
|
color: JimboColorOption.GOLD_TEXT,
|
|
@@ -65,7 +65,7 @@ function ResultsView({ results }) {
|
|
|
65
65
|
color: result.score > 0 ? JimboColorOption.GREEN_TEXT : JimboColorOption.GREY,
|
|
66
66
|
minWidth: 36,
|
|
67
67
|
textAlign: "right",
|
|
68
|
-
}, children: result.score })] })) : null, hasTally ? (_jsx("span", { style: { fontSize:
|
|
68
|
+
}, children: result.score })] })) : null, hasTally ? (_jsx("span", { style: { fontSize: 11, color: JimboColorOption.GREY, marginLeft: 2 }, children: isOpen ? "▲" : "▼" })) : null] }), isOpen && hasTally ? (_jsx("div", { style: {
|
|
69
69
|
borderTop: `1px solid ${JimboColorOption.PANEL_EDGE}`,
|
|
70
70
|
padding: "8px 12px 10px",
|
|
71
71
|
display: "flex",
|
|
@@ -91,7 +91,7 @@ function ResultsView({ results }) {
|
|
|
91
91
|
}) })) : null] }, result.seed));
|
|
92
92
|
}) }));
|
|
93
93
|
}
|
|
94
|
-
export function JamlIde({ jaml, defaultJaml, onChange, defaultMode = "code", searchResults = [], className = "", title = "JAML IDE", actions, codePlaceholder = "Enter JAML...", onSearch, isSearching = false, visualFilter, onVisualFilterChange, }) {
|
|
94
|
+
export function JamlIde({ jaml, defaultJaml, onChange, defaultMode = "code", searchResults = [], className = "", style, title = "JAML IDE", actions, codePlaceholder = "Enter JAML...", onSearch, isSearching = false, visualFilter, onVisualFilterChange, }) {
|
|
95
95
|
const [mode, setMode] = useState(defaultMode);
|
|
96
96
|
const [internalText, setInternalText] = useState(jaml ?? defaultJaml ?? "");
|
|
97
97
|
const [lastJamlProp, setLastJamlProp] = useState(jaml);
|
|
@@ -151,13 +151,15 @@ export function JamlIde({ jaml, defaultJaml, onChange, defaultMode = "code", sea
|
|
|
151
151
|
boxShadow: `0 3px 0 0 ${JimboColorOption.BORDER_SOUTH}`,
|
|
152
152
|
background: JimboColorOption.DARK_GREY,
|
|
153
153
|
color: JimboColorOption.WHITE,
|
|
154
|
+
...style,
|
|
154
155
|
}, children: [_jsxs("div", { style: {
|
|
155
156
|
display: "flex",
|
|
156
157
|
alignItems: "center",
|
|
157
158
|
justifyContent: "space-between",
|
|
159
|
+
flexWrap: "wrap",
|
|
158
160
|
gap: 12,
|
|
159
161
|
padding: "10px 14px",
|
|
160
162
|
borderBottom: `1px solid ${JimboColorOption.PANEL_EDGE}`,
|
|
161
163
|
background: JimboColorOption.TEAL_GREY,
|
|
162
|
-
}, children: [_jsxs("div", { children: [_jsx("div", { style: { fontSize:
|
|
164
|
+
}, children: [_jsxs("div", { children: [_jsx("div", { style: { fontSize: 16, fontWeight: "normal", fontFamily: "m6x11plus, monospace", color: JimboColorOption.GOLD_TEXT }, children: title }), _jsx("div", { style: { fontSize: 11, color: JimboColorOption.GREY }, children: "Jimbo's Ante Markup Language" })] }), actions ? _jsx("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: actions }) : null] }), _jsx(JamlIdeToolbar, { mode: mode, onModeChange: setMode, resultCount: results.length, onSearch: onSearch, isSearching: isSearching }), _jsxs("div", { style: { flex: 1, minHeight: 0, overflow: "auto", background: JimboColorOption.DARKEST }, children: [mode === "visual" ? (_jsx(JamlIdeVisual, { filter: activeFilter, onChange: handleVisualFilterChange })) : null, mode === "code" ? (_jsx(JamlCodeEditor, { value: text, onChange: handleTextChange, placeholder: codePlaceholder })) : null, mode === "map" ? _jsx(JamlMapPreview, { jaml: text }) : null, mode === "results" ? (_jsx("div", { style: { padding: 12 }, children: _jsx(ResultsView, { results: results }) })) : null] })] }));
|
|
163
165
|
}
|
|
@@ -14,6 +14,7 @@ export function JamlIdeToolbar({ mode, onModeChange, resultCount = 0, className
|
|
|
14
14
|
display: "flex",
|
|
15
15
|
alignItems: "center",
|
|
16
16
|
justifyContent: "space-between",
|
|
17
|
+
flexWrap: "wrap",
|
|
17
18
|
gap: 8,
|
|
18
19
|
padding: "10px 10px 6px",
|
|
19
20
|
borderBottom: `1px solid ${JimboColorOption.PANEL_EDGE}`,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type CardSuit = 'Hearts' | 'Diamonds' | 'Clubs' | 'Spades' | 'hearts' | 'diamonds' | 'clubs' | 'spades';
|
|
3
|
+
export type CardRank = 'Ace' | 'King' | 'Queen' | 'Jack' | '10' | '9' | '8' | '7' | '6' | '5' | '4' | '3' | '2' | 'A' | 'K' | 'Q' | 'J';
|
|
4
|
+
export type CardEnhancement = 'bonus' | 'mult' | 'wild' | 'glass' | 'steel' | 'stone' | 'gold' | 'lucky' | null;
|
|
5
|
+
export type CardSeal = 'gold' | 'red' | 'blue' | 'purple' | null;
|
|
6
|
+
export type CardEdition = 'Foil' | 'Holographic' | 'Polychrome' | 'Negative' | null;
|
|
7
|
+
interface RealStandardcardProps {
|
|
8
|
+
suit: CardSuit;
|
|
9
|
+
rank: CardRank;
|
|
10
|
+
enhancement?: CardEnhancement;
|
|
11
|
+
seal?: CardSeal;
|
|
12
|
+
edition?: CardEdition;
|
|
13
|
+
className?: string;
|
|
14
|
+
size?: number;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
}
|
|
17
|
+
export declare function RealStandardcard({ suit, rank, enhancement, seal, edition, className, size, style }: RealStandardcardProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { resolveJamlAssetUrl } from '../assets.js';
|
|
4
|
+
import { RANK_MAP, SUIT_MAP, ENHANCER_MAP, SEAL_MAP, EDITION_MAP } from '../sprites/spriteData.js';
|
|
5
|
+
function cn(...classes) { return classes.filter(Boolean).join(" "); }
|
|
6
|
+
const CARD_WIDTH = 71;
|
|
7
|
+
const CARD_HEIGHT = 95;
|
|
8
|
+
const RANK_ALIAS = { A: 'Ace', K: 'King', Q: 'Queen', J: 'Jack' };
|
|
9
|
+
const pascal = (s) => s[0].toUpperCase() + s.slice(1).toLowerCase();
|
|
10
|
+
export function RealStandardcard({ suit, rank, enhancement, seal, edition, className, size = 71, style }) {
|
|
11
|
+
const rankKey = RANK_ALIAS[rank] ?? rank;
|
|
12
|
+
const suitKey = pascal(suit);
|
|
13
|
+
const col = RANK_MAP[rankKey];
|
|
14
|
+
const row = SUIT_MAP[suitKey];
|
|
15
|
+
if (col === undefined || row === undefined) {
|
|
16
|
+
console.warn(`Invalid card: ${rank} of ${suit}`);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const scale = size / CARD_WIDTH;
|
|
20
|
+
const finalH = size * (CARD_HEIGHT / CARD_WIDTH);
|
|
21
|
+
// Base card position
|
|
22
|
+
const bgX = -col * CARD_WIDTH;
|
|
23
|
+
const bgY = -row * CARD_HEIGHT;
|
|
24
|
+
// Enhancement background (if any) — ENHANCER_MAP is PascalCase, prop is lowercase
|
|
25
|
+
const enhPos = enhancement ? ENHANCER_MAP[pascal(enhancement)] ?? { x: 0, y: 0 } : { x: 0, y: 0 };
|
|
26
|
+
const enhBgX = -enhPos.x * CARD_WIDTH;
|
|
27
|
+
const enhBgY = -enhPos.y * CARD_HEIGHT;
|
|
28
|
+
// Seal overlay — SEAL_MAP is keyed by "Gold"/"Red"/"Blue"/"Purple"
|
|
29
|
+
const sealPos = seal ? SEAL_MAP[pascal(seal)] ?? null : null;
|
|
30
|
+
const sealBgX = sealPos ? -sealPos.x * CARD_WIDTH : 0;
|
|
31
|
+
const sealBgY = sealPos ? -sealPos.y * CARD_HEIGHT : 0;
|
|
32
|
+
// Edition overlay — EDITION_MAP gives column index on 5-wide editions sheet
|
|
33
|
+
const editionCol = edition ? EDITION_MAP[edition] : undefined;
|
|
34
|
+
const editionBgX = editionCol !== undefined ? -editionCol * CARD_WIDTH : 0;
|
|
35
|
+
const editionBgY = 0;
|
|
36
|
+
const isNegative = edition === 'Negative';
|
|
37
|
+
const baseFilter = isNegative ? 'invert(0.94)' : 'none';
|
|
38
|
+
const enhancersUrl = resolveJamlAssetUrl('enhancers');
|
|
39
|
+
const deckUrl = resolveJamlAssetUrl('deck');
|
|
40
|
+
const editionsUrl = resolveJamlAssetUrl('editions');
|
|
41
|
+
return (_jsxs("div", { className: cn('relative overflow-hidden inline-block select-none', className), style: {
|
|
42
|
+
width: size,
|
|
43
|
+
height: finalH,
|
|
44
|
+
imageRendering: 'pixelated',
|
|
45
|
+
...style
|
|
46
|
+
}, title: `${rank} of ${suit}${enhancement ? ` (${enhancement})` : ''}${seal ? ` [${seal} seal]` : ''}${edition ? ` {${edition}}` : ''}`, children: [_jsx("div", { className: "absolute inset-0", style: {
|
|
47
|
+
backgroundImage: `url(${enhancersUrl})`,
|
|
48
|
+
backgroundPosition: `${enhBgX}px ${enhBgY}px`,
|
|
49
|
+
width: CARD_WIDTH,
|
|
50
|
+
height: CARD_HEIGHT,
|
|
51
|
+
transform: `scale(${scale})`,
|
|
52
|
+
transformOrigin: 'top left',
|
|
53
|
+
backgroundRepeat: 'no-repeat',
|
|
54
|
+
} }), _jsx("div", { className: "absolute inset-0 z-[1]", style: {
|
|
55
|
+
backgroundImage: `url(${deckUrl})`,
|
|
56
|
+
backgroundPosition: `${bgX}px ${bgY}px`,
|
|
57
|
+
width: CARD_WIDTH,
|
|
58
|
+
height: CARD_HEIGHT,
|
|
59
|
+
transform: `scale(${scale})`,
|
|
60
|
+
transformOrigin: 'top left',
|
|
61
|
+
backgroundRepeat: 'no-repeat',
|
|
62
|
+
filter: baseFilter
|
|
63
|
+
} }), edition && edition !== 'Negative' && (_jsx("div", { className: "absolute inset-0 z-[2] mix-blend-screen opacity-60", style: {
|
|
64
|
+
backgroundImage: `url(${editionsUrl})`,
|
|
65
|
+
backgroundPosition: `${editionBgX}px ${editionBgY}px`,
|
|
66
|
+
width: CARD_WIDTH,
|
|
67
|
+
height: CARD_HEIGHT,
|
|
68
|
+
transform: `scale(${scale})`,
|
|
69
|
+
transformOrigin: 'top left',
|
|
70
|
+
backgroundRepeat: 'no-repeat',
|
|
71
|
+
} })), seal && (_jsx("div", { className: "absolute inset-0 z-[3]", style: {
|
|
72
|
+
backgroundImage: `url(${enhancersUrl})`,
|
|
73
|
+
backgroundPosition: `${sealBgX}px ${sealBgY}px`,
|
|
74
|
+
width: CARD_WIDTH,
|
|
75
|
+
height: CARD_HEIGHT,
|
|
76
|
+
transform: `scale(${scale})`,
|
|
77
|
+
transformOrigin: 'top left',
|
|
78
|
+
backgroundRepeat: 'no-repeat',
|
|
79
|
+
} })), isNegative && (_jsx("div", { className: "absolute inset-0 z-[4] bg-red-500/10 pointer-events-none mix-blend-overlay" }))] }));
|
|
80
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* MotelyItem.Value is a packed integer. The MotelyItemType enum
|
|
5
5
|
* uses packed integers where the top nibble encodes category:
|
|
6
|
-
* 0x1000 =
|
|
6
|
+
* 0x1000 = Standardcard, 0x2000 = Spectral, 0x3000 = Tarot,
|
|
7
7
|
* 0x4000 = Planet, 0x5000 = Joker, 0xF000 = Invalid
|
|
8
8
|
*/
|
|
9
9
|
import { type CardCategory } from "../utils/itemUtils.js";
|
|
@@ -46,8 +46,8 @@ export declare function motelyItemRenderCategory(input: MotelyItemInput): Motely
|
|
|
46
46
|
export declare function motelyItemEditionName(input: MotelyItemInput): "Foil" | "Holographic" | "Polychrome" | "Negative" | null;
|
|
47
47
|
export declare function motelyItemSealName(input: MotelyItemInput): "Gold" | "Red" | "Blue" | "Purple" | null;
|
|
48
48
|
export declare function motelyItemEnhancementName(input: MotelyItemInput): string | null;
|
|
49
|
-
export declare function
|
|
50
|
-
export declare function
|
|
49
|
+
export declare function motelyStandardcardSuitName(input: MotelyItemInput): "Clubs" | "Diamonds" | "Hearts" | "Spades" | null;
|
|
50
|
+
export declare function motelyStandardcardRankName(input: MotelyItemInput): string | null;
|
|
51
51
|
/** Get the enum key name for a MotelyItemType value. */
|
|
52
52
|
export declare function motelyItemTypeName(input: MotelyItemInput): string;
|
|
53
53
|
/** Get the category string for a MotelyItemType value. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* MotelyItem.Value is a packed integer. The MotelyItemType enum
|
|
5
5
|
* uses packed integers where the top nibble encodes category:
|
|
6
|
-
* 0x1000 =
|
|
6
|
+
* 0x1000 = Standardcard, 0x2000 = Spectral, 0x3000 = Tarot,
|
|
7
7
|
* 0x4000 = Planet, 0x5000 = Joker, 0xF000 = Invalid
|
|
8
8
|
*/
|
|
9
9
|
import { Motely } from "motely-wasm";
|
|
@@ -15,7 +15,7 @@ const VALUE_SEAL_MASK = 0x70000;
|
|
|
15
15
|
const VALUE_ENHANCEMENT_MASK = 0x780000;
|
|
16
16
|
const VALUE_EDITION_MASK = 0x3800000;
|
|
17
17
|
const CATEGORY_TO_TYPE = {
|
|
18
|
-
0x1000: "
|
|
18
|
+
0x1000: "Standard card",
|
|
19
19
|
0x2000: "Spectral",
|
|
20
20
|
0x3000: "Tarot",
|
|
21
21
|
0x4000: "Planet",
|
|
@@ -45,7 +45,7 @@ function runtimeEnumName(enumObject, value) {
|
|
|
45
45
|
const enumKey = enumObject[String(value)];
|
|
46
46
|
return typeof enumKey === "string" && enumKey.length > 0 ? enumKey : null;
|
|
47
47
|
}
|
|
48
|
-
function
|
|
48
|
+
function parseStandardcardEnumKey(enumKey) {
|
|
49
49
|
const match = /^([CDHS])(10|[2-9JQKA])$/.exec(enumKey);
|
|
50
50
|
if (!match)
|
|
51
51
|
return null;
|
|
@@ -142,22 +142,22 @@ export function motelyItemEnhancementName(input) {
|
|
|
142
142
|
const enumKey = runtimeEnumName(Motely.MotelyItemEnhancement, resolveEnhancementValue(input));
|
|
143
143
|
return enumKey === null || enumKey === "None" ? null : enumKey;
|
|
144
144
|
}
|
|
145
|
-
export function
|
|
145
|
+
export function motelyStandardcardSuitName(input) {
|
|
146
146
|
const runtimeItem = asRuntimeItem(input);
|
|
147
|
-
const directSuit = runtimeEnumName(Motely.
|
|
147
|
+
const directSuit = runtimeEnumName(Motely.MotelyStandardcardSuit, finiteNumber(runtimeItem?.suit));
|
|
148
148
|
if (directSuit === "Clubs" || directSuit === "Diamonds" || directSuit === "Hearts" || directSuit === "Spades") {
|
|
149
149
|
return directSuit;
|
|
150
150
|
}
|
|
151
|
-
const parsed =
|
|
151
|
+
const parsed = parseStandardcardEnumKey(motelyItemTypeName(input));
|
|
152
152
|
return parsed?.suit ?? null;
|
|
153
153
|
}
|
|
154
|
-
export function
|
|
154
|
+
export function motelyStandardcardRankName(input) {
|
|
155
155
|
const runtimeItem = asRuntimeItem(input);
|
|
156
|
-
const directRank = runtimeEnumName(Motely.
|
|
156
|
+
const directRank = runtimeEnumName(Motely.MotelyStandardcardRank, finiteNumber(runtimeItem?.rank));
|
|
157
157
|
const normalizedDirect = rankNameFromEnum(directRank);
|
|
158
158
|
if (normalizedDirect !== null)
|
|
159
159
|
return normalizedDirect;
|
|
160
|
-
const parsed =
|
|
160
|
+
const parsed = parseStandardcardEnumKey(motelyItemTypeName(input));
|
|
161
161
|
return parsed?.rank ?? null;
|
|
162
162
|
}
|
|
163
163
|
/** Get the enum key name for a MotelyItemType value. */
|
|
@@ -175,7 +175,7 @@ export function motelyItemCategory(input) {
|
|
|
175
175
|
return "Unknown";
|
|
176
176
|
const renderCategory = motelyItemRenderCategory(itemType);
|
|
177
177
|
if (renderCategory === "playing")
|
|
178
|
-
return "
|
|
178
|
+
return "Standard card";
|
|
179
179
|
if (renderCategory === "spectral")
|
|
180
180
|
return "Spectral";
|
|
181
181
|
if (renderCategory === "tarot")
|
|
@@ -206,8 +206,8 @@ export function decodeMotelyItem(input) {
|
|
|
206
206
|
return null;
|
|
207
207
|
}
|
|
208
208
|
const category = motelyItemRenderCategory(itemType);
|
|
209
|
-
const rank =
|
|
210
|
-
const suit =
|
|
209
|
+
const rank = motelyStandardcardRankName(itemType);
|
|
210
|
+
const suit = motelyStandardcardSuitName(itemType);
|
|
211
211
|
base = {
|
|
212
212
|
itemType,
|
|
213
213
|
enumKey,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Bit-packed shop/card ids (Balatro item encoding). */
|
|
2
2
|
export const BalatroItemCategory = {
|
|
3
|
-
|
|
3
|
+
Standardcard: 1,
|
|
4
4
|
Spectral: 2,
|
|
5
5
|
Tarot: 3,
|
|
6
6
|
Planet: 4,
|
|
@@ -22,5 +22,5 @@ export function packedItemIndex(packed) {
|
|
|
22
22
|
}
|
|
23
23
|
export function isPackedItemValid(packed) {
|
|
24
24
|
const category = packedItemCategory(packed);
|
|
25
|
-
return category >= BalatroItemCategory.
|
|
25
|
+
return category >= BalatroItemCategory.Standardcard && category <= BalatroItemCategory.Joker;
|
|
26
26
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export { JimboTooltip, type JimboTooltipProps, type JimboTooltipMode, type Jimbo
|
|
|
18
18
|
export { JamlIdeToolbar, type JamlIdeMode, type JamlIdeToolbarProps, } from "./components/JamlIdeToolbar.js";
|
|
19
19
|
export { CardList, type CardListProps } from "./components/CardList.js";
|
|
20
20
|
export { CardFan, type CardFanProps } from "./components/CardFan.js";
|
|
21
|
-
export {
|
|
21
|
+
export { RealStandardcard, type CardSuit, type CardRank, type CardEnhancement, type CardSeal, type CardEdition, } from "./components/Standardcard.js";
|
|
22
22
|
export { DeckSprite, DECK_SPRITE_POS, STAKE_SPRITE_POS, type DeckSpriteProps, } from "./components/DeckSprite.js";
|
|
23
23
|
export { MotelyVersionBadge, type MotelyVersionBadgeProps, type MotelyCapabilities, } from "./components/MotelyVersionBadge.js";
|
|
24
24
|
export { extractVisualJamlItems, type JamlPreviewGroups, type JamlPreviewItem, type JamlPreviewSection, type JamlPreviewVisualType, } from "./utils/jamlMapPreview.js";
|
|
@@ -28,3 +28,4 @@ export { useAnalyzer, type AnalyzerStatus, type AnalyzerLive, type MotelyJsRunSt
|
|
|
28
28
|
export { JamlSpeedometer, type JamlSpeedometerProps, } from "./components/JamlSpeedometer.js";
|
|
29
29
|
export { JamlAestheticSelector, type JamlAestheticSelectorProps, type JamlAestheticOption, } from "./components/JamlAestheticSelector.js";
|
|
30
30
|
export { JamlSeedInput, type JamlSeedInputProps, } from "./components/JamlSeedInput.js";
|
|
31
|
+
export { initJamlFileSystem } from "./utils/fileSystem.js";
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export { JimboTooltip, } from "./ui/jimboTooltip.js";
|
|
|
19
19
|
export { JamlIdeToolbar, } from "./components/JamlIdeToolbar.js";
|
|
20
20
|
export { CardList } from "./components/CardList.js";
|
|
21
21
|
export { CardFan } from "./components/CardFan.js";
|
|
22
|
-
export {
|
|
22
|
+
export { RealStandardcard, } from "./components/Standardcard.js";
|
|
23
23
|
export { DeckSprite, DECK_SPRITE_POS, STAKE_SPRITE_POS, } from "./components/DeckSprite.js";
|
|
24
24
|
export { MotelyVersionBadge, } from "./components/MotelyVersionBadge.js";
|
|
25
25
|
export { extractVisualJamlItems, } from "./utils/jamlMapPreview.js";
|
|
@@ -29,3 +29,4 @@ export { useAnalyzer, } from "./hooks/useAnalyzer.js";
|
|
|
29
29
|
export { JamlSpeedometer, } from "./components/JamlSpeedometer.js";
|
|
30
30
|
export { JamlAestheticSelector, } from "./components/JamlAestheticSelector.js";
|
|
31
31
|
export { JamlSeedInput, } from "./components/JamlSeedInput.js";
|
|
32
|
+
export { initJamlFileSystem } from "./utils/fileSystem.js";
|
package/dist/motely.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { decodeMotelyItem, decodeMotelyItemToJamlCard, motelyItemTypeName, motelyItemCategory, motelyItemDisplayName, motelyItemRenderCategory, motelyItemEditionName, motelyItemSealName, motelyItemEnhancementName,
|
|
1
|
+
export { decodeMotelyItem, decodeMotelyItemToJamlCard, motelyItemTypeName, motelyItemCategory, motelyItemDisplayName, motelyItemRenderCategory, motelyItemEditionName, motelyItemSealName, motelyItemEnhancementName, motelyStandardcardRankName, motelyStandardcardSuitName, decodeMotelyItemName, resolveMotelyItemType, warmMotelyItemCache, motelyItemCacheSize, type DecodedMotelyItem, type MotelyItemInput, type MotelyJamlCard, type MotelyRenderableCategory, type MotelyRuntimeItem, } from "./decode/motelyItemDecoder.js";
|
|
2
2
|
export { MOTELY_DISPLAY_SCHEMA, motelyBossDisplayName, motelyBossDisplayNameFromKey, motelyBossKeyFromDisplayName, motelyBoosterPackDisplayName, motelyBoosterPackDisplayNameFromKey, motelyBoosterPackKeyFromDisplayName, motelyItemDisplayNameFromKey, motelyItemDisplayNameFromValue, motelyTagDisplayName, motelyTagDisplayNameFromKey, motelyTagKeyFromDisplayName, motelyVoucherDisplayName, motelyVoucherDisplayNameFromKey, motelyVoucherKeyFromDisplayName, type MotelyBoosterPackKey, type MotelyBossKey, type MotelyDisplaySchema, type MotelyTagKey, type MotelyVoucherKey, } from "./motelyDisplay.js";
|
package/dist/motely.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { decodeMotelyItem, decodeMotelyItemToJamlCard, motelyItemTypeName, motelyItemCategory, motelyItemDisplayName, motelyItemRenderCategory, motelyItemEditionName, motelyItemSealName, motelyItemEnhancementName,
|
|
2
|
+
export { decodeMotelyItem, decodeMotelyItemToJamlCard, motelyItemTypeName, motelyItemCategory, motelyItemDisplayName, motelyItemRenderCategory, motelyItemEditionName, motelyItemSealName, motelyItemEnhancementName, motelyStandardcardRankName, motelyStandardcardSuitName, decodeMotelyItemName, resolveMotelyItemType, warmMotelyItemCache, motelyItemCacheSize, } from "./decode/motelyItemDecoder.js";
|
|
3
3
|
export { MOTELY_DISPLAY_SCHEMA, motelyBossDisplayName, motelyBossDisplayNameFromKey, motelyBossKeyFromDisplayName, motelyBoosterPackDisplayName, motelyBoosterPackDisplayNameFromKey, motelyBoosterPackKeyFromDisplayName, motelyItemDisplayNameFromKey, motelyItemDisplayNameFromValue, motelyTagDisplayName, motelyTagDisplayNameFromKey, motelyTagKeyFromDisplayName, motelyVoucherDisplayName, motelyVoucherDisplayNameFromKey, motelyVoucherKeyFromDisplayName, } from "./motelyDisplay.js";
|
package/dist/ui/jimboTabs.js
CHANGED
|
@@ -9,7 +9,7 @@ import { JimboText } from './jimboText.js';
|
|
|
9
9
|
* button and animates only on the active one.
|
|
10
10
|
*/
|
|
11
11
|
export function JimboTabs({ tabs, activeTab, onTabChange, className = '', style }) {
|
|
12
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: className, style: { display: 'flex', gap: 8, alignItems: 'flex-end', ...style }, children: tabs.map((tab) => (_jsx(TabButton, { label: tab.label, active: activeTab === tab.id, onClick: () => onTabChange(tab.id) }, tab.id))) }), _jsx("style", { children: JIMBO_BOUNCE_KEYFRAMES })] }));
|
|
12
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: className, style: { display: 'flex', gap: 8, alignItems: 'flex-end', flexWrap: 'wrap', ...style }, children: tabs.map((tab) => (_jsx(TabButton, { label: tab.label, active: activeTab === tab.id, onClick: () => onTabChange(tab.id) }, tab.id))) }), _jsx("style", { children: JIMBO_BOUNCE_KEYFRAMES })] }));
|
|
13
13
|
}
|
|
14
14
|
const JIMBO_BOUNCE_KEYFRAMES = `
|
|
15
15
|
@keyframes jimbo-bounce {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initJamlFileSystem(): boolean;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { init } from "@rewaffle/bootsharp-file-system";
|
|
2
|
+
// Assuming motely-wasm exposes Bootsharp APIs
|
|
3
|
+
// We need to pass the FileMounter export generated by Bootsharp
|
|
4
|
+
import * as motelyWasm from "motely-wasm";
|
|
5
|
+
export function initJamlFileSystem() {
|
|
6
|
+
if (motelyWasm && motelyWasm.Bootsharp && motelyWasm.Bootsharp.FileSystem) {
|
|
7
|
+
const fileMounter = motelyWasm.Bootsharp.FileSystem.FileMounter;
|
|
8
|
+
if (fileMounter) {
|
|
9
|
+
init(fileMounter);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
// Also try lowercase namespaces depending on how bootsharp generates it
|
|
14
|
+
if (motelyWasm && motelyWasm.bootsharp && motelyWasm.bootsharp.fileSystem) {
|
|
15
|
+
const fileMounter = motelyWasm.bootsharp.fileSystem.fileMounter;
|
|
16
|
+
if (fileMounter) {
|
|
17
|
+
init(fileMounter);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
console.warn("Could not initialize Jaml File System: Bootsharp.FileSystem.FileMounter not found in motely-wasm.");
|
|
22
|
+
return false;
|
|
23
|
+
}
|
package/dist/utils/itemUtils.js
CHANGED
|
@@ -17,7 +17,7 @@ export function getItemDisplayName(enumKey) {
|
|
|
17
17
|
};
|
|
18
18
|
if (specials[enumKey])
|
|
19
19
|
return specials[enumKey];
|
|
20
|
-
//
|
|
20
|
+
// Standard cards: C2 = 2 of Clubs, D10 = 10 of Diamonds, etc.
|
|
21
21
|
const suitMap = { C: "♣", D: "♦", H: "♥", S: "♠" };
|
|
22
22
|
const cardMatch = enumKey.match(/^([CDHS])([2-9JQKA]|10)$/);
|
|
23
23
|
if (cardMatch) {
|
|
@@ -52,7 +52,7 @@ export function getItemCategory(enumKey) {
|
|
|
52
52
|
return "planet";
|
|
53
53
|
if (SPECTRAL_NAMES.has(enumKey))
|
|
54
54
|
return "spectral";
|
|
55
|
-
// Everything else between the
|
|
55
|
+
// Everything else between the standard cards and Invalid is a joker
|
|
56
56
|
return "joker";
|
|
57
57
|
}
|
|
58
58
|
export const CATEGORY_COLORS = {
|
|
@@ -63,7 +63,7 @@ export const CATEGORY_COLORS = {
|
|
|
63
63
|
playing: { bg: "bg-neutral-100 dark:bg-neutral-800", border: "border-neutral-300 dark:border-neutral-600", text: "text-neutral-900 dark:text-neutral-100" },
|
|
64
64
|
unknown: { bg: "bg-neutral-900/30", border: "border-neutral-500/50", text: "text-neutral-300" },
|
|
65
65
|
};
|
|
66
|
-
/** Suit color for
|
|
66
|
+
/** Suit color for standard cards */
|
|
67
67
|
export function getSuitColor(enumKey) {
|
|
68
68
|
if (enumKey.startsWith("H") || enumKey.startsWith("D"))
|
|
69
69
|
return "text-red-500";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jaml-ui",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.1",
|
|
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",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"@react-spring/three": ">=9.0.0",
|
|
77
77
|
"@react-three/fiber": ">=8.0.0",
|
|
78
78
|
"monaco-editor": ">=0.50.0",
|
|
79
|
-
"motely-wasm": "^10.2.0 || ^11.0.0 || ^12.0.0 || ^13.0.0",
|
|
79
|
+
"motely-wasm": "^10.2.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
|
|
80
80
|
"react": "^18.2.0 || ^19.0.0",
|
|
81
81
|
"react-dom": "^18.2.0 || ^19.0.0",
|
|
82
82
|
"react-icons": ">=5.0.0",
|
|
@@ -108,7 +108,8 @@
|
|
|
108
108
|
"@types/three": "^0.184.0",
|
|
109
109
|
"@vitejs/plugin-react": "^5.0.4",
|
|
110
110
|
"monaco-editor": "^0.55.1",
|
|
111
|
-
"motely-wasm": "
|
|
111
|
+
"motely-wasm": "link:../JammySeedFinder/src/MotelyJAML/Motely.Wasm/bin/motely-wasm",
|
|
112
|
+
"@rewaffle/bootsharp-file-system": "link:D:/extra/bootsharp/dist/packages/file-system",
|
|
112
113
|
"react": "^19.2.4",
|
|
113
114
|
"react-dom": "^19.2.4",
|
|
114
115
|
"react-icons": "^5.6.0",
|