jaml-ui 0.26.2 → 0.26.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/motelyItemDecoder-BFCFW_BF.js +113 -0
- package/dist/chunks/motelyItemDecoder-BFCFW_BF.js.map +1 -0
- package/dist/hooks/useAnalyzer.d.ts +1 -17
- package/dist/index.d.ts +1 -3
- package/dist/index.js +2507 -3168
- package/dist/index.js.map +1 -1
- package/dist/lib/hooks/useSeedAnalyzer.d.ts +1 -1
- package/dist/motely.js +41 -5
- package/dist/motely.js.map +1 -1
- package/dist/ui/jimbo.css +1 -1
- package/dist/ui/mascot/SeedMascot.d.ts +1 -1
- package/dist/ui/mascot/index.d.ts +3 -3
- package/dist/ui/radial/RadialBadge.d.ts +1 -1
- package/dist/ui/radial/RadialMenu.d.ts +1 -1
- package/dist/ui/radial/index.d.ts +16 -16
- package/package.json +14 -12
- package/assets/WeeJokerExampleDAilyGame.png +0 -0
- package/dist/chunks/motelyItemDecoder-DdhlU_Ko.js +0 -6039
- package/dist/chunks/motelyItemDecoder-DdhlU_Ko.js.map +0 -1
- package/dist/components/JamlAnalyzerFullscreen.d.ts +0 -30
- package/dist/hooks/analyzerStreamRegistry.d.ts +0 -35
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 {
|
|
4
|
+
import { a, c as o, d as s, f as c, g as l, h as u, i as d, l as f, m as p, n as m, o as h, p as g, r as _, s as v, t as y, u as b } from "./chunks/motelyItemDecoder-BFCFW_BF.js";
|
|
5
5
|
//#region src/decode/motelySprite.ts
|
|
6
|
-
function
|
|
7
|
-
let o =
|
|
6
|
+
function x(a) {
|
|
7
|
+
let o = y(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
|
|
34
|
+
function S(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,42 @@ function M(a, o = "unknown") {
|
|
|
61
61
|
} : null;
|
|
62
62
|
}
|
|
63
63
|
//#endregion
|
|
64
|
-
|
|
64
|
+
//#region src/motelyDisplay.ts
|
|
65
|
+
function C(e, t) {
|
|
66
|
+
let n = e[String(t)];
|
|
67
|
+
return typeof n == "string" && n.length > 0 ? n : null;
|
|
68
|
+
}
|
|
69
|
+
function w(e) {
|
|
70
|
+
return C(l.MotelyBossBlind, e & 255) ?? `boss#${e}`;
|
|
71
|
+
}
|
|
72
|
+
function T(e) {
|
|
73
|
+
return e;
|
|
74
|
+
}
|
|
75
|
+
function E(e) {
|
|
76
|
+
return C(l.MotelyVoucher, e) ?? `voucher#${e}`;
|
|
77
|
+
}
|
|
78
|
+
function D(e) {
|
|
79
|
+
return e;
|
|
80
|
+
}
|
|
81
|
+
function O(e) {
|
|
82
|
+
return C(l.MotelyTag, e) ?? `tag#${e}`;
|
|
83
|
+
}
|
|
84
|
+
function k(e) {
|
|
85
|
+
return e;
|
|
86
|
+
}
|
|
87
|
+
function A(e) {
|
|
88
|
+
return C(l.MotelyBoosterPack, e) ?? `pack#${e}`;
|
|
89
|
+
}
|
|
90
|
+
function j(e) {
|
|
91
|
+
return `${e} Pack`;
|
|
92
|
+
}
|
|
93
|
+
function M(e) {
|
|
94
|
+
return e;
|
|
95
|
+
}
|
|
96
|
+
function N(e) {
|
|
97
|
+
return C(l.MotelyItemType, e & 65535) ?? `item#${e}`;
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { l as Motely, y as decodeMotelyItem, m as decodeMotelyItemName, _ as decodeMotelyItemToJamlCard, S as getMotelySpriteByName, A as motelyBoosterPackDisplayName, j as motelyBoosterPackDisplayNameFromKey, w as motelyBossDisplayName, T as motelyBossDisplayNameFromKey, d as motelyItemCacheSize, a as motelyItemCategory, h as motelyItemDisplayName, M as motelyItemDisplayNameFromKey, N as motelyItemDisplayNameFromValue, v as motelyItemEditionName, o as motelyItemEnhancementName, f as motelyItemRenderCategory, b as motelyItemSealName, x as motelyItemToSprite, s as motelyItemTypeName, c as motelyStandardcardRankName, g as motelyStandardcardSuitName, O as motelyTagDisplayName, k as motelyTagDisplayNameFromKey, E as motelyVoucherDisplayName, D as motelyVoucherDisplayNameFromKey, p as resolveMotelyItemType, u as warmMotelyItemCache };
|
|
65
101
|
|
|
66
102
|
//# sourceMappingURL=motely.js.map
|
package/dist/motely.js.map
CHANGED
|
@@ -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\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"],"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;;;;ACpFpB,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"}
|
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,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,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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jaml-ui",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.4",
|
|
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,16 @@
|
|
|
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
|
+
"lint": "eslint ."
|
|
59
|
+
},
|
|
50
60
|
"engines": {
|
|
51
61
|
"node": ">=18"
|
|
52
62
|
},
|
|
@@ -107,6 +117,7 @@
|
|
|
107
117
|
"@react-three/fiber": "^9.6.1",
|
|
108
118
|
"@storybook/addon-a11y": "^10.3.6",
|
|
109
119
|
"@storybook/addon-docs": "^10.3.6",
|
|
120
|
+
"@storybook/addon-mcp": "^0.6.0",
|
|
110
121
|
"@storybook/addon-onboarding": "^10.3.6",
|
|
111
122
|
"@storybook/addon-vitest": "^10.3.6",
|
|
112
123
|
"@storybook/react-vite": "^10.3.6",
|
|
@@ -121,7 +132,7 @@
|
|
|
121
132
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
122
133
|
"eslint-plugin-react-refresh": "^0.5.2",
|
|
123
134
|
"globals": "^17.6.0",
|
|
124
|
-
"motely-wasm": "^
|
|
135
|
+
"motely-wasm": "^16.0.1",
|
|
125
136
|
"playwright": "^1.59.1",
|
|
126
137
|
"react": "^19.2.6",
|
|
127
138
|
"react-dom": "^19.2.6",
|
|
@@ -147,17 +158,8 @@
|
|
|
147
158
|
"clsx": "^2.1.1",
|
|
148
159
|
"js-yaml": "^4.1.1",
|
|
149
160
|
"lucide-react": "^1.14.0",
|
|
150
|
-
"motely-wasm": "^
|
|
161
|
+
"motely-wasm": "^16.0.1",
|
|
151
162
|
"tailwind-merge": "^2.6.1",
|
|
152
163
|
"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
164
|
}
|
|
163
165
|
}
|
|
Binary file
|