@alwith/module-auth 0.1.6 → 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.
- package/README.md +21 -1
- package/THIRD_PARTY_NOTICES.md +3 -2
- package/dist/pets/assets.d.ts +34 -3
- package/dist/pets/assets.js +1 -1
- package/dist/pets/client.d.ts +1 -0
- package/dist/pets/client.js +1 -1
- package/dist/pets/core/host.d.ts +1 -0
- package/dist/pets/core/lib/draw-result.js +1 -1
- package/dist/pets/core/lib/endpoints.d.ts +28 -1
- package/dist/pets/core/lib/gacha-pools.js +1 -1
- package/dist/pets/core/lib/loading-progress.d.ts +0 -1
- package/dist/pets/core/lib/loading-progress.js +1 -1
- package/dist/pets/core/lib/preload-images.js +1 -1
- package/dist/pets/core/lib/resource-sync.js +1 -1
- package/dist/pets/core/lib/sprite-config.js +1 -1
- package/dist/pets/core/lib/vibemon-resources.js +1 -1
- package/dist/pets/core/types.d.ts +1 -0
- package/dist/pets/host.d.ts +3 -0
- package/dist/pets/react/components/equip-view.js +1 -1
- package/dist/pets/react/components/pet-window.js +1 -1
- package/dist/pets/react/components/pull-overlay.js +1 -1
- package/dist/pets/react/components/pull-view.js +1 -1
- package/dist/pets/react/components/sprite-renderer.d.ts +2 -1
- package/dist/pets/react/components/sprite-renderer.js +1 -1
- package/dist/pets/react/components/vibemon-page.js +1 -1
- package/dist/pets/react/ui/button.d.ts +1 -1
- package/dist/pets/resource-package.d.ts +27 -0
- package/dist/pets/resource-package.js +1 -0
- package/dist/pets/resources.d.ts +16 -16
- package/dist/pets/resources.js +1 -1
- package/dist/pets/sheet-layout.d.ts +10 -0
- package/dist/pets/sheet-layout.js +1 -0
- package/dist/pets/types.d.ts +21 -9
- package/licenses/fflate-MIT.txt +21 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -49,7 +49,27 @@ the UI thread must remain available to render animation frames during dragging.
|
|
|
49
49
|
Prompt responses acknowledge acceptance; runtime state establishes completion.
|
|
50
50
|
Only live transitions trigger completion animation, not replayed snapshots.
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
Format 1 resources are downloaded from `resource_url` as complete ZIP packages.
|
|
53
|
+
The cache retains the ZIP, manifest, images and animation together, and compares
|
|
54
|
+
format, revision and source URL against a fresh API descriptor before reuse.
|
|
55
|
+
Paths, SHA-256 hashes, image decoding and animation bounds are validated before
|
|
56
|
+
replacing the installed directory. Failed updates retain the previous package;
|
|
57
|
+
missing optional images and animation use static placeholders.
|
|
58
|
+
|
|
59
|
+
Fresh gacha pool items can supply `vibemon_resource_url`: an unchanged immutable
|
|
60
|
+
URL reuses a validated format-1 cache without another detail request. Cold caches,
|
|
61
|
+
changed URLs and legacy resources still fetch the descriptor to determine format
|
|
62
|
+
and revision. Entry loading includes the home and Wish images so opening Wish
|
|
63
|
+
does not start a second loading screen.
|
|
64
|
+
Draw results fetch
|
|
65
|
+
`/api/v1/vibemons/{uuid}` to obtain the full package descriptor. Format 0 and
|
|
66
|
+
missing format fields continue to use legacy sheet resources.
|
|
67
|
+
|
|
68
|
+
Hosts may supply `resources.url` to serve cached images directly and
|
|
69
|
+
`validateImage` to validate their platform decoder before installation.
|
|
70
|
+
`onResourceError` reports failed updates without discarding existing resources.
|
|
71
|
+
|
|
72
|
+
Legacy asset caches store layout, sheet identity and resource version. Playback defaults
|
|
53
73
|
are generated by `createSpriteConfig` in the core entry. `spriteConfig` preserves
|
|
54
74
|
legacy `config.json` timing, crop, facing and behavior overrides without rewriting
|
|
55
75
|
existing caches. Storage keys and account cache paths remain unchanged.
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -11,8 +11,9 @@ artifact. Versions below record the local release-preparation inventory; declare
|
|
|
11
11
|
ranges can resolve to different versions. Keep the notices from the versions
|
|
12
12
|
actually distributed by your application, including transitive dependencies.
|
|
13
13
|
|
|
14
|
-
| Package | Inspected version | License | Included license copy
|
|
15
|
-
| ------- | ----------------- | ------- |
|
|
14
|
+
| Package | Inspected version | License | Included license copy |
|
|
15
|
+
| ------- | ----------------- | ------- | ----------------------- |
|
|
16
|
+
| fflate | 0.8.3 | MIT | licenses/fflate-MIT.txt |
|
|
16
17
|
|
|
17
18
|
The pet React entry uses the external dependencies and optional React peers declared in `package.json`. Asset and core entries do not load React.
|
|
18
19
|
|
package/dist/pets/assets.d.ts
CHANGED
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
import { type PetAssetsHost } from "./host.js";
|
|
2
|
-
import type { MyVibemonItem, VibemonCatalogItem } from "./types.js";
|
|
2
|
+
import type { MyVibemonItem, VibemonCatalogItem, VibemonResourceDescriptor } from "./types.js";
|
|
3
3
|
export declare function createPetAssets(host: PetAssetsHost): {
|
|
4
|
-
getMyVibemons: (params?: Parameters<(params?: import("./types").GetMyVibemonsParams) => Promise<MyVibemonItem[]>>[0]) => Promise<
|
|
4
|
+
getMyVibemons: (params?: Parameters<(params?: import("./types").GetMyVibemonsParams) => Promise<MyVibemonItem[]>>[0]) => Promise<{
|
|
5
|
+
resource_url?: string | null;
|
|
6
|
+
resource_package_format?: number | null;
|
|
7
|
+
resource_version?: number | null;
|
|
8
|
+
sheet_url?: string | null;
|
|
9
|
+
layout?: string | null;
|
|
10
|
+
multi_draw_url?: string | null;
|
|
11
|
+
vibemon_uuid: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string | null;
|
|
14
|
+
rarity_code: string;
|
|
15
|
+
rarity_name: string;
|
|
16
|
+
rarity_color: string;
|
|
17
|
+
category_code: string;
|
|
18
|
+
category_name: string;
|
|
19
|
+
cover_url: string;
|
|
20
|
+
gacha_url: string | null;
|
|
21
|
+
icon_url: string | null;
|
|
22
|
+
background_url: string | null;
|
|
23
|
+
pool_card_url: string | null;
|
|
24
|
+
sidebar_selected_url: string | null;
|
|
25
|
+
sidebar_hover_url: string | null;
|
|
26
|
+
sidebar_unselected_url: string | null;
|
|
27
|
+
is_limited: number;
|
|
28
|
+
is_equipped: boolean;
|
|
29
|
+
obtained_time: string;
|
|
30
|
+
duplicate_count: number;
|
|
31
|
+
}[]>;
|
|
5
32
|
getVibemonCatalog: () => Promise<VibemonCatalogItem[]>;
|
|
33
|
+
getVibemonDetail: (id: string) => Promise<VibemonCatalogItem>;
|
|
34
|
+
resolveImages: (id: string, resourceUrl?: string | null) => Promise<Record<string, string | null>>;
|
|
6
35
|
resources: {
|
|
7
36
|
inspect: (petId: string) => Promise<import("./resources").CachedPetMetadata | null>;
|
|
37
|
+
visuals: (metadata: import("./resources").CachedPetMetadata) => Promise<Partial<Record<import("./resource-package").ImageAsset, string | null>>>;
|
|
38
|
+
preview(metadata: import("./resources").CachedPetMetadata): Promise<Uint8Array<ArrayBufferLike> | null>;
|
|
8
39
|
cached: (petId: string) => Promise<import("./resources").CachedPetResource | null>;
|
|
9
|
-
ensure: (item:
|
|
40
|
+
ensure: (item: VibemonResourceDescriptor) => Promise<import("./resources").CachedPetResource>;
|
|
10
41
|
cancel: () => void;
|
|
11
42
|
dispose(): void;
|
|
12
43
|
};
|
package/dist/pets/assets.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createPetClient as
|
|
1
|
+
import{createPetClient as k}from"./client.js";import{accountKey as V,assertAccount as s}from"./host.js";import{IMAGE_ASSETS as q}from"./resource-package.js";import{createPetResources as C}from"./resources.js";import{createPetSelection as x}from"./selection.js";function N(o){let w=k(o),a=C(o),p=new Map,f=new Map,u=null,m=!1,g=0,d=null,y="",S=!1,_=0,b=new Set;function l(){_++;for(let e of b)e()}function c(){if(S)throw Error("Vibemon asset service disposed");let e=o.account(),n=e===null?"":`${V(e)}/${e.revision}`;if(y!==n)y=n,u=null,m=!1,g++,d=null,a.cancel();return e}async function v(e){let n=c(),r=e===void 0?++g:g,t=await w.getMyVibemons(e);if(n===null)throw Error("Sign in to use Vibemon");if(s(o,n),c(),e===void 0&&r===g)u=t,m=!0,await o.storage.set(`vibemon.owned.${V(n)}`,t),s(o,n),l();return Promise.all(t.map(async(i)=>({...i,...await h({...i,uuid:i.vibemon_uuid})})))}async function I(){let e=c();if(e===null)return null;if(m)return u;let n=await o.storage.get(`vibemon.owned.${V(e)}`);return s(o,e),u=n??null,l(),u}async function M(){let e=c(),n=await w.getVibemonCatalog();if(e===null)throw Error("Sign in to use Vibemon");return s(o,e),c(),d=n,l(),n}async function E(e){let n=(p.get(e)??0)+1;p.set(e,n);let r=await w.getVibemonDetail(e);if(p.get(e)!==n)throw Error("Vibemon detail request superseded");if(r.uuid!==e)throw Error("Vibemon detail ID mismatch");return r}async function R(e){let n=c();if(n===null)throw Error("Sign in to use Vibemon");try{return await a.ensure(e)}catch(r){s(o,n),o.onResourceError?.(r,e.uuid);let t=await a.cached(e.uuid);if(t!==null)return t;throw r}}async function h(e){if((e.resource_package_format??0)===0)return{};let n=c();if(n===null)throw Error("Sign in to use Vibemon");try{let r=await R(e),t=await a.visuals(r);return s(o,n),Object.fromEntries(q.filter((i)=>(i in t)).map((i)=>[`${i}_url`,t[i]??null]))}catch{return s(o,n),Object.fromEntries(q.map((r)=>[`${r}_url`,null]))}}async function P(e){let n=c();if(n===null)throw Error("Sign in to use Vibemon");try{let r=await E(e);return await h(r)}catch(r){s(o,n),o.onResourceError?.(r,e);let t=await a.inspect(e);if(t===null)return{};let i=await a.visuals(t);return Object.fromEntries(Object.entries(i).map(([A,D])=>[`${A}_url`,D]))}}function j(e,n){c();let r=JSON.stringify([y,e,n??null]),t=f.get(r);if(t)return t;let i=P(e).finally(()=>{if(f.get(r)===i)f.delete(r)});return f.set(r,i),i}let O=x(o,async(e)=>{if(c(),m&&u?.some((n)=>n.vibemon_uuid===e))return u;return v()});return{...w,getMyVibemons:v,getVibemonCatalog:M,getVibemonDetail:E,resolveImages:j,resources:a,restoreOwned:I,get revision(){return _},snapshot:()=>({account:c(),owned:u,catalog:d}),invalidate(){c(),l()},subscribe(e){return b.add(e),()=>{b.delete(e)}},selection:{get:O.get,async select(e){c(),await O.select(e),l()}},async ensureResource(e){let n=c();if(n===null)throw Error("Sign in to use Vibemon");if(!(u??await v()).some((t)=>t.vibemon_uuid===e))throw Error("This account does not own this Vibemon");try{let t=await E(e);return s(o,n),await R(t)}catch(t){s(o,n);let i=await a.cached(e);if(i!==null)return o.onResourceError?.(t,e),i;throw t}},dispose(){S=!0,u=null,d=null,a.dispose(),l(),b.clear()}}}export{N as createPetAssets};
|
package/dist/pets/client.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type PetAssetsHost } from "./host.js";
|
|
2
2
|
import type { DrawResponse, DrawType, GachaFirstDrawResponse, GachaPoolDetailResponse, GachaPoolSummary, GetMyVibemonsParams, MyVibemonItem, PointAccountData, VibemonCatalogItem, VibemonFirstVisitResponse } from "./types.js";
|
|
3
3
|
export declare function createPetClient(host: Pick<PetAssetsHost, "account" | "request">): {
|
|
4
|
+
getVibemonDetail: (id: string) => Promise<VibemonCatalogItem>;
|
|
4
5
|
getVibemonCatalog: () => Promise<VibemonCatalogItem[]>;
|
|
5
6
|
getMyVibemons: (params?: GetMyVibemonsParams) => Promise<MyVibemonItem[]>;
|
|
6
7
|
markVibemonFirstVisit: () => Promise<VibemonFirstVisitResponse>;
|
package/dist/pets/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assertAccount as s}from"./host.js";function l(o){async function a
|
|
1
|
+
import{assertAccount as s}from"./host.js";function l(o){async function e(a,t,c){let i=o.account();if(i===null)throw Error("Sign in to use Vibemon");let n=await o.request(a,t,c);return s(o,i),n}let r=!1;return{getVibemonDetail:(a)=>e(`/api/v1/vibemons/${encodeURIComponent(a)}`,"GET"),getVibemonCatalog:()=>e("/api/v1/vibemons/catalog","GET"),getMyVibemons:(a={})=>{let t=new URLSearchParams;for(let[i,n]of Object.entries(a))if(n!==void 0)t.set(i,String(n));let c=t.size>0?`?${t}`:"";return e(`/api/v1/vibemons/mine${c}`,"GET")},markVibemonFirstVisit:()=>e("/api/v1/vibemons/first-visit","POST"),getGachaFirstDraw:()=>e("/api/v1/gacha/first-draw","GET"),getActiveGachaPools:()=>e("/api/v1/gacha/pools","GET"),getGachaPoolDetail:(a)=>e(`/api/v1/gacha/pools/${encodeURIComponent(a)}`,"GET"),getPointAccount:()=>e("/api/v1/points/account","GET"),async drawGachaPool(a,t){if(r)throw Error("A draw is already pending");r=!0;try{return await e("/api/v1/gacha/draw","POST",{pool_uuid:a,draw_type:t})}finally{r=!1}}}}export{l as createPetClient};
|
package/dist/pets/core/host.d.ts
CHANGED
|
@@ -110,6 +110,7 @@ export declare function configureVibemon(value: VibemonHost): () => void;
|
|
|
110
110
|
export declare function vibemonHost(): VibemonHost;
|
|
111
111
|
export declare function sameBinding(left: PetBinding, right: PetBinding): boolean;
|
|
112
112
|
export interface SpriteResource {
|
|
113
|
+
staticImage?: boolean;
|
|
113
114
|
config: VibemonSpriteConfig;
|
|
114
115
|
spriteUrl: string;
|
|
115
116
|
dispose: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var i=(r)=>{if(r==="R"||r==="SR"||r==="SSR")return r;throw Error(`[vibemon] unsupported draw rarity: ${r}`)},a=(r,n,e)=>{if(r===null)throw Error(`[vibemon] drawn white card at index ${n.draw_index} is missing ${e}`);return r},d=(r)=>({kind:"card",drawIndex:r.draw_index,vibemonUuid:r.vibemon_uuid,vibemonName:r.vibemon_name,singleImageUrl:r.gacha_url??"",multiImageUrl:r.multi_draw_url??"",rarity:i(r.rarity_code),isNew:!r.is_duplicate}),u=(r)=>{if(r==="UC"||r==="C")return r;throw Error(`[vibemon] unsupported white-card rarity: ${r}`)},w=(r)=>{if(r.reward_type!=="WHITE_CARD"){if(!r.vibemon_uuid)throw Error("Vibemon draw result is missing its ID");return d(r)}return{kind:"white-card",drawIndex:r.draw_index,rarity:u(r.rarity_code),exchangePoints:r.exchange_points,singleImageUrl:a(r.gacha_url,r,"gacha_url"),multiImageUrl:a(r.multi_draw_url,r,"multi_draw_url")}};export{w as createDrawReward};
|
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
export type * from "../../index.js";
|
|
2
|
-
export declare const getMyVibemons: () => Promise<
|
|
2
|
+
export declare const getMyVibemons: () => Promise<{
|
|
3
|
+
resource_url?: string | null;
|
|
4
|
+
resource_package_format?: number | null;
|
|
5
|
+
resource_version?: number | null;
|
|
6
|
+
sheet_url?: string | null;
|
|
7
|
+
layout?: string | null;
|
|
8
|
+
multi_draw_url?: string | null;
|
|
9
|
+
vibemon_uuid: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string | null;
|
|
12
|
+
rarity_code: string;
|
|
13
|
+
rarity_name: string;
|
|
14
|
+
rarity_color: string;
|
|
15
|
+
category_code: string;
|
|
16
|
+
category_name: string;
|
|
17
|
+
cover_url: string;
|
|
18
|
+
gacha_url: string | null;
|
|
19
|
+
icon_url: string | null;
|
|
20
|
+
background_url: string | null;
|
|
21
|
+
pool_card_url: string | null;
|
|
22
|
+
sidebar_selected_url: string | null;
|
|
23
|
+
sidebar_hover_url: string | null;
|
|
24
|
+
sidebar_unselected_url: string | null;
|
|
25
|
+
is_limited: number;
|
|
26
|
+
is_equipped: boolean;
|
|
27
|
+
obtained_time: string;
|
|
28
|
+
duplicate_count: number;
|
|
29
|
+
}[]>;
|
|
3
30
|
export declare const getVibemonCatalog: () => Promise<import("./endpoints").VibemonCatalogItem[]>;
|
|
4
31
|
export declare const getPointAccount: () => Promise<import("./endpoints").PointAccountData>;
|
|
5
32
|
export declare const getGachaFirstDraw: () => Promise<import("./endpoints").GachaFirstDrawResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getActiveGachaPools as
|
|
1
|
+
import{vibemonHost as d}from"../host.js";import{getActiveGachaPools as f,getGachaPoolDetail as m}from"./endpoints.js";var i={SSR:5,SR:4,R:3,UC:2,C:1};function u(e){let t=e.items.filter((o)=>(o.reward_type==="VIBEMON"||o.reward_type==null)&&Boolean(o.vibemon_uuid)&&o.status===1),r=t[0];if(r===void 0)throw Error(`[vibemon] gacha pool ${e.uuid} has no active Vibemon item`);return t.slice(1).reduce((o,a)=>{if(i[a.rarity_code]-i[o.rarity_code]>0)return a;return o},r)}function _(e,t){if(t.uuid!==e.uuid)throw Error(`[vibemon] gacha pool detail UUID ${t.uuid} does not match catalog UUID ${e.uuid}`);if(t.multi_count!==10)throw Error(`[vibemon] gacha pool ${t.uuid} multi_count must be 10, received ${t.multi_count}`);let r=u(t);return{poolUuid:t.uuid,name:t.name,sidebarSelectedImageUrl:r.vibemon_sidebar_selected_url??"",sidebarHoverImageUrl:r.vibemon_sidebar_hover_url??"",sidebarUnselectedImageUrl:r.vibemon_sidebar_unselected_url??"",pageBackgroundImageUrl:r.vibemon_background_url??"",poolCardImageUrl:r.vibemon_pool_card_url??"",status:t.status===1?"ACTIVE":"UNAVAILABLE",startsAt:e.start_time,endsAt:e.end_time,singlePrice:t.next_single_actual_cost??e.single_cost,multiPrice:t.next_multi_actual_cost??e.multi_cost,currencyType:e.currency_type,canDraw:t.status===1,isDefault:e.is_default===1}}function g(e,t){if(e.length===0)throw Error("[vibemon] active gacha pool catalog is empty");let r=new Map(t.map((a)=>[a.uuid,a]));return{pools:[...e].toSorted((a,n)=>a.sort_order-n.sort_order).map((a)=>{let n=r.get(a.uuid);if(n===void 0)throw Error(`[vibemon] gacha pool ${a.uuid} is missing its detail response`);return _(a,n)})}}function h(e){let t=e.pools.flatMap((r)=>[r.sidebarSelectedImageUrl,r.sidebarHoverImageUrl,r.sidebarUnselectedImageUrl,r.poolCardImageUrl,r.pageBackgroundImageUrl]);return[...new Set(t.filter(Boolean))]}async function U(){let t=[...await f()].toSorted((o,a)=>o.sort_order-a.sort_order),r=await Promise.all(t.map((o)=>m(o.uuid)));return await Promise.all(r.map(async(o)=>{let a=u(o),n=await d().assets.resolveImages(a.vibemon_uuid,a.vibemon_resource_url);for(let[c,l]of Object.entries(n))Object.assign(a,{[`vibemon_${c}`]:l})})),g(t,r)}function s(e,t,r){let o=Date.parse(t);if(Number.isNaN(o))throw Error(`[vibemon] gacha pool ${e.poolUuid} has invalid ${r}: ${t}`);return o}function b(e,t){if(e.status==="UNAVAILABLE")return e.status;if(e.startsAt!==null&&t<s(e,e.startsAt,"startsAt"))return"UPCOMING";if(e.endsAt!==null&&t>=s(e,e.endsAt,"endsAt"))return"ENDED";return e.status}function w(e){let t=e.find((o)=>o.isDefault);if(t!==void 0)return t;let r=e[0];if(r===void 0)throw Error("[vibemon] gacha pool catalog has no visible pools");return r}function I(e,t){return e.filter((r)=>b(r,t)!=="ENDED")}export{g as createGachaPoolCatalog,h as gachaPoolImageUrls,w as getDefaultGachaPool,I as getVisibleGachaPools,U as loadGachaPoolCatalog,b as resolveGachaPoolStatus};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function r(n,o,c){let t=Math.min(1,Math.max(0,o)),a=Math.min(t,n+Math.max(0,t-n)*12*c);return t===1&&a>=0.999?1:a}export{r as advanceLoadingProgress};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
var t=new Map;function i(e){let n=t.get(e);if(n)return t.delete(e),t.set(e,n),n;let a=new Image;a.src=e;let o=a.decode().then(()=>a).catch((s)=>{if(t.get(e)===o)t.delete(e);throw Error(`[vibemon] preload failed: ${e}`,{cause:s})});if(t.set(e,o),t.size>64)t.delete(t.keys().next().value);return o}async function c(e,n){let a=0;await Promise.all(e.map(async(o)=>{await i(o),n(++a)}))}export{c as preloadImages};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createStore as m}from"zustand/vanilla";import{accountKey as h}from"../../index.js";import{vibemonHost as
|
|
1
|
+
import{createStore as m}from"zustand/vanilla";import{accountKey as h,matchesResource as S}from"../../index.js";import{vibemonHost as g}from"../host.js";var f=m(()=>({status:"idle"})),x=()=>f.getState().status,b=(e)=>f.setState({status:e}),z=(e)=>f.subscribe((n)=>e(n.status)),c=null;async function E(){let e=g();if(e.synchronizeResources!==void 0)return e.synchronizeResources();let n=e.account();if(n===null)return;let u=`${h(n)}/${n.revision}`,o=()=>{let t=e.account();return t!==null&&`${h(t)}/${t.revision}`===u};if(c?.scope===u)return c.operation;let a=(t)=>{if(o())b(t)},p=(t,s)=>{if(!o())return;if(e.onResourceSyncError)e.onResourceSyncError(t,s);else console.warn("[vibemon] resource sync failed",s,t)},l=(async()=>{a("checking");try{let t=await e.assets.getVibemonCatalog();if(!o())return;let s=new Set,y=0,d=!1;if(await Promise.all(Array.from({length:Math.min(6,t.length)},async()=>{while(o()&&y<t.length){let r=t[y++];try{let i=await e.assets.resources.inspect(r.uuid);if(i&&S(i,r))continue;a("updating"),await e.assets.resources.ensure(r),s.add(r.uuid)}catch(i){d=!0,p(i,{phase:"resource",petId:r.uuid})}}})),o())try{await e.resourcesSynchronized?.(s)}catch(r){if(o())e.onError(r)}a(d?"error":s.size===0?"idle":"done")}catch(t){a("error"),p(t,{phase:"catalog"})}})();c={scope:u,operation:l};try{await l}finally{if(c?.operation===l)c=null}}export{b as observeResourceSync,x as resourceSyncStatus,z as subscribeResourceSync,E as syncVibemonResources,f as vibemonSyncStore};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var f={working:{fps:7,loop:!0},empty:{fps:6,loop:!0},done:{fps:7,loop:!1},wait:{fps:7,loop:!0},drag:{fps:7,loop:!0},error:{fps:7,loop:!0},hover:{fps:6,loop:!0}};function s(i,t,r){let n=r.states.map((o)=>o.id),e=(...o)=>o.find((m)=>n.includes(m))??n[0],a={idle:e("empty","working"),"idle-alt":e("empty","working"),groom:e("empty","working"),"groom-alt":e("empty","working"),run:e("drag","working"),sleep:e("empty","working"),sit:e("working","empty"),interact:e("done","hover","empty"),jump:e("done","empty"),scared:e("drag","empty"),wait:e("wait","empty"),error:e("error","wait","empty"),hover:e("hover","empty")},p=r.frameWidth;return{name:i,frameSize:p,frameHeight:r.frameHeight,renderSize:p,cropX:0,cropY:0,cropW:p,cropH:r.frameHeight,spritesheet:t,facing:"right",behaviorMap:a,states:r.states.map((o)=>({...o,...f[o.id]??{fps:6,loop:!0}}))}}function g(i,t){if(t.config!==void 0)return t.config;if(t.sheetName===null||t.layout===null)throw Error("Vibemon has no animation");return s(t.name??i,t.sheetName,t.layout)}export{s as createSpriteConfig,g as spriteConfig};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{vibemonHost as
|
|
1
|
+
import{imageInfo as f}from"../../resource-package.js";import{vibemonHost as c}from"../host.js";import{createSpriteConfig as m,spriteConfig as p}from"./sprite-config.js";async function U(e){return await c().assets.resources.inspect(e)!==null}async function g(e){let r=c().assets,t=await r.resources.cached(e)??await r.ensureResource(e);if(t.sheet===null){let o=await r.resources.preview(t),n=o?URL.createObjectURL(new Blob([new Uint8Array(o).buffer],{type:f(o).mime})):"";return{config:m(t.name??e,"",{frameWidth:256,frameHeight:256,states:[{id:"static",row:0,frames:1}]}),spriteUrl:n,staticImage:!0,dispose:()=>{if(n)URL.revokeObjectURL(n)}}}let s=t.sheet,a=s[0]===137&&s[1]===80,i=URL.createObjectURL(new Blob([new Uint8Array(s).buffer],{type:a?"image/png":"image/webp"}));return{config:p(e,t),spriteUrl:i,dispose:()=>URL.revokeObjectURL(i)}}export{g as loadVibemonResource,U as verifyVibemonResource};
|
|
@@ -24,6 +24,7 @@ export declare const DEFAULT_VIBEMON_WINDOW_SIZE = 200;
|
|
|
24
24
|
export declare const DEFAULT_VIBEMON_BUBBLE_HEIGHT = 320;
|
|
25
25
|
export interface VibemonSpriteConfig {
|
|
26
26
|
name: string;
|
|
27
|
+
frameHeight?: number;
|
|
27
28
|
frameSize: number;
|
|
28
29
|
renderSize: number;
|
|
29
30
|
cropX: number;
|
package/dist/pets/host.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface PetStorage {
|
|
|
8
8
|
set: (key: string, value: unknown) => Promise<void>;
|
|
9
9
|
}
|
|
10
10
|
export interface PetResourceIO {
|
|
11
|
+
url?: (path: string) => Promise<string>;
|
|
11
12
|
exists: (path: string) => Promise<boolean>;
|
|
12
13
|
read: (path: string) => Promise<Uint8Array | null>;
|
|
13
14
|
write: (path: string, bytes: Uint8Array) => Promise<void>;
|
|
@@ -19,6 +20,8 @@ export interface PetAssetsHost {
|
|
|
19
20
|
request: <T>(path: string, method: "GET" | "POST", body?: unknown) => Promise<T>;
|
|
20
21
|
storage: PetStorage;
|
|
21
22
|
resources: PetResourceIO;
|
|
23
|
+
onResourceError?: (error: unknown, petId: string) => void;
|
|
24
|
+
validateImage?: (bytes: Uint8Array, mime: string) => Promise<void>;
|
|
22
25
|
download: (url: string, signal: AbortSignal) => Promise<Uint8Array>;
|
|
23
26
|
}
|
|
24
27
|
export declare function accountKey(account: PetAccount): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as
|
|
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 E,jsxs as
|
|
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{motion as y,useInView as H}from"motion/react";import{useEffect as E,useRef as L,useState as p}from"react";import{multiDrawSrBackground as J,multiDrawSsrBackground as Q,newTag as F,pullTexture as A,resultAura as X}from"../assets.js";import{cardThumb as O}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,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:J,SSR:Q},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=H(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(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: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(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: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: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(M,{children:[n("img",{src:O(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:O(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{motion as
|
|
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};
|
|
@@ -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
|
|
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
|
|
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};
|
|
@@ -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?: "
|
|
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 };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PetAssetsHost } from "./host.js";
|
|
2
|
+
import { type SheetLayout } from "./sheet-layout.js";
|
|
3
|
+
export declare const IMAGE_ASSETS: readonly ["cover", "gacha", "multi_draw", "icon", "background", "pool_card", "sidebar_selected", "sidebar_hover", "sidebar_unselected"];
|
|
4
|
+
export type ImageAsset = (typeof IMAGE_ASSETS)[number];
|
|
5
|
+
export interface PackageAsset {
|
|
6
|
+
path: string;
|
|
7
|
+
sha256: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PackageManifest {
|
|
10
|
+
format_version: 1;
|
|
11
|
+
assets: Record<string, PackageAsset>;
|
|
12
|
+
}
|
|
13
|
+
export declare const PACKAGE_LIMIT: number;
|
|
14
|
+
export declare function resourcePath(path: string): boolean;
|
|
15
|
+
export declare function sha256(bytes: Uint8Array): Promise<string>;
|
|
16
|
+
export declare function parseManifest(bytes: Uint8Array): PackageManifest;
|
|
17
|
+
export declare function imageInfo(bytes: Uint8Array): {
|
|
18
|
+
mime: string;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
};
|
|
22
|
+
export declare function validatePackageFiles(manifest: PackageManifest, read: (path: string) => Promise<Uint8Array | null>, validateImage?: PetAssetsHost["validateImage"]): Promise<SheetLayout | null>;
|
|
23
|
+
export declare function unpackResourcePackage(bytes: Uint8Array, validateImage?: PetAssetsHost["validateImage"]): Promise<{
|
|
24
|
+
files: Map<string, Uint8Array<ArrayBufferLike>>;
|
|
25
|
+
manifest: PackageManifest;
|
|
26
|
+
layout: SheetLayout | null;
|
|
27
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Unzip as j,UnzipInflate as k}from"fflate";import{parseSheetLayout as A}from"./sheet-layout.js";var z=["cover","gacha","multi_draw","icon","background","pool_card","sidebar_selected","sidebar_hover","sidebar_unselected"],g=209715200,d=65536,E=new TextDecoder("utf-8",{fatal:!0});function P(e){return e.length>0&&!/[\\\u0000-\u001f:]/.test(e)&&e.split("/").every((n)=>n!==""&&n!=="."&&n!=="..")}async function Z(e){let n=await crypto.subtle.digest("SHA-256",new Uint8Array(e).buffer);return Array.from(new Uint8Array(n),(a)=>a.toString(16).padStart(2,"0")).join("")}function _(e){if(e.length>d)throw Error("Vibemon manifest exceeds 64 KiB");let n=JSON.parse(E.decode(e));if(n?.format_version!==1||!n.assets||typeof n.assets!=="object"||Array.isArray(n.assets))throw Error("Invalid Vibemon package manifest");let a=Object.entries(n.assets);if(a.length>11)throw Error("Too many Vibemon assets");let o=new Set;for(let[,t]of a){if(!t||typeof t.path!=="string"||!P(t.path)||t.path==="manifest.json"||typeof t.sha256!=="string"||!/^[a-f0-9]{64}$/.test(t.sha256)||o.has(t.path))throw Error("Invalid Vibemon asset reference");o.add(t.path)}if(Boolean(n.assets.sheet)!==Boolean(n.assets.layout))throw Error("Vibemon animation requires both sheet and layout");return n}function M(e){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),a=(r,f)=>String.fromCharCode(...e.subarray(r,r+f)),o="",t=0,s=0;if(e.length>=24&&e[0]===137&&a(1,3)==="PNG")o="image/png",t=n.getUint32(16),s=n.getUint32(20);else if(e.length>=10&&/GIF8[79]a/.test(a(0,6)))o="image/gif",t=n.getUint16(6,!0),s=n.getUint16(8,!0);else if(e.length>=30&&a(0,4)==="RIFF"&&a(8,4)==="WEBP"){o="image/webp";let r=a(12,4);if(r==="VP8X")t=1+(n.getUint32(24,!0)&16777215),s=1+(e[27]|e[28]<<8|e[29]<<16);else if(r==="VP8L"&&e[20]===47){let f=n.getUint32(21,!0);t=1+(f&16383),s=1+(f>>>14&16383)}else if(r==="VP8 "&&e[23]===157&&e[24]===1&&e[25]===42)t=n.getUint16(26,!0)&16383,s=n.getUint16(28,!0)&16383}else if(e.length>4&&e[0]===255&&e[1]===216){o="image/jpeg";for(let r=2;r+8<e.length;){if(e[r++]!==255)break;while(e[r]===255)r++;let f=e[r++];if(f===217||f===218)break;if(f===1||f>=208&&f<=215)continue;let c=n.getUint16(r);if(c<2||r+c>e.length)break;if([192,193,194,195,197,198,199,201,202,203,205,206,207].includes(f)){s=n.getUint16(r+3),t=n.getUint16(r+5);break}r+=c}}if(!t||!s||t>16384||s>16384)throw Error("Invalid or unsupported Vibemon image dimensions");return{mime:o,width:t,height:s}}async function O(e,n,a){let o=0,t=null,s=null;for(let[r,f]of Object.entries(e.assets)){let c=await n(f.path);if(c===null||await Z(c)!==f.sha256)throw Error(`Vibemon asset checksum mismatch: ${r}`);if(o+=c.length,o>g)throw Error("Vibemon resource expansion limit exceeded");if(r==="layout"){if(c.length>d)throw Error("Vibemon layout exceeds 64 KiB");t=A(E.decode(c))}else if(r==="sheet"||z.includes(r)){let h=M(c);if(await a?.(c,h.mime),r==="sheet")s=h}}if(t&&s&&t.states.some((r)=>r.frames*t.frameWidth>s.width||(r.row+1)*t.frameHeight>s.height))throw Error("Vibemon animation exceeds the spritesheet");return t}async function L(e,n){if(e.length>g)throw Error("Vibemon ZIP exceeds 200 MiB");let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o=e.length-22;while(o>=Math.max(0,e.length-65557)&&a.getUint32(o,!0)!==101010256)o--;if(o<0||e.length<22||a.getUint32(o,!0)!==101010256||o+22+a.getUint16(o+20,!0)!==e.length||a.getUint16(o+4,!0)!==0||a.getUint16(o+6,!0)!==0||a.getUint32(o+16,!0)+a.getUint32(o+12,!0)!==o)throw Error("Incomplete or unsupported Vibemon ZIP");let t=new Map,s=new Set,r=0,f=0,c=new j((i)=>{let l=i.name.endsWith("/"),u=l?i.name.slice(0,-1):i.name;if(!P(u)||s.has(u)||s.size>=44)throw Error("Invalid or duplicate Vibemon ZIP path");if((i.originalSize??0)>g)throw Error("Vibemon ZIP expansion limit exceeded");s.add(u);let p=[],m=0;i.ondata=(x,w,S)=>{if(x)throw x;if(r+=w.length,m+=w.length,r>g||(i.name==="manifest.json"||i.name.endsWith(".json"))&&m>d)throw Error("Vibemon ZIP expansion limit exceeded");if(p.push(w),S){let I=new Uint8Array(m),U=0;for(let V of p)I.set(V,U),U+=V.length;if(l){if(m!==0)throw Error("Invalid Vibemon ZIP directory")}else{if(t.size>=12)throw Error("Too many Vibemon ZIP files");t.set(i.name,I)}f++}},i.start()});c.register(k);for(let i=0;i<e.length;i+=65536)if(c.push(e.subarray(i,i+65536),i+65536>=e.length),i>0&&i%1048576===0)await new Promise((l)=>setTimeout(l,0));if(f!==s.size||s.size!==a.getUint16(o+10,!0)||!t.has("manifest.json"))throw Error("Incomplete Vibemon ZIP");let h=_(t.get("manifest.json")),b=new Set(["manifest.json",...Object.values(h.assets).map((i)=>i.path)]);if([...t.keys()].some((i)=>!b.has(i)))throw Error("Unexpected Vibemon ZIP file");let v=await O(h,(i)=>Promise.resolve(t.get(i)??null),n);return{files:t,manifest:h,layout:v}}export{z as IMAGE_ASSETS,g as PACKAGE_LIMIT,M as imageInfo,_ as parseManifest,P as resourcePath,Z as sha256,L as unpackResourcePackage,O as validatePackageFiles};
|
package/dist/pets/resources.d.ts
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { type PetAssetsHost } from "./host.js";
|
|
2
|
-
import type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
states: {
|
|
7
|
-
id: string;
|
|
8
|
-
row: number;
|
|
9
|
-
frames: number;
|
|
10
|
-
}[];
|
|
11
|
-
}
|
|
2
|
+
import { type ImageAsset, type PackageManifest } from "./resource-package.js";
|
|
3
|
+
import { type SheetLayout } from "./sheet-layout.js";
|
|
4
|
+
import type { VibemonResourceDescriptor } from "./types.js";
|
|
5
|
+
export { parseSheetLayout, type SheetLayout } from "./sheet-layout.js";
|
|
12
6
|
export interface CachedPetMetadata {
|
|
13
7
|
directory: string;
|
|
14
|
-
sheetName: string;
|
|
8
|
+
sheetName: string | null;
|
|
15
9
|
name?: string;
|
|
16
|
-
layout: SheetLayout;
|
|
17
|
-
version: number;
|
|
10
|
+
layout: SheetLayout | null;
|
|
11
|
+
version: number | null;
|
|
12
|
+
format?: number;
|
|
13
|
+
sourceUrl?: string | null;
|
|
14
|
+
manifest?: PackageManifest;
|
|
15
|
+
archiveSha256?: string;
|
|
18
16
|
config?: Record<string, unknown>;
|
|
19
17
|
}
|
|
20
18
|
export interface CachedPetResource extends CachedPetMetadata {
|
|
21
|
-
sheet: Uint8Array;
|
|
19
|
+
sheet: Uint8Array | null;
|
|
22
20
|
}
|
|
23
|
-
export declare function
|
|
21
|
+
export declare function matchesResource(cached: CachedPetMetadata, item: VibemonResourceDescriptor): boolean;
|
|
24
22
|
export declare function createPetResources(host: PetAssetsHost): {
|
|
25
23
|
inspect: (petId: string) => Promise<CachedPetMetadata | null>;
|
|
24
|
+
visuals: (metadata: CachedPetMetadata) => Promise<Partial<Record<ImageAsset, string | null>>>;
|
|
25
|
+
preview(metadata: CachedPetMetadata): Promise<Uint8Array<ArrayBufferLike> | null>;
|
|
26
26
|
cached: (petId: string) => Promise<CachedPetResource | null>;
|
|
27
|
-
ensure: (item:
|
|
27
|
+
ensure: (item: VibemonResourceDescriptor) => Promise<CachedPetResource>;
|
|
28
28
|
cancel: () => void;
|
|
29
29
|
dispose(): void;
|
|
30
30
|
};
|
package/dist/pets/resources.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assertAccount as i}from"./host.js";var
|
|
1
|
+
import{assertAccount as i}from"./host.js";import{IMAGE_ASSETS as W,imageInfo as q,parseManifest as B,resourcePath as D,sha256 as J,unpackResourcePackage as F,validatePackageFiles as Z}from"./resource-package.js";import{parseSheetLayout as I}from"./sheet-layout.js";import{parseSheetLayout as ne}from"./sheet-layout.js";var R=new TextEncoder,N=new TextDecoder;function G(r,w){let p=w.resource_package_format??0;return(r.format??0)===p&&r.version===(w.resource_version??null)&&(r.sourceUrl===void 0?p===0:r.sourceUrl===(p===1?w.resource_url:w.sheet_url))}function Y(r){let w=!1,p=new Map,_=new Map,V=new Map,S=new Map,k=new Set,O=Promise.resolve();function U(e){if(w)throw Error("Vibemon resources disposed");let o=r.account();if(o===null)throw Error("Sign in to load Vibemon resources");if(!/^[a-zA-Z0-9_-]+$/.test(e)||!/^[a-zA-Z0-9.-]+$/.test(o.apiHost))throw Error("Invalid resource identity");return`vibemon/catalog/${o.apiHost}/${e}`}function P(e){let o=r.account();if(o===null)return Promise.reject(Error("Sign in to load Vibemon resources"));let n=`${U(e)}/${o.userId}/${o.revision}`,a=_.get(n);if(a)return a;let s=H(e).finally(()=>{if(_.get(n)===s)_.delete(n)});return _.set(n,s),s}async function H(e){let o=r.account();if(o===null)throw Error("Sign in to load Vibemon resources");let n=U(e),a=await r.resources.read(`${n}/resource.json`);if(a===null){for(let l of[n,`vibemon/${o.apiHost}/${o.userId}/${e}`]){let f=await r.resources.read(`${l}/config.json`);if(f===null)continue;let t=JSON.parse(N.decode(f));if(!/^sprite-sheet\.(webp|png)$/.test(t.spritesheet))throw Error("Invalid legacy sprite filename");let v=I(JSON.stringify({frameWidth:t.frameSize,frameHeight:t.frameSize,states:t.states}));if(await r.resources.exists(`${l}/${t.spritesheet}`)){let y=await r.storage.get("vibemon.resourceVersion");return i(r,o),{directory:l,sheetName:t.spritesheet,layout:v,version:y?.[o.apiHost]?.[e]??0,config:t}}}return null}let s;try{s=JSON.parse(N.decode(a))}catch{return null}if(!s||s.format!==void 0&&s.format!==0&&s.format!==1)return null;if(s.format===1)try{let l=await r.resources.read(`${n}/manifest.json`),f=await r.resources.read(`${n}/resource.zip`);if(!l||!f||await J(f)!==s.archiveSha256)return null;let t=B(l),v=await Z(t,(y)=>r.resources.read(`${n}/${y}`));return i(r,o),{...s,directory:n,manifest:t,layout:v,sheetName:t.assets.sheet?.path??null}}catch{return i(r,o),null}let c=JSON.parse(N.decode(a));if(I(JSON.stringify(c.layout)),!/^sprite-sheet\.(webp|png)$/.test(c.sheet))throw Error("Invalid sprite filename");let u=await r.resources.exists(`${n}/${c.sheet}`);i(r,o);let g=await r.resources.read(`${n}/config.json`);return i(r,o),!u?null:{directory:n,sheetName:c.sheet,name:c.name,layout:c.layout,version:c.version,format:0,sourceUrl:s.sourceUrl,config:g===null?void 0:JSON.parse(N.decode(g))}}async function L(e){let o=r.account();if(o===null)throw Error("Sign in to load Vibemon resources");let n=await P(e);if(n===null)return null;if(n.sheetName===null)return{...n,sheet:null};let a=await r.resources.read(`${n.directory}/${n.sheetName}`);return i(r,o),a===null?null:{...n,sheet:a}}function M(e){let o=r.account();if(o===null)return Promise.reject(Error("Sign in to download Vibemon resources"));if(e.resource_package_format!=null&&(!Number.isInteger(e.resource_package_format)||e.resource_package_format<0))return Promise.reject(Error("Invalid Vibemon resource format"));if(e.resource_version!=null&&(!Number.isInteger(e.resource_version)||e.resource_version<0))return Promise.reject(Error("Invalid Vibemon resource version"));let n=U(e.uuid),a=JSON.stringify([o.revision,e.resource_package_format??0,e.resource_version??null,e.resource_url,e.sheet_url,e.layout]),s=p.get(n);if(s?.key===a)return s.work;let c=(V.get(n)??0)+1;V.set(n,c);let u=()=>{if(i(r,o),w||V.get(n)!==c)throw Error("Vibemon resource request superseded")},l=(async()=>{await s?.work.catch(()=>{}),u();let f=await L(e.uuid);if(i(r,o),f!==null&&G(f,e))return{...f,name:e.name};let t=e.resource_package_format??0;if(t!==0&&t!==1)throw Error(`Unsupported Vibemon resource format: ${t}`);if(t===1&&!e.resource_url)throw Error("Vibemon package URL is missing");if(t===0&&(!e.sheet_url||!e.layout))throw Error("Vibemon animation is unavailable");let v=t===0?I(e.layout):null,y=new URL(t===1?e.resource_url:e.sheet_url);if(y.protocol!=="https:")throw Error("Vibemon sprites require HTTPS");let j=y.pathname.toLowerCase().endsWith(".png")?"sprite-sheet.png":"sprite-sheet.webp",h=new AbortController;k.add(h);let d=`${n}.${crypto.randomUUID()}.tmp`;try{let b=await r.download(y.href,h.signal);if(u(),t===1){let m=await F(b,r.validateImage);u();for(let[T,C]of m.files)await r.resources.write(`${d}/${T}`,C);await r.resources.write(`${d}/resource.zip`,b);let E={directory:n,format:1,sourceUrl:e.resource_url,version:e.resource_version??null,name:e.name,manifest:m.manifest,layout:m.layout,sheetName:m.manifest.assets.sheet?.path??null,archiveSha256:await J(b)};return await r.resources.write(`${d}/resource.json`,R.encode(JSON.stringify(E))),u(),h.signal.throwIfAborted(),await r.resources.replace(d,n),{...E,sheet:E.sheetName?m.files.get(E.sheetName):null}}if(b.byteLength===0)throw Error("Empty Vibemon spritesheet");await r.resources.write(`${d}/${j}`,b),await r.resources.write(`${d}/resource.json`,R.encode(JSON.stringify({layout:v,version:e.resource_version??null,sheet:j,name:e.name,sourceUrl:e.sheet_url}))),i(r,o),h.signal.throwIfAborted(),u(),await r.resources.replace(d,n),i(r,o);let A=O.catch(()=>{}).then(async()=>{i(r,o);let m=await r.storage.get("vibemon.resourceVersion")??{};i(r,o),await r.storage.set("vibemon.resourceVersion",{...m,[o.apiHost]:{...m[o.apiHost],[e.uuid]:e.resource_version??0}})});return O=A,await A,i(r,o),{directory:n,sheetName:j,sheet:b,name:e.name,layout:v,version:e.resource_version??null,format:0,sourceUrl:e.sheet_url}}finally{k.delete(h),await r.resources.remove(d)}})().finally(()=>{if(p.get(n)?.work===l)p.delete(n)});return p.set(n,{key:a,generation:c,work:l}),l}async function z(e){if(e.format!==1||!e.manifest)return{};let o=e.manifest,n={};return await Promise.all(W.map(async(a)=>{let s=o.assets[a];if(!s){n[a]=null;return}if(!D(s.path))throw Error("Invalid cached Vibemon path");if(r.resources.url)n[a]=`${await r.resources.url(`${e.directory}/${s.path}`)}?v=${s.sha256}`;else{let c=`${e.directory}/${s.sha256}`,u=S.get(c);if(!u){let g=await r.resources.read(`${e.directory}/${s.path}`);if(g===null)throw Error("Cached Vibemon image is missing");u=URL.createObjectURL(new Blob([new Uint8Array(g).buffer],{type:q(g).mime})),S.set(c,u)}n[a]=u}})),n}function x(){for(let e of k)e.abort();k.clear()}return{inspect:P,visuals:z,async preview(e){let o=e.manifest?.assets.cover??e.manifest?.assets.icon;return o?r.resources.read(`${e.directory}/${o.path}`):null},cached:L,ensure:M,cancel:x,dispose(){w=!0,x();for(let e of S.values())URL.revokeObjectURL(e);S.clear()}}}export{Y as createPetResources,G as matchesResource,ne as parseSheetLayout};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function i(t){let e=JSON.parse(t);if(!e||!Number.isInteger(e.frameWidth)||e.frameWidth<1||e.frameWidth>4096||!Number.isInteger(e.frameHeight)||e.frameHeight<1||e.frameHeight>4096||!Array.isArray(e.states)||e.states.length<1||e.states.length>32||e.states.some((r)=>!r||typeof r.id!=="string"||!r.id||!Number.isInteger(r.row)||r.row<0||!Number.isInteger(r.frames)||r.frames<1||r.frames>128)||new Set(e.states.map((r)=>r.id)).size!==e.states.length||e.states.reduce((r,s)=>r+s.frames,0)>512)throw Error("Invalid Vibemon sprite layout");return e}export{i as parseSheetLayout};
|
package/dist/pets/types.d.ts
CHANGED
|
@@ -53,10 +53,11 @@ interface GachaPoolItemBase {
|
|
|
53
53
|
updated_time: string;
|
|
54
54
|
}
|
|
55
55
|
export interface GachaPoolVibemonItem extends GachaPoolItemBase {
|
|
56
|
-
reward_type
|
|
56
|
+
reward_type?: "VIBEMON" | null;
|
|
57
57
|
exchange_points: null;
|
|
58
58
|
vibemon_uuid: string;
|
|
59
59
|
vibemon_name: string;
|
|
60
|
+
vibemon_resource_url?: string | null;
|
|
60
61
|
vibemon_cover_url: string;
|
|
61
62
|
vibemon_icon_url: string | null;
|
|
62
63
|
vibemon_background_url: string | null;
|
|
@@ -116,7 +117,7 @@ interface DrawResultItemBase {
|
|
|
116
117
|
is_pity_hit: boolean;
|
|
117
118
|
}
|
|
118
119
|
export interface VibemonDrawResultItem extends DrawResultItemBase {
|
|
119
|
-
reward_type
|
|
120
|
+
reward_type?: "VIBEMON" | null;
|
|
120
121
|
exchange_points: null;
|
|
121
122
|
vibemon_uuid: string;
|
|
122
123
|
vibemon_name: string;
|
|
@@ -165,7 +166,22 @@ export interface DrawResponse {
|
|
|
165
166
|
results: DrawResultItem[];
|
|
166
167
|
state: UserGachaStateResponse;
|
|
167
168
|
}
|
|
169
|
+
export interface VibemonResourceDescriptor {
|
|
170
|
+
uuid: string;
|
|
171
|
+
name: string;
|
|
172
|
+
resource_url?: string | null;
|
|
173
|
+
resource_package_format?: number | null;
|
|
174
|
+
resource_version?: number | null;
|
|
175
|
+
sheet_url?: string | null;
|
|
176
|
+
layout?: string | null;
|
|
177
|
+
}
|
|
168
178
|
export interface MyVibemonItem {
|
|
179
|
+
resource_url?: string | null;
|
|
180
|
+
resource_package_format?: number | null;
|
|
181
|
+
resource_version?: number | null;
|
|
182
|
+
sheet_url?: string | null;
|
|
183
|
+
layout?: string | null;
|
|
184
|
+
multi_draw_url?: string | null;
|
|
169
185
|
vibemon_uuid: string;
|
|
170
186
|
name: string;
|
|
171
187
|
description: string | null;
|
|
@@ -187,7 +203,7 @@ export interface MyVibemonItem {
|
|
|
187
203
|
obtained_time: string;
|
|
188
204
|
duplicate_count: number;
|
|
189
205
|
}
|
|
190
|
-
export interface VibemonCatalogItem {
|
|
206
|
+
export interface VibemonCatalogItem extends VibemonResourceDescriptor {
|
|
191
207
|
uuid: string;
|
|
192
208
|
name: string;
|
|
193
209
|
description: string | null;
|
|
@@ -205,16 +221,12 @@ export interface VibemonCatalogItem {
|
|
|
205
221
|
sidebar_selected_url: string | null;
|
|
206
222
|
sidebar_hover_url: string | null;
|
|
207
223
|
sidebar_unselected_url: string | null;
|
|
208
|
-
resource_url: string;
|
|
209
|
-
sheet_url: string;
|
|
210
|
-
layout: string;
|
|
211
|
-
resource_version: number;
|
|
212
224
|
is_limited: number;
|
|
213
225
|
status: number;
|
|
214
226
|
}
|
|
215
227
|
export interface GetMyVibemonsParams {
|
|
216
|
-
|
|
217
|
-
|
|
228
|
+
rarityUuid?: string;
|
|
229
|
+
categoryUuid?: string;
|
|
218
230
|
equipped?: boolean;
|
|
219
231
|
scene?: string;
|
|
220
232
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Arjun Barrett
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwith/module-auth",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -95,10 +95,11 @@
|
|
|
95
95
|
"@base-ui/react": "^1.8.0",
|
|
96
96
|
"class-variance-authority": "^0.7.1",
|
|
97
97
|
"cn": "^0.5.0",
|
|
98
|
+
"fflate": "0.8.3",
|
|
99
|
+
"i18next": "^26.4.2",
|
|
98
100
|
"lucide-react": "^1.49.0",
|
|
99
101
|
"motion": "^13.4.6",
|
|
100
102
|
"react-i18next": "^17.0.15",
|
|
101
|
-
"i18next": "^26.4.2",
|
|
102
103
|
"sonner": "^2.0.8",
|
|
103
104
|
"zustand": "^5.0.15"
|
|
104
105
|
},
|