jaml-ui 0.31.0 → 0.32.2

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 (98) hide show
  1. package/README.md +193 -61
  2. package/assets/fonts/README.md +14 -0
  3. package/assets/fonts/m6x11.ttf +0 -0
  4. package/assets/fonts/m6x11plus.ttf +0 -0
  5. package/dist/.gitkeep +0 -0
  6. package/dist/assets/searchPoolWorker-Ck5flXVS.js +40 -0
  7. package/dist/assets/searchPoolWorker-Ck5flXVS.js.map +1 -0
  8. package/dist/assets.d.ts +1 -1
  9. package/dist/chunks/{assets-D80i9sMq.js → assets-Bb6wV80_.js} +3 -3
  10. package/dist/chunks/assets-Bb6wV80_.js.map +1 -0
  11. package/dist/chunks/jamlSeeds-3ILzc_rj.js +66 -0
  12. package/dist/chunks/jamlSeeds-3ILzc_rj.js.map +1 -0
  13. package/dist/chunks/motelyItemFormats-CNrFzcCI.js +1836 -0
  14. package/dist/chunks/motelyItemFormats-CNrFzcCI.js.map +1 -0
  15. package/dist/chunks/{searchPoolWorker-DUope_8B.js → searchPoolWorker-gPdRA_pa.js} +2 -2
  16. package/dist/chunks/searchPoolWorker-gPdRA_pa.js.map +1 -0
  17. package/dist/chunks/{spriteMapper-C4_5G1Z6.js → spriteMapper-CajFGgUU.js} +2 -2
  18. package/dist/chunks/spriteMapper-CajFGgUU.js.map +1 -0
  19. package/dist/chunks/tokens-Qrhlekc4.js.map +1 -1
  20. package/dist/chunks/{ui-DRov81qO.js → ui-CgjJDJdZ.js} +1346 -1195
  21. package/dist/chunks/ui-CgjJDJdZ.js.map +1 -0
  22. package/dist/components/CardFan.d.ts +0 -9
  23. package/dist/components/JamlAestheticSelector.d.ts +3 -3
  24. package/dist/components/JamlIde.d.ts +1 -4
  25. package/dist/components/JamlSeedSpinner.d.ts +3 -1
  26. package/dist/components/Jamlyzer.d.ts +5 -8
  27. package/dist/components/MotelyHello.d.ts +5 -0
  28. package/dist/components/SeedFinderApp.d.ts +7 -0
  29. package/dist/components/StandardCard.d.ts +14 -0
  30. package/dist/components/cardEnums.d.ts +48 -0
  31. package/dist/components/jamlMap/JokerPicker.d.ts +2 -1
  32. package/dist/components/jamlMap/MysterySlot.d.ts +2 -1
  33. package/dist/core.d.ts +1 -0
  34. package/dist/core.js +7 -7
  35. package/dist/core.js.map +1 -1
  36. package/dist/hooks/useAnalyzer.d.ts +1 -1
  37. package/dist/hooks/useSearchPool.d.ts +1 -1
  38. package/dist/index.d.ts +6 -4
  39. package/dist/index.js +3870 -3591
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/data/constants.d.ts +3 -3
  42. package/dist/lib/jaml/jamlData.d.ts +1 -0
  43. package/dist/lib/jaml/jamlSchema.d.ts +10 -60
  44. package/dist/lib/jaml/jamlSeeds.d.ts +7 -0
  45. package/dist/lib/types.d.ts +3 -2
  46. package/dist/motely.d.ts +1 -2
  47. package/dist/motely.js +125 -1999
  48. package/dist/motely.js.map +1 -1
  49. package/dist/r3f.js +1 -1
  50. package/dist/r3f.js.map +1 -1
  51. package/dist/ui/JimboBadge.d.ts +1 -1
  52. package/dist/ui/{footer.d.ts → JimboBalatroFooter.d.ts} +4 -2
  53. package/dist/ui/JimboCopyButton.d.ts +27 -0
  54. package/dist/ui/JimboDeckAndStakeSelectorModal.d.ts +30 -0
  55. package/dist/ui/JimboIconButton.d.ts +8 -3
  56. package/dist/ui/JimboInlineEdit.d.ts +16 -0
  57. package/dist/ui/JimboListItem.d.ts +11 -0
  58. package/dist/ui/JimboPanelSplitter.d.ts +8 -0
  59. package/dist/ui/JimboSeedCopyChip.d.ts +16 -0
  60. package/dist/ui/JimboSelect.d.ts +15 -3
  61. package/dist/ui/JimboSpinner.d.ts +18 -0
  62. package/dist/ui/JimboStepper.d.ts +19 -7
  63. package/dist/ui/JimboValueBadge.d.ts +19 -0
  64. package/dist/ui/codeBlock.d.ts +4 -0
  65. package/dist/ui/hooks.d.ts +30 -3
  66. package/dist/ui/jimbo.css +1 -1
  67. package/dist/ui/jimboApp.d.ts +2 -2
  68. package/dist/ui/jimboBackground.d.ts +12 -5
  69. package/dist/ui/jimboCopyRow.d.ts +2 -2
  70. package/dist/ui/jimboInset.d.ts +3 -3
  71. package/dist/ui/jimboLayout.d.ts +25 -0
  72. package/dist/ui/jimboLink.d.ts +12 -0
  73. package/dist/ui/jimboTabs.d.ts +6 -6
  74. package/dist/ui/jimboText.d.ts +2 -3
  75. package/dist/ui.d.ts +12 -4
  76. package/dist/ui.js +3 -3
  77. package/fonts.css +20 -5
  78. package/package.json +7 -6
  79. package/assets/fonts/m6x11plusplus.otf +0 -0
  80. package/dist/assets/searchPoolWorker-BPJ3Mf0o.js +0 -40
  81. package/dist/assets/searchPoolWorker-BPJ3Mf0o.js.map +0 -1
  82. package/dist/chunks/Layer-Ckd_T6Fw.js +0 -17
  83. package/dist/chunks/Layer-Ckd_T6Fw.js.map +0 -1
  84. package/dist/chunks/assets-D80i9sMq.js.map +0 -1
  85. package/dist/chunks/runtime-C-It0krH.js +0 -10
  86. package/dist/chunks/runtime-C-It0krH.js.map +0 -1
  87. package/dist/chunks/searchPoolWorker-DUope_8B.js.map +0 -1
  88. package/dist/chunks/spriteMapper-C4_5G1Z6.js.map +0 -1
  89. package/dist/chunks/ui-DRov81qO.js.map +0 -1
  90. package/dist/components/CardList.d.ts +0 -8
  91. package/dist/components/Standardcard.d.ts +0 -18
  92. package/dist/config.d.ts +0 -10
  93. package/dist/fonts/m6x11plus.otf +0 -0
  94. package/dist/hooks/useMotelyRuntime.d.ts +0 -11
  95. package/dist/providers/MotelyProvider.d.ts +0 -11
  96. package/dist/ui/JimboFloating.d.ts +0 -8
  97. package/dist/ui/PanelSplitter.d.ts +0 -8
  98. package/jaml.schema.json +0 -1219
@@ -1 +1 @@
1
- {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemFormats.ts","../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts","../src/providers/MotelyProvider.tsx","../src/hooks/useMotelyRuntime.ts"],"sourcesContent":["export const MOTELY_ITEM_FORMATS_BY_VALUE = Object.freeze({\n 4096: Object.freeze({ value: 4096, enumName: \"TwoOfClubs\", displayName: \"2 of Clubs\", category: \"Standardcard\" }),\n 4097: Object.freeze({ value: 4097, enumName: \"ThreeOfClubs\", displayName: \"3 of Clubs\", category: \"Standardcard\" }),\n 4098: Object.freeze({ value: 4098, enumName: \"FourOfClubs\", displayName: \"4 of Clubs\", category: \"Standardcard\" }),\n 4099: Object.freeze({ value: 4099, enumName: \"FiveOfClubs\", displayName: \"5 of Clubs\", category: \"Standardcard\" }),\n 4100: Object.freeze({ value: 4100, enumName: \"SixOfClubs\", displayName: \"6 of Clubs\", category: \"Standardcard\" }),\n 4101: Object.freeze({ value: 4101, enumName: \"SevenOfClubs\", displayName: \"7 of Clubs\", category: \"Standardcard\" }),\n 4102: Object.freeze({ value: 4102, enumName: \"EightOfClubs\", displayName: \"8 of Clubs\", category: \"Standardcard\" }),\n 4103: Object.freeze({ value: 4103, enumName: \"NineOfClubs\", displayName: \"9 of Clubs\", category: \"Standardcard\" }),\n 4104: Object.freeze({ value: 4104, enumName: \"TenOfClubs\", displayName: \"10 of Clubs\", category: \"Standardcard\" }),\n 4105: Object.freeze({ value: 4105, enumName: \"JackOfClubs\", displayName: \"Jack of Clubs\", category: \"Standardcard\" }),\n 4106: Object.freeze({ value: 4106, enumName: \"QueenOfClubs\", displayName: \"Queen of Clubs\", category: \"Standardcard\" }),\n 4107: Object.freeze({ value: 4107, enumName: \"KingOfClubs\", displayName: \"King of Clubs\", category: \"Standardcard\" }),\n 4108: Object.freeze({ value: 4108, enumName: \"AceOfClubs\", displayName: \"Ace of Clubs\", category: \"Standardcard\" }),\n 4112: Object.freeze({ value: 4112, enumName: \"TwoOfDiamonds\", displayName: \"2 of Diamonds\", category: \"Standardcard\" }),\n 4113: Object.freeze({ value: 4113, enumName: \"ThreeOfDiamonds\", displayName: \"3 of Diamonds\", category: \"Standardcard\" }),\n 4114: Object.freeze({ value: 4114, enumName: \"FourOfDiamonds\", displayName: \"4 of Diamonds\", category: \"Standardcard\" }),\n 4115: Object.freeze({ value: 4115, enumName: \"FiveOfDiamonds\", displayName: \"5 of Diamonds\", category: \"Standardcard\" }),\n 4116: Object.freeze({ value: 4116, enumName: \"SixOfDiamonds\", displayName: \"6 of Diamonds\", category: \"Standardcard\" }),\n 4117: Object.freeze({ value: 4117, enumName: \"SevenOfDiamonds\", displayName: \"7 of Diamonds\", category: \"Standardcard\" }),\n 4118: Object.freeze({ value: 4118, enumName: \"EightOfDiamonds\", displayName: \"8 of Diamonds\", category: \"Standardcard\" }),\n 4119: Object.freeze({ value: 4119, enumName: \"NineOfDiamonds\", displayName: \"9 of Diamonds\", category: \"Standardcard\" }),\n 4120: Object.freeze({ value: 4120, enumName: \"TenOfDiamonds\", displayName: \"10 of Diamonds\", category: \"Standardcard\" }),\n 4121: Object.freeze({ value: 4121, enumName: \"JackOfDiamonds\", displayName: \"Jack of Diamonds\", category: \"Standardcard\" }),\n 4122: Object.freeze({ value: 4122, enumName: \"QueenOfDiamonds\", displayName: \"Queen of Diamonds\", category: \"Standardcard\" }),\n 4123: Object.freeze({ value: 4123, enumName: \"KingOfDiamonds\", displayName: \"King of Diamonds\", category: \"Standardcard\" }),\n 4124: Object.freeze({ value: 4124, enumName: \"AceOfDiamonds\", displayName: \"Ace of Diamonds\", category: \"Standardcard\" }),\n 4128: Object.freeze({ value: 4128, enumName: \"TwoOfHearts\", displayName: \"2 of Hearts\", category: \"Standardcard\" }),\n 4129: Object.freeze({ value: 4129, enumName: \"ThreeOfHearts\", displayName: \"3 of Hearts\", category: \"Standardcard\" }),\n 4130: Object.freeze({ value: 4130, enumName: \"FourOfHearts\", displayName: \"4 of Hearts\", category: \"Standardcard\" }),\n 4131: Object.freeze({ value: 4131, enumName: \"FiveOfHearts\", displayName: \"5 of Hearts\", category: \"Standardcard\" }),\n 4132: Object.freeze({ value: 4132, enumName: \"SixOfHearts\", displayName: \"6 of Hearts\", category: \"Standardcard\" }),\n 4133: Object.freeze({ value: 4133, enumName: \"SevenOfHearts\", displayName: \"7 of Hearts\", category: \"Standardcard\" }),\n 4134: Object.freeze({ value: 4134, enumName: \"EightOfHearts\", displayName: \"8 of Hearts\", category: \"Standardcard\" }),\n 4135: Object.freeze({ value: 4135, enumName: \"NineOfHearts\", displayName: \"9 of Hearts\", category: \"Standardcard\" }),\n 4136: Object.freeze({ value: 4136, enumName: \"TenOfHearts\", displayName: \"10 of Hearts\", category: \"Standardcard\" }),\n 4137: Object.freeze({ value: 4137, enumName: \"JackOfHearts\", displayName: \"Jack of Hearts\", category: \"Standardcard\" }),\n 4138: Object.freeze({ value: 4138, enumName: \"QueenOfHearts\", displayName: \"Queen of Hearts\", category: \"Standardcard\" }),\n 4139: Object.freeze({ value: 4139, enumName: \"KingOfHearts\", displayName: \"King of Hearts\", category: \"Standardcard\" }),\n 4140: Object.freeze({ value: 4140, enumName: \"AceOfHearts\", displayName: \"Ace of Hearts\", category: \"Standardcard\" }),\n 4144: Object.freeze({ value: 4144, enumName: \"TwoOfSpades\", displayName: \"2 of Spades\", category: \"Standardcard\" }),\n 4145: Object.freeze({ value: 4145, enumName: \"ThreeOfSpades\", displayName: \"3 of Spades\", category: \"Standardcard\" }),\n 4146: Object.freeze({ value: 4146, enumName: \"FourOfSpades\", displayName: \"4 of Spades\", category: \"Standardcard\" }),\n 4147: Object.freeze({ value: 4147, enumName: \"FiveOfSpades\", displayName: \"5 of Spades\", category: \"Standardcard\" }),\n 4148: Object.freeze({ value: 4148, enumName: \"SixOfSpades\", displayName: \"6 of Spades\", category: \"Standardcard\" }),\n 4149: Object.freeze({ value: 4149, enumName: \"SevenOfSpades\", displayName: \"7 of Spades\", category: \"Standardcard\" }),\n 4150: Object.freeze({ value: 4150, enumName: \"EightOfSpades\", displayName: \"8 of Spades\", category: \"Standardcard\" }),\n 4151: Object.freeze({ value: 4151, enumName: \"NineOfSpades\", displayName: \"9 of Spades\", category: \"Standardcard\" }),\n 4152: Object.freeze({ value: 4152, enumName: \"TenOfSpades\", displayName: \"10 of Spades\", category: \"Standardcard\" }),\n 4153: Object.freeze({ value: 4153, enumName: \"JackOfSpades\", displayName: \"Jack of Spades\", category: \"Standardcard\" }),\n 4154: Object.freeze({ value: 4154, enumName: \"QueenOfSpades\", displayName: \"Queen of Spades\", category: \"Standardcard\" }),\n 4155: Object.freeze({ value: 4155, enumName: \"KingOfSpades\", displayName: \"King of Spades\", category: \"Standardcard\" }),\n 4156: Object.freeze({ value: 4156, enumName: \"AceOfSpades\", displayName: \"Ace of Spades\", category: \"Standardcard\" }),\n 8192: Object.freeze({ value: 8192, enumName: \"Familiar\", displayName: \"Familiar\", category: \"SpectralCard\" }),\n 8193: Object.freeze({ value: 8193, enumName: \"Grim\", displayName: \"Grim\", category: \"SpectralCard\" }),\n 8194: Object.freeze({ value: 8194, enumName: \"Incantation\", displayName: \"Incantation\", category: \"SpectralCard\" }),\n 8195: Object.freeze({ value: 8195, enumName: \"Talisman\", displayName: \"Talisman\", category: \"SpectralCard\" }),\n 8196: Object.freeze({ value: 8196, enumName: \"Aura\", displayName: \"Aura\", category: \"SpectralCard\" }),\n 8197: Object.freeze({ value: 8197, enumName: \"Wraith\", displayName: \"Wraith\", category: \"SpectralCard\" }),\n 8198: Object.freeze({ value: 8198, enumName: \"Sigil\", displayName: \"Sigil\", category: \"SpectralCard\" }),\n 8199: Object.freeze({ value: 8199, enumName: \"Ouija\", displayName: \"Ouija\", category: \"SpectralCard\" }),\n 8200: Object.freeze({ value: 8200, enumName: \"Ectoplasm\", displayName: \"Ectoplasm\", category: \"SpectralCard\" }),\n 8201: Object.freeze({ value: 8201, enumName: \"Immolate\", displayName: \"Immolate\", category: \"SpectralCard\" }),\n 8202: Object.freeze({ value: 8202, enumName: \"Ankh\", displayName: \"Ankh\", category: \"SpectralCard\" }),\n 8203: Object.freeze({ value: 8203, enumName: \"DejaVu\", displayName: \"Deja Vu\", category: \"SpectralCard\" }),\n 8204: Object.freeze({ value: 8204, enumName: \"Hex\", displayName: \"Hex\", category: \"SpectralCard\" }),\n 8205: Object.freeze({ value: 8205, enumName: \"Trance\", displayName: \"Trance\", category: \"SpectralCard\" }),\n 8206: Object.freeze({ value: 8206, enumName: \"Medium\", displayName: \"Medium\", category: \"SpectralCard\" }),\n 8207: Object.freeze({ value: 8207, enumName: \"Cryptid\", displayName: \"Cryptid\", category: \"SpectralCard\" }),\n 8208: Object.freeze({ value: 8208, enumName: \"TheSoul\", displayName: \"The Soul\", category: \"SpectralCard\" }),\n 8209: Object.freeze({ value: 8209, enumName: \"BlackHole\", displayName: \"Black Hole\", category: \"SpectralCard\" }),\n 12288: Object.freeze({ value: 12288, enumName: \"TheFool\", displayName: \"The Fool\", category: \"TarotCard\" }),\n 12289: Object.freeze({ value: 12289, enumName: \"TheMagician\", displayName: \"The Magician\", category: \"TarotCard\" }),\n 12290: Object.freeze({ value: 12290, enumName: \"TheHighPriestess\", displayName: \"The High Priestess\", category: \"TarotCard\" }),\n 12291: Object.freeze({ value: 12291, enumName: \"TheEmpress\", displayName: \"The Empress\", category: \"TarotCard\" }),\n 12292: Object.freeze({ value: 12292, enumName: \"TheEmperor\", displayName: \"The Emperor\", category: \"TarotCard\" }),\n 12293: Object.freeze({ value: 12293, enumName: \"TheHierophant\", displayName: \"The Hierophant\", category: \"TarotCard\" }),\n 12294: Object.freeze({ value: 12294, enumName: \"TheLovers\", displayName: \"The Lovers\", category: \"TarotCard\" }),\n 12295: Object.freeze({ value: 12295, enumName: \"TheChariot\", displayName: \"The Chariot\", category: \"TarotCard\" }),\n 12296: Object.freeze({ value: 12296, enumName: \"Justice\", displayName: \"Justice\", category: \"TarotCard\" }),\n 12297: Object.freeze({ value: 12297, enumName: \"TheHermit\", displayName: \"The Hermit\", category: \"TarotCard\" }),\n 12298: Object.freeze({ value: 12298, enumName: \"TheWheelOfFortune\", displayName: \"The Wheel of Fortune\", category: \"TarotCard\" }),\n 12299: Object.freeze({ value: 12299, enumName: \"Strength\", displayName: \"Strength\", category: \"TarotCard\" }),\n 12300: Object.freeze({ value: 12300, enumName: \"TheHangedMan\", displayName: \"The Hanged Man\", category: \"TarotCard\" }),\n 12301: Object.freeze({ value: 12301, enumName: \"Death\", displayName: \"Death\", category: \"TarotCard\" }),\n 12302: Object.freeze({ value: 12302, enumName: \"Temperance\", displayName: \"Temperance\", category: \"TarotCard\" }),\n 12303: Object.freeze({ value: 12303, enumName: \"TheDevil\", displayName: \"The Devil\", category: \"TarotCard\" }),\n 12304: Object.freeze({ value: 12304, enumName: \"TheTower\", displayName: \"The Tower\", category: \"TarotCard\" }),\n 12305: Object.freeze({ value: 12305, enumName: \"TheStar\", displayName: \"The Star\", category: \"TarotCard\" }),\n 12306: Object.freeze({ value: 12306, enumName: \"TheMoon\", displayName: \"The Moon\", category: \"TarotCard\" }),\n 12307: Object.freeze({ value: 12307, enumName: \"TheSun\", displayName: \"The Sun\", category: \"TarotCard\" }),\n 12308: Object.freeze({ value: 12308, enumName: \"Judgement\", displayName: \"Judgement\", category: \"TarotCard\" }),\n 12309: Object.freeze({ value: 12309, enumName: \"TheWorld\", displayName: \"The World\", category: \"TarotCard\" }),\n 16384: Object.freeze({ value: 16384, enumName: \"Mercury\", displayName: \"Mercury\", category: \"PlanetCard\" }),\n 16385: Object.freeze({ value: 16385, enumName: \"Venus\", displayName: \"Venus\", category: \"PlanetCard\" }),\n 16386: Object.freeze({ value: 16386, enumName: \"Earth\", displayName: \"Earth\", category: \"PlanetCard\" }),\n 16387: Object.freeze({ value: 16387, enumName: \"Mars\", displayName: \"Mars\", category: \"PlanetCard\" }),\n 16388: Object.freeze({ value: 16388, enumName: \"Jupiter\", displayName: \"Jupiter\", category: \"PlanetCard\" }),\n 16389: Object.freeze({ value: 16389, enumName: \"Saturn\", displayName: \"Saturn\", category: \"PlanetCard\" }),\n 16390: Object.freeze({ value: 16390, enumName: \"Uranus\", displayName: \"Uranus\", category: \"PlanetCard\" }),\n 16391: Object.freeze({ value: 16391, enumName: \"Neptune\", displayName: \"Neptune\", category: \"PlanetCard\" }),\n 16392: Object.freeze({ value: 16392, enumName: \"Pluto\", displayName: \"Pluto\", category: \"PlanetCard\" }),\n 16393: Object.freeze({ value: 16393, enumName: \"PlanetX\", displayName: \"Planet X\", category: \"PlanetCard\" }),\n 16394: Object.freeze({ value: 16394, enumName: \"Ceres\", displayName: \"Ceres\", category: \"PlanetCard\" }),\n 16395: Object.freeze({ value: 16395, enumName: \"Eris\", displayName: \"Eris\", category: \"PlanetCard\" }),\n 20480: Object.freeze({ value: 20480, enumName: \"Joker\", displayName: \"Joker\", category: \"Joker\" }),\n 20481: Object.freeze({ value: 20481, enumName: \"GreedyJoker\", displayName: \"Greedy Joker\", category: \"Joker\" }),\n 20482: Object.freeze({ value: 20482, enumName: \"LustyJoker\", displayName: \"Lusty Joker\", category: \"Joker\" }),\n 20483: Object.freeze({ value: 20483, enumName: \"WrathfulJoker\", displayName: \"Wrathful Joker\", category: \"Joker\" }),\n 20484: Object.freeze({ value: 20484, enumName: \"GluttonousJoker\", displayName: \"Gluttonous Joker\", category: \"Joker\" }),\n 20485: Object.freeze({ value: 20485, enumName: \"JollyJoker\", displayName: \"Jolly Joker\", category: \"Joker\" }),\n 20486: Object.freeze({ value: 20486, enumName: \"ZanyJoker\", displayName: \"Zany Joker\", category: \"Joker\" }),\n 20487: Object.freeze({ value: 20487, enumName: \"MadJoker\", displayName: \"Mad Joker\", category: \"Joker\" }),\n 20488: Object.freeze({ value: 20488, enumName: \"CrazyJoker\", displayName: \"Crazy Joker\", category: \"Joker\" }),\n 20489: Object.freeze({ value: 20489, enumName: \"DrollJoker\", displayName: \"Droll Joker\", category: \"Joker\" }),\n 20490: Object.freeze({ value: 20490, enumName: \"SlyJoker\", displayName: \"Sly Joker\", category: \"Joker\" }),\n 20491: Object.freeze({ value: 20491, enumName: \"WilyJoker\", displayName: \"Wily Joker\", category: \"Joker\" }),\n 20492: Object.freeze({ value: 20492, enumName: \"CleverJoker\", displayName: \"Clever Joker\", category: \"Joker\" }),\n 20493: Object.freeze({ value: 20493, enumName: \"DeviousJoker\", displayName: \"Devious Joker\", category: \"Joker\" }),\n 20494: Object.freeze({ value: 20494, enumName: \"CraftyJoker\", displayName: \"Crafty Joker\", category: \"Joker\" }),\n 20495: Object.freeze({ value: 20495, enumName: \"HalfJoker\", displayName: \"Half Joker\", category: \"Joker\" }),\n 20496: Object.freeze({ value: 20496, enumName: \"CreditCard\", displayName: \"Credit Card\", category: \"Joker\" }),\n 20497: Object.freeze({ value: 20497, enumName: \"Banner\", displayName: \"Banner\", category: \"Joker\" }),\n 20498: Object.freeze({ value: 20498, enumName: \"MysticSummit\", displayName: \"Mystic Summit\", category: \"Joker\" }),\n 20499: Object.freeze({ value: 20499, enumName: \"EightBall\", displayName: \"8 Ball\", category: \"Joker\" }),\n 20500: Object.freeze({ value: 20500, enumName: \"Misprint\", displayName: \"Misprint\", category: \"Joker\" }),\n 20501: Object.freeze({ value: 20501, enumName: \"RaisedFist\", displayName: \"Raised Fist\", category: \"Joker\" }),\n 20502: Object.freeze({ value: 20502, enumName: \"ChaostheClown\", displayName: \"Chaos the Clown\", category: \"Joker\" }),\n 20503: Object.freeze({ value: 20503, enumName: \"ScaryFace\", displayName: \"Scary Face\", category: \"Joker\" }),\n 20504: Object.freeze({ value: 20504, enumName: \"AbstractJoker\", displayName: \"Abstract Joker\", category: \"Joker\" }),\n 20505: Object.freeze({ value: 20505, enumName: \"DelayedGratification\", displayName: \"Delayed Gratification\", category: \"Joker\" }),\n 20506: Object.freeze({ value: 20506, enumName: \"GrosMichel\", displayName: \"Gros Michel\", category: \"Joker\" }),\n 20507: Object.freeze({ value: 20507, enumName: \"EvenSteven\", displayName: \"Even Steven\", category: \"Joker\" }),\n 20508: Object.freeze({ value: 20508, enumName: \"OddTodd\", displayName: \"Odd Todd\", category: \"Joker\" }),\n 20509: Object.freeze({ value: 20509, enumName: \"Scholar\", displayName: \"Scholar\", category: \"Joker\" }),\n 20510: Object.freeze({ value: 20510, enumName: \"BusinessCard\", displayName: \"Business Card\", category: \"Joker\" }),\n 20511: Object.freeze({ value: 20511, enumName: \"Supernova\", displayName: \"Supernova\", category: \"Joker\" }),\n 20512: Object.freeze({ value: 20512, enumName: \"RideTheBus\", displayName: \"Ride the Bus\", category: \"Joker\" }),\n 20513: Object.freeze({ value: 20513, enumName: \"Egg\", displayName: \"Egg\", category: \"Joker\" }),\n 20514: Object.freeze({ value: 20514, enumName: \"Runner\", displayName: \"Runner\", category: \"Joker\" }),\n 20515: Object.freeze({ value: 20515, enumName: \"IceCream\", displayName: \"Ice Cream\", category: \"Joker\" }),\n 20516: Object.freeze({ value: 20516, enumName: \"Splash\", displayName: \"Splash\", category: \"Joker\" }),\n 20517: Object.freeze({ value: 20517, enumName: \"BlueJoker\", displayName: \"Blue Joker\", category: \"Joker\" }),\n 20518: Object.freeze({ value: 20518, enumName: \"FacelessJoker\", displayName: \"Faceless Joker\", category: \"Joker\" }),\n 20519: Object.freeze({ value: 20519, enumName: \"GreenJoker\", displayName: \"Green Joker\", category: \"Joker\" }),\n 20520: Object.freeze({ value: 20520, enumName: \"Superposition\", displayName: \"Superposition\", category: \"Joker\" }),\n 20521: Object.freeze({ value: 20521, enumName: \"ToDoList\", displayName: \"To Do List\", category: \"Joker\" }),\n 20522: Object.freeze({ value: 20522, enumName: \"Cavendish\", displayName: \"Cavendish\", category: \"Joker\" }),\n 20523: Object.freeze({ value: 20523, enumName: \"RedCard\", displayName: \"Red Card\", category: \"Joker\" }),\n 20524: Object.freeze({ value: 20524, enumName: \"SquareJoker\", displayName: \"Square Joker\", category: \"Joker\" }),\n 20525: Object.freeze({ value: 20525, enumName: \"RiffRaff\", displayName: \"Riff-raff\", category: \"Joker\" }),\n 20526: Object.freeze({ value: 20526, enumName: \"Photograph\", displayName: \"Photograph\", category: \"Joker\" }),\n 20527: Object.freeze({ value: 20527, enumName: \"ReservedParking\", displayName: \"Reserved Parking\", category: \"Joker\" }),\n 20528: Object.freeze({ value: 20528, enumName: \"MailInRebate\", displayName: \"Mail In Rebate\", category: \"Joker\" }),\n 20529: Object.freeze({ value: 20529, enumName: \"Hallucination\", displayName: \"Hallucination\", category: \"Joker\" }),\n 20530: Object.freeze({ value: 20530, enumName: \"FortuneTeller\", displayName: \"Fortune Teller\", category: \"Joker\" }),\n 20531: Object.freeze({ value: 20531, enumName: \"Juggler\", displayName: \"Juggler\", category: \"Joker\" }),\n 20532: Object.freeze({ value: 20532, enumName: \"Drunkard\", displayName: \"Drunkard\", category: \"Joker\" }),\n 20533: Object.freeze({ value: 20533, enumName: \"GoldenJoker\", displayName: \"Golden Joker\", category: \"Joker\" }),\n 20534: Object.freeze({ value: 20534, enumName: \"Popcorn\", displayName: \"Popcorn\", category: \"Joker\" }),\n 20535: Object.freeze({ value: 20535, enumName: \"WalkieTalkie\", displayName: \"Walkie Talkie\", category: \"Joker\" }),\n 20536: Object.freeze({ value: 20536, enumName: \"SmileyFace\", displayName: \"Smiley Face\", category: \"Joker\" }),\n 20537: Object.freeze({ value: 20537, enumName: \"GoldenTicket\", displayName: \"Golden Ticket\", category: \"Joker\" }),\n 20538: Object.freeze({ value: 20538, enumName: \"Swashbuckler\", displayName: \"Swashbuckler\", category: \"Joker\" }),\n 20539: Object.freeze({ value: 20539, enumName: \"HangingChad\", displayName: \"Hanging Chad\", category: \"Joker\" }),\n 20540: Object.freeze({ value: 20540, enumName: \"ShootTheMoon\", displayName: \"Shoot the Moon\", category: \"Joker\" }),\n 21504: Object.freeze({ value: 21504, enumName: \"JokerStencil\", displayName: \"Joker Stencil\", category: \"Joker\" }),\n 21505: Object.freeze({ value: 21505, enumName: \"FourFingers\", displayName: \"Four Fingers\", category: \"Joker\" }),\n 21506: Object.freeze({ value: 21506, enumName: \"Mime\", displayName: \"Mime\", category: \"Joker\" }),\n 21507: Object.freeze({ value: 21507, enumName: \"CeremonialDagger\", displayName: \"Ceremonial Dagger\", category: \"Joker\" }),\n 21508: Object.freeze({ value: 21508, enumName: \"MarbleJoker\", displayName: \"Marble Joker\", category: \"Joker\" }),\n 21509: Object.freeze({ value: 21509, enumName: \"LoyaltyCard\", displayName: \"Loyalty Card\", category: \"Joker\" }),\n 21510: Object.freeze({ value: 21510, enumName: \"Dusk\", displayName: \"Dusk\", category: \"Joker\" }),\n 21511: Object.freeze({ value: 21511, enumName: \"Fibonacci\", displayName: \"Fibonacci\", category: \"Joker\" }),\n 21512: Object.freeze({ value: 21512, enumName: \"SteelJoker\", displayName: \"Steel Joker\", category: \"Joker\" }),\n 21513: Object.freeze({ value: 21513, enumName: \"Hack\", displayName: \"Hack\", category: \"Joker\" }),\n 21514: Object.freeze({ value: 21514, enumName: \"Pareidolia\", displayName: \"Pareidolia\", category: \"Joker\" }),\n 21515: Object.freeze({ value: 21515, enumName: \"SpaceJoker\", displayName: \"Space Joker\", category: \"Joker\" }),\n 21516: Object.freeze({ value: 21516, enumName: \"Burglar\", displayName: \"Burglar\", category: \"Joker\" }),\n 21517: Object.freeze({ value: 21517, enumName: \"Blackboard\", displayName: \"Blackboard\", category: \"Joker\" }),\n 21518: Object.freeze({ value: 21518, enumName: \"SixthSense\", displayName: \"Sixth Sense\", category: \"Joker\" }),\n 21519: Object.freeze({ value: 21519, enumName: \"Constellation\", displayName: \"Constellation\", category: \"Joker\" }),\n 21520: Object.freeze({ value: 21520, enumName: \"Hiker\", displayName: \"Hiker\", category: \"Joker\" }),\n 21521: Object.freeze({ value: 21521, enumName: \"CardSharp\", displayName: \"Card Sharp\", category: \"Joker\" }),\n 21522: Object.freeze({ value: 21522, enumName: \"Madness\", displayName: \"Madness\", category: \"Joker\" }),\n 21523: Object.freeze({ value: 21523, enumName: \"Seance\", displayName: \"Seance\", category: \"Joker\" }),\n 21524: Object.freeze({ value: 21524, enumName: \"Vampire\", displayName: \"Vampire\", category: \"Joker\" }),\n 21525: Object.freeze({ value: 21525, enumName: \"Shortcut\", displayName: \"Shortcut\", category: \"Joker\" }),\n 21526: Object.freeze({ value: 21526, enumName: \"Hologram\", displayName: \"Hologram\", category: \"Joker\" }),\n 21527: Object.freeze({ value: 21527, enumName: \"Cloud9\", displayName: \"Cloud 9\", category: \"Joker\" }),\n 21528: Object.freeze({ value: 21528, enumName: \"Rocket\", displayName: \"Rocket\", category: \"Joker\" }),\n 21529: Object.freeze({ value: 21529, enumName: \"MidasMask\", displayName: \"Midas Mask\", category: \"Joker\" }),\n 21530: Object.freeze({ value: 21530, enumName: \"Luchador\", displayName: \"Luchador\", category: \"Joker\" }),\n 21531: Object.freeze({ value: 21531, enumName: \"GiftCard\", displayName: \"Gift Card\", category: \"Joker\" }),\n 21532: Object.freeze({ value: 21532, enumName: \"TurtleBean\", displayName: \"Turtle Bean\", category: \"Joker\" }),\n 21533: Object.freeze({ value: 21533, enumName: \"Erosion\", displayName: \"Erosion\", category: \"Joker\" }),\n 21534: Object.freeze({ value: 21534, enumName: \"ToTheMoon\", displayName: \"To the Moon\", category: \"Joker\" }),\n 21535: Object.freeze({ value: 21535, enumName: \"StoneJoker\", displayName: \"Stone Joker\", category: \"Joker\" }),\n 21536: Object.freeze({ value: 21536, enumName: \"LuckyCat\", displayName: \"Lucky Cat\", category: \"Joker\" }),\n 21537: Object.freeze({ value: 21537, enumName: \"Bull\", displayName: \"Bull\", category: \"Joker\" }),\n 21538: Object.freeze({ value: 21538, enumName: \"DietCola\", displayName: \"Diet Cola\", category: \"Joker\" }),\n 21539: Object.freeze({ value: 21539, enumName: \"TradingCard\", displayName: \"Trading Card\", category: \"Joker\" }),\n 21540: Object.freeze({ value: 21540, enumName: \"FlashCard\", displayName: \"Flash Card\", category: \"Joker\" }),\n 21541: Object.freeze({ value: 21541, enumName: \"SpareTrousers\", displayName: \"Spare Trousers\", category: \"Joker\" }),\n 21542: Object.freeze({ value: 21542, enumName: \"Ramen\", displayName: \"Ramen\", category: \"Joker\" }),\n 21543: Object.freeze({ value: 21543, enumName: \"Seltzer\", displayName: \"Seltzer\", category: \"Joker\" }),\n 21544: Object.freeze({ value: 21544, enumName: \"Castle\", displayName: \"Castle\", category: \"Joker\" }),\n 21545: Object.freeze({ value: 21545, enumName: \"MrBones\", displayName: \"Mr. Bones\", category: \"Joker\" }),\n 21546: Object.freeze({ value: 21546, enumName: \"Acrobat\", displayName: \"Acrobat\", category: \"Joker\" }),\n 21547: Object.freeze({ value: 21547, enumName: \"SockAndBuskin\", displayName: \"Sock and Buskin\", category: \"Joker\" }),\n 21548: Object.freeze({ value: 21548, enumName: \"Troubadour\", displayName: \"Troubadour\", category: \"Joker\" }),\n 21549: Object.freeze({ value: 21549, enumName: \"Certificate\", displayName: \"Certificate\", category: \"Joker\" }),\n 21550: Object.freeze({ value: 21550, enumName: \"SmearedJoker\", displayName: \"Smeared Joker\", category: \"Joker\" }),\n 21551: Object.freeze({ value: 21551, enumName: \"Throwback\", displayName: \"Throwback\", category: \"Joker\" }),\n 21552: Object.freeze({ value: 21552, enumName: \"RoughGem\", displayName: \"Rough Gem\", category: \"Joker\" }),\n 21553: Object.freeze({ value: 21553, enumName: \"Bloodstone\", displayName: \"Bloodstone\", category: \"Joker\" }),\n 21554: Object.freeze({ value: 21554, enumName: \"Arrowhead\", displayName: \"Arrowhead\", category: \"Joker\" }),\n 21555: Object.freeze({ value: 21555, enumName: \"OnyxAgate\", displayName: \"Onyx Agate\", category: \"Joker\" }),\n 21556: Object.freeze({ value: 21556, enumName: \"GlassJoker\", displayName: \"Glass Joker\", category: \"Joker\" }),\n 21557: Object.freeze({ value: 21557, enumName: \"Showman\", displayName: \"Showman\", category: \"Joker\" }),\n 21558: Object.freeze({ value: 21558, enumName: \"FlowerPot\", displayName: \"Flower Pot\", category: \"Joker\" }),\n 21559: Object.freeze({ value: 21559, enumName: \"MerryAndy\", displayName: \"Merry Andy\", category: \"Joker\" }),\n 21560: Object.freeze({ value: 21560, enumName: \"OopsAll6s\", displayName: \"Oops! All 6s\", category: \"Joker\" }),\n 21561: Object.freeze({ value: 21561, enumName: \"TheIdol\", displayName: \"The Idol\", category: \"Joker\" }),\n 21562: Object.freeze({ value: 21562, enumName: \"SeeingDouble\", displayName: \"Seeing Double\", category: \"Joker\" }),\n 21563: Object.freeze({ value: 21563, enumName: \"Matador\", displayName: \"Matador\", category: \"Joker\" }),\n 21564: Object.freeze({ value: 21564, enumName: \"Satellite\", displayName: \"Satellite\", category: \"Joker\" }),\n 21565: Object.freeze({ value: 21565, enumName: \"Cartomancer\", displayName: \"Cartomancer\", category: \"Joker\" }),\n 21566: Object.freeze({ value: 21566, enumName: \"Astronomer\", displayName: \"Astronomer\", category: \"Joker\" }),\n 21567: Object.freeze({ value: 21567, enumName: \"Bootstraps\", displayName: \"Bootstraps\", category: \"Joker\" }),\n 22528: Object.freeze({ value: 22528, enumName: \"DNA\", displayName: \"DNA\", category: \"Joker\" }),\n 22529: Object.freeze({ value: 22529, enumName: \"Vagabond\", displayName: \"Vagabond\", category: \"Joker\" }),\n 22530: Object.freeze({ value: 22530, enumName: \"Baron\", displayName: \"Baron\", category: \"Joker\" }),\n 22531: Object.freeze({ value: 22531, enumName: \"Obelisk\", displayName: \"Obelisk\", category: \"Joker\" }),\n 22532: Object.freeze({ value: 22532, enumName: \"BaseballCard\", displayName: \"Baseball Card\", category: \"Joker\" }),\n 22533: Object.freeze({ value: 22533, enumName: \"AncientJoker\", displayName: \"Ancient Joker\", category: \"Joker\" }),\n 22534: Object.freeze({ value: 22534, enumName: \"Campfire\", displayName: \"Campfire\", category: \"Joker\" }),\n 22535: Object.freeze({ value: 22535, enumName: \"Blueprint\", displayName: \"Blueprint\", category: \"Joker\" }),\n 22536: Object.freeze({ value: 22536, enumName: \"WeeJoker\", displayName: \"Wee Joker\", category: \"Joker\" }),\n 22537: Object.freeze({ value: 22537, enumName: \"HitTheRoad\", displayName: \"Hit the Road\", category: \"Joker\" }),\n 22538: Object.freeze({ value: 22538, enumName: \"TheDuo\", displayName: \"The Duo\", category: \"Joker\" }),\n 22539: Object.freeze({ value: 22539, enumName: \"TheTrio\", displayName: \"The Trio\", category: \"Joker\" }),\n 22540: Object.freeze({ value: 22540, enumName: \"TheFamily\", displayName: \"The Family\", category: \"Joker\" }),\n 22541: Object.freeze({ value: 22541, enumName: \"TheOrder\", displayName: \"The Order\", category: \"Joker\" }),\n 22542: Object.freeze({ value: 22542, enumName: \"TheTribe\", displayName: \"The Tribe\", category: \"Joker\" }),\n 22543: Object.freeze({ value: 22543, enumName: \"Stuntman\", displayName: \"Stuntman\", category: \"Joker\" }),\n 22544: Object.freeze({ value: 22544, enumName: \"InvisibleJoker\", displayName: \"Invisible Joker\", category: \"Joker\" }),\n 22545: Object.freeze({ value: 22545, enumName: \"Brainstorm\", displayName: \"Brainstorm\", category: \"Joker\" }),\n 22546: Object.freeze({ value: 22546, enumName: \"DriversLicense\", displayName: \"Driver\\u0027s License\", category: \"Joker\" }),\n 22547: Object.freeze({ value: 22547, enumName: \"BurntJoker\", displayName: \"Burnt Joker\", category: \"Joker\" }),\n 23552: Object.freeze({ value: 23552, enumName: \"Canio\", displayName: \"Canio\", category: \"Joker\" }),\n 23553: Object.freeze({ value: 23553, enumName: \"Triboulet\", displayName: \"Triboulet\", category: \"Joker\" }),\n 23554: Object.freeze({ value: 23554, enumName: \"Yorick\", displayName: \"Yorick\", category: \"Joker\" }),\n 23555: Object.freeze({ value: 23555, enumName: \"Chicot\", displayName: \"Chicot\", category: \"Joker\" }),\n 23556: Object.freeze({ value: 23556, enumName: \"Perkeo\", displayName: \"Perkeo\", category: \"Joker\" }),\n 61440: Object.freeze({ value: 61440, enumName: \"Invalid\", displayName: \"Invalid\", category: \"Invalid\" }),\n 61441: Object.freeze({ value: 61441, enumName: \"NotImplemented\", displayName: \"Not Implemented\", category: \"Invalid\" }),\n 61442: Object.freeze({ value: 61442, enumName: \"JokerExcludedByStream\", displayName: \"Joker Excluded By Stream\", category: \"Invalid\" }),\n 61443: Object.freeze({ value: 61443, enumName: \"PlanetExcludedByStream\", displayName: \"Planet Excluded By Stream\", category: \"Invalid\" }),\n 61444: Object.freeze({ value: 61444, enumName: \"TarotExcludedByStream\", displayName: \"Tarot Excluded By Stream\", category: \"Invalid\" }),\n 61445: Object.freeze({ value: 61445, enumName: \"SpectralExcludedByStream\", displayName: \"Spectral Excluded By Stream\", category: \"Invalid\" }),\n});\n\nexport const MOTELY_ITEM_FORMATS_BY_ENUM_NAME = Object.freeze({\n AbstractJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20504],\n AceOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4108],\n AceOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4124],\n AceOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4140],\n AceOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4156],\n Acrobat: MOTELY_ITEM_FORMATS_BY_VALUE[21546],\n AncientJoker: MOTELY_ITEM_FORMATS_BY_VALUE[22533],\n Ankh: MOTELY_ITEM_FORMATS_BY_VALUE[8202],\n Arrowhead: MOTELY_ITEM_FORMATS_BY_VALUE[21554],\n Astronomer: MOTELY_ITEM_FORMATS_BY_VALUE[21566],\n Aura: MOTELY_ITEM_FORMATS_BY_VALUE[8196],\n Banner: MOTELY_ITEM_FORMATS_BY_VALUE[20497],\n Baron: MOTELY_ITEM_FORMATS_BY_VALUE[22530],\n BaseballCard: MOTELY_ITEM_FORMATS_BY_VALUE[22532],\n BlackHole: MOTELY_ITEM_FORMATS_BY_VALUE[8209],\n Blackboard: MOTELY_ITEM_FORMATS_BY_VALUE[21517],\n Bloodstone: MOTELY_ITEM_FORMATS_BY_VALUE[21553],\n BlueJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20517],\n Blueprint: MOTELY_ITEM_FORMATS_BY_VALUE[22535],\n Bootstraps: MOTELY_ITEM_FORMATS_BY_VALUE[21567],\n Brainstorm: MOTELY_ITEM_FORMATS_BY_VALUE[22545],\n Bull: MOTELY_ITEM_FORMATS_BY_VALUE[21537],\n Burglar: MOTELY_ITEM_FORMATS_BY_VALUE[21516],\n BurntJoker: MOTELY_ITEM_FORMATS_BY_VALUE[22547],\n BusinessCard: MOTELY_ITEM_FORMATS_BY_VALUE[20510],\n Campfire: MOTELY_ITEM_FORMATS_BY_VALUE[22534],\n Canio: MOTELY_ITEM_FORMATS_BY_VALUE[23552],\n CardSharp: MOTELY_ITEM_FORMATS_BY_VALUE[21521],\n Cartomancer: MOTELY_ITEM_FORMATS_BY_VALUE[21565],\n Castle: MOTELY_ITEM_FORMATS_BY_VALUE[21544],\n Cavendish: MOTELY_ITEM_FORMATS_BY_VALUE[20522],\n CeremonialDagger: MOTELY_ITEM_FORMATS_BY_VALUE[21507],\n Ceres: MOTELY_ITEM_FORMATS_BY_VALUE[16394],\n Certificate: MOTELY_ITEM_FORMATS_BY_VALUE[21549],\n ChaostheClown: MOTELY_ITEM_FORMATS_BY_VALUE[20502],\n Chicot: MOTELY_ITEM_FORMATS_BY_VALUE[23555],\n CleverJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20492],\n Cloud9: MOTELY_ITEM_FORMATS_BY_VALUE[21527],\n Constellation: MOTELY_ITEM_FORMATS_BY_VALUE[21519],\n CraftyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20494],\n CrazyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20488],\n CreditCard: MOTELY_ITEM_FORMATS_BY_VALUE[20496],\n Cryptid: MOTELY_ITEM_FORMATS_BY_VALUE[8207],\n DNA: MOTELY_ITEM_FORMATS_BY_VALUE[22528],\n Death: MOTELY_ITEM_FORMATS_BY_VALUE[12301],\n DejaVu: MOTELY_ITEM_FORMATS_BY_VALUE[8203],\n DelayedGratification: MOTELY_ITEM_FORMATS_BY_VALUE[20505],\n DeviousJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20493],\n DietCola: MOTELY_ITEM_FORMATS_BY_VALUE[21538],\n DriversLicense: MOTELY_ITEM_FORMATS_BY_VALUE[22546],\n DrollJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20489],\n Drunkard: MOTELY_ITEM_FORMATS_BY_VALUE[20532],\n Dusk: MOTELY_ITEM_FORMATS_BY_VALUE[21510],\n Earth: MOTELY_ITEM_FORMATS_BY_VALUE[16386],\n Ectoplasm: MOTELY_ITEM_FORMATS_BY_VALUE[8200],\n Egg: MOTELY_ITEM_FORMATS_BY_VALUE[20513],\n EightBall: MOTELY_ITEM_FORMATS_BY_VALUE[20499],\n EightOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4102],\n EightOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4118],\n EightOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4134],\n EightOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4150],\n Eris: MOTELY_ITEM_FORMATS_BY_VALUE[16395],\n Erosion: MOTELY_ITEM_FORMATS_BY_VALUE[21533],\n EvenSteven: MOTELY_ITEM_FORMATS_BY_VALUE[20507],\n FacelessJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20518],\n Familiar: MOTELY_ITEM_FORMATS_BY_VALUE[8192],\n Fibonacci: MOTELY_ITEM_FORMATS_BY_VALUE[21511],\n FiveOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4099],\n FiveOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4115],\n FiveOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4131],\n FiveOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4147],\n FlashCard: MOTELY_ITEM_FORMATS_BY_VALUE[21540],\n FlowerPot: MOTELY_ITEM_FORMATS_BY_VALUE[21558],\n FortuneTeller: MOTELY_ITEM_FORMATS_BY_VALUE[20530],\n FourFingers: MOTELY_ITEM_FORMATS_BY_VALUE[21505],\n FourOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4098],\n FourOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4114],\n FourOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4130],\n FourOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4146],\n GiftCard: MOTELY_ITEM_FORMATS_BY_VALUE[21531],\n GlassJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21556],\n GluttonousJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20484],\n GoldenJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20533],\n GoldenTicket: MOTELY_ITEM_FORMATS_BY_VALUE[20537],\n GreedyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20481],\n GreenJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20519],\n Grim: MOTELY_ITEM_FORMATS_BY_VALUE[8193],\n GrosMichel: MOTELY_ITEM_FORMATS_BY_VALUE[20506],\n Hack: MOTELY_ITEM_FORMATS_BY_VALUE[21513],\n HalfJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20495],\n Hallucination: MOTELY_ITEM_FORMATS_BY_VALUE[20529],\n HangingChad: MOTELY_ITEM_FORMATS_BY_VALUE[20539],\n Hex: MOTELY_ITEM_FORMATS_BY_VALUE[8204],\n Hiker: MOTELY_ITEM_FORMATS_BY_VALUE[21520],\n HitTheRoad: MOTELY_ITEM_FORMATS_BY_VALUE[22537],\n Hologram: MOTELY_ITEM_FORMATS_BY_VALUE[21526],\n IceCream: MOTELY_ITEM_FORMATS_BY_VALUE[20515],\n Immolate: MOTELY_ITEM_FORMATS_BY_VALUE[8201],\n Incantation: MOTELY_ITEM_FORMATS_BY_VALUE[8194],\n Invalid: MOTELY_ITEM_FORMATS_BY_VALUE[61440],\n InvisibleJoker: MOTELY_ITEM_FORMATS_BY_VALUE[22544],\n JackOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4105],\n JackOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4121],\n JackOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4137],\n JackOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4153],\n Joker: MOTELY_ITEM_FORMATS_BY_VALUE[20480],\n JokerExcludedByStream: MOTELY_ITEM_FORMATS_BY_VALUE[61442],\n JokerStencil: MOTELY_ITEM_FORMATS_BY_VALUE[21504],\n JollyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20485],\n Judgement: MOTELY_ITEM_FORMATS_BY_VALUE[12308],\n Juggler: MOTELY_ITEM_FORMATS_BY_VALUE[20531],\n Jupiter: MOTELY_ITEM_FORMATS_BY_VALUE[16388],\n Justice: MOTELY_ITEM_FORMATS_BY_VALUE[12296],\n KingOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4107],\n KingOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4123],\n KingOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4139],\n KingOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4155],\n LoyaltyCard: MOTELY_ITEM_FORMATS_BY_VALUE[21509],\n Luchador: MOTELY_ITEM_FORMATS_BY_VALUE[21530],\n LuckyCat: MOTELY_ITEM_FORMATS_BY_VALUE[21536],\n LustyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20482],\n MadJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20487],\n Madness: MOTELY_ITEM_FORMATS_BY_VALUE[21522],\n MailInRebate: MOTELY_ITEM_FORMATS_BY_VALUE[20528],\n MarbleJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21508],\n Mars: MOTELY_ITEM_FORMATS_BY_VALUE[16387],\n Matador: MOTELY_ITEM_FORMATS_BY_VALUE[21563],\n Medium: MOTELY_ITEM_FORMATS_BY_VALUE[8206],\n Mercury: MOTELY_ITEM_FORMATS_BY_VALUE[16384],\n MerryAndy: MOTELY_ITEM_FORMATS_BY_VALUE[21559],\n MidasMask: MOTELY_ITEM_FORMATS_BY_VALUE[21529],\n Mime: MOTELY_ITEM_FORMATS_BY_VALUE[21506],\n Misprint: MOTELY_ITEM_FORMATS_BY_VALUE[20500],\n MrBones: MOTELY_ITEM_FORMATS_BY_VALUE[21545],\n MysticSummit: MOTELY_ITEM_FORMATS_BY_VALUE[20498],\n Neptune: MOTELY_ITEM_FORMATS_BY_VALUE[16391],\n NineOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4103],\n NineOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4119],\n NineOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4135],\n NineOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4151],\n NotImplemented: MOTELY_ITEM_FORMATS_BY_VALUE[61441],\n Obelisk: MOTELY_ITEM_FORMATS_BY_VALUE[22531],\n OddTodd: MOTELY_ITEM_FORMATS_BY_VALUE[20508],\n OnyxAgate: MOTELY_ITEM_FORMATS_BY_VALUE[21555],\n OopsAll6s: MOTELY_ITEM_FORMATS_BY_VALUE[21560],\n Ouija: MOTELY_ITEM_FORMATS_BY_VALUE[8199],\n Pareidolia: MOTELY_ITEM_FORMATS_BY_VALUE[21514],\n Perkeo: MOTELY_ITEM_FORMATS_BY_VALUE[23556],\n Photograph: MOTELY_ITEM_FORMATS_BY_VALUE[20526],\n PlanetExcludedByStream: MOTELY_ITEM_FORMATS_BY_VALUE[61443],\n PlanetX: MOTELY_ITEM_FORMATS_BY_VALUE[16393],\n Pluto: MOTELY_ITEM_FORMATS_BY_VALUE[16392],\n Popcorn: MOTELY_ITEM_FORMATS_BY_VALUE[20534],\n QueenOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4106],\n QueenOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4122],\n QueenOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4138],\n QueenOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4154],\n RaisedFist: MOTELY_ITEM_FORMATS_BY_VALUE[20501],\n Ramen: MOTELY_ITEM_FORMATS_BY_VALUE[21542],\n RedCard: MOTELY_ITEM_FORMATS_BY_VALUE[20523],\n ReservedParking: MOTELY_ITEM_FORMATS_BY_VALUE[20527],\n RideTheBus: MOTELY_ITEM_FORMATS_BY_VALUE[20512],\n RiffRaff: MOTELY_ITEM_FORMATS_BY_VALUE[20525],\n Rocket: MOTELY_ITEM_FORMATS_BY_VALUE[21528],\n RoughGem: MOTELY_ITEM_FORMATS_BY_VALUE[21552],\n Runner: MOTELY_ITEM_FORMATS_BY_VALUE[20514],\n Satellite: MOTELY_ITEM_FORMATS_BY_VALUE[21564],\n Saturn: MOTELY_ITEM_FORMATS_BY_VALUE[16389],\n ScaryFace: MOTELY_ITEM_FORMATS_BY_VALUE[20503],\n Scholar: MOTELY_ITEM_FORMATS_BY_VALUE[20509],\n Seance: MOTELY_ITEM_FORMATS_BY_VALUE[21523],\n SeeingDouble: MOTELY_ITEM_FORMATS_BY_VALUE[21562],\n Seltzer: MOTELY_ITEM_FORMATS_BY_VALUE[21543],\n SevenOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4101],\n SevenOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4117],\n SevenOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4133],\n SevenOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4149],\n ShootTheMoon: MOTELY_ITEM_FORMATS_BY_VALUE[20540],\n Shortcut: MOTELY_ITEM_FORMATS_BY_VALUE[21525],\n Showman: MOTELY_ITEM_FORMATS_BY_VALUE[21557],\n Sigil: MOTELY_ITEM_FORMATS_BY_VALUE[8198],\n SixOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4100],\n SixOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4116],\n SixOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4132],\n SixOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4148],\n SixthSense: MOTELY_ITEM_FORMATS_BY_VALUE[21518],\n SlyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20490],\n SmearedJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21550],\n SmileyFace: MOTELY_ITEM_FORMATS_BY_VALUE[20536],\n SockAndBuskin: MOTELY_ITEM_FORMATS_BY_VALUE[21547],\n SpaceJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21515],\n SpareTrousers: MOTELY_ITEM_FORMATS_BY_VALUE[21541],\n SpectralExcludedByStream: MOTELY_ITEM_FORMATS_BY_VALUE[61445],\n Splash: MOTELY_ITEM_FORMATS_BY_VALUE[20516],\n SquareJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20524],\n SteelJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21512],\n StoneJoker: MOTELY_ITEM_FORMATS_BY_VALUE[21535],\n Strength: MOTELY_ITEM_FORMATS_BY_VALUE[12299],\n Stuntman: MOTELY_ITEM_FORMATS_BY_VALUE[22543],\n Supernova: MOTELY_ITEM_FORMATS_BY_VALUE[20511],\n Superposition: MOTELY_ITEM_FORMATS_BY_VALUE[20520],\n Swashbuckler: MOTELY_ITEM_FORMATS_BY_VALUE[20538],\n Talisman: MOTELY_ITEM_FORMATS_BY_VALUE[8195],\n TarotExcludedByStream: MOTELY_ITEM_FORMATS_BY_VALUE[61444],\n Temperance: MOTELY_ITEM_FORMATS_BY_VALUE[12302],\n TenOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4104],\n TenOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4120],\n TenOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4136],\n TenOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4152],\n TheChariot: MOTELY_ITEM_FORMATS_BY_VALUE[12295],\n TheDevil: MOTELY_ITEM_FORMATS_BY_VALUE[12303],\n TheDuo: MOTELY_ITEM_FORMATS_BY_VALUE[22538],\n TheEmperor: MOTELY_ITEM_FORMATS_BY_VALUE[12292],\n TheEmpress: MOTELY_ITEM_FORMATS_BY_VALUE[12291],\n TheFamily: MOTELY_ITEM_FORMATS_BY_VALUE[22540],\n TheFool: MOTELY_ITEM_FORMATS_BY_VALUE[12288],\n TheHangedMan: MOTELY_ITEM_FORMATS_BY_VALUE[12300],\n TheHermit: MOTELY_ITEM_FORMATS_BY_VALUE[12297],\n TheHierophant: MOTELY_ITEM_FORMATS_BY_VALUE[12293],\n TheHighPriestess: MOTELY_ITEM_FORMATS_BY_VALUE[12290],\n TheIdol: MOTELY_ITEM_FORMATS_BY_VALUE[21561],\n TheLovers: MOTELY_ITEM_FORMATS_BY_VALUE[12294],\n TheMagician: MOTELY_ITEM_FORMATS_BY_VALUE[12289],\n TheMoon: MOTELY_ITEM_FORMATS_BY_VALUE[12306],\n TheOrder: MOTELY_ITEM_FORMATS_BY_VALUE[22541],\n TheSoul: MOTELY_ITEM_FORMATS_BY_VALUE[8208],\n TheStar: MOTELY_ITEM_FORMATS_BY_VALUE[12305],\n TheSun: MOTELY_ITEM_FORMATS_BY_VALUE[12307],\n TheTower: MOTELY_ITEM_FORMATS_BY_VALUE[12304],\n TheTribe: MOTELY_ITEM_FORMATS_BY_VALUE[22542],\n TheTrio: MOTELY_ITEM_FORMATS_BY_VALUE[22539],\n TheWheelOfFortune: MOTELY_ITEM_FORMATS_BY_VALUE[12298],\n TheWorld: MOTELY_ITEM_FORMATS_BY_VALUE[12309],\n ThreeOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4097],\n ThreeOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4113],\n ThreeOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4129],\n ThreeOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4145],\n Throwback: MOTELY_ITEM_FORMATS_BY_VALUE[21551],\n ToDoList: MOTELY_ITEM_FORMATS_BY_VALUE[20521],\n ToTheMoon: MOTELY_ITEM_FORMATS_BY_VALUE[21534],\n TradingCard: MOTELY_ITEM_FORMATS_BY_VALUE[21539],\n Trance: MOTELY_ITEM_FORMATS_BY_VALUE[8205],\n Triboulet: MOTELY_ITEM_FORMATS_BY_VALUE[23553],\n Troubadour: MOTELY_ITEM_FORMATS_BY_VALUE[21548],\n TurtleBean: MOTELY_ITEM_FORMATS_BY_VALUE[21532],\n TwoOfClubs: MOTELY_ITEM_FORMATS_BY_VALUE[4096],\n TwoOfDiamonds: MOTELY_ITEM_FORMATS_BY_VALUE[4112],\n TwoOfHearts: MOTELY_ITEM_FORMATS_BY_VALUE[4128],\n TwoOfSpades: MOTELY_ITEM_FORMATS_BY_VALUE[4144],\n Uranus: MOTELY_ITEM_FORMATS_BY_VALUE[16390],\n Vagabond: MOTELY_ITEM_FORMATS_BY_VALUE[22529],\n Vampire: MOTELY_ITEM_FORMATS_BY_VALUE[21524],\n Venus: MOTELY_ITEM_FORMATS_BY_VALUE[16385],\n WalkieTalkie: MOTELY_ITEM_FORMATS_BY_VALUE[20535],\n WeeJoker: MOTELY_ITEM_FORMATS_BY_VALUE[22536],\n WilyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20491],\n Wraith: MOTELY_ITEM_FORMATS_BY_VALUE[8197],\n WrathfulJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20483],\n Yorick: MOTELY_ITEM_FORMATS_BY_VALUE[23554],\n ZanyJoker: MOTELY_ITEM_FORMATS_BY_VALUE[20486],\n});\n","import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst RANKS = [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"Jack\", \"Queen\", \"King\", \"Ace\"] as const;\nconst SUITS = [\"Clubs\", \"Diamonds\", \"Hearts\", \"Spades\"] as const;\nconst EDITIONS = [\"Base\", \"Foil\", \"Holographic\", \"Polychrome\", \"Negative\"] as const;\nconst SEALS = [\"None\", \"Gold\", \"Red\", \"Blue\", \"Purple\"] as const;\n\ntype RankName = (typeof RANKS)[number];\ntype SuitName = (typeof SUITS)[number];\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 itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\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 itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"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 const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? 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 = EDITIONS[val as keyof typeof EDITIONS];\n if (!key || key === \"Base\") 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 = SEALS[val as keyof typeof SEALS];\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 // Enhancements are not part of the current motely-wasm JS contract.\n return null;\n}\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.rank;\n if (val == null) return null;\n if (typeof input === \"number\") return RANKS[val & 0xf] ?? null;\n return RANKS[val] as RankName | undefined ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.suit;\n if (val == null) return null;\n if (typeof input === \"number\") return SUITS[(val >> 4) & 0xf] ?? null;\n return SUITS[val] as SuitName | undefined ?? 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 format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.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","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 \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.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 itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\n\ntry {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n} catch (error) {\n fileSystemInitError = error;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const isFileSystemReady = fileSystemPackage !== null;\n const [status, setStatus] = useState<JamlLibraryStatus>(() => isFileSystemReady ? \"idle\" : \"unsupported\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(() =>\n isFileSystemReady ? null : errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"),\n );\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n if (!isFileSystemReady) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, [isFileSystemReady]);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, type ReactNode } from \"react\";\nimport bootsharp from \"motely-wasm\";\nimport { ensureMotelyReady, type MotelyRuntimeStatus } from \"../lib/motely/runtime.js\";\n\nexport interface MotelyContextValue {\n status: MotelyRuntimeStatus;\n error: string | null;\n}\n\nexport const MotelyContext = createContext<MotelyContextValue | null>(null);\n\nfunction currentStatus(): MotelyRuntimeStatus {\n switch (bootsharp.getStatus()) {\n case bootsharp.BootStatus.Booted: return \"ready\";\n case bootsharp.BootStatus.Booting: return \"booting\";\n default: return \"idle\";\n }\n}\n\nexport function MotelyProvider({ children }: { children: ReactNode }) {\n const [status, setStatus] = useState<MotelyRuntimeStatus>(() => {\n const s = currentStatus();\n return s === \"idle\" ? \"booting\" : s;\n });\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (status === \"ready\") return;\n ensureMotelyReady()\n .then(() => setStatus(\"ready\"))\n .catch((err) => {\n setStatus(\"error\");\n setError(err instanceof Error ? err.message : String(err));\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <MotelyContext.Provider value={{ status, error }}>\n {children}\n </MotelyContext.Provider>\n );\n}\n\nexport function useMotelyContext(): MotelyContextValue | null {\n return useContext(MotelyContext);\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport bootsharp from \"motely-wasm\";\nimport { ensureMotelyReady, type MotelyRuntimeStatus } from \"../lib/motely/runtime.js\";\nimport { useMotelyContext } from \"../providers/MotelyProvider.js\";\n\nexport type { MotelyRuntimeStatus };\n\nexport interface UseMotelyRuntimeState {\n status: MotelyRuntimeStatus;\n ready: boolean;\n error: string | null;\n fsReady: boolean;\n fsError: string | null;\n ensureReady: () => Promise<void>;\n}\n\nfunction currentStatus(): MotelyRuntimeStatus {\n switch (bootsharp.getStatus()) {\n case bootsharp.BootStatus.Booted: return \"ready\";\n case bootsharp.BootStatus.Booting: return \"booting\";\n default: return \"idle\";\n }\n}\n\nexport function useMotelyRuntime(): UseMotelyRuntimeState {\n const ctx = useMotelyContext();\n const [localStatus, setLocalStatus] = useState<MotelyRuntimeStatus>(currentStatus);\n const [localError, setLocalError] = useState<string | null>(null);\n\n const status = ctx?.status ?? localStatus;\n const error = ctx?.error ?? localError;\n\n const ensureReady = useCallback(async () => {\n try {\n if (!ctx) {\n setLocalStatus(currentStatus());\n if (bootsharp.getStatus() === bootsharp.BootStatus.Standby) {\n setLocalStatus(\"booting\");\n await ensureMotelyReady();\n }\n setLocalStatus(currentStatus());\n } else {\n await ensureMotelyReady();\n }\n } catch (err) {\n if (!ctx) {\n setLocalStatus(\"error\");\n setLocalError(err instanceof Error ? err.message : String(err));\n }\n throw err;\n }\n }, [ctx]);\n\n return useMemo(\n () => ({\n status,\n ready: status === \"ready\",\n error,\n fsReady: false,\n fsError: null,\n ensureReady,\n }),\n [error, ensureReady, status],\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts"],"sourcesContent":["import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst RANKS = [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"Jack\", \"Queen\", \"King\", \"Ace\"] as const;\nconst SUITS = [\"Clubs\", \"Diamonds\", \"Hearts\", \"Spades\"] as const;\nconst EDITIONS = [\"Base\", \"Foil\", \"Holographic\", \"Polychrome\", \"Negative\"] as const;\nconst SEALS = [\"None\", \"Gold\", \"Red\", \"Blue\", \"Purple\"] as const;\n\ntype RankName = (typeof RANKS)[number];\ntype SuitName = (typeof SUITS)[number];\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 itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\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 itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"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 const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? 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 = EDITIONS[val as keyof typeof EDITIONS];\n if (!key || key === \"Base\") 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 = SEALS[val as keyof typeof SEALS];\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 // Enhancements are not part of the current motely-wasm JS contract.\n return null;\n}\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.rank;\n if (val == null) return null;\n if (typeof input === \"number\") return RANKS[val & 0xf] ?? null;\n return RANKS[val] as RankName | undefined ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.suit;\n if (val == null) return null;\n if (typeof input === \"number\") return SUITS[(val >> 4) & 0xf] ?? null;\n return SUITS[val] as SuitName | undefined ?? 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 format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.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","import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\nimport { resolveJamlAssetUrl } from \"../assets.js\";\n\nexport interface MotelySpriteData {\n atlasPath: string;\n gridCol: number;\n gridRow: number;\n gridCols: number;\n gridRows: number;\n displayName: string;\n category: MotelyRenderableCategory;\n}\n\n/**\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\n * resolves it to a sprite atlas path and grid coordinates for rendering.\n */\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\n const decoded = decodeMotelyItem(rawValue);\n if (!decoded) return null;\n\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\n const col = RANK_MAP[decoded.rank];\n const row = SUIT_MAP[decoded.suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: decoded.displayName,\n category: \"playing\"\n };\n }\n }\n\n const sprite = getSpriteData(decoded.displayName);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: decoded.displayName,\n category: decoded.category\n };\n}\n\n/**\n * Resolves a sprite by name and category without needing a Motely integer.\n */\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\n if (category === \"playing\") {\n // Attempt to parse \"Rank of Suit\"\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\n if (match) {\n const rank = match[1];\n const suit = match[2];\n const col = RANK_MAP[rank];\n const row = SUIT_MAP[suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: name,\n category: \"playing\"\n };\n }\n }\n }\n\n const sprite = getSpriteData(name);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: name,\n category\n };\n}\n","import { Motely } from \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.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 itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\nlet fileSystemInitPromise: Promise<void> | null = null;\n\nfunction initFileSystem(): Promise<void> {\n if (fileSystemInitPromise) return fileSystemInitPromise;\n fileSystemInitPromise = (async () => {\n try {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n } catch (error) {\n fileSystemInitError = error;\n }\n })();\n return fileSystemInitPromise;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const [status, setStatus] = useState<JamlLibraryStatus>(\"idle\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initFileSystem().then(() => {\n if (cancelled) return;\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n const isFileSystemReady = fileSystemPackage !== null;\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n await initFileSystem();\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, []);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n"],"mappings":"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"}
package/dist/r3f.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as e } from "./chunks/tokens-Qrhlekc4.js";
2
- import { n as t } from "./chunks/assets-D80i9sMq.js";
2
+ import { n as t } from "./chunks/assets-Bb6wV80_.js";
3
3
  import { memo as n, useMemo as r, useRef as i, useState as a } from "react";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
5
  import { useFrame as c, useLoader as l } from "@react-three/fiber";
package/dist/r3f.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"r3f.js","names":[],"sources":["../src/r3f/Card3D.tsx","../src/r3f/JimboBillboard.tsx","../src/r3f/JimboText3D.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useRef, useMemo, useState, memo } from 'react'\r\nimport { useFrame, useLoader, type ThreeEvent } from '@react-three/fiber'\r\nimport { useSpring, animated } from '@react-spring/three'\r\nimport * as THREE from 'three'\r\nimport type { MotelySpriteData } from '../decode/motelySprite.js'\r\n\r\n// eslint-disable-next-line react-refresh/only-export-components\r\nexport const CARD_DIMENSIONS = { WIDTH: 0.7, HEIGHT: 0.95, DEPTH: 0.02 } as const\r\n// eslint-disable-next-line react-refresh/only-export-components\r\nexport const CARD_MAGNET = {\r\n MAX_TILT_X: 0.36,\r\n MAX_TILT_Y: 0.42,\r\n MAX_SHIFT: 0.038,\r\n TWIST_Z: 0.11,\r\n LERP_IN: 18,\r\n LERP_OUT: 10,\r\n} as const\r\n\r\nfunction useSpriteTexture(sprite: MotelySpriteData) {\r\n const texture = useLoader(THREE.TextureLoader, sprite.atlasPath);\r\n \r\n return useMemo(() => {\r\n const t = texture.clone();\r\n t.colorSpace = THREE.SRGBColorSpace;\r\n t.magFilter = THREE.NearestFilter;\r\n t.minFilter = THREE.NearestFilter;\r\n t.repeat.set(1 / sprite.gridCols, 1 / sprite.gridRows);\r\n t.offset.set(\r\n sprite.gridCol / sprite.gridCols,\r\n 1 - ((sprite.gridRow + 1) / sprite.gridRows)\r\n );\r\n t.needsUpdate = true;\r\n return t;\r\n }, [texture, sprite.gridCol, sprite.gridRow, sprite.gridCols, sprite.gridRows]);\r\n}\r\n\r\nexport interface Card3DProps {\r\n sprite: MotelySpriteData\r\n position?: [number, number, number]\r\n rotation?: [number, number, number]\r\n selected?: boolean\r\n highlighted?: boolean\r\n onClick?: () => void\r\n onPointerEnter?: () => void\r\n onPointerLeave?: () => void\r\n}\r\n\r\nexport const Card3D = memo(function Card3D({\r\n sprite,\r\n position = [0, 0, 0],\r\n rotation = [0, 0, 0],\r\n selected = false,\r\n highlighted = false,\r\n onClick,\r\n onPointerEnter,\r\n onPointerLeave,\r\n}: Card3DProps) {\r\n const tiltRef = useRef<THREE.Group>(null)\r\n const target = useRef({ rx: 0, ry: 0, rz: 0, ox: 0, oy: 0 })\r\n const [hovered, setHovered] = useState(false)\r\n\r\n const texture = useSpriteTexture(sprite)\r\n\r\n const { posY, scale } = useSpring({\r\n posY: selected ? 0.3 : hovered ? 0.15 : 0,\r\n scale: hovered ? 1.08 : selected ? 1.05 : 1,\r\n config: { tension: 300, friction: 20 },\r\n })\r\n\r\n useFrame((_state, dt) => {\r\n const g = tiltRef.current\r\n if (!g) return\r\n const t = target.current\r\n const rate = hovered ? CARD_MAGNET.LERP_IN : CARD_MAGNET.LERP_OUT\r\n const a = 1 - Math.exp(-rate * dt)\r\n g.rotation.x = THREE.MathUtils.lerp(g.rotation.x, t.rx, a)\r\n g.rotation.y = THREE.MathUtils.lerp(g.rotation.y, t.ry, a)\r\n g.rotation.z = THREE.MathUtils.lerp(g.rotation.z, t.rz, a)\r\n g.position.x = THREE.MathUtils.lerp(g.position.x, t.ox, a)\r\n g.position.y = THREE.MathUtils.lerp(g.position.y, t.oy, a)\r\n })\r\n\r\n const glowColor = useMemo(() => highlighted ? '#e4b643' : '#ffffff', [highlighted])\r\n\r\n const onMove = (e: ThreeEvent<PointerEvent>) => {\r\n e.stopPropagation()\r\n const uv = e.uv\r\n if (!uv) return\r\n const nx = THREE.MathUtils.clamp((uv.x - 0.5) * 2, -1, 1)\r\n const ny = THREE.MathUtils.clamp((uv.y - 0.5) * 2, -1, 1)\r\n target.current.ry = -nx * CARD_MAGNET.MAX_TILT_Y\r\n target.current.rx = ny * CARD_MAGNET.MAX_TILT_X\r\n target.current.rz = -nx * ny * CARD_MAGNET.TWIST_Z\r\n target.current.ox = nx * CARD_MAGNET.MAX_SHIFT\r\n target.current.oy = -ny * CARD_MAGNET.MAX_SHIFT * 0.65\r\n }\r\n\r\n const reset = () => { target.current = { rx: 0, ry: 0, rz: 0, ox: 0, oy: 0 } }\r\n\r\n if (!texture) return null\r\n\r\n return (\r\n <animated.group\r\n position-x={position[0]}\r\n position-y={posY.to((y) => position[1] + y)}\r\n position-z={position[2]}\r\n rotation-x={rotation[0]}\r\n rotation-y={rotation[1]}\r\n rotation-z={rotation[2]}\r\n scale={scale}\r\n >\r\n {/* Invisible hit mesh that does not shift or twist, preventing boop-cancel loops */}\r\n <mesh\r\n visible={false}\r\n onClick={(e) => { e.stopPropagation(); onClick?.() }}\r\n onPointerMove={onMove}\r\n onPointerEnter={(e) => { e.stopPropagation(); setHovered(true); onPointerEnter?.(); document.body.style.cursor = 'pointer' }}\r\n onPointerLeave={(e) => { e.stopPropagation(); setHovered(false); reset(); onPointerLeave?.(); document.body.style.cursor = 'auto' }}\r\n >\r\n <boxGeometry args={[CARD_DIMENSIONS.WIDTH, CARD_DIMENSIONS.HEIGHT, CARD_DIMENSIONS.DEPTH * 2]} />\r\n <meshBasicMaterial />\r\n </mesh>\r\n\r\n <group ref={tiltRef}>\r\n {highlighted && (\r\n <pointLight color={glowColor} intensity={1.5} distance={1} position={[0, 0, 0.1]} />\r\n )}\r\n <mesh castShadow receiveShadow>\r\n <boxGeometry args={[CARD_DIMENSIONS.WIDTH, CARD_DIMENSIONS.HEIGHT, CARD_DIMENSIONS.DEPTH]} />\r\n <meshBasicMaterial attach=\"material-4\" map={texture} toneMapped={false} />\r\n <meshStandardMaterial attach=\"material-5\" color=\"#1a1a2e\" metalness={0.2} roughness={0.8} />\r\n <meshStandardMaterial attach=\"material-0\" color=\"#f5f5dc\" />\r\n <meshStandardMaterial attach=\"material-1\" color=\"#f5f5dc\" />\r\n <meshStandardMaterial attach=\"material-2\" color=\"#f5f5dc\" />\r\n <meshStandardMaterial attach=\"material-3\" color=\"#f5f5dc\" />\r\n </mesh>\r\n {selected && (\r\n <mesh position={[0, 0, -CARD_DIMENSIONS.DEPTH]}>\r\n <ringGeometry args={[0.45, 0.5, 32]} />\r\n <meshBasicMaterial color=\"#e4b643\" transparent opacity={0.8} />\r\n </mesh>\r\n )}\r\n </group>\r\n </animated.group>\r\n )\r\n})\r\n","import React, { useMemo } from 'react'\r\nimport { Billboard } from '@react-three/drei'\r\nimport { useLoader } from '@react-three/fiber'\r\nimport * as THREE from 'three'\r\nimport type { MotelySpriteData } from '../decode/motelySprite.js'\r\n\r\nexport interface JimboBillboardProps {\r\n sprite: MotelySpriteData | null\r\n label?: string\r\n width?: number\r\n height?: number\r\n yLockOnly?: boolean\r\n position?: [number, number, number]\r\n}\r\n\r\nexport function JimboBillboard(props: JimboBillboardProps) {\r\n if (!props.sprite) return null;\r\n return <JimboBillboardInner {...props} sprite={props.sprite} />;\r\n}\r\n\r\nfunction JimboBillboardInner({\r\n sprite,\r\n width = 3.4,\r\n height = 4.5,\r\n yLockOnly = false,\r\n position = [0, 0, 0]\r\n}: Omit<JimboBillboardProps, 'sprite'> & { sprite: MotelySpriteData }) {\r\n // Memoize texture to avoid per-render allocation\r\n const texture = useLoader(THREE.TextureLoader, sprite.atlasPath);\r\n\r\n const clonedTexture = useMemo(() => {\r\n const tex = texture.clone();\r\n tex.magFilter = THREE.NearestFilter;\r\n tex.minFilter = THREE.NearestFilter;\r\n // Set up sprite cropping\r\n tex.repeat.set(1 / sprite.gridCols, 1 / sprite.gridRows);\r\n tex.offset.set(\r\n sprite.gridCol / sprite.gridCols,\r\n 1 - ((sprite.gridRow + 1) / sprite.gridRows)\r\n );\r\n tex.needsUpdate = true;\r\n return tex;\r\n }, [texture, sprite.gridCol, sprite.gridRow, sprite.gridCols, sprite.gridRows]);\r\n\r\n const material = useMemo(() => {\r\n return new THREE.MeshBasicMaterial({\r\n map: clonedTexture,\r\n transparent: true,\r\n alphaTest: 0.5\r\n });\r\n }, [clonedTexture]);\r\n\r\n return (\r\n <Billboard\r\n lockY={yLockOnly}\r\n lockX={false}\r\n lockZ={false}\r\n position={position}\r\n >\r\n <mesh material={material}>\r\n <planeGeometry args={[width, height]} />\r\n </mesh>\r\n </Billboard>\r\n )\r\n}\r\n","import React from 'react'\r\nimport { Text } from '@react-three/drei'\r\nimport { resolveJamlAssetUrl } from '../assets.js'\r\nimport { JimboColorOption } from '../ui/tokens.js'\r\n\r\nexport interface JimboText3DProps {\r\n children: string\r\n color?: string\r\n outlineColor?: string\r\n outlineWidth?: number\r\n position?: [number, number, number]\r\n fontSize?: number\r\n}\r\n\r\nexport function JimboText3D({\r\n children,\r\n color = JimboColorOption.WHITE,\r\n outlineColor = JimboColorOption.BLACK,\r\n outlineWidth = 0.05,\r\n position = [0, 0, 0],\r\n fontSize = 1\r\n}: JimboText3DProps) {\r\n // We use the m6x11plus font from assets if possible, or fallback\r\n return (\r\n <Text\r\n position={position}\r\n fontSize={fontSize}\r\n color={color}\r\n outlineColor={outlineColor}\r\n outlineWidth={outlineWidth}\r\n font={resolveJamlAssetUrl('font')}\r\n anchorX=\"center\"\r\n anchorY=\"middle\"\r\n >\r\n {children}\r\n </Text>\r\n )\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"r3f.js","names":[],"sources":["../src/r3f/Card3D.tsx","../src/r3f/JimboBillboard.tsx","../src/r3f/JimboText3D.tsx"],"sourcesContent":["'use client'\n\nimport { useRef, useMemo, useState, memo } from 'react'\nimport { useFrame, useLoader, type ThreeEvent } from '@react-three/fiber'\nimport { useSpring, animated } from '@react-spring/three'\nimport * as THREE from 'three'\nimport type { MotelySpriteData } from '../decode/motelySprite.js'\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CARD_DIMENSIONS = { WIDTH: 0.7, HEIGHT: 0.95, DEPTH: 0.02 } as const\n// eslint-disable-next-line react-refresh/only-export-components\nexport const CARD_MAGNET = {\n MAX_TILT_X: 0.36,\n MAX_TILT_Y: 0.42,\n MAX_SHIFT: 0.038,\n TWIST_Z: 0.11,\n LERP_IN: 18,\n LERP_OUT: 10,\n} as const\n\nfunction useSpriteTexture(sprite: MotelySpriteData) {\n const texture = useLoader(THREE.TextureLoader, sprite.atlasPath);\n \n return useMemo(() => {\n const t = texture.clone();\n t.colorSpace = THREE.SRGBColorSpace;\n t.magFilter = THREE.NearestFilter;\n t.minFilter = THREE.NearestFilter;\n t.repeat.set(1 / sprite.gridCols, 1 / sprite.gridRows);\n t.offset.set(\n sprite.gridCol / sprite.gridCols,\n 1 - ((sprite.gridRow + 1) / sprite.gridRows)\n );\n t.needsUpdate = true;\n return t;\n }, [texture, sprite.gridCol, sprite.gridRow, sprite.gridCols, sprite.gridRows]);\n}\n\nexport interface Card3DProps {\n sprite: MotelySpriteData\n position?: [number, number, number]\n rotation?: [number, number, number]\n selected?: boolean\n highlighted?: boolean\n onClick?: () => void\n onPointerEnter?: () => void\n onPointerLeave?: () => void\n}\n\nexport const Card3D = memo(function Card3D({\n sprite,\n position = [0, 0, 0],\n rotation = [0, 0, 0],\n selected = false,\n highlighted = false,\n onClick,\n onPointerEnter,\n onPointerLeave,\n}: Card3DProps) {\n const tiltRef = useRef<THREE.Group>(null)\n const target = useRef({ rx: 0, ry: 0, rz: 0, ox: 0, oy: 0 })\n const [hovered, setHovered] = useState(false)\n\n const texture = useSpriteTexture(sprite)\n\n const { posY, scale } = useSpring({\n posY: selected ? 0.3 : hovered ? 0.15 : 0,\n scale: hovered ? 1.08 : selected ? 1.05 : 1,\n config: { tension: 300, friction: 20 },\n })\n\n useFrame((_state, dt) => {\n const g = tiltRef.current\n if (!g) return\n const t = target.current\n const rate = hovered ? CARD_MAGNET.LERP_IN : CARD_MAGNET.LERP_OUT\n const a = 1 - Math.exp(-rate * dt)\n g.rotation.x = THREE.MathUtils.lerp(g.rotation.x, t.rx, a)\n g.rotation.y = THREE.MathUtils.lerp(g.rotation.y, t.ry, a)\n g.rotation.z = THREE.MathUtils.lerp(g.rotation.z, t.rz, a)\n g.position.x = THREE.MathUtils.lerp(g.position.x, t.ox, a)\n g.position.y = THREE.MathUtils.lerp(g.position.y, t.oy, a)\n })\n\n const glowColor = useMemo(() => highlighted ? '#e4b643' : '#ffffff', [highlighted])\n\n const onMove = (e: ThreeEvent<PointerEvent>) => {\n e.stopPropagation()\n const uv = e.uv\n if (!uv) return\n const nx = THREE.MathUtils.clamp((uv.x - 0.5) * 2, -1, 1)\n const ny = THREE.MathUtils.clamp((uv.y - 0.5) * 2, -1, 1)\n target.current.ry = -nx * CARD_MAGNET.MAX_TILT_Y\n target.current.rx = ny * CARD_MAGNET.MAX_TILT_X\n target.current.rz = -nx * ny * CARD_MAGNET.TWIST_Z\n target.current.ox = nx * CARD_MAGNET.MAX_SHIFT\n target.current.oy = -ny * CARD_MAGNET.MAX_SHIFT * 0.65\n }\n\n const reset = () => { target.current = { rx: 0, ry: 0, rz: 0, ox: 0, oy: 0 } }\n\n if (!texture) return null\n\n return (\n <animated.group\n position-x={position[0]}\n position-y={posY.to((y) => position[1] + y)}\n position-z={position[2]}\n rotation-x={rotation[0]}\n rotation-y={rotation[1]}\n rotation-z={rotation[2]}\n scale={scale}\n >\n {/* Invisible hit mesh that does not shift or twist, preventing boop-cancel loops */}\n <mesh\n visible={false}\n onClick={(e) => { e.stopPropagation(); onClick?.() }}\n onPointerMove={onMove}\n onPointerEnter={(e) => { e.stopPropagation(); setHovered(true); onPointerEnter?.(); document.body.style.cursor = 'pointer' }}\n onPointerLeave={(e) => { e.stopPropagation(); setHovered(false); reset(); onPointerLeave?.(); document.body.style.cursor = 'auto' }}\n >\n <boxGeometry args={[CARD_DIMENSIONS.WIDTH, CARD_DIMENSIONS.HEIGHT, CARD_DIMENSIONS.DEPTH * 2]} />\n <meshBasicMaterial />\n </mesh>\n\n <group ref={tiltRef}>\n {highlighted && (\n <pointLight color={glowColor} intensity={1.5} distance={1} position={[0, 0, 0.1]} />\n )}\n <mesh castShadow receiveShadow>\n <boxGeometry args={[CARD_DIMENSIONS.WIDTH, CARD_DIMENSIONS.HEIGHT, CARD_DIMENSIONS.DEPTH]} />\n <meshBasicMaterial attach=\"material-4\" map={texture} toneMapped={false} />\n <meshStandardMaterial attach=\"material-5\" color=\"#1a1a2e\" metalness={0.2} roughness={0.8} />\n <meshStandardMaterial attach=\"material-0\" color=\"#f5f5dc\" />\n <meshStandardMaterial attach=\"material-1\" color=\"#f5f5dc\" />\n <meshStandardMaterial attach=\"material-2\" color=\"#f5f5dc\" />\n <meshStandardMaterial attach=\"material-3\" color=\"#f5f5dc\" />\n </mesh>\n {selected && (\n <mesh position={[0, 0, -CARD_DIMENSIONS.DEPTH]}>\n <ringGeometry args={[0.45, 0.5, 32]} />\n <meshBasicMaterial color=\"#e4b643\" transparent opacity={0.8} />\n </mesh>\n )}\n </group>\n </animated.group>\n )\n})\n","import React, { useMemo } from 'react'\nimport { Billboard } from '@react-three/drei'\nimport { useLoader } from '@react-three/fiber'\nimport * as THREE from 'three'\nimport type { MotelySpriteData } from '../decode/motelySprite.js'\n\nexport interface JimboBillboardProps {\n sprite: MotelySpriteData | null\n label?: string\n width?: number\n height?: number\n yLockOnly?: boolean\n position?: [number, number, number]\n}\n\nexport function JimboBillboard(props: JimboBillboardProps) {\n if (!props.sprite) return null;\n return <JimboBillboardInner {...props} sprite={props.sprite} />;\n}\n\nfunction JimboBillboardInner({\n sprite,\n width = 3.4,\n height = 4.5,\n yLockOnly = false,\n position = [0, 0, 0]\n}: Omit<JimboBillboardProps, 'sprite'> & { sprite: MotelySpriteData }) {\n // Memoize texture to avoid per-render allocation\n const texture = useLoader(THREE.TextureLoader, sprite.atlasPath);\n\n const clonedTexture = useMemo(() => {\n const tex = texture.clone();\n tex.magFilter = THREE.NearestFilter;\n tex.minFilter = THREE.NearestFilter;\n // Set up sprite cropping\n tex.repeat.set(1 / sprite.gridCols, 1 / sprite.gridRows);\n tex.offset.set(\n sprite.gridCol / sprite.gridCols,\n 1 - ((sprite.gridRow + 1) / sprite.gridRows)\n );\n tex.needsUpdate = true;\n return tex;\n }, [texture, sprite.gridCol, sprite.gridRow, sprite.gridCols, sprite.gridRows]);\n\n const material = useMemo(() => {\n return new THREE.MeshBasicMaterial({\n map: clonedTexture,\n transparent: true,\n alphaTest: 0.5\n });\n }, [clonedTexture]);\n\n return (\n <Billboard\n lockY={yLockOnly}\n lockX={false}\n lockZ={false}\n position={position}\n >\n <mesh material={material}>\n <planeGeometry args={[width, height]} />\n </mesh>\n </Billboard>\n )\n}\n","import React from 'react'\nimport { Text } from '@react-three/drei'\nimport { resolveJamlAssetUrl } from '../assets.js'\nimport { JimboColorOption } from '../ui/tokens.js'\n\nexport interface JimboText3DProps {\n children: string\n color?: string\n outlineColor?: string\n outlineWidth?: number\n position?: [number, number, number]\n fontSize?: number\n}\n\nexport function JimboText3D({\n children,\n color = JimboColorOption.WHITE,\n outlineColor = JimboColorOption.BLACK,\n outlineWidth = 0.05,\n position = [0, 0, 0],\n fontSize = 1\n}: JimboText3DProps) {\n // We use the m6x11plus font from assets if possible, or fallback\n return (\n <Text\n position={position}\n fontSize={fontSize}\n color={color}\n outlineColor={outlineColor}\n outlineWidth={outlineWidth}\n font={resolveJamlAssetUrl('font')}\n anchorX=\"center\"\n anchorY=\"middle\"\n >\n {children}\n </Text>\n )\n}\n"],"mappings":";;;;;;;;;AASA,IAAa,IAAkB;CAAE,OAAO;CAAK,QAAQ;CAAM,OAAO;AAAK,GAE1D,IAAc;CACzB,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,SAAS;CACT,SAAS;CACT,UAAU;AACZ;AAEA,SAAS,EAAiB,GAA0B;CAClD,IAAM,IAAU,EAAU,EAAM,eAAe,EAAO,SAAS;CAE/D,OAAO,QAAc;EACnB,IAAM,IAAI,EAAQ,MAAM;EAUxB,OATA,EAAE,aAAa,EAAM,gBACrB,EAAE,YAAY,EAAM,eACpB,EAAE,YAAY,EAAM,eACpB,EAAE,OAAO,IAAI,IAAI,EAAO,UAAU,IAAI,EAAO,QAAQ,GACrD,EAAE,OAAO,IACP,EAAO,UAAU,EAAO,UACxB,KAAM,EAAO,UAAU,KAAK,EAAO,QACrC,GACA,EAAE,cAAc,IACT;CACT,GAAG;EAAC;EAAS,EAAO;EAAS,EAAO;EAAS,EAAO;EAAU,EAAO;CAAQ,CAAC;AAChF;AAaA,IAAa,IAAS,EAAK,SAAgB,EACzC,WACA,cAAW;CAAC;CAAG;CAAG;AAAC,GACnB,cAAW;CAAC;CAAG;CAAG;AAAC,GACnB,cAAW,IACX,iBAAc,IACd,YACA,mBACA,qBACc;CACd,IAAM,IAAU,EAAoB,IAAI,GAClC,IAAS,EAAO;EAAE,IAAI;EAAG,IAAI;EAAG,IAAI;EAAG,IAAI;EAAG,IAAI;CAAE,CAAC,GACrD,CAAC,GAAS,KAAc,EAAS,EAAK,GAEtC,IAAU,EAAiB,CAAM,GAEjC,EAAE,SAAM,aAAU,EAAU;EAChC,MAAM,IAAW,KAAM,IAAU,MAAO;EACxC,OAAO,IAAU,OAAO,IAAW,OAAO;EAC1C,QAAQ;GAAE,SAAS;GAAK,UAAU;EAAG;CACvC,CAAC;CAED,GAAU,GAAQ,MAAO;EACvB,IAAM,IAAI,EAAQ;EAClB,IAAI,CAAC,GAAG;EACR,IAAM,IAAI,EAAO,SACX,IAAO,IAAU,EAAY,UAAU,EAAY,UACnD,IAAI,IAAI,KAAK,IAAI,CAAC,IAAO,CAAE;EAKjC,AAJA,EAAE,SAAS,IAAI,EAAM,UAAU,KAAK,EAAE,SAAS,GAAG,EAAE,IAAI,CAAC,GACzD,EAAE,SAAS,IAAI,EAAM,UAAU,KAAK,EAAE,SAAS,GAAG,EAAE,IAAI,CAAC,GACzD,EAAE,SAAS,IAAI,EAAM,UAAU,KAAK,EAAE,SAAS,GAAG,EAAE,IAAI,CAAC,GACzD,EAAE,SAAS,IAAI,EAAM,UAAU,KAAK,EAAE,SAAS,GAAG,EAAE,IAAI,CAAC,GACzD,EAAE,SAAS,IAAI,EAAM,UAAU,KAAK,EAAE,SAAS,GAAG,EAAE,IAAI,CAAC;CAC3D,CAAC;CAED,IAAM,IAAY,QAAc,IAAc,YAAY,WAAW,CAAC,CAAW,CAAC,GAE5E,KAAU,MAAgC;EAC9C,EAAE,gBAAgB;EAClB,IAAM,IAAK,EAAE;EACb,IAAI,CAAC,GAAI;EACT,IAAM,IAAK,EAAM,UAAU,OAAO,EAAG,IAAI,MAAO,GAAG,IAAI,CAAC,GAClD,IAAK,EAAM,UAAU,OAAO,EAAG,IAAI,MAAO,GAAG,IAAI,CAAC;EAKxD,AAJA,EAAO,QAAQ,KAAK,CAAC,IAAK,EAAY,YACtC,EAAO,QAAQ,KAAM,IAAK,EAAY,YACtC,EAAO,QAAQ,KAAK,CAAC,IAAK,IAAK,EAAY,SAC3C,EAAO,QAAQ,KAAM,IAAK,EAAY,WACtC,EAAO,QAAQ,KAAK,CAAC,IAAK,EAAY,YAAY;CACpD,GAEM,UAAc;EAAE,EAAO,UAAU;GAAE,IAAI;GAAG,IAAI;GAAG,IAAI;GAAG,IAAI;GAAG,IAAI;EAAE;CAAE;CAI7E,OAFK,IAGH,kBAAC,EAAS,OAAV;EACE,cAAY,EAAS;EACrB,cAAY,EAAK,IAAI,MAAM,EAAS,KAAK,CAAC;EAC1C,cAAY,EAAS;EACrB,cAAY,EAAS;EACrB,cAAY,EAAS;EACrB,cAAY,EAAS;EACd;YAPT,CAUE,kBAAC,QAAD;GACE,SAAS;GACT,UAAU,MAAM;IAAuB,AAArB,EAAE,gBAAgB,GAAG,IAAU;GAAE;GACnD,eAAe;GACf,iBAAiB,MAAM;IAA6D,AAA3D,EAAE,gBAAgB,GAAG,EAAW,EAAI,GAAG,IAAiB,GAAG,SAAS,KAAK,MAAM,SAAS;GAAU;GAC3H,iBAAiB,MAAM;IAAuE,AAArE,EAAE,gBAAgB,GAAG,EAAW,EAAK,GAAG,EAAM,GAAG,IAAiB,GAAG,SAAS,KAAK,MAAM,SAAS;GAAO;aALpI,CAOE,kBAAC,eAAD,EAAa,MAAM;IAAC,EAAgB;IAAO,EAAgB;IAAQ,EAAgB,QAAQ;GAAC,EAAI,CAAA,GAChG,kBAAC,qBAAD,CAAoB,CAAA,CAChB;MAEN,kBAAC,SAAD;GAAO,KAAK;aAAZ;IACG,KACC,kBAAC,cAAD;KAAY,OAAO;KAAW,WAAW;KAAK,UAAU;KAAG,UAAU;MAAC;MAAG;MAAG;KAAG;IAAI,CAAA;IAErF,kBAAC,QAAD;KAAM,YAAA;KAAW,eAAA;eAAjB;MACE,kBAAC,eAAD,EAAa,MAAM;OAAC,EAAgB;OAAO,EAAgB;OAAQ,EAAgB;MAAK,EAAI,CAAA;MAC5F,kBAAC,qBAAD;OAAmB,QAAO;OAAa,KAAK;OAAS,YAAY;MAAQ,CAAA;MACzE,kBAAC,wBAAD;OAAsB,QAAO;OAAa,OAAM;OAAU,WAAW;OAAK,WAAW;MAAM,CAAA;MAC3F,kBAAC,wBAAD;OAAsB,QAAO;OAAa,OAAM;MAAW,CAAA;MAC3D,kBAAC,wBAAD;OAAsB,QAAO;OAAa,OAAM;MAAW,CAAA;MAC3D,kBAAC,wBAAD;OAAsB,QAAO;OAAa,OAAM;MAAW,CAAA;MAC3D,kBAAC,wBAAD;OAAsB,QAAO;OAAa,OAAM;MAAW,CAAA;KACvD;;IACL,KACC,kBAAC,QAAD;KAAM,UAAU;MAAC;MAAG;MAAG,CAAC,EAAgB;KAAK;eAA7C,CACE,kBAAC,gBAAD,EAAc,MAAM;MAAC;MAAM;MAAK;KAAE,EAAI,CAAA,GACtC,kBAAC,qBAAD;MAAmB,OAAM;MAAU,aAAA;MAAY,SAAS;KAAM,CAAA,CAC1D;;GAEH;IACO;MA5CG;AA8CvB,CAAC;;;ACpID,SAAgB,EAAe,GAA4B;CAEzD,OADK,EAAM,SACJ,kBAAC,GAAD;EAAqB,GAAI;EAAO,QAAQ,EAAM;CAAS,CAAA,IADpC;AAE5B;AAEA,SAAS,EAAoB,EAC3B,WACA,WAAQ,KACR,YAAS,KACT,eAAY,IACZ,cAAW;CAAC;CAAG;CAAG;AAAC,KACkD;CAErE,IAAM,IAAU,EAAU,EAAM,eAAe,EAAO,SAAS,GAEzD,IAAgB,QAAc;EAClC,IAAM,IAAM,EAAQ,MAAM;EAU1B,OATA,EAAI,YAAY,EAAM,eACtB,EAAI,YAAY,EAAM,eAEtB,EAAI,OAAO,IAAI,IAAI,EAAO,UAAU,IAAI,EAAO,QAAQ,GACvD,EAAI,OAAO,IACT,EAAO,UAAU,EAAO,UACxB,KAAM,EAAO,UAAU,KAAK,EAAO,QACrC,GACA,EAAI,cAAc,IACX;CACT,GAAG;EAAC;EAAS,EAAO;EAAS,EAAO;EAAS,EAAO;EAAU,EAAO;CAAQ,CAAC;CAU9E,OACE,kBAAC,GAAD;EACE,OAAO;EACP,OAAO;EACP,OAAO;EACG;YAEV,kBAAC,QAAD;GAAgB,UAfH,QACR,IAAI,EAAM,kBAAkB;IACjC,KAAK;IACL,aAAa;IACb,WAAW;GACb,CAAC,GACA,CAAC,CAAa,CASG;aACd,kBAAC,iBAAD,EAAe,MAAM,CAAC,GAAO,CAAM,EAAI,CAAA;EACnC,CAAA;CACG,CAAA;AAEf;;;AClDA,SAAgB,EAAY,EAC1B,aACA,WAAQ,EAAiB,OACzB,kBAAe,EAAiB,OAChC,kBAAe,KACf,cAAW;CAAC;CAAG;CAAG;AAAC,GACnB,cAAW,KACQ;CAEnB,OACE,kBAAC,GAAD;EACY;EACA;EACH;EACO;EACA;EACd,MAAM,EAAoB,MAAM;EAChC,SAAQ;EACR,SAAQ;EAEP;CACG,CAAA;AAEV"}
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- export type JimboBadgeTone = 'dark' | 'blue' | 'red' | 'green' | 'gold' | 'grey' | 'orange' | 'purple';
2
+ export type JimboBadgeTone = 'dark' | 'blue' | 'red' | 'green' | 'grey' | 'orange' | 'purple';
3
3
  export interface JimboBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
4
4
  size?: 'sm' | 'md';
5
5
  tone?: JimboBadgeTone;
@@ -8,7 +8,9 @@ export interface JimboBalatroFooterProps {
8
8
  children?: React.ReactNode;
9
9
  }
10
10
  /**
11
- * Attribution footer with animated suit cycle.
12
- * Always rendered required attribution for using Balatro art.
11
+ * Fan-site attribution footer with Balatro link. The "Balatro" in the name is
12
+ * load-bearingthis footer is the public disclosure that the project is a
13
+ * non-profit, rule-following, PlayStack-aware fan site. Always rendered;
14
+ * required attribution for using Balatro art.
13
15
  */
14
16
  export declare function JimboBalatroFooter({ hidden, className, children }: JimboBalatroFooterProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import { JimboTone } from './panel.js';
2
+ export interface JimboCopyButtonProps {
3
+ /** Value placed on the clipboard when the button is clicked. */
4
+ value: string;
5
+ /** Label while idle. Default "Copy". */
6
+ label?: string;
7
+ /** Label briefly shown after a successful copy. Default "Copied". */
8
+ copiedLabel?: string;
9
+ /** Button tone. Default blue for standalone copy actions; seed rows use
10
+ * JimboSeedCopyChip (WeeJoker harvest) instead. */
11
+ tone?: JimboTone;
12
+ /** Button size. Default "sm". */
13
+ size?: 'xs' | 'sm' | 'md' | 'lg';
14
+ /** How long to display the copied label, in ms. Default 1500. */
15
+ copiedDurationMs?: number;
16
+ /** Fired after the clipboard write resolves. */
17
+ onCopy?: () => void;
18
+ className?: string;
19
+ }
20
+ /**
21
+ * The canonical copy-to-clipboard button. Single tone (red by default —
22
+ * stays red through the click; only the label briefly swaps to "Copied").
23
+ * Reusable everywhere a copy action lives: seed copy rows, code blocks,
24
+ * filter sharing, etc. — instead of every consumer rolling its own
25
+ * `<JimboButton onClick={...}>Copy</JimboButton>` + setTimeout dance.
26
+ */
27
+ export declare function JimboCopyButton({ value, label, copiedLabel, tone, size, copiedDurationMs, onCopy, className, }: JimboCopyButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,30 @@
1
+ import { default as React } from 'react';
2
+ export interface JimboDeckAndStakeSelectorModalProps {
3
+ /** Whether the modal is open. */
4
+ open: boolean;
5
+ /** Called when the user dismisses via the back button. */
6
+ onClose: () => void;
7
+ /** All decks the user can cycle through, in spinner order. */
8
+ decks: string[];
9
+ /** All stakes the user can cycle through, in spinner order. */
10
+ stakes: string[];
11
+ /** Currently selected deck name (must appear in `decks`). */
12
+ deck: string;
13
+ /** Currently selected stake name (must appear in `stakes`). */
14
+ stake: string;
15
+ onDeckChange: (next: string) => void;
16
+ onStakeChange: (next: string) => void;
17
+ /** Modal title text. Default: "Search seeds for". */
18
+ title?: string;
19
+ /** Description rendered under each deck / stake title. */
20
+ deckDescription?: (deck: string) => React.ReactNode;
21
+ stakeDescription?: (stake: string) => React.ReactNode;
22
+ }
23
+ /**
24
+ * Modal that lets a seed hunter pick the deck + stake combination they want
25
+ * to search seeds against. Pure JimboUI composition — `JimboModal`, two
26
+ * `JimboPanelSpinner`s, deck + stake sprites. No motely-wasm dependency; the
27
+ * caller passes deck/stake names as strings (convert from `MotelyDeck` /
28
+ * `MotelyStake` enums at the boundary).
29
+ */
30
+ export declare function JimboDeckAndStakeSelectorModal({ open, onClose, decks, stakes, deck, stake, onDeckChange, onStakeChange, title, deckDescription, stakeDescription, }: JimboDeckAndStakeSelectorModalProps): import("react/jsx-runtime").JSX.Element;
@@ -1,10 +1,15 @@
1
1
  import { default as React } from 'react';
2
+ export type JimboIconButtonTone = "default" | "destructive";
2
3
  export interface JimboIconButtonProps {
3
4
  "aria-label"?: string;
4
5
  children: React.ReactNode;
5
6
  disabled?: boolean;
6
- onClick?: () => void;
7
- size?: "sm" | "md";
7
+ onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
8
+ /** Pass-through for drag-start guards (e.g. stopPropagation inside draggable rows). */
9
+ onMouseDown?: (e: React.MouseEvent<HTMLButtonElement>) => void;
10
+ onTouchStart?: (e: React.TouchEvent<HTMLButtonElement>) => void;
11
+ size?: "xs" | "sm" | "md";
12
+ tone?: JimboIconButtonTone;
8
13
  title?: string;
9
14
  }
10
- export declare function JimboIconButton({ onClick, title, "aria-label": ariaLabel, disabled, size, children, }: JimboIconButtonProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function JimboIconButton({ onClick, onMouseDown, onTouchStart, title, "aria-label": ariaLabel, disabled, size, tone, children, }: JimboIconButtonProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ export type JimboInlineEditSize = 'xs' | 'sm' | 'md' | 'lg';
3
+ export type JimboInlineEditTone = 'white' | 'gold' | 'grey';
4
+ export interface JimboInlineEditProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
5
+ /** Visual size — echoes JimboText size scale. */
6
+ size?: JimboInlineEditSize;
7
+ tone?: JimboInlineEditTone;
8
+ /** Render at reduced opacity (e.g. description-style sub-text). */
9
+ dim?: boolean;
10
+ }
11
+ /**
12
+ * Borderless transparent input that reads as inline text until focused —
13
+ * for editable titles, bylines, or descriptions inside cards/panels.
14
+ * Focus chrome only shows on keyboard navigation so mouse use stays clean.
15
+ */
16
+ export declare const JimboInlineEdit: React.ForwardRefExoticComponent<JimboInlineEditProps & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ export interface JimboListItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
3
+ /** Visual + a11y active state. Renders the selected/hover palette. */
4
+ active?: boolean;
5
+ }
6
+ /**
7
+ * Clickable list row. Use anywhere a vertical stack of selectable rows is
8
+ * needed — filter browsers, seed lists, saved-search picker, etc. Composes
9
+ * `.j-list-item` from jimbo.css; pass extra layout inside via children.
10
+ */
11
+ export declare const JimboListItem: React.ForwardRefExoticComponent<JimboListItemProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,8 @@
1
+ export interface JimboPanelSplitterProps {
2
+ "aria-label"?: string;
3
+ className?: string;
4
+ onDrag: (delta: number) => void;
5
+ onKeyAdjust?: (delta: number) => void;
6
+ orientation?: "vertical" | "horizontal";
7
+ }
8
+ export declare function JimboPanelSplitter({ orientation, onDrag, onKeyAdjust, className, "aria-label": ariaLabel, }: JimboPanelSplitterProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ export interface JimboSeedCopyChipProps {
3
+ value: string;
4
+ placeholder?: string;
5
+ disabled?: boolean;
6
+ copiedLabel?: string;
7
+ copiedDurationMs?: number;
8
+ onCopy?: (value: string) => void;
9
+ className?: string;
10
+ style?: React.CSSProperties;
11
+ }
12
+ /**
13
+ * Harvested from WeeJoker SeedCard — tap-to-copy seed row with icon + value.
14
+ * Idle: copy icon + seed. Copied: green check + brief confirmation label.
15
+ */
16
+ export declare function JimboSeedCopyChip({ value, placeholder, disabled, copiedLabel, copiedDurationMs, onCopy, className, style, }: JimboSeedCopyChipProps): import("react/jsx-runtime").JSX.Element;
@@ -5,14 +5,26 @@ export interface JimboSelectOption {
5
5
  value: string;
6
6
  }
7
7
  export interface JimboSelectProps {
8
- "aria-label"?: string;
8
+ 'aria-label'?: string;
9
9
  disabled?: boolean;
10
10
  fullWidth?: boolean;
11
11
  onChange: (value: string) => void;
12
12
  options: JimboSelectOption[] | string[];
13
13
  placeholder?: string;
14
- size?: "sm" | "md";
14
+ size?: 'sm' | 'md';
15
15
  style?: React.CSSProperties;
16
16
  value: string;
17
+ label?: string;
17
18
  }
18
- export declare function JimboSelect({ value, options, onChange, placeholder, disabled, fullWidth, size, style, "aria-label": ariaLabel, }: JimboSelectProps): import("react/jsx-runtime").JSX.Element;
19
+ /**
20
+ * Select one of N values. There is no native `<select>` in the Balatro UI
21
+ * language — options are cycled with arrows, not via an OS dropdown. So
22
+ * JimboSelect is a `< value >` JimboSpinner that cycles through the options
23
+ * list. If `value` isn't in `options`, we land on the first option.
24
+ *
25
+ * Was previously a raw `<select>` element with hand-painted gold-arrow CSS
26
+ * gradients. That was off-brand on every axis (native control, gold control
27
+ * affordance, no JimboButton). Rewritten to compose JimboSpinner so it
28
+ * behaves like every other selector in the design system.
29
+ */
30
+ export declare function JimboSelect({ value, options, onChange, disabled, label, 'aria-label': ariaLabel, style, }: JimboSelectProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,18 @@
1
+ export interface JimboSpinnerProps {
2
+ value: string | number;
3
+ label?: string;
4
+ onPrev?: () => void;
5
+ onNext?: () => void;
6
+ canPrev?: boolean;
7
+ canNext?: boolean;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Two-state-or-more value spinner: red `<` button + value chip + red `>` button.
12
+ * This is the canonical Balatro on/off control (IMG_3678: `Shadows < OFF >`)
13
+ * AND the canonical option-cycler (deck/stake/aesthetic picker).
14
+ *
15
+ * Note: previously named JimboStepper — that was a misnomer. A stepper is a
16
+ * page-dot indicator (see JimboStepper). This is a spinner.
17
+ */
18
+ export declare function JimboSpinner({ value, label, onPrev, onNext, canPrev, canNext, className, }: JimboSpinnerProps): import("react/jsx-runtime").JSX.Element;