Fix heavy default zoom

This commit is contained in:
Brian Beck 2024-10-27 02:34:05 -07:00
parent c2fd1e9395
commit 073985e627
23 changed files with 182 additions and 9 deletions

View file

@ -171,6 +171,9 @@ export async function getSkinConfig() {
},
cameraOverrides: {
chaingun: { target: "0m 0m 0m", fov: "12deg" },
hmale: { fov: "24deg" },
hfemale: { fov: "24deg" },
hbioderm: { fov: "24deg" },
},
animationLabelOverrides: {
mmale: {

File diff suppressed because one or more lines are too long

1
docs/404/index.html Normal file

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/78e521c3-3739cc27b3254d35.js","static/chunks/95b64a6e-a0ff77d56afeed48.js","static/chunks/31664189-69d752d1129a4958.js","static/chunks/545f34e4-3e66c340444ca8b2.js","static/chunks/1bfc9850-b4ceccea4b74407c.js","static/chunks/d7eeaac4-d223ea230e13423c.js","static/chunks/f580fadb-2911e2fbf64aae5a.js","static/chunks/470-094a8f589946fc6b.js","static/chunks/pages/index-f57aecfcfef566e7.js"],"/_error":["static/chunks/pages/_error-54b9fcf45cb5bc62.js"],sortedPages:["/","/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/78e521c3-3739cc27b3254d35.js","static/chunks/95b64a6e-a0ff77d56afeed48.js","static/chunks/31664189-69d752d1129a4958.js","static/chunks/545f34e4-3e66c340444ca8b2.js","static/chunks/1bfc9850-b4ceccea4b74407c.js","static/chunks/d7eeaac4-d223ea230e13423c.js","static/chunks/f580fadb-2911e2fbf64aae5a.js","static/chunks/470-094a8f589946fc6b.js","static/chunks/pages/index-f57aecfcfef566e7.js"],"/_error":["static/chunks/pages/_error-54b9fcf45cb5bc62.js"],"/gallery":["static/css/ef1c21cd61d26e16.css","static/chunks/pages/gallery-fdcee2f9a64de949.js"],sortedPages:["/","/_app","/_error","/gallery"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[214],{4080:function(e,l,a){(window.__NEXT_P=window.__NEXT_P||[]).push(["/gallery",function(){return a(1560)}])},1560:function(e,l,a){"use strict";a.r(l),a.d(l,{default:function(){return GalleryPage}});var n=a(5893),i=a(7294);let t={customSkins:{},newSkins:{}};var r=a(9746),o=a.n(r),s=a(9008),c=a.n(s);let u=[];function GalleryPage(){var e,l;let[a,r]=function(){let[e,l]=(0,i.useState)(t);(0,i.useEffect)(()=>{let e=new AbortController,a=e.signal,n=!1,loadCustomSkins=async()=>{let e;try{if(e=await fetch("".concat("https://exogen.github.io/t2-skins","/skins.json"),{signal:a}),!n){let a=await e.json();n||l(a)}}catch(e){console.error(e)}};return loadCustomSkins(),()=>{n=!0,e.abort()}},[]);let a=e!==t;return[e,a]}(),[s,d]=(0,i.useState)("lmale"),m="hfemale"===s?"hmale":s,h=null!==(l=null===(e=a.customSkins)||void 0===e?void 0:e[m])&&void 0!==l?l:u;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(c(),{children:(0,n.jsx)("title",{children:"Tribes 2 Skin Gallery"})}),(0,n.jsxs)("main",{className:o().GalleryPage,children:[(0,n.jsx)("div",{className:o().Tools,children:(0,n.jsxs)("select",{id:"ModelSelect","aria-label":"Player model",onChange:e=>{d(e.target.value)},value:s,children:[(0,n.jsx)("option",{value:"lmale",children:"Human Male \xb7 Light"}),(0,n.jsx)("option",{value:"mmale",children:"Human Male \xb7 Medium"}),(0,n.jsx)("option",{value:"hmale",children:"Human Male \xb7 Heavy"}),(0,n.jsx)("option",{value:"lfemale",children:"Human Female \xb7 Light"}),(0,n.jsx)("option",{value:"mfemale",children:"Human Female \xb7 Medium"}),(0,n.jsx)("option",{value:"hfemale",children:"Human Female \xb7 Heavy"}),(0,n.jsx)("option",{value:"lbioderm",children:"Bioderm \xb7 Light"}),(0,n.jsx)("option",{value:"mbioderm",children:"Bioderm \xb7 Medium"}),(0,n.jsx)("option",{value:"hbioderm",children:"Bioderm \xb7 Heavy"})]})}),(0,n.jsx)("div",{className:o().Gallery,children:h.map(e=>(0,n.jsxs)("div",{className:o().Skin,children:[(0,n.jsx)("img",{className:o().Preview,loading:"lazy",src:"".concat("https://exogen.github.io/t2-skins","/gallery/").concat(encodeURIComponent(e),".").concat(m,".webp"),width:800,height:1600}),(0,n.jsx)("div",{className:o().Label,children:e})]},e))})]})]})}},9746:function(e){e.exports={GalleryPage:"gallery_GalleryPage__QyCLn",Tools:"gallery_Tools__COicv",Gallery:"gallery_Gallery__ZMJE_",Skin:"gallery_Skin__Ep_rb",Preview:"gallery_Preview__JGf2f",Label:"gallery_Label__kJfDw"}},9008:function(e,l,a){e.exports=a(9201)}},function(e){e.O(0,[774,888,179],function(){return e(e.s=4080)}),_N_E=e.O()}]);
//# sourceMappingURL=gallery-fdcee2f9a64de949.js.map

File diff suppressed because one or more lines are too long

View file

@ -1,2 +0,0 @@
!function(){"use strict";var e,r,_,t,n,i,u,c={},o={};function __webpack_require__(e){var r=o[e];if(void 0!==r)return r.exports;var _=o[e]={exports:{}},t=!0;try{c[e].call(_.exports,_,_.exports,__webpack_require__),t=!1}finally{t&&delete o[e]}return _.exports}__webpack_require__.m=c,e=[],__webpack_require__.O=function(r,_,t,n){if(_){n=n||0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];e[i]=[_,t,n];return}for(var u=1/0,i=0;i<e.length;i++){for(var _=e[i][0],t=e[i][1],n=e[i][2],c=!0,o=0;o<_.length;o++)u>=n&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[o])})?_.splice(o--,1):(c=!1,n<u&&(u=n));if(c){e.splice(i--,1);var a=t()}}return a},__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var _ in r)__webpack_require__.o(r,_)&&!__webpack_require__.o(e,_)&&Object.defineProperty(e,_,{enumerable:!0,get:r[_]})},__webpack_require__.f={},__webpack_require__.e=function(e){return Promise.all(Object.keys(__webpack_require__.f).reduce(function(r,_){return __webpack_require__.f[_](e,r),r},[]))},__webpack_require__.u=function(e){return"static/chunks/"+(737===e?"fb7d5399":e)+"."+({250:"10c119307e239c98",737:"bc4a70b34221e8c8",767:"0dd6b240996f3455",848:"fc0fe21cdc2e6431"})[e]+".js"},__webpack_require__.miniCssF=function(e){return"static/css/481d64a53a5033ec.css"},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r={},_="_N_E:",__webpack_require__.l=function(e,t,n,i){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,c,o=document.getElementsByTagName("script"),a=0;a<o.length;a++){var p=o[a];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==_+n){u=p;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,__webpack_require__.nc&&u.setAttribute("nonce",__webpack_require__.nc),u.setAttribute("data-webpack",_+n),u.src=__webpack_require__.tu(e)),r[e]=[t];var onScriptComplete=function(_,t){u.onerror=u.onload=null,clearTimeout(b);var n=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(function(e){return e(t)}),_)return _(t)},b=setTimeout(onScriptComplete.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=onScriptComplete.bind(null,u.onerror),u.onload=onScriptComplete.bind(null,u.onload),c&&document.head.appendChild(u)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.tt=function(){return void 0===t&&(t={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(t=trustedTypes.createPolicy("nextjs#bundler",t))),t},__webpack_require__.tu=function(e){return __webpack_require__.tt().createScriptURL(e)},__webpack_require__.p="/t2-model-skinner/_next/",n={272:0},__webpack_require__.f.j=function(e,r){var _=__webpack_require__.o(n,e)?n[e]:void 0;if(0!==_){if(_)r.push(_[2]);else if(272!=e){var t=new Promise(function(r,t){_=n[e]=[r,t]});r.push(_[2]=t);var i=__webpack_require__.p+__webpack_require__.u(e),u=Error();__webpack_require__.l(i,function(r){if(__webpack_require__.o(n,e)&&(0!==(_=n[e])&&(n[e]=void 0),_)){var t=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+t+": "+i+")",u.name="ChunkLoadError",u.type=t,u.request=i,_[1](u)}},"chunk-"+e,e)}else n[e]=0}},__webpack_require__.O.j=function(e){return 0===n[e]},i=function(e,r){var _,t,i=r[0],u=r[1],c=r[2],o=0;if(i.some(function(e){return 0!==n[e]})){for(_ in u)__webpack_require__.o(u,_)&&(__webpack_require__.m[_]=u[_]);if(c)var a=c(__webpack_require__)}for(e&&e(r);o<i.length;o++)t=i[o],__webpack_require__.o(n,t)&&n[t]&&n[t][0](),n[t]=0;return __webpack_require__.O(a)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))}();
//# sourceMappingURL=webpack-51b12156dbf89258.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
!function(){"use strict";var e,r,_,t,n,i,u,c={},o={};function __webpack_require__(e){var r=o[e];if(void 0!==r)return r.exports;var _=o[e]={exports:{}},t=!0;try{c[e].call(_.exports,_,_.exports,__webpack_require__),t=!1}finally{t&&delete o[e]}return _.exports}__webpack_require__.m=c,e=[],__webpack_require__.O=function(r,_,t,n){if(_){n=n||0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];e[i]=[_,t,n];return}for(var u=1/0,i=0;i<e.length;i++){for(var _=e[i][0],t=e[i][1],n=e[i][2],c=!0,o=0;o<_.length;o++)u>=n&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[o])})?_.splice(o--,1):(c=!1,n<u&&(u=n));if(c){e.splice(i--,1);var a=t()}}return a},__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var _ in r)__webpack_require__.o(r,_)&&!__webpack_require__.o(e,_)&&Object.defineProperty(e,_,{enumerable:!0,get:r[_]})},__webpack_require__.f={},__webpack_require__.e=function(e){return Promise.all(Object.keys(__webpack_require__.f).reduce(function(r,_){return __webpack_require__.f[_](e,r),r},[]))},__webpack_require__.u=function(e){return"static/chunks/"+(737===e?"fb7d5399":e)+"."+({250:"10c119307e239c98",737:"bc4a70b34221e8c8",767:"0dd6b240996f3455",848:"fc0fe21cdc2e6431"})[e]+".js"},__webpack_require__.miniCssF=function(e){return"static/css/"+({214:"ef1c21cd61d26e16",888:"481d64a53a5033ec"})[e]+".css"},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r={},_="_N_E:",__webpack_require__.l=function(e,t,n,i){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,c,o=document.getElementsByTagName("script"),a=0;a<o.length;a++){var p=o[a];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==_+n){u=p;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,__webpack_require__.nc&&u.setAttribute("nonce",__webpack_require__.nc),u.setAttribute("data-webpack",_+n),u.src=__webpack_require__.tu(e)),r[e]=[t];var onScriptComplete=function(_,t){u.onerror=u.onload=null,clearTimeout(b);var n=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(function(e){return e(t)}),_)return _(t)},b=setTimeout(onScriptComplete.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=onScriptComplete.bind(null,u.onerror),u.onload=onScriptComplete.bind(null,u.onload),c&&document.head.appendChild(u)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.tt=function(){return void 0===t&&(t={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(t=trustedTypes.createPolicy("nextjs#bundler",t))),t},__webpack_require__.tu=function(e){return __webpack_require__.tt().createScriptURL(e)},__webpack_require__.p="/t2-model-skinner/_next/",n={272:0},__webpack_require__.f.j=function(e,r){var _=__webpack_require__.o(n,e)?n[e]:void 0;if(0!==_){if(_)r.push(_[2]);else if(272!=e){var t=new Promise(function(r,t){_=n[e]=[r,t]});r.push(_[2]=t);var i=__webpack_require__.p+__webpack_require__.u(e),u=Error();__webpack_require__.l(i,function(r){if(__webpack_require__.o(n,e)&&(0!==(_=n[e])&&(n[e]=void 0),_)){var t=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+t+": "+i+")",u.name="ChunkLoadError",u.type=t,u.request=i,_[1](u)}},"chunk-"+e,e)}else n[e]=0}},__webpack_require__.O.j=function(e){return 0===n[e]},i=function(e,r){var _,t,i=r[0],u=r[1],c=r[2],o=0;if(i.some(function(e){return 0!==n[e]})){for(_ in u)__webpack_require__.o(u,_)&&(__webpack_require__.m[_]=u[_]);if(c)var a=c(__webpack_require__)}for(e&&e(r);o<i.length;o++)t=i[o],__webpack_require__.o(n,t)&&n[t]&&n[t][0](),n[t]=0;return __webpack_require__.O(a)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))}();
//# sourceMappingURL=webpack-f4b71fc3997b17ba.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,2 @@
.gallery_GalleryPage__QyCLn{flex-direction:column}.gallery_Tools__COicv{position:-webkit-sticky;position:sticky;top:0;flex:0 0 auto;padding:10px;text-align:center;background:rgba(0,0,0,.8);z-index:2}.gallery_Gallery__ZMJE_{--column-count:1;flex:0 0 auto;display:grid;width:100%;grid-template-columns:repeat(var(--column-count),1fr)}.gallery_Skin__Ep_rb{position:relative;font-size:12px;text-align:center;overflow:hidden}.gallery_Preview__JGf2f{display:block;width:100%;height:auto}.gallery_Label__kJfDw{position:absolute;bottom:12px;left:50%;transform:translate(-50%);display:inline-block;white-space:nowrap;color:#fff;background:rgba(0,0,0,.5);padding:3px 10px;border-radius:9999px;opacity:.5}.gallery_Skin__Ep_rb:hover .gallery_Label__kJfDw{opacity:1}
/*# sourceMappingURL=ef1c21cd61d26e16.css.map*/

View file

@ -0,0 +1 @@
{"version":3,"sources":["webpack://_N_E/src/pages/gallery.module.css"],"names":[],"mappings":"AAAA,4BACE,qBACF,CAEA,sBACE,uBAAgB,CAAhB,eAAgB,CAChB,KAAM,CACN,aAAc,CACd,YAAa,CACb,iBAAkB,CAClB,yBAA8B,CAC9B,SACF,CAEA,wBACE,gBAAiB,CACjB,aAAc,CACd,YAAa,CACb,UAAW,CACX,qDACF,CAEA,qBACE,iBAAkB,CAClB,cAAe,CACf,iBAAkB,CAClB,eACF,CAEA,wBACE,aAAc,CACd,UAAW,CACX,WACF,CAEA,sBACE,iBAAkB,CAClB,WAAY,CACZ,QAAS,CACT,yBAA6B,CAC7B,oBAAqB,CACrB,kBAAmB,CACnB,UAAW,CACX,yBAA8B,CAC9B,gBAAiB,CACjB,oBAAqB,CACrB,UACF,CAEA,iDACE,SACF","file":"static/css/ef1c21cd61d26e16.css","sourcesContent":[".GalleryPage {\n flex-direction: column;\n}\n\n.Tools {\n position: sticky;\n top: 0;\n flex: 0 0 auto;\n padding: 10px;\n text-align: center;\n background: rgba(0, 0, 0, 0.8);\n z-index: 2;\n}\n\n.Gallery {\n --column-count: 1;\n flex: 0 0 auto;\n display: grid;\n width: 100%;\n grid-template-columns: repeat(var(--column-count), 1fr);\n}\n\n.Skin {\n position: relative;\n font-size: 12px;\n text-align: center;\n overflow: hidden;\n}\n\n.Preview {\n display: block;\n width: 100%;\n height: auto;\n}\n\n.Label {\n position: absolute;\n bottom: 12px;\n left: 50%;\n transform: translate(-50%, 0);\n display: inline-block;\n white-space: nowrap;\n color: #fff;\n background: rgba(0, 0, 0, 0.5);\n padding: 3px 10px;\n border-radius: 9999px;\n opacity: 0.5;\n}\n\n.Skin:hover .Label {\n opacity: 1;\n}\n"],"sourceRoot":""}

1
docs/gallery/index.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -6,6 +6,7 @@ module.exports = async () => {
reactStrictMode: true,
productionBrowserSourceMaps: true,
publicRuntimeConfig,
trailingSlash: true,
output: "export",
distDir: "docs",
};

View file

@ -0,0 +1,52 @@
.GalleryPage {
flex-direction: column;
}
.Tools {
position: sticky;
top: 0;
flex: 0 0 auto;
padding: 10px;
text-align: center;
background: rgba(0, 0, 0, 0.8);
z-index: 2;
}
.Gallery {
--column-count: 1;
flex: 0 0 auto;
display: grid;
width: 100%;
grid-template-columns: repeat(var(--column-count), 1fr);
}
.Skin {
position: relative;
font-size: 12px;
text-align: center;
overflow: hidden;
}
.Preview {
display: block;
width: 100%;
height: auto;
}
.Label {
position: absolute;
bottom: 12px;
left: 50%;
transform: translate(-50%, 0);
display: inline-block;
white-space: nowrap;
color: #fff;
background: rgba(0, 0, 0, 0.5);
padding: 3px 10px;
border-radius: 9999px;
opacity: 0.5;
}
.Skin:hover .Label {
opacity: 1;
}

62
src/pages/gallery.tsx Normal file
View file

@ -0,0 +1,62 @@
import { useState } from "react";
import useManifest from "../useManifest";
import styles from "./gallery.module.css";
import Head from "next/head";
const baseManifestPath = `https://exogen.github.io/t2-skins`;
const emptySkins: string[] = [];
export default function GalleryPage() {
const [manifest, isLoaded] = useManifest();
const [selectedModel, setSelectedModel] = useState("lmale");
const actualModel = selectedModel === "hfemale" ? "hmale" : selectedModel;
const customSkins = manifest.customSkins?.[actualModel] ?? emptySkins;
return (
<>
<Head>
<title>Tribes 2 Skin Gallery</title>
</Head>
<main className={styles.GalleryPage}>
<div className={styles.Tools}>
<select
id="ModelSelect"
aria-label="Player model"
onChange={(event) => {
setSelectedModel(event.target.value);
}}
value={selectedModel}
>
<option value="lmale">Human Male &middot; Light</option>
<option value="mmale">Human Male &middot; Medium</option>
<option value="hmale">Human Male &middot; Heavy</option>
<option value="lfemale">Human Female &middot; Light</option>
<option value="mfemale">Human Female &middot; Medium</option>
<option value="hfemale">Human Female &middot; Heavy</option>
<option value="lbioderm">Bioderm &middot; Light</option>
<option value="mbioderm">Bioderm &middot; Medium</option>
<option value="hbioderm">Bioderm &middot; Heavy</option>
</select>
</div>
<div className={styles.Gallery}>
{customSkins.map((name) => {
return (
<div key={name} className={styles.Skin}>
<img
className={styles.Preview}
loading="lazy"
src={`${baseManifestPath}/gallery/${encodeURIComponent(
name
)}.${actualModel}.webp`}
width={800}
height={1600}
/>
<div className={styles.Label}>{name}</div>
</div>
);
})}
</div>
</main>
</>
);
}

47
src/useManifest.ts Normal file
View file

@ -0,0 +1,47 @@
import { useState, useEffect } from "react";
export type Manifest = {
customSkins: Record<string, string[]>;
newSkins: Record<string, string[]>;
};
const baseManifestPath = `https://exogen.github.io/t2-skins`;
export const defaultManifest: Manifest = {
customSkins: {},
newSkins: {},
};
export default function useManifest(): [Manifest, boolean] {
const [manifest, setManifest] = useState<Manifest>(defaultManifest);
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
let ignore = false;
const loadCustomSkins = async () => {
let res;
try {
res = await fetch(`${baseManifestPath}/skins.json`, { signal });
if (!ignore) {
const json = await res.json();
if (!ignore) {
setManifest(json as Manifest);
}
}
} catch (err) {
console.error(err);
}
};
loadCustomSkins();
return () => {
ignore = true;
controller.abort();
};
}, []);
const isLoaded = manifest !== defaultManifest;
return [manifest, isLoaded];
}