class-studys 7.0.2 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.well-known/discord +1 -0
  2. package/21fn9e.js +54 -0
  3. package/README.md +25 -0
  4. package/assets/AccountPage-DmlYaBSE-8068ec8f.js +1 -0
  5. package/assets/AccountPage-fg4fizGa-8068ec8f.css +1 -0
  6. package/assets/AiPage-CTjB7gWo-8068ec8f.css +1 -0
  7. package/assets/AiPage-CbTtOj3W-8068ec8f.js +18 -0
  8. package/assets/DarkVeil-CC-BBhGo-8068ec8f.js +69 -0
  9. package/assets/GamesPage--YRYDVtw-8068ec8f.css +1 -0
  10. package/assets/GamesPage-D-HV0rpM-8068ec8f.js +1 -0
  11. package/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  12. package/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  13. package/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  14. package/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  15. package/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  16. package/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  17. package/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  18. package/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  19. package/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  20. package/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  21. package/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  22. package/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  23. package/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  24. package/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  25. package/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  26. package/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  27. package/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  28. package/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  29. package/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  30. package/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  31. package/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  32. package/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  33. package/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  34. package/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  35. package/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  36. package/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  37. package/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  38. package/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  39. package/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  40. package/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  41. package/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  42. package/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  43. package/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  44. package/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  45. package/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  46. package/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  47. package/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  48. package/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  49. package/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  50. package/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  51. package/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  52. package/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  53. package/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  54. package/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  55. package/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  56. package/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  57. package/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  58. package/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  59. package/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  60. package/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  61. package/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  62. package/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  63. package/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  64. package/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  65. package/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  66. package/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  67. package/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  68. package/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  69. package/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  70. package/assets/PlusPage-DBE836ej-8068ec8f.js +1 -0
  71. package/assets/PlusPage-vOvT9Zss-8068ec8f.css +1 -0
  72. package/assets/SettingsPage-CsV-N8Y0-8068ec8f.js +1 -0
  73. package/assets/boot-D3vqjHTs-8068ec8f.js +1 -0
  74. package/assets/fingerprint-Y5nV5FVa-8068ec8f.js +4 -0
  75. package/assets/index-COUSXtyQ-8068ec8f.js +3 -0
  76. package/assets/index-D4-Q3uqd-8068ec8f.css +1 -0
  77. package/assets/markdown-BtlGIx_H-8068ec8f.js +291 -0
  78. package/assets/markdown-dIRGbAJA-8068ec8f.css +1 -0
  79. package/assets/motion-B1hdS1Lc-8068ec8f.js +9 -0
  80. package/assets/ogl-BWe_HKY6-8068ec8f.js +1 -0
  81. package/assets/proxy-runtime-hRo6K69j-8068ec8f.js +13 -0
  82. package/assets/react-BNEptbwn-8068ec8f.js +49 -0
  83. package/assets/settings-page-B-LiQw8a-8068ec8f.css +1 -0
  84. package/assets/verity-mini-DjLHPujK.png +0 -0
  85. package/branding/ignite-os-browser-834cc7f9f1eda4fb.png +0 -0
  86. package/branding/ignite-os-browser-spooky-805a89482927bc04.png +0 -0
  87. package/branding/ignite-os-browser-spooky-no-drips-52ef55ca90dacae1.png +0 -0
  88. package/equ4q/67140b.js +2 -0
  89. package/equ4q/8tzsxm.js +41 -0
  90. package/equ4q/datyqq.js +2 -0
  91. package/favicon.svg +8 -0
  92. package/ignite-ember.css +237 -0
  93. package/index.html +29 -942
  94. package/index.svg +36 -0
  95. package/jr1n9/4m74rv.js +31 -0
  96. package/jr1n9/cw3zk6.wasm +0 -0
  97. package/logo.svg +36 -0
  98. package/package.json +25 -63
  99. package/privacy.html +113 -0
  100. package/release-manifest.json +1 -0
  101. package/release.json +1 -0
  102. package/study.html +29 -0
  103. package/terms.html +96 -0
@@ -0,0 +1,41 @@
1
+ var _u806vei;(()=>{var e={286(e,t,r){r.d(t,{I:()=>o});let o=Symbol.for("controller frame handle")},355(e,t,r){r.d(t,{O:()=>s,x:()=>o});let o="0.0.14";function s(){if("undefined"==typeof _dln2p7n)throw Error("_mci54rtqy3is_mci54rtqy3i is not loaded. Load _6p7n1ah before the controller.");var e="2.0.67-alpha.2",t=_dln2p7n.versionInfo.version;if(e!==t)throw Error(`_mci54rtqy3is_mci54rtqy3i version mismatch: this build expects ${e}, but the loaded runtime is ${t}`)}},805(e,t,r){r.d(t,{C:()=>o});class o{methods;id;sendRaw;counter=0;promiseCallbacks=new Map;constructor(e,t,r){this.methods=e,this.id=t,this.sendRaw=r}recieve(e){if(null==e||"object"!=typeof e)return;let t=e[this.id];if(null==t||"object"!=typeof t)return;let r=t.$type;if("response"===r){let e=t.$token,r=t.$data,o=t.$error,s=this.promiseCallbacks.get(e);if(!s)return;this.promiseCallbacks.delete(e),void 0!==o?s.reject(Error(o)):s.resolve(r)}else if("request"===r){let e=t.$method,r=t.$args;this.methods[e](r).then(e=>{this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$data:e?.[0]}},e?.[1])}).catch(e=>{console.error(e),this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$error:e?.toString()||"Unknown error"}},[])})}}call(e,t,r=[]){let o=this.counter++;return new Promise((s,i)=>{this.promiseCallbacks.set(o,{resolve:s,reject:i}),this.sendRaw({[this.id]:{$type:"request",$method:e,$args:t,$token:o}},r)})}}},986(e){let t=Object.getPrototypeOf({});function r(){return function(e){return"object"==typeof e&&null!==e&&!(e instanceof RegExp)&&!(e instanceof Date)}}function o(e){function o(e){return"constructor"!==e&&"prototype"!==e&&"__proto__"!==e}let s=Object.prototype.propertyIsEnumerable,i=e?.symbols?function(e){let t=Object.keys(e),r=Object.getOwnPropertySymbols(e);for(let o=0,i=r.length;o<i;++o)s.call(e,r[o])&&t.push(r[o]);return t}:Object.keys,n="function"==typeof e?.cloneProtoObject?e.cloneProtoObject:void 0,a="function"==typeof e?.isMergeableObject?e.isMergeableObject:r(),c=e?.onlyDefinedProperties===!0,l=e&&"function"==typeof e.mergeArray?e.mergeArray({clone:d,deepmerge:h,getKeys:i,isMergeableObject:a}):function(e,t){let r=e.length,o=t.length,s=0,i=Array(r+o);for(;s<r;++s)i[s]=d(e[s]);for(s=0;s<o;++s)i[s+r]=d(t[s]);return i};function d(e){return a(e)?Array.isArray(e)?function(e){let t=0,r=e.length,o=Array(r);for(;t<r;++t)o[t]=d(e[t]);return o}(e):function(e){let r,s,a,c={};if(n&&Object.getPrototypeOf(e)!==t)return n(e);let l=i(e);for(r=0,s=l.length;r<s;++r)o(a=l[r])&&(c[a]=d(e[a]));return c}(e):e}function h(e,r){if(c&&void 0===r)return d(e);let s=Array.isArray(r),f=Array.isArray(e);return"object"!=typeof r||null===r?r:a(e)?s&&f?l(e,r):s!==f?d(r):function(e,r){let s,l,f,p={},u=i(e),y=i(r);for(s=0,l=u.length;s<l;++s)o(f=u[s])&&-1===y.indexOf(f)&&(p[f]=d(e[f]));for(s=0,l=y.length;s<l;++s)if(o(f=y[s]))if(f in e)-1!==u.indexOf(f)&&(n&&a(r[f])&&Object.getPrototypeOf(r[f])!==t?p[f]=n(r[f]):p[f]=h(e[f],r[f]));else{if(c&&void 0===r[f])continue;p[f]=d(r[f])}return p}(e,r):d(r)}return e?.all?function(){let e;switch(arguments.length){case 0:return{};case 1:return d(arguments[0]);case 2:return h(arguments[0],arguments[1])}for(let t=0,r=arguments.length;t<r;++t)e=h(e,arguments[t]);return e}:h}e.exports=o,e.exports.default=o,e.exports.deepmerge=o,Object.defineProperty(e.exports,"isMergeableObject",{get:r})},235(e,t,r){r.d(t,{Sr:()=>s}),WebSocket.CLOSED,WebSocket.CONNECTING,WebSocket.OPEN,EventTarget;let o=[101,204,205,304];class s extends Response{url;rawHeaders;redirected=!1;static fromTransferrableResponse(e,t){let r=new s(o.includes(e.status)?void 0:e.body,{headers:new Headers(e.headers),status:e.status,statusText:e.statusText});return r.url=t,r.redirected=e.status>=300&&e.status<400&&void 0!==e.headers.location,r.rawHeaders=e.headers,r}static fromNativeResponse(e){let t=new s(o.includes(e.status)?void 0:e.body,{headers:e.headers,status:e.status,statusText:e.statusText});return t.url=e.url,t.rawHeaders=[...e.headers],t.redirected=e.redirected,t}}},423(e,t,r){r.d(t,{Cx:()=>p,Oy:()=>G,cP:()=>s,ht:()=>z,k_:()=>n,mK:()=>d,sb:()=>y,uh:()=>f});let{BareResponse:o,CookieJar:s,IncrementalHtmlRewriter:i,Plugin:n,_cyjjhzkhpv6k_:a,_pa224o0785iz_pa22:c,_2czy428eent4_:l,_expwoox5qk5q_expwoo:d,_3u4crmf09z2g_3u4crmf09z2g:h,_bnhge3scjomf_b:f,Tap:p,createLocationProxy:u,defaultConfig:y,defaultConfigDev:m,flagEnabled:g,getOwnPropertyDescriptorHandler:w,getRewriter:k,getScriptBlockTypeString:b,htmlRules:j,isArchiveMimeType:S,isAudioOrVideoMimeType:v,isFontMimeType:C,isHtmlMimeType:x,isImageMimeType:$,isInlineDisplayableMimeType:P,isJavascriptMimeType:O,isJavascriptMimeTypeEssenceMatch:R,isModuleScriptType:A,isScriptType:E,isScriptableMimeType:U,isXmlMimeType:M,isZipBasedMimeType:W,isdedicated:T,isshared:D,issw:I,iswindow:L,isworker:N,parseMimeType:_,rewriteBlob:J,rewriteCss:H,rewriteHtml:q,rewriteJs:F,rewriteJsInner:B,rewriteSrcset:K,rewriteUrl:G,rewriteWorkers:V,setWasm:z,unrewriteBlob:Q,unrewriteCss:X,unrewriteHtml:Y,unrewriteUrl:Z,versionInfo:ee}=globalThis._dln2p7n}},t={};function r(o){var s=t[o];if(void 0!==s)return s.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{r.r(o),r.d(o,{Controller:()=>S,Frame:()=>v,ManagedPlugin:()=>d,VERSION:()=>a.x,assertRuntimeScramjetVersion:()=>a.O,config:()=>c});var e=r(805),t=r(235),s=r(986),i=r(423),n=r(286),a=r(355);let c={prefix:"/~/sj/",_6p7n1ahPath:"/_6p7n1ah/_6p7n1ah.js",injectPath:"/controller/controller.inject.js",wasmPath:"/_6p7n1ah/_6p7n1ah.wasm",virtualWasmPath:"_6p7n1ah.wasm.js",codec:{encode:e=>e?encodeURIComponent(e):e,decode:e=>e?decodeURIComponent(e):e}},l={flags:{...i.sb.flags,allowFailedIntercepts:!0},maskedfiles:["inject.js","_6p7n1ah.wasm.js"]};class d extends i.k_{frame=null;dependencies=[];constructor(e,t){super(e),this.dependencies=t}install(e){this.frame=e}}let h="state",f="cookies",p=null;function u(e){return"object"==typeof e&&null!==e&&"number"==typeof e.updatedAt&&Number.isFinite(e.updatedAt)&&"string"==typeof e.cookies?e:null}function y(e){return new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error??Error("IndexedDB request failed"))})}function m(e){return new Promise((t,r)=>{e.oncomplete=()=>t(),e.onabort=()=>r(e.error??Error("IndexedDB transaction aborted")),e.onerror=()=>r(e.error??Error("IndexedDB transaction failed"))})}function g(){return p||(p=new Promise((e,t)=>{let r=indexedDB.open("__7ffqz1mrkgz_27ffqz1",1);r.onupgradeneeded=()=>{let e=r.result;e.objectStoreNames.contains(h)||e.createObjectStore(h)},r.onsuccess=()=>e(r.result),r.onerror=()=>t(r.error??Error("Failed to open cookie database"))}))}async function w(){try{let e=(await g()).transaction(h,"readonly"),t=e.objectStore(h),r=await y(t.get(f));return await m(e),u(r)}catch(e){return console.error("Failed to read persisted controller cookies:",e),null}}async function k(e,t){try{let r=(await g()).transaction(h,"readwrite"),o=r.objectStore(h),s=u(await y(o.get(f))),i=Math.max(Date.now(),t+1,(s?.updatedAt??0)+1);return o.put({updatedAt:i,cookies:e},f),await m(r),i}catch(e){return console.error("Failed to persist controller cookies:",e),t}}function b(){return Math.random().toString(36).substring(2,10)}let j=(0,s.deepmerge)();class S{init;id;config;_6p7n1ahConfig;prefix;cookieJar=new i.cP;frames=[];serviceWorkerController;guardServiceWorkerRevive=!0;ready;readyResolve;isReady=!1;rpc;port=null;transport;cookieUpdatedAt=0;cookieSyncPromise=null;cookieSyncDirty=!0;cookieSyncChannel=new BroadcastChannel("__em1woh0axqg_fem1woh0axqg_fe");wasmAlreadyFetched=!1;wasmPayload=null;onTabChannelMessage=e=>{this.rpc.recieve(e.data)};onCookieSyncMessage=e=>{let t="object"==typeof e.data&&null!==e.data?e.data.updatedAt:void 0;"number"!=typeof t||t<=this.cookieUpdatedAt||(this.cookieSyncDirty=!0,this.loadSavedCookies())};async loadScramjetWasm(){if(this.wasmAlreadyFetched)return;let e=await fetch(this.config.wasmPath);(0,i.ht)(await e.arrayBuffer()),this.wasmAlreadyFetched=!0}methods={ready:async()=>{this.readyResolve(),setTimeout(()=>{this.guardServiceWorkerRevive=!1},5e3)},request:async e=>{let t=new URL(e.rawUrl).pathname,r=this.frames.find(e=>t.startsWith(e.prefix));if(!r)throw Error("No frame found for request");try{if(await this.loadSavedCookies(),t===r.prefix+this.config.virtualWasmPath){if(!this.wasmPayload){let e=await fetch(this.config.wasmPath),t=await e.arrayBuffer(),r=btoa(new Uint8Array(t).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""));this.wasmPayload=`self.WASM = '${r}';`}return[{body:this.wasmPayload,status:200,statusText:"OK",headers:[["Content-Type","application/javascript"]]},[]]}let o=i.uh.fromRawHeaders(e.initialHeaders),s=await r.fetchHandler.handleFetch({initialHeaders:o,rawClientUrl:e.rawClientUrl?new URL(e.rawClientUrl):void 0,rawUrl:new URL(e.rawUrl),rawReferrer:e.rawReferrer,rawDestination:e.destination,method:e.method,mode:e.mode,referrer:e.referrer,body:e.body,cache:e.cache,clientId:e.clientId});return[{body:s.body,status:s.status,statusText:s.statusText,headers:s.headers.toRawHeaders()},s.body instanceof ReadableStream||s.body instanceof ArrayBuffer?[s.body]:[]]}catch(o){let t={setResponse:void 0,suppressError:!1};if(await i.Cx.dispatch(r.hooks.error.request,{rawrequest:e,error:o},t),t.suppressError||console.error("Error in controller request handler:",o),t.setResponse)return[t.setResponse,[]];throw o}},initRemoteTransport:async t=>{let r=new e.C({request:async({remote:e,method:t,body:r,headers:o})=>{let s=await this.transport.request(new URL(e),t,r,o,void 0);return[s,[s.body]]},sendSetCookie:async({cookies:e,options:t})=>{await this.loadSavedCookies(!0),t?.clear&&this.cookieJar.clear(),this.applyCookieSyncEntries(e),await this.persistCookies(),await this.propagateCookieSync(e,t)},connect:async({url:e,protocols:t,requestHeaders:r,port:o})=>{let s,i=new Promise(e=>s=e),[n,a]=this.transport.connect(new URL(e),t,r,(e,t)=>{s({result:"success",protocol:e,extensions:t})},e=>{o.postMessage({type:"data",data:e},e instanceof ArrayBuffer?[e]:[])},(e,t)=>{o.postMessage({type:"close",code:e,reason:t})},e=>{s({result:"failure",error:e})});return o.onmessageerror=e=>{console.error("Transport port messageerror (this should never happen!)",e)},o.onmessage=({data:e})=>{"data"===e.type?n(e.data):"close"===e.type&&a(e.code,e.reason)},[await i,[]]}},"transport",(e,r)=>t.postMessage(e,r));t.onmessageerror=e=>{console.error("Transport port messageerror (this should never happen!)",e)},t.onmessage=e=>{r.recieve(e.data)},r.call("ready",void 0,[])}};constructor(t){this.init=t,(0,a.O)(),this.id=b(),this.config=j(c,t.config||{}),this._6p7n1ahConfig=j(l,i.sb),this._6p7n1ahConfig=j(this._6p7n1ahConfig,t._6p7n1ahConfig||{}),this.prefix=this.config.prefix+this.id+"/",this.serviceWorkerController=t.serviceworker,this.ready=Promise.all([new Promise(e=>{this.readyResolve=e}),this.loadScramjetWasm(),this.loadSavedCookies(!0)]).then(()=>void 0),this.rpc=new e.C(this.methods,"tabchannel-"+this.id,(e,t)=>{if(!this.port)throw Error("Port not found");this.port.postMessage(e,t)}),this.transport=t.transport,this.cookieSyncChannel.addEventListener("message",this.onCookieSyncMessage),this.setupMessagePort(),navigator.serviceWorker.addEventListener("message",e=>{if(e.data?.$controller$setCookie&&"object"==typeof e.data.$controller$setCookie){let t=e.data.$controller$setCookie;t.options?.clear&&this.cookieJar.clear(),this.applyCookieSyncEntries(t.cookies),"string"==typeof t.id&&this.serviceWorkerController.postMessage({$sw$setCookieDone:{id:t.id}});return}if(e.data.$controller$swrevive){if(this.guardServiceWorkerRevive)return;this.setupMessagePort()}})}setupMessagePort(){if(this.port){this.port.removeEventListener("message",this.onTabChannelMessage);try{this.port.close()}catch{}this.port=null}let e=new MessageChannel;this.port=e.port1,this.port.addEventListener("message",this.onTabChannelMessage),this.port.start(),this.serviceWorkerController.postMessage({$controller$init:{prefix:this.prefix,id:this.id}},[e.port2])}applyCookieSyncEntries(e){if(Array.isArray(e))for(let t of e)"string"==typeof t?.url&&"string"==typeof t.cookie&&this.cookieJar.setCookies(t.cookie,new URL(t.url))}async propagateCookieSync(e,t={}){this.port&&await this.rpc.call("sendSetCookie",{cookies:e,options:t})}async loadSavedCookies(e=!1){if(e||this.cookieSyncDirty)return this.cookieSyncPromise||(this.cookieSyncPromise=(async()=>{let e=await w();e&&e.updatedAt>this.cookieUpdatedAt&&(this.cookieJar.load(e.cookies),this.cookieUpdatedAt=e.updatedAt),this.cookieSyncDirty=!1})().finally(()=>{this.cookieSyncPromise=null})),this.cookieSyncPromise}async persistCookies(){let e=await k(this.cookieJar.dump(),this.cookieUpdatedAt);e<=this.cookieUpdatedAt||(this.cookieUpdatedAt=e,this.cookieSyncDirty=!1,this.cookieSyncChannel.postMessage({updatedAt:e}))}setTransport(e){for(let t of(this.transport=e,this.frames))t.controller.transport=e,t.fetchHandler.client.transport=e}createFrame(e,t={}){if(!this.ready)throw Error("Controller is not ready! Try awaiting controller.wait()");let r=new v(this,e??=document.createElement("iframe"),t);return this.frames.push(r),r}async wait(){await this.ready}}class v{controller;element;options;id;prefix;fetchHandler;hooks;get context(){return{config:this.controller._6p7n1ahConfig,prefix:new URL(this.prefix,location.href),cookieJar:this.controller.cookieJar,interface:{getInjectScripts:function e(t,r,o,s,i,n){return(a,c,l,d)=>{var h;return[d(t._6p7n1ahPath),d(o.href+t.virtualWasmPath),d(t.injectPath),d("data:text/javascript;charset=utf-8;base64,"+(h=`
2
+ document.querySelectorAll("script[_n1i1sqz7a5f0_n1i]").forEach(script => script.remove());
3
+ _u806vei.load({
4
+ config: ${JSON.stringify(t)},
5
+ sjconfig: ${JSON.stringify(r)},
6
+ prefix: new URL("${o.href}"),
7
+ cookies: ${JSON.stringify(s.dump())},
8
+ yieldGetInjectScripts: ${e.toString()},
9
+ codecEncode: ${i.toString()},
10
+ codecDecode: ${n.toString()},
11
+ initHeaders: ${JSON.stringify(l.headers??[])},
12
+ history: ${JSON.stringify(l.history??[])},
13
+ })
14
+ `,btoa(new TextEncoder().encode(h).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""))))]}}(this.controller.config,this.controller._6p7n1ahConfig,new URL(this.prefix,location.href),this.controller.cookieJar,this.controller.config.codec.encode,this.controller.config.codec.decode),getWorkerInjectScripts:(e,t,r)=>{var o;let s="";return s+=r(this.controller.config._6p7n1ahPath),s+=r(this.prefix+this.controller.config.virtualWasmPath),s+=r("data:text/javascript;charset=utf-8;base64,"+(o=`
15
+ (()=>{
16
+ const { _2czy428eent4_, CookieJar, setWasm } = _dln2p7n;
17
+
18
+ setWasm(Uint8Array.from(atob(self.WASM), (c) => c.charCodeAt(0)));
19
+ delete self.WASM;
20
+
21
+ const sjconfig = ${JSON.stringify(this.controller._6p7n1ahConfig)};
22
+ const prefix = new URL("${this.prefix}", location.href);
23
+
24
+ const context = {
25
+ config: sjconfig,
26
+ prefix,
27
+ interface: {
28
+ codecEncode: ${this.controller.config.codec.encode.toString()},
29
+ codecDecode: ${this.controller.config.codec.decode.toString()},
30
+ },
31
+ };
32
+
33
+ const client = new _2czy428eent4_(globalThis, {
34
+ context,
35
+ transport: null,
36
+ });
37
+
38
+ client.hook();
39
+ })();
40
+ `,btoa(new TextEncoder().encode(o).reduce((e,t)=>(e.push(String.fromCharCode(t)),e),[]).join(""))))},codecEncode:this.controller.config.codec.encode,codecDecode:this.controller.config.codec.decode}}}plugins=[];constructor(e,r,o={}){for(const s of(this.controller=e,this.element=r,this.options=o,this.id=b(),this.prefix=this.controller.prefix+this.id+"/",this.fetchHandler=new i.mK({crossOriginIsolated:self.crossOriginIsolated,context:this.context,transport:e.transport,async sendSetCookie(t,r){await e.persistCookies(),await e.propagateCookieSync(t.map(({url:e,cookie:t})=>({url:e.href,cookie:t})),r)},fetchBlobUrl:async e=>t.Sr.fromNativeResponse(await fetch(e)),fetchDataUrl:async e=>t.Sr.fromNativeResponse(await fetch(e))}),this.hooks={fetch:this.fetchHandler.hooks.fetch,init:i.Cx.create(),error:i.Cx.create()},r[n.I]=this,this.plugins=o.plugins??[],this.plugins)){for(const e of s.dependencies)if(!this.plugins.find(t=>t.name===e))throw Error(`Dependency ${e} not found for plugin ${s.name}`);s.install(this)}}getPlugin(e){let t=this.plugins.find(t=>t.name===e);if(!t)throw Error(`Plugin ${e} not found`);return t}back(){this.element.contentWindow?.history.back()}forward(){this.element.contentWindow?.history.forward()}reload(){this.element.contentWindow?.location.reload()}go(e){let t=(0,i.Oy)(e,this.context,{origin:new URL(location.href),base:new URL(location.href)});this.element.src=t}}})(),_u806vei=o})();
41
+ //# sourceMappingURL=controller.api.js.map
@@ -0,0 +1,2 @@
1
+ var _u806vei;(()=>{var e={805(e,t,r){r.d(t,{C:()=>o});class o{methods;id;sendRaw;counter=0;promiseCallbacks=new Map;constructor(e,t,r){this.methods=e,this.id=t,this.sendRaw=r}recieve(e){if(null==e||"object"!=typeof e)return;let t=e[this.id];if(null==t||"object"!=typeof t)return;let r=t.$type;if("response"===r){let e=t.$token,r=t.$data,o=t.$error,s=this.promiseCallbacks.get(e);if(!s)return;this.promiseCallbacks.delete(e),void 0!==o?s.reject(Error(o)):s.resolve(r)}else if("request"===r){let e=t.$method,r=t.$args;this.methods[e](r).then(e=>{this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$data:e?.[0]}},e?.[1])}).catch(e=>{console.error(e),this.sendRaw({[this.id]:{$type:"response",$token:t.$token,$error:e?.toString()||"Unknown error"}},[])})}}call(e,t,r=[]){let o=this.counter++;return new Promise((s,i)=>{this.promiseCallbacks.set(o,{resolve:s,reject:i}),this.sendRaw({[this.id]:{$type:"request",$method:e,$args:t,$token:o}},r)})}}}},t={};function r(o){var s=t[o];if(void 0!==s)return s.exports;var i=t[o]={exports:{}};return e[o](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};(()=>{r.r(o),r.d(o,{route:()=>a,shouldRoute:()=>n});var e=r(805);let t={};addEventListener("message",e=>{if(e.data&&"object"==typeof e.data){if(e.data.$sw$setCookieDone&&"object"==typeof e.data.$sw$setCookieDone){let r=e.data.$sw$setCookieDone,o=t[r.id];o&&(o(),delete t[r.id])}if(e.data.$sw$initRemoteTransport&&"object"==typeof e.data.$sw$initRemoteTransport){let{port:t,prefix:r}=e.data.$sw$initRemoteTransport,o=i.find(e=>new URL(r).pathname.startsWith(e.prefix));if(!o)return void console.error("No relevant controller found for transport init");o.rpc.call("initRemoteTransport",t,[t])}}});class s{prefix;id;rpc;constructor(r,o,s){this.prefix=r,this.id=o,this.rpc=new e.C({sendSetCookie:async({cookies:e,options:r})=>{let o=await self.clients.matchAll(),s=[],i=[],n=r?.destination==="document"||r?.destination==="iframe";for(let a of o){let o=Math.random().toString(36).substring(2,10);s.push(o),a.postMessage({$controller$setCookie:{cookies:e,options:r,id:o}}),n||i.push(new Promise(e=>{t[o]=()=>e(o)}))}if(i.length>0){let r,n=!1,a=new Promise(i=>{r=setTimeout(()=>{if(!n){let r=s.filter(e=>void 0!==t[e]);console.error(`timed out waiting for set cookie response (deadlock?): cookies=${e.length} clients=${o.length} pending=${r.length}/${s.length} clientUrls=${o.map(e=>e.url).join(",")}`)}i()},1e3)});try{await Promise.race([a,Promise.any(i).then(()=>{n=!0}).catch(()=>{})])}finally{for(let e of(void 0!==r&&clearTimeout(r),s))delete t[e]}}}},"tabchannel-"+o,(e,t)=>{s.postMessage(e,t)}),s.onmessage=e=>{this.rpc.recieve(e.data)},s.onmessageerror=console.error,this.rpc.call("ready",void 0)}}let i=[];function n(e){let t=new URL(e.request.url);return void 0!==i.find(e=>t.pathname.startsWith(e.prefix))}async function a(e){try{let t=new URL(e.request.url),r=i.find(e=>t.pathname.startsWith(e.prefix)),o=await clients.get(e.clientId),s=[...e.request.headers],n=await r.rpc.call("request",{rawUrl:e.request.url,rawReferrer:e.request.referrer,destination:e.request.destination,mode:e.request.mode,referrer:e.request.referrer,method:e.request.method,body:e.request.body,cache:e.request.cache,forceCrossOriginIsolated:!1,initialHeaders:s,rawClientUrl:o?o.url:void 0,clientId:e.clientId||e.resultingClientId},e.request.body instanceof ReadableStream||e.request.body instanceof ArrayBuffer?[e.request.body]:void 0);return new Response(n.body,{status:n.status,statusText:n.statusText,headers:n.headers})}catch(e){return console.error("Service Worker error:",e),new Response("Internal Service Worker Error: "+e.message,{status:500})}}addEventListener("message",e=>{if(!e.data||"object"!=typeof e.data||!e.data.$controller$init||"object"!=typeof e.data.$controller$init)return;let t=e.data.$controller$init,r=i.findIndex(e=>e.id===t.id);-1!==r&&i.splice(r,1),i.push(new s(t.prefix,t.id,e.ports[0]))}),addEventListener("install",()=>{self.__requestWorkerActivation()}),addEventListener("activate",e=>{e.waitUntil(clients.claim())}),setTimeout(async()=>{for(let e of(console.log("service worker activated, notifying clients to revive"),await clients.matchAll()))e.postMessage({$controller$swrevive:{}})},100)})(),_u806vei=o})();
2
+ //# sourceMappingURL=controller.sw.js.map
package/favicon.svg ADDED
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
+ <g stroke="#f3f4f6" stroke-width="3.4" stroke-linecap="round">
3
+ <line x1="16" y1="5" x2="16" y2="27" />
4
+ <line x1="5" y1="16" x2="27" y2="16" />
5
+ <line x1="8.2" y1="8.2" x2="23.8" y2="23.8" />
6
+ <line x1="23.8" y1="8.2" x2="8.2" y2="23.8" />
7
+ </g>
8
+ </svg>
@@ -0,0 +1,237 @@
1
+ /* Ignite OS — Dark Ember · iOS 26 glass, restrained.
2
+ Near-black surfaces, hairline borders, ember used only as a quiet accent. */
3
+
4
+ :root, :root[data-theme=light], :root[data-theme=dark] {
5
+ --bg: #08080a;
6
+ --surface: color-mix(in srgb, #ffffff 4.5%, transparent);
7
+ --surface-2: color-mix(in srgb, #ffffff 7%, transparent);
8
+ --surface-3: color-mix(in srgb, #ffffff 10%, transparent);
9
+ --surface-solid: #131114;
10
+ --border: rgba(255, 255, 255, 0.07);
11
+ --border-2: rgba(255, 255, 255, 0.12);
12
+ --text: #ece7e3;
13
+ --muted: rgba(236, 231, 227, 0.62);
14
+ --muted-2: rgba(236, 231, 227, 0.38);
15
+ --accent: #c9703a;
16
+ --accent-contrast: #0c0807;
17
+ --mesh-base: #08080a;
18
+ --mesh-glow-1: #2a1209;
19
+ --mesh-glow-2: #1d0e09;
20
+ --mesh-glow-3: #140a08;
21
+ --radius: 18px;
22
+ --radius-sm: 13px;
23
+ --radius-xs: 9px;
24
+ --ember: #c9703a;
25
+ --ember-soft: #e0a27a;
26
+ --glass: linear-gradient(180deg, rgba(255,255,255,.065), rgba(255,255,255,.025));
27
+ --glass-hi: inset 0 1px 0 rgba(255,255,255,.07);
28
+ --font-round: ui-rounded, 'SF Pro Rounded', -apple-system, BlinkMacSystemFont, 'Geist Variable', system-ui, sans-serif;
29
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', 'Geist Variable', 'Segoe UI', system-ui, sans-serif;
30
+ color-scheme: dark;
31
+ }
32
+ body { background: #08080a; letter-spacing: -0.012em; -webkit-font-smoothing: antialiased; }
33
+ ::selection { background: rgba(201,112,58,.55); color: #fff; }
34
+
35
+ /* Calm the animated background into a faint ember haze */
36
+ .dark-veil-canvas, ._v4jfozk canvas { opacity: .34; filter: saturate(.75) brightness(.8); }
37
+ ._rx2al0e { background: radial-gradient(80% 60% at 50% 0%, rgba(0,0,0,0), rgba(8,8,10,.55)) !important; }
38
+
39
+ /* ---------- Glass surfaces ---------- */
40
+ ._gs5mofn {
41
+ background: linear-gradient(180deg, rgba(20,18,20,.72), rgba(12,11,13,.78)) !important;
42
+ -webkit-backdrop-filter: blur(30px) saturate(150%); backdrop-filter: blur(30px) saturate(150%);
43
+ border: 1px solid rgba(255,255,255,.07) !important;
44
+ box-shadow: var(--glass-hi), 0 18px 50px rgba(0,0,0,.55);
45
+ }
46
+ @media (min-width: 701px) {
47
+ ._gs5mofn { margin: 10px 0 10px 10px; height: calc(100% - 20px); border-radius: 26px; overflow: hidden; }
48
+ }
49
+
50
+ .sidebar-omnibox, .newtab-search-wrap form, ._25dnvc2 {
51
+ background: var(--glass) !important;
52
+ border: 1px solid rgba(255,255,255,.09) !important;
53
+ border-radius: 999px !important;
54
+ box-shadow: var(--glass-hi), 0 6px 22px rgba(0,0,0,.35);
55
+ -webkit-backdrop-filter: blur(24px) saturate(140%); backdrop-filter: blur(24px) saturate(140%);
56
+ }
57
+ .sidebar-omnibox:focus-within, ._25dnvc2:focus-within, ._25dnvc2.focused {
58
+ border-color: rgba(201,112,58,.55) !important;
59
+ box-shadow: var(--glass-hi), 0 0 0 3px rgba(201,112,58,.14), 0 6px 22px rgba(0,0,0,.35) !important;
60
+ }
61
+
62
+ .bookmark-tile {
63
+ border-radius: 16px !important;
64
+ background: linear-gradient(160deg, #26211f, #151214) !important;
65
+ border: 1px solid rgba(255,255,255,.08) !important; color: var(--ember-soft) !important;
66
+ font-family: var(--font-round); font-weight: 700;
67
+ box-shadow: var(--glass-hi), 0 6px 14px rgba(0,0,0,.4);
68
+ transition: transform .22s cubic-bezier(.3,1.4,.5,1), border-color .2s;
69
+ }
70
+ .bookmark-tile:hover { transform: translateY(-2px); border-color: rgba(201,112,58,.45) !important; }
71
+ .bookmark-tile.bookmark-add { background: var(--glass) !important; color: var(--muted) !important; }
72
+
73
+ .new-tab, ._u1z2hr2, .tab-item, ._1lqv40d { border-radius: 13px !important; transition: background .2s, transform .15s; }
74
+ .new-tab:hover, ._u1z2hr2:hover, .tab-item:hover, ._1lqv40d:hover { background: rgba(255,255,255,.07) !important; }
75
+ .new-tab:active, ._u1z2hr2:active, ._1lqv40d:active { transform: scale(.97); }
76
+ .tab-item.active {
77
+ background: linear-gradient(180deg, rgba(201,112,58,.2), rgba(201,112,58,.09)) !important;
78
+ border: 1px solid rgba(201,112,58,.32); color: #f3e4d8;
79
+ }
80
+
81
+ .modal, .backend-unavailable-modal {
82
+ background: linear-gradient(180deg, rgba(24,21,23,.94), rgba(14,12,14,.96)) !important;
83
+ border: 1px solid rgba(255,255,255,.09) !important; border-radius: 26px !important;
84
+ box-shadow: var(--glass-hi), 0 28px 80px rgba(0,0,0,.7);
85
+ -webkit-backdrop-filter: blur(30px); backdrop-filter: blur(30px);
86
+ }
87
+ .backend-unavailable-backdrop, ._t97drno { -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); background: rgba(4,4,5,.6); }
88
+ .plus-perks-toast {
89
+ background: linear-gradient(180deg, rgba(26,23,25,.9), rgba(16,14,16,.92)) !important; border: 1px solid rgba(255,255,255,.09) !important; border-radius: 22px !important;
90
+ box-shadow: var(--glass-hi), 0 14px 40px rgba(0,0,0,.55);
91
+ -webkit-backdrop-filter: blur(26px); backdrop-filter: blur(26px);
92
+ }
93
+ .plus-perks-toast-cta, .backend-unavailable-modal button {
94
+ border-radius: 999px !important; font-weight: 600;
95
+ background: linear-gradient(180deg, #b8653a, #8e4624) !important; color: #fff6ee !important;
96
+ border: 1px solid rgba(255,255,255,.12) !important; box-shadow: inset 0 1px 0 rgba(255,255,255,.18);
97
+ }
98
+ .discord-link { border-radius: 999px !important; background: var(--glass) !important; border: 1px solid rgba(255,255,255,.08) !important;
99
+ -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); }
100
+
101
+ button, input, select, textarea { font-family: inherit; }
102
+ button:focus-visible { outline: 2px solid rgba(201,112,58,.7); outline-offset: 2px; }
103
+
104
+ /* ---------- Ignite OS home screen ---------- */
105
+ .ignite-home { align-items: flex-start !important; padding: clamp(18px, 4vw, 44px) !important; }
106
+ .ignite-home:before { background: radial-gradient(70% 45% at 50% 0%, rgba(201,112,58,.08), transparent 70%) !important; }
107
+ .ignite-os-home { margin: auto !important; max-width: 740px !important; gap: 20px !important; align-items: stretch !important; }
108
+
109
+ .ignite-hero {
110
+ position: relative; overflow: hidden; padding: 28px 32px; border-radius: 32px;
111
+ display: flex; flex-direction: column; gap: 2px;
112
+ background: linear-gradient(160deg, rgba(201,112,58,.14) 0%, rgba(255,255,255,.04) 45%, rgba(255,255,255,.02) 100%);
113
+ border: 1px solid rgba(255,255,255,.08);
114
+ box-shadow: var(--glass-hi), 0 16px 48px rgba(0,0,0,.5);
115
+ -webkit-backdrop-filter: blur(30px) saturate(140%); backdrop-filter: blur(30px) saturate(140%);
116
+ }
117
+ .ignite-hero:before { content: ''; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
118
+ background: radial-gradient(110% 60% at 15% -15%, rgba(255,255,255,.09), transparent 55%); }
119
+ .ignite-brand { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; position: relative; }
120
+ .ignite-flame {
121
+ width: 40px; height: 40px; border-radius: 13px; display: grid; place-items: center;
122
+ background: linear-gradient(160deg, #2b2421, #141113);
123
+ border: 1px solid rgba(201,112,58,.35);
124
+ box-shadow: var(--glass-hi), 0 0 18px rgba(201,112,58,.18);
125
+ }
126
+ .ignite-flame svg { width: 22px; height: 22px; fill: var(--ember); }
127
+ .ignite-wordmark { margin: 0; font-family: var(--font-round); font-size: 13px; font-weight: 700; letter-spacing: .22em; text-transform: uppercase; color: var(--muted); }
128
+ .ignite-wordmark b { color: var(--text); font-weight: 700; }
129
+ .ignite-clock { position: relative; font-family: var(--font-round); font-weight: 300; font-size: clamp(60px, 11vw, 92px); line-height: .95; letter-spacing: -.045em; color: #f1ebe6; }
130
+ .ignite-date { position: relative; margin-top: 8px; font-size: 14px; font-weight: 500; color: var(--muted); }
131
+ .ignite-greeting { position: relative; margin: 14px 0 0; font-size: 13.5px; color: var(--muted-2); }
132
+
133
+ .ignite-os-home .newtab-search-wrap { width: 100%; }
134
+ .ignite-os-home ._25dnvc2 { height: 54px; }
135
+
136
+ .ignite-apps { display: grid; grid-template-columns: repeat(auto-fit, minmax(92px, 1fr)); gap: 22px 8px; padding: 6px 4px 0; }
137
+ .ignite-app { display: flex; flex-direction: column; align-items: center; gap: 9px; background: none; border: 0; cursor: pointer; color: var(--text); padding: 0; }
138
+ .ignite-app:disabled { opacity: .5; cursor: default; }
139
+ .ignite-app-icon {
140
+ position: relative; overflow: hidden; width: 66px; height: 66px; border-radius: 22px; display: grid; place-items: center;
141
+ font-family: var(--font-round); font-weight: 700; font-size: 24px; color: var(--ember-soft);
142
+ background: linear-gradient(160deg, #2a2421 0%, #141113 100%) !important;
143
+ border: 1px solid rgba(255,255,255,.08);
144
+ box-shadow: var(--glass-hi), 0 8px 18px rgba(0,0,0,.45);
145
+ transition: transform .22s cubic-bezier(.3,1.4,.5,1), border-color .2s, box-shadow .2s;
146
+ }
147
+ .ignite-app-icon:after { content: ''; position: absolute; inset: 0; background: radial-gradient(90% 55% at 30% 0%, rgba(255,255,255,.1), transparent 60%); pointer-events: none; }
148
+ .ignite-app-icon > span { position: relative; z-index: 1; }
149
+ .ignite-app:hover .ignite-app-icon { transform: translateY(-3px); border-color: rgba(201,112,58,.5); box-shadow: var(--glass-hi), 0 14px 26px rgba(0,0,0,.5), 0 0 22px rgba(201,112,58,.16); }
150
+ .ignite-app:active .ignite-app-icon { transform: scale(.94); }
151
+ .ignite-app-label { font-size: 12px; font-weight: 500; color: var(--muted); }
152
+
153
+ .ignite-tour-open { align-self: center; margin-top: 4px; height: 34px; padding: 0 16px; border-radius: 999px; font-size: 12.5px; font-weight: 600; color: var(--muted);
154
+ background: var(--glass); border: 1px solid rgba(255,255,255,.09); cursor: pointer; transition: color .2s, border-color .2s; }
155
+ .ignite-tour-open:hover { color: var(--text); border-color: rgba(201,112,58,.45); }
156
+
157
+ /* ---------- Guided tour ---------- */
158
+ .ignite-tour { position: fixed; inset: 0; z-index: 200; }
159
+ .ignite-tour-scrim { position: absolute; inset: 0; }
160
+ .ignite-tour-ring {
161
+ position: fixed; border-radius: 20px; pointer-events: none; z-index: 1;
162
+ border: 1.5px solid rgba(201,112,58,.85);
163
+ box-shadow: 0 0 0 9999px rgba(4,4,5,.66), 0 0 24px rgba(201,112,58,.35);
164
+ transition: all .28s cubic-bezier(.3,1,.4,1);
165
+ }
166
+ .ignite-tour-card {
167
+ position: fixed; z-index: 2; padding: 18px 20px 16px; border-radius: 24px; transition: left .28s, top .28s;
168
+ background: linear-gradient(180deg, rgba(30,26,28,.95), rgba(16,14,16,.97));
169
+ border: 1px solid rgba(255,255,255,.1); box-shadow: var(--glass-hi), 0 24px 60px rgba(0,0,0,.7);
170
+ -webkit-backdrop-filter: blur(28px); backdrop-filter: blur(28px);
171
+ }
172
+ .ignite-tour-step { font-size: 10.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; color: var(--ember); }
173
+ .ignite-tour-card h3 { margin: 6px 0 6px; font-family: var(--font-round); font-size: 18px; font-weight: 700; letter-spacing: -.02em; color: var(--text); }
174
+ .ignite-tour-card p { margin: 0 0 16px; font-size: 13.5px; line-height: 1.5; color: var(--muted); }
175
+ .ignite-tour-actions { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
176
+ .ignite-tour-actions > span { display: flex; gap: 8px; }
177
+ .ignite-tour-skip { background: none; border: 0; color: var(--muted-2); font-size: 13px; cursor: pointer; padding: 6px 4px; }
178
+ .ignite-tour-skip:hover { color: var(--text); }
179
+ .ignite-tour-btn { height: 34px; padding: 0 16px; border-radius: 999px; font-size: 13px; font-weight: 600; cursor: pointer; color: var(--text);
180
+ background: var(--glass); border: 1px solid rgba(255,255,255,.1); }
181
+ .ignite-tour-btn.primary { background: linear-gradient(180deg, #b8653a, #8e4624); border-color: rgba(255,255,255,.14); color: #fff6ee; }
182
+
183
+ @media (max-width: 700px) {
184
+ .ignite-hero { padding: 22px; border-radius: 28px; }
185
+ .ignite-app-icon { width: 60px; height: 60px; border-radius: 19px; font-size: 22px; }
186
+ }
187
+ @media (prefers-reduced-motion: reduce) { * { transition-duration: .01ms !important; animation-duration: .01ms !important; } }
188
+
189
+ /* Games: dark tile fallback when a thumbnail cannot load */
190
+ .ignite-thumb-fallback { display: grid !important; place-items: center !important; width: 100%; height: 100%; font-family: var(--font-round); font-weight: 700; font-size: 38px; color: var(--ember-soft);
191
+ background: linear-gradient(160deg, #2a2421, #141113); }
192
+
193
+ /* ---------- AI, Account, Settings: same dark glass language ---------- */
194
+ :root { --ai-accent: #c9703a; }
195
+
196
+ .account-auth-auth-panel, .settings-section, .ai-settings-panel, .ai-model-panel, .ai-screen-panel {
197
+ background: linear-gradient(180deg, rgba(26,23,25,.82), rgba(14,12,14,.88)) !important;
198
+ border: 1px solid rgba(255,255,255,.08) !important; border-radius: 24px !important;
199
+ box-shadow: var(--glass-hi), 0 18px 50px rgba(0,0,0,.5);
200
+ -webkit-backdrop-filter: blur(26px) saturate(140%); backdrop-filter: blur(26px) saturate(140%);
201
+ }
202
+ .account-auth-auth-brand { color: var(--ember-soft) !important; letter-spacing: .12em; }
203
+ .account-auth-auth-brand svg, .account-auth-auth-dot { color: var(--ember); }
204
+
205
+ .settings-input, .settings-select, .account-auth-auth-form input, .ai-model-search, .ai-search-input {
206
+ background: rgba(255,255,255,.045) !important; border: 1px solid rgba(255,255,255,.1) !important; border-radius: 14px !important; color: var(--text) !important;
207
+ }
208
+ .settings-input:focus, .settings-select:focus, .account-auth-auth-form input:focus, .ai-model-search:focus, .ai-search-input:focus {
209
+ outline: none; border-color: rgba(201,112,58,.6) !important; box-shadow: 0 0 0 3px rgba(201,112,58,.14);
210
+ }
211
+
212
+ .account-auth-auth-primary, .account-btn, .settings-upgrade, .ai-send, .ai-edit-save {
213
+ background: linear-gradient(180deg, #b8653a, #8e4624) !important; color: #fff6ee !important;
214
+ border: 1px solid rgba(255,255,255,.14) !important; border-radius: 999px !important; font-weight: 600;
215
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 6px 18px rgba(0,0,0,.35);
216
+ }
217
+ .account-auth-auth-primary:disabled, .ai-send:disabled { opacity: .5; filter: saturate(.6); }
218
+ .account-auth-btn, .ai-edit-cancel {
219
+ background: var(--glass) !important; border: 1px solid rgba(255,255,255,.1) !important; border-radius: 999px !important; color: var(--text) !important;
220
+ }
221
+ .account-auth-auth-link { color: var(--ember-soft) !important; }
222
+
223
+ .ai-composer {
224
+ background: linear-gradient(180deg, rgba(30,26,28,.82), rgba(18,16,18,.88)) !important;
225
+ border: 1px solid rgba(255,255,255,.09) !important; border-radius: 26px !important;
226
+ box-shadow: var(--glass-hi), 0 14px 40px rgba(0,0,0,.5);
227
+ -webkit-backdrop-filter: blur(26px); backdrop-filter: blur(26px);
228
+ }
229
+ .ai-model-trigger, .ai-model-chip { border-radius: 999px !important; background: var(--glass) !important; border: 1px solid rgba(255,255,255,.1) !important; }
230
+ .ai-pick-tile, .ai-model-tile {
231
+ background: var(--glass) !important; border: 1px solid rgba(255,255,255,.08) !important; border-radius: 16px !important; transition: border-color .2s, transform .15s;
232
+ }
233
+ .ai-pick-tile:hover, .ai-model-tile:hover { border-color: rgba(201,112,58,.5) !important; transform: translateY(-1px); }
234
+ .ai-bubble { border-radius: 20px !important; }
235
+ .ai-rail { background: linear-gradient(180deg, rgba(20,18,20,.6), rgba(12,11,13,.7)) !important; border-right: 1px solid rgba(255,255,255,.06) !important; }
236
+ .ai-empty-title { font-family: var(--font-round); font-weight: 600; letter-spacing: -.02em; }
237
+ .settings-swatch.active, .settings-swatch[aria-pressed=true] { outline: 2px solid rgba(201,112,58,.8); outline-offset: 2px; }