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.
@@ -4,71 +4,246 @@
4
4
  "spriteHeight": 190,
5
5
  "columns": 13,
6
6
  "rows": 4,
7
- "description": "Playing card face patterns to overlay on enhancement cards",
7
+ "description": "Standard card face patterns to overlay on enhancement cards",
8
8
  "layout": {
9
- "suits": ["Hearts", "Clubs", "Diamonds", "Spades"],
10
- "ranks": ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
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": { "x": 0, "y": 0 },
15
- "3": { "x": 1, "y": 0 },
16
- "4": { "x": 2, "y": 0 },
17
- "5": { "x": 3, "y": 0 },
18
- "6": { "x": 4, "y": 0 },
19
- "7": { "x": 5, "y": 0 },
20
- "8": { "x": 6, "y": 0 },
21
- "9": { "x": 7, "y": 0 },
22
- "10": { "x": 8, "y": 0 },
23
- "Jack": { "x": 9, "y": 0 },
24
- "Queen": { "x": 10, "y": 0 },
25
- "King": { "x": 11, "y": 0 },
26
- "Ace": { "x": 12, "y": 0 }
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": { "x": 0, "y": 1 },
30
- "3": { "x": 1, "y": 1 },
31
- "4": { "x": 2, "y": 1 },
32
- "5": { "x": 3, "y": 1 },
33
- "6": { "x": 4, "y": 1 },
34
- "7": { "x": 5, "y": 1 },
35
- "8": { "x": 6, "y": 1 },
36
- "9": { "x": 7, "y": 1 },
37
- "10": { "x": 8, "y": 1 },
38
- "Jack": { "x": 9, "y": 1 },
39
- "Queen": { "x": 10, "y": 1 },
40
- "King": { "x": 11, "y": 1 },
41
- "Ace": { "x": 12, "y": 1 }
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": { "x": 0, "y": 2 },
45
- "3": { "x": 1, "y": 2 },
46
- "4": { "x": 2, "y": 2 },
47
- "5": { "x": 3, "y": 2 },
48
- "6": { "x": 4, "y": 2 },
49
- "7": { "x": 5, "y": 2 },
50
- "8": { "x": 6, "y": 2 },
51
- "9": { "x": 7, "y": 2 },
52
- "10": { "x": 8, "y": 2 },
53
- "Jack": { "x": 9, "y": 2 },
54
- "Queen": { "x": 10, "y": 2 },
55
- "King": { "x": 11, "y": 2 },
56
- "Ace": { "x": 12, "y": 2 }
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": { "x": 0, "y": 3 },
60
- "3": { "x": 1, "y": 3 },
61
- "4": { "x": 2, "y": 3 },
62
- "5": { "x": 3, "y": 3 },
63
- "6": { "x": 4, "y": 3 },
64
- "7": { "x": 5, "y": 3 },
65
- "8": { "x": 6, "y": 3 },
66
- "9": { "x": 7, "y": 3 },
67
- "10": { "x": 8, "y": 3 },
68
- "Jack": { "x": 9, "y": 3 },
69
- "Queen": { "x": 10, "y": 3 },
70
- "King": { "x": 11, "y": 3 },
71
- "Ace": { "x": 12, "y": 3 }
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: "10px 16px 8px",
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: 12,
154
- marginBottom: 8,
154
+ gap: 8,
155
+ marginBottom: 4,
155
156
  },
156
157
  highlightTitle: {
157
- fontSize: 11,
158
+ fontSize: 12,
158
159
  color: "#6f6fa1",
159
160
  textTransform: "uppercase",
160
- letterSpacing: "0.08em",
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: 10,
169
+ gap: 6,
169
170
  overflowX: "auto",
170
- paddingBottom: 4,
171
+ paddingBottom: 2,
171
172
  scrollSnapType: "x mandatory",
172
173
  },
173
174
  highlightCard: {
174
- minWidth: 150,
175
- maxWidth: 150,
175
+ minWidth: 120,
176
+ maxWidth: 120,
176
177
  display: "flex",
177
178
  flexDirection: "column",
178
- gap: 6,
179
- padding: 8,
180
- borderRadius: 12,
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: 150,
188
- maxWidth: 150,
188
+ minWidth: 120,
189
+ maxWidth: 120,
189
190
  display: "flex",
190
191
  flexDirection: "column",
191
- gap: 6,
192
- padding: 8,
193
- borderRadius: 12,
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: 88,
204
+ minHeight: 80,
204
205
  },
205
206
  highlightMeta: {
206
207
  display: "flex",
207
208
  flexDirection: "column",
208
- gap: 3,
209
+ gap: 2,
209
210
  alignItems: "flex-start",
210
211
  },
211
212
  highlightAnte: {
212
- fontSize: 10,
213
+ fontSize: 11,
213
214
  color: "#a855f7",
214
- fontWeight: 700,
215
215
  textTransform: "uppercase",
216
- letterSpacing: "0.08em",
216
+ letterSpacing: "0.05em",
217
217
  },
218
218
  highlightLabel: {
219
- fontSize: 12,
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: 12,
236
- padding: "8px 16px",
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: 6,
242
+ borderRadius: 4,
244
243
  color: "#9898c0",
245
244
  fontSize: 14,
246
- padding: "4px 10px",
245
+ padding: "2px 8px",
247
246
  cursor: "pointer",
248
247
  },
249
248
  navLabel: {
250
- fontSize: 12,
251
- fontWeight: 700,
249
+ fontSize: 13,
252
250
  color: "#a855f7",
253
251
  textTransform: "uppercase",
254
- letterSpacing: "0.08em",
255
- minWidth: 130,
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: 16,
275
+ paddingBottom: 8,
279
276
  borderBottom: "1px solid #1a1a34",
280
277
  },
281
278
  anteSection: {
282
- paddingBottom: 8,
279
+ paddingBottom: 4,
283
280
  },
284
281
  anteHeader: {
285
282
  display: "flex",
286
283
  alignItems: "center",
287
- gap: 12,
288
- padding: "8px 16px",
284
+ gap: 8,
285
+ padding: "6px 8px",
289
286
  },
290
287
  anteHeading: {
291
- fontSize: 12,
292
- fontWeight: 700,
288
+ fontSize: 14,
293
289
  color: "#a855f7",
294
290
  textTransform: "uppercase",
295
- letterSpacing: "0.1em",
291
+ letterSpacing: "0.05em",
296
292
  },
297
293
  bossRow: {
298
294
  display: "flex",
299
295
  alignItems: "center",
300
- gap: 6,
296
+ gap: 4,
301
297
  },
302
298
  bossName: {
303
- fontSize: 13,
299
+ fontSize: 14,
304
300
  color: "#e84040",
305
- fontWeight: 600,
306
301
  },
307
302
  row: {
308
- padding: "4px 16px 8px",
303
+ padding: "2px 8px 4px",
309
304
  },
310
305
  rowLabel: {
311
- fontSize: 10,
306
+ fontSize: 11,
312
307
  color: "#5a5a88",
313
308
  textTransform: "uppercase",
314
- letterSpacing: "0.07em",
315
- marginBottom: 6,
309
+ letterSpacing: "0.05em",
310
+ marginBottom: 4,
316
311
  },
317
312
  cardFlow: {
318
313
  display: "flex",
319
314
  flexWrap: "wrap",
320
- gap: 8,
315
+ gap: 6,
321
316
  alignItems: "flex-start",
322
317
  },
323
318
  denseGrid: {
324
319
  display: "grid",
325
- gridTemplateColumns: "repeat(auto-fit, minmax(82px, 1fr))",
326
- gap: 8,
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: 4,
334
- minWidth: 62,
328
+ gap: 2,
329
+ minWidth: 50,
335
330
  },
336
331
  compactLabel: {
337
- padding: "2px 6px",
332
+ padding: "1px 4px",
338
333
  borderRadius: 999,
339
334
  background: "#18182e",
340
335
  color: "#7f7fa7",
341
336
  border: "1px solid #2a2a55",
342
- fontSize: 9,
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: 4,
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: 4,
352
+ gap: 2,
360
353
  width: "100%",
361
354
  minWidth: 0,
362
- padding: "4px 4px 6px",
363
- borderRadius: 10,
364
- border: "1px solid rgba(245,200,66,0.4)",
365
- background: "rgba(245,200,66,0.08)",
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: 10,
361
+ fontSize: 11,
369
362
  color: "#8e8eb6",
370
363
  textAlign: "center",
371
- lineHeight: 1.2,
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: 10,
371
+ fontSize: 11,
379
372
  color: "#d8d8ea",
380
373
  textAlign: "center",
381
- lineHeight: 1.2,
374
+ lineHeight: 1.1,
382
375
  },
383
376
  badgeRow: {
384
377
  display: "flex",
385
378
  flexWrap: "wrap",
386
- gap: 4,
379
+ gap: 2,
387
380
  justifyContent: "center",
388
381
  },
389
382
  badge: {
390
- padding: "2px 6px",
383
+ padding: "1px 4px",
391
384
  borderRadius: 999,
392
385
  background: "#202043",
393
386
  color: "#c7c7ef",
394
387
  border: "1px solid #35356d",
395
- fontSize: 9,
396
- fontWeight: 700,
388
+ fontSize: 11,
397
389
  textTransform: "uppercase",
398
- letterSpacing: "0.05em",
399
390
  },
400
391
  badgeAccent: {
401
- padding: "2px 6px",
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: 9,
407
- fontWeight: 700,
397
+ fontSize: 11,
408
398
  textTransform: "uppercase",
409
- letterSpacing: "0.05em",
410
399
  },
411
400
  badgeMuted: {
412
- padding: "2px 6px",
401
+ padding: "1px 4px",
413
402
  borderRadius: 999,
414
403
  background: "#18182e",
415
404
  color: "#7f7fa7",
416
405
  border: "1px solid #2a2a55",
417
- fontSize: 9,
418
- fontWeight: 700,
406
+ fontSize: 11,
419
407
  textTransform: "uppercase",
420
- letterSpacing: "0.05em",
421
408
  },
422
409
  packChip: {
423
- fontSize: 12,
410
+ fontSize: 13,
424
411
  color: "#5a5a88",
425
412
  background: "#131326",
426
413
  border: "1px solid #2a2a55",
427
- borderRadius: 6,
428
- padding: "4px 8px",
414
+ borderRadius: 4,
415
+ padding: "2px 6px",
429
416
  },
430
417
  factCard: {
431
418
  display: "flex",
432
419
  flexDirection: "column",
433
- gap: 2,
434
- minWidth: 110,
435
- padding: "8px 10px",
436
- borderRadius: 10,
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: 10,
428
+ fontSize: 11,
442
429
  color: "#7f7fa7",
443
430
  textTransform: "uppercase",
444
- letterSpacing: "0.07em",
445
431
  },
446
432
  factValue: {
447
- fontSize: 12,
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 { RealPlayingCard } from './PlayingCard.js';
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(RealPlayingCard, { rank: parsed.rank, suit: parsed.suit, size: cardSize, style: { filter: `drop-shadow(0 2px 3px ${JimboColorOption.BLACK}66)` } }) }, i));
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 parsePlayingCardName(name) {
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 playingCard = parsePlayingCardName(displayName) ?? parsePlayingCardName(baseName);
141
- if (playingCard) {
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: playingCard.rank,
148
- suit: playingCard.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 playingCard = parsePlayingCardName(displayName) ?? parsePlayingCardName(baseName);
186
- if (playingCard) {
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: playingCard.rank,
193
- suit: playingCard.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: 700,
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: 10, color: JimboColorOption.GREY, marginLeft: 2 }, children: isOpen ? "▲" : "▼" })) : null] }), isOpen && hasTally ? (_jsx("div", { style: {
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: 14, fontWeight: 800, 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] })] }));
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 = PlayingCard, 0x2000 = Spectral, 0x3000 = Tarot,
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 motelyPlayingCardSuitName(input: MotelyItemInput): "Clubs" | "Diamonds" | "Hearts" | "Spades" | null;
50
- export declare function motelyPlayingCardRankName(input: MotelyItemInput): string | null;
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 = PlayingCard, 0x2000 = Spectral, 0x3000 = Tarot,
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: "Playing Card",
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 parsePlayingCardEnumKey(enumKey) {
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 motelyPlayingCardSuitName(input) {
145
+ export function motelyStandardcardSuitName(input) {
146
146
  const runtimeItem = asRuntimeItem(input);
147
- const directSuit = runtimeEnumName(Motely.MotelyPlayingCardSuit, finiteNumber(runtimeItem?.suit));
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 = parsePlayingCardEnumKey(motelyItemTypeName(input));
151
+ const parsed = parseStandardcardEnumKey(motelyItemTypeName(input));
152
152
  return parsed?.suit ?? null;
153
153
  }
154
- export function motelyPlayingCardRankName(input) {
154
+ export function motelyStandardcardRankName(input) {
155
155
  const runtimeItem = asRuntimeItem(input);
156
- const directRank = runtimeEnumName(Motely.MotelyPlayingCardRank, finiteNumber(runtimeItem?.rank));
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 = parsePlayingCardEnumKey(motelyItemTypeName(input));
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 "Playing Card";
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 = motelyPlayingCardRankName(itemType);
210
- const suit = motelyPlayingCardSuitName(itemType);
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 declare const BalatroItemCategory: {
3
- readonly PlayingCard: 1;
3
+ readonly Standardcard: 1;
4
4
  readonly Spectral: 2;
5
5
  readonly Tarot: 3;
6
6
  readonly Planet: 4;
@@ -1,6 +1,6 @@
1
1
  /** Bit-packed shop/card ids (Balatro item encoding). */
2
2
  export const BalatroItemCategory = {
3
- PlayingCard: 1,
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.PlayingCard && category <= BalatroItemCategory.Joker;
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 { RealPlayingCard, type CardSuit, type CardRank, type CardEnhancement, type CardSeal, type CardEdition, } from "./components/PlayingCard.js";
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 { RealPlayingCard, } from "./components/PlayingCard.js";
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, motelyPlayingCardRankName, motelyPlayingCardSuitName, decodeMotelyItemName, resolveMotelyItemType, warmMotelyItemCache, motelyItemCacheSize, type DecodedMotelyItem, type MotelyItemInput, type MotelyJamlCard, type MotelyRenderableCategory, type MotelyRuntimeItem, } from "./decode/motelyItemDecoder.js";
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, motelyPlayingCardRankName, motelyPlayingCardSuitName, decodeMotelyItemName, resolveMotelyItemType, warmMotelyItemCache, motelyItemCacheSize, } from "./decode/motelyItemDecoder.js";
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";
@@ -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
+ }
@@ -7,5 +7,5 @@ export declare const CATEGORY_COLORS: Record<CardCategory, {
7
7
  border: string;
8
8
  text: string;
9
9
  }>;
10
- /** Suit color for playing cards */
10
+ /** Suit color for standard cards */
11
11
  export declare function getSuitColor(enumKey: string): string;
@@ -17,7 +17,7 @@ export function getItemDisplayName(enumKey) {
17
17
  };
18
18
  if (specials[enumKey])
19
19
  return specials[enumKey];
20
- // Playing cards: C2 = 2 of Clubs, D10 = 10 of Diamonds, etc.
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 playing cards and Invalid is a joker
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 playing cards */
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.0",
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": "^13.0.1",
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",