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.
Files changed (62) hide show
  1. package/dist/chunks/JimboWordmark-ByO9yaAi.js +284 -0
  2. package/dist/chunks/JimboWordmark-ByO9yaAi.js.map +1 -0
  3. package/dist/chunks/motelyItemDecoder-Cb-RjvQ0.js +692 -0
  4. package/dist/chunks/motelyItemDecoder-Cb-RjvQ0.js.map +1 -0
  5. package/dist/chunks/{spriteMapper-BiDkbZrD.js → spriteMapper-Dfr2_j0_.js} +55 -34
  6. package/dist/chunks/{spriteMapper-BiDkbZrD.js.map → spriteMapper-Dfr2_j0_.js.map} +1 -1
  7. package/dist/components/JamlCodeEditor.d.ts +8 -0
  8. package/dist/components/JamlIde.d.ts +44 -0
  9. package/dist/components/JamlIdeToolbar.d.ts +15 -0
  10. package/dist/components/JamlIdeVisual.d.ts +31 -0
  11. package/dist/components/JamlMapPreview.d.ts +12 -0
  12. package/dist/components/JamlSeedInput.d.ts +24 -0
  13. package/dist/components/JamlSeedSpinner.d.ts +10 -0
  14. package/dist/components/Jamlyzer.d.ts +8 -0
  15. package/dist/components/jamlMap/CategoryPicker.d.ts +33 -0
  16. package/dist/components/jamlMap/JamlMapEditor.d.ts +15 -0
  17. package/dist/components/jamlMap/JokerPicker.d.ts +9 -0
  18. package/dist/components/jamlMap/MysterySlot.d.ts +37 -0
  19. package/dist/components/jamlMap/index.d.ts +4 -0
  20. package/dist/components/jamlMap/jokerRarity.d.ts +6 -0
  21. package/dist/components/jamlSeedUtils.d.ts +1 -0
  22. package/dist/core.js +2 -2
  23. package/dist/index.d.ts +5 -1
  24. package/dist/index.js +21720 -3300
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/jaml/jamlLangCodemirror.d.ts +13 -0
  27. package/dist/lib/jaml/jamlSeeds.d.ts +7 -0
  28. package/dist/lib/motely/motelyCompatEnums.d.ts +310 -0
  29. package/dist/lib/motely/runtime.d.ts +1 -0
  30. package/dist/motely.js +44 -718
  31. package/dist/motely.js.map +1 -1
  32. package/dist/ui/JimboApp.d.ts +15 -0
  33. package/dist/ui/JimboBadge.d.ts +12 -0
  34. package/dist/ui/JimboIconButton.d.ts +15 -0
  35. package/dist/ui/JimboInlineEdit.d.ts +16 -0
  36. package/dist/ui/JimboInset.d.ts +4 -0
  37. package/dist/ui/JimboLayout.d.ts +26 -0
  38. package/dist/ui/JimboListItem.d.ts +5 -0
  39. package/dist/ui/JimboPanel.d.ts +10 -3
  40. package/dist/ui/JimboPicker.d.ts +19 -0
  41. package/dist/ui/JimboSectionHeader.d.ts +8 -0
  42. package/dist/ui/JimboSeedCopyChip.d.ts +16 -0
  43. package/dist/ui/JimboSpinner.d.ts +19 -0
  44. package/dist/ui/JimboSwipeDeck.d.ts +17 -0
  45. package/dist/ui/JimboTextInput.d.ts +5 -0
  46. package/dist/ui/JimboWordmark.d.ts +7 -0
  47. package/dist/ui/hooks.d.ts +126 -0
  48. package/dist/ui/jimbo.css +1 -1
  49. package/dist/ui/jimboFlankNav.d.ts +17 -0
  50. package/dist/ui/jimboTabs.d.ts +10 -0
  51. package/dist/ui/jimboText.d.ts +8 -0
  52. package/dist/ui/panel.d.ts +13 -0
  53. package/dist/ui/sprites.d.ts +10 -0
  54. package/dist/ui/tokens.d.ts +21 -8
  55. package/dist/ui.d.ts +5 -0
  56. package/dist/ui.js +12 -7
  57. package/dist/utils/jamlMapPreview.d.ts +12 -0
  58. package/dist/utils/jamlVisualFilter.d.ts +3 -0
  59. package/package.json +12 -4
  60. package/dist/.gitkeep +0 -0
  61. package/dist/chunks/JimboBackground-CB7u0r54.js +0 -214
  62. package/dist/chunks/JimboBackground-CB7u0r54.js.map +0 -1
@@ -1,13 +1,15 @@
1
1
  /**
2
- * Balatro design tokens — colors eyedropped from actual game pixels.
2
+ * Balatro design tokens — JS mirror of src/ui/jimbo-tokens.css :root.
3
+ *
4
+ * CSS custom properties (--j-*) are the source of truth for DOM.
5
+ * Keep every hex here in lockstep with jimbo-tokens.css.
3
6
  * Do NOT replace with Lua HEX values; the game's shader pipeline transforms them.
4
7
  *
5
- * IMPORTANT: For DOM components, use CSS custom properties (--j-red, etc.)
6
- * from jimbo.css. Only use these JS constants for contexts that cannot use
7
- * CSS — such as R3F/Canvas, inline SVG fills, or imperative animation APIs.
8
+ * Use these JS constants only where CSS vars cannot apply — Canvas, SVG fills,
9
+ * CodeMirror themes, or imperative animation APIs.
8
10
  */
9
11
  export declare const JimboColorOption: {
10
- readonly RED: "#ff4c40";
12
+ readonly RED: "#fe5148";
11
13
  readonly BLUE: "#0093ff";
12
14
  readonly GREEN: "#429f79";
13
15
  readonly ORANGE: "#ff9800";
@@ -20,8 +22,11 @@ export declare const JimboColorOption: {
20
22
  readonly DARK_PURPLE: "#5e437e";
21
23
  readonly DARK_GREY: "#3a5055";
22
24
  readonly DARKEST: "#1e2b2d";
23
- readonly GREY: "#708386";
25
+ readonly GREY: "#a8bcbf";
24
26
  readonly TEAL_GREY: "#404c4e";
27
+ readonly SURFACE: "#3a5055";
28
+ readonly SURFACE_INSET: "#2a3a3f";
29
+ readonly SURFACE_INSET_ALT: "#324347";
25
30
  readonly PANEL_EDGE: "#1e2e32";
26
31
  readonly INNER_BORDER: "#334461";
27
32
  readonly BORDER_SILVER: "#b9c2d2";
@@ -41,15 +46,23 @@ export declare const JimboColorOption: {
41
46
  export type JimboPaletteColor = keyof typeof JimboColorOption;
42
47
  /** Convert hex to rgba for inline styles in Canvas/SVG/R3F contexts. */
43
48
  export declare function withAlpha(hex: string, alpha: number): string;
49
+ /**
50
+ * Motion mirrors engine/moveable.lua juice_up defaults (amount 0.4, ~0.4s)
51
+ * and press lip on UI buttons — solid south edge, not soft elevation blur.
52
+ */
44
53
  export declare const JIMBO_ANIMATIONS: {
45
54
  readonly JUICE_UP_SCALE: 1.05;
46
55
  readonly JUICE_DOWN_SCALE: 1;
47
- readonly JUICE_DURATION: 150;
56
+ /** Lua juice_up end_time ≈ start + 0.4s */
57
+ readonly JUICE_DURATION: 400;
58
+ readonly JUICE_AMOUNT: 0.4;
48
59
  readonly JUICE_EASING: "cubic-bezier(0.34, 1.56, 0.64, 1)";
60
+ /** Lua zoom hover bonus */
61
+ readonly HOVER_SCALE: 1.05;
49
62
  readonly SWAY_AMOUNT: 1.5;
50
63
  readonly SWAY_DURATION: 4000;
51
64
  readonly PRESS_TRANSLATE_Y: 2;
52
- readonly PRESS_DURATION: 50;
65
+ readonly PRESS_DURATION: 55;
53
66
  readonly CARD_TILT_MAX: 6;
54
67
  readonly MENU_SINK_DURATION: 200;
55
68
  readonly MENU_RISE_DURATION: 300;
package/dist/ui.d.ts CHANGED
@@ -3,3 +3,8 @@ export { JimboButton, type JimboButtonProps } from './ui/JimboButton.js';
3
3
  export { JimboTextArea, type JimboTextAreaProps } from './ui/JimboTextArea.js';
4
4
  export { JimboPanel, type JimboPanelProps } from './ui/JimboPanel.js';
5
5
  export { JimboBackground } from './ui/JimboBackground.js';
6
+ export { JimboApp, type JimboAppProps, type JimboAppVariant } from './ui/JimboApp.js';
7
+ export { JimboInset, type JimboInsetProps } from './ui/JimboInset.js';
8
+ export { JimboWordmark, type JimboWordmarkProps } from './ui/JimboWordmark.js';
9
+ export { JimboSectionHeader, type JimboSectionHeaderProps, type JimboSectionTone, } from './ui/JimboSectionHeader.js';
10
+ export { JimboText, type JimboTextProps, type JimboTextSize, type JimboTextTone, } from './ui/jimboText.js';
package/dist/ui.js CHANGED
@@ -1,12 +1,17 @@
1
1
  "use client";
2
- import { J as i, a as s, b as e, c as t, d as J, e as b, w as m } from "./chunks/JimboBackground-CB7u0r54.js";
2
+ import { J as i, a as s, b as e, c as m, d as J, e as b, f as t, g as r, h as n, i as p, j as A, w as c } from "./chunks/JimboWordmark-ByO9yaAi.js";
3
3
  export {
4
4
  i as JIMBO_ANIMATIONS,
5
- s as JimboBackground,
6
- e as JimboButton,
7
- t as JimboColorOption,
8
- J as JimboPanel,
9
- b as JimboTextArea,
10
- m as withAlpha
5
+ s as JimboApp,
6
+ e as JimboBackground,
7
+ m as JimboButton,
8
+ J as JimboColorOption,
9
+ b as JimboInset,
10
+ t as JimboPanel,
11
+ r as JimboSectionHeader,
12
+ n as JimboText,
13
+ p as JimboTextArea,
14
+ A as JimboWordmark,
15
+ c as withAlpha
11
16
  };
12
17
  //# sourceMappingURL=ui.js.map
@@ -0,0 +1,12 @@
1
+ export type JamlPreviewSection = "must" | "should" | "mustNot";
2
+ export type JamlPreviewVisualType = "joker" | "consumable" | "voucher" | "tag" | "boss";
3
+ export interface JamlPreviewItem {
4
+ id: string;
5
+ section: JamlPreviewSection;
6
+ clauseKey: string;
7
+ visualType: JamlPreviewVisualType;
8
+ value: string;
9
+ source: string;
10
+ }
11
+ export type JamlPreviewGroups = Record<JamlPreviewSection, JamlPreviewItem[]>;
12
+ export declare function extractVisualJamlItems(jaml: string): JamlPreviewGroups;
@@ -0,0 +1,3 @@
1
+ import { JamlVisualFilter } from '../components/JamlIdeVisual.js';
2
+ export declare function jamlTextToVisualFilter(text: string): JamlVisualFilter;
3
+ export declare function visualFilterToJamlText(filter: JamlVisualFilter): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaml-ui",
3
- "version": "4.2.5",
3
+ "version": "4.2.8",
4
4
  "description": "Zero-dependency json-render engine + Balatro card sprites for MCP Apps.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -77,10 +77,11 @@
77
77
  "author": "pifreak",
78
78
  "license": "MIT",
79
79
  "dependencies": {
80
+ "react-icons": "^5.7.0",
80
81
  "yaml": "^2.9.0"
81
82
  },
82
83
  "peerDependencies": {
83
- "motely-wasm": "^24.1.0",
84
+ "motely-wasm": "^24.5.0",
84
85
  "react": "^18.2.0 || ^19.0.0",
85
86
  "react-dom": "^18.2.0 || ^19.0.0"
86
87
  },
@@ -98,8 +99,15 @@
98
99
  "eslint-plugin-react-refresh": "^0.5.3",
99
100
  "eslint-plugin-storybook": "10.4.6",
100
101
  "globals": "^17.7.0",
101
- "jaml-codemirror": "^0.2.1",
102
- "motely-wasm": "^24.1.0",
102
+ "jaml-lang": "^3.14.2",
103
+ "@codemirror/autocomplete": "^6.20.3",
104
+ "@codemirror/commands": "^6.10.4",
105
+ "@codemirror/language": "^6.12.4",
106
+ "@codemirror/lint": "^6.9.7",
107
+ "@codemirror/state": "^6.7.1",
108
+ "@codemirror/view": "^6.43.6",
109
+ "@lezer/highlight": "^1.2.3",
110
+ "motely-wasm": "^24.5.0",
103
111
  "react": "^19.2.7",
104
112
  "react-dom": "^19.2.7",
105
113
  "storybook": "^10.5.0",
package/dist/.gitkeep DELETED
File without changes
@@ -1,214 +0,0 @@
1
- import { jsx as _ } from "react/jsx-runtime";
2
- import { useRef as S, useEffect as O } from "react";
3
- const g = {
4
- RED: "#ff4c40",
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: "#708386",
18
- TEAL_GREY: "#404c4e",
19
- PANEL_EDGE: "#1e2e32",
20
- INNER_BORDER: "#334461",
21
- BORDER_SILVER: "#b9c2d2",
22
- BORDER_SOUTH: "#777e89",
23
- GOLD_TEXT: "#e4b643",
24
- GREEN_TEXT: "#35bd86",
25
- ORANGE_TEXT: "#ff8f00",
26
- WHITE: "#ffffff",
27
- BLACK: "#000000",
28
- TAROT_BUTTON: "#9e74ce",
29
- PLANET_BUTTON: "#00a7ca",
30
- SPECTRAL_BUTTON: "#2e76fd",
31
- TAROT_BUTTON_DARK: "#5e437e",
32
- PLANET_BUTTON_DARK: "#00657c",
33
- SPECTRAL_BUTTON_DARK: "#14449e"
34
- };
35
- function p(o, t) {
36
- const e = o.replace("#", ""), r = parseInt(e.slice(0, 2), 16), s = parseInt(e.slice(2, 4), 16), i = parseInt(e.slice(4, 6), 16);
37
- return `rgba(${r}, ${s}, ${i}, ${t})`;
38
- }
39
- const h = {
40
- JUICE_UP_SCALE: 1.05,
41
- JUICE_DOWN_SCALE: 1,
42
- JUICE_DURATION: 150,
43
- JUICE_EASING: "cubic-bezier(0.34, 1.56, 0.64, 1)",
44
- SWAY_AMOUNT: 1.5,
45
- SWAY_DURATION: 4e3,
46
- PRESS_TRANSLATE_Y: 2,
47
- PRESS_DURATION: 50,
48
- CARD_TILT_MAX: 6,
49
- MENU_SINK_DURATION: 200,
50
- MENU_RISE_DURATION: 300,
51
- MENU_ORBIT_DURATION: 320,
52
- LETTER_POP_RATE: 3,
53
- LETTER_BUMP_RATE: 2.666
54
- };
55
- function L({
56
- size: o = "md",
57
- tone: t = "orange",
58
- fullWidth: e = !1,
59
- label: r,
60
- className: s,
61
- children: i,
62
- disabled: c,
63
- ...l
64
- }) {
65
- const n = [
66
- "j-btn",
67
- `j-btn--${o}`,
68
- `j-btn--${t}`,
69
- e ? "j-btn--full" : "",
70
- c ? "j-btn--disabled" : "",
71
- s
72
- ].filter(Boolean).join(" ");
73
- return /* @__PURE__ */ _("button", { className: n, disabled: c, ...l, children: /* @__PURE__ */ _("span", { className: "j-btn__face", children: r ?? i }) });
74
- }
75
- function U({ className: o, style: t, ...e }) {
76
- const r = ["j-textarea", o].filter(Boolean).join(" ");
77
- return /* @__PURE__ */ _("textarea", { className: r, style: t, ...e });
78
- }
79
- function P({ className: o, children: t, ...e }) {
80
- const r = ["j-panel", o].filter(Boolean).join(" ");
81
- return /* @__PURE__ */ _("div", { className: r, ...e, children: t });
82
- }
83
- function b() {
84
- const o = S(null);
85
- return O(() => {
86
- const t = o.current;
87
- if (!t) return;
88
- const e = t.getContext("webgl");
89
- if (!e) return;
90
- const r = `
91
- attribute vec2 position;
92
- void main() {
93
- gl_Position = vec4(position, 0.0, 1.0);
94
- }
95
- `, s = `
96
- precision mediump float;
97
-
98
- uniform float u_time;
99
- uniform vec2 u_resolution;
100
-
101
- const float SPIN_ROTATION = -2.0;
102
- const float SPIN_SPEED = 4.5;
103
- const vec4 COLOUR_1 = vec4(1.0, 0.2, 0.2, 1.0);
104
- const vec4 COLOUR_2 = vec4(0.0, 0.5, 1.0, 1.0);
105
- const vec4 COLOUR_3 = vec4(0.05, 0.08, 0.1, 1.0);
106
- const float CONTRAST = 4.5;
107
- const float LIGTHING = 0.5;
108
- const float SPIN_AMOUNT = 0.35;
109
- const float PIXEL_FILTER = 1024.0;
110
- const float PI = 3.14159265359;
111
-
112
- void main() {
113
- vec2 screenSize = u_resolution;
114
- float pixel_size = length(screenSize.xy) / PIXEL_FILTER;
115
- vec2 uv = (floor(gl_FragCoord.xy*(1.0/pixel_size))*pixel_size - 0.5*screenSize.xy)/length(screenSize.xy);
116
- float uv_len = length(uv);
117
-
118
- float speed = (SPIN_ROTATION * 0.2) + 302.2;
119
- float new_pixel_angle = atan(uv.y, uv.x) + speed - 20.0*(1.0*SPIN_AMOUNT*uv_len + (1.0 - 1.0*SPIN_AMOUNT));
120
-
121
- vec2 mid = (screenSize.xy/length(screenSize.xy))/2.0;
122
- uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid);
123
-
124
- uv *= 30.0;
125
- speed = u_time * SPIN_SPEED;
126
- vec2 uv2 = vec2(uv.x, uv.y);
127
-
128
- for(int i=0; i < 5; i++) {
129
- uv2 += sin(max(uv.x, uv.y)) + uv;
130
- uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121), sin(uv2.x - 0.113*speed));
131
- uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y);
132
- }
133
-
134
- float contrast_mod = (0.25*CONTRAST + 0.5*SPIN_AMOUNT + 1.2);
135
- float paint_res = min(2.0, max(0.0, length(uv)*(0.035)*contrast_mod));
136
- float c1p = max(0.0, 1.0 - contrast_mod*abs(1.0 - paint_res));
137
- float c2p = max(0.0, 1.0 - contrast_mod*abs(paint_res));
138
- float c3p = 1.0 - min(1.0, c1p + c2p);
139
- float light = (LIGTHING - 0.2)*max(c1p*5.0 - 4.0, 0.0) + LIGTHING*max(c2p*5.0 - 4.0, 0.0);
140
-
141
- 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;
142
-
143
- gl_FragColor = finalCol;
144
- }
145
- `, i = (f, u) => {
146
- const a = e.createShader(f);
147
- return a ? (e.shaderSource(a, u), e.compileShader(a), e.getShaderParameter(a, e.COMPILE_STATUS) ? a : (console.error("[JimboBackground] shader compile error:", e.getShaderInfoLog(a)), e.deleteShader(a), null)) : null;
148
- }, c = i(e.VERTEX_SHADER, r), l = i(e.FRAGMENT_SHADER, s);
149
- if (!c || !l) return;
150
- const n = e.createProgram();
151
- if (!n) return;
152
- if (e.attachShader(n, c), e.attachShader(n, l), e.linkProgram(n), !e.getProgramParameter(n, e.LINK_STATUS)) {
153
- console.error("[JimboBackground] program link error:", e.getProgramInfoLog(n));
154
- return;
155
- }
156
- e.useProgram(n);
157
- const T = e.createBuffer();
158
- e.bindBuffer(e.ARRAY_BUFFER, T), e.bufferData(
159
- e.ARRAY_BUFFER,
160
- new Float32Array([
161
- -1,
162
- -1,
163
- 1,
164
- -1,
165
- -1,
166
- 1,
167
- -1,
168
- 1,
169
- 1,
170
- -1,
171
- 1,
172
- 1
173
- ]),
174
- e.STATIC_DRAW
175
- );
176
- const R = e.getAttribLocation(n, "position");
177
- e.enableVertexAttribArray(R), e.vertexAttribPointer(R, 2, e.FLOAT, !1, 0, 0);
178
- const d = e.getUniformLocation(n, "u_time"), m = e.getUniformLocation(n, "u_resolution"), N = Date.now();
179
- let A;
180
- const E = () => {
181
- const f = t.clientWidth, u = t.clientHeight;
182
- (t.width !== f || t.height !== u) && (t.width = f, t.height = u, e.viewport(0, 0, e.drawingBufferWidth, e.drawingBufferHeight));
183
- const a = (Date.now() - N) / 1e3;
184
- e.uniform1f(d, a), e.uniform2f(m, t.width, t.height), e.drawArrays(e.TRIANGLES, 0, 6), A = requestAnimationFrame(E);
185
- };
186
- return E(), () => {
187
- cancelAnimationFrame(A), e.deleteProgram(n), e.deleteShader(c), e.deleteShader(l), e.deleteBuffer(T);
188
- };
189
- }, []), /* @__PURE__ */ _(
190
- "canvas",
191
- {
192
- ref: o,
193
- "aria-hidden": !0,
194
- style: {
195
- position: "fixed",
196
- inset: 0,
197
- width: "100%",
198
- height: "100%",
199
- zIndex: -10,
200
- pointerEvents: "none"
201
- }
202
- }
203
- );
204
- }
205
- export {
206
- h as J,
207
- b as a,
208
- L as b,
209
- g as c,
210
- P as d,
211
- U as e,
212
- p as w
213
- };
214
- //# sourceMappingURL=JimboBackground-CB7u0r54.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"JimboBackground-CB7u0r54.js","sources":["../../src/ui/tokens.ts","../../src/ui/JimboButton.tsx","../../src/ui/JimboTextArea.tsx","../../src/ui/JimboPanel.tsx","../../src/ui/JimboBackground.tsx"],"sourcesContent":["/**\n * Balatro design tokens — colors eyedropped from actual game pixels.\n * Do NOT replace with Lua HEX values; the game's shader pipeline transforms them.\n *\n * IMPORTANT: For DOM components, use CSS custom properties (--j-red, etc.)\n * from jimbo.css. Only use these JS constants for contexts that cannot use\n * CSS — such as R3F/Canvas, inline SVG fills, or imperative animation APIs.\n */\n\nexport const JimboColorOption = {\n RED: '#ff4c40',\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: '#708386',\n TEAL_GREY: '#404c4e',\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\nexport const JIMBO_ANIMATIONS = {\n JUICE_UP_SCALE: 1.05,\n JUICE_DOWN_SCALE: 1.0,\n JUICE_DURATION: 150,\n JUICE_EASING: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n SWAY_AMOUNT: 1.5,\n SWAY_DURATION: 4000,\n PRESS_TRANSLATE_Y: 2,\n PRESS_DURATION: 50,\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\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 { 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 type { HTMLAttributes } from \"react\";\n\nexport type JimboPanelProps = HTMLAttributes<HTMLDivElement>;\n\nexport function JimboPanel({ className, children, ...rest }: JimboPanelProps) {\n const classes = [\"j-panel\", className].filter(Boolean).join(\" \");\n return (\n <div className={classes} {...rest}>\n {children}\n </div>\n );\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"],"names":["JimboColorOption","withAlpha","hex","alpha","clean","g","b","JIMBO_ANIMATIONS","JimboButton","size","tone","fullWidth","label","className","children","disabled","rest","classes","jsx","JimboTextArea","style","JimboPanel","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"],"mappings":"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"}