jaml-ui 4.2.6 → 4.2.9

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 (64) hide show
  1. package/dist/chunks/JimboMascot-DJAe76lw.js +771 -0
  2. package/dist/chunks/JimboMascot-DJAe76lw.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 +1 -2
  8. package/dist/components/JamlSeedInput.d.ts +24 -0
  9. package/dist/components/JamlSeedSpinner.d.ts +10 -0
  10. package/dist/components/JamlyzerBulk.d.ts +6 -2
  11. package/dist/components/jamlyzer/JamlyzerAnteDetails.d.ts +14 -0
  12. package/dist/components/jamlyzer/JamlyzerErraticDeck.d.ts +8 -0
  13. package/dist/components/jamlyzer/JamlyzerEvents.d.ts +6 -0
  14. package/dist/components/jamlyzer/JamlyzerItemCard.d.ts +9 -0
  15. package/dist/components/jamlyzer/JamlyzerPackSection.d.ts +9 -0
  16. package/dist/components/jamlyzer/JamlyzerPulls.d.ts +8 -0
  17. package/dist/components/jamlyzer/JamlyzerRail.d.ts +14 -0
  18. package/dist/components/jamlyzer/highlight.d.ts +5 -0
  19. package/dist/components/jamlyzer/names.d.ts +8 -0
  20. package/dist/core.js +2 -2
  21. package/dist/index.d.ts +5 -1
  22. package/dist/index.js +21490 -3766
  23. package/dist/index.js.map +1 -1
  24. package/dist/json-render/components/domain.d.ts +3 -2
  25. package/dist/json-render/components/layout.d.ts +2 -6
  26. package/dist/json-render/components/mascot.d.ts +10 -9
  27. package/dist/json-render/components/reference.d.ts +3 -2
  28. package/dist/lib/jaml/jamlLangCodemirror.d.ts +13 -0
  29. package/dist/lib/jaml/jamlSeeds.d.ts +7 -0
  30. package/dist/lib/motely/jamlParse.d.ts +4 -0
  31. package/dist/lib/motely/runtime.d.ts +1 -0
  32. package/dist/motely.js +44 -717
  33. package/dist/motely.js.map +1 -1
  34. package/dist/ui/JimboApp.d.ts +15 -0
  35. package/dist/ui/JimboBadge.d.ts +12 -0
  36. package/dist/ui/JimboButton.d.ts +1 -1
  37. package/dist/ui/JimboCodeSurface.d.ts +12 -0
  38. package/dist/ui/JimboDivider.d.ts +7 -0
  39. package/dist/ui/JimboErrorBlock.d.ts +8 -0
  40. package/dist/ui/JimboGrid.d.ts +14 -0
  41. package/dist/ui/JimboInset.d.ts +4 -0
  42. package/dist/ui/JimboLayout.d.ts +26 -0
  43. package/dist/ui/JimboMascot.d.ts +12 -0
  44. package/dist/ui/JimboOrbitalMenu.d.ts +15 -0
  45. package/dist/ui/JimboPanel.d.ts +10 -3
  46. package/dist/ui/JimboSectionHeader.d.ts +8 -0
  47. package/dist/ui/JimboSeedCopyChip.d.ts +16 -0
  48. package/dist/ui/JimboSpacer.d.ts +7 -0
  49. package/dist/ui/JimboSpinner.d.ts +19 -0
  50. package/dist/ui/JimboStatusPill.d.ts +8 -0
  51. package/dist/ui/JimboSwipeDeck.d.ts +17 -0
  52. package/dist/ui/JimboTextInput.d.ts +5 -3
  53. package/dist/ui/JimboWordmark.d.ts +7 -0
  54. package/dist/ui/jimbo.css +1 -1
  55. package/dist/ui/jimboFlankNav.d.ts +17 -0
  56. package/dist/ui/jimboTabs.d.ts +5 -0
  57. package/dist/ui/tokens.d.ts +20 -9
  58. package/dist/ui.d.ts +19 -0
  59. package/dist/ui.js +28 -7
  60. package/package.json +18 -11
  61. package/dist/.gitkeep +0 -0
  62. package/dist/chunks/JimboBackground-CB7u0r54.js +0 -214
  63. package/dist/chunks/JimboBackground-CB7u0r54.js.map +0 -1
  64. /package/dist/{json-render/components → ui}/jammySeedMascotImage.d.ts +0 -0
package/dist/ui.js CHANGED
@@ -1,12 +1,33 @@
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 m, c as b, d as J, e, f as t, g as r, h as n, i as l, j as p, k as c, l as d, m as u, n as I, o as S, p as A, q as B, r as k, s as x, t as M, u as h, v as O, w as T, x as g, y as w, z as C, A as P } from "./chunks/JimboMascot-DJAe76lw.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
+ m as JimboBackground,
7
+ b as JimboBadge,
8
+ J as JimboButton,
9
+ e as JimboColorOption,
10
+ t as JimboDivider,
11
+ r as JimboErrorBlock,
12
+ n as JimboGrid,
13
+ l as JimboIconButton,
14
+ p as JimboInnerPanel,
15
+ c as JimboInset,
16
+ d as JimboMascot,
17
+ u as JimboModal,
18
+ I as JimboOrbitalMenu,
19
+ S as JimboPanel,
20
+ A as JimboRow,
21
+ B as JimboSectionHeader,
22
+ k as JimboSeedCopyChip,
23
+ x as JimboSpacer,
24
+ M as JimboSpinner,
25
+ h as JimboStack,
26
+ O as JimboStatusPill,
27
+ T as JimboText,
28
+ g as JimboTextArea,
29
+ w as JimboTextInput,
30
+ C as JimboWordmark,
31
+ P as withAlpha
11
32
  };
12
33
  //# sourceMappingURL=ui.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaml-ui",
3
- "version": "4.2.6",
3
+ "version": "4.2.9",
4
4
  "description": "Zero-dependency json-render engine + Balatro card sprites for MCP Apps.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -81,15 +81,22 @@
81
81
  "yaml": "^2.9.0"
82
82
  },
83
83
  "peerDependencies": {
84
- "motely-wasm": "^24.1.0",
84
+ "motely-wasm": "^24.5.0",
85
85
  "react": "^18.2.0 || ^19.0.0",
86
86
  "react-dom": "^18.2.0 || ^19.0.0"
87
87
  },
88
88
  "devDependencies": {
89
+ "@codemirror/autocomplete": "^6.20.3",
90
+ "@codemirror/commands": "^6.10.4",
91
+ "@codemirror/language": "^6.12.4",
92
+ "@codemirror/lint": "^6.9.7",
93
+ "@codemirror/state": "^6.7.1",
94
+ "@codemirror/view": "^6.43.6",
89
95
  "@eslint/js": "^10.0.1",
90
- "@storybook/addon-docs": "^10.5.0",
91
- "@storybook/react": "^10.5.0",
92
- "@storybook/react-vite": "^10.5.0",
96
+ "@lezer/highlight": "^1.2.3",
97
+ "@storybook/addon-docs": "^10.5.3",
98
+ "@storybook/react": "^10.5.3",
99
+ "@storybook/react-vite": "^10.5.3",
93
100
  "@types/node": "^25.9.5",
94
101
  "@types/react": "^19.2.17",
95
102
  "@types/react-dom": "^19.2.3",
@@ -99,13 +106,13 @@
99
106
  "eslint-plugin-react-refresh": "^0.5.3",
100
107
  "eslint-plugin-storybook": "10.4.6",
101
108
  "globals": "^17.7.0",
102
- "jaml-codemirror": "^0.2.1",
103
- "motely-wasm": "^24.1.0",
104
- "react": "^19.2.7",
105
- "react-dom": "^19.2.7",
106
- "storybook": "^10.5.0",
109
+ "jaml-lang": "^3.14.2",
110
+ "motely-wasm": "^24.6.0",
111
+ "react": "^19.2.8",
112
+ "react-dom": "^19.2.8",
113
+ "storybook": "^10.5.3",
107
114
  "typescript": "^5.9.3",
108
- "typescript-eslint": "^8.63.0",
115
+ "typescript-eslint": "^8.65.0",
109
116
  "vite": "^6.4.3",
110
117
  "vite-plugin-dts": "^5.0.3"
111
118
  }
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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"}