jaml-ui 0.26.3 → 0.26.5

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 (42) hide show
  1. package/README.md +22 -7
  2. package/dist/assets/searchPoolWorker-CejAnH4a.js +35 -0
  3. package/dist/assets/searchPoolWorker-CejAnH4a.js.map +1 -0
  4. package/dist/chunks/motelyItemDecoder-Bg12hhB2.js +248 -0
  5. package/dist/chunks/motelyItemDecoder-Bg12hhB2.js.map +1 -0
  6. package/dist/chunks/searchPoolWorker-CTtPOuxF.js +8 -0
  7. package/dist/chunks/searchPoolWorker-CTtPOuxF.js.map +1 -0
  8. package/dist/chunks/{ui-BRMCKSX4.js → ui-0liG4zOw.js} +2 -2
  9. package/dist/chunks/{ui-BRMCKSX4.js.map → ui-0liG4zOw.js.map} +1 -1
  10. package/dist/components/JamlIde.d.ts +8 -1
  11. package/dist/components/JamlIdeToolbar.d.ts +3 -1
  12. package/dist/components/jamlMap/CategoryPicker.d.ts +1 -0
  13. package/dist/components/jamlMap/JokerPicker.d.ts +1 -0
  14. package/dist/config.d.ts +7 -0
  15. package/dist/hooks/searchPoolWorker.d.ts +60 -0
  16. package/dist/hooks/searchWorker.d.ts +1 -0
  17. package/dist/hooks/useAnalyzer.d.ts +17 -16
  18. package/dist/hooks/useJamlLibrary.d.ts +13 -0
  19. package/dist/hooks/useMotelyRuntime.d.ts +11 -0
  20. package/dist/hooks/useSearch.d.ts +5 -6
  21. package/dist/hooks/useSearchPool.d.ts +42 -0
  22. package/dist/index.d.ts +6 -4
  23. package/dist/index.js +3320 -3989
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/hooks/useSeedAnalyzer.d.ts +10 -3
  26. package/dist/motely.d.ts +3 -1
  27. package/dist/motely.js +42 -5
  28. package/dist/motely.js.map +1 -1
  29. package/dist/motelyBoot.d.ts +13 -0
  30. package/dist/ui/jimbo.css +1 -1
  31. package/dist/ui/mascot/SeedMascot.d.ts +1 -1
  32. package/dist/ui/mascot/index.d.ts +3 -3
  33. package/dist/ui/radial/RadialBadge.d.ts +1 -1
  34. package/dist/ui/radial/RadialMenu.d.ts +1 -1
  35. package/dist/ui/radial/index.d.ts +16 -16
  36. package/dist/ui.js +1 -1
  37. package/package.json +18 -13
  38. package/assets/WeeJokerExampleDAilyGame.png +0 -0
  39. package/dist/chunks/motelyItemDecoder-HsR2riGq.js +0 -149
  40. package/dist/chunks/motelyItemDecoder-HsR2riGq.js.map +0 -1
  41. package/dist/components/JamlAnalyzerFullscreen.d.ts +0 -30
  42. package/dist/hooks/analyzerStreamRegistry.d.ts +0 -35
@@ -1,6 +1,13 @@
1
- import { Motely } from 'motely-wasm';
2
- export declare function useSeedAnalyzer(motely: typeof Motely | null, seed: string | null): {
3
- data: any;
1
+ import { Motely as MotelyNamespace } from 'motely-wasm';
2
+ type MotelyApi = typeof MotelyNamespace;
3
+ export declare function useSeedAnalyzer(motely: MotelyApi | null, seed: string | null, jaml?: string): {
4
+ data: Readonly<{
5
+ seed: string;
6
+ score: number;
7
+ tallies: Int32Array;
8
+ analysis?: import('motely-wasm/motely/analysis').MotelySeedAnalysis;
9
+ }> | null;
4
10
  loading: boolean;
5
11
  error: string | null;
6
12
  };
13
+ export {};
package/dist/motely.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- export { Motely } from './motelyBoot.js';
1
+ export { Motely, MotelyFileSystem, ensureMotelyReady, getMotelyRuntimeSnapshot, isMotelyFileSystemReady, motelyFileSystemInitError, subscribeMotelyRuntime, type MotelyRuntimeSnapshot, type MotelyRuntimeStatus, } from './motelyBoot.js';
2
2
  export { decodeMotelyItem, decodeMotelyItemToJamlCard, motelyItemTypeName, motelyItemCategory, motelyItemDisplayName, motelyItemRenderCategory, motelyItemEditionName, motelyItemSealName, motelyItemEnhancementName, motelyStandardcardRankName, motelyStandardcardSuitName, decodeMotelyItemName, resolveMotelyItemType, warmMotelyItemCache, motelyItemCacheSize, type DecodedMotelyItem, type MotelyItemInput, type MotelyJamlCard, type MotelyRenderableCategory, type MotelyRuntimeItem, } from './decode/motelyItemDecoder.js';
3
3
  export { motelyItemToSprite, getMotelySpriteByName, type MotelySpriteData, } from './decode/motelySprite.js';
4
4
  export { motelyBossDisplayName, motelyBossDisplayNameFromKey, motelyBoosterPackDisplayName, motelyBoosterPackDisplayNameFromKey, motelyItemDisplayNameFromKey, motelyItemDisplayNameFromValue, motelyTagDisplayName, motelyTagDisplayNameFromKey, motelyVoucherDisplayName, motelyVoucherDisplayNameFromKey, } from './motelyDisplay.js';
5
+ export { useJamlLibrary, type JamlLibraryStatus, type UseJamlLibraryState, } from './hooks/useJamlLibrary.js';
6
+ export { useMotelyRuntime, useMotelyRuntimeOwner, type UseMotelyRuntimeState, } from './hooks/useMotelyRuntime.js';
package/dist/motely.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { n as e } from "./chunks/assets-RWUiFSTc.js";
3
3
  import { d as t, h as n, r, t as i } from "./chunks/spriteMapper-CFjN0_TV.js";
4
- import { C as a, E as o, S as s, T as c, _ as l, a as u, b as d, c as f, d as p, f as m, g as h, h as g, i as _, l as v, m as y, n as b, o as x, p as S, r as C, s as w, t as T, u as E, v as D, w as O, x as k, y as A } from "./chunks/motelyItemDecoder-HsR2riGq.js";
4
+ import { C as a, S as o, T as s, _ as c, a as l, b as u, c as d, d as f, f as p, g as m, h, i as g, l as _, m as v, n as y, o as b, p as x, r as S, s as C, t as w, u as T, v as E, w as D, x as O, y as k } from "./chunks/motelyItemDecoder-Bg12hhB2.js";
5
5
  //#region src/decode/motelySprite.ts
6
- function j(a) {
7
- let o = T(a);
6
+ function A(a) {
7
+ let o = w(a);
8
8
  if (!o) return null;
9
9
  if (o.category === "playing" && o.rank && o.suit) {
10
10
  let r = t[o.rank], i = n[o.suit];
@@ -31,7 +31,7 @@ function j(a) {
31
31
  category: o.category
32
32
  } : null;
33
33
  }
34
- function M(a, o = "unknown") {
34
+ function j(a, o = "unknown") {
35
35
  if (o === "playing") {
36
36
  let r = /^(.*?)\s+of\s+(.*?)$/i.exec(a);
37
37
  if (r) {
@@ -61,6 +61,43 @@ function M(a, o = "unknown") {
61
61
  } : null;
62
62
  }
63
63
  //#endregion
64
- export { o as Motely, T as decodeMotelyItem, b as decodeMotelyItemName, C as decodeMotelyItemToJamlCard, M as getMotelySpriteByName, h as motelyBoosterPackDisplayName, l as motelyBoosterPackDisplayNameFromKey, D as motelyBossDisplayName, A as motelyBossDisplayNameFromKey, _ as motelyItemCacheSize, u as motelyItemCategory, x as motelyItemDisplayName, d as motelyItemDisplayNameFromKey, k as motelyItemDisplayNameFromValue, w as motelyItemEditionName, f as motelyItemEnhancementName, v as motelyItemRenderCategory, E as motelyItemSealName, j as motelyItemToSprite, p as motelyItemTypeName, m as motelyStandardcardRankName, S as motelyStandardcardSuitName, s as motelyTagDisplayName, a as motelyTagDisplayNameFromKey, O as motelyVoucherDisplayName, c as motelyVoucherDisplayNameFromKey, y as resolveMotelyItemType, g as warmMotelyItemCache };
64
+ //#region src/motelyDisplay.ts
65
+ var M = k;
66
+ function N(e, t) {
67
+ let n = e[String(t)];
68
+ return typeof n == "string" && n.length > 0 ? n : null;
69
+ }
70
+ function P(e) {
71
+ return N(M.MotelyBossBlind, e & 255) ?? `boss#${e}`;
72
+ }
73
+ function F(e) {
74
+ return e;
75
+ }
76
+ function I(e) {
77
+ return N(M.MotelyVoucher, e) ?? `voucher#${e}`;
78
+ }
79
+ function L(e) {
80
+ return e;
81
+ }
82
+ function R(e) {
83
+ return N(M.MotelyTag, e) ?? `tag#${e}`;
84
+ }
85
+ function z(e) {
86
+ return e;
87
+ }
88
+ function B(e) {
89
+ return N(M.MotelyBoosterPack, e) ?? `pack#${e}`;
90
+ }
91
+ function V(e) {
92
+ return `${e} Pack`;
93
+ }
94
+ function H(e) {
95
+ return e;
96
+ }
97
+ function U(e) {
98
+ return N(M.MotelyItemType, e & 65535) ?? `item#${e}`;
99
+ }
100
+ //#endregion
101
+ export { k as Motely, u as MotelyFileSystem, w as decodeMotelyItem, y as decodeMotelyItemName, S as decodeMotelyItemToJamlCard, O as ensureMotelyReady, o as getMotelyRuntimeSnapshot, j as getMotelySpriteByName, a as isMotelyFileSystemReady, B as motelyBoosterPackDisplayName, V as motelyBoosterPackDisplayNameFromKey, P as motelyBossDisplayName, F as motelyBossDisplayNameFromKey, D as motelyFileSystemInitError, g as motelyItemCacheSize, l as motelyItemCategory, b as motelyItemDisplayName, H as motelyItemDisplayNameFromKey, U as motelyItemDisplayNameFromValue, C as motelyItemEditionName, d as motelyItemEnhancementName, _ as motelyItemRenderCategory, T as motelyItemSealName, A as motelyItemToSprite, f as motelyItemTypeName, p as motelyStandardcardRankName, x as motelyStandardcardSuitName, R as motelyTagDisplayName, z as motelyTagDisplayNameFromKey, I as motelyVoucherDisplayName, L as motelyVoucherDisplayNameFromKey, v as resolveMotelyItemType, s as subscribeMotelyRuntime, E as useJamlLibrary, m as useMotelyRuntime, c as useMotelyRuntimeOwner, h as warmMotelyItemCache };
65
102
 
66
103
  //# sourceMappingURL=motely.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelySprite.ts"],"sourcesContent":["import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\r\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\r\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\r\nimport { resolveJamlAssetUrl } from \"../assets.js\";\r\n\r\nexport interface MotelySpriteData {\r\n atlasPath: string;\r\n gridCol: number;\r\n gridRow: number;\r\n gridCols: number;\r\n gridRows: number;\r\n displayName: string;\r\n category: MotelyRenderableCategory;\r\n}\r\n\r\n/**\r\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\r\n * resolves it to a sprite atlas path and grid coordinates for rendering.\r\n */\r\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\r\n const decoded = decodeMotelyItem(rawValue);\r\n if (!decoded) return null;\r\n\r\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\r\n const col = RANK_MAP[decoded.rank];\r\n const row = SUIT_MAP[decoded.suit];\r\n if (col !== undefined && row !== undefined) {\r\n return {\r\n atlasPath: resolveJamlAssetUrl('deck'),\r\n gridCol: col,\r\n gridRow: row,\r\n gridCols: 13,\r\n gridRows: 4,\r\n displayName: decoded.displayName,\r\n category: \"playing\"\r\n };\r\n }\r\n }\r\n\r\n const sprite = getSpriteData(decoded.displayName);\r\n if (!sprite) return null;\r\n\r\n const meta = SHEET_META[sprite.type];\r\n if (!meta) return null;\r\n\r\n return {\r\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\r\n gridCol: sprite.pos.x,\r\n gridRow: sprite.pos.y,\r\n gridCols: meta.cols,\r\n gridRows: meta.rows,\r\n displayName: decoded.displayName,\r\n category: decoded.category\r\n };\r\n}\r\n\r\n/**\r\n * Resolves a sprite by name and category without needing a Motely integer.\r\n */\r\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\r\n if (category === \"playing\") {\r\n // Attempt to parse \"Rank of Suit\"\r\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\r\n if (match) {\r\n const rank = match[1];\r\n const suit = match[2];\r\n const col = RANK_MAP[rank];\r\n const row = SUIT_MAP[suit];\r\n if (col !== undefined && row !== undefined) {\r\n return {\r\n atlasPath: resolveJamlAssetUrl('deck'),\r\n gridCol: col,\r\n gridRow: row,\r\n gridCols: 13,\r\n gridRows: 4,\r\n displayName: name,\r\n category: \"playing\"\r\n };\r\n }\r\n }\r\n }\r\n\r\n const sprite = getSpriteData(name);\r\n if (!sprite) return null;\r\n\r\n const meta = SHEET_META[sprite.type];\r\n if (!meta) return null;\r\n\r\n return {\r\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\r\n gridCol: sprite.pos.x,\r\n gridRow: sprite.pos.y,\r\n gridCols: meta.cols,\r\n gridRows: meta.rows,\r\n displayName: name,\r\n category\r\n };\r\n}\r\n"],"mappings":";;;;;AAmBA,SAAgB,EAAmB,GAA2C;CAC5E,IAAM,IAAU,EAAiB,EAAS;CAC1C,IAAI,CAAC,GAAS,OAAO;CAErB,IAAI,EAAQ,aAAa,aAAa,EAAQ,QAAQ,EAAQ,MAAM;EAClE,IAAM,IAAM,EAAS,EAAQ,OACvB,IAAM,EAAS,EAAQ;EAC7B,IAAI,MAAQ,KAAA,KAAa,MAAQ,KAAA,GAC/B,OAAO;GACL,WAAW,EAAoB,OAAO;GACtC,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa,EAAQ;GACrB,UAAU;GACX;;CAIL,IAAM,IAAS,EAAc,EAAQ,YAAY;CACjD,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAO,EAAW,EAAO;CAG/B,OAFK,IAEE;EACL,WAAW,EAAoB,EAAK,SAAS;EAC7C,SAAS,EAAO,IAAI;EACpB,SAAS,EAAO,IAAI;EACpB,UAAU,EAAK;EACf,UAAU,EAAK;EACf,aAAa,EAAQ;EACrB,UAAU,EAAQ;EACnB,GAViB;;AAgBpB,SAAgB,EAAsB,GAAc,IAAqC,WAAoC;CAC3H,IAAI,MAAa,WAAW;EAE1B,IAAM,IAAQ,wBAAwB,KAAK,EAAK;EAChD,IAAI,GAAO;GACP,IAAM,IAAO,EAAM,IACb,IAAO,EAAM,IACb,IAAM,EAAS,IACf,IAAM,EAAS;GACrB,IAAI,MAAQ,KAAA,KAAa,MAAQ,KAAA,GAC/B,OAAO;IACL,WAAW,EAAoB,OAAO;IACtC,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,UAAU;IACX;;;CAKT,IAAM,IAAS,EAAc,EAAK;CAClC,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAO,EAAW,EAAO;CAG/B,OAFK,IAEE;EACL,WAAW,EAAoB,EAAK,SAAS;EAC7C,SAAS,EAAO,IAAI;EACpB,SAAS,EAAO,IAAI;EACpB,UAAU,EAAK;EACf,UAAU,EAAK;EACf,aAAa;EACb;EACD,GAViB"}
1
+ {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelySprite.ts","../src/motelyDisplay.ts"],"sourcesContent":["import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\r\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\r\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\r\nimport { resolveJamlAssetUrl } from \"../assets.js\";\r\n\r\nexport interface MotelySpriteData {\r\n atlasPath: string;\r\n gridCol: number;\r\n gridRow: number;\r\n gridCols: number;\r\n gridRows: number;\r\n displayName: string;\r\n category: MotelyRenderableCategory;\r\n}\r\n\r\n/**\r\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\r\n * resolves it to a sprite atlas path and grid coordinates for rendering.\r\n */\r\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\r\n const decoded = decodeMotelyItem(rawValue);\r\n if (!decoded) return null;\r\n\r\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\r\n const col = RANK_MAP[decoded.rank];\r\n const row = SUIT_MAP[decoded.suit];\r\n if (col !== undefined && row !== undefined) {\r\n return {\r\n atlasPath: resolveJamlAssetUrl('deck'),\r\n gridCol: col,\r\n gridRow: row,\r\n gridCols: 13,\r\n gridRows: 4,\r\n displayName: decoded.displayName,\r\n category: \"playing\"\r\n };\r\n }\r\n }\r\n\r\n const sprite = getSpriteData(decoded.displayName);\r\n if (!sprite) return null;\r\n\r\n const meta = SHEET_META[sprite.type];\r\n if (!meta) return null;\r\n\r\n return {\r\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\r\n gridCol: sprite.pos.x,\r\n gridRow: sprite.pos.y,\r\n gridCols: meta.cols,\r\n gridRows: meta.rows,\r\n displayName: decoded.displayName,\r\n category: decoded.category\r\n };\r\n}\r\n\r\n/**\r\n * Resolves a sprite by name and category without needing a Motely integer.\r\n */\r\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\r\n if (category === \"playing\") {\r\n // Attempt to parse \"Rank of Suit\"\r\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\r\n if (match) {\r\n const rank = match[1];\r\n const suit = match[2];\r\n const col = RANK_MAP[rank];\r\n const row = SUIT_MAP[suit];\r\n if (col !== undefined && row !== undefined) {\r\n return {\r\n atlasPath: resolveJamlAssetUrl('deck'),\r\n gridCol: col,\r\n gridRow: row,\r\n gridCols: 13,\r\n gridRows: 4,\r\n displayName: name,\r\n category: \"playing\"\r\n };\r\n }\r\n }\r\n }\r\n\r\n const sprite = getSpriteData(name);\r\n if (!sprite) return null;\r\n\r\n const meta = SHEET_META[sprite.type];\r\n if (!meta) return null;\r\n\r\n return {\r\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\r\n gridCol: sprite.pos.x,\r\n gridRow: sprite.pos.y,\r\n gridCols: meta.cols,\r\n gridRows: meta.rows,\r\n displayName: name,\r\n category\r\n };\r\n}\r\n","import { Motely } from \"./motelyBoot.js\";\n\ntype RuntimeEnum = Record<string, string | number>;\ntype MotelyRuntimeEnums = typeof Motely & Record<string, RuntimeEnum>;\n\nconst MotelyEnums = Motely as MotelyRuntimeEnums;\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBossBlind, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyVoucher, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyTag, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBoosterPack, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyItemType, value & 0xffff);\n return key ?? `item#${value}`;\n}\n"],"mappings":";;;;;AAmBA,SAAgB,EAAmB,GAA2C;CAC5E,IAAM,IAAU,EAAiB,EAAS;CAC1C,IAAI,CAAC,GAAS,OAAO;CAErB,IAAI,EAAQ,aAAa,aAAa,EAAQ,QAAQ,EAAQ,MAAM;EAClE,IAAM,IAAM,EAAS,EAAQ,OACvB,IAAM,EAAS,EAAQ;EAC7B,IAAI,MAAQ,KAAA,KAAa,MAAQ,KAAA,GAC/B,OAAO;GACL,WAAW,EAAoB,OAAO;GACtC,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU;GACV,aAAa,EAAQ;GACrB,UAAU;GACX;;CAIL,IAAM,IAAS,EAAc,EAAQ,YAAY;CACjD,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAO,EAAW,EAAO;CAG/B,OAFK,IAEE;EACL,WAAW,EAAoB,EAAK,SAAS;EAC7C,SAAS,EAAO,IAAI;EACpB,SAAS,EAAO,IAAI;EACpB,UAAU,EAAK;EACf,UAAU,EAAK;EACf,aAAa,EAAQ;EACrB,UAAU,EAAQ;EACnB,GAViB;;AAgBpB,SAAgB,EAAsB,GAAc,IAAqC,WAAoC;CAC3H,IAAI,MAAa,WAAW;EAE1B,IAAM,IAAQ,wBAAwB,KAAK,EAAK;EAChD,IAAI,GAAO;GACP,IAAM,IAAO,EAAM,IACb,IAAO,EAAM,IACb,IAAM,EAAS,IACf,IAAM,EAAS;GACrB,IAAI,MAAQ,KAAA,KAAa,MAAQ,KAAA,GAC/B,OAAO;IACL,WAAW,EAAoB,OAAO;IACtC,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,UAAU;IACX;;;CAKT,IAAM,IAAS,EAAc,EAAK;CAClC,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAO,EAAW,EAAO;CAG/B,OAFK,IAEE;EACL,WAAW,EAAoB,EAAK,SAAS;EAC7C,SAAS,EAAO,IAAI;EACpB,SAAS,EAAO,IAAI;EACpB,UAAU,EAAK;EACf,UAAU,EAAK;EACf,aAAa;EACb;EACD,GAViB;;;;ACjFpB,IAAM,IAAc;AAEpB,SAAS,EACP,GACA,GACe;CACf,IAAM,IAAM,EAAW,OAAO,EAAM;CACpC,OAAO,OAAO,KAAQ,YAAY,EAAI,SAAS,IAAI,IAAM;;AAG3D,SAAgB,EAAsB,GAAuB;CAE3D,OADY,EAAe,EAAY,iBAAiB,IAAQ,IACzD,IAAO,QAAQ;;AAGxB,SAAgB,EAA6B,GAAqB;CAChE,OAAO;;AAGT,SAAgB,EAAyB,GAAuB;CAE9D,OADY,EAAe,EAAY,eAAe,EAC/C,IAAO,WAAW;;AAG3B,SAAgB,EAAgC,GAAqB;CACnE,OAAO;;AAGT,SAAgB,EAAqB,GAAuB;CAE1D,OADY,EAAe,EAAY,WAAW,EAC3C,IAAO,OAAO;;AAGvB,SAAgB,EAA4B,GAAqB;CAC/D,OAAO;;AAGT,SAAgB,EAA6B,GAAuB;CAElE,OADY,EAAe,EAAY,mBAAmB,EACnD,IAAO,QAAQ;;AAGxB,SAAgB,EAAoC,GAAqB;CACvE,OAAO,GAAG,EAAI;;AAGhB,SAAgB,EAA6B,GAAqB;CAChE,OAAO;;AAGT,SAAgB,EAA+B,GAAuB;CAEpE,OADY,EAAe,EAAY,gBAAgB,IAAQ,MACxD,IAAO,QAAQ"}
@@ -1,2 +1,15 @@
1
1
  import { Motely } from 'motely-wasm';
2
+ export type MotelyRuntimeStatus = "idle" | "booting" | "ready" | "error";
3
+ export interface MotelyRuntimeSnapshot {
4
+ status: MotelyRuntimeStatus;
5
+ error: unknown;
6
+ isFileSystemReady: boolean;
7
+ fileSystemError: unknown;
8
+ }
9
+ export declare function ensureMotelyReady(): Promise<void>;
10
+ export declare function getMotelyRuntimeSnapshot(): MotelyRuntimeSnapshot;
11
+ export declare function subscribeMotelyRuntime(listener: () => void): () => void;
12
+ export declare const MotelyFileSystem: typeof import("@rewaffle/bootsharp-file-system") | null;
13
+ export declare const motelyFileSystemInitError: unknown;
14
+ export declare const isMotelyFileSystemReady: boolean;
2
15
  export { Motely };
package/dist/ui/jimbo.css CHANGED
@@ -1,2 +1,2 @@
1
- @font-face{font-family:m6x11plus;src:url(/fonts/m6x11plus.otf)format("opentype");font-weight:400;font-style:normal;font-display:swap}*{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar{display:none!important}:root{--j-red:#fe5148;--j-blue:#0093ff;--j-green:#429f79;--j-orange:#ff9800;--j-gold:#e4b643;--j-purple:#9e74ce;--j-dark-red:#a02721;--j-dark-blue:#0057a1;--j-dark-orange:#a05b00;--j-dark-green:#215f46;--j-dark-purple:#5e437e;--j-dark-grey:#3a5055;--j-darkest:#1e2b2d;--j-grey:#708386;--j-teal-grey:#404c4e;--j-panel-edge:#1e2e32;--j-inner-border:#334461;--j-border-silver:#b9c2d2;--j-border-south:#777e89;--j-gold-text:#e4b643;--j-green-text:#35bd86;--j-orange-text:#ff8f00;--j-white:#fff;--j-black:#000;--j-tarot-btn:#9e74ce;--j-planet-btn:#00a7ca;--j-spectral-btn:#2e76fd;--j-tarot-btn-dark:#5e437e;--j-planet-btn-dark:#00657c;--j-spectral-btn-dark:#14449e;--j-font:"m6x11plus", "Courier New", monospace;--j-font-code:"JetBrains Mono", "Cascadia Code", "Fira Code", "SF Mono", SFMono-Regular, Menlo, Consolas, ui-monospace, "Courier New", monospace;--j-text-shadow:1px 1px 0 #000c;--j-space-xs:2px;--j-space-sm:4px;--j-space-md:8px;--j-space-lg:12px;--j-space-xl:16px;--j-radius-sm:4px;--j-radius-md:6px;--j-radius-lg:8px;--j-radius-pill:10px;--j-ease-bounce:cubic-bezier(.34, 1.56, .64, 1);--j-press-y:3px;--j-press-speed:55ms}.j-text{font-family:var(--j-font);text-shadow:var(--j-text-shadow);color:var(--j-white);font-weight:400;line-height:1.2}.j-text--no-shadow{text-shadow:none}.j-text--upper{text-transform:uppercase;letter-spacing:.08em}.j-text--dance-container{white-space:pre-wrap;display:inline-block}@keyframes j-font-dance{0%{transform:translateY(0)}25%{transform:translateY(-1px)}50%{transform:translateY(0)}75%{transform:translateY(1px)}to{transform:translateY(0)}}.j-text--display{letter-spacing:.04em;font-size:26px;line-height:1}.j-text--xl{letter-spacing:.04em;font-size:24px}.j-text--lg{letter-spacing:.04em;font-size:18px}.j-text--heading{letter-spacing:.08em;font-size:14px;line-height:1.2}.j-text--md{font-size:14px}.j-text--sm{font-size:12px}.j-text--body{letter-spacing:.05em;font-size:11px;line-height:1.3}.j-text--xs{font-size:10px}.j-text--label{letter-spacing:.1em;text-transform:uppercase;font-size:9px;line-height:1}.j-text--micro{letter-spacing:.08em;font-size:8px;line-height:1}.j-text--default{color:var(--j-white)}.j-text--mult,.j-text--red{color:var(--j-red)}.j-text--chips,.j-text--blue{color:var(--j-blue)}.j-text--gold{color:var(--j-gold-text)}.j-text--green{color:var(--j-green-text)}.j-text--orange{color:var(--j-orange-text)}.j-text--purple{color:var(--j-purple)}.j-text--grey{color:var(--j-grey)}.j-panel{background-color:var(--j-dark-grey);border:2px solid var(--j-border-silver);border-bottom-color:var(--j-border-south);border-radius:var(--j-radius-md);padding:var(--j-space-lg);flex-direction:column;align-items:stretch;display:flex;position:relative;overflow:visible;box-shadow:0 3px #0000008c,inset 0 0 0 1px #ffffff0a}.j-panel__body{flex:1;overflow:auto}.j-panel__back{margin-top:var(--j-space-lg);padding-top:var(--j-space-md);flex-shrink:0}.j-back-btn .j-btn__face{padding-top:8px;padding-bottom:8px}.j-inner-panel{background-color:var(--j-inner-border);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-md);padding:var(--j-space-lg)}.j-btn{appearance:none;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;padding:0;display:inline-block;position:relative}.j-btn:after{content:"";z-index:10;background:0 0;position:absolute;inset:0}.j-btn--full{width:100%}.j-btn--disabled{opacity:.55;cursor:not-allowed}.j-btn__face{border-radius:var(--j-radius-md);background:var(--j-btn-face-color,var(--j-orange));text-align:center;text-shadow:1px 1px #000c;box-shadow:0 var(--j-press-y) 0 0 #0009;transition:transform var(--j-press-speed) linear, box-shadow var(--j-press-speed) linear;position:relative;transform:translate(0)}.j-btn[data-pressed=true] .j-btn__face,.j-btn:active:not(:disabled):not(.j-btn--disabled) .j-btn__face{transform:translateY(var(--j-press-y));box-shadow:0 0 #0009}.j-btn:not(.j-btn--disabled):hover .j-btn__face{filter:brightness(1.1)}.j-btn--xs .j-btn__face{padding:4px 8px;font-size:11px}.j-btn--sm .j-btn__face{padding:6px 12px;font-size:13px}.j-btn--md .j-btn__face{padding:10px 18px;font-size:16px}.j-btn--lg .j-btn__face{padding:8px 18px;font-size:20px}.j-btn--orange{--j-btn-face-color:var(--j-orange)}.j-btn--red{--j-btn-face-color:var(--j-red)}.j-btn--blue{--j-btn-face-color:var(--j-blue)}.j-btn--green{--j-btn-face-color:var(--j-green)}.j-btn--tarot{--j-btn-face-color:var(--j-tarot-btn)}.j-btn--planet{--j-btn-face-color:var(--j-planet-btn)}.j-btn--spectral{--j-btn-face-color:var(--j-spectral-btn)}.j-badge{border-radius:var(--j-radius-sm);font-family:var(--j-font);letter-spacing:.04em;white-space:nowrap;text-shadow:1px 1px #000c;border:none;align-items:center;font-weight:400;display:inline-flex}.j-badge--sm{padding:2px 6px;font-size:10px}.j-badge--md{padding:4px 8px;font-size:12px}.j-badge--dark{background:var(--j-darkest);color:var(--j-white)}.j-badge--blue{background:var(--j-blue);color:var(--j-white)}.j-badge--red{background:var(--j-red);color:var(--j-white)}.j-badge--green{background:var(--j-green);color:var(--j-white)}.j-badge--orange{background:var(--j-orange);color:var(--j-white)}.j-badge--purple{background:var(--j-purple);color:var(--j-white)}.j-tabs{gap:var(--j-space-sm);scrollbar-width:none;flex-wrap:nowrap;justify-content:center;align-items:flex-end;width:100%;display:flex;overflow-x:auto}.j-tabs::-webkit-scrollbar{display:none}.j-tab{flex-direction:column;flex:none;align-items:center;display:flex;position:relative}.j-tab__indicator{justify-content:center;align-items:flex-end;height:10px;margin-bottom:3px;display:flex}.j-tab__indicator svg{fill:var(--j-red);display:block}.j-tab__indicator[data-active=true]{animation:.6s ease-in-out infinite jimbo-bounce}.j-tab__indicator[data-active=false]{visibility:hidden}.j-tab__btn{appearance:none;cursor:pointer;border-radius:var(--j-radius-md);background:var(--j-red);min-height:28px;color:var(--j-white);text-align:center;text-shadow:1px 1px #000c;border:none;outline:none;padding:6px 14px;transition:filter 80ms linear,opacity 80ms linear;box-shadow:0 3px #0009}.j-tab__btn[data-active=true]{opacity:1}.j-tab__btn[data-active=true]:hover{background:var(--j-red)}.j-tab__btn[data-active=false]:hover{background:var(--j-red);filter:brightness(1.08)}@keyframes jimbo-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}.j-vtabs{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-vtab{cursor:pointer;writing-mode:vertical-rl;text-orientation:mixed;background-color:#0000;border:none;border-radius:8px 0 0 8px;padding:16px 8px;transition:none;transform:rotate(180deg)}.j-vtab[data-active=true]{background-color:var(--j-gold,#e4b643);color:var(--j-black,#000)}.j-toggle-list{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-toggle-list__title{font-family:var(--j-font);color:var(--j-grey);text-transform:uppercase;letter-spacing:.04em;margin-bottom:var(--j-space-sm);font-size:12px}.j-toggle-item{align-items:center;gap:var(--j-space-md);border-radius:var(--j-radius-sm);cursor:pointer;font-family:var(--j-font);color:var(--j-white);text-transform:uppercase;letter-spacing:.04em;text-align:left;background:#ffffff0d;border:1px solid #0003;justify-content:flex-start;padding:6px 8px;display:flex}.j-toggle-check{border:1px solid var(--j-dark-grey);flex-shrink:0;width:10px;height:10px;box-shadow:inset 0 1px 2px #00000080}.j-toggle-check[data-on=true]{background:var(--j-orange)}.j-toggle-check[data-on=false]{background:var(--j-darkest)}.j-tooltip{border-radius:var(--j-radius-md);background:var(--j-darkest);border:2px solid var(--j-border-silver);max-width:280px;color:var(--j-white);pointer-events:none;z-index:9999;padding:6px 10px;transition:opacity .12s;position:fixed;box-shadow:0 2px #000c}.j-items-start{align-items:flex-start}.j-justify-between{justify-content:space-between}.j-h-full{height:100%}.j-flank{justify-content:center;align-items:stretch;gap:var(--j-space-md);width:100%;display:flex;position:relative}.j-flank__content{flex-direction:column;flex:1;min-width:0;display:flex;position:relative}.j-flank__btn{width:40px;margin:var(--j-press-y) 0;border-radius:var(--j-radius-lg);cursor:pointer;background-color:var(--j-red);color:var(--j-white);text-shadow:1px 1px #000c;box-shadow:0 var(--j-press-y) 0 0 var(--j-dark-red);transition:transform var(--j-press-speed) ease, box-shadow var(--j-press-speed) ease, background-color var(--j-press-speed) ease;border:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.j-flank__btn:disabled{background-color:var(--j-dark-red);cursor:default;box-shadow:none}.j-copy-row{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-copy-row__field{align-items:center;gap:var(--j-space-md);display:flex}.j-copy-row__value{background:var(--j-darkest);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-sm);word-break:break-all;flex:1;padding:6px 10px}.j-copy-row__btn{font-family:var(--j-font);letter-spacing:.08em;border-radius:var(--j-radius-sm);cursor:pointer;flex-shrink:0;padding:4px 12px;font-size:11px;transition:color .15s,background .15s,border-color .15s}.j-copy-row__btn[data-copied=false]{color:var(--j-gold-text);border:1px solid var(--j-gold-text);background:#e4b6431f}.j-copy-row__btn[data-copied=true]{color:var(--j-green-text);border:1px solid var(--j-green-text);background:#35bd861f}.j-code-block{background-color:var(--j-darkest);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-lg);flex-direction:column;display:flex;overflow:hidden;box-shadow:0 3px #00000080}.j-code-block__header{border-bottom:1px solid var(--j-inner-border);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.j-code-block__meta{align-items:center;gap:8px;display:flex}.j-code-block__filename{opacity:.6;font-size:10px}.j-code-block__lang{color:#60a5fa;background:#0006;border-radius:3px;padding:1px 6px;font-size:9px}.j-code-block__copy{cursor:pointer;background:0 0;border:none;padding:4px;display:flex}.j-code-block__copy[data-copied=false]{color:#ffffff80}.j-code-block__copy[data-copied=true]{color:#4ade80}.j-code-block__pre{font-family:var(--j-font-code);color:#f6f0d5;margin:0;padding:12px;font-size:.875rem;line-height:1.6;overflow-x:auto}.j-filter-bar{padding:var(--j-space-xl);background-color:var(--j-dark-grey);border:4px solid var(--j-border-silver);box-shadow:0 3px 0 0 var(--j-border-south);border-radius:var(--j-radius-lg);flex-wrap:wrap;gap:24px;display:flex;position:relative}.j-filter-bar__field{flex:1;min-width:200px;margin-top:10px;position:relative}.j-filter-bar__pill{background-color:var(--j-red);border:2px solid var(--j-dark-red);border-radius:var(--j-radius-md);z-index:2;padding:4px 12px;position:absolute;top:-14px;left:16px}.j-filter-bar__input{background-color:var(--j-darkest);border:none;border-bottom:4px solid var(--j-panel-edge);border-radius:var(--j-radius-lg);width:100%;color:var(--j-white);font-family:var(--j-font);letter-spacing:.08em;outline:none;padding:14px 16px 14px 48px;font-size:20px}.j-filter-bar__search-icon{pointer-events:none;width:48px;color:var(--j-blue);z-index:1;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0}.j-filter-bar__select{appearance:none;background-color:var(--j-orange);color:var(--j-white);border:none;border-bottom:4px solid var(--j-dark-orange);border-radius:var(--j-radius-lg);cursor:pointer;font-family:var(--j-font);letter-spacing:.08em;text-align:center;outline:none;min-width:200px;padding:14px 48px 14px 24px;font-size:18px}.j-filter-bar__sort-icon{pointer-events:none;color:var(--j-white);opacity:.85;position:absolute;top:50%;right:16px;transform:translateY(-50%)}.j-flank{justify-content:center;align-items:center;gap:var(--j-space-md);width:100%;display:flex}.j-flank__content{flex:1;justify-content:center;display:flex}.j-flank__btn{background:var(--j-red);color:var(--j-white);border-radius:var(--j-radius-sm);padding:var(--j-space-sm) var(--j-space-xs);cursor:pointer;box-shadow:0 var(--j-press-y) 0 var(--j-dark-grey);border:none;justify-content:center;align-items:center;transition:transform 50ms,box-shadow 50ms,opacity .2s;display:flex}.j-flank__btn[data-pressed=true]{transform:translateY(var(--j-press-y));box-shadow:0 0 0 var(--j-dark-grey)}.j-flank__btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:0 var(--j-press-y) 0 var(--j-dark-grey);transform:none}@keyframes jimbo-modal-in{0%{opacity:0;transform:scale(.88)}to{opacity:1;transform:scale(1)}}.j-modal-overlay{z-index:1000;padding:var(--j-space-md);background:#000000d1;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.j-modal{border-radius:12px;flex-direction:column;width:100%;max-width:345px;max-height:calc(100% - 32px);animation:.14s cubic-bezier(.2,0,.2,1.4) both jimbo-modal-in;display:flex;overflow:hidden}.j-modal .j-panel__body{min-height:0;overflow-y:auto}.j-modal__title{text-align:center;margin:0 0 var(--j-space-xl);flex-shrink:0}.j-footer{z-index:9998;pointer-events:auto;width:100%;position:fixed;bottom:0;left:0;right:0}.j-footer__bar{text-align:center;background:#000000e6;border-top:1px solid #ffffff1a;width:100%;padding:0 1rem 3px}.j-footer__text{font-family:var(--j-font);color:#fff;flex-wrap:wrap;justify-content:center;align-items:center;gap:0 .5rem;margin:0;font-size:clamp(11px,.8vw + 8px,14px);display:flex}.j-footer__link{color:var(--j-gold);text-decoration:none}.j-floating{z-index:20;position:absolute}.j-glow--must{box-shadow:0 0 0 2px var(--j-blue), 0 0 10px var(--j-blue);animation:1.6s ease-in-out infinite j-glow-pulse}.j-glow--should{box-shadow:0 0 0 2px var(--j-gold), 0 0 10px var(--j-gold);animation:1.6s ease-in-out infinite j-glow-pulse}@keyframes j-glow-pulse{0%,to{opacity:.55}50%{opacity:1}}.j-flex{display:flex}.j-flex-col{flex-direction:column;display:flex}.j-flex-wrap{flex-wrap:wrap}.j-items-center{align-items:center}.j-justify-center{justify-content:center}.j-gap-xs{gap:var(--j-space-xs)}.j-gap-sm{gap:var(--j-space-sm)}.j-gap-md{gap:var(--j-space-md)}.j-gap-lg{gap:var(--j-space-lg)}.j-gap-xl{gap:var(--j-space-xl)}.j-w-full{width:100%}.j-shrink-0{flex-shrink:0}.j-flex-1{flex:1}.j-min-w-0{min-width:0}.j-text-center{text-align:center}.j-overflow-hidden{overflow:hidden}.j-overflow-auto{overflow:auto}.j-relative{position:relative}.j-border--red{border-color:var(--j-red)}.j-border--blue{border-color:var(--j-blue)}.j-border--green{border-color:var(--j-green)}.j-border--gold{border-color:var(--j-gold)}.j-border--orange{border-color:var(--j-orange)}.j-border--purple{border-color:var(--j-purple)}.j-bg--red{background-color:var(--j-red)}.j-bg--blue{background-color:var(--j-blue)}.j-bg--green{background-color:var(--j-green)}.j-bg--gold{background-color:var(--j-gold)}.j-bg--orange{background-color:var(--j-orange)}.j-bg--purple{background-color:var(--j-purple)}.j-bg--dark-grey{background-color:var(--j-dark-grey)}.j-bg--darkest{background-color:var(--j-darkest)}.j-app{background:var(--j-darkest);width:375px;max-width:375px;height:667px;max-height:667px;font-family:var(--j-font);color:var(--j-white);flex-direction:column;margin:0 auto;display:flex;position:relative;overflow:hidden;container:jimbo/inline-size}.j-app--fluid{width:100%;max-width:750px;height:auto;min-height:400px;max-height:none}.j-app__content{min-height:0;padding:var(--j-space-lg) var(--j-space-lg) var(--j-space-md);flex-direction:column;flex:1;display:flex;overflow:hidden}.j-app__scroll{min-height:0;padding:var(--j-space-lg) var(--j-space-lg) var(--j-space-md);scrollbar-width:none;-ms-overflow-style:none;flex:1;overflow:hidden auto}.j-app__scroll::-webkit-scrollbar{display:none}.j-app__footer{padding:var(--j-space-md) var(--j-space-lg) var(--j-space-md);border-top:2px solid var(--j-black);background:var(--j-dark-grey);gap:var(--j-space-sm);flex-direction:column;flex-shrink:0;display:flex}@container jimbo (width>=401px){.j-app__content,.j-app__scroll{padding:var(--j-space-xl) var(--j-space-xl) var(--j-space-lg)}.j-app__footer{padding:var(--j-space-md) var(--j-space-xl) var(--j-space-lg)}.j-stat-grid__value{font-size:20px}.j-info-card{padding:var(--j-space-md) var(--j-space-lg)}.j-info-card__title{font-size:14px}.j-section-header__tag{font-size:12px}}.j-section-header{align-items:center;gap:var(--j-space-md);margin-bottom:var(--j-space-md);display:flex}.j-section-header__tag{font-family:var(--j-font);letter-spacing:2px;color:var(--j-white);text-shadow:var(--j-text-shadow);border-radius:3px;flex-shrink:0;padding:2px 8px;font-size:11px}.j-section-header__rule{opacity:.33;border-radius:1px;flex:1;height:2px}.j-stat-grid{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);gap:var(--j-space-md);text-align:center;grid-template-columns:1fr 1fr 1fr;display:grid}.j-stat-grid__value{font-family:var(--j-font);color:var(--j-gold-text);text-shadow:var(--j-text-shadow);font-size:16px}.j-stat-grid__label{font-family:var(--j-font);color:var(--j-grey);letter-spacing:2px;margin-top:2px;font-size:9px}.j-info-card{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md);box-shadow:0 2px 0 var(--j-black);align-items:center;gap:var(--j-space-md);cursor:pointer;border:2px solid #0000;display:flex}.j-info-card:hover{filter:brightness(1.08)}.j-info-card__body{flex:1;min-width:0}.j-info-card__title{font-family:var(--j-font);color:var(--j-white);letter-spacing:1px;text-shadow:var(--j-text-shadow);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.j-info-card__sub{font-family:var(--j-font);color:var(--j-gold-text);letter-spacing:1px;margin-top:2px;font-size:9px}.j-info-card__aside{text-align:right;flex-shrink:0}.j-inset{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md) var(--j-space-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);font-family:var(--j-font);color:var(--j-grey);letter-spacing:1px;font-size:11px;line-height:1.7}.j-wordmark{text-align:center;margin-bottom:var(--j-space-xl)}.j-wordmark__title{font-family:var(--j-font);letter-spacing:3px;color:var(--j-gold-text);text-shadow:2px 2px #000c;font-size:32px;line-height:1}.j-wordmark__sub{font-family:var(--j-font);letter-spacing:4px;color:var(--j-grey);text-shadow:var(--j-text-shadow);margin-top:4px;font-size:14px}.j-seed-input{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-seed-input__field{border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);background:var(--j-darkest);width:100%;color:var(--j-gold-text);font-size:18px;font-family:var(--j-font);letter-spacing:.12em;text-transform:uppercase;text-shadow:var(--j-text-shadow);box-sizing:border-box;outline:none;padding:8px 12px;font-weight:400;transition:border-color .1s}.j-seed-input__field::placeholder{color:var(--j-grey);opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:12px}.j-seed-input__field:focus{border-color:var(--j-gold)}.j-seed-input__field[data-valid=true]{border-color:var(--j-green)}.j-seed-input__field[data-valid=false]{border-color:var(--j-red)}.j-seed-input__field[data-valid=partial]{border-color:var(--j-panel-edge)}.j-seed-input__hint{font-family:var(--j-font);letter-spacing:.08em;color:var(--j-grey);text-shadow:var(--j-text-shadow);font-size:9px}.j-aesthetic-selector{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-aesthetic-selector__list{gap:var(--j-space-sm);flex-wrap:wrap;display:flex}.j-aesthetic-pill{border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);background:var(--j-darkest);color:var(--j-grey);cursor:pointer;font-size:11px;font-family:var(--j-font);letter-spacing:.04em;text-shadow:var(--j-text-shadow);padding:4px 10px;font-weight:400;transition:border-color .1s,background .1s,color .1s;box-shadow:0 2px #0000004d}.j-aesthetic-pill:hover{border-color:var(--j-gold);color:var(--j-gold-text)}.j-aesthetic-pill[data-active=true]{border-color:var(--j-gold);color:var(--j-gold-text);box-shadow:0 0 0 1px var(--j-gold), 0 2px 0 0 #0000004d;background:#e4b64321}.j-showcase{background:var(--j-darkest);width:100%;height:100%;font-family:var(--j-font);color:var(--j-white);flex-direction:column;display:flex;overflow:hidden}.j-showcase__scroll{flex:1;min-height:0;padding:18px 14px 10px;overflow-y:auto}.j-showcase__wordmark{text-align:center;margin-bottom:18px}.j-showcase__wordmark-title{letter-spacing:3px;color:var(--j-gold-text);text-shadow:2px 2px #000c;font-size:32px;line-height:1}.j-showcase__wordmark-sub{letter-spacing:4px;color:var(--j-grey);text-shadow:var(--j-text-shadow);margin-top:4px;font-size:14px}.j-showcase__stats{background:var(--j-dark-grey);border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);gap:var(--j-space-md);text-align:center;margin-bottom:var(--j-space-xl);grid-template-columns:1fr 1fr 1fr;padding:10px;display:grid}.j-showcase__stat-value{color:var(--j-gold-text);text-shadow:var(--j-text-shadow);font-size:16px}.j-showcase__stat-label{color:var(--j-grey);letter-spacing:2px;margin-top:2px;font-size:9px}.j-showcase__section-header{align-items:center;gap:var(--j-space-md);margin-bottom:var(--j-space-md);display:flex}.j-showcase__section-tag{letter-spacing:2px;color:var(--j-white);text-shadow:var(--j-text-shadow);border-radius:3px;padding:2px 8px;font-size:11px}.j-showcase__section-rule{border-radius:1px;flex:1;height:2px}.j-showcase__filter-list{gap:var(--j-space-md);margin-bottom:var(--j-space-xl);flex-direction:column;display:flex}.j-showcase__filter-card{background:var(--j-dark-grey);border-radius:var(--j-radius-md);box-shadow:0 2px 0 var(--j-black);cursor:pointer;align-items:center;gap:10px;padding:10px;display:flex}.j-showcase__filter-sprites{gap:2px;display:flex}.j-showcase__filter-sprite{justify-content:center;align-items:center;width:30px;height:40px;display:flex}.j-showcase__filter-info{flex:1;min-width:0}.j-showcase__filter-name{color:var(--j-white);letter-spacing:1px;text-shadow:var(--j-text-shadow);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.j-showcase__filter-author{color:var(--j-gold-text);letter-spacing:1px;margin-top:2px;font-size:9px}.j-showcase__filter-hits{text-align:right}.j-showcase__filter-hits-value{text-shadow:var(--j-text-shadow);font-size:14px}.j-showcase__filter-hits-label{color:var(--j-grey);letter-spacing:1px;font-size:8px}.j-showcase__recent{background:var(--j-dark-grey);border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);color:var(--j-grey);letter-spacing:1px;padding:8px 10px;font-size:11px;line-height:1.7}.j-showcase__actions{border-top:2px solid var(--j-black);background:var(--j-dark-grey);flex-direction:column;gap:6px;padding:8px 10px 10px;display:flex}.j-footer__suits{align-items:center;display:inline-flex}.j-footer__suit-stage{vertical-align:middle;width:1.5em;height:1em;display:inline-block;position:relative}.j-footer__suit-char{opacity:0;justify-content:center;align-items:center;animation-duration:5s;animation-timing-function:ease-out;animation-iteration-count:infinite;animation-delay:0s;display:inline-flex;position:absolute;inset:0}.j-copy-row__label{letter-spacing:2px}.j-motely-badge{align-items:center;gap:6px;display:inline-flex}.j-motely-badge--chip{border-radius:var(--j-radius-sm);background:var(--j-darkest);border:1px solid var(--j-panel-edge);padding:3px 8px}.j-text--dance-container{display:inline-flex}.j-font-dance-char{animation:3s ease-in-out infinite j-font-dance;display:inline-block}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{display:none}.j-juice-hover{transition:transform .2s cubic-bezier(.175,.885,.32,1.275)}.j-juice-hover:hover{z-index:5;transform:scale(1.05)translateY(-2px)}
1
+ @font-face{font-family:m6x11plus;src:url(/fonts/m6x11plus.otf)format("opentype");font-weight:400;font-style:normal;font-display:swap}*{scrollbar-width:none!important;-ms-overflow-style:none!important}::-webkit-scrollbar{display:none!important}:root{--j-red:#fe5148;--j-blue:#0093ff;--j-green:#429f79;--j-orange:#ff9800;--j-gold:#e4b643;--j-purple:#9e74ce;--j-dark-red:#a02721;--j-dark-blue:#0057a1;--j-dark-orange:#a05b00;--j-dark-green:#215f46;--j-dark-purple:#5e437e;--j-dark-grey:#3a5055;--j-darkest:#1e2b2d;--j-grey:#708386;--j-teal-grey:#404c4e;--j-panel-edge:#1e2e32;--j-inner-border:#334461;--j-border-silver:#b9c2d2;--j-border-south:#777e89;--j-gold-text:#e4b643;--j-green-text:#35bd86;--j-orange-text:#ff8f00;--j-white:#fff;--j-black:#000;--j-tarot-btn:#9e74ce;--j-planet-btn:#00a7ca;--j-spectral-btn:#2e76fd;--j-tarot-btn-dark:#5e437e;--j-planet-btn-dark:#00657c;--j-spectral-btn-dark:#14449e;--j-font:"m6x11plus", "Courier New", monospace;--j-font-code:"JetBrains Mono", "Cascadia Code", "Fira Code", "SF Mono", SFMono-Regular, Menlo, Consolas, ui-monospace, "Courier New", monospace;--j-text-shadow:1px 1px 0 #000c;--j-space-xs:2px;--j-space-sm:4px;--j-space-md:8px;--j-space-lg:12px;--j-space-xl:16px;--j-radius-sm:4px;--j-radius-md:6px;--j-radius-lg:8px;--j-radius-pill:10px;--j-ease-bounce:cubic-bezier(.34, 1.56, .64, 1);--j-press-y:3px;--j-press-speed:55ms}.j-text{font-family:var(--j-font);text-shadow:var(--j-text-shadow);color:var(--j-white);font-weight:400;line-height:1.2}.j-text--no-shadow{text-shadow:none}.j-text--upper{text-transform:uppercase;letter-spacing:.08em}.j-text--dance-container{white-space:pre-wrap;display:inline-block}@keyframes j-font-dance{0%{transform:translateY(0)}25%{transform:translateY(-1px)}50%{transform:translateY(0)}75%{transform:translateY(1px)}to{transform:translateY(0)}}.j-text--display{letter-spacing:.04em;font-size:26px;line-height:1}.j-text--xl{letter-spacing:.04em;font-size:24px}.j-text--lg{letter-spacing:.04em;font-size:18px}.j-text--heading{letter-spacing:.08em;font-size:14px;line-height:1.2}.j-text--md{font-size:14px}.j-text--sm{font-size:12px}.j-text--body{letter-spacing:.05em;font-size:11px;line-height:1.3}.j-text--xs{font-size:10px}.j-text--label{letter-spacing:.1em;text-transform:uppercase;font-size:9px;line-height:1}.j-text--micro{letter-spacing:.08em;font-size:8px;line-height:1}.j-text--default{color:var(--j-white)}.j-text--mult,.j-text--red{color:var(--j-red)}.j-text--chips,.j-text--blue{color:var(--j-blue)}.j-text--gold{color:var(--j-gold-text)}.j-text--green{color:var(--j-green-text)}.j-text--orange{color:var(--j-orange-text)}.j-text--purple{color:var(--j-purple)}.j-text--grey{color:var(--j-grey)}.j-panel{background-color:var(--j-dark-grey);border:2px solid var(--j-border-silver);border-bottom-color:var(--j-border-south);border-radius:var(--j-radius-md);padding:var(--j-space-lg);flex-direction:column;align-items:stretch;display:flex;position:relative;overflow:visible;box-shadow:0 3px #0000008c,inset 0 0 0 1px #ffffff0a}.j-panel__body{flex:1;overflow:auto}.j-panel__back{margin-top:var(--j-space-lg);padding-top:var(--j-space-md);flex-shrink:0}.j-back-btn .j-btn__face{padding-top:8px;padding-bottom:8px}.j-inner-panel{background-color:var(--j-inner-border);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-md);padding:var(--j-space-lg)}.j-btn{appearance:none;cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;padding:0;display:inline-block;position:relative}.j-btn:after{content:"";z-index:10;background:0 0;position:absolute;inset:0}.j-btn--full{width:100%}.j-btn--disabled{opacity:.55;cursor:not-allowed}.j-btn__face{border-radius:var(--j-radius-md);background:var(--j-btn-face-color,var(--j-orange));text-align:center;text-shadow:1px 1px #000c;box-shadow:0 var(--j-press-y) 0 0 #0009;transition:transform var(--j-press-speed) linear, box-shadow var(--j-press-speed) linear;position:relative;transform:translate(0)}.j-btn[data-pressed=true] .j-btn__face,.j-btn:active:not(:disabled):not(.j-btn--disabled) .j-btn__face{transform:translateY(var(--j-press-y));box-shadow:0 0 #0009}.j-btn:not(.j-btn--disabled):hover .j-btn__face{filter:brightness(1.1)}.j-btn--xs .j-btn__face{padding:4px 8px;font-size:11px}.j-btn--sm .j-btn__face{padding:6px 12px;font-size:13px}.j-btn--md .j-btn__face{padding:10px 18px;font-size:16px}.j-btn--lg .j-btn__face{padding:8px 18px;font-size:20px}.j-btn--orange{--j-btn-face-color:var(--j-orange)}.j-btn--red{--j-btn-face-color:var(--j-red)}.j-btn--blue{--j-btn-face-color:var(--j-blue)}.j-btn--green{--j-btn-face-color:var(--j-green)}.j-btn--tarot{--j-btn-face-color:var(--j-tarot-btn)}.j-btn--planet{--j-btn-face-color:var(--j-planet-btn)}.j-btn--spectral{--j-btn-face-color:var(--j-spectral-btn)}.j-badge{border-radius:var(--j-radius-sm);font-family:var(--j-font);letter-spacing:.04em;white-space:nowrap;text-shadow:1px 1px #000c;border:none;align-items:center;font-weight:400;display:inline-flex}.j-badge--sm{padding:2px 6px;font-size:10px}.j-badge--md{padding:4px 8px;font-size:12px}.j-badge--dark{background:var(--j-darkest);color:var(--j-white)}.j-badge--blue{background:var(--j-blue);color:var(--j-white)}.j-badge--red{background:var(--j-red);color:var(--j-white)}.j-badge--green{background:var(--j-green);color:var(--j-white)}.j-badge--orange{background:var(--j-orange);color:var(--j-white)}.j-badge--purple{background:var(--j-purple);color:var(--j-white)}.j-tabs{gap:var(--j-space-sm);scrollbar-width:none;flex-wrap:nowrap;justify-content:center;align-items:flex-end;width:100%;display:flex;overflow-x:auto}.j-tabs::-webkit-scrollbar{display:none}.j-tab{flex-direction:column;flex:none;align-items:center;display:flex;position:relative}.j-tab__indicator{justify-content:center;align-items:flex-end;height:10px;margin-bottom:3px;display:flex}.j-tab__indicator svg{fill:var(--j-red);display:block}.j-tab__indicator[data-active=true]{animation:.6s linear infinite jimbo-bounce}.j-tab__indicator[data-active=false]{visibility:hidden}.j-tab__btn{appearance:none;cursor:pointer;border-radius:var(--j-radius-md);background:var(--j-red);min-height:28px;color:var(--j-white);text-align:center;text-shadow:1px 1px #000c;border:none;outline:none;padding:6px 14px;transition:filter 80ms linear,opacity 80ms linear;box-shadow:0 3px #0009}.j-tab__btn[data-active=true]{opacity:1}.j-tab__btn[data-active=true]:hover{background:var(--j-red)}.j-tab__btn[data-active=false]:hover{background:var(--j-red);filter:brightness(1.08)}@keyframes jimbo-bounce{0%,15%{transform:translateY(0)}50%{transform:translateY(-3px)}85%,to{transform:translateY(0)}}.j-vtabs{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-vtab{cursor:pointer;writing-mode:vertical-rl;text-orientation:mixed;background-color:#0000;border:none;border-radius:8px 0 0 8px;padding:16px 8px;transition:none;transform:rotate(180deg)}.j-vtab[data-active=true]{background-color:var(--j-gold,#e4b643);color:var(--j-black,#000)}.j-toggle-list{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-toggle-list__title{font-family:var(--j-font);color:var(--j-grey);text-transform:uppercase;letter-spacing:.04em;margin-bottom:var(--j-space-sm);font-size:12px}.j-toggle-item{align-items:center;gap:var(--j-space-md);border-radius:var(--j-radius-sm);cursor:pointer;font-family:var(--j-font);color:var(--j-white);text-transform:uppercase;letter-spacing:.04em;text-align:left;background:#ffffff0d;border:1px solid #0003;justify-content:flex-start;padding:6px 8px;display:flex}.j-toggle-check{border:1px solid var(--j-dark-grey);flex-shrink:0;width:10px;height:10px;box-shadow:inset 0 1px 2px #00000080}.j-toggle-check[data-on=true]{background:var(--j-orange)}.j-toggle-check[data-on=false]{background:var(--j-darkest)}.j-tooltip{border-radius:var(--j-radius-md);background:var(--j-darkest);border:2px solid var(--j-border-silver);max-width:280px;color:var(--j-white);pointer-events:none;z-index:9999;padding:6px 10px;transition:opacity .12s;position:fixed;box-shadow:0 2px #000c}.j-items-start{align-items:flex-start}.j-justify-between{justify-content:space-between}.j-h-full{height:100%}.j-flank{justify-content:center;align-items:stretch;gap:var(--j-space-md);width:100%;display:flex;position:relative}.j-flank__content{flex-direction:column;flex:1;min-width:0;display:flex;position:relative}.j-flank__btn{width:40px;margin:var(--j-press-y) 0;border-radius:var(--j-radius-lg);cursor:pointer;background-color:var(--j-red);color:var(--j-white);text-shadow:1px 1px #000c;box-shadow:0 var(--j-press-y) 0 0 var(--j-dark-red);transition:transform var(--j-press-speed) ease, box-shadow var(--j-press-speed) ease, background-color var(--j-press-speed) ease;border:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.j-flank__btn:disabled{background-color:var(--j-dark-red);cursor:default;box-shadow:none}.j-copy-row{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-copy-row__field{align-items:center;gap:var(--j-space-md);display:flex}.j-copy-row__value{background:var(--j-darkest);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-sm);word-break:break-all;flex:1;padding:6px 10px}.j-copy-row__btn{font-family:var(--j-font);letter-spacing:.08em;border-radius:var(--j-radius-sm);cursor:pointer;flex-shrink:0;padding:4px 12px;font-size:11px;transition:color .15s,background .15s,border-color .15s}.j-copy-row__btn[data-copied=false]{color:var(--j-gold-text);border:1px solid var(--j-gold-text);background:#e4b6431f}.j-copy-row__btn[data-copied=true]{color:var(--j-green-text);border:1px solid var(--j-green-text);background:#35bd861f}.j-code-block{background-color:var(--j-darkest);border:2px solid var(--j-panel-edge);border-radius:var(--j-radius-lg);flex-direction:column;display:flex;overflow:hidden;box-shadow:0 3px #00000080}.j-code-block__header{border-bottom:1px solid var(--j-inner-border);justify-content:space-between;align-items:center;padding:8px 12px;display:flex}.j-code-block__meta{align-items:center;gap:8px;display:flex}.j-code-block__filename{opacity:.6;font-size:10px}.j-code-block__lang{color:#60a5fa;background:#0006;border-radius:3px;padding:1px 6px;font-size:9px}.j-code-block__copy{cursor:pointer;background:0 0;border:none;padding:4px;display:flex}.j-code-block__copy[data-copied=false]{color:#ffffff80}.j-code-block__copy[data-copied=true]{color:#4ade80}.j-code-block__pre{font-family:var(--j-font-code);color:#f6f0d5;margin:0;padding:12px;font-size:.875rem;line-height:1.6;overflow-x:auto}.j-filter-bar{padding:var(--j-space-xl);background-color:var(--j-dark-grey);border:4px solid var(--j-border-silver);box-shadow:0 3px 0 0 var(--j-border-south);border-radius:var(--j-radius-lg);flex-wrap:wrap;gap:24px;display:flex;position:relative}.j-filter-bar__field{flex:1;min-width:200px;margin-top:10px;position:relative}.j-filter-bar__pill{background-color:var(--j-red);border:2px solid var(--j-dark-red);border-radius:var(--j-radius-md);z-index:2;padding:4px 12px;position:absolute;top:-14px;left:16px}.j-filter-bar__input{background-color:var(--j-darkest);border:none;border-bottom:4px solid var(--j-panel-edge);border-radius:var(--j-radius-lg);width:100%;color:var(--j-white);font-family:var(--j-font);letter-spacing:.08em;outline:none;padding:14px 16px 14px 48px;font-size:20px}.j-filter-bar__search-icon{pointer-events:none;width:48px;color:var(--j-blue);z-index:1;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0}.j-filter-bar__select{appearance:none;background-color:var(--j-orange);color:var(--j-white);border:none;border-bottom:4px solid var(--j-dark-orange);border-radius:var(--j-radius-lg);cursor:pointer;font-family:var(--j-font);letter-spacing:.08em;text-align:center;outline:none;min-width:200px;padding:14px 48px 14px 24px;font-size:18px}.j-filter-bar__sort-icon{pointer-events:none;color:var(--j-white);opacity:.85;position:absolute;top:50%;right:16px;transform:translateY(-50%)}.j-flank{justify-content:center;align-items:center;gap:var(--j-space-md);width:100%;display:flex}.j-flank__content{flex:1;justify-content:center;display:flex}.j-flank__btn{background:var(--j-red);color:var(--j-white);border-radius:var(--j-radius-sm);padding:var(--j-space-sm) var(--j-space-xs);cursor:pointer;box-shadow:0 var(--j-press-y) 0 var(--j-dark-grey);border:none;justify-content:center;align-items:center;transition:transform 50ms,box-shadow 50ms,opacity .2s;display:flex}.j-flank__btn[data-pressed=true]{transform:translateY(var(--j-press-y));box-shadow:0 0 0 var(--j-dark-grey)}.j-flank__btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:0 var(--j-press-y) 0 var(--j-dark-grey);transform:none}@keyframes jimbo-modal-in{0%{opacity:0;transform:scale(.88)}to{opacity:1;transform:scale(1)}}.j-modal-overlay{z-index:1000;padding:var(--j-space-md);background:#000000d1;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.j-modal{border-radius:12px;flex-direction:column;width:100%;max-width:345px;max-height:calc(100% - 32px);animation:.14s cubic-bezier(.2,0,.2,1.4) both jimbo-modal-in;display:flex;overflow:hidden}.j-modal .j-panel__body{min-height:0;overflow-y:auto}.j-modal__title{text-align:center;margin:0 0 var(--j-space-xl);flex-shrink:0}.j-footer{z-index:9998;pointer-events:auto;width:100%;position:fixed;bottom:0;left:0;right:0}.j-footer__bar{text-align:center;background:#000000e6;border-top:1px solid #ffffff1a;width:100%;padding:0 1rem 3px}.j-footer__text{font-family:var(--j-font);color:#fff;flex-wrap:wrap;justify-content:center;align-items:center;gap:0 .5rem;margin:0;font-size:clamp(11px,.8vw + 8px,14px);display:flex}.j-footer__link{color:var(--j-gold);text-decoration:none}.j-floating{z-index:20;position:absolute}.j-glow--must{box-shadow:0 0 0 2px var(--j-blue), 0 0 10px var(--j-blue);animation:1.6s ease-in-out infinite j-glow-pulse}.j-glow--should{box-shadow:0 0 0 2px var(--j-gold), 0 0 10px var(--j-gold);animation:1.6s ease-in-out infinite j-glow-pulse}.j-glow--match{box-shadow:0 0 0 2px var(--j-green-text), 0 0 18px var(--j-green-text), 0 0 36px var(--j-green-text);animation:1.6s ease-in-out infinite j-glow-pulse}@keyframes j-glow-pulse{0%,to{opacity:.55}50%{opacity:1}}.j-flex{display:flex}.j-flex-col{flex-direction:column;display:flex}.j-flex-wrap{flex-wrap:wrap}.j-items-center{align-items:center}.j-justify-center{justify-content:center}.j-gap-xs{gap:var(--j-space-xs)}.j-gap-sm{gap:var(--j-space-sm)}.j-gap-md{gap:var(--j-space-md)}.j-gap-lg{gap:var(--j-space-lg)}.j-gap-xl{gap:var(--j-space-xl)}.j-w-full{width:100%}.j-shrink-0{flex-shrink:0}.j-flex-1{flex:1}.j-min-w-0{min-width:0}.j-text-center{text-align:center}.j-overflow-hidden{overflow:hidden}.j-overflow-auto{overflow:auto}.j-relative{position:relative}.j-border--red{border-color:var(--j-red)}.j-border--blue{border-color:var(--j-blue)}.j-border--green{border-color:var(--j-green)}.j-border--gold{border-color:var(--j-gold)}.j-border--orange{border-color:var(--j-orange)}.j-border--purple{border-color:var(--j-purple)}.j-bg--red{background-color:var(--j-red)}.j-bg--blue{background-color:var(--j-blue)}.j-bg--green{background-color:var(--j-green)}.j-bg--gold{background-color:var(--j-gold)}.j-bg--orange{background-color:var(--j-orange)}.j-bg--purple{background-color:var(--j-purple)}.j-bg--dark-grey{background-color:var(--j-dark-grey)}.j-bg--darkest{background-color:var(--j-darkest)}.j-app{background:var(--j-darkest);width:375px;max-width:375px;height:667px;max-height:667px;font-family:var(--j-font);color:var(--j-white);flex-direction:column;margin:0 auto;display:flex;position:relative;overflow:hidden;container:jimbo/inline-size}.j-app--fluid{width:100%;max-width:750px;height:auto;min-height:400px;max-height:none}.j-app__content{min-height:0;padding:var(--j-space-lg) var(--j-space-lg) var(--j-space-md);flex-direction:column;flex:1;display:flex;overflow:hidden}.j-app__scroll{min-height:0;padding:var(--j-space-lg) var(--j-space-lg) var(--j-space-md);scrollbar-width:none;-ms-overflow-style:none;flex:1;overflow:hidden auto}.j-app__scroll::-webkit-scrollbar{display:none}.j-app__footer{padding:var(--j-space-md) var(--j-space-lg) var(--j-space-md);border-top:2px solid var(--j-black);background:var(--j-dark-grey);gap:var(--j-space-sm);flex-direction:column;flex-shrink:0;display:flex}@container jimbo (width>=401px){.j-app__content,.j-app__scroll{padding:var(--j-space-xl) var(--j-space-xl) var(--j-space-lg)}.j-app__footer{padding:var(--j-space-md) var(--j-space-xl) var(--j-space-lg)}.j-stat-grid__value{font-size:20px}.j-info-card{padding:var(--j-space-md) var(--j-space-lg)}.j-info-card__title{font-size:14px}.j-section-header__tag{font-size:12px}}.j-section-header{align-items:center;gap:var(--j-space-md);margin-bottom:var(--j-space-md);display:flex}.j-section-header__tag{font-family:var(--j-font);letter-spacing:2px;color:var(--j-white);text-shadow:var(--j-text-shadow);border-radius:3px;flex-shrink:0;padding:2px 8px;font-size:11px}.j-section-header__rule{opacity:.33;border-radius:1px;flex:1;height:2px}.j-stat-grid{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);gap:var(--j-space-md);text-align:center;grid-template-columns:1fr 1fr 1fr;display:grid}.j-stat-grid__value{font-family:var(--j-font);color:var(--j-gold-text);text-shadow:var(--j-text-shadow);font-size:16px}.j-stat-grid__label{font-family:var(--j-font);color:var(--j-grey);letter-spacing:2px;margin-top:2px;font-size:9px}.j-info-card{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md);box-shadow:0 2px 0 var(--j-black);align-items:center;gap:var(--j-space-md);cursor:pointer;border:2px solid #0000;display:flex}.j-info-card:hover{filter:brightness(1.08)}.j-info-card__body{flex:1;min-width:0}.j-info-card__title{font-family:var(--j-font);color:var(--j-white);letter-spacing:1px;text-shadow:var(--j-text-shadow);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.j-info-card__sub{font-family:var(--j-font);color:var(--j-gold-text);letter-spacing:1px;margin-top:2px;font-size:9px}.j-info-card__aside{text-align:right;flex-shrink:0}.j-inset{background:var(--j-dark-grey);border-radius:var(--j-radius-md);padding:var(--j-space-md) var(--j-space-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);font-family:var(--j-font);color:var(--j-grey);letter-spacing:1px;font-size:11px;line-height:1.7}.j-wordmark{text-align:center;margin-bottom:var(--j-space-xl)}.j-wordmark__title{font-family:var(--j-font);letter-spacing:3px;color:var(--j-gold-text);text-shadow:2px 2px #000c;font-size:32px;line-height:1}.j-wordmark__sub{font-family:var(--j-font);letter-spacing:4px;color:var(--j-grey);text-shadow:var(--j-text-shadow);margin-top:4px;font-size:14px}.j-seed-input{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-seed-input__field{border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);background:var(--j-darkest);width:100%;color:var(--j-gold-text);font-size:18px;font-family:var(--j-font);letter-spacing:.12em;text-transform:uppercase;text-shadow:var(--j-text-shadow);box-sizing:border-box;outline:none;padding:8px 12px;font-weight:400;transition:border-color .1s}.j-seed-input__field::placeholder{color:var(--j-grey);opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:12px}.j-seed-input__field:focus{border-color:var(--j-gold)}.j-seed-input__field[data-valid=true]{border-color:var(--j-green)}.j-seed-input__field[data-valid=false]{border-color:var(--j-red)}.j-seed-input__field[data-valid=partial]{border-color:var(--j-panel-edge)}.j-seed-input__hint{font-family:var(--j-font);letter-spacing:.08em;color:var(--j-grey);text-shadow:var(--j-text-shadow);font-size:9px}.j-aesthetic-selector{gap:var(--j-space-sm);flex-direction:column;display:flex}.j-aesthetic-selector__list{gap:var(--j-space-sm);flex-wrap:wrap;display:flex}.j-aesthetic-pill{border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);background:var(--j-darkest);color:var(--j-grey);cursor:pointer;font-size:11px;font-family:var(--j-font);letter-spacing:.04em;text-shadow:var(--j-text-shadow);padding:4px 10px;font-weight:400;transition:border-color .1s,background .1s,color .1s;box-shadow:0 2px #0000004d}.j-aesthetic-pill:hover{border-color:var(--j-gold);color:var(--j-gold-text)}.j-aesthetic-pill[data-active=true]{border-color:var(--j-gold);color:var(--j-gold-text);box-shadow:0 0 0 1px var(--j-gold), 0 2px 0 0 #0000004d;background:#e4b64321}.j-showcase{background:var(--j-darkest);width:100%;height:100%;font-family:var(--j-font);color:var(--j-white);flex-direction:column;display:flex;overflow:hidden}.j-showcase__scroll{flex:1;min-height:0;padding:18px 14px 10px;overflow-y:auto}.j-showcase__wordmark{text-align:center;margin-bottom:18px}.j-showcase__wordmark-title{letter-spacing:3px;color:var(--j-gold-text);text-shadow:2px 2px #000c;font-size:32px;line-height:1}.j-showcase__wordmark-sub{letter-spacing:4px;color:var(--j-grey);text-shadow:var(--j-text-shadow);margin-top:4px;font-size:14px}.j-showcase__stats{background:var(--j-dark-grey);border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);gap:var(--j-space-md);text-align:center;margin-bottom:var(--j-space-xl);grid-template-columns:1fr 1fr 1fr;padding:10px;display:grid}.j-showcase__stat-value{color:var(--j-gold-text);text-shadow:var(--j-text-shadow);font-size:16px}.j-showcase__stat-label{color:var(--j-grey);letter-spacing:2px;margin-top:2px;font-size:9px}.j-showcase__section-header{align-items:center;gap:var(--j-space-md);margin-bottom:var(--j-space-md);display:flex}.j-showcase__section-tag{letter-spacing:2px;color:var(--j-white);text-shadow:var(--j-text-shadow);border-radius:3px;padding:2px 8px;font-size:11px}.j-showcase__section-rule{border-radius:1px;flex:1;height:2px}.j-showcase__filter-list{gap:var(--j-space-md);margin-bottom:var(--j-space-xl);flex-direction:column;display:flex}.j-showcase__filter-card{background:var(--j-dark-grey);border-radius:var(--j-radius-md);box-shadow:0 2px 0 var(--j-black);cursor:pointer;align-items:center;gap:10px;padding:10px;display:flex}.j-showcase__filter-sprites{gap:2px;display:flex}.j-showcase__filter-sprite{justify-content:center;align-items:center;width:30px;height:40px;display:flex}.j-showcase__filter-info{flex:1;min-width:0}.j-showcase__filter-name{color:var(--j-white);letter-spacing:1px;text-shadow:var(--j-text-shadow);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.j-showcase__filter-author{color:var(--j-gold-text);letter-spacing:1px;margin-top:2px;font-size:9px}.j-showcase__filter-hits{text-align:right}.j-showcase__filter-hits-value{text-shadow:var(--j-text-shadow);font-size:14px}.j-showcase__filter-hits-label{color:var(--j-grey);letter-spacing:1px;font-size:8px}.j-showcase__recent{background:var(--j-dark-grey);border-radius:var(--j-radius-md);border:2px solid var(--j-panel-edge);box-shadow:0 2px 0 var(--j-black);color:var(--j-grey);letter-spacing:1px;padding:8px 10px;font-size:11px;line-height:1.7}.j-showcase__actions{border-top:2px solid var(--j-black);background:var(--j-dark-grey);flex-direction:column;gap:6px;padding:8px 10px 10px;display:flex}.j-footer__suits{align-items:center;display:inline-flex}.j-footer__suit-stage{vertical-align:middle;width:1.5em;height:1em;display:inline-block;position:relative}.j-footer__suit-char{opacity:0;justify-content:center;align-items:center;animation-duration:5s;animation-timing-function:ease-out;animation-iteration-count:infinite;animation-delay:0s;display:inline-flex;position:absolute;inset:0}.j-copy-row__label{letter-spacing:2px}.j-motely-badge{align-items:center;gap:6px;display:inline-flex}.j-motely-badge--chip{border-radius:var(--j-radius-sm);background:var(--j-darkest);border:1px solid var(--j-panel-edge);padding:3px 8px}.j-text--dance-container{display:inline-flex}.j-font-dance-char{animation:3s ease-in-out infinite j-font-dance;display:inline-block}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{display:none}.j-juice-hover{transition:transform .2s cubic-bezier(.175,.885,.32,1.275)}.j-juice-hover:hover{z-index:5;transform:scale(1.05)translateY(-2px)}
2
2
  /*$vite$:1*/
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { MenuItem } from './menuConfig';
2
+ import { MenuItem } from './menuConfig.js';
3
3
  export interface SeedMascotProps {
4
4
  /** Hit target size for the mascot image (px). Default 160. */
5
5
  size?: number;
@@ -1,3 +1,3 @@
1
- export * from './SeedMascot';
2
- export * from './JammySpeechBox';
3
- export * from './menuConfig';
1
+ export * from './SeedMascot.js';
2
+ export * from './JammySpeechBox.js';
3
+ export * from './menuConfig.js';
@@ -1,4 +1,4 @@
1
- import { RadialButtonColor } from './RadialButton';
1
+ import { RadialButtonColor } from './RadialButton.js';
2
2
  export type RadialBadgeState = "loading" | "success" | "error" | "info" | "warning";
3
3
  export interface RadialBadgeProps {
4
4
  label: string;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { MenuItem } from '../mascot/menuConfig';
2
+ import { MenuItem } from '../mascot/menuConfig.js';
3
3
  export interface RadialMenuProps {
4
4
  /** Menu items to display. The item flagged _south is always pinned at the bottom. */
5
5
  items: MenuItem[];
@@ -1,16 +1,16 @@
1
- export { RadialMenu } from './RadialMenu';
2
- export type { RadialMenuProps } from './RadialMenu';
3
- export { RadialPill } from './RadialPill';
4
- export type { RadialPillProps } from './RadialPill';
5
- export { RadialButton } from './RadialButton';
6
- export type { RadialButtonProps, RadialButtonColor, RadialButtonActionProps, RadialButtonToggleProps, RadialButtonCountProps, RadialButtonBackProps, } from './RadialButton';
7
- export { RadialBadge } from './RadialBadge';
8
- export type { RadialBadgeProps, RadialBadgeState } from './RadialBadge';
9
- export { RadialBreadcrumb } from './RadialBreadcrumb';
10
- export type { RadialBreadcrumbProps } from './RadialBreadcrumb';
11
- export { useRadialMenu } from './useRadialMenu';
12
- export type { UseRadialMenuProps, RadialMenuState } from './useRadialMenu';
13
- export { RadialButton as JimboRadialNavigationButton } from './RadialButton';
14
- export { RadialBadge as JimboRadialNavigationBadge } from './RadialBadge';
15
- export { RadialBreadcrumb as BreadcrumNavPill } from './RadialBreadcrumb';
16
- export { RadialPill as JimboOrbitalPill } from './RadialPill';
1
+ export { RadialMenu } from './RadialMenu.js';
2
+ export type { RadialMenuProps } from './RadialMenu.js';
3
+ export { RadialPill } from './RadialPill.js';
4
+ export type { RadialPillProps } from './RadialPill.js';
5
+ export { RadialButton } from './RadialButton.js';
6
+ export type { RadialButtonProps, RadialButtonColor, RadialButtonActionProps, RadialButtonToggleProps, RadialButtonCountProps, RadialButtonBackProps, } from './RadialButton.js';
7
+ export { RadialBadge } from './RadialBadge.js';
8
+ export type { RadialBadgeProps, RadialBadgeState } from './RadialBadge.js';
9
+ export { RadialBreadcrumb } from './RadialBreadcrumb.js';
10
+ export type { RadialBreadcrumbProps } from './RadialBreadcrumb.js';
11
+ export { useRadialMenu } from './useRadialMenu.js';
12
+ export type { UseRadialMenuProps, RadialMenuState } from './useRadialMenu.js';
13
+ export { RadialButton as JimboRadialNavigationButton } from './RadialButton.js';
14
+ export { RadialBadge as JimboRadialNavigationBadge } from './RadialBadge.js';
15
+ export { RadialBreadcrumb as BreadcrumNavPill } from './RadialBreadcrumb.js';
16
+ export { RadialPill as JimboOrbitalPill } from './RadialPill.js';
package/dist/ui.js CHANGED
@@ -1,3 +1,3 @@
1
- import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, R as d, S as f, T as p, _ as m, a as h, b as g, c as _, d as v, f as y, g as b, h as x, i as S, j as C, k as w, l as T, m as E, n as D, o as O, p as k, r as A, s as j, t as M, u as N, v as P, w as F, x as I, y as L } from "./chunks/ui-BRMCKSX4.js";
1
+ import { A as e, C as t, D as n, E as r, F as i, I as a, L as o, M as s, N as c, O as l, P as u, R as d, S as f, T as p, _ as m, a as h, b as g, c as _, d as v, f as y, g as b, h as x, i as S, j as C, k as w, l as T, m as E, n as D, o as O, p as k, r as A, s as j, t as M, u as N, v as P, w as F, x as I, y as L } from "./chunks/ui-0liG4zOw.js";
2
2
  import { n as R, r as z, t as B } from "./chunks/tokens-B65Fzble.js";
3
3
  export { a as DeckSprite, B as JIMBO_ANIMATIONS, b as JimboApp, m as JimboAppFooter, P as JimboAppScroll, e as JimboBackButton, I as JimboBackground, F as JimboBadge, f as JimboBalatroFooter, C as JimboButton, L as JimboCodeBlock, R as JimboColorOption, _ as JimboCopyRow, t as JimboFilterBar, n as JimboFlankNav, r as JimboFloating, S as JimboIconButton, N as JimboInfoCard, v as JimboInfoCardAside, y as JimboInfoCardBody, k as JimboInfoCardSub, E as JimboInfoCardTitle, s as JimboInnerPanel, A as JimboInputModal, h as JimboInset, c as JimboModal, u as JimboPanel, x as JimboSectionHeader, D as JimboSelect, o as JimboSprite, O as JimboStatGrid, l as JimboTabs, i as JimboText, p as JimboToggleList, g as JimboTooltip, w as JimboVerticalTabs, j as JimboWordmark, M as PanelSplitter, T as Showcase, d as StakeSprite, z as withAlpha };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaml-ui",
3
- "version": "0.26.3",
3
+ "version": "0.26.5",
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",
@@ -47,6 +47,17 @@
47
47
  "DESIGN.md",
48
48
  "LICENSE"
49
49
  ],
50
+ "scripts": {
51
+ "build": "vite build",
52
+ "dev": "vite build --watch",
53
+ "demo": "vite --config demo/vite.config.ts",
54
+ "typecheck": "tsc --noEmit --pretty false",
55
+ "prepack": "npm run build",
56
+ "storybook": "storybook dev -p 6006",
57
+ "build-storybook": "storybook build",
58
+ "serve:storybook": "npx --yes serve storybook-static -l 3141 --cors",
59
+ "lint": "eslint ."
60
+ },
50
61
  "engines": {
51
62
  "node": ">=18"
52
63
  },
@@ -88,6 +99,9 @@
88
99
  "@react-three/fiber": {
89
100
  "optional": true
90
101
  },
102
+ "@rewaffle/bootsharp-file-system": {
103
+ "optional": true
104
+ },
91
105
  "react-icons": {
92
106
  "optional": true
93
107
  },
@@ -107,6 +121,7 @@
107
121
  "@react-three/fiber": "^9.6.1",
108
122
  "@storybook/addon-a11y": "^10.3.6",
109
123
  "@storybook/addon-docs": "^10.3.6",
124
+ "@storybook/addon-mcp": "^0.6.0",
110
125
  "@storybook/addon-onboarding": "^10.3.6",
111
126
  "@storybook/addon-vitest": "^10.3.6",
112
127
  "@storybook/react-vite": "^10.3.6",
@@ -121,7 +136,6 @@
121
136
  "eslint-plugin-react-hooks": "^7.1.1",
122
137
  "eslint-plugin-react-refresh": "^0.5.2",
123
138
  "globals": "^17.6.0",
124
- "motely-wasm": "^15.3.0",
125
139
  "playwright": "^1.59.1",
126
140
  "react": "^19.2.6",
127
141
  "react-dom": "^19.2.6",
@@ -147,17 +161,8 @@
147
161
  "clsx": "^2.1.1",
148
162
  "js-yaml": "^4.1.1",
149
163
  "lucide-react": "^1.14.0",
150
- "motely-wasm": "^15.3.0",
164
+ "motely-wasm": "^17.3.0",
151
165
  "tailwind-merge": "^2.6.1",
152
166
  "zustand": "^5.0.13"
153
- },
154
- "scripts": {
155
- "build": "vite build",
156
- "dev": "vite build --watch",
157
- "demo": "vite --config demo/vite.config.ts",
158
- "typecheck": "tsc --noEmit --pretty false",
159
- "storybook": "storybook dev -p 3141",
160
- "build-storybook": "storybook build",
161
- "lint": "eslint ."
162
167
  }
163
- }
168
+ }
Binary file
@@ -1,149 +0,0 @@
1
- import e, { Motely as t } from "motely-wasm";
2
- //#region src/motelyBoot.ts
3
- await e.boot();
4
- //#endregion
5
- //#region src/motelyDisplay.ts
6
- function n(e, t) {
7
- let n = e[String(t)];
8
- return typeof n == "string" && n.length > 0 ? n : null;
9
- }
10
- function r(e) {
11
- return n(t.MotelyBossBlind, e & 255) ?? `boss#${e}`;
12
- }
13
- function i(e) {
14
- return e;
15
- }
16
- function a(e) {
17
- return n(t.MotelyVoucher, e) ?? `voucher#${e}`;
18
- }
19
- function o(e) {
20
- return e;
21
- }
22
- function s(e) {
23
- return n(t.MotelyTag, e) ?? `tag#${e}`;
24
- }
25
- function c(e) {
26
- return e;
27
- }
28
- function l(e) {
29
- return n(t.MotelyBoosterPack, e) ?? `pack#${e}`;
30
- }
31
- function u(e) {
32
- return `${e} Pack`;
33
- }
34
- function d(e) {
35
- return e;
36
- }
37
- function f(e) {
38
- return n(t.MotelyItemType, e & 65535) ?? `item#${e}`;
39
- }
40
- //#endregion
41
- //#region src/decode/motelyItemDecoder.ts
42
- var p = t, m = {
43
- [p.MotelyItemTypeCategory.Standardcard]: "playing",
44
- [p.MotelyItemTypeCategory.SpectralCard]: "spectral",
45
- [p.MotelyItemTypeCategory.TarotCard]: "tarot",
46
- [p.MotelyItemTypeCategory.PlanetCard]: "planet",
47
- [p.MotelyItemTypeCategory.Joker]: "joker"
48
- };
49
- function h(e, t) {
50
- let n = e[String(t)];
51
- return typeof n == "string" ? n : null;
52
- }
53
- function g(e) {
54
- return e.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
55
- }
56
- function _(e) {
57
- return e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : e.value ?? e.type ?? null;
58
- }
59
- function v(e) {
60
- let t = _(e);
61
- return t === null ? null : t & 65535;
62
- }
63
- function y(e) {
64
- let n = v(e);
65
- return n === null ? "Unknown" : h(t.MotelyItemType, n) ?? `item#${n}`;
66
- }
67
- function b(e) {
68
- return m[e >> 12 & 15] ?? "unknown";
69
- }
70
- function x(e) {
71
- let t = v(e);
72
- return t === null ? "unknown" : b(t);
73
- }
74
- function S(e) {
75
- return g(y(e));
76
- }
77
- function C(e) {
78
- if (e == null) return null;
79
- let n = typeof e == "number" ? e : e.edition;
80
- if (n == null) return null;
81
- let r = h(t.MotelyItemEdition, n);
82
- return !r || r === "None" ? null : r;
83
- }
84
- function w(e) {
85
- if (e == null) return null;
86
- let n = typeof e == "number" ? null : e.seal;
87
- if (n == null) return null;
88
- let r = h(t.MotelyItemSeal, n);
89
- return !r || r === "None" ? null : r;
90
- }
91
- function T(e) {
92
- if (e == null) return null;
93
- let n = typeof e == "number" ? null : e.enhancement;
94
- if (n == null) return null;
95
- let r = h(t.MotelyItemEnhancement, n);
96
- return !r || r === "None" ? null : r;
97
- }
98
- function E(e) {
99
- if (e == null) return null;
100
- let n = typeof e == "number" ? null : e.rank;
101
- return n == null ? null : h(t.MotelyStandardcardRank, n);
102
- }
103
- function D(e) {
104
- if (e == null) return null;
105
- let n = typeof e == "number" ? null : e.suit;
106
- return n == null ? null : h(t.MotelyStandardcardSuit, n);
107
- }
108
- function O(e) {
109
- return y(e);
110
- }
111
- function k(e) {
112
- let n = v(e);
113
- if (n === null) return null;
114
- let r = h(t.MotelyItemType, n) ?? `Unknown_${n}`, i = b(n);
115
- return {
116
- itemType: n,
117
- enumKey: r,
118
- displayName: g(r),
119
- category: i,
120
- edition: C(e),
121
- seal: w(e),
122
- enhancement: T(e),
123
- rank: E(e),
124
- suit: D(e)
125
- };
126
- }
127
- function A(e, t) {
128
- let n = k(e);
129
- return n ? {
130
- type: n.category === "joker" ? "joker" : n.category === "playing" ? "playing" : "consumable",
131
- card: {
132
- name: n.displayName,
133
- edition: n.edition ?? void 0,
134
- seal: n.seal ?? void 0,
135
- enhancements: n.enhancement ? [n.enhancement] : void 0,
136
- rank: n.rank ?? void 0,
137
- suit: n.suit ?? void 0,
138
- scale: t
139
- }
140
- } : null;
141
- }
142
- function j() {}
143
- function M() {
144
- return 0;
145
- }
146
- //#endregion
147
- export { c as C, t as E, s as S, o as T, u as _, b as a, d as b, T as c, y as d, E as f, l as g, j as h, M as i, x as l, v as m, O as n, S as o, D as p, A as r, C as s, k as t, w as u, r as v, a as w, f as x, i as y };
148
-
149
- //# sourceMappingURL=motelyItemDecoder-HsR2riGq.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"motelyItemDecoder-HsR2riGq.js","names":[],"sources":["../../src/motelyBoot.ts","../../src/motelyDisplay.ts","../../src/decode/motelyItemDecoder.ts"],"sourcesContent":["import bootsharp, { Motely } from \"motely-wasm\";\n\nawait bootsharp.boot();\n\nexport { Motely };\n","import { Motely } from \"./motelyBoot.js\";\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(Motely.MotelyBossBlind as Record<string, unknown>, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(Motely.MotelyVoucher as Record<string, unknown>, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(Motely.MotelyTag as Record<string, unknown>, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(Motely.MotelyBoosterPack as Record<string, unknown>, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const key = runtimeEnumKey(Motely.MotelyItemType as Record<string, unknown>, value & 0xffff);\n return key ?? `item#${value}`;\n}\n","import { Motely } from \"../motelyBoot.js\";\n\n// motely-wasm exports MotelyItemTypeCategory at runtime but its .d.ts hasn't\n// caught up — cast unblocks the type check until motely-wasm regenerates types.\nconst M = Motely as unknown as Record<string, Record<string, number>>;\n\nconst CATEGORY_MAP: Record<number, MotelyRenderableCategory> = {\n [M.MotelyItemTypeCategory.Standardcard]: \"playing\",\n [M.MotelyItemTypeCategory.SpectralCard]: \"spectral\",\n [M.MotelyItemTypeCategory.TarotCard]: \"tarot\",\n [M.MotelyItemTypeCategory.PlanetCard]: \"planet\",\n [M.MotelyItemTypeCategory.Joker]: \"joker\",\n};\n\nexport type CardCategory = \"joker\" | \"consumable\" | \"playing\" | \"spectral\" | \"tarot\" | \"planet\";\nexport type MotelyRenderableCategory = CardCategory | \"unknown\";\n\nexport type MotelyItemInput = number | MotelyRuntimeItem | null | undefined;\n\nexport interface MotelyRuntimeItem {\n type?: number;\n value?: number;\n edition?: number;\n seal?: number;\n enhancement?: number;\n suit?: number;\n rank?: number;\n}\n\nexport interface DecodedMotelyItem {\n itemType: number;\n enumKey: string;\n displayName: string;\n category: MotelyRenderableCategory;\n edition: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null;\n seal: \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null;\n enhancement: string | null;\n rank: string | null;\n suit: \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n}\n\nexport interface MotelyJamlCard {\n type: \"joker\" | \"consumable\" | \"playing\";\n card: {\n name: string;\n edition?: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n seal?: string;\n enhancements?: string[];\n rank?: string;\n suit?: string;\n scale?: number;\n };\n}\n\nfunction enumKey<T extends Record<string, unknown>>(e: T, value: number): string | null {\n const k = e[String(value)];\n return typeof k === \"string\" ? k : null;\n}\n\nfunction spaceSplit(value: string): string {\n return value.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n}\n\nfunction resolvePackedValue(input: MotelyItemInput): number | null {\n if (input == null) return null;\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null;\n return input.value ?? input.type ?? null;\n}\n\nexport function resolveMotelyItemType(input: MotelyItemInput): number | null {\n const val = resolvePackedValue(input);\n return val !== null ? val & 0xffff : null;\n}\n\nexport function motelyItemTypeName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return enumKey(Motely.MotelyItemType as Record<string, unknown>, itemType) ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const catValue = (itemType >> 12) & 0xf;\n return CATEGORY_MAP[catValue] ?? \"unknown\";\n}\n\nexport function motelyItemRenderCategory(input: MotelyItemInput): MotelyRenderableCategory {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"unknown\";\n return motelyItemCategory(itemType);\n}\n\nexport function motelyItemDisplayName(input: MotelyItemInput): string {\n return spaceSplit(motelyItemTypeName(input));\n}\n\nexport function motelyItemEditionName(input: MotelyItemInput): \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? input : input.edition;\n if (val == null) return null;\n const key = enumKey(Motely.MotelyItemEdition as Record<string, unknown>, val);\n if (!key || key === \"None\") return null;\n return key as \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n}\n\nexport function motelyItemSealName(input: MotelyItemInput): \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.seal;\n if (val == null) return null;\n const key = enumKey(Motely.MotelyItemSeal as Record<string, unknown>, val);\n if (!key || key === \"None\") return null;\n return key as \"Gold\" | \"Red\" | \"Blue\" | \"Purple\";\n}\n\nexport function motelyItemEnhancementName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.enhancement;\n if (val == null) return null;\n const key = enumKey(Motely.MotelyItemEnhancement as Record<string, unknown>, val);\n if (!key || key === \"None\") return null;\n return key;\n}\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.rank;\n if (val == null) return null;\n return enumKey(Motely.MotelyStandardcardRank as Record<string, unknown>, val);\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.suit;\n if (val == null) return null;\n return enumKey(Motely.MotelyStandardcardSuit as Record<string, unknown>, val) as \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n}\n\nexport function decodeMotelyItemName(input: MotelyItemInput): string {\n return motelyItemTypeName(input);\n}\n\nexport function decodeMotelyItem(input: MotelyItemInput): DecodedMotelyItem | null {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return null;\n\n const enumKeyStr = enumKey(Motely.MotelyItemType as Record<string, unknown>, itemType) ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = spaceSplit(enumKeyStr);\n\n return {\n itemType,\n enumKey: enumKeyStr,\n displayName,\n category,\n edition: motelyItemEditionName(input),\n seal: motelyItemSealName(input),\n enhancement: motelyItemEnhancementName(input),\n rank: motelyStandardcardRankName(input),\n suit: motelyStandardcardSuitName(input),\n };\n}\n\nexport function decodeMotelyItemToJamlCard(input: MotelyItemInput, scale?: number): MotelyJamlCard | null {\n const decoded = decodeMotelyItem(input);\n if (!decoded) return null;\n\n const type: \"joker\" | \"consumable\" | \"playing\" =\n decoded.category === \"joker\" ? \"joker\"\n : decoded.category === \"playing\" ? \"playing\"\n : \"consumable\";\n\n return {\n type,\n card: {\n name: decoded.displayName,\n edition: decoded.edition ?? undefined,\n seal: decoded.seal ?? undefined,\n enhancements: decoded.enhancement ? [decoded.enhancement] : undefined,\n rank: decoded.rank ?? undefined,\n suit: decoded.suit ?? undefined,\n scale,\n },\n };\n}\n\nexport function warmMotelyItemCache(): void { /* no-op */ }\nexport function motelyItemCacheSize(): number { return 0; }\n"],"mappings":";;AAEA,MAAM,EAAU,MAAM;;;ACAtB,SAAS,EACP,GACA,GACe;CACf,IAAM,IAAM,EAAW,OAAO,EAAM;CACpC,OAAO,OAAO,KAAQ,YAAY,EAAI,SAAS,IAAI,IAAM;;AAG3D,SAAgB,EAAsB,GAAuB;CAE3D,OADY,EAAe,EAAO,iBAA4C,IAAQ,IAC/E,IAAO,QAAQ;;AAGxB,SAAgB,EAA6B,GAAqB;CAChE,OAAO;;AAGT,SAAgB,EAAyB,GAAuB;CAE9D,OADY,EAAe,EAAO,eAA0C,EACrE,IAAO,WAAW;;AAG3B,SAAgB,EAAgC,GAAqB;CACnE,OAAO;;AAGT,SAAgB,EAAqB,GAAuB;CAE1D,OADY,EAAe,EAAO,WAAsC,EACjE,IAAO,OAAO;;AAGvB,SAAgB,EAA4B,GAAqB;CAC/D,OAAO;;AAGT,SAAgB,EAA6B,GAAuB;CAElE,OADY,EAAe,EAAO,mBAA8C,EACzE,IAAO,QAAQ;;AAGxB,SAAgB,EAAoC,GAAqB;CACvE,OAAO,GAAG,EAAI;;AAGhB,SAAgB,EAA6B,GAAqB;CAChE,OAAO;;AAGT,SAAgB,EAA+B,GAAuB;CAEpE,OADY,EAAe,EAAO,gBAA2C,IAAQ,MAC9E,IAAO,QAAQ;;;;AChDxB,IAAM,IAAI,GAEJ,IAAyD;EAC5D,EAAE,uBAAuB,eAAe;EACxC,EAAE,uBAAuB,eAAe;EACxC,EAAE,uBAAuB,YAAY;EACrC,EAAE,uBAAuB,aAAa;EACtC,EAAE,uBAAuB,QAAQ;CACnC;AA0CD,SAAS,EAA2C,GAAM,GAA8B;CACtF,IAAM,IAAI,EAAE,OAAO,EAAM;CACzB,OAAO,OAAO,KAAM,WAAW,IAAI;;AAGrC,SAAS,EAAW,GAAuB;CACzC,OAAO,EAAM,QAAQ,mBAAmB,QAAQ,CAAC,QAAQ,yBAAyB,QAAQ;;AAG5F,SAAS,EAAmB,GAAuC;CAGjE,OAFI,KAAS,OAAa,OACtB,OAAO,KAAU,WAAiB,OAAO,SAAS,EAAM,GAAG,IAAQ,OAChE,EAAM,SAAS,EAAM,QAAQ;;AAGtC,SAAgB,EAAsB,GAAuC;CAC3E,IAAM,IAAM,EAAmB,EAAM;CACrC,OAAO,MAAQ,OAAsB,OAAf,IAAM;;AAG9B,SAAgB,EAAmB,GAAgC;CACjE,IAAM,IAAW,EAAsB,EAAM;CAE7C,OADI,MAAa,OAAa,YACvB,EAAQ,EAAO,gBAA2C,EAAS,IAAI,QAAQ;;AAGxF,SAAgB,EAAmB,GAA4C;CAE7E,OAAO,EADW,KAAY,KAAM,OACH;;AAGnC,SAAgB,EAAyB,GAAkD;CACzF,IAAM,IAAW,EAAsB,EAAM;CAE7C,OADI,MAAa,OAAa,YACvB,EAAmB,EAAS;;AAGrC,SAAgB,EAAsB,GAAgC;CACpE,OAAO,EAAW,EAAmB,EAAM,CAAC;;AAG9C,SAAgB,EAAsB,GAAmF;CACvH,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAM,IAAM,OAAO,KAAU,WAAW,IAAQ,EAAM;CACtD,IAAI,KAAO,MAAM,OAAO;CACxB,IAAM,IAAM,EAAQ,EAAO,mBAA8C,EAAI;CAE7E,OADI,CAAC,KAAO,MAAQ,SAAe,OAC5B;;AAGT,SAAgB,EAAmB,GAAmE;CACpG,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAM,IAAM,OAAO,KAAU,WAAW,OAAO,EAAM;CACrD,IAAI,KAAO,MAAM,OAAO;CACxB,IAAM,IAAM,EAAQ,EAAO,gBAA2C,EAAI;CAE1E,OADI,CAAC,KAAO,MAAQ,SAAe,OAC5B;;AAGT,SAAgB,EAA0B,GAAuC;CAC/E,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAM,IAAM,OAAO,KAAU,WAAW,OAAO,EAAM;CACrD,IAAI,KAAO,MAAM,OAAO;CACxB,IAAM,IAAM,EAAQ,EAAO,uBAAkD,EAAI;CAEjF,OADI,CAAC,KAAO,MAAQ,SAAe,OAC5B;;AAGT,SAAgB,EAA2B,GAAuC;CAChF,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAM,IAAM,OAAO,KAAU,WAAW,OAAO,EAAM;CAErD,OADI,KAAO,OAAa,OACjB,EAAQ,EAAO,wBAAmD,EAAI;;AAG/E,SAAgB,EAA2B,GAA2E;CACpH,IAAI,KAAS,MAAM,OAAO;CAC1B,IAAM,IAAM,OAAO,KAAU,WAAW,OAAO,EAAM;CAErD,OADI,KAAO,OAAa,OACjB,EAAQ,EAAO,wBAAmD,EAAI;;AAG/E,SAAgB,EAAqB,GAAgC;CACnE,OAAO,EAAmB,EAAM;;AAGlC,SAAgB,EAAiB,GAAkD;CACjF,IAAM,IAAW,EAAsB,EAAM;CAC7C,IAAI,MAAa,MAAM,OAAO;CAE9B,IAAM,IAAa,EAAQ,EAAO,gBAA2C,EAAS,IAAI,WAAW,KAC/F,IAAW,EAAmB,EAAS;CAG7C,OAAO;EACL;EACA,SAAS;EACT,aALkB,EAAW,EAK7B;EACA;EACA,SAAS,EAAsB,EAAM;EACrC,MAAM,EAAmB,EAAM;EAC/B,aAAa,EAA0B,EAAM;EAC7C,MAAM,EAA2B,EAAM;EACvC,MAAM,EAA2B,EAAM;EACxC;;AAGH,SAAgB,EAA2B,GAAwB,GAAuC;CACxG,IAAM,IAAU,EAAiB,EAAM;CAQvC,OAPK,IAOE;EACL,MALA,EAAQ,aAAa,UAAU,UAC7B,EAAQ,aAAa,YAAY,YACjC;EAIF,MAAM;GACJ,MAAM,EAAQ;GACd,SAAS,EAAQ,WAAW,KAAA;GAC5B,MAAM,EAAQ,QAAQ,KAAA;GACtB,cAAc,EAAQ,cAAc,CAAC,EAAQ,YAAY,GAAG,KAAA;GAC5D,MAAM,EAAQ,QAAQ,KAAA;GACtB,MAAM,EAAQ,QAAQ,KAAA;GACtB;GACD;EACF,GAlBoB;;AAqBvB,SAAgB,IAA4B;AAC5C,SAAgB,IAA8B;CAAE,OAAO"}
@@ -1,30 +0,0 @@
1
- import { default as React } from 'react';
2
- import { AnalyzerAnteView, AnalyzerItem } from './AnalyzerExplorer.js';
3
- import { AnalyzerLive } from '../hooks/useAnalyzer.js';
4
- import { AnalyzerStreamKey } from '../hooks/analyzerStreamRegistry.js';
5
- export interface JamlAnalyzerFullscreenProps {
6
- /** Per-ante summaries from useAnalyzer.antes. */
7
- antes: AnalyzerAnteView[];
8
- /** Live ctx from useAnalyzer.live; null disables additional stream lanes. */
9
- live: AnalyzerLive | null;
10
- /** JAML string for visual breakdown. */
11
- jaml?: string;
12
- /** Tally column data for JAML map highlighting. */
13
- tallyColumns?: number[];
14
- /** Tally labels mapping to columns. */
15
- tallyLabels?: string[];
16
- /** Stream lanes to surface. Defaults to shop + soul jokers. */
17
- enabledStreams?: AnalyzerStreamKey[];
18
- /** Called when the user toggles a stream in the picker. Owners persist if desired. */
19
- onEnabledStreamsChange?: (next: AnalyzerStreamKey[]) => void;
20
- /** Hide the built-in stream picker overlay (e.g. when host renders its own). */
21
- hidePicker?: boolean;
22
- /** Pull size on each lazy load. */
23
- chunkSize?: number;
24
- className?: string;
25
- /** Custom top page to render as Slide 0 */
26
- topPage?: React.ReactNode;
27
- }
28
- export declare function JamlAnalyzerFullscreen({ antes, live, jaml, tallyColumns, tallyLabels, enabledStreams, chunkSize, className, topPage, }: JamlAnalyzerFullscreenProps): import("react/jsx-runtime").JSX.Element;
29
- export type { AnalyzerItem };
30
- export { ANALYZER_STREAM_META, type AnalyzerStreamKey } from '../hooks/analyzerStreamRegistry.js';