jaml-ui 4.2.5 → 4.2.8
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/dist/chunks/JimboWordmark-ByO9yaAi.js +284 -0
- package/dist/chunks/JimboWordmark-ByO9yaAi.js.map +1 -0
- package/dist/chunks/motelyItemDecoder-Cb-RjvQ0.js +692 -0
- package/dist/chunks/motelyItemDecoder-Cb-RjvQ0.js.map +1 -0
- package/dist/chunks/{spriteMapper-BiDkbZrD.js → spriteMapper-Dfr2_j0_.js} +55 -34
- package/dist/chunks/{spriteMapper-BiDkbZrD.js.map → spriteMapper-Dfr2_j0_.js.map} +1 -1
- package/dist/components/JamlCodeEditor.d.ts +8 -0
- package/dist/components/JamlIde.d.ts +44 -0
- package/dist/components/JamlIdeToolbar.d.ts +15 -0
- package/dist/components/JamlIdeVisual.d.ts +31 -0
- package/dist/components/JamlMapPreview.d.ts +12 -0
- package/dist/components/JamlSeedInput.d.ts +24 -0
- package/dist/components/JamlSeedSpinner.d.ts +10 -0
- package/dist/components/Jamlyzer.d.ts +8 -0
- package/dist/components/jamlMap/CategoryPicker.d.ts +33 -0
- package/dist/components/jamlMap/JamlMapEditor.d.ts +15 -0
- package/dist/components/jamlMap/JokerPicker.d.ts +9 -0
- package/dist/components/jamlMap/MysterySlot.d.ts +37 -0
- package/dist/components/jamlMap/index.d.ts +4 -0
- package/dist/components/jamlMap/jokerRarity.d.ts +6 -0
- package/dist/components/jamlSeedUtils.d.ts +1 -0
- package/dist/core.js +2 -2
- package/dist/index.d.ts +5 -1
- package/dist/index.js +21720 -3300
- package/dist/index.js.map +1 -1
- package/dist/lib/jaml/jamlLangCodemirror.d.ts +13 -0
- package/dist/lib/jaml/jamlSeeds.d.ts +7 -0
- package/dist/lib/motely/motelyCompatEnums.d.ts +310 -0
- package/dist/lib/motely/runtime.d.ts +1 -0
- package/dist/motely.js +44 -718
- package/dist/motely.js.map +1 -1
- package/dist/ui/JimboApp.d.ts +15 -0
- package/dist/ui/JimboBadge.d.ts +12 -0
- package/dist/ui/JimboIconButton.d.ts +15 -0
- package/dist/ui/JimboInlineEdit.d.ts +16 -0
- package/dist/ui/JimboInset.d.ts +4 -0
- package/dist/ui/JimboLayout.d.ts +26 -0
- package/dist/ui/JimboListItem.d.ts +5 -0
- package/dist/ui/JimboPanel.d.ts +10 -3
- package/dist/ui/JimboPicker.d.ts +19 -0
- package/dist/ui/JimboSectionHeader.d.ts +8 -0
- package/dist/ui/JimboSeedCopyChip.d.ts +16 -0
- package/dist/ui/JimboSpinner.d.ts +19 -0
- package/dist/ui/JimboSwipeDeck.d.ts +17 -0
- package/dist/ui/JimboTextInput.d.ts +5 -0
- package/dist/ui/JimboWordmark.d.ts +7 -0
- package/dist/ui/hooks.d.ts +126 -0
- package/dist/ui/jimbo.css +1 -1
- package/dist/ui/jimboFlankNav.d.ts +17 -0
- package/dist/ui/jimboTabs.d.ts +10 -0
- package/dist/ui/jimboText.d.ts +8 -0
- package/dist/ui/panel.d.ts +13 -0
- package/dist/ui/sprites.d.ts +10 -0
- package/dist/ui/tokens.d.ts +21 -8
- package/dist/ui.d.ts +5 -0
- package/dist/ui.js +12 -7
- package/dist/utils/jamlMapPreview.d.ts +12 -0
- package/dist/utils/jamlVisualFilter.d.ts +3 -0
- package/package.json +12 -4
- package/dist/.gitkeep +0 -0
- package/dist/chunks/JimboBackground-CB7u0r54.js +0 -214
- package/dist/chunks/JimboBackground-CB7u0r54.js.map +0 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { jsx as r, jsxs as f } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as S, useEffect as v } from "react";
|
|
3
|
+
const I = {
|
|
4
|
+
RED: "#fe5148",
|
|
5
|
+
BLUE: "#0093ff",
|
|
6
|
+
GREEN: "#429f79",
|
|
7
|
+
ORANGE: "#ff9800",
|
|
8
|
+
GOLD: "#e4b643",
|
|
9
|
+
PURPLE: "#9e74ce",
|
|
10
|
+
DARK_RED: "#a02721",
|
|
11
|
+
DARK_BLUE: "#0057a1",
|
|
12
|
+
DARK_ORANGE: "#a05b00",
|
|
13
|
+
DARK_GREEN: "#215f46",
|
|
14
|
+
DARK_PURPLE: "#5e437e",
|
|
15
|
+
DARK_GREY: "#3a5055",
|
|
16
|
+
DARKEST: "#1e2b2d",
|
|
17
|
+
GREY: "#a8bcbf",
|
|
18
|
+
TEAL_GREY: "#404c4e",
|
|
19
|
+
SURFACE: "#3a5055",
|
|
20
|
+
SURFACE_INSET: "#2a3a3f",
|
|
21
|
+
SURFACE_INSET_ALT: "#324347",
|
|
22
|
+
PANEL_EDGE: "#1e2e32",
|
|
23
|
+
INNER_BORDER: "#334461",
|
|
24
|
+
BORDER_SILVER: "#b9c2d2",
|
|
25
|
+
BORDER_SOUTH: "#777e89",
|
|
26
|
+
GOLD_TEXT: "#e4b643",
|
|
27
|
+
GREEN_TEXT: "#35bd86",
|
|
28
|
+
ORANGE_TEXT: "#ff8f00",
|
|
29
|
+
WHITE: "#ffffff",
|
|
30
|
+
BLACK: "#000000",
|
|
31
|
+
TAROT_BUTTON: "#9e74ce",
|
|
32
|
+
PLANET_BUTTON: "#00a7ca",
|
|
33
|
+
SPECTRAL_BUTTON: "#2e76fd",
|
|
34
|
+
TAROT_BUTTON_DARK: "#5e437e",
|
|
35
|
+
PLANET_BUTTON_DARK: "#00657c",
|
|
36
|
+
SPECTRAL_BUTTON_DARK: "#14449e"
|
|
37
|
+
};
|
|
38
|
+
function U(t, n) {
|
|
39
|
+
const e = t.replace("#", ""), a = parseInt(e.slice(0, 2), 16), o = parseInt(e.slice(2, 4), 16), s = parseInt(e.slice(4, 6), 16);
|
|
40
|
+
return `rgba(${a}, ${o}, ${s}, ${n})`;
|
|
41
|
+
}
|
|
42
|
+
const b = {
|
|
43
|
+
JUICE_UP_SCALE: 1.05,
|
|
44
|
+
JUICE_DOWN_SCALE: 1,
|
|
45
|
+
/** Lua juice_up end_time ≈ start + 0.4s */
|
|
46
|
+
JUICE_DURATION: 400,
|
|
47
|
+
JUICE_AMOUNT: 0.4,
|
|
48
|
+
JUICE_EASING: "cubic-bezier(0.34, 1.56, 0.64, 1)",
|
|
49
|
+
/** Lua zoom hover bonus */
|
|
50
|
+
HOVER_SCALE: 1.05,
|
|
51
|
+
SWAY_AMOUNT: 1.5,
|
|
52
|
+
SWAY_DURATION: 4e3,
|
|
53
|
+
PRESS_TRANSLATE_Y: 2,
|
|
54
|
+
PRESS_DURATION: 55,
|
|
55
|
+
CARD_TILT_MAX: 6,
|
|
56
|
+
MENU_SINK_DURATION: 200,
|
|
57
|
+
MENU_RISE_DURATION: 300,
|
|
58
|
+
MENU_ORBIT_DURATION: 320,
|
|
59
|
+
LETTER_POP_RATE: 3,
|
|
60
|
+
LETTER_BUMP_RATE: 2.666
|
|
61
|
+
};
|
|
62
|
+
function L({ size: t = "md", tone: n = "white", className: e, children: a, ...o }) {
|
|
63
|
+
const s = ["j-text", `j-text--${t}`, `j-text--${n}`, e].filter(Boolean).join(" ");
|
|
64
|
+
return /* @__PURE__ */ r("span", { className: s, ...o, children: a });
|
|
65
|
+
}
|
|
66
|
+
function x({
|
|
67
|
+
size: t = "md",
|
|
68
|
+
tone: n = "orange",
|
|
69
|
+
fullWidth: e = !1,
|
|
70
|
+
label: a,
|
|
71
|
+
className: o,
|
|
72
|
+
children: s,
|
|
73
|
+
disabled: c,
|
|
74
|
+
..._
|
|
75
|
+
}) {
|
|
76
|
+
const i = [
|
|
77
|
+
"j-btn",
|
|
78
|
+
`j-btn--${t}`,
|
|
79
|
+
`j-btn--${n}`,
|
|
80
|
+
e ? "j-btn--full" : "",
|
|
81
|
+
c ? "j-btn--disabled" : "",
|
|
82
|
+
o
|
|
83
|
+
].filter(Boolean).join(" ");
|
|
84
|
+
return /* @__PURE__ */ r("button", { className: i, disabled: c, ..._, children: /* @__PURE__ */ r("span", { className: "j-btn__face", children: a ?? s }) });
|
|
85
|
+
}
|
|
86
|
+
function h({
|
|
87
|
+
label: t,
|
|
88
|
+
tone: n = "blue",
|
|
89
|
+
className: e,
|
|
90
|
+
...a
|
|
91
|
+
}) {
|
|
92
|
+
const o = ["j-section-header", e].filter(Boolean).join(" ");
|
|
93
|
+
return /* @__PURE__ */ f("div", { className: o, ...a, children: [
|
|
94
|
+
/* @__PURE__ */ r("span", { className: `j-section-header__tag j-section-header__tag--${n}`, children: t }),
|
|
95
|
+
/* @__PURE__ */ r("span", { className: `j-section-header__rule j-section-header__rule--${n}`, "aria-hidden": !0 })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
function j({
|
|
99
|
+
title: t,
|
|
100
|
+
tone: n = "blue",
|
|
101
|
+
body: e,
|
|
102
|
+
className: a,
|
|
103
|
+
children: o,
|
|
104
|
+
...s
|
|
105
|
+
}) {
|
|
106
|
+
const c = ["j-panel", a].filter(Boolean).join(" "), _ = e ?? !!t;
|
|
107
|
+
return /* @__PURE__ */ f("div", { className: c, ...s, children: [
|
|
108
|
+
t != null && t !== !1 ? /* @__PURE__ */ r(h, { label: t, tone: n }) : null,
|
|
109
|
+
_ ? /* @__PURE__ */ r("div", { className: "j-panel__body", children: o }) : o
|
|
110
|
+
] });
|
|
111
|
+
}
|
|
112
|
+
function P({ className: t, style: n, ...e }) {
|
|
113
|
+
const a = ["j-textarea", t].filter(Boolean).join(" ");
|
|
114
|
+
return /* @__PURE__ */ r("textarea", { className: a, style: n, ...e });
|
|
115
|
+
}
|
|
116
|
+
function B() {
|
|
117
|
+
const t = S(null);
|
|
118
|
+
return v(() => {
|
|
119
|
+
const n = t.current;
|
|
120
|
+
if (!n) return;
|
|
121
|
+
const e = n.getContext("webgl");
|
|
122
|
+
if (!e) return;
|
|
123
|
+
const a = `
|
|
124
|
+
attribute vec2 position;
|
|
125
|
+
void main() {
|
|
126
|
+
gl_Position = vec4(position, 0.0, 1.0);
|
|
127
|
+
}
|
|
128
|
+
`, o = `
|
|
129
|
+
precision mediump float;
|
|
130
|
+
|
|
131
|
+
uniform float u_time;
|
|
132
|
+
uniform vec2 u_resolution;
|
|
133
|
+
|
|
134
|
+
const float SPIN_ROTATION = -2.0;
|
|
135
|
+
const float SPIN_SPEED = 4.5;
|
|
136
|
+
const vec4 COLOUR_1 = vec4(1.0, 0.2, 0.2, 1.0);
|
|
137
|
+
const vec4 COLOUR_2 = vec4(0.0, 0.5, 1.0, 1.0);
|
|
138
|
+
const vec4 COLOUR_3 = vec4(0.05, 0.08, 0.1, 1.0);
|
|
139
|
+
const float CONTRAST = 4.5;
|
|
140
|
+
const float LIGTHING = 0.5;
|
|
141
|
+
const float SPIN_AMOUNT = 0.35;
|
|
142
|
+
const float PIXEL_FILTER = 1024.0;
|
|
143
|
+
const float PI = 3.14159265359;
|
|
144
|
+
|
|
145
|
+
void main() {
|
|
146
|
+
vec2 screenSize = u_resolution;
|
|
147
|
+
float pixel_size = length(screenSize.xy) / PIXEL_FILTER;
|
|
148
|
+
vec2 uv = (floor(gl_FragCoord.xy*(1.0/pixel_size))*pixel_size - 0.5*screenSize.xy)/length(screenSize.xy);
|
|
149
|
+
float uv_len = length(uv);
|
|
150
|
+
|
|
151
|
+
float speed = (SPIN_ROTATION * 0.2) + 302.2;
|
|
152
|
+
float new_pixel_angle = atan(uv.y, uv.x) + speed - 20.0*(1.0*SPIN_AMOUNT*uv_len + (1.0 - 1.0*SPIN_AMOUNT));
|
|
153
|
+
|
|
154
|
+
vec2 mid = (screenSize.xy/length(screenSize.xy))/2.0;
|
|
155
|
+
uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid);
|
|
156
|
+
|
|
157
|
+
uv *= 30.0;
|
|
158
|
+
speed = u_time * SPIN_SPEED;
|
|
159
|
+
vec2 uv2 = vec2(uv.x, uv.y);
|
|
160
|
+
|
|
161
|
+
for(int i=0; i < 5; i++) {
|
|
162
|
+
uv2 += sin(max(uv.x, uv.y)) + uv;
|
|
163
|
+
uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121), sin(uv2.x - 0.113*speed));
|
|
164
|
+
uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
float contrast_mod = (0.25*CONTRAST + 0.5*SPIN_AMOUNT + 1.2);
|
|
168
|
+
float paint_res = min(2.0, max(0.0, length(uv)*(0.035)*contrast_mod));
|
|
169
|
+
float c1p = max(0.0, 1.0 - contrast_mod*abs(1.0 - paint_res));
|
|
170
|
+
float c2p = max(0.0, 1.0 - contrast_mod*abs(paint_res));
|
|
171
|
+
float c3p = 1.0 - min(1.0, c1p + c2p);
|
|
172
|
+
float light = (LIGTHING - 0.2)*max(c1p*5.0 - 4.0, 0.0) + LIGTHING*max(c2p*5.0 - 4.0, 0.0);
|
|
173
|
+
|
|
174
|
+
vec4 finalCol = (0.3/CONTRAST)*COLOUR_1 + (1.0 - 0.3/CONTRAST)*(COLOUR_1*c1p + COLOUR_2*c2p + vec4(c3p*COLOUR_3.rgb, c3p*COLOUR_1.a)) + light;
|
|
175
|
+
|
|
176
|
+
gl_FragColor = finalCol;
|
|
177
|
+
}
|
|
178
|
+
`, s = (u, d) => {
|
|
179
|
+
const l = e.createShader(u);
|
|
180
|
+
return l ? (e.shaderSource(l, d), e.compileShader(l), e.getShaderParameter(l, e.COMPILE_STATUS) ? l : (console.error("[JimboBackground] shader compile error:", e.getShaderInfoLog(l)), e.deleteShader(l), null)) : null;
|
|
181
|
+
}, c = s(e.VERTEX_SHADER, a), _ = s(e.FRAGMENT_SHADER, o);
|
|
182
|
+
if (!c || !_) return;
|
|
183
|
+
const i = e.createProgram();
|
|
184
|
+
if (!i) return;
|
|
185
|
+
if (e.attachShader(i, c), e.attachShader(i, _), e.linkProgram(i), !e.getProgramParameter(i, e.LINK_STATUS)) {
|
|
186
|
+
console.error("[JimboBackground] program link error:", e.getProgramInfoLog(i));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
e.useProgram(i);
|
|
190
|
+
const m = e.createBuffer();
|
|
191
|
+
e.bindBuffer(e.ARRAY_BUFFER, m), e.bufferData(
|
|
192
|
+
e.ARRAY_BUFFER,
|
|
193
|
+
new Float32Array([
|
|
194
|
+
-1,
|
|
195
|
+
-1,
|
|
196
|
+
1,
|
|
197
|
+
-1,
|
|
198
|
+
-1,
|
|
199
|
+
1,
|
|
200
|
+
-1,
|
|
201
|
+
1,
|
|
202
|
+
1,
|
|
203
|
+
-1,
|
|
204
|
+
1,
|
|
205
|
+
1
|
|
206
|
+
]),
|
|
207
|
+
e.STATIC_DRAW
|
|
208
|
+
);
|
|
209
|
+
const T = e.getAttribLocation(i, "position");
|
|
210
|
+
e.enableVertexAttribArray(T), e.vertexAttribPointer(T, 2, e.FLOAT, !1, 0, 0);
|
|
211
|
+
const A = e.getUniformLocation(i, "u_time"), N = e.getUniformLocation(i, "u_resolution"), p = Date.now();
|
|
212
|
+
let R;
|
|
213
|
+
const E = () => {
|
|
214
|
+
const u = n.clientWidth, d = n.clientHeight;
|
|
215
|
+
(n.width !== u || n.height !== d) && (n.width = u, n.height = d, e.viewport(0, 0, e.drawingBufferWidth, e.drawingBufferHeight));
|
|
216
|
+
const l = (Date.now() - p) / 1e3;
|
|
217
|
+
e.uniform1f(A, l), e.uniform2f(N, n.width, n.height), e.drawArrays(e.TRIANGLES, 0, 6), R = requestAnimationFrame(E);
|
|
218
|
+
};
|
|
219
|
+
return E(), () => {
|
|
220
|
+
cancelAnimationFrame(R), e.deleteProgram(i), e.deleteShader(c), e.deleteShader(_), e.deleteBuffer(m);
|
|
221
|
+
};
|
|
222
|
+
}, []), /* @__PURE__ */ r(
|
|
223
|
+
"canvas",
|
|
224
|
+
{
|
|
225
|
+
ref: t,
|
|
226
|
+
"aria-hidden": !0,
|
|
227
|
+
style: {
|
|
228
|
+
position: "fixed",
|
|
229
|
+
inset: 0,
|
|
230
|
+
width: "100%",
|
|
231
|
+
height: "100%",
|
|
232
|
+
zIndex: -10,
|
|
233
|
+
pointerEvents: "none"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
function C({
|
|
239
|
+
variant: t = "embed",
|
|
240
|
+
scroll: n = !0,
|
|
241
|
+
footer: e,
|
|
242
|
+
className: a,
|
|
243
|
+
children: o,
|
|
244
|
+
...s
|
|
245
|
+
}) {
|
|
246
|
+
if (t === "page") {
|
|
247
|
+
const i = ["j-page", a].filter(Boolean).join(" ");
|
|
248
|
+
return /* @__PURE__ */ f("div", { className: i, ...s, children: [
|
|
249
|
+
/* @__PURE__ */ r("div", { className: "j-page__main", children: o }),
|
|
250
|
+
e ? /* @__PURE__ */ r("div", { className: "j-page__footer", children: e }) : null
|
|
251
|
+
] });
|
|
252
|
+
}
|
|
253
|
+
const c = ["j-app", a].filter(Boolean).join(" ");
|
|
254
|
+
return /* @__PURE__ */ f("div", { className: c, ...s, children: [
|
|
255
|
+
/* @__PURE__ */ r("div", { className: n ? "j-app__scroll" : "j-app__content", children: o }),
|
|
256
|
+
e ? /* @__PURE__ */ r("div", { className: "j-app__footer", children: e }) : null
|
|
257
|
+
] });
|
|
258
|
+
}
|
|
259
|
+
function D({ className: t, children: n, ...e }) {
|
|
260
|
+
const a = ["j-inset", t].filter(Boolean).join(" ");
|
|
261
|
+
return /* @__PURE__ */ r("div", { className: a, ...e, children: n });
|
|
262
|
+
}
|
|
263
|
+
function y({ title: t, sub: n, className: e, ...a }) {
|
|
264
|
+
const o = ["j-wordmark", e].filter(Boolean).join(" ");
|
|
265
|
+
return /* @__PURE__ */ f("div", { className: o, ...a, children: [
|
|
266
|
+
/* @__PURE__ */ r("div", { className: "j-wordmark__title", children: t }),
|
|
267
|
+
n != null && n !== !1 ? /* @__PURE__ */ r("div", { className: "j-wordmark__sub", children: n }) : null
|
|
268
|
+
] });
|
|
269
|
+
}
|
|
270
|
+
export {
|
|
271
|
+
b as J,
|
|
272
|
+
C as a,
|
|
273
|
+
B as b,
|
|
274
|
+
x as c,
|
|
275
|
+
I as d,
|
|
276
|
+
D as e,
|
|
277
|
+
j as f,
|
|
278
|
+
h as g,
|
|
279
|
+
L as h,
|
|
280
|
+
P as i,
|
|
281
|
+
y as j,
|
|
282
|
+
U as w
|
|
283
|
+
};
|
|
284
|
+
//# sourceMappingURL=JimboWordmark-ByO9yaAi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JimboWordmark-ByO9yaAi.js","sources":["../../src/ui/tokens.ts","../../src/ui/jimboText.tsx","../../src/ui/JimboButton.tsx","../../src/ui/JimboSectionHeader.tsx","../../src/ui/JimboPanel.tsx","../../src/ui/JimboTextArea.tsx","../../src/ui/JimboBackground.tsx","../../src/ui/JimboApp.tsx","../../src/ui/JimboInset.tsx","../../src/ui/JimboWordmark.tsx"],"sourcesContent":["/**\n * Balatro design tokens — JS mirror of src/ui/jimbo-tokens.css :root.\n *\n * CSS custom properties (--j-*) are the source of truth for DOM.\n * Keep every hex here in lockstep with jimbo-tokens.css.\n * Do NOT replace with Lua HEX values; the game's shader pipeline transforms them.\n *\n * Use these JS constants only where CSS vars cannot apply — Canvas, SVG fills,\n * CodeMirror themes, or imperative animation APIs.\n */\n\nexport const JimboColorOption = {\n RED: '#fe5148',\n BLUE: '#0093ff',\n GREEN: '#429f79',\n ORANGE: '#ff9800',\n GOLD: '#e4b643',\n PURPLE: '#9e74ce',\n\n DARK_RED: '#a02721',\n DARK_BLUE: '#0057a1',\n DARK_ORANGE: '#a05b00',\n DARK_GREEN: '#215f46',\n DARK_PURPLE: '#5e437e',\n\n DARK_GREY: '#3a5055',\n DARKEST: '#1e2b2d',\n GREY: '#a8bcbf',\n TEAL_GREY: '#404c4e',\n SURFACE: '#3a5055',\n SURFACE_INSET: '#2a3a3f',\n SURFACE_INSET_ALT: '#324347',\n\n PANEL_EDGE: '#1e2e32',\n INNER_BORDER: '#334461',\n\n BORDER_SILVER: '#b9c2d2',\n BORDER_SOUTH: '#777e89',\n\n GOLD_TEXT: '#e4b643',\n GREEN_TEXT: '#35bd86',\n ORANGE_TEXT: '#ff8f00',\n WHITE: '#ffffff',\n BLACK: '#000000',\n\n TAROT_BUTTON: '#9e74ce',\n PLANET_BUTTON: '#00a7ca',\n SPECTRAL_BUTTON: '#2e76fd',\n TAROT_BUTTON_DARK: '#5e437e',\n PLANET_BUTTON_DARK: '#00657c',\n SPECTRAL_BUTTON_DARK: '#14449e',\n} as const\n\nexport type JimboPaletteColor = keyof typeof JimboColorOption\n\n/** Convert hex to rgba for inline styles in Canvas/SVG/R3F contexts. */\nexport function withAlpha(hex: string, alpha: number): string {\n const clean = hex.replace('#', '')\n const r = parseInt(clean.slice(0, 2), 16)\n const g = parseInt(clean.slice(2, 4), 16)\n const b = parseInt(clean.slice(4, 6), 16)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n/**\n * Motion mirrors engine/moveable.lua juice_up defaults (amount 0.4, ~0.4s)\n * and press lip on UI buttons — solid south edge, not soft elevation blur.\n */\nexport const JIMBO_ANIMATIONS = {\n JUICE_UP_SCALE: 1.05,\n JUICE_DOWN_SCALE: 1.0,\n /** Lua juice_up end_time ≈ start + 0.4s */\n JUICE_DURATION: 400,\n JUICE_AMOUNT: 0.4,\n JUICE_EASING: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n /** Lua zoom hover bonus */\n HOVER_SCALE: 1.05,\n SWAY_AMOUNT: 1.5,\n SWAY_DURATION: 4000,\n PRESS_TRANSLATE_Y: 2,\n PRESS_DURATION: 55,\n CARD_TILT_MAX: 6,\n MENU_SINK_DURATION: 200,\n MENU_RISE_DURATION: 300,\n MENU_ORBIT_DURATION: 320,\n LETTER_POP_RATE: 3,\n LETTER_BUMP_RATE: 2.666,\n} as const\n","\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nexport type JimboTextSize = \"micro\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"display\";\nexport type JimboTextTone = \"white\" | \"grey\" | \"gold\" | \"red\" | \"blue\" | \"green\" | \"orange\" | \"purple\";\n\nexport interface JimboTextProps extends HTMLAttributes<HTMLSpanElement> {\n size?: JimboTextSize;\n tone?: JimboTextTone;\n}\n\nexport function JimboText({ size = \"md\", tone = \"white\", className, children, ...rest }: JimboTextProps) {\n const classes = [\"j-text\", `j-text--${size}`, `j-text--${tone}`, className].filter(Boolean).join(\" \");\n return (\n <span className={classes} {...rest}>\n {children}\n </span>\n );\n}\n","\"use client\";\n\nimport type { ButtonHTMLAttributes } from \"react\";\n\nexport interface JimboButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n tone?: \"orange\" | \"red\" | \"blue\" | \"green\" | \"grey\";\n fullWidth?: boolean;\n label?: string;\n}\n\nexport function JimboButton({\n size = \"md\",\n tone = \"orange\",\n fullWidth = false,\n label,\n className,\n children,\n disabled,\n ...rest\n}: JimboButtonProps) {\n const classes = [\n \"j-btn\",\n `j-btn--${size}`,\n `j-btn--${tone}`,\n fullWidth ? \"j-btn--full\" : \"\",\n disabled ? \"j-btn--disabled\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <button className={classes} disabled={disabled} {...rest}>\n <span className=\"j-btn__face\">{label ?? children}</span>\n </button>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\n\nexport type JimboSectionTone = \"red\" | \"orange\" | \"blue\" | \"green\" | \"purple\" | \"gold\" | \"grey\";\n\nexport interface JimboSectionHeaderProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n tone?: JimboSectionTone;\n}\n\n/** Colored tag + rule — section divider inside a panel. */\nexport function JimboSectionHeader({\n label,\n tone = \"blue\",\n className,\n ...rest\n}: JimboSectionHeaderProps) {\n const classes = [\"j-section-header\", className].filter(Boolean).join(\" \");\n return (\n <div className={classes} {...rest}>\n <span className={`j-section-header__tag j-section-header__tag--${tone}`}>{label}</span>\n <span className={`j-section-header__rule j-section-header__rule--${tone}`} aria-hidden />\n </div>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { JimboSectionHeader, type JimboSectionTone } from \"./JimboSectionHeader.js\";\n\nexport interface JimboPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Optional section tag at the top of the panel */\n title?: ReactNode;\n tone?: JimboSectionTone;\n /** Wrap children in .j-panel__body (default true when title set, else false for flex freestyle) */\n body?: boolean;\n}\n\nexport function JimboPanel({\n title,\n tone = \"blue\",\n body,\n className,\n children,\n ...rest\n}: JimboPanelProps) {\n const classes = [\"j-panel\", className].filter(Boolean).join(\" \");\n const wrapBody = body ?? Boolean(title);\n return (\n <div className={classes} {...rest}>\n {title != null && title !== false ? <JimboSectionHeader label={title} tone={tone} /> : null}\n {wrapBody ? <div className=\"j-panel__body\">{children}</div> : children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { TextareaHTMLAttributes } from \"react\";\n\nexport type JimboTextAreaProps = TextareaHTMLAttributes<HTMLTextAreaElement>;\n\nexport function JimboTextArea({ className, style, ...rest }: JimboTextAreaProps) {\n const classes = [\"j-textarea\", className].filter(Boolean).join(\" \");\n return <textarea className={classes} style={style} {...rest} />;\n}\n","'use client'\n\nimport React, { useEffect, useRef } from 'react'\n\n/**\n * Fullscreen WebGL CRT/spin background — the authentic Balatro hypnotic\n * swirl, pixelated and animated. Ported from weejoker.app's\n * BackgroundShader.tsx; no config required.\n *\n * Renders a fixed-position canvas at z-index: -10 that fills the viewport\n * and ignores pointer events. Drop it once at the root of your page:\n *\n * <JimboBackground />\n * <YourAppContent />\n *\n * Resizes automatically. Disposes the animation frame + shader on unmount.\n */\nexport function JimboBackground() {\n const canvasRef = useRef<HTMLCanvasElement>(null)\n\n useEffect(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n const gl = canvas.getContext('webgl')\n if (!gl) return\n\n const vsSource = `\n attribute vec2 position;\n void main() {\n gl_Position = vec4(position, 0.0, 1.0);\n }\n `\n\n const fsSource = `\n precision mediump float;\n\n uniform float u_time;\n uniform vec2 u_resolution;\n\n const float SPIN_ROTATION = -2.0;\n const float SPIN_SPEED = 4.5;\n const vec4 COLOUR_1 = vec4(1.0, 0.2, 0.2, 1.0);\n const vec4 COLOUR_2 = vec4(0.0, 0.5, 1.0, 1.0);\n const vec4 COLOUR_3 = vec4(0.05, 0.08, 0.1, 1.0);\n const float CONTRAST = 4.5;\n const float LIGTHING = 0.5;\n const float SPIN_AMOUNT = 0.35;\n const float PIXEL_FILTER = 1024.0;\n const float PI = 3.14159265359;\n\n void main() {\n vec2 screenSize = u_resolution;\n float pixel_size = length(screenSize.xy) / PIXEL_FILTER;\n vec2 uv = (floor(gl_FragCoord.xy*(1.0/pixel_size))*pixel_size - 0.5*screenSize.xy)/length(screenSize.xy);\n float uv_len = length(uv);\n\n float speed = (SPIN_ROTATION * 0.2) + 302.2;\n float new_pixel_angle = atan(uv.y, uv.x) + speed - 20.0*(1.0*SPIN_AMOUNT*uv_len + (1.0 - 1.0*SPIN_AMOUNT));\n\n vec2 mid = (screenSize.xy/length(screenSize.xy))/2.0;\n uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid);\n\n uv *= 30.0;\n speed = u_time * SPIN_SPEED;\n vec2 uv2 = vec2(uv.x, uv.y);\n\n for(int i=0; i < 5; i++) {\n uv2 += sin(max(uv.x, uv.y)) + uv;\n uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121), sin(uv2.x - 0.113*speed));\n uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y);\n }\n\n float contrast_mod = (0.25*CONTRAST + 0.5*SPIN_AMOUNT + 1.2);\n float paint_res = min(2.0, max(0.0, length(uv)*(0.035)*contrast_mod));\n float c1p = max(0.0, 1.0 - contrast_mod*abs(1.0 - paint_res));\n float c2p = max(0.0, 1.0 - contrast_mod*abs(paint_res));\n float c3p = 1.0 - min(1.0, c1p + c2p);\n float light = (LIGTHING - 0.2)*max(c1p*5.0 - 4.0, 0.0) + LIGTHING*max(c2p*5.0 - 4.0, 0.0);\n\n vec4 finalCol = (0.3/CONTRAST)*COLOUR_1 + (1.0 - 0.3/CONTRAST)*(COLOUR_1*c1p + COLOUR_2*c2p + vec4(c3p*COLOUR_3.rgb, c3p*COLOUR_1.a)) + light;\n\n gl_FragColor = finalCol;\n }\n `\n\n const createShader = (type: number, source: string) => {\n const shader = gl.createShader(type)\n if (!shader) return null\n gl.shaderSource(shader, source)\n gl.compileShader(shader)\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error('[JimboBackground] shader compile error:', gl.getShaderInfoLog(shader))\n gl.deleteShader(shader)\n return null\n }\n return shader\n }\n\n const vertexShader = createShader(gl.VERTEX_SHADER, vsSource)\n const fragmentShader = createShader(gl.FRAGMENT_SHADER, fsSource)\n if (!vertexShader || !fragmentShader) return\n\n const program = gl.createProgram()\n if (!program) return\n gl.attachShader(program, vertexShader)\n gl.attachShader(program, fragmentShader)\n gl.linkProgram(program)\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error('[JimboBackground] program link error:', gl.getProgramInfoLog(program))\n return\n }\n\n gl.useProgram(program)\n\n const positionBuffer = gl.createBuffer()\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer)\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([\n -1.0, -1.0, 1.0, -1.0, -1.0, 1.0,\n -1.0, 1.0, 1.0, -1.0, 1.0, 1.0,\n ]),\n gl.STATIC_DRAW,\n )\n\n const positionLocation = gl.getAttribLocation(program, 'position')\n gl.enableVertexAttribArray(positionLocation)\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0)\n\n const timeLocation = gl.getUniformLocation(program, 'u_time')\n const resolutionLocation = gl.getUniformLocation(program, 'u_resolution')\n\n const startTime = Date.now()\n let animationFrameId: number\n\n const render = () => {\n const displayWidth = canvas.clientWidth\n const displayHeight = canvas.clientHeight\n if (canvas.width !== displayWidth || canvas.height !== displayHeight) {\n canvas.width = displayWidth\n canvas.height = displayHeight\n gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight)\n }\n\n const currentTime = (Date.now() - startTime) / 1000.0\n gl.uniform1f(timeLocation, currentTime)\n gl.uniform2f(resolutionLocation, canvas.width, canvas.height)\n\n gl.drawArrays(gl.TRIANGLES, 0, 6)\n animationFrameId = requestAnimationFrame(render)\n }\n\n render()\n\n return () => {\n cancelAnimationFrame(animationFrameId)\n gl.deleteProgram(program)\n gl.deleteShader(vertexShader)\n gl.deleteShader(fragmentShader)\n gl.deleteBuffer(positionBuffer)\n }\n }, [])\n\n return (\n <canvas\n ref={canvasRef}\n aria-hidden\n style={{\n position: 'fixed',\n inset: 0,\n width: '100%',\n height: '100%',\n zIndex: -10,\n pointerEvents: 'none',\n }}\n />\n )\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\n\nexport type JimboAppVariant = \"embed\" | \"page\";\n\nexport interface JimboAppProps extends HTMLAttributes<HTMLDivElement> {\n /** embed = fixed 320×540 MCP shell; page = fluid full-viewport web shell */\n variant?: JimboAppVariant;\n /** Main column. For embed, scrolls inside the fixed frame when scroll is true. */\n scroll?: boolean;\n footer?: ReactNode;\n}\n\n/**\n * App chrome. Embed = Balatro-toy / MCP rectangle. Page = fan-site / seedfinder shell.\n * Both set the Jimbo font stack and color; neither paints a second background\n * (use JimboBackground behind).\n */\nexport function JimboApp({\n variant = \"embed\",\n scroll = true,\n footer,\n className,\n children,\n ...rest\n}: JimboAppProps) {\n if (variant === \"page\") {\n const classes = [\"j-page\", className].filter(Boolean).join(\" \");\n return (\n <div className={classes} {...rest}>\n <div className=\"j-page__main\">{children}</div>\n {footer ? <div className=\"j-page__footer\">{footer}</div> : null}\n </div>\n );\n }\n\n const classes = [\"j-app\", className].filter(Boolean).join(\" \");\n const bodyClass = scroll ? \"j-app__scroll\" : \"j-app__content\";\n return (\n <div className={classes} {...rest}>\n <div className={bodyClass}>{children}</div>\n {footer ? <div className=\"j-app__footer\">{footer}</div> : null}\n </div>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\n\nexport type JimboInsetProps = HTMLAttributes<HTMLDivElement>;\n\n/** Sunken well for code rows, logs, recent finds — not a second modal frame. */\nexport function JimboInset({ className, children, ...rest }: JimboInsetProps) {\n const classes = [\"j-inset\", className].filter(Boolean).join(\" \");\n return (\n <div className={classes} {...rest}>\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\n\nexport interface JimboWordmarkProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n sub?: ReactNode;\n}\n\n/** Hero title + optional subtitle — gold wordmark, grey sub. */\nexport function JimboWordmark({ title, sub, className, ...rest }: JimboWordmarkProps) {\n const classes = [\"j-wordmark\", className].filter(Boolean).join(\" \");\n return (\n <div className={classes} {...rest}>\n <div className=\"j-wordmark__title\">{title}</div>\n {sub != null && sub !== false ? <div className=\"j-wordmark__sub\">{sub}</div> : null}\n </div>\n );\n}\n"],"names":["JimboColorOption","withAlpha","hex","alpha","clean","r","g","b","JIMBO_ANIMATIONS","JimboText","size","tone","className","children","rest","classes","JimboButton","fullWidth","label","disabled","jsx","JimboSectionHeader","jsxs","JimboPanel","title","body","wrapBody","JimboTextArea","style","JimboBackground","canvasRef","useRef","useEffect","canvas","gl","vsSource","fsSource","createShader","type","source","shader","vertexShader","fragmentShader","program","positionBuffer","positionLocation","timeLocation","resolutionLocation","startTime","animationFrameId","render","displayWidth","displayHeight","currentTime","JimboApp","variant","scroll","footer","JimboInset","JimboWordmark","sub"],"mappings":"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"}
|