@alwith/module-auth 0.1.0 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +35 -1
  3. package/THIRD_PARTY_NOTICES.md +32 -2
  4. package/assets/pets/assets/fonts/GrowYear.woff2 +0 -0
  5. package/assets/pets/assets/fonts/Outfit-Variable.woff2 +0 -0
  6. package/assets/pets/card-draw/add-to-album-active.png +0 -0
  7. package/assets/pets/card-draw/add-to-album-default.png +0 -0
  8. package/assets/pets/card-draw/add-to-album-hover.png +0 -0
  9. package/assets/pets/card-draw/album-bg.webp +0 -0
  10. package/assets/pets/card-draw/album-icon.png +0 -0
  11. package/assets/pets/card-draw/card-back.webp +0 -0
  12. package/assets/pets/card-draw/card-star.svg +13 -0
  13. package/assets/pets/card-draw/dialog-close.png +0 -0
  14. package/assets/pets/card-draw/download.svg +3 -0
  15. package/assets/pets/card-draw/empty-pet.png +0 -0
  16. package/assets/pets/card-draw/gem-plus.svg +4 -0
  17. package/assets/pets/card-draw/gem.svg +23 -0
  18. package/assets/pets/card-draw/new-tag.svg +14 -0
  19. package/assets/pets/card-draw/not-enough-dialog.png +0 -0
  20. package/assets/pets/card-draw/placeholder-card.png +0 -0
  21. package/assets/pets/card-draw/proceed-active.png +0 -0
  22. package/assets/pets/card-draw/proceed-default.png +0 -0
  23. package/assets/pets/card-draw/proceed-hover.png +0 -0
  24. package/assets/pets/card-draw/pull-0-active.png +0 -0
  25. package/assets/pets/card-draw/pull-0-default.png +0 -0
  26. package/assets/pets/card-draw/pull-0-hover.png +0 -0
  27. package/assets/pets/card-draw/pull-160-active.png +0 -0
  28. package/assets/pets/card-draw/pull-160-default.png +0 -0
  29. package/assets/pets/card-draw/pull-160-hover.png +0 -0
  30. package/assets/pets/card-draw/pull-1600-active.png +0 -0
  31. package/assets/pets/card-draw/pull-1600-default.png +0 -0
  32. package/assets/pets/card-draw/pull-1600-hover.png +0 -0
  33. package/assets/pets/card-draw/pull-album-icon-transparent.png +0 -0
  34. package/assets/pets/card-draw/pull-back-transparent.png +0 -0
  35. package/assets/pets/card-draw/pull-gem.svg +27 -0
  36. package/assets/pets/card-draw/pull-page-background.png +0 -0
  37. package/assets/pets/card-draw/pull-texture.png +0 -0
  38. package/assets/pets/card-draw/pull-vibemon-icon-transparent.png +0 -0
  39. package/assets/pets/card-draw/rarity-bg-sr.webp +0 -0
  40. package/assets/pets/card-draw/rarity-bg-ssr.webp +0 -0
  41. package/assets/pets/card-draw/result-aura.webp +0 -0
  42. package/assets/pets/card-draw/stage.webp +0 -0
  43. package/assets/pets/card-draw/wish-default.png +0 -0
  44. package/assets/pets/card-draw/wish.webp +0 -0
  45. package/assets/pets/vibemon/album/arrow.svg +12 -0
  46. package/assets/pets/vibemon/album/book.webp +0 -0
  47. package/assets/pets/vibemon/album/logo.webp +0 -0
  48. package/assets/pets/vibemon/album/page-bg.webp +0 -0
  49. package/assets/pets/vibemon/burst-sheet.png +0 -0
  50. package/assets/pets/vibemon/chick-armor/config.json +61 -0
  51. package/assets/pets/vibemon/chick-armor/sprite-sheet.webp +0 -0
  52. package/assets/pets/vibemon/chick-classic/config.json +61 -0
  53. package/assets/pets/vibemon/chick-classic/sprite-sheet.webp +0 -0
  54. package/assets/pets/vibemon/default-cat/config.json +37 -0
  55. package/assets/pets/vibemon/default-cat/sprite-sheet.png +0 -0
  56. package/assets/pets/vibemon/dino-cole-f/config.json +137 -0
  57. package/assets/pets/vibemon/dino-cole-f/sprite-sheet.png +0 -0
  58. package/assets/pets/vibemon/dino-cole-m/config.json +137 -0
  59. package/assets/pets/vibemon/dino-cole-m/sprite-sheet.png +0 -0
  60. package/assets/pets/vibemon/dino-doux-f/config.json +137 -0
  61. package/assets/pets/vibemon/dino-doux-f/sprite-sheet.png +0 -0
  62. package/assets/pets/vibemon/dino-kira-f/config.json +137 -0
  63. package/assets/pets/vibemon/dino-kira-f/sprite-sheet.png +0 -0
  64. package/assets/pets/vibemon/dino-kira-m/config.json +137 -0
  65. package/assets/pets/vibemon/dino-kira-m/sprite-sheet.png +0 -0
  66. package/assets/pets/vibemon/dino-kuro-f/config.json +137 -0
  67. package/assets/pets/vibemon/dino-kuro-f/sprite-sheet.png +0 -0
  68. package/assets/pets/vibemon/dino-kuro-m/config.json +137 -0
  69. package/assets/pets/vibemon/dino-kuro-m/sprite-sheet.png +0 -0
  70. package/assets/pets/vibemon/dino-loki-f/config.json +137 -0
  71. package/assets/pets/vibemon/dino-loki-f/sprite-sheet.png +0 -0
  72. package/assets/pets/vibemon/dino-loki-m/config.json +137 -0
  73. package/assets/pets/vibemon/dino-loki-m/sprite-sheet.png +0 -0
  74. package/assets/pets/vibemon/dino-mono-f/config.json +137 -0
  75. package/assets/pets/vibemon/dino-mono-f/sprite-sheet.png +0 -0
  76. package/assets/pets/vibemon/dino-mono-m/config.json +137 -0
  77. package/assets/pets/vibemon/dino-mono-m/sprite-sheet.png +0 -0
  78. package/assets/pets/vibemon/dino-mort-f/config.json +137 -0
  79. package/assets/pets/vibemon/dino-mort-f/sprite-sheet.png +0 -0
  80. package/assets/pets/vibemon/dino-nico-f/config.json +137 -0
  81. package/assets/pets/vibemon/dino-nico-f/sprite-sheet.png +0 -0
  82. package/assets/pets/vibemon/dino-nico-m/config.json +137 -0
  83. package/assets/pets/vibemon/dino-nico-m/sprite-sheet.png +0 -0
  84. package/assets/pets/vibemon/dino-olaf-f/config.json +137 -0
  85. package/assets/pets/vibemon/dino-olaf-f/sprite-sheet.png +0 -0
  86. package/assets/pets/vibemon/dino-olaf-m/config.json +137 -0
  87. package/assets/pets/vibemon/dino-olaf-m/sprite-sheet.png +0 -0
  88. package/assets/pets/vibemon/dino-purple-horn/config.json +35 -0
  89. package/assets/pets/vibemon/dino-purple-horn/sprite-sheet.webp +0 -0
  90. package/assets/pets/vibemon/dino-sena-f/config.json +137 -0
  91. package/assets/pets/vibemon/dino-sena-f/sprite-sheet.png +0 -0
  92. package/assets/pets/vibemon/dino-sena-m/config.json +137 -0
  93. package/assets/pets/vibemon/dino-sena-m/sprite-sheet.png +0 -0
  94. package/assets/pets/vibemon/dino-tard-f/config.json +137 -0
  95. package/assets/pets/vibemon/dino-tard-f/sprite-sheet.png +0 -0
  96. package/assets/pets/vibemon/dino-vita-f/config.json +137 -0
  97. package/assets/pets/vibemon/dino-vita-f/sprite-sheet.png +0 -0
  98. package/assets/pets/vibemon/equip/page-bg.webp +0 -0
  99. package/assets/pets/vibemon/equip/single-pet-toast.png +0 -0
  100. package/assets/pets/vibemon/guide/arrow.svg +29 -0
  101. package/assets/pets/vibemon/guide/bubble-texture-home.png +0 -0
  102. package/assets/pets/vibemon/guide/bubble-texture-pull.png +0 -0
  103. package/assets/pets/vibemon/guide/hand-shape.svg +3 -0
  104. package/assets/pets/vibemon/guide/hand-sheen.png +0 -0
  105. package/assets/pets/vibemon/guide/hand.svg +10 -0
  106. package/assets/pets/vibemon/guide/mascot.png +0 -0
  107. package/assets/pets/vibemon/guide/ring.svg +41 -0
  108. package/assets/pets/vibemon/home/album-icon-hover.png +0 -0
  109. package/assets/pets/vibemon/home/album-icon.png +0 -0
  110. package/assets/pets/vibemon/home/album-text.png +0 -0
  111. package/assets/pets/vibemon/home/home-bg-bak.webp +0 -0
  112. package/assets/pets/vibemon/home/home-bg.webp +0 -0
  113. package/assets/pets/vibemon/home/intro.mp4 +0 -0
  114. package/assets/pets/vibemon/home/pull.mp4 +0 -0
  115. package/assets/pets/vibemon/home/pull.webm +0 -0
  116. package/assets/pets/vibemon/home/vibemon-icon-hover.png +0 -0
  117. package/assets/pets/vibemon/home/vibemon-icon.png +0 -0
  118. package/assets/pets/vibemon/home/vibemon-text.png +0 -0
  119. package/assets/pets/vibemon/home/wish-icon-hover.png +0 -0
  120. package/assets/pets/vibemon/home/wish-icon.png +0 -0
  121. package/assets/pets/vibemon/home/wish-text.png +0 -0
  122. package/assets/pets/vibemon/loading/background.webp +0 -0
  123. package/assets/pets/vibemon/loading/logo.webp +0 -0
  124. package/assets/pets/vibemon/multi-draw/bg-sr.png +0 -0
  125. package/assets/pets/vibemon/multi-draw/bg-ssr.png +0 -0
  126. package/dist/client.d.ts +1 -1
  127. package/dist/pets/assets.d.ts +35 -0
  128. package/dist/pets/assets.js +1 -0
  129. package/dist/pets/client.d.ts +12 -0
  130. package/dist/pets/client.js +1 -0
  131. package/dist/pets/core/engine.d.ts +63 -0
  132. package/dist/pets/core/engine.js +1 -0
  133. package/dist/pets/core/host.d.ts +112 -0
  134. package/dist/pets/core/host.js +1 -0
  135. package/dist/pets/core/index.d.ts +11 -0
  136. package/dist/pets/core/index.js +1 -0
  137. package/dist/pets/core/lib/account-state.d.ts +6 -0
  138. package/dist/pets/core/lib/account-state.js +1 -0
  139. package/dist/pets/core/lib/bubble-outline.d.ts +18 -0
  140. package/dist/pets/core/lib/bubble-outline.js +1 -0
  141. package/dist/pets/core/lib/draw-result.d.ts +22 -0
  142. package/dist/pets/core/lib/draw-result.js +1 -0
  143. package/dist/pets/core/lib/endpoints.d.ts +9 -0
  144. package/dist/pets/core/lib/endpoints.js +1 -0
  145. package/dist/pets/core/lib/gacha-pools.d.ts +28 -0
  146. package/dist/pets/core/lib/gacha-pools.js +1 -0
  147. package/dist/pets/core/lib/loading-progress.d.ts +2 -0
  148. package/dist/pets/core/lib/loading-progress.js +1 -0
  149. package/dist/pets/core/lib/pet-animation-sync.d.ts +20 -0
  150. package/dist/pets/core/lib/pet-animation-sync.js +1 -0
  151. package/dist/pets/core/lib/pet-bubble-state.d.ts +22 -0
  152. package/dist/pets/core/lib/pet-bubble-state.js +1 -0
  153. package/dist/pets/core/lib/pet-drag.d.ts +3 -0
  154. package/dist/pets/core/lib/pet-drag.js +1 -0
  155. package/dist/pets/core/lib/pet-presentation.d.ts +6 -0
  156. package/dist/pets/core/lib/pet-presentation.js +1 -0
  157. package/dist/pets/core/lib/pet-session-context.d.ts +14 -0
  158. package/dist/pets/core/lib/pet-session-context.js +1 -0
  159. package/dist/pets/core/lib/preload-images.d.ts +1 -0
  160. package/dist/pets/core/lib/preload-images.js +1 -0
  161. package/dist/pets/core/lib/presentation-readiness.d.ts +15 -0
  162. package/dist/pets/core/lib/presentation-readiness.js +1 -0
  163. package/dist/pets/core/lib/rarity.d.ts +2 -0
  164. package/dist/pets/core/lib/rarity.js +1 -0
  165. package/dist/pets/core/lib/recharge.d.ts +1 -0
  166. package/dist/pets/core/lib/recharge.js +1 -0
  167. package/dist/pets/core/lib/reply-submission.d.ts +10 -0
  168. package/dist/pets/core/lib/reply-submission.js +1 -0
  169. package/dist/pets/core/lib/resource-sync.d.ts +8 -0
  170. package/dist/pets/core/lib/resource-sync.js +1 -0
  171. package/dist/pets/core/lib/runtime-types.d.ts +1 -0
  172. package/dist/pets/core/lib/runtime-types.js +0 -0
  173. package/dist/pets/core/lib/settings.d.ts +22 -0
  174. package/dist/pets/core/lib/settings.js +1 -0
  175. package/dist/pets/core/lib/sprite-config.d.ts +4 -0
  176. package/dist/pets/core/lib/sprite-config.js +1 -0
  177. package/dist/pets/core/lib/vibemon-resources.d.ts +3 -0
  178. package/dist/pets/core/lib/vibemon-resources.js +1 -0
  179. package/dist/pets/core/lib/view-request.d.ts +4 -0
  180. package/dist/pets/core/lib/view-request.js +1 -0
  181. package/dist/pets/core/lib/window-frame.d.ts +14 -0
  182. package/dist/pets/core/lib/window-frame.js +1 -0
  183. package/dist/pets/core/lib/window-manager.d.ts +3 -0
  184. package/dist/pets/core/lib/window-manager.js +1 -0
  185. package/dist/pets/core/session-icon.d.ts +2 -0
  186. package/dist/pets/core/session-icon.js +5 -0
  187. package/dist/pets/core/types.d.ts +68 -0
  188. package/dist/pets/core/types.js +1 -0
  189. package/dist/pets/host.d.ts +25 -0
  190. package/dist/pets/host.js +1 -0
  191. package/dist/pets/index.d.ts +6 -0
  192. package/dist/pets/index.js +1 -0
  193. package/dist/pets/react/assets.d.ts +60 -0
  194. package/dist/pets/react/assets.js +1 -0
  195. package/dist/pets/react/components/album-view.d.ts +10 -0
  196. package/dist/pets/react/components/album-view.js +1 -0
  197. package/dist/pets/react/components/back-to-home.d.ts +7 -0
  198. package/dist/pets/react/components/back-to-home.js +1 -0
  199. package/dist/pets/react/components/equip-view.d.ts +18 -0
  200. package/dist/pets/react/components/equip-view.js +1 -0
  201. package/dist/pets/react/components/gem-balance.d.ts +7 -0
  202. package/dist/pets/react/components/gem-balance.js +1 -0
  203. package/dist/pets/react/components/home-view.d.ts +6 -0
  204. package/dist/pets/react/components/home-view.js +1 -0
  205. package/dist/pets/react/components/insufficient-points-dialog.d.ts +4 -0
  206. package/dist/pets/react/components/insufficient-points-dialog.js +1 -0
  207. package/dist/pets/react/components/intro-overlay.d.ts +5 -0
  208. package/dist/pets/react/components/intro-overlay.js +1 -0
  209. package/dist/pets/react/components/loading-view.d.ts +4 -0
  210. package/dist/pets/react/components/loading-view.js +1 -0
  211. package/dist/pets/react/components/lounge-burst.css +38 -0
  212. package/dist/pets/react/components/onboarding-guide.d.ts +3 -0
  213. package/dist/pets/react/components/onboarding-guide.js +1 -0
  214. package/dist/pets/react/components/pet-bubble-background.d.ts +7 -0
  215. package/dist/pets/react/components/pet-bubble-background.js +1 -0
  216. package/dist/pets/react/components/pet-mode-button.d.ts +4 -0
  217. package/dist/pets/react/components/pet-mode-button.js +1 -0
  218. package/dist/pets/react/components/pet-window.d.ts +2 -0
  219. package/dist/pets/react/components/pet-window.js +1 -0
  220. package/dist/pets/react/components/pull-overlay.d.ts +9 -0
  221. package/dist/pets/react/components/pull-overlay.js +1 -0
  222. package/dist/pets/react/components/pull-video.d.ts +7 -0
  223. package/dist/pets/react/components/pull-video.js +1 -0
  224. package/dist/pets/react/components/pull-view.d.ts +16 -0
  225. package/dist/pets/react/components/pull-view.js +1 -0
  226. package/dist/pets/react/components/quick-reply.d.ts +3 -0
  227. package/dist/pets/react/components/quick-reply.js +2 -0
  228. package/dist/pets/react/components/session-icon.d.ts +6 -0
  229. package/dist/pets/react/components/session-icon.js +1 -0
  230. package/dist/pets/react/components/single-pet-toast.d.ts +6 -0
  231. package/dist/pets/react/components/single-pet-toast.js +1 -0
  232. package/dist/pets/react/components/sprite-renderer.d.ts +16 -0
  233. package/dist/pets/react/components/sprite-renderer.js +1 -0
  234. package/dist/pets/react/components/vibemon-empty-state.d.ts +3 -0
  235. package/dist/pets/react/components/vibemon-empty-state.js +1 -0
  236. package/dist/pets/react/components/vibemon-header.d.ts +16 -0
  237. package/dist/pets/react/components/vibemon-header.js +1 -0
  238. package/dist/pets/react/components/vibemon-page.d.ts +1 -0
  239. package/dist/pets/react/components/vibemon-page.js +1 -0
  240. package/dist/pets/react/components/vibemon-scene.d.ts +5 -0
  241. package/dist/pets/react/components/vibemon-scene.js +1 -0
  242. package/dist/pets/react/components/video-fader.d.ts +23 -0
  243. package/dist/pets/react/components/video-fader.js +1 -0
  244. package/dist/pets/react/components/wish-button.d.ts +4 -0
  245. package/dist/pets/react/components/wish-button.js +1 -0
  246. package/dist/pets/react/index.d.ts +4 -0
  247. package/dist/pets/react/index.js +1 -0
  248. package/dist/pets/react/lib/account-state.d.ts +2 -0
  249. package/dist/pets/react/lib/account-state.js +1 -0
  250. package/dist/pets/react/lib/card-image.d.ts +1 -0
  251. package/dist/pets/react/lib/card-image.js +1 -0
  252. package/dist/pets/react/lib/resource-sync.d.ts +5 -0
  253. package/dist/pets/react/lib/resource-sync.js +1 -0
  254. package/dist/pets/react/lib/utils.d.ts +1 -0
  255. package/dist/pets/react/lib/utils.js +1 -0
  256. package/dist/pets/react/locales.d.ts +144 -0
  257. package/dist/pets/react/locales.js +1 -0
  258. package/dist/pets/react/styles.css +15 -0
  259. package/dist/pets/react/ui/button.d.ts +8 -0
  260. package/dist/pets/react/ui/button.js +1 -0
  261. package/dist/pets/react/ui/card.d.ts +11 -0
  262. package/dist/pets/react/ui/card.js +1 -0
  263. package/dist/pets/react/ui/input-group.d.ts +16 -0
  264. package/dist/pets/react/ui/input-group.js +1 -0
  265. package/dist/pets/react/ui/textarea.d.ts +3 -0
  266. package/dist/pets/react/ui/textarea.js +1 -0
  267. package/dist/pets/resources.d.ts +30 -0
  268. package/dist/pets/resources.js +1 -0
  269. package/dist/pets/selection.d.ts +7 -0
  270. package/dist/pets/selection.js +1 -0
  271. package/dist/pets/types.d.ts +221 -0
  272. package/dist/pets/types.js +0 -0
  273. package/package.json +52 -4
@@ -0,0 +1,16 @@
1
+ import { type GachaPoolCatalogViewModel } from "../../core/lib/gacha-pools.js";
2
+ export type PullButtonVisualState = "default" | "hover" | "press";
3
+ export declare function PullView({ onBack, onAlbum, onEquip, isFirstDraw, onSingleDraw, onMultiDraw, drawDisabled, albumHasUnseen, availablePoints, pointsLoaded, guideActive, poolCatalog }: {
4
+ onBack: () => void;
5
+ onAlbum: () => void;
6
+ onEquip: () => void;
7
+ isFirstDraw: boolean;
8
+ onSingleDraw: (poolUuid: string) => void;
9
+ onMultiDraw: (poolUuid: string) => void;
10
+ drawDisabled: boolean;
11
+ albumHasUnseen: boolean;
12
+ availablePoints: number;
13
+ pointsLoaded: boolean;
14
+ guideActive: boolean;
15
+ poolCatalog: GachaPoolCatalogViewModel;
16
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as s}from"react/jsx-runtime";import{pullAlbumIcon as A,pullBack as j,pullGem as G,pullPageBackground as O,pullTexture as M,pullVibemonIcon as L}from"../assets.js";import{motion as V}from"motion/react";import{useEffect as H,useMemo as R,useState as w}from"react";import{Button as P}from"../ui/button.js";import{getDefaultGachaPool as K,getVisibleGachaPools as X,resolveGachaPoolStatus as W}from"../../core/lib/gacha-pools.js";import{openAccountUrl as E}from"../../core/lib/recharge.js";import{cn as v}from"../lib/utils.js";import{BackToHome as Y}from"./back-to-home.js";import{GemBalance as J}from"./gem-balance.js";import{InsufficientPointsDialog as Q}from"./insufficient-points-dialog.js";import{FreeDrawGuide as Z,OnboardingScrim as ee}from"./onboarding-guide.js";var te="linear-gradient(180deg, #0C0C77 1.7234%, #171B6A 25.125%, #A67FFB 97.583%, #957FFB 116.28%)",ae=250,le={1:{default:"bg-[#82D6EB]",hover:"bg-[#A3E1F0]",press:"bg-[#5AC8E3]"},10:{default:"bg-[#FFD932]",hover:"bg-[#FFE46B]",press:"bg-[#FACE0B]"}};function _({drawCount:t,price:a,onClick:c,disabled:r,label:d}){let p=t===1,[b,u]=w(!1),[m,l]=w(!1),o=m?"press":b?"hover":"default",f=p?`X ${a}`:`X ${a}`;return s(P,{className:"relative h-[8.5cqh] w-full overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-45","aria-label":d,disabled:r,"data-visual-state":o,onPointerEnter:()=>u(!0),onPointerLeave:()=>{u(!1),l(!1)},onPointerDown:()=>l(!0),onPointerUp:()=>l(!1),onPointerCancel:()=>l(!1),onKeyDown:(h)=>{if(h.key===" "||h.key==="Enter")l(!0)},onKeyUp:(h)=>{if(h.key===" "||h.key==="Enter")l(!1)},onBlur:()=>{u(!1),l(!1)},onClick:c,children:[s("span",{className:"absolute top-[2.092cqh] left-0 h-[6.408cqh] w-full overflow-hidden rounded-[6.25cqw] drop-shadow-[0_0.417cqh_0_rgba(0,0,0,0.51)]",children:[e("span",{"data-slot":"pull-button-surface",className:v("absolute inset-0",le[t][o])}),e("img",{src:M,alt:"",className:v("pointer-events-none absolute top-[-560.71%] left-[-20.34%] h-[741.76%] w-[160.31%] max-w-none select-none",p?"opacity-68 mix-blend-soft-light":"opacity-18 mix-blend-color-burn")}),e("span",{className:"absolute inset-0 shadow-[inset_0_0.2cqh_0.07cqh_0_white]"}),s("span",{"data-slot":"pull-button-label",className:"absolute inset-0 flex items-center justify-center text-[1.458cqw] leading-normal font-normal text-[#403C80]",style:{fontFamily:'"Grow Year", system-ui, sans-serif',WebkitTextStroke:"0.25cqw white",paintOrder:"stroke fill"},children:["PULL X",t]})]}),s("span",{className:"absolute top-0 left-1/2 flex h-[4.422cqh] -translate-x-1/2 items-center whitespace-nowrap",children:[e("span",{className:"me-[-0.375cqw] flex size-[2.763cqw] shrink-0 items-center justify-center",children:e("img",{"data-testid":"pull-button-gem",src:G,alt:"",className:"size-[1.682cqw] max-w-none -scale-y-100 rotate-[21.86deg] select-none"})}),e("span",{"data-slot":"pull-button-price","data-text":f,className:"relative scale-y-98 -skew-x-10 text-[1cqw] leading-normal font-semibold tracking-[0.1cqw] text-transparent before:absolute before:inset-0 before:text-white before:content-[attr(data-text)] before:[-webkit-text-stroke:0.25cqw_#FFFFFF] after:absolute after:inset-0 after:bg-gradient-to-b after:from-[#9645CF] after:to-[#878FFF] after:bg-clip-text after:text-transparent after:content-[attr(data-text)]",style:{fontFamily:'"PingFang SC", sans-serif'},children:f})]})]})}var oe=["unselected","hover","selected"],ne=(t,a)=>a==="selected"?t.sidebarSelectedImageUrl:a==="hover"?t.sidebarHoverImageUrl:t.sidebarUnselectedImageUrl;function se({pool:t,selected:a,disabled:c,onSelect:r}){let[d,p]=w(!1),[b,u]=w(!1),m=a?"selected":d||b?"hover":"unselected";return e(P,{id:`pool-tab-${t.poolUuid}`,role:"tab","aria-selected":a,"aria-controls":"gacha-pool-banner","aria-label":t.name,disabled:c,onClick:r,onPointerEnter:()=>p(!0),onPointerLeave:()=>p(!1),onFocus:()=>u(!0),onBlur:()=>u(!1),"data-visual-state":m,className:v("relative h-[14.167cqh] w-full shrink-0 justify-start overflow-visible rounded-none border-0 bg-transparent p-0 shadow-none transition-none hover:bg-transparent active:translate-y-0 disabled:opacity-100",a?"z-20":"z-0"),children:oe.map((l)=>e("img",{src:ne(t,l),alt:"","aria-hidden":!0,className:v("pointer-events-none absolute bottom-0 left-0 h-auto w-full max-w-none select-none",m===l?"opacity-100":"opacity-0")},l))})}function re(t,a){if(a==="UPCOMING"){if(t.startsAt===null)throw Error(`Upcoming gacha pool ${t.poolUuid} is missing startsAt`);return{label:"Starts in",at:t.startsAt}}if(a==="ACTIVE"&&t.endsAt!==null)return{label:"Time remaining",at:t.endsAt};return null}function ie({pool:t,status:a,nowMs:c}){let r=re(t,a);if(r===null)return null;let d=Math.floor((Date.parse(r.at)-c)/1000),p=Math.floor(d/86400),b=Math.floor(d%86400/3600),u=Math.floor(d%3600/60),m=d%60,l=[{value:p,unit:"d"},{value:b,unit:"h"},{value:u,unit:"m"},{value:m,unit:"s"}];return e("div",{role:"timer","aria-label":r.label,className:"absolute bottom-[6.8%] left-[4.4%] flex min-w-[28%] items-center gap-[1.5%] rounded-lg bg-black/24 px-[1.2%] py-[0.8%] text-white backdrop-blur-sm",children:l.map(({value:o,unit:f})=>s("span",{className:"flex items-center gap-[0.35em]",children:[e("span",{className:"min-w-[2.1em] rounded-md bg-black/28 px-[0.35em] py-[0.25em] text-center text-[clamp(9px,0.82cqw,16px)] leading-none font-bold tabular-nums",children:String(o).padStart(2,"0")}),e("span",{className:"text-[clamp(8px,0.58cqw,12px)] font-medium text-white/75",children:f})]},f))})}function ce(t,a){let c=t.find((r)=>r.poolUuid===a);if(c!==void 0)return c;return B(t)}function B(t){let a=t[0];if(a===void 0)throw Error("Gacha pool catalog has no visible pools");return a}function qe({onBack:t,onAlbum:a,onEquip:c,isFirstDraw:r,onSingleDraw:d,onMultiDraw:p,drawDisabled:b,albumHasUnseen:u,availablePoints:m,pointsLoaded:l,guideActive:o,poolCatalog:f}){let[h,x]=w(!1),[S,z]=w(B(f.pools).poolUuid),[N,D]=w(Date.now);H(()=>{let i=window.setInterval(()=>D(Date.now()),1000);return()=>window.clearInterval(i)},[]);let q=R(()=>X(f.pools,N),[f.pools,N]),y=K(q),n=o?y:ce(q,S),U=W(n,N),k=r&&n.poolUuid===y.poolUuid,F=n.singlePrice,C=b||!n.canDraw||U!=="ACTIVE",I=()=>{if(!k&&l&&m<F){x(!0);return}d(n.poolUuid)},T=()=>{if(l&&m<n.multiPrice){x(!0);return}p(n.poolUuid)};return s("div",{className:"[container-type:size] relative h-full w-full overflow-hidden",style:{background:te},children:[e("div",{className:"absolute inset-0 flex items-center justify-center",children:s("div",{"data-testid":"vibemon-pull-stage",className:"[container-type:size] relative",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:[s("div",{"aria-hidden":!0,className:"pointer-events-none absolute top-[-51.213%] left-[48.958%] h-[172.145%] w-[143.454%] -translate-x-1/2",children:[e("img",{"data-testid":"vibemon-pool-page-background",src:O,alt:"",className:"absolute inset-0 h-full w-full max-w-none object-cover opacity-60 mix-blend-color-burn select-none"}),e("div",{className:"absolute inset-0 bg-black/40"})]}),e(Y,{onClick:t,disabled:o,label:"Back",iconSrc:j,className:"absolute top-[5%] left-[6.25%] z-10 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-10 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(P,{"aria-label":"Vibémon",disabled:o,onClick:c,className:"size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:e("img",{src:L,alt:"",className:"size-full object-contain"})}),s(P,{"aria-label":"Album",disabled:o,onClick:a,className:"relative size-[3.333cqw] bg-transparent p-0 hover:bg-transparent",children:[e("img",{src:A,alt:"",className:"size-full object-contain"}),u&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]}),e(J,{amount:m,onAdd:E,loaded:l,disabled:o,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]}),e("div",{role:"tablist","aria-label":"Card pools",className:"absolute top-[19.816%] left-[6.25%] flex w-[12.5%] flex-col",children:q.map((i)=>e(se,{pool:i,selected:i.poolUuid===n.poolUuid,disabled:o||b,onSelect:()=>z(i.poolUuid)},i.poolUuid))}),s("div",{id:"gacha-pool-banner",role:"tabpanel","aria-labelledby":`pool-tab-${n.poolUuid}`,className:"absolute top-[16.667%] left-[14.583%] z-10 h-[66.667%] w-[79.167%] overflow-hidden rounded-[1.042cqw]",children:[q.map((i)=>{let g=i.poolUuid===n.poolUuid;return e(V.img,{src:i.poolCardImageUrl,alt:g?`${i.name} pool`:"","aria-hidden":!g,className:"absolute inset-0 h-full w-full object-cover select-none",style:{zIndex:g?1:0},initial:!1,animate:{opacity:g?1:0},transition:{duration:ae/1000,ease:g?"easeOut":"easeIn"}},i.poolUuid)}),e(ie,{pool:n,status:U,nowMs:N})]}),s("div",{className:"absolute top-[86.098%] left-[54.427%] flex gap-[2.24cqw]",children:[e("div",{className:v("w-[18.542cqw]",o&&"relative z-30"),children:e(_,{drawCount:1,price:F,label:"Pull once",disabled:C,onClick:I})}),e("div",{className:"w-[18.542cqw]",children:e(_,{drawCount:10,price:n.multiPrice,label:"Pull ten times",disabled:o||k||C,onClick:T})})]}),o&&e(ee,{}),o&&e(Z,{})]})}),h&&e(Q,{onClose:()=>x(!1),onProceed:()=>{E(),x(!1)}})]})}export{qe as PullView};
@@ -0,0 +1,3 @@
1
+ export declare function PetQuickReply({ maxHeight }: {
2
+ maxHeight?: number;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import{jsx as o,jsxs as v}from"react/jsx-runtime";import{ArrowUpIcon as Fe,CheckIcon as je,PanelsTopLeftIcon as Pe,PencilLineIcon as Ue,XIcon as He}from"lucide-react";import{useCallback as xe,useEffect as ee,useLayoutEffect as ve,useRef as b,useState as p}from"react";import{useTranslation as Oe}from"react-i18next";import{cn as ne}from"cn";import{sameBinding as De,vibemonHost as Ve}from"../../core/host.js";import{Button as te}from"../ui/button.js";import{InputGroup as Ge,InputGroupAddon as We,InputGroupButton as P,InputGroupTextarea as qe}from"../ui/input-group.js";import{advancePetSubmission as Ke}from"../../core/lib/reply-submission.js";import{getVibemonScopeSync as Qe,useVibemonState as Xe}from"../lib/account-state.js";import{PetBubbleBackground as Ye}from"./pet-bubble-background.js";import{SessionIcon as ye}from"./session-icon.js";var oe=18,se=oe/2,Ze={color:"var(--popover-foreground)",borderRadius:16,border:"1px solid var(--border)"},Je=(h)=>h.split(/[\\/]/).filter(Boolean).at(-1)??"",$e=(h,t)=>[Je(h.cwd),h.title||t].filter(Boolean).join(" / ");function mn({maxHeight:h}){let t=Ve(),U=Xe(),ke=Qe(),[Ee,re]=p(320);ee(()=>{let e=!1;if(re(320),h===void 0&&U.pet!=="")t.assets.resources.inspect(U.pet).then((s)=>{if(e)return;let n=s?.config?.bubbleAreaHeight;if(n!==void 0&&(typeof n!=="number"||!Number.isFinite(n)))throw Error("Pet bubble height must be a finite number");re(Math.max(typeof n==="number"?n:0,320))}).catch(t.onError);return()=>{e=!0}},[t,ke,U.pet,h]);let{t:r}=Oe("common"),[i,Ie]=p(()=>t.sessions.snapshot()),[y,H]=p(""),[O,R]=p(!1),[m,k]=p(null),[le,D]=p(!1),[V,ie]=p(!1),[Ne,G]=p(""),[N,W]=p(!1),[Ce,ae]=p(null),ce=b(null),A=b(!1),C=b(!1),u=b(null),q=b(null),g=b(null),ue=b(i),de=b(null),pe=b(null),K=xe((e)=>G(e instanceof Error?e.message:String(e)),[]),l=i?.binding??null,a=i,E=i,M=l?.connectionEpoch??null,S=l?.sessionId??null,Me=l?.bindingRevision??-1,Se=i?.owner??"",Q=i===null||i.access!=="writable"||i.executionId!==null,Te=i!==null,_=xe(()=>{if(g.current?.abort(),g.current=null,W(!1),ae(null),H(""),R(!1),k(null),D(!1),q.current=null,G(""),A.current=!1,C.current=!1,u.current!==null)cancelAnimationFrame(u.current);u.current=null},[]);ee(()=>{let e=(n)=>{let x=ue.current;if(x===null||n===null||!De(x.binding,n.binding))_();if(ue.current=n,n!==null){if(n.state==="running")D(!0);k((I)=>I===null?I:Ke(I,n.state,n.since))}Ie(n)},s=t.sessions.subscribe(e);return e(t.sessions.snapshot()),document.addEventListener("vibemon:dismiss",_),()=>{if(s(),document.removeEventListener("vibemon:dismiss",_),g.current?.abort(),u.current!==null)cancelAnimationFrame(u.current)}},[t,_]);let T=()=>{if(l!==null)t.windows.call("bubble-interact",{binding:l}).catch(t.onError)},B=async(e)=>{if(g.current!==null)return;let s=new AbortController;g.current=s,T(),W(!0),G("");try{await e(s.signal)}catch(n){if(!s.signal.aborted)K(n)}finally{if(g.current===s)g.current=null,W(!1)}},Be=()=>t.windows.call("focus"),ze=(e)=>{if(l===null||i===null)throw Error("Pet conversation unavailable");return T(),t.windows.call("session-menu",{binding:l,candidates:i.candidates,position:e,onSelect:(s)=>B(()=>t.sessions.select(l,s))})},c=i?.state==="running",w=i?.state==="requires_action"||i?.prompt!=null,f=i?.prompt??null,Le=async(e,s,n)=>{if(l===null)throw Error(r("petMode.openToReply"));if(await t.sessions.answer(l,crypto.randomUUID(),e.token,s),!n.aborted)ae(e.token)},me=!N&&!Q&&!c&&!w&&y.trim()!==""&&Te,fe=async(e)=>{if(l===null||E===null)throw Error(r("petMode.openToReply"));let s=y.trim();q.current=E.reply?.messageId??null,k({sessionId:l.sessionId,text:s,startedAt:Date.now(),accepted:!1,sawRunning:!1,completed:!1});try{if(await t.sessions.send(l,crypto.randomUUID(),s),e.aborted)return;k((n)=>n===null?null:{...n,accepted:!0}),H("")}catch(n){if(!e.aborted)k(null);throw n}},X=()=>{if(l!==null)B(async(e)=>{await t.sessions.openChat(l),e.throwIfAborted()})},z=Ne||i?.error,Y=m?.completed||le&&(a?.state==="idle"||a?.state==="done"),F=E!==null&&!c&&!w&&!z&&Y&&E.reply?.messageId!==q.current?E.reply:null,Z=z?null:w?r("runState.requires_action"):c?r("petMode.thinking"):m?.completed?null:m?.accepted?r("petMode.sent"):null,be=m!==null,L=be||le,J=E?.userMessage??null,he=Y&&!c?null:(c||L)&&J!==null&&(m===null||J.timestamp>=m.startedAt)?J.text:be?m.text:null,j=!L&&!c&&!w,d=L&&Y&&!c&&!w&&!z,Re=F?.messageId,Ae=F?.text;ee(()=>{if(!d||V||l===null)return;let e=setTimeout(()=>{t.windows.call("dismiss-result",{binding:l}).catch(t.onError)},1e4);return()=>clearTimeout(e)},[d,V,M,S,Me,Re,Ae,t]);let we=w?320:d?260:c?240:320;ve(()=>{let e=de.current;if(e===null)return;let s=!1,n=()=>{let I=Math.ceil(e.getBoundingClientRect().height)+6;if(!s&&I>=32)t.windows.call("bubble-size",{width:we+se*2,height:I}).catch(t.onError)},x=new ResizeObserver(n);return x.observe(e),n(),()=>{s=!0,x.disconnect()}},[t,we,S]);let ge=a?r(a.windowLabel==="main"?"petMode.openMain":"petMode.openChat"):r("petMode.openFull");ve(()=>{if(y===""){R(!1);return}if(O||L||c)return;if(y.includes(`
2
+ `)){R(!0);return}let e=ce.current;if(e===null)return;let s=()=>{let x=Math.ceil(Number.parseFloat(getComputedStyle(e).minHeight));if(e.scrollHeight>x)R(!0)};s();let n=new ResizeObserver(s);return n.observe(e),()=>n.disconnect()},[y,O,L,c]);let _e=j?Ge:"div";return v("div",{ref:de,"data-pet-bubble":!0,className:"relative pb-1.5",style:{paddingTop:se,paddingInline:se},onPointerEnter:()=>ie(!0),onPointerLeave:()=>ie(!1),children:[S!==null&&o(Ye,{cardRef:pe}),S!==null&&v("div",{ref:pe,"data-pet-bubble-card":!0,role:"presentation",onClick:(e)=>{if(d&&e.target.closest("button")===null)X()},style:{...Ze,position:"relative",background:"transparent",borderColor:"transparent",boxShadow:"none",animation:"none",maxHeight:(h??Ee)-6},className:ne("overflow-y-auto p-2",d?"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3 gap-y-1 px-3":c?"flex flex-col gap-1 py-1.5":"flex flex-col gap-2"),children:[he&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:he}),F!==null&&o("p",{className:"line-clamp-2 text-sm break-words whitespace-pre-wrap",children:F.text}),z&&o("p",{role:"alert",className:"text-muted-foreground text-xs",children:z}),f!==null&&v("section",{"aria-label":r(f.kind==="permission"?"petMode.permission":"petMode.question"),className:"flex min-w-0 flex-col gap-2",children:[o("p",{className:"text-sm break-words whitespace-pre-wrap",children:f.title}),f.detail!==""&&o("pre",{className:"text-muted-foreground max-h-24 overflow-auto text-xs break-words whitespace-pre-wrap",children:f.detail}),f.options.length>0&&!Q?o("div",{className:"flex flex-wrap gap-1",children:f.options.map((e)=>o(te,{size:"xs",className:"h-auto min-h-6 max-w-full whitespace-normal",disabled:N||Ce===f.token,onClick:()=>void B((s)=>Le(f,e.id,s)),children:e.label},e.id))}):o(te,{size:"xs",onClick:X,children:r("petMode.openToAnswer")})]}),v(_e,{className:d?"col-start-1 row-start-2":void 0,children:[j&&o(qe,{ref:ce,rows:1,className:"field-sizing-fixed max-h-[calc(3lh+1rem)] min-h-[calc(1lh+1rem)] min-w-0 overflow-y-auto",style:{height:O?"calc(3lh + 1rem)":"calc(1lh + 1rem)"},value:y,placeholder:r("petMode.placeholder"),"aria-label":r("petMode.placeholder"),disabled:N||Q||!Se||M===null,onChange:(e)=>{T(),H(e.target.value)},onFocus:()=>{T(),Be().catch(K)},onCompositionStart:()=>{if(u.current!==null)cancelAnimationFrame(u.current);u.current=null,C.current=!1,A.current=!0},onCompositionEnd:()=>{if(A.current=!1,C.current=!0,u.current!==null)cancelAnimationFrame(u.current);u.current=requestAnimationFrame(()=>{C.current=!1,u.current=null})},onKeyDown:(e)=>{if(e.key!=="Enter"||e.shiftKey||A.current||e.nativeEvent.isComposing||C.current||e.nativeEvent.keyCode===229)return;if(e.preventDefault(),me)B(fe)}}),v(We,{align:"block-end",className:ne("shrink-0",(d||c)&&"gap-1 p-0"),children:[v("div",{className:ne("flex min-w-0 items-center gap-2",!d&&"flex-1"),children:[Z&&o("p",{role:"status",className:"text-muted-foreground text-xs",children:c&&!w?o("span",{className:"shimmer",children:Z}):Z}),j?v(P,{className:"min-w-0 flex-1 justify-start",title:r("petMode.chooseSession"),"aria-label":r("petMode.chooseSession"),"aria-haspopup":"menu",disabled:N||M===null,onClick:(e)=>{let s=e.currentTarget.getBoundingClientRect();ze({x:s.left,y:s.bottom}).catch(K)},children:[a&&o("span",{role:"img","aria-label":r(a.windowLabel==="main"?"navigation.mainWindow":"navigation.chatWindow"),"data-icon":"inline-start",className:"inline-flex shrink-0",children:o(ye,{name:a.windowLabel,icons:t.sessionIcons})}),o("span",{className:"min-w-0 flex-1 truncate text-start",title:a?[a.cwd,a.title||r("collection.defaultChatTitle")].filter(Boolean).join(" / "):"",children:a?$e(a,r("collection.defaultChatTitle")):""})]}):!c&&o(P,{size:"icon-xs",className:d?"size-5":void 0,title:r("petMode.continue"),"aria-label":r("petMode.continue"),disabled:N||w||m!==null&&!m.accepted,onClick:()=>{T(),k(null),D(!1)},children:o(Ue,{})})]}),j&&o(P,{size:"icon-xs",variant:"default",className:"size-5 shrink-0",title:r("petMode.send"),"aria-label":r("petMode.send"),disabled:!me,onClick:()=>void B(fe),children:o(Fe,{className:"size-3"})}),o(P,{size:"icon-xs",className:"size-5 shrink-0",title:ge,"aria-label":ge,disabled:M===null||!a,onClick:X,children:a&&t.sessionIcons?o(ye,{name:a.windowLabel,icons:t.sessionIcons}):o(Pe,{className:"size-4"})})]})]}),d&&o("span",{role:"img","aria-label":r("petMode.completed"),title:r("petMode.completed"),className:"col-start-2 row-span-2 row-start-1 inline-flex size-7 items-center justify-center rounded-full bg-[var(--vibemon-completed-background)] text-[var(--vibemon-completed-foreground)]",children:o(je,{className:"size-4"})})]}),V&&M!==null&&S!==null&&o(te,{variant:"outline",size:"icon-xs",className:"text-muted-foreground absolute top-1 left-1 cursor-pointer rounded-full",style:{width:oe,height:oe},title:r("close"),"aria-label":r("close"),onClick:()=>void t.windows.call("bubble-close").catch(t.onError),children:o(He,{className:"size-2.5"})})]})}export{mn as PetQuickReply};
@@ -0,0 +1,6 @@
1
+ import { type SessionIcons } from "../../core/session-icon.js";
2
+ export { sessionIconSvg, type SessionIcons } from "../../core/session-icon.js";
3
+ export declare function SessionIcon({ name, icons }: {
4
+ name: "main" | "chat";
5
+ icons?: SessionIcons;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as s}from"react/jsx-runtime";import{sessionIconSvg as o}from"../../core/session-icon.js";import{sessionIconSvg as c}from"../../core/session-icon.js";function t({name:e,icons:n}){return s("span",{"aria-hidden":!0,className:"inline-flex size-[18px] items-center justify-center",dangerouslySetInnerHTML:{__html:o(e,n)}})}export{t as SessionIcon,c as sessionIconSvg};
@@ -0,0 +1,6 @@
1
+ export declare const SINGLE_PET_TOAST_MESSAGE = "This is your only pet. It\u2019s equipped by default and can\u2019t be unequipped ~";
2
+ export declare const SINGLE_PET_TOAST_DURATION_MS = 3000;
3
+ export declare function SinglePetToast({ requestId, onClose }: {
4
+ requestId: number;
5
+ onClose: () => void;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as a}from"react/jsx-runtime";import{singlePetToast as r}from"../assets.js";import{AnimatePresence as l,motion as c,useReducedMotion as u}from"motion/react";import{useEffect as d}from"react";import{Button as p}from"../ui/button.js";var m="This is your only pet. It’s equipped by default and can’t be unequipped ~",f=3000;function x({requestId:t,onClose:i}){let o=u(),n=t>0;return d(()=>{if(t===0)return;let s=window.setTimeout(i,f);return()=>window.clearTimeout(s)},[t,i]),e("div",{className:"pointer-events-none absolute bottom-[7.067%] left-1/2 z-30 h-[4.583cqw] w-[52.604cqw] -translate-x-1/2",children:e(l,{initial:!1,children:n&&a(c.div,{"data-testid":"single-pet-toast",className:"pointer-events-auto relative size-full",initial:{opacity:0,y:o?0:"100%"},animate:{opacity:1,y:0},exit:{opacity:0,y:o?0:"100%"},transition:o?{duration:0}:{duration:0.3,ease:[0.16,1,0.3,1]},children:[e("img",{src:r,alt:"","aria-hidden":!0,className:"absolute inset-0 size-full max-w-none select-none"}),e("span",{role:"status",className:"sr-only",children:m}),e(p,{"aria-label":"Close",onClick:i,className:"absolute top-1/4 right-[5.743%] aspect-square h-1/2 rounded-full border-0 bg-transparent p-0 shadow-none transition-none hover:bg-white/10 focus-visible:border-white focus-visible:ring-white/70 active:translate-y-0",children:e("span",{className:"sr-only",children:"Close"})})]})})})}export{f as SINGLE_PET_TOAST_DURATION_MS,m as SINGLE_PET_TOAST_MESSAGE,x as SinglePetToast};
@@ -0,0 +1,16 @@
1
+ import type { VibemonSpriteConfig } from "../../core/types.js";
2
+ interface SpriteRendererProps {
3
+ config: VibemonSpriteConfig;
4
+ spriteUrl: string;
5
+ stateId: string;
6
+ flipped: boolean;
7
+ active: boolean;
8
+ animTick?: number;
9
+ onFirstFrame?: () => void;
10
+ onDrawFrame?: () => void;
11
+ onRenderError?: (error: Error) => void;
12
+ onMouseDown: () => void;
13
+ onClick: () => void;
14
+ }
15
+ export declare function SpriteRenderer({ config, spriteUrl, stateId, flipped, active, animTick, onFirstFrame, onDrawFrame, onRenderError, onMouseDown, onClick }: SpriteRendererProps): import("react").JSX.Element;
16
+ export {};
@@ -0,0 +1 @@
1
+ import{jsx as H}from"react/jsx-runtime";import{useCallback as M,useEffect as j,useRef as u,useState as V}from"react";function _({config:r,spriteUrl:R,stateId:F,flipped:X,active:l,animTick:S,onFirstFrame:w,onDrawFrame:h,onRenderError:v,onMouseDown:k,onClick:G}){let i=u(null),a=u(0),t=u(null),z=u(null),c=u(!1),[I,b]=V(!1),s=r.states.find((e)=>e.id===F),f=s?.row??0,d=s?.frames??1,x=s?.fps??3,m=s?.loop??!0,C=u(w);C.current=w;let E=u(h);E.current=h;let g=u(v);g.current=v;let p=M((e,n)=>{let y=i.current,D=z.current;if(!y||!D)return;let o=y.getContext("2d");if(!o)return;o.imageSmoothingEnabled=!1,o.clearRect(0,0,r.renderSize,r.renderSize),o.drawImage(D,e*r.frameSize+r.cropX,n*r.frameSize+r.cropY,r.cropW,r.cropH,0,0,r.renderSize,r.renderSize),E.current?.()},[r]);return j(()=>{let e=!1;c.current=!1,b(!1);let n=new Image;return n.onload=()=>{if(e)return;z.current=n,b(!0)},n.onerror=()=>{if(!e)g.current?.(Error("Vibemon spritesheet could not be decoded"))},n.src=R,()=>{e=!0,n.onload=null,n.onerror=null}},[R]),j(()=>{if(!I||!l&&c.current)return;let e=i.current;if(!e)return;if(e.dataset.animationGeneration=String(S??0),t.current)clearInterval(t.current);if(a.current=0,p(0,f),!c.current)c.current=!0,C.current?.();if(!l)return;return t.current=setInterval(()=>{if(a.current++,a.current>=d){if(a.current=m?0:d-1,!m&&t.current)clearInterval(t.current),t.current=null}p(a.current,f)},1000/x),()=>{if(t.current)clearInterval(t.current)}},[f,d,x,m,S,I,l,p]),H("canvas",{ref:i,width:r.renderSize,height:r.renderSize,onMouseDown:(e)=>{if(e.button!==0)return;e.preventDefault(),k()},onClick:(e)=>{if(e.button!==0)return;G()},style:{width:"100%",height:"100%",imageRendering:"pixelated",transform:X?"scaleX(-1)":void 0,cursor:"pointer",pointerEvents:"auto"}})}export{_ as SpriteRenderer};
@@ -0,0 +1,3 @@
1
+ export declare function VibemonEmptyState({ onWish }: {
2
+ onWish: () => void;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{emptyPet as o}from"../assets.js";import{Button as s}from"../ui/button.js";function c({onWish:r}){return t("div",{className:"absolute inset-x-0 top-[18%] bottom-[8%] flex flex-col items-center justify-center",children:[e("img",{src:o,alt:"",className:"w-[10.938cqw] shrink-0 drop-shadow-[0_18px_28px_rgba(31,15,92,0.35)] select-none"}),t("p",{className:"mt-[1.5cqh] max-w-[19.792cqw] px-[1.25cqw] text-center text-[0.938cqw] leading-relaxed text-white/60",children:["No Vibémon to keep your lobby company~",e("br",{}),"draw one home!"]}),e(s,{onClick:r,className:"mt-[4cqh] h-[5.5cqh] min-w-[10.417cqw] rounded-full border border-white/75 bg-[linear-gradient(180deg,#C579F2_0%,#8A4FDB_100%)] px-[1.875cqw] text-[1.25cqw] font-black text-white shadow-[0_8px_18px_rgba(50,20,126,0.35),inset_0_2px_2px_rgba(255,255,255,0.5)] hover:bg-[linear-gradient(180deg,#CF87F6_0%,#9458E2_100%)]",style:{fontFamily:"Outfit, system-ui, sans-serif"},children:"Go Pull"})]})}export{c as VibemonEmptyState};
@@ -0,0 +1,16 @@
1
+ type SectionAction = {
2
+ kind: "album";
3
+ onClick: () => void;
4
+ hasUnseen: boolean;
5
+ } | {
6
+ kind: "equip";
7
+ onClick: () => void;
8
+ };
9
+ export declare function VibemonHeader({ onBack, onWish, sectionAction, availablePoints, pointsLoaded }: {
10
+ onBack: () => void;
11
+ onWish: () => void;
12
+ sectionAction: SectionAction;
13
+ availablePoints: number;
14
+ pointsLoaded?: boolean;
15
+ }): import("react").JSX.Element;
16
+ export {};
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as s,Fragment as l}from"react/jsx-runtime";import{albumIcon as r,pullBack as m,pullVibemonIcon as i}from"../assets.js";import{useState as d}from"react";import{Button as u}from"../ui/button.js";import{openAccountUrl as p}from"../../core/lib/recharge.js";import{BackToHome as b}from"./back-to-home.js";import{GemBalance as f}from"./gem-balance.js";import{WishButton as g}from"./wish-button.js";function q({action:a}){let[n,o]=d(!1),t=a.kind==="album";return s(u,{"aria-label":t?"Album":"Vibémon",onClick:a.onClick,onMouseEnter:()=>o(!0),onMouseLeave:()=>o(!1),className:"relative size-[3.333cqw] bg-transparent p-0 shadow-none hover:bg-transparent",children:[e("img",{src:t?r:i,alt:"",className:"size-full object-contain transition-transform duration-150 select-none",style:{transform:n?"translateY(-2px) scale(1.05)":"none"}}),t&&a.hasUnseen&&e("span",{className:"absolute top-0 right-0 size-2 rounded-full bg-[#F74640]"})]})}function N({onBack:a,onWish:n,sectionAction:o,availablePoints:t,pointsLoaded:c}){return s(l,{children:[e(b,{onClick:a,label:"Back",iconSrc:m,className:"absolute top-[5.333%] left-[6.25%] z-30 gap-[0.729cqw] text-[#BCACE0] hover:text-[#BCACE0] [&_img]:size-[3.021cqw] [&_span]:text-[1.667cqw]"}),s("div",{className:"absolute top-[5%] right-[6.25%] z-30 flex h-[5.5cqh] items-center gap-[2.292cqw]",children:[e(q,{action:o}),e(g,{onClick:n,className:"size-[3.333cqw]"}),e(f,{amount:t,onAdd:p,loaded:c,className:"h-[5.5cqh] min-w-0 rounded-[7.813cqw] py-0 pr-[0.417cqw] pl-[0.729cqw] [&_[data-slot=gem-balance-add-icon]]:size-[2.5cqw] [&>[data-slot=gem-balance-add]]:ms-[1.094cqw] [&>[data-slot=gem-balance-add]]:size-[2.5cqw] [&>[data-slot=gem-balance-amount]]:text-[1.563cqw] [&>[data-slot=gem-balance-icon]]:me-[0.156cqw] [&>[data-slot=gem-balance-icon]]:size-[2.5cqw]"})]})]})}export{N as VibemonHeader};
@@ -0,0 +1 @@
1
+ export declare function VibemonPage(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as M}from"react/jsx-runtime";import{gem as De,gemPlus as Ce,guideArrow as He,guideHand as Ne,guideHandShape as ke,guideHandSheen as Ue,guideHomeTexture as Oe,guideMascot as he,guidePullTexture as Ge,guideRing as qe,homeBackground as Fe,homeHotspotAssets as c,pullAlbumIcon as Me,pullBack as Be,pullGem as Te,pullPageBackground as je,pullTexture as $e,pullVibemonIcon as We}from"../assets.js";import{Loader2 as ze}from"lucide-react";import{useCallback as P,useEffect as h,useRef as S,useState as n}from"react";import{useTranslation as Je}from"react-i18next";import{toast as Ke}from"sonner";import{equipVibemonAfterDraw as Qe,getVibemonScopeSync as A}from"../lib/account-state.js";import{cardThumb as me}from"../lib/card-image.js";import{createDrawReward as Xe}from"../../core/lib/draw-result.js";import{gachaPoolImageUrls as Ye,loadGachaPoolCatalog as Ze}from"../../core/lib/gacha-pools.js";import{preloadImages as fe}from"../../core/lib/preload-images.js";import{syncVibemonResources as eo}from"../lib/resource-sync.js";import{getSetting as pe,getSettingSync as E,setSetting as be}from"../../core/lib/settings.js";import{drawGachaPool as oo,getGachaFirstDraw as no,getMyVibemons as to,getPointAccount as we,markVibemonFirstVisit as ro}from"../../core/lib/endpoints.js";import{consumePendingVibemonView as io,onVibemonViewRequest as ao}from"../../core/lib/view-request.js";import{AlbumView as so}from"./album-view.js";import{EquipView as lo}from"./equip-view.js";import{HomeView as co}from"./home-view.js";import{INTRO_VIDEO_URL as uo,IntroOverlay as mo}from"./intro-overlay.js";import{VibemonLoadingView as fo}from"./loading-view.js";import{PullOverlay as po}from"./pull-overlay.js";import{PullView as wo}from"./pull-view.js";var go=30000,B=[Fe,c.vibemon.icon,c.vibemon.hover,c.vibemon.text,c.wish.icon,c.wish.hover,c.wish.text,c.album.icon,c.album.hover,c.album.text,He,Oe,he],ge=[je,Be,We,Me,$e,Te,De,Ce,Ge,Ne,ke,Ue,he,qe],T=(r)=>{let i=A();return!!(i&&r[i])},j=(r,i)=>{let s=A();if(!s)return;be(r,{...E(r),[s]:i})},W=(r)=>{let i=A();if(!i)return null;return r[i]??null},ho=(r)=>{let i=A();if(!i)return;be("vibemon.onboardingStep",{...E("vibemon.onboardingStep"),[i]:r})};function Mo(){return t("div",{className:"contents",onContextMenu:(r)=>r.preventDefault(),children:t(bo,{})})}function bo(){let{t:r}=Je("vibemon"),[i,s]=n(()=>{let e=W(E("vibemon.onboardingStep"));return e==="free-draw"||e==="view-album"?"pull":"home"}),[I,u]=n("idle"),[f,ve]=n(()=>W(E("vibemon.onboardingStep"))),[p,z]=n(!1),[_,D]=n(!1),[b,Pe]=n([]),[Se,J]=n(null),[R,Ee]=n(!1),[C,K]=n(0),[H,Q]=n(!1),[Ie,Re]=n([]),[Ve,X]=n(!1),[N,ye]=n(null),[V,Y]=n(null),[Z,ee]=n({done:0,total:ge.length}),[Le,xe]=n(!1),[m,v]=n(()=>T(E("vibemon.introSeen"))?"loading":"resolving-intro"),[oe,Ae]=n({done:0,total:B.length}),[ne,_e]=n(null),te=S(!1),y=P((e)=>{ve(e),ho(e)},[]),l=P(()=>s("pull"),[]);h(()=>{if(m!=="loading"||te.current)return;te.current=!0,fe(B,(e)=>{Ae({done:e,total:B.length})}).catch((e)=>{let o=e instanceof Error?e:Error(String(e));_e(o)})},[m]);let re=S(0),ie=S(!1),k=S(!1),w=P(async()=>{let e=++re.current;try{let o=await to();if(e===re.current)Pe(o),Ee(!0),J(null)}catch(o){J(o instanceof Error?o:Error(String(o))),console.warn("[vibemon] getMyVibemons failed",o)}},[]),ae=S(!1),se=S(!1),U=P(async()=>{try{let e=await Ze();ye(e),Y(null);let o=[...new Set([...ge,...Ye(e)])],a=!ae.current;if(a)ee({done:0,total:o.length});if(await fe(o,(L)=>{if(a)ee({done:L,total:o.length})}),a)ae.current=!0,xe(!0)}catch(e){let o=e instanceof Error?e:Error(String(e));console.error("[vibemon] loadGachaPoolCatalog failed",o),Y(o)}},[]);h(()=>{if(m!=="loading"||se.current)return;se.current=!0,U()},[m,U]),h(()=>{let e=()=>{we().then((a)=>{K(a.available_points),Q(!0)}).catch((a)=>console.warn("[vibemon] getPointAccount failed",a))};e();let o=setInterval(e,go);return window.addEventListener("focus",e),()=>{clearInterval(o),window.removeEventListener("focus",e)}},[]),h(()=>{for(let e of b)new Image().src=me(e.gacha_url??e.cover_url)},[b]);let O=()=>{if(_)j("vibemon.albumHasUnseen",!1),D(!1);w(),s("album")},g=P(()=>{w(),s("equip")},[w]);h(()=>{if(ie.current)return;ie.current=!0,w(),Promise.all([no().catch((e)=>(console.warn("[vibemon] getGachaFirstDraw failed",e),{first_draw:!1})),pe("vibemon.albumHasUnseen")]).then(([e,o])=>{if(z(e.first_draw),D(T(o)),!e.first_draw)return;if(W(E("vibemon.onboardingStep"))==="free-draw"){l();return}y("home-wish"),s("home")}),pe("vibemon.introSeen").then((e)=>{if(T(e)){v("loading");return}return ro().then(({first_visit:o})=>{if(j("vibemon.introSeen",!0),o)s("home"),u("intro"),v("intro");else v("loading")})}).catch((e)=>{console.warn("[vibemon] first-visit check failed",e),v("loading")})},[l,w,y]);let[le,de]=n(!1),G=P((e)=>{if(p&&f==="home-wish")return;if(p&&f==="free-draw"){l();return}if(e==="pull")l();else if(e==="equip")g();else de(!0)},[p,f,g,l]);if(h(()=>{let e=io();if(e)G(e);return ao(G)},[G]),h(()=>{if(!le||!R)return;if(de(!1),b.length===0)l();else g()},[le,R,b.length,g,l]),Se!==null)return M("div",{role:"alert",className:"flex h-full flex-col items-center justify-center gap-3 bg-background p-6 text-foreground",children:[t("p",{children:r("offline.title")}),t("p",{className:"text-sm text-muted-foreground",children:r("offline.description")}),t("button",{type:"button",className:"rounded-md border px-4 py-2",onClick:()=>void w(),children:r("offline.retry")})]});if(m==="resolving-intro")return M("div",{className:"relative flex h-full w-full items-center justify-center overflow-hidden bg-[#120E18]",children:[t("video",{src:uo,preload:"auto",muted:!0,playsInline:!0,"aria-hidden":!0,className:"pointer-events-none absolute top-0 left-0 h-px w-px opacity-0"}),t(ze,{className:"size-10 animate-spin text-white"})]});if(m==="intro")return t("div",{className:"relative h-full w-full overflow-hidden bg-[#120E18]",children:t(mo,{onVideoStart:()=>u("intro"),onDone:()=>{u("idle"),v("loading")}})});if(ne!==null)throw ne;if(m==="loading"&&V!==null)throw V;if(m==="loading"){let e=oe.done+Z.done+(N===null?0:1)+(Le?1:0),o=oe.total+Z.total+2;return t("div",{className:"relative h-full w-full overflow-hidden",children:t(fo,{progress:e/o,onFinished:()=>v("ready")})})}if(i==="home")return t(co,{onDraw:()=>{if(f==="home-wish")y("free-draw");l()},onBackpack:O,onEquip:g,guideActive:p&&f==="home-wish"});if(i==="equip")return t(lo,{onBack:()=>s("home"),onWish:l,onAlbum:O,albumHasUnseen:_,ownedCards:b,ownedLoaded:R,availablePoints:C,pointsLoaded:H});if(i==="album")return t(so,{onBack:()=>s("home"),onWish:l,onEquip:g,ownedCards:b,ownedLoaded:R,availablePoints:C,pointsLoaded:H});if(V!==null)throw V;if(N===null)throw Error("[vibemon] app entered ready state without a gacha pool catalog");let ce=async(e,o)=>{if(k.current||I!=="idle")return;k.current=!0,X(!0);try{let a;try{a=await oo(e,o)}catch(d){console.warn("[vibemon] drawGachaPool failed",d),Ke.error(r("draw.failedNetwork"));return}let L=o==="SINGLE"?1:10;if(a.results.length!==L)throw Error(`[vibemon] ${o} draw response must contain ${L} results, received ${a.results.length}`);let ue=a.results.map(Xe),q=[];for(let[d,F]of a.results.entries()){if(F.reward_type==="WHITE_CARD")continue;q.push(F);let x=ue[d];if(x===void 0||x.kind!=="card")throw Error(`[vibemon] draw result ${F.draw_index} was not mapped to a Vibemon card`);new Image().src=me(o==="SINGLE"?x.singleImageUrl:x.multiImageUrl)}if(Re(ue),z(!1),f==="free-draw")y("view-album");if(u("video-waiting"),q.length>0){let d=q[0];if(d===void 0)throw Error("[vibemon] draw result lost its first Vibemon item");eo(),Qe(d.vibemon_uuid,p),w()}U(),we().then((d)=>{K(d.available_points),Q(!0)}).catch((d)=>console.warn("[vibemon] getPointAccount failed",d))}finally{k.current=!1,X(!1)}};return M("div",{className:"relative h-full w-full",children:[t(wo,{onBack:()=>s("home"),onAlbum:O,onEquip:g,isFirstDraw:p,availablePoints:C,pointsLoaded:H,onSingleDraw:(e)=>void ce(e,"SINGLE"),onMultiDraw:(e)=>void ce(e,"MULTI"),drawDisabled:Ve||I!=="idle",albumHasUnseen:_,guideActive:p&&f==="free-draw",poolCatalog:N}),I!=="intro"&&t(po,{phase:I,drawnRewards:Ie,onVideoStarted:()=>u("video-playing"),onPullDone:()=>u("result"),onPullFailed:()=>u("result"),onResultConfirmed:(e)=>{if(e)j("vibemon.albumHasUnseen",!0),D(!0);u("idle")}})]})}export{Mo as VibemonPage};
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function VibemonScene({ backdrop, children }: {
3
+ backdrop: ReactNode;
4
+ children: ReactNode;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";function n({backdrop:i,children:s}){return t("div",{className:"[container-type:size] relative h-full w-full overflow-hidden bg-[#0E0750]",children:[i,e("div",{className:"absolute inset-0 flex items-center justify-center",children:e("div",{"data-testid":"vibemon-stage",className:"[container-type:size] relative",style:{width:"min(100cqw, 160cqh)",aspectRatio:"8 / 5"},children:s})})]})}export{n as VibemonScene};
@@ -0,0 +1,23 @@
1
+ type VideoSource = {
2
+ src: string;
3
+ type: string;
4
+ };
5
+ type VideoFaderProps = {
6
+ playing?: boolean;
7
+ active?: boolean;
8
+ background?: string;
9
+ onFirstFrame: () => void;
10
+ onComplete: () => void;
11
+ onError: () => void;
12
+ } & ({
13
+ src: string;
14
+ sources?: never;
15
+ } | {
16
+ src?: never;
17
+ sources: readonly [
18
+ VideoSource,
19
+ ...VideoSource[]
20
+ ];
21
+ });
22
+ export declare function VideoFader({ src, sources, playing, active, background, onFirstFrame, onComplete, onError }: VideoFaderProps): import("react").JSX.Element;
23
+ export {};
@@ -0,0 +1 @@
1
+ import{jsx as h,jsxs as q}from"react/jsx-runtime";import{useLayoutEffect as D,useRef as t,useState as M}from"react";var z=1,G=100,H=1000;function P({src:i,sources:l,playing:R=!0,active:a=!0,background:k,onFirstFrame:A,onComplete:L,onError:F}){let m=t(null),_=t(null),c=t(0),p=t(!1),I=t(i===void 0?{sources:l}:{src:i});I.current=i===void 0?{sources:l}:{src:i};let[C,y]=M(0),[O,v]=M(!1),n=i===void 0?l.map((e)=>`${e.type}:${e.src}`).join("|"):i,w=t(n),N=t(L),S=t(A),j=t(F);return N.current=L,S.current=A,j.current=F,D(()=>{let e=m.current;if(e===null)throw Error("Video player is not mounted");if(!a)return;if(p.current=!1,w.current!==n)c.current=0;w.current=n;let o=I.current;if("src"in o)e.src=o.src;else{let u=e.querySelectorAll("source");o.sources.forEach((r,d)=>{u[d].setAttribute("src",r.src)})}e.defaultMuted=!0,e.muted=!0;let s=()=>{p.current=!0};return e.addEventListener("error",s),e.load(),()=>{c.current=e.currentTime,e.removeEventListener("error",s),e.pause(),e.removeAttribute("src");for(let u of e.querySelectorAll("source"))u.removeAttribute("src");e.load()}},[n,a]),D(()=>{let e=m.current,o=_.current;if(e===null||o===null)throw Error("Video player is not mounted");if(o.style.opacity="0",y(0),v(!1),!R){if(c.current=0,a)e.pause(),e.currentTime=0;return}if(!a)return;e.currentTime=c.current;let s=!1,u=!1,r=!1,d=!1,E=null,T=null,b=null,V=()=>{if(u||!e.duration)return;if(e.duration-e.currentTime<z)u=!0,y(1)},x=()=>{if(r)return;T=setTimeout(()=>{v(!0),y(0),b=setTimeout(()=>{if(r)return;r=!0,N.current()},H)},G)},f=()=>{if(s||r)return;r=!0,v(!0),j.current()};if(E=e.requestVideoFrameCallback(()=>{if(s||r||d||e.dataset.sourceKey!==n)return;d=!0,o.style.opacity="1",S.current()}),e.addEventListener("timeupdate",V),e.addEventListener("ended",x),e.addEventListener("error",f),p.current)f();else e.play().catch(f);return()=>{if(s=!0,e.removeEventListener("timeupdate",V),e.removeEventListener("ended",x),e.removeEventListener("error",f),E!==null)e.cancelVideoFrameCallback(E);if(T)clearTimeout(T);if(b)clearTimeout(b)}},[n,R,a]),q("div",{ref:_,"data-video-presentation":!0,className:"pointer-events-none absolute inset-0 z-20",style:{opacity:0,background:k},children:[h("video",{ref:m,"data-source-key":n,preload:"auto",muted:!0,playsInline:!0,className:"absolute inset-0 z-20 h-full w-full object-cover",style:{visibility:O?"hidden":"visible"},children:l===void 0?null:l.map((e)=>h("source",{type:e.type},`${e.type}:${e.src}`))}),h("div",{className:"pointer-events-none absolute inset-0 z-20 bg-white transition-opacity duration-1000 ease-in",style:{opacity:C}})]})}export{P as VideoFader};
@@ -0,0 +1,4 @@
1
+ export declare function WishButton({ onClick, className }: {
2
+ onClick: () => void;
3
+ className?: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as a}from"react/jsx-runtime";import{newTag as r,wishDefault as i,wishHover as l}from"../assets.js";import{useState as m}from"react";import{Button as c}from"../ui/button.js";import{cn as p}from"../lib/utils.js";function w({onClick:o,className:s}){let[n,e]=m(!1);return a(c,{"aria-label":"Wish",variant:"ghost",className:p("relative size-[64px] p-0 hover:bg-transparent",s),onClick:o,onMouseEnter:()=>e(!0),onMouseLeave:()=>e(!1),children:[t("img",{src:n?l:i,alt:"",className:"absolute top-[5.439%] left-[4.863%] h-[89.122%] w-[90.27%] max-w-none object-contain select-none"}),t("img",{src:r,alt:"",className:"pointer-events-none absolute top-[4.422%] left-[50.578%] h-[26.03%] w-[49.428%] max-w-none select-none"})]})}export{w as WishButton};
@@ -0,0 +1,4 @@
1
+ export { VibemonPage as PetCenter } from "./components/vibemon-page.js";
2
+ export { PetWindow } from "./components/pet-window.js";
3
+ export { PetQuickReply } from "./components/quick-reply.js";
4
+ export { PetModeButton } from "./components/pet-mode-button.js";
@@ -0,0 +1 @@
1
+ import{VibemonPage as t}from"./components/vibemon-page.js";import{PetWindow as m}from"./components/pet-window.js";import{PetQuickReply as P}from"./components/quick-reply.js";import{PetModeButton as n}from"./components/pet-mode-button.js";export{t as PetCenter,n as PetModeButton,P as PetQuickReply,m as PetWindow};
@@ -0,0 +1,2 @@
1
+ export * from "../../core/lib/account-state.js";
2
+ export declare const useVibemonState: () => import("../../core/lib/settings").PetAccountState;
@@ -0,0 +1 @@
1
+ import{useSyncExternalStore as t}from"react";import{currentState as r}from"../../core/lib/account-state.js";import{subscribeSettings as e}from"../../core/lib/settings.js";export*from"../../core/lib/account-state.js";var n=()=>t(e,r);export{n as useVibemonState};
@@ -0,0 +1 @@
1
+ export declare function cardThumb(url: string | null | undefined): string;
@@ -0,0 +1 @@
1
+ import{placeholderCard as e}from"../assets.js";var o=["https://static.alwith.ai/","https://static-alwith-ai-dev.tos-ap-southeast-1.bytepluses.com/"],i="x-tos-process=image/format,webp",a=e;function r(t){if(!t)return a;if(!o.some((s)=>t.startsWith(s)))return t;if(t.includes("x-tos-process="))return t;return`${t}${t.includes("?")?"&":"?"}${i}`}export{r as cardThumb};
@@ -0,0 +1,5 @@
1
+ import { type ResourceSyncStatus } from "../../core/lib/resource-sync.js";
2
+ export declare const useVibemonSyncStore: <T>(selector: (state: {
3
+ status: ResourceSyncStatus;
4
+ }) => T) => T;
5
+ export { syncVibemonResources } from "../../core/lib/resource-sync.js";
@@ -0,0 +1 @@
1
+ import{useStore as e}from"zustand";import{vibemonSyncStore as r}from"../../core/lib/resource-sync.js";import{syncVibemonResources as i}from"../../core/lib/resource-sync.js";var n=(o)=>e(r,o);export{i as syncVibemonResources,n as useVibemonSyncStore};
@@ -0,0 +1 @@
1
+ export { cn } from "cn";
@@ -0,0 +1 @@
1
+ import{cn as c}from"cn";export{c as cn};
@@ -0,0 +1,144 @@
1
+ export declare const vibemonLocales: {
2
+ readonly en: {
3
+ readonly vibemon: {
4
+ readonly draw: {
5
+ readonly failedRetry: "Draw failed, please try again later";
6
+ readonly failedNetwork: "Draw failed, please check your network and try again";
7
+ };
8
+ readonly offline: {
9
+ readonly title: "Pet assets are unavailable";
10
+ readonly description: "Reconnect to load your album and draw. Downloaded pets can still appear on the desktop.";
11
+ readonly retry: "Retry";
12
+ };
13
+ };
14
+ readonly common: {
15
+ readonly vibemon: {
16
+ readonly close: "Back to lounge";
17
+ readonly actionFailed: "Something went wrong, please try again";
18
+ readonly empty: "No Vibémon to keep you company yet";
19
+ readonly goDraw: "Go Pull";
20
+ readonly loading: "Loading…";
21
+ readonly syncPreparing: "Preparing Vibémon resources…";
22
+ readonly updateResources: "Update resources";
23
+ readonly done: "Done";
24
+ readonly permission: "Needs your approval";
25
+ readonly question: "Waiting for your answer";
26
+ readonly error: "Task failed";
27
+ readonly loungeConfirm: "Send Vibémon to the desktop?";
28
+ };
29
+ readonly petMode: {
30
+ readonly permission: "Permission request";
31
+ readonly question: "Question";
32
+ readonly openToAnswer: "Open conversation to answer";
33
+ readonly enter: "Collapse to vibemon";
34
+ readonly timeout: "Vibémon did not become ready. Your conversation is still open.";
35
+ readonly failed: "Could not switch to Vibémon";
36
+ readonly noPet: "No Vibémon yet";
37
+ readonly notEquipped: "Equip a Vibémon first";
38
+ readonly drawHint: "Open Vibémon to draw your first pet. Your conversation will stay open.";
39
+ readonly equipHint: "Open Vibémon to equip a pet. Your conversation will stay open.";
40
+ readonly goDraw: "Go to draw";
41
+ readonly goEquip: "Go to equip";
42
+ readonly replyingTo: "Replying to: {{name}}";
43
+ readonly chooseSession: "Choose a conversation";
44
+ readonly hint: "Follow multiple agents. Reply to one conversation.";
45
+ readonly restore: "Restore chat";
46
+ readonly placeholder: "Type freely";
47
+ readonly openFull: "Open full conversation";
48
+ readonly openMain: "Open conversation in main window";
49
+ readonly openChat: "Open conversation in chat window";
50
+ readonly send: "Send";
51
+ readonly thinking: "Thinking";
52
+ readonly sent: "Sent";
53
+ readonly continue: "Continue conversation";
54
+ readonly completed: "Completed";
55
+ readonly openToReply: "Open the full conversation to reply.";
56
+ };
57
+ readonly close: "Close";
58
+ readonly runState: {
59
+ readonly requires_action: "Requires action";
60
+ readonly running: "Running";
61
+ readonly done: "Done";
62
+ readonly idle: "Idle";
63
+ };
64
+ readonly navigation: {
65
+ readonly mainWindow: "Main window";
66
+ readonly chatWindow: "Chat window";
67
+ };
68
+ readonly collection: {
69
+ readonly defaultChatTitle: "New chat";
70
+ };
71
+ };
72
+ };
73
+ readonly "zh-CN": {
74
+ readonly vibemon: {
75
+ readonly draw: {
76
+ readonly failedRetry: "抽卡失败,请稍后重试";
77
+ readonly failedNetwork: "抽卡失败,请检查网络后重试";
78
+ };
79
+ readonly offline: {
80
+ readonly title: "暂时无法加载桌宠资产";
81
+ readonly description: "联网后可加载卡册和抽卡。已经下载的桌宠仍可在桌面展示。";
82
+ readonly retry: "重试";
83
+ };
84
+ };
85
+ readonly common: {
86
+ readonly vibemon: {
87
+ readonly close: "叫回休息室";
88
+ readonly actionFailed: "操作失败,请重试";
89
+ readonly empty: "还没有 Vibémon 陪你";
90
+ readonly goDraw: "去抽卡";
91
+ readonly loading: "加载中…";
92
+ readonly syncPreparing: "正在准备桌宠资源…";
93
+ readonly updateResources: "更新资源";
94
+ readonly done: "已完成";
95
+ readonly permission: "需要你授权";
96
+ readonly question: "等待你回答";
97
+ readonly error: "任务出错了";
98
+ readonly loungeConfirm: "送 Vibémon 上桌面?";
99
+ };
100
+ readonly petMode: {
101
+ readonly permission: "权限请求";
102
+ readonly question: "问题";
103
+ readonly openToAnswer: "打开会话回答";
104
+ readonly enter: "收起到 vibemon";
105
+ readonly timeout: "Vibémon 尚未就绪。你的会话仍然打开。";
106
+ readonly failed: "无法切换到 Vibémon";
107
+ readonly noPet: "尚无 Vibémon";
108
+ readonly notEquipped: "请先装配 Vibémon";
109
+ readonly drawHint: "打开 Vibémon 抽取你的第一只宠物。你的会话将保持打开。";
110
+ readonly equipHint: "打开 Vibémon 装配宠物。你的会话将保持打开。";
111
+ readonly goDraw: "前往抽卡";
112
+ readonly goEquip: "前往装配";
113
+ readonly replyingTo: "正在回复:{{name}}";
114
+ readonly chooseSession: "选择会话";
115
+ readonly hint: "关注多个 Agent,回复一个会话。";
116
+ readonly restore: "恢复聊天";
117
+ readonly placeholder: "随心输入";
118
+ readonly openFull: "打开完整会话";
119
+ readonly openMain: "打开主窗口会话";
120
+ readonly openChat: "打开浮窗会话";
121
+ readonly send: "发送";
122
+ readonly thinking: "正在思考";
123
+ readonly sent: "已发送";
124
+ readonly continue: "继续会话";
125
+ readonly completed: "已完成";
126
+ readonly openToReply: "请打开完整会话进行回复。";
127
+ };
128
+ readonly close: "关闭";
129
+ readonly runState: {
130
+ readonly requires_action: "待处理";
131
+ readonly running: "运行中";
132
+ readonly done: "完成";
133
+ readonly idle: "空闲";
134
+ };
135
+ readonly navigation: {
136
+ readonly mainWindow: "主窗口";
137
+ readonly chatWindow: "聊天窗";
138
+ };
139
+ readonly collection: {
140
+ readonly defaultChatTitle: "新对话";
141
+ };
142
+ };
143
+ };
144
+ };
@@ -0,0 +1 @@
1
+ var e={en:{vibemon:{draw:{failedRetry:"Draw failed, please try again later",failedNetwork:"Draw failed, please check your network and try again"},offline:{title:"Pet assets are unavailable",description:"Reconnect to load your album and draw. Downloaded pets can still appear on the desktop.",retry:"Retry"}},common:{vibemon:{close:"Back to lounge",actionFailed:"Something went wrong, please try again",empty:"No Vibémon to keep you company yet",goDraw:"Go Pull",loading:"Loading…",syncPreparing:"Preparing Vibémon resources…",updateResources:"Update resources",done:"Done",permission:"Needs your approval",question:"Waiting for your answer",error:"Task failed",loungeConfirm:"Send Vibémon to the desktop?"},petMode:{permission:"Permission request",question:"Question",openToAnswer:"Open conversation to answer",enter:"Collapse to vibemon",timeout:"Vibémon did not become ready. Your conversation is still open.",failed:"Could not switch to Vibémon",noPet:"No Vibémon yet",notEquipped:"Equip a Vibémon first",drawHint:"Open Vibémon to draw your first pet. Your conversation will stay open.",equipHint:"Open Vibémon to equip a pet. Your conversation will stay open.",goDraw:"Go to draw",goEquip:"Go to equip",replyingTo:"Replying to: {{name}}",chooseSession:"Choose a conversation",hint:"Follow multiple agents. Reply to one conversation.",restore:"Restore chat",placeholder:"Type freely",openFull:"Open full conversation",openMain:"Open conversation in main window",openChat:"Open conversation in chat window",send:"Send",thinking:"Thinking",sent:"Sent",continue:"Continue conversation",completed:"Completed",openToReply:"Open the full conversation to reply."},close:"Close",runState:{requires_action:"Requires action",running:"Running",done:"Done",idle:"Idle"},navigation:{mainWindow:"Main window",chatWindow:"Chat window"},collection:{defaultChatTitle:"New chat"}}},"zh-CN":{vibemon:{draw:{failedRetry:"抽卡失败,请稍后重试",failedNetwork:"抽卡失败,请检查网络后重试"},offline:{title:"暂时无法加载桌宠资产",description:"联网后可加载卡册和抽卡。已经下载的桌宠仍可在桌面展示。",retry:"重试"}},common:{vibemon:{close:"叫回休息室",actionFailed:"操作失败,请重试",empty:"还没有 Vibémon 陪你",goDraw:"去抽卡",loading:"加载中…",syncPreparing:"正在准备桌宠资源…",updateResources:"更新资源",done:"已完成",permission:"需要你授权",question:"等待你回答",error:"任务出错了",loungeConfirm:"送 Vibémon 上桌面?"},petMode:{permission:"权限请求",question:"问题",openToAnswer:"打开会话回答",enter:"收起到 vibemon",timeout:"Vibémon 尚未就绪。你的会话仍然打开。",failed:"无法切换到 Vibémon",noPet:"尚无 Vibémon",notEquipped:"请先装配 Vibémon",drawHint:"打开 Vibémon 抽取你的第一只宠物。你的会话将保持打开。",equipHint:"打开 Vibémon 装配宠物。你的会话将保持打开。",goDraw:"前往抽卡",goEquip:"前往装配",replyingTo:"正在回复:{{name}}",chooseSession:"选择会话",hint:"关注多个 Agent,回复一个会话。",restore:"恢复聊天",placeholder:"随心输入",openFull:"打开完整会话",openMain:"打开主窗口会话",openChat:"打开浮窗会话",send:"发送",thinking:"正在思考",sent:"已发送",continue:"继续会话",completed:"已完成",openToReply:"请打开完整会话进行回复。"},close:"关闭",runState:{requires_action:"待处理",running:"运行中",done:"完成",idle:"空闲"},navigation:{mainWindow:"主窗口",chatWindow:"聊天窗"},collection:{defaultChatTitle:"新对话"}}}};export{e as vibemonLocales};
@@ -0,0 +1,15 @@
1
+ @font-face {
2
+ font-family: "Grow Year";
3
+ src: url("../../../assets/pets/assets/fonts/GrowYear.woff2") format("woff2");
4
+ font-display: swap;
5
+ }
6
+ @font-face {
7
+ font-family: Outfit;
8
+ src: url("../../../assets/pets/assets/fonts/Outfit-Variable.woff2") format("woff2-variations");
9
+ font-weight: 100 900;
10
+ font-display: swap;
11
+ }
12
+ :root {
13
+ --vibemon-completed-background: var(--color-green-100);
14
+ --vibemon-completed-foreground: var(--color-green-600);
15
+ }
@@ -0,0 +1,8 @@
1
+ import { Button as ButtonPrimitive } from "@base-ui/react/button";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const buttonVariants: (props?: ({
4
+ variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
5
+ size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ declare function Button({ className, variant, size, ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>): import("react").JSX.Element;
8
+ export { Button, buttonVariants };
@@ -0,0 +1 @@
1
+ import{jsx as a}from"react/jsx-runtime";import{Button as n}from"@base-ui/react/button";import{cva as d}from"class-variance-authority";import{cn as o}from"cn";var s=d("group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/80",outline:"border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",lg:"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-9","icon-xs":"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function g({className:e,variant:r="default",size:i="default",...t}){return a(n,{"data-slot":"button",className:o(s({variant:r,size:i,className:e})),...t})}export{g as Button,s as buttonVariants};
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ declare function Card({ className, size, ...props }: React.ComponentProps<"div"> & {
3
+ size?: "default" | "sm";
4
+ }): React.JSX.Element;
5
+ declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
6
+ declare function CardTitle({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
7
+ declare function CardDescription({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
8
+ declare function CardAction({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
9
+ declare function CardContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
10
+ declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
11
+ export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
@@ -0,0 +1 @@
1
+ import{jsx as t}from"react/jsx-runtime";import{cn as d}from"cn";function c({className:a,size:r="default",...e}){return t("div",{"data-slot":"card","data-size":r,className:d("group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground shadow-xs ring-1 ring-foreground/10 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",a),...e})}function n({className:a,...r}){return t("div",{"data-slot":"card-header",className:d("group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",a),...r})}function i({className:a,...r}){return t("div",{"data-slot":"card-title",className:d("font-heading text-base leading-normal font-medium group-data-[size=sm]/card:text-sm",a),...r})}function l({className:a,...r}){return t("div",{"data-slot":"card-description",className:d("text-sm text-muted-foreground",a),...r})}function u({className:a,...r}){return t("div",{"data-slot":"card-action",className:d("col-start-2 row-span-2 row-start-1 self-start justify-self-end",a),...r})}function g({className:a,...r}){return t("div",{"data-slot":"card-content",className:d("flex flex-col gap-3 px-(--card-spacing)",a),...r})}function p({className:a,...r}){return t("div",{"data-slot":"card-footer",className:d("flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",a),...r})}export{c as Card,u as CardAction,g as CardContent,l as CardDescription,p as CardFooter,n as CardHeader,i as CardTitle};
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ import { Button } from "./button.js";
4
+ declare function InputGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
5
+ declare const inputGroupAddonVariants: (props?: ({
6
+ align?: "inline-start" | "inline-end" | "block-start" | "block-end" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
9
+ declare const inputGroupButtonVariants: (props?: ({
10
+ size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
+ declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size" | "type"> & VariantProps<typeof inputGroupButtonVariants> & {
13
+ type?: "button" | "submit" | "reset";
14
+ }): React.JSX.Element;
15
+ declare function InputGroupTextarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
16
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupTextarea };
@@ -0,0 +1 @@
1
+ import{jsx as n}from"react/jsx-runtime";import{cva as s}from"class-variance-authority";import{cn as o}from"cn";import{Button as u}from"./button.js";import{Textarea as l}from"./textarea.js";function m({className:a,...t}){return n("div",{"data-slot":"input-group",role:"group",className:o("group/input-group border-input has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 relative flex h-9 w-full min-w-0 items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-3 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",a),...t})}var d=s("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",{variants:{align:{"inline-start":"order-first pl-2 has-[>button]:-ml-1 has-[>kbd]:ml-[-0.15rem]","inline-end":"order-last pr-2 has-[>button]:-mr-1 has-[>kbd]:mr-[-0.15rem]","block-start":"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2","block-end":"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2"}},defaultVariants:{align:"inline-start"}});function x({className:a,align:t="inline-start",...i}){return n("div",{role:"group","data-slot":"input-group-addon","data-align":t,className:o(d({align:t}),a),onClick:(r)=>{if(r.target.closest("button"))return;r.currentTarget.parentElement?.querySelector("input")?.focus()},...i})}var p=s("flex items-center gap-2 text-sm shadow-none",{variants:{size:{xs:"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",sm:"","icon-xs":"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0","icon-sm":"size-8 p-0 has-[>svg]:p-0"}},defaultVariants:{size:"xs"}});function v({className:a,type:t="button",variant:i="ghost",size:r="xs",...e}){return n(u,{type:t,"data-size":r,variant:i,className:o(p({size:r}),a),...e})}function k({className:a,...t}){return n(l,{"data-slot":"input-group-control",className:o("flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 dark:bg-transparent",a),...t})}export{m as InputGroup,x as InputGroupAddon,v as InputGroupButton,k as InputGroupTextarea};
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1 @@
1
+ import{jsx as e}from"react/jsx-runtime";import{cn as a}from"cn";function n({className:r,...i}){return e("textarea",{"data-slot":"textarea",className:a("border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-2.5 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3 md:text-sm",r),...i})}export{n as Textarea};
@@ -0,0 +1,30 @@
1
+ import { type PetAssetsHost } from "./host.js";
2
+ import type { VibemonCatalogItem } from "./types.js";
3
+ export interface SheetLayout {
4
+ frameWidth: number;
5
+ frameHeight: number;
6
+ states: {
7
+ id: string;
8
+ row: number;
9
+ frames: number;
10
+ }[];
11
+ }
12
+ export interface CachedPetMetadata {
13
+ directory: string;
14
+ sheetName: string;
15
+ name?: string;
16
+ layout: SheetLayout;
17
+ version: number;
18
+ config?: Record<string, unknown>;
19
+ }
20
+ export interface CachedPetResource extends CachedPetMetadata {
21
+ sheet: Uint8Array;
22
+ }
23
+ export declare function parseSheetLayout(value: string): SheetLayout;
24
+ export declare function createPetResources(host: PetAssetsHost): {
25
+ inspect: (petId: string) => Promise<CachedPetMetadata | null>;
26
+ cached: (petId: string) => Promise<CachedPetResource | null>;
27
+ ensure: (item: VibemonCatalogItem) => Promise<CachedPetResource>;
28
+ cancel: () => void;
29
+ dispose(): void;
30
+ };
@@ -0,0 +1 @@
1
+ import{assertAccount as i}from"./host.js";var I=new TextEncoder,b=new TextDecoder;function v(e){let a=JSON.parse(e);if(!Number.isInteger(a.frameWidth)||a.frameWidth<=0||a.frameHeight!==a.frameWidth||!Array.isArray(a.states)||a.states.length===0||a.states.some((o)=>typeof o.id!=="string"||!o.id||!Number.isInteger(o.row)||o.row<0||!Number.isInteger(o.frames)||o.frames<=0))throw Error("Invalid Vibemon sprite layout");return a}function O(e){let a=!1,o=new Map,g=new Set,h=Promise.resolve();function S(n){if(a)throw Error("Vibemon resources disposed");let r=e.account();if(r===null)throw Error("Sign in to load Vibemon resources");if(!/^[a-zA-Z0-9_-]+$/.test(n)||!/^[a-zA-Z0-9.-]+$/.test(r.apiHost))throw Error("Invalid resource identity");return`vibemon/catalog/${r.apiHost}/${n}`}async function N(n){let r=e.account();if(r===null)throw Error("Sign in to load Vibemon resources");let t=S(n),s=await e.resources.read(`${t}/resource.json`);if(s===null){for(let d of[t,`vibemon/${r.apiHost}/${r.userId}/${n}`]){let f=await e.resources.read(`${d}/config.json`);if(f===null)continue;let u=JSON.parse(b.decode(f));if(!/^sprite-sheet\.(webp|png)$/.test(u.spritesheet))throw Error("Invalid legacy sprite filename");let w=v(JSON.stringify({frameWidth:u.frameSize,frameHeight:u.frameSize,states:u.states}));if(await e.resources.exists(`${d}/${u.spritesheet}`)){let p=await e.storage.get("vibemon.resourceVersion");return i(e,r),{directory:d,sheetName:u.spritesheet,layout:w,version:p?.[r.apiHost]?.[n]??0,config:u}}}return null}let c=JSON.parse(b.decode(s));if(v(JSON.stringify(c.layout)),!/^sprite-sheet\.(webp|png)$/.test(c.sheet))throw Error("Invalid sprite filename");let m=await e.resources.exists(`${t}/${c.sheet}`);i(e,r);let l=await e.resources.read(`${t}/config.json`);return i(e,r),!m?null:{directory:t,sheetName:c.sheet,name:c.name,layout:c.layout,version:c.version,config:l===null?void 0:JSON.parse(b.decode(l))}}async function E(n){let r=e.account();if(r===null)throw Error("Sign in to load Vibemon resources");let t=await N(n);if(t===null)return null;let s=await e.resources.read(`${t.directory}/${t.sheetName}`);return i(e,r),s===null?null:{...t,sheet:s}}async function V(n){let r=e.account();if(r===null)throw Error("Sign in to download Vibemon resources");let t=S(n.uuid),s=t,c=o.get(s);if(c){if(await c,o.get(s)===c)o.delete(s);return i(e,r),V(n)}let m=(async()=>{let l=await E(n.uuid);if(i(e,r),l!==null&&l.version===n.resource_version)return l;let d=v(n.layout),f=new URL(n.sheet_url);if(f.protocol!=="https:")throw Error("Vibemon sprites require HTTPS");let u=f.pathname.toLowerCase().endsWith(".png")?"sprite-sheet.png":"sprite-sheet.webp",w=new AbortController;g.add(w);let p=`${t}.${crypto.randomUUID()}.tmp`;try{let y=await e.download(f.href,w.signal);if(i(e,r),y.byteLength===0)throw Error("Empty Vibemon spritesheet");await e.resources.write(`${p}/${u}`,y),await e.resources.write(`${p}/resource.json`,I.encode(JSON.stringify({layout:d,version:n.resource_version,sheet:u,name:n.name}))),i(e,r),w.signal.throwIfAborted(),await e.resources.replace(p,t),i(e,r);let x=h.catch(()=>{}).then(async()=>{i(e,r);let A=await e.storage.get("vibemon.resourceVersion")??{};i(e,r),await e.storage.set("vibemon.resourceVersion",{...A,[r.apiHost]:{...A[r.apiHost],[n.uuid]:n.resource_version}})});return h=x,await x,i(e,r),{directory:t,sheetName:u,sheet:y,name:n.name,layout:d,version:n.resource_version}}finally{g.delete(w),await e.resources.remove(p)}})();o.set(s,m);try{return await m}finally{if(o.get(s)===m)o.delete(s)}}function H(){for(let n of g)n.abort();g.clear()}return{inspect:N,cached:E,ensure:V,cancel:H,dispose(){a=!0,H()}}}export{O as createPetResources,v as parseSheetLayout};
@@ -0,0 +1,7 @@
1
+ import { type PetAssetsHost } from "./host.js";
2
+ export declare function createPetSelection(host: PetAssetsHost, owned: (petId: string) => Promise<readonly {
3
+ vibemon_uuid: string;
4
+ }[]>): {
5
+ get(): Promise<string | null>;
6
+ select(petId: string | null): Promise<void>;
7
+ };
@@ -0,0 +1 @@
1
+ import{accountKey as u,assertAccount as c}from"./host.js";function w(n,s){let a=Promise.resolve();return{async get(){let e=n.account();if(e===null)return null;let t=await n.storage.get("vibemon.accounts");return c(n,e),t?.[u(e)]?.pet||null},async select(e){let t=n.account();if(t===null)throw Error("Sign in to select a Vibemon");if(e!==null&&!(await s(e)).some((o)=>o.vibemon_uuid===e))throw Error("This account does not own the selected Vibemon");c(n,t);let r=a.catch(()=>{}).then(async()=>{c(n,t);let o=await n.storage.get("vibemon.accounts")??{};c(n,t);let i=u(t);await n.storage.set("vibemon.accounts",{...o,[i]:{...o[i],pet:e??""}}),c(n,t)});a=r,await r}}}export{w as createPetSelection};