1import{n as e,r as t,t as n}from"./rolldown-runtime-B97S5rRB.js";import{a as r,c as i,n as a,r as o,s,t as c}from"./jsx-runtime-CrmXsIW-.js";import{n as l,t as u}from"./babylon-k9semQUU.js";var d=n((e=>{var t=i();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}return`Minified React error #`+e+`; visit `+t+` for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`}function r(){}var a={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},o=Symbol.for(`react.portal`);function s(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:o,key:r==null?null:``+r,children:e,containerInfo:t,implementation:n}}var c=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=a,e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return s(e,t,null,r)},e.flushSync=function(e){var t=c.T,n=a.p;try{if(c.T=null,a.p=2,e)return e()}finally{c.T=t,a.p=n,a.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,a.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&a.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin),i=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?a.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:i,fetchPriority:o}):n===`script`&&a.d.X(e,{crossOrigin:r,integrity:i,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`)if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=l(t.as,t.crossOrigin);a.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0})}}else t??a.d.M(e)},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=l(n,t.crossOrigin);a.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`)if(t){var n=l(t.as,t.crossOrigin);a.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0})}else a.d.m(e)},e.requestFormReset=function(e){a.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return c.H.useFormState(e,t,n)},e.useFormStatus=function(){return c.H.useHostTransitionStatus()},e.version=`19.2.5`})),f=n(((e,t)=>{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=d()}));function p(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function m(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return y(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:b(t)}return S(t,n,null,e)}function h(e,t){if(e===!1||e==null)throw Error(t)}function g(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function _(){return Math.random().toString(36).substring(2,10)}function v(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.unstable_mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function y(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?x(t):t,state:n,key:t&&t.key||r||_(),unstable_mask:i}}function b({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function x(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function S(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:g.location,delta:t})}function f(e,t){s=`PUSH`;let r=p(e)?e:y(g.location,e,t);n&&n(r,e),l=u()+1;let d=v(r,l),f=g.createHref(r.unstable_mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:g.location,delta:1})}function m(e,t){s=`REPLACE`;let r=p(e)?e:y(g.location,e,t);n&&n(r,e),l=u();let i=v(r,l),d=g.createHref(r.unstable_mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:g.location,delta:0})}function h(e){return ee(e)}let g={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(Wt,d),c=e,()=>{i.removeEventListener(Wt,d),c=null}},createHref(e){return t(i,e)},createURL:h,encodeLocation(e){let t=h(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:m,go(e){return o.go(e)}};return g}function ee(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),h(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:b(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function C(e,t,n=`/`){return te(e,t,n,!1)}function te(e,t,n,r){let i=w((typeof t==`string`?x(t):t).pathname||`/`,n);if(i==null)return null;let a=re(e);ae(a);let o=null;for(let e=0;o==null&&e<a.length;++e){let t=de(i);o=ce(a[e],t,r)}return o}function ne(e,t){let{route:n,pathname:r,params:i}=e;return{id:n.id,pathname:r,params:i,data:t[n.id],loaderData:t[n.id],handle:n.handle}}function re(e,t=[],n=[],r=``,i=!1){let a=(e,a,o=i,s)=>{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;h(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}
1" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=N([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(h(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),re(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:oe(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of ie(e.path))a(e,t,!0,n)}),t}function ie(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=ie(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function ae(e){e.sort((e,t)=>e.score===t.score?se(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}function oe(e,t){let n=e.split(`/`),r=n.length;return n.some(Zt)&&(r+=Xt),t&&(r+=qt),n.filter(e=>!Zt(e)).reduce((e,t)=>e+(Gt.test(t)?Kt:t===``?Jt:Yt),r)}function se(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function ce(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e<r.length;++e){let s=r[e],c=e===r.length-1,l=a===`/`?t:t.slice(a.length)||`/`,u=le({path:s.relativePath,caseSensitive:s.caseSensitive,end:c},l),d=s.route;if(!u&&c&&n&&!r[r.length-1].route.index&&(u=le({path:s.relativePath,caseSensitive:s.caseSensitive,end:!1},l)),!u)return null;
1Object.assign(i,u.params),o.push({params:i,pathname:N([a,u.pathname]),pathnameBase:tn(N([a,u.pathnameBase])),route:d}),u.pathnameBase!==`/`&&(a=N([a,u.pathnameBase]))}return o}function le(e,t){typeof e==`string`&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=ue(e.path,e.caseSensitive,e.end),i=t.match(n);if(!i)return null;let a=i[0],o=a.replace(/(.)\/+$/,`$1`),s=i.slice(1);return{params:r.reduce((e,{paramName:t,isOptional:n},r)=>{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function ue(e,t=!1,n=!0){g(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function de(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return g(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function w(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}function fe(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?x(e):e,a;return n?(n=$t(n),a=n.startsWith(`/`)?pe(n.substring(1),`/`):pe(n,t)):a=t,{pathname:a,search:nn(r),hash:rn(i)}}function pe(e,t){let n=en(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function me(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function he(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function ge(e){let t=he(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function _e(e,t,n,r=!1){let i;typeof e==`string`?i=x(e):(i={...e},h(!i.pathname||!i.pathname.includes(`?`),me(`?`,`pathname`,`search`,i)),h(!i.pathname||!i.pathname.includes(`#`),me(`#`,`pathname`,`hash`,i)),h(!i.search||!i.search.includes(`#`),me(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=fe(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}function ve(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function ye(e){return N(e.map(e=>e.route.path).filter(Boolean))||`/`}function be(e,t){let n=e;if(typeof n!=`string`||!Qt.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(on)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=w(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{g(!1,`<Link to="${n}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}function xe(){return O.useContext(ln)}function Se(e){if(e.startsWith(`${mn}:${hn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Ce(e){if(e.startsWith(`${mn}:${gn}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new an(t.status,t.statusText,t.data)}catch{}}function we(e,{relative:t}={}){h(T(),`useHref() may be used only in the context of a <Router> component.`);let{basename:n,navigator:r}=k.useContext(I),{hash:i,pathname:a,search:o}=D(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:N([n,a])),r.createHref({pathname:s,search:o,hash:i})}function T(){return k.useContext(L)!=null}function E(){return h(T(),`useLocation() may be used only in the context of a <Router> component.`),k.useContext(L).location}function Te(){return k.useContext(L).navigationType}function Ee(e){k.useContext(I).static||k.useLayoutEffect(e)}function De(){let{isDataRoute:e}=k.useContext(R);return e?Ge():Oe()}function Oe(){h(T(),`useNavigate() may be used only in the context of a <Router> component.`);
1let e=k.useContext(P),{basename:t,navigator:n}=k.useContext(I),{matches:r}=k.useContext(R),{pathname:i}=E(),a=JSON.stringify(ge(r)),o=k.useRef(!1);return Ee(()=>{o.current=!0}),k.useCallback((r,s={})=>{if(g(o.current,_n),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=_e(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:N([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}function ke(){let{matches:e}=k.useContext(R);return e[e.length-1]?.params??{}}function D(e,{relative:t}={}){let{matches:n}=k.useContext(R),{pathname:r}=E(),i=JSON.stringify(ge(n));return k.useMemo(()=>_e(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function Ae(e,t){return je(e,t)}function je(e,t,n){h(T(),`useRoutes() may be used only in the context of a <Router> component.`);let{navigator:r}=k.useContext(I),{matches:i}=k.useContext(R),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;Ke(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${s}" (under <Route path="${e}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. 2 3Please change the parent <Route path="${e}"> to <Route path="${e===`/`?`*`:`${e}/*`}">.`)}let u=E(),d;if(t){let e=typeof t==`string`?x(t):t;h(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=C(e,{pathname:p});g(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),g(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`);let _=Fe(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:N([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:N([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&_?k.createElement(L.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,unstable_mask:void 0,...d},navigationType:`POP`}},_):_}function Me(){let e=We(),t=ve(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=k.createElement(k.Fragment,null,k.createElement(`p`,null,`ð¿ Hey developer ð`),k.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,k.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,k.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),k.createElement(k.Fragment,null,k.createElement(`h2`,null,`Unexpected Application Error!`),k.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?k.createElement(`pre`,{style:i},n):null,o)}function Ne({children:e,error:t}){let{basename:n}=k.useContext(I);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=Se(t.digest);if(e){let r=bn.get(t);if(r)throw r;let i=be(e.location,n);if(on&&!bn.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw bn.set(t,n),n}return k.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function Pe({routeContext:e,match:t,children:n}){let r=k.useContext(P);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),k.createElement(R.Provider,{value:e},n)}function Fe(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);h(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e<i.length;e++){let t=i[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(s=e),t.route.id){let{loaderData:e,errors:a}
3=r,c=t.route.loader&&!e.hasOwnProperty(t.route.id)&&(!a||a[t.route.id]===void 0);if(t.route.lazy||c){n.isStatic&&(o=!0),i=s>=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},unstable_pattern:ye(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||vn,o&&(s<0&&c===0?(Ke(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?k.createElement(n.route.Component,null):n.route.element?n.route.element:e,k.createElement(Pe,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?k.createElement(yn,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function Ie(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Le(e){let t=k.useContext(P);return h(t,Ie(e)),t}function Re(e){let t=k.useContext(F);return h(t,Ie(e)),t}function ze(e){let t=k.useContext(R);return h(t,Ie(e)),t}function Be(e){let t=ze(e),n=t.matches[t.matches.length-1];return h(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function Ve(){return Be(`useRouteId`)}function He(){return Re(`useNavigation`).navigation}function Ue(){let{matches:e,loaderData:t}=Re(`useMatches`);return k.useMemo(()=>e.map(e=>ne(e,t)),[e,t])}function We(){let e=k.useContext(pn),t=Re(`useRouteError`),n=Be(`useRouteError`);return e===void 0?t.errors?.[n]:e}function Ge(){let{router:e}=Le(`useNavigate`),t=Be(`useNavigate`),n=k.useRef(!1);return Ee(()=>{n.current=!0}),k.useCallback(async(r,i={})=>{g(n.current,_n),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}function Ke(e,t,n){!t&&!xn[e]&&(xn[e]=!0,g(!1,n))}function qe({routes:e,future:t,state:n,isStatic:r,onError:i}){return je(e,void 0,{state:n,isStatic:r,onError:i,future:t})}function Je({to:e,replace:t,state:n,relative:r}){h(T(),`<Navigate> may be used only in the context of a <Router> component.`);let{static:i}=A.useContext(I);g(!i,`<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`);let{matches:a}=A.useContext(R),{pathname:o}=E(),s=De(),c=_e(e,ge(a),o,r===`path`),l=JSON.stringify(c);return A.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function Ye(e){h(!1,`A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`)}function Xe({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,unstable_useTransitions:o}){h(!T(),`You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=A.useMemo(()=>({basename:s,navigator:i,static:a,unstable_useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=x(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,unstable_mask:m}=n,_=A.useMemo(()=>{let e=w(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,unstable_mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return g(_!=null,`<Router basename="${s}"> is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the <Router> won't render anything.`),_==null?null:A.createElement(I.Provider,{value:c},A.createElement(L.Provider,{children:t,value:_}))}function Ze({children:e,location:t}){return Ae(Qe(e),t)}function Qe(e,t=[]){let n=[];return A.Children.forEach(e,(e,r)=>{if(!A.isValidElement(e))return;let i=[...t,r];if(e.type===A.Fragment){n.push.apply(n,Qe(e.props.children,i));return}
3h(e.type===Ye,`[${typeof e.type==`string`?e.type:e.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),h(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=Qe(e.props.children,i)),n.push(a)}),n}function $e(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function et(e){return $e(e)&&e.tagName.toLowerCase()===`button`}function tt(e){return $e(e)&&e.tagName.toLowerCase()===`form`}function nt(e){return $e(e)&&e.tagName.toLowerCase()===`input`}function rt(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function it(e,t){return e.button===0&&(!t||t===`_self`)&&!rt(e)}function at(){if(Cn===null)try{new FormData(document.createElement(`form`),0),Cn=!1}catch{Cn=!0}return Cn}function ot(e){return e!=null&&!wn.has(e)?(g(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${Sn}"`),null):e}function st(e,t){let n,r,i,a,o;if(tt(e)){let o=e.getAttribute(`action`);r=o?w(o,t):null,n=e.getAttribute(`method`)||z,i=ot(e.getAttribute(`enctype`))||Sn,a=new FormData(e)}else if(et(e)||nt(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a <button> or <input type="submit"> without a <form>`);let s=e.getAttribute(`formaction`)||o.getAttribute(`action`);if(r=s?w(s,t):null,n=e.getAttribute(`formmethod`)||o.getAttribute(`method`)||z,i=ot(e.getAttribute(`formenctype`))||ot(o.getAttribute(`enctype`))||Sn,a=new FormData(o,e),!at()){let{name:t,type:n,value:r}=e;if(n===`image`){let e=t?`${t}.`:``;a.append(`${e}x`,`0`),a.append(`${e}y`,`0`)}else t&&a.append(t,r)}}else if($e(e))throw Error(`Cannot submit element that is not <form>, <button>, or <input type="submit|image">`);else n=z,r=null,i=Sn,o=e;return a&&i===`text/plain`&&(o=a,a=void 0),{action:r,method:n.toLowerCase(),encType:i,formData:a,body:o}}function ct(e){return e.replace(En,e=>Tn[e])}function lt(e,t){if(e===!1||e==null)throw Error(t)}function ut(e,t,n,r){let i=typeof e==`string`?new URL(e,typeof window>`u`?`server://singlefetch/`:window.location.origin):e;return n?i.pathname.endsWith(`/`)?i.pathname=`${i.pathname}_.${r}`:i.pathname=`${i.pathname}.${r}`:i.pathname===`/`?i.pathname=`_root.${r}`:t&&w(i.pathname,t)===`/`?i.pathname=`${en(t)}/_root.${r}`:i.pathname=`${en(i.pathname)}.${r}`,i}async function dt(e,t){if(e.id in t)return t[e.id];try{let n=await u(()=>import(e.module),[]);return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function ft(e){return e!=null&&typeof e.page==`string`}function pt(e){return e==null?!1:e.href==null?e.rel===`preload`&&typeof e.imageSrcSet==`string`&&typeof e.imageSizes==`string`:typeof e.rel==`string`&&typeof e.href==`string`}async function mt(e,t,n){return yt((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await dt(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(pt).filter(e=>e.rel===`stylesheet`||e.rel===`preload`).map(e=>e.rel===`stylesheet`?{...e,rel:`prefetch`,as:`style`}:{...e,rel:`prefetch`}))}function ht(e,t,n,r,i,a){let o=(e,t)=>n[t]?e.route.id!==n[t].route.id:!0,s=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith(`*`)&&n[t].params[`*`]!==e.params[`*`];return a===`assets`?t.filter((e,t)=>o(e,t)||s(e,t)):a===`data`?t.filter((t,a)=>{let c=r.routes[t.route.id];if(!c||!c.hasLoader)return!1;if(o(t,a)||s(t,a))return!0;
3if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(i.pathname+i.search+i.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if(typeof r==`boolean`)return r}return!0}):[]}function gt(e,t,{includeHydrateFallback:n}={}){return _t(e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let i=[r.module];return r.clientActionModule&&(i=i.concat(r.clientActionModule)),r.clientLoaderModule&&(i=i.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(i=i.concat(r.hydrateFallbackModule)),r.imports&&(i=i.concat(r.imports)),i}).flat(1))}function _t(e){return[...new Set(e)]}function vt(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}function yt(e,t){let n=new Set,r=new Set(t);return e.reduce((e,i)=>{if(t&&!ft(i)&&i.as===`script`&&i.href&&r.has(i.href))return e;let a=JSON.stringify(vt(i));return n.has(a)||(n.add(a),e.push({key:a,link:i})),e},[])}function bt(){let e=j.useContext(P);return lt(e,`You must render this element inside a <DataRouterContext.Provider> element`),e}function xt(){let e=j.useContext(F);return lt(e,`You must render this element inside a <DataRouterStateContext.Provider> element`),e}function St(){let e=j.useContext(Dn);return lt(e,`You must render this element inside a <HydratedRouter> element`),e}function Ct(e,t){let n=j.useContext(Dn),[r,i]=j.useState(!1),[a,o]=j.useState(!1),{onFocus:s,onBlur:c,onMouseEnter:l,onMouseLeave:u,onTouchStart:d}=t,f=j.useRef(null);j.useEffect(()=>{if(e===`render`&&o(!0),e===`viewport`){let e=new IntersectionObserver(e=>{e.forEach(e=>{o(e.isIntersecting)})},{threshold:.5});return f.current&&e.observe(f.current),()=>{e.disconnect()}}},[e]),j.useEffect(()=>{if(r){let e=setTimeout(()=>{o(!0)},100);return()=>{clearTimeout(e)}}},[r]);let p=()=>{i(!0)},m=()=>{i(!1),o(!1)};return n?e===`intent`?[a,f,{onFocus:wt(s,p),onBlur:wt(c,m),onMouseEnter:wt(l,p),onMouseLeave:wt(u,m),onTouchStart:wt(d,p)}]:[a,f,{}]:[!1,f,{}]}function wt(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function Tt({page:e,...t}){let n=xe(),{router:r}=bt(),i=j.useMemo(()=>C(r.routes,e,r.basename),[r.routes,e,r.basename]);return i?n?j.createElement(Dt,{page:e,matches:i,...t}):j.createElement(Ot,{page:e,matches:i,...t}):null}function Et(e){let{manifest:t,routeModules:n}=St(),[r,i]=j.useState([]);return j.useEffect(()=>{let r=!1;return mt(e,t,n).then(e=>{r||i(e)}),()=>{r=!0}},[e,t,n]),r}function Dt({page:e,matches:t,...n}){let r=E(),{future:i}=St(),{basename:a}=bt(),o=j.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=ut(e,a,i.unstable_trailingSlashAwareDataRequests,`rsc`),o=!1,s=[];for(let e of t)typeof e.route.shouldRevalidate==`function`?o=!0:s.push(e.route.id);return o&&s.length>0&&n.searchParams.set(`_routes`,s.join(`,`)),[n.pathname+n.search]},[a,i.unstable_trailingSlashAwareDataRequests,e,r,t]);return j.createElement(j.Fragment,null,o.map(e=>j.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...n})))}function Ot({page:e,matches:t,...n}){let r=E(),{future:i,manifest:a,routeModules:o}=St(),{basename:s}=bt(),{loaderData:c,matches:l}=xt(),u=j.useMemo(()=>ht(e,t,l,a,r,`data`),[e,t,l,a,r]),d=j.useMemo(()=>ht(e,t,l,a,r,`assets`),[e,t,l,a,r]),f=j.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=new Set,l=!1;if(t.forEach(e=>{let t=a.routes[e.route.id];!t||!t.hasLoader||(!u.some(t=>t.route.id===e.route.id)&&e.route.id in c&&o[e.route.id]?.shouldRevalidate||t.hasClientLoader?l=!0:n.add(e.route.id))}),n.size===0)return[];let d=ut(e,s,i.unstable_trailingSlashAwareDataRequests,`data`);return l&&n.size>0&&d.searchParams.set(`_routes`,t.filter(e=>n.has(e.route.id)).map(e=>e.route.id).join(`,`)),[d.pathname+d.search]},[s,i.unstable_trailingSlashAwareDataRequests,c,r,a,u,t,e,o]),p=j.useMemo(()=>gt(d,a),[d,a]),m=Et(d);return j.createElement(j.Fragment,null,f.map(e=>j.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...n})),p.map(e=>j.createElement(`link`,{key:e,rel:`modulepreload`,href:e,...n})),m.map(({key:e,link:t})=>j.createElement(`link`,{key:e,nonce:n.nonce,...t,crossOrigin:t.crossOrigin??n.crossOrigin})))}function kt(...e){return t=>
3{e.forEach(e=>{typeof e==`function`?e(t):e!=null&&(e.current=t)})}}function At({basename:e,children:t,unstable_useTransitions:n,window:r}){let i=M.useRef();i.current??=m({window:r,v5Compat:!0});let a=i.current,[o,s]=M.useState({action:a.action,location:a.location}),c=M.useCallback(e=>{n===!1?s(e):M.startTransition(()=>s(e))},[n]);return M.useLayoutEffect(()=>a.listen(c),[a,c]),M.createElement(Xe,{basename:e,children:t,location:o.location,navigationType:o.action,navigator:a,unstable_useTransitions:n})}function jt({basename:e,children:t,history:n,unstable_useTransitions:r}){let[i,a]=M.useState({action:n.action,location:n.location}),o=M.useCallback(e=>{r===!1?a(e):M.startTransition(()=>a(e))},[r]);return M.useLayoutEffect(()=>n.listen(o),[n,o]),M.createElement(Xe,{basename:e,children:t,location:i.location,navigationType:i.action,navigator:n,unstable_useTransitions:r})}function Mt({getKey:e,storageKey:t,...n}){let r=M.useContext(Dn),{basename:i}=M.useContext(I),a=E(),o=Ue();Bt({getKey:e,storageKey:t});let s=M.useMemo(()=>{if(!r||!e)return null;let t=zt(a,o,i,e);return t===a.key?null:t},[]);if(!r||r.isSpaMode)return null;let c=((e,t)=>{if(!window.history.state||!window.history.state.key){let e=Math.random().toString(32).slice(2);window.history.replaceState({key:e},``)}try{let n=JSON.parse(sessionStorage.getItem(e)||`{}`)[t||window.history.state.key];
3typeof n==`number`&&window.scrollTo(0,n)}catch(t){console.error(t),sessionStorage.removeItem(e)}}).toString();return M.createElement(`script`,{...n,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`(${c})(${ct(JSON.stringify(t||Fn))}, ${ct(JSON.stringify(s))})`}})}function Nt(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Pt(e){let t=M.useContext(P);return h(t,Nt(e)),t}function Ft(e){let t=M.useContext(F);return h(t,Nt(e)),t}function It(e,{target:t,replace:n,unstable_mask:r,state:i,preventScrollReset:a,relative:o,viewTransition:s,unstable_defaultShouldRevalidate:c,unstable_useTransitions:l}={}){let u=De(),d=E(),f=D(e,{relative:o});return M.useCallback(p=>{if(it(p,t)){p.preventDefault();let t=n===void 0?b(d)===b(f):n,m=()=>u(e,{replace:t,unstable_mask:r,state:i,preventScrollReset:a,relative:o,viewTransition:s,unstable_defaultShouldRevalidate:c});l?M.startTransition(()=>m()):m()}},[d,u,f,n,r,i,t,e,a,o,s,c,l])}function Lt(){let{router:e}=Pt(`useSubmit`),{basename:t}=M.useContext(I),n=Ve(),r=e.fetch,i=e.navigate;return M.useCallback(async(e,a={})=>{let{action:o,method:s,encType:c,formData:l,body:u}=st(e,t);a.navigate===!1?await r(a.fetcherKey||Pn(),n,a.action||o,{unstable_defaultShouldRevalidate:a.unstable_defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,flushSync:a.flushSync}):await i(a.action||o,{unstable_defaultShouldRevalidate:a.unstable_defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,replace:a.replace,state:a.state,fromRouteId:n,flushSync:a.flushSync,viewTransition:a.viewTransition})},[r,i,t,n])}function Rt(e,{relative:t}={}){let{basename:n}=M.useContext(I),r=M.useContext(R);h(r,`useFormAction must be used inside a RouteContext`);let[i]=r.matches.slice(-1),a={...D(e||`.`,{relative:t})},o=E();if(e==null){a.search=o.search;let e=new URLSearchParams(a.search),t=e.getAll(`index`);if(t.some(e=>e===``)){e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();a.search=n?`?${n}`:``}}return(!e||e===`.`)&&i.route.index&&(a.search=a.search?a.search.replace(/^\?/,`?index&`):`?index`),n!==`/`&&(a.pathname=a.pathname===`/`?n:N([n,a.pathname])),b(a)}function zt(e,t,n,r){let i=null;return r&&(i=r(n===`/`?e:{...e,pathname:w(e.pathname,n)||e.pathname},t)),i??=e.key,i}function Bt({getKey:e,storageKey:t}={}){let{router:n}=Pt(`useScrollRestoration`),{restoreScrollPosition:r,preventScrollReset:i}=Ft(`useScrollRestoration`),{basename:a}=M.useContext(I),o=E(),s=Ue(),c=He();M.useEffect(()=>(window.history.scrollRestoration=`manual`,()=>{window.history.scrollRestoration=`auto`}),[]),Vt(M.useCallback(()=>{if(c.state===`idle`){let t=zt(o,s,a,e);In[t]=window.scrollY}try{sessionStorage.setItem(t||Fn,JSON.stringify(In))}catch(e){g(!1,`Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${e}).`)}window.history.scrollRestoration=`auto`},[c.state,e,a,o,s,t])),typeof document<`u`&&(M.useLayoutEffect(()=>{try{let e=sessionStorage.getItem(t||Fn);e&&(In=JSON.parse(e))}catch{}},[t]),M.useLayoutEffect(()=>{let t=n?.enableScrollRestoration(In,()=>window.scrollY,e?(t,n)=>zt(t,n,a,e):void 0);return()=>t&&t()},[n,a,e]),M.useLayoutEffect(()=>{if(r!==!1){if(typeof r==`number`){window.scrollTo(0,r);return}try{if(o.hash){let e=document.getElementById(decodeURIComponent(o.hash.slice(1)));if(e){e.scrollIntoView();return}}}catch{g(!1,`"${o.hash.slice(1)}" is not a decodable element ID. The view will not scroll to it.`)}i!==!0&&window.scrollTo(0,0)}},[o,r,i]))}function Vt(e,t){let{capture:n}=t||{};M.useEffect(()=>{let t=n==null?void 0:{capture:n};return window.addEventListener(`pagehide`,e,t),()=>{window.removeEventListener(`pagehide`,e,t)}},[e,n])}function Ht(e,{relative:t}={}){let n=M.useContext(un);h(n!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:r}=Pt(`useViewTransitionState`),i=D(e,{relative:t});if(!n.isTransitioning)return!1;let a=w(n.currentLocation.pathname,r)||n.currentLocation.pathname,o=w(n.nextLocation.pathname,r)||n.nextLocation.pathname;return le(i.pathname,o)!=null||le(i.pathname,a)!=null}var O,k,A,Ut,j,M,Wt,Gt,Kt,qt,Jt,Yt,Xt,Zt,Qt,$t,N,en,tn,nn,rn,an,on,sn,cn,P,F,ln,un,dn,fn,I,L,R,pn,mn,hn,gn,_n,vn,yn,bn,xn,z,Sn,Cn,wn,Tn,En,Dn,On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln=e((()=>{O=t(i(),1),k=t(i(),1),A=t(i(),1),i(),Ut=t(i(),1),j=t(i(),1),i(),i(),i(),M=t(i(),1),i(),l(),Wt=`popstate`,Gt=/^:[\w-]+$/,Kt=3,qt=2,Jt=1,Yt=10,Xt=-2,Zt=e=>e===`*`,Qt=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,$t=e=>e.replace(/\/\/+/g,`/`),N=e=>$t(e.join(`/`)),en=e=>e.replace(/\/+$/,``),tn=e=>en(e).replace(/^\/*/,`/`),nn=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,rn=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,an=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}},on=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0,Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`),sn=[`POST`,`PUT`,`PATCH`,`DELETE`],new Set(sn),cn=[`GET`,...sn],new Set(cn),P=O.createContext(null),P.displayName=`DataRouter`,F=O.createContext(null),F.displayName=`DataRouterState`,ln=O.createContext(!1),un=O.createContext({isTransitioning:!1}),un.displayName=`ViewTransition`,dn=O.createContext(new Map),dn.displayName=`Fetchers`,fn=O.createContext(null),fn.displayName=`Await`,I=O.createContext(null),I.displayName=`Navigation`,L=O.createContext(null),L.displayName=`Location`,R=O.createContext({outlet:null,matches:[],isDataRoute:!1}),R.displayName=`Route`,pn=O.createContext(null),pn.displayName=`RouteError`,mn=`REACT_ROUTER_ERROR`,hn=`REDIRECT`,gn=`ROUTE_ERROR_RESPONSE`,_n=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`,k.createContext(null),vn=k.createElement(Me,null),yn=class extends k.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=Ce(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:k.createElement(R.Provider,{value:this.props.routeContext},k.createElement(pn.Provider,{value:e,children:this.props.component}));return this.context?k.createElement(Ne,{error:e},t):t}},yn.contextType=ln,bn=new WeakMap,xn={},A.useOptimistic,A.memo(qe),A.Component,z=`get`,Sn=`application/x-www-form-urlencoded`,Cn=null,wn=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]),Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`),Tn={"&":`\\u0026`,">":`\\u003e`,"<":`\\u003c`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},En=/[&><\u2028\u2029]/g,Dn=j.createContext(void 0),Dn.displayName=`FrameworkContext`,Ut.Component,On=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;try{On&&(window.__reactRouterVersion=`7.14.2`)}catch{}jt.displayName=`unstable_HistoryRouter`,kn=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,An=M.forwardRef(function({onClick:e,discover:t=`render`,prefetch:n=`none`,relative:r,reloadDocument:i,replace:a,unstable_mask:o,state:s,target:c,to:l,preventScrollReset:u,viewTransition:d,unstable_defaultShouldRevalidate:f,...p},m){let{basename:h,navigator:g,unstable_useTransitions:_}=M.useContext(I),v=typeof l==`string`&&kn.test(l),y=be(l,h);l=y.to;let b=we(l,{relative:r}),x=E(),S=null;if(o){let e=_e(o,[],x.unstable_mask?x.unstable_mask.pathname:`/`,!0);h!==`/`&&(e.pathname=e.pathname===`/`?h:N([h,e.pathname])),S=g.createHref(e)}let[ee,C,te]=Ct(n,p),ne=It(l,{replace:a,unstable_mask:o,state:s,target:c,preventScrollReset:u,relative:r,viewTransition:d,unstable_defaultShouldRevalidate:f,unstable_useTransitions:_});function re(t){e&&e(t),t.defaultPrevented||ne(t)}let ie=!(y.isExternal||i),ae=M.createElement(`a`,{...p,...te,href:(ie?S:void 0)||y.absoluteURL||b,onClick:ie?re:e,ref:kt(m,C),target:c,"data-discover":!v&&t===`render`?`true`:void 0});return ee&&!v?M.createElement(M.Fragment,null,ae,M.createElement(Tt,{page:b})):ae}),An.displayName=`Link`,jn=M.forwardRef(function({"aria-current":e=`page`,caseSensitive:t=!1,className:n=``,end:r=!1,style:i,to:a,viewTransition:o,children:s,...c},l){let u=D(a,{relative:c.relative}),d=E(),f=M.useContext(F),{navigator:p,basename:m}=M.useContext(I),h=f!=null&&Ht(u)&&o===!0,g=p.encodeLocation?p.encodeLocation(u).pathname:u.pathname,_=d.pathname,v=f&&f.n
3avigation&&f.navigation.location?f.navigation.location.pathname:null;t||(_=_.toLowerCase(),v=v?v.toLowerCase():null,g=g.toLowerCase()),v&&m&&(v=w(v,m)||v);let y=g!==`/`&&g.endsWith(`/`)?g.length-1:g.length,b=_===g||!r&&_.startsWith(g)&&_.charAt(y)===`/`,x=v!=null&&(v===g||!r&&v.startsWith(g)&&v.charAt(g.length)===`/`),S={isActive:b,isPending:x,isTransitioning:h},ee=b?e:void 0,C;C=typeof n==`function`?n(S):[n,b?`active`:null,x?`pending`:null,h?`transitioning`:null].filter(Boolean).join(` `);let te=typeof i==`function`?i(S):i;return M.createElement(An,{...c,"aria-current":ee,className:C,ref:l,style:te,to:a,viewTransition:o},typeof s==`function`?s(S):s)}),jn.displayName=`NavLink`,Mn=M.forwardRef(({discover:e=`render`,fetcherKey:t,navigate:n,reloadDocument:r,replace:i,state:a,method:o=z,action:s,onSubmit:c,relative:l,preventScrollReset:u,viewTransition:d,unstable_defaultShouldRevalidate:f,...p},m)=>{let{unstable_useTransitions:h}=M.useContext(I),g=Lt(),_=Rt(s,{relative:l}),v=o.toLowerCase()===`get`?`get`:`post`,y=typeof s==`string`&&kn.test(s);return M.createElement(`form`,{ref:m,method:v,action:_,onSubmit:r?c:e=>{if(c&&c(e),e.defaultPrevented)return;e.preventDefault();let r=e.nativeEvent.submitter,s=r?.getAttribute(`formmethod`)||o,p=()=>g(r||e.currentTarget,{fetcherKey:t,method:s,navigate:n,replace:i,state:a,relative:l,preventScrollReset:u,viewTransition:d,unstable_defaultShouldRevalidate:f});h&&n!==!1?M.startTransition(()=>p()):p()},...p,"data-discover":!y&&e===`render`?`true`:void 0})}),Mn.displayName=`Form`,Mt.displayName=`ScrollRestoration`,Nn=0,Pn=()=>`__${String(++Nn)}__`,Fn=`react-router-scroll-positions`,In={}})),Rn=e((()=>{Ln()})),zn=e((()=>{Rn()}));function Bn(e){return e.detail!==0&&e.button!==0||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey}function Vn(e,t,n=`start`,r=null){if(t===`preserve`){r&&window.scrollTo({top:r.top,left:r.left,behavior:`instant`});return}let i=`instant`;if(t===`hash`&&e.hash){let t=decodeURIComponent(e.hash.slice(1)),r=document.getElementById(t);if(r){r.scrollIntoView({behavior:i,block:n});return}}window.scrollTo({top:0,left:0,behavior:i})}function Hn({children:e}){let t=De(),n=E(),r=Te(),i=(0,B.useRef)(null),c=(0,B.useRef)(null),l=(0,B.useRef)(null),u=(0,B.useRef)(!1),d=(0,B.useRef)(!1),f=(0,B.useRef)(n.key),p=(0,B.useCallback)(()=>{let e=i.current,t=l.current;l.current=null,t?.revert(),e&&(e.style.removeProperty(`opacity`),e.style.removeProperty(`pointer-events`),e.style.removeProperty(`overflow-anchor`),e.setAttribute(`aria-busy`,`false`)),c.current=null,u.current=!1},[]),m=(0,B.useCallback)((e,{replace:r=!1,state:f,scroll:m=`top`,block:h=`start`}={})=>
3{if(u.current)return!1;let g=fe(e,n.pathname),_=g.pathname===n.pathname&&g.search===n.search,v=!_||g.hash!==n.hash,y=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,b=m===`preserve`?{top:window.scrollY,left:window.scrollX}:null;if(_&&m===`preserve`)return v&&t(e,{replace:r,state:f,preventScrollReset:!0}),Vn(g,m,h,b),!0;let x=i.current;return!x||y?(v&&(d.current=!0,(0,Gn.flushSync)(()=>{t(e,{replace:r,state:f,preventScrollReset:!0})})),Vn(g,m,h,b),!0):(u.current=!0,x.setAttribute(`aria-busy`,`true`),x.style.pointerEvents=`none`,x.style.overflowAnchor=`none`,l.current=s.context(()=>{let n=s.timeline({onComplete:p});c.current=n,n.to(x,{opacity:0,duration:a.fast,ease:o.in}),n.call(()=>{v&&(d.current=!0,(0,Gn.flushSync)(()=>{t(e,{replace:r,state:f,preventScrollReset:!0})})),Vn(g,m,h,b)}),n.to(x,{opacity:1,duration:a.base,ease:o.expressive})},x),!0)},[p,n.hash,n.pathname,n.search,t]);(0,B.useLayoutEffect)(()=>{let e=window.history.scrollRestoration;return window.history.scrollRestoration=`manual`,()=>{window.history.scrollRestoration=e,c.current?.kill(),p()}},[p]),(0,B.useLayoutEffect)(()=>{if(f.current===n.key)return;if(f.current=n.key,d.current){d.current=!1;return}if(r!==`POP`)return;let e=i.current;if(!e)return;let t=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;if(window.scrollTo({top:0,left:0,behavior:`instant`}),t){p();return}u.current=!0,e.setAttribute(`aria-busy`,`true`),e.style.pointerEvents=`none`,e.style.overflowAnchor=`none`,l.current=s.context(()=>{s.set(e,{opacity:0}),c.current=s.to(e,{opacity:1,duration:a.base,ease:o.expressive,onComplete:p})},e)},[p,n.key,r]);let h=(0,B.useMemo)(()=>({navigateWithTransition:m,surfaceRef:i}),[m]);return(0,Kn.jsx)(qn.Provider,{value:h,children:e})}function Un({to:e,onClick:t,replace:n=!1,state:r,scroll:i=`top`,block:a=`start`,target:o,...s}){let{navigateWithTransition:c}=Wn(),l=s=>{t?.(s),!(s.defaultPrevented||Bn(s)||o&&o!==`_self`)&&(s.preventDefault(),c(e,{replace:n,state:r,scroll:i,block:a}))};return(0,Kn.jsx)(An,{...s,to:e,target:o,replace:n,state:r,onClick:l})}function Wn(){let e=(0,B.useContext)(qn);if(!e)throw Error(`useRouteTransition must be used within RouteTransitionProvider`);return e}var B,Gn,Kn,qn,Jn=e((()=>{B=t(i(),1),Gn=t(f(),1),zn(),r(),Kn=c(),qn=(0,B.createContext)(null)})),Yn,Xn=e((()=>{Yn={seo:{landing:{title:`Custom VR, AR and Web 3D | Grayscale Interactive`,description:`We build custom VR, AR, Web 3D and interactive experiences for products, operations and teams in Mexico and the United States.`},privacy:{title:`Privacy Policy | Grayscale Interactive`,description:`How Grayscale Interactive collects, uses, and protects your information.`},blog:{title:`Industrial VR Training Case Studies | Grayscale`,description:`Explore custom VR training and interactive 3D case studies for automotive and industrial teams, built around real equipment and workflows.`},services:{vr:{title:`Custom VR Training Development | Grayscale Interactive`,description:`Custom VR training and industrial simulations for equipment, procedures, onboarding and safety. Built for teams in Mexico and the United States.`},ar:{title:`Augmented Reality Development | Grayscale Interactive`,description:`Custom augmented reality development for products, equipment and field guidance. Mobile and web AR systems for teams in Mexico and the United States.`},threed:{title:`Interactive 3D Development | Grayscale Interactive`,description:`Custom interactive 3D and Web 3D development for complex products, spaces and technical workflows, built to run across modern devices.`}}},nav:{solutions:`Solutions`,portfolio:`Case Studies`,blog:`Projects`,contact:`Plan Your Project`},theme:{lightState:`Light page theme`,switchToLight:`Use light page theme`,switchToDark:`Use dark page theme`},blog:{titleLead:`Work Built for`,titleHighlight:`Real Operations`,subtitle:`VR training and interactive 3D case studies for automotive and industrial workflows.`,allCategories:`All Projects`,filterLabel:`Project filters`,categories:{vr:`VR Training`,ar:`AR Operations`,"3d":`Interactive 3D`,"custom-dev":`Custom Development`},readCaseStudy:`VIEW CASE STUDY`,onThisPage:`On This Page`,related:`Continue Exploring`,relatedDescription:`More ways immersive systems can make complex work easier to understand, practise, and explain.`,ctaTitleLead:`Have a complex`,ctaTitleHighlight:`project to define?`,ctaDescription:`Bring us the workflow, product, or training challenge. We will help you turn it into a clear, buildable first phase.`,cta:`PLAN YOUR PROJECT`,noArticles:`No projects match this focus yet.`,loading:`Loading projects`,player:{start:`Start project preview`,play:`Play video`,pause:`Pause video`,mute:`Mute video`,unmute:`Turn video sound on`,fullscreen:`Enter fullscreen`,exitFullscreen:`Exit fullscreen`,progress:`Video progress`,unavailable:`This project preview is temporarily unavailable.`},gallery:{label:`Project image gallery`,image:`Image`,of:`of`,previous:`Show previous image`,next:`Show next image`}},servicePages:{backHome:`BACK TO HOME`,cta:`PLAN YOUR PROJECT`,vr:{schemaName:`Custom VR Training and Simulation Development`,audie
3nce:`Industrial training, operations, safety and engineering teams`,titleLead:`Custom VR Training for`,titleHighlight:`Real Operations`,summary:`We design and build VR training systems around the equipment, procedures, decisions and users that define your operation.`,secondaryCta:`SEE VR WORK`,decisionLabel:`First working session`,decisionTitle:`See your process before committing to production`,decisionBody:`Bring one procedure, training gap or equipment challenge. We will map what a useful VR proof should demonstrate and what it would take to operate it.`,decisionDetails:[{label:`Bring`,value:`One process or training gap`},{label:`Format`,value:`30-minute discovery call`},{label:`Leave with`,value:`A practical prototype and deployment direction`}],decisionCta:`BOOK THE WORKING SESSION`,outcomes:[{title:`Faster alignment`,description:`Let training, operations and technical teams evaluate the same spatial workflow early.`},{title:`Process knowledge retained`,description:`Turn expert decisions and procedural context into a reusable training system.`},{title:`Consistent practice`,description:`Give each learner access to the same sequence, conditions and decision points.`},{title:`Deployment clarity`,description:`Plan devices, sites, support and measurement as part of the system from the start.`}],trustedLabel:`Trusted by teams at`,videoTitle:`See the work in context`,videoIntro:`This published production-line case shows how role-based tasks, guided decisions and equipment context can become a repeatable VR training flow.`,videoCaption:`Bosch production-line VR training preview`,industriesTitle:`Built around operational constraints`,industriesIntro:`We focus on environments where access, safety, consistency or equipment availability makes real-world practice difficult to repeat.`,industries:[{title:`Aerospace`,description:`High-precision assembly, inspection and maintenance procedures where equipment access and repeatable practice are limited.`},{title:`Automotive manufacturing`,description:`Assembly-line procedures, quality-control checkpoints, safety protocols and role-based onboarding.`},{title:`Production and assembly`,description:`Sequenced work, tool use and verification tasks that depend on process knowledge and consistent execution.`},{title:`Industrial maintenance`,description:`Equipment operation, service procedures, hazard awareness and emergency response before the physical intervention.`}],definitionTitle:`A simulation built around the work`,definition:`Custom VR training turns a real process into a controlled environment where people can learn, practise and demonstrate decisions before they face the physical task. The content, interactions and deployment model are defined from your workflow rather than adapted from a generic course.`,capabilitiesTitle:`What the system can include`,capabilities:[{title:`Procedure and safety practice`,description:`Guided sequences, consequences and independent practice for operational steps that are difficult, costly or risky to reproduce on demand.`},{title:`Equipment and environment models`,description:`Purpose-built 3D assets and interactions that reflect the machines, tools, controls and spaces your teams actually use.`},{title:`Deployment and learning data`,description:`A delivery plan for headsets, sites, languages and integrations, with the events and results needed to understand participation and completion.`}],processTitle:`From operational problem to usable system`,processIntro:`You can begin with an existing procedure, a training gap or an unclear request for VR. We structure the technical path from there.`,processSteps:[{title:`Define the decisions and constraints`,description:`We map the audience, task, equipment, safety boundaries, success criteria and deployment conditions before production begins.`},{title:`Prototype the critical interaction`,description:`A focused first phase proves the interaction model and training flow while changes are still inexpensive to make.`},{title:`Build, validate and deploy`,description:`The complete system is tested with representative users and prepared for the devices, locations and operating model you need.`}],proofTitle:`VR training in practice`,proofIntro:`These projects show how role-based onboarding and maintenance procedures can become structured, interactive training systems.`,faqTitle:`What teams ask before they start`,faqIntro:`VR is only useful when the operating model is clear. These are the questions we resolve before production begins.`,faqs:[{question:`We have never built VR training. Is it difficult to implement?`,answer:`It becomes manageable when the first phase is narrow. We begin with one audience, one critical workflow and explicit success criteria, then prove the interaction and deployment assumptions before expanding the content.`},{question:`How long does it take to build a simulator?`,answer:`The schedule depends on the procedure, source assets, interaction depth, device targets and approval process. We start with a timeboxed prototype so your team can evaluate the difficult parts before committing to the complete production scope.`},{question:`What happens if our process changes after the simulator is built?`,answer:`We identify likely change points during discovery and separate procedure content from shared system behavior where practical. The maintenance plan defines what your team can update, what requires production work and how releases are validated.`},{question:`How do we know it will work for our team?`,answer:`Representative users test the critical workflow against agreed criteria. We observe comprehension, interaction issues, physical comfort and operational fit, then revise the prototype before scaling the training content.`},{question:`Which VR hardware should the simulator run on?`,answer:`Hardware follows the use case. Tracking accuracy, visual detail, mobility, IT policy, hygiene, support and the physical training area all affect the choice. We evaluate those constraints before locking the device target.`},{question:`Do we need a dedicated space or specialist to operate it?`,answer:`Not always. Some programs use a managed room-scale station; others use seated or portable headset kits. We define the space, reset, supervision, charging, cleaning and support procedure as part of deployment planning.`}]}
3,ar:{schemaName:`Custom Augmented Reality Development`,audience:`Industrial operations, product, marketing and field-service teams`,titleLead:`Augmented Reality Built for`,titleHighlight:`Useful Context`,summary:`We build mobile, web and mixed-reality experiences that place product information, guidance and interactive content where people need it.`,definitionTitle:`Digital information connected to the physical task`,definition:`Augmented reality can help a buyer understand a product at scale, guide a worker through equipment information or connect a physical environment to an interactive layer. We select the device and tracking approach from the job to be done, not from the technology label.`,capabilitiesTitle:`What the system can include`,capabilities:[{title:`Mobile and Web AR`,description:`Camera-based experiences that can open from a phone or browser, with interaction designed for the real viewing conditions of your audience.`},{title:`Spatial product communication`,description:`Full-scale products, configurations and technical information placed into the customer or operator environment for clearer decisions.`},{title:`Connected content and workflows`,description:`Interfaces and integrations that keep the AR layer aligned with your catalog, campaign, training content or operational system.`}],processTitle:`Choose the simplest reliable AR path`,processIntro:`The right experience depends on the environment, audience, available devices and accuracy the task requires.`,processSteps:[{title:`Define the moment of use`,description:`We identify where the experience opens, what the user must understand or do, and which physical conditions affect tracking and usability.`},{title:`Prove tracking and interaction`,description:`A prototype validates the camera, target, scale and interaction approach on representative devices before the full content build.`},{title:`Connect content and launch`,description:`We build the production experience, integrate the required content sources and prepare a deployment that your team can operate.`}],proofTitle:`Related interactive systems`,proofIntro:`Our published library does not yet include a dedicated AR case study. These adjacent projects show how we structure connected content, 3D information and purposeful interaction around a real audience.`},threed:{schemaName:`Custom Interactive 3D and Web 3D Development`,audience:`Product, engineering, sales, training and marketing teams`,titleLead:`Interactive 3D for`,titleHighlight:`Complex Products`,summary:`We turn products, spaces and technical information into interactive 3D systems that people can explore and understand on modern devices.`,definitionTitle:`A shared view of complex information`,definition:`Interactive 3D gives customers, operators and internal teams a direct way to inspect a product or environment instead of interpreting it from disconnected images and documents. The experience can run in a browser or as part of a larger custom application.`,capabilitiesTitle:`What the system can include`,capabilities:[{title:`Web 3D product exploration`,description:`Browser-based models with purposeful camera views, part selection, states and information designed around the decisions your audience needs to make.`},{title:`Configuration and presentation`,description:`Interactive options, environments and guided narratives that make a complex offer easier to compare, present and explain.`},{title:`Custom software integration`,description:`3D experiences connected to the data, interface and publishing workflow required by the wider product or business system.`}],processTitle:`Build for the use case and the device`,processIntro:`Visual quality, loading time and interaction depth are balanced against the devices and decisions the experience must support.`,processSteps:[{title:`Define the audience and source data`,description:`We map the user journey, product structure, available CAD or media, required states and target devices.`},{title:`Prototype the visual system`,description:`A representative model proves performance, material quality, navigation and information hierarchy before scaling production.`},{title:`Produce, integrate and publish`,description:`Assets, interactions and interfaces are completed as one system, then validated on the target device range and publishing environment.`}],proofTitle:`Interactive 3D in practice`,proofIntro:`These projects show how architectural and product information can become a navigable visual narrative instead of a static presentation.`}},hero:{title:`Custom VR, AR, Web 3D & Interactive Experiences`,subtitle:`We plan and build complete systems for complex products, operations and ideas. From immersive experiences to the softw
3are and integrations behind them.`,cta:`PLAN YOUR PROJECT`,secondaryCta:`SEE CASE STUDIES`,trustLabel:`Selected client partners`},solutions:{sectionTitle:`Custom Systems for Products, Operations and Experiences`,vrTitle:`VR Simulations and Experiences`,vrContent_part1:`Help people explore products, procedures and environments before the real moment. `,vrContent_highlight:`Explore what matters in context.`,vrContent_part2:``,arTitle:`AR and Mixed Reality`,arContent_part1:`Bring useful information to the product, equipment or space where people need it. `,arContent_highlight:`Keep guidance close to the task.`,arContent_part2:``,threedTitle:`Web 3D and Interactive Experiences`,threedContent_part1:`Make complex products, spaces and information easier to explore and explain. `,threedContent_highlight:`Give every team a shared view.`,threedContent_part2:``,cta:`SEE CASE STUDIES`},special:{title1:`It starts with a complex challenge.`,title2:`It ends with `,title3_underline:`a system ready to use`,title3_tail:`.`,description1:`You do not need every answer yet. Just the problem you want to solve.`,description2:``,cta:`PLAN YOUR PROJECT`},industries:{title1:`See Complex Work`,title2_lead:`From Every`,title2_underline:`Angle`,description:`We turn products, procedures and information into experiences people can explore before they act.`,projectCategory:`EV Cooling System Diagnostics`,projectClient:`Ford Motor Company, USA`},featured:{titlePart1:`See the Work `,titlePart2:`in Practice`,cta:`SEE THE SIMULATION`,readMore:`Read more`,readLess:`Read less`,fullCaseStudy:`VIEW CASE STUDY`,labels:{challenge:`Challenge`,outcome:`Outcome`,deployment:`Deployment`},projects:{bosch:{title:`Assembly Line VR Training`,challenge:`New technicians needed a repeatable way to learn an assembly process without relying only on production equipment.`,outcome:`A VR simulation that lets technicians practice the sequence in a controlled environment before working on the line.`,deployment:`Meta Quest · Automotive assembly training`},cidec:{title:`Pacifica Interactive Showroom`,challenge:`Sales teams needed a portable way to present the vehicle and its configurations without depending on a physical unit.`,outcome:`An immersive showroom where buyers can explore the vehicle, start the engine, and interact with its controls.`,deployment:`Meta Quest · Showroom and sales`},etas:{title:`Road to VR`,challenge:`Technicians needed a controlled way to learn EV diagnostic procedures before working with live systems.`,outcome:`A guided VR module with structured practice paths for vehicle maintenance and diagnostic onboarding.`,deployment:`Meta Quest · Pico Neo · Technician training`}}},common:{loading:`Loading`},brands:{title_part1:`Trusted by Teams Solving `,title_highlight:`Complex Challenges`,title_part2:``,subtitle:`30+ custom projects since 2017, from immersive experiences to dashboards.`,stats:{clients:`Client Partners`,builds:`Custom Builds`,industries:`Plants & Markets Served`}},form:{content:{title1:`Define the System `,title2:`Your Team Needs`,description:`Tell us what your team needs to practise, present, visualize, explain or connect. We will turn it into a defined scope and a system ready for use.`},trust:{responseDetail:`Talk directly with the team that will plan and build your system.`,freeDetail:`A defined scope, a phased plan, and a team ready when you are.`,supportDetail:`One year of support after launch included.`}},process:{title:`From an Operational Need to a System Ready to Use`,title_highlight:`Ready to Use`,description:`Bring the need, not a finished specification. We define the full scope together, build through clear checkpoints, and prepare the system for deployment.`,description_highlight:`define the full scope together, build through clear checkpoints`,steps:{define:{title:`Define`,description:`Turn the workflow, users, assets, constraints, and infrastructure into a workable project definition.`,emphasis:`workable project definition`},build:{title:`Build`,description:`Develop the 3D content, software, interfaces, integrations, and performance the experience requires.`,emphasis:`3D content, softw
3are`},validate:{title:`Validate & Deploy`,description:`Test the complete experience with your team and prepare it for release, private distribution, or on site use.`,emphasis:`release, private distribution`},support:{title:`Support & Expand`,description:`One year of support after launch is included. The system stays in service and expands with new workflows, content, and capabilities.`,emphasis:`One year of support after launch`}},scrollMedia:{clinicvet:`ClinicVET interactive canine anatomy visualization`,clinicvetMockup:`ClinicVET platform across desktop, tablet, and mobile devices`,archvizQuest:`Interactive architectural tour with Meta Quest 3 headset`,robotAssemblyInspection:`Safety equipment selection inside the robot assembly training experience`,boschTraining:`Bosch production line training in virtual reality`,meccanovr:`MeccanoVR assembly learning in VR`,archervr:`ArcherVR precision interaction demo`,archviz:`Interactive architectural visualization tour`}},calendar:{close:`Close calendar`,embedTitle:`Project planning call`,fallbackTitle:`Couldn't load the calendar`,fallbackBody:`No problem. You can book directly on our booking page.`,fallbackCta:`Open booking page`},privacy:{effectiveDate:`2026-07-28`,title:`Privacy Policy`,lastUpdated:`Last Updated: {date}`,sections:[{title:`1. Introduction & Scope`,body:[`Grayscale Interactive (âGrayscaleâ, âweâ, âusâ) builds custom immersive systems â VR training, AR, and interactive 3D â for automotive and industrial teams. This Privacy Policy explains what information we collect, why we collect it, who we share it with, and the choices you have.`,`Our business is building systems for our clients, not monetizing personal data. We do not sell your personal information, and we do not share it for cross-context behavioral advertising.`,`This policy covers grayscaleinteractive.com, our Spanish-language pages, and our booking pages at book.grayscaleinteractive.com. It does not cover third-party sites we link to.`]},{title:`2. Information We Collect`,body:[`We collect four kinds of information.`],items:[{term:`Information you give us:`,text:` When you request a consultation or contact us, we collect your name, email address, organization, role, the capability you are interested in, your use cases, any project notes you write, and your preferred language. Providing this is voluntary, but without it we cannot respond to you.`},{term:`Booking information:`,text:` If you schedule a call, our booking page records the meeting type you selected, the time slot, and the contact details you enter for that meeting.`},{term:`Technical and usage information:`,text:` Our servers and analytics record your IP address, an approximate location derived from it (country, region, and in some cases city), browser and device type, pages viewed, referring page, and how you interact with the site.`},{term:`Anti-spam signals:`,text:` Our contact form includes a hidden field and measures how long the form took to complete, so we can reject automated submissions. These signals are used only to filter spam.`}],after:[`We do not intentionally collect special categories of personal data such as health, biometric, or financial account information, and we ask that you not include them in free-text fields.`]},{title:`3. How We Use Your Information`,body:[`We use the information above to:`],items:[{text:`Respond to your enquiry, prepare a scope, and schedule and hold consultations.`},{text:`Send you a confirmation of your enquiry and follow up about your project.`},{text:`Understand how the site is used so we can improve its content, structure, and performance.`},{text:`Measure which campaigns and pages lead to enquiries, where you have consented to analytics and advertising.`},{text:`Detect and prevent spam, abuse, and security incidents.`},{text:`Meet our legal, accounting, and record-keeping obligations.`}]},{title:`4. Cookies & Similar Technologies`,body:[`We use a small number of cookies and equivalent browser storage. Strictly necessary storage â such as remembering your language and your cookie choice â is always active, because the site cannot work without it.`,`Analytics and advertising storage is denied by default. Google tags may send limited cookieless consent and measurement pings in that state, but they cannot read or write analytics or advertising cookies. If you press Accept, we grant those storage and advertising permissions; if you reject, they remain denied.`],after:[`You can change your decision at any time by clearing this siteâs data in your browser, which makes the consent banner appear again on your next visit.`]},{title:`5. Analytics & Advertising`,body:[`We use the following services with Google Consent Mode. Their storage permissions remain denied until you accept; before that choice, Google may receive limited cookieless consent and measurement pings.`],items:[{term:`Google Analytics:`,text:` tells us which pages and features are used, and how visitors reach the site. Processed in the United States. IP addresses are anonymised.`},{term:`Google Tag Manager and Google Ads:`,text:` used to measure whether an advertising campaign led to an enquiry. We use Google Consent Mode, so these tags default to denied and are granted only after you accept.`},{term:`Enhanced conversions:`,text:` when you request a booking, your email address is converted into an irreversible code (a SHA-256 hash) in your browser and only that code is sent to Google Ads, so it can tell whether an ad led to your request. Your email address itself is never sent.`}],after:[`If you decline, analytics capture stays switched off and the advertising categories remain denied.`]},{title:`6. Service Providers We Share Data With`,body:[`We do not sell your personal information. We share it only with the providers that operate parts of this service on our behalf, and only as far as each needs it:`],items:[{term:`Google Cloud and Firebase:`,text:` hosting, file storage, our contact-form backend, and the database where enquiries are stored.`},{term:`Resend:`,text:` delivers the notification email to our team and the confirmation email to you.`},{term:`Google:`,text:` analytics, tag management and advertising measurement, subject to your consent.`},{term:`freeipapi.com and ipinfo.io:`,text:` receive your IP address so we can resolve an approximate location for an enquiry. We send only the IP address, and we receive no other information about you from them.`}
3],after:[`We may also disclose information where the law requires it, or to establish or defend legal claims.`]},{title:`7. International Data Transfers`,body:[`Grayscale Interactive is based in Querétaro, Mexico, and several of the providers above process data in the United States. Your information may therefore be transferred outside your country of residence, including outside the European Economic Area and the United Kingdom.`,`Where such a transfer is subject to the GDPR, we rely on the European Commissionâs Standard Contractual Clauses or an equivalent safeguard offered by the provider.`]},{title:`8. Legal Bases for Processing`,body:[`If you are in the European Economic Area or the United Kingdom, we process your personal data on the following bases:`],items:[{term:`Consent:`,text:` for analytics and advertising, and for optional marketing messages. You may withdraw it at any time.`},{term:`Steps prior to a contract:`,text:` to respond to your enquiry and prepare a proposal at your request.`},{term:`Legitimate interests:`,text:` to secure the site, prevent spam, and understand demand for our services in a way that does not override your rights.`},{term:`Legal obligation:`,text:` where we must retain records for tax or accounting purposes.`}]},{title:`9. Your Privacy Rights`,body:[`Depending on where you live, you have some or all of the following rights:`],items:[{term:`Access:`,text:` ask what personal data we hold about you and receive a copy.`},{term:`Rectification:`,text:` ask us to correct data that is inaccurate or incomplete.`},{term:`Erasure:`,text:` ask us to delete your personal data where we have no overriding reason to keep it.`},{term:`Objection and restriction:`,text:` object to processing based on our legitimate interests, or ask us to limit how we use your data.`},{term:`Portability:`,text:` receive the data you gave us in a structured, machine-readable format.`},{term:`Withdraw consent:`,text:` turn analytics and advertising off at any time, without affecting processing already carried out.`}],after:[`If you are in Mexico, these correspond to your ARCO rights â Acceso, Rectificación, Cancelación y Oposición â under the Ley Federal de Protección de Datos Personales en Posesión de los Particulares.`,`If you are a California resident, you have the right to know, delete, and correct your personal information, and not to be discriminated against for exercising those rights. We do not sell or share personal information as the CCPA and CPRA define those terms.`,`To exercise any of these rights, email [email protected]. We will verify your request and respond within the period required by the law that applies to you. You may also complain to your local data protection authority.`]},{title:`10. Data Security`,body:[`We take reasonable and appropriate measures to protect your information:`],items:[{term:`Encryption in transit:`,text:` the site and our form endpoint are served over HTTPS.`},{term:`Managed infrastructure:`,text:` enquiries are stored in Google Cloud and Firebase, with access limited to the people at Grayscale who need it.`},{term:`Secret management:`,text:` API keys and credentials are held in a managed secret store rather than in our source code.`},{term:`Abuse prevention:`,text:` automated submissions are filtered before they reach our systems.`}],after:[`No method of transmission or storage is completely secure, so we cannot guarantee absolute security. If a breach affects your personal data and poses a risk to you, we will notify you and the relevant authority as the law requires.`]},{title:`11. Data Retention`,body:[`We keep enquiry and booking information for as long as we need it to respond to you, deliver any project that follows, and meet our legal and accounting obligations. Once it is no longer needed for those purposes, we delete or anonymize it.`,`Analytics data is retained according to the retention settings of each anal
3ytics provider. You can ask us to delete your enquiry at any time using the contact address below.`]},{title:`12. Childrenâs Privacy`,body:[`This site is intended for businesses and is not directed to children. We do not knowingly collect personal data from anyone under 18. If you believe a child has given us information, contact us and we will delete it.`]},{title:`13. Changes to This Policy`,body:[`We may update this policy as our services or the tools we use change. When we do, we will revise the date at the top of this page. If a change materially affects how we use your personal data, we will make that clear on the site.`]},{title:`14. Contact Us`,body:[`If you have questions about this policy or want to exercise your privacy rights, contact us at [email protected]. You can also write to us at Grayscale Interactive, Querétaro, Mexico.`]}]},cookies:{title:`We Value Your Privacy`,body:`We use analytics and advertising measurement to understand how this site is used and improve it. Accept, or reject and continue without tracking.`,reject:`Reject`,accept:`Accept`},footer:{description:`Custom VR training, AR, interactive 3D, and complete software systems for complex projects.`,quickLinks:`Quick Links`,solutions:`Solutions`,portfolio:`Case Studies`,blog:`Projects`,contact:`Plan Your Project`,getInTouch:`Get In Touch`,location:`Querétaro, Mexico. Serving teams across North America`,copyright:`© {year} Grayscale Interactive. All rights reserved.`,privacyPolicy:`Privacy Policy`}}})),Zn,Qn=e((()=>{Zn={seo:{landing:{title:`VR, AR y 3D Web a la Medida | Grayscale Interactive`,description:`Desarrollamos VR, AR, 3D web y experiencias interactivas a la medida para productos, operaciones y equipos en México y Estados Unidos.`},privacy:{title:`Aviso de Privacidad | Grayscale Interactive`,description:`Cómo Grayscale Interactive recopila, utiliza y protege tu información.`},blog:{title:`Casos de Capacitación VR Industrial | Grayscale Interactive`,description:`Explora casos de capacitación VR y 3D interactivo para equipos automotrices e industriales, creados alrededor de equipos y procesos reales.`},services:{vr:{title:`Capacitación VR Industrial | Grayscale Interactive`,description:`Capacitación VR y simulaciones industriales a la medida para equipos, procesos, inducción y seguridad en México y Estados Unidos.`},ar:{title:`Desarrollo de Realidad Aumentada | Grayscale`,description:`Desarrollo de realidad aumentada a la medida para productos, equipos y guÃa en campo. Sistemas AR móviles y web para empresas en México y Estados Unidos.`},threed:{title:`Desarrollo 3D Interactivo | Grayscale Interactive`,description:`Desarrollo 3D interactivo y 3D web para productos, espacios y procesos técnicos complejos, diseñado para funcionar en dispositivos modernos.`}}},nav:{solutions:`Soluciones`,portfolio:`Casos de Ãxito`,blog:`Proyectos`,contact:`Planea tu Proyecto`},theme:{lightState:`Tema claro de la página`,switchToLight:`Usar tema claro de la página`,switchToDark:`Usar tema oscuro de la página`},blog:{titleLead:`Proyectos Hechos para`,titleHighlight:`Operaciones Reales`,subtitle:`Casos de capacitación VR y 3D interactivo para procesos automotrices e industriales.`,allCategories:`Todos los Proyectos`,filterLabel:`Filtros de proyectos`,categories:{vr:`Capacitación VR`,ar:`Operaciones AR`,"3d":`3D Interactivo`,"custom-dev":`Desarrollo a la Medida`},readCaseStudy:`VER CASO DE ÃXITO`,onThisPage:`En Esta Página`,related:`Sigue Explorando`,relatedDescription:`Más formas en que los sistemas inmersivos pueden hacer más fácil entender, practicar y explicar trabajo complejo.`,ctaTitleLead:`¿Tienes un proyecto`,ctaTitleHighlight:`complejo por definir?`,ctaDescription:`Compártenos el proceso, producto o reto de capacitación. Te ayudaremos a convertirlo en una primera fase clara y viable.`,cta:`PLANEA TU PROYECTO`,noArticles:`Aún no hay proyectos para este enfoque.`,loading:`Cargando proyectos`,player:{start:`Iniciar vista previa del proyecto`,play:`Reproducir video`,pause:`Pausar video`,mute:`Silenciar video`,unmute:`Activar el sonido del video`,fullscreen:`Entrar a pantalla completa`,exitFullscreen:`Salir de pantalla completa`,progress:`Progreso del video`,unavailable:`Esta vista previa del proyecto no está disponible temporalmente.`},gallery:{label:`GalerÃa de imágenes del proyecto`,image:`Imagen`,of:`de`,previous:`Mostrar imagen anterior`,next:`Mostrar imagen siguiente`}},servicePages:{backHome:`VOLVER AL INICIO`,cta:`PLANEA TU PROYECTO`,vr:{schemaName:`Desarrollo de Capacitación VR y Simulaciones a la Medida`,audience:`Equipos industriales de capacitación, operaciones, seguridad e ingenierÃa`,titleLead:`Capacitación VR para`,titleHighlight:`Operaciones Reales`,summary:`Diseñamos y desarrollamos sistemas de capacitación VR alrededor de los equipos, procesos, decisiones y usuarios que definen tu operación.`,
3secondaryCta:`VER TRABAJO EN VR`,decisionLabel:`Primera sesión de trabajo`,decisionTitle:`Visualiza tu proceso antes de comprometer la producción`,decisionBody:`Trae un procedimiento, una brecha de capacitación o un reto de equipo. Mapearemos qué debe demostrar una prueba útil en VR y qué requiere para operar.`,decisionDetails:[{label:`Trae`,value:`Un proceso o brecha de capacitación`},{label:`Formato`,value:`Llamada de descubrimiento de 30 minutos`},{label:`Resultado`,value:`Una dirección práctica de prototipo e implementación`}],decisionCta:`AGENDA LA SESIÃN DE TRABAJO`,outcomes:[{title:`Alineación más rápida`,description:`Permite que capacitación, operaciones y equipos técnicos evalúen pronto el mismo flujo espacial.`},{title:`Conocimiento conservado`,description:`Convierte decisiones expertas y contexto de proceso en un sistema de capacitación reutilizable.`},{title:`Práctica consistente`,description:`Da a cada persona acceso a la misma secuencia, condiciones y puntos de decisión.`},{title:`Claridad de implementación`,description:`Planea dispositivos, plantas, soporte y medición como parte del sistema desde el inicio.`}],trustedLabel:`Equipos que han confiado en nosotros`,videoTitle:`Observa el trabajo en contexto`,videoIntro:`Este caso publicado de una lÃnea de producción muestra cómo tareas por rol, decisiones guiadas y contexto de equipo pueden convertirse en un flujo repetible de capacitación VR.`,videoCaption:`Vista previa de capacitación VR para lÃnea de producción Bosch`,industriesTitle:`Construido alrededor de restricciones operativas`,industriesIntro:`N
3os enfocamos en entornos donde el acceso, la seguridad, la consistencia o la disponibilidad de equipo dificultan repetir la práctica real.`,industries:[{title:`Aeroespacial`,description:`Procesos de ensamble, inspección y mantenimiento de alta precisión donde el acceso al equipo y la práctica repetible son limitados.`},{title:`Manufactura automotriz`,description:`Procesos de lÃnea, puntos de control de calidad, protocolos de seguridad e inducción basada en roles.`},{title:`Producción y ensamble`,description:`Trabajo secuenciado, uso de herramientas y verificación que dependen del conocimiento del proceso y una ejecución consistente.`},{title:`Mantenimiento industrial`,description:`Operación de equipos, procedimientos de servicio, reconocimiento de riesgos y respuesta a emergencias antes de la intervención fÃsica.`}],definitionTitle:`Una simulación construida alrededor del trabajo`,definition:`La capacitación VR convierte un proceso real en un entorno controlado donde las personas pueden aprender, practicar y demostrar decisiones antes de enfrentar la tarea fÃsica. El contenido, las interacciones y el modelo de implementación se definen desde tu operación, no desde un curs
3o genérico.`,capabilitiesTitle:`Qué puede incluir el sistema`,capabilities:[{title:`Práctica de procesos y seguridad`,description:`Secuencias guiadas, consecuencias y práctica independiente para pasos operativos difÃciles, costosos o riesgosos de reproducir bajo demanda.`},{title:`Modelos de equipos y entornos`,description:`Activos 3D e interacciones creados para representar las máquinas, herramientas, controles y espacios que tus equipos utilizan.`},{title:`Implementación y datos de aprendizaje`,description:`Un plan para visores, plantas, idiomas e integraciones, con los eventos y resultados necesarios para entender participación y avance.`}],processTitle:`Del problema operativo a un sistema utilizable`,processIntro:`Puedes comenzar con un procedimiento existente, una brecha de capacitación o una solicitud poco clara de VR. Desde ahà estructuramos la ruta técnica.`,processSteps:[{title:`Definir decisiones y restricciones`,description:`Mapeamos usuarios, tareas, equipos, lÃmites de seguridad, criterios de éxito y condiciones de implementación antes de producir.`},{title:`Prototipar la interacción crÃtica`,description:`Una primera fase enfocada valida el modelo de interacción y el flujo de capacitación cuando los cambios aún son económicos.`},{title:`Construir, validar e implementar`,description:`El sistema completo se prueba con usuarios representativos y se prepara para los dispositivos, ubicaciones y operación que necesitas.`}],proofTitle:`Capacitación VR en práctica`,proofIntro:`Estos proyectos muestran cómo la inducción por roles y los procesos de mantenimiento pueden convertirse en sistemas de capacitación estructurados e interactivos.`,faqTitle:`Lo que los equipos preguntan antes de comenzar`,faqIntro:`La VR solo es útil cuando el modelo operativo es claro. Estas son las preguntas que resolvemos antes de iniciar producción.`,faqs:[{question:`Nunca hemos creado capacitación VR. ¿Es difÃcil implementarla?`,answer:`Se vuelve manejable cuando la primera fase es acotada. Comenzamos con una audiencia, un flujo crÃtico y criterios de éxito explÃcitos; después validamos la interacción y los supuestos de implementación antes de ampliar el contenido.`},{question:`¿Cuánto tiempo toma desarrollar un simulador?`,answer:`El calendario depende del procedimiento, los activos fuente, la profundidad de interacción, los dispositivos objetivo y el proceso de aprobación. Iniciamos con un prototipo acotado para evaluar las partes difÃciles antes de comprometer el alcance completo.`},{question:`¿Qué pasa si nuestro proceso cambia después de construir el simulador?`,answer:`Identificamos los puntos probables de cambio durante el descubrimiento y separamos, cuando es práctico, el contenido del procedimiento del comportamiento compartido del sistema. El plan de mantenimiento define qué puede actualizar tu equipo y cómo se validan las versiones.`},{question:`¿Cómo sabemos que funcionará para nuestro equipo?`,answer:`Usuarios representativos prueban el flujo crÃtico contra criterios acordados. Observamos comprensión, problemas de interacción, comodidad fÃsica y ajuste operativo, y corregimos el prototipo antes de escalar el contenido.`},{question:`¿En qué hardware VR debe funcionar el simulador?`,answer:`El hardware parte del caso de uso. La precisión de rastreo, el detalle visual, la movilidad, las polÃticas de TI, la higiene, el soporte y el espacio fÃsico influyen en la decisión. Evaluamos esas restricciones antes de fijar el dispositivo.`},{question:`¿Necesitamos un espacio dedicado o un especialista para operarlo?`,answer:`No siempre. Algunos programas usan una estación administrada a escala de habitación; otros usan kits portátiles o experiencias sentadas. Definimos espacio, reinicio, supervisión, carga, limpieza y soporte como parte de la implementación.`}]},ar:{schemaName:`Desarrollo de Realidad Aumentada a la Medida`,audience:`Equipos industriales de operaciones, producto, marketing y servicio en campo`,titleLead:`Realidad Aumentada para`,titleHighlight:`Contexto Ãtil`,summary:`Desarrollamos experiencias móviles, web y de realidad mixta que colocan información, guÃa y contenido interactivo donde las personas lo necesitan.`,definitionTitle:`Información digital conectada con la tarea fÃsica`,definition:`La realidad aumentada puede ayudar a un comprador a entender un producto a escala, guiar a un operador con información del equipo o conectar un espacio fÃsico con una capa interactiva. Elegimos el dispositivo y el enfoque de rastreo a partir del trabajo que debe resolverse, no de la etiqueta tecnológica.`,capabilitiesTitle:`Qué puede incluir el sistema`,capabilities:[{title:`AR móvil y Web AR`,description:`Experiencias basadas en cámara que abren desde un teléfono o navegador, con interacciones diseña
3das para las condiciones reales de uso.`},{title:`Comunicación espacial de productos`,description:`Productos, configuraciones e información técnica a escala real dentro del entorno del cliente u operador para tomar decisiones más claras.`},{title:`Contenido y procesos conectados`,description:`Interfaces e integraciones que mantienen la capa AR alineada con tu catálogo, campaña, contenido de capacitación o sistema operativo.`}],processTitle:`Elegir la ruta AR más simple y confiable`,processIntro:`La experiencia correcta depende del entorno, la audiencia, los dispositivos disponibles y la precisión que exige la tarea.`,processSteps:[{title:`Definir el momento de uso`,description:`Identificamos dónde abre la experiencia, qué debe entender o hacer el usuario y qué condiciones fÃsicas afectan el rastreo y la usabilidad.`},{title:`Validar rastreo e interacción`,description:`Un prototipo valida cámara, objetivo, escala e interacción en dispositivos representativos antes de construir todo el contenido.`},{title:`Conectar contenido y publicar`,description:`Desarrollamos la experiencia final, integramos las fuentes de contenido necesarias y preparamos una implementación que tu equipo pueda operar.`}],proofTitle:`Sistemas interactivos relacionados`,proofIntro:`Nuestra biblioteca pública todavÃa no incluye un caso dedicado de AR. Estos proyectos relacionados muestran cómo estructuramos contenido conectado, información 3D e interacción útil alrededor de una audiencia real.`},threed:{schemaName:`Desarrollo 3D Interactivo y 3D Web a la Medida`,audience:`Equipos de producto, ingenierÃa, ventas, capacitación y marketing`,titleLead:`3D Interactivo para`,titleHighlight:`Productos Complejos`,summary:`Convertimos productos, espacios e información técnica en sistemas 3D interactivos que las personas pueden explorar y entender en dispositivos modernos.`,definitionTitle:`Una vista compartida de información compleja`,definition:`El 3D interactivo permite que clientes, operadores y equipos internos inspeccionen directamente un producto o entorno en lugar de interpretarlo desde imágenes y documentos separados. La experiencia puede funcionar en un navegador o como parte de una aplicación a la medida.`,capabilitiesTitle:`Qué puede incluir el sistema`,capabilities:[{title:`Exploración de productos en 3D web`,description:`Modelos en navegador con cámaras, selección de partes, estados e información diseñados alrededor de las decisiones de tu audiencia.`},{title:`Configuración y presentación`,description:`Opciones interactivas, entornos y narrativas guiadas que hacen una oferta compleja más fácil de comparar, presentar y explicar.`},{title:`Integración con software a la medida`,description:`Experiencias 3D conectadas con los datos, la interfaz y el flujo de publicación que requiere el sistema de producto o negocio.`}],processTitle:`Construir para el caso de uso y el dispositivo`,processIntro:`La calidad visual, el tiempo de carga y la profundidad de interacción se equilibran según los dispositivos y decisiones que la experiencia debe soportar.`,processSteps:[{title:`Definir la audiencia y los datos fuente`,description:`Mapeamos el recorrido del usuario, la estructura del producto, el CAD o medios disponibles, los estados requeridos y los dispositivos objetivo.`},{title:`Prototipar el sistema visual`,description:`Un modelo representativo valida desempeño, materiales, navegación y jerarquÃa de información antes de escalar la producción.`},{title:`Producir, integrar y publicar`,description:`Activos, interacciones e interfaces se completan como un solo sistema y se validan en los dispositivos y entornos de publicación objetivo.`}],proofTitle:`3D interactivo en práctica`,proofIntro:`Estos proyectos muestran cómo la información arquitectónica y de producto puede convertirse en una narrativa visual navegable en lugar de una presentación estática.`}},hero:{title:`VR, AR, 3D Web y Experiencias Interactivas a la Medida`,subtitle:`Planeamos y desarrollamos sistemas completos para productos, operaciones e ideas complejas. Desde experiencias inmersivas hasta el software y las integraciones que las hacen funcionar.`,cta:`PLANEA TU PROYECTO`,secondaryCta:`VER CASOS DE ÃXITO`,trustLabel:`Algunos de nuestros clientes`},solutions:{sectionTitle:`Sistemas a la Medida para Productos, Operaciones y Experiencias`,vrTitle:`Simulaciones y Experiencias VR`,vrContent_part1:`Ayuda a las personas a explorar productos, procedimientos y entornos antes del momento real. `,vrContent_highlight:`Explora lo importante en contexto.`,vrContent_part2:``,arTitle:`AR y Realidad Mixta`,arContent_part1:`Lleva información útil al producto, equipo o espacio donde las personas la necesitan. `,arContent_highlight:`Mantén la guÃa cerca de la tarea.`,arContent_part2:``,threedTitle:`3D Web y Experiencias Interactivas`,threedContent_part1:`Haz que productos, espacios e información compleja sean más fáciles de explorar y explicar. `,threedContent_highlight:`Dale a cada equipo una vista compartida.`,threedContent_part2:``,cta:`VER CASOS DE ÃXITO`},special:{title1:`Empieza con un reto complejo.`,title2:`Termina con `,title3_underline:`un sistema listo para usarse`,title3_tail:`.`,description1:`TodavÃa no necesitas todas las respuestas. Solo el problema que quieres resolver.`,description2:``,cta:`PLANEA TU PROYECTO`},industries:{title1:`Conoce el Trabajo Complejo`,title2_lead:`Desde Cada`,title2_underline:`Ãngulo`,description:`Convert
3imos productos, procedimientos e información en experiencias que las personas pueden explorar antes de actuar.`,projectCategory:`Diagnóstico de Sistemas de Enfriamiento EV`,projectClient:`Ford Motor Company · EE. UU.`},featured:{titlePart1:`Conoce el Trabajo `,titlePart2:`en la Práctica`,cta:`VER LA SIMULACIÃN`,readMore:`Ver más`,readLess:`Ver menos`,fullCaseStudy:`VER CASO DE ÃXITO`,labels:{challenge:`Reto`,outcome:`Resultado`,deployment:`Despliegue`},projects:{bosch:{title:`Capacitación VR para LÃnea de Ensamble`,challenge:`El personal nuevo necesitaba una forma repetible de aprender el proceso de ensamble sin depender únicamente del equipo de producción.`,outcome:`Una simulación VR donde los técnicos practican la secuencia en un entorno controlado antes de trabajar en la lÃnea.`,deployment:`Meta Quest · Capacitación de ensamble automotriz`},cidec:{title:`Showroom Interactivo Pacifica`,challenge:`El equipo de ventas necesitaba una forma portátil de presentar el vehÃculo y sus configuraciones sin depender de una unidad fÃsica.`,outcome:`Un showroom inmersivo donde los compradores pueden explorar el vehÃculo, encenderlo e interactuar con sus controles.`,deployment:`Meta Quest · Showroom y ventas`},etas:{title:`Road to VR`,challenge:`Los técnicos necesitaban aprender procedimientos de diagnóstico EV en un entorno controlado antes de trabajar con sistemas reales.`,outcome:`Un módulo VR guiado con rutas de práctica estructuradas para mantenimiento e incorporación de técnicos.`,deployment:`Meta Quest · Pico Neo · Capacitación técnica`}}},common:{loading:`Cargando`},brands:{title_part1:`La Confianza de Equipos que Resuelven `,title_highlight:`Retos Complejos`,title_part2:``,subtitle:`Más de 30 proyectos a la medida desde 2017, desde experiencias inmersivas hasta dashboards.`,stats:{clients:`Clientes`,builds:`A la Medida`,industries:`Plantas y Mercados`}},form:{content:{title1:`Definamos el Sistema `,title2:`que Necesita tu Equipo`,description:`Cuéntanos qué necesita practicar, presentar, visualizar, explicar o conectar tu equipo. Lo convertiremos en un alcance definido y un sistema listo para usarse.`},trust:{responseDetail:`Habla directamente con el equipo que planeará y construirá tu sistema.`,freeDetail:`Alcance definido, plan por fases y un equipo listo cuando tú lo estés.`,supp
3ortDetail:`Incluye un año de soporte después del lanzamiento.`}},process:{title:`De una Necesidad Operativa a un Sistema Listo para Usarse`,title_highlight:`Listo para Usarse`,description:`Trae la necesidad, no una especificación terminada. Definimos juntos el alcance completo, construimos el sistema mediante avances claros y lo preparamos para su implementación.`,description_highlight:`Definimos juntos el alcance completo, construimos el sistema mediante avances claros`,steps:{define:{title:`Definimos`,description:`Convertimos el proceso, usuarios, recursos, restricciones e infraestructura en una definición de proyecto viable.`,emphasis:`definición de proyecto viable`},build:{title:`Construimos`,description:`Desarrollamos el contenido 3D, software, interfaces, integraciones y rendimiento que requiere la experiencia.`,emphasis:`contenido 3D, software`},validate:{title:`Validamos e Implementamos`,description:`Probamos la experiencia completa con tu equipo y la preparamos para lanzamiento, distribución privada o uso en sitio.`,emphasis:`lanzamiento, distribución privada`},support:{title:`Acompañamos y Ampliamos`,description:`Incluye un año de soporte después del lanzamiento. El sistema se mantiene en operación y se amplÃa con nuevos procesos, contenido y capacidades.`,emphasis:`un año de soporte después del lanzamiento`}},scrollMedia:{clinicvet:`Visualización interactiva de anatomÃa canina ClinicVET`,clinicvetMockup:`Plataforma ClinicVET en dispositivos de escritorio, tableta y móvil`,archvizQuest:`Recorrido arquitectónico interactivo con visor Meta Quest 3`,robotAssemblyInspection:`Selección de equipo de seguridad dentro de la experiencia de capacitación de ensamble de robot`,boschTraining:`Capacitación de lÃnea de producción Bosch en realidad virtual`,meccanovr:`Aprendizaje de ensamble MeccanoVR en VR`,archervr:`Demo de interacción de precisión ArcherVR`,archviz:`Recorrido interactivo de visualización arquitectónica`}},calendar:{close:`Cerrar calendario`,embedTitle:`Llamada para planear tu proyecto`,fallbackTitle:`No se pudo cargar el calendario`,fallbackBody:`No hay problema. Puedes agendar directamente en nuestra página de reservas.`,fallbackCta:`Abrir página de reservas`},privacy:{effectiveDate:`2026-07-28`,title:`Aviso de Privacidad`,lastUpdated:`Ãltima actualización: {date}`,sections:[{title:`1. Introducción y Alcance`,body:[`Grayscale Interactive (âGrayscaleâ, ânosotrosâ) desarrolla sistemas inmersivos a la medida â capacitación en RV, RA y 3D interactivo â para equipos de los sectores automotriz e industrial. Este Aviso de Privacidad explica qué información recopilamos, por qué la recopilamos, con quién la compartimos y qué opciones tienes.`,`Nuestro negocio es construir sistemas para nuestros clientes, no monetizar datos personales. No vendemos tu información personal ni la compartimos para publicidad conductual entre contextos.`,`Este aviso cubre grayscaleinteractive.com, nuestras páginas en español y nuestras páginas de agendado en book.grayscaleinteractive.com. No cubre sitios de terceros a los que enlazamos.`]},{title:`2. Información que Recopilamos`,body:[`Recopilamos cuatro tipos de información.`],items:[{term:`Información que nos proporcionas:`,text:` Cuando solicitas una consulta o nos contactas, recopilamos tu nombre, correo electrónico, organización, puesto, la capacidad que te interesa, tus casos de uso, las notas de proyecto que escribas y tu idioma preferido. Proporcionarla es voluntario, pero sin ella no podemos responderte.`},{term:`Información de agendado:`,text:` Si agendas una llamada, nuestra página de agendado registra el tipo de reunión que seleccionaste, el horario y los datos de contacto que ingreses para esa reunión.`},{term:`Información técnica y de uso:`,text:` Nuestros servidores y herramientas de analÃtica registran tu dirección IP, una ubicación aproximada derivada de ella (paÃs, región y en algunos casos ciudad), tipo de navegador y dispositivo, páginas vistas, página de referencia y cómo interactúas con el sitio.`},{term:`Señales antispam:`,text:` Nuestro formulario incluye un campo oculto y mide cuánto tiempo tomó completarlo, para rechazar envÃos automatizados. Estas señales se usan únicamente para filtrar spam.`}],after:[`No recopilamos intencionalmente datos personales sensibles como información de salud, biométrica o financiera, y te pedimos no incluirlos en los campos de texto libre.`]},{title:`3. Cómo Usamos tu Información`,body:[`Usamos la información anterior para:`],items:[{text:`Responder tu solicitud, preparar un alcance y agendar y sostener consultas.`},{text:`Enviarte una confirmación de tu solicitud y dar seguimiento a tu proyecto.`}
3,{text:`Entender cómo se usa el sitio para mejorar su contenido, estructura y rendimiento.`},{text:`Medir qué campañas y páginas generan solicitudes, cuando has aceptado analÃtica y publicidad.`},{text:`Detectar y prevenir spam, abuso e incidentes de seguridad.`},{text:`Cumplir nuestras obligaciones legales, contables y de conservación de registros.`}]},{title:`4. Cookies y TecnologÃas Similares`,body:[`Usamos un número reducido de cookies y almacenamiento equivalente en el navegador. El almacenamiento estrictamente necesario â como recordar tu idioma y tu decisión sobre cookies â siempre está activo, porque el sitio no puede funcionar sin él.`,`El almacenamiento de analÃtica y publicidad está denegado de forma predeterminada. En ese estado, las etiquetas de Google pueden enviar señales limitadas y sin cookies sobre consentimiento y medición, pero no pueden leer ni escribir cookies de analÃtica o publicidad. Si presionas Aceptar, otorgamos esos permisos; si rechazas, permanecen denegados.`],after:[`Puedes cambiar tu decisión en cualquier momento borrando los datos de este sitio en tu navegador, lo que hará que el aviso de cookies aparezca de nuevo en tu siguiente visita.`]},{title:`5. AnalÃtica y Publicidad`,body:[`Usamos los siguientes servicios con el Modo de Consentimiento de Google. Sus permisos de almacenamiento permanecen denegados hasta que aceptas; antes de esa decisión, Google puede recibir señales limitadas de consentimiento y medición sin cookies.`],items:[{term:`Google Analytics:`,text:` nos indica qué páginas y funciones se utilizan, y cómo llegan las personas al sitio. Procesado en Estados Unidos. Las direcciones IP se anonimizan.`},{term:`Google Tag Manager y Google Ads:`,text:` se usan para medir si una campaña publicitaria generó una solicitud. Utilizamos el Modo de Consentimiento de Google, por lo que estas etiquetas están denegadas de forma predeterminada y solo se otorgan tras tu aceptación.`},{term:`Conversiones mejoradas:`,text:` cuando solicitas una cita, tu correo electrónico se convierte en un código irreversible (un hash SHA-256) dentro de tu navegador y solo ese código se envÃa a Google Ads, para saber si un anuncio originó tu solicitud. Tu correo electrónico nunca se envÃa.`}],after:[`Si rechazas, la captura de analÃtica permanece desactivada y las categorÃas de publicidad siguen denegadas.`]},{title:`6. Proveedores con los que Compartimos Datos`,body:[`No vendemos tu información personal. La compartimos únicamente con los proveedores que operan partes de este servicio por nuestra cuenta, y solo en la medida en que cada uno lo necesita:`],items:[{term:`Google Cloud y Firebase:`,text:` hospedaje, almacenamiento de archivos, el backend de nuestro formulario y la base de datos donde se guardan las solicitudes.`},{term:`Resend:`,text:` entrega el correo de notificación a nuestro equipo y el correo de confirmación que recibes.`},{term:`Google:`,text:` analÃtica, gestión de etiquetas y medición publicitaria, sujeta a tu consentimiento.`},{term:`freeipapi.com e ipinfo.io:`,text:` reciben tu dirección IP para poder resolver una ubicación aproximada de la solicitud. Solo enviamos la dirección IP y no recibimos ninguna otra información tuya de su parte.`}],after:[`También podemos divulgar información cuando la ley lo exija, o para ejercer o defender reclamaciones legales.`]},{title:`7. Transferencias Internacionales de Datos`,body:[`Grayscale Interactive tiene su base en Querétaro, México, y varios de los proveedores anteriores procesan datos en Estados Unidos. Por lo tanto, tu información puede transferirse fuera de tu paÃs de residencia, incluso fuera del Espacio Económico Europeo y del Reino Unido.`,`Cuando dicha transferencia está sujeta al GDPR, nos apoyamos en las Cláusulas Contractuales Tipo de la Comisión Europea o en una salvaguarda equivalente ofrecida por el proveedor.`]},{title:`8. Bases Legales del Tratamiento`,body:[`Si te encuentras en el Espacio Económico Europeo o el Reino Unido, tratamos tus datos personales con base en:`],items:[{term:`Consentimiento:`,text:` para analÃtica y publicidad, y para comunicaciones de marketing opcionales. Puedes retirarlo en cualquier momento.`},{term:`Medidas precontractuales:`,text:` para responder tu solicitud y preparar una propuesta a petición tuya.`},{term:`Intereses legÃtimos:`,text:` para asegurar el sitio, prevenir spam y entender la demanda de nuestros servicios sin que ello prevalezca sobre tus derechos.`},{term:`Obligación legal:`,text:` cuando debemos conservar registros con fines fiscales o contables.`}]},{title:`9. Tus Derechos de Privacidad`,body:[`Según dónde residas, cuentas con algunos o todos los siguientes derechos:`],items:[{term:`Acceso:`,text:` solicitar qué datos personales tenemos sobre ti y recibir una copia.`},{term:`Rectificación:`,text:` pedirnos corregir datos inexactos o incompletos.`},{term:`Cancelación o supresión:`,text:` pedirnos eliminar tus datos personales cuando no exista una razón superior para conservarlos.`},{term:`Oposición y limitación:`,text:` oponerte al tratamiento basado en intereses legÃtimos, o pedirnos limitar el uso de tus datos.`},{term:`Portabilidad:`,text:` recibir los datos que nos diste en un formato estructurado y legible por máquina.`},{term:`Retirar el consentimiento:`,text:` desactivar la analÃtica y la publicidad en cualquier momento, sin afectar el tratamiento ya realizado.`}],after:[`En México, estos corresponden a tus derechos ARCO â Acce
3so, Rectificación, Cancelación y Oposición â conforme a la Ley Federal de Protección de Datos Personales en Posesión de los Particulares.`,`Si resides en California, tienes derecho a conocer, eliminar y corregir tu información personal, y a no ser discriminado por ejercer esos derechos. No vendemos ni compartimos información personal en los términos que definen la CCPA y la CPRA.`,`Para ejercer cualquiera de estos derechos, escribe a [email protected]. Verificaremos tu solicitud y responderemos dentro del plazo que exija la ley aplicable. También puedes presentar una queja ante la autoridad de protección de datos que te corresponda.`]},{title:`10. Seguridad de los Datos`,body:[`Tomamos medidas razonables y apropiadas para proteger tu información:`],items:[{term:`Cifrado en tránsito:`,text:` el sitio y el endpoint de nuestro formulario se sirven mediante HTTPS.`},{term:`Infraestructura administrada:`,text:` las solicitudes se almacenan en Google Cloud y Firebase, con acceso limitado al personal de Grayscale que lo necesita.`},{term:`Gestión de secretos:`,text:` las claves de API y credenciales se guardan en un almacén de secretos administrado y no en nuestro código fuente.`},{term:`Prevención de abuso:`,text:` los envÃos automatizados se filtran antes de llegar a nuestros sistemas.`}],after:[`Ningún método de transmisión o almacenamiento es completamente seguro, por lo que no podemos garantizar seguridad absoluta. Si una vulneración afecta tus datos personales y representa un riesgo para ti, te notificaremos a ti y a la autoridad correspondiente conforme lo exija la ley.`]},{title:`11. Conservación de Datos`,body:[`Conservamos la información de solicitudes y agendado durante el tiempo necesario para responderte, entregar el proyecto que resulte y cumplir nuestras obligaciones legales y contables. Cuando deja de ser necesaria para esos fines, la eliminamos o la anonimizamos.`,`Los datos de analÃtica se conservan según la configuración de retención de cada proveedor. Puedes pedirnos eliminar tu solicitud en cualquier momento usando la dirección de contacto que aparece abajo.`]},{title:`12. Privacidad de Menores`,body:[`Este sitio está dirigido a empresas y no a menores de edad. No recopilamos deliberadamente datos personales de personas menores de 18 años. Si crees que un menor nos ha proporcionado información, contáctanos y la eliminaremos.`]},{title:`13. Cambios a este Aviso`,body:[`Podemos actualizar este aviso conforme cambien nuestros servicios o las herramientas que utilizamos. Cuando lo hagamos, actualizaremos la fecha al inicio de esta página. Si un cambio afecta de forma sustancial el uso de tus datos personales, lo indicaremos claramente en el sitio.`]},{title:`14. Contáctanos`,body:[`Si tienes preguntas sobre este aviso o deseas ejercer tus derechos de privacidad, escrÃbenos a [email protected]. También puedes contactarnos en Grayscale Interactive, Querétaro, México.`]}]},cookies:{title:`Valoramos tu privacidad`,body:`Usamos analÃtica y medición publicitaria para entender cómo se utiliza este sitio y mejorarlo. Acepta, o recházalas y continúa sin seguimiento.`,reject:`Rechazar`,accept:`Aceptar`},footer:{description:`Capacitación VR, AR, 3D interactivo y sistemas completos de softw
3are para proyectos complejos.`,quickLinks:`Links Ãtiles`,solutions:`Soluciones`,portfolio:`Casos de Ãxito`,blog:`Proyectos`,contact:`Planea tu Proyecto`,getInTouch:`Contáctanos`,location:`Querétaro, México. Proyectos en México y Estados Unidos`,copyright:`© {year} Grayscale Interactive. Todos los derechos reservados.`,privacyPolicy:`Aviso de Privacidad`}}}));function $n(e){try{return window.localStorage?.getItem(e)??null}catch{return null}}function er(e,t){try{window.localStorage?.setItem(e,t)}catch{}}var tr=e((()=>{}));function nr(e){return e===`/es`||e.startsWith(`/es/`)?`es`:`en`}function rr(e,t){if(nr(e)===t)return e;if(t===`es`)return e===`/projects`||e.startsWith(`/projects/`)?e.replace(/^\/projects/,`/es/proyectos`):e===`/services/vr-training`?`/es/servicios/capacitacion-vr`:e===`/services/ar-development`?`/es/servicios/realidad-aumentada`:e===`/services/interactive-3d`?`/es/servicios/3d-interactivo`:e===`/`?`/es`:`/es${e}`;if(e===`/es/proyectos`||e.startsWith(`/es/proyectos/`))return e.replace(/^\/es\/proyectos/,`/projects`);if(e===`/es/servicios/capacitacion-vr`)return`/services/vr-training`;if(e===`/es/servicios/realidad-aumentada`)return`/services/ar-development`;if(e===`/es/servicios/3d-interactivo`)return`/services/interactive-3d`;let n=e.replace(/^\/es/,``);return n===``?`/`:n}function ir({children:e}){let t=E(),{navigateWithTransition:n}=Wn(),r=nr(t.pathname),i=e=>{e!==`en`&&e!==`es`||(er(ur,e),e!==r&&n({pathname:rr(t.pathname,e),search:t.search,hash:t.hash},{scroll:`preserve`}))},a=()=>i(r===`en`?`es`:`en`),o=(0,or.useMemo)(()=>e=>{let t=e.split(`.`),n=lr[r];for(let r of t)if(n&&typeof n==`object`&&r in n)n=n[r];else{let n=lr.en;for(let r of t)if(n&&typeof n==`object`&&r in n)n=n[r];else return e;return n}return n},[r]);return(0,sr.jsx)(cr.Provider,{value:{language:r,setLanguage:i,toggleLanguage:a,t:o},children:e})}function ar(){return(0,or.useContext)(cr)}var or,sr,cr,lr,ur,dr=e((()=>{or=t(i(),1),zn(),Jn(),Xn(),Qn(),tr(),sr=c(),cr=(0,or.createContext)(),lr={en:Yn,es:Zn},ur=`grayscale-preferred-lang`}));function fr(e=`base`){return pr[e]??e}var pr,mr=e((()=>{pr={xs:`text-sm leading-none`,sm:`text-base leading-none`,base:`text-xl leading-none`,lg:`text-xl leading-none`,xl:`text-2xl leading-none`,"2xl":`text-3xl leading-none`}}));function hr({icon:e,size:t=`base`,className:n=``,...r}){return e?(0,gr.jsx)(`span`,{"aria-hidden":`true`,className:`material-symbols-outlined inline-flex select-none items-center justify-center ${fr(t)} ${n}`.trim(),...r,children:e}):null}var gr,_r=e((()=>{mr(),gr=c()})),V,vr,yr,br,xr,Sr,Cr,wr,Tr,Er,Dr,Or,kr,Ar,jr,Mr,Nr,Pr,Fr,Ir,Lr=e((()=>{V=e=>String.fromCharCode(e),vr=V(58820),yr=V(58824),V(63694),br=V(61920),V(58834),xr=V(58826),V(57689),V(57699),Sr=V(57396),Cr=V(57399),wr=V(57423),Tr=V(57424),Er=V(58832),Dr=V(58833),V(61651),V(58829),Or=V(62661),kr=V(61385),Ar=V(63487),V(59374),V(60007),V(59645),V(59404),jr=V(63693),Mr=V(63264),V(58835),V(61398),Nr=V(61459),Pr=V(60363),V(63694),Fr=V(58648),Ir=V(58652),V(58386)}));function Rr({variant:e=`primary`,size:t=`default`,id:n,icon:r=Or,iconPosition:i=`right`,hasIcon:a=!1,iconGapSpacing:c=`gap-4`,width:l=`w-auto`,buttonText:u=`Button Text`,type:d=`button`,onClick:f=()=>{},iconClassName:p=``,className:m=``}){let h=(0,zr.useRef)(null),g=(0,zr.useRef)(null),_=e===`primary`,v=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,y=_&&!v;(0,zr.useEffect)(()=>{!y||!g.current||s.set(g.current,{yPercent:100})},[y]);let b=e=>{if(!y)return;let t=h.current,n=g.current;if(!t||!n)return;let r=t.getBoundingClientRect(),i=e.clientY<r.top+r.height/2;s.killTweensOf(n),s.fromTo(n,{yPercent:i?-100:100},{yPercent:0,duration:.55,ease:o.expressive})},x=e=>{if(!y)return;let t=h.current,n=g.current;if(!t||!n)return;let r=t.getBoundingClientRect(),i=e.clientY<r.top+r.height/2;s.killTweensOf(n),s.to(n,{yPercent:i?-100:100,duration:.5,ease:o.expressive})},S=`flex-row`;i===`right`&&(S=`flex-row-reverse`);let ee={default:`h-[54px] px-10 text-sm`,sm:`h-10 px-5 text-sm`},C=`relative overflow-hidden flex rounded-full justify-center items-center transition-colors duration-300 ease-in-out font-bold tracking-[0.1em] uppercase whitespace-nowrap flex-nowrap shrink-0 ${ee[t]??ee.default}`,te={primary:y?`bg-grayscale-accent-blue-500 active:bg-grayscale-accent-blue-700 text-grayscale-pure-white`:`bg-grayscale-accent-blue-500 hover:bg-grayscale-accent-blue-300 active:bg-grayscale-accent-blue-700 text-grayscale-pure-white`,secondary:`bg-grayscale-pure-white hover:bg-grayscale-gray-200 active:bg-grayscale-pure-white text-grayscale-ink-black`,tertiary:`bg-grayscale-accent-mint-500 hover:bg-grayscale-accent-mint-700 active:bg-grayscale-accent-mint-300 text-grayscale-ink-black`,glass:`bg-grayscale-pure-white/5 hover:bg-grayscale-pure-white/15 active:bg-grayscale-pure-white/10 border border-grayscale-pure-white/10 hover:border-grayscale-pure-white/30 text-grayscale-lavender-mist hover:text-grayscale-pure-white`};return(0,H.jsx)(`div`,{className:`${l}`,children:(0,H.jsxs)(`button`,{ref:h,id:n,type:d,onClick:f,onMouseEnter:b,onMouseLeave:x,className:`${C} ${te[e]} ${S} ${c} ${l} ${m}`,children:[y&&(0,H.jsx)(`span`,{ref:g,"aria-hidden":`true`,className:`pointer-events-none absolute block rounded-[50%] bg-grayscale-accent-blue-300 will-change-transform`,style:{width:`140%`,height:`220%`,left:`-20%`,top:`-60%`}}),(0,H.jsxs)(`span`,{className:`relative z-[1] flex items-center ${S} ${c}`,children:[a&&(0,H.jsx)(`span`,{className:`flex shrink-0 ${{primary:`text-grayscale-pure-white`,secondary:`text-grayscale-ink-black`,tertiary:`text-grayscale-ink-black`,glass:`text-grayscale-lavender-mist hover:text-grayscale-pure-white`}[e]}`,children:zr.isValidElement(r)?r:(0,H.jsx)(hr,{icon:r,className:p})}),(0,H.jsx)(`span`,{className:`leading-none`,children:u})]})]})})}var zr,H,Br=e((()=>{zr=t(i(),1),r(),Lr(),_r(),H=c()}));function Vr(e,t={}){typeof window>`u`||window.gtag?.(`event`,e,t)}function Hr(e=1e3){return new Promise(t=>{if(typeof window>`u`||!window.gtag){t(void 0);return}let n=setTimeout(()=>t(void 0),e);try{window.gtag(`get`,Ur,`client_id`,e=>{clearTimeout(n),t(typeof e==`string`&&e?e:void 0)})}catch{clearTimeout(n),t(void 0)}})}var Ur,Wr=e((()=>{Ur=`G-VH5ZN7PF41`}));
3function Gr(e){return e===`es`?`/es/proyectos`:`/projects`}function Kr(e,t){return`${Gr(e)}/${t}`}function qr(e,t){return new Intl.DateTimeFormat(t===`es`?`es-MX`:`en-US`,{month:`long`,day:`numeric`,year:`numeric`}).format(new Date(`${e}T12:00:00Z`))}function Jr(e,t){return`section-${t}-${e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/(^-|-$)/g,``)}`}var Yr=e((()=>{}));function U({rel:e,hreflang:t,href:n}){let r=t?`link[rel="${e}"][hreflang="${t}"]`:`link[rel="${e}"]`,i=document.head.querySelector(r);i||(i=document.createElement(`link`),i.setAttribute(`rel`,e),t&&i.setAttribute(`hreflang`,t),document.head.appendChild(i)),i.setAttribute(`href`,n)}function W(e,t){let n=document.head.querySelector(`meta[name="${e}"]`);n||(n=document.createElement(`meta`),n.setAttribute(`name`,e),document.head.appendChild(n)),n.setAttribute(`content`,t)}function Xr(e,t){let n=document.head.querySelector(`meta[http-equiv="${e}"]`);n||(n=document.createElement(`meta`),n.setAttribute(`http-equiv`,e),document.head.appendChild(n)),n.setAttribute(`content`,t)}function G(e,t){let n=document.head.querySelector(`meta[property="${e}"]`);n||(n=document.createElement(`meta`),n.setAttribute(`property`,e),document.head.appendChild(n)),n.setAttribute(`content`,t)}function Zr(e,t){if(t){G(e,t);return}document.head.querySelector(`meta[property="${e}"]`)?.remove()}function Qr({enPath:e,esPath:t,seoKey:n,title:r,description:i,ogImage:a,ogImageAlt:o,ogImageWidth:s=1200,ogImageHeight:c=630,ogType:l=`website`,publishedTime:u,modifiedTime:d}){let{language:f,t:p}=ar(),m=E();(0,$r.useEffect)(()=>{let h=r??p(`seo.${n}.title`),g=i??p(`seo.${n}.description`),_=a?a.startsWith(`http`)?a:`${K}${a}`:ei,v=o??(f===`es`?`Grayscale Interactive: capacitación VR y desarrollo 3D interactivo`:`Grayscale Interactive custom VR training and interactive 3D development`);document.title=h,document.documentElement.setAttribute(`lang`,f===`es`?`es-MX`:`en`),W(`description`,g),W(`robots`,`index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1`),W(`googlebot`,`index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1`),Xr(`content-language`,f===`es`?`es-MX`:`en-US`);let y=`${K}${m.pathname}`;G(`og:title`,h),G(`og:description`,g),G(`og:url`,y),G(`og:type`,l),G(`og:site_name`,`Grayscale Interactive`),G(`og:locale`,f===`es`?`es_MX`:`en_US`),G(`og:locale:alternate`,f===`es`?`en_US`:`es_MX`),W(`twitter:card`,`summary_large_image`),W(`twitter:title`,h),W(`twitter:description`,g),W(`twitter:url`,y),Zr(`article:published_time`,u),Zr(`article:modified_time`,d),G(`og:image`,_),G(`og:image:width`,String(s)),G(`og:image:height`,String(c)),G(`og:image:alt`,v),W(`twitter:image`,_),W(`twitter:image:alt`,v),U({rel:`canonical`,href:y}),U({rel:`alternate`,hreflang:`en`,href:`${K}${e}`}),U({rel:`alternate`,hreflang:`en-US`,href:`${K}${e}`}),U({rel:`alternate`,hreflang:`es`,href:`${K}${t}`}),U({rel:`alternate`,hreflang:`es-MX`,href:`${K}${t}`}),U({rel:`alternate`,hreflang:`x-default`,href:`${K}${e}`})},[f,p,m.pathname,e,t,n,r,i,a,o,s,c,l,u,d])}var $r,K,ei,ti=e((()=>{$r=t(i(),1),zn(),dr(),K=`https://grayscaleinteractive.com`,ei=`${K}/og-image.png`}));function ni(e,t){return`${ii}/${e}/${t}.webp`}function q(e,t,n,r,i,a){return{src:ni(e,t),width:n,height:r,alt:i,caption:a}}function J(e,t,n,r){return q(e,t,1920,1080,n,r)}function ri(e){return ai[e]??{}}var ii,ai,oi=e((()=>{ii=`/assets/Images/Blog`,ai={clinicvet:{client:{name:`NUPEC`,logoSrc:`/assets/Logos/clients_logos/NUPEC.svg`,approved:!0},relatedPostSlugs:[`interactive-archviz-tour`,`vr-tools-workshop-safety-training`],highlights:{en:{0:`a clearer way`,4:`side by side comparison`,7:`a visual explanation`},es:{0:`una forma más clara`,4:`comparación lado a lado`,7:`una explicación visual`}},headingEmphasis:{en:{title:`Conversations`},es:{title:`Conversaciones`}}},"pacifica-interactive-showroom":{client:{name:`CIDEC`,logoSrc:`/assets/Logos/clients_logos/CIDEC.svg`,approved:!0},relatedPostSlugs:[`sam-4-vr-product-presentation`,`interactive-archviz-tour`],highlights:{en:{0:`interact with the system in context`,2:`a real world scale`,5:`the spatial relationship`},es:{0:`interactuar con el sistema en contexto`,2:`escala real`,5:`la relación espacial`}},headingEmphasis:{en:{title:`Cabin`},es:{title:`Cabina`}},gallery:{replaceContentIndex:3,en:[q(`pacifica-interactive-showroom`,`cabin-controls`,1920,1080,`Interactive view of vehicle cabin controls in virtual reality`,`Controls remain connected to the setting where they make sense.`),q(`pacifica-interactive-showroom`,`gallery-steering-wheel`,1667,938,`Virtual Pacifica steering wheel and in cabin controls`,`A close view makes the driver controls part of the product story.`),q(`pacifica-interactive-showroom`,`gallery-cabin-view`,1667,938,`Virtual Pacifica viewed through the passenger side window`,`The cabin can be understood as a complete environment, not a product diagram.`)],es:[q(`pacifica-interactive-showroom`,`cabin-controls`,1920,1080,`Vista interactiva de los controles de una cabina de vehÃculo en realidad virtual`,`Los controles permanecen conectados al entorno donde cobran sentido.`),q(`pacifica-interactive-showroom`,`gallery-steering-wheel`,1667,938,`Volante y controles de la cabina virtual Pacifica`,`Una vista cercana convierte los controles del conductor en parte de la historia del producto.`),q(`pacifica-interactive-showroom`,`gallery-cabin-view`,1667,938,`Pacifica virtual vista a través de la ventana del lado del pasajero`,`La cabina puede entenderse como un entorno completo, no como un diagrama de producto.`)]}},"interactive-archviz-tour":{relatedPostSlugs:[`pacifica-interactive-showroom`,`clinicvet`],highlights:{en:{0:`a living materials catalog`,2:`a more immediate spatial reference`,6:`read proportion`},es:{0:`un catálogo vivo de materiales`,2:`una referencia espacial más inmediata`,6:`entender las proporciones`}},headingEmphasis:{en:{title:`Scale`},es:{title:`Escala`}},gallery:{replaceContentIndex:3,en:[q(`interactive-archviz-tour`,`material-library`,1920,1080,`Architectural visualization showing material and furniture options`,`Materials and furniture can be considered as part of the room, not in isolation.`),q(`interactive-archviz-tour`,`gallery-breakfast-table`,3334,1876,`Virtual breakfast table in a sunlit architectural interior`,`A lived in viewpoint helps material and light choices feel tangible.`),q(`interactive-archviz-tour`,`gallery-bedroom-view`,5001,2814,`Virtual bedroom and workspace with warm architectural lighting`,`A second viewpoint helps the spatial relationship remain legible.`),J(`interactive-archviz-tour`,`gallery-interior-01`,`Architectural interior view from the interactive tour`,`A change in viewpoint keeps the roomâs scale and circulation visible.`),J(`interactive-archviz-tour`,`gallery-interior-02`,`Detailed virtual interior from the architectural tour`,`The interior can be read as a complete environment rather than a set of isolated finishes.`),J(`interactive-archviz-tour`,`gallery-interior-03`,`Virtual architectural interior with material and light detail`,`Material, light, and furniture become easier to compare when they share the same spatial frame.`),J(`interactive-archviz-tour`,`gallery-interior-04`,`Interactive architectural tour view of a residential interior`,`A wider perspective preserves the relationship between adjacent rooms.`),J(`interactive-archviz-tour`,`gallery-interior-05`,`Architectural interior detail from the interactive tour`,`Additional viewpoints let the environment be considered at the pace of the conversation.`)],es:[q(`interactive-archviz-tour`,`material-library`,1920,1080,`Visualización arquitectónica con opciones de materiales y mobiliario`,`Los materiales y el mobiliario se consideran como parte de la habitación, no de forma aislada.`),q(`interactive-archviz-tour`,`gallery-breakfast-table`,3334,1876,`Mesa de desayuno virtual en un interior arquitectónico iluminado por el sol`,`Una perspectiva cotidiana hace tangibles las decisiones de material e iluminación.`),q(`interactive-archviz-tour`,`gallery-bedroom-view`,5001,2814,`Dormitorio y espacio de trabajo virtual con iluminación arquitectónica cálida`,`Una segunda vista mantiene clara la relación espacial.`),J(`interactive-archviz-tour`,`gallery-interior-01`,`Vista interior arquitectónica del recorrido interactivo`,`Un cambio de perspectiva mantiene visibles la escala y la circulación de la habitación.`),J(`interactive-archviz-tour`,`gallery-interior-02`,`Interior virtual detallado del recorrido arquitectónico`,`El interior se puede entender como un entorno completo y no como acabados aislados.`),J(`interactive-archviz-tour`,`gallery-interior-03`,`Interior arquitectónico virtual con detalle de materiales e iluminación`,`Materiales, iluminación y mobiliario son más fáciles de comparar cuando comparten el mismo marco espacial.`),J(`interactive-archviz-tour`,`gallery-interior-04`,`Vista de un interior residencial en el recorrido arquitectónico interactivo`,`Una perspectiva amplia conserva la relación entre habitaciones contiguas.`),J(`interactive-archviz-tour`,`gallery-interior-05`,`Detalle de interior arquitectónico del recorrido interactivo`,`Las vistas adicionales permiten considerar el entorno al ritmo de la conversación.`)]}},"sam-4-vr-product-presentation":{client:{name:`Kaeser`,logoSrc:`/assets/Logos/clients_logos/Kaeser.svg`,approved:!0},relatedPostSlugs:[`pacifica-interactive-showroom`,`robot-assembly-vr-training`],highlights:{en:{0:`a branded briefcase and a tablet`,6:`an arrangement of equipment, relationships, and surroundings`,8:`the medium should clarify the system, not compete with it`},es:{0:`un portafolio de marca y una tableta`,6:`un conjunto de equipos, relaciones y entorno`,8:`el medio debe aclarar el sistema, no competir con él`}},headingEmphasis:{en:{title:`Systems`},es:{title:`Sistemas`}},gallery:{replaceContentIndex:3,en:[q(`sam-4-vr-product-presentation`,`installation`,1920,1080,`Virtual industrial installation with a compressor system`,`The installation gives the system a full scale context.`),q(`sam-4-vr-product-presentation`,`gallery-kaeser-signage`,2475,1392,`Kaeser Compressors signage in the virtual installation`,`The branded environment ties the story to a recognisable operational setting.`),q(`sam-4-vr-product-presentation`,`gallery-control-room`,2428,1366,`Virtual industrial room showing the broader compressor setting`,`Context lets a complex product read as part of the larger system.`),J(`sam-4-vr-product-presentation`,`gallery-system-detail`,`Detailed view of the virtual SAM 4.0 product presentation`,`A closer view keeps individual components connected to the full product story.`),J(`sam-4-vr-product-presentation`,`gallery-product-view`,`Virtual product view from the SAM 4.0 experience`,`A different angle helps the system be considered in the round.`),J(`sam-4-vr-product-presentation`,`gallery-control-station`,`Virtual station view from the SAM 4.0 presentation`,`The presentation keeps the product tied to an environment rather than an isolated render.`),J(`sam-4-vr-product-presentation`,`gallery-equipment`,`Equipment view in the SAM 4.0 virtual environment`,`The equipment reads as part of an operational system.`),J(`sam-4-vr-product-presentation`,`gallery-room-detail`,`Virtual room detail from the SAM 4.0 product presentation`,`A detailed environmental view adds another layer of context to the presentation.`)],es:[q(`sam-4-vr-product-presentation`,`installation`,1920,1080,`Instalación industrial virtual con un sistema de compresores`,`La instalación da al sistema un contexto a escala real.`),q(`sam-4-vr-product-presentation`,`gallery-kaeser-signage`,2475,1392,`Letrero de Kaeser Compressors dentro de la instalación virtual`,`El entorno de marca conecta la historia con un contexto operativo reconocible.`),q(`sam-4-vr-product-presentation`,`gallery-control-room`,2428,1366,`Sala industrial virtual que muestra el contexto más amplio del compresor`,`El contexto permite entender un producto complejo como parte de un sistema mayor.`),J(`sam-4-vr-product-presentation`,`gallery-system-detail`,`Vista detallada de la presentación virtual del producto SAM 4.0`,`Una vista cercana mantiene conectados los componentes individuales con la historia completa del producto.`),J(`sam-4-vr-product-presentation`,`gallery-product-view`,`Vista virtual de producto de
3ntro de la experiencia SAM 4.0`,`Un ángulo distinto ayuda a considerar el sistema de forma integral.`),J(`sam-4-vr-product-presentation`,`gallery-control-station`,`Vista de estación virtual de la presentación SAM 4.0`,`La presentación mantiene al producto ligado a un entorno, no a un render aislado.`),J(`sam-4-vr-product-presentation`,`gallery-equipment`,`Vista de equipo dentro del entorno virtual de SAM 4.0`,`El equipo se entiende como parte de un sistema operativo.`),J(`sam-4-vr-product-presentation`,`gallery-room-detail`,`Detalle de sala virtual de la presentación de producto SAM 4.0`,`Una vista ambiental detallada añade otra capa de contexto a la presentación.`)]}},"robot-assembly-vr-training":{relatedPostSlugs:[`meccanovr-assembly-learning`,`vr-tools-workshop-safety-training`],highlights:{en:{0:`something to build, inspect, and verify`,2:`validate the result`,7:`verification and visual inspection in one coherent experience`},es:{0:`algo que armar, inspeccionar y validar`,2:`validar el resultado`,7:`validación e inspección visual en una experiencia coherente`}},headingEmphasis:{en:{title:`Assembly`},es:{title:`Ensamble`}},gallery:{replaceContentIndex:3,en:[q(`robot-assembly-vr-training`,`inspection`,1920,1080,`Robot assembly training interface showing an inspection step`,`The trainee can inspect the result as part of the same guided flow.`),q(`robot-assembly-vr-training`,`gallery-robot-detail`,1500,844,`Robot assembly detail in the virtual training environment`,`A close view keeps the build and its verification criteria visible.`),q(`robot-assembly-vr-training`,`gallery-workshop`,1500,844,`Virtual workshop supporting the robot assembly simulation`,`The environment frames each assembly decision inside the workflow it supports.`),J(`robot-assembly-vr-training`,`gallery-overview`,`Overview of the virtual robot assembly experience`,`The project begins with a clear overview of the environment and the task.`),J(`robot-assembly-vr-training`,`gallery-assembly-stage`,`Robot assembly stage in the virtual training experience`,`Each stage keeps the build sequence visible while the trainee works.`),J(`robot-assembly-vr-training`,`gallery-assembly-interface`,`Virtual interface used during a robot assembly step`,`The interface presents the next decision without disconnecting it from the work area.`),J(`robot-assembly-vr-training`,`gallery-parts`,`Robot components shown in the virtual assembly environment`,`Component views support a closer look before the next assembly action.`),J(`robot-assembly-vr-training`,`gallery-robot-finished`,`Completed robot in the virtual assembly training experience`,`The finished result gives the sequence a clear visual outcome.`),J(`robot-assembly-vr-training`,`gallery-interaction`,`Interactive robot assembly moment in virtual reality`,`A focused interaction makes the relationship between action and result easier to inspect.`),J(`robot-assembly-vr-training`,`gallery-validation`,`Robot assembly validation view in the training experience`,`Validation stays part of the procedure, not an afterthought after the build.`),J(`robot-assembly-vr-training`,`gallery-detail-one`,`Detailed robot view in the virtual assembly experience`,`Detail views make it easier to revisit the criteria behind a completed step.`),J(`robot-assembly-vr-training`,`gallery-detail-two`,`Second detailed robot view in the assembly training environment`,`A second inspection point adds visual proof to the guided workflow.`)],es:[q(`robot-assembly-vr-training`,`inspection`,1920,1080,`Interfaz de entrenamiento de ensamble de robot que muestra una etapa de inspección`,`El aprendiz puede inspeccionar el resultado dentro del mismo flujo guiado.`),q(`robot-assembly-vr-training`,`gallery-robot-detail`,1500,844,`Detalle de ensamble de robot en el entorno virtual de entrenamiento`,`Una vista cercana mantiene visible el ensamble y sus criterios de validación.`),q(`robot-assembly-vr-training`,`gallery-workshop`,1500,844,`Taller virtual que acompaña la simulación de ensamble de robot`,`El entorno sitúa cada decisión de ensamble dentro del flujo al que sirve.`),J(`robot-assembly-vr-training`,`gallery-overview`,`Vista general de la experiencia virtual de ensamble de robot`,`El proyecto inicia con una vista clara del entorno y de la tarea.`),J(`robot-assembly-vr-training`,`gallery-assembly-stage`,`Etapa de ensamble de robot en la experiencia virtual de entrenamiento`,`Cada etapa mantiene visible la secuencia de ensamble mientras el usuario trabaja.`),J(`robot-assembly-vr-training`,`gallery-assembly-interface`,`Interfaz virtual utilizada durante una etapa de ensamble de robot`,`La interfaz presenta la siguiente decisión sin desconectarla del área de trabajo.`),J(`robot-assembly-vr-training`,`gallery-parts`,`Componentes de robot dentro del entorno virtual de ensamble`,`Las vistas de componentes permiten revisar los detalles antes de la siguiente acción de ensamble.`),J(`robot-assembly-vr-training`,`gallery-robot-finished`,`Robot terminado dentro de la experiencia virtual de ensamble`,`El resultado terminado da a la secuencia un desenlace visual claro.`),J(`robot-assembly-vr-training`,`gallery-interaction`,`Momento interactivo de ensamble de robot en realidad virtual`,`Una interacción enfocada hace más fácil revisar la relación entre acción y resultado.`),J(`robot-assembly-vr-training`,`gallery-validation`,`Vista de validación de ensamble de robot en la experiencia de entrenamiento`,`La validación forma parte del procedimiento y no una ocurrencia posterior al ensamble.`),J(`robot-assembly-vr-training`,`gallery-detail-one`,`Vista detallada de robot en la experiencia virtual de ensamble`,`Las vistas de detalle facilitan volver a los criterios detrás de una etapa completada.`),J(`robot-assembly-vr-training`,`gallery-detail-two`,`Segunda vista detallada de robot en el entorno de entrenamiento de ensamble`,`Un segundo punto de inspección añade evidencia visual al flujo guiado.`)]}},"vr-tools-workshop-safety-training":{client:{name:`Tecnológico de Monterrey (ITESM)`,logoSrc:`/assets/Logos/clients_logos/Tec_Monterrey.svg`,approved:!0},relatedPostSlugs:[`robot-assembly-vr-training`,`meccanovr-assembly-learning`],highlights:{en:{2
3:`kind of space`,7:`a useful record of the learning path`},es:{2:`tipo de espacio`,7:`un registro útil del recorrido de aprendizaje`}},headingEmphasis:{en:{title:`Training`},es:{title:`Capacitación`}}},"meccanovr-assembly-learning":{client:{name:`Tecnológico de Monterrey (ITESM)`,logoSrc:`/assets/Logos/clients_logos/Tec_Monterrey.svg`,approved:!0},relatedPostSlugs:[`robot-assembly-vr-training`,`sam-4-vr-product-presentation`],highlights:{en:{0:`makes assembly learning active from the first interaction`,2:`connect the part to its role in the larger vehicle`,6:`a tutorial mode and an evaluation mode`},es:{0:`vuelve activo el aprendizaje de ensamble desde la primera interacción`,2:`relacionar la pieza con su papel dentro del vehÃculo`,6:`un modo tutorial y un modo evaluación`}},headingEmphasis:{en:{title:`Building`},es:{title:`Construyendo`}},gallery:{replaceContentIndex:3,en:[q(`meccanovr-assembly-learning`,`subassemblies`,1920,1080,`Exploded view of vehicle subassemblies in a virtual training experience`,`Individual parts can be connected back to the vehicle they will become.`),q(`meccanovr-assembly-learning`,`gallery-chassis`,3312,2006,`Partially assembled Meccano vehicle chassis`,`The intermediate chassis lets learners connect a part to the larger build.`)],es:[q(`meccanovr-assembly-learning`,`subassemblies`,1920,1080,`Vista explotada de subensambles de vehÃculo en una experiencia virtual de aprendizaje`,`Las piezas individuales pueden relacionarse con el vehÃculo del que formarán parte.`),q(`meccanovr-assembly-learning`,`gallery-chassis`,3312,2006,`Chasis de vehÃculo Meccano parcialmente ensamblado`,`El chasis intermedio permite relacionar cada pieza con el ensamble mayor.`)]}},"xentric-3d-development":{client:{name:`Wolstrat`,logoSrc:`/assets/Logos/clients_logos/Wolstrat.svg`,approved:!0},relatedPostSlugs:[`interactive-archviz-tour`,`pacifica-interactive-showroom`],highlights:{en:{0:`architectural, site, and aerial views`,2:`a shared spatial reference`,8:`a visual starting point`},es:{0:`vistas arquitectónicas, de sitio y aéreas`,2:`una referencia espacial compartida`,8:`un punto de partida visual`}},headingEmphasis:{en:{title:`Context`},es:{title:`Contexto`}},galleries:{"site-views":{en:[J(`xentric-3d-development`,`gallery-context`,`3D development view showing the building in its site context`,`Context turns an architectural view into a clearer first conversation.`),J(`xentric-3d-development`,`gallery-site`,`3D site view of the Xentric development`,`A site view connects the building to the ground it occupies.`),J(`xentric-3d-development`,`gallery-road`,`Aerial 3D view showing roads and surrounding landscape`,`A wider view makes approach and surroundings part of the same story.`)],es:[J(`xentric-3d-development`,`gallery-context`,`Vista 3D de un desarrollo que muestra el edificio dentro de su sitio`,`El contexto convierte una vista arquitectónica en una primera conversación más clara.`),J(`xentric-3d-development`,`gallery-site`,`Vista 3D de sitio del desarrollo Xentric`,`Una vista de sitio conecta al edificio con el terreno que ocupa.`),J(`xentric-3d-development`,`gallery-road`,`Vista aérea 3D con caminos y paisaje circundante`,`Una vista amplia vuelve el acceso y el entorno parte de la misma historia.`)]}}},"archervr-precision-interaction-demo":{relatedPostSlugs:[`robot-assembly-vr-training`,`road-2-vr-vehicle-maintenance-onboarding`],highlights:{en:{0:`a precise physical action`,5:`coordination, timing, and repeatable feedback`,7:`immersive instruction, precision control, and challenge based practice`},es:{0:`una acción fÃsica precisa`,5:`coordinación, tiempo y retroalimentación repetible`,7:`instrucción inmersiva, control de precisión y práctica basada en retos`}},headingEmphasis:{en:{title:`Demo`},es:{title:`Demo`}}},"bosch-production-line-vr-training":{client:{name:`Bosch`,logoSrc:`/assets/Logos/clients_logos/Bosch.svg`,approved:!0},relatedPostSlugs:[`vr-tools-workshop-safety-training`,`road-2-vr-vehicle-maintenance-onboarding`],highlights:{en:{0:`spatial context`,4:`assessment mode`,7:`a record that can support the next training conversation`},es:{0:`contexto espacial`,4:`el modo evaluación`,7:`un registro que pueda respaldar la siguiente conversación de capacitación`}},headingEmphasis:{en:{title:`Operators`},es:{title:`Operadores`}}},"road-2-vr-vehicle-maintenance-onboarding":{client:{name:`ETAS`,logoSrc:`/assets/Logos/clients_logos/ETAS.svg`,approved:!0},relatedPostSlugs:[`vr-tools-workshop-safety-training`,`bosch-production-line-vr-training`],highlights:{en:{0:`move through a virtual space with confidence`,5:`a damaged vehicle fuse`,8:`a useful first encounter with VR`},es:{0:`desplazarse con confianza en un espacio virtual`,5:`un fusible dañado`,8:`un primer acercamiento útil a la VR`}},headingEmphasis:{en:{title:`Repair`},es:{title:`Reparación`}}}}}));function si({post:e,variant:t=`list`,priority:n=!1,source:r=`blog_feed`}){let{language:i,t:a}=ar(),o=e[i],s=t===`featured`,c=ri(e.slug).client;return(0,Y.jsx)(`article`,{className:`blog-card group min-w-0`,children:(0,Y.jsxs)(Un,{to:Kr(i,e.slug),onClick:()=>{window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:`case_study_clicked`,project:e.slug,location:r}),Vr(`case_study_clicked`,{project:e.slug,location:r})},className:`blog-card-link grid min-w-0 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-grayscale-accent-blue-500 ${s?`blog-card-featured gap-8 xl:min-h-[30rem] xl:gr
3id-cols-[minmax(0,1.08fr)_minmax(22rem,0.92fr)] xl:items-stretch xl:gap-14 2xl:gap-18`:`blog-card-list grid-cols-[minmax(6.5rem,0.4fr)_minmax(0,1fr)] items-start gap-x-4 gap-y-4 xl:grid-cols-[minmax(13rem,0.55fr)_minmax(0,1fr)] xl:gap-5 xl:gap-x-7`}`,"aria-label":`${a(`blog.readCaseStudy`)}: ${o.title}`,children:[(0,Y.jsx)(`div`,{className:`blog-card-media overflow-hidden bg-[var(--grayscale-page-surface-elevated)] ${s?`aspect-[16/10] rounded-[var(--grayscale-card-radius)] xl:h-full xl:min-h-[var(--grayscale-blog-featured-media-min-height)] xl:aspect-auto`:`aspect-[4/3] self-center rounded-[var(--grayscale-radius-md)] xl:self-start`}`,children:(0,Y.jsx)(`img`,{src:e.hero.src,srcSet:`${e.hero.src.replace(/\.webp$/,`-640.webp`)} 640w, ${e.hero.src.replace(/\.webp$/,`-960.webp`)} 960w, ${e.hero.src} 1920w`,sizes:s?`(min-width: 1280px) 52vw, 100vw`:`(min-width: 768px) 33vw, 100vw`,width:e.hero.width,height:e.hero.height,alt:o.heroAlt,loading:n?`eager`:`lazy`,fetchPriority:n?`high`:void 0,className:`h-full w-full object-cover transition-transform duration-500 group-hover:scale-[1.025]`})}),(0,Y.jsxs)(`div`,{className:s?`flex min-w-0 flex-col items-start xl:justify-center xl:py-12`:`contents xl:flex xl:min-w-0 xl:flex-col xl:items-start xl:pb-1`,children:[(0,Y.jsxs)(`div`,{className:s?`contents`:`flex min-w-0 flex-col items-start xl:contents`,children:[(0,Y.jsxs)(`div`,{className:`blog-card-meta flex flex-wrap items-center gap-x-4 gap-y-1.5 text-sm`,children:[c?.approved&&(0,Y.jsx)(`img`,{src:c.logoSrc,alt:c.name,width:`96`,height:`28`,className:`blog-client-logo h-5 w-auto max-w-24 object-contain md:h-6`}),(0,Y.jsx)(`time`,{dateTime:e.datePublished,children:qr(e.datePublished,i)})]}),(0,Y.jsx)(`h2`,{className:`blog-card-title text-balance text-[var(--grayscale-page-text-strong)] transition-transform duration-300 group-hover:translate-x-1 ${s?`blog-card-title--featured`:`blog-card-title--list`}`,children:o.title})]}),(0,Y.jsx)(`div`,{className:s?`contents`:`col-span-2 min-w-0 xl:contents`,children:(0,Y.jsx)(`span`,{className:`blog-card-readtime blog-card-meta text-sm`,children:o.readTime})}),(0,Y.jsxs)(`div`,{className:s?`contents`:`col-span-2 flex min-w-0 flex-col items-start xl:contents`,children:[(0,Y.jsx)(`p`,{className:`blog-card-copy max-w-[62ch]`,children:o.excerpt}),(0,Y.jsx)(`span`,{className:`blog-card-action inline-flex min-h-11 items-center uppercase tracking-[0.09em] transition-colors duration-200`,children:a(`blog.readCaseStudy`)})]})]})]})})}var Y,ci=e((()=>{dr(),Jn(),oi(),Yr(),Wr(),Y=c()}));function X(e,t){return`${di}/${e}/${t}.webp`}function li(e){return`https://firebasestorage.googleapis.com/v0/b/paginawebgrayscale.firebasestorage.app/o/${encodeURIComponent(e)}?alt=media`}function Z(e){return li(`Images/Projects/Blog/${e}/preview-v1.mp4`)}function ui(e){return pi.find(t=>t.slug===e)}var di,Q,$,fi,pi,mi=e((()=>{di=`/assets/Images/Blog`,Q=`2026-07-21`,$=`2026-07-22`,fi=[{id:`clinicvet`,slug:`clinicvet`,kind:`case-study`,publicationStatus:`ready`,category:`custom-dev`,industries:[`pet-care`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`clinicvet`,`hero`),width:1920,height:1079},en:{title:`ClinicVET: Clearer Canine Health Conversations in 3D`,seoTitle:`Veterinary 3D App Case Study: ClinicVET | Grayscale`,excerpt:`A custom application that gives veterinary professionals interactive 3D anatomy, condition comparisons, and annotations to support client conversations.`,readTime:`5 min read`,heroAlt:`ClinicVET interface showing an interactive canine anatomy visualization`,content:[{type:`paragraph`,value:`Veterinary conversations often have to bridge a difficult gap: a clinician may understand the anatomy and the condition at a glance, while a pet owner is trying to make sense of an unfamiliar diagnosis in a limited amount of time. ClinicVET was designed as a visual communication aid for that moment, not as a diagnostic system, but as a clearer way to make a clinical explanation visible.`},{type:`heading`,value:`A Shared View of the Patient`},{type:`paragraph`,value:`The experience starts from a generic canine model that can be adju
3sted between male and female anatomy. Professionals can move from the exterior into skeletal and organ systems, then isolate the area they need to discuss. Rotation, zoom, and panning keep the conversation anchored to the same view instead of asking someone to interpret a static illustration from across the room.`},{type:`heading`,value:`Comparing What Changes`},{type:`paragraph`,value:`Within a selected system, the application can surface common clinical conditions and transition the 3D model to illustrate the affected organ. A healthy reference remains available alongside it. That side by side comparison gives the veterinarian a practical visual starting point for explaining what is being discussed, what is different, and where the change is located.`},{type:`video`,src:Z(`clinicvet`),poster:X(`clinicvet`,`video-poster`),title:`ClinicVET project preview`},{type:`heading`,value:`Leave the Explanation With the Owner`},{type:`paragraph`,value:`ClinicVET also makes room for the details that matter in a specific conversation. The clinician can write or draw directly over the model, then save those annotated images for later consultation. The result is a more deliberate handoff: a visual explanation that can be revisited after the appointment rather than a diagram that disappears when the conversation ends.`},{type:`list`,items:[`Explore canine anatomy in an interactive 3D view.`,`Compare a healthy reference with a selected condition visualization.`,`Annotate the view to support a more specific explanation.`]}]},es:{title:`ClinicVET: Conversaciones Más Claras sobre Salud Canina en 3D`,seoTitle:`App Veterinaria 3D: ClinicVET | Grayscale`,seoDescription:`Aplicación veterinaria 3D con anatomÃa canina interactiva, comparación de condiciones y anotaciones para apoyar conversaciones clÃnicas claras.`,excerpt:`Una aplicación a la medida que ofrece a profesionales veterinarios anatomÃa canina 3D, comparaciones de condiciones y anotaciones para apoyar conversaciones con clientes.`,readTime:`Lectura de 5 min`,heroAlt:`Interfaz de ClinicVET que muestra una visualización interactiva de anatomÃa canina`,content:[{type:`paragraph`,value:`Las conversaciones veterinarias suelen cubrir una brecha difÃcil: el profesional puede comprender la anatomÃa y la condición de inmediato, mientras que el dueño intenta entender un diagnóstico poco familiar en poco tiempo. ClinicVET fue diseñada como una herramienta de comunicación visual para ese momento; no como un sistema de diagnóstico, sino como una forma más clara de hacer visible una explicación clÃnica.`},{type:`heading`,value:`Una Vista Compartida del Paciente`},{type:`paragraph`,value:`La experiencia parte de un modelo canino genérico que puede ajustarse entre anatomÃa masculina y femenina. Los profesionales pueden pasar del exterior a los sistemas óseo y de órganos, y aislar el área que necesitan explicar. Rotar, acercar y desplazar la vista mantiene la conversación en el mismo punto de referencia, en lugar de pedir a alguien que interprete una ilustración estática a distancia.`},{type:`heading`,value:`Comparar lo Que Cambia`},{type:`paragraph`,value:`Dentro de un sistema seleccionado, la aplicación puede presentar condiciones clÃnicas comunes y cambiar el modelo 3D para ilustrar el órgano afectado. Una referencia sana permanece disponible junto a él. Esa comparación lado a lado ofrece un punto de partida práctico para explicar qué se está conversando, qué es distinto y dónde se localiza el cambio.`},{type:`video`,src:Z(`clinicvet`),poster:X(`clinicvet`,`video-poster`),title:`Vista previa del proyecto ClinicVET`},{type:`heading`,value:`Dejar la Explicación con el Dueño`},{type:`paragraph`,value:`ClinicVET también deja espacio para los detalles que importan en cada conversación. El profesional puede escribir o dibujar directamente sobre el modelo y guardar esas imágenes anotadas para consultarlas después. El resultado es una entrega más deliberada: una explicación visual que puede revisarse después de la cita, en lugar de un diagrama que desaparece cuando termina la conversación.`},{type:`list`,items:[`Explorar anatomÃa canina en una vista 3D interactiva.`,`Comparar una referencia sana con una visualización de condición seleccionad
3a.`,`Anotar la vista para apoyar una explicación más especÃfica.`]}]}},{id:`pacifica-interactive-showroom`,slug:`pacifica-interactive-showroom`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`automotive`,`showroom`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`pacifica-interactive-showroom`,`hero`),width:1920,height:1080},en:{title:`Pacifica Interactive Showroom: Explore the Cabin in VR`,seoTitle:`VR Showroom Case Study: Pacifica | Grayscale`,excerpt:`A full scale virtual cabin experience designed to make an in vehicle media system more tangible in a showroom setting.`,readTime:`4 min read`,heroAlt:`Vehicle cabin rendered as part of a virtual showroom experience`,content:[{type:`paragraph`,value:`Built for CIDEC, this virtual showroom experience places visitors in the driverâs seat of a Pacifica cabin and makes the media system the story. Instead of explaining controls at a distance, it makes room to look around, start the vehicle, and interact with the system in context.`},{type:`heading`,value:`The Cabin Becomes the Interface`},{type:`paragraph`,value:`The cabin is presented at a real world scale, so the relationship between the driver, the center console, and the surrounding interior remains legible. Visitors can move through familiar media interactions, from activating the vehicle to using the player, screen, and phone connection, without reducing the system to a list of specifications.`},{type:`image`,src:X(`pacifica-interactive-showroom`,`cabin-controls`),width:1920,height:1080,alt:`Interactive view of vehicle cabin controls in virtual reality`,caption:`Interactive controls stay attached to the setting where they make sense.`},{type:`heading`,value:`A Showroom Conversation, Not a Spec Sheet`},{type:`paragraph`,value:`The project was built for a showroom context where the visitor can experience a complete multimedia system inside the vehicle. The emphasis is on a clear product narrative: see the cabin, discover the controls, and understand how each interaction fits into a journey. VR makes the spatial relationship part of the explanation rather than an afterthought.`},{type:`video`,src:Z(`pacifica-interactive-showroom`),poster:X(`pacifica-interactive-showroom`,`video-poster`),title:`Pacifica interactive showroom preview`},{type:`list`,items:[`Place the visitor inside a full scale vehicle cabin.`,`Make product interactions visible in their intended context.`,`Turn a product walkthrough into an active showroom experience.`]}]},es:{title:`Showroom Interactivo Pacifica: Explora la Cabina en VR`,seoTitle:`Showroom VR Pacifica: Caso de Estudio | Grayscale`,excerpt:`Una experiencia virtual de cabina a escala real diseñada para hacer más tangible un sistema multimedia del vehÃculo en un entorno de showroom.`,readTime:`Lectura de 4 min`,heroAlt:`Cabina de vehÃculo renderizada como parte de una experiencia de showroom virtual`,content:[{type:`paragraph`,value:`Desarrollada para CIDEC, esta experiencia de showroom virtual coloca a los visitantes en el asiento del conductor de una cabina Pacifica y convierte al sistema multimedia en la historia. En lugar de explicar los controles a distancia, permite observar el entorno, encender el vehÃculo e interactuar con el sistema en contexto.`},{type:`heading`,value:`La Cabina se Convierte en la Interfaz`},{type:`paragraph`,value:`La cabina se presenta a escala real, de modo que la relación entre el conductor, la consola central y el interior se mantiene clara. Los visitantes pueden recorrer interacciones de medios familiares, desde activar el vehÃculo hasta usar el reproductor, la pantalla y la conexión del teléfono, sin reducir el sistema a una lista de especificaciones.`},{type:`image`,src:X(`pacifica-interactive-showroom`,`cabin-controls`),width:1920,height:1080,alt:`Vista interactiva de los controles de una cabina de vehÃculo en realidad virtual`,caption:`Los controles interactivos permanecen ligados al entorno donde cobran sentido.`},{type:`heading`,value:`Una Conversación de Showroom, No una Ficha Técnica`},{type:`paragraph`,value:`El proyecto fue creado para un contexto de showroom en el que el visitante puede experimentar un sistema multimedia completo dentro del vehÃculo. El énfasis está en una narrativa de producto clara: observar la cabina, descubrir los controles y entender cómo cada interacción se integra en un recorrido. La VR hace que la relación espacial sea parte de la explicación y no un detalle posterior.`},{type:`video`,src:Z(`pacifica-interactive-showroom`),poster:X(`pacifica-interactive-showroom`,`video-poster`),title:`Vista previa del showroom interactivo Pacifica`},{type:`list`,items:[`Colocar al visitante dentro de una cabina de vehÃculo a escala real.`,`Hacer visibles las interacciones del producto en su contexto de uso.`,`Convertir un recorrido de producto en una experiencia activa de showroom.`]}]}},{id:`interactive-archviz-tour`,slug:`interactive-archviz-tour`,kind:`tech-demo`,publicationStatus:`ready`,category:`3d`,industries:[`architecture`,`real-estate`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`interactive-archviz-tour`,`hero`),width:1920,height:1080},en:{title:`Interactive Archviz: Material Decisions at Full Scale`,seoTitle:`Interactive Archviz VR Case Study | Grayscale`,excerpt:`A VR concept that brings materials, lighting, dimensions, and furniture choices into one real scale spatial walkthrough.`,readTime:`4 min read`,heroAlt:`Virtual architectural interior with material and lighting options`,content:[{type:`paragraph`,value:`Architectural choices are usually made through a sequence of drawings, samples, and renders. This interactive archviz concept asks what changes when the same decisions can be explored inside the space itself. It turns a hotel room scenario into a living materials catalog where finishes, furniture, light, and dimensions can be inspected in a single walkthrough.`},{type:`heading`,value:`Change the Space While You Are In It`},{type:`paragraph`,value:`The experience gives users a bank of construction materials and furniture to apply to the room in real time. A bathroom finish can change, lighting can be switched on, and the same room can be read as a sequence of possible directions rather than a fixed image. The goal is not to replace design judgment; it is to give that judgment a more immediate spatial reference.`},{type:`image`,src:X(`interactive-archviz-tour`,`material-library`),width:1920,height:1080,alt:`Architectural visualization showing material and furniture options`,caption:`Materials and furniture can be explored as part of the room, not in isolation.`},{type:`video`,src:Z(`interactive-archviz-tour`),poster:X(`interactive-archviz-tour`,`video-poster`),title:`Interactive Archviz project preview`},{type:`heading`,value:`Dimensions That Belong to the Environment`},{type:`paragraph`,value:`Because the environment is experienced at a real world scale, the visitor can read proportion as they move through it. Floating measurements can be called up when planning needs to become more precise. Lighting and a view through the window add another layer of context, showing how material and layout decisions relate to the atmosphere of the whole space.`},{type:`heading`,value:`A Technical Demo for Spatial Conversations`},{type:`paragraph`,value:`This is a Grayscale Interactive technical demo: a compact way to show how immer
3sive visualization can support a more active conversation around a planned space. The interaction is intentionally direct: select, place, observe, and compare, so the focus stays on the decisions being made rather than on the interface itself.`},{type:`list`,items:[`Explore materials, furniture, and lighting in the same walkthrough.`,`Read scale and dimensions from inside the planned environment.`,`Compare design directions without waiting for another render cycle.`]}]},es:{title:`Archviz Interactivo: Decisiones de Materiales a Escala Real`,seoTitle:`Archviz Interactivo en VR: Caso de Estudio | Grayscale`,excerpt:`Un concepto VR que reúne materiales, iluminación, dimensiones y mobiliario en un recorrido espacial a escala real.`,readTime:`Lectura de 4 min`,heroAlt:`Interior arquitectónico virtual con opciones de materiales e iluminación`,content:[{type:`paragraph`,value:`Las decisiones arquitectónicas suelen tomarse mediante dibujos, muestras y renders. Este concepto de archviz interactivo pregunta qué cambia cuando esas decisiones pueden explorarse dentro del propio espacio. Convierte un escenario de habitación de hotel en un catálogo vivo de materiales donde acabados, mobiliario, luz y dimensiones se inspeccionan en un solo recorrido.`},{type:`heading`,value:`Cambiar el Espacio Mientras Estás Dentro`},{type:`paragraph`,value:`La experiencia ofrece un banco de materiales de construcción y mobiliario para aplicarlos a la habitación en tiempo real. Puede cambiarse un acabado del baño, encenderse la iluminación y leer el mismo cuarto como una serie de direcciones posibles, en lugar de una imagen fija. El objetivo no es sustituir el criterio de diseño, sino darle una referencia espacial más inmediata.`},{type:`image`,src:X(`interactive-archviz-tour`,`material-library`),width:1920,height:1080,alt:`Visualización arquitectónica con opciones de materiales y mobiliario`,caption:`Los materiales y el mobiliario se exploran como parte de la habitación, no de forma aislada.`},{type:`video`,src:Z(`interactive-archviz-tour`),poster:X(`interactive-archviz-tour`,`video-poster`),title:`Vista previa del proyecto Archviz Interactivo`},{type:`heading`,value:`Dimensiones que Pertenecen al Entorno`},{type:`paragraph`,value:`Como el entorno se experimenta a escala real, el visitante puede entender las proporciones mientras se mueve. Las medidas flotantes pueden activarse cuando la planeación necesita mayor precisión. La iluminación y la vista por la ventana aportan otro nivel de contexto, mostrando cómo las decisiones de material y distribución se relacionan con la atmósfera del espacio completo.`},{type:`heading`,value:`Una Demo Técnica para Conversaciones Espaciales`},{type:`paragraph`,value:`Esta es una demo técnica de Grayscale Interactive: una forma compacta de mostrar cómo la visualización inmersiva puede apoyar una conversación más activa alrededor de un espacio planeado. La interacción es intencionalmente directa: seleccionar, colocar, observar y comparar, para que la atención permanezca en las decisiones y no en la interfaz.`},{type:`list`,items:[`Explorar materiales, mobiliario e iluminación en un mismo recorrido.`,`Entender escala y dimensiones desde el entorno planeado.`,`Comparar direcciones de diseño sin esperar otro ciclo de render.`]}]}},{id:`sam-4-vr-product-presentation`,slug:`sam-4-vr-product-presentation`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`industrial`,`product-marketing`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`sam-4-vr-product-presentation`,`hero`),width:1920,height:1080},en:{title:`SAM 4.0 in VR: Explaining Complex Compressor Systems`,seoTitle:`Industrial VR Product Demo: SAM 4.0 | Grayscale`,excerpt:`A narrated product experience that places a complex compressor system in a full scale virtual installation.`,readTime:`4 min read`,heroAlt:`Virtual industrial installation with a compressor system`,content:[{type:`paragraph`,value:`Some industrial products are difficult to explain because their value lives in a system, not in a single object. This VR product presentation begins with a compact physical cue: a branded briefcase and a tablet, then opens into a full scale virtual installation. The change of scale is deliberate: it turns an abstract technical explanation into an environment that can be explored.`},{type:`heading`,value:`Start With a Guided Product Story`},{type:`paragraph`,value:`The opening sequence introduces the system through narration and focused interaction. When the device is activated, the visitor transitions into an installation with multiple compressors. The experience does not ask someone to decode a diagram first; it gives the explanation a rhythm, placing visual elements into the scene as the product story progresses.`},{type:`image`,src:X(`sam-4-vr-product-presentation`,`installation`),width:1920,height:1080,alt:`Compressor installation presented at full scale in a virtual environment`,caption:`The virtual installation gives a technical system room to be understood spatially.`},{type:`video`,src:Z(`sam-4-vr-product-presentation`),poster:X(`sam-4-vr-product-presentation`,`video-poster`),title:`SAM 4.0 project preview`},{type:`heading`,value:`Make Structure Visible at the Right Scale`},{type:`paragraph`,value:`As the narration continues, the world evolves with the explanation. The visitor can see a complex structure as an arrangement of equipment, relationships, and surroundings instead of as an isolated component. That full scale context is especially useful when a product needs to be discussed with people who do not all begin with the same technical picture in mind.`},{type:`heading`,value:`A Presentation Built Around the Product`},{type:`paragraph`,value:`The project demonstrates a simple principle for te
3chnical product communication: the medium should clarify the system, not compete with it. VR provides a controlled sequence, an inspectable environment, and a sense of scale that helps a conversation stay attached to the actual installation being described.`},{type:`list`,items:[`Use narration and interaction to pace a technical product story.`,`Place equipment in a full scale installation context.`,`Make relationships within a complex system easier to inspect visually.`]}]},es:{title:`SAM 4.0 en VR: Explicar Sistemas de Compresores Complejos`,seoTitle:`Demo de Producto Industrial en VR: SAM 4.0 | Grayscale`,excerpt:`Una experiencia de producto narrada que sitúa un sistema complejo de compresores en una instalación virtual a escala real.`,readTime:`Lectura de 4 min`,heroAlt:`Instalación industrial virtual con un sistema de compresores`,content:[{type:`paragraph`,value:`Algunos productos industriales son difÃciles de explicar porque su valor vive en un sistema y no en un solo objeto. Esta presentación de producto en VR inicia con una señal fÃsica compacta: un portafolio de marca y una tableta, y después abre una instalación virtual a escala real. El cambio de escala es intencional: transforma una explicación técnica abstracta en un entorno que puede explorarse.`},{type:`heading`,value:`Comenzar con una Historia de Producto Guiada`},{type:`paragraph`,value:`La secuencia inicial presenta el sistema mediante narración e interacción enfocada. Al activar el dispositivo, el visitante pasa a una instalación con varios compresores. La experiencia no pide descifrar primero un diagrama; le da ritmo a la explicación y coloca elementos visuales en la escena conforme avanza la historia del producto.`},{type:`image`,src:X(`sam-4-vr-product-presentation`,`installation`),width:1920,height:1080,alt:`Instalación de compresores presentada a escala real en un entorno virtual`,caption:`La instalación virtual da a un sistema técnico espacio para entenderse de manera espacial.`},{type:`video`,src:Z(`sam-4-vr-product-presentation`),poster:X(`sam-4-vr-product-presentation`,`video-poster`),title:`Vista previa del proyecto SAM 4.0`},{type:`heading`,value:`Hacer Visible la Estructura a la Escala Adecuada`},{type:`paragraph`,value:`Mientras continúa la narración, el mundo evoluciona con la explicación. El visitante puede observar una estructura compleja como un conjunto de equipos, relaciones y entorno, en vez de como un componente aislado. Ese contexto a escala real es especialmente útil cuando un producto debe conversarse con personas que no parten de la misma imagen técnica.`},{type:`heading`,value:`Una Presentación Construida Alrededor del Producto`},{type:`paragraph`,value:`El proyecto demuestra un principio simple para comunicar productos técnicos: el medio debe aclarar el sistema, no competir con él. La VR ofrece una secuencia controlada, un entorno inspeccionable y una sensación de escala que mantiene la conversación ligada a la instalación que se está describiendo.`},{type:`list`,items:[`Usar narración e interacción para marcar el ritmo de una historia técnica.`,`Situar el equipo en el contexto de una instalación a escala real.`,`Hacer más fáciles de inspeccionar las relaciones de un sistema complejo.`]}]}},{id:`robot-assembly-vr-training`,slug:`robot-assembly-vr-training`,kind:`tech-demo`,publicationStatus:`ready`,category:`vr`,industries:[`industrial`,`training`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`robot-assembly-vr-training`,`hero`),width:1920,height:1080},en:{title:`Robot Assembly in VR: From Guided Build to Inspection`,seoTitle:`Robot Assembly VR Training Demo | Grayscale`,excerpt:`An interactive training concept combining robot assembly, scan based verification, and a post build inspection space.`,readTime:`4 min read`,heroAlt:`Virtual robot assembly training environment`,content:[{type:`paragraph`,value:`Robot Assembly is a Grayscale Interactive technical demo built around a complete learner journey. The experience begins with a first day of training and a clear practical task: assemble finishing elements on a robot under construction. The scenario is intentionally concrete so the user has something to build, inspect, and verify rather than simply a collection of controls to learn.`},{type:`heading`,value:`Build in a Guided Sequence`},{type:`paragraph`,value:`The training sequence guides the user through the parts that belong on the robot and the order in which they are assembled. Each interaction stays close to the physical task being represented. Once the build is complete, a scanner is used to validate the result and register the robotâs exit from the production line, connecting the assembly moment to a broader operational story.`},{type:`image`,src:X(`robot-assembly-vr-training`,`inspection`),width:1920,height:1080,alt:`Robot inspection and customization scene in a virtual showroom`,caption:`The post build space turns a finished assembly into another opportunity to inspect and explore.`},{type:`heading`,value:`Inspect What Was Built`},{type:`paragraph`,value:`After training, the user moves into a showroom environment where the robot can be examined with a different purpose. They can look for imperfections, change its coating, or open it to see internal
3components. Shifting the setting after the assembly sequence makes inspection feel like its own task rather than an afterthought appended to the build.`},{type:`heading`,value:`A Small Demonstration of a Larger Pattern`},{type:`paragraph`,value:`The demo shows how immersive training can connect a guided procedure with verification and visual inspection in one coherent experience. It is not presented as a production deployment or a measured performance claim. It is a working exploration of the interactions that can make an assembly task more tangible before it is adapted to a specific operation.`},{type:`list`,items:[`Guide the user through a purposeful assembly sequence.`,`Use scan based validation as part of the training story.`,`Continue into a separate inspection and exploration environment.`]}]},es:{title:`Ensamble de Robot en VR: De GuÃa a Inspección`,seoTitle:`Demo VR de Ensamble de Robot | Grayscale`,excerpt:`Un concepto de capacitación interactiva que combina ensamble de robot, verificación con escáner y un espacio de inspección posterior.`,readTime:`Lectura de 5 min`,heroAlt:`Entorno virtual de capacitación para ensamble de robot`,content:[{type:`paragraph`,value:`Robot Assembly es una demo técnica de Grayscale Interactive construida alrededor de un recorrido completo de aprendizaje. La experiencia comienza con un primer dÃa de capacitación y una tarea práctica clara: ensamblar elementos finales en un robot en construcción. El escenario es intencionalmente concreto para que la persona tenga algo que armar, inspeccionar y validar, en lugar de solo una colección de controles por aprender.`},{type:`heading`,value:`Armar en una Secuencia Guiada`},{type:`paragraph`,value:`La secuencia de capacitación guÃa al usuario por las partes que pertenecen al robot y el orden en que se ensamblan. Cada interacción se mantiene cercana a la tarea fÃsica representada. Una vez terminado el armado, se utiliza un escáner para validar el resultado y registrar la salida del robot de la lÃnea de producción, conectando el momento de ensamble con una historia operativa más amplia.`},{type:`image`,src:X(`robot-assembly-vr-training`,`inspection`),width:1920,height:1080,alt:`Escena de inspección y personalización de robot en un showroom virtual`,caption:`El espacio posterior al ensamble convierte el trabajo terminado en otra oportunidad para inspeccionar y explorar.`},{type:`heading`,value:`Inspeccionar lo que se Construyó`},{type:`paragraph`,value:`Después de la capacitación, el usuario pasa a un entorno de showroom donde el robot puede examinarse con otro propósito. Puede buscar imperfecciones, cambiar el recubrimiento o abrirlo para observar componentes internos. Cambiar el escenario después de la secuencia de armado permite que la inspección se sienta como una tarea propia y no como un detalle añadido al final.`},{type:`heading`,value:`Una Demostración Pequeña de un Patrón Mayor`},{type:`paragraph`,value:`La demo muestra cómo la capacitación inmersiva puede conectar un procedimiento guiado con validación e inspección visual en una experiencia coherente. No se presenta como un despliegue de producción ni como una afirmación de rendimiento medido. Es una exploración funcional de las interacciones que pueden hacer una tarea de ensamble más tangible antes de adaptarla a una operación especÃfica.`},{type:`list`,items:[`Guiar al usuario por una secuencia de ensamble con propósito.`,`Usar validación con escáner como parte de la historia de capacitación.`,`Continuar hacia un entorno separado de inspección y exploración.`]}]}},{id:`vr-tools-workshop-safety-training`,slug:`vr-tools-workshop-safety-training`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`education`,`industrial`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`vr-tools-workshop-safety-training`,`hero`),width:1920,height:1079},en:{title:`VR Tools: Safety Training Before Workshop Access`,seoTitle:`VR Workshop Safety Training | Grayscale`,excerpt:`A virtual course that combines safety instruction, tool-station practice, and progress records for shared workshop access.`,readTime:`5 min read`,heroAlt:`Virtual workshop safety training environment`,content:[{type:`paragraph`,value:`Developed for Tecnológico de Monterrey (ITESM) as part of a training course, VR Tools helps students learn the facilities, expected safety practices, and sequence behind each tool station before entering the physical workshop.`},{type:`heading`,value:`Start With Safety Context`},{type:`paragraph`,value:`The experience begins with a safety section where a narrator and signs introduce dress code expectations and required protective equipment. Rather than presenting safety as a detached checklist, the instruction is placed inside the kind of space where those choices matter. The learner sees the environment, follows the guidance, and can connect the rule to the situation it is meant to address.`},{type:`heading`,value:`Practice Station by Station`},{type:`paragraph`,value:`After the introduction, the course moves through tool stations with their own materials, procedures, and interaction steps. Text, narration, and visual guidance support the sequence. A station may cover how to work with a particular tool or material, including operations such as making straight or angled cuts, while keeping the learner inside a controlled training setting.`},{type:`video`,src:Z(`vr-tools-workshop-safety-training`),poster:X(`vr-tools-workshop-safety-training`,`video-poster`),title:`VR Tools project preview`},{type:`heading`,value:`Keep a Clear Progress Record`},{type:`paragraph`,value:`The application records course progress, including completed sections and attempts. That record gives instructors a clearer view of where a learner is in the course and which parts still need attention. The important design idea is continuity: the same system that teaches the procedure also creates a useful record of the learning path.`},{type:`list`,items:[`Introduce workshop safety in the context where it applies.`,`Guide learners through individual tool stations and procedures.`,`Record course progress for instructors and learners to review.`]}]},es:{title:`VR Tools: Capacitación de Seguridad Antes del Taller`,seoTitle:`Capacitación VR de Seguridad en Taller | Grayscale`,excerpt:`Un curso virtual que reúne instrucciones de seguridad, práctica por estación de herramienta y registros de avance para acceso a talleres compartidos.`,readTime:`Lectura de 5 min`,heroAlt:`Entorno virtual de capacitación de seguridad para taller`,content:[{type:`paragraph`,value:`Desarrollada para el Tecnológico de Monterrey (ITESM) como parte de un curs
3o de capacitación, VR Tools ayuda a estudiantes a conocer las instalaciones, las prácticas de seguridad esperadas y la secuencia de cada estación de herramienta antes de entrar al taller fÃsico.`},{type:`heading`,value:`Comenzar con el Contexto de Seguridad`},{type:`paragraph`,value:`La experiencia inicia con una sección de seguridad donde un narrador y señales introducen expectativas de vestimenta y equipo de protección requerido. En lugar de presentar la seguridad como una lista aislada, la instrucción se coloca dentro del tipo de espacio donde esas decisiones importan. La persona observa el entorno, sigue la guÃa y puede relacionar la regla con la situación que busca atender.`},{type:`heading`,value:`Practicar Estación por Estación`},{type:`paragraph`,value:`Después de la introducción, el curso recorre estaciones de herramienta con sus propios materiales, procedimientos y pasos de interacción. Textos, narración y guÃa visual apoyan la secuencia. Una estación puede abordar cómo trabajar con una herramienta o material especÃfico, incluidas operaciones como cortes rectos o angulados, mientras la persona se mantiene en un contexto de capacitación controlado.`},{type:`video`,src:Z(`vr-tools-workshop-safety-training`),poster:X(`vr-tools-workshop-safety-training`,`video-poster`),title:`Vista previa del proyecto VR Tools`},{type:`heading`,value:`Mantener un Registro Claro de Avance`},{type:`paragraph`,value:`La aplicación registra el avance del curso, incluidas secciones completadas e intentos. Ese registro ofrece a los instructores una vista más clara de en qué parte del curso se encuentra cada estudiante y qué temas requieren atención. La idea de diseño importante es la continuidad: el mismo
3sistema que enseña el procedimiento también construye un registro útil del recorrido de aprendizaje.`},{type:`list`,items:[`Introducir seguridad de taller en el contexto donde se aplica.`,`Guiar a estudiantes por estaciones y procedimientos individuales.`,`Registrar el avance del curso para revisión de instructores y estudiantes.`]}]}},{id:`meccanovr-assembly-learning`,slug:`meccanovr-assembly-learning`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`education`],datePublished:Q,dateModified:Q,author:`Grayscale Interactive`,hero:{src:X(`meccanovr-assembly-learning`,`hero`),width:1920,height:1162},en:{title:`MeccanoVR: Learning Assembly by Building`,seoTitle:`VR Assembly Training for Students: MeccanoVR | Grayscale`,excerpt:`A virtual learning experience where students build car subassemblies with guidance, then complete an independent evaluation.`,readTime:`5 min read`,heroAlt:`Virtual Meccano vehicle assembly scene`,content:[{type:`paragraph`,value:`Developed for Tecnológico de Monterrey (ITESM), MeccanoVR makes assembly learning active from the first interaction. Students build two vehicle typesâan F1 car and a Jeepâthrough virtual sets of parts, practising how to identify a component, understand its purpose, place it in relation to the rest, and check the result.`},{type:`heading`,value:`Manipulate the Parts Before the Whole`},{type:`paragraph`,value:`Users can pick up, rotate, and inspect the pieces required for the build. As individual components become subassemblies, they align near the central assembly point. Text boxes explain the function of selected parts so the user is not only following a placement instruction; they can also connect the part to its role in the larger vehicle.`},{type:`image`,src:X(`meccanovr-assembly-learning`,`subassemblies`),width:1920,height:1162,alt:`Virtual vehicle subassemblies used for MeccanoVR learning`,caption:`Subassemblies make the relationship between individual parts and the full vehicle easier to examine.`},{type:`video`,src:Z(`meccanovr-assembly-learning`),poster:X(`meccanovr-assembly-learning`,`video-poster`),title:`MeccanoVR project preview`},{type:`heading`,value:`Move From Tutorial to Evaluation`},{type:`paragraph`,value:`The experience offers a tutorial mode and an evaluation mode for both vehicle builds. In the tutorial, a guide narrates the process and responds to errors or successful actions. In the evaluation, the user assembles the vehicle independently and receives a passed or failed result together with the time taken. The shift gives the same project a clear learning arc: guided practice first, then a chance to perform the sequence without assistance.`},{type:`heading`,value:`An Assembly Exercise With a Visible Logic`},{type:`paragraph`,value:`The value of the experience is in making the logic of an assembly accessible. Parts can be examined from more than one angle, functions can be introduced as the build progresses, and the complete object is only reached through a series of understandable subassemblies. That structure makes the virtual task a useful canvas for teaching sequence, spatial relationships, and independent practice.`},{type:`list`,items:[`Handle and inspect the components needed for each build.`,`Learn through guided subassemblies and part-function explanations.`,`Practice the full sequence independently in evaluation mode.`]}]},es:{title:`MeccanoVR: Aprender Ensamble Construyendo`,seoTitle:`Capacitación VR de Ensamble: MeccanoVR | Grayscale`,excerpt:`Una experiencia de aprendizaje virtual donde estudiantes construyen subensambles de vehÃculos con guÃa y después realizan una evaluación independiente.`,readTime:`Lectura de 5 min`,heroAlt:`Escena virtual de ensamble de vehÃculo Meccano`,content:[{type:`paragraph`,value:`Desarrollada para el Tecnológico de Monterrey (ITESM), MeccanoVR vuelve activo el aprendizaje de ensamble desde la primera interacción. Los estudiantes construyen dos tipos de vehÃculoâun auto F1 y un Jeepâmediante conjuntos virtuales de piezas, practicando cómo identificar un componente, entender su propósito, colocarlo en relación con el resto y revisar el resultado.`}
3,{type:`heading`,value:`Manipular las Piezas Antes del Conjunto`},{type:`paragraph`,value:`Las personas pueden tomar, rotar e inspeccionar las piezas necesarias para el armado. Conforme los componentes individuales se convierten en subensambles, se alinean cerca del punto central de montaje. Los cuadros de texto explican la función de cada pieza seleccionada, de modo que no solo se sigue una instrucción de colocación; también se puede relacionar la pieza con su papel dentro del vehÃculo.`},{type:`image`,src:X(`meccanovr-assembly-learning`,`subassemblies`),width:1920,height:1162,alt:`Subensambles virtuales de vehÃculo usados para el aprendizaje en MeccanoVR`,caption:`Los subensambles hacen más fácil examinar la relación entre las piezas individuales y el vehÃculo completo.`},{type:`video`,src:Z(`meccanovr-assembly-learning`),poster:X(`meccanovr-assembly-learning`,`video-poster`),title:`Vista previa del proyecto MeccanoVR`},{type:`heading`,value:`Pasar de Tutorial a Evaluación`},{type:`paragraph`,value:`La experiencia ofrece un modo tutorial y un modo evaluación para ambos vehÃculos. En el tutorial, una guÃa narra el proceso y responde a errores o acciones exitosas. En la evaluación, el estudiante ensambla el vehÃculo de manera independiente y recibe un resultado de aprobación o no aprobación junto con el tiempo utilizado. El cambio brinda al proyecto un arco claro de aprendizaje: práctica guiada primero y después una oportunidad para ejecutar la secuencia sin asistencia.`},{type:`heading`,value:`Un Ejercicio de Ensamble con Lógica Visible`},{type:`paragraph`,value:`El valor de la experiencia está en hacer accesible la lógica de un ensamble. Las piezas pueden examinarse desde más de un ángulo, las funciones se introducen conforme avanza el armado y el objeto completo solo se alcanza a través de una serie de subensambles comprensibles. Esa estructura vuelve la tarea virtual un lienzo útil para enseñar secuencia, relaciones espaciales y práctica independiente.`},{type:`list`,items:[`Manipular e inspeccionar los componentes necesarios para cada armado.`,`Aprender mediante subensambles guiados y explicaciones de función por pieza.`,`Practicar la secuencia completa de forma independiente en modo evaluación.`]}]}},{id:`xentric-3d-development`,slug:`xentric-3d-development`,kind:`project-note`,publicationStatus:`ready`,category:`3d`,industries:[`real-estate`,`architecture`],datePublished:$,dateModified:$,author:`Grayscale Interactive`,hero:{src:X(`xentric-3d-development`,`hero`),width:1920,height:1080},en:{title:`Xentric: Seeing a Development in Context`,seoTitle:`3D Architectural Visualization: Xentric | Grayscale`,excerpt:`A 3D development visualisation for Wolstrat that brings together architectural, site, and aerial views for a more grounded first impression.`,readTime:`3 min read`,heroAlt:`3D visualisation of a building set within its surrounding site and landscape`,content:[{type:`paragraph`,value:`A development is understood through more than its façade. Xentric brings architectural, site, and aerial views into one visual story, so the discussion can move from the building itself to its relationship with the terrain, roads, and immediate surroundings.`},{type:`heading`,value:`Put the Building in Its Setting`},{type:`paragraph`,value:`The visualisation presents the project at the scale where its context becomes legible. Rather than asking a viewer to infer how a building sits on a site from a plan or isolated elevation, the environment gives the conversation a shared spatial reference.`},{type:`gallery`,id:`site-views`},{type:`heading`,value:`Move Between Scales`},{type:`paragraph`,value:`Close architectural views make the form tangible; wider site views reveal the approach, surrounding landscape, and larger relationship to place. Together, those shifts in scale make it easier to orient a viewer before the detail work begins.`},{type:`video`,src:Z(`xentric-3d-development`),poster:X(`xentric-3d-development`,`video-poster`),title:`Xentric project preview`},{type:`heading`,value:`Make the First View More Concrete`},{type:`paragraph`,value:`The result is a visual starting point that makes a proposed environment easier to discu
3ss. It gives people a way to see the building, the site, and the route between them before they have to translate a stack of separate reference images into a single mental picture.`},{type:`list`,items:[`Architectural, site, and aerial views in one visual narrative.`,`A clearer sense of how the development sits within its surroundings.`,`A concrete visual reference for an early project conversation.`]}]},es:{title:`Xentric: Ver un Desarrollo en Contexto`,seoTitle:`Visualización Arquitectónica 3D: Xentric | Grayscale`,excerpt:`Una visualización 3D de desarrollo para Wolstrat que reúne vistas arquitectónicas, de sitio y aéreas para una primera impresión más clara.`,readTime:`Lectura de 3 min`,heroAlt:`Visualización 3D de un edificio dentro de su sitio y paisaje circundante`,content:[{type:`paragraph`,value:`Un desarrollo se entiende por más que su fachada. Xentric reúne vistas arquitectónicas, de sitio y aéreas en una misma historia visual, para que la conversación pase del edificio a su relación con el terreno, los caminos y el entorno inmediato.`},{type:`heading`,value:`Situar el Edificio en su Entorno`},{type:`paragraph`,value:`La visualización presenta el proyecto a una escala donde su contexto se vuelve legible. En lugar de pedir que alguien deduzca cómo se integra un edificio al sitio a partir de un plano o una elevación aislada, el entorno ofrece una referencia espacial compartida.`},{type:`gallery`,id:`site-views`},{type:`heading`,value:`Cambiar Entre Escalas`},{type:`paragraph`,value:`Las vistas arquitectónicas cercanas hacen tangible la forma; las vistas amplias del sitio revelan el acceso, el paisaje y la relación con el lugar. Juntos, esos cambios de escala facilitan orientar a quien observa antes de entrar a los detalles.`},{type:`video`,src:Z(`xentric-3d-development`),poster:X(`xentric-3d-development`,`video-poster`),title:`Vista previa del proyecto Xentric`},{type:`heading`,value:`Hacer Más Concreta la Primera Vista`},{type:`paragraph`,value:`El resultado es un punto de partida visual que hace más fácil hablar de un entorno propuesto. Permite ver el edificio, el sitio y el recorrido entre ambos antes de tener que convertir referencias separadas en una sola imagen mental.`},{type:`list`,items:[`Vistas arquitectónicas, de sitio y aéreas en una misma narrativa visual.`,`Una comprensión más clara de cómo el desarrollo se integra a su entorno.`,`Una referencia visual concreta para las primeras conversaciones del proyecto.`]}]}},{id:`archervr-precision-interaction-demo`,slug:`archervr-precision-interaction-demo`,kind:`tech-demo`,publicationStatus:`ready`,category:`vr`,industries:[`interactive-3d`],datePublished:$,dateModified:$,author:`Grayscale Interactive`,hero:{src:X(`archervr-precision-interaction-demo`,`hero`),width:1920,height:908},en:{title:`ArcherVR: A Precision Focused Interaction Demo`,seoTitle:`VR Interaction Design Demo: ArcherVR | Grayscale`,excerpt:`An internal VR demo that introduces basic bow controls before moving the participant into a focused target shooting challenge.`,readTime:`3 min read`,heroAlt:`Participant using a virtual bow in a precision target shooting demo`,content:[{type:`paragraph`,value:`ArcherVR is an internal interaction demo built around a simple question: how can a virtual experience teach a precise physical action before asking a participant to perform it under pressure? The result starts with the essential bow controls, then gradually moves toward a focused target challenge.`},{type:`heading`,value:`Teach the Core Interaction First`},{type:`paragraph`,value:`The experience begins in a neutral virtual environment where the participant can learn how to aim, draw, and release. Keeping the first interaction focused gives the learner a chance to understand the controls before the environment introduces a more demanding task.`},{type:`video`,src:Z(`archervr-precision-interaction-demo`),poster:X(`archervr-precision-interaction-demo`,`video-poster`),title:`ArcherVR project preview`},{type:`heading`,value:`Move From Practice to Challenge`},{type:`paragraph`,value:`After the initial lesson, the participant enters a target shooting scenario to apply those controls in a more concentrated setting. The shift turns a basic mechanic into an exercise in coordination, timing, and repeatable feedback.`},{type:`heading`,value:`What the Demo Explores`},{type:`paragraph`,value:`The project was developed as a Grayscale interaction study: a compact way to explore immersive instruction, precision control, and challenge based practice without overloading the participant with a broad interface or unrelated objectives.`},{type:`list`,items:[`Guided bow control instruction.`,`A focused target shooting challenge.`,`An internal study of precision oriented VR interaction.`]}]},es:{title:`ArcherVR: Demo de Interacción Orientada a la Precisión`,seoTitle:`Demo de Diseño de Interacción VR: ArcherVR | Grayscale`,excerpt:`Un demo interno de VR que enseña controles básicos de tiro con arco antes de llevar al participante a un reto concentrado de tiro al blanco.`,readTime:`Lectura de 3 min`,heroAlt:`Participante usando un arco virtual en un demo de tiro al blanco de precisión`,content:[{type:`paragraph`,value:`ArcherVR es un demo interno de interacción construido alrededor de una pregunta simple: ¿cómo puede una experiencia virtual enseñar una acción fÃsica precisa antes de pedirle al participante realizarla bajo presión? El resultado inicia con los controles esenciales del ar
3co y avanza hacia un reto de punterÃa concentrado.`},{type:`heading`,value:`Enseñar Primero la Interacción Central`},{type:`paragraph`,value:`La experiencia comienza en un entorno virtual neutro donde el participante puede aprender a apuntar, tensar y soltar. Mantener la primera interacción enfocada permite entender los controles antes de introducir una tarea más exigente.`},{type:`video`,src:Z(`archervr-precision-interaction-demo`),poster:X(`archervr-precision-interaction-demo`,`video-poster`),title:`Vista previa del proyecto ArcherVR`},{type:`heading`,value:`Pasar de la Práctica al Reto`},{type:`paragraph`,value:`Después de la lección inicial, el participante entra a un escenario de tiro al blanco para aplicar esos controles en un entorno más concentrado. El cambio convierte una mecánica básica en un ejercicio de coordinación, tiempo y retroalimentación repetible.`},{type:`heading`,value:`Qué Explora el Demo`},{type:`paragraph`,value:`El proyecto se desarrolló como un estudio de interacción de Grayscale: una forma compacta de explorar instrucción inmersiva, control de precisión y práctica basada en retos sin sobrecargar al participante con una interfaz extensa u objetivos ajenos.`},{type:`list`,items:[`Instrucción guiada de controles de tiro con arco.`,`Un reto concentrado de tiro al blanco.`,`Un estudio interno de interacción VR orientada a la precisión.`]}]}},{id:`bosch-production-line-vr-training`,slug:`bosch-production-line-vr-training`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`automotive`,`manufacturing`,`training`],datePublished:$,dateModified:$,author:`Grayscale Interactive`,hero:{src:X(`bosch-production-line-vr-training`,`hero`),width:1920,height:1080},en:{title:`Production Line VR Training for New Operators`,seoTitle:`Bosch Production Line VR Training | Grayscale`,excerpt:`A role based VR training experience for Bosch that introduces new production line employees to their work area, then evaluates the sequence independently.`,readTime:`4 min read`,heroAlt:`Virtual production workstation with safety points, tools, and material areas for assembly training`,content:[{type:`paragraph`,value:`New operators need more than a list of actions before they step onto a production line. This VR training experience introduces the workstation as a complete environmentâits layout, safety points, tools, and material areasâso the task has spatial context before the first shift begins.`},{type:`heading`,value:`Learn the Station Before the Line`},{type:`paragraph`,value:`Role specific modules let a learner enter the relevant work area without waiting for a production window. The virtual station recreates the elements that give each task its context and lets the sequence be examined before it must be carried out at pace.`},{type:`heading`,value:`Guide the Sequence, Then Let It Stand on Its Own`},{type:`paragraph`,value:`Tutorial mode uses narration, text, highlighted models, directional cues, and sound feedback to guide the procedure. When an action is incorrect, the learner receives a correction before continuing; assessment mode then replays the sequence without that guidance to evaluate accuracy.`},{type:`video`,src:Z(`bosch-production-line-vr-training`),poster:X(`bosch-production-line-vr-training`,`video-poster`),title:`Production line VR training preview`},{type:`heading`,value:`Leave a Useful Record`},{type:`paragraph`,value:`At the end of a module, the experience records errors and completion time alongside the trainee and supervising instructor. The goal is not simply a completed simulation, but a record that can support the next training conversation.`},{type:`list`,items:[`Role specific modules that can be started individually or as a group.`,`A virtual replica of the relevant workstation and safety context.`,`Tutorial and assessment modes with records for review.`]}]},es:{title:`Capacitación VR de LÃnea de Producción para Nuevos Operadores`,seoTitle:`Capacitación VR de LÃnea Bosch | Grayscale`,excerpt:`Una experiencia de capacitación VR por rol para Bosch que presenta a nuevos integrantes su área de trabajo y después evalúa la secuencia de forma independiente.`,readTime:`Lectura de 4 min`,heroAlt:`Estación virtual de producción con puntos de seguridad, herramientas y áreas de material para capacitación de ensamble`,content:[{type:`paragraph`,value:`Los nuevos operadores necesitan más que una lista de acciones antes de entrar a una lÃnea de producción. Esta experiencia VR presenta la estación como un entorno completoâsu distribución, puntos de seguridad, herramientas y áreas de materialâpara que la tarea tenga contexto espacial antes del primer turno.`},{type:`heading`,value:`Conocer la Estación Antes de Entrar a la LÃnea`},{type:`paragraph`,value:`Los módulos por rol permiten entrar al área de trabajo relevante sin esperar una ventana de producción. La estación virtual reproduce los elementos que dan contexto a cada tarea y permite examinar la secuencia antes de llevarla a cabo al ritmo de la lÃnea.`},{type:`heading`,value:`Guiar la Secuencia y Después Evaluarla`}
3,{type:`paragraph`,value:`El modo tutorial usa narración, texto, modelos resaltados, indicaciones direccionales y retroalimentación sonora para guiar el procedimiento. Cuando una acción es incorrecta, el usuario recibe una corrección antes de continuar; el modo evaluación repite la secuencia sin esa guÃa para valorar la precisión.`},{type:`video`,src:Z(`bosch-production-line-vr-training`),poster:X(`bosch-production-line-vr-training`,`video-poster`),title:`Vista previa de capacitación VR de lÃnea de producción`},{type:`heading`,value:`Conservar un Registro Ãtil`},{type:`paragraph`,value:`Al terminar un módulo, la experiencia registra errores y tiempo de finalización junto con el usuario y su instructor. El objetivo no es solo una simulación completada, sino un registro que pueda respaldar la siguiente conversación de capacitación.`},{type:`list`,items:[`Módulos por rol que pueden iniciarse de forma individual o agrupada.`,`Una réplica virtual de la estación y su contexto de seguridad.`,`Modos de tutorial y evaluación con registros para revisión.`]}]}},{id:`road-2-vr-vehicle-maintenance-onboarding`,slug:`road-2-vr-vehicle-maintenance-onboarding`,kind:`case-study`,publicationStatus:`ready`,category:`vr`,industries:[`automotive`,`training`],datePublished:$,dateModified:$,author:`Grayscale Interactive`,hero:{src:X(`road-2-vr-vehicle-maintenance-onboarding`,`hero`),width:1920,height:1080},en:{title:`Road 2 VR: Learn VR Through Vehicle Repair`,seoTitle:`ETAS Vehicle Repair VR Onboarding | Grayscale`,excerpt:`A VR onboarding experience for ETAS that teaches basic navigation before a guided vehicle fuse replacement procedure.`,readTime:`4 min read`,heroAlt:`Virtual vehicle maintenance workstation with a multimeter and components for a fuse replacement task`,content:[{type:`paragraph`,value:`Road 2 VR starts with the medium itself. Before a participant is asked to perform a technical procedure, the experience uses a short narrative and guided companion to teach the basic controls needed to move through a virtual space with confidence.`},{type:`heading`,value:`Start With the Medium`},{type:`paragraph`,value:`The opening interaction establishes navigation, orientation, and the rhythm of the experience. That introductory moment lowers the barrier to the technical task that follows, so the first simulation can focus on the procedure rather than the unfamiliarity of the headset.`},{type:`image`,src:X(`road-2-vr-vehicle-maintenance-onboarding`,`gallery-workstation`),width:1920,height:1080,alt:`Virtual vehicle maintenance workstation used in the Road 2 VR experience`,caption:`A familiar technical task gives a first VR experience a practical purpose.`},{type:`heading`,value:`Use a Real Vehicle Problem to Build Confidence`},{type:`paragraph`,value:`At the workstation, the participant identifies a damaged vehicle fuse and follows the procedure with a multimeter, the required equipment, and the materials for the task. The practical context gives each interaction a clear reason to exist.`},{type:`video`,src:Z(`road-2-vr-vehicle-maintenance-onboarding`),poster:X(`road-2-vr-vehicle-maintenance-onboarding`,`video-poster`),title:`Road 2 VR project preview`},{type:`heading`,value:`Make the First Simulation Useful`},{type:`paragraph`,value:`The sequence ends when the user completes the process to replace the fuse and restore the horn. It offers future trainees a useful first encounter with VR before later simulations introduce more specialised work.`},{type:`list`,items:[`Basic VR navigation taught through a guided introduction.`,`A vehicle fuse diagnosis task using a multimeter.`,`A complete procedure from identifying the fault to replacing the fuse.`]}]},es:{title:`Road 2 VR: Aprende VR con una Reparación de VehÃculo`,seoTitle:`Onboarding VR de Reparación para ETAS | Grayscale`,excerpt:`Una experiencia de introducción a la VR para ETAS que enseña navegación básica antes de pasar a un procedimiento guiado de reemplazo de fusible.`,readTime:`Lectura de 4 min`,heroAlt:`Estación virtual de mantenimiento vehicular con multÃmetro y componentes para una tarea de reemplazo de fusible`,content:[{type:`paragraph`,value:`Road 2 VR empieza por el propio medio. Antes de pedirle a una persona realizar un procedimiento técnico, la experiencia usa una narrativa breve y un acompañante guiado para enseñar los controles básicos necesarios para desplazarse con confianza en un espacio virtual.`},{type:`heading`,value:`Empezar por el Medio`},{type:`paragraph`,value:`La interacción inicial establece navegación, orientación y el ritmo de la experiencia. Ese momento reduce la barrera para la tarea técnica que sigue, para que la primera simulación se concentre en el procedimiento y no en la novedad del visor.`},{type:`image`,src:X(`road-2-vr-vehicle-maintenance-onboarding`,`gallery-workstation`),width:1920,height:1080,alt:`Estación virtual de mantenimiento vehicular usada en la experiencia Road 2 VR`,caption:`Una tarea técnica conocida da a la primera experiencia en VR un propósito práctico.`},{type:`heading`,value:`Usar un Problema Real de VehÃculo para Generar Confianza`},{type:`paragraph`,value:`En la estación de trabajo, el participante identifica un fusible dañado y sigue el procedimiento con un multÃmetro, el equipo requerido y los materiales de la tarea. El contexto práctico da a cada interacción una razón clara de existir.`},{type:`video`,src:Z(`road-2-vr-vehicle-maintenance-onboarding`),poster:X(`road-2-vr-vehicle-maintenance-onboarding`,`video-poster`),title:`Vista previa del proyecto Road 2 VR`},{type:`heading`,value:`Hacer Ãtil la Primera Simulación`},{type:`paragraph`,value:`La secuencia termina cuando el usuario completa el proceso para reemplazar el fusible y restablecer el claxon. Es un primer acercamiento útil a la VR antes de que futuras simulaciones introduzcan trabajo más especializado.`},{type:`list`,items:[`Navegación básica en VR mediante una introducción guiada.`,`Diagnóstico de fusible vehicular con multÃmetro.`,`Un procedimiento completo desde identificar la falla hasta reemplazar el fusible.`]}]}}],pi=fi.filter(e=>e.publicationStatus===`ready`)}));export{zn as $,Ir as A,hr as B,br as C,Dr as D,Mr as E,Ar as F,ar as G,ir as H,wr as I,er as J,$n as K,Tr as L,Cr as M,Nr as N,Er as O,Fr as P,Wn as Q,Or as R,yr as S,xr as T,dr as U,_r as V,rr as W,Hn as X,Un as Y,Jn as Z,Vr as _,ci as a,ke as at,kr as b,ti as c,Gr as d,At as et,Kr as f,Wr as g,Hr as h,si as i,E as it,Sr as j,Pr as k,Qr as l,Yr as m,mi as n,Ye as nt,ri as o,f as ot,Jr as p,tr as q,pi as r,Ze as rt,oi as s,ui as t,Je as tt,qr as u,Rr as v,jr as w,vr as x,Br as y,Lr as z};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.