@alwith/module-auth 0.1.5 → 0.1.7

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 (71) hide show
  1. package/README.md +21 -1
  2. package/THIRD_PARTY_NOTICES.md +3 -2
  3. package/dist/oauth.js +1 -1
  4. package/dist/pets/assets.d.ts +34 -3
  5. package/dist/pets/assets.js +1 -1
  6. package/dist/pets/client.d.ts +1 -0
  7. package/dist/pets/client.js +1 -1
  8. package/dist/pets/core/engine.js +1 -1
  9. package/dist/pets/core/host.d.ts +26 -25
  10. package/dist/pets/core/lib/account-state.js +1 -1
  11. package/dist/pets/core/lib/draw-result.js +1 -1
  12. package/dist/pets/core/lib/endpoints.d.ts +28 -1
  13. package/dist/pets/core/lib/gacha-pools.js +1 -1
  14. package/dist/pets/core/lib/loading-progress.d.ts +0 -1
  15. package/dist/pets/core/lib/loading-progress.js +1 -1
  16. package/dist/pets/core/lib/pet-animation-sync.d.ts +1 -1
  17. package/dist/pets/core/lib/pet-drag.d.ts +1 -1
  18. package/dist/pets/core/lib/pet-presentation.d.ts +1 -1
  19. package/dist/pets/core/lib/preload-images.js +1 -1
  20. package/dist/pets/core/lib/presentation-readiness.js +1 -1
  21. package/dist/pets/core/lib/rarity.js +1 -1
  22. package/dist/pets/core/lib/resource-sync.js +1 -1
  23. package/dist/pets/core/lib/settings.js +1 -1
  24. package/dist/pets/core/lib/sprite-config.js +1 -1
  25. package/dist/pets/core/lib/vibemon-resources.js +1 -1
  26. package/dist/pets/core/types.d.ts +2 -4
  27. package/dist/pets/host.d.ts +13 -10
  28. package/dist/pets/react/assets.js +1 -1
  29. package/dist/pets/react/components/album-view.js +1 -1
  30. package/dist/pets/react/components/back-to-home.js +1 -1
  31. package/dist/pets/react/components/equip-view.js +1 -1
  32. package/dist/pets/react/components/gem-balance.js +1 -1
  33. package/dist/pets/react/components/home-view.js +1 -1
  34. package/dist/pets/react/components/insufficient-points-dialog.js +1 -1
  35. package/dist/pets/react/components/loading-view.js +1 -1
  36. package/dist/pets/react/components/lounge-burst.css +0 -2
  37. package/dist/pets/react/components/onboarding-guide.js +1 -1
  38. package/dist/pets/react/components/pet-bubble-background.js +1 -1
  39. package/dist/pets/react/components/pet-window.js +1 -1
  40. package/dist/pets/react/components/pull-overlay.js +1 -1
  41. package/dist/pets/react/components/pull-view.js +1 -1
  42. package/dist/pets/react/components/quick-reply.js +2 -2
  43. package/dist/pets/react/components/single-pet-toast.js +1 -1
  44. package/dist/pets/react/components/sprite-renderer.d.ts +2 -1
  45. package/dist/pets/react/components/sprite-renderer.js +1 -1
  46. package/dist/pets/react/components/vibemon-header.js +1 -1
  47. package/dist/pets/react/components/vibemon-page.js +1 -1
  48. package/dist/pets/react/components/video-fader.d.ts +1 -4
  49. package/dist/pets/react/components/video-fader.js +1 -1
  50. package/dist/pets/react/components/wish-button.js +1 -1
  51. package/dist/pets/react/ui/button.d.ts +1 -1
  52. package/dist/pets/react/ui/button.js +1 -1
  53. package/dist/pets/react/ui/card.d.ts +1 -1
  54. package/dist/pets/react/ui/card.js +1 -1
  55. package/dist/pets/react/ui/input-group.d.ts +1 -1
  56. package/dist/pets/react/ui/input-group.js +1 -1
  57. package/dist/pets/resource-package.d.ts +27 -0
  58. package/dist/pets/resource-package.js +1 -0
  59. package/dist/pets/resources.d.ts +16 -16
  60. package/dist/pets/resources.js +1 -1
  61. package/dist/pets/selection.d.ts +1 -1
  62. package/dist/pets/selection.js +1 -1
  63. package/dist/pets/sheet-layout.d.ts +10 -0
  64. package/dist/pets/sheet-layout.js +1 -0
  65. package/dist/pets/types.d.ts +21 -9
  66. package/dist/state.d.ts +1 -1
  67. package/dist/state.js +1 -1
  68. package/dist/token-storage.d.ts +9 -9
  69. package/dist/token-storage.js +1 -1
  70. package/licenses/fflate-MIT.txt +21 -0
  71. package/package.json +5 -4
@@ -1 +1 @@
1
- import{jsx as t,jsxs as l,Fragment as V}from"react/jsx-runtime";import{equipPageBackground as j,pullTexture as P}from"../assets.js";import{Loader2 as w}from"lucide-react";import{useCallback as T,useEffect as R,useState as g}from"react";import{useTranslation as B}from"react-i18next";import{toast as y}from"sonner";import{Button as C}from"../ui/button.js";import{openVibemonWindow as D}from"../../core/lib/window-manager.js";import{getVibemonState as I,updateVibemonState as m,useVibemonState as z}from"../lib/account-state.js";import{cardThumb as L}from"../lib/card-image.js";import{sortByRarityDesc as O}from"../../core/lib/rarity.js";import{useVibemonSyncStore as U}from"../lib/resource-sync.js";import{verifyVibemonResource as W}from"../../core/lib/vibemon-resources.js";import{SinglePetToast as A}from"./single-pet-toast.js";import{VibemonEmptyState as G}from"./vibemon-empty-state.js";import{VibemonHeader as H}from"./vibemon-header.js";import{VibemonScene as Y}from"./vibemon-scene.js";async function J(e,i){let{pet:s}=await I();if(!s){if(e.length!==1)return;let n=e.find((a)=>i[a.vibemon_uuid]);if(n)await m({pet:n.vibemon_uuid});return}if(i[s])return;let r=e.find((n)=>i[n.vibemon_uuid]);if(r)await m({pet:r.vibemon_uuid})}function K(e){if(e.icon_url===null)throw Error(`[vibemon] owned Vibemon ${e.vibemon_uuid} is missing icon_url`);return e.icon_url}function M(e){if(e.background_url===null)throw Error(`[vibemon] owned Vibemon ${e.vibemon_uuid} is missing background_url`);return e.background_url}function Q({item:e,isCurrent:i,isDownloaded:s,onSelectedClick:r,onEquip:n}){return l("div",{"data-testid":"equip-list-item",className:"relative h-[10.673cqw] w-full shrink-0",children:[l("div",{className:"absolute top-[10.302%] left-[4.878%] h-[78.079%] w-[94.309%]",children:[t("img",{src:M(e),alt:"","aria-hidden":!0,className:"absolute inset-0 h-full w-full max-w-none rounded-[1.667cqw] object-cover select-none"}),l("div",{className:"absolute top-[29.638%] left-[9.914%] w-[65.259%]",children:[t("div",{className:"truncate text-[1.875cqw] leading-[1.278] text-white",style:{fontFamily:"Outfit, system-ui, sans-serif",fontWeight:900},children:e.name}),t("div",{className:"mt-[0.104cqw] truncate text-[1.042cqw] leading-[1.25] font-medium text-white",style:{fontFamily:"Outfit, system-ui, sans-serif"},children:e.description===null?e.rarity_name:e.description})]}),l(C,{"aria-label":i?"selected":"select",disabled:!s,onClick:i?r:n,style:{backgroundColor:"#5536CC"},className:"absolute top-[31.756%] left-[70.690%] h-[41.25%] w-[17.241%] overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.25cqh_0_rgba(0,0,0,0.5)] transition-none hover:brightness-105 active:translate-y-0 disabled:opacity-100",children:[t("img",{src:P,alt:"",className:"pointer-events-none absolute inset-0 size-full max-w-none rounded-[inherit] object-bottom opacity-5 mix-blend-difference select-none"}),i&&t("span",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 bg-[#5D508B]"}),t("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),t("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:i?"selected":"select"})]})]}),t("div",{className:"absolute top-0 left-0 size-[7.917cqw] overflow-hidden rounded-full",children:t("img",{src:L(K(e)),alt:`${e.name} portrait`,className:"h-full w-full object-cover select-none"})})]})}function X({items:e,currentId:i,downloaded:s,onSelectedClick:r,onEquip:n}){return t("div",{className:"flex flex-col gap-[0.833cqw]",children:O(e).map((a)=>t(Q,{item:a,isCurrent:a.vibemon_uuid===i,isDownloaded:s[a.vibemon_uuid],onSelectedClick:r,onEquip:()=>n(a.vibemon_uuid)},a.vibemon_uuid))})}function he({onBack:e,onWish:i,onAlbum:s,albumHasUnseen:r,ownedCards:n,ownedLoaded:a,availablePoints:_,pointsLoaded:x}){let{i18n:q}=B("common"),u=q.getFixedT("en","common"),{pet:N}=z(),d=U((o)=>o.status==="checking"||o.status==="updating"),[f,k]=g({}),[S,b]=g(0),p=T(()=>b(0),[]);R(()=>{let o=!1;return(async()=>{let c=await Promise.all(n.map(async(v)=>[v.vibemon_uuid,await W(v.vibemon_uuid)]));if(o)return;let h=Object.fromEntries(c);if(k(h),!d)await J(n,h)})(),()=>{o=!0}},[n,d]);let E=async(o)=>{p();try{if(await m({pet:o}),await D({trusted:!0})==="unavailable")y.error(u("vibemon.actionFailed"))}catch(c){console.warn("[vibemon] equip failed",c),y.error(u("vibemon.actionFailed"))}},F=n.some((o)=>f[o.vibemon_uuid]);return l(Y,{backdrop:l(V,{children:[t("img",{src:j,alt:"","aria-hidden":!0,className:"pointer-events-none absolute inset-0 h-full w-full object-cover opacity-10 select-none"}),t("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{background:"linear-gradient(180deg, rgba(0,0,0,0.3) 0%, rgba(102,102,102,0) 100%)"}})]}),children:[t(H,{onBack:e,onWish:i,sectionAction:{kind:"album",onClick:s,hasUnseen:r},availablePoints:_,pointsLoaded:x}),!a?t("div",{"data-testid":"vibemon-owned-loading",className:"absolute inset-0 flex items-center justify-center text-[#DCC9FF]",children:t(w,{className:"size-8 animate-spin"})}):n.length===0?t(G,{onWish:i}):d&&!F?l("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-3 text-[#DCC9FF]",children:[t(w,{className:"size-8 animate-spin"}),t("div",{className:"text-sm",children:u("vibemon.syncPreparing")})]}):t("div",{className:"absolute top-[17.167%] left-[17.969%] h-[77.833%] w-[64.063%] [scrollbar-width:none] overflow-y-auto overscroll-y-contain [&::-webkit-scrollbar]:hidden",children:t(X,{items:n,currentId:N,downloaded:f,onSelectedClick:()=>b((o)=>o+1),onEquip:(o)=>void E(o)})}),t(A,{requestId:S,onClose:p})]})}export{X as EquipList,he as EquipView};
1
+ import{jsx as e,jsxs as l,Fragment as V}from"react/jsx-runtime";import{Loader2 as w}from"lucide-react";import{useCallback as P,useEffect as T,useState as g}from"react";import{useTranslation as C}from"react-i18next";import{toast as y}from"sonner";import{sortByRarityDesc as R}from"../../core/lib/rarity.js";import{verifyVibemonResource as B}from"../../core/lib/vibemon-resources.js";import{openVibemonWindow as D}from"../../core/lib/window-manager.js";import{equipPageBackground as I,placeholderCard as _,pullTexture as z}from"../assets.js";import{getVibemonState as L,updateVibemonState as m,useVibemonState as O}from"../lib/account-state.js";import{cardThumb as U}from"../lib/card-image.js";import{useVibemonSyncStore as W}from"../lib/resource-sync.js";import{Button as A}from"../ui/button.js";import{SinglePetToast as G}from"./single-pet-toast.js";import{VibemonEmptyState as H}from"./vibemon-empty-state.js";import{VibemonHeader as Y}from"./vibemon-header.js";import{VibemonScene as J}from"./vibemon-scene.js";async function K(t,i){let{pet:s}=await L();if(!s){if(t.length!==1)return;let n=t.find((a)=>i[a.vibemon_uuid]);if(n)await m({pet:n.vibemon_uuid});return}if(i[s])return;let r=t.find((n)=>i[n.vibemon_uuid]);if(r)await m({pet:r.vibemon_uuid})}function M(t){if(t.icon_url===null)return _;return t.icon_url}function Q(t){if(t.background_url===null)return _;return t.background_url}function X({item:t,isCurrent:i,isDownloaded:s,onSelectedClick:r,onEquip:n}){return l("div",{"data-testid":"equip-list-item",className:"relative h-[10.673cqw] w-full shrink-0",children:[l("div",{className:"absolute top-[10.302%] left-[4.878%] h-[78.079%] w-[94.309%]",children:[e("img",{src:Q(t),alt:"","aria-hidden":!0,className:"absolute inset-0 h-full w-full max-w-none rounded-[1.667cqw] object-cover select-none"}),l("div",{className:"absolute top-[29.638%] left-[9.914%] w-[65.259%]",children:[e("div",{className:"truncate text-[1.875cqw] leading-[1.278] text-white",style:{fontFamily:"Outfit, system-ui, sans-serif",fontWeight:900},children:t.name}),e("div",{className:"mt-[0.104cqw] truncate text-[1.042cqw] leading-[1.25] font-medium text-white",style:{fontFamily:"Outfit, system-ui, sans-serif"},children:t.description??t.rarity_name})]}),l(A,{"aria-label":i?"selected":"select",disabled:!s,onClick:i?r:n,style:{backgroundColor:"#5536CC"},className:"absolute top-[31.756%] left-[70.690%] h-[41.25%] w-[17.241%] overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.25cqh_0_rgba(0,0,0,0.5)] transition-none hover:brightness-105 active:translate-y-0 disabled:opacity-100",children:[e("img",{src:z,alt:"",className:"pointer-events-none absolute inset-0 size-full max-w-none rounded-[inherit] object-bottom opacity-5 mix-blend-difference select-none"}),i&&e("span",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 bg-[#5D508B]"}),e("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),e("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:i?"selected":"select"})]})]}),e("div",{className:"absolute top-0 left-0 size-[7.917cqw] overflow-hidden rounded-full",children:e("img",{src:U(M(t)),alt:`${t.name} portrait`,className:"h-full w-full object-cover select-none"})})]})}function Z({items:t,currentId:i,downloaded:s,onSelectedClick:r,onEquip:n}){return e("div",{className:"flex flex-col gap-[0.833cqw]",children:R(t).map((a)=>e(X,{item:a,isCurrent:a.vibemon_uuid===i,isDownloaded:s[a.vibemon_uuid],onSelectedClick:r,onEquip:()=>n(a.vibemon_uuid)},a.vibemon_uuid))})}function ve({onBack:t,onWish:i,onAlbum:s,albumHasUnseen:r,ownedCards:n,ownedLoaded:a,availablePoints:x,pointsLoaded:q}){let{i18n:N}=C("common"),u=N.getFixedT("en","common"),{pet:k}=O(),d=W((o)=>o.status==="checking"||o.status==="updating"),[f,S]=g({}),[F,b]=g(0),p=P(()=>b(0),[]);T(()=>{let o=!1;return(async()=>{let c=await Promise.all(n.map(async(v)=>[v.vibemon_uuid,await B(v.vibemon_uuid)]));if(o)return;let h=Object.fromEntries(c);if(S(h),!d)await K(n,h)})(),()=>{o=!0}},[n,d]);let j=async(o)=>{p();try{if(await m({pet:o}),await D({trusted:!0})==="unavailable")y.error(u("vibemon.actionFailed"))}catch(c){console.warn("[vibemon] equip failed",c),y.error(u("vibemon.actionFailed"))}},E=n.some((o)=>f[o.vibemon_uuid]);return l(J,{backdrop:l(V,{children:[e("img",{src:I,alt:"","aria-hidden":!0,className:"pointer-events-none absolute inset-0 h-full w-full object-cover opacity-10 select-none"}),e("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{background:"linear-gradient(180deg, rgba(0,0,0,0.3) 0%, rgba(102,102,102,0) 100%)"}})]}),children:[e(Y,{onBack:t,onWish:i,sectionAction:{kind:"album",onClick:s,hasUnseen:r},availablePoints:x,pointsLoaded:q}),!a?e("div",{"data-testid":"vibemon-owned-loading",className:"absolute inset-0 flex items-center justify-center text-[#DCC9FF]",children:e(w,{className:"size-8 animate-spin"})}):n.length===0?e(H,{onWish:i}):d&&!E?l("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-3 text-[#DCC9FF]",children:[e(w,{className:"size-8 animate-spin"}),e("div",{className:"text-sm",children:u("vibemon.syncPreparing")})]}):e("div",{className:"absolute top-[17.167%] left-[17.969%] h-[77.833%] w-[64.063%] [scrollbar-width:none] overflow-y-auto overscroll-y-contain [&::-webkit-scrollbar]:hidden",children:e(Z,{items:n,currentId:k,downloaded:f,onSelectedClick:()=>b((o)=>o+1),onEquip:(o)=>void j(o)})}),e(G,{requestId:F,onClose:p})]})}export{Z as EquipList,ve as EquipView};
@@ -1 +1 @@
1
- import{jsx as a,jsxs as m}from"react/jsx-runtime";import{gem as n,gemPlus as o}from"../assets.js";import{Loader2 as i}from"lucide-react";import{Button as d}from"../ui/button.js";import{Card as c}from"../ui/card.js";import{cn as p}from"../lib/utils.js";function N({amount:e,onAdd:s,loaded:t=!0,disabled:r=!1,className:l}){return m(c,{className:p("flex h-11 w-fit min-w-[137px] flex-row items-center gap-0 rounded-full border-0 bg-[#F4EFFF] px-1.5 py-0 ring-0",l),children:[a("img",{"data-slot":"gem-balance-icon",src:n,alt:"",className:"me-0.5 size-8 shrink-0"}),a("span",{"data-slot":"gem-balance-amount",className:"flex-1 text-start text-xl leading-none font-bold text-[#2A3472] tabular-nums",children:t?e:a(i,{className:"size-4 animate-spin text-[#2A3472]/50"})}),a(d,{"data-slot":"gem-balance-add",variant:"ghost",className:"ms-[14px] size-8 shrink-0 rounded-full p-0 hover:bg-transparent","aria-label":"Add gems",disabled:r,onClick:s,children:a("img",{"data-slot":"gem-balance-add-icon",src:o,alt:"",className:"size-8"})})]})}export{N as GemBalance};
1
+ import{jsx as a,jsxs as m}from"react/jsx-runtime";import{Loader2 as n}from"lucide-react";import{gem as o,gemPlus as i}from"../assets.js";import{cn as d}from"../lib/utils.js";import{Button as c}from"../ui/button.js";import{Card as p}from"../ui/card.js";function N({amount:e,onAdd:s,loaded:t=!0,disabled:r=!1,className:l}){return m(p,{className:d("flex h-11 w-fit min-w-[137px] flex-row items-center gap-0 rounded-full border-0 bg-[#F4EFFF] px-1.5 py-0 ring-0",l),children:[a("img",{"data-slot":"gem-balance-icon",src:o,alt:"",className:"me-0.5 size-8 shrink-0"}),a("span",{"data-slot":"gem-balance-amount",className:"flex-1 text-start text-xl leading-none font-bold text-[#2A3472] tabular-nums",children:t?e:a(n,{className:"size-4 animate-spin text-[#2A3472]/50"})}),a(c,{"data-slot":"gem-balance-add",variant:"ghost",className:"ms-[14px] size-8 shrink-0 rounded-full p-0 hover:bg-transparent","aria-label":"Add gems",disabled:r,onClick:s,children:a("img",{"data-slot":"gem-balance-add-icon",src:i,alt:"",className:"size-8"})})]})}export{N as GemBalance};
@@ -1 +1 @@
1
- import{jsx as l,jsxs as c}from"react/jsx-runtime";import{homeBackground as b,homeHotspotAssets as m}from"../assets.js";import{useLayoutEffect as p,useRef as g,useState as f}from"react";import{Button as x}from"../ui/button.js";import{HomeWishGuide as w,OnboardingScrim as v}from"./onboarding-guide.js";var d=1.778723404255319,y="#120E18",r={x1:0.3,x2:0.8,y1:0.56,y2:1},N=r.x2-r.x1,S=r.y2-r.y1,E=(r.x1+r.x2)/2,k=0.8;function M(t,n){let a=Math.max(t,n*d),s=Math.min(t/N,n/S*d),e=Math.max(Math.min(a,s),k*a),o=e/d,i=e<=t?(t-e)/2:Math.min(0,Math.max(t-e,t/2-E*e)),h=o<=n?(n-o)/2:n-o;return{width:e,height:o,left:i,top:h}}function C(t){let[n,a]=f({width:0,height:0,left:0,top:0});return p(()=>{let s=t.current;if(!s)return;let e=new ResizeObserver(([o])=>{let{width:i,height:h}=o.contentRect;a(M(i,h))});return e.observe(s),()=>e.disconnect()},[t]),n}var _={vibemon:{box:{left:"15.75%",top:"68.40%",width:"16.60%"},label:{left:"30.80%",top:"88.00%",width:"9.2%"}},wish:{box:{left:"50.40%",top:"58.40%",width:"14.50%"},label:{left:"54.00%",top:"84.50%",width:"6.8%"}},album:{box:{left:"75.80%",top:"64.65%",width:"20.20%"},label:{left:"74.60%",top:"73.20%",width:"7.2%"}}};function u({assetKey:t,onClick:n,highlighted:a,disabled:s}){let[e,o]=f(!1),i=_[t];return c("div",{className:`pointer-events-none absolute inset-0 ${a?"z-30":""}`,children:[c(x,{variant:"ghost",className:"pointer-events-auto absolute h-auto p-0 hover:bg-transparent dark:hover:bg-transparent",style:i.box,"aria-label":t==="vibemon"?"Vibémon":t==="wish"?"Wish":"Album",disabled:s,onClick:n,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),children:[l("img",{src:m[t].icon,alt:"",className:"block w-full select-none",style:{opacity:e?0:1}}),l("img",{src:m[t].hover,alt:"","aria-hidden":!0,className:"absolute inset-0 h-full w-full select-none",style:{opacity:e?1:0}})]}),l("img",{src:m[t].text,alt:"","aria-hidden":!0,className:"pointer-events-none absolute transition-opacity duration-200 select-none",style:{...i.label}})]})}function L({onDraw:t,onBackpack:n,onEquip:a,guideActive:s}){let e=g(null),o=C(e);return c("div",{ref:e,className:"relative h-full w-full overflow-hidden",children:[l("div",{className:"absolute inset-0",style:{background:y}}),c("div",{"data-testid":"vibemon-home-stage",className:"[container-type:size] absolute",style:{width:o.width,height:o.height,left:o.left,top:o.top},children:[l("img",{src:b,alt:"",className:"block h-full w-full select-none"}),c("div",{className:"pointer-events-none absolute inset-0",children:[l(u,{assetKey:"vibemon",onClick:a,highlighted:!1,disabled:s}),l(u,{assetKey:"wish",onClick:t,highlighted:s,disabled:!1}),l(u,{assetKey:"album",onClick:n,highlighted:!1,disabled:s})]}),s&&l(v,{}),s&&l(w,{})]})]})}export{L as HomeView};
1
+ import{jsx as l,jsxs as c}from"react/jsx-runtime";import{useLayoutEffect as b,useRef as p,useState as f}from"react";import{homeBackground as g,homeHotspotAssets as m}from"../assets.js";import{Button as x}from"../ui/button.js";import{HomeWishGuide as w,OnboardingScrim as v}from"./onboarding-guide.js";var d=1.778723404255319,y="#120E18",r={x1:0.3,x2:0.8,y1:0.56,y2:1},N=r.x2-r.x1,S=r.y2-r.y1,E=(r.x1+r.x2)/2,k=0.8;function M(t,n){let a=Math.max(t,n*d),s=Math.min(t/N,n/S*d),e=Math.max(Math.min(a,s),k*a),o=e/d,i=e<=t?(t-e)/2:Math.min(0,Math.max(t-e,t/2-E*e)),h=o<=n?(n-o)/2:n-o;return{width:e,height:o,left:i,top:h}}function C(t){let[n,a]=f({width:0,height:0,left:0,top:0});return b(()=>{let s=t.current;if(!s)return;let e=new ResizeObserver(([o])=>{let{width:i,height:h}=o.contentRect;a(M(i,h))});return e.observe(s),()=>e.disconnect()},[t]),n}var _={vibemon:{box:{left:"15.75%",top:"68.40%",width:"16.60%"},label:{left:"30.80%",top:"88.00%",width:"9.2%"}},wish:{box:{left:"50.40%",top:"58.40%",width:"14.50%"},label:{left:"54.00%",top:"84.50%",width:"6.8%"}},album:{box:{left:"75.80%",top:"64.65%",width:"20.20%"},label:{left:"74.60%",top:"73.20%",width:"7.2%"}}};function u({assetKey:t,onClick:n,highlighted:a,disabled:s}){let[e,o]=f(!1),i=_[t];return c("div",{className:`pointer-events-none absolute inset-0 ${a?"z-30":""}`,children:[c(x,{variant:"ghost",className:"pointer-events-auto absolute h-auto p-0 hover:bg-transparent dark:hover:bg-transparent",style:i.box,"aria-label":t==="vibemon"?"Vibémon":t==="wish"?"Wish":"Album",disabled:s,onClick:n,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),children:[l("img",{src:m[t].icon,alt:"",className:"block w-full select-none",style:{opacity:e?0:1}}),l("img",{src:m[t].hover,alt:"","aria-hidden":!0,className:"absolute inset-0 h-full w-full select-none",style:{opacity:e?1:0}})]}),l("img",{src:m[t].text,alt:"","aria-hidden":!0,className:"pointer-events-none absolute transition-opacity duration-200 select-none",style:{...i.label}})]})}function L({onDraw:t,onBackpack:n,onEquip:a,guideActive:s}){let e=p(null),o=C(e);return c("div",{ref:e,className:"relative h-full w-full overflow-hidden",children:[l("div",{className:"absolute inset-0",style:{background:y}}),c("div",{"data-testid":"vibemon-home-stage",className:"[container-type:size] absolute",style:{width:o.width,height:o.height,left:o.left,top:o.top},children:[l("img",{src:g,alt:"",className:"block h-full w-full select-none"}),c("div",{className:"pointer-events-none absolute inset-0",children:[l(u,{assetKey:"vibemon",onClick:a,highlighted:!1,disabled:s}),l(u,{assetKey:"wish",onClick:t,highlighted:s,disabled:!1}),l(u,{assetKey:"album",onClick:n,highlighted:!1,disabled:s})]}),s&&l(v,{}),s&&l(w,{})]})]})}export{L as HomeView};
@@ -1 +1 @@
1
- import{jsx as t,jsxs as a}from"react/jsx-runtime";import{dialogClose as i,insufficientPointsDialog as r,proceedButtonAssets as l}from"../assets.js";import{useState as c}from"react";import{Button as n}from"../ui/button.js";function d({onClose:s,onProceed:o}){return t("div",{className:"absolute inset-0 z-50 flex cursor-default items-center justify-center bg-black/80 p-0",onClick:(e)=>{if(e.target===e.currentTarget)s()},onKeyDown:(e)=>{if(e.key==="Escape")s()},children:a("div",{className:"relative",children:[t("img",{src:r,alt:"",className:"pointer-events-none max-w-none select-none",style:{width:326.24,height:201.03}}),t(n,{variant:"ghost",className:"absolute h-auto p-0 hover:bg-transparent",style:{top:-7.07,right:-11.3},onClick:s,children:t("img",{src:i,alt:"",className:"max-w-none select-none",style:{width:26,height:26}})}),t(u,{onClick:o})]})})}function u({onClick:s}){let[o,e]=c("default");return t(n,{variant:"ghost",className:"absolute h-auto -translate-x-1/2 p-0 hover:bg-transparent",style:{bottom:30,left:"50%"},title:"",onClick:s,onMouseEnter:()=>e("hover"),onMouseLeave:()=>e("default"),onMouseDown:()=>e("active"),onMouseUp:()=>e("hover"),children:t("img",{src:l[o],alt:"",className:"max-w-none select-none",style:{width:144,height:36}})})}export{d as InsufficientPointsDialog};
1
+ import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useState as i}from"react";import{dialogClose as r,insufficientPointsDialog as l,proceedButtonAssets as c}from"../assets.js";import{Button as n}from"../ui/button.js";function d({onClose:s,onProceed:o}){return t("div",{className:"absolute inset-0 z-50 flex cursor-default items-center justify-center bg-black/80 p-0",onClick:(e)=>{if(e.target===e.currentTarget)s()},onKeyDown:(e)=>{if(e.key==="Escape")s()},children:a("div",{className:"relative",children:[t("img",{src:l,alt:"",className:"pointer-events-none max-w-none select-none",style:{width:326.24,height:201.03}}),t(n,{variant:"ghost",className:"absolute h-auto p-0 hover:bg-transparent",style:{top:-7.07,right:-11.3},onClick:s,children:t("img",{src:r,alt:"",className:"max-w-none select-none",style:{width:26,height:26}})}),t(u,{onClick:o})]})})}function u({onClick:s}){let[o,e]=i("default");return t(n,{variant:"ghost",className:"absolute h-auto -translate-x-1/2 p-0 hover:bg-transparent",style:{bottom:30,left:"50%"},title:"",onClick:s,onMouseEnter:()=>e("hover"),onMouseLeave:()=>e("default"),onMouseDown:()=>e("active"),onMouseUp:()=>e("hover"),children:t("img",{src:c[o],alt:"",className:"max-w-none select-none",style:{width:144,height:36}})})}export{d as InsufficientPointsDialog};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as a}from"react/jsx-runtime";import{loadingBackground as w,loadingLogo as h}from"../assets.js";import{useEffect as x,useRef as f,useState as b}from"react";import{advanceLoadingProgress as v}from"../../core/lib/loading-progress.js";import{VibemonScene as _}from"./vibemon-scene.js";var q=98.902;function j({progress:s,onFinished:i}){let[o,g]=b(0),l=f(s);l.current=s;let c=f(i);c.current=i,x(()=>{let r=0,m=performance.now(),t=0,d=(u)=>{let p=Math.min((u-m)/1000,0.1);if(m=u,t=v(t,l.current,p),g(t),t>=1){c.current();return}r=requestAnimationFrame(d)};return r=requestAnimationFrame(d),()=>cancelAnimationFrame(r)},[]);let n=Math.round(o*100);return a(_,{backdrop:e("img",{src:w,alt:"","aria-hidden":!0,className:"pointer-events-none absolute inset-0 h-full w-full object-cover select-none"}),children:[e("img",{src:h,alt:"Vibémon",className:"pointer-events-none absolute top-[17.140%] left-[22.049%] h-[56.559%] w-[55.903%] max-w-none select-none"}),a("div",{"data-testid":"vibemon-loading-progress",role:"progressbar","aria-label":`Loading ${n}%`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":n,className:"absolute top-[83.050%] left-1/2 flex w-[52.083%] -translate-x-1/2 flex-col gap-[0.625cqw]",children:[e("p",{className:"text-right text-[1.458cqw] leading-normal tracking-[0.08em] text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:"LOADING..."}),a("div",{className:"flex flex-col items-center gap-[0.625cqw]",children:[e("div",{className:"relative h-[2.292cqw] w-full rounded-full bg-[#3B138F] shadow-[inset_0_0.052cqw_0.365cqw_0_rgba(0,0,0,0.25)]",children:e("div",{"data-testid":"vibemon-loading-progress-fill",className:"absolute top-[9.091%] left-[0.549%] h-[81.818%] min-w-[3.6%] rounded-full bg-[linear-gradient(180deg,#FFE16C_0%,#FFB638_100%)] shadow-[inset_0_0.208cqw_0.156cqw_0_rgba(255,255,255,0.87)]",style:{width:`${o*q}%`}})}),a("p",{className:"text-center text-[1.458cqw] leading-normal text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:[n,"%"]})]})]})]})}export{j as VibemonLoadingView};
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{useEffect as w,useRef as f,useState as h}from"react";import{advanceLoadingProgress as x}from"../../core/lib/loading-progress.js";import{loadingBackground as b,loadingLogo as v}from"../assets.js";import{VibemonScene as _}from"./vibemon-scene.js";var q=98.902;function j({progress:s,onFinished:i}){let[o,g]=h(0),l=f(s);l.current=s;let c=f(i);c.current=i,w(()=>{let r=0,m=performance.now(),t=0,d=(u)=>{let p=Math.min((u-m)/1000,0.1);if(m=u,t=x(t,l.current,p),g(t),t>=1){c.current();return}r=requestAnimationFrame(d)};return r=requestAnimationFrame(d),()=>cancelAnimationFrame(r)},[]);let n=Math.round(o*100);return a(_,{backdrop:e("img",{src:b,alt:"","aria-hidden":!0,className:"pointer-events-none absolute inset-0 h-full w-full object-cover select-none"}),children:[e("img",{src:v,alt:"Vibémon",className:"pointer-events-none absolute top-[17.140%] left-[22.049%] h-[56.559%] w-[55.903%] max-w-none select-none"}),a("div",{"data-testid":"vibemon-loading-progress",role:"progressbar","aria-label":`Loading ${n}%`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":n,className:"absolute top-[83.050%] left-1/2 flex w-[52.083%] -translate-x-1/2 flex-col gap-[0.625cqw]",children:[e("p",{className:"text-right text-[1.458cqw] leading-normal tracking-[0.08em] text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:"LOADING..."}),a("div",{className:"flex flex-col items-center gap-[0.625cqw]",children:[e("div",{className:"relative h-[2.292cqw] w-full rounded-full bg-[#3B138F] shadow-[inset_0_0.052cqw_0.365cqw_0_rgba(0,0,0,0.25)]",children:e("div",{"data-testid":"vibemon-loading-progress-fill",className:"absolute top-[9.091%] left-[0.549%] h-[81.818%] min-w-[3.6%] rounded-full bg-[linear-gradient(180deg,#FFE16C_0%,#FFB638_100%)] shadow-[inset_0_0.208cqw_0.156cqw_0_rgba(255,255,255,0.87)]",style:{width:`${o*q}%`}})}),a("p",{className:"text-center text-[1.458cqw] leading-normal text-white",style:{fontFamily:'"Grow Year", system-ui, sans-serif'},children:[n,"%"]})]})]})]})}export{j as VibemonLoadingView};
@@ -1,6 +1,4 @@
1
-
2
1
  @keyframes alwith-vibemon-burst {
3
-
4
2
  0% {
5
3
  background-position-x: 0;
6
4
  }
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{guideArrow as p,guideHand as w,guideHandShape as c,guideHandSheen as N,guideHomeTexture as y,guideMascot as x,guidePullTexture as v,guideRing as _}from"../assets.js";import{motion as g,useReducedMotion as b}from"motion/react";import{cn as L}from"../lib/utils.js";var k=2128.456,I=1920,d=(t)=>`${t/k*100}cqw`,a=(t)=>`${t/I*100}cqw`;function R(){return e("div",{"data-testid":"vibemon-onboarding-scrim","aria-hidden":!0,className:"absolute inset-0 z-20 bg-black/50",style:{boxShadow:"0 0 0 100vmax rgba(0,0,0,0.5)"}})}var S=8,B=32,u=160,H={width:687,height:94,textLeft:184.457,mascotLeft:20.273,mascotTop:-70.384,texture:y,length:d},z={width:712,height:94,textLeft:185.29,mascotLeft:20.96,mascotTop:-70.46,texture:v,length:a};function f({design:t,className:i,children:n}){let s=t.length;return o("div",{className:L("absolute -translate-x-1/2 -translate-y-1/2",i),style:{width:s(t.width),height:s(t.height)},children:[e("div",{className:"absolute inset-0 rounded-full border-white bg-[#8546DD] bg-[length:100%_100%] [background-origin:border-box]",style:{borderWidth:s(S),backgroundImage:`url("${t.texture}")`}}),e("p",{className:"absolute top-1/2 -translate-y-1/2 leading-normal whitespace-nowrap text-white",style:{left:s(t.textLeft),fontFamily:'"Lilita One", system-ui, sans-serif',fontSize:s(B)},children:n}),e("img",{src:x,alt:"",className:"absolute max-w-none select-none",style:{left:s(t.mascotLeft),top:s(t.mascotTop),width:s(u),height:s(u)}})]})}var m=42;function E(){let t=b(),i="absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",n={width:d(m),height:d(m)},s=e("span",{className:"absolute inset-0 rotate-180",children:e("span",{className:"absolute inset-[6.35%_-0.84%_-3.12%_-0.84%]",children:e("img",{src:p,alt:"",className:"block h-full w-full max-w-none select-none"})})});if(t)return e("div",{"data-node-id":"1566:3898","data-testid":"vibemon-home-guide-arrow",className:"absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",style:n,children:s});return e(g.div,{"data-node-id":"1566:3898","data-testid":"vibemon-home-guide-arrow",className:"absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",style:n,initial:{y:0},animate:{y:["0%","21.1%"]},transition:{y:{duration:0.401,times:[0,1],ease:"easeInOut",repeat:1/0}},children:s})}function G(){return o("div",{"data-testid":"vibemon-home-wish-guide",className:"pointer-events-none absolute inset-0 z-40",children:[e(f,{design:H,className:"top-[18.400%] left-[54.614%]",children:"Your first card is waiting inside!"}),e(E,{})]})}var h=109.551,l={left:20.179,top:18.317,width:69.1953,height:70.918},r={left:25.672,top:2.065,size:43.219};function O(){let t=b(),i={left:a(r.left),top:a(r.top),width:a(r.size),height:a(r.size)},n=e("span",{className:"absolute inset-[-578.45%]",children:e("img",{src:_,alt:"",className:"block h-full w-full max-w-none select-none"})});return o("div",{className:"relative",style:{width:a(h),height:a(h)},children:[t?e("span",{"data-node-id":"1550:4234","data-testid":"vibemon-pool-guide-ring",className:"absolute",style:i,children:n}):e(g.span,{"data-node-id":"1550:4234","data-testid":"vibemon-pool-guide-ring",className:"absolute",style:i,initial:{scaleX:1.6,scaleY:1.6},animate:{scaleX:[1.6,1.014,1],scaleY:[1.6,1.014,1]},transition:{scaleX:{duration:0.61,times:[0,0.82,1],ease:"linear",repeat:1/0},scaleY:{duration:0.61,times:[0,0.82,1],ease:"linear",repeat:1/0}},children:n}),o("span",{"data-node-id":"1550:4236",className:"absolute",style:{left:a(l.left),top:a(l.top),width:a(l.width),height:a(l.height)},children:[e("img",{src:w,alt:"",className:"absolute inset-0 block h-full w-full max-w-none select-none"}),e("span",{className:"absolute inset-0",style:{backgroundImage:`url("${N}")`,backgroundSize:"100% 100%",WebkitMaskImage:`url("${c}")`,WebkitMaskSize:"100% 100%",maskImage:`url("${c}")`,maskSize:"100% 100%"}})]})]})}function U(){let t=(i)=>({width:a(i),height:a(i)});return o("div",{"data-testid":"vibemon-free-draw-guide",className:"pointer-events-none absolute inset-0 z-40",children:[e(f,{design:z,className:"top-[79.004%] left-[57.240%] z-2",children:"Draw a card, find your companion!"}),e("span",{className:"absolute top-[82.184%] left-[68.358%] z-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white",style:t(34.461)}),e("span",{className:"absolute top-[85.459%] left-[67.288%] z-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white",style:t(15.354)}),e("div",{className:"absolute top-[95.437%] left-[64.490%] -translate-x-1/2 -translate-y-1/2",children:e(O,{})})]})}export{U as FreeDrawGuide,G as HomeWishGuide,R as OnboardingScrim};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{motion as g,useReducedMotion as b}from"motion/react";import{guideArrow as p,guideHand as w,guideHandShape as c,guideHandSheen as N,guideHomeTexture as y,guideMascot as x,guidePullTexture as v,guideRing as _}from"../assets.js";import{cn as L}from"../lib/utils.js";var k=2128.456,I=1920,d=(t)=>`${t/k*100}cqw`,a=(t)=>`${t/I*100}cqw`;function R(){return e("div",{"data-testid":"vibemon-onboarding-scrim","aria-hidden":!0,className:"absolute inset-0 z-20 bg-black/50",style:{boxShadow:"0 0 0 100vmax rgba(0,0,0,0.5)"}})}var S=8,B=32,u=160,H={width:687,height:94,textLeft:184.457,mascotLeft:20.273,mascotTop:-70.384,texture:y,length:d},z={width:712,height:94,textLeft:185.29,mascotLeft:20.96,mascotTop:-70.46,texture:v,length:a};function f({design:t,className:i,children:n}){let s=t.length;return o("div",{className:L("absolute -translate-x-1/2 -translate-y-1/2",i),style:{width:s(t.width),height:s(t.height)},children:[e("div",{className:"absolute inset-0 rounded-full border-white bg-[#8546DD] bg-[length:100%_100%] [background-origin:border-box]",style:{borderWidth:s(S),backgroundImage:`url("${t.texture}")`}}),e("p",{className:"absolute top-1/2 -translate-y-1/2 leading-normal whitespace-nowrap text-white",style:{left:s(t.textLeft),fontFamily:'"Lilita One", system-ui, sans-serif',fontSize:s(B)},children:n}),e("img",{src:x,alt:"",className:"absolute max-w-none select-none",style:{left:s(t.mascotLeft),top:s(t.mascotTop),width:s(u),height:s(u)}})]})}var m=42;function E(){let t=b(),i="absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",n={width:d(m),height:d(m)},s=e("span",{className:"absolute inset-0 rotate-180",children:e("span",{className:"absolute inset-[6.35%_-0.84%_-3.12%_-0.84%]",children:e("img",{src:p,alt:"",className:"block h-full w-full max-w-none select-none"})})});if(t)return e("div",{"data-node-id":"1566:3898","data-testid":"vibemon-home-guide-arrow",className:"absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",style:n,children:s});return e(g.div,{"data-node-id":"1566:3898","data-testid":"vibemon-home-guide-arrow",className:"absolute top-[56.381%] left-[57.735%] -translate-x-1/2 -translate-y-1/2",style:n,initial:{y:0},animate:{y:["0%","21.1%"]},transition:{y:{duration:0.401,times:[0,1],ease:"easeInOut",repeat:1/0}},children:s})}function G(){return o("div",{"data-testid":"vibemon-home-wish-guide",className:"pointer-events-none absolute inset-0 z-40",children:[e(f,{design:H,className:"top-[18.400%] left-[54.614%]",children:"Your first card is waiting inside!"}),e(E,{})]})}var h=109.551,l={left:20.179,top:18.317,width:69.1953,height:70.918},r={left:25.672,top:2.065,size:43.219};function O(){let t=b(),i={left:a(r.left),top:a(r.top),width:a(r.size),height:a(r.size)},n=e("span",{className:"absolute inset-[-578.45%]",children:e("img",{src:_,alt:"",className:"block h-full w-full max-w-none select-none"})});return o("div",{className:"relative",style:{width:a(h),height:a(h)},children:[t?e("span",{"data-node-id":"1550:4234","data-testid":"vibemon-pool-guide-ring",className:"absolute",style:i,children:n}):e(g.span,{"data-node-id":"1550:4234","data-testid":"vibemon-pool-guide-ring",className:"absolute",style:i,initial:{scaleX:1.6,scaleY:1.6},animate:{scaleX:[1.6,1.014,1],scaleY:[1.6,1.014,1]},transition:{scaleX:{duration:0.61,times:[0,0.82,1],ease:"linear",repeat:1/0},scaleY:{duration:0.61,times:[0,0.82,1],ease:"linear",repeat:1/0}},children:n}),o("span",{"data-node-id":"1550:4236",className:"absolute",style:{left:a(l.left),top:a(l.top),width:a(l.width),height:a(l.height)},children:[e("img",{src:w,alt:"",className:"absolute inset-0 block h-full w-full max-w-none select-none"}),e("span",{className:"absolute inset-0",style:{backgroundImage:`url("${N}")`,backgroundSize:"100% 100%",WebkitMaskImage:`url("${c}")`,WebkitMaskSize:"100% 100%",maskImage:`url("${c}")`,maskSize:"100% 100%"}})]})]})}function U(){let t=(i)=>({width:a(i),height:a(i)});return o("div",{"data-testid":"vibemon-free-draw-guide",className:"pointer-events-none absolute inset-0 z-40",children:[e(f,{design:z,className:"top-[79.004%] left-[57.240%] z-2",children:"Draw a card, find your companion!"}),e("span",{className:"absolute top-[82.184%] left-[68.358%] z-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white",style:t(34.461)}),e("span",{className:"absolute top-[85.459%] left-[67.288%] z-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-white",style:t(15.354)}),e("div",{className:"absolute top-[95.437%] left-[64.490%] -translate-x-1/2 -translate-y-1/2",children:e(O,{})})]})}export{U as FreeDrawGuide,G as HomeWishGuide,R as OnboardingScrim};
@@ -1 +1 @@
1
- import{jsx as P}from"react/jsx-runtime";import{useEffect as k,useState as S}from"react";import{vibemonHost as q}from"../../core/host.js";import{backdropSvgPath as R,bubbleOutline as C,scaleBackdropPath as L}from"../../core/lib/bubble-outline.js";var F=Promise.resolve();function d(a){let c=F,t;F=new Promise((r)=>{t=r}),(async()=>{await c;try{await a()}finally{t()}})()}function J({cardRef:a,opacity:c=0.65,radius:t=20,enabled:r=!0}){let e=q(),[x,O]=S([]);return k(()=>()=>{d(async()=>{await e.windows.call("bubble-blur",{enabled:!1,radius:1,path:null}).catch(e.onError)})},[]),k(()=>{let n=a.current;if(n===null)throw Error("Pet bubble background requires its card");let N={scaleFactor:()=>e.windows.call("scale")},u=!1,i=null,b=null,m=async()=>{if(u)return;let l=await N.scaleFactor();if(u)return;let o=n.getBoundingClientRect();if(o.width<=1||o.height<=1)return;let B=getComputedStyle(n),f=Number.parseFloat(B.borderTopLeftRadius);if(!Number.isFinite(f))throw Error("Pet bubble corner radius must resolve to pixels");let h=n.parentElement;if(h===null)throw Error("Pet bubble card requires its container");let v=Number.parseFloat(getComputedStyle(h).paddingBottom);if(!Number.isFinite(v))throw Error("Pet bubble tail spacing must resolve to pixels");let g=C(o.left+0.5,o.top+0.5,o.width-1,o.height-1,f-0.5,v);O(g);let y=r?L(g,window.devicePixelRatio/l):null,E=JSON.stringify([r,t,y]);if(E===b)return;await e.windows.call("bubble-blur",{enabled:r,radius:t,path:y}),b=E},s=()=>{if(u||i!==null)return;i=requestAnimationFrame(()=>{i=null,d(()=>m().catch(e.onError))})};d(()=>m().catch(e.onError));let w=new ResizeObserver(s);w.observe(n);let p=new MutationObserver(s);for(let l of[document.documentElement,document.body,n])p.observe(l,{attributes:!0,attributeFilter:["class","style"]});window.addEventListener("resize",s);let z=e.windows.geometry(s);return()=>{if(u=!0,i!==null)cancelAnimationFrame(i);w.disconnect(),p.disconnect(),window.removeEventListener("resize",s),z.then((l)=>l()).catch(e.onError)}},[a,r,t,e]),P("svg",{"aria-hidden":!0,"data-pet-bubble-background":!0,className:"pointer-events-none fixed inset-0 size-full overflow-visible",children:P("path",{d:R(x),fill:"var(--popover)",fillOpacity:c,stroke:"var(--border)",strokeOpacity:c,strokeWidth:1})})}export{J as PetBubbleBackground};
1
+ import{jsx as P}from"react/jsx-runtime";import{useEffect as k,useEffectEvent as q,useState as R}from"react";import{vibemonHost as C}from"../../core/host.js";import{backdropSvgPath as L,bubbleOutline as j,scaleBackdropPath as A}from"../../core/lib/bubble-outline.js";var F=Promise.resolve();function d(a){let c=F,t;F=new Promise((r)=>{t=r}),(async()=>{await c;try{await a()}finally{t()}})()}function T({cardRef:a,opacity:c=0.65,radius:t=20,enabled:r=!0}){let e=C(),[x,O]=R([]),B=q(()=>{d(async()=>{await e.windows.call("bubble-blur",{enabled:!1,radius:1,path:null}).catch(e.onError)})});return k(()=>()=>B(),[]),k(()=>{let n=a.current;if(n===null)throw Error("Pet bubble background requires its card");let N={scaleFactor:()=>e.windows.call("scale")},u=!1,i=null,b=null,m=async()=>{if(u)return;let l=await N.scaleFactor();if(u)return;let o=n.getBoundingClientRect();if(o.width<=1||o.height<=1)return;let S=getComputedStyle(n),p=Number.parseFloat(S.borderTopLeftRadius);if(!Number.isFinite(p))throw Error("Pet bubble corner radius must resolve to pixels");let h=n.parentElement;if(h===null)throw Error("Pet bubble card requires its container");let v=Number.parseFloat(getComputedStyle(h).paddingBottom);if(!Number.isFinite(v))throw Error("Pet bubble tail spacing must resolve to pixels");let g=j(o.left+0.5,o.top+0.5,o.width-1,o.height-1,p-0.5,v);O(g);let y=r?A(g,window.devicePixelRatio/l):null,E=JSON.stringify([r,t,y]);if(E===b)return;await e.windows.call("bubble-blur",{enabled:r,radius:t,path:y}),b=E},s=()=>{if(u||i!==null)return;i=requestAnimationFrame(()=>{i=null,d(()=>m().catch(e.onError))})};d(()=>m().catch(e.onError));let w=new ResizeObserver(s);w.observe(n);let f=new MutationObserver(s);for(let l of[document.documentElement,document.body,n])f.observe(l,{attributes:!0,attributeFilter:["class","style"]});window.addEventListener("resize",s);let z=e.windows.geometry(s);return()=>{if(u=!0,i!==null)cancelAnimationFrame(i);w.disconnect(),f.disconnect(),window.removeEventListener("resize",s),z.then((l)=>l()).catch(e.onError)}},[a,r,t,e]),P("svg",{"aria-hidden":!0,"data-pet-bubble-background":!0,className:"pointer-events-none fixed inset-0 size-full overflow-visible",children:P("path",{d:L(x),fill:"var(--popover)",fillOpacity:c,stroke:"var(--border)",strokeOpacity:c,strokeWidth:1})})}export{T as PetBubbleBackground};
@@ -1 +1 @@
1
- import{jsx as E,jsxs as A}from"react/jsx-runtime";import{useEffect as I,useRef as m,useState as l}from"react";import{vibemonHost as C}from"../../core/host.js";import{useVibemonState as N}from"../lib/account-state.js";import{loadVibemonResource as U}from"../../core/lib/vibemon-resources.js";import{PetAnimationSync as X}from"../../core/lib/pet-animation-sync.js";import{PetBubbleState as O}from"../../core/lib/pet-bubble-state.js";import{PresentationReadiness as W}from"../../core/lib/presentation-readiness.js";import{presentVibemon as B}from"../../core/lib/pet-presentation.js";import{dragPet as F}from"../../core/lib/pet-drag.js";import{DEFAULT_VIBEMON_WINDOW_SIZE as P}from"../../core/types.js";import{VibemonEngine as Y}from"../../core/engine.js";import{SpriteRenderer as H}from"./sprite-renderer.js";import"./lounge-burst.css";function ce(){let t=C(),u=N(),[a,x]=l(null),f=a?.resource??null,[g,S]=l({state:"idle",flipped:!1,tick:0}),[D,R]=l(!0),[k,v]=l(!1),[z,V]=l(0),s=m(null),h=m(0),[r]=l(()=>new W),[c]=l(()=>new X),[i]=l(()=>new O((e)=>{t.windows.call("bubble",{visible:e}).catch(t.onError)}));I(()=>{if(!u.pet)return;let e=u.pet,n=++h.current;r.begin(e,n),x(null);let d=!1,p=null;return(async()=>{if(p=await U(e),d){p.dispose();return}if(await t.windows.call("resize",{size:p.config.windowSize??P}),d)return;let o=new Y(p.config,(_,j,M)=>{if(d)return;S((T)=>({state:_,flipped:j,tick:T.tick+(M?1:0)}))},()=>{});if(s.current=o,c.attach(o),await o.start(u.position),d){o.destroy();return}if(r.positioned(e,n,o),x({resource:p,petId:e,generation:n}),await r.wait(e,Date.now()+15000),!d)await t.windows.call("ready",{petId:e})})().catch((o)=>{if(d||h.current!==n)return;r.fail(e,n,o instanceof Error?o:Error(String(o))),t.onError(o)}),()=>{d=!0,r.invalidate(),c.attach(null),s.current?.destroy(),s.current=null,p?.dispose()}},[u.pet,t,r,c,z]),I(()=>{let e=(n)=>{if(n===null){c.bind(null,!1),i.bind(null,-1);return}c.bind(n.binding.sessionId,n.error!==null,n.binding.bindingRevision),c.update([{sessionId:n.binding.sessionId,state:n.state}],n.source),c.prompt(n.binding.sessionId,n.binding.bindingRevision,n.prompt!==null),i.bind(n.binding.sessionId,n.binding.bindingRevision),i.owner(n.owner),i.update(n.state,n.prompt?.token??null,n.surfaceVisible)};return e(t.sessions.snapshot()),t.sessions.subscribe(e)},[t,c,i]),I(()=>t.windows.commands(async(e)=>{if(e.type==="reload"){if(e.petId!==u.pet)throw Error("The selected pet changed");h.current++,r.reset(),V((n)=>n+1);return}if(e.type==="bubble-open"){i.open();return}if(e.type==="bubble-interact"){i.interact();return}if(e.type==="close"){s.current?.destroy(),i.close(),v(!0),await t.windows.call("sound"),await new Promise((n)=>setTimeout(n,470)),await t.windows.call("hide");return}if(e.type==="bubble-close"){i.close();return}if(e.type==="suspend"){s.current?.suspend(),R(!1),i.close(),await t.windows.call("hide");return}R(!0),await B(r,t.windows,e.petId)}),[t,i,r,u.pet]);let w=m(0),b=m(null);if(f===null)return null;let y=f.config.windowSize??P;return A("div",{className:"relative flex h-full w-full items-end justify-center select-none",onPointerDown:(e)=>{if(e.button!==0)return;b.current={x:e.screenX,y:e.screenY}},onPointerMove:(e)=>{let n=b.current;if(n===null||Math.hypot(e.screenX-n.x,e.screenY-n.y)<4)return;if(b.current=null,s.current===null)throw Error("The pet engine is unavailable");F(t.windows,s.current,e.screenX<n.x).catch(t.onError)},onPointerUp:()=>{b.current=null},onContextMenu:(e)=>{e.preventDefault(),t.windows.call("menu").catch(t.onError)},children:[E("div",{style:{width:y,height:y,visibility:k?"hidden":"visible"},children:E(H,{config:f.config,spriteUrl:f.spriteUrl,stateId:g.state,flipped:g.flipped,animTick:g.tick,active:D,onDrawFrame:()=>{if(a!==null)r.drawn(a.petId,a.generation)},onRenderError:(e)=>{if(a!==null)r.fail(a.petId,a.generation,e);t.onError(e)},onMouseDown:()=>{},onClick:()=>{s.current?.handleClick();let e=Date.now();if(e-w.current<350&&e-w.current>50)i.close(),t.sessions.activate().catch(t.onError),w.current=0;else w.current=e}})}),k&&E("div",{className:"alwith-vibemon-burst pointer-events-none",style:{position:"fixed",left:"50%",bottom:0,width:280,height:280,transform:`translateX(-50%) scale(${y/280})`,transformOrigin:"center bottom",zIndex:20}})]})}export{ce as PetWindow};
1
+ import{jsx as E,jsxs as A}from"react/jsx-runtime";import{useEffect as x,useEffectEvent as N,useRef as m,useState as l}from"react";import{VibemonEngine as U}from"../../core/engine.js";import{vibemonHost as X}from"../../core/host.js";import{PetAnimationSync as O}from"../../core/lib/pet-animation-sync.js";import{PetBubbleState as W}from"../../core/lib/pet-bubble-state.js";import{dragPet as B}from"../../core/lib/pet-drag.js";import{presentVibemon as F}from"../../core/lib/pet-presentation.js";import{PresentationReadiness as Y}from"../../core/lib/presentation-readiness.js";import{loadVibemonResource as H}from"../../core/lib/vibemon-resources.js";import{DEFAULT_VIBEMON_WINDOW_SIZE as S}from"../../core/types.js";import{placeholderCard as L}from"../assets.js";import{useVibemonState as Z}from"../lib/account-state.js";import{SpriteRenderer as q}from"./sprite-renderer.js";import"./lounge-burst.css";function ue(){let t=X(),u=Z(),[a,P]=l(null),f=a?.resource??null,[g,v]=l({state:"idle",flipped:!1,tick:0}),[D,h]=l(!0),[R,k]=l(!1),[z,V]=l(0),s=m(null),y=m(0),[r]=l(()=>new Y),[c]=l(()=>new O),[i]=l(()=>new W((e)=>{t.windows.call("bubble",{visible:e}).catch(t.onError)})),_=N(()=>u.position);x(()=>{if(!u.pet)return;let e=u.pet,n=++y.current;r.begin(e,n),P(null);let d=!1,p=null;return(async()=>{if(p=await H(e),d){p.dispose();return}if(await t.windows.call("resize",{size:p.config.windowSize??S}),d)return;let o=new U(p.config,(j,C,M)=>{if(d)return;v((T)=>({state:j,flipped:C,tick:T.tick+(M?1:0)}))},()=>{});if(s.current=o,c.attach(o),await o.start(_()),d){o.destroy();return}if(r.positioned(e,n,o),P({resource:p,petId:e,generation:n}),await r.wait(e,Date.now()+15000),!d)await t.windows.call("ready",{petId:e})})().catch((o)=>{if(d||y.current!==n)return;r.fail(e,n,o instanceof Error?o:Error(String(o))),t.onError(o)}),()=>{d=!0,r.invalidate(),c.attach(null),s.current?.destroy(),s.current=null,p?.dispose()}},[u.pet,t,r,c,z]),x(()=>{let e=(n)=>{if(n===null){c.bind(null,!1),i.bind(null,-1);return}c.bind(n.binding.sessionId,n.error!==null,n.binding.bindingRevision),c.update([{sessionId:n.binding.sessionId,state:n.state}],n.source),c.prompt(n.binding.sessionId,n.binding.bindingRevision,n.prompt!==null),i.bind(n.binding.sessionId,n.binding.bindingRevision),i.owner(n.owner),i.update(n.state,n.prompt?.token??null,n.surfaceVisible)};return e(t.sessions.snapshot()),t.sessions.subscribe(e)},[t,c,i]),x(()=>t.windows.commands(async(e)=>{if(e.type==="reload"){if(e.petId!==u.pet)throw Error("The selected pet changed");y.current++,r.reset(),V((n)=>n+1);return}if(e.type==="bubble-open"){i.open();return}if(e.type==="bubble-interact"){i.interact();return}if(e.type==="close"){s.current?.suspend(),h(!1),i.close(),k(!0);try{await t.windows.call("sound"),await new Promise((n)=>setTimeout(n,470)),await t.windows.call("hide")}finally{k(!1)}return}if(e.type==="bubble-close"){i.close();return}if(e.type==="suspend"){s.current?.suspend(),h(!1),i.close(),await t.windows.call("hide");return}h(!0),await F(r,t.windows,e.petId)}),[t,i,r,u.pet]);let w=m(0),b=m(null);if(f===null)return null;let I=f.config.windowSize??S;return A("div",{className:"relative flex h-full w-full items-end justify-center select-none",onPointerDown:(e)=>{if(e.button!==0)return;b.current={x:e.screenX,y:e.screenY}},onPointerMove:(e)=>{let n=b.current;if(n===null||Math.hypot(e.screenX-n.x,e.screenY-n.y)<4)return;if(b.current=null,s.current===null)throw Error("The pet engine is unavailable");B(t.windows,s.current,e.screenX<n.x).catch(t.onError)},onPointerUp:()=>{b.current=null},onContextMenu:(e)=>{e.preventDefault(),t.windows.call("menu").catch(t.onError)},children:[E("div",{style:{width:I,height:I,visibility:R?"hidden":"visible"},children:E(q,{config:f.config,spriteUrl:f.spriteUrl||L,staticImage:f.staticImage,stateId:g.state,flipped:g.flipped,animTick:g.tick,active:D&&!f.staticImage,onDrawFrame:()=>{if(a!==null)r.drawn(a.petId,a.generation)},onRenderError:(e)=>{if(a!==null)r.fail(a.petId,a.generation,e);t.onError(e)},onMouseDown:()=>{},onClick:()=>{s.current?.handleClick();let e=Date.now();if(e-w.current<350&&e-w.current>50)i.close(),t.sessions.activate().catch(t.onError),w.current=0;else w.current=e}})}),R&&E("div",{className:"alwith-vibemon-burst pointer-events-none",style:{position:"fixed",left:"50%",bottom:0,width:280,height:280,transform:`translateX(-50%) scale(${I/280})`,transformOrigin:"center bottom",zIndex:20}})]})}export{ue as PetWindow};
@@ -1 +1 @@
1
- import{jsx as n,jsxs as d,Fragment as M}from"react/jsx-runtime";import{multiDrawSrBackground as H,multiDrawSsrBackground as J,newTag as F,pullTexture as A,resultAura as Q}from"../assets.js";import{motion as y,useInView as X}from"motion/react";import{useEffect as E,useRef as L,useState as p}from"react";import{Button as O}from"../ui/button.js";import{cardThumb as D}from"../lib/card-image.js";import{cn as Z}from"../lib/utils.js";import{PULL_VIDEO_SOURCES as ee}from"./pull-video.js";import{VideoFader as te}from"./video-fader.js";var u=300,l=500,N=400,ne=1920,U=10,P=1474,G=[0.6,0.7,0.8,0.9,1,1,0.9,0.8,0.7,0.6],ae=1.1269,C=[12,14,16,18,20,18,16,14,12].map((e)=>e*ae),k=(P-C.reduce((e,t)=>e+t,0))/G.reduce((e,t)=>e+t,0),ie=(()=>{let e=0;return G.map((t,i)=>{let s=k*t,a=e+s/2-P/2;if(e+=s,i<C.length)e+=C[i];return{scale:t,x:a}})})(),I={R:null,SR:H,SSR:J},S=(e)=>`${e/ne*100}cqw`,B={R:"r",SR:"sr",SSR:"ssr"},z={"white-card":{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(1,24,30,0.90) 58.198%, rgba(86,209,251,0.90) 153.35%)",button:"#82D6EB",textureOpacity:"opacity-68"},r:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(1,24,30,0.90) 58.198%, rgba(86,209,251,0.90) 153.35%)",button:"#82D6EB",textureOpacity:"opacity-68"},sr:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(22,1,30,0.90) 59.16%, rgba(192,106,255,0.90) 153.35%)",button:"#C16AFF",textureOpacity:"opacity-68"},ssr:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(33,15,0,0.90) 65.36%, rgba(255,172,47,0.90) 153.35%)",button:"#FFAF32",textureOpacity:"opacity-100"}},re={r:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(0, 17, 35, 0.90) 65.37%, rgba(21, 166, 226, 0.90) 153.35%)",sr:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(24, 7, 45, 0.90) 65.37%, rgba(156, 63, 224, 0.90) 153.35%)",ssr:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(33, 15, 0, 0.90) 65.37%, rgba(255, 172, 47, 0.90) 153.35%)"},W=(e)=>{if(e.some((t)=>t.kind==="card"&&t.rarity==="SSR"))return"ssr";if(e.some((t)=>t.kind==="card"&&t.rarity==="SR"))return"sr";return"r"};function xe({phase:e,drawnRewards:t,onVideoStarted:i,onPullDone:s,onPullFailed:a,onResultConfirmed:o}){let r=L(null),g=X(r),[w,_]=p(document.visibilityState==="visible");E(()=>{let f=()=>_(document.visibilityState==="visible");return document.addEventListener("visibilitychange",f),()=>document.removeEventListener("visibilitychange",f)},[]);let[h,q]=p(!1),[x,v]=p("flat"),b=L(!1);E(()=>{if(e!=="idle")return;b.current=!1,q(!1),v("flat")},[e]);let m=t.length>1,c=m?null:t[0],T=m?W(t):null,V=m&&t.some((f)=>f.kind==="card"),R=c?c.kind==="white-card"?"white-card":B[c.rarity]:null,K=()=>{if(!m||x!=="flat"||b.current)return;if(b.current=!0,!V){v("fly"),setTimeout(()=>o(!1),u);return}v("gather"),setTimeout(()=>v("fly"),N),setTimeout(()=>o(!0),N+l)},j=()=>{if(!c||h||b.current)return;b.current=!0,q(!0);let f=c.kind==="card"?l:u;setTimeout(()=>o(c.kind==="card"),f)},Y=m?x!=="fly":!h;return d("div",{ref:r,"data-presentation-state":e,className:"[container-type:size] absolute inset-0 z-50 overflow-hidden bg-transparent transition-colors duration-300",style:{pointerEvents:e==="idle"?"none":"auto"},children:[n("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 transition-opacity duration-300",style:{background:e!=="result"?"rgba(1,10,21,1)":T?re[T]:R?z[R].scrim:"rgba(1,10,21,0.82)",opacity:e==="result"&&Y?1:0}}),e==="result"&&(m?n(me,{rewards:t,stage:x,onConfirm:K}):c?n(ue,{reward:c,onConfirm:j,closing:h}):null),n(te,{sources:ee,playing:e==="video-waiting"||e==="video-playing",active:g&&w,background:"rgba(1,10,21,1)",onFirstFrame:i,onComplete:s,onError:a})]})}var se={default:"#FFAF32",hover:"#FFC15F",press:"#ECA029"};function oe({onConfirm:e}){let[t,i]=p(!1),[s,a]=p(!1),o=s?"press":t?"hover":"default";return d(O,{"aria-label":"Confirm",onClick:e,"data-visual-state":o,onPointerEnter:()=>i(!0),onPointerLeave:()=>{i(!1),a(!1)},onPointerDown:()=>a(!0),onPointerUp:()=>a(!1),onPointerCancel:()=>a(!1),onKeyDown:(r)=>{if(r.key===" "||r.key==="Enter")a(!0)},onKeyUp:(r)=>{if(r.key===" "||r.key==="Enter")a(!1)},onBlur:()=>{i(!1),a(!1)},style:{backgroundColor:se[o]},className:"relative h-full w-full overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)] transition-none active:translate-y-0",children:[n("img",{src:A,alt:"",className:"pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none mix-blend-soft-light select-none"}),n("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),n("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:"Confirm"})]})}function le({tone:e,onConfirm:t}){let i=z[e];return d(O,{"aria-label":"Confirm",onClick:t,style:{backgroundColor:i.button},className:"relative h-full w-full overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)] transition-none hover:brightness-105 active:translate-y-0",children:[n("img",{src:A,alt:"",className:Z("pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none mix-blend-soft-light select-none",i.textureOpacity)}),n("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),n("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:"Confirm"})]})}function ce({reward:e}){return n("img",{src:e.singleImageUrl,alt:`Gacha Gem ×${e.exchangePoints}`,className:"block h-auto w-full max-w-none select-none"})}function ue({reward:e,onConfirm:t,closing:i}){let s=e.kind==="white-card"?"white-card":B[e.rarity];return n("div",{"data-testid":"single-draw-result","data-result-tone":s,className:"absolute inset-0 z-10",children:d("div",{className:"[container-type:size] absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[n(y.div,{"aria-hidden":!0,className:"pointer-events-none absolute top-[43.810%] left-[52.655%] aspect-square w-[31.656%] -translate-x-1/2 -translate-y-1/2",animate:{opacity:i?0:0.62},transition:{duration:u/1000},children:n("img",{src:Q,alt:"",className:"h-full w-full max-w-none [animation:spin_2s_linear_infinite] select-none"})}),n("div",{className:`absolute -translate-x-1/2 ${e.kind==="card"?"top-[20.396%] left-[52.551%]":"top-[43.810%] left-[52.656%] -translate-y-1/2"}`,children:n(y.div,{className:"relative",style:{width:e.kind==="card"?"20.833cqw":"13.75cqw"},initial:!1,animate:i?e.kind==="card"?{x:["0cqw","14cqw","29cqw"],y:["0cqh","-34cqh","-37cqh"],scale:[1,0.14],opacity:[1,1,0]}:{x:0,y:0,scale:0.94,opacity:0}:{x:0,y:0,scale:1,opacity:1},transition:i&&e.kind==="card"?{x:{duration:l/1000,ease:"linear",times:[0,0.5,1]},y:{duration:l/1000,ease:"linear",times:[0,0.5,1]},scale:{duration:l/1000,ease:"linear"},opacity:{duration:l/1000,ease:"linear",times:[0,0.7,1]}}:{duration:i?u/1000:0},children:e.kind==="card"?d(M,{children:[n("img",{src:D(e.singleImageUrl),alt:`${e.vibemonName} ${e.rarity} card`,className:"h-auto w-full max-w-none select-none"}),e.isNew&&n("img",{src:F,alt:"New",className:"pointer-events-none absolute top-[0.202%] right-[2.504%] z-10 h-auto w-[22.5%] max-w-none select-none"})]}):n(ce,{reward:e})})}),n(y.div,{className:"absolute top-[71.667%] left-[52.656%] h-[6.5%] w-[18.542%] -translate-x-1/2",animate:{opacity:i?0:1},transition:{duration:u/1000},style:{pointerEvents:i?"none":"auto"},children:n(le,{tone:s,onConfirm:t})})]})})}function de({reward:e}){return n("img",{src:e.multiImageUrl,alt:`Gacha Gem ×${e.exchangePoints}`,className:"pointer-events-none block h-auto w-full max-w-none select-none"})}function me({rewards:e,stage:t,onConfirm:i}){if(e.length!==U)throw Error(`[vibemon] ten-draw result must contain ${U} rewards, received ${e.length}`);let s=W(e);return n("div",{"data-testid":"multi-draw-result","data-result-tone":s,className:"absolute inset-0 z-10 overflow-hidden",children:d("div",{"data-testid":"multi-result-stage",className:"[container-type:size] absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[n("div",{"data-testid":"multi-result-group",className:"absolute top-[17.833%] left-[11.615%] h-[55%] w-[76.77%]",children:e.map((a,o)=>{let r=ie[o],g={x:S(r.x),y:"0cqh",scale:r.scale,opacity:1},w=a.kind==="card"?`${a.drawIndex}-${a.vibemonUuid}`:`${a.drawIndex}-white-card`,_=a.kind==="card"?{x:"0cqw",y:"0cqh",scale:1,opacity:1}:{...g,opacity:0},h=a.kind==="card"?{x:["0cqw","17cqw","34cqw"],y:["0cqh","-40cqh","-38cqh"],scale:[1,0.08],opacity:[1,1,0]}:{...g,opacity:0};return n("div",{className:"absolute inset-y-0 left-1/2 flex items-center",style:{width:S(k),marginLeft:S(-k/2),zIndex:t==="flat"?10-Math.abs(o-4.5):e.length-o},children:n(y.div,{"data-result-index":o,"data-result-scale":r.scale,className:"relative w-full",initial:!1,animate:t==="flat"?g:t==="gather"?_:h,transition:t==="gather"?{duration:a.kind==="card"?N/1000:u/1000,ease:"easeIn"}:t==="fly"?a.kind==="card"?{x:{duration:l/1000,ease:"linear",times:[0,0.5,1]},y:{duration:l/1000,ease:"linear",times:[0,0.5,1]},scale:{duration:l/1000,ease:"linear"},opacity:{duration:l/1000,ease:"linear",times:[0,0.7,1]}}:{duration:u/1000}:{duration:0},children:a.kind==="card"?d(M,{children:[I[a.rarity]!==null&&n("img",{src:I[a.rarity]??void 0,alt:"","aria-hidden":!0,"data-testid":`multi-card-band-${a.rarity}`,className:"pointer-events-none absolute top-1/2 left-0 h-auto w-full max-w-none -translate-y-1/2 select-none"}),n("img",{src:D(a.multiImageUrl),alt:`${a.vibemonName} ${a.rarity} card`,className:"pointer-events-none relative block h-auto w-full max-w-none select-none"}),a.isNew&&n("img",{src:F,alt:"New",className:"pointer-events-none absolute top-0 right-[-5.85%] z-10 h-auto w-[44.21%] max-w-none -translate-y-1/2 select-none"})]}):n(de,{reward:a})})},w)})}),n(y.div,{className:"absolute top-[78%] left-[40.729%] h-[6.5%] w-[18.542%]",style:{pointerEvents:t==="flat"?"auto":"none"},animate:{opacity:t==="flat"?1:0},transition:{duration:u/1000},children:n(oe,{onConfirm:i})})]})})}export{xe as PullOverlay};
1
+ import{jsx as n,jsxs as d,Fragment as F}from"react/jsx-runtime";import{motion as y,useInView as H}from"motion/react";import{useEffect as L,useRef as U,useState as p}from"react";import{multiDrawSrBackground as J,multiDrawSsrBackground as Q,newTag as A,pullTexture as O,resultAura as X}from"../assets.js";import{cardThumb as w}from"../lib/card-image.js";import{cn as Z}from"../lib/utils.js";import{Button as D}from"../ui/button.js";import{PULL_VIDEO_SOURCES as ee}from"./pull-video.js";import{VideoFader as te}from"./video-fader.js";var u=300,l=500,C=400,ne=1920,I=10,P=1474,G=[0.6,0.7,0.8,0.9,1,1,0.9,0.8,0.7,0.6],ae=1.1269,k=[12,14,16,18,20,18,16,14,12].map((e)=>e*ae),q=(P-k.reduce((e,t)=>e+t,0))/G.reduce((e,t)=>e+t,0),ie=(()=>{let e=0;return G.map((t,i)=>{let s=q*t,a=e+s/2-P/2;if(e+=s,i<k.length)e+=k[i];return{scale:t,x:a}})})(),M={R:null,SR:J,SSR:Q},N=(e)=>`${e/ne*100}cqw`,B={R:"r",SR:"sr",SSR:"ssr"},z={"white-card":{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(1,24,30,0.90) 58.198%, rgba(86,209,251,0.90) 153.35%)",button:"#82D6EB",textureOpacity:"opacity-68"},r:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(1,24,30,0.90) 58.198%, rgba(86,209,251,0.90) 153.35%)",button:"#82D6EB",textureOpacity:"opacity-68"},sr:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(22,1,30,0.90) 59.16%, rgba(192,106,255,0.90) 153.35%)",button:"#C16AFF",textureOpacity:"opacity-68"},ssr:{scrim:"linear-gradient(0deg, rgba(0,0,0,0.20) 0%, rgba(0,0,0,0.20) 100%), linear-gradient(180.83deg, rgba(33,15,0,0.90) 65.36%, rgba(255,172,47,0.90) 153.35%)",button:"#FFAF32",textureOpacity:"opacity-100"}},re={r:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(0, 17, 35, 0.90) 65.37%, rgba(21, 166, 226, 0.90) 153.35%)",sr:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(24, 7, 45, 0.90) 65.37%, rgba(156, 63, 224, 0.90) 153.35%)",ssr:"linear-gradient(0deg, rgba(0, 0, 0, 0.20) 0%, rgba(0, 0, 0, 0.20) 100%), linear-gradient(181deg, rgba(33, 15, 0, 0.90) 65.37%, rgba(255, 172, 47, 0.90) 153.35%)"},W=(e)=>{if(e.some((t)=>t.kind==="card"&&t.rarity==="SSR"))return"ssr";if(e.some((t)=>t.kind==="card"&&t.rarity==="SR"))return"sr";return"r"};function xe({phase:e,drawnRewards:t,onVideoStarted:i,onPullDone:s,onPullFailed:a,onResultConfirmed:o}){let r=U(null),g=H(r),[_,x]=p(document.visibilityState==="visible");L(()=>{let f=()=>x(document.visibilityState==="visible");return document.addEventListener("visibilitychange",f),()=>document.removeEventListener("visibilitychange",f)},[]);let[h,T]=p(!1),[S,v]=p("flat"),b=U(!1);L(()=>{if(e!=="idle")return;b.current=!1,T(!1),v("flat")},[e]);let m=t.length>1,c=m?null:t[0],R=m?W(t):null,V=m&&t.some((f)=>f.kind==="card"),E=c?c.kind==="white-card"?"white-card":B[c.rarity]:null,K=()=>{if(!m||S!=="flat"||b.current)return;if(b.current=!0,!V){v("fly"),setTimeout(()=>o(!1),u);return}v("gather"),setTimeout(()=>v("fly"),C),setTimeout(()=>o(!0),C+l)},j=()=>{if(!c||h||b.current)return;b.current=!0,T(!0);let f=c.kind==="card"?l:u;setTimeout(()=>o(c.kind==="card"),f)},Y=m?S!=="fly":!h;return d("div",{ref:r,"data-presentation-state":e,className:"[container-type:size] absolute inset-0 z-50 overflow-hidden bg-transparent transition-colors duration-300",style:{pointerEvents:e==="idle"?"none":"auto"},children:[n("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 transition-opacity duration-300",style:{background:e!=="result"?"rgba(1,10,21,1)":R?re[R]:E?z[E].scrim:"rgba(1,10,21,0.82)",opacity:e==="result"&&Y?1:0}}),e==="result"&&(m?n(me,{rewards:t,stage:S,onConfirm:K}):c?n(ue,{reward:c,onConfirm:j,closing:h}):null),n(te,{sources:ee,playing:e==="video-waiting"||e==="video-playing",active:g&&_,background:"rgba(1,10,21,1)",onFirstFrame:i,onComplete:s,onError:a})]})}var se={default:"#FFAF32",hover:"#FFC15F",press:"#ECA029"};function oe({onConfirm:e}){let[t,i]=p(!1),[s,a]=p(!1),o=s?"press":t?"hover":"default";return d(D,{"aria-label":"Confirm",onClick:e,"data-visual-state":o,onPointerEnter:()=>i(!0),onPointerLeave:()=>{i(!1),a(!1)},onPointerDown:()=>a(!0),onPointerUp:()=>a(!1),onPointerCancel:()=>a(!1),onKeyDown:(r)=>{if(r.key===" "||r.key==="Enter")a(!0)},onKeyUp:(r)=>{if(r.key===" "||r.key==="Enter")a(!1)},onBlur:()=>{i(!1),a(!1)},style:{backgroundColor:se[o]},className:"relative h-full w-full overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)] transition-none active:translate-y-0",children:[n("img",{src:O,alt:"",className:"pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none mix-blend-soft-light select-none"}),n("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),n("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:"Confirm"})]})}function le({tone:e,onConfirm:t}){let i=z[e];return d(D,{"aria-label":"Confirm",onClick:t,style:{backgroundColor:i.button},className:"relative h-full w-full overflow-hidden rounded-full border-0 p-0 shadow-none drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)] transition-none hover:brightness-105 active:translate-y-0",children:[n("img",{src:O,alt:"",className:Z("pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none mix-blend-soft-light select-none",i.textureOpacity)}),n("span",{"aria-hidden":!0,className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),n("span",{className:"relative text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:"Confirm"})]})}function ce({reward:e}){return n("img",{src:w(e.singleImageUrl),alt:`Gacha Gem ×${e.exchangePoints}`,className:"block h-auto w-full max-w-none select-none"})}function ue({reward:e,onConfirm:t,closing:i}){let s=e.kind==="white-card"?"white-card":B[e.rarity];return n("div",{"data-testid":"single-draw-result","data-result-tone":s,className:"absolute inset-0 z-10",children:d("div",{className:"[container-type:size] absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[n(y.div,{"aria-hidden":!0,className:"pointer-events-none absolute top-[43.810%] left-[52.655%] aspect-square w-[31.656%] -translate-x-1/2 -translate-y-1/2",animate:{opacity:i?0:0.62},transition:{duration:u/1000},children:n("img",{src:X,alt:"",className:"h-full w-full max-w-none [animation:spin_2s_linear_infinite] select-none"})}),n("div",{className:`absolute -translate-x-1/2 ${e.kind==="card"?"top-[20.396%] left-[52.551%]":"top-[43.810%] left-[52.656%] -translate-y-1/2"}`,children:n(y.div,{className:"relative",style:{width:e.kind==="card"?"20.833cqw":"13.75cqw"},initial:!1,animate:i?e.kind==="card"?{x:["0cqw","14cqw","29cqw"],y:["0cqh","-34cqh","-37cqh"],scale:[1,0.14],opacity:[1,1,0]}:{x:0,y:0,scale:0.94,opacity:0}:{x:0,y:0,scale:1,opacity:1},transition:i&&e.kind==="card"?{x:{duration:l/1000,ease:"linear",times:[0,0.5,1]},y:{duration:l/1000,ease:"linear",times:[0,0.5,1]},scale:{duration:l/1000,ease:"linear"},opacity:{duration:l/1000,ease:"linear",times:[0,0.7,1]}}:{duration:i?u/1000:0},children:e.kind==="card"?d(F,{children:[n("img",{src:w(e.singleImageUrl),alt:`${e.vibemonName} ${e.rarity} card`,className:"h-auto w-full max-w-none select-none"}),e.isNew&&n("img",{src:A,alt:"New",className:"pointer-events-none absolute top-[0.202%] right-[2.504%] z-10 h-auto w-[22.5%] max-w-none select-none"})]}):n(ce,{reward:e})})}),n(y.div,{className:"absolute top-[71.667%] left-[52.656%] h-[6.5%] w-[18.542%] -translate-x-1/2",animate:{opacity:i?0:1},transition:{duration:u/1000},style:{pointerEvents:i?"none":"auto"},children:n(le,{tone:s,onConfirm:t})})]})})}function de({reward:e}){return n("img",{src:w(e.multiImageUrl),alt:`Gacha Gem ×${e.exchangePoints}`,className:"pointer-events-none block h-auto w-full max-w-none select-none"})}function me({rewards:e,stage:t,onConfirm:i}){if(e.length!==I)throw Error(`[vibemon] ten-draw result must contain ${I} rewards, received ${e.length}`);let s=W(e);return n("div",{"data-testid":"multi-draw-result","data-result-tone":s,className:"absolute inset-0 z-10 overflow-hidden",children:d("div",{"data-testid":"multi-result-stage",className:"[container-type:size] absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[n("div",{"data-testid":"multi-result-group",className:"absolute top-[17.833%] left-[11.615%] h-[55%] w-[76.77%]",children:e.map((a,o)=>{let r=ie[o],g={x:N(r.x),y:"0cqh",scale:r.scale,opacity:1},_=a.kind==="card"?`${a.drawIndex}-${a.vibemonUuid}`:`${a.drawIndex}-white-card`,x=a.kind==="card"?{x:"0cqw",y:"0cqh",scale:1,opacity:1}:{...g,opacity:0},h=a.kind==="card"?{x:["0cqw","17cqw","34cqw"],y:["0cqh","-40cqh","-38cqh"],scale:[1,0.08],opacity:[1,1,0]}:{...g,opacity:0};return n("div",{className:"absolute inset-y-0 left-1/2 flex items-center",style:{width:N(q),marginLeft:N(-q/2),zIndex:t==="flat"?10-Math.abs(o-4.5):e.length-o},children:n(y.div,{"data-result-index":o,"data-result-scale":r.scale,className:"relative w-full",initial:!1,animate:t==="flat"?g:t==="gather"?x:h,transition:t==="gather"?{duration:a.kind==="card"?C/1000:u/1000,ease:"easeIn"}:t==="fly"?a.kind==="card"?{x:{duration:l/1000,ease:"linear",times:[0,0.5,1]},y:{duration:l/1000,ease:"linear",times:[0,0.5,1]},scale:{duration:l/1000,ease:"linear"},opacity:{duration:l/1000,ease:"linear",times:[0,0.7,1]}}:{duration:u/1000}:{duration:0},children:a.kind==="card"?d(F,{children:[M[a.rarity]!==null&&n("img",{src:M[a.rarity]??void 0,alt:"","aria-hidden":!0,"data-testid":`multi-card-band-${a.rarity}`,className:"pointer-events-none absolute top-1/2 left-0 h-auto w-full max-w-none -translate-y-1/2 select-none"}),n("img",{src:w(a.multiImageUrl),alt:`${a.vibemonName} ${a.rarity} card`,className:"pointer-events-none relative block h-auto w-full max-w-none select-none"}),a.isNew&&n("img",{src:A,alt:"New",className:"pointer-events-none absolute top-0 right-[-5.85%] z-10 h-auto w-[44.21%] max-w-none -translate-y-1/2 select-none"})]}):n(de,{reward:a})})},_)})}),n(y.div,{className:"absolute top-[78%] left-[40.729%] h-[6.5%] w-[18.542%]",style:{pointerEvents:t==="flat"?"auto":"none"},animate:{opacity:t==="flat"?1:0},transition:{duration:u/1000},children:n(oe,{onConfirm:i})})]})})}export{xe as PullOverlay};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as s}from"react/jsx-runtime";import{pullAlbumIcon as A,pullBack as j,pullGem as G,pullPageBackground as O,pullTexture as M,pullVibemonIcon as L}from"../assets.js";import{motion as V}from"motion/react";import{useEffect as H,useMemo as R,useState as w}from"react";import{Button as P}from"../ui/button.js";import{getDefaultGachaPool as K,getVisibleGachaPools as X,resolveGachaPoolStatus as W}from"../../core/lib/gacha-pools.js";import{openAccountUrl as E}from"../../core/lib/recharge.js";import{cn as v}from"../lib/utils.js";import{BackToHome as Y}from"./back-to-home.js";import{GemBalance as J}from"./gem-balance.js";import{InsufficientPointsDialog as Q}from"./insufficient-points-dialog.js";import{FreeDrawGuide as Z,OnboardingScrim as ee}from"./onboarding-guide.js";var te="linear-gradient(180deg, #0C0C77 1.7234%, #171B6A 25.125%, #A67FFB 97.583%, #957FFB 116.28%)",ae=250,le={1:{default:"bg-[#82D6EB]",hover:"bg-[#A3E1F0]",press:"bg-[#5AC8E3]"},10:{default:"bg-[#FFD932]",hover:"bg-[#FFE46B]",press:"bg-[#FACE0B]"}};function _({drawCount:t,price:a,onClick:c,disabled:r,label:d}){let p=t===1,[b,u]=w(!1),[m,l]=w(!1),o=m?"press":b?"hover":"default",f=p?`X ${a}`:`X ${a}`;return s(P,{className:"relative h-[8.5cqh] w-full overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-45","aria-label":d,disabled:r,"data-visual-state":o,onPointerEnter:()=>u(!0),onPointerLeave:()=>{u(!1),l(!1)},onPointerDown:()=>l(!0),onPointerUp:()=>l(!1),onPointerCancel:()=>l(!1),onKeyDown:(h)=>{if(h.key===" "||h.key==="Enter")l(!0)},onKeyUp:(h)=>{if(h.key===" "||h.key==="Enter")l(!1)},onBlur:()=>{u(!1),l(!1)},onClick:c,children:[s("span",{className:"absolute top-[2.092cqh] left-0 h-[6.408cqh] w-full overflow-hidden rounded-[6.25cqw] drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)]",children:[e("span",{"data-slot":"pull-button-surface",className:v("absolute inset-0",le[t][o])}),e("img",{src:M,alt:"",className:v("pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none select-none",p?"opacity-68 mix-blend-soft-light":"opacity-18 mix-blend-color-burn")}),e("span",{className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),s("span",{"data-slot":"pull-button-label",className:"absolute inset-0 flex items-center justify-center text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:["PULL X",t]})]}),s("span",{className:"absolute top-0 left-1/2 flex h-[4.422cqh] -translate-x-1/2 items-center whitespace-nowrap",children:[e("span",{className:"me-[-0.375cqw] flex size-[2.763cqw] shrink-0 items-center justify-center",children:e("img",{"data-testid":"pull-button-gem",src:G,alt:"",className:"size-[1.682cqw] max-w-none -scale-y-100 rotate-[21.86deg] select-none"})}),e("span",{"data-slot":"pull-button-price","data-text":f,className:"relative scale-y-98 -skew-x-10 text-[1cqw] leading-normal font-semibold tracking-[0.1cqw] text-transparent before:absolute before:inset-0 before:text-white before:content-[attr(data-text)] before:[-webkit-text-stroke:0.25cqw_#FFFFFF] after:absolute after:inset-0 after:bg-gradient-to-b after:from-[#9645CF] after:to-[#878FFF] after:bg-clip-text after:text-transparent after:content-[attr(data-text)]",style:{fontFamily:'"PingFang SC", sans-serif'},children:f})]})]})}var oe=["unselected","hover","selected"],ne=(t,a)=>a==="selected"?t.sidebarSelectedImageUrl:a==="hover"?t.sidebarHoverImageUrl:t.sidebarUnselectedImageUrl;function se({pool:t,selected:a,disabled:c,onSelect:r}){let[d,p]=w(!1),[b,u]=w(!1),m=a?"selected":d||b?"hover":"unselected";return e(P,{id:`pool-tab-${t.poolUuid}`,role:"tab","aria-selected":a,"aria-controls":"gacha-pool-banner","aria-label":t.name,disabled:c,onClick:r,onPointerEnter:()=>p(!0),onPointerLeave:()=>p(!1),onFocus:()=>u(!0),onBlur:()=>u(!1),"data-visual-state":m,className:v("relative h-[14.167cqh] w-full shrink-0 justify-start overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-100",a?"z-20":"z-0"),children:oe.map((l)=>e("img",{src:ne(t,l),alt:"","aria-hidden":!0,className:v("pointer-events-none absolute bottom-0 left-0 h-auto w-full max-w-none select-none",m===l?"opacity-100":"opacity-0")},l))})}function re(t,a){if(a==="UPCOMING"){if(t.startsAt===null)throw Error(`Upcoming gacha pool ${t.poolUuid} is missing startsAt`);return{label:"Starts in",at:t.startsAt}}if(a==="ACTIVE"&&t.endsAt!==null)return{label:"Time remaining",at:t.endsAt};return null}function ie({pool:t,status:a,nowMs:c}){let r=re(t,a);if(r===null)return null;let d=Math.floor((Date.parse(r.at)-c)/1000),p=Math.floor(d/86400),b=Math.floor(d%86400/3600),u=Math.floor(d%3600/60),m=d%60,l=[{value:p,unit:"d"},{value:b,unit:"h"},{value:u,unit:"m"},{value:m,unit:"s"}];return e("div",{role:"timer","aria-label":r.label,className:"absolute bottom-[6.8%] left-[4.4%] flex min-w-[28%] items-center gap-[1.5%] rounded-lg bg-black/24 px-[1.2%] py-[0.8%] text-white backdrop-blur-sm",children:l.map(({value:o,unit:f})=>s("span",{className:"flex items-center gap-[0.35em]",children:[e("span",{className:"min-w-[2.1em] rounded-md bg-black/28 px-[0.35em] py-[0.25em] text-center text-[clamp(9px,0.82cqw,16px)] leading-none font-bold tabular-nums",children:String(o).padStart(2,"0")}),e("span",{className:"text-[clamp(8px,0.58cqw,12px)] font-medium text-white/75",children:f})]},f))})}function ce(t,a){let c=t.find((r)=>r.poolUuid===a);if(c!==void 0)return c;return B(t)}function B(t){let a=t[0];if(a===void 0)throw Error("Gacha pool catalog has no visible pools");return a}function qe({onBack:t,onAlbum:a,onEquip:c,isFirstDraw:r,onSingleDraw:d,onMultiDraw:p,drawDisabled:b,albumHasUnseen:u,availablePoints:m,pointsLoaded:l,guideActive:o,poolCatalog:f}){let[h,x]=w(!1),[S,z]=w(B(f.pools).poolUuid),[N,D]=w(Date.now);H(()=>{let i=window.setInterval(()=>D(Date.now()),1000);return()=>window.clearInterval(i)},[]);let q=R(()=>X(f.pools,N),[f.pools,N]),y=K(q),n=o?y:ce(q,S),U=W(n,N),k=r&&n.poolUuid===y.poolUuid,F=n.singlePrice,C=b||!n.canDraw||U!=="ACTIVE",I=()=>{if(!k&&l&&m<F){x(!0);return}d(n.poolUuid)},T=()=>{if(l&&m<n.multiPrice){x(!0);return}p(n.poolUuid)};return s("div",{className:"[container-type:size] relative h-full w-full overflow-hidden",style:{background:te},children:[e("div",{className:"absolute inset-0 flex items-center justify-center",children:s("div",{"data-testid":"vibemon-pull-stage",className:"[container-type:size] relative",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[s("div",{"aria-hidden":!0,className:"pointer-events-none absolute top-[-51.213%] left-[48.958%] h-[172.145%] w-[143.454%] -translate-x-1/2",children:[e("img",{"data-testid":"vibemon-pool-page-background",src:O,alt:"",className:"absolute inset-0 h-full w-full max-w-none object-cover opacity-60 mix-blend-color-burn select-none"}),e("div",{className:"absolute inset-0 bg-black/40"})]}),e(Y,{onClick:t,disabled:o,label:"Back",iconSrc:j,className:"absolute top-[5%] left-[6.25%] z-10 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-10 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(P,{"aria-label":"Vibémon",disabled:o,onClick:c,className:"size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:e("img",{src:L,alt:"",className:"size-full object-contain"})}),s(P,{"aria-label":"Album",disabled:o,onClick:a,className:"relative size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:[e("img",{src:A,alt:"",className:"size-full object-contain"}),u&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]}),e(J,{amount:m,onAdd:E,loaded:l,disabled:o,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]}),e("div",{role:"tablist","aria-label":"Card pools",className:"absolute top-[19.816%] left-[6.25%] flex w-[12.5%] flex-col",children:q.map((i)=>e(se,{pool:i,selected:i.poolUuid===n.poolUuid,disabled:o||b,onSelect:()=>z(i.poolUuid)},i.poolUuid))}),s("div",{id:"gacha-pool-banner",role:"tabpanel","aria-labelledby":`pool-tab-${n.poolUuid}`,className:"absolute top-[16.667%] left-[14.583%] z-10 h-[66.667%] w-[79.167%] overflow-hidden rounded-[1.042cqw]",children:[q.map((i)=>{let g=i.poolUuid===n.poolUuid;return e(V.img,{src:i.poolCardImageUrl,alt:g?`${i.name} pool`:"","aria-hidden":!g,className:"absolute inset-0 h-full w-full object-cover select-none",style:{zIndex:g?1:0},initial:!1,animate:{opacity:g?1:0},transition:{duration:ae/1000,ease:g?"easeOut":"easeIn"}},i.poolUuid)}),e(ie,{pool:n,status:U,nowMs:N})]}),s("div",{className:"absolute top-[86.098%] left-[54.427%] flex gap-[2.24cqw]",children:[e("div",{className:v("w-[18.542cqw]",o&&"relative z-30"),children:e(_,{drawCount:1,price:F,label:"Pull once",disabled:C,onClick:I})}),e("div",{className:"w-[18.542cqw]",children:e(_,{drawCount:10,price:n.multiPrice,label:"Pull ten times",disabled:o||k||C,onClick:T})})]}),o&&e(ee,{}),o&&e(Z,{})]})}),h&&e(Q,{onClose:()=>x(!1),onProceed:()=>{E(),x(!1)}})]})}export{qe as PullView};
1
+ import{jsx as e,jsxs as s}from"react/jsx-runtime";import{motion as j}from"motion/react";import{useEffect as G,useMemo as O,useState as w}from"react";import{getDefaultGachaPool as M,getVisibleGachaPools as L,resolveGachaPoolStatus as V}from"../../core/lib/gacha-pools.js";import{openAccountUrl as E}from"../../core/lib/recharge.js";import{placeholderCard as B,pullAlbumIcon as H,pullBack as R,pullGem as K,pullPageBackground as X,pullTexture as W,pullVibemonIcon as Y}from"../assets.js";import{cn as v}from"../lib/utils.js";import{Button as P}from"../ui/button.js";import{BackToHome as J}from"./back-to-home.js";import{GemBalance as Q}from"./gem-balance.js";import{InsufficientPointsDialog as Z}from"./insufficient-points-dialog.js";import{FreeDrawGuide as ee,OnboardingScrim as te}from"./onboarding-guide.js";var ae="linear-gradient(180deg, #0C0C77 1.7234%, #171B6A 25.125%, #A67FFB 97.583%, #957FFB 116.28%)",le=250,oe={1:{default:"bg-[#82D6EB]",hover:"bg-[#A3E1F0]",press:"bg-[#5AC8E3]"},10:{default:"bg-[#FFD932]",hover:"bg-[#FFE46B]",press:"bg-[#FACE0B]"}};function _({drawCount:t,price:a,onClick:c,disabled:r,label:d}){let p=t===1,[b,u]=w(!1),[m,l]=w(!1),o=m?"press":b?"hover":"default",f=p?`X ${a}`:`X ${a}`;return s(P,{className:"relative h-[8.5cqh] w-full overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-45","aria-label":d,disabled:r,"data-visual-state":o,onPointerEnter:()=>u(!0),onPointerLeave:()=>{u(!1),l(!1)},onPointerDown:()=>l(!0),onPointerUp:()=>l(!1),onPointerCancel:()=>l(!1),onKeyDown:(h)=>{if(h.key===" "||h.key==="Enter")l(!0)},onKeyUp:(h)=>{if(h.key===" "||h.key==="Enter")l(!1)},onBlur:()=>{u(!1),l(!1)},onClick:c,children:[s("span",{className:"absolute top-[2.092cqh] left-0 h-[6.408cqh] w-full overflow-hidden rounded-[6.25cqw] drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)]",children:[e("span",{"data-slot":"pull-button-surface",className:v("absolute inset-0",oe[t][o])}),e("img",{src:W,alt:"",className:v("pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none select-none",p?"opacity-68 mix-blend-soft-light":"opacity-18 mix-blend-color-burn")}),e("span",{className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),s("span",{"data-slot":"pull-button-label",className:"absolute inset-0 flex items-center justify-center text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:["PULL X",t]})]}),s("span",{className:"absolute top-0 left-1/2 flex h-[4.422cqh] -translate-x-1/2 items-center whitespace-nowrap",children:[e("span",{className:"me-[-0.375cqw] flex size-[2.763cqw] shrink-0 items-center justify-center",children:e("img",{"data-testid":"pull-button-gem",src:K,alt:"",className:"size-[1.682cqw] max-w-none -scale-y-100 rotate-[21.86deg] select-none"})}),e("span",{"data-slot":"pull-button-price","data-text":f,className:"relative scale-y-98 -skew-x-10 text-[1cqw] leading-normal font-semibold tracking-[0.1cqw] text-transparent before:absolute before:inset-0 before:text-white before:content-[attr(data-text)] before:[-webkit-text-stroke:0.25cqw_#FFFFFF] after:absolute after:inset-0 after:bg-gradient-to-b after:from-[#9645CF] after:to-[#878FFF] after:bg-clip-text after:text-transparent after:content-[attr(data-text)]",style:{fontFamily:'"PingFang SC", sans-serif'},children:f})]})]})}var ne=["unselected","hover","selected"],se=(t,a)=>a==="selected"?t.sidebarSelectedImageUrl:a==="hover"?t.sidebarHoverImageUrl:t.sidebarUnselectedImageUrl;function re({pool:t,selected:a,disabled:c,onSelect:r}){let[d,p]=w(!1),[b,u]=w(!1),m=a?"selected":d||b?"hover":"unselected";return e(P,{id:`pool-tab-${t.poolUuid}`,role:"tab","aria-selected":a,"aria-controls":"gacha-pool-banner","aria-label":t.name,disabled:c,onClick:r,onPointerEnter:()=>p(!0),onPointerLeave:()=>p(!1),onFocus:()=>u(!0),onBlur:()=>u(!1),"data-visual-state":m,className:v("relative h-[14.167cqh] w-full shrink-0 justify-start overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-100",a?"z-20":"z-0"),children:ne.map((l)=>e("img",{src:se(t,l)||B,alt:"","aria-hidden":!0,className:v("pointer-events-none absolute bottom-0 left-0 h-auto w-full max-w-none select-none",m===l?"opacity-100":"opacity-0")},l))})}function ie(t,a){if(a==="UPCOMING"){if(t.startsAt===null)throw Error(`Upcoming gacha pool ${t.poolUuid} is missing startsAt`);return{label:"Starts in",at:t.startsAt}}if(a==="ACTIVE"&&t.endsAt!==null)return{label:"Time remaining",at:t.endsAt};return null}function ce({pool:t,status:a,nowMs:c}){let r=ie(t,a);if(r===null)return null;let d=Math.floor((Date.parse(r.at)-c)/1000),p=Math.floor(d/86400),b=Math.floor(d%86400/3600),u=Math.floor(d%3600/60),m=d%60,l=[{value:p,unit:"d"},{value:b,unit:"h"},{value:u,unit:"m"},{value:m,unit:"s"}];return e("div",{role:"timer","aria-label":r.label,className:"absolute bottom-[6.8%] left-[4.4%] flex min-w-[28%] items-center gap-[1.5%] rounded-lg bg-black/24 px-[1.2%] py-[0.8%] text-white backdrop-blur-sm",children:l.map(({value:o,unit:f})=>s("span",{className:"flex items-center gap-[0.35em]",children:[e("span",{className:"min-w-[2.1em] rounded-md bg-black/28 px-[0.35em] py-[0.25em] text-center text-[clamp(9px,0.82cqw,16px)] leading-none font-bold tabular-nums",children:String(o).padStart(2,"0")}),e("span",{className:"text-[clamp(8px,0.58cqw,12px)] font-medium text-white/75",children:f})]},f))})}function de(t,a){let c=t.find((r)=>r.poolUuid===a);if(c!==void 0)return c;return S(t)}function S(t){let a=t[0];if(a===void 0)throw Error("Gacha pool catalog has no visible pools");return a}function Pe({onBack:t,onAlbum:a,onEquip:c,isFirstDraw:r,onSingleDraw:d,onMultiDraw:p,drawDisabled:b,albumHasUnseen:u,availablePoints:m,pointsLoaded:l,guideActive:o,poolCatalog:f}){let[h,x]=w(!1),[z,D]=w(S(f.pools).poolUuid),[N,I]=w(Date.now);G(()=>{let i=window.setInterval(()=>I(Date.now()),1000);return()=>window.clearInterval(i)},[]);let q=O(()=>L(f.pools,N),[f.pools,N]),y=M(q),n=o?y:de(q,z),U=V(n,N),k=r&&n.poolUuid===y.poolUuid,C=n.singlePrice,F=b||!n.canDraw||U!=="ACTIVE",T=()=>{if(!k&&l&&m<C){x(!0);return}d(n.poolUuid)},A=()=>{if(l&&m<n.multiPrice){x(!0);return}p(n.poolUuid)};return s("div",{className:"[container-type:size] relative h-full w-full overflow-hidden",style:{background:ae},children:[e("div",{className:"absolute inset-0 flex items-center justify-center",children:s("div",{"data-testid":"vibemon-pull-stage",className:"[container-type:size] relative",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[s("div",{"aria-hidden":!0,className:"pointer-events-none absolute top-[-51.213%] left-[48.958%] h-[172.145%] w-[143.454%] -translate-x-1/2",children:[e("img",{"data-testid":"vibemon-pool-page-background",src:X,alt:"",className:"absolute inset-0 h-full w-full max-w-none object-cover opacity-60 mix-blend-color-burn select-none"}),e("div",{className:"absolute inset-0 bg-black/40"})]}),e(J,{onClick:t,disabled:o,label:"Back",iconSrc:R,className:"absolute top-[5%] left-[6.25%] z-10 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-10 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(P,{"aria-label":"Vibémon",disabled:o,onClick:c,className:"size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:e("img",{src:Y,alt:"",className:"size-full object-contain"})}),s(P,{"aria-label":"Album",disabled:o,onClick:a,className:"relative size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:[e("img",{src:H,alt:"",className:"size-full object-contain"}),u&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]}),e(Q,{amount:m,onAdd:E,loaded:l,disabled:o,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]}),e("div",{role:"tablist","aria-label":"Card pools",className:"absolute top-[19.816%] left-[6.25%] flex w-[12.5%] flex-col",children:q.map((i)=>e(re,{pool:i,selected:i.poolUuid===n.poolUuid,disabled:o||b,onSelect:()=>D(i.poolUuid)},i.poolUuid))}),s("div",{id:"gacha-pool-banner",role:"tabpanel","aria-labelledby":`pool-tab-${n.poolUuid}`,className:"absolute top-[16.667%] left-[14.583%] z-10 h-[66.667%] w-[79.167%] overflow-hidden rounded-[1.042cqw]",children:[q.map((i)=>{let g=i.poolUuid===n.poolUuid;return e(j.img,{src:i.poolCardImageUrl||B,alt:g?`${i.name} pool`:"","aria-hidden":!g,className:"absolute inset-0 h-full w-full object-cover select-none",style:{zIndex:g?1:0},initial:!1,animate:{opacity:g?1:0},transition:{duration:le/1000,ease:g?"easeOut":"easeIn"}},i.poolUuid)}),e(ce,{pool:n,status:U,nowMs:N})]}),s("div",{className:"absolute top-[86.098%] left-[54.427%] flex gap-[2.24cqw]",children:[e("div",{className:v("w-[18.542cqw]",o&&"relative z-30"),children:e(_,{drawCount:1,price:C,label:"Pull once",disabled:F,onClick:T})}),e("div",{className:"w-[18.542cqw]",children:e(_,{drawCount:10,price:n.multiPrice,label:"Pull ten times",disabled:o||k||F,onClick:A})})]}),o&&e(te,{}),o&&e(ee,{})]})}),h&&e(Z,{onClose:()=>x(!1),onProceed:()=>{E(),x(!1)}})]})}export{Pe as PullView};
@@ -1,2 +1,2 @@
1
- import{jsx as o,jsxs as v}from"react/jsx-runtime";import{ArrowUpIcon as Fe,CheckIcon as je,PanelsTopLeftIcon as Pe,PencilLineIcon as Ue,XIcon as He}from"lucide-react";import{useCallback as xe,useEffect as ee,useLayoutEffect as ve,useRef as b,useState as p}from"react";import{useTranslation as Oe}from"react-i18next";import{cn as ne}from"cn";import{sameBinding as De,vibemonHost as Ve}from"../../core/host.js";import{Button as te}from"../ui/button.js";import{InputGroup as Ge,InputGroupAddon as We,InputGroupButton as P,InputGroupTextarea as qe}from"../ui/input-group.js";import{advancePetSubmission as Ke}from"../../core/lib/reply-submission.js";import{getVibemonScopeSync as Qe,useVibemonState as Xe}from"../lib/account-state.js";import{PetBubbleBackground as Ye}from"./pet-bubble-background.js";import{SessionIcon as ye}from"./session-icon.js";var oe=18,se=oe/2,Ze={color:"var(--popover-foreground)",borderRadius:16,border:"1px solid var(--border)"},Je=(h)=>h.split(/[\\/]/).filter(Boolean).at(-1)??"",$e=(h,t)=>[Je(h.cwd),h.title||t].filter(Boolean).join(" / ");function mn({maxHeight:h}){let t=Ve(),U=Xe(),ke=Qe(),[Ee,re]=p(320);ee(()=>{let e=!1;if(re(320),h===void 0&&U.pet!=="")t.assets.resources.inspect(U.pet).then((s)=>{if(e)return;let n=s?.config?.bubbleAreaHeight;if(n!==void 0&&(typeof n!=="number"||!Number.isFinite(n)))throw Error("Pet bubble height must be a finite number");re(Math.max(typeof n==="number"?n:0,320))}).catch(t.onError);return()=>{e=!0}},[t,ke,U.pet,h]);let{t:r}=Oe("common"),[i,Ie]=p(()=>t.sessions.snapshot()),[y,H]=p(""),[O,R]=p(!1),[m,k]=p(null),[le,D]=p(!1),[V,ie]=p(!1),[Ne,G]=p(""),[N,W]=p(!1),[Ce,ae]=p(null),ce=b(null),A=b(!1),C=b(!1),u=b(null),q=b(null),g=b(null),ue=b(i),de=b(null),pe=b(null),K=xe((e)=>G(e instanceof Error?e.message:String(e)),[]),l=i?.binding??null,a=i,E=i,M=l?.connectionEpoch??null,S=l?.sessionId??null,Me=l?.bindingRevision??-1,Se=i?.owner??"",Q=i===null||i.access!=="writable"||i.executionId!==null,Te=i!==null,_=xe(()=>{if(g.current?.abort(),g.current=null,W(!1),ae(null),H(""),R(!1),k(null),D(!1),q.current=null,G(""),A.current=!1,C.current=!1,u.current!==null)cancelAnimationFrame(u.current);u.current=null},[]);ee(()=>{let e=(n)=>{let x=ue.current;if(x===null||n===null||!De(x.binding,n.binding))_();if(ue.current=n,n!==null){if(n.state==="running")D(!0);k((I)=>I===null?I:Ke(I,n.state,n.since))}Ie(n)},s=t.sessions.subscribe(e);return e(t.sessions.snapshot()),document.addEventListener("vibemon:dismiss",_),()=>{if(s(),document.removeEventListener("vibemon:dismiss",_),g.current?.abort(),u.current!==null)cancelAnimationFrame(u.current)}},[t,_]);let T=()=>{if(l!==null)t.windows.call("bubble-interact",{binding:l}).catch(t.onError)},B=async(e)=>{if(g.current!==null)return;let s=new AbortController;g.current=s,T(),W(!0),G("");try{await e(s.signal)}catch(n){if(!s.signal.aborted)K(n)}finally{if(g.current===s)g.current=null,W(!1)}},Be=()=>t.windows.call("focus"),ze=(e)=>{if(l===null||i===null)throw Error("Pet conversation unavailable");return T(),t.windows.call("session-menu",{binding:l,candidates:i.candidates,position:e,onSelect:(s)=>B(()=>t.sessions.select(l,s))})},c=i?.state==="running",w=i?.state==="requires_action"||i?.prompt!=null,f=i?.prompt??null,Le=async(e,s,n)=>{if(l===null)throw Error(r("petMode.openToReply"));if(await t.sessions.answer(l,crypto.randomUUID(),e.token,s),!n.aborted)ae(e.token)},me=!N&&!Q&&!c&&!w&&y.trim()!==""&&Te,fe=async(e)=>{if(l===null||E===null)throw Error(r("petMode.openToReply"));let s=y.trim();q.current=E.reply?.messageId??null,k({sessionId:l.sessionId,text:s,startedAt:Date.now(),accepted:!1,sawRunning:!1,completed:!1});try{if(await t.sessions.send(l,crypto.randomUUID(),s),e.aborted)return;k((n)=>n===null?null:{...n,accepted:!0}),H("")}catch(n){if(!e.aborted)k(null);throw n}},X=()=>{if(l!==null)B(async(e)=>{await t.sessions.openChat(l),e.throwIfAborted()})},z=Ne||i?.error,Y=m?.completed||le&&(a?.state==="idle"||a?.state==="done"),F=E!==null&&!c&&!w&&!z&&Y&&E.reply?.messageId!==q.current?E.reply:null,Z=z?null:w?r("runState.requires_action"):c?r("petMode.thinking"):m?.completed?null:m?.accepted?r("petMode.sent"):null,be=m!==null,L=be||le,J=E?.userMessage??null,he=Y&&!c?null:(c||L)&&J!==null&&(m===null||J.timestamp>=m.startedAt)?J.text:be?m.text:null,j=!L&&!c&&!w,d=L&&Y&&!c&&!w&&!z,Re=F?.messageId,Ae=F?.text;ee(()=>{if(!d||V||l===null)return;let e=setTimeout(()=>{t.windows.call("dismiss-result",{binding:l}).catch(t.onError)},1e4);return()=>clearTimeout(e)},[d,V,M,S,Me,Re,Ae,t]);let we=w?320:d?260:c?240:320;ve(()=>{let e=de.current;if(e===null)return;let s=!1,n=()=>{let I=Math.ceil(e.getBoundingClientRect().height)+6;if(!s&&I>=32)t.windows.call("bubble-size",{width:we+se*2,height:I}).catch(t.onError)},x=new ResizeObserver(n);return x.observe(e),n(),()=>{s=!0,x.disconnect()}},[t,we,S]);let ge=a?r(a.windowLabel==="main"?"petMode.openMain":"petMode.openChat"):r("petMode.openFull");ve(()=>{if(y===""){R(!1);return}if(O||L||c)return;if(y.includes(`
2
- `)){R(!0);return}let e=ce.current;if(e===null)return;let s=()=>{let x=Math.ceil(Number.parseFloat(getComputedStyle(e).minHeight));if(e.scrollHeight>x)R(!0)};s();let n=new ResizeObserver(s);return n.observe(e),()=>n.disconnect()},[y,O,L,c]);let _e=j?Ge:"div";return v("div",{ref:de,"data-pet-bubble":!0,className:"relative pb-1.5",style:{paddingTop:se,paddingInline:se},onPointerEnter:()=>ie(!0),onPointerLeave:()=>ie(!1),children:[S!==null&&o(Ye,{cardRef:pe}),S!==null&&v("div",{ref:pe,"data-pet-bubble-card":!0,role:"presentation",onClick:(e)=>{if(d&&e.target.closest("button")===null)X()},style:{...Ze,position:"relative",background:"transparent",borderColor:"transparent",boxShadow:"none",animation:"none",maxHeight:(h??Ee)-6},className:ne("overflow-y-auto p-2",d?"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-3":c?"flex flex-col gap-1 py-1.5":"flex flex-col gap-2"),children:[he&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:he}),F!==null&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:F.text}),z&&o("p",{role:"alert",className:"text-muted-foreground text-xs",children:z}),f!==null&&v("section",{"aria-label":r(f.kind==="permission"?"petMode.permission":"petMode.question"),className:"flex min-w-0 flex-col gap-2",children:[o("p",{className:"text-sm break-words whitespace-pre-wrap",children:f.title}),f.detail!==""&&o("pre",{className:"text-muted-foreground max-h-24 overflow-auto text-xs break-words whitespace-pre-wrap",children:f.detail}),f.options.length>0&&!Q?o("div",{className:"flex flex-wrap gap-1",children:f.options.map((e)=>o(te,{size:"xs",className:"h-auto min-h-6 max-w-full whitespace-normal",disabled:N||Ce===f.token,onClick:()=>void B((s)=>Le(f,e.id,s)),children:e.label},e.id))}):o(te,{size:"xs",onClick:X,children:r("petMode.openToAnswer")})]}),v(_e,{className:d?"col-start-1 row-start-2":void 0,children:[j&&o(qe,{ref:ce,rows:1,className:"field-sizing-fixed max-h-[calc(3lh+1rem)] min-h-[calc(1lh+1rem)] min-w-0 overflow-y-auto",style:{height:O?"calc(3lh + 1rem)":"calc(1lh + 1rem)"},value:y,placeholder:r("petMode.placeholder"),"aria-label":r("petMode.placeholder"),disabled:N||Q||!Se||M===null,onChange:(e)=>{T(),H(e.target.value)},onFocus:()=>{T(),Be().catch(K)},onCompositionStart:()=>{if(u.current!==null)cancelAnimationFrame(u.current);u.current=null,C.current=!1,A.current=!0},onCompositionEnd:()=>{if(A.current=!1,C.current=!0,u.current!==null)cancelAnimationFrame(u.current);u.current=requestAnimationFrame(()=>{C.current=!1,u.current=null})},onKeyDown:(e)=>{if(e.key!=="Enter"||e.shiftKey||A.current||e.nativeEvent.isComposing||C.current||e.nativeEvent.keyCode===229)return;if(e.preventDefault(),me)B(fe)}}),v(We,{align:"block-end",className:ne("shrink-0",(d||c)&&"gap-1 p-0"),children:[v("div",{className:ne("flex min-w-0 items-center gap-2",!d&&"flex-1"),children:[Z&&o("p",{role:"status",className:"text-muted-foreground text-xs",children:c&&!w?o("span",{className:"shimmer",children:Z}):Z}),j?v(P,{className:"min-w-0 flex-1 justify-start",title:r("petMode.chooseSession"),"aria-label":r("petMode.chooseSession"),"aria-haspopup":"menu",disabled:N||M===null,onClick:(e)=>{let s=e.currentTarget.getBoundingClientRect();ze({x:s.left,y:s.bottom}).catch(K)},children:[a&&o("span",{role:"img","aria-label":r(a.windowLabel==="main"?"navigation.mainWindow":"navigation.chatWindow"),"data-icon":"inline-start",className:"inline-flex shrink-0",children:o(ye,{name:a.windowLabel,icons:t.sessionIcons})}),o("span",{className:"min-w-0 flex-1 truncate text-start",title:a?[a.cwd,a.title||r("collection.defaultChatTitle")].filter(Boolean).join(" / "):"",children:a?$e(a,r("collection.defaultChatTitle")):""})]}):!c&&o(P,{size:"icon-xs",className:d?"size-5":void 0,title:r("petMode.continue"),"aria-label":r("petMode.continue"),disabled:N||w||m!==null&&!m.accepted,onClick:()=>{T(),k(null),D(!1)},children:o(Ue,{})})]}),j&&o(P,{size:"icon-xs",variant:"default",className:"size-5 shrink-0",title:r("petMode.send"),"aria-label":r("petMode.send"),disabled:!me,onClick:()=>void B(fe),children:o(Fe,{className:"size-3"})}),o(P,{size:"icon-xs",className:"size-5 shrink-0",title:ge,"aria-label":ge,disabled:M===null||!a,onClick:X,children:a&&t.sessionIcons?o(ye,{name:a.windowLabel,icons:t.sessionIcons}):o(Pe,{className:"size-4"})})]})]}),d&&o("span",{role:"img","aria-label":r("petMode.completed"),title:r("petMode.completed"),className:"col-start-2 row-span-2 row-start-1 inline-flex size-7 items-center justify-center rounded-full bg-[var(--vibemon-completed-background)] text-[var(--vibemon-completed-foreground)]",children:o(je,{className:"size-4"})})]}),V&&M!==null&&S!==null&&o(te,{variant:"outline",size:"icon-xs",className:"text-muted-foreground absolute top-1 left-1 cursor-pointer rounded-full",style:{width:oe,height:oe},title:r("close"),"aria-label":r("close"),onClick:()=>void t.windows.call("bubble-close").catch(t.onError),children:o(He,{className:"size-2.5"})})]})}export{mn as PetQuickReply};
1
+ import{jsx as o,jsxs as v}from"react/jsx-runtime";import{cn as ee}from"cn";import{ArrowUpIcon as Pe,CheckIcon as Ue,PanelsTopLeftIcon as He,PencilLineIcon as Oe,XIcon as De}from"lucide-react";import{useCallback as ve,useEffect as ne,useEffectEvent as Ve,useLayoutEffect as ye,useRef as b,useState as p}from"react";import{useTranslation as Ge}from"react-i18next";import{sameBinding as We,vibemonHost as qe}from"../../core/host.js";import{advancePetSubmission as Ke}from"../../core/lib/reply-submission.js";import{getVibemonScopeSync as Qe,useVibemonState as Xe}from"../lib/account-state.js";import{Button as te}from"../ui/button.js";import{InputGroup as Ye,InputGroupAddon as Ze,InputGroupButton as P,InputGroupTextarea as Je}from"../ui/input-group.js";import{PetBubbleBackground as $e}from"./pet-bubble-background.js";import{SessionIcon as ke}from"./session-icon.js";var oe=18,se=oe/2,en={color:"var(--popover-foreground)",borderRadius:16,border:"1px solid var(--border)"},nn=(h)=>h.split(/[\\/]/).findLast(Boolean)??"",tn=(h,t)=>[nn(h.cwd),h.title||t].filter(Boolean).join(" / ");function hn({maxHeight:h}){let t=qe(),U=Xe(),Ee=Qe(),[Ie,re]=p(320);ne(()=>{let e=!1;if(re(320),h===void 0&&U.pet!=="")t.assets.resources.inspect(U.pet).then((s)=>{if(e)return;let n=s?.config?.bubbleAreaHeight;if(n!==void 0&&(typeof n!=="number"||!Number.isFinite(n)))throw Error("Pet bubble height must be a finite number");re(Math.max(typeof n==="number"?n:0,320))}).catch(t.onError);return()=>{e=!0}},[t,Ee,U.pet,h]);let{t:r}=Ge("common"),[i,Ne]=p(()=>t.sessions.snapshot()),[y,H]=p(""),[O,R]=p(!1),[m,k]=p(null),[le,D]=p(!1),[V,ie]=p(!1),[Ce,G]=p(""),[N,W]=p(!1),[Me,ae]=p(null),ce=b(null),A=b(!1),C=b(!1),u=b(null),q=b(null),g=b(null),ue=b(i),de=b(null),pe=b(null),K=ve((e)=>G(e instanceof Error?e.message:String(e)),[]),l=i?.binding??null,a=i,E=i,M=l?.connectionEpoch??null,S=l?.sessionId??null,Se=l?.bindingRevision??-1,Te=i?.owner??"",Q=i?.access!=="writable"||i.executionId!==null,Be=i!==null,_=ve(()=>{if(g.current?.abort(),g.current=null,W(!1),ae(null),H(""),R(!1),k(null),D(!1),q.current=null,G(""),A.current=!1,C.current=!1,u.current!==null)cancelAnimationFrame(u.current);u.current=null},[]);ne(()=>{let e=(n)=>{let x=ue.current;if(x===null||n===null||!We(x.binding,n.binding))_();if(ue.current=n,n!==null){if(n.state==="running")D(!0);k((I)=>I===null?I:Ke(I,n.state,n.since))}Ne(n)},s=t.sessions.subscribe(e);return e(t.sessions.snapshot()),document.addEventListener("vibemon:dismiss",_),()=>{if(s(),document.removeEventListener("vibemon:dismiss",_),g.current?.abort(),u.current!==null)cancelAnimationFrame(u.current)}},[t,_]);let T=()=>{if(l!==null)t.windows.call("bubble-interact",{binding:l}).catch(t.onError)},B=async(e)=>{if(g.current!==null)return;let s=new AbortController;g.current=s,T(),W(!0),G("");try{await e(s.signal)}catch(n){if(!s.signal.aborted)K(n)}finally{if(g.current===s)g.current=null,W(!1)}},Le=()=>t.windows.call("focus"),ze=(e)=>{if(l===null||i===null)throw Error("Pet conversation unavailable");return T(),t.windows.call("session-menu",{binding:l,candidates:i.candidates,position:e,onSelect:(s)=>B(()=>t.sessions.select(l,s))})},c=i?.state==="running",w=i?.state==="requires_action"||i?.prompt!=null,f=i?.prompt??null,Re=async(e,s,n)=>{if(l===null)throw Error(r("petMode.openToReply"));if(await t.sessions.answer(l,crypto.randomUUID(),e.token,s),!n.aborted)ae(e.token)},me=!N&&!Q&&!c&&!w&&y.trim()!==""&&Be,fe=async(e)=>{if(l===null||E===null)throw Error(r("petMode.openToReply"));let s=y.trim();q.current=E.reply?.messageId??null,k({sessionId:l.sessionId,text:s,startedAt:Date.now(),accepted:!1,sawRunning:!1,completed:!1});try{if(await t.sessions.send(l,crypto.randomUUID(),s),e.aborted)return;k((n)=>n===null?null:{...n,accepted:!0}),H("")}catch(n){if(!e.aborted)k(null);throw n}},X=()=>{if(l!==null)B(async(e)=>{await t.sessions.openChat(l),e.throwIfAborted()})},L=Ce||i?.error,Y=m?.completed||le&&(a?.state==="idle"||a?.state==="done"),F=E!==null&&!c&&!w&&!L&&Y&&E.reply?.messageId!==q.current?E.reply:null,Z=L?null:w?r("runState.requires_action"):c?r("petMode.thinking"):m?.completed?null:m?.accepted?r("petMode.sent"):null,be=m!==null,z=be||le,J=E?.userMessage??null,he=Y&&!c?null:(c||z)&&J!==null&&(m===null||J.timestamp>=m.startedAt)?J.text:be?m.text:null,j=!z&&!c&&!w,d=z&&Y&&!c&&!w&&!L,Ae=F?.messageId,_e=F?.text,we=l!==null,Fe=Ve(()=>{if(l!==null)t.windows.call("dismiss-result",{binding:l}).catch(t.onError)});ne(()=>{if(!d||V||!we)return;let e=setTimeout(Fe,1e4);return()=>clearTimeout(e)},[d,V,we,M,S,Se,Ae,_e,t]);let ge=w?320:d?260:c?240:320;ye(()=>{let e=de.current;if(e===null)return;let s=!1,n=()=>{let I=Math.ceil(e.getBoundingClientRect().height)+6;if(!s&&I>=32)t.windows.call("bubble-size",{width:ge+se*2,height:I}).catch(t.onError)},x=new ResizeObserver(n);return x.observe(e),n(),()=>{s=!0,x.disconnect()}},[t,ge,S]);let xe=a?r(a.windowLabel==="main"?"petMode.openMain":"petMode.openChat"):r("petMode.openFull");ye(()=>{if(y===""){R(!1);return}if(O||z||c)return;if(y.includes(`
2
+ `)){R(!0);return}let e=ce.current;if(e===null)return;let s=()=>{let x=Math.ceil(Number.parseFloat(getComputedStyle(e).minHeight));if(e.scrollHeight>x)R(!0)};s();let n=new ResizeObserver(s);return n.observe(e),()=>n.disconnect()},[y,O,z,c]);let je=j?Ye:"div";return v("div",{ref:de,"data-pet-bubble":!0,className:"relative pb-1.5",style:{paddingTop:se,paddingInline:se},onPointerEnter:()=>ie(!0),onPointerLeave:()=>ie(!1),children:[S!==null&&o($e,{cardRef:pe}),S!==null&&v("div",{ref:pe,"data-pet-bubble-card":!0,role:"presentation",onClick:(e)=>{if(d&&e.target.closest("button")===null)X()},style:{...en,position:"relative",background:"transparent",borderColor:"transparent",boxShadow:"none",animation:"none",maxHeight:(h??Ie)-6},className:ee("overflow-y-auto p-2",d?"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-3":c?"flex flex-col gap-1 py-1.5":"flex flex-col gap-2"),children:[he&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:he}),F!==null&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:F.text}),L&&o("p",{role:"alert",className:"text-muted-foreground text-xs",children:L}),f!==null&&v("section",{"aria-label":r(f.kind==="permission"?"petMode.permission":"petMode.question"),className:"flex min-w-0 flex-col gap-2",children:[o("p",{className:"text-sm break-words whitespace-pre-wrap",children:f.title}),f.detail!==""&&o("pre",{className:"text-muted-foreground max-h-24 overflow-auto text-xs break-words whitespace-pre-wrap",children:f.detail}),f.options.length>0&&!Q?o("div",{className:"flex flex-wrap gap-1",children:f.options.map((e)=>o(te,{size:"xs",className:"h-auto min-h-6 max-w-full whitespace-normal",disabled:N||Me===f.token,onClick:()=>void B((s)=>Re(f,e.id,s)),children:e.label},e.id))}):o(te,{size:"xs",onClick:X,children:r("petMode.openToAnswer")})]}),v(je,{className:d?"col-start-1 row-start-2":void 0,children:[j&&o(Je,{ref:ce,rows:1,className:"field-sizing-fixed max-h-[calc(3lh+1rem)] min-h-[calc(1lh+1rem)] min-w-0 overflow-y-auto",style:{height:O?"calc(3lh + 1rem)":"calc(1lh + 1rem)"},value:y,placeholder:r("petMode.placeholder"),"aria-label":r("petMode.placeholder"),disabled:N||Q||!Te||M===null,onChange:(e)=>{T(),H(e.target.value)},onFocus:()=>{T(),Le().catch(K)},onCompositionStart:()=>{if(u.current!==null)cancelAnimationFrame(u.current);u.current=null,C.current=!1,A.current=!0},onCompositionEnd:()=>{if(A.current=!1,C.current=!0,u.current!==null)cancelAnimationFrame(u.current);u.current=requestAnimationFrame(()=>{C.current=!1,u.current=null})},onKeyDown:(e)=>{if(e.key!=="Enter"||e.shiftKey||A.current||e.nativeEvent.isComposing||C.current||e.nativeEvent.keyCode===229)return;if(e.preventDefault(),me)B(fe)}}),v(Ze,{align:"block-end",className:ee("shrink-0",(d||c)&&"gap-1 p-0"),children:[v("div",{className:ee("flex min-w-0 items-center gap-2",!d&&"flex-1"),children:[Z&&o("p",{role:"status",className:"text-muted-foreground text-xs",children:c&&!w?o("span",{className:"shimmer",children:Z}):Z}),j?v(P,{className:"min-w-0 flex-1 justify-start",title:r("petMode.chooseSession"),"aria-label":r("petMode.chooseSession"),"aria-haspopup":"menu",disabled:N||M===null,onClick:(e)=>{let s=e.currentTarget.getBoundingClientRect();ze({x:s.left,y:s.bottom}).catch(K)},children:[a&&o("span",{role:"img","aria-label":r(a.windowLabel==="main"?"navigation.mainWindow":"navigation.chatWindow"),"data-icon":"inline-start",className:"inline-flex shrink-0",children:o(ke,{name:a.windowLabel,icons:t.sessionIcons})}),o("span",{className:"min-w-0 flex-1 truncate text-start",title:a?[a.cwd,a.title||r("collection.defaultChatTitle")].filter(Boolean).join(" / "):"",children:a?tn(a,r("collection.defaultChatTitle")):""})]}):!c&&o(P,{size:"icon-xs",className:d?"size-5":void 0,title:r("petMode.continue"),"aria-label":r("petMode.continue"),disabled:N||w||m!==null&&!m.accepted,onClick:()=>{T(),k(null),D(!1)},children:o(Oe,{})})]}),j&&o(P,{size:"icon-xs",variant:"default",className:"size-5 shrink-0",title:r("petMode.send"),"aria-label":r("petMode.send"),disabled:!me,onClick:()=>void B(fe),children:o(Pe,{className:"size-3"})}),o(P,{size:"icon-xs",className:"size-5 shrink-0",title:xe,"aria-label":xe,disabled:M===null||!a,onClick:X,children:a&&t.sessionIcons?o(ke,{name:a.windowLabel,icons:t.sessionIcons}):o(He,{className:"size-4"})})]})]}),d&&o("span",{role:"img","aria-label":r("petMode.completed"),title:r("petMode.completed"),className:"col-start-2 row-span-2 row-start-1 inline-flex size-7 items-center justify-center rounded-full bg-[var(--vibemon-completed-background)] text-[var(--vibemon-completed-foreground)]",children:o(Ue,{className:"size-4"})})]}),V&&M!==null&&S!==null&&o(te,{variant:"outline",size:"icon-xs",className:"text-muted-foreground absolute top-1 left-1 cursor-pointer rounded-full",style:{width:oe,height:oe},title:r("close"),"aria-label":r("close"),onClick:()=>void t.windows.call("bubble-close").catch(t.onError),children:o(De,{className:"size-2.5"})})]})}export{hn as PetQuickReply};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as a}from"react/jsx-runtime";import{singlePetToast as r}from"../assets.js";import{AnimatePresence as l,motion as c,useReducedMotion as u}from"motion/react";import{useEffect as d}from"react";import{Button as p}from"../ui/button.js";var m="This is your only pet. It’s equipped by default and can’t be unequipped ~",f=3000;function x({requestId:t,onClose:i}){let o=u(),n=t>0;return d(()=>{if(t===0)return;let s=window.setTimeout(i,f);return()=>window.clearTimeout(s)},[t,i]),e("div",{className:"pointer-events-none absolute bottom-[7.067%] left-1/2 z-30 h-[4.583cqw] w-[52.604cqw] -translate-x-1/2",children:e(l,{initial:!1,children:n&&a(c.div,{"data-testid":"single-pet-toast",className:"pointer-events-auto relative size-full",initial:{opacity:0,y:o?0:"100%"},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:"100%"},transition:o?{duration:0}:{duration:0.3,ease:[0.16,1,0.3,1]},children:[e("img",{src:r,alt:"","aria-hidden":!0,className:"absolute inset-0 size-full max-w-none select-none"}),e("span",{role:"status",className:"sr-only",children:m}),e(p,{"aria-label":"Close",onClick:i,className:"absolute top-1/4 right-[5.743%] aspect-square h-1/2 rounded-full border-0 bg-transparent p-0 shadow-none transition-none hover:bg-white/10 focus-visible:border-white focus-visible:ring-white/70 active:translate-y-0",children:e("span",{className:"sr-only",children:"Close"})})]})})})}export{f as SINGLE_PET_TOAST_DURATION_MS,m as SINGLE_PET_TOAST_MESSAGE,x as SinglePetToast};
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{AnimatePresence as r,motion as l,useReducedMotion as c}from"motion/react";import{useEffect as u}from"react";import{singlePetToast as d}from"../assets.js";import{Button as p}from"../ui/button.js";var m="This is your only pet. It’s equipped by default and can’t be unequipped ~",f=3000;function x({requestId:t,onClose:i}){let o=c(),n=t>0;return u(()=>{if(t===0)return;let s=window.setTimeout(i,f);return()=>window.clearTimeout(s)},[t,i]),e("div",{className:"pointer-events-none absolute bottom-[7.067%] left-1/2 z-30 h-[4.583cqw] w-[52.604cqw] -translate-x-1/2",children:e(r,{initial:!1,children:n&&a(l.div,{"data-testid":"single-pet-toast",className:"pointer-events-auto relative size-full",initial:{opacity:0,y:o?0:"100%"},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:"100%"},transition:o?{duration:0}:{duration:0.3,ease:[0.16,1,0.3,1]},children:[e("img",{src:d,alt:"","aria-hidden":!0,className:"absolute inset-0 size-full max-w-none select-none"}),e("span",{role:"status",className:"sr-only",children:m}),e(p,{"aria-label":"Close",onClick:i,className:"absolute top-1/4 right-[5.743%] aspect-square h-1/2 rounded-full border-0 bg-transparent p-0 shadow-none transition-none hover:bg-white/10 focus-visible:border-white focus-visible:ring-white/70 active:translate-y-0",children:e("span",{className:"sr-only",children:"Close"})})]})})})}export{f as SINGLE_PET_TOAST_DURATION_MS,m as SINGLE_PET_TOAST_MESSAGE,x as SinglePetToast};
@@ -4,6 +4,7 @@ interface SpriteRendererProps {
4
4
  spriteUrl: string;
5
5
  stateId: string;
6
6
  flipped: boolean;
7
+ staticImage?: boolean;
7
8
  active: boolean;
8
9
  animTick?: number;
9
10
  onFirstFrame?: () => void;
@@ -12,5 +13,5 @@ interface SpriteRendererProps {
12
13
  onMouseDown: () => void;
13
14
  onClick: () => void;
14
15
  }
15
- export declare function SpriteRenderer({ config, spriteUrl, stateId, flipped, active, animTick, onFirstFrame, onDrawFrame, onRenderError, onMouseDown, onClick }: SpriteRendererProps): import("react").JSX.Element;
16
+ export declare function SpriteRenderer({ config, spriteUrl, stateId, flipped, active, staticImage, animTick, onFirstFrame, onDrawFrame, onRenderError, onMouseDown, onClick }: SpriteRendererProps): import("react").JSX.Element;
16
17
  export {};
@@ -1 +1 @@
1
- import{jsx as H}from"react/jsx-runtime";import{useCallback as M,useEffect as j,useRef as u,useState as V}from"react";function _({config:r,spriteUrl:R,stateId:F,flipped:X,active:l,animTick:S,onFirstFrame:w,onDrawFrame:h,onRenderError:v,onMouseDown:k,onClick:G}){let i=u(null),a=u(0),t=u(null),z=u(null),c=u(!1),[I,b]=V(!1),s=r.states.find((e)=>e.id===F),f=s?.row??0,d=s?.frames??1,x=s?.fps??3,m=s?.loop??!0,C=u(w);C.current=w;let E=u(h);E.current=h;let g=u(v);g.current=v;let p=M((e,n)=>{let y=i.current,D=z.current;if(!y||!D)return;let o=y.getContext("2d");if(!o)return;o.imageSmoothingEnabled=!1,o.clearRect(0,0,r.renderSize,r.renderSize),o.drawImage(D,e*r.frameSize+r.cropX,n*r.frameSize+r.cropY,r.cropW,r.cropH,0,0,r.renderSize,r.renderSize),E.current?.()},[r]);return j(()=>{let e=!1;c.current=!1,b(!1);let n=new Image;return n.onload=()=>{if(e)return;z.current=n,b(!0)},n.onerror=()=>{if(!e)g.current?.(Error("Vibemon spritesheet could not be decoded"))},n.src=R,()=>{e=!0,n.onload=null,n.onerror=null}},[R]),j(()=>{if(!I||!l&&c.current)return;let e=i.current;if(!e)return;if(e.dataset.animationGeneration=String(S??0),t.current)clearInterval(t.current);if(a.current=0,p(0,f),!c.current)c.current=!0,C.current?.();if(!l)return;return t.current=setInterval(()=>{if(a.current++,a.current>=d){if(a.current=m?0:d-1,!m&&t.current)clearInterval(t.current),t.current=null}p(a.current,f)},1000/x),()=>{if(t.current)clearInterval(t.current)}},[f,d,x,m,S,I,l,p]),H("canvas",{ref:i,width:r.renderSize,height:r.renderSize,onMouseDown:(e)=>{if(e.button!==0)return;e.preventDefault(),k()},onClick:(e)=>{if(e.button!==0)return;G()},style:{width:"100%",height:"100%",imageRendering:"pixelated",transform:X?"scaleX(-1)":void 0,cursor:"pointer",pointerEvents:"auto"}})}export{_ as SpriteRenderer};
1
+ import{jsx as _}from"react/jsx-runtime";import{useCallback as g,useEffect as X,useRef as u,useState as q}from"react";function J({config:e,spriteUrl:v,stateId:k,flipped:G,active:p,staticImage:a,animTick:x,onFirstFrame:b,onDrawFrame:C,onRenderError:E,onMouseDown:V,onClick:Y}){let h=u(null),s=u(0),t=u(null),y=u(null),c=u(!1),[D,H]=q(!1),o=e.states.find((r)=>r.id===k),R=o?.row??0,S=o?.frames??1,I=o?.fps??3,w=o?.loop??!0,j=u(b);j.current=b;let F=u(C);F.current=C;let M=u(E);M.current=E;let z=g((r,n)=>{let W=h.current,l=y.current;if(!W||!l)return;let i=W.getContext("2d");if(!i)return;i.imageSmoothingEnabled=!1,i.clearRect(0,0,e.renderSize,e.renderSize);let f=a?l.naturalWidth:e.cropW,d=a?l.naturalHeight:e.cropH,m=e.renderSize/Math.max(f,d);i.drawImage(l,a?0:r*e.frameSize+e.cropX,a?0:n*(e.frameHeight??e.frameSize)+e.cropY,f,d,(e.renderSize-f*m)/2,(e.renderSize-d*m)/2,f*m,d*m),F.current?.()},[e,a]);return X(()=>{let r=!1;c.current=!1,H(!1);let n=new Image;return n.onload=()=>{if(r)return;y.current=n,H(!0)},n.onerror=()=>{if(!r)M.current?.(Error("Vibemon spritesheet could not be decoded"))},n.src=v,()=>{r=!0,n.onload=null,n.onerror=null}},[v]),X(()=>{if(!D||!p&&c.current)return;let r=h.current;if(!r)return;if(r.dataset.animationGeneration=String(x??0),t.current)clearInterval(t.current);if(s.current=0,z(0,R),!c.current)c.current=!0,j.current?.();if(!p)return;return t.current=setInterval(()=>{if(s.current++,s.current>=S){if(s.current=w?0:S-1,!w&&t.current)clearInterval(t.current),t.current=null}z(s.current,R)},1000/I),()=>{if(t.current)clearInterval(t.current)}},[R,S,I,w,x,D,p,z]),_("canvas",{ref:h,width:e.renderSize,height:e.renderSize,onMouseDown:(r)=>{if(r.button!==0)return;r.preventDefault(),V()},onClick:(r)=>{if(r.button!==0)return;Y()},style:{width:"100%",height:"100%",imageRendering:"pixelated",transform:G?"scaleX(-1)":void 0,cursor:"pointer",pointerEvents:"auto"}})}export{J as SpriteRenderer};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as s,Fragment as l}from"react/jsx-runtime";import{albumIcon as r,pullBack as m,pullVibemonIcon as i}from"../assets.js";import{useState as d}from"react";import{Button as u}from"../ui/button.js";import{openAccountUrl as p}from"../../core/lib/recharge.js";import{BackToHome as b}from"./back-to-home.js";import{GemBalance as f}from"./gem-balance.js";import{WishButton as g}from"./wish-button.js";function q({action:a}){let[n,o]=d(!1),t=a.kind==="album";return s(u,{"aria-label":t?"Album":"Vibémon",onClick:a.onClick,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),className:"relative size-[3.333cqw] bg-transparent p-0 shadow-none hover:bg-transparent",children:[e("img",{src:t?r:i,alt:"",className:"size-full object-contain transition-transform duration-150 select-none",style:{transform:n?"translateY(-2px) scale(1.05)":"none"}}),t&&a.hasUnseen&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]})}function N({onBack:a,onWish:n,sectionAction:o,availablePoints:t,pointsLoaded:c}){return s(l,{children:[e(b,{onClick:a,label:"Back",iconSrc:m,className:"absolute top-[5.333%] left-[6.25%] z-30 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-30 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(q,{action:o}),e(g,{onClick:n,className:"size-[3.333cqw]"}),e(f,{amount:t,onAdd:p,loaded:c,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]})]})}export{N as VibemonHeader};
1
+ import{jsx as e,jsxs as s,Fragment as l}from"react/jsx-runtime";import{useState as r}from"react";import{openAccountUrl as m}from"../../core/lib/recharge.js";import{albumIcon as i,pullBack as d,pullVibemonIcon as u}from"../assets.js";import{Button as p}from"../ui/button.js";import{BackToHome as b}from"./back-to-home.js";import{GemBalance as f}from"./gem-balance.js";import{WishButton as g}from"./wish-button.js";function q({action:a}){let[n,o]=r(!1),t=a.kind==="album";return s(p,{"aria-label":t?"Album":"Vibémon",onClick:a.onClick,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),className:"relative size-[3.333cqw] bg-transparent p-0 shadow-none hover:bg-transparent",children:[e("img",{src:t?i:u,alt:"",className:"size-full object-contain transition-transform duration-150 select-none",style:{transform:n?"translateY(-2px) scale(1.05)":"none"}}),t&&a.hasUnseen&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]})}function N({onBack:a,onWish:n,sectionAction:o,availablePoints:t,pointsLoaded:c}){return s(l,{children:[e(b,{onClick:a,label:"Back",iconSrc:d,className:"absolute top-[5.333%] left-[6.25%] z-30 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-30 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(q,{action:o}),e(g,{onClick:n,className:"size-[3.333cqw]"}),e(f,{amount:t,onAdd:m,loaded:c,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]})]})}export{N as VibemonHeader};
@@ -1 +1 @@
1
- import{jsx as t,jsxs as M}from"react/jsx-runtime";import{gem as De,gemPlus as Ce,guideArrow as He,guideHand as Ne,guideHandShape as ke,guideHandSheen as Ue,guideHomeTexture as Oe,guideMascot as he,guidePullTexture as Ge,guideRing as qe,homeBackground as Fe,homeHotspotAssets as c,pullAlbumIcon as Me,pullBack as Be,pullGem as Te,pullPageBackground as je,pullTexture as $e,pullVibemonIcon as We}from"../assets.js";import{Loader2 as ze}from"lucide-react";import{useCallback as P,useEffect as h,useRef as S,useState as n}from"react";import{useTranslation as Je}from"react-i18next";import{toast as Ke}from"sonner";import{equipVibemonAfterDraw as Qe,getVibemonScopeSync as A}from"../lib/account-state.js";import{cardThumb as me}from"../lib/card-image.js";import{createDrawReward as Xe}from"../../core/lib/draw-result.js";import{gachaPoolImageUrls as Ye,loadGachaPoolCatalog as Ze}from"../../core/lib/gacha-pools.js";import{preloadImages as fe}from"../../core/lib/preload-images.js";import{syncVibemonResources as eo}from"../lib/resource-sync.js";import{getSetting as pe,getSettingSync as E,setSetting as be}from"../../core/lib/settings.js";import{drawGachaPool as oo,getGachaFirstDraw as no,getMyVibemons as to,getPointAccount as we,markVibemonFirstVisit as ro}from"../../core/lib/endpoints.js";import{consumePendingVibemonView as io,onVibemonViewRequest as ao}from"../../core/lib/view-request.js";import{AlbumView as so}from"./album-view.js";import{EquipView as lo}from"./equip-view.js";import{HomeView as co}from"./home-view.js";import{INTRO_VIDEO_URL as uo,IntroOverlay as mo}from"./intro-overlay.js";import{VibemonLoadingView as fo}from"./loading-view.js";import{PullOverlay as po}from"./pull-overlay.js";import{PullView as wo}from"./pull-view.js";var go=30000,B=[Fe,c.vibemon.icon,c.vibemon.hover,c.vibemon.text,c.wish.icon,c.wish.hover,c.wish.text,c.album.icon,c.album.hover,c.album.text,He,Oe,he],ge=[je,Be,We,Me,$e,Te,De,Ce,Ge,Ne,ke,Ue,he,qe],T=(r)=>{let i=A();return!!(i&&r[i])},j=(r,i)=>{let s=A();if(!s)return;be(r,{...E(r),[s]:i})},W=(r)=>{let i=A();if(!i)return null;return r[i]??null},ho=(r)=>{let i=A();if(!i)return;be("vibemon.onboardingStep",{...E("vibemon.onboardingStep"),[i]:r})};function Mo(){return t("div",{className:"contents",onContextMenu:(r)=>r.preventDefault(),children:t(bo,{})})}function bo(){let{t:r}=Je("vibemon"),[i,s]=n(()=>{let e=W(E("vibemon.onboardingStep"));return e==="free-draw"||e==="view-album"?"pull":"home"}),[I,u]=n("idle"),[f,ve]=n(()=>W(E("vibemon.onboardingStep"))),[p,z]=n(!1),[_,D]=n(!1),[b,Pe]=n([]),[Se,J]=n(null),[R,Ee]=n(!1),[C,K]=n(0),[H,Q]=n(!1),[Ie,Re]=n([]),[Ve,X]=n(!1),[N,ye]=n(null),[V,Y]=n(null),[Z,ee]=n({done:0,total:ge.length}),[Le,xe]=n(!1),[m,v]=n(()=>T(E("vibemon.introSeen"))?"loading":"resolving-intro"),[oe,Ae]=n({done:0,total:B.length}),[ne,_e]=n(null),te=S(!1),y=P((e)=>{ve(e),ho(e)},[]),l=P(()=>s("pull"),[]);h(()=>{if(m!=="loading"||te.current)return;te.current=!0,fe(B,(e)=>{Ae({done:e,total:B.length})}).catch((e)=>{let o=e instanceof Error?e:Error(String(e));_e(o)})},[m]);let re=S(0),ie=S(!1),k=S(!1),w=P(async()=>{let e=++re.current;try{let o=await to();if(e===re.current)Pe(o),Ee(!0),J(null)}catch(o){J(o instanceof Error?o:Error(String(o))),console.warn("[vibemon] getMyVibemons failed",o)}},[]),ae=S(!1),se=S(!1),U=P(async()=>{try{let e=await Ze();ye(e),Y(null);let o=[...new Set([...ge,...Ye(e)])],a=!ae.current;if(a)ee({done:0,total:o.length});if(await fe(o,(L)=>{if(a)ee({done:L,total:o.length})}),a)ae.current=!0,xe(!0)}catch(e){let o=e instanceof Error?e:Error(String(e));console.error("[vibemon] loadGachaPoolCatalog failed",o),Y(o)}},[]);h(()=>{if(m!=="loading"||se.current)return;se.current=!0,U()},[m,U]),h(()=>{let e=()=>{we().then((a)=>{K(a.available_points),Q(!0)}).catch((a)=>console.warn("[vibemon] getPointAccount failed",a))};e();let o=setInterval(e,go);return window.addEventListener("focus",e),()=>{clearInterval(o),window.removeEventListener("focus",e)}},[]),h(()=>{for(let e of b)new Image().src=me(e.gacha_url??e.cover_url)},[b]);let O=()=>{if(_)j("vibemon.albumHasUnseen",!1),D(!1);w(),s("album")},g=P(()=>{w(),s("equip")},[w]);h(()=>{if(ie.current)return;ie.current=!0,w(),Promise.all([no().catch((e)=>(console.warn("[vibemon] getGachaFirstDraw failed",e),{first_draw:!1})),pe("vibemon.albumHasUnseen")]).then(([e,o])=>{if(z(e.first_draw),D(T(o)),!e.first_draw)return;if(W(E("vibemon.onboardingStep"))==="free-draw"){l();return}y("home-wish"),s("home")}),pe("vibemon.introSeen").then((e)=>{if(T(e)){v("loading");return}return ro().then(({first_visit:o})=>{if(j("vibemon.introSeen",!0),o)s("home"),u("intro"),v("intro");else v("loading")})}).catch((e)=>{console.warn("[vibemon] first-visit check failed",e),v("loading")})},[l,w,y]);let[le,de]=n(!1),G=P((e)=>{if(p&&f==="home-wish")return;if(p&&f==="free-draw"){l();return}if(e==="pull")l();else if(e==="equip")g();else de(!0)},[p,f,g,l]);if(h(()=>{let e=io();if(e)G(e);return ao(G)},[G]),h(()=>{if(!le||!R)return;if(de(!1),b.length===0)l();else g()},[le,R,b.length,g,l]),Se!==null)return M("div",{role:"alert",className:"flex h-full flex-col items-center justify-center gap-3 bg-background p-6 text-foreground",children:[t("p",{children:r("offline.title")}),t("p",{className:"text-sm text-muted-foreground",children:r("offline.description")}),t("button",{type:"button",className:"rounded-md border px-4 py-2",onClick:()=>void w(),children:r("offline.retry")})]});if(m==="resolving-intro")return M("div",{className:"relative flex h-full w-full items-center justify-center overflow-hidden bg-[#120E18]",children:[t("video",{src:uo,preload:"auto",muted:!0,playsInline:!0,"aria-hidden":!0,className:"pointer-events-none absolute top-0 left-0 h-px w-px opacity-0"}),t(ze,{className:"size-10 animate-spin text-white"})]});if(m==="intro")return t("div",{className:"relative h-full w-full overflow-hidden bg-[#120E18]",children:t(mo,{onVideoStart:()=>u("intro"),onDone:()=>{u("idle"),v("loading")}})});if(ne!==null)throw ne;if(m==="loading"&&V!==null)throw V;if(m==="loading"){let e=oe.done+Z.done+(N===null?0:1)+(Le?1:0),o=oe.total+Z.total+2;return t("div",{className:"relative h-full w-full overflow-hidden",children:t(fo,{progress:e/o,onFinished:()=>v("ready")})})}if(i==="home")return t(co,{onDraw:()=>{if(f==="home-wish")y("free-draw");l()},onBackpack:O,onEquip:g,guideActive:p&&f==="home-wish"});if(i==="equip")return t(lo,{onBack:()=>s("home"),onWish:l,onAlbum:O,albumHasUnseen:_,ownedCards:b,ownedLoaded:R,availablePoints:C,pointsLoaded:H});if(i==="album")return t(so,{onBack:()=>s("home"),onWish:l,onEquip:g,ownedCards:b,ownedLoaded:R,availablePoints:C,pointsLoaded:H});if(V!==null)throw V;if(N===null)throw Error("[vibemon] app entered ready state without a gacha pool catalog");let ce=async(e,o)=>{if(k.current||I!=="idle")return;k.current=!0,X(!0);try{let a;try{a=await oo(e,o)}catch(d){console.warn("[vibemon] drawGachaPool failed",d),Ke.error(r("draw.failedNetwork"));return}let L=o==="SINGLE"?1:10;if(a.results.length!==L)throw Error(`[vibemon] ${o} draw response must contain ${L} results, received ${a.results.length}`);let ue=a.results.map(Xe),q=[];for(let[d,F]of a.results.entries()){if(F.reward_type==="WHITE_CARD")continue;q.push(F);let x=ue[d];if(x===void 0||x.kind!=="card")throw Error(`[vibemon] draw result ${F.draw_index} was not mapped to a Vibemon card`);new Image().src=me(o==="SINGLE"?x.singleImageUrl:x.multiImageUrl)}if(Re(ue),z(!1),f==="free-draw")y("view-album");if(u("video-waiting"),q.length>0){let d=q[0];if(d===void 0)throw Error("[vibemon] draw result lost its first Vibemon item");eo(),Qe(d.vibemon_uuid,p),w()}U(),we().then((d)=>{K(d.available_points),Q(!0)}).catch((d)=>console.warn("[vibemon] getPointAccount failed",d))}finally{k.current=!1,X(!1)}};return M("div",{className:"relative h-full w-full",children:[t(wo,{onBack:()=>s("home"),onAlbum:O,onEquip:g,isFirstDraw:p,availablePoints:C,pointsLoaded:H,onSingleDraw:(e)=>void ce(e,"SINGLE"),onMultiDraw:(e)=>void ce(e,"MULTI"),drawDisabled:Ve||I!=="idle",albumHasUnseen:_,guideActive:p&&f==="free-draw",poolCatalog:N}),I!=="intro"&&t(po,{phase:I,drawnRewards:Ie,onVideoStarted:()=>u("video-playing"),onPullDone:()=>u("result"),onPullFailed:()=>u("result"),onResultConfirmed:(e)=>{if(e)j("vibemon.albumHasUnseen",!0),D(!0);u("idle")}})]})}export{Mo as VibemonPage};
1
+ import{jsx as t,jsxs as F}from"react/jsx-runtime";import{Loader2 as De}from"lucide-react";import{useCallback as P,useEffect as h,useRef as S,useState as n}from"react";import{useTranslation as He}from"react-i18next";import{toast as Ce}from"sonner";import{vibemonHost as Ne}from"../../core/host.js";import{createDrawReward as ke}from"../../core/lib/draw-result.js";import{drawGachaPool as Oe,getGachaFirstDraw as Ue,getMyVibemons as Ge,getPointAccount as fe,markVibemonFirstVisit as qe}from"../../core/lib/endpoints.js";import{gachaPoolImageUrls as Fe,loadGachaPoolCatalog as Me}from"../../core/lib/gacha-pools.js";import{preloadImages as pe}from"../../core/lib/preload-images.js";import{getSetting as we,getSettingSync as E,setSetting as be}from"../../core/lib/settings.js";import{consumePendingVibemonView as Te,onVibemonViewRequest as je}from"../../core/lib/view-request.js";import{gem as Be,gemPlus as We,guideArrow as $e,guideHand as ze,guideHandShape as Je,guideHandSheen as Ke,guideHomeTexture as Qe,guideMascot as ve,guidePullTexture as Xe,guideRing as Ye,homeBackground as Ze,homeHotspotAssets as c,pullAlbumIcon as eo,pullBack as oo,pullGem as no,pullPageBackground as to,pullTexture as ro,pullVibemonIcon as io}from"../assets.js";import{equipVibemonAfterDraw as ao,getVibemonScopeSync as _}from"../lib/account-state.js";import{cardThumb as ge}from"../lib/card-image.js";import{syncVibemonResources as so}from"../lib/resource-sync.js";import{AlbumView as lo}from"./album-view.js";import{EquipView as co}from"./equip-view.js";import{HomeView as uo}from"./home-view.js";import{INTRO_VIDEO_URL as mo,IntroOverlay as fo}from"./intro-overlay.js";import{VibemonLoadingView as po}from"./loading-view.js";import{PullOverlay as wo}from"./pull-overlay.js";import{PullView as go}from"./pull-view.js";var ho=30000,M=[Ze,c.vibemon.icon,c.vibemon.hover,c.vibemon.text,c.wish.icon,c.wish.hover,c.wish.text,c.album.icon,c.album.hover,c.album.text,$e,Qe,ve],he=[to,oo,io,eo,ro,no,Be,We,Xe,ze,Je,Ke,ve,Ye],T=(r)=>{let a=_();return!!(a&&r[a])},j=(r,a)=>{let l=_();if(!l)return;be(r,{...E(r),[l]:a})},B=(r)=>{let a=_();if(!a)return null;return r[a]??null},bo=(r)=>{let a=_();if(!a)return;be("vibemon.onboardingStep",{...E("vibemon.onboardingStep"),[a]:r})};function jo(){return t("div",{className:"contents",onContextMenu:(r)=>r.preventDefault(),children:t(vo,{})})}function vo(){let{t:r}=He("vibemon"),[a,l]=n(()=>{let e=B(E("vibemon.onboardingStep"));return e==="free-draw"||e==="view-album"?"pull":"home"}),[I,u]=n("idle"),[m,Pe]=n(()=>B(E("vibemon.onboardingStep"))),[f,W]=n(!1),[L,x]=n(!1),[b,Se]=n([]),[Ee,z]=n(null),[y,Ie]=n(!1),[A,J]=n(0),[D,K]=n(!1),[ye,Re]=n([]),[Ve,Q]=n(!1),[H,_e]=n(null),[X,Y]=n(null),[Z,ee]=n({done:0,total:he.length}),[oe,Le]=n(!1),[p,v]=n(()=>T(E("vibemon.introSeen"))?"loading":"resolving-intro"),[ne,xe]=n({done:0,total:M.length}),[te,Ae]=n(null),re=S(!1),R=P((e)=>{Pe(e),bo(e)},[]),d=P(()=>l("pull"),[]);h(()=>{if(p!=="loading"||re.current)return;re.current=!0,pe(M,(e)=>{xe({done:e,total:M.length})}).catch((e)=>{let o=e instanceof Error?e:Error(String(e));Ae(o)})},[p]);let ie=S(0),ae=S(!1),C=S(!1),w=P(async()=>{let e=++ie.current;try{let o=await Ge();if(e===ie.current)Se(o),Ie(!0),z(null)}catch(o){z(o instanceof Error?o:Error(String(o))),console.warn("[vibemon] getMyVibemons failed",o)}},[]),se=S(!1),le=S(!1),N=P(async()=>{try{let e=await Me();Y(null);let o=[...new Set([...he,...Fe(e)])],s=!se.current;if(s)ee({done:0,total:o.length});if(await pe(o,(V)=>{if(s)ee({done:V,total:o.length})}),_e(e),s)se.current=!0,Le(!0)}catch(e){let o=e instanceof Error?e:Error(String(e));console.error("[vibemon] loadGachaPoolCatalog failed",o),Y(o)}},[]);h(()=>{if(p!=="loading"||le.current)return;le.current=!0,N()},[p,N]),h(()=>{let e=()=>{fe().then((s)=>{J(s.available_points),K(!0)}).catch((s)=>console.warn("[vibemon] getPointAccount failed",s))};e();let o=setInterval(e,ho);return window.addEventListener("focus",e),()=>{clearInterval(o),window.removeEventListener("focus",e)}},[]),h(()=>{for(let e of b)new Image().src=ge(e.gacha_url??e.cover_url)},[b]);let k=()=>{if(L)j("vibemon.albumHasUnseen",!1),x(!1);w(),l("album")},g=P(()=>{w(),l("equip")},[w]);h(()=>{if(ae.current)return;ae.current=!0,w(),Promise.all([Ue().catch((e)=>(console.warn("[vibemon] getGachaFirstDraw failed",e),{first_draw:!1})),we("vibemon.albumHasUnseen")]).then(([e,o])=>{if(W(e.first_draw),x(T(o)),!e.first_draw)return;if(B(E("vibemon.onboardingStep"))==="free-draw"){d();return}R("home-wish"),l("home")}),we("vibemon.introSeen").then((e)=>{if(T(e)){v("loading");return}return qe().then(({first_visit:o})=>{if(j("vibemon.introSeen",!0),o)l("home"),u("intro"),v("intro");else v("loading")})}).catch((e)=>{console.warn("[vibemon] first-visit check failed",e),v("loading")})},[d,w,R]);let[de,ce]=n(!1),O=P((e)=>{if(f&&m==="home-wish")return;if(f&&m==="free-draw"){d();return}if(e==="pull")d();else if(e==="equip")g();else ce(!0)},[f,m,g,d]);if(h(()=>{let e=Te();if(e)O(e);return je(O)},[O]),h(()=>{if(!de||!y)return;if(ce(!1),b.length===0)d();else g()},[de,y,b.length,g,d]),Ee!==null)return F("div",{role:"alert",className:"bg-background text-foreground flex h-full flex-col items-center justify-center gap-3 p-6",children:[t("p",{children:r("offline.title")}),t("p",{className:"text-muted-foreground text-sm",children:r("offline.description")}),t("button",{type:"button",className:"rounded-md border px-4 py-2",onClick:()=>void w(),children:r("offline.retry")})]});if(p==="resolving-intro")return F("div",{className:"relative flex h-full w-full items-center justify-center overflow-hidden bg-[#120E18]",children:[t("video",{src:mo,preload:"auto",muted:!0,playsInline:!0,"aria-hidden":!0,className:"pointer-events-none absolute top-0 left-0 h-px w-px opacity-0"}),t(De,{className:"size-10 animate-spin text-white"})]});if(p==="intro")return t("div",{className:"relative h-full w-full overflow-hidden bg-[#120E18]",children:t(fo,{onVideoStart:()=>u("intro"),onDone:()=>{u("idle"),v("loading")}})});if(te!==null)throw te;if(X!==null)throw X;if(p==="loading"){let e=ne.done+Z.done+(H===null?0:1)+(oe?1:0),o=ne.total+Z.total+2;return t("div",{className:"relative h-full w-full overflow-hidden",children:t(po,{progress:e/o,onFinished:()=>v("ready")})})}if(a==="home")return t(uo,{onDraw:()=>{if(m==="home-wish")R("free-draw");d()},onBackpack:k,onEquip:g,guideActive:f&&m==="home-wish"});if(a==="equip")return t(co,{onBack:()=>l("home"),onWish:d,onAlbum:k,albumHasUnseen:L,ownedCards:b,ownedLoaded:y,availablePoints:A,pointsLoaded:D});if(a==="album")return t(lo,{onBack:()=>l("home"),onWish:d,onEquip:g,ownedCards:b,ownedLoaded:y,availablePoints:A,pointsLoaded:D});if(H===null||!oe)throw Error("[vibemon] app entered ready state before gacha resources were loaded");let ue=async(e,o)=>{if(C.current||I!=="idle")return;C.current=!0,Q(!0);try{let s;try{s=await Oe(e,o)}catch(i){console.warn("[vibemon] drawGachaPool failed",i),Ce.error(r("draw.failedNetwork"));return}let V=o==="SINGLE"?1:10;if(s.results.length!==V)throw Error(`[vibemon] ${o} draw response must contain ${V} results, received ${s.results.length}`);await Promise.all(s.results.map(async(i)=>{if(i.reward_type==="WHITE_CARD"||!i.vibemon_uuid)return;Object.assign(i,await Ne().assets.resolveImages(i.vibemon_uuid))}));let me=s.results.map(ke),U=[];for(let[i,G]of s.results.entries()){if(G.reward_type==="WHITE_CARD")continue;U.push(G);let q=me[i];if(q?.kind!=="card")throw Error(`[vibemon] draw result ${G.draw_index} was not mapped to a Vibemon card`);new Image().src=ge(o==="SINGLE"?q.singleImageUrl:q.multiImageUrl)}if(Re(me),W(!1),m==="free-draw")R("view-album");if(u("video-waiting"),U.length>0){let i=U[0];if(i===void 0)throw Error("[vibemon] draw result lost its first Vibemon item");so(),ao(i.vibemon_uuid,f),w()}N(),fe().then((i)=>{J(i.available_points),K(!0)}).catch((i)=>console.warn("[vibemon] getPointAccount failed",i))}finally{C.current=!1,Q(!1)}};return F("div",{className:"relative h-full w-full",children:[t(go,{onBack:()=>l("home"),onAlbum:k,onEquip:g,isFirstDraw:f,availablePoints:A,pointsLoaded:D,onSingleDraw:(e)=>void ue(e,"SINGLE"),onMultiDraw:(e)=>void ue(e,"MULTI"),drawDisabled:Ve||I!=="idle",albumHasUnseen:L,guideActive:f&&m==="free-draw",poolCatalog:H}),I!=="intro"&&t(wo,{phase:I,drawnRewards:ye,onVideoStarted:()=>u("video-playing"),onPullDone:()=>u("result"),onPullFailed:()=>u("result"),onResultConfirmed:(e)=>{if(e)j("vibemon.albumHasUnseen",!0),x(!0);u("idle")}})]})}export{jo as VibemonPage};
@@ -14,10 +14,7 @@ type VideoFaderProps = {
14
14
  sources?: never;
15
15
  } | {
16
16
  src?: never;
17
- sources: readonly [
18
- VideoSource,
19
- ...VideoSource[]
20
- ];
17
+ sources: readonly [VideoSource, ...VideoSource[]];
21
18
  });
22
19
  export declare function VideoFader({ src, sources, playing, active, background, onFirstFrame, onComplete, onError }: VideoFaderProps): import("react").JSX.Element;
23
20
  export {};
@@ -1 +1 @@
1
- import{jsx as h,jsxs as q}from"react/jsx-runtime";import{useLayoutEffect as D,useRef as t,useState as M}from"react";var z=1,G=100,H=1000;function P({src:i,sources:l,playing:R=!0,active:a=!0,background:k,onFirstFrame:A,onComplete:L,onError:F}){let m=t(null),_=t(null),c=t(0),p=t(!1),I=t(i===void 0?{sources:l}:{src:i});I.current=i===void 0?{sources:l}:{src:i};let[C,y]=M(0),[O,v]=M(!1),n=i===void 0?l.map((e)=>`${e.type}:${e.src}`).join("|"):i,w=t(n),N=t(L),S=t(A),j=t(F);return N.current=L,S.current=A,j.current=F,D(()=>{let e=m.current;if(e===null)throw Error("Video player is not mounted");if(!a)return;if(p.current=!1,w.current!==n)c.current=0;w.current=n;let o=I.current;if("src"in o)e.src=o.src;else{let u=e.querySelectorAll("source");o.sources.forEach((r,d)=>{u[d].setAttribute("src",r.src)})}e.defaultMuted=!0,e.muted=!0;let s=()=>{p.current=!0};return e.addEventListener("error",s),e.load(),()=>{c.current=e.currentTime,e.removeEventListener("error",s),e.pause(),e.removeAttribute("src");for(let u of e.querySelectorAll("source"))u.removeAttribute("src");e.load()}},[n,a]),D(()=>{let e=m.current,o=_.current;if(e===null||o===null)throw Error("Video player is not mounted");if(o.style.opacity="0",y(0),v(!1),!R){if(c.current=0,a)e.pause(),e.currentTime=0;return}if(!a)return;e.currentTime=c.current;let s=!1,u=!1,r=!1,d=!1,E=null,T=null,b=null,V=()=>{if(u||!e.duration)return;if(e.duration-e.currentTime<z)u=!0,y(1)},x=()=>{if(r)return;T=setTimeout(()=>{v(!0),y(0),b=setTimeout(()=>{if(r)return;r=!0,N.current()},H)},G)},f=()=>{if(s||r)return;r=!0,v(!0),j.current()};if(E=e.requestVideoFrameCallback(()=>{if(s||r||d||e.dataset.sourceKey!==n)return;d=!0,o.style.opacity="1",S.current()}),e.addEventListener("timeupdate",V),e.addEventListener("ended",x),e.addEventListener("error",f),p.current)f();else e.play().catch(f);return()=>{if(s=!0,e.removeEventListener("timeupdate",V),e.removeEventListener("ended",x),e.removeEventListener("error",f),E!==null)e.cancelVideoFrameCallback(E);if(T)clearTimeout(T);if(b)clearTimeout(b)}},[n,R,a]),q("div",{ref:_,"data-video-presentation":!0,className:"pointer-events-none absolute inset-0 z-20",style:{opacity:0,background:k},children:[h("video",{ref:m,"data-source-key":n,preload:"auto",muted:!0,playsInline:!0,className:"absolute inset-0 z-20 h-full w-full object-cover",style:{visibility:O?"hidden":"visible"},children:l===void 0?null:l.map((e)=>h("source",{type:e.type},`${e.type}:${e.src}`))}),h("div",{className:"pointer-events-none absolute inset-0 z-20 bg-white transition-opacity duration-1000 ease-in",style:{opacity:C}})]})}export{P as VideoFader};
1
+ import{jsx as h,jsxs as q}from"react/jsx-runtime";import{useLayoutEffect as D,useRef as t,useState as M}from"react";var z=1,G=100,H=1000;function P({src:u,sources:l,playing:R=!0,active:a=!0,background:k,onFirstFrame:A,onComplete:L,onError:F}){let m=t(null),_=t(null),c=t(0),p=t(!1),I=t(u===void 0?{sources:l}:{src:u});I.current=u===void 0?{sources:l}:{src:u};let[C,y]=M(0),[O,v]=M(!1),n=u??l.map((e)=>`${e.type}:${e.src}`).join("|"),w=t(n),N=t(L),S=t(A),j=t(F);return N.current=L,S.current=A,j.current=F,D(()=>{let e=m.current;if(e===null)throw Error("Video player is not mounted");if(!a)return;if(p.current=!1,w.current!==n)c.current=0;w.current=n;let o=I.current;if("src"in o)e.src=o.src;else{let s=e.querySelectorAll("source");o.sources.forEach((r,d)=>{s[d].setAttribute("src",r.src)})}e.defaultMuted=!0,e.muted=!0;let i=()=>{p.current=!0};return e.addEventListener("error",i),e.load(),()=>{c.current=e.currentTime,e.removeEventListener("error",i),e.pause(),e.removeAttribute("src");for(let s of e.querySelectorAll("source"))s.removeAttribute("src");e.load()}},[n,a]),D(()=>{let e=m.current,o=_.current;if(e===null||o===null)throw Error("Video player is not mounted");if(o.style.opacity="0",y(0),v(!1),!R){if(c.current=0,a)e.pause(),e.currentTime=0;return}if(!a)return;e.currentTime=c.current;let i=!1,s=!1,r=!1,d=!1,E=null,T=null,b=null,V=()=>{if(s||!e.duration)return;if(e.duration-e.currentTime<z)s=!0,y(1)},x=()=>{if(r)return;T=setTimeout(()=>{v(!0),y(0),b=setTimeout(()=>{if(r)return;r=!0,N.current()},H)},G)},f=()=>{if(i||r)return;r=!0,v(!0),j.current()};if(E=e.requestVideoFrameCallback(()=>{if(i||r||d||e.dataset.sourceKey!==n)return;d=!0,o.style.opacity="1",S.current()}),e.addEventListener("timeupdate",V),e.addEventListener("ended",x),e.addEventListener("error",f),p.current)f();else e.play().catch(f);return()=>{if(i=!0,e.removeEventListener("timeupdate",V),e.removeEventListener("ended",x),e.removeEventListener("error",f),E!==null)e.cancelVideoFrameCallback(E);if(T)clearTimeout(T);if(b)clearTimeout(b)}},[n,R,a]),q("div",{ref:_,"data-video-presentation":!0,className:"pointer-events-none absolute inset-0 z-20",style:{opacity:0,background:k},children:[h("video",{ref:m,"data-source-key":n,preload:"auto",muted:!0,playsInline:!0,className:"absolute inset-0 z-20 h-full w-full object-cover",style:{visibility:O?"hidden":"visible"},children:l===void 0?null:l.map((e)=>h("source",{type:e.type},`${e.type}:${e.src}`))}),h("div",{className:"pointer-events-none absolute inset-0 z-20 bg-white transition-opacity duration-1000 ease-in",style:{opacity:C}})]})}export{P as VideoFader};
@@ -1 +1 @@
1
- import{jsx as t,jsxs as a}from"react/jsx-runtime";import{newTag as r,wishDefault as i,wishHover as l}from"../assets.js";import{useState as m}from"react";import{Button as c}from"../ui/button.js";import{cn as p}from"../lib/utils.js";function w({onClick:o,className:s}){let[n,e]=m(!1);return a(c,{"aria-label":"Wish",variant:"ghost",className:p("relative size-[64px] p-0 hover:bg-transparent",s),onClick:o,onMouseEnter:()=>e(!0),onMouseLeave:()=>e(!1),children:[t("img",{src:n?l:i,alt:"",className:"absolute top-[5.439%] left-[4.863%] h-[89.122%] w-[90.27%] max-w-none object-contain select-none"}),t("img",{src:r,alt:"",className:"pointer-events-none absolute top-[4.422%] left-[50.578%] h-[26.03%] w-[49.428%] max-w-none select-none"})]})}export{w as WishButton};
1
+ import{jsx as t,jsxs as a}from"react/jsx-runtime";import{useState as r}from"react";import{newTag as i,wishDefault as l,wishHover as m}from"../assets.js";import{cn as c}from"../lib/utils.js";import{Button as p}from"../ui/button.js";function w({onClick:o,className:s}){let[n,e]=r(!1);return a(p,{"aria-label":"Wish",variant:"ghost",className:c("relative size-[64px] p-0 hover:bg-transparent",s),onClick:o,onMouseEnter:()=>e(!0),onMouseLeave:()=>e(!1),children:[t("img",{src:n?m:l,alt:"",className:"absolute top-[5.439%] left-[4.863%] h-[89.122%] w-[90.27%] max-w-none object-contain select-none"}),t("img",{src:i,alt:"",className:"pointer-events-none absolute top-[4.422%] left-[50.578%] h-[26.03%] w-[49.428%] max-w-none select-none"})]})}export{w as WishButton};
@@ -2,7 +2,7 @@ import { Button as ButtonPrimitive } from "@base-ui/react/button";
2
2
  import { type VariantProps } from "class-variance-authority";
3
3
  declare const buttonVariants: (props?: ({
4
4
  variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
5
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
5
+ size?: "icon" | "default" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  declare function Button({ className, variant, size, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
8
8
  export { Button, buttonVariants };
@@ -1 +1 @@
1
- import{jsx as a}from"react/jsx-runtime";import{Button as n}from"@base-ui/react/button";import{cva as d}from"class-variance-authority";import{cn as o}from"cn";var s=d("group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function g({className:e,variant:r="default",size:i="default",...t}){return a(n,{"data-slot":"button",className:o(s({variant:r,size:i,className:e})),...t})}export{g as Button,s as buttonVariants};
1
+ import{jsx as a}from"react/jsx-runtime";import{Button as n}from"@base-ui/react/button";import{cva as d}from"class-variance-authority";import{cn as o}from"cn";var s=d("group/button focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:ring-3 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 shadow-xs",secondary:"bg-secondary text-secondary-foreground aria-expanded:bg-secondary aria-expanded:text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function g({className:e,variant:r="default",size:i="default",...t}){return a(n,{"data-slot":"button",className:o(s({variant:r,size:i,className:e})),...t})}export{g as Button,s as buttonVariants};
@@ -8,4 +8,4 @@ declare function CardDescription({ className, ...props }: React.ComponentProps<"
8
8
  declare function CardAction({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
9
9
  declare function CardContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
10
10
  declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
- export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
11
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent };