jaml-ui 0.22.2 → 0.22.4

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.
@@ -1,5 +1,5 @@
1
- import { type MotelyRuntime } from "../hooks/useAnalyzer.js";
1
+ import { type Motely } from "motely-wasm";
2
2
  export interface JamlCuratorProps {
3
- motelyRuntime: MotelyRuntime;
3
+ motely: typeof Motely | null;
4
4
  }
5
- export declare function JamlCurator({ motelyRuntime }: JamlCuratorProps): import("react/jsx-runtime").JSX.Element;
5
+ export declare function JamlCurator({ motely }: JamlCuratorProps): import("react/jsx-runtime").JSX.Element;
@@ -11,11 +11,11 @@ import { useSearch } from "../hooks/useSearch.js";
11
11
  import { useAnalyzer } from "../hooks/useAnalyzer.js";
12
12
  import { JamlSpeedometer } from "./JamlSpeedometer.js";
13
13
  const C = JimboColorOption;
14
- export function JamlCurator({ motelyRuntime }) {
14
+ export function JamlCurator({ motely }) {
15
15
  // Use map editor by default to generate JAML
16
16
  const [jamlText, setJamlText] = useState("");
17
17
  const search = useSearch();
18
- const analyzer = useAnalyzer(motelyRuntime);
18
+ const analyzer = useAnalyzer(motely);
19
19
  // Search results pagination
20
20
  const [resultIndex, setResultIndex] = useState(0);
21
21
  const isSearching = search.status === "running";
@@ -1,20 +1,10 @@
1
- import { Motely } from "motely-wasm";
1
+ import { type Motely } from "motely-wasm";
2
2
  import type { AnalyzerAnteView } from "../components/AnalyzerExplorer.js";
3
3
  export type AnalyzerStatus = "idle" | "running" | "done" | "error";
4
4
  export type MotelyJsRunState = {
5
5
  voucherBitfield: number;
6
6
  bossBitfield: number;
7
7
  };
8
- /**
9
- * Runtime handle for motely-wasm. Consumers boot motely-wasm once and pass
10
- * `{ MotelyWasm, Motely }` to hooks that need it. This keeps jaml-ui free of
11
- * static motely-wasm imports so consumer bundlers don't pull the 12MB engine
12
- * into their main bundle.
13
- */
14
- export interface MotelyRuntime {
15
- MotelyWasm: typeof Motely.MotelyWasm;
16
- Motely: typeof Motely;
17
- }
18
8
  export interface AnalyzerLive {
19
9
  ctx: ReturnType<typeof Motely.MotelyWasm.createSearchContext>;
20
10
  Motely: typeof Motely;
@@ -24,7 +14,7 @@ export interface AnalyzerLive {
24
14
  deck: string;
25
15
  stake: string;
26
16
  }
27
- export declare function useAnalyzer(runtime: MotelyRuntime | null): {
17
+ export declare function useAnalyzer(motely: typeof Motely | null): {
28
18
  antes: AnalyzerAnteView[];
29
19
  status: AnalyzerStatus;
30
20
  error: string | null;
@@ -2,7 +2,7 @@
2
2
  import { useState, useCallback } from "react";
3
3
  import { extractVisualJamlItems } from "../utils/jamlMapPreview.js";
4
4
  import { motelyItemDisplayNameFromValue } from "../motelyDisplay.js";
5
- export function useAnalyzer(runtime) {
5
+ export function useAnalyzer(motely) {
6
6
  const [antes, setAntes] = useState([]);
7
7
  const [status, setStatus] = useState("idle");
8
8
  const [error, setError] = useState(null);
@@ -10,12 +10,12 @@ export function useAnalyzer(runtime) {
10
10
  const [tallyColumns, setTallyColumns] = useState([]);
11
11
  const [tallyLabels, setTallyLabels] = useState([]);
12
12
  const analyze = useCallback(async (seed, deck, stake, jaml) => {
13
- if (!runtime) {
14
- setError("motely-wasm runtime not ready");
13
+ if (!motely) {
14
+ setError("motely-wasm not ready");
15
15
  setStatus("error");
16
16
  return;
17
17
  }
18
- const { MotelyWasm, Motely } = runtime;
18
+ const MotelyWasm = motely.MotelyWasm;
19
19
  setAntes([]);
20
20
  setLive(null);
21
21
  setTallyColumns([]);
@@ -23,8 +23,8 @@ export function useAnalyzer(runtime) {
23
23
  setStatus("running");
24
24
  setError(null);
25
25
  try {
26
- const deckEnum = Motely.MotelyDeck[deck] ?? Motely.MotelyDeck.Red;
27
- const stakeEnum = Motely.MotelyStake[stake] ?? Motely.MotelyStake.White;
26
+ const deckEnum = motely.MotelyDeck[deck] ?? motely.MotelyDeck.Red;
27
+ const stakeEnum = motely.MotelyStake[stake] ?? motely.MotelyStake.White;
28
28
  const desiredNames = new Set();
29
29
  if (jaml) {
30
30
  const groups = extractVisualJamlItems(jaml);
@@ -41,10 +41,10 @@ export function useAnalyzer(runtime) {
41
41
  const runStates = {};
42
42
  for (let ante = 1; ante <= 39; ante++) {
43
43
  const bossResult = ctx.getNextBossForAnte(bossStream, ante, runState);
44
- const bossName = Motely.MotelyBossBlind[bossResult.boss] ?? `Unknown(${bossResult.boss})`;
44
+ const bossName = motely.MotelyBossBlind[bossResult.boss] ?? `Unknown(${bossResult.boss})`;
45
45
  runState = bossResult.runState;
46
46
  const voucherResult = ctx.getAnteFirstVoucher(ante, runState);
47
- const voucherName = Motely.MotelyVoucher[voucherResult.voucher] ?? `Unknown(${voucherResult.voucher})`;
47
+ const voucherName = motely.MotelyVoucher[voucherResult.voucher] ?? `Unknown(${voucherResult.voucher})`;
48
48
  runState = voucherResult.runState;
49
49
  runStates[ante] = { ...runState };
50
50
  const tagStream = ctx.createTagStream(ante);
@@ -54,9 +54,9 @@ export function useAnalyzer(runtime) {
54
54
  const packs = [];
55
55
  for (let p = 0; p < 2; p++) {
56
56
  const packResult = ctx.getNextBoosterPack(packStream);
57
- packs.push(Motely.MotelyBoosterPack[packResult.pack] ?? `Unknown(${packResult.pack})`);
57
+ packs.push(motely.MotelyBoosterPack[packResult.pack] ?? `Unknown(${packResult.pack})`);
58
58
  }
59
- const shopStream = ctx.createShopItemStream(ante, runState, Motely.MotelyShopStreamFlags.Default, Motely.MotelyJokerStreamFlags.Default);
59
+ const shopStream = ctx.createShopItemStream(ante, runState, motely.MotelyShopStreamFlags.Default, motely.MotelyJokerStreamFlags.Default);
60
60
  const shop = [];
61
61
  for (let i = 0; i < 4; i++) {
62
62
  const itemResult = ctx.getNextShopItem(shopStream);
@@ -68,21 +68,21 @@ export function useAnalyzer(runtime) {
68
68
  ante,
69
69
  boss: bossName,
70
70
  voucher: voucherName,
71
- smallBlindTag: Motely.MotelyTag[tag1.tag] ?? `Unknown(${tag1.tag})`,
72
- bigBlindTag: Motely.MotelyTag[tag2.tag] ?? `Unknown(${tag2.tag})`,
71
+ smallBlindTag: motely.MotelyTag[tag1.tag] ?? `Unknown(${tag1.tag})`,
72
+ bigBlindTag: motely.MotelyTag[tag2.tag] ?? `Unknown(${tag2.tag})`,
73
73
  packs,
74
74
  shop,
75
75
  });
76
76
  }
77
77
  setAntes(results);
78
- setLive({ ctx, Motely, runStates, desiredNames, seed, deck, stake });
78
+ setLive({ ctx, Motely: motely, runStates, desiredNames, seed, deck, stake });
79
79
  setStatus("done");
80
80
  }
81
81
  catch (e) {
82
82
  setError(e instanceof Error ? e.message : String(e));
83
83
  setStatus("error");
84
84
  }
85
- }, [runtime]);
85
+ }, [motely]);
86
86
  const clearError = useCallback(() => {
87
87
  setError(null);
88
88
  setStatus((s) => (s === "error" ? "idle" : s));
@@ -21,8 +21,9 @@ self.addEventListener('message', async function(e) {
21
21
  try {
22
22
  const mod = await import(msg.url);
23
23
  await mod.default.boot();
24
- MotelyWasm = mod.MotelyWasm;
25
- MotelyWasmEvents = mod.MotelyWasmEvents;
24
+ const motely = mod.Motely;
25
+ MotelyWasm = motely.MotelyWasm;
26
+ MotelyWasmEvents = motely.MotelyWasmEvents;
26
27
  self.postMessage({ type: 'ready' });
27
28
  } catch (err) {
28
29
  self.postMessage({ type: 'error', message: String(err) });
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ export { Showcase, type ShowcaseFilter, type ShowcaseLiveStats, type ShowcasePro
21
21
  export { extractVisualJamlItems, type JamlPreviewGroups, type JamlPreviewItem, type JamlPreviewSection, type JamlPreviewVisualType, } from "./utils/jamlMapPreview.js";
22
22
  export { useMotelyStream, type StreamItem, type StreamState } from "./hooks/useShopStream.js";
23
23
  export { useSearch, type SearchResult, type SearchStatus, type UseSearchState, } from "./hooks/useSearch.js";
24
- export { useAnalyzer, type AnalyzerStatus, type AnalyzerLive, type MotelyJsRunState, type MotelyRuntime, } from "./hooks/useAnalyzer.js";
24
+ export { useAnalyzer, type AnalyzerStatus, type AnalyzerLive, type MotelyJsRunState, } from "./hooks/useAnalyzer.js";
25
25
  export { setMotelyEnums as setMotelyDisplayEnums } from "./motelyDisplay.js";
26
26
  export { setMotelyEnums as setMotelyDecoderEnums } from "./decode/motelyItemDecoder.js";
27
27
  export { JamlAestheticSelector, type JamlAestheticSelectorProps, type JamlAestheticOption, } from "./components/JamlAestheticSelector.js";
@@ -1,9 +1,5 @@
1
- import { Motely } from "motely-wasm";
2
- export interface MotelyRuntime {
3
- MotelyWasm: typeof Motely.MotelyWasm;
4
- Motely: typeof Motely;
5
- }
6
- export declare function useSeedAnalyzer(runtime: MotelyRuntime | null, seed: string | null): {
1
+ import { type Motely } from "motely-wasm";
2
+ export declare function useSeedAnalyzer(motely: typeof Motely | null, seed: string | null): {
7
3
  data: Motely.Analysis.MotelyLegacyTextAnalyzer | null | undefined;
8
4
  loading: boolean;
9
5
  error: string | null;
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { useState, useEffect } from "react";
3
- export function useSeedAnalyzer(runtime, seed) {
3
+ export function useSeedAnalyzer(motely, seed) {
4
4
  const [data, setData] = useState(null);
5
5
  const [loading, setLoading] = useState(false);
6
6
  const [error, setError] = useState(null);
7
7
  useEffect(() => {
8
- if (!seed || seed === "LOCKED" || !runtime) {
8
+ if (!seed || seed === "LOCKED" || !motely) {
9
9
  setData(null);
10
10
  return;
11
11
  }
@@ -15,7 +15,7 @@ export function useSeedAnalyzer(runtime, seed) {
15
15
  setError(null);
16
16
  try {
17
17
  const jaml = `version: 1\nconfig:\n deck: Erratic\n stake: White\n`;
18
- const rawResult = runtime.MotelyWasm.analyzeJamlSeeds(jaml, [seed]);
18
+ const rawResult = motely.MotelyWasm.analyzeJamlSeeds(jaml, [seed]);
19
19
  if (abortController.signal.aborted)
20
20
  return;
21
21
  if (rawResult && rawResult.seeds.length > 0) {
@@ -39,6 +39,6 @@ export function useSeedAnalyzer(runtime, seed) {
39
39
  };
40
40
  runAnalysis();
41
41
  return () => abortController.abort();
42
- }, [runtime, seed]);
42
+ }, [motely, seed]);
43
43
  return { data, loading, error };
44
44
  }
package/package.json CHANGED
@@ -1,144 +1,145 @@
1
- {
2
- "name": "jaml-ui",
3
- "version": "0.22.2",
4
- "description": "Balatro rendering components, sprite metadata, and optional Motely helpers for React apps.",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "require": "./dist/index.js",
12
- "types": "./dist/index.d.ts",
13
- "default": "./dist/index.js"
14
- },
15
- "./motely": {
16
- "import": "./dist/motely.js",
17
- "require": "./dist/motely.js",
18
- "types": "./dist/motely.d.ts",
19
- "default": "./dist/motely.js"
20
- },
21
- "./fonts.css": "./fonts.css",
22
- "./jaml.schema.json": "./jaml.schema.json"
23
- },
24
- "sideEffects": [
25
- "./fonts.css"
26
- ],
27
- "files": [
28
- "dist",
29
- "assets/*.png",
30
- "assets/fonts",
31
- "fonts.css",
32
- "dist/ui/jimbo.css",
33
- "jaml.schema.json",
34
- "README.md",
35
- "DESIGN.md",
36
- "LICENSE"
37
- ],
38
- "engines": {
39
- "node": ">=18"
40
- },
41
- "publishConfig": {
42
- "access": "public"
43
- },
44
- "repository": {
45
- "type": "git",
46
- "url": "https://github.com/OptimusPi/jaml-ui"
47
- },
48
- "homepage": "https://github.com/OptimusPi/jaml-ui#readme",
49
- "bugs": {
50
- "url": "https://github.com/OptimusPi/jaml-ui/issues"
51
- },
52
- "keywords": [
53
- "balatro",
54
- "jaml",
55
- "motely",
56
- "seed",
57
- "card",
58
- "sprite",
59
- "ui"
60
- ],
61
- "author": "pifreak",
62
- "license": "MIT",
63
- "peerDependencies": {
64
- "@monaco-editor/react": ">=4.0.0",
65
- "@react-spring/three": ">=9.0.0",
66
- "@react-three/drei": ">=9.0.0",
67
- "@react-three/fiber": ">=8.0.0",
68
- "monaco-editor": ">=0.50.0",
69
- "motely-wasm": "^14.4.0",
70
- "react": "^18.2.0 || ^19.0.0",
71
- "react-dom": "^18.2.0 || ^19.0.0",
72
- "react-icons": ">=5.0.0",
73
- "three": ">=0.150.0"
74
- },
75
- "peerDependenciesMeta": {
76
- "@react-spring/three": {
77
- "optional": true
78
- },
79
- "@react-three/fiber": {
80
- "optional": true
81
- },
82
- "motely-wasm": {
83
- "optional": true
84
- },
85
- "react-icons": {
86
- "optional": true
87
- },
88
- "three": {
89
- "optional": true
90
- },
91
- "@react-three/drei": {
92
- "optional": true
93
- }
94
- },
95
- "devDependencies": {
96
- "@chromatic-com/storybook": "^5.1.2",
97
- "@google/design.md": "^0.1.1",
98
- "@monaco-editor/react": "^4.7.0",
99
- "@react-spring/three": "^10.0.3",
100
- "@react-three/fiber": "^9.6.0",
101
- "@storybook/addon-a11y": "^10.3.6",
102
- "@storybook/addon-docs": "^10.3.6",
103
- "@storybook/addon-onboarding": "^10.3.6",
104
- "@storybook/addon-vitest": "^10.3.6",
105
- "@storybook/react-vite": "^10.3.6",
106
- "@types/node": "^25.6.0",
107
- "@types/react": "^19.2.14",
108
- "@types/react-dom": "^19.2.3",
109
- "@types/three": "^0.184.0",
110
- "@vitejs/plugin-react": "^5.0.4",
111
- "@vitest/browser-playwright": "^4.1.5",
112
- "@vitest/coverage-v8": "^4.1.5",
113
- "monaco-editor": "^0.55.1",
114
- "motely-wasm": "^14.4.0",
115
- "playwright": "^1.59.1",
116
- "react": "^19.2.4",
117
- "react-dom": "^19.2.4",
118
- "react-icons": "^5.6.0",
119
- "storybook": "^10.3.6",
120
- "three": "^0.184.0",
121
- "typescript": "^5.9.3",
122
- "vite": "^8.0.9",
123
- "vitest": "^4.1.5"
124
- },
125
- "dependencies": {
126
- "@json-render/core": "^0.18.0",
127
- "@react-three/drei": ">=9.0.0",
128
- "@types/js-yaml": "^4.0.9",
129
- "clsx": "^2.1.1",
130
- "js-yaml": "^4.1.1",
131
- "lucide-react": "^1.14.0",
132
- "tailwind-merge": "^2.6.1",
133
- "zustand": "^5.0.0"
134
- },
135
- "scripts": {
136
- "build": "tsc --pretty false && node -e \"const fs=require('fs');fs.mkdirSync('dist/ui',{recursive:true});fs.copyFileSync('src/ui/jimbo.css','dist/ui/jimbo.css');fs.copyFileSync('node_modules/motely-wasm/jaml.schema.json','jaml.schema.json');\"",
137
- "dev": "tsc --watch",
138
- "demo": "vite --config demo/vite.config.ts",
139
- "typecheck": "tsc --noEmit --pretty false",
140
- "storybook": "storybook dev -p 6006",
141
- "build-storybook": "storybook build",
142
- "lint": "eslint ."
143
- }
144
- }
1
+ {
2
+ "name": "jaml-ui",
3
+ "version": "0.22.4",
4
+ "description": "Balatro rendering components, sprite metadata, and optional Motely helpers for React apps.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./motely": {
16
+ "import": "./dist/motely.js",
17
+ "require": "./dist/motely.js",
18
+ "types": "./dist/motely.d.ts",
19
+ "default": "./dist/motely.js"
20
+ },
21
+ "./fonts.css": "./fonts.css",
22
+ "./jaml.schema.json": "./jaml.schema.json"
23
+ },
24
+ "sideEffects": [
25
+ "./fonts.css"
26
+ ],
27
+ "files": [
28
+ "dist",
29
+ "assets/*.png",
30
+ "assets/fonts",
31
+ "fonts.css",
32
+ "dist/ui/jimbo.css",
33
+ "jaml.schema.json",
34
+ "README.md",
35
+ "DESIGN.md",
36
+ "LICENSE"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsc --pretty false && node -e \"const fs=require('fs');fs.mkdirSync('dist/ui',{recursive:true});fs.copyFileSync('src/ui/jimbo.css','dist/ui/jimbo.css');fs.copyFileSync('node_modules/motely-wasm/jaml.schema.json','jaml.schema.json');\"",
40
+ "dev": "tsc --watch",
41
+ "demo": "vite --config demo/vite.config.ts",
42
+ "typecheck": "tsc --noEmit --pretty false",
43
+ "prepack": "npm run build",
44
+ "storybook": "storybook dev -p 6006",
45
+ "build-storybook": "storybook build",
46
+ "lint": "eslint ."
47
+ },
48
+ "engines": {
49
+ "node": ">=18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/OptimusPi/jaml-ui"
57
+ },
58
+ "homepage": "https://github.com/OptimusPi/jaml-ui#readme",
59
+ "bugs": {
60
+ "url": "https://github.com/OptimusPi/jaml-ui/issues"
61
+ },
62
+ "keywords": [
63
+ "balatro",
64
+ "jaml",
65
+ "motely",
66
+ "seed",
67
+ "card",
68
+ "sprite",
69
+ "ui"
70
+ ],
71
+ "author": "pifreak",
72
+ "license": "MIT",
73
+ "peerDependencies": {
74
+ "@monaco-editor/react": ">=4.0.0",
75
+ "@react-spring/three": ">=9.0.0",
76
+ "@react-three/drei": ">=9.0.0",
77
+ "@react-three/fiber": ">=8.0.0",
78
+ "monaco-editor": ">=0.50.0",
79
+ "motely-wasm": "^14.4.0",
80
+ "react": "^18.2.0 || ^19.0.0",
81
+ "react-dom": "^18.2.0 || ^19.0.0",
82
+ "react-icons": ">=5.0.0",
83
+ "three": ">=0.150.0"
84
+ },
85
+ "peerDependenciesMeta": {
86
+ "@react-spring/three": {
87
+ "optional": true
88
+ },
89
+ "@react-three/fiber": {
90
+ "optional": true
91
+ },
92
+ "motely-wasm": {
93
+ "optional": true
94
+ },
95
+ "react-icons": {
96
+ "optional": true
97
+ },
98
+ "three": {
99
+ "optional": true
100
+ },
101
+ "@react-three/drei": {
102
+ "optional": true
103
+ }
104
+ },
105
+ "devDependencies": {
106
+ "@chromatic-com/storybook": "^5.1.2",
107
+ "@google/design.md": "^0.1.1",
108
+ "@monaco-editor/react": "^4.7.0",
109
+ "@react-spring/three": "^10.0.3",
110
+ "@react-three/fiber": "^9.6.0",
111
+ "@storybook/addon-a11y": "^10.3.6",
112
+ "@storybook/addon-docs": "^10.3.6",
113
+ "@storybook/addon-onboarding": "^10.3.6",
114
+ "@storybook/addon-vitest": "^10.3.6",
115
+ "@storybook/react-vite": "^10.3.6",
116
+ "@types/node": "^25.6.0",
117
+ "@types/react": "^19.2.14",
118
+ "@types/react-dom": "^19.2.3",
119
+ "@types/three": "^0.184.0",
120
+ "@vitejs/plugin-react": "^5.0.4",
121
+ "@vitest/browser-playwright": "^4.1.5",
122
+ "@vitest/coverage-v8": "^4.1.5",
123
+ "monaco-editor": "^0.55.1",
124
+ "motely-wasm": "^14.4.0",
125
+ "playwright": "^1.59.1",
126
+ "react": "^19.2.4",
127
+ "react-dom": "^19.2.4",
128
+ "react-icons": "^5.6.0",
129
+ "storybook": "^10.3.6",
130
+ "three": "^0.184.0",
131
+ "typescript": "^5.9.3",
132
+ "vite": "^8.0.9",
133
+ "vitest": "^4.1.5"
134
+ },
135
+ "dependencies": {
136
+ "@json-render/core": "^0.18.0",
137
+ "@react-three/drei": ">=9.0.0",
138
+ "@types/js-yaml": "^4.0.9",
139
+ "clsx": "^2.1.1",
140
+ "js-yaml": "^4.1.1",
141
+ "lucide-react": "^1.14.0",
142
+ "tailwind-merge": "^2.6.1",
143
+ "zustand": "^5.0.0"
144
+ }
145
+ }