@cimplify/sdk 0.109.0 → 0.111.0

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 (377) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +18 -0
  3. package/dist/advanced.d.mts +4 -4
  4. package/dist/advanced.d.ts +4 -4
  5. package/dist/advanced.js +22 -22
  6. package/dist/advanced.mjs +3 -3
  7. package/dist/{audio-XU2sFNyO.d.mts → audio-DhvyjqdA.d.mts} +2 -2
  8. package/dist/{audio-8Igdy2WK.d.ts → audio-m0w8cnxq.d.ts} +2 -2
  9. package/dist/avatars.js +21 -21
  10. package/dist/avatars.mjs +3 -3
  11. package/dist/{backend-L4d_Ha0J.d.mts → backend-gUCzs5Kg.d.mts} +16 -2
  12. package/dist/{backend-L4d_Ha0J.d.ts → backend-gUCzs5Kg.d.ts} +16 -2
  13. package/dist/{catalogue-DLLsfuNg.d.ts → catalogue-1QcoGDO6.d.ts} +2 -2
  14. package/dist/{catalogue-BeBFWlHF.d.mts → catalogue-FdFQiWrU.d.mts} +2 -2
  15. package/dist/{chunk-HF2MZKP2.mjs → chunk-22BD3RHN.mjs} +6 -3
  16. package/dist/{chunk-B54P6RL2.js → chunk-2AQ237Y4.js} +30 -30
  17. package/dist/{chunk-W3VVG4NL.js → chunk-2O2CG465.js} +14 -2
  18. package/dist/{chunk-UPHTPBNQ.mjs → chunk-2QTQ6BUH.mjs} +1 -1
  19. package/dist/{chunk-BS65NRDW.js → chunk-3S6WPBZL.js} +16 -16
  20. package/dist/{chunk-PEZYNYJE.js → chunk-3TUOUP5T.js} +3 -3
  21. package/dist/{chunk-EB6EAOM5.mjs → chunk-3VEH23I5.mjs} +7 -10
  22. package/dist/{chunk-SYEO2WV4.mjs → chunk-42JTCWIE.mjs} +3 -3
  23. package/dist/{chunk-FB6YH2WW.js → chunk-4C7I3ELN.js} +4 -4
  24. package/dist/{chunk-UQYO3OM7.js → chunk-4ZDR72SG.js} +1 -2
  25. package/dist/{chunk-HPKKCUHU.js → chunk-52YS45RR.js} +13 -13
  26. package/dist/{chunk-6YVELDFK.mjs → chunk-5BYDGGWO.mjs} +1 -1
  27. package/dist/{chunk-YN24DET4.js → chunk-5HFMY3D7.js} +10 -10
  28. package/dist/{chunk-4CVB2ZTC.js → chunk-5LH2QN3T.js} +32 -29
  29. package/dist/{chunk-4A24F4ZV.mjs → chunk-5YFBGGCK.mjs} +4 -1
  30. package/dist/{chunk-NLAT3DB2.mjs → chunk-6DAEZKIG.mjs} +1 -1
  31. package/dist/{chunk-F6CHJXXK.mjs → chunk-6DATW7TB.mjs} +3 -3
  32. package/dist/{chunk-4RYATNVK.mjs → chunk-6H254EVP.mjs} +6 -11
  33. package/dist/{chunk-32U4BVJA.mjs → chunk-6PJWXIFX.mjs} +1 -1
  34. package/dist/{chunk-OMTVH334.js → chunk-6QANXRUM.js} +203 -186
  35. package/dist/{chunk-BHAGIIBI.js → chunk-6WUBSMTX.js} +82 -85
  36. package/dist/{chunk-EPYFN2A3.js → chunk-7AAIAVAA.js} +24 -20
  37. package/dist/{chunk-HZC27ICH.mjs → chunk-7BHW5GTC.mjs} +3 -3
  38. package/dist/{chunk-MB425DVA.mjs → chunk-7IQQQENP.mjs} +2 -2
  39. package/dist/{chunk-DJUUL67Z.js → chunk-7KFTYENS.js} +296 -296
  40. package/dist/{chunk-XLQSNQMP.js → chunk-7SM6XSPZ.js} +339 -339
  41. package/dist/{chunk-NBH64BDP.mjs → chunk-A33OORT7.mjs} +13 -1
  42. package/dist/{chunk-G2SXLGFY.js → chunk-A7BU3BK4.js} +7 -7
  43. package/dist/{chunk-ZNWS7NOW.mjs → chunk-A7V4L2IT.mjs} +2 -2
  44. package/dist/{chunk-O3SITS4R.mjs → chunk-AGV33FWC.mjs} +4 -4
  45. package/dist/{chunk-Z2DE3EHS.js → chunk-AHNR3BXI.js} +7 -7
  46. package/dist/{chunk-UQ4BHMLS.mjs → chunk-AQ5RLBU2.mjs} +5 -5
  47. package/dist/{chunk-J4HU2YQB.js → chunk-AQOE6WCG.js} +2 -2
  48. package/dist/{chunk-X57B7VQC.js → chunk-AYJPHKYV.js} +22 -22
  49. package/dist/{chunk-6XTWY6MH.js → chunk-AZAXD44P.js} +126 -42
  50. package/dist/{chunk-6ETDAU62.mjs → chunk-B45X3HPO.mjs} +98 -39
  51. package/dist/{chunk-QDW4EPWS.mjs → chunk-BBGKQIJJ.mjs} +1 -1
  52. package/dist/{chunk-NHYTO4VU.js → chunk-BP4JLSUA.js} +111 -120
  53. package/dist/{chunk-7INQVOHY.mjs → chunk-BU6OK542.mjs} +25 -8
  54. package/dist/{chunk-MKIJQL5Q.js → chunk-CJVEJPIG.js} +69 -69
  55. package/dist/{chunk-W23VX5MY.js → chunk-CVSRWM6W.js} +5 -5
  56. package/dist/{chunk-A7DK7QAG.mjs → chunk-CYBMFMJD.mjs} +1 -1
  57. package/dist/{chunk-BOTUAHP2.mjs → chunk-DS2VU4WW.mjs} +5 -20
  58. package/dist/{chunk-HMMFNLXZ.js → chunk-DSAG7T5P.js} +2 -2
  59. package/dist/{chunk-7GG4KNTL.mjs → chunk-E65WCTIG.mjs} +8 -4
  60. package/dist/{chunk-WXDVEXTW.mjs → chunk-ECDK6QBF.mjs} +1 -1
  61. package/dist/{chunk-5IRV36MS.mjs → chunk-EIB4OWVQ.mjs} +1 -1
  62. package/dist/{chunk-JLJ4FD5H.js → chunk-EQUZYCGO.js} +18 -18
  63. package/dist/{chunk-Q2Y3VMKH.js → chunk-ETZDIISN.js} +151 -151
  64. package/dist/{chunk-AKTWH3KJ.mjs → chunk-F3UJ6ZRM.mjs} +2 -2
  65. package/dist/{chunk-J6HRY5EQ.js → chunk-F63N2ZTQ.js} +232 -232
  66. package/dist/{chunk-MUEFTPNN.js → chunk-FE6VCE4K.js} +34 -34
  67. package/dist/{chunk-GCKWKLZF.mjs → chunk-FT6GFYJL.mjs} +17 -3
  68. package/dist/{chunk-2UYTS7SL.mjs → chunk-GCX7TY4D.mjs} +16 -16
  69. package/dist/{chunk-QDLMIHUH.js → chunk-GDB6TCSD.js} +7 -7
  70. package/dist/{chunk-7S7LDFGH.js → chunk-GDZT5LZ5.js} +12 -12
  71. package/dist/{chunk-TB2LS4CE.mjs → chunk-GHS6MIL6.mjs} +7 -11
  72. package/dist/{chunk-7OHZ56N7.mjs → chunk-GXKI64OT.mjs} +4 -4
  73. package/dist/{chunk-HRSIIDOZ.js → chunk-H3OQKK6X.js} +41 -41
  74. package/dist/{chunk-56BM75QX.js → chunk-H5DFSCJ6.js} +2 -2
  75. package/dist/{chunk-LMK775I4.mjs → chunk-HAGEIC2L.mjs} +1 -1
  76. package/dist/{chunk-6FZDMICK.js → chunk-HAJ4JRFO.js} +15 -15
  77. package/dist/{chunk-AWR2G5QN.js → chunk-HDR72GB6.js} +6 -11
  78. package/dist/{chunk-PTT6KIM6.js → chunk-HSEO6TPU.js} +9 -9
  79. package/dist/{chunk-CQSA2D2O.js → chunk-I5FOHCLH.js} +4 -31
  80. package/dist/{chunk-TMFB55IR.js → chunk-J2U6PJSO.js} +3 -30
  81. package/dist/{chunk-W77VO6LP.js → chunk-J5AJNY2N.js} +13 -13
  82. package/dist/{chunk-UKA7LHIT.js → chunk-JR3TNEQC.js} +98 -98
  83. package/dist/{chunk-P2O34BIO.mjs → chunk-JURRXY2J.mjs} +1 -1
  84. package/dist/{chunk-PKMVOVUA.mjs → chunk-K3HW5I2A.mjs} +1 -1
  85. package/dist/{chunk-BXUGKBMK.mjs → chunk-KDQOR4QQ.mjs} +1 -14
  86. package/dist/{chunk-KVZSYGTX.mjs → chunk-KGHJH5KJ.mjs} +1 -1
  87. package/dist/{chunk-3AKWZF3X.mjs → chunk-KK6HYVBI.mjs} +1 -1
  88. package/dist/{chunk-K6GK5B5J.js → chunk-KMKWGXMK.js} +6 -6
  89. package/dist/{chunk-EH4UG7IL.mjs → chunk-KU7O4IXU.mjs} +4 -4
  90. package/dist/{chunk-IHRMR3WV.mjs → chunk-KVFNRJOR.mjs} +9 -9
  91. package/dist/{chunk-A36JRXXH.mjs → chunk-KWZHIPRN.mjs} +26 -9
  92. package/dist/{chunk-HBZQ5HSV.mjs → chunk-LIV3KXJG.mjs} +1 -1
  93. package/dist/{chunk-S75PBSSL.mjs → chunk-ME6HGG4I.mjs} +92 -8
  94. package/dist/{chunk-SNNEOS5Z.js → chunk-MHDUUSG6.js} +75 -75
  95. package/dist/{chunk-FKYZCXFM.js → chunk-MIPO6F72.js} +3 -3
  96. package/dist/{chunk-MFWIHTEN.js → chunk-MTIHEW2M.js} +5 -5
  97. package/dist/{chunk-UCR5HRYM.js → chunk-NFXCKTE2.js} +17 -3
  98. package/dist/{chunk-M53GR3ZV.mjs → chunk-NHJUGZUR.mjs} +43 -5
  99. package/dist/{chunk-FAYK2MN6.js → chunk-NZTKLY2W.js} +14 -18
  100. package/dist/{chunk-EQW6PFC2.js → chunk-O2ICABUD.js} +2 -2
  101. package/dist/{chunk-5PW6DVHF.js → chunk-OIVVQQ22.js} +55 -37
  102. package/dist/{chunk-GBJ5CW3A.js → chunk-PKOZXD2Q.js} +30 -30
  103. package/dist/{chunk-NGN3JE5A.js → chunk-PQTQKNKD.js} +16 -7
  104. package/dist/{chunk-DFZWHNRG.js → chunk-QOCHWR4V.js} +105 -42
  105. package/dist/{chunk-PCVVQNBD.js → chunk-QS6TRHMR.js} +5 -5
  106. package/dist/{chunk-DXZZ27CV.js → chunk-RKBLPGPV.js} +245 -207
  107. package/dist/{chunk-765P2G7G.mjs → chunk-RUVGVNOF.mjs} +1 -1
  108. package/dist/{chunk-NJ7ZWH4U.mjs → chunk-SAFJIGYB.mjs} +1 -1
  109. package/dist/{chunk-AOPH2IZV.js → chunk-SKQFLBDD.js} +60 -22
  110. package/dist/{chunk-BUUA5XJV.js → chunk-TWM6DLYF.js} +2 -2
  111. package/dist/{chunk-YPL5TKI4.mjs → chunk-U6UVWEAK.mjs} +1 -1
  112. package/dist/{chunk-6YQDHXPL.mjs → chunk-UCEPNO6N.mjs} +46 -9
  113. package/dist/{chunk-U7RULAEP.mjs → chunk-UG5BTOTF.mjs} +2 -2
  114. package/dist/{chunk-MITGBWV7.mjs → chunk-UGH37BQW.mjs} +1 -1
  115. package/dist/{chunk-IZDWAL53.mjs → chunk-UJDQQTBS.mjs} +8 -8
  116. package/dist/{chunk-URRZ2SMI.mjs → chunk-V7ZRH3PY.mjs} +2 -2
  117. package/dist/{chunk-3H76N7G5.mjs → chunk-VBGHBL3E.mjs} +8 -17
  118. package/dist/{chunk-AZC2LTUI.js → chunk-VVE3Y76O.js} +2 -2
  119. package/dist/{chunk-BRAA7U3I.mjs → chunk-W65JIRI4.mjs} +1 -1
  120. package/dist/{chunk-KU4EDEKA.js → chunk-WKWTDZS7.js} +9 -9
  121. package/dist/{chunk-BTUSVHIE.mjs → chunk-WLSU5QJT.mjs} +2 -2
  122. package/dist/{chunk-NTTHAXHI.js → chunk-X5A5FOWW.js} +11 -8
  123. package/dist/{chunk-ODL55PYL.mjs → chunk-XD2PMH46.mjs} +16 -7
  124. package/dist/{chunk-OADW5BSV.js → chunk-XK6UDWJS.js} +2 -2
  125. package/dist/{chunk-7ZTEVNXO.mjs → chunk-Y65LXQGA.mjs} +8 -8
  126. package/dist/{chunk-Z3PGQRTX.mjs → chunk-Y66WVMO5.mjs} +3 -30
  127. package/dist/{chunk-VZAJDN5C.mjs → chunk-Y7JWLB25.mjs} +1 -1
  128. package/dist/{chunk-ZJGPD42I.js → chunk-YCDXAJKU.js} +3 -3
  129. package/dist/{chunk-NCTLCSLE.mjs → chunk-Z3A3AFVU.mjs} +1 -1
  130. package/dist/{chunk-AEEF3T2E.mjs → chunk-ZCY6YKKP.mjs} +3 -3
  131. package/dist/{chunk-M5FWHML6.js → chunk-ZMIL4ZOA.js} +5 -18
  132. package/dist/{chunk-D3JMTFOX.mjs → chunk-ZR5ULMN2.mjs} +1 -1
  133. package/dist/{client-C9hsiaki.d.ts → client-CChON4-x.d.ts} +2 -2
  134. package/dist/{client-CO8lw80Q.d.mts → client-EeuGm5gj.d.mts} +2 -2
  135. package/dist/{courier-CJasuxTU.d.ts → courier-Cnn-edJ4.d.ts} +5 -5
  136. package/dist/{courier-C2Vo2VlH.d.mts → courier-FmGfkvIN.d.mts} +5 -5
  137. package/dist/{crowd-D1ljcic8.d.ts → crowd-DdHFbqKK.d.ts} +1 -1
  138. package/dist/{crowd-B37S1apB.d.mts → crowd-hOVSAmA3.d.mts} +1 -1
  139. package/dist/{danfo-BsaPzhGi.d.mts → danfo-BEBapFlX.d.mts} +3 -3
  140. package/dist/{danfo-CCv23CPy.d.ts → danfo-UQ_PTIIx.d.ts} +3 -3
  141. package/dist/{elements-Bsfk7CPw.d.ts → elements-ss9xZgRg.d.mts} +47 -1
  142. package/dist/{elements-Bsfk7CPw.d.mts → elements-ss9xZgRg.d.ts} +47 -1
  143. package/dist/engines/godot.d.mts +1 -1
  144. package/dist/engines/godot.d.ts +1 -1
  145. package/dist/engines/wasm.d.mts +1 -1
  146. package/dist/engines/wasm.d.ts +1 -1
  147. package/dist/fallback-KDB4Y2CE.mjs +6 -0
  148. package/dist/fallback-Y26TQENE.js +19 -0
  149. package/dist/{five-a-side-DP84gMuh.d.mts → five-a-side-Bv1AOUy3.d.mts} +4 -4
  150. package/dist/{five-a-side-DO8SDqMb.d.ts → five-a-side-EC51SJY1.d.ts} +4 -4
  151. package/dist/{fluid-BkxNBD2t.d.ts → fluid-ARr0qUIL.d.ts} +168 -4
  152. package/dist/{fluid-BZ42EMds.d.mts → fluid-DLlEj2cs.d.mts} +168 -4
  153. package/dist/game/conformance.d.mts +7 -7
  154. package/dist/game/conformance.d.ts +7 -7
  155. package/dist/game/conformance.js +39 -41
  156. package/dist/game/conformance.mjs +17 -19
  157. package/dist/game/heap.d.mts +3 -3
  158. package/dist/game/heap.d.ts +3 -3
  159. package/dist/game/heap.js +13 -15
  160. package/dist/game/heap.mjs +4 -6
  161. package/dist/game/kit/canvas.d.mts +33 -34
  162. package/dist/game/kit/canvas.d.ts +33 -34
  163. package/dist/game/kit/canvas.js +569 -570
  164. package/dist/game/kit/canvas.mjs +52 -53
  165. package/dist/game/kit/courier.d.mts +9 -9
  166. package/dist/game/kit/courier.d.ts +9 -9
  167. package/dist/game/kit/courier.js +20 -20
  168. package/dist/game/kit/courier.mjs +17 -17
  169. package/dist/game/kit/danfo.d.mts +7 -7
  170. package/dist/game/kit/danfo.d.ts +7 -7
  171. package/dist/game/kit/danfo.js +30 -30
  172. package/dist/game/kit/danfo.mjs +15 -15
  173. package/dist/game/kit/engine.d.mts +12 -12
  174. package/dist/game/kit/engine.d.ts +12 -12
  175. package/dist/game/kit/engine.js +40 -41
  176. package/dist/game/kit/engine.mjs +11 -12
  177. package/dist/game/kit/five-a-side.d.mts +7 -7
  178. package/dist/game/kit/five-a-side.d.ts +7 -7
  179. package/dist/game/kit/five-a-side.js +24 -24
  180. package/dist/game/kit/five-a-side.mjs +14 -14
  181. package/dist/game/kit/frontier.d.mts +7 -7
  182. package/dist/game/kit/frontier.d.ts +7 -7
  183. package/dist/game/kit/genesis.d.mts +7 -7
  184. package/dist/game/kit/genesis.d.ts +7 -7
  185. package/dist/game/kit/ludo.d.mts +8 -8
  186. package/dist/game/kit/ludo.d.ts +8 -8
  187. package/dist/game/kit/ludo.js +24 -24
  188. package/dist/game/kit/ludo.mjs +14 -14
  189. package/dist/game/kit/runner.d.mts +8 -8
  190. package/dist/game/kit/runner.d.ts +8 -8
  191. package/dist/game/kit/runner.js +22 -22
  192. package/dist/game/kit/runner.mjs +14 -14
  193. package/dist/game/kit/shootout.d.mts +9 -9
  194. package/dist/game/kit/shootout.d.ts +9 -9
  195. package/dist/game/kit/shootout.js +33 -34
  196. package/dist/game/kit/shootout.mjs +18 -19
  197. package/dist/game/kit/tycoon.d.mts +9 -9
  198. package/dist/game/kit/tycoon.d.ts +9 -9
  199. package/dist/game/kit/tycoon.js +38 -38
  200. package/dist/game/kit/tycoon.mjs +14 -14
  201. package/dist/game/kit/word.d.mts +7 -7
  202. package/dist/game/kit/word.d.ts +7 -7
  203. package/dist/game/kit/word.js +22 -22
  204. package/dist/game/kit/word.mjs +14 -14
  205. package/dist/game/kit/worlds.d.mts +10 -10
  206. package/dist/game/kit/worlds.d.ts +10 -10
  207. package/dist/game/kit/worlds.js +22 -22
  208. package/dist/game/kit/worlds.mjs +17 -17
  209. package/dist/game/kit.d.mts +31 -32
  210. package/dist/game/kit.d.ts +31 -32
  211. package/dist/game/kit.js +523 -524
  212. package/dist/game/kit.mjs +38 -39
  213. package/dist/game/prepared.d.mts +6 -7
  214. package/dist/game/prepared.d.ts +6 -7
  215. package/dist/game/prepared.js +23 -24
  216. package/dist/game/prepared.mjs +12 -13
  217. package/dist/{game-BZAfgKV6.d.mts → game-Bx8onkhX.d.mts} +5 -97
  218. package/dist/{game-UoJWopvD.d.ts → game-fgQy2YIm.d.ts} +5 -97
  219. package/dist/game.d.mts +56 -18
  220. package/dist/game.d.ts +56 -18
  221. package/dist/game.js +922 -927
  222. package/dist/game.mjs +16 -17
  223. package/dist/{graphics-DNIAV5Mi.d.ts → graphics-C6YjWYvP.d.ts} +1 -1
  224. package/dist/{graphics-CGJDdtdT.d.mts → graphics-Dk2yQnYN.d.mts} +1 -1
  225. package/dist/{guest-CMCZeyh5.d.mts → guest-DrsA00XD.d.mts} +2 -7
  226. package/dist/{guest-CB458Hgw.d.ts → guest-wIdfoT05.d.ts} +2 -7
  227. package/dist/{hit-stop-D2Ca-i9-.d.mts → hit-stop-BKkVwTq7.d.mts} +1 -1
  228. package/dist/{hit-stop-Ca1OYk15.d.ts → hit-stop-D-8pPYnM.d.ts} +1 -1
  229. package/dist/{hot-B9BTmDz6.d.ts → hot-Crn9XpHJ.d.ts} +1 -1
  230. package/dist/{hot-B_L-GEHZ.d.mts → hot-DH3nOhQD.d.mts} +1 -1
  231. package/dist/{index-DPeyo938.d.ts → index-B8ybCKJI.d.ts} +3 -3
  232. package/dist/index-BB2gjVvA.d.mts +153 -0
  233. package/dist/index-BEfmBDAH.d.ts +153 -0
  234. package/dist/{index-D8ZDzms9.d.mts → index-DHjNHb1c.d.mts} +3 -3
  235. package/dist/{index-DFDeJxFQ.d.ts → index-DQK8sTfu.d.ts} +2 -2
  236. package/dist/{index-C76o9Pj4.d.mts → index-DSVkhRmW.d.mts} +2 -2
  237. package/dist/index.d.mts +8 -8
  238. package/dist/index.d.ts +8 -8
  239. package/dist/index.js +189 -177
  240. package/dist/index.mjs +8 -8
  241. package/dist/interactives-authoring.js +12 -1
  242. package/dist/interactives-authoring.mjs +12 -1
  243. package/dist/interactives-canvas.global.js +14 -39
  244. package/dist/interactives-guest.d.mts +2 -2
  245. package/dist/interactives-guest.d.ts +2 -2
  246. package/dist/interactives-guest.js +10 -10
  247. package/dist/interactives-guest.mjs +6 -6
  248. package/dist/interactives-jsc.global.js +4 -23
  249. package/dist/interactives-meters.d.mts +11 -11
  250. package/dist/interactives-meters.d.ts +11 -11
  251. package/dist/interactives-meters.js +65 -66
  252. package/dist/interactives-meters.mjs +17 -18
  253. package/dist/interactives-production.d.mts +5 -5
  254. package/dist/interactives-production.d.ts +5 -5
  255. package/dist/interactives-production.js +15 -16
  256. package/dist/interactives-production.mjs +3 -4
  257. package/dist/interactives-record.d.mts +3 -9
  258. package/dist/interactives-record.d.ts +3 -9
  259. package/dist/interactives-record.js +45 -65
  260. package/dist/interactives-record.mjs +19 -39
  261. package/dist/interactives-runtime.d.mts +3 -3
  262. package/dist/interactives-runtime.d.ts +3 -3
  263. package/dist/interactives-runtime.js +101 -105
  264. package/dist/interactives-runtime.mjs +6 -6
  265. package/dist/interactives-studio-kernel.global.js +1 -1
  266. package/dist/interactives-studio.d.mts +7 -7
  267. package/dist/interactives-studio.d.ts +7 -7
  268. package/dist/interactives-studio.js +136 -82
  269. package/dist/interactives-studio.mjs +65 -11
  270. package/dist/interactives-web.d.mts +14 -14
  271. package/dist/interactives-web.d.ts +14 -14
  272. package/dist/interactives-web.js +201 -198
  273. package/dist/interactives-web.mjs +33 -34
  274. package/dist/interactives.d.mts +7 -28
  275. package/dist/interactives.d.ts +7 -28
  276. package/dist/interactives.js +267 -313
  277. package/dist/interactives.mjs +26 -24
  278. package/dist/{juice-Dfgc1B1q.d.ts → juice-CoHxlpKA.d.ts} +1 -1
  279. package/dist/{juice-CsnrmTOk.d.mts → juice-DQztFS43.d.mts} +1 -1
  280. package/dist/{launch-CCsmv8HC.d.mts → launch-T2f4_Di4.d.mts} +6 -6
  281. package/dist/{launch-8W_Tojpz.d.ts → launch-d6oreMzR.d.ts} +6 -6
  282. package/dist/{local-DA_HpPOj.d.mts → local-D8_I6UeL.d.mts} +0 -5
  283. package/dist/{local-_mD0x-p_.d.ts → local-VZkqsCzR.d.ts} +0 -5
  284. package/dist/{ludo-BVHycBP-.d.ts → ludo-B8ClkDqr.d.ts} +4 -4
  285. package/dist/{ludo-BRaTcI3E.d.mts → ludo-BOuohQ-M.d.mts} +4 -4
  286. package/dist/mock/cli.mjs +25 -10
  287. package/dist/mock/library.js +25 -10
  288. package/dist/mock/library.mjs +25 -10
  289. package/dist/mock/msw.js +25 -10
  290. package/dist/mock/msw.mjs +25 -10
  291. package/dist/{native-CcMUV7rL.d.mts → native-BodxSh03.d.mts} +2 -2
  292. package/dist/{native-3f4Ht82c.d.ts → native-DUHMT8gA.d.ts} +2 -2
  293. package/dist/{online-CCy8pwOn.d.ts → online-XeymeM9s.d.ts} +1 -1
  294. package/dist/{online-smW2BO3Y.d.mts → online-d7W_Al9a.d.mts} +1 -1
  295. package/dist/{play-BhHHX1jD.d.ts → play-BRRlfLhX.d.ts} +5 -5
  296. package/dist/{play-Bn7NfGNE.d.mts → play-ClrMd_e8.d.mts} +5 -5
  297. package/dist/{policy-Dvnzg8ki.d.mts → policy-CCw8tXLm.d.mts} +19 -19
  298. package/dist/{policy-b3MVXMQu.d.ts → policy-CMqOSQIu.d.ts} +19 -19
  299. package/dist/{ports-CNeZdgVm.d.mts → ports-B_0v_P3A.d.mts} +1 -1
  300. package/dist/{ports-Vno6MDaR.d.ts → ports-CGU_3e_0.d.ts} +1 -1
  301. package/dist/{prefetch-BFg6lJyD.d.ts → prefetch-BHnicOQj.d.ts} +3 -3
  302. package/dist/{prefetch-BOoKX3qx.d.mts → prefetch-CBXgYacv.d.mts} +3 -3
  303. package/dist/{price-BIKJla_G.d.mts → price-B-w4PwHm.d.mts} +1 -1
  304. package/dist/{price-D1gE7Ek6.d.ts → price-BEvQFNJv.d.ts} +1 -1
  305. package/dist/react.d.mts +35 -27
  306. package/dist/react.d.ts +35 -27
  307. package/dist/react.js +276 -248
  308. package/dist/react.mjs +147 -119
  309. package/dist/{runner-BAG8EglP.d.ts → runner-CQcLL7By.d.ts} +6 -6
  310. package/dist/{runner-CKtKtIzc.d.mts → runner-D46Yj-wE.d.mts} +6 -6
  311. package/dist/{runtime-DfZp1Kwg.d.mts → runtime-BRWfkf_q.d.mts} +1 -8
  312. package/dist/{runtime-yHPgIJV-.d.ts → runtime-DyuBMkKM.d.ts} +1 -8
  313. package/dist/{scheduling-CnRAhWQL.d.ts → scheduling-D9WwOxbo.d.ts} +1 -1
  314. package/dist/{scheduling-lHyYoCa7.d.mts → scheduling-DDmrYCr-.d.mts} +1 -1
  315. package/dist/{server-DxcxjER1.d.ts → server-BiKwxvnf.d.ts} +2 -2
  316. package/dist/{server-lU3Sznd4.d.mts → server-DPdtl2dd.d.mts} +2 -2
  317. package/dist/server.d.mts +4 -4
  318. package/dist/server.d.ts +4 -4
  319. package/dist/server.js +10 -10
  320. package/dist/server.mjs +4 -4
  321. package/dist/{shootout-rK-oblpb.d.ts → shootout-BJZeX6FG.d.ts} +6 -6
  322. package/dist/{shootout-D998OWa-.d.mts → shootout-tcZd1Rxt.d.mts} +6 -6
  323. package/dist/styles.css +1 -1
  324. package/dist/{template-Byaueo34.d.mts → template-AhCdB1kW.d.mts} +3 -3
  325. package/dist/{template-BXE2L654.d.ts → template-BkEGVTQj.d.ts} +3 -3
  326. package/dist/{terrain-vgYkJPNx.d.ts → terrain-BMxEc6Oc.d.ts} +3 -3
  327. package/dist/{terrain-CR0NQZPl.d.mts → terrain-C-XC1Oui.d.mts} +3 -3
  328. package/dist/testing/msw.d.mts +3 -3
  329. package/dist/testing/msw.d.ts +3 -3
  330. package/dist/testing/msw.js +3 -3
  331. package/dist/testing/msw.mjs +2 -2
  332. package/dist/testing/suite.d.mts +6 -6
  333. package/dist/testing/suite.d.ts +6 -6
  334. package/dist/testing/suite.js +25 -25
  335. package/dist/testing/suite.mjs +6 -6
  336. package/dist/testing.d.mts +5 -5
  337. package/dist/testing.d.ts +5 -5
  338. package/dist/testing.js +117 -117
  339. package/dist/testing.mjs +7 -7
  340. package/dist/{tick-transport-Q_8syS8J.d.mts → tick-transport-C8QEh8Uw.d.mts} +1 -1
  341. package/dist/{tick-transport-xpMcMTs2.d.ts → tick-transport-UjHY3xK1.d.ts} +1 -1
  342. package/dist/{tree-BsXFWKQ6.d.mts → tree-C-Io2Hbx.d.mts} +1 -1
  343. package/dist/{tree-DW9x29Vv.d.ts → tree-CP_qSW4H.d.ts} +1 -1
  344. package/dist/{tycoon-BMAE5Wea.d.mts → tycoon-B5KHk2Xx.d.mts} +5 -5
  345. package/dist/{tycoon-dWvWTbE4.d.ts → tycoon-hmHo-3HX.d.ts} +5 -5
  346. package/dist/{types-AkQEePZo.d.mts → types-BQkxPwZP.d.mts} +1 -1
  347. package/dist/{types-BWaZJDla.d.ts → types-D_f6UUxM.d.ts} +1 -1
  348. package/dist/utils.d.mts +3 -3
  349. package/dist/utils.d.ts +3 -3
  350. package/dist/utils.js +44 -32
  351. package/dist/utils.mjs +2 -2
  352. package/dist/{weave-delivery-3G03LdMM.d.mts → weave-delivery-CW-Kstut.d.mts} +10 -1
  353. package/dist/{weave-delivery-3G03LdMM.d.ts → weave-delivery-CW-Kstut.d.ts} +10 -1
  354. package/dist/{web-C8B9uVx_.d.ts → web-Dss74a7v.d.ts} +7 -7
  355. package/dist/{web-BqSEfX2o.d.mts → web-f9ZQPoyw.d.mts} +7 -7
  356. package/dist/{weight-BDABC8cN.d.ts → weight-CPGjsgjV.d.ts} +3 -3
  357. package/dist/{weight-Cee73u3d.d.mts → weight-tF1ODR1p.d.mts} +3 -3
  358. package/dist/{word-DB2CcI9q.d.mts → word-BcX9Jcmv.d.mts} +3 -3
  359. package/dist/{word-C1Q8oXuy.d.ts → word-C7sVPLHm.d.ts} +3 -3
  360. package/dist/{world-Bmh7K4tQ.d.ts → world-PvILHDR1.d.ts} +1 -1
  361. package/dist/{world-CPEjuctH.d.mts → world-qekkXjJv.d.mts} +1 -1
  362. package/dist/{worlds-ShY5h6Z_.d.ts → worlds-Br2Pb0Cs.d.ts} +6 -6
  363. package/dist/{worlds-CQgN3GnR.d.mts → worlds-D5ydYr7d.d.mts} +6 -6
  364. package/package.json +5 -3
  365. package/registry/cart-summary.json +1 -1
  366. package/registry/chat-widget.json +1 -1
  367. package/registry/price.json +1 -1
  368. package/registry/product-customizer.json +1 -1
  369. package/registry/search-input.json +1 -1
  370. package/dist/chunk-2LKAOU3L.mjs +0 -96
  371. package/dist/chunk-UWPQL2IQ.js +0 -104
  372. package/dist/fallback-Q5YYIMVJ.js +0 -20
  373. package/dist/fallback-XGBE3RXC.mjs +0 -7
  374. package/dist/index-C3KORE2U.d.mts +0 -86
  375. package/dist/index-Cv_rL5X0.d.ts +0 -86
  376. package/dist/split-Di9wBpNx.d.mts +0 -68
  377. package/dist/split-Di9wBpNx.d.ts +0 -68
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkAZC2LTUI_js = require('./chunk-AZC2LTUI.js');
3
+ var chunkVVE3Y76O_js = require('./chunk-VVE3Y76O.js');
4
4
  var chunkU63OC4TQ_js = require('./chunk-U63OC4TQ.js');
5
5
  var chunk3C4C654I_js = require('./chunk-3C4C654I.js');
6
6
  var chunkMRFUNRAP_js = require('./chunk-MRFUNRAP.js');
7
7
  var chunkIIDZ5WUX_js = require('./chunk-IIDZ5WUX.js');
8
8
  var chunkYXGZQPUD_js = require('./chunk-YXGZQPUD.js');
9
- var chunkEPYFN2A3_js = require('./chunk-EPYFN2A3.js');
9
+ var chunk7AAIAVAA_js = require('./chunk-7AAIAVAA.js');
10
10
  require('./chunk-T2QQMX2N.js');
11
11
  var chunkT7LOXGYX_js = require('./chunk-T7LOXGYX.js');
12
12
  var chunk2V7IL4HC_js = require('./chunk-2V7IL4HC.js');
@@ -110,7 +110,7 @@ var ComponentStore = class {
110
110
  };
111
111
 
112
112
  // src/game/scenery/scenery.ts
113
- var SCENERY_MANIFEST_MAGIC = 1297109827, SCENERY_MANIFEST_VERSION = 1, SCENERY_MANIFEST_VERSION_PARTS = 2, SCENERY_PART_WHOLE = 255, SCENERY_PART_COARSE = 0, SCENERY_PART_MIDDLE = 1, SCENERY_PART_FINE = 2, PART_FIELD = 20, PART_MASK = 255, GROUP_SHIFT = 8, SCENERY_LEVEL_STEP = 3, SCENERY_CHUNK_EXTENSION = ".cspl", HEADER_BYTES = 32, ENTRY_BYTES = 80, DIGEST_OFFSET = 48, DIGEST_BYTES = 32, VERSION_FIELD = 4, COUNT_FIELD = 8, CELL_SIZE_FIELD = 12, ORIGIN_X_FIELD = 16, ORIGIN_Z_FIELD = 20, COLS_FIELD = 24, ROWS_FIELD = 28, KIB = 1024, HEX_RADIX = 16, BYTE_VALUES = 256, ABSOLUTE = /^[a-z][a-z0-9+.-]*:/i, HEX = Array.from({ length: (256) }, (_, i) => i.toString((16)).padStart(2, "0")), CLOSED_REGISTERS = new Uint32Array(16);
113
+ var DEFAULT_MOTION_OFFSET = ["dx", "dy", "dz"], DEFAULT_MOTION_REST = ["rx", "ry", "rz"], MILLIMETRES_PER_METRE = 1e3, NO_RIG = 0, SCENERY_MANIFEST_MAGIC = 1297109827, SCENERY_MANIFEST_VERSION = 1, SCENERY_MANIFEST_VERSION_PARTS = 2, SCENERY_PART_WHOLE = 255, SCENERY_PART_COARSE = 0, SCENERY_PART_MIDDLE = 1, SCENERY_PART_FINE = 2, PART_FIELD = 20, PART_MASK = 255, GROUP_SHIFT = 8, SCENERY_LEVEL_STEP = 3, SCENERY_CHUNK_EXTENSION = ".cspl", HEADER_BYTES = 32, ENTRY_BYTES = 80, DIGEST_OFFSET = 48, DIGEST_BYTES = 32, VERSION_FIELD = 4, COUNT_FIELD = 8, CELL_SIZE_FIELD = 12, ORIGIN_X_FIELD = 16, ORIGIN_Z_FIELD = 20, COLS_FIELD = 24, ROWS_FIELD = 28, KIB = 1024, HEX_RADIX = 16, BYTE_VALUES = 256, ABSOLUTE = /^[a-z][a-z0-9+.-]*:/i, HEX = Array.from({ length: (256) }, (_, i) => i.toString((16)).padStart(2, "0")), CLOSED_REGISTERS = new Uint32Array(20);
114
114
  function sceneryPartDrawLevel(part) {
115
115
  return part === (1) ? 1 : part === (2) ? 0 : 2;
116
116
  }
@@ -277,52 +277,64 @@ var SceneryChunks = class {
277
277
  this.read = read;
278
278
  }
279
279
  get chunks() {
280
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.chunks];
280
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.chunks];
281
281
  }
282
282
  get resident() {
283
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.resident];
283
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.resident];
284
284
  }
285
285
  get requested() {
286
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.requested];
286
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.requested];
287
287
  }
288
288
  get installed() {
289
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.installed];
289
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.installed];
290
290
  }
291
291
  get evicted() {
292
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.evicted];
292
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.evicted];
293
293
  }
294
294
  get deferred() {
295
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.deferred];
295
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.deferred];
296
296
  }
297
297
  get failed() {
298
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.failed];
298
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.failed];
299
299
  }
300
300
  get installedBytes() {
301
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.installedKib] * (1024);
301
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.installedKib] * (1024);
302
302
  }
303
303
  get residentSplats() {
304
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.residentSplats];
304
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.residentSplats];
305
305
  }
306
306
  get drawnSplats() {
307
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.drawnSplats];
307
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.drawnSplats];
308
308
  }
309
309
  get listedPages() {
310
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.listedPages];
310
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.listedPages];
311
311
  }
312
312
  get poolCapacity() {
313
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.poolCapacity];
313
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.poolCapacity];
314
314
  }
315
315
  get poolFreePages() {
316
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.poolFreePages];
316
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.poolFreePages];
317
317
  }
318
318
  get tier() {
319
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.tier];
319
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.tier];
320
320
  }
321
321
  get updates() {
322
- return this.read()[chunkEPYFN2A3_js.SCENERY_REGISTER.updates];
322
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.updates];
323
+ }
324
+ get heroSplats() {
325
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.heroSplats];
326
+ }
327
+ get heroShed() {
328
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.heroShed];
329
+ }
330
+ get standIn() {
331
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.standIn] !== 0;
332
+ }
333
+ get deformedSplats() {
334
+ return this.read()[chunk7AAIAVAA_js.SCENERY_REGISTER.deformedSplats];
323
335
  }
324
336
  }, Scenery = class {
325
- constructor(port, handle, manifest, chunkPaths, chunks, owner) {
337
+ constructor(port, handle, manifest, chunkPaths, chunks, owner, options = {}) {
326
338
  this.port = port;
327
339
  this.handle = handle;
328
340
  this.chunkPaths = chunkPaths;
@@ -336,8 +348,15 @@ var SceneryChunks = class {
336
348
  this.hasEye = false;
337
349
  this.sweep = 0;
338
350
  this.waiting = 0;
339
- this.flow = new Float64Array(chunkAZC2LTUI_js.FLOW_WORDS);
351
+ this.flow = new Float64Array(chunkVVE3Y76O_js.FLOW_WORDS);
340
352
  this.closed = false;
353
+ this.editValues = new Float32Array(3);
354
+ this.standing = false;
355
+ this.kernel = null;
356
+ if (this.regionNames = options.regions ?? {}, this.standInTarget = options.standIn ?? null, options.heroBudget !== void 0) {
357
+ let caps = new Uint32Array(3);
358
+ caps.set(options.heroBudget), this.bodyPort().heroBudget(handle, caps);
359
+ }
341
360
  this.grid = manifest.grid, this.stats = new Stats(() => this.view());
342
361
  let rows = chunkPaths.length;
343
362
  this.engineState = new Uint8Array(rows), this.entryRow = sceneryEntryRows(manifest, rows), this.rowBytes = manifest.bytes, this.rowPart = manifest.parts ?? new Uint8Array(rows).fill((255)), this.rowSphere = new Float32Array(rows * (4));
@@ -345,8 +364,8 @@ var SceneryChunks = class {
345
364
  let b = manifest.bounds, at = i * (6), dx = b[at + 3] - b[at], dy = b[at + 4] - b[at + 1], dz = b[at + 5] - b[at + 2];
346
365
  this.rowSphere[i * (4)] = (b[at] + b[at + 3]) * 0.5, this.rowSphere[i * (4) + 1] = (b[at + 1] + b[at + 4]) * 0.5, this.rowSphere[i * (4) + 2] = (b[at + 2] + b[at + 5]) * 0.5, this.rowSphere[i * (4) + 3] = Math.sqrt(dx * dx + dy * dy + dz * dz) * 0.5;
347
366
  }
348
- let radii = sceneryTierRadii(port.registers(handle)[chunkEPYFN2A3_js.SCENERY_REGISTER.tier] ?? 0);
349
- this.layer = new chunkAZC2LTUI_js.PrefetchLayer({
367
+ let radii = sceneryTierRadii(port.registers(handle)[chunk7AAIAVAA_js.SCENERY_REGISTER.tier] ?? 0);
368
+ this.layer = new chunkVVE3Y76O_js.PrefetchLayer({
350
369
  name: "scenery",
351
370
  items: sceneryPrefetchItems(manifest, chunkPaths, radii),
352
371
  radius: () => sceneryTierRadii(this.tier()).far * (1.1),
@@ -361,7 +380,7 @@ var SceneryChunks = class {
361
380
  });
362
381
  }
363
382
  tier() {
364
- return this.closed ? 0 : this.view()[chunkEPYFN2A3_js.SCENERY_REGISTER.tier];
383
+ return this.closed ? 0 : this.view()[chunk7AAIAVAA_js.SCENERY_REGISTER.tier];
365
384
  }
366
385
  get prefetcher() {
367
386
  return this.predictor;
@@ -397,6 +416,66 @@ var SceneryChunks = class {
397
416
  let t = this.transform;
398
417
  t[0] = position.x, t[1] = position.y, t[2] = position.z, t[3] = rotation?.x ?? 0, t[4] = rotation?.y ?? 0, t[5] = rotation?.z ?? 0, t[6] = rotation?.w ?? 1, t[7] = scale, this.port.setTransform(this.handle, t), this.layer.setPlacement(t);
399
418
  }
419
+ bodyPort() {
420
+ let bodies = this.port.bodies;
421
+ if (bodies == null) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build does not move or edit splats");
422
+ return bodies;
423
+ }
424
+ regionOf(region) {
425
+ let id = typeof region == "string" ? this.regionNames[region] : region;
426
+ if (id === void 0 || !Number.isInteger(id) || id < 0 || id >= 256) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `no splat region ${String(region)}`);
427
+ return id;
428
+ }
429
+ /** Recolours one baked region without recapture: hue in radians, saturation and gain as multipliers. */
430
+ edit(region, edit) {
431
+ if (this.closed) return;
432
+ let v = this.editValues;
433
+ if (v[0] = edit.hue ?? 0, v[1] = edit.saturation ?? 1, v[2] = edit.gain ?? 1, !(v[1] >= 0) || !(v[2] >= 0) || !Number.isFinite(v[0])) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "a splat edit needs a finite hue and non-negative saturation and gain");
434
+ this.bodyPort().edit(this.handle, this.regionOf(region), v);
435
+ }
436
+ /** Drives this body from a model's pose on the rig it was baked against; null returns it to rest. Throws when the rig differs. */
437
+ bind(rig) {
438
+ this.closed || this.bodyPort().bind(this.handle, rig ?? (0));
439
+ }
440
+ /** Splats in garment region `region` follow `cloth`, which must use the mesh the region was baked with. It may be called at any point in the cloth's run. */
441
+ drape(cloth, region, options = {}) {
442
+ if (this.closed) return;
443
+ let host = cloth.engineHost;
444
+ if (host === null) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this cloth is not simulated by the engine");
445
+ this.bodyPort().drape(this.handle, host, cloth.id, this.regionOf(region), options.rest ?? null);
446
+ }
447
+ /** Rows a motion table needs: one for every splat in the manifest, across all levels of detail. */
448
+ get motionRows() {
449
+ return this.closed ? 0 : this.bodyPort().motionRows(this.handle);
450
+ }
451
+ /**
452
+ * Runs a per-splat program. `kernel` is called once a frame, normally `() => game.kernels.run(wave, table, time)`;
453
+ * the engine reads what it writes before deforming, and pays only for the channels named here. Pass null to stop.
454
+ */
455
+ motion(kernel, options) {
456
+ if (this.closed) return;
457
+ let bodies = this.bodyPort();
458
+ if (kernel === null || options === void 0) {
459
+ this.kernel = null, bodies.motion(this.handle, 0, null, 0, 0);
460
+ return;
461
+ }
462
+ let table = options.table, named = options.rotation !== void 0 || options.colour !== void 0 || options.opacity !== void 0, offset = options.offset ?? (named ? void 0 : DEFAULT_MOTION_OFFSET), mask = 0, names = [...options.rest ?? DEFAULT_MOTION_REST], channel = (bit, fields) => {
463
+ fields !== void 0 && (mask |= bit, names.push(...fields));
464
+ };
465
+ channel(1, offset), channel(2, options.rotation), channel(4, options.colour), channel(8, options.opacity === void 0 ? void 0 : [options.opacity]);
466
+ let columns = new Uint32Array(14);
467
+ if (names.forEach((name, k) => {
468
+ columns[k] = table.column(name);
469
+ }), !(options.reach >= 0)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "a splat motion reach must not be negative");
470
+ bodies.motion(this.handle, table.id, columns, Math.ceil(options.reach * (1e3)), mask), this.kernel = () => kernel(table);
471
+ }
472
+ follow() {
473
+ this.kernel?.();
474
+ let target = this.standInTarget;
475
+ if (target === null) return;
476
+ let wanted = this.view()[chunk7AAIAVAA_js.SCENERY_REGISTER.standIn] !== 0;
477
+ wanted !== this.standing && (this.standing = wanted, wanted ? target.show() : target.hide());
478
+ }
400
479
  /** Closes the scenery and frees its engine resources. Later calls on the handle do nothing. */
401
480
  remove() {
402
481
  this.closed || (this.closed = true, this.registers = null, this.predictor !== null && this.owner.unstream(this.predictor), this.predictor = null, this.owner.release(this), this.port.close(this.handle), this.chunks.close());
@@ -405,7 +484,7 @@ var SceneryChunks = class {
405
484
  if (this.closed) return;
406
485
  let n = this.port.update(this.handle, eye, this.requests);
407
486
  for (let i = 0; i < n; i++) this.fetch(this.requests[i], i === 0 ? (0) : (1));
408
- this.layer.toLocal(eye, this.lastEye, 0, true), this.hasEye = true, this.forget();
487
+ this.layer.toLocal(eye, this.lastEye, 0, true), this.hasEye = true, this.forget(), this.follow();
409
488
  }
410
489
  forget() {
411
490
  let layer = this.layer, eye = this.lastEye, radii = sceneryTierRadii(this.tier()), scale = layer.scale, states = this.engineState, sphere = this.rowSphere, sweep = this.sweep, end = Math.min(states.length, sweep + (256));
@@ -469,7 +548,7 @@ var SceneryChunks = class {
469
548
  }
470
549
  mark(index, state) {
471
550
  let previous = this.engineState[index], bytes = this.rowBytes[index];
472
- previous === (1) && (this.waiting--, this.flow[chunkAZC2LTUI_js.FLOW_BACKLOG] -= bytes), state === (1) && (this.waiting++, this.flow[chunkAZC2LTUI_js.FLOW_BACKLOG] += bytes), previous === (1) && state === (2) && (this.flow[chunkAZC2LTUI_js.FLOW_DELIVERED] += bytes), this.engineState[index] = state;
551
+ previous === (1) && (this.waiting--, this.flow[chunkVVE3Y76O_js.FLOW_BACKLOG] -= bytes), state === (1) && (this.waiting++, this.flow[chunkVVE3Y76O_js.FLOW_BACKLOG] += bytes), previous === (1) && state === (2) && (this.flow[chunkVVE3Y76O_js.FLOW_DELIVERED] += bytes), this.engineState[index] = state;
473
552
  }
474
553
  view() {
475
554
  if (this.closed) return CLOSED_REGISTERS;
@@ -503,10 +582,15 @@ var SceneryChunks = class {
503
582
  let port = this.port;
504
583
  if (port === null) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this backend does not draw splat scenery");
505
584
  let manifest = typeof source == "string" ? source : source.href, assets = options.assets;
506
- return this.open(port, manifest, new SceneryChunks(assets ?? null, options.cacheBytes));
585
+ return this.open(port, manifest, new SceneryChunks(assets ?? null, options.cacheBytes), options);
586
+ }
587
+ /** Loads a splat body baked against a rig and binds it, so it follows that model's animation. */
588
+ async splatBody(options) {
589
+ let body = await this.load(options.manifest, options);
590
+ return body.bind(options.rig), body;
507
591
  }
508
- async open(port, location, chunks) {
509
- let bytes = await chunks.read(location), manifest = parseSceneryManifest(bytes), paths = manifest.chunks.map((name) => sibling(location, name)), handle = port.open(bytes), scenery = new Scenery(port, handle, manifest, paths, chunks, this);
592
+ async open(port, location, chunks, options) {
593
+ let bytes = await chunks.read(location), manifest = parseSceneryManifest(bytes), paths = manifest.chunks.map((name) => sibling(location, name)), handle = port.open(bytes), scenery = new Scenery(port, handle, manifest, paths, chunks, this, options);
510
594
  return this.live.push(scenery), this.prefetch !== null && scenery.stream(this.prefetch), scenery;
511
595
  }
512
596
  /** Number of scenery handles currently loaded. */
@@ -667,7 +751,7 @@ var Graphics = class {
667
751
  vectorSurfaceEvents(out = []) {
668
752
  return this.vectorPort().events(out), out;
669
753
  }
670
- vectorSurfaceStats(out = chunkEPYFN2A3_js.createVectorSurfaceStats()) {
754
+ vectorSurfaceStats(out = chunk7AAIAVAA_js.createVectorSurfaceStats()) {
671
755
  return this.vectorPort().stats(out), out;
672
756
  }
673
757
  setVectorSurfaceTier(tier) {
@@ -1069,12 +1153,12 @@ var FRAME_WINDOW = 600, NO_MOMENT = 65535, MAX_MOMENTS = 64, MS_PER_SECOND = 1e3
1069
1153
  function percentile(sorted, share) {
1070
1154
  return sorted.length === 0 ? 0 : sorted[Math.min(sorted.length - 1, Math.floor(share * sorted.length))];
1071
1155
  }
1072
- function smoothVerdict(fps, target = chunkAZC2LTUI_js.TARGET_HZ) {
1156
+ function smoothVerdict(fps, target = chunkVVE3Y76O_js.TARGET_HZ) {
1073
1157
  let share = fps / target;
1074
- return share >= chunkAZC2LTUI_js.SMOOTH_SHARE ? "smooth" : share >= chunkAZC2LTUI_js.STUTTER_SHARE ? "slight" : "stutters";
1158
+ return share >= chunkVVE3Y76O_js.SMOOTH_SHARE ? "smooth" : share >= chunkVVE3Y76O_js.STUTTER_SHARE ? "slight" : "stutters";
1075
1159
  }
1076
1160
  function heatVerdict(busyShare, pressure) {
1077
- return busyShare >= chunkAZC2LTUI_js.HOT_BUSY_SHARE || pressure >= chunkAZC2LTUI_js.HOT_PRESSURE ? "hot" : busyShare >= chunkAZC2LTUI_js.WARM_BUSY_SHARE || pressure >= chunkAZC2LTUI_js.WARM_PRESSURE ? "warm" : "cool";
1161
+ return busyShare >= chunkVVE3Y76O_js.HOT_BUSY_SHARE || pressure >= chunkVVE3Y76O_js.HOT_PRESSURE ? "hot" : busyShare >= chunkVVE3Y76O_js.WARM_BUSY_SHARE || pressure >= chunkVVE3Y76O_js.WARM_PRESSURE ? "warm" : "cool";
1078
1162
  }
1079
1163
  var FrameRecorder = class {
1080
1164
  constructor() {
@@ -1116,8 +1200,8 @@ var FrameRecorder = class {
1116
1200
  let samples = this.gpuFrames, average = this.count === 0 ? 0 : this.spanNs / this.count, busyShare = samples === 0 || average === 0 ? 0 : Math.min(1, this.busyNs / samples / average);
1117
1201
  return { busyShare, pressure: this.pressure, heat: heatVerdict(busyShare, this.pressure) };
1118
1202
  }
1119
- meter(tier, calibration = null, target = chunkAZC2LTUI_js.TARGET_HZ) {
1120
- let scale = chunkAZC2LTUI_js.isCalibrated(calibration) ? calibration.frameScale : 1, sorted = this.frameMs.slice(0, this.count).sort();
1203
+ meter(tier, calibration = null, target = chunkVVE3Y76O_js.TARGET_HZ) {
1204
+ let scale = chunkVVE3Y76O_js.isCalibrated(calibration) ? calibration.frameScale : 1, sorted = this.frameMs.slice(0, this.count).sort();
1121
1205
  for (let i = 0; i < sorted.length; i++) sorted[i] *= scale;
1122
1206
  let p95 = percentile(sorted, (0.95)), fps = p95 > 0 ? Math.min(target, (1e3) / p95) : target;
1123
1207
  return {
@@ -1130,9 +1214,9 @@ var FrameRecorder = class {
1130
1214
  targetFps: target,
1131
1215
  smooth: smoothVerdict(fps, target),
1132
1216
  worstMoment: this.worstMoment(),
1133
- causes: chunkAZC2LTUI_js.passCauses(this.passNs),
1134
- calibrated: chunkAZC2LTUI_js.isCalibrated(calibration),
1135
- device: chunkAZC2LTUI_js.isCalibrated(calibration) ? calibration.device : null
1217
+ causes: chunkVVE3Y76O_js.passCauses(this.passNs),
1218
+ calibrated: chunkVVE3Y76O_js.isCalibrated(calibration),
1219
+ device: chunkVVE3Y76O_js.isCalibrated(calibration) ? calibration.device : null
1136
1220
  };
1137
1221
  }
1138
1222
  worstMoment() {
@@ -1176,18 +1260,18 @@ var MemoryPeak = class {
1176
1260
  }
1177
1261
  };
1178
1262
  function memoryMeter(sample, tier, calibration = null) {
1179
- let scale = chunkAZC2LTUI_js.isCalibrated(calibration) ? calibration.memoryScale : 1, bytes = (sample.scriptBytes + sample.engineBytes + sample.graphicsBytes) * scale, ceiling = chunkAZC2LTUI_js.MEMORY_CEILING_BYTES[tier];
1263
+ let scale = chunkVVE3Y76O_js.isCalibrated(calibration) ? calibration.memoryScale : 1, bytes = (sample.scriptBytes + sample.engineBytes + sample.graphicsBytes) * scale, ceiling = chunkVVE3Y76O_js.MEMORY_CEILING_BYTES[tier];
1180
1264
  return {
1181
1265
  tier,
1182
1266
  bytes,
1183
1267
  ceilingBytes: ceiling,
1184
- memory: bytes > ceiling ? "too_much" : bytes > ceiling * chunkAZC2LTUI_js.TIGHT_MEMORY_SHARE ? "tight" : "fits",
1185
- causes: chunkAZC2LTUI_js.rankCauses([
1268
+ memory: bytes > ceiling ? "too_much" : bytes > ceiling * chunkVVE3Y76O_js.TIGHT_MEMORY_SHARE ? "tight" : "fits",
1269
+ causes: chunkVVE3Y76O_js.rankCauses([
1186
1270
  { label: "Game code and data", cost: sample.scriptBytes },
1187
1271
  { label: "World, physics and sound", cost: sample.engineBytes },
1188
1272
  { label: "Pictures, models and screens", cost: sample.graphicsBytes }
1189
1273
  ]),
1190
- calibrated: chunkAZC2LTUI_js.isCalibrated(calibration)
1274
+ calibrated: chunkVVE3Y76O_js.isCalibrated(calibration)
1191
1275
  };
1192
1276
  }
1193
1277
 
@@ -1242,7 +1326,7 @@ var GPU_SAMPLE_FRAMES = 30, QUALITY_FOR_TIER = {
1242
1326
  this.recorder.reset(), this.memory.reset(), this.sinceGpu = 0;
1243
1327
  }
1244
1328
  read() {
1245
- let calibration = chunkAZC2LTUI_js.calibrationFor(this.calibrations, this.tier);
1329
+ let calibration = chunkVVE3Y76O_js.calibrationFor(this.calibrations, this.tier);
1246
1330
  return {
1247
1331
  tier: this.tier,
1248
1332
  asTier: this.forced,
@@ -1,4 +1,4 @@
1
- import { PURCHASE_INTENT_MOBILE_MONEY_NETWORK, money } from './chunk-GCKWKLZF.mjs';
1
+ import { PURCHASE_INTENT_MOBILE_MONEY_NETWORK, money } from './chunk-FT6GFYJL.mjs';
2
2
 
3
3
  // src/utils/price.ts
4
4
  var CURRENCY_SYMBOLS = {
@@ -75,39 +75,98 @@ var CURRENCY_SYMBOLS = {
75
75
  function getCurrencySymbol(currencyCode2) {
76
76
  return CURRENCY_SYMBOLS[currencyCode2.toUpperCase()] || currencyCode2;
77
77
  }
78
+ var PRICE_UNAVAILABLE_LABEL = "Price unavailable", DEFAULT_FORMAT_LOCALE = "en-US", PERCENT_SCALE = 100, ISO_CURRENCY_CODE = /^[A-Z]{3}$/, STANDARD_MINOR_UNIT_DIGITS = 2, ZERO_MINOR_UNIT_DIGITS = 0, THREE_MINOR_UNIT_DIGITS = 3, ZERO_DECIMAL_CURRENCIES = new Set(
79
+ "BIF CLP DJF GNF ISK JPY KMF KRW PYG RWF UGX VND VUV XAF XOF XPF".split(" ")
80
+ ), THREE_DECIMAL_CURRENCIES = new Set(
81
+ "BHD IQD JOD KWD LYD OMR TND".split(" ")
82
+ ), DECIMAL_BASE = 10, DECIMAL_RADIX = 10n, ROUND_UP_FROM_DIGIT = "5", PLAIN_DECIMAL_MAX_FRACTION_DIGITS = 20, DECIMAL_TEXT = /^([+-]?)(\d*)(?:\.(\d*))?$/, EXPONENT_NOTATION = /e/i, LOCALE_PROBE_VALUE = -1.5;
83
+ function currencyFractionDigits(currency) {
84
+ if (!currency) return null;
85
+ let code = currency.trim().toUpperCase();
86
+ return ISO_CURRENCY_CODE.test(code) ? ZERO_DECIMAL_CURRENCIES.has(code) ? (0) : THREE_DECIMAL_CURRENCIES.has(code) ? (3) : (2) : null;
87
+ }
88
+ function roundToCurrencyDigits(value, currency) {
89
+ let digits = currencyFractionDigits(currency);
90
+ if (digits === null) return value;
91
+ let factor = (10) ** digits;
92
+ return Math.round(value * factor) / factor;
93
+ }
94
+ function numberToDecimalText(value) {
95
+ if (!Number.isFinite(value)) return null;
96
+ let text = String(value);
97
+ return EXPONENT_NOTATION.test(text) ? value.toLocaleString(DEFAULT_FORMAT_LOCALE, {
98
+ useGrouping: false,
99
+ maximumFractionDigits: (20)
100
+ }) : text;
101
+ }
102
+ function roundDecimalText(text, digits) {
103
+ let match = DECIMAL_TEXT.exec(text.trim());
104
+ if (!match) return null;
105
+ let sign = match[1] ?? "", whole = match[2] ?? "", fraction = match[3] ?? "";
106
+ if (whole.length === 0 && fraction.length === 0) return null;
107
+ let kept = fraction.padEnd(digits, "0").slice(0, digits), scaled = BigInt(`${whole || "0"}${kept}`);
108
+ fraction.charAt(digits) >= ROUND_UP_FROM_DIGIT && (scaled += 1n);
109
+ let scale = DECIMAL_RADIX ** BigInt(digits);
110
+ return {
111
+ negative: sign === "-" && scaled !== 0n,
112
+ whole: scaled / scale,
113
+ fraction: digits === 0 ? "" : (scaled % scale).toString().padStart(digits, "0")
114
+ };
115
+ }
116
+ var symbolsByLocale = /* @__PURE__ */ new Map(), wholeFormatters = /* @__PURE__ */ new Map();
117
+ function localeNumberSymbols(locale) {
118
+ let cached = symbolsByLocale.get(locale);
119
+ if (cached) return cached;
120
+ let formatter = new Intl.NumberFormat(locale, { useGrouping: false }), parts = formatter.formatToParts((-1.5)), symbols = {
121
+ decimal: parts.find((part) => part.type === "decimal")?.value ?? ".",
122
+ minus: parts.find((part) => part.type === "minusSign")?.value ?? "-",
123
+ digits: Array.from({ length: (10) }, (_, digit) => formatter.format(digit))
124
+ };
125
+ return symbolsByLocale.set(locale, symbols), symbols;
126
+ }
127
+ function wholeFormatter(locale, grouping) {
128
+ let key = `${locale}|${grouping ? "grouped" : "plain"}`, cached = wholeFormatters.get(key);
129
+ if (cached) return cached;
130
+ let formatter = new Intl.NumberFormat(locale, { useGrouping: grouping });
131
+ return wholeFormatters.set(key, formatter), formatter;
132
+ }
133
+ function localeDecimalText(rounded, locale, grouping) {
134
+ let symbols = localeNumberSymbols(locale), wholeText = wholeFormatter(locale, grouping).format(rounded.whole), fractionText = Array.from(
135
+ rounded.fraction,
136
+ (digit) => symbols.digits[Number(digit)] ?? digit
137
+ ).join(""), body = fractionText.length > 0 ? `${wholeText}${symbols.decimal}${fractionText}` : wholeText;
138
+ return rounded.negative ? `${symbols.minus}${body}` : body;
139
+ }
140
+ function formatCurrencyAmount(amount, currency, options = {}) {
141
+ let digits = currencyFractionDigits(currency);
142
+ if (digits === null || !currency) return null;
143
+ let text = typeof amount == "number" ? numberToDecimalText(amount) : amount;
144
+ if (text === null) return null;
145
+ let rounded = roundDecimalText(text, digits);
146
+ if (!rounded) return null;
147
+ let locale = options.locale ?? DEFAULT_FORMAT_LOCALE, grouping = options.grouping ?? true;
148
+ return `${getCurrencySymbol(currency.trim().toUpperCase())}${localeDecimalText(rounded, locale, grouping)}`;
149
+ }
78
150
  function formatNumberCompact(value, decimals = 1) {
79
151
  let absValue = Math.abs(value), sign = value < 0 ? "-" : "";
80
152
  return absValue >= 1e9 ? `${sign}${(absValue / 1e9).toFixed(decimals)}B` : absValue >= 1e6 ? `${sign}${(absValue / 1e6).toFixed(decimals)}M` : absValue >= 1e3 ? `${sign}${(absValue / 1e3).toFixed(decimals)}K` : `${sign}${absValue.toFixed(decimals)}`;
81
153
  }
82
- function formatPrice(amount, currency = "GHS", locale = "en-US") {
83
- let numAmount = typeof amount == "string" ? parseFloat(amount) : amount;
84
- if (isNaN(numAmount))
85
- return `${getCurrencySymbol(currency)}0.00`;
86
- let symbol = getCurrencySymbol(currency);
87
- try {
88
- let formatted = new Intl.NumberFormat(locale, {
89
- minimumFractionDigits: 2,
90
- maximumFractionDigits: 2
91
- }).format(numAmount);
92
- return `${symbol}${formatted}`;
93
- } catch {
94
- return `${symbol}${numAmount.toFixed(2)}`;
95
- }
154
+ function formatPrice(amount, currency, locale = DEFAULT_FORMAT_LOCALE) {
155
+ return formatCurrencyAmount(amount, currency, { locale }) ?? PRICE_UNAVAILABLE_LABEL;
96
156
  }
97
- function formatPriceAdjustment(amount, currency = "GHS", locale = "en-US") {
98
- let formatted = formatPrice(Math.abs(amount), currency, locale);
99
- return amount > 0 ? `+${formatted}` : amount < 0 ? `-${formatted}` : formatted;
157
+ function formatPriceAdjustment(amount, currency, locale = DEFAULT_FORMAT_LOCALE) {
158
+ let formatted = formatCurrencyAmount(Math.abs(amount), currency, { locale });
159
+ return formatted === null ? PRICE_UNAVAILABLE_LABEL : amount > 0 ? `+${formatted}` : amount < 0 ? `-${formatted}` : formatted;
100
160
  }
101
- function formatPriceCompact(amount, currency = "GHS", decimals = 1) {
102
- let numAmount = typeof amount == "string" ? parseFloat(amount) : amount;
103
- if (isNaN(numAmount))
104
- return `${getCurrencySymbol(currency)}0`;
105
- let symbol = getCurrencySymbol(currency);
106
- return Math.abs(numAmount) < 1e3 ? `${symbol}${numAmount.toFixed(2)}` : `${symbol}${formatNumberCompact(numAmount, decimals)}`;
161
+ var COMPACT_THRESHOLD = 1e3;
162
+ function formatPriceCompact(amount, currency, decimals = 1) {
163
+ let exact = formatCurrencyAmount(amount, currency);
164
+ if (exact === null || !currency) return PRICE_UNAVAILABLE_LABEL;
165
+ let magnitude = typeof amount == "number" ? amount : Number.parseFloat(amount);
166
+ return Math.abs(magnitude) < (1e3) ? exact : `${getCurrencySymbol(currency.trim().toUpperCase())}${formatNumberCompact(magnitude, decimals)}`;
107
167
  }
108
- function formatMoney(amount, currency = "GHS") {
109
- let symbol = getCurrencySymbol(currency), numAmount = typeof amount == "string" ? parseFloat(amount) : amount;
110
- return isNaN(numAmount) ? `${symbol}0.00` : `${symbol}${numAmount.toFixed(2)}`;
168
+ function formatMoney(amount, currency) {
169
+ return formatCurrencyAmount(amount, currency, { grouping: false }) ?? PRICE_UNAVAILABLE_LABEL;
111
170
  }
112
171
  function parsePrice(value) {
113
172
  if (value == null)
@@ -135,9 +194,9 @@ function getTaxAmount(priceInfo) {
135
194
  function isTaxInclusive(priceInfo) {
136
195
  return priceInfo.tax_info?.is_inclusive === true;
137
196
  }
138
- function formatPriceWithTax(priceInfo, currency = "GHS") {
139
- let finalPrice = formatPrice(priceInfo.final_price, currency);
140
- return hasTaxInfo(priceInfo) ? isTaxInclusive(priceInfo) ? `${finalPrice} (incl. tax)` : `${finalPrice} + ${formatPrice(getTaxAmount(priceInfo), currency)} tax` : finalPrice;
197
+ function formatPriceWithTax(priceInfo, currency) {
198
+ let finalPrice = formatCurrencyAmount(priceInfo.final_price, currency);
199
+ return finalPrice === null ? PRICE_UNAVAILABLE_LABEL : hasTaxInfo(priceInfo) ? isTaxInclusive(priceInfo) ? `${finalPrice} (incl. tax)` : `${finalPrice} + ${formatPrice(getTaxAmount(priceInfo), currency)} tax` : finalPrice;
141
200
  }
142
201
  function getDisplayPrice(product) {
143
202
  return product.sale ? parsePrice(product.sale.price) : product.price_info ? parsePrice(product.price_info.final_price) : product.final_price !== void 0 && product.final_price !== null ? parsePrice(product.final_price) : product.default_price !== void 0 && product.default_price !== null ? parsePrice(product.default_price) : 0;
@@ -155,18 +214,17 @@ function getDiscountPercentage(product) {
155
214
  if (product.sale)
156
215
  return parsePrice(product.sale.percent_off);
157
216
  let basePrice = getBasePrice(product), finalPrice = getDisplayPrice(product);
158
- return basePrice > finalPrice && basePrice > 0 ? Math.round((basePrice - finalPrice) / basePrice * 100) : 0;
217
+ return basePrice > finalPrice && basePrice > 0 ? Math.round((basePrice - finalPrice) / basePrice * (100)) : 0;
159
218
  }
160
219
  function getMarkupPercentage(product) {
161
220
  let basePrice = getBasePrice(product), finalPrice = getDisplayPrice(product);
162
- return finalPrice > basePrice && basePrice > 0 ? Math.round((finalPrice - basePrice) / basePrice * 100) : 0;
221
+ return finalPrice > basePrice && basePrice > 0 ? Math.round((finalPrice - basePrice) / basePrice * (100)) : 0;
163
222
  }
164
223
  function getProductCurrency(product) {
165
- return product.price_info?.currency ? product.price_info.currency : product.currency ? product.currency : "GHS";
224
+ return product.price_info?.currency || product.currency || void 0;
166
225
  }
167
- function formatProductPrice(product, locale = "en-US") {
168
- let price = getDisplayPrice(product), currency = getProductCurrency(product);
169
- return formatPrice(price, currency, locale);
226
+ function formatProductPrice(product, locale = DEFAULT_FORMAT_LOCALE) {
227
+ return formatPrice(getDisplayPrice(product), getProductCurrency(product), locale);
170
228
  }
171
229
  function getUnitPriceAtQuantity(tiers, quantity, fallback) {
172
230
  let sorted = [...tiers].sort((a, b) => a.min_quantity - b.min_quantity), matched;
@@ -187,8 +245,9 @@ function getPriceRange(product) {
187
245
  }
188
246
  return null;
189
247
  }
190
- function formatPriceRange(min, max, currency = "GHS") {
191
- return `${formatPrice(min, currency)} \u2013 ${formatPrice(max, currency)}`;
248
+ function formatPriceRange(min, max, currency) {
249
+ let low = formatCurrencyAmount(min, currency), high = formatCurrencyAmount(max, currency);
250
+ return low === null || high === null ? PRICE_UNAVAILABLE_LABEL : `${low} \u2013 ${high}`;
192
251
  }
193
252
 
194
253
  // src/utils/payment.ts
@@ -404,4 +463,4 @@ function detectMobileMoneyProvider(phoneNumber) {
404
463
  return null;
405
464
  }
406
465
 
407
- export { CURRENCY_SYMBOLS, MOBILE_MONEY_PROVIDERS, PAYMENT_TERMINAL_FAILURE_STATUSES, canonicalMobileMoneyProvider, categorizePaymentError, detectMobileMoneyProvider, formatMoney, formatNumberCompact, formatPrice, formatPriceAdjustment, formatPriceCompact, formatPriceRange, formatPriceWithTax, formatProductPrice, getBasePrice, getCurrencySymbol, getDiscountPercentage, getDisplayPrice, getMarkupPercentage, getPriceRange, getProductCurrency, getTaxAmount, getUnitPriceAtQuantity, getVariantUnitPrice, hasTaxInfo, isOnSale, isPaymentStatusFailure, isPaymentStatusRequiresAction, isPaymentStatusSuccess, isTaxInclusive, normalizePaymentResponse, normalizeStatusResponse, parsePrice, paymentAuthorizationUrl, purchaseIntentMobileMoneyNetwork };
466
+ export { CURRENCY_SYMBOLS, MOBILE_MONEY_PROVIDERS, PAYMENT_TERMINAL_FAILURE_STATUSES, PRICE_UNAVAILABLE_LABEL, canonicalMobileMoneyProvider, categorizePaymentError, currencyFractionDigits, detectMobileMoneyProvider, formatCurrencyAmount, formatMoney, formatNumberCompact, formatPrice, formatPriceAdjustment, formatPriceCompact, formatPriceRange, formatPriceWithTax, formatProductPrice, getBasePrice, getCurrencySymbol, getDiscountPercentage, getDisplayPrice, getMarkupPercentage, getPriceRange, getProductCurrency, getTaxAmount, getUnitPriceAtQuantity, getVariantUnitPrice, hasTaxInfo, isOnSale, isPaymentStatusFailure, isPaymentStatusRequiresAction, isPaymentStatusSuccess, isTaxInclusive, normalizePaymentResponse, normalizeStatusResponse, parsePrice, paymentAuthorizationUrl, purchaseIntentMobileMoneyNetwork, roundToCurrencyDigits };
@@ -1,4 +1,4 @@
1
- import { INPUT_STRIDE, GEAR_AUTO, INPUT_GEAR, STATE_STRIDE, VEHICLE_DESC_WORDS, MAX_WHEELS, DESC_IDLE_RPM, DESC_WHEEL_COUNT, NO_GROUND, DESC_HEADER, WHEEL_DESC_WORDS, WHEEL_DESC_REST, INPUT_THROTTLE, INPUT_BRAKE, INPUT_STEER, INPUT_HANDBRAKE, DESC_STEER_RATE, DESC_MAX_STEER, DESC_ACKERMANN, WHEEL_DESC_POSITION, WHEEL_DESC_STEER, WHEEL_DESC_RADIUS, WHEEL_DESC_TRAVEL, WHEEL_DESC_COMPRESSION, WHEEL_DESC_RELAXATION, WHEEL_DESC_STIFFNESS, WHEEL_DESC_MAX_FORCE, DESC_ANTI_ROLL, WHEEL_DESC_AXLE, NO_AXLE, DESC_ROLLING, WHEEL_DESC_DRIVE, WHEEL_DESC_SIDE, DESC_SKID_TORQUE, WHEEL_DESC_BRAKE, WHEEL_DESC_HANDBRAKE, DESC_HANDBRAKE_GRIP, DESC_FORCE_HEIGHT, WHEEL_DESC_GRIP, DESC_DOWNFORCE, DESC_DRAG, WHEEL_DESC_INERTIA, DESC_MAX_RPM, DESC_GEAR_COUNT, DESC_SHIFT_UP, DESC_SHIFT_DOWN, DESC_SHIFT_SECONDS, DESC_TORQUE_POINTS, DESC_TORQUE, DESC_TORQUE_RPM, DESC_ENGINE_BRAKING, DESC_ENGINE_INERTIA, DESC_EFFICIENCY, DESC_DIFFERENTIAL_LOCK, DESC_CENTER_LOCK, DESC_LEAN_STIFFNESS, DESC_LEAN_DAMPING, DESC_LEAN_SPEED, DESC_LEAN_MAX, DESC_RATIOS, DESC_FINAL_DRIVE, DESC_REVERSE, STATE_SPEED, STATE_RPM, STATE_GEAR, STATE_STEER, STATE_SHIFTING, WHEEL_CENTER, WHEEL_SPIN, WHEEL_STEER, WHEEL_LENGTH, WHEEL_GROUND, WHEEL_POINT, WHEEL_SLIP, WHEEL_SLIP_ANGLE, WHEEL_LOAD, WHEEL_OMEGA, WHEEL_FORCE_LONG, WHEEL_FORCE_LAT, STATE_GROUNDED, STEER_LIMIT, STATE_HEADER, WHEEL_STRIDE, CURVE_POINTS, CURVE_VALUE, CURVE_SLIP, WHEEL_DESC_LONGITUDINAL, WHEEL_DESC_LATERAL } from './chunk-765P2G7G.mjs';
1
+ import { INPUT_STRIDE, GEAR_AUTO, INPUT_GEAR, STATE_STRIDE, VEHICLE_DESC_WORDS, MAX_WHEELS, DESC_IDLE_RPM, DESC_WHEEL_COUNT, NO_GROUND, DESC_HEADER, WHEEL_DESC_WORDS, WHEEL_DESC_REST, INPUT_THROTTLE, INPUT_BRAKE, INPUT_STEER, INPUT_HANDBRAKE, DESC_STEER_RATE, DESC_MAX_STEER, DESC_ACKERMANN, WHEEL_DESC_POSITION, WHEEL_DESC_STEER, WHEEL_DESC_RADIUS, WHEEL_DESC_TRAVEL, WHEEL_DESC_COMPRESSION, WHEEL_DESC_RELAXATION, WHEEL_DESC_STIFFNESS, WHEEL_DESC_MAX_FORCE, DESC_ANTI_ROLL, WHEEL_DESC_AXLE, NO_AXLE, DESC_ROLLING, WHEEL_DESC_DRIVE, WHEEL_DESC_SIDE, DESC_SKID_TORQUE, WHEEL_DESC_BRAKE, WHEEL_DESC_HANDBRAKE, DESC_HANDBRAKE_GRIP, DESC_FORCE_HEIGHT, WHEEL_DESC_GRIP, DESC_DOWNFORCE, DESC_DRAG, WHEEL_DESC_INERTIA, DESC_MAX_RPM, DESC_GEAR_COUNT, DESC_SHIFT_UP, DESC_SHIFT_DOWN, DESC_SHIFT_SECONDS, DESC_TORQUE_POINTS, DESC_TORQUE, DESC_TORQUE_RPM, DESC_ENGINE_BRAKING, DESC_ENGINE_INERTIA, DESC_EFFICIENCY, DESC_DIFFERENTIAL_LOCK, DESC_CENTER_LOCK, DESC_LEAN_STIFFNESS, DESC_LEAN_DAMPING, DESC_LEAN_SPEED, DESC_LEAN_MAX, DESC_RATIOS, DESC_FINAL_DRIVE, DESC_REVERSE, STATE_SPEED, STATE_RPM, STATE_GEAR, STATE_STEER, STATE_SHIFTING, WHEEL_CENTER, WHEEL_SPIN, WHEEL_STEER, WHEEL_LENGTH, WHEEL_GROUND, WHEEL_POINT, WHEEL_SLIP, WHEEL_SLIP_ANGLE, WHEEL_LOAD, WHEEL_OMEGA, WHEEL_FORCE_LONG, WHEEL_FORCE_LAT, STATE_GROUNDED, STEER_LIMIT, STATE_HEADER, WHEEL_STRIDE, CURVE_POINTS, CURVE_VALUE, CURVE_SLIP, WHEEL_DESC_LONGITUDINAL, WHEEL_DESC_LATERAL } from './chunk-RUVGVNOF.mjs';
2
2
  import { GameError } from './chunk-XJIHN3BY.mjs';
3
3
 
4
4
  // src/game/physics/vehicle-solver.ts