@serifpersia/dango 3.5.9 → 3.6.1
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 +44 -4
- package/client/dist/assets/{AnimeCard-CDeVbWJO.js → AnimeCard-DbrG4Bo-.js} +1 -1
- package/client/dist/assets/AnimeInfo-BivVqWcB.css +1 -0
- package/client/dist/assets/AnimeInfo-CgSQGjef.js +1 -0
- package/client/dist/assets/{AnimeInfoPage-Cc3OcfHY.js → AnimeInfoPage-DSybdvf_.js} +2 -2
- package/client/dist/assets/{Asmr-DZmR_EHb.js → Asmr-DFFV-7y4.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-DBCDlfYq.js → AsmrResetProgressModal-Brdfu_22.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-DBBUzoHn.js +10 -0
- package/client/dist/assets/AvSyncCalibrator-ZSpMgUid.css +1 -0
- package/client/dist/assets/Home-DeY8zvfI.css +1 -0
- package/client/dist/assets/{Home-BqhPqzWF.js → Home-DjGl-3os.js} +1 -1
- package/client/dist/assets/{Insights-CmbbDZr3.js → Insights-4O52Z1t2.js} +1 -1
- package/client/dist/assets/{LibraryListPage-jLA7gnux.js → LibraryListPage-Z0w_rmHP.js} +1 -1
- package/client/dist/assets/{ListeningList-Cm9zGlLB.js → ListeningList-DjbzDs1E.js} +1 -1
- package/client/dist/assets/{Manga-x4pVT4ZH.js → Manga-BRIDluzF.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-BPSW9UER.js → MangaInfoPage-Q4CjEGJH.js} +1 -1
- package/client/dist/assets/{MangaReadPage-V1iDbCfL.js → MangaReadPage-BbJK5FY6.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-Dto3km2X.js → MangaResetProgressModal-BCFPXDF6.js} +1 -1
- package/client/dist/assets/{Mature-B0DoN3tQ.js → Mature-DjQzs66p.js} +1 -1
- package/client/dist/assets/{MediaCard-D6_9HL2Z.js → MediaCard-DedwE5DX.js} +1 -1
- package/client/dist/assets/{Music-1MlUIfdw.js → Music-z2RkiMDf.js} +1 -1
- package/client/dist/assets/{OptionListMenu-BWwktIiH.js → OptionListMenu-CetjZizt.js} +1 -1
- package/client/dist/assets/Player-DCB994_8.css +1 -0
- package/client/dist/assets/{Player-Dgtn--lM.js → Player-DD-9SgWU.js} +6 -6
- package/client/dist/assets/PlayerSettings-BXGe3F5k.css +1 -0
- package/client/dist/assets/{PlayerSettings-CI5hGpEU.js → PlayerSettings-ne_DQSTl.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-DjcdOJgg.js → QueueOptionsButton-CIKT4YcD.js} +1 -1
- package/client/dist/assets/{QueueRail-B5z_xhzj.js → QueueRail-DPclldS0.js} +1 -1
- package/client/dist/assets/{Radio-BAE-Q-iN.js → Radio-aeqPTMht.js} +1 -1
- package/client/dist/assets/{ReadingList-B97i_hGv.js → ReadingList-p6G7NHtC.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-C7-CvTi-.js → ResetProgressModal-B7UuuL3X.js} +1 -1
- package/client/dist/assets/{Search-CbPFjKeU.js → Search-BzyHVByR.js} +1 -1
- package/client/dist/assets/Settings-DMmtLUsL.js +21 -0
- package/client/dist/assets/{SkeletonGrid-BA_x2PRl.js → SkeletonGrid-B5JXhZO4.js} +1 -1
- package/client/dist/assets/Trackers-tLL1afjB.js +2 -0
- package/client/dist/assets/Tv-Bdruknna.css +1 -0
- package/client/dist/assets/Tv-CluLN4KA.js +4 -0
- package/client/dist/assets/{TvInfo-CxSmzVSL.js → TvInfo-DmrBLjgK.js} +1 -1
- package/client/dist/assets/{TvPopup-S5blnD3l.js → TvPopup-D1mSlOZt.js} +1 -1
- package/client/dist/assets/{TvSearch-B-2sRNbN.js → TvSearch-BGQRUq9E.js} +1 -1
- package/client/dist/assets/{TvWatchlist-MaA-qhQw.js → TvWatchlist-DdLkpeQT.js} +1 -1
- package/client/dist/assets/{Watchlist-yVEi1oVn.js → Watchlist-BObmM6QB.js} +1 -1
- package/client/dist/assets/{hls-CnFtaJwf.js → hls-qCuNYJym.js} +1 -1
- package/client/dist/assets/index-B4AdKbhW.js +178 -0
- package/client/dist/assets/index-D0Haw_Zl.css +1 -0
- package/client/dist/assets/{useAnimeInfoData-BqAd5seW.js → useAnimeInfoData-CSnwUBuU.js} +1 -1
- package/client/dist/assets/{useAsmr-B1vlDm2S.js → useAsmr-BKAaWEXn.js} +1 -1
- package/client/dist/assets/{useAsmrPopup-BNJC4JQo.js → useAsmrPopup-DDLRBLzz.js} +1 -1
- package/client/dist/assets/{useMangaLibrary-CU3bFfuD.js → useMangaLibrary-C6XEMuSr.js} +1 -1
- package/client/dist/assets/{useMangaPopup-LbRnTFzq.js → useMangaPopup-wfCJubPD.js} +1 -1
- package/client/dist/assets/{useProviders-CvKGEjDV.js → useProviders-C7jrBgxf.js} +1 -1
- package/client/dist/assets/{useTv-LsgXHZD4.js → useTv-DM5KtzEc.js} +1 -1
- package/client/dist/assets/{useTvLibrary-c90knUfT.js → useTvLibrary-73NkS_5R.js} +1 -1
- package/client/dist/index.html +2 -2
- package/orchestrator.js +107 -8
- package/package.json +2 -2
- package/server/dist/app-hono.js +13 -8
- package/server/dist/config.js +3 -2
- package/server/dist/hono/auth.js +0 -7
- package/server/dist/trpc/routers/auth.js +16 -0
- package/server/package.json +1 -1
- package/client/dist/assets/AnimeInfo-BFWtHlPC.css +0 -1
- package/client/dist/assets/AnimeInfo-DVpM_cPF.js +0 -1
- package/client/dist/assets/AvSyncCalibrator-Cf5L0Dxf.js +0 -10
- package/client/dist/assets/AvSyncCalibrator-ieaRTs3u.css +0 -1
- package/client/dist/assets/Home-B_q2l74h.css +0 -1
- package/client/dist/assets/Player-DBLl-bj_.css +0 -1
- package/client/dist/assets/PlayerSettings-Bj6SsmQ2.css +0 -1
- package/client/dist/assets/Settings-BbihEcZ2.js +0 -21
- package/client/dist/assets/Trackers-Bperfrcz.js +0 -2
- package/client/dist/assets/Tv-BSGuUz2F.js +0 -4
- package/client/dist/assets/Tv-BlVIanQL.css +0 -1
- package/client/dist/assets/index-Ck-R0JKv.css +0 -1
- package/client/dist/assets/index-DNxWyfmM.js +0 -178
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as t,h as Re,g as Be,A as De,q as $e,u as e,S as d}from"./vendor-core-DfaOB3Rn.js";import{u as qe,b as Fe,a as I}from"./vendor-query-BBT5_sHx.js";import{z as i,t as h,W as nn,j as an,B as le}from"./index-DNxWyfmM.js";import{I as l}from"./vendor-icons-DrybRNxP.js";function tn(){const K=qe(),[Y,k]=t(!1);return Re(()=>{const s=new URLSearchParams(window.location.search),b=s.get("anilist");if(b){const m=s.get("user"),_=s.get("reason");window.history.replaceState(null,"",window.location.pathname),b==="success"?(i.success(m?`Connected to AniList as ${decodeURIComponent(m)}`:"Connected to AniList"),K.invalidateQueries({queryKey:["trackerStatus"]})):i.error(_?decodeURIComponent(_):"AniList authentication failed");return}const j=new URLSearchParams(window.location.hash.substring(1)),y=j.get("access_token"),x=s.get("code");if(!y&&!x){const m=j.get("error");m&&(i.error(`AniList error: ${m}`),window.history.replaceState(null,"",window.location.pathname));return}const g=window.location.origin+window.location.pathname;window.history.replaceState(null,"",window.location.pathname),k(!0),i("Connecting to AniList..."),h.tracker.anilistAuth.mutate(y?{token:y}:{code:x,redirectUri:g}).then(async m=>{const _=m.user;i.success(`Connected to AniList as ${_?.name??"AniList user"}`),K.invalidateQueries({queryKey:["trackerStatus"]})}).catch(m=>{i.error(m instanceof Error?m.message:"Failed to authenticate with AniList")}).finally(()=>{k(!1)})},[K]),Y}const sn="_header_j1lbh_1",rn="_fadeIn_j1lbh_1",ln="_pageTitle_j1lbh_6",on="_pageSubtitle_j1lbh_14",cn="_importCard_j1lbh_20",dn="_slideUpIn_j1lbh_1",mn="_cardHeader_j1lbh_37",pn="_uploadArea_j1lbh_55",hn="_fileInputWrapper_j1lbh_59",un="_fileInput_j1lbh_59",gn="_fileDisplay_j1lbh_87",yn="_fileIcon_j1lbh_95",bn="_fileName_j1lbh_100",_n="_browseButton_j1lbh_109",fn="_optionsArea_j1lbh_120",Nn="_checkboxLabel_j1lbh_128",kn="_checkbox_j1lbh_128",wn="_checkboxCustom_j1lbh_141",vn="_optionText_j1lbh_169",In="_optionTitle_j1lbh_175",xn="_optionDesc_j1lbh_181",Mn="_actions_j1lbh_187",Cn="_importBtn_j1lbh_195",Ln="_cancelBtn_j1lbh_201",Sn="_statusMessage_j1lbh_215",Tn="_success_j1lbh_225",An="_error_j1lbh_231",jn="_progressSection_j1lbh_237",Pn="_progressBar_j1lbh_242",En="_progressFill_j1lbh_250",Bn="_progressInfo_j1lbh_257",Dn="_progressCount_j1lbh_264",$n="_progressTitle_j1lbh_271",Fn="_sourceBadge_j1lbh_289",Un="_anilist_j1lbh_301",Rn="_kitsu_j1lbh_307",qn="_offline_j1lbh_313",Kn="_skipped_j1lbh_319",On="_cardTitleRow_j1lbh_324",Qn="_anilistIcon_j1lbh_334",Gn="_malIcon_j1lbh_340",Hn="_badgeOnline_j1lbh_346",Wn="_badgeOffline_j1lbh_358",zn="_connectedProfile_j1lbh_370",Xn="_avatar_j1lbh_379",Jn="_connectedInfo_j1lbh_386",Yn="_connectedName_j1lbh_394",Vn="_connectedHint_j1lbh_400",Zn="_loginPrompt_j1lbh_405",ea="_loginSection_j1lbh_413",na="_fieldLabel_j1lbh_419",aa="_helpText_j1lbh_438",ta="_loginText_j1lbh_455",sa="_primaryBtn_j1lbh_464",ia="_secondaryBtn_j1lbh_465",ra="_syncBtn_j1lbh_466",la="_divider_j1lbh_518",oa="_actionSection_j1lbh_524",ca="_inputGroup_j1lbh_538",da="_input_j1lbh_538",ma="_syncSummary_j1lbh_559",pa="_syncErrors_j1lbh_565",ha="_spin_j1lbh_569",ua="_radioGroup_j1lbh_598",ga="_radioLabel_j1lbh_604",ya="_syncHint_j1lbh_642",ba="_importLoading_j1lbh_649",n={header:sn,fadeIn:rn,pageTitle:ln,pageSubtitle:on,importCard:cn,slideUpIn:dn,cardHeader:mn,uploadArea:pn,fileInputWrapper:hn,fileInput:un,fileDisplay:gn,fileIcon:yn,fileName:bn,browseButton:_n,optionsArea:fn,checkboxLabel:Nn,checkbox:kn,checkboxCustom:wn,optionText:vn,optionTitle:In,optionDesc:xn,actions:Mn,importBtn:Cn,cancelBtn:Ln,statusMessage:Sn,success:Tn,error:An,progressSection:jn,progressBar:Pn,progressFill:En,progressInfo:Bn,progressCount:Dn,progressTitle:$n,sourceBadge:Fn,anilist:Un,kitsu:Rn,offline:qn,skipped:Kn,cardTitleRow:On,anilistIcon:Qn,malIcon:Gn,badgeOnline:Hn,badgeOffline:Wn,connectedProfile:zn,avatar:Xn,connectedInfo:Jn,connectedName:Yn,connectedHint:Vn,loginPrompt:Zn,loginSection:ea,fieldLabel:na,helpText:aa,loginText:ta,primaryBtn:sa,secondaryBtn:ia,syncBtn:ra,divider:la,actionSection:oa,inputGroup:ca,input:da,syncSummary:ma,syncErrors:pa,spin:ha,radioGroup:ua,radioLabel:ga,syncHint:ya,importLoading:ba},oe="tracker_anilist_client_id",Ue="49887".trim(),wa=()=>{const{setIsOpen:K}=nn(),{contentType:Y}=an(),k=Y==="manga",s=qe();Be.useEffect(()=>{document.title="Trackers - dango"},[]);const[b,j]=t(""),[y,x]=t("username"),[g,m]=t(null),[_,ce]=t(""),[M,de]=t(!1),Ke=tn(),{data:me,isLoading:pe}=Fe({queryKey:["trackerStatus"],queryFn:async()=>await h.tracker.status.query()}),{data:C}=Fe({queryKey:["anilistClientId"],queryFn:async()=>(await h.settings.getByKey.query({key:oe})).value||""}),he=De(!1);Be.useEffect(()=>{he.current||C!==void 0&&(C&&ce(C),he.current=!0)},[C]);const w=me?.anilist?.connected??!1;Re(()=>{w&&x("sync")},[w]);const O=me?.anilist?.user??null,V=!!Ue,Oe=(C||"").trim(),Qe=async()=>{const a=_.trim(),r=a||Ue;if(!r){i.error("Enter your AniList client ID first");return}const N=async(A,se)=>{await h.settings.set.mutate({key:A,value:se})};try{a?a!==C&&await N(oe,a):V&&Oe&&await N(oe,""),s.invalidateQueries({queryKey:["anilistClientId"]})}catch(A){i.error(A.message);return}const o=window.location.origin+window.location.pathname,U=encodeURIComponent(o);window.location.href=`https://anilist.co/api/v2/oauth/authorize?client_id=${encodeURIComponent(r)}&response_type=token&state=${U}`},ue=I({mutationFn:async()=>h.tracker.anilistDisconnect.mutate(),onSuccess:()=>{s.invalidateQueries({queryKey:["trackerStatus"]}),i.success("Disconnected from AniList")},onError:a=>i.error(a.message)}),Q=I({mutationFn:async()=>(await h.tracker.sync.mutate({provider:"anilist"})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),m(a),i.success(`Sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}`,{duration:6e3})},onError:a=>i.error(a.message)}),[P,ge]=t(""),[G,ye]=t("sync"),[Z,be]=t("two-way"),[c,Ge]=t(null),H=I({mutationFn:async()=>(await h.tracker.mangaSync.mutate({direction:Z})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),Ge(a);const r=(a.warnings?.length??0)>0?`, ${a.warnings.length} warning(s)`:"";i.success(`Manga sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}${r}`,{duration:6e3})},onError:a=>i.error(a.message)}),L=I({mutationFn:async()=>{if(!P.trim())throw new Error("Please enter a username");return(await h.tracker.mangaImport.mutate({username:P.trim(),erase:M})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from AniList`),ge("")},onError:a=>i.error(a.message)}),[E,_e]=t(""),[W,fe]=t("username"),[ee,Ne]=t(null),[z,ke]=t(!1),[we,ne]=t(""),[ve,He]=t(""),f=I({mutationFn:async()=>{if(!E.trim())throw new Error("Please enter a MAL username");const a=await h.tracker.mangaMalImport.mutate({username:E.trim(),erase:M});return{imported:a.imported??0,skipped:a.skipped??0}},onSuccess:({imported:a,skipped:r})=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from MAL${r>0?`, skipped ${r}`:""}`),_e("")},onError:a=>i.error(a.message)}),We=$e(async()=>{const a=document.getElementById("malMangaFile");if(!a.files||a.files.length===0){ne("Please select a file first.");return}ke(!0),ne(""),Ne(null);try{const r=new FormData;r.append("xmlfile",a.files[0]),r.append("erase",String(M));const N=await fetch("/api/import/mal-xml-manga",{method:"POST",body:r}),o=await N.json().catch(()=>({}));if(!N.ok)throw new Error(o.error||"Import failed");Ne({imported:o.imported??0,skipped:o.skipped??0}),s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]})}catch(r){ne(r.message)}finally{ke(!1)}},[M,s]),S=I({mutationFn:async()=>{if(!b.trim())throw new Error("Please enter a username");return(await h.tracker.anilistImport.mutate({username:b.trim(),erase:v})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from AniList`),j("")},onError:a=>i.error(a.message)}),[B,Ie]=t(""),u=I({mutationFn:async a=>{if(!B.trim())throw new Error("Please enter a MAL username");return(await h.tracker.malImport.mutate({username:B.trim(),erase:a.erase,useOfflineDb:a.useOfflineDb,skipFallback:a.skipFallback})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from MAL`),Ie("")},onError:a=>i.error(a.message)}),[v,xe]=t(!1),[D,ze]=t(!0),[$,Xe]=t(!1),[Me,Ce]=t(""),[T,Le]=t(!1),[p,Se]=t(null),[ae,Te]=t(null),[Ae,X]=t(""),te=De(null),Je=a=>{a.target.files&&a.target.files.length>0?Ce(a.target.files[0].name):Ce("")},Ye=$e(async()=>{const a=document.getElementById("malFile");if(!a.files||a.files.length===0){X("Please select a file first.");return}const r=a.files[0];Le(!0),Se(null),Te(null),X("");const N=new AbortController;te.current=N;try{const o=new FormData;o.append("xmlfile",r),o.append("erase",String(v)),o.append("useOfflineDb",String(D)),o.append("skipFallback",String($));const U=await fetch("/api/import/mal-xml",{method:"POST",body:o,signal:N.signal});if(!U.ok){const re=await U.text();let R="Failed to import";try{R=JSON.parse(re).error||R}catch{}throw new Error(R)}const A=U.body?.getReader();if(!A)throw new Error("No response stream");const se=new TextDecoder;let ie="",J="";for(;;){const{done:re,value:R}=await A.read();if(re)break;ie+=se.decode(R,{stream:!0});const Pe=ie.split(`
|
|
2
|
-
`);ie=Pe.pop()||"";for(const q of Pe)if(q.startsWith("event: "))J=q.slice(7).trim();else if(q.startsWith("data: ")){const en=q.slice(6);try{const Ee=JSON.parse(en);J==="progress"?Se(Ee):J==="complete"&&Te(Ee)}catch{}}else q===""&&(J="")}s.invalidateQueries({queryKey:["watchlist"]})}catch(o){o instanceof DOMException&&o.name==="AbortError"?X("Import cancelled."):X(o.message)}finally{Le(!1),te.current=null}},[v,D,$,s]),Ve=()=>{te.current?.abort(),h.settings.malImportCancel.mutate().catch(()=>{})},Ze=p?Math.round(p.current/p.total*100):0,[F,je]=t("username");return e("div",{className:"page-container",children:[e("div",{className:n.header,children:[e("h1",{className:n.pageTitle,children:"Trackers"}),e("p",{className:n.pageSubtitle,children:"Import & sync your anime watchlists and manga reading lists with tracking services"})]}),e("div",{style:{marginBottom:"16px",padding:"10px 14px",borderRadius:"8px",fontSize:"0.85rem",background:"color-mix(in srgb, var(--color-warning) 8%, transparent)",border:"1px solid color-mix(in srgb, var(--color-warning) 25%, transparent)",color:"var(--text-secondary)"},children:"⚠ Syncing writes directly to your AniList entries, and dango may not always handle anime/manga lists correctly — always keep a backup of your lists before syncing."}),!k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList"}),pe?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w&&O?e("div",{className:n.connectedProfile,children:[O.avatar&&e("img",{src:O.avatar,alt:"Avatar",className:n.avatar,loading:"lazy",decoding:"async"}),e("div",{className:n.connectedInfo,children:[e("span",{className:n.connectedName,children:O.name}),e("span",{className:n.connectedHint,children:"2-way sync is ready"})]}),e("button",{className:n.secondaryBtn,onClick:()=>ue.mutate(),disabled:ue.isPending,children:[e(l,{name:"sign-out-alt"})," Disconnect"]})]}):e("div",{className:n.loginSection,children:[e("p",{className:n.loginText,children:["Log in with AniList to enable bidirectional progress & status synchronization.",Ke&&e("span",{style:{marginLeft:8,color:"var(--accent)"},children:"Finishing login…"})]}),e("div",{className:n.fieldLabel,children:["AniList client ID — defaults to Dango's app"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:["create your own app ",e(l,{name:"external-link-alt",size:9})]})]}),e("div",{className:n.inputGroup,children:[e("input",{type:"text",placeholder:"Client ID",value:_,onChange:a=>ce(a.target.value),className:n.input}),e("button",{className:n.primaryBtn,onClick:Qe,disabled:!(_.trim()||V),children:[e(l,{name:"external-link-alt"})," Connect"]})]}),e("p",{className:n.helpText,children:V?e(d,{children:["By default uses Dango's client. To use your own AniList app: create it at"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:"anilist.co/settings/developer"}),", set its ",e("strong",{children:"Redirect URL"})," to"," ",e("code",{children:window.location.port==="5173"?`${window.location.protocol}//${window.location.hostname}:3000/api/tracker/anilist/callback`:`${window.location.origin}/api/tracker/anilist/callback`}),", then paste only the ",e("strong",{children:"Client ID"})," above (leave empty to use Dango's)."]}):e(d,{children:["No shipped client in this build — create your own app at"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:"anilist.co/settings/developer"}),", set ",e("strong",{children:"Redirect URL"})," to"," ",e("code",{children:window.location.port==="5173"?`${window.location.protocol}//${window.location.hostname}:3000/api/tracker/anilist/callback`:`${window.location.origin}/api/tracker/anilist/callback`}),", then paste the ",e("strong",{children:"Client ID"})," above."]})})]}),w&&e(d,{children:[e("hr",{className:n.divider}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"anilistMode",value:"username",checked:y==="username",onChange:()=>x("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"anilistMode",value:"sync",checked:y==="sync",onChange:()=>x("sync")}),e("span",{children:"Two-way Sync"})]})]}),y==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:b,onChange:a=>j(a.target.value),className:n.input,disabled:S.isPending,onKeyDown:a=>{a.key==="Enter"&&b.trim()&&S.mutate()}})}):e("p",{className:n.syncHint,children:"Merges progress non-destructively: pushes shows and episodes you watched on dango to AniList, and pulls anything you updated on AniList into dango."}),y==="username"&&e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:v,onChange:a=>xe(a.target.checked),className:n.checkbox,disabled:S.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Erase current watchlist"}),e("span",{className:n.optionDesc,children:"Delete existing watchlist before importing."})]})]})}),y==="username"?e("button",{className:n.syncBtn,onClick:()=>S.mutate(),disabled:!b.trim()||S.isPending,children:[e(l,{name:"download"}),S.isPending?"Importing...":"Start Import"]}):e(d,{children:[e("button",{className:n.syncBtn,onClick:()=>Q.mutate(),disabled:Q.isPending,children:[e(l,{name:"sync-alt",className:Q.isPending?n.spin:""}),Q.isPending?"Syncing...":"Start Sync"]}),g&&e("div",{className:n.syncSummary,children:["Pushed: ",g.pushed," · Pulled: ",g.pulled," · Merged:"," ",g.merged," · Unchanged: ",g.unchanged,g.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",g.errors.length," error",g.errors.length>1?"s":""]})]})]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:["AniList ",e("code",{children:"Rewatching (REPEATING)"})," is not tracked — entries with this status are ignored."]})]})]})}),k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList Manga"}),pe?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w?e(d,{children:[e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"username",checked:G==="username",onChange:()=>ye("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"sync",checked:G==="sync",onChange:()=>ye("sync")}),e("span",{children:"Two-way Sync"})]})]}),G==="username"?e(d,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:P,onChange:a=>ge(a.target.value),className:n.input,disabled:L.isPending,onKeyDown:a=>{a.key==="Enter"&&P.trim()&&L.mutate()}})}),e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:M,onChange:a=>de(a.target.checked),className:n.checkbox,disabled:L.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Replace AniList-linked manga"}),e("span",{className:n.optionDesc,children:"Clears previously imported (anilist:) entries before importing. Your provider bookmarks are never touched."})]})]})})]}):e(d,{children:[e("p",{className:n.syncHint,children:"Merges chapter progress non-destructively: pushes manga and chapters you read on dango to AniList, and pulls anything you updated on AniList into dango. Local titles are linked only on exact title matches, and bookmarks with no chapters read are never pushed."}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaDirection",value:"two-way",checked:Z==="two-way",onChange:()=>be("two-way")}),e("span",{children:"Two-way"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaDirection",value:"pull-only",checked:Z==="pull-only",onChange:()=>be("pull-only")}),e("span",{children:"Pull only (never writes to AniList)"})]})]})]}),G==="username"?e("button",{className:n.syncBtn,onClick:()=>L.mutate(),disabled:!P.trim()||L.isPending,children:[e(l,{name:"download"}),L.isPending?"Importing...":"Start Import"]}):e(d,{children:[e("button",{className:n.syncBtn,onClick:()=>H.mutate(),disabled:H.isPending,children:[e(l,{name:"sync-alt",className:H.isPending?n.spin:""}),H.isPending?"Syncing...":"Start Manga Sync"]}),c&&e(d,{children:[e("div",{className:n.syncSummary,children:["Pushed: ",c.pushed," · Pulled: ",c.pulled," · Merged: ",c.merged," · Unchanged:"," ",c.unchanged,(c.skipped??0)>0&&e("span",{children:[" · Skipped: ",c.skipped]}),c.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",c.errors.length," error",c.errors.length>1?"s":""]})]}),(c.warnings?.length??0)>0&&e("div",{className:n.syncErrors,style:{marginTop:"8px"},children:[(c.warnings??[]).slice(0,5).map((a,r)=>e("div",{children:["⚠ ",a]},r)),(c.warnings?.length??0)>5&&e("div",{children:["+",(c.warnings?.length??0)-5," more warning(s)"]})]})]})]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:["AniList ",e("code",{children:"Rereading (REPEATING)"})," is not tracked — entries with this status are ignored."]})]}):e("p",{className:n.loginText,children:"Connect your AniList account above to sync your manga reading list."})]})}),!k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"myanimelist",className:n.malIcon}),e("h3",{children:"MyAnimeList"})]})}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"username",checked:F==="username",onChange:()=>je("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"xml",checked:F==="xml",onChange:()=>je("xml")}),e("span",{children:"XML File"})]})]}),F==="username"?e(d,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:B,onChange:a=>Ie(a.target.value),className:n.input,disabled:u.isPending,onKeyDown:a=>{a.key==="Enter"&&B.trim()&&u.mutate({erase:v,useOfflineDb:D,skipFallback:$})}})}),u.isPending&&e("div",{className:n.importLoading,children:[e(l,{name:"sync-alt",className:n.spin}),e("span",{children:"Importing from MAL..."})]})]}):e("div",{className:n.uploadArea,children:e("div",{className:n.fileInputWrapper,children:[e("input",{type:"file",id:"malFile",accept:".xml,application/xml",className:n.fileInput,onChange:Je,disabled:T}),e("div",{className:n.fileDisplay,children:[e(l,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:Me||"Choose XML file..."})]}),e("label",{htmlFor:"malFile",className:n.browseButton,children:"Browse"})]})}),e("div",{className:n.optionsArea,children:[e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:v,onChange:a=>xe(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Erase current watchlist"}),e("span",{className:n.optionDesc,children:"Delete existing watchlist before importing."})]})]}),e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:D,onChange:a=>ze(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Use offline database (fast)"}),e("span",{className:n.optionDesc,children:"Match by MAL ID locally first — instant and avoids AniList rate limits."})]})]}),e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:$,onChange:a=>Xe(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Skip online fallback"}),e("span",{className:n.optionDesc,children:"Only import offline matches. Unmatched titles are skipped without API calls."})]})]})]}),F==="username"?e("button",{className:n.syncBtn,onClick:()=>u.mutate({erase:v,useOfflineDb:D,skipFallback:$}),disabled:!B.trim()||u.isPending,children:[e(l,{name:"download"}),u.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:T?e(le,{onClick:Ve,className:n.cancelBtn,children:"Cancel Import"}):e(le,{onClick:Ye,className:n.importBtn,disabled:!Me,children:[e(l,{name:"upload"})," Start Import"]})}),F==="username"&&u.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:u.error.message}),T&&p&&e("div",{className:n.progressSection,children:[e("div",{className:n.progressBar,children:e("div",{className:n.progressFill,style:{width:`${Ze}%`}})}),e("div",{className:n.progressInfo,children:[e("span",{className:n.progressCount,children:[p.current," / ",p.total]}),e("span",{className:n.progressTitle,children:p.found?e(d,{children:[p.matchedTitle,e("span",{className:`${n.sourceBadge} ${n[p.source||"anilist"]}`,children:p.source==="kitsu"?"Kitsu":p.source==="offline"?"Offline DB":"AniList"})]}):e("span",{className:n.skipped,children:["Skipped: ",p.title]})})]})]}),ae&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",ae.imported,", Skipped: ",ae.skipped,"."]}),Ae&&e("div",{className:`${n.statusMessage} ${n.error}`,children:Ae})]})}),k&&e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"myanimelist",className:n.malIcon}),e("h3",{children:"MyAnimeList Manga"})]})}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMangaMode",value:"username",checked:W==="username",onChange:()=>fe("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMangaMode",value:"xml",checked:W==="xml",onChange:()=>fe("xml")}),e("span",{children:"XML File"})]})]}),W==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:E,onChange:a=>_e(a.target.value),className:n.input,disabled:f.isPending,onKeyDown:a=>{a.key==="Enter"&&E.trim()&&f.mutate()}})}):e("div",{className:n.uploadArea,children:e("div",{className:n.fileInputWrapper,children:[e("input",{type:"file",id:"malMangaFile",accept:".xml,application/xml",className:n.fileInput,onChange:a=>He(a.target.files?.[0]?.name??""),disabled:z}),e("div",{className:n.fileDisplay,children:[e(l,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:ve||"Choose XML file..."})]}),e("label",{htmlFor:"malMangaFile",className:n.browseButton,children:"Browse"})]})}),e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:M,onChange:a=>de(a.target.checked),className:n.checkbox,disabled:f.isPending||z}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Replace AniList-linked manga"}),e("span",{className:n.optionDesc,children:"Clears previously imported (anilist:) entries before importing. Your provider bookmarks are never touched."})]})]})}),W==="username"?e("button",{className:n.syncBtn,onClick:()=>f.mutate(),disabled:!E.trim()||f.isPending,children:[e(l,{name:"download"}),f.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:e(le,{onClick:We,className:n.importBtn,disabled:z||!ve,children:[e(l,{name:"upload"})," ",z?"Importing...":"Start Import"]})}),f.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:f.error.message}),we&&e("div",{className:`${n.statusMessage} ${n.error}`,children:we}),ee&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",ee.imported,", Skipped:"," ",ee.skipped,"."]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:"MAL manga is matched to AniList by MAL ID with a title fallback. Unmatched titles are skipped. Imports land as AniList-linked entries alongside your provider bookmarks."})]})]})};export{wa as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{u as t,d as _,A,h as v,S as Le,g as Yr,o as Gr,p as Qr,a as Xr,T as Ee,q as S}from"./vendor-core-DfaOB3Rn.js";import{u as Zr}from"./vendor-query-BBT5_sHx.js";import{g as an,e as Jr,t as _t,z as es,O as ts,M as Mn,B as We}from"./index-DNxWyfmM.js";import{I as V}from"./vendor-icons-DrybRNxP.js";import{S as ns,U as rs,p as Dn,M as ss,D as fr,m as On,k as os,C as as,a as is,b as ls,c as sn,u as cs,d as ds,e as us,j as ms,f as hs,h as fs,l as gs,B as ps,i as Ln,F as bs,G as vs,H as ur,s as Pn,n as ys,o as _s,q as Ss,r as Ts,t as Ze,A as Cs,v as ks,E as Es,y as xs,P as Ns,w as Se,z as Is,R as Bs}from"./AvSyncCalibrator-Cf5L0Dxf.js";import{S as ws,O as Rn,a as As,A as Ms,b as Ls}from"./OptionListMenu-BWwktIiH.js";import{u as Ps}from"./useProviders-CvKGEjDV.js";import{d as Rs,g as $s,h as Ds,f as Os,e as Fs,j as Vs,k as js}from"./useTvLibrary-c90knUfT.js";import{l as Us,c as Ws}from"./hls-CnFtaJwf.js";import{u as zs}from"./useIsMobile-Dvx1uJ82.js";import{S as Hs}from"./SynopsisText-B3Sa5pRv.js";const Ks="_fullscreenFlat_1xij1_1",qs="_timeDisplay_1xij1_15",Ys="_bottomControls_1xij1_19",Gs="_leftControls_1xij1_23",Qs="_rightControls_1xij1_24",Xs="_controlBtn_1xij1_28",Zs="_controlsOverlay_1xij1_47",Js="_hidden_1xij1_67",eo="_topControls_1xij1_73",to="_backBtn_1xij1_93",no="_videoTitleInfo_1xij1_113",ro="_animeTitle_1xij1_119",so="_episodeLabel_1xij1_127",oo="_speedBoostBadge_1xij1_134",ao="_progressBarContainer_1xij1_180",io="_progressBar_1xij1_180",lo="_thumb_1xij1_199",co="_bufferedBar_1xij1_217",uo="_watchedBar_1xij1_227",mo="_scrubbing_1xij1_252",ho="_timeBubble_1xij1_256",fo="_bottomControlsRow_1xij1_270",go="_nextEpisodeBtn_1xij1_293",po="_active_1xij1_346",bo="_settingsPanel_1xij1_421",vo="_settingsHeader_1xij1_440",yo="_settingsBackBtn_1xij1_448",_o="_settingsTitle_1xij1_466",So="_settingsContent_1xij1_477",To="_currentValue_1xij1_486",Co="_menuItem_1xij1_501",ko="_menuNote_1xij1_534",Eo="_loadingOverlay_1xij1_547",xo="_loadingDots_1xij1_558",No="_dot_1xij1_563",Io="_bufferingOverlay_1xij1_592",Bo="_bufferingSpinner_1xij1_601",a={fullscreenFlat:Ks,timeDisplay:qs,bottomControls:Ys,leftControls:Gs,rightControls:Qs,controlBtn:Xs,controlsOverlay:Zs,hidden:Js,topControls:eo,backBtn:to,videoTitleInfo:no,animeTitle:ro,episodeLabel:so,speedBoostBadge:oo,progressBarContainer:ao,progressBar:io,thumb:lo,bufferedBar:co,watchedBar:uo,scrubbing:mo,timeBubble:ho,bottomControlsRow:fo,nextEpisodeBtn:go,active:po,settingsPanel:bo,settingsHeader:vo,settingsBackBtn:yo,settingsTitle:_o,settingsContent:So,currentValue:To,menuItem:Co,menuNote:ko,loadingOverlay:Eo,loadingDots:xo,dot:No,bufferingOverlay:Io,bufferingSpinner:Bo},wo=({player:o,visible:b,settingsOpen:W,onOpenSettings:F,onCloseSettings:G,hasSubtitles:R,isSubtitleActive:r,subtitles:B,onSubtitleChange:i,showNextEpisodeButton:te,onNextEpisode:Q,isTheaterMode:$,onTheaterModeToggle:f,timeLabelRef:K})=>{const{state:h,refs:ze,actions:D}=o,X=ze.videoRef,Pe=T=>{const ne=X.current;!ne||isNaN(h.duration)||h.duration===0||(ne.currentTime=T*h.duration)},Re=()=>{X.current&&(D.setIsScrubbing(!0),D.wasPlayingBeforeScrub.current=!X.current.paused,X.current.pause())},He=T=>{const ne=X.current;ne&&h.duration&&(ne.currentTime=T*h.duration)},Ke=()=>{D.setIsScrubbing(!1),D.wasPlayingBeforeScrub.current&&X.current?.play().catch(()=>{})},Je=T=>{const ne=X.current;ne&&(ne.volume=T,ne.muted=T===0)},ae=()=>{if(r){i(-1);return}let T=null;try{T=localStorage.getItem("tvLastSubtitle")}catch{}i(Dn(B,{lastKey:T,enabled:!0}))},q=h.isMuted?t(V,{name:"volume-mute"}):h.volume<.5?t(V,{name:"volume-down"}):t(V,{name:"volume-up"});return t("div",{className:`${a.controlsOverlay} ${b?"":a.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:a.bottomControls,onClick:T=>T.stopPropagation(),children:[t(ns,{classes:{container:a.progressBarContainer,scrubbing:a.scrubbing,timeBubble:a.timeBubble,bar:a.progressBar,buffered:a.bufferedBar,watched:a.watchedBar,thumb:a.thumb},videoRef:X,duration:h.duration,formatTime:an,isScrubbing:h.isScrubbing,buffered:"full",onSeek:Pe,onScrubStart:Re,onScrubMove:He,onScrubEnd:Ke,timeLabelRef:K}),t("div",{className:a.bottomControlsRow,children:[t("div",{className:a.leftControls,children:[t("button",{className:a.controlBtn,onClick:D.togglePlay,"aria-label":h.isPlaying?"Pause":"Play",children:h.isPlaying?t(V,{name:"pause"}):t(V,{name:"play"})}),t(rs,{muted:h.isMuted,volume:h.volume,volumeIcon:q,buttonClassName:a.controlBtn,onToggleMute:D.toggleMute,onVolumeChange:Je,onExpandedChange:T=>D.setShowVolumeSlider(T)}),t("span",{className:a.timeDisplay,ref:K,children:[an(0)," / ",an(h.duration)]})]}),t("div",{className:a.rightControls,children:[te&&t("button",{className:a.nextEpisodeBtn,onClick:Q,title:"Play next episode",children:"Next EP"}),R&&t("button",{className:`${a.controlBtn} ${r?a.active:""}`,onClick:ae,"aria-label":r?"Turn subtitles off":"Turn subtitles on",children:t(V,{name:"closed-captioning"})}),t("button",{className:`${a.controlBtn} ${W?a.active:""}`,onClick:()=>W?G():F(),"aria-label":"Settings",children:t(V,{name:"cog"})}),t("button",{className:`${a.controlBtn} ${$?a.active:""}`,onClick:T=>{T.stopPropagation(),f()},title:$?"Exit Theater Mode":"Theater Mode","aria-label":$?"Exit Theater Mode":"Theater Mode",children:t(V,{name:"tv"})}),t("button",{className:a.controlBtn,onClick:D.toggleFullscreen,"aria-label":h.isFullscreen?"Exit Fullscreen":"Fullscreen",children:h.isFullscreen?t(V,{name:"compress"}):t(V,{name:"expand"})})]})]})]})})},on=-6e4,$n=6e4,mr=500,Ao=({classes:o,delayMs:b,onDelayChange:W})=>{const[F,G]=_(null),R=F??b,r=A(W);r.current=W;const B=A(b);B.current=b;const i=A(null);i.current=F,v(()=>{G(null)},[b]),v(()=>()=>{const $=i.current;$!==null&&$!==B.current&&r.current($)},[]);const te=$=>{B.current=$,i.current=null,r.current($),G(null)},Q=$=>{const f=i.current??B.current,K=Math.max(on,Math.min($n,f+$));te(K)};return t(Le,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:o.item,onClick:()=>Q(-mr),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:o.item,onClick:()=>Q(mr),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:o.item,onClick:()=>te(0),disabled:R===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(ss,{label:"Subtitle timing",display:fr(R),min:on,max:$n,step:100,value:R,percent:(R-on)/($n-on)*100,onChange:$=>{const f=Math.round($);i.current=f,G(f)},onCommit:()=>{const $=i.current;$!==null&&te($)}}),t("div",{className:o.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},Mo=({view:o,onSelectView:b,onClose:W,player:F,onSubtitleStyleChange:G,streams:R,resolutionIdx:r,onResolutionChange:B,hasSubtitles:i,subtitles:te,selectedSubtitle:Q,isSubtitleActive:$,onSubtitleChange:f,audioTracks:K,selectedAudioTrack:h,onAudioTrackChange:ze,videoDelayEnabled:D,onVideoDelayToggle:X,videoDelayMs:Pe,onVideoDelayChange:Re,onCalibrate:He,subtitleDelayMs:Ke,onSubtitleDelayChange:Je,ambientSettings:ae,onAmbientChange:q})=>{const{state:T}=F,ne=()=>t(Le,{children:[R.length>1&&t("button",{className:a.menuItem,onClick:()=>b("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:a.currentValue,children:R[r]?.quality||"Auto"})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:a.currentValue,children:$?te[Q]?.label||te[Q]?.language:"Off"})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:a.currentValue,children:[T.subtitleFontSize.toFixed(1),"x · ",T.subtitlePosition]})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:a.currentValue,children:fr(Ke)})]}),K.length>0&&t("button",{className:a.menuItem,onClick:()=>b("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:a.currentValue,children:K[h]?.label||K[h]?.language})]}),t("button",{className:a.menuItem,onClick:()=>b("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:a.currentValue,children:D?`${Pe}ms`:"Off"})]}),ae&&q&&t("button",{className:a.menuItem,onClick:()=>b("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:a.currentValue,children:ae.enabled?"On":"Off"})]})]}),Te=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:R.map((C,z)=>({key:String(z),label:C.quality,selected:z===r})),onSelect:C=>B(Number(C))}),Y=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:[{key:"off",label:"Off",selected:!$},...te.map((C,z)=>({key:String(z),label:C.label||C.language,selected:z===Q}))],onSelect:C=>f(C==="off"?-1:Number(C))}),Ce=()=>t(As,{classes:{item:a.menuItem,active:a.active},values:{fontSize:T.subtitleFontSize,position:T.subtitlePosition,bgOpacity:T.subtitleBgOpacity,bgColor:T.subtitleBgColor,textColor:T.subtitleTextColor,edge:T.subtitleEdge,bold:T.subtitleBold},onChange:G}),M=()=>t(Ao,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},delayMs:Ke,onDelayChange:C=>Je?.(C)}),$e=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:K.map((C,z)=>({key:String(z),label:C.label||C.language,selected:z===h})),onSelect:C=>ze(Number(C))}),qe=()=>t(Ms,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},enabled:D,delayMs:Pe,onToggle:C=>X?.(C),onDelayChange:C=>Re?.(C),onCalibrate:He}),pe=()=>ae&&q?t(Ls,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},values:ae,onChange:q}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:C=>C.stopPropagation(),children:t(ws,{classes:{panel:a.settingsPanel,header:a.settingsHeader,backBtn:a.settingsBackBtn,title:a.settingsTitle,content:a.settingsContent},title:o==="main"?"Settings":o==="subtitle-style"?"Subtitle Style":o==="subtitle-timing"?"Subtitle Timing":o==="audio"?"Audio Track":o==="resolution"?"Resolution":o==="av-sync"?"A/V Sync":o==="ambient"?"Ambient Light":o.charAt(0).toUpperCase()+o.slice(1),onBack:()=>o==="main"?W():b("main"),children:[o==="main"&&ne(),o==="resolution"&&Te(),o==="subtitles"&&Y(),o==="subtitle-style"&&Ce(),o==="subtitle-timing"&&M(),o==="audio"&&$e(),o==="av-sync"&&qe(),o==="ambient"&&pe()]})})},Lo=({player:o,title:b,episodeLabel:W,audioTracks:F,selectedAudioTrack:G,onAudioTrackChange:R,subtitles:r,selectedSubtitle:B,onSubtitleChange:i,streams:te,resolutionIdx:Q,onResolutionChange:$,onBack:f,children:K,videoDelayEnabled:h=!1,onVideoDelayToggle:ze,videoDelayMs:D=0,onVideoDelayChange:X,onCalibrateAvSync:Pe,subtitleDelayMs:Re=0,onSubtitleDelayChange:He,showNextEpisodeButton:Ke=!1,onNextEpisode:Je,isLoading:ae=!1,isTheaterMode:q,onTheaterModeToggle:T,ambientSettings:ne,onAmbientChange:Te})=>{const{state:Y,refs:Ce,actions:M}=o,$e=Ce.videoRef,{subtitleFontSize:qe,subtitlePosition:pe,subtitleBgOpacity:C,subtitleBgColor:z,subtitleTextColor:it,subtitleEdge:ie,subtitleBold:De}=Y,[xe,Oe]=_(null),lt=A(null),[Vt,St]=_(0);v(()=>{const le=$e.current;if(!le)return;const u=()=>St(le.clientHeight||0);u();const ut=new ResizeObserver(u);return ut.observe(le),()=>ut.disconnect()},[$e]);const ue=(le,u)=>{try{localStorage.setItem(le,String(u))}catch{}},be=(le,u)=>{switch(le){case"fontSize":typeof u=="number"&&(M.setSubtitleFontSize(u),ue("subtitleFontSize",u));break;case"position":typeof u=="number"&&(M.setSubtitlePosition(u),ue("subtitlePosition",u));break;case"bgOpacity":typeof u=="number"&&(M.setSubtitleBgOpacity(u),ue("subtitleBgOpacity",u));break;case"bgColor":typeof u=="string"&&(M.setSubtitleBgColor(u),ue("subtitleBgColor",u));break;case"textColor":typeof u=="string"&&(M.setSubtitleTextColor(u),ue("subtitleTextColor",u));break;case"edge":(u==="shadow"||u==="outline"||u==="none")&&(M.setSubtitleEdge(u),ue("subtitleEdge",u));break;case"bold":typeof u=="boolean"&&(M.setSubtitleBold(u),ue("subtitleBold",u));break}};v(()=>{const le="tv-player-subtitle-style";let u=document.getElementById(le);u||(u=document.createElement("style"),u.id=le,document.head.appendChild(u));const ut={fontSize:qe,position:pe,bgOpacity:C,bgColor:z,textColor:it,edge:ie,bold:De},Z=$e.current,Et=On(qe,Vt||Z?.clientHeight||720);if(u.textContent=os({...ut,fontSize:Et}),Z){const xt=()=>{const w=Number(pe);return isNaN(w)?0:Math.max(0,Math.min(100,w))},mt=(w,J)=>{try{const de=w;de.snapToLines=!1,de.line=J}catch{}},Nt=()=>{const w=Et*16,J=Z.videoHeight||Z.clientHeight||720,de=Z.videoWidth||Z.clientWidth||1280;return{step:w*1.3/J*100,chars:Math.max(20,Math.floor(de/(w*.55)))}},y=w=>{const J=Math.max(0,Math.min(100,100-xt())),de=Array.from(w.activeCues??[]);if(de.length<=1){de.forEach(Ve=>mt(Ve,J));return}const{step:wt,chars:cn}=Nt();let ke=J;for(let Ve=de.length-1;Ve>=0;Ve--){const dn=String(de[Ve].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
-
`).reduce((un,ve)=>un+Math.max(1,Math.ceil(ve.length/cn)),0),Wt=ke-dn*wt;mt(de[Ve],Math.max(0,Wt)),ke=Wt-wt*.4}},c=()=>{const w=Math.max(0,Math.min(100,100-xt()));Array.from(Z.textTracks).forEach(J=>{J.cues&&(Array.from(J.cues).forEach(de=>mt(de,w)),J.mode==="showing"&&y(J))})};c();const re=w=>{const J=w.target;J.mode==="showing"&&y(J)},ce=()=>{Array.from(Z.textTracks).forEach(w=>{w.removeEventListener("cuechange",re),w.addEventListener("cuechange",re)}),c()};Array.from(Z.textTracks).forEach(w=>{w.addEventListener("cuechange",re)}),Z.textTracks.addEventListener("addtrack",ce);const It=Array.from(Z.querySelectorAll("track")),Bt=()=>c();return It.forEach(w=>w.addEventListener("load",Bt)),()=>{Array.from(Z.textTracks).forEach(w=>{w.removeEventListener("cuechange",re)}),Z.textTracks.removeEventListener("addtrack",ce),It.forEach(w=>w.removeEventListener("load",Bt))}}},[qe,pe,C,z,it,ie,De,B,r,$e,Vt]);const Tt=r.length>0,ct=B>=0,L=()=>{Oe("main"),M.setShowControls(!0)},dt=()=>{Oe(null)},Ct=Y.showControls||!!xe,Fe=t(ls,{visible:Ct,title:b,episode:W,onBack:f,classes:{overlay:a.controlsOverlay,hidden:a.hidden,top:a.topControls,backBtn:a.backBtn,titleInfo:a.videoTitleInfo,title:a.animeTitle,episode:a.episodeLabel}}),jt=!ae&&!Y.isBuffering&&Y.duration>0?t(as,{isPlaying:Y.isPlaying,onTogglePlay:M.togglePlay,onSkipBack:()=>M.seek(-10),onSkipForward:()=>M.seek(10)}):null,ln=t(wo,{player:o,visible:Ct,settingsOpen:!!xe,onOpenSettings:L,onCloseSettings:dt,hasSubtitles:Tt,isSubtitleActive:ct,subtitles:r,onSubtitleChange:i,showNextEpisodeButton:Ke,onNextEpisode:Je,isTheaterMode:q,onTheaterModeToggle:T,timeLabelRef:lt}),kt=xe?t(Mo,{view:xe,onSelectView:Oe,onClose:dt,player:o,onSubtitleStyleChange:be,streams:te,resolutionIdx:Q,onResolutionChange:$,hasSubtitles:Tt,subtitles:r,selectedSubtitle:B,isSubtitleActive:ct,onSubtitleChange:i,audioTracks:F,selectedAudioTrack:G,onAudioTrackChange:R,videoDelayEnabled:h,onVideoDelayToggle:ze,videoDelayMs:D,onVideoDelayChange:X,onCalibrate:()=>{Oe(null),Pe?.()},subtitleDelayMs:Re,onSubtitleDelayChange:He,ambientSettings:ne,onAmbientChange:Te}):null,Ut=t(Le,{children:[ae&&t("div",{className:a.loadingOverlay,"aria-hidden":"true",children:t("div",{className:a.loadingDots,children:[t("div",{className:a.dot}),t("div",{className:a.dot}),t("div",{className:a.dot})]})}),Y.isBuffering&&!ae&&t("div",{className:a.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:a.bufferingSpinner})}),Y.isSpeedBoostActive&&t("div",{className:a.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(V,{name:"forward",size:12})]})]});return t(is,{player:o,topBar:Fe,centerControls:jt,bottomBar:!ae&&Y.duration>0?ln:null,settingsPanel:kt,overlays:Ut,isInteracting:!!xe,className:Y.isFullscreen?a.fullscreenFlat:"",children:K})},Po=({servers:o,selectedServer:b,onServerSelect:W})=>o.length===0?null:t("div",{className:sn.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:sn.sourceButtons,children:o.map(F=>t("button",{className:`${sn.sourceButton} ${b===F?sn.active:""}`,onClick:()=>W(F),children:F},F))})]}),Ro=Yr.memo(Po);function $o(o,b,W){const F=()=>{const R=Array.isArray(o.audioTracks)?o.audioTracks.length:0,r=W.getWant(),B=R>0?Math.min(Math.max(0,r),R-1):r;o.audioTrack=B,B!==r&&W.onResolve(B)},G=(R,r)=>{const B=W.getWant(),i=Array.isArray(o.audioTracks)?o.audioTracks.length:0;if(r.id!==B&&B>=0&&B<i){o.audioTrack!==B&&(o.audioTrack=B);return}W.onResolve(r.id)};return o.on(b.MANIFEST_PARSED,F),o.on(b.AUDIO_TRACK_SWITCHED,G),()=>{o.off(b.MANIFEST_PARSED,F),o.off(b.AUDIO_TRACK_SWITCHED,G)}}const Do=/\b(SmartTV|SMART-TV|Tizen|Web0S|webOS|NetCast|HbbTV|AppleTV|CrKey|BRAVIA|AFT[A-Za-z]|Fire\s?TV|GoogleTV|Roku|VIDAA|DTV|PlayStation|Xbox|Opera TV|POV_TV)\b/i;function Oo(){try{if(Do.test(navigator.userAgent||""))return!0;const o=navigator.deviceMemory;if(typeof o=="number"&&o>0&&o<2)return!0}catch{}return!1}const Fo="_page_y9mr4_1",Vo="_header_y9mr4_7",jo="_pageTitle_y9mr4_11",Uo="_searchForm_y9mr4_21",Wo="_searchInput_y9mr4_27",zo="_searchBtn_y9mr4_42",Ho="_suggestions_y9mr4_58",Ko="_suggestionPill_y9mr4_65",qo="_statusMsg_y9mr4_81",Yo="_error_y9mr4_87",Go="_textOnly_y9mr4_91",Qo="_spinner_y9mr4_96",Xo="_spin_y9mr4_96",Zo="_sourceLoader_y9mr4_101",Jo="_ringSpinner_y9mr4_107",ea="_grid_y9mr4_125",ta="_skeletonCard_y9mr4_131",na="_skeletonThumb_y9mr4_136",ra="_skeletonLine_y9mr4_142",sa="_shimmer_y9mr4_149",oa="_backBtn_y9mr4_169",aa="_meta_y9mr4_187",ia="_headerActions_y9mr4_195",la="_watchlistBtn_y9mr4_202",ca="_active_y9mr4_220",da="_year_y9mr4_230",ua="_rating_y9mr4_235",ma="_typeBadge_y9mr4_244",ha="_tv_y9mr4_252",fa="_movie_y9mr4_257",ga="_tvSeries_y9mr4_262",pa="_tvMiniSeries_y9mr4_267",ba="_overview_y9mr4_272",va="_controls_y9mr4_279",ya="_controlLabel_y9mr4_287",_a="_select_y9mr4_297",Sa="_playerSection_y9mr4_308",Ta="_video_y9mr4_312",Ca="_videoHidden_y9mr4_334",ka="_delayCanvas_y9mr4_339",Ea="_delayCanvasActive_y9mr4_352",xa="_subtitleOverlay_y9mr4_356",Na="_videoIframe_y9mr4_375",Ia="_retryButton_y9mr4_383",Ba="_sidebarSeason_y9mr4_398",wa="_mobileSeasonRow_y9mr4_414",Aa="_sidebarPosterCard_y9mr4_428",Ma="_sidebarPosterMeta_y9mr4_443",La="_providerSelectWrap_y9mr4_460",Pa="_genreRow_y9mr4_472",Ra="_genreChip_y9mr4_479",$a="_metaRow_y9mr4_489",Da="_detailGrid_y9mr4_498",Oa="_detailItem_y9mr4_505",Fa="_imdbLink_y9mr4_527",p={page:Fo,header:Vo,pageTitle:jo,searchForm:Uo,searchInput:Wo,searchBtn:zo,suggestions:Ho,suggestionPill:Ko,statusMsg:qo,error:Yo,textOnly:Go,spinner:Qo,spin:Xo,sourceLoader:Zo,ringSpinner:Jo,grid:ea,skeletonCard:ta,skeletonThumb:na,skeletonLine:ra,shimmer:sa,backBtn:oa,meta:aa,headerActions:ia,watchlistBtn:la,active:ca,year:da,rating:ua,typeBadge:ma,tv:ha,movie:fa,tvSeries:ga,tvMiniSeries:pa,overview:ba,controls:va,controlLabel:ya,select:_a,playerSection:Sa,video:Ta,videoHidden:Ca,delayCanvas:ka,delayCanvasActive:Ea,subtitleOverlay:xa,videoIframe:Na,retryButton:Ia,sidebarSeason:Ba,mobileSeasonRow:wa,sidebarPosterCard:Aa,sidebarPosterMeta:Ma,providerSelectWrap:La,genreRow:Pa,genreChip:Ra,metaRow:$a,detailGrid:Da,detailItem:Oa,imdbLink:Fa},Va=[],ja=[];function hr({error:o,onRetry:b}){return t("div",{className:`${p.statusMsg} ${p.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:o}),t("button",{className:p.retryButton,onClick:b,children:"Retry"})]})})}const ei=()=>{const{id:o}=Gr(),[b]=Qr(),W=A(b);W.current=b;const F=Xr(),G=Zr(),R=b.get("type"),[r,B]=_(null),[i,te]=_(()=>parseInt(b.get("s")||"1",10)||1),[Q,$]=_([]),[f,K]=_(()=>parseInt(b.get("e")||"1",10)||1),[h,ze]=_(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[D,X]=_([]),[Pe,Re]=_(""),{options:He,isFallback:Ke,isLoading:Je}=Ps(),ae=Ee(()=>He.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[He]),q=Ke||ae.length===0?Va:ae,T=q.filter(e=>e.tier==="direct"),ne=q.filter(e=>e.tier==="embed"),[Te,Y]=_(!1),[Ce,M]=_(""),[$e,qe]=_([]),[pe,C]=_(0),[z,it]=_([]),[ie,De]=_(-1),[xe,Oe]=_(0),[lt,Vt]=_(""),[St,ue]=_(""),[be,Tt]=_(()=>{try{return localStorage.getItem("tvServer")||""}catch{return""}}),ct=Ee(()=>q.find(e=>e.id===h),[q,h]),L=ct?.tier==="embed",[dt,Ct]=_([]),[Fe,jt]=_(""),[ln,kt]=_(""),[Ut,le]=_(!1),u=Ee(()=>dt.length>0?dt:ct?.servers??[],[dt,ct]),ut=Ee(()=>Fe?["Embed",...u]:u,[u,Fe]),Z=Ut&&!!Fe,Et=Z?ln||Fe:"";v(()=>{if(!Fe){kt("");return}let e=!1;return fetch(`/api/resolve?url=${encodeURIComponent(Fe)}`).then(n=>n.json()).then(n=>{!e&&n.finalUrl&&kt(n.finalUrl)}).catch(()=>{}),()=>{e=!0}},[Fe]);const xt=A([]);v(()=>{xt.current=D},[D]);const mt=A(pe);v(()=>{mt.current=pe},[pe]);const Nt=A(ie);v(()=>{Nt.current=ie},[ie]);const y=cs({skipIntervals:ja}),c=y.refs.videoRef,re=A(null),ce=A([]),It=A(null),Bt=A(null),{videoDelayMs:w,videoDelayEnabled:J,setDelayEnabled:de,handleVideoDelayChange:wt,isCalibrating:cn,testClipActive:ke,stopCalibration:Ve,openAvSyncCalibrator:Fn,cancelAvSyncCalibrator:dn,applyAvSyncCalibrator:Wt,toggleTestClip:un,calibReturnRef:ve,effectiveVideoDelayMs:mn}=ds(c),[ht,gr]=_(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),hn=A(ht);hn.current=ht;const pr=S(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(hn.current!==n){hn.current=n,gr(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);us({videoRef:c,canvasRef:It,delayMs:mn,enabled:J});const fn=J,ye=fn||ht!==0,{settings:gn,update:br}=ms(),pn=A(ye);pn.current=ye;const bn=S(()=>{if(!pn.current)return;const e=c.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[c]),{hasConsent:At,grant:vr}=Jr(),Mt=A("");Mt.current||(Mt.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const g=R==="movie",zt=o?Rs(R||"tv",o):"",j=zt,Vn=$s(),Ht=Ds(),{toggle:jn,bookmarkedIds:yr,pending:_r}=Os(),{data:Un}=Fs(r?zt:void 0),Kt=Un?!!Un.inLibrary:zt?yr.has(zt):!1,Sr=S(()=>{!r||!o||jn({tmdbId:Number(o),mediaType:R||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,o,R,jn]),{data:et,isFetched:Wn,isPending:zn}=Vs(j||void 0,i,f),qt=Ee(()=>Q.map(e=>e.episode_number).sort((e,n)=>e-n),[Q]),tt=qt.indexOf(f),vn=tt>0?qt[tt-1]:null,x=tt>=0&&tt<qt.length-1?qt[tt+1]:null,Yt=Ee(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),_e=Ee(()=>{if(g||x!=null)return null;const e=Yt.indexOf(i);return e>=0&&e<Yt.length-1?Yt[e+1]:(r?.number_of_seasons??0)>i?i+1:null},[g,x,Yt,i,r?.number_of_seasons]),Hn=et?.currentTime??0,Kn=et?.duration??0,yn=et?.completed===!0||et?.completed===1||Ln(Hn,Kn),[Ne,je]=_(!1),Ie=A(!1),_n=A(null),Lt=A(null);v(()=>{Ie.current=!1,Lt.current=null,je(!1)},[j,i,f]);const[Be,Gt]=_(!1),[ft,qn]=_(0),[nt,Yn]=_(!1),[Ye,rt]=_(!1),[Tr,Sn]=_(!1),[Cr,Gn]=_(""),[Qt,kr]=_(!1),[Er,Tn]=_(!1),{isTheaterMode:we,toggleTheaterMode:Cn,handleLayoutClick:xr}=hs();v(()=>{const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&Cn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Cn]),fs(y,(D.length>0||St!=="")&&!we&&!Be&&!Ne&&!Ye);const Nr=zs(),[gt,Ir]=_(gs),Br=S(e=>{Ir(e),ps(e)},[]),me=A(!1),st=A(null),kn=A(0),Qn=A(!1),Xn=A(0),se=A(null),Pt=A(""),wr=ur(Hn,Kn),Rt=!me.current&&!Ie.current&&(Be||Ne||Ye||yn||wr),pt=A(Rt);pt.current=Rt;const bt=A(!1);v(()=>{bt.current=nt},[nt]);const Ge=S((e,n)=>{if(!j||!n||n<30)return;const s=Ln(e,n),l=s?n:e;Math.abs(l-kn.current)<10&&!s||(kn.current=l,Vn.mutate({mediaId:j,season:i,episode:f,currentTime:Math.floor(l),duration:Math.floor(n),completed:s,title:r?.title??null,poster:r?.poster??null,backdrop:r?.backdrop??null,year:r?.year??null,overview:r?.overview??null,tmdbId:r?.id??null,mediaType:R||"tv",adult:r?.adult?1:0}))},[j,i,f,Vn,r,R]),Ae=S((e,n)=>{Ve();const s=new URLSearchParams(b);s.set("type",b.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),F(`${window.location.pathname}?${s.toString()}`)},[b,F,Ve]),$t=S(()=>{const e=c.current;if(!e||g||x==null){Sn(!1);return}const n=e.duration||0,s=e.currentTime||0;Sn(n>0&&s/n>=.8)},[g,x,c]),Xt=S((e,n)=>["tv-sources",h,g?"movie":"tv",o,e,n,be],[h,g,o,be]),Zt=S(async(e,n)=>{if(!r||!o||!h)return{valid:!1,sources:[]};const s=g?"movie":"tv",l=await _t.tv.sources.query({provider:h,type:s,tmdbId:String(o),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...u.length>0&&be?{server:be}:{}});return{valid:"valid"in l?l.valid:!1,error:"error"in l?l.error:void 0,sources:l.sources,referer:"referer"in l?l.referer:void 0,audioTracks:l.audioTracks,subtitles:"subtitles"in l?l.subtitles:void 0,servers:"servers"in l?l.servers:void 0,embedUrl:"embedUrl"in l?l.embedUrl:void 0}},[r,o,h,g,u,be]),Zn=S(()=>{if(g||!r||!o||!h||L||x==null)return;const e=Xt(i,x);G.getQueryState(e)?.status!=="success"&&G.prefetchQuery({queryKey:e,queryFn:()=>Zt(i,x),staleTime:300*1e3,gcTime:1800*1e3})},[g,r,o,h,L,x,i,G,Xt,Zt]),Ar=S(()=>{if(ke)return;$t();const e=c.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&Zn(),st.current&&clearTimeout(st.current),st.current=setTimeout(()=>{Ge(e.currentTime,e.duration||0)},5e3))},[Ge,c,ke,$t,Zn]),Mr=S(()=>{const e=c.current;if(!e||!r)return;st.current&&clearTimeout(st.current),Ge(e.currentTime,e.duration||0),Qn.current=!0;const n=bs({seekInduced:Date.now()-Xn.current<vs,autoplayEnabled:gt,hasNext:!g&&x!=null,isFinal:g||x==null});n==="advance"&&x!=null?(K(x),Ae(i,x)):n==="prompt-next"?(Ie.current=!1,me.current=!0,je(!0)):n==="prompt-complete"&&(Gn(g?r.title:`${r.title} — Season ${i}`),rt(!0),Ie.current=!0,me.current=!0)},[g,r,i,x,gt,Ge,Ae,c]),Lr=S(()=>{Qn.current=!1,y.actions.onPlay()},[y.actions]),Pr=S(()=>{y.actions.onPause();const e=c.current;e&&!e.ended&&Ge(e.currentTime,e.duration||0)},[y.actions,Ge,c]),Rr=S(()=>{y.actions.onLoadedMetadata();const e=c.current;if(e){try{const n=parseFloat(localStorage.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=localStorage.getItem("playerMuted")==="true"}catch{}if(se.current!=null&&se.current>0){try{e.currentTime=se.current}catch{}se.current=null}$t()}},[y.actions,c,$t]),vt=S(()=>{const e=c.current;if(e&&se.current!=null&&se.current>0){try{e.currentTime=se.current}catch{}se.current=null}},[c]),$r=S(()=>{ft>0&&(se.current=ft);const e=c.current;if(e&&ft>0){try{e.currentTime=ft,se.current=null}catch{}e.play().catch(()=>{})}Gt(!1),me.current=!0},[ft,c]),Jn=S(()=>{se.current=null;const e=c.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Gt(!1),me.current=!0},[c]),Dr=S(()=>{Ie.current=!0,je(!1),me.current=!0},[]),Or=S(()=>{Ie.current=!0,je(!1),me.current=!0,se.current=null;const e=c.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[c]),er=S(()=>{x!=null&&(Ie.current=!0,je(!1),me.current=!0,K(x),Ae(i,x))},[x,i,Ae]),tr=S(()=>{_e!=null&&(Ie.current=!0,je(!1),rt(!1),me.current=!0,te(_e),K(1),Ae(_e,1))},[_e,Ae]),Fr=S(async()=>{if(j)try{await Ht.mutateAsync({id:j,status:"Completed"}),rt(!1),je(!1),F("/")}catch{}},[j,Ht,F]);v(()=>{me.current=!1,_n.current=null,Gt(!1),Sn(!1),qn(0),Yn(!1),bt.current=!1,se.current=null,Pt.current=`${j}:${i}:${f}`,kn.current=0},[j,i,f]),v(()=>{Wn&&(Yn(!0),bt.current=!0)},[Wn,j,i,f]),v(()=>{if(!et||me.current)return;const e=`${j}:${i}:${f}`;if(_n.current===e)return;_n.current=e;const n=et,s=n.currentTime??0,l=n.duration??0;ur(s,l)&&(qn(s),Gt(!0))},[et,j,i,f]),v(()=>{if(!nt||me.current||Ie.current||Be||Ye||Ne)return;const e=`${j}:${i}:${f}`;if(Lt.current!==e){if(!yn){zn||(Lt.current=e);return}if(g){Lt.current=e,je(!0);return}if(!(!r||tt<0||Q.length===0)){if(Lt.current=e,x==null&&_e==null){r&&Q.length>0&&(Gn(`${r.title} — Season ${i}`),rt(!0),Ie.current=!0,me.current=!0);return}je(!0)}}},[nt,yn,zn,Be,Ye,Ne,g,x,_e,r,tt,Q.length,j,i,f]),v(()=>{(Be||Ne)&&c.current&&c.current.pause()},[Be,Ne,c]),v(()=>{const e=c.current;return()=>{st.current&&clearTimeout(st.current),e&&!e.ended&&Ge(e.currentTime,e.duration||0)}},[Ge,c]);const En=S(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return Dn(e,{lastKey:n,enabled:s})},[]),xn=S(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),nr=S(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(H=>Pn(H)===n);if(s>=0)return s;const l=n.indexOf("|||"),m=l>=0?n.slice(0,l):n,N=l>=0?n.slice(l+3):n,d=e.findIndex(H=>H.language===m||H.label===N);if(d>=0)return d}return Dn(e,{lastKey:null,enabled:!0})},[]),{data:rr}=js(j||void 0),sr=Ee(()=>(rr?.progress??[]).filter(n=>n.season===i&&(n.completed===!0||n.completed===1||Ln(n.currentTime,n.duration))).map(n=>String(n.episode)),[rr,i]),or=Ee(()=>Q.map(e=>({id:String(e.episode_number),label:`Episode ${e.episode_number}`,sublabel:e.name||void 0,thumbnail:e.still_path?`https://image.tmdb.org/t/p/w185${e.still_path}`:void 0})),[Q]),ar=Ee(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Nn=Ee(()=>[r?.year,r?.status,r?.number_of_seasons?`${r.number_of_seasons} Season${r.number_of_seasons>1?"s":""}`:null,r?.number_of_episodes?`${r.number_of_episodes} Episodes`:null].filter(Boolean),[r]);v(()=>{if(q.length!==0&&!q.some(e=>e.id===h)){const e=q.find(n=>n.tier==="direct")?.id??q[0].id;ze(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[q,h]),v(()=>{Ct([]),jt(""),kt(""),le(!1)},[h]),v(()=>{if(u.length!==0&&!u.includes(be)){Tt(u[0]);try{localStorage.setItem("tvServer",u[0])}catch{}}},[u,be]),v(()=>{if(!o){B(null),X([]),Re(""),M(""),ue("");return}const e=Number(o),n=R||"tv";B(null),X([]),Re(""),M(""),ue("");const s=parseInt(W.current.get("s")||"",10),l=parseInt(W.current.get("e")||"",10);te(isNaN(s)?1:s),K(isNaN(l)?1:l),Oe(0),_t.tv.details.query({type:n,id:String(e)}).then(m=>{const N={id:m.id,title:m.title||"",overview:m.overview||"",vote_average:m.vote_average,year:m.year,poster:m.poster,backdrop:m.backdrop,imdb_id:m.imdb_id||void 0,adult:m.adult,seasons:m.seasons,number_of_seasons:m.number_of_seasons};B(N),N.seasons&&N.seasons.length>0&&isNaN(s)&&te(N.seasons[0].season_number)}).catch(()=>{})},[o,R]),v(()=>{if(!r||!o)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){$([]);return}const n=parseInt(b.get("e")||"",10);_t.tv.episodes.query({id:String(o),season:String(i)}).then(s=>{const l=(s.episodes||[]).map(m=>({episode_number:m.episode_number,name:m.name||"",vote_average:m.vote_average,overview:m.overview||"",still_path:m.still_path||""}));$(l),l.length!==0&&K(m=>!isNaN(n)&&l.some(N=>N.episode_number===n)?n:l.some(N=>N.episode_number===m)?m:l[0].episode_number)}).catch(()=>{})},[r,o,i,b]),v(()=>{if(!L||!r||!o)return;fetch(`/api/tv/embed/${h}/${g?"movie":"tv"}/${o}?season=${i}&episode=${f}`).then(n=>n.json()).then(n=>{if(n.url)return ue(n.url),fetch(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(s=>s.json()).then(s=>{s.finalUrl&&ue(s.finalUrl)})}).catch(()=>{})},[h,r,o,i,f,g,L]);const Jt=S(async()=>{if(!r||!o||!h||L||r.adult&&!At)return;const e=`${j}:${i}:${f}`;Y(!0),M(""),xt.current.length===0&&(X([]),Oe(0),qe([]),it([]));try{const n=await G.fetchQuery({queryKey:Xt(i,f),queryFn:()=>Zt(i,f),staleTime:3e5,gcTime:18e5});if(Pt.current!==e){Y(!1);return}if(Y(!1),!n.valid||!n.sources?.length){M(n.error?`${n.error}`:u.length>0?`No streams from ${be}. Try another server.`:"No streams available.");return}X(n.sources),Re(e),n.servers?.length&&Ct(n.servers),n.embedUrl&&jt(n.embedUrl),Oe(0),n.referer&&Vt(n.referer);const s=n.audioTracks||[];qe(s),C(s.length>0?nr(s):0);const l=n.subtitles||[];if(it(l),l.length>0){const d=En(l);De(d),xn(d)}else De(-1);const m=g?"movie":"tv",N=o;_t.tv.subtitles.query({type:m,tmdbId:String(N),season:String(i),episode:String(f)}).then(d=>{if(Pt.current!==e)return;const H=Array.isArray(d.subtitles)?d.subtitles:[];H.length!==0&&it(oe=>{const k=[...oe,...H.filter(ee=>!oe.some(he=>he.url===ee.url))];if(oe.length===0){const ee=En(k);De(ee),xn(ee)}return k})}).catch(()=>{}),M("")}catch{if(Pt.current!==e)return;Y(!1),M("Failed to load streams.")}},[r,o,h,i,f,g,L,At,u,be,En,xn,nr,j,G,Xt,Zt]),Vr=S(e=>{if(e==="Embed"){le(!0);return}le(!1),Tt(e);try{localStorage.setItem("tvServer",e)}catch{}M("")},[]),jr=S(e=>{ze(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);v(()=>{h&&r&&!L&&Jt()},[h,r,Jt,L]),v(()=>{if(!c.current)return;if(re.current&&(re.current.destroy(),re.current=null),L||Z){const d=c.current;d&&(d.pause(),d.removeAttribute("src"),d.load());return}let e=!1;if(ke){const d=c.current;return d&&(d.pause(),d.removeAttribute("src"),d.load(),d.src="/av-sync-test.mp4",pt.current||d.play().catch(()=>{})),()=>{e=!0}}if(Pt.current===`${j}:${i}:${f}`&&se.current==null&&!pt.current)try{const d=c.current;d&&!d.ended&&d.currentTime>1&&(se.current=d.currentTime)}catch{}const s=!Te&&Pe===`${j}:${i}:${f}`?Z?"":D[xe]?.url||"":"";if(!s){try{c.current?.pause(),c.current?.removeAttribute("src"),c.current?.load()}catch{}return}const l=c.current;l.pause(),l.removeAttribute("src"),l.load(),y.actions.resetMediaState();const m=`/api/tv/stream-proxy?url=${encodeURIComponent(s)}&referer=${encodeURIComponent(lt)}`;D[xe]?.type==="hls"?(async()=>{const d=await Us();if(!e)if(d&&d.isSupported()){const H=Oo()||document.body.classList.contains("low-end"),oe=H?60:180,k=new d({enableWorker:!0,lowLatencyMode:!1,maxBufferLength:oe,maxMaxBufferLength:oe+(H?30:60),backBufferLength:H?30:60,maxBufferSize:(H?120:360)*1e3*1e3,fragLoadPolicy:{default:{maxTimeToFirstByteMs:15e3,maxLoadTimeMs:45e3,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:3,retryDelayMs:800,maxRetryDelayMs:6e3}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:25e3,timeoutRetry:{maxNumRetry:1,retryDelayMs:500,maxRetryDelayMs:2e3},errorRetry:{maxNumRetry:2,retryDelayMs:800,maxRetryDelayMs:4e3}}}});re.current=k,k.on(d.Events.ERROR,(I,E)=>{E.fatal&&(M(`Stream failed (${E.details}). Try another source or reload.`),Y(!1),k.destroy(),re.current=null)}),k.loadSource(m),k.attachMedia(l);const ee=()=>{let I=!1,E=0;try{I=localStorage.getItem("tvSubtitlesEnabled")==="true";const P=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(P)&&P>=0&&(E=P)}catch{}return{enabled:I,index:E}},he=()=>{if(typeof k.subtitleTrack!="number")return;if(ce.current.length>0){k.subtitleTrack=-1;return}const I=Array.isArray(k.subtitleTracks)?k.subtitleTracks:[];if(I.length===0){k.subtitleTrack=-1;return}const E=ee();if(E.enabled){const P=E.index<I.length?E.index:0;k.subtitleTrack=P,De(P),bn()}else k.subtitleTrack=-1};$o(k,d.Events,{getWant:()=>mt.current,onResolve:I=>C(I)}),k.on(d.Events.MANIFEST_PARSED,()=>{he(),ve.current!=null&&(l.currentTime=ve.current,ve.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{})}),k.on(d.Events.SUBTITLE_TRACKS_UPDATED,()=>{he()}),k.on(d.Events.SUBTITLE_TRACK_SWITCH,(I,E)=>{if(ce.current.length>0){if(E.id!==-1)try{k.subtitleTrack=-1}catch{}return}const P=Array.isArray(k.subtitleTracks)?k.subtitleTracks:[];if(P.length!==0){if(E.id===-1){const O=ee();if(O.enabled){const Ue=O.index<P.length?O.index:0;k.subtitleTrack=Ue;return}}De(E.id),bn()}})}else Ws(l)&&(l.src=m,ve.current!=null&&(l.currentTime=ve.current,ve.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{M("Failed to play stream. Try another source.")}))})():(l.src=m,ve.current!=null&&(l.currentTime=ve.current,ve.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{M("Failed to play stream. Try another source.")}));const N=()=>{const oe=l.error?.code===4?"Video source not supported or not found":"Failed to load video stream";M(`${oe}. The source may be invalid or expired. Try switching source or reloading.`),Y(!1)};return l.addEventListener("error",N),()=>{e=!0,l.removeEventListener("error",N)}},[D,Pe,Te,xe,h,lt,L,Z,c,ve,ke,j,i,f,vt,bn,y.actions]),v(()=>{if(!nt||Be||Ne||Ye||Rt||L||ke)return;const e=c.current;!e||!e.paused||e.ended||e.readyState<1||(vt(),e.play().catch(()=>{}))},[nt,Be,Ne,Ye,Rt,L,ke,vt,c]),v(()=>{const e=re.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=pe)},[pe]),v(()=>{const e=re.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ce.current.length>0||(ie>=0?e.subtitleTrack=ie:e.subtitleTrack=-1)},[ie]),v(()=>{const e=c.current;if(!(!e||L)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ce.current=[],z.length!==0&&(z.forEach(n=>{const s=document.createElement("track");s.kind="subtitles",s.label=n.label||n.language||"Unknown",s.srclang=n.language||n.label||"en";const l=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(lt)}`;s.src=l,s.addEventListener("load",()=>{const m=ce.current.indexOf(s),N=s.track;if(N&&m>=0){const d=m===Nt.current;N.mode=d&&!pn.current?"showing":"hidden"}}),e.appendChild(s),ce.current.push(s)}),z.length>0)))try{const n=re.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[z,lt,L,h,c]),v(()=>{const e=c.current;if(!e||L)return;const n=re.current;ce.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const N=On(y.state.subtitleFontSize,e.clientHeight||720),d=Math.max(0,Math.min(100,100-y.state.subtitlePosition)),H=()=>{const I=N*16,E=e.videoHeight||e.clientHeight||720,P=e.videoWidth||e.clientWidth||1280;return{step:I*1.3/E*100,chars:Math.max(20,Math.floor(P/(I*.55)))}},oe=(I,E)=>{const P=I;P.snapToLines=!1,P.line=E},k=I=>{if(!I.cues)return;Array.from(I.cues).forEach(fe=>oe(fe,d));const E=Array.from(I.activeCues??[]);if(E.length<=1){E.forEach(fe=>oe(fe,d));return}const{step:P,chars:O}=H();let Ue=d;for(let fe=E.length-1;fe>=0;fe--){const Qe=String(E[fe].text??"").replace(/<[^>]*>/g,"").split(`
|
|
3
|
-
`).reduce((nn,Ot)=>nn+Math.max(1,Math.ceil(Ot.length/O)),0);Ue=Math.max(0,Ue-Qe*P),oe(E[fe],Ue),Ue-=P*.4}},ee=ce.current;if(ee.length>0){ee.forEach((I,E)=>{const P=I.track;if(!P)return;const O=E===ie;P.mode=O&&!ye?"showing":"hidden",O&&!ye&&k(P)});return}const he=Array.from(e.textTracks);he.length!==0&&he.forEach((I,E)=>{const P=E===ie;I.mode=P&&!ye?"showing":"hidden",P&&!ye&&k(I)})};s();const l=()=>s();e.textTracks.addEventListener("addtrack",l),e.addEventListener("loadedmetadata",s,{once:!0});const m=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",l),e.removeEventListener("loadedmetadata",s),window.clearTimeout(m)}},[ie,z,L,h,c,ye,y.state.subtitleFontSize,y.state.subtitlePosition]),v(()=>{if(!ye)return;const e=c.current,n=Bt.current;if(!e||!n)return;const s=ht/1e3,l=mn/1e3,m=new Set;let N=[],d=-1,H=-1,oe=-1,k=-1,ee=0,he=0,I=!1;const E=()=>{const U=Nt.current;if(U<0)return null;const Xe=ce.current;return Xe.length>0?Xe[U]?.track??null:Array.from(e.textTracks)[U]??null},P=(U,Xe)=>{const ge=U.cues;if(!ge||ge.length===0)return Array.from(U.activeCues??[]);let ot=0,at=ge.length;for(;ot<at;){const Me=ot+at>>>1;ge[Me].endTime+s<Xe?ot=Me+1:at=Me}const Ft=[];for(let Me=ot;Me<ge.length;Me++){const rn=ge[Me];if(rn.startTime+s>Xe)break;rn.endTime+s>=Xe&&Ft.push(rn)}return Ft},O=()=>{const U=E(),Xe=e.currentTime-l,ge=U?P(U,Xe):[],ot=e.clientWidth,at=e.clientHeight,Ft=e.videoWidth,Me=e.videoHeight;if(ge.length===N.length&&ge.every((Bn,wn)=>Bn===N[wn])&&ot===d&&at===H&&Ft===oe&&Me===k||(N=ge,d=ot,H=at,oe=Ft,k=Me,n.textContent="",ge.length===0))return;const cr={fontSize:On(y.state.subtitleFontSize,at),position:y.state.subtitlePosition,bgOpacity:y.state.subtitleBgOpacity,bgColor:y.state.subtitleBgColor,textColor:y.state.subtitleTextColor,edge:y.state.subtitleEdge,bold:y.state.subtitleBold},Hr=ys(cr),Kr=_s(e,cr.position);ge.forEach((Bn,wn)=>{const dr=String(Bn.text??"");if(!Ss(dr).trim())return;const An=document.createElement("div"),qr=(ge.length-1-wn)*1.7;An.style.cssText=`${Hr}
|
|
4
|
-
bottom: calc(${Kr}px + ${qr}em);`,An.innerHTML=Ts(dr),n.appendChild(An)})},Ue=()=>{Array.from(e.textTracks).forEach(U=>{m.has(U)||(m.add(U),U.addEventListener("cuechange",O))})},fe=()=>{Ue(),O()},In=()=>{if(I||he)return;const U=()=>{he=0,!(I||e.paused||e.ended)&&(O(),In())};he=window.requestAnimationFrame(U)},Qe=e,nn=()=>{ee=0,O(),!I&&Qe.requestVideoFrameCallback&&(ee=Qe.requestVideoFrameCallback(nn))},Ot=()=>{O(),Qe.requestVideoFrameCallback?ee||(ee=Qe.requestVideoFrameCallback(nn)):In()};Ue(),e.textTracks.addEventListener("addtrack",fe),e.textTracks.addEventListener("removetrack",fe),e.addEventListener("timeupdate",O),e.addEventListener("seeked",O),e.addEventListener("loadedmetadata",O),e.addEventListener("play",Ot);const ir=Array.from(e.querySelectorAll("track"));ir.forEach(U=>U.addEventListener("load",O));const lr=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>O());return lr?.observe(e),O(),Ot(),()=>{I=!0,m.forEach(U=>U.removeEventListener("cuechange",O)),e.textTracks.removeEventListener("addtrack",fe),e.textTracks.removeEventListener("removetrack",fe),e.removeEventListener("timeupdate",O),e.removeEventListener("seeked",O),e.removeEventListener("loadedmetadata",O),e.removeEventListener("play",Ot),ir.forEach(U=>U.removeEventListener("load",O)),lr?.disconnect(),he&&window.cancelAnimationFrame(he),ee&&Qe.cancelVideoFrameCallback&&Qe.cancelVideoFrameCallback(ee),n.textContent=""}},[ye,ht,ie,z,mn,c,y.state.subtitleFontSize,y.state.subtitlePosition,y.state.subtitleBgOpacity,y.state.subtitleBgColor,y.state.subtitleTextColor,y.state.subtitleEdge,y.state.subtitleBold]);const en=()=>{B(null),X([]),ue(""),F(-1)},Ur=S(e=>{te(e),K(1),Ae(e,1)},[Ae]),tn=!g&&r?.seasons&&r.seasons.length>1?t("label",{className:p.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:i,onChange:e=>Ur(parseInt(e.target.value,10)||1),className:p.select,children:r.seasons.map(e=>t("option",{value:e.season_number,children:["Season ",e.season_number," (",e.episode_count," ep)"]},e.season_number))})]}):null,yt=S(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{c.current?.pause()}catch{}K(n),Ae(i,n)}Tn(!1)},[i,Ae,c]);v(()=>{if(g)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(x!=null?yt(String(x)):es.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[g,x,yt]);const Wr=e=>{C(e);try{const s=$e[e];s&&localStorage.setItem("tvLastAudio",Pn(s))}catch{}const n=re.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},zr=e=>{De(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const m=z[e];m&&localStorage.setItem("tvLastSubtitle",Pn(m))}}catch{}const n=c.current,s=re.current;if(s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=ce.current.length>0||e<0?-1:e),!n)return;const l=ce.current;if(l.length>0){l.forEach((m,N)=>{const d=m.track;if(!d)return;const H=N===e;d.mode=H&&!ye?"showing":"hidden"});return}Array.from(n.textTracks).forEach((m,N)=>{const d=N===e;m.mode=d&&!ye?"showing":"hidden"})},Dt=S(()=>{if(!r)return;const e=c.current,n=g?"":`S${String(i).padStart(2,"0")}E${String(f).padStart(2,"0")}`;_t.discord.tvPresence.mutate({title:r.title,episodeLabel:n,isPlaying:e?!e.paused&&!e.ended:!0,thumbnail:r.poster,currentTime:e?e.currentTime:0,duration:e&&e.duration||0,isAdult:r.adult===!0,sessionId:Mt.current}).catch(()=>{}),_t.discord.heartbeat.mutate({sessionId:Mt.current}).catch(()=>{})},[r,g,i,f,c]);return v(()=>{if(!r)return;Dt();const e=window.setInterval(()=>{const n=c.current;(!n||!n.paused)&&Dt()},15e3);return()=>window.clearInterval(e)},[Dt,r,c]),v(()=>{if(!r||L||Te||Ce||D.length===0)return;const e=c.current;if(!e)return;const n=()=>Dt();return e.addEventListener("play",n),e.addEventListener("pause",n),e.addEventListener("seeked",n),()=>{e.removeEventListener("play",n),e.removeEventListener("pause",n),e.removeEventListener("seeked",n)}},[r,L,Te,Ce,D,Dt,c]),v(()=>{const e=Mt.current,n=()=>ts(e),s=()=>n();return window.addEventListener("pagehide",s),window.addEventListener("beforeunload",s),()=>{window.removeEventListener("pagehide",s),window.removeEventListener("beforeunload",s),n()}},[]),v(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=g?`${r.title} - dango`:`${r.title} - Season ${i} Episode ${f} - dango`},[r,g,i,f]),v(()=>{if(!r||g)return;const e=new URLSearchParams(b),n=e.get("s"),s=e.get("e"),l=String(i),m=String(f);n===l&&s===m||(e.set("type",b.get("type")||"tv"),e.set("s",l),e.set("e",m),F(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,g,i,f,b,F]),t("div",{className:`${Ze.playerPageLayout} ${we?Ze.theaterMode:""}`,onClick:xr,children:[we&&t(Cs,{videoRef:c,active:gn.enabled&&!L&&D.length>0&&!Ce&&!(r?.adult&&!At),settings:gn}),!we&&t("aside",{className:Ze.episodeSidebar,children:r?g?t("div",{className:p.sidebarPosterCard,children:[r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"}),t("div",{className:p.sidebarPosterMeta,children:[t("strong",{children:r.title}),t("span",{children:r.year})]})]}):t(ks,{episodes:or,currentEpisode:String(f),watchedEpisodes:sr,onEpisodeClick:yt,header:tn}):g?t("div",{className:p.statusMsg,children:[t(V,{name:"spinner",className:p.spinner})," Loading..."]}):t(Es,{variant:"sidebar"})}),t("div",{className:Ze.playerMain,children:[r&&t("div",{className:p.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!At?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:L&&St?t("iframe",{src:St,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!L&&Et?t("iframe",{src:Et,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!L&&(D.length>0||Te)?t(Le,{children:[Ce&&t(hr,{error:Ce,onRetry:Jt}),t(Lo,{player:y,title:r.title,episodeLabel:g?void 0:`S${i} E${f}`,audioTracks:$e,selectedAudioTrack:pe,onAudioTrackChange:Wr,subtitles:z,selectedSubtitle:ie,onSubtitleChange:zr,streams:D,resolutionIdx:xe,onResolutionChange:Oe,onBack:en,videoDelayEnabled:J,onVideoDelayToggle:de,videoDelayMs:w,onVideoDelayChange:wt,onCalibrateAvSync:Fn,subtitleDelayMs:ht,onSubtitleDelayChange:pr,showNextEpisodeButton:Tr&&!Be&&!Ne&&!Ye,onNextEpisode:er,isLoading:Te,isTheaterMode:we,onTheaterModeToggle:Cn,ambientSettings:gn,onAmbientChange:br,children:[t("video",{ref:c,autoPlay:nt&&!Rt,playsInline:!0,disablePictureInPicture:!0,className:`${p.video} ${fn?p.videoHidden:""}`,onTimeUpdate:Ar,onEnded:()=>{ke||Mr()},onPlay:Lr,onPause:Pr,onSeeked:()=>{Xn.current=Date.now(),$t()},onLoadedMetadata:Rr,onVolumeChange:y.actions.onVolumeChange,onWaiting:y.actions.onWaiting,onPlaying:y.actions.onPlaying,onCanPlay:y.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{M("Video failed to load. Try another server or reload."),Y(!1)}}),t("canvas",{ref:It,className:`${p.delayCanvas} ${fn?p.delayCanvasActive:""}`}),ye&&t("div",{ref:Bt,className:p.subtitleOverlay}),t(xs,{isOpen:cn,ms:w,onChange:wt,onApply:Wt,onClose:dn,testClipActive:ke,onTestClip:un})]})]}):Ce&&!L?t(hr,{error:Ce,onRetry:Jt}):null}),!we&&r&&t(Ns,{}),!we&&tn&&t("div",{className:p.mobileSeasonRow,children:tn}),!we&&r&&t("div",{className:p.providerSelectWrap,children:t("label",{className:p.controlLabel,children:["Source",t("select",{value:h,onChange:e=>jr(e.target.value),className:p.select,disabled:q.length===0,children:Je?t("option",{value:"",children:"Loading..."}):q.length===0?t("option",{value:"",children:"No providers available"}):t(Le,{children:[T.length>0&&t("optgroup",{label:"Direct HLS",children:T.map(e=>t("option",{value:e.id,children:e.label},e.id))}),ne.length>0&&t("optgroup",{label:"Embeds",children:ne.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),!we&&r&&!L&&(Te?t("div",{className:p.sourceLoader,children:t("div",{className:p.ringSpinner})}):t(Ro,{servers:ut,selectedServer:Ut?"Embed":be,onServerSelect:Vr})),!we&&r&&t("div",{className:Ze.playerInfoContainer,children:[t("div",{className:Ze.playerInfoHeader,children:[t("div",{className:Ze.playerAnimeCard,children:r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"})}),t("div",{className:Ze.videoTitleSection,children:[t("div",{className:Se.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:p.meta,children:[t("span",{className:p.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:p.rating,children:[t(V,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${p.typeBadge} ${p[g?"movie":"tv"]}`,children:g?"Movie":"TV Show"})]}),ar.length>0&&t("div",{className:p.genreRow,children:ar.map(e=>t("span",{className:p.genreChip,children:e},e))}),Nn.length>0&&t("div",{className:p.metaRow,children:Nn.map((e,n)=>t("span",{children:[e,n<Nn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:Se.controls,children:[t("button",{className:`${Se.watchlistBtn} ${Kt?Se.inList:""}`,onClick:Sr,disabled:_r,type:"button",children:[Kt?t(V,{name:"check",size:14}):t(V,{name:"plus",size:14}),Kt?"In Watchlist":"Add to Watchlist"]}),!g&&t(Le,{children:[t("button",{className:`${Se.watchlistBtn}`,onClick:()=>vn!=null&&yt(String(vn)),disabled:vn==null,type:"button",children:[t(V,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${Se.watchlistBtn}`,onClick:()=>x!=null&&yt(String(x)),disabled:x==null,type:"button",children:["Next EP",t(V,{name:"chevron-right",size:14})]}),!g&&t("button",{className:`${Se.watchlistBtn} ${Se.modeToggleBtn} ${gt?Se.modeToggleActive:""}`,onClick:()=>Br(!gt),type:"button","aria-pressed":gt,children:gt?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),Nr&&t("button",{className:`${Se.watchlistBtn}`,onClick:()=>Tn(!0),type:"button",children:[t(V,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:Se.descriptionSection,children:[t("h3",{children:"Synopsis"}),t(Hs,{text:r.overview,emptyText:"No description available."})]}),t("button",{className:Se.detailsToggleBtn,onClick:()=>kr(!Qt),type:"button",children:[Qt?t(V,{name:"chevron-up"}):t(V,{name:"chevron-down"}),Qt?"Hide Details":"Show Details"]}),Qt&&t("div",{className:p.detailGrid,children:[r.first_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:g?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Networks"}),t("span",{children:r.networks.map(e=>e.name).join(", ")})]}),r.created_by&&r.created_by.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Created By"}),t("span",{children:r.created_by.map(e=>e.name).join(", ")})]}),r.episode_run_time&&r.episode_run_time.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:p.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:p.imdbLink,children:"View on IMDb"})]})]})]}),!g&&t(Is,{isOpen:Er,onClose:()=>Tn(!1),episodes:or,currentEpisode:String(f),watchedEpisodes:sr,onEpisodeClick:yt,header:tn}),r?.adult&&!At&&t(Mn,{isOpen:!0,title:"Content Warning",onClose:en,children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:"This title contains mature content intended for adult audiences."}),t("p",{children:["By proceeding, you confirm that you are ",t("strong",{children:"18 years of age or older"})," ","(or the age of majority in your jurisdiction) and wish to view this content."]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(We,{variant:"secondary",onClick:en,children:"Go Back"}),t(We,{onClick:vr,children:"I'm 18+, Continue"})]})]})}),t(Bs,{isOpen:Be,onClose:Jn,title:"Resume Watching",message:t(Le,{children:["You were at ",t("strong",{children:an(ft)})]}),restartLabel:"Start from Beginning",onResume:$r,onRestart:Jn}),t(Mn,{isOpen:Ne,onClose:Dr,title:g?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:g?t(Le,{children:"You've already watched this movie."}):t(Le,{children:["You've already watched"," ",t("strong",{children:["Season ",i," Episode ",f]}),". Would you like to continue?"]})}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(We,{variant:"secondary",onClick:Or,children:"Replay"}),x!=null?t(We,{onClick:er,children:["Watch EP ",x]}):_e!=null?t(We,{onClick:tr,children:["Start Season ",_e]}):null]})]})}),t(Mn,{isOpen:Ye,onClose:()=>rt(!1),title:g?"Movie Completed!":_e!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(V,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:Cr}),t("p",{style:{color:"var(--text-secondary)"},children:g?"You finished this movie!":_e!=null?`You finished Season ${i}.`:"Congratulations! You finished all available episodes."}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(We,{variant:"secondary",onClick:()=>rt(!1),children:"Close"}),_e!=null?t(We,{onClick:tr,children:["Start Season ",_e]}):t(Le,{children:[t(We,{onClick:()=>{rt(!1),en()},children:"Back to Details"}),Kt&&t(We,{onClick:Fr,disabled:Ht.isPending,children:Ht.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:p.statusMsg,children:[t(V,{name:"spinner",className:p.spinner})," Loading..."]})]})]})};export{ei as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._fullscreenFlat_1xij1_1,._fullscreenFlat_1xij1_1 ._video_1xij1_2,._fullscreenFlat_1xij1_1 ._delayCanvas_1xij1_3,._fullscreenFlat_1xij1_1 ._subtitleOverlay_1xij1_4{border-radius:0}@media(max-width:900px)and (orientation:landscape){._fullscreenFlat_1xij1_1{border-radius:0}}@container (max-width: 26rem){._timeDisplay_1xij1_15{display:none}._bottomControls_1xij1_19{padding:.75rem}._leftControls_1xij1_23,._rightControls_1xij1_24{gap:.2rem}._controlBtn_1xij1_28{padding:5px;min-width:2.125rem;min-height:2.125rem}}._video_1xij1_2{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;display:block;background:#000;border:none}._controlsOverlay_1xij1_47{position:absolute;inset:0;opacity:1;transition:opacity .4s cubic-bezier(.4,0,.2,1);z-index:50;pointer-events:none;display:flex;flex-direction:column;justify-content:space-between;background:radial-gradient(circle,transparent 20%,rgba(0,0,0,.4) 100%)}._controlsOverlay_1xij1_47>*{pointer-events:auto}._controlsOverlay_1xij1_47._hidden_1xij1_67{opacity:0;pointer-events:none;cursor:none}._topControls_1xij1_73{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;gap:var(--space-6);background:linear-gradient(to bottom,rgba(0,0,0,.85) 0%,rgba(0,0,0,.45) 60%,transparent 100%);padding:var(--space-8) var(--space-10);transition:transform .4s cubic-bezier(.2,.8,.2,1);z-index:10;pointer-events:auto}._backBtn_1xij1_93{background:transparent;border:none;color:#ffffffd9;font-size:1.6rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition-fast);padding:8px;border-radius:50%}._backBtn_1xij1_93:hover{background:#0f0f1199;color:#fff;transform:scale(1.1)}._videoTitleInfo_1xij1_113{display:flex;flex-direction:column;gap:.25rem}._animeTitle_1xij1_119{font-size:1.4rem;font-weight:800;color:#fff;letter-spacing:-.01em;text-shadow:0 2px 4px rgba(0,0,0,.5)}._episodeLabel_1xij1_127{font-size:.85rem;font-weight:600;color:#ffffffbf;text-shadow:0 2px 4px rgba(0,0,0,.5)}._speedBoostBadge_1xij1_134{position:absolute;top:1.5rem;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:.7rem;padding:.65rem 1rem;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:var(--radius-md);background:#121216eb;color:#f5f3ff;font-size:.85rem;font-weight:800;letter-spacing:.06em;z-index:11;pointer-events:none}._speedBoostBadge_1xij1_134 span{line-height:1}._speedBoostBadge_1xij1_134 svg{display:block;flex-shrink:0}._bottomControls_1xij1_19{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(to top,rgba(0,0,0,.85) 0%,rgba(0,0,0,.45) 60%,transparent 100%);padding:clamp(1rem,4cqw,2.5rem) clamp(1rem,4cqw,2.5rem) clamp(.75rem,2.5cqw,1.5rem);z-index:10;pointer-events:auto;transition:transform .4s cubic-bezier(.2,.8,.2,1)}._progressBarContainer_1xij1_180{width:100%;height:20px;display:flex;align-items:center;cursor:pointer;position:relative;touch-action:none}@media(pointer:coarse){._progressBarContainer_1xij1_180{height:28px}._progressBarContainer_1xij1_180 ._progressBar_1xij1_180{height:6px}._progressBarContainer_1xij1_180 ._thumb_1xij1_199{opacity:1}}._progressBar_1xij1_180{width:100%;height:4px;background:#fff3;border-radius:2px;position:relative;transition:height .15s ease}._progressBarContainer_1xij1_180:hover ._progressBar_1xij1_180{height:6px}._bufferedBar_1xij1_217{position:absolute;top:0;left:0;height:100%;background:#ffffff4d;border-radius:2px;pointer-events:none}._watchedBar_1xij1_227{position:absolute;top:0;left:0;height:100%;background:var(--accent);border-radius:2px;pointer-events:none}._thumb_1xij1_199{position:absolute;top:50%;width:12px;height:12px;background:#fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #0006;pointer-events:none;opacity:0;transition:opacity .15s ease}._progressBarContainer_1xij1_180:hover ._thumb_1xij1_199,._progressBarContainer_1xij1_180._scrubbing_1xij1_252 ._thumb_1xij1_199{opacity:1}._timeBubble_1xij1_256{position:absolute;bottom:24px;background:#000000d9;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8rem;font-weight:500;transform:translate(-50%);pointer-events:none;white-space:nowrap}._bottomControlsRow_1xij1_270{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-top:8px}._leftControls_1xij1_23{display:flex;align-items:center;gap:1rem;gap:clamp(.5rem,2.5cqw,1rem);min-width:0}._rightControls_1xij1_24{display:flex;align-items:center;gap:.75rem;gap:clamp(.5rem,2cqw,.75rem)}._nextEpisodeBtn_1xij1_293{background:#ffffff0f;border:1px solid rgba(255,255,255,.12);border-radius:var(--radius-md);padding:.45rem .8rem;color:#fffc;font-weight:600;font-size:.9rem;display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap}._nextEpisodeBtn_1xij1_293:hover{background:#ffffff1a;color:#fff;transform:translateY(-1px);border-color:#fff3}._controlBtn_1xij1_28{background:transparent;border:none;color:#ffffffd9;font-size:1.1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:8px;border-radius:4px;transition:all var(--transition-fast);min-width:2.125rem;min-height:2.125rem;flex:0 0 auto}@media(pointer:coarse){._controlBtn_1xij1_28{padding:10px;min-width:2.75rem;min-height:2.75rem}}._controlBtn_1xij1_28:hover{color:#fff;background:#ffffff1a}._controlBtn_1xij1_28._active_1xij1_346{color:var(--accent)}._volumeContainer_1xij1_350{display:flex;align-items:center;position:relative}._volumeSlider_1xij1_356{width:0;opacity:0;transform:scaleX(0);transform-origin:left;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;margin-left:8px;-webkit-appearance:none;appearance:none;background:transparent;height:20px}._volumeContainer_1xij1_350:hover ._volumeSlider_1xij1_356,._volumeSlider_1xij1_356:focus{width:80px;opacity:1;transform:scaleX(1)}._volumeSlider_1xij1_356::-webkit-slider-runnable-track{width:100%;height:4px;background:linear-gradient(to right,var(--accent) 0%,var(--accent) var(--volume-percent, 0%),rgba(255,255,255,.2) var(--volume-percent, 0%),rgba(255,255,255,.2) 100%);border-radius:4px}._volumeSlider_1xij1_356::-moz-range-track{width:100%;height:4px;background:#fff3;border-radius:4px}._volumeSlider_1xij1_356::-moz-range-progress{height:4px;background:var(--accent);border-radius:4px}._volumeSlider_1xij1_356::-webkit-slider-thumb{-webkit-appearance:none;height:12px;width:12px;border-radius:50%;background:#fff;margin-top:-4px;box-shadow:0 0 5px #00000080}._timeDisplay_1xij1_15{color:#fffc;font-size:.85rem;font-weight:500;font-variant-numeric:tabular-nums;min-width:100px}._settingsPanel_1xij1_421{position:absolute;bottom:clamp(6rem,15vh,8rem);right:clamp(1rem,3vw,2rem);background:#141418f2;border:1px solid var(--border-secondary);border-radius:var(--radius-md);width:max-content;min-width:12rem;max-width:min(19rem,calc(100vw - 1.5rem));font-size:.85rem;z-index:60;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 8px 32px #00000080;display:flex;flex-direction:column;overflow:hidden}._settingsHeader_1xij1_440{display:flex;align-items:center;padding:.55rem .75rem;border-bottom:1px solid var(--border-secondary);gap:.625rem}._settingsBackBtn_1xij1_448{background:transparent;border:none;color:#ffffffd9;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:4px;transition:all var(--transition-fast)}._settingsBackBtn_1xij1_448:hover{background:#ffffff1a;color:#fff}._settingsTitle_1xij1_466{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._settingsContent_1xij1_477{overflow-y:auto;padding:.375rem;display:flex;flex-direction:column;gap:.125rem;max-height:min(56vh,22rem)}._currentValue_1xij1_486{color:var(--text-tertiary);font-size:.8rem;font-weight:500}._settingsLabel_1xij1_492{padding:var(--space-2) var(--space-4);font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}._menuItem_1xij1_501{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;min-height:2rem;padding:.5rem .75rem;background:transparent;border:none;color:var(--text-primary);font-size:.85rem;cursor:pointer;border-radius:var(--radius-sm);transition:background-color var(--transition-fast);text-align:left;white-space:nowrap}._menuItem_1xij1_501:hover{background:var(--bg-tertiary)}._menuItem_1xij1_501._active_1xij1_346{background:var(--bg-tertiary);color:var(--accent)}._currentValue_1xij1_486{color:var(--text-secondary);font-size:.85rem}._menuNote_1xij1_534{padding:.5rem .75rem;font-size:.7rem;line-height:1.5;color:var(--text-tertiary);white-space:normal;overflow-wrap:break-word}._spin_1xij1_543{animation:_spin_1xij1_543 1s linear infinite}._loadingOverlay_1xij1_547{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;z-index:10;background:#00000080;border-radius:inherit}._loadingDots_1xij1_558{display:flex;gap:10px}._dot_1xij1_563{width:12px;height:12px;border-radius:50%;background-color:var(--accent);animation:_bounce_1xij1_1 1.4s infinite ease-in-out both;box-shadow:0 0 10px var(--accent-glow)}._dot_1xij1_563:nth-child(1){animation-delay:-.32s}._dot_1xij1_563:nth-child(2){animation-delay:-.16s}@keyframes _bounce_1xij1_1{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}._bufferingOverlay_1xij1_592{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:20}._bufferingSpinner_1xij1_601{width:50px;height:50px;border:4px solid rgba(255,255,255,.3);border-radius:50%;border-top-color:var(--accent);animation:_spin_1xij1_543 1s ease-in-out infinite}@keyframes _spin_1xij1_543{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(pointer:coarse){._settingsPanel_1xij1_421{font-size:.9rem;bottom:calc(env(safe-area-inset-bottom,0px) + 7rem);right:max(.75rem,env(safe-area-inset-right,0px))}._menuItem_1xij1_501{min-height:2.75rem}._settingsContent_1xij1_477{max-height:52vh}}@media(max-width:480px){._settingsPanel_1xij1_421{min-width:9rem;max-width:calc(100vw - 2rem);font-size:.75rem;bottom:calc(env(safe-area-inset-bottom,0px) + 6rem)}._settingsHeader_1xij1_440{padding:.4rem .625rem}._settingsTitle_1xij1_466{font-size:.64rem}._menuItem_1xij1_501{min-height:2.25rem;padding:.45rem .625rem;font-size:.75rem;gap:.5rem}._settingsContent_1xij1_477{max-height:min(40vh,15rem)}}@media(max-height:500px)and (orientation:landscape){._settingsPanel_1xij1_421{bottom:7.25rem;right:2rem;min-width:10rem;max-width:min(15rem,calc(100vw - 1.5rem));font-size:.8rem}._menuItem_1xij1_501{min-height:2.5rem;font-size:.8rem}._settingsContent_1xij1_477{max-height:50vh;overflow-y:auto}}._page_y9mr4_1{max-width:1200px;margin:0 auto;padding:1.5rem}._header_y9mr4_7{margin-bottom:1.5rem}._pageTitle_y9mr4_11{font-size:1.75rem;font-weight:700;margin:0 0 1rem;display:flex;align-items:center;gap:.5rem;color:var(--text-primary)}._searchForm_y9mr4_21{display:flex;gap:.5rem;max-width:600px}._searchInput_y9mr4_27{flex:1;padding:.6rem 1rem;border-radius:8px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);font-size:.95rem;outline:none}._searchInput_y9mr4_27:focus{border-color:var(--accent)}._searchBtn_y9mr4_42{padding:.6rem 1rem;border-radius:8px;border:none;background:var(--accent);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center}._searchBtn_y9mr4_42:hover{opacity:.9}._suggestions_y9mr4_58{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem}._suggestionPill_y9mr4_65{padding:.4rem .8rem;border-radius:20px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-secondary);cursor:pointer;font-size:.85rem;transition:all .15s ease}._suggestionPill_y9mr4_65:hover{border-color:var(--accent);color:var(--text-primary)}._statusMsg_y9mr4_81{padding:1rem;text-align:center;color:var(--text-secondary)}._statusMsg_y9mr4_81._error_y9mr4_87{color:#f87171}._statusMsg_y9mr4_81._textOnly_y9mr4_91{background:none;padding:.5rem}._spinner_y9mr4_96{animation:_spin_y9mr4_96 1s linear infinite;margin-right:.5rem}._sourceLoader_y9mr4_101{padding:2rem;display:flex;justify-content:center}._ringSpinner_y9mr4_107{width:40px;height:40px;border:4px solid rgba(255,255,255,.1);border-left-color:var(--accent);border-radius:50%;animation:_spin_y9mr4_96 1s linear infinite}@keyframes _spin_y9mr4_96{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._grid_y9mr4_125{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:1rem}._skeletonCard_y9mr4_131{border-radius:8px;overflow:hidden}._skeletonThumb_y9mr4_136{aspect-ratio:2 / 3;background:var(--bg-secondary);border-radius:8px}._skeletonLine_y9mr4_142{height:12px;background:var(--bg-secondary);border-radius:4px;margin-top:.5rem}._shimmer_y9mr4_149{background:linear-gradient(90deg,var(--bg-secondary) 25%,var(--bg-elevated) 50%,var(--bg-secondary) 75%);background-size:200% 100%;animation:_shimmer_y9mr4_149 1.5s infinite}@keyframes _shimmer_y9mr4_149{0%{background-position:200% 0}to{background-position:-200% 0}}._backBtn_y9mr4_169{display:inline-flex;align-items:center;gap:.4rem;padding:.4rem .8rem;border-radius:6px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.85rem;margin-bottom:1rem}._backBtn_y9mr4_169:hover{border-color:var(--accent)}._meta_y9mr4_187{display:flex;align-items:center;gap:.75rem;margin:.5rem 0;flex-wrap:wrap}._headerActions_y9mr4_195{display:flex;gap:.5rem;margin:.75rem 0 0;flex-wrap:wrap}._watchlistBtn_y9mr4_202{display:inline-flex;align-items:center;gap:.4rem;padding:.5rem 1rem;border-radius:6px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.85rem;font-weight:600}._watchlistBtn_y9mr4_202:hover:not(:disabled){border-color:var(--accent)}._watchlistBtn_y9mr4_202._active_y9mr4_220{border-color:var(--color-success);color:var(--color-success)}._watchlistBtn_y9mr4_202:disabled{opacity:.6;cursor:default}._year_y9mr4_230{color:var(--text-secondary);font-size:.9rem}._rating_y9mr4_235{display:inline-flex;align-items:center;gap:4px;color:var(--accent-lighter);font-weight:600;font-size:.9rem}._typeBadge_y9mr4_244{padding:2px 10px;border-radius:4px;font-size:.75rem;font-weight:600;text-transform:uppercase}._typeBadge_y9mr4_244._tv_y9mr4_252{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}._typeBadge_y9mr4_244._movie_y9mr4_257{background:color-mix(in srgb,var(--accent-lighter) 20%,transparent);color:var(--accent-lighter)}._typeBadge_y9mr4_244._tvSeries_y9mr4_262,._typeBadge_y9mr4_244._tvMiniSeries_y9mr4_267{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}._overview_y9mr4_272{color:var(--text-secondary);line-height:1.6;margin:.5rem 0 0;max-width:800px}._controls_y9mr4_279{display:flex;flex-wrap:wrap;gap:1rem;margin:1rem 0;align-items:flex-end}._controlLabel_y9mr4_287{display:flex;flex-direction:column;gap:.3rem;font-size:.8rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}._select_y9mr4_297{padding:.5rem .75rem;border-radius:6px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);font-size:.9rem;cursor:pointer;min-width:160px}._playerSection_y9mr4_308{margin:1.5rem 0;border-radius:0;overflow:hidden;overflow:clip;isolation:isolate;background:#000;position:relative}._video_y9mr4_312{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;display:block;background:#000;border:none;border-radius:inherit}._videoHidden_y9mr4_334{opacity:0;pointer-events:none}._delayCanvas_y9mr4_339{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;opacity:0;pointer-events:none;z-index:2;border-radius:inherit}._delayCanvasActive_y9mr4_352{opacity:1}._subtitleOverlay_y9mr4_356{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;pointer-events:none;overflow:hidden;border-radius:inherit}@media(max-width:900px)and (orientation:landscape){._playerSection_y9mr4_308{margin:0;border-radius:0}}._videoIframe_y9mr4_375{width:100%;aspect-ratio:16 / 9;min-height:400px;border:none;background:#000}._retryButton_y9mr4_383{margin-left:8px;padding:4px 10px;border-radius:4px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.8rem}._retryButton_y9mr4_383:hover{border-color:var(--accent)}._sidebarSeason_y9mr4_398{display:flex;flex-direction:column;gap:.4rem;font-size:.75rem;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.1em;margin-bottom:var(--space-4)}._sidebarSeason_y9mr4_398 ._select_y9mr4_297{width:100%}._mobileSeasonRow_y9mr4_414{display:none}@media(max-width:768px){._mobileSeasonRow_y9mr4_414{display:block}._mobileSeasonRow_y9mr4_414 ._sidebarSeason_y9mr4_398{margin-bottom:0}}._sidebarPosterCard_y9mr4_428{padding:1rem;display:flex;flex-direction:column;gap:.75rem}._sidebarPosterCard_y9mr4_428 img{width:100%;border-radius:var(--radius-md);aspect-ratio:2 / 3;object-fit:cover;background:#ffffff0f}._sidebarPosterMeta_y9mr4_443{display:flex;flex-direction:column;gap:.25rem}._sidebarPosterMeta_y9mr4_443 strong{color:var(--text-primary);font-size:.95rem;line-height:1.3}._sidebarPosterMeta_y9mr4_443 span{color:var(--text-secondary);font-size:.85rem}._providerSelectWrap_y9mr4_460{display:flex;align-items:flex-end;gap:1rem;flex-wrap:wrap;min-width:0}._providerSelectWrap_y9mr4_460 ._backBtn_y9mr4_169{margin-bottom:0}._genreRow_y9mr4_472{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}._genreChip_y9mr4_479{padding:.2rem .7rem;border-radius:20px;border:1px solid var(--glass-border);background:#ffffff0d;color:var(--text-secondary);font-size:.78rem;font-weight:600}._metaRow_y9mr4_489{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.6rem;color:var(--text-secondary);font-size:.9rem}._detailGrid_y9mr4_498{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:.75rem;margin-top:1rem}._detailItem_y9mr4_505{display:flex;flex-direction:column;gap:.2rem;padding:.75rem 1rem;border-radius:var(--radius-md);border:1px solid var(--glass-border);background:#ffffff08}._detailItem_y9mr4_505 strong{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary)}._detailItem_y9mr4_505 span{color:var(--text-primary);font-size:.9rem}._imdbLink_y9mr4_527{color:var(--accent-light);font-size:.9rem;text-decoration:none}._imdbLink_y9mr4_527:hover{text-decoration:underline}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._container_z68uz_1{position:relative;display:flex;align-items:center}._bellBtn_z68uz_7{background:#00000026;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:none;color:var(--text-primary);font-size:1.25rem;cursor:pointer;padding:var(--space-2);display:flex;align-items:center;justify-content:center;transition:transform var(--transition-fast),background var(--transition-fast);position:relative;width:50px;height:50px;border-radius:50%}._bellBtn_z68uz_7:hover{background:#00000040;border-color:#ffffff59;transform:scale(1.05)}._bellBtn_z68uz_7:focus-visible{outline:none;box-shadow:var(--shadow-focus)}@media(max-width:848px){._bellBtn_z68uz_7{width:36px;height:36px;font-size:1.05rem;padding:var(--space-1)}}@media(max-width:480px){._bellBtn_z68uz_7{width:36px;height:36px;font-size:.95rem}}._badge_z68uz_56{position:absolute;top:6px;right:6px;background-color:var(--color-danger);color:#fff;font-size:.62rem;font-weight:700;min-width:18px;height:18px;padding:0 4px;border-radius:50%;display:flex;align-items:center;justify-content:center;text-align:center;border:none;pointer-events:none;animation:_bounce_z68uz_1 .5s ease-out;line-height:1}@keyframes _bounce_z68uz_1{0%,20%,50%,80%,to{transform:translateY(0)}40%{transform:translateY(-5px)}60%{transform:translateY(-3px)}}._dropdown_z68uz_96{position:absolute;top:calc(100% + var(--space-2));right:0;width:320px;max-height:480px;background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border-secondary);border-radius:var(--radius-md);box-shadow:var(--shadow-xl);z-index:var(--z-header);overflow:hidden;display:flex;flex-direction:column;animation:_slideIn_z68uz_1 .3s ease}@keyframes _slideIn_z68uz_1{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}._dropdownHeader_z68uz_127{padding:var(--space-4);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-primary)}._dropdownHeader_z68uz_127 h4{margin:0;font-size:1rem;color:var(--text-primary)}._clearAllBtn_z68uz_141{background:none;border:none;color:var(--primary-color);font-size:var(--font-size-xs);cursor:pointer;padding:var(--space-1) var(--space-2);border-radius:var(--radius-sm);transition:background var(--transition-fast)}._clearAllBtn_z68uz_141:hover{background:#ffffff0d}._discoveryStatusRow_z68uz_156{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);font-size:.72rem;color:var(--text-muted);background:#ffffff08;border-bottom:1px solid var(--border-primary)}._statusDot_z68uz_167{width:8px;height:8px;border-radius:50%;flex-shrink:0}._statusDotRunning_z68uz_174{background:var(--accent);animation:_statusPulse_z68uz_1 1.2s ease-in-out infinite}._statusDotOk_z68uz_179{background:var(--color-success)}._statusDotInfo_z68uz_183{background:var(--color-info)}._statusDotError_z68uz_187{background:var(--color-danger)}._statusDotIdle_z68uz_191{background:var(--text-muted)}@keyframes _statusPulse_z68uz_1{0%,to{opacity:1}50%{opacity:.35}}._list_z68uz_205{overflow-y:auto;flex:1}._list_z68uz_205::-webkit-scrollbar{width:4px}._list_z68uz_205::-webkit-scrollbar-thumb{background:var(--border-secondary);border-radius:2px}._item_z68uz_219{display:flex;align-items:center;padding:var(--space-3) var(--space-4);gap:var(--space-3);text-decoration:none;transition:background var(--transition-fast);border-bottom:1px solid var(--border-primary);position:relative}._item_z68uz_219:hover{background:#ffffff0d}._thumbnail_z68uz_234{width:48px;height:64px;border-radius:var(--radius-sm);object-fit:cover;flex-shrink:0;box-shadow:0 2px 8px #0000004d}._itemInfo_z68uz_243{flex:1;min-width:0}._itemTitle_z68uz_248{display:block;font-size:.85rem;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:var(--space-1)}._itemMeta_z68uz_259{display:inline-block;font-size:.7rem;background:var(--accent);color:var(--accent-text);padding:1px 6px;border-radius:var(--radius-sm);font-weight:600}._systemItemMeta_z68uz_269{display:inline-block;font-size:.7rem;background:#ffffff1a;color:var(--text-secondary);padding:1px 6px;border-radius:var(--radius-sm);font-weight:500;border:none;cursor:pointer;transition:background var(--transition-fast)}._systemItemMeta_z68uz_269:hover{background:#ffffff2e}._removeItem_z68uz_286{background:none;border:none;color:var(--text-muted);font-size:var(--font-size-xs);cursor:pointer;padding:var(--space-2);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity var(--transition-fast),color var(--transition-fast)}._item_z68uz_219:hover ._removeItem_z68uz_286{opacity:1}@media(hover:none),(pointer:coarse){._removeItem_z68uz_286{opacity:1}}._removeItem_z68uz_286:hover{color:var(--color-danger)}._queueItem_z68uz_316:hover{color:var(--color-success)}._emptyState_z68uz_320{padding:var(--space-10) var(--space-4);text-align:center;color:var(--text-muted);font-size:.9rem}@media(max-width:768px){._dropdown_z68uz_96{position:fixed;top:var(--header-height, 60px);left:0;right:0;width:100%;max-height:calc(100vh - var(--header-height, 60px));border-radius:0 0 var(--radius-md) var(--radius-md)}._bellBtn_z68uz_7{width:36px;height:36px;font-size:1rem}._removeItem_z68uz_286{padding:var(--space-2);min-width:36px;min-height:36px}._badge_z68uz_56{top:5px;right:6px;font-size:.58rem;min-width:16px;height:16px;padding:0 3px}}@media(max-width:480px){._bellBtn_z68uz_7{width:38px;height:38px;font-size:1.1rem}}.skeleton{position:relative;overflow:hidden;background-color:var(--bg-tertiary);border-radius:var(--radius-sm)}.skeleton:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,#fff0 0,#ffffff0d 20%,#ffffff1f 60%,#fff0);animation:shimmer 1.8s infinite ease-in-out;content:""}.skeleton-text{border-radius:var(--radius-sm);height:1em}.skeleton-circular{border-radius:50%}.skeleton-rectangular{border-radius:var(--radius-md)}.skeleton-card{display:flex;flex-direction:column;background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:var(--radius-lg);overflow:hidden}@keyframes shimmer{to{transform:translate(100%)}}._logo_1z0j0_1{height:var(--logo-height, 75px);width:auto;display:block;overflow:visible}._gaze_1z0j0_8{transform:translate(calc(var(--dango-gaze-x, 0) * var(--lag, 1) * var(--amp-x, 2px)),calc(var(--dango-gaze-y, 0) * var(--lag, 1) * var(--amp-y, 1.4px)));transition:transform .15s ease-out}._face_1z0j0_16{opacity:0;pointer-events:none;transition:opacity .18s ease}[data-face=normal] ._faceNormal_1z0j0_22,[data-face=pet] ._facePet_1z0j0_23,[data-face=squint] ._faceSquint_1z0j0_24,[data-face=sleep] ._faceSleep_1z0j0_25{opacity:1}[data-hover] ._gaze_1z0j0_8{filter:drop-shadow(0 0 .5px var(--accent))}._line_1z0j0_33{fill:none;stroke:#140f15;stroke-width:.5;stroke-linecap:round;stroke-linejoin:round}._weight_1z0j0_41{animation:_dango-weight_1z0j0_1 5.6s ease-in-out infinite}@keyframes _dango-weight_1z0j0_1{0%,to{transform:translate(0)}45%,65%{transform:translate(1.2px,.25px)}}._shift_1z0j0_56{animation:_dango-shift_1z0j0_1 10.5s ease-in-out infinite}@keyframes _dango-shift_1z0j0_1{0%,to{transform:translate(-.4px,.2px)}50%{transform:translate(.4px)}}._rock_1z0j0_70{animation:_dango-rock_1z0j0_1 7.9s ease-in-out infinite}@keyframes _dango-rock_1z0j0_1{0%,72%,to{transform:translate(0)}80%{transform:translate(-.8px,.2px)}88%{transform:translate(-.3px)}}._glance_1z0j0_88{animation:_dango-glance_1z0j0_1 11s ease-in-out infinite}@keyframes _dango-glance_1z0j0_1{0%,30%,to{transform:translate(0)}40%,50%{transform:translate(-3.5px,-1.2px)}62%{transform:translate(0)}}._blink_1z0j0_107{transform-box:fill-box;transform-origin:center}._blinkDouble_1z0j0_112{animation:_dango-blink-double_1z0j0_1 4.4s infinite}@keyframes _dango-blink-double_1z0j0_1{0%,86%,to{transform:scaleY(1)}89%,90.5%{transform:scaleY(.08)}93%,94.5%{transform:scaleY(.08)}97%{transform:scaleY(1)}}._blinkSlow_1z0j0_136{animation:_dango-blink-slow_1z0j0_1 9.5s infinite}@keyframes _dango-blink-slow_1z0j0_1{0%,82%,to{transform:scaleY(1)}88%{transform:scaleY(.14)}95%{transform:scaleY(1)}}[data-nudge=""]{animation:_dango-nudge_1z0j0_1 .52s ease-out}@keyframes _dango-nudge_1z0j0_1{0%,to{transform:translate(0)}25%{transform:translate(1.2px)}60%{transform:translate(-.8px)}}._cheer_1z0j0_172{pointer-events:none}[data-cheer=""] ._heart_1z0j0_176{animation:_dango-heart_1z0j0_1 1.2s ease-out infinite}._heart_1z0j0_176{opacity:0;font-size:4.6px;text-anchor:middle;transform-box:fill-box;transform-origin:center}@keyframes _dango-heart_1z0j0_1{0%{opacity:0;transform:translate(0) scale(.35)}22%{opacity:1}to{opacity:0;transform:translate(var(--drift, 0),-6.5px) scale(1.05)}}@media(prefers-reduced-motion:reduce){._weight_1z0j0_41,._shift_1z0j0_56,._rock_1z0j0_70,._glance_1z0j0_88,._blinkDouble_1z0j0_112,._blinkSlow_1z0j0_136,[data-nudge=""],[data-cheer=""] ._heart_1z0j0_176{animation:none}}._header_q6huj_1{height:var(--header-height);--logo-height: 42px;background:transparent;border-bottom:1px solid transparent;position:fixed;top:var(--vv-top, 0px);left:0;right:0;z-index:var(--z-header);display:flex;align-items:center;justify-content:center;transition:transform var(--transition-slow),background-color var(--transition-base),border-color var(--transition-base),box-shadow var(--transition-base)}._header_q6huj_1._hidden_q6huj_21{transform:translateY(-100%)}._header_q6huj_1._scrolled_q6huj_25{background-color:#0c0c0fd1;border-bottom:1px solid rgba(255,255,255,.08);box-shadow:0 8px 32px #00000073}._logo_q6huj_31{display:flex;align-items:center;justify-content:center;padding:4px;border-radius:var(--radius-md);transition:opacity var(--transition-base)}._logo_q6huj_31:hover{opacity:.8}._headerInner_q6huj_44{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--space-8);display:flex;align-items:center;justify-content:space-between}._leftSection_q6huj_54{display:flex;align-items:center;gap:var(--space-2)}._desktopNav_q6huj_60{display:flex;align-items:center;gap:var(--space-1);margin-left:var(--space-6)}._navLink_q6huj_67{color:var(--text-secondary);font-weight:500;font-size:var(--font-size-sm);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);text-decoration:none;transition:all var(--transition-fast);position:relative}._navLink_q6huj_67:hover{color:var(--text-primary);background:#ffffff0f}._navLinkActive_q6huj_83{color:#fff;font-weight:600;background:#ffffff1a}._navLinkActive_q6huj_83:after{content:"";position:absolute;bottom:-4px;left:50%;transform:translate(-50%);width:16px;height:2px;background:var(--accent);border-radius:var(--radius-full);box-shadow:0 0 8px var(--accent-glow)}._rightSection_q6huj_102{display:flex;align-items:center;gap:var(--space-3)}._searchWrapper_q6huj_108{display:flex;align-items:center;gap:8px}._searchInput_q6huj_114{width:0;opacity:0;padding:0;border:none;background:transparent;color:var(--text-primary);font-size:var(--font-size-sm);font-family:inherit;height:42px;transition:all var(--transition-base);pointer-events:none;outline:none}._searchInput_q6huj_114::placeholder{color:#ffffffb3}._searchWrapper_q6huj_108:focus-within ._searchInput_q6huj_114{width:200px;opacity:1;padding:0 var(--space-3);pointer-events:auto;background:#00000059;border:1px solid rgba(255,255,255,.35);border-radius:var(--radius-full);color:#fff}._searchButton_q6huj_144{background:#00000026;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:none;color:var(--text-primary);padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;pointer-events:auto;width:50px;height:50px;border-radius:50%;transition:all var(--transition-base);flex-shrink:0}._searchButton_q6huj_144:hover{background:#00000040;border-color:#ffffff59}._searchIcon_q6huj_168{font-size:1rem;color:#fff;transition:all var(--transition-base)}._searchButton_q6huj_144:hover ._searchIcon_q6huj_168{color:var(--accent)}._profileBtn_q6huj_178{width:50px;height:50px;border-radius:50%;overflow:hidden;border:none;cursor:pointer;transition:all var(--transition-base);display:flex;align-items:center;justify-content:center;flex-shrink:0;background:#00000026;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:var(--text-primary)}._profileBtn_q6huj_178:hover{border-color:#ffffff59;transform:translateY(-2px);background:#00000040}._profileBtn_q6huj_178:active{transform:scale(.95)}._profileBtn_q6huj_178 svg{color:var(--text-primary);font-size:1.1rem}._profileImg_q6huj_211{width:100%;height:100%;object-fit:cover}._hamburgerBtn_q6huj_217{background:none;border:none;color:var(--text-primary);font-size:1.25rem;padding:var(--space-2);border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast);height:40px;width:40px;flex-shrink:0}._hamburgerBtn_q6huj_217:hover{background:#ffffff0f}._hamburgerBtn_q6huj_217:active{transform:scale(.95)}._mobileSearchBar_q6huj_244{display:none}@media(max-width:1024px){._searchInput_q6huj_114{display:none}._searchWrapper_q6huj_108:focus-within ._searchInput_q6huj_114{display:none}._mobileSearchBar_q6huj_244{display:block;position:absolute;top:100%;left:0;right:0;background:#0c0c0fe6;padding:var(--space-2) var(--space-3);animation:_slideDown_q6huj_1 .2s ease;transition:transform var(--transition-base),opacity var(--transition-base)}._mobileSearchBarHidden_q6huj_271{transform:translateY(-100%);opacity:0;pointer-events:none}@keyframes _slideDown_q6huj_1{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}._mobileSearchInner_q6huj_288{display:flex;align-items:center;background:#ffffff14;border:none;border-radius:var(--radius-full);padding:0 var(--space-4);height:40px}._mobileSearchInner_q6huj_288:focus-within{border:none;outline:none;box-shadow:0 0 0 2px var(--accent)}._mobileSearchIcon_q6huj_304{color:#ffffff80;font-size:.85rem;flex-shrink:0;margin-right:var(--space-2)}._mobileSearchInput_q6huj_311{flex:1;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:var(--font-size-sm);font-family:inherit;height:100%}._mobileSearchInput_q6huj_311::placeholder{color:#ffffff80}._mobileSearchInput_q6huj_311:focus,input._mobileSearchInput_q6huj_311:focus,._mobileSearchInput_q6huj_311:focus-visible,input._mobileSearchInput_q6huj_311:focus-visible{outline:none!important;box-shadow:none!important;border:none}}@media(max-width:848px){._header_q6huj_1{height:64px;padding:0 var(--space-3);--logo-height: 36px}._headerInner_q6huj_44{padding:0;max-width:none}._leftSection_q6huj_54{gap:var(--space-1);min-width:0}._hamburgerBtn_q6huj_217{height:36px;width:36px;font-size:.9rem}._logo_q6huj_31{padding:2px;min-width:0}._searchButton_q6huj_144{width:36px;height:36px}._rightSection_q6huj_102{gap:2px}._profileBtn_q6huj_178{width:36px;height:36px}}@media(max-width:900px){._desktopNav_q6huj_60{display:none}}@media(max-width:480px){._rightSection_q6huj_102{gap:4px}._hamburgerBtn_q6huj_217{height:38px;width:38px;font-size:1rem}._logo_q6huj_31{padding:2px;min-width:0}._searchButton_q6huj_144,._profileBtn_q6huj_178{width:38px;height:38px}}._sidebar_153jc_1{position:fixed;top:0;left:0;width:280px;max-width:85vw;height:100%;transition:transform var(--transition-normal);z-index:var(--z-sidebar);padding:var(--space-8) var(--space-6);display:flex;flex-direction:column;overflow-y:auto;transform:translate(-100%);background-color:#0a0a0cf2;color:var(--text-primary);border-right:1px solid var(--border-primary)}._sidebar_153jc_1._open_153jc_20{transform:translate(0);box-shadow:20px 0 60px #00000080}._sidebarHeader_153jc_25{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-10);position:relative}._closeBtn_153jc_33{position:absolute;top:0;right:0;background:none;border:none;font-size:1.25rem;line-height:1;cursor:pointer;color:var(--text-tertiary);transition:color var(--transition-base);display:flex;align-items:center;justify-content:center;padding:var(--space-1);width:32px;height:32px;border-radius:var(--radius-sm)}._closeBtn_153jc_33:hover{color:var(--text-primary)}._logo_153jc_57{display:flex;align-items:center;text-decoration:none;--logo-height: 50px;transition:opacity var(--transition-base)}._logo_153jc_57:hover{opacity:.8}._navSection_153jc_69{display:flex;flex-direction:column;gap:var(--space-1)}._navLink_153jc_75{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-3) var(--space-4);border-radius:var(--radius-md);text-decoration:none;transition:all var(--transition-base);color:var(--text-secondary);font-weight:var(--font-weight-medium);font-size:var(--font-size-base);border-left:2px solid transparent;margin-left:var(--space-2)}._navLink_153jc_75 svg{font-size:1rem;width:20px;text-align:center;flex-shrink:0;transition:color var(--transition-base)}._navLink_153jc_75:hover{background-color:#ffffff0a;color:var(--text-primary);border-left-color:#ffffff26}._navLink_153jc_75:hover svg{color:var(--text-primary)}._navLink_153jc_75._active_153jc_108{background-color:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent-light);border-left-color:var(--accent)}._navLink_153jc_75._active_153jc_108 svg{color:var(--accent)}._overlay_153jc_118{position:fixed;inset:0;background-color:#0009;z-index:calc(var(--z-sidebar) - 1);animation:_fadeIn_153jc_1 .3s ease-out}@keyframes _fadeIn_153jc_1{0%{opacity:0}to{opacity:1}}._versionInfo_153jc_138{margin-top:auto;padding-top:var(--space-8);font-size:1rem;color:var(--text-secondary);text-align:left;display:flex;align-items:center;gap:var(--space-2)}._versionInfo_153jc_138:before{content:"";display:block;width:5px;height:5px;border-radius:50%;background-color:var(--color-success)}@media(max-width:768px){._sidebar_153jc_1{width:260px;padding:var(--space-6) var(--space-4)}._sidebarHeader_153jc_25{margin-bottom:var(--space-8)}._logo_153jc_57{--logo-height: 48px}._navLink_153jc_75{padding:var(--space-3) var(--space-3)}}._footer_1c905_1{width:100%;position:relative;padding:0 var(--space-8) var(--space-8);overflow:visible;border-top:1px solid rgba(255,255,255,.08);margin-top:auto;background:linear-gradient(180deg,#0a0a0c99,#050507f2);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);color:var(--text-tertiary);font-size:var(--font-size-sm)}._footerInner_1c905_15{width:100%;max-width:var(--max-width);margin:0 auto;display:grid;grid-template-columns:1fr auto;align-items:start;gap:var(--space-12);padding-bottom:var(--space-8);border-bottom:1px solid rgba(255,255,255,.06)}._brandSection_1c905_27{grid-column:1;display:flex;flex-direction:column;align-items:flex-start;text-align:left;max-width:320px;position:relative;padding-top:0;margin-top:-30px}._logoRow_1c905_39{display:flex;align-items:center;gap:14px}._logoText_1c905_45{--logo-height: 60px;width:auto;display:block}._brandMeta_1c905_51{display:flex;align-items:center;justify-content:flex-start;gap:var(--space-2);flex-wrap:wrap;margin-top:10px}._brandTagline_1c905_60{color:var(--text-secondary);font-size:.88rem;line-height:1.5;margin:0}._statusPill_1c905_67{display:inline-flex;align-items:center;gap:var(--space-2);padding:4px 12px;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:var(--radius-full);font-size:.78rem;color:var(--text-secondary);width:fit-content}._statusDot_1c905_80{width:7px;height:7px;border-radius:50%;background:var(--color-success);box-shadow:0 0 8px var(--color-success)}._linksGrid_1c905_88{grid-column:2;display:flex;gap:var(--space-8);justify-content:flex-end;padding-top:var(--space-8)}._linkColumn_1c905_96{display:flex;flex-direction:column;gap:var(--space-2)}._columnTitle_1c905_102{color:var(--text-primary);font-size:.9rem;font-weight:700;margin:0 0 var(--space-2);text-transform:uppercase;letter-spacing:.05em}._footer_1c905_1 a{color:var(--text-secondary);text-decoration:none;font-weight:500;font-size:.88rem;transition:all var(--transition-fast);display:inline-flex;align-items:center}._footer_1c905_1 a:hover{color:var(--accent);transform:translate(2px)}._bottomBar_1c905_126{position:relative;width:100%;max-width:var(--max-width);margin:var(--space-6) auto 0;display:flex;align-items:center;justify-content:center}._copyright_1c905_136{margin:0;color:var(--text-muted);font-size:.85rem;display:flex;align-items:center;justify-content:center;gap:4px;text-align:center}._brand_1c905_27{color:var(--accent);font-weight:700}._heartIcon_1c905_152{color:var(--color-danger);margin:0 2px}._backToTop_1c905_157{position:absolute;right:0;display:inline-flex;align-items:center;gap:var(--space-2);padding:6px 14px;background:#ffffff0d;border:1px solid rgba(255,255,255,.12);border-radius:var(--radius-full);color:var(--text-secondary);font-size:.8rem;font-weight:600;cursor:pointer;transition:all var(--transition-base)}._backToTop_1c905_157:hover{background:#ffffff1f;color:#fff;border-color:var(--accent);transform:translateY(-2px)}@media(max-width:768px){._footer_1c905_1{padding:0 var(--space-4) var(--space-6)}._footerInner_1c905_15{grid-template-columns:1fr;gap:var(--space-5);align-items:center;justify-items:center}._brandSection_1c905_27{grid-column:1;align-items:center;text-align:center;padding-top:0;justify-content:center;margin-top:-26px}._logoRow_1c905_39{flex-direction:column;align-items:center;gap:6px}._logoText_1c905_45{--logo-height: 52px}._brandMeta_1c905_51{flex-direction:column;align-items:center;gap:var(--space-1);justify-content:center;margin-top:6px}._linksGrid_1c905_88{grid-column:1;display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-4);text-align:center}._linkColumn_1c905_96{align-items:center;gap:var(--space-1)}._columnTitle_1c905_102{margin:0 0 var(--space-1);font-size:.78rem}._footer_1c905_1 a{font-size:.82rem}._bottomBar_1c905_126{flex-direction:column;gap:var(--space-3);text-align:center}._copyright_1c905_136{font-size:.78rem}._backToTop_1c905_157{position:static}}._overlay_1juub_1{position:fixed;inset:0;background-color:#0009;z-index:var(--z-modal);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:_fadeIn_1juub_1 .2s ease-out}._content_1juub_11{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:calc(var(--z-modal) + 1);background-color:var(--bg-secondary);padding:var(--space-6);border-radius:var(--radius-lg);width:100%;max-width:min(500px,calc(100vw - 2 * var(--space-4)));max-height:calc(100vh - 2 * var(--space-4));overflow-y:auto;box-shadow:var(--shadow-xl);border:1px solid var(--border-primary);animation:_modalIn_1juub_1 .2s var(--ease-smooth)}._sm_1juub_29{max-width:min(400px,calc(100vw - 2 * var(--space-4)))}._md_1juub_33{max-width:min(500px,calc(100vw - 2 * var(--space-4)))}._lg_1juub_37{max-width:min(700px,calc(100vw - 2 * var(--space-4)))}._title_1juub_41{margin:0 0 var(--space-4);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--text-primary)}._body_1juub_48{color:var(--text-secondary)}._footer_1juub_52{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-3);margin-top:var(--space-6);padding-top:var(--space-4);border-top:1px solid var(--border-primary)}._footer_1juub_52>*{flex:0 1 auto;min-width:0;max-width:100%}@media(max-width:480px){._content_1juub_11{padding:var(--space-4)}._footer_1juub_52{flex-direction:column;align-items:stretch;justify-content:flex-start}._footer_1juub_52>*{flex:1 1 auto;width:100%}}@keyframes _fadeIn_1juub_1{0%{opacity:0}to{opacity:1}}@keyframes _modalIn_1juub_1{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}._container_e96gf_1{display:flex;flex-direction:column;gap:1rem;color:var(--text-primary);max-width:400px}._field_e96gf_9{display:flex;flex-direction:column;gap:.5rem}._field_e96gf_9 label{font-size:.9rem;opacity:.8}._textarea_e96gf_20{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.5rem;border-radius:4px;resize:vertical;font-family:inherit}._textarea_e96gf_20:hover{border-color:var(--border-secondary)}._textarea_e96gf_20:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._input_e96gf_40{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.6rem;border-radius:4px}._input_e96gf_40:hover{border-color:var(--border-secondary)}._input_e96gf_40:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._button_e96gf_58{background:var(--accent);color:var(--text-primary);border:none;padding:.7rem;border-radius:4px;cursor:pointer;font-weight:600;transition:opacity .2s}._button_e96gf_58:hover{opacity:.9}._button_e96gf_58:disabled{opacity:.5;cursor:not-allowed}._secondaryButton_e96gf_78{background:transparent;border:1px solid var(--border-primary);color:var(--text-primary);padding:.7rem;border-radius:4px;cursor:pointer;transition:background .2s,border-color .2s}._secondaryButton_e96gf_78:hover{background:#ffffff0d;border-color:var(--border-secondary)}._actions_e96gf_95{display:flex;gap:.5rem}._actions_e96gf_95 ._button_e96gf_58{flex:1}._hint_e96gf_104{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:4px;padding:.6rem;font-size:.85rem;line-height:1.5}._hint_e96gf_104 ._actions_e96gf_95{margin-top:.6rem}._link_e96gf_117{color:var(--accent);text-decoration:underline;font-weight:600}._link_e96gf_117:hover{opacity:.85}.top-progress-bar{position:fixed;top:0;left:0;right:0;height:3px;z-index:9999;overflow:hidden;pointer-events:none;background:transparent}.top-progress-bar:after{content:"";position:absolute;top:0;bottom:0;left:0;width:40%;border-radius:0 3px 3px 0;background:linear-gradient(90deg,transparent,var(--accent),var(--accent-light),transparent);animation:top-progress-slide 1.1s infinite ease-in-out}@keyframes top-progress-slide{0%{transform:translate(-100%)}to{transform:translate(280%)}}@media(prefers-reduced-motion:reduce){.top-progress-bar:after{animation:none;width:100%;border-radius:0}}._container_88bss_1{display:flex;flex-direction:column;gap:1rem;color:var(--text-primary)}._field_88bss_8{display:flex;flex-direction:column;gap:.5rem}._field_88bss_8 label{font-size:.9rem;opacity:.8}._input_88bss_19{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.6rem;border-radius:4px}._input_88bss_19:hover{border-color:var(--border-secondary)}._input_88bss_19:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._actions_88bss_37{display:flex;gap:.5rem;justify-content:flex-end}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);border-radius:var(--radius-md);font-weight:var(--font-weight-medium);cursor:pointer;border:none;outline:none;font-family:inherit;position:relative;white-space:nowrap;font-size:var(--font-size-base);background:transparent;color:var(--text-primary);padding:var(--space-3) var(--space-6);min-height:44px;transition:background-color .15s ease,color .15s ease,transform .1s ease}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--accent-light);outline-offset:2px}.btn-primary{background:linear-gradient(135deg,var(--accent) 0%,var(--accent-dark) 100%);color:var(--accent-text);box-shadow:0 4px 12px var(--accent-glow)}.btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--accent-light) 0%,var(--accent) 100%);transform:translateY(-1px);box-shadow:0 6px 16px var(--accent-glow)}.btn-primary:active:not(:disabled){transform:translateY(0)}.btn-secondary{background:#ffffff14;border:1px solid var(--border-secondary);color:var(--text-primary)}.btn-secondary:hover:not(:disabled){background:#ffffff1f;border-color:#ffffff40}.btn-ghost{background:transparent;color:var(--text-secondary)}.btn-ghost:hover:not(:disabled){background:#ffffff14;color:var(--text-primary)}.btn-danger{background:var(--color-danger);color:var(--color-danger-text)}.btn-danger:hover:not(:disabled){background:var(--color-danger-dark)}.btn-sm{min-height:36px;padding:var(--space-2) var(--space-4);font-size:var(--font-size-sm);border-radius:var(--radius-sm)}.btn-lg{min-height:52px;padding:var(--space-4) var(--space-8);font-size:var(--font-size-md);border-radius:var(--radius-lg)}.btn-block{width:100%}.btn-loading{color:transparent;pointer-events:none}.btn-spinner{position:absolute;width:16px;height:16px;border:2px solid rgba(128,128,128,.35);border-top-color:var(--accent-text);border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}:root{--accent: #6d5dfc;--accent-light: #897cff;--accent-lighter: #b3a8ff;--accent-dark: #5646db;--accent-text: #ffffff;--accent-subtle: rgba(109, 93, 252, .12);--accent-glow: rgba(109, 93, 252, .18);--accent-h: 245;--accent-s: 96%;--accent-l: 68%;--color-danger: #ef4444;--color-error: var(--color-danger);--color-danger-dark: #dc2626;--color-danger-text: #ffffff;--color-success: #10b981;--color-success-text: #ffffff;--color-warning: #f59e0b;--color-warning-text: #17171c;--color-info: #3b82f6;--color-info-text: #ffffff;--badge-info-bg: var(--accent);--badge-info-text: var(--accent-text);--secondary-h: 180;--secondary-s: 85%;--secondary-l: 50%;--accent-blue: hsl(var(--secondary-h), var(--secondary-s), var(--secondary-l));--accent-blue-light: hsl(var(--secondary-h), var(--secondary-s), 70%);--bg-main: #0c0d12;--bg-primary: #13151d;--bg-secondary: #13151d;--bg-tertiary: #191c27;--bg-elevated: #202433;--primary-color: var(--accent);--header-bg: rgba(12, 13, 18, .85);--text-primary: #ffffff;--text-secondary: #b4b4bd;--text-tertiary: #8f8f98;--text-muted: #b4b4bd;--border-primary: rgba(255, 255, 255, .08);--border-secondary: rgba(255, 255, 255, .12);--border-accent: hsla(var(--accent-h), var(--accent-s), var(--accent-l), .3);--border: var(--border-primary);--card-radius: var(--radius-lg);--border-light: var(--border-secondary);--danger-color: var(--color-danger);--shadow-input-focus: 0 0 0 2px var(--accent-subtle);--shadow-focus: 0 0 0 2px var(--accent-subtle);--glass-bg: rgba(20, 20, 22, .95);--glass-border: var(--border-primary);--glass-highlight: rgba(255, 255, 255, .05);--glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, .36);--bg-hover: rgba(255, 255, 255, .08);--bg-hover-strong: rgba(255, 255, 255, .1);--bg-overlay: rgba(0, 0, 0, .55);--bg-overlay-strong: rgba(0, 0, 0, .6);--bg-overlay-heavy: rgba(0, 0, 0, .7);--bg-scrim: rgba(10, 10, 12, .55);--bg-scrim-strong: rgba(10, 10, 12, .8);--bg-dark: #0a0a0c;--bg-black: #000000;--border-strong: rgba(255, 255, 255, .14);--track-bg: rgba(255, 255, 255, .1);--track-buffered: rgba(255, 255, 255, .25);--shimmer-highlight: rgba(255, 255, 255, .07);--bg-selected: rgba(255, 255, 255, .06);--shadow-scrim: 0 4px 16px rgba(0, 0, 0, .45);--shadow-panel: 0 12px 32px rgba(0, 0, 0, .5);--color-danger-bg: rgba(153, 42, 42, .9);--font-family: "Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-size-2xs: .4375rem;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: 1rem;--font-size-md: 1.125rem;--font-size-lg: 1.5rem;--font-size-xl: 1.875rem;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--line-height-tight: 1.25;--line-height-normal: 1.5;--line-height-relaxed: 1.75;--space-px: 1px;--space-2px: 2px;--space-1: .25rem;--space-1-5: .375rem;--space-2: .5rem;--space-2-5: .625rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--space-10: 2.5rem;--space-12: 3rem;--space-16: 4rem;--size-22: 22px;--size-42: 42px;--size-44: 44px;--size-48: 48px;--size-34: 34px;--size-36: 36px;--size-140: 140px;--size-180: 180px;--size-220: 220px;--size-250: 250px;--size-440: 440px;--size-480: 480px;--size-720: 720px;--size-84: 84px;--size-52: 52px;--size-90: 90px;--size-240: 240px;--size-320: 320px;--size-420: 420px;--size-900: 900px;--layout-asmr-max-width: 1400px;--layout-page-offset: 120px;--layout-player-mobile: 175px;--radius-xs: 6px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 20px;--radius-xl: 28px;--radius-full: 9999px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--shadow-lg: 0 12px 32px -4px rgba(0, 0, 0, .6);--shadow-active: 0 0 0 1px var(--border-accent), 0 8px 24px -4px rgba(0, 0, 0, .5);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .4), 0 10px 10px -5px rgba(0, 0, 0, .2);--shadow-thumb: 0 0 5px rgba(0, 0, 0, .5);--blur-sm: 4px;--blur-md: 6px;--blur-lg: 12px;--z-base: 1;--z-dropdown: 100;--z-sticky: 200;--z-drawer: 300;--z-sidebar: 500;--z-header: 400;--z-modal: 600;--z-popover: 700;--z-toast: 800;--z-overlay: 900;--header-height: 80px;--max-width: 1600px;--sidebar-width: 280px;--ease-spring: cubic-bezier(.175, .885, .32, 1.275);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--ease-emphasized: cubic-bezier(.32, .72, 0, 1);--transition-fast: .2s var(--ease-smooth);--transition-base: .3s var(--ease-smooth);--transition-normal: .4s var(--ease-smooth);--transition-slow: .5s var(--ease-smooth);--transition-emphasized: .42s var(--ease-emphasized);--transition-quick: .09s var(--ease-smooth);--duration-shimmer: 1.6s;--duration-spin: .9s;--focus-ring-color: var(--accent-light);--focus-ring-glow: 0 0 0 3px rgba(109, 93, 252, .35);--focus-scale: scale(1.05)}@media(min-width:1920px){:root{--font-size-base: 1.125rem;--max-width: 2000px}}html[data-theme=mochi]{--accent: #e3e1ee;--accent-light: #f4f3fa;--accent-lighter: #ffffff;--accent-dark: #b3b1c6;--accent-text: #17171c;--accent-subtle: rgba(227, 225, 238, .12);--accent-glow: rgba(227, 225, 238, 0);--accent-h: 248;--accent-s: 18%;--accent-l: 89%;--bg-main: #131316;--bg-primary: #1b1b1f;--bg-secondary: #1b1b1f;--bg-tertiary: #232329;--bg-elevated: #2b2b32;--header-bg: rgba(19, 19, 22, .88);--text-primary: #f2f2f5;--text-secondary: #a9a9b3;--text-tertiary: #85858f;--text-muted: #a9a9b3;--border-primary: #2c2c33;--border-secondary: #3a3a43;--glass-bg: rgba(27, 27, 31, .96);--badge-info-bg: var(--accent);--badge-info-text: var(--accent-text);--shadow-sm: none;--shadow-md: none;--shadow-lg: none;--shadow-active: 0 0 0 1px var(--border-secondary);--shadow-xl: none;--focus-ring-color: var(--accent);--focus-ring-glow: 0 0 0 3px rgba(227, 225, 238, .25)}html[data-theme=sakura]{--accent: #d9a3d9;--accent-light: #eccbec;--accent-lighter: #f9e8f9;--accent-dark: #a978a9;--accent-text: #fff;--accent-subtle: rgba(217, 163, 217, .12);--accent-glow: rgba(217, 163, 217, 0);--accent-h: 300;--accent-s: 45%;--accent-l: 74%;--bg-main: #141116;--bg-primary: #1c171e;--bg-secondary: #1c171e;--bg-tertiary: #241e26;--bg-elevated: #2e262f;--header-bg: rgba(20, 17, 22, .88);--text-primary: #f3eaf3;--text-secondary: #b3a3b5;--text-tertiary: #8d7c8f;--text-muted: #b3a3b5;--border-primary: #322a34;--border-secondary: #403640;--glass-bg: rgba(28, 23, 30, .96);--badge-info-bg: var(--accent-dark);--badge-info-text: #ffffff;--shadow-sm: none;--shadow-md: none;--shadow-lg: none;--shadow-active: 0 0 0 1px var(--border-secondary);--shadow-xl: none;--focus-ring-color: var(--accent);--focus-ring-glow: 0 0 0 3px rgba(217, 163, 217, .25)}*,*:before,*:after{box-sizing:border-box}html{scroll-behavior:smooth;color-scheme:dark;scrollbar-gutter:stable;overflow-x:hidden;overflow-x:clip;max-width:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}html:has(:fullscreen),html:has(:-webkit-full-screen){scrollbar-gutter:auto}body{margin:0;padding:0;font-family:var(--font-family);background:var(--bg-main);color:var(--text-primary);line-height:var(--line-height-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden;overflow-x:clip;max-width:100%;color-scheme:dark}html,body,.app-container,.posterWrapper,.dot,.genreTag{--darkreader-inline-bgcolor: none !important;--darkreader-inline-bgimage: none !important;--darkreader-inline-bordercolor: none !important;--darkreader-inline-color: none !important;background-color:transparent}body{overflow-x:hidden;overflow-x:clip}body:before{display:none!important}h1,h2,h3,h4,h5,h6{margin:0;font-weight:var(--font-weight-semibold);letter-spacing:-.02em}a{color:inherit;text-decoration:none}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--focus-ring-color)!important;outline-offset:3px!important;box-shadow:var(--focus-ring-glow)!important;transition:outline-offset var(--transition-fast),transform var(--transition-fast)}a:focus:not(:focus-visible),button:focus:not(:focus-visible),input:focus:not(:focus-visible),select:focus:not(:focus-visible),[tabindex]:focus:not(:focus-visible){outline:none!important;box-shadow:none!important}a,button,input,select,textarea,[tabindex]{-webkit-tap-highlight-color:transparent}@media(min-width:1200px){a:focus-visible,button:focus-visible{transform:var(--focus-scale)}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-elevated);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}.text-gradient{background:linear-gradient(135deg,#fff,#a5a5a5);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.text-gradient-accent{background:linear-gradient(135deg,var(--accent-light) 0%,var(--accent) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.app-container{display:flex;flex-direction:column;min-height:100vh}main{flex:1;width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--space-8) var(--space-16);position:relative;z-index:1}.main-content{padding-top:var(--header-height)}@media(max-width:1024px){.main-content{padding-top:calc(var(--header-height) + 52px)}}@media(max-width:848px){main{padding:0 var(--space-4) var(--space-12)}.main-content{padding-top:116px}}.section-title{font-size:1.75rem;font-weight:800;margin-bottom:var(--space-8);color:var(--text-primary);letter-spacing:-.02em;line-height:1}.section-eyebrow{display:flex;align-items:center;gap:8px;font-size:.72rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--accent-light);margin:0;line-height:1.4}.section-eyebrow:before{content:"";width:14px;height:3px;border-radius:999px;background:linear-gradient(90deg,var(--accent) 0%,var(--accent-dark) 100%);box-shadow:0 0 8px var(--accent-glow);flex:none}.title-stack{display:flex;flex-direction:column;gap:4px;min-width:0;justify-content:center}html[data-theme=mochi] .section-eyebrow,html[data-theme=sakura] .section-eyebrow{color:var(--accent)}@media(max-width:768px){.section-title{font-size:1.5rem;margin-bottom:var(--space-6)}}.grid-container{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--space-6);width:100%}@media(max-width:1024px){.grid-container{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--space-4)}}@media(max-width:768px){.grid-container{grid-template-columns:repeat(3,1fr);gap:var(--space-2)}}@media(max-width:480px){.grid-container{grid-template-columns:repeat(3,1fr);gap:8px}}footer{text-align:center;padding:var(--space-12);color:var(--text-muted);border-top:1px solid var(--border-primary);margin-top:var(--space-16);background:var(--bg-secondary)}footer a{color:var(--accent);text-decoration:none;font-weight:var(--font-weight-medium);transition:color var(--transition-fast)}footer a:hover{color:var(--accent-light);text-shadow:0 0 8px var(--accent-glow)}select{appearance:none;-webkit-appearance:none;cursor:pointer;background-color:var(--bg-tertiary)!important;border-color:var(--border-primary)!important}select:hover{background-color:var(--bg-tertiary)!important;border-color:var(--border-secondary)!important}select:focus{background-color:var(--bg-tertiary)!important;border-color:var(--accent)!important;outline:none}select:active{background-color:var(--bg-tertiary)!important}body.low-end{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol!important;--transition-fast: 0s !important;--transition-base: 0s !important;--transition-normal: 0s !important;--transition-slow: 0s !important;scroll-behavior:auto!important}body.low-end,body.low-end *{transition:none!important;animation:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;box-shadow:none!important;text-shadow:none!important}body.low-end:before{display:none!important}body.low-end .text-gradient,body.low-end .text-gradient-accent{background:none!important;-webkit-background-clip:initial!important;-webkit-text-fill-color:initial!important;color:var(--text-primary)!important}body.low-end .text-gradient-accent{color:var(--accent)!important}body.low-end [class*=banner],body.low-end [class*=bannerContainer],body.low-end [class*=bannerOverlay],body.low-end [class*=heroSection]{background-image:none!important;background-color:var(--bg-main)!important;min-height:auto!important}body.low-end [class*=infoGlass]{background:var(--bg-secondary)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:1px solid var(--border-primary)!important;box-shadow:none!important}.skeleton{position:relative;overflow:hidden;background-color:var(--bg-tertiary)}.skeleton:after{content:"";position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,#fff0 0,#ffffff0d 20%,#ffffff1f 60%,#fff0);animation:skeleton-wave 1.8s infinite ease-in-out}@keyframes skeleton-wave{to{transform:translate(100%)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto!important}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
|