jaml-ui 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -28
- package/dist/components/AnalyzerExplorer.d.ts +44 -0
- package/dist/components/AnalyzerExplorer.js +451 -0
- package/dist/components/JamlIde.d.ts +17 -0
- package/dist/components/JamlIde.js +61 -0
- package/dist/components/JamlIdeToolbar.d.ts +8 -0
- package/dist/components/JamlIdeToolbar.js +36 -0
- package/dist/components/JamlMapPreview.d.ts +10 -0
- package/dist/components/JamlMapPreview.js +117 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/motely.d.ts +1 -0
- package/dist/motely.js +1 -0
- package/dist/motelyDisplay.d.ts +629 -0
- package/dist/motelyDisplay.js +187 -0
- package/dist/utils/jamlMapPreview.d.ts +12 -0
- package/dist/utils/jamlMapPreview.js +105 -0
- package/package.json +19 -31
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { Motely } from "motely-wasm";
|
|
2
|
+
import { getItemDisplayName } from "./utils/itemUtils.js";
|
|
3
|
+
const BOSS_ENTRIES = [
|
|
4
|
+
{ key: "AmberAcorn", label: "Amber Acorn" },
|
|
5
|
+
{ key: "CeruleanBell", label: "Cerulean Bell" },
|
|
6
|
+
{ key: "CrimsonHeart", label: "Crimson Heart" },
|
|
7
|
+
{ key: "VerdantLeaf", label: "Verdant Leaf" },
|
|
8
|
+
{ key: "VioletVessel", label: "Violet Vessel" },
|
|
9
|
+
{ key: "TheArm", label: "The Arm" },
|
|
10
|
+
{ key: "TheClub", label: "The Club" },
|
|
11
|
+
{ key: "TheEye", label: "The Eye" },
|
|
12
|
+
{ key: "TheFish", label: "The Fish" },
|
|
13
|
+
{ key: "TheFlint", label: "The Flint" },
|
|
14
|
+
{ key: "TheGoad", label: "The Goad" },
|
|
15
|
+
{ key: "TheHead", label: "The Head" },
|
|
16
|
+
{ key: "TheHook", label: "The Hook" },
|
|
17
|
+
{ key: "TheHouse", label: "The House" },
|
|
18
|
+
{ key: "TheManacle", label: "The Manacle" },
|
|
19
|
+
{ key: "TheMark", label: "The Mark" },
|
|
20
|
+
{ key: "TheMouth", label: "The Mouth" },
|
|
21
|
+
{ key: "TheNeedle", label: "The Needle" },
|
|
22
|
+
{ key: "TheOx", label: "The Ox" },
|
|
23
|
+
{ key: "ThePillar", label: "The Pillar" },
|
|
24
|
+
{ key: "ThePlant", label: "The Plant" },
|
|
25
|
+
{ key: "ThePsychic", label: "The Psychic" },
|
|
26
|
+
{ key: "TheSerpent", label: "The Serpent" },
|
|
27
|
+
{ key: "TheTooth", label: "The Tooth" },
|
|
28
|
+
{ key: "TheWall", label: "The Wall" },
|
|
29
|
+
{ key: "TheWater", label: "The Water" },
|
|
30
|
+
{ key: "TheWheel", label: "The Wheel" },
|
|
31
|
+
{ key: "TheWindow", label: "The Window" },
|
|
32
|
+
];
|
|
33
|
+
const VOUCHER_ENTRIES = [
|
|
34
|
+
{ key: "Overstock", label: "Overstock" },
|
|
35
|
+
{ key: "OverstockPlus", label: "Overstock Plus" },
|
|
36
|
+
{ key: "ClearanceSale", label: "Clearance Sale" },
|
|
37
|
+
{ key: "Liquidation", label: "Liquidation" },
|
|
38
|
+
{ key: "Hone", label: "Hone" },
|
|
39
|
+
{ key: "GlowUp", label: "Glow Up" },
|
|
40
|
+
{ key: "RerollSurplus", label: "Reroll Surplus" },
|
|
41
|
+
{ key: "RerollGlut", label: "Reroll Glut" },
|
|
42
|
+
{ key: "CrystalBall", label: "Crystal Ball" },
|
|
43
|
+
{ key: "OmenGlobe", label: "Omen Globe" },
|
|
44
|
+
{ key: "Telescope", label: "Telescope" },
|
|
45
|
+
{ key: "Observatory", label: "Observatory" },
|
|
46
|
+
{ key: "Grabber", label: "Grabber" },
|
|
47
|
+
{ key: "NachoTong", label: "Nacho Tong" },
|
|
48
|
+
{ key: "Wasteful", label: "Wasteful" },
|
|
49
|
+
{ key: "Recyclomancy", label: "Recyclomancy" },
|
|
50
|
+
{ key: "TarotMerchant", label: "Tarot Merchant" },
|
|
51
|
+
{ key: "TarotTycoon", label: "Tarot Tycoon" },
|
|
52
|
+
{ key: "PlanetMerchant", label: "Planet Merchant" },
|
|
53
|
+
{ key: "PlanetTycoon", label: "Planet Tycoon" },
|
|
54
|
+
{ key: "SeedMoney", label: "Seed Money" },
|
|
55
|
+
{ key: "MoneyTree", label: "Money Tree" },
|
|
56
|
+
{ key: "Blank", label: "Blank" },
|
|
57
|
+
{ key: "Antimatter", label: "Antimatter" },
|
|
58
|
+
{ key: "MagicTrick", label: "Magic Trick" },
|
|
59
|
+
{ key: "Illusion", label: "Illusion" },
|
|
60
|
+
{ key: "Hieroglyph", label: "Hieroglyph" },
|
|
61
|
+
{ key: "Petroglyph", label: "Petroglyph" },
|
|
62
|
+
{ key: "DirectorsCut", label: "Director's Cut" },
|
|
63
|
+
{ key: "Retcon", label: "Retcon" },
|
|
64
|
+
{ key: "PaintBrush", label: "Paint Brush" },
|
|
65
|
+
{ key: "Palette", label: "Palette" },
|
|
66
|
+
];
|
|
67
|
+
const TAG_ENTRIES = [
|
|
68
|
+
{ key: "UncommonTag", label: "Uncommon Tag" },
|
|
69
|
+
{ key: "RareTag", label: "Rare Tag" },
|
|
70
|
+
{ key: "NegativeTag", label: "Negative Tag" },
|
|
71
|
+
{ key: "FoilTag", label: "Foil Tag" },
|
|
72
|
+
{ key: "HolographicTag", label: "Holographic Tag" },
|
|
73
|
+
{ key: "PolychromeTag", label: "Polychrome Tag" },
|
|
74
|
+
{ key: "InvestmentTag", label: "Investment Tag" },
|
|
75
|
+
{ key: "VoucherTag", label: "Voucher Tag" },
|
|
76
|
+
{ key: "BossTag", label: "Boss Tag" },
|
|
77
|
+
{ key: "StandardTag", label: "Standard Tag" },
|
|
78
|
+
{ key: "CharmTag", label: "Charm Tag" },
|
|
79
|
+
{ key: "MeteorTag", label: "Meteor Tag" },
|
|
80
|
+
{ key: "BuffoonTag", label: "Buffoon Tag" },
|
|
81
|
+
{ key: "HandyTag", label: "Handy Tag" },
|
|
82
|
+
{ key: "GarbageTag", label: "Garbage Tag" },
|
|
83
|
+
{ key: "EtherealTag", label: "Ethereal Tag" },
|
|
84
|
+
{ key: "CouponTag", label: "Coupon Tag" },
|
|
85
|
+
{ key: "DoubleTag", label: "Double Tag" },
|
|
86
|
+
{ key: "JuggleTag", label: "Juggle Tag" },
|
|
87
|
+
{ key: "D6Tag", label: "D6 Tag" },
|
|
88
|
+
{ key: "TopupTag", label: "Top-up Tag" },
|
|
89
|
+
{ key: "SpeedTag", label: "Speed Tag" },
|
|
90
|
+
{ key: "OrbitalTag", label: "Orbital Tag" },
|
|
91
|
+
{ key: "EconomyTag", label: "Economy Tag" },
|
|
92
|
+
];
|
|
93
|
+
const BOOSTER_PACK_ENTRIES = [
|
|
94
|
+
{ key: "Arcana", label: "Arcana Pack" },
|
|
95
|
+
{ key: "JumboArcana", label: "Jumbo Arcana Pack" },
|
|
96
|
+
{ key: "MegaArcana", label: "Mega Arcana Pack" },
|
|
97
|
+
{ key: "Celestial", label: "Celestial Pack" },
|
|
98
|
+
{ key: "JumboCelestial", label: "Jumbo Celestial Pack" },
|
|
99
|
+
{ key: "MegaCelestial", label: "Mega Celestial Pack" },
|
|
100
|
+
{ key: "Standard", label: "Standard Pack" },
|
|
101
|
+
{ key: "JumboStandard", label: "Jumbo Standard Pack" },
|
|
102
|
+
{ key: "MegaStandard", label: "Mega Standard Pack" },
|
|
103
|
+
{ key: "Buffoon", label: "Buffoon Pack" },
|
|
104
|
+
{ key: "JumboBuffoon", label: "Jumbo Buffoon Pack" },
|
|
105
|
+
{ key: "MegaBuffoon", label: "Mega Buffoon Pack" },
|
|
106
|
+
{ key: "Spectral", label: "Spectral Pack" },
|
|
107
|
+
{ key: "JumboSpectral", label: "Jumbo Spectral Pack" },
|
|
108
|
+
{ key: "MegaSpectral", label: "Mega Spectral Pack" },
|
|
109
|
+
];
|
|
110
|
+
const BOSS_VALUE_MASK = 0xff;
|
|
111
|
+
const ITEM_VALUE_MASK = 0xffff;
|
|
112
|
+
export const MOTELY_DISPLAY_SCHEMA = {
|
|
113
|
+
bosses: BOSS_ENTRIES,
|
|
114
|
+
vouchers: VOUCHER_ENTRIES,
|
|
115
|
+
tags: TAG_ENTRIES,
|
|
116
|
+
boosterPacks: BOOSTER_PACK_ENTRIES,
|
|
117
|
+
};
|
|
118
|
+
function createLabelLookup(entries) {
|
|
119
|
+
return {
|
|
120
|
+
keyToLabel: new Map(entries.map((entry) => [entry.key, entry.label])),
|
|
121
|
+
labelToKey: new Map(entries.map((entry) => [entry.label, entry.key])),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const bossLookup = createLabelLookup(BOSS_ENTRIES);
|
|
125
|
+
const voucherLookup = createLabelLookup(VOUCHER_ENTRIES);
|
|
126
|
+
const tagLookup = createLabelLookup(TAG_ENTRIES);
|
|
127
|
+
const boosterPackLookup = createLabelLookup(BOOSTER_PACK_ENTRIES);
|
|
128
|
+
function spaceSplit(value) {
|
|
129
|
+
return value.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
|
|
130
|
+
}
|
|
131
|
+
function displayNameFromKey(lookup, key, fallback) {
|
|
132
|
+
return lookup.keyToLabel.get(key) ?? fallback;
|
|
133
|
+
}
|
|
134
|
+
function keyFromDisplayName(lookup, label) {
|
|
135
|
+
return lookup.labelToKey.get(label) ?? null;
|
|
136
|
+
}
|
|
137
|
+
function runtimeEnumKey(enumObject, value) {
|
|
138
|
+
const key = enumObject[String(value)];
|
|
139
|
+
return typeof key === "string" && key.length > 0 ? key : null;
|
|
140
|
+
}
|
|
141
|
+
export function motelyBossDisplayNameFromKey(key) {
|
|
142
|
+
return displayNameFromKey(bossLookup, key, spaceSplit(key));
|
|
143
|
+
}
|
|
144
|
+
export function motelyVoucherDisplayNameFromKey(key) {
|
|
145
|
+
return displayNameFromKey(voucherLookup, key, spaceSplit(key));
|
|
146
|
+
}
|
|
147
|
+
export function motelyTagDisplayNameFromKey(key) {
|
|
148
|
+
return displayNameFromKey(tagLookup, key, spaceSplit(key));
|
|
149
|
+
}
|
|
150
|
+
export function motelyBoosterPackDisplayNameFromKey(key) {
|
|
151
|
+
return displayNameFromKey(boosterPackLookup, key, `${spaceSplit(key)} Pack`);
|
|
152
|
+
}
|
|
153
|
+
export function motelyItemDisplayNameFromKey(key) {
|
|
154
|
+
return getItemDisplayName(key);
|
|
155
|
+
}
|
|
156
|
+
export function motelyBossDisplayName(value) {
|
|
157
|
+
const key = runtimeEnumKey(Motely.MotelyBossBlind, value & BOSS_VALUE_MASK);
|
|
158
|
+
return key === null ? `boss#${value}` : motelyBossDisplayNameFromKey(key);
|
|
159
|
+
}
|
|
160
|
+
export function motelyVoucherDisplayName(value) {
|
|
161
|
+
const key = runtimeEnumKey(Motely.MotelyVoucher, value);
|
|
162
|
+
return key === null ? `voucher#${value}` : motelyVoucherDisplayNameFromKey(key);
|
|
163
|
+
}
|
|
164
|
+
export function motelyTagDisplayName(value) {
|
|
165
|
+
const key = runtimeEnumKey(Motely.MotelyTag, value);
|
|
166
|
+
return key === null ? `tag#${value}` : motelyTagDisplayNameFromKey(key);
|
|
167
|
+
}
|
|
168
|
+
export function motelyBoosterPackDisplayName(value) {
|
|
169
|
+
const key = runtimeEnumKey(Motely.MotelyBoosterPack, value);
|
|
170
|
+
return key === null ? `pack#${value}` : motelyBoosterPackDisplayNameFromKey(key);
|
|
171
|
+
}
|
|
172
|
+
export function motelyItemDisplayNameFromValue(value) {
|
|
173
|
+
const key = runtimeEnumKey(Motely.MotelyItemType, value & ITEM_VALUE_MASK);
|
|
174
|
+
return key === null ? `item#${value}` : motelyItemDisplayNameFromKey(key);
|
|
175
|
+
}
|
|
176
|
+
export function motelyBossKeyFromDisplayName(label) {
|
|
177
|
+
return keyFromDisplayName(bossLookup, label);
|
|
178
|
+
}
|
|
179
|
+
export function motelyVoucherKeyFromDisplayName(label) {
|
|
180
|
+
return keyFromDisplayName(voucherLookup, label);
|
|
181
|
+
}
|
|
182
|
+
export function motelyTagKeyFromDisplayName(label) {
|
|
183
|
+
return keyFromDisplayName(tagLookup, label);
|
|
184
|
+
}
|
|
185
|
+
export function motelyBoosterPackKeyFromDisplayName(label) {
|
|
186
|
+
return keyFromDisplayName(boosterPackLookup, label);
|
|
187
|
+
}
|
|
@@ -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,105 @@
|
|
|
1
|
+
const CLAUSE_VISUAL_TYPES = {
|
|
2
|
+
joker: "joker",
|
|
3
|
+
jokers: "joker",
|
|
4
|
+
commonJoker: "joker",
|
|
5
|
+
commonJokers: "joker",
|
|
6
|
+
uncommonJoker: "joker",
|
|
7
|
+
uncommonJokers: "joker",
|
|
8
|
+
rareJoker: "joker",
|
|
9
|
+
rareJokers: "joker",
|
|
10
|
+
mixedJoker: "joker",
|
|
11
|
+
mixedJokers: "joker",
|
|
12
|
+
soulJoker: "joker",
|
|
13
|
+
legendaryJoker: "joker",
|
|
14
|
+
voucher: "voucher",
|
|
15
|
+
vouchers: "voucher",
|
|
16
|
+
tarot: "consumable",
|
|
17
|
+
tarotCard: "consumable",
|
|
18
|
+
spectral: "consumable",
|
|
19
|
+
spectralCard: "consumable",
|
|
20
|
+
planet: "consumable",
|
|
21
|
+
planetCard: "consumable",
|
|
22
|
+
boss: "boss",
|
|
23
|
+
bosses: "boss",
|
|
24
|
+
tag: "tag",
|
|
25
|
+
tags: "tag",
|
|
26
|
+
smallBlindTag: "tag",
|
|
27
|
+
bigBlindTag: "tag",
|
|
28
|
+
};
|
|
29
|
+
function createEmptyGroups() {
|
|
30
|
+
return { must: [], should: [], mustNot: [] };
|
|
31
|
+
}
|
|
32
|
+
function stripWrappingQuotes(value) {
|
|
33
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
34
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
35
|
+
return value.slice(1, -1).trim();
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function normalizeCandidateValue(value) {
|
|
40
|
+
const normalized = stripWrappingQuotes(value.trim()).replace(/,$/, "").trim();
|
|
41
|
+
if (!normalized)
|
|
42
|
+
return null;
|
|
43
|
+
if (normalized === "Any")
|
|
44
|
+
return null;
|
|
45
|
+
return normalized;
|
|
46
|
+
}
|
|
47
|
+
function parseInlineValues(raw) {
|
|
48
|
+
const trimmed = raw.trim();
|
|
49
|
+
if (!trimmed)
|
|
50
|
+
return [];
|
|
51
|
+
if (trimmed.startsWith("[") && trimmed.includes("]")) {
|
|
52
|
+
const body = trimmed.slice(1, trimmed.indexOf("]"));
|
|
53
|
+
return body
|
|
54
|
+
.split(",")
|
|
55
|
+
.map((value) => normalizeCandidateValue(value))
|
|
56
|
+
.filter((value) => Boolean(value));
|
|
57
|
+
}
|
|
58
|
+
const normalized = normalizeCandidateValue(trimmed);
|
|
59
|
+
return normalized ? [normalized] : [];
|
|
60
|
+
}
|
|
61
|
+
export function extractVisualJamlItems(jaml) {
|
|
62
|
+
const groups = createEmptyGroups();
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
const lines = jaml.replace(/\r\n/g, "\n").split("\n");
|
|
65
|
+
let currentSection = null;
|
|
66
|
+
for (const rawLine of lines) {
|
|
67
|
+
const trimmed = rawLine.trim();
|
|
68
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
69
|
+
continue;
|
|
70
|
+
const sectionMatch = /^(must|should|mustNot):\s*$/.exec(trimmed);
|
|
71
|
+
if (sectionMatch) {
|
|
72
|
+
currentSection = sectionMatch[1];
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const indent = rawLine.search(/\S|$/);
|
|
76
|
+
if (indent === 0 && /^[A-Za-z][A-Za-z0-9]*:\s*/.test(trimmed)) {
|
|
77
|
+
currentSection = null;
|
|
78
|
+
}
|
|
79
|
+
if (!currentSection)
|
|
80
|
+
continue;
|
|
81
|
+
const clauseMatch = /^-?\s*([A-Za-z][A-Za-z0-9]*):\s*(.*?)\s*$/.exec(trimmed);
|
|
82
|
+
if (!clauseMatch)
|
|
83
|
+
continue;
|
|
84
|
+
const clauseKey = clauseMatch[1];
|
|
85
|
+
const visualType = CLAUSE_VISUAL_TYPES[clauseKey];
|
|
86
|
+
if (!visualType)
|
|
87
|
+
continue;
|
|
88
|
+
const values = parseInlineValues(clauseMatch[2]);
|
|
89
|
+
for (const value of values) {
|
|
90
|
+
const dedupeKey = `${currentSection}:${visualType}:${value.toLowerCase()}`;
|
|
91
|
+
if (seen.has(dedupeKey))
|
|
92
|
+
continue;
|
|
93
|
+
seen.add(dedupeKey);
|
|
94
|
+
groups[currentSection].push({
|
|
95
|
+
id: dedupeKey,
|
|
96
|
+
section: currentSection,
|
|
97
|
+
clauseKey,
|
|
98
|
+
visualType,
|
|
99
|
+
value,
|
|
100
|
+
source: rawLine,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return groups;
|
|
105
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jaml-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Balatro rendering components, sprite metadata, and optional Motely helpers for React apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,10 +18,6 @@
|
|
|
18
18
|
"types": "./dist/motely.d.ts",
|
|
19
19
|
"import": "./dist/motely.js"
|
|
20
20
|
},
|
|
21
|
-
"./r3f": {
|
|
22
|
-
"types": "./dist/r3f/index.d.ts",
|
|
23
|
-
"import": "./dist/r3f/index.js"
|
|
24
|
-
},
|
|
25
21
|
"./assets/*": "./assets/*",
|
|
26
22
|
"./package.json": "./package.json"
|
|
27
23
|
},
|
|
@@ -32,12 +28,25 @@
|
|
|
32
28
|
"README.md",
|
|
33
29
|
"LICENSE"
|
|
34
30
|
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc --pretty false",
|
|
33
|
+
"dev": "tsc --watch",
|
|
34
|
+
"typecheck": "tsc --noEmit --pretty false",
|
|
35
|
+
"prepack": "npm run build"
|
|
36
|
+
},
|
|
35
37
|
"engines": {
|
|
36
38
|
"node": ">=18"
|
|
37
39
|
},
|
|
38
40
|
"publishConfig": {
|
|
39
|
-
"access": "public"
|
|
40
|
-
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/OptimusPi/jaml-ui"
|
|
46
|
+
},
|
|
47
|
+
"homepage": "https://github.com/OptimusPi/jaml-ui#readme",
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/OptimusPi/jaml-ui/issues"
|
|
41
50
|
},
|
|
42
51
|
"keywords": [
|
|
43
52
|
"balatro",
|
|
@@ -51,42 +60,21 @@
|
|
|
51
60
|
"author": "pifreak",
|
|
52
61
|
"license": "MIT",
|
|
53
62
|
"peerDependencies": {
|
|
54
|
-
"
|
|
55
|
-
"@react-three/fiber": "^9.0.0",
|
|
56
|
-
"motely-wasm": ">=5.7.0",
|
|
63
|
+
"motely-wasm": "^10.2.0 || ^11.0.0",
|
|
57
64
|
"react": "^18.2.0 || ^19.0.0",
|
|
58
|
-
"react-dom": "^18.2.0 || ^19.0.0"
|
|
59
|
-
"three": ">=0.170.0 <0.200.0"
|
|
65
|
+
"react-dom": "^18.2.0 || ^19.0.0"
|
|
60
66
|
},
|
|
61
67
|
"peerDependenciesMeta": {
|
|
62
68
|
"motely-wasm": {
|
|
63
69
|
"optional": true
|
|
64
|
-
},
|
|
65
|
-
"@react-spring/three": {
|
|
66
|
-
"optional": true
|
|
67
|
-
},
|
|
68
|
-
"@react-three/fiber": {
|
|
69
|
-
"optional": true
|
|
70
|
-
},
|
|
71
|
-
"three": {
|
|
72
|
-
"optional": true
|
|
73
70
|
}
|
|
74
71
|
},
|
|
75
72
|
"devDependencies": {
|
|
76
|
-
"@react-spring/three": "^10.0.3",
|
|
77
|
-
"@react-three/fiber": "^9.5.0",
|
|
78
73
|
"@types/react": "^19.2.14",
|
|
79
74
|
"@types/react-dom": "^19.2.3",
|
|
80
|
-
"
|
|
81
|
-
"motely-wasm": "^7.0.8",
|
|
75
|
+
"motely-wasm": "^11.3.2",
|
|
82
76
|
"react": "^19.2.4",
|
|
83
77
|
"react-dom": "^19.2.4",
|
|
84
|
-
"three": "^0.183.2",
|
|
85
78
|
"typescript": "^5.9.3"
|
|
86
|
-
},
|
|
87
|
-
"scripts": {
|
|
88
|
-
"build": "tsc --pretty false && node scripts/copy-data.mjs",
|
|
89
|
-
"dev": "tsc --watch",
|
|
90
|
-
"typecheck": "tsc --noEmit --pretty false"
|
|
91
79
|
}
|
|
92
80
|
}
|