diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a9b4189..d169f12 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -10,7 +10,8 @@ "Bash(npx convex dev:*)", "Bash(npx convex:*)", "Bash(npx @convex-dev/auth:*)", - "Bash(dir:*)" + "Bash(dir:*)", + "Bash(npx vite build:*)" ] } } diff --git a/Frontend/Electron/dist-react/assets/index-B1qeTixj.js b/Frontend/Electron/dist-react/assets/index-DXKRzYO-.js similarity index 53% rename from Frontend/Electron/dist-react/assets/index-B1qeTixj.js rename to Frontend/Electron/dist-react/assets/index-DXKRzYO-.js index cba781d..a7e9cb5 100644 --- a/Frontend/Electron/dist-react/assets/index-B1qeTixj.js +++ b/Frontend/Electron/dist-react/assets/index-DXKRzYO-.js @@ -1,53 +1,54 @@ -(function(){const c=document.createElement("link").relList;if(c&&c.supports&&c.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))l(a);new MutationObserver(a=>{for(const n of a)if(n.type==="childList")for(const r of n.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&l(r)}).observe(document,{childList:!0,subtree:!0});function t(a){const n={};return a.integrity&&(n.integrity=a.integrity),a.referrerPolicy&&(n.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?n.credentials="include":a.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function l(a){if(a.ep)return;a.ep=!0;const n=t(a);fetch(a.href,n)}})();function zc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var hi={exports:{}},J7={};var du;function RF(){if(du)return J7;du=1;var e=Symbol.for("react.transitional.element"),c=Symbol.for("react.fragment");function t(l,a,n){var r=null;if(n!==void 0&&(r=""+n),a.key!==void 0&&(r=""+a.key),"key"in a){n={};for(var o in a)o!=="key"&&(n[o]=a[o])}else n=a;return a=n.ref,{$$typeof:e,type:l,key:r,ref:a!==void 0?a:null,props:n}}return J7.Fragment=c,J7.jsx=t,J7.jsxs=t,J7}var pu;function VF(){return pu||(pu=1,hi.exports=RF()),hi.exports}var b=VF(),di={exports:{}},R2={};var vu;function IF(){if(vu)return R2;vu=1;var e=Symbol.for("react.transitional.element"),c=Symbol.for("react.portal"),t=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),n=Symbol.for("react.consumer"),r=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),d=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),g=Symbol.for("react.activity"),_=Symbol.iterator;function z(O){return O===null||typeof O!="object"?null:(O=_&&O[_]||O["@@iterator"],typeof O=="function"?O:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,y={};function x(O,Q,T){this.props=O,this.context=Q,this.refs=y,this.updater=T||M}x.prototype.isReactComponent={},x.prototype.setState=function(O,Q){if(typeof O!="object"&&typeof O!="function"&&O!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,O,Q,"setState")},x.prototype.forceUpdate=function(O){this.updater.enqueueForceUpdate(this,O,"forceUpdate")};function k(){}k.prototype=x.prototype;function S(O,Q,T){this.props=O,this.context=Q,this.refs=y,this.updater=T||M}var F=S.prototype=new k;F.constructor=S,w(F,x.prototype),F.isPureReactComponent=!0;var E=Array.isArray;function D(){}var H={H:null,A:null,T:null,S:null},I=Object.prototype.hasOwnProperty;function N(O,Q,T){var h2=T.ref;return{$$typeof:e,type:O,key:Q,ref:h2!==void 0?h2:null,props:T}}function A(O,Q){return N(O.type,Q,O.props)}function P(O){return typeof O=="object"&&O!==null&&O.$$typeof===e}function G(O){var Q={"=":"=0",":":"=2"};return"$"+O.replace(/[=:]/g,function(T){return Q[T]})}var c2=/\/+/g;function n2(O,Q){return typeof O=="object"&&O!==null&&O.key!=null?G(""+O.key):Q.toString(36)}function s2(O){switch(O.status){case"fulfilled":return O.value;case"rejected":throw O.reason;default:switch(typeof O.status=="string"?O.then(D,D):(O.status="pending",O.then(function(Q){O.status==="pending"&&(O.status="fulfilled",O.value=Q)},function(Q){O.status==="pending"&&(O.status="rejected",O.reason=Q)})),O.status){case"fulfilled":return O.value;case"rejected":throw O.reason}}throw O}function q(O,Q,T,h2,_2){var C2=typeof O;(C2==="undefined"||C2==="boolean")&&(O=null);var b2=!1;if(O===null)b2=!0;else switch(C2){case"bigint":case"string":case"number":b2=!0;break;case"object":switch(O.$$typeof){case e:case c:b2=!0;break;case f:return b2=O._init,q(b2(O._payload),Q,T,h2,_2)}}if(b2)return _2=_2(O),b2=h2===""?"."+n2(O,0):h2,E(_2)?(T="",b2!=null&&(T=b2.replace(c2,"$&/")+"/"),q(_2,Q,T,"",function(z0){return z0})):_2!=null&&(P(_2)&&(_2=A(_2,T+(_2.key==null||O&&O.key===_2.key?"":(""+_2.key).replace(c2,"$&/")+"/")+b2)),Q.push(_2)),1;b2=0;var T2=h2===""?".":h2+":";if(E(O))for(var L2=0;L2>>1,V=q[x2];if(0>>1;x2a(T,u2))h2a(_2,T)?(q[x2]=_2,q[h2]=u2,x2=h2):(q[x2]=T,q[Q]=u2,x2=Q);else if(h2a(_2,u2))q[x2]=_2,q[h2]=u2,x2=h2;else break e}}return t2}function a(q,t2){var u2=q.sortIndex-t2.sortIndex;return u2!==0?u2:q.id-t2.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var n=performance;e.unstable_now=function(){return n.now()}}else{var r=Date,o=r.now();e.unstable_now=function(){return r.now()-o}}var d=[],p=[],f=1,g=null,_=3,z=!1,M=!1,w=!1,y=!1,x=typeof setTimeout=="function"?setTimeout:null,k=typeof clearTimeout=="function"?clearTimeout:null,S=typeof setImmediate<"u"?setImmediate:null;function F(q){for(var t2=t(p);t2!==null;){if(t2.callback===null)l(p);else if(t2.startTime<=q)l(p),t2.sortIndex=t2.expirationTime,c(d,t2);else break;t2=t(p)}}function E(q){if(w=!1,F(q),!M)if(t(d)!==null)M=!0,D||(D=!0,G());else{var t2=t(p);t2!==null&&s2(E,t2.startTime-q)}}var D=!1,H=-1,I=5,N=-1;function A(){return y?!0:!(e.unstable_now()-Nq&&A());){var x2=g.callback;if(typeof x2=="function"){g.callback=null,_=g.priorityLevel;var V=x2(g.expirationTime<=q);if(q=e.unstable_now(),typeof V=="function"){g.callback=V,F(q),t2=!0;break c}g===t(d)&&l(d),F(q)}else l(d);g=t(d)}if(g!==null)t2=!0;else{var O=t(p);O!==null&&s2(E,O.startTime-q),t2=!1}}break e}finally{g=null,_=u2,z=!1}t2=void 0}}finally{t2?G():D=!1}}}var G;if(typeof S=="function")G=function(){S(P)};else if(typeof MessageChannel<"u"){var c2=new MessageChannel,n2=c2.port2;c2.port1.onmessage=P,G=function(){n2.postMessage(null)}}else G=function(){x(P,0)};function s2(q,t2){H=x(function(){q(e.unstable_now())},t2)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(q){q.callback=null},e.unstable_forceFrameRate=function(q){0>q||125x2?(q.sortIndex=u2,c(p,q),t(d)===null&&q===t(p)&&(w?(k(H),H=-1):w=!0,s2(E,u2-x2))):(q.sortIndex=V,c(d,q),M||z||(M=!0,D||(D=!0,G()))),q},e.unstable_shouldYield=A,e.unstable_wrapCallback=function(q){var t2=_;return function(){var u2=_;_=t2;try{return q.apply(this,arguments)}finally{_=u2}}}})(fi)),fi}var uu;function OF(){return uu||(uu=1,vi.exports=NF()),vi.exports}var gi={exports:{}},n1={};var mu;function UF(){if(mu)return n1;mu=1;var e=ns();function c(d){var p="https://react.dev/errors/"+d;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(c){console.error(c)}}return e(),gi.exports=UF(),gi.exports}var zu;function jF(){if(zu)return e8;zu=1;var e=OF(),c=ns(),t=PF();function l(i){var s="https://react.dev/errors/"+i;if(1V||(i.current=x2[V],x2[V]=null,V--)}function T(i,s){V++,x2[V]=i.current,i.current=s}var h2=O(null),_2=O(null),C2=O(null),b2=O(null);function T2(i,s){switch(T(C2,s),T(_2,i),T(h2,null),s.nodeType){case 9:case 11:i=(i=s.documentElement)&&(i=i.namespaceURI)?Tg(i):0;break;default:if(i=s.tagName,s=s.namespaceURI)s=Tg(s),i=Hg(s,i);else switch(i){case"svg":i=1;break;case"math":i=2;break;default:i=0}}Q(h2),T(h2,i)}function L2(){Q(h2),Q(_2),Q(C2)}function z0(i){i.memoizedState!==null&&T(b2,i);var s=h2.current,h=Hg(s,i.type);s!==h&&(T(_2,i),T(h2,h))}function q0(i){_2.current===i&&(Q(h2),Q(_2)),b2.current===i&&(Q(b2),Y7._currentValue=u2)}var M1,w1;function v1(i){if(M1===void 0)try{throw Error()}catch(h){var s=h.stack.trim().match(/\n( *(at )?)/);M1=s&&s[1]||"",w1=-1{for(const s of i)if(s.type==="childList")for(const r of s.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&l(r)}).observe(document,{childList:!0,subtree:!0});function t(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function l(i){if(i.ep)return;i.ep=!0;const s=t(i);fetch(i.href,s)}})();function Vc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var yi={exports:{}},v8={};var ku;function xE(){if(ku)return v8;ku=1;var e=Symbol.for("react.transitional.element"),c=Symbol.for("react.fragment");function t(l,i,s){var r=null;if(s!==void 0&&(r=""+s),i.key!==void 0&&(r=""+i.key),"key"in i){s={};for(var o in i)o!=="key"&&(s[o]=i[o])}else s=i;return i=s.ref,{$$typeof:e,type:l,key:r,ref:i!==void 0?i:null,props:s}}return v8.Fragment=c,v8.jsx=t,v8.jsxs=t,v8}var Tu;function FE(){return Tu||(Tu=1,yi.exports=xE()),yi.exports}var x=FE(),Di={exports:{}},L2={};var Lu;function EE(){if(Lu)return L2;Lu=1;var e=Symbol.for("react.transitional.element"),c=Symbol.for("react.portal"),t=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),r=Symbol.for("react.context"),o=Symbol.for("react.forward_ref"),d=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),g=Symbol.for("react.activity"),_=Symbol.iterator;function z(O){return O===null||typeof O!="object"?null:(O=_&&O[_]||O["@@iterator"],typeof O=="function"?O:null)}var M={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,D={};function C(O,e2,H){this.props=O,this.context=e2,this.refs=D,this.updater=H||M}C.prototype.isReactComponent={},C.prototype.setState=function(O,e2){if(typeof O!="object"&&typeof O!="function"&&O!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,O,e2,"setState")},C.prototype.forceUpdate=function(O){this.updater.enqueueForceUpdate(this,O,"forceUpdate")};function B(){}B.prototype=C.prototype;function S(O,e2,H){this.props=O,this.context=e2,this.refs=D,this.updater=H||M}var E=S.prototype=new B;E.constructor=S,w(E,C.prototype),E.isPureReactComponent=!0;var y=Array.isArray;function F(){}var L={H:null,A:null,T:null,S:null},U=Object.prototype.hasOwnProperty;function j(O,e2,H){var _2=H.ref;return{$$typeof:e,type:O,key:e2,ref:_2!==void 0?_2:null,props:H}}function T(O,e2){return j(O.type,e2,O.props)}function N(O){return typeof O=="object"&&O!==null&&O.$$typeof===e}function Z(O){var e2={"=":"=0",":":"=2"};return"$"+O.replace(/[=:]/g,function(H){return e2[H]})}var c2=/\/+/g;function r2(O,e2){return typeof O=="object"&&O!==null&&O.key!=null?Z(""+O.key):e2.toString(36)}function i2(O){switch(O.status){case"fulfilled":return O.value;case"rejected":throw O.reason;default:switch(typeof O.status=="string"?O.then(F,F):(O.status="pending",O.then(function(e2){O.status==="pending"&&(O.status="fulfilled",O.value=e2)},function(e2){O.status==="pending"&&(O.status="rejected",O.reason=e2)})),O.status){case"fulfilled":return O.value;case"rejected":throw O.reason}}throw O}function q(O,e2,H,_2,F2){var C2=typeof O;(C2==="undefined"||C2==="boolean")&&(O=null);var E2=!1;if(O===null)E2=!0;else switch(C2){case"bigint":case"string":case"number":E2=!0;break;case"object":switch(O.$$typeof){case e:case c:E2=!0;break;case f:return E2=O._init,q(E2(O._payload),e2,H,_2,F2)}}if(E2)return F2=F2(O),E2=_2===""?"."+r2(O,0):_2,y(F2)?(H="",E2!=null&&(H=E2.replace(c2,"$&/")+"/"),q(F2,e2,H,"",function(U2){return U2})):F2!=null&&(N(F2)&&(F2=T(F2,H+(F2.key==null||O&&O.key===F2.key?"":(""+F2.key).replace(c2,"$&/")+"/")+E2)),e2.push(F2)),1;E2=0;var w2=_2===""?".":_2+":";if(y(O))for(var A2=0;A2>>1,I=q[x2];if(0>>1;x2i(H,m2))_2i(F2,H)?(q[x2]=F2,q[_2]=m2,x2=_2):(q[x2]=H,q[e2]=m2,x2=e2);else if(_2i(F2,m2))q[x2]=F2,q[_2]=m2,x2=_2;else break e}}return l2}function i(q,l2){var m2=q.sortIndex-l2.sortIndex;return m2!==0?m2:q.id-l2.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;e.unstable_now=function(){return s.now()}}else{var r=Date,o=r.now();e.unstable_now=function(){return r.now()-o}}var d=[],p=[],f=1,g=null,_=3,z=!1,M=!1,w=!1,D=!1,C=typeof setTimeout=="function"?setTimeout:null,B=typeof clearTimeout=="function"?clearTimeout:null,S=typeof setImmediate<"u"?setImmediate:null;function E(q){for(var l2=t(p);l2!==null;){if(l2.callback===null)l(p);else if(l2.startTime<=q)l(p),l2.sortIndex=l2.expirationTime,c(d,l2);else break;l2=t(p)}}function y(q){if(w=!1,E(q),!M)if(t(d)!==null)M=!0,F||(F=!0,Z());else{var l2=t(p);l2!==null&&i2(y,l2.startTime-q)}}var F=!1,L=-1,U=5,j=-1;function T(){return D?!0:!(e.unstable_now()-jq&&T());){var x2=g.callback;if(typeof x2=="function"){g.callback=null,_=g.priorityLevel;var I=x2(g.expirationTime<=q);if(q=e.unstable_now(),typeof I=="function"){g.callback=I,E(q),l2=!0;break c}g===t(d)&&l(d),E(q)}else l(d);g=t(d)}if(g!==null)l2=!0;else{var O=t(p);O!==null&&i2(y,O.startTime-q),l2=!1}}break e}finally{g=null,_=m2,z=!1}l2=void 0}}finally{l2?Z():F=!1}}}var Z;if(typeof S=="function")Z=function(){S(N)};else if(typeof MessageChannel<"u"){var c2=new MessageChannel,r2=c2.port2;c2.port1.onmessage=N,Z=function(){r2.postMessage(null)}}else Z=function(){C(N,0)};function i2(q,l2){L=C(function(){q(e.unstable_now())},l2)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(q){q.callback=null},e.unstable_forceFrameRate=function(q){0>q||125x2?(q.sortIndex=m2,c(p,q),t(d)===null&&q===t(p)&&(w?(B(L),L=-1):w=!0,i2(y,m2-x2))):(q.sortIndex=I,c(d,q),M||z||(M=!0,F||(F=!0,Z()))),q},e.unstable_shouldYield=T,e.unstable_wrapCallback=function(q){var l2=_;return function(){var m2=_;_=l2;try{return q.apply(this,arguments)}finally{_=m2}}}})(Bi)),Bi}var Iu;function DE(){return Iu||(Iu=1,Si.exports=yE()),Si.exports}var ki={exports:{}},n1={};var Vu;function AE(){if(Vu)return n1;Vu=1;var e=As();function c(d){var p="https://react.dev/errors/"+d;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(c){console.error(c)}}return e(),ki.exports=AE(),ki.exports}var Ou;function BE(){if(Ou)return f8;Ou=1;var e=DE(),c=As(),t=SE();function l(a){var n="https://react.dev/errors/"+a;if(1I||(a.current=x2[I],x2[I]=null,I--)}function H(a,n){I++,x2[I]=a.current,a.current=n}var _2=O(null),F2=O(null),C2=O(null),E2=O(null);function w2(a,n){switch(H(C2,n),H(F2,a),H(_2,null),n.nodeType){case 9:case 11:a=(a=n.documentElement)&&(a=a.namespaceURI)?cu(a):0;break;default:if(a=n.tagName,n=n.namespaceURI)n=cu(n),a=tu(n,a);else switch(a){case"svg":a=1;break;case"math":a=2;break;default:a=0}}e2(_2),H(_2,a)}function A2(){e2(_2),e2(F2),e2(C2)}function U2(a){a.memoizedState!==null&&H(E2,a);var n=_2.current,h=tu(n,a.type);n!==h&&(H(F2,a),H(_2,h))}function b0(a){F2.current===a&&(e2(_2),e2(F2)),E2.current===a&&(e2(E2),o8._currentValue=m2)}var s1,v3;function M1(a){if(s1===void 0)try{throw Error()}catch(h){var n=h.stack.trim().match(/\n( *(at )?)/);s1=n&&n[1]||"",v3=-1)":-1u||j[v]!==K[u]){var r2=` -`+j[v].replace(" at new "," at ");return i.displayName&&r2.includes("")&&(r2=r2.replace("",i.displayName)),r2}while(1<=v&&0<=u);break}}}finally{C1=!1,Error.prepareStackTrace=h}return(h=i?i.displayName||i.name:"")?v1(h):""}function b3(i,s){switch(i.tag){case 26:case 27:case 5:return v1(i.type);case 16:return v1("Lazy");case 13:return i.child!==s&&s!==null?v1("Suspense Fallback"):v1("Suspense");case 19:return v1("SuspenseList");case 0:case 15:return X0(i.type,!1);case 11:return X0(i.type.render,!1);case 1:return X0(i.type,!0);case 31:return v1("Activity");default:return""}}function z4(i){try{var s="",h=null;do s+=b3(i,h),h=i,i=i.return;while(i);return s}catch(v){return` +`+s1+a+v3}var Z1=!1;function y3(a,n){if(!a||Z1)return"";Z1=!0;var h=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var v={DetermineComponentFrameRoot:function(){try{if(n){var h2=function(){throw Error()};if(Object.defineProperty(h2.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(h2,[])}catch(t2){var Q=t2}Reflect.construct(a,[],h2)}else{try{h2.call()}catch(t2){Q=t2}a.call(h2.prototype)}}else{try{throw Error()}catch(t2){Q=t2}(h2=a())&&typeof h2.catch=="function"&&h2.catch(function(){})}}catch(t2){if(t2&&Q&&typeof t2.stack=="string")return[t2.stack,Q.stack]}return[null,null]}};v.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var u=Object.getOwnPropertyDescriptor(v.DetermineComponentFrameRoot,"name");u&&u.configurable&&Object.defineProperty(v.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var m=v.DetermineComponentFrameRoot(),b=m[0],A=m[1];if(b&&A){var P=b.split(` +`),K=A.split(` +`);for(u=v=0;vu||P[v]!==K[u]){var a2=` +`+P[v].replace(" at new "," at ");return a.displayName&&a2.includes("")&&(a2=a2.replace("",a.displayName)),a2}while(1<=v&&0<=u);break}}}finally{Z1=!1,Error.prepareStackTrace=h}return(h=a?a.displayName||a.name:"")?M1(h):""}function Z3(a,n){switch(a.tag){case 26:case 27:case 5:return M1(a.type);case 16:return M1("Lazy");case 13:return a.child!==n&&n!==null?M1("Suspense Fallback"):M1("Suspense");case 19:return M1("SuspenseList");case 0:case 15:return y3(a.type,!1);case 11:return y3(a.type.render,!1);case 1:return y3(a.type,!0);case 31:return M1("Activity");default:return""}}function X5(a){try{var n="",h=null;do n+=Z3(a,h),h=a,a=a.return;while(a);return n}catch(v){return` Error generating stack: `+v.message+` -`+v.stack}}var M4=Object.prototype.hasOwnProperty,F3=e.unstable_scheduleCallback,w4=e.unstable_cancelCallback,s7=e.unstable_shouldYield,n7=e.unstable_requestPaint,J=e.unstable_now,M2=e.unstable_getCurrentPriorityLevel,Z=e.unstable_ImmediatePriority,i2=e.unstable_UserBlockingPriority,f2=e.unstable_NormalPriority,y2=e.unstable_LowPriority,k2=e.unstable_IdlePriority,G2=e.log,U2=e.unstable_setDisableYieldValue,J2=null,r0=null;function c0(i){if(typeof G2=="function"&&U2(i),r0&&typeof r0.setStrictMode=="function")try{r0.setStrictMode(J2,i)}catch{}}var A2=Math.clz32?Math.clz32:e9,Q0=Math.log,x1=Math.LN2;function e9(i){return i>>>=0,i===0?32:31-(Q0(i)/x1|0)|0}var o5=256,c9=262144,t9=4194304;function h5(i){var s=i&42;if(s!==0)return s;switch(i&-i){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return i&261888;case 262144:case 524288:case 1048576:case 2097152:return i&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return i&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return i}}function l9(i,s,h){var v=i.pendingLanes;if(v===0)return 0;var u=0,m=i.suspendedLanes,C=i.pingedLanes;i=i.warmLanes;var B=v&134217727;return B!==0?(v=B&~m,v!==0?u=h5(v):(C&=B,C!==0?u=h5(C):h||(h=B&~i,h!==0&&(u=h5(h))))):(B=v&~m,B!==0?u=h5(B):C!==0?u=h5(C):h||(h=v&~i,h!==0&&(u=h5(h)))),u===0?0:s!==0&&s!==u&&(s&m)===0&&(m=u&-u,h=s&-s,m>=h||m===32&&(h&4194048)!==0)?s:u}function r7(i,s){return(i.pendingLanes&~(i.suspendedLanes&~i.pingedLanes)&s)===0}function xx(i,s){switch(i){case 1:case 2:case 4:case 8:case 64:return s+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return s+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function fp(){var i=t9;return t9<<=1,(t9&62914560)===0&&(t9=4194304),i}function Qc(i){for(var s=[],h=0;31>h;h++)s.push(i);return s}function o7(i,s){i.pendingLanes|=s,s!==268435456&&(i.suspendedLanes=0,i.pingedLanes=0,i.warmLanes=0)}function bx(i,s,h,v,u,m){var C=i.pendingLanes;i.pendingLanes=h,i.suspendedLanes=0,i.pingedLanes=0,i.warmLanes=0,i.expiredLanes&=h,i.entangledLanes&=h,i.errorRecoveryDisabledLanes&=h,i.shellSuspendCounter=0;var B=i.entanglements,j=i.expirationTimes,K=i.hiddenUpdates;for(h=C&~h;0"u")return null;try{return i.activeElement||i.body}catch{return i.body}}var Sx=/[\n"\\]/g;function Y1(i){return i.replace(Sx,function(s){return"\\"+s.charCodeAt(0).toString(16)+" "})}function it(i,s,h,v,u,m,C,B){i.name="",C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?i.type=C:i.removeAttribute("type"),s!=null?C==="number"?(s===0&&i.value===""||i.value!=s)&&(i.value=""+W1(s)):i.value!==""+W1(s)&&(i.value=""+W1(s)):C!=="submit"&&C!=="reset"||i.removeAttribute("value"),s!=null?at(i,C,W1(s)):h!=null?at(i,C,W1(h)):v!=null&&i.removeAttribute("value"),u==null&&m!=null&&(i.defaultChecked=!!m),u!=null&&(i.checked=u&&typeof u!="function"&&typeof u!="symbol"),B!=null&&typeof B!="function"&&typeof B!="symbol"&&typeof B!="boolean"?i.name=""+W1(B):i.removeAttribute("name")}function yp(i,s,h,v,u,m,C,B){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(i.type=m),s!=null||h!=null){if(!(m!=="submit"&&m!=="reset"||s!=null)){lt(i);return}h=h!=null?""+W1(h):"",s=s!=null?""+W1(s):h,B||s===i.value||(i.value=s),i.defaultValue=s}v=v??u,v=typeof v!="function"&&typeof v!="symbol"&&!!v,i.checked=B?i.checked:!!v,i.defaultChecked=!!v,C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"&&(i.name=C),lt(i)}function at(i,s,h){s==="number"&&s9(i.ownerDocument)===i||i.defaultValue===""+h||(i.defaultValue=""+h)}function W5(i,s,h,v){if(i=i.options,s){s={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ht=!1;if(G3)try{var v7={};Object.defineProperty(v7,"passive",{get:function(){ht=!0}}),window.addEventListener("test",v7,v7),window.removeEventListener("test",v7,v7)}catch{ht=!1}var x4=null,dt=null,r9=null;function Tp(){if(r9)return r9;var i,s=dt,h=s.length,v,u="value"in x4?x4.value:x4.textContent,m=u.length;for(i=0;i=u7),Op=" ",Up=!1;function Pp(i,s){switch(i){case"keyup":return ib.indexOf(s.keyCode)!==-1;case"keydown":return s.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function jp(i){return i=i.detail,typeof i=="object"&&"data"in i?i.data:null}var Q5=!1;function sb(i,s){switch(i){case"compositionend":return jp(s);case"keypress":return s.which!==32?null:(Up=!0,Op);case"textInput":return i=s.data,i===Op&&Up?null:i;default:return null}}function nb(i,s){if(Q5)return i==="compositionend"||!ut&&Pp(i,s)?(i=Tp(),r9=dt=x4=null,Q5=!1,i):null;switch(i){case"paste":return null;case"keypress":if(!(s.ctrlKey||s.altKey||s.metaKey)||s.ctrlKey&&s.altKey){if(s.char&&1=s)return{node:h,offset:s-i};i=v}e:{for(;h;){if(h.nextSibling){h=h.nextSibling;break e}h=h.parentNode}h=void 0}h=Xp(h)}}function Jp(i,s){return i&&s?i===s?!0:i&&i.nodeType===3?!1:s&&s.nodeType===3?Jp(i,s.parentNode):"contains"in i?i.contains(s):i.compareDocumentPosition?!!(i.compareDocumentPosition(s)&16):!1:!1}function ev(i){i=i!=null&&i.ownerDocument!=null&&i.ownerDocument.defaultView!=null?i.ownerDocument.defaultView:window;for(var s=s9(i.document);s instanceof i.HTMLIFrameElement;){try{var h=typeof s.contentWindow.location.href=="string"}catch{h=!1}if(h)i=s.contentWindow;else break;s=s9(i.document)}return s}function zt(i){var s=i&&i.nodeName&&i.nodeName.toLowerCase();return s&&(s==="input"&&(i.type==="text"||i.type==="search"||i.type==="tel"||i.type==="url"||i.type==="password")||s==="textarea"||i.contentEditable==="true")}var gb=G3&&"documentMode"in document&&11>=document.documentMode,J5=null,Mt=null,M7=null,wt=!1;function cv(i,s,h){var v=h.window===h?h.document:h.nodeType===9?h:h.ownerDocument;wt||J5==null||J5!==s9(v)||(v=J5,"selectionStart"in v&&zt(v)?v={start:v.selectionStart,end:v.selectionEnd}:(v=(v.ownerDocument&&v.ownerDocument.defaultView||window).getSelection(),v={anchorNode:v.anchorNode,anchorOffset:v.anchorOffset,focusNode:v.focusNode,focusOffset:v.focusOffset}),M7&&z7(M7,v)||(M7=v,v=ce(Mt,"onSelect"),0>=C,u-=C,E3=1<<32-A2(s)+u|h<I2?(X2=E2,E2=null):X2=E2.sibling;var a0=e2(W,E2,Y[I2],d2);if(a0===null){E2===null&&(E2=X2);break}i&&E2&&a0.alternate===null&&s(W,E2),$=m(a0,$,I2),i0===null?D2=a0:i0.sibling=a0,i0=a0,E2=X2}if(I2===Y.length)return h(W,E2),e0&&$3(W,I2),D2;if(E2===null){for(;I2I2?(X2=E2,E2=null):X2=E2.sibling;var q4=e2(W,E2,a0.value,d2);if(q4===null){E2===null&&(E2=X2);break}i&&E2&&q4.alternate===null&&s(W,E2),$=m(q4,$,I2),i0===null?D2=q4:i0.sibling=q4,i0=q4,E2=X2}if(a0.done)return h(W,E2),e0&&$3(W,I2),D2;if(E2===null){for(;!a0.done;I2++,a0=Y.next())a0=p2(W,a0.value,d2),a0!==null&&($=m(a0,$,I2),i0===null?D2=a0:i0.sibling=a0,i0=a0);return e0&&$3(W,I2),D2}for(E2=v(E2);!a0.done;I2++,a0=Y.next())a0=a2(E2,W,I2,a0.value,d2),a0!==null&&(i&&a0.alternate!==null&&E2.delete(a0.key===null?I2:a0.key),$=m(a0,$,I2),i0===null?D2=a0:i0.sibling=a0,i0=a0);return i&&E2.forEach(function(HF){return s(W,HF)}),e0&&$3(W,I2),D2}function v0(W,$,Y,d2){if(typeof Y=="object"&&Y!==null&&Y.type===w&&Y.key===null&&(Y=Y.props.children),typeof Y=="object"&&Y!==null){switch(Y.$$typeof){case z:e:{for(var D2=Y.key;$!==null;){if($.key===D2){if(D2=Y.type,D2===w){if($.tag===7){h(W,$.sibling),d2=u($,Y.props.children),d2.return=W,W=d2;break e}}else if($.elementType===D2||typeof D2=="object"&&D2!==null&&D2.$$typeof===I&&w5(D2)===$.type){h(W,$.sibling),d2=u($,Y.props),E7(d2,Y),d2.return=W,W=d2;break e}h(W,$);break}else s(W,$);$=$.sibling}Y.type===w?(d2=u5(Y.props.children,W.mode,d2,Y.key),d2.return=W,W=d2):(d2=_9(Y.type,Y.key,Y.props,null,W.mode,d2),E7(d2,Y),d2.return=W,W=d2)}return C(W);case M:e:{for(D2=Y.key;$!==null;){if($.key===D2)if($.tag===4&&$.stateNode.containerInfo===Y.containerInfo&&$.stateNode.implementation===Y.implementation){h(W,$.sibling),d2=u($,Y.children||[]),d2.return=W,W=d2;break e}else{h(W,$);break}else s(W,$);$=$.sibling}d2=Dt(Y,W.mode,d2),d2.return=W,W=d2}return C(W);case I:return Y=w5(Y),v0(W,$,Y,d2)}if(s2(Y))return F2(W,$,Y,d2);if(G(Y)){if(D2=G(Y),typeof D2!="function")throw Error(l(150));return Y=D2.call(Y),B2(W,$,Y,d2)}if(typeof Y.then=="function")return v0(W,$,F9(Y),d2);if(Y.$$typeof===S)return v0(W,$,w9(W,Y),d2);E9(W,Y)}return typeof Y=="string"&&Y!==""||typeof Y=="number"||typeof Y=="bigint"?(Y=""+Y,$!==null&&$.tag===6?(h(W,$.sibling),d2=u($,Y),d2.return=W,W=d2):(h(W,$),d2=yt(Y,W.mode,d2),d2.return=W,W=d2),C(W)):h(W,$)}return function(W,$,Y,d2){try{F7=0;var D2=v0(W,$,Y,d2);return h6=null,D2}catch(E2){if(E2===o6||E2===x9)throw E2;var i0=V1(29,E2,null,W.mode);return i0.lanes=d2,i0.return=W,i0}}}var x5=bv(!0),Fv=bv(!1),D4=!1;function Ot(i){i.updateQueue={baseState:i.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ut(i,s){i=i.updateQueue,s.updateQueue===i&&(s.updateQueue={baseState:i.baseState,firstBaseUpdate:i.firstBaseUpdate,lastBaseUpdate:i.lastBaseUpdate,shared:i.shared,callbacks:null})}function A4(i){return{lane:i,tag:0,payload:null,callback:null,next:null}}function S4(i,s,h){var v=i.updateQueue;if(v===null)return null;if(v=v.shared,(s0&2)!==0){var u=v.pending;return u===null?s.next=s:(s.next=u.next,u.next=s),v.pending=s,s=m9(i),rv(i,null,h),s}return u9(i,v,s,h),m9(i)}function y7(i,s,h){if(s=s.updateQueue,s!==null&&(s=s.shared,(h&4194048)!==0)){var v=s.lanes;v&=i.pendingLanes,h|=v,s.lanes=h,up(i,h)}}function Pt(i,s){var h=i.updateQueue,v=i.alternate;if(v!==null&&(v=v.updateQueue,h===v)){var u=null,m=null;if(h=h.firstBaseUpdate,h!==null){do{var C={lane:h.lane,tag:h.tag,payload:h.payload,callback:null,next:null};m===null?u=m=C:m=m.next=C,h=h.next}while(h!==null);m===null?u=m=s:m=m.next=s}else u=m=s;h={baseState:v.baseState,firstBaseUpdate:u,lastBaseUpdate:m,shared:v.shared,callbacks:v.callbacks},i.updateQueue=h;return}i=h.lastBaseUpdate,i===null?h.firstBaseUpdate=s:i.next=s,h.lastBaseUpdate=s}var jt=!1;function D7(){if(jt){var i=r6;if(i!==null)throw i}}function A7(i,s,h,v){jt=!1;var u=i.updateQueue;D4=!1;var m=u.firstBaseUpdate,C=u.lastBaseUpdate,B=u.shared.pending;if(B!==null){u.shared.pending=null;var j=B,K=j.next;j.next=null,C===null?m=K:C.next=K,C=j;var r2=i.alternate;r2!==null&&(r2=r2.updateQueue,B=r2.lastBaseUpdate,B!==C&&(B===null?r2.firstBaseUpdate=K:B.next=K,r2.lastBaseUpdate=j))}if(m!==null){var p2=u.baseState;C=0,r2=K=j=null,B=m;do{var e2=B.lane&-536870913,a2=e2!==B.lane;if(a2?(K2&e2)===e2:(v&e2)===e2){e2!==0&&e2===n6&&(jt=!0),r2!==null&&(r2=r2.next={lane:0,tag:B.tag,payload:B.payload,callback:null,next:null});e:{var F2=i,B2=B;e2=s;var v0=h;switch(B2.tag){case 1:if(F2=B2.payload,typeof F2=="function"){p2=F2.call(v0,p2,e2);break e}p2=F2;break e;case 3:F2.flags=F2.flags&-65537|128;case 0:if(F2=B2.payload,e2=typeof F2=="function"?F2.call(v0,p2,e2):F2,e2==null)break e;p2=g({},p2,e2);break e;case 2:D4=!0}}e2=B.callback,e2!==null&&(i.flags|=64,a2&&(i.flags|=8192),a2=u.callbacks,a2===null?u.callbacks=[e2]:a2.push(e2))}else a2={lane:e2,tag:B.tag,payload:B.payload,callback:B.callback,next:null},r2===null?(K=r2=a2,j=p2):r2=r2.next=a2,C|=e2;if(B=B.next,B===null){if(B=u.shared.pending,B===null)break;a2=B,B=a2.next,a2.next=null,u.lastBaseUpdate=a2,u.shared.pending=null}}while(!0);r2===null&&(j=p2),u.baseState=j,u.firstBaseUpdate=K,u.lastBaseUpdate=r2,m===null&&(u.shared.lanes=0),H4|=C,i.lanes=C,i.memoizedState=p2}}function Ev(i,s){if(typeof i!="function")throw Error(l(191,i));i.call(s)}function yv(i,s){var h=i.callbacks;if(h!==null)for(i.callbacks=null,i=0;im?m:8;var C=q.T,B={};q.T=B,rl(i,!1,s,h);try{var j=u(),K=q.S;if(K!==null&&K(B,j),j!==null&&typeof j=="object"&&typeof j.then=="function"){var r2=bb(j,v);k7(i,s,r2,P1(i))}else k7(i,s,v,P1(i))}catch(p2){k7(i,s,{then:function(){},status:"rejected",reason:p2},P1())}finally{t2.p=m,C!==null&&B.types!==null&&(C.types=B.types),q.T=C}}function Sb(){}function sl(i,s,h,v){if(i.tag!==5)throw Error(l(476));var u=sf(i).queue;af(i,u,s,u2,h===null?Sb:function(){return nf(i),h(v)})}function sf(i){var s=i.memoizedState;if(s!==null)return s;s={memoizedState:u2,baseState:u2,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:K3,lastRenderedState:u2},next:null};var h={};return s.next={memoizedState:h,baseState:h,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:K3,lastRenderedState:h},next:null},i.memoizedState=s,i=i.alternate,i!==null&&(i.memoizedState=s),s}function nf(i){var s=sf(i);s.next===null&&(s=i.alternate.memoizedState),k7(i,s.next.queue,{},P1())}function nl(){return c1(Y7)}function rf(){return k0().memoizedState}function of(){return k0().memoizedState}function Bb(i){for(var s=i.return;s!==null;){switch(s.tag){case 24:case 3:var h=P1();i=A4(h);var v=S4(s,i,h);v!==null&&(S1(v,s,h),y7(v,s,h)),s={cache:Rt()},i.payload=s;return}s=s.return}}function kb(i,s,h){var v=P1();h={lane:v,revertLane:0,gesture:null,action:h,hasEagerState:!1,eagerState:null,next:null},R9(i)?df(s,h):(h=Ft(i,s,h,v),h!==null&&(S1(h,i,v),pf(h,s,v)))}function hf(i,s,h){var v=P1();k7(i,s,h,v)}function k7(i,s,h,v){var u={lane:v,revertLane:0,gesture:null,action:h,hasEagerState:!1,eagerState:null,next:null};if(R9(i))df(s,u);else{var m=i.alternate;if(i.lanes===0&&(m===null||m.lanes===0)&&(m=s.lastRenderedReducer,m!==null))try{var C=s.lastRenderedState,B=m(C,h);if(u.hasEagerState=!0,u.eagerState=B,R1(B,C))return u9(i,s,u,0),g0===null&&g9(),!1}catch{}if(h=Ft(i,s,u,v),h!==null)return S1(h,i,v),pf(h,s,v),!0}return!1}function rl(i,s,h,v){if(v={lane:2,revertLane:Ol(),gesture:null,action:v,hasEagerState:!1,eagerState:null,next:null},R9(i)){if(s)throw Error(l(479))}else s=Ft(i,h,v,2),s!==null&&S1(s,i,2)}function R9(i){var s=i.alternate;return i===V2||s!==null&&s===V2}function df(i,s){p6=A9=!0;var h=i.pending;h===null?s.next=s:(s.next=h.next,h.next=s),i.pending=s}function pf(i,s,h){if((h&4194048)!==0){var v=s.lanes;v&=i.pendingLanes,h|=v,s.lanes=h,up(i,h)}}var L7={readContext:c1,use:k9,useCallback:E0,useContext:E0,useEffect:E0,useImperativeHandle:E0,useLayoutEffect:E0,useInsertionEffect:E0,useMemo:E0,useReducer:E0,useRef:E0,useState:E0,useDebugValue:E0,useDeferredValue:E0,useTransition:E0,useSyncExternalStore:E0,useId:E0,useHostTransitionStatus:E0,useFormState:E0,useActionState:E0,useOptimistic:E0,useMemoCache:E0,useCacheRefresh:E0};L7.useEffectEvent=E0;var vf={readContext:c1,use:k9,useCallback:function(i,s){return f1().memoizedState=[i,s===void 0?null:s],i},useContext:c1,useEffect:Yv,useImperativeHandle:function(i,s,h){h=h!=null?h.concat([i]):null,T9(4194308,4,Jv.bind(null,s,i),h)},useLayoutEffect:function(i,s){return T9(4194308,4,i,s)},useInsertionEffect:function(i,s){T9(4,2,i,s)},useMemo:function(i,s){var h=f1();s=s===void 0?null:s;var v=i();if(b5){c0(!0);try{i()}finally{c0(!1)}}return h.memoizedState=[v,s],v},useReducer:function(i,s,h){var v=f1();if(h!==void 0){var u=h(s);if(b5){c0(!0);try{h(s)}finally{c0(!1)}}}else u=s;return v.memoizedState=v.baseState=u,i={pending:null,lanes:0,dispatch:null,lastRenderedReducer:i,lastRenderedState:u},v.queue=i,i=i.dispatch=kb.bind(null,V2,i),[v.memoizedState,i]},useRef:function(i){var s=f1();return i={current:i},s.memoizedState=i},useState:function(i){i=cl(i);var s=i.queue,h=hf.bind(null,V2,s);return s.dispatch=h,[i.memoizedState,h]},useDebugValue:il,useDeferredValue:function(i,s){var h=f1();return al(h,i,s)},useTransition:function(){var i=cl(!1);return i=af.bind(null,V2,i.queue,!0,!1),f1().memoizedState=i,[!1,i]},useSyncExternalStore:function(i,s,h){var v=V2,u=f1();if(e0){if(h===void 0)throw Error(l(407));h=h()}else{if(h=s(),g0===null)throw Error(l(349));(K2&127)!==0||Lv(v,s,h)}u.memoizedState=h;var m={value:h,getSnapshot:s};return u.queue=m,Yv(Hv.bind(null,v,m,i),[i]),v.flags|=2048,f6(9,{destroy:void 0},Tv.bind(null,v,m,h,s),null),h},useId:function(){var i=f1(),s=g0.identifierPrefix;if(e0){var h=y3,v=E3;h=(v&~(1<<32-A2(v)-1)).toString(32)+h,s="_"+s+"R_"+h,h=S9++,0<\/script>",m=m.removeChild(m.firstChild);break;case"select":m=typeof v.is=="string"?C.createElement("select",{is:v.is}):C.createElement("select"),v.multiple?m.multiple=!0:v.size&&(m.size=v.size);break;default:m=typeof v.is=="string"?C.createElement(u,{is:v.is}):C.createElement(u)}}m[J0]=s,m[b1]=v;e:for(C=s.child;C!==null;){if(C.tag===5||C.tag===6)m.appendChild(C.stateNode);else if(C.tag!==4&&C.tag!==27&&C.child!==null){C.child.return=C,C=C.child;continue}if(C===s)break e;for(;C.sibling===null;){if(C.return===null||C.return===s)break e;C=C.return}C.sibling.return=C.return,C=C.sibling}s.stateNode=m;e:switch(l1(m,u,v),u){case"button":case"input":case"select":case"textarea":v=!!v.autoFocus;break e;case"img":v=!0;break e;default:v=!1}v&&Q3(s)}}return w0(s),Cl(s,s.type,i===null?null:i.memoizedProps,s.pendingProps,h),null;case 6:if(i&&s.stateNode!=null)i.memoizedProps!==v&&Q3(s);else{if(typeof v!="string"&&s.stateNode===null)throw Error(l(166));if(i=C2.current,a6(s)){if(i=s.stateNode,h=s.memoizedProps,v=null,u=e1,u!==null)switch(u.tag){case 27:case 5:v=u.memoizedProps}i[J0]=s,i=!!(i.nodeValue===h||v!==null&&v.suppressHydrationWarning===!0||kg(i.nodeValue,h)),i||E4(s,!0)}else i=te(i).createTextNode(v),i[J0]=s,s.stateNode=i}return w0(s),null;case 31:if(h=s.memoizedState,i===null||i.memoizedState!==null){if(v=a6(s),h!==null){if(i===null){if(!v)throw Error(l(318));if(i=s.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(l(557));i[J0]=s}else m5(),(s.flags&128)===0&&(s.memoizedState=null),s.flags|=4;w0(s),i=!1}else h=kt(),i!==null&&i.memoizedState!==null&&(i.memoizedState.hydrationErrors=h),i=!0;if(!i)return s.flags&256?(N1(s),s):(N1(s),null);if((s.flags&128)!==0)throw Error(l(558))}return w0(s),null;case 13:if(v=s.memoizedState,i===null||i.memoizedState!==null&&i.memoizedState.dehydrated!==null){if(u=a6(s),v!==null&&v.dehydrated!==null){if(i===null){if(!u)throw Error(l(318));if(u=s.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(l(317));u[J0]=s}else m5(),(s.flags&128)===0&&(s.memoizedState=null),s.flags|=4;w0(s),u=!1}else u=kt(),i!==null&&i.memoizedState!==null&&(i.memoizedState.hydrationErrors=u),u=!0;if(!u)return s.flags&256?(N1(s),s):(N1(s),null)}return N1(s),(s.flags&128)!==0?(s.lanes=h,s):(h=v!==null,i=i!==null&&i.memoizedState!==null,h&&(v=s.child,u=null,v.alternate!==null&&v.alternate.memoizedState!==null&&v.alternate.memoizedState.cachePool!==null&&(u=v.alternate.memoizedState.cachePool.pool),m=null,v.memoizedState!==null&&v.memoizedState.cachePool!==null&&(m=v.memoizedState.cachePool.pool),m!==u&&(v.flags|=2048)),h!==i&&h&&(s.child.flags|=8192),U9(s,s.updateQueue),w0(s),null);case 4:return L2(),i===null&&Gl(s.stateNode.containerInfo),w0(s),null;case 10:return W3(s.type),w0(s),null;case 19:if(Q(B0),v=s.memoizedState,v===null)return w0(s),null;if(u=(s.flags&128)!==0,m=v.rendering,m===null)if(u)H7(v,!1);else{if(y0!==0||i!==null&&(i.flags&128)!==0)for(i=s.child;i!==null;){if(m=D9(i),m!==null){for(s.flags|=128,H7(v,!1),i=m.updateQueue,s.updateQueue=i,U9(s,i),s.subtreeFlags=0,i=h,h=s.child;h!==null;)ov(h,i),h=h.sibling;return T(B0,B0.current&1|2),e0&&$3(s,v.treeForkCount),s.child}i=i.sibling}v.tail!==null&&J()>$9&&(s.flags|=128,u=!0,H7(v,!1),s.lanes=4194304)}else{if(!u)if(i=D9(m),i!==null){if(s.flags|=128,u=!0,i=i.updateQueue,s.updateQueue=i,U9(s,i),H7(v,!0),v.tail===null&&v.tailMode==="hidden"&&!m.alternate&&!e0)return w0(s),null}else 2*J()-v.renderingStartTime>$9&&h!==536870912&&(s.flags|=128,u=!0,H7(v,!1),s.lanes=4194304);v.isBackwards?(m.sibling=s.child,s.child=m):(i=v.last,i!==null?i.sibling=m:s.child=m,v.last=m)}return v.tail!==null?(i=v.tail,v.rendering=i,v.tail=i.sibling,v.renderingStartTime=J(),i.sibling=null,h=B0.current,T(B0,u?h&1|2:h&1),e0&&$3(s,v.treeForkCount),i):(w0(s),null);case 22:case 23:return N1(s),qt(),v=s.memoizedState!==null,i!==null?i.memoizedState!==null!==v&&(s.flags|=8192):v&&(s.flags|=8192),v?(h&536870912)!==0&&(s.flags&128)===0&&(w0(s),s.subtreeFlags&6&&(s.flags|=8192)):w0(s),h=s.updateQueue,h!==null&&U9(s,h.retryQueue),h=null,i!==null&&i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(h=i.memoizedState.cachePool.pool),v=null,s.memoizedState!==null&&s.memoizedState.cachePool!==null&&(v=s.memoizedState.cachePool.pool),v!==h&&(s.flags|=2048),i!==null&&Q(M5),null;case 24:return h=null,i!==null&&(h=i.memoizedState.cache),s.memoizedState.cache!==h&&(s.flags|=2048),W3(T0),w0(s),null;case 25:return null;case 30:return null}throw Error(l(156,s.tag))}function Vb(i,s){switch(St(s),s.tag){case 1:return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 3:return W3(T0),L2(),i=s.flags,(i&65536)!==0&&(i&128)===0?(s.flags=i&-65537|128,s):null;case 26:case 27:case 5:return q0(s),null;case 31:if(s.memoizedState!==null){if(N1(s),s.alternate===null)throw Error(l(340));m5()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 13:if(N1(s),i=s.memoizedState,i!==null&&i.dehydrated!==null){if(s.alternate===null)throw Error(l(340));m5()}return i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 19:return Q(B0),null;case 4:return L2(),null;case 10:return W3(s.type),null;case 22:case 23:return N1(s),qt(),i!==null&&Q(M5),i=s.flags,i&65536?(s.flags=i&-65537|128,s):null;case 24:return W3(T0),null;case 25:return null;default:return null}}function Vf(i,s){switch(St(s),s.tag){case 3:W3(T0),L2();break;case 26:case 27:case 5:q0(s);break;case 4:L2();break;case 31:s.memoizedState!==null&&N1(s);break;case 13:N1(s);break;case 19:Q(B0);break;case 10:W3(s.type);break;case 22:case 23:N1(s),qt(),i!==null&&Q(M5);break;case 24:W3(T0)}}function R7(i,s){try{var h=s.updateQueue,v=h!==null?h.lastEffect:null;if(v!==null){var u=v.next;h=u;do{if((h.tag&i)===i){v=void 0;var m=h.create,C=h.inst;v=m(),C.destroy=v}h=h.next}while(h!==u)}}catch(B){h0(s,s.return,B)}}function L4(i,s,h){try{var v=s.updateQueue,u=v!==null?v.lastEffect:null;if(u!==null){var m=u.next;v=m;do{if((v.tag&i)===i){var C=v.inst,B=C.destroy;if(B!==void 0){C.destroy=void 0,u=s;var j=h,K=B;try{K()}catch(r2){h0(u,j,r2)}}}v=v.next}while(v!==m)}}catch(r2){h0(s,s.return,r2)}}function If(i){var s=i.updateQueue;if(s!==null){var h=i.stateNode;try{yv(s,h)}catch(v){h0(i,i.return,v)}}}function Nf(i,s,h){h.props=F5(i.type,i.memoizedProps),h.state=i.memoizedState;try{h.componentWillUnmount()}catch(v){h0(i,s,v)}}function V7(i,s){try{var h=i.ref;if(h!==null){switch(i.tag){case 26:case 27:case 5:var v=i.stateNode;break;case 30:v=i.stateNode;break;default:v=i.stateNode}typeof h=="function"?i.refCleanup=h(v):h.current=v}}catch(u){h0(i,s,u)}}function D3(i,s){var h=i.ref,v=i.refCleanup;if(h!==null)if(typeof v=="function")try{v()}catch(u){h0(i,s,u)}finally{i.refCleanup=null,i=i.alternate,i!=null&&(i.refCleanup=null)}else if(typeof h=="function")try{h(null)}catch(u){h0(i,s,u)}else h.current=null}function Of(i){var s=i.type,h=i.memoizedProps,v=i.stateNode;try{e:switch(s){case"button":case"input":case"select":case"textarea":h.autoFocus&&v.focus();break e;case"img":h.src?v.src=h.src:h.srcSet&&(v.srcset=h.srcSet)}}catch(u){h0(i,i.return,u)}}function xl(i,s,h){try{var v=i.stateNode;aF(v,i.type,h,s),v[b1]=s}catch(u){h0(i,i.return,u)}}function Uf(i){return i.tag===5||i.tag===3||i.tag===26||i.tag===27&&O4(i.type)||i.tag===4}function bl(i){e:for(;;){for(;i.sibling===null;){if(i.return===null||Uf(i.return))return null;i=i.return}for(i.sibling.return=i.return,i=i.sibling;i.tag!==5&&i.tag!==6&&i.tag!==18;){if(i.tag===27&&O4(i.type)||i.flags&2||i.child===null||i.tag===4)continue e;i.child.return=i,i=i.child}if(!(i.flags&2))return i.stateNode}}function Fl(i,s,h){var v=i.tag;if(v===5||v===6)i=i.stateNode,s?(h.nodeType===9?h.body:h.nodeName==="HTML"?h.ownerDocument.body:h).insertBefore(i,s):(s=h.nodeType===9?h.body:h.nodeName==="HTML"?h.ownerDocument.body:h,s.appendChild(i),h=h._reactRootContainer,h!=null||s.onclick!==null||(s.onclick=j3));else if(v!==4&&(v===27&&O4(i.type)&&(h=i.stateNode,s=null),i=i.child,i!==null))for(Fl(i,s,h),i=i.sibling;i!==null;)Fl(i,s,h),i=i.sibling}function P9(i,s,h){var v=i.tag;if(v===5||v===6)i=i.stateNode,s?h.insertBefore(i,s):h.appendChild(i);else if(v!==4&&(v===27&&O4(i.type)&&(h=i.stateNode),i=i.child,i!==null))for(P9(i,s,h),i=i.sibling;i!==null;)P9(i,s,h),i=i.sibling}function Pf(i){var s=i.stateNode,h=i.memoizedProps;try{for(var v=i.type,u=s.attributes;u.length;)s.removeAttributeNode(u[0]);l1(s,v,h),s[J0]=i,s[b1]=h}catch(m){h0(i,i.return,m)}}var J3=!1,V0=!1,El=!1,jf=typeof WeakSet=="function"?WeakSet:Set,Z0=null;function Ib(i,s){if(i=i.containerInfo,Zl=oe,i=ev(i),zt(i)){if("selectionStart"in i)var h={start:i.selectionStart,end:i.selectionEnd};else e:{h=(h=i.ownerDocument)&&h.defaultView||window;var v=h.getSelection&&h.getSelection();if(v&&v.rangeCount!==0){h=v.anchorNode;var u=v.anchorOffset,m=v.focusNode;v=v.focusOffset;try{h.nodeType,m.nodeType}catch{h=null;break e}var C=0,B=-1,j=-1,K=0,r2=0,p2=i,e2=null;c:for(;;){for(var a2;p2!==h||u!==0&&p2.nodeType!==3||(B=C+u),p2!==m||v!==0&&p2.nodeType!==3||(j=C+v),p2.nodeType===3&&(C+=p2.nodeValue.length),(a2=p2.firstChild)!==null;)e2=p2,p2=a2;for(;;){if(p2===i)break c;if(e2===h&&++K===u&&(B=C),e2===m&&++r2===v&&(j=C),(a2=p2.nextSibling)!==null)break;p2=e2,e2=p2.parentNode}p2=a2}h=B===-1||j===-1?null:{start:B,end:j}}else h=null}h=h||{start:0,end:0}}else h=null;for(Wl={focusedElem:i,selectionRange:h},oe=!1,Z0=s;Z0!==null;)if(s=Z0,i=s.child,(s.subtreeFlags&1028)!==0&&i!==null)i.return=s,Z0=i;else for(;Z0!==null;){switch(s=Z0,m=s.alternate,i=s.flags,s.tag){case 0:if((i&4)!==0&&(i=s.updateQueue,i=i!==null?i.events:null,i!==null))for(h=0;h title"))),l1(m,v,h),m[J0]=i,$0(m),v=m;break e;case"link":var C=Yg("link","href",u).get(v+(h.href||""));if(C){for(var B=0;Bv0&&(C=v0,v0=B2,B2=C);var W=Qp(B,B2),$=Qp(B,v0);if(W&&$&&(a2.rangeCount!==1||a2.anchorNode!==W.node||a2.anchorOffset!==W.offset||a2.focusNode!==$.node||a2.focusOffset!==$.offset)){var Y=p2.createRange();Y.setStart(W.node,W.offset),a2.removeAllRanges(),B2>v0?(a2.addRange(Y),a2.extend($.node,$.offset)):(Y.setEnd($.node,$.offset),a2.addRange(Y))}}}}for(p2=[],a2=B;a2=a2.parentNode;)a2.nodeType===1&&p2.push({element:a2,left:a2.scrollLeft,top:a2.scrollTop});for(typeof B.focus=="function"&&B.focus(),B=0;Bh?32:h,q.T=null,h=Ll,Ll=null;var m=V4,C=i4;if(U0=0,z6=V4=null,i4=0,(s0&6)!==0)throw Error(l(331));var B=s0;if(s0|=4,eg(m.current),Xf(m,m.current,C,h),s0=B,j7(0,!1),r0&&typeof r0.onPostCommitFiberRoot=="function")try{r0.onPostCommitFiberRoot(J2,m)}catch{}return!0}finally{t2.p=u,q.T=v,_g(i,s)}}function Mg(i,s,h){s=X1(h,s),s=pl(i.stateNode,s,2),i=S4(i,s,2),i!==null&&(o7(i,2),A3(i))}function h0(i,s,h){if(i.tag===3)Mg(i,i,h);else for(;s!==null;){if(s.tag===3){Mg(s,i,h);break}else if(s.tag===1){var v=s.stateNode;if(typeof s.type.getDerivedStateFromError=="function"||typeof v.componentDidCatch=="function"&&(R4===null||!R4.has(v))){i=X1(h,i),h=wf(2),v=S4(s,h,2),v!==null&&(Cf(h,v,s,i),o7(v,2),A3(v));break}}s=s.return}}function Vl(i,s,h){var v=i.pingCache;if(v===null){v=i.pingCache=new Ub;var u=new Set;v.set(s,u)}else u=v.get(s),u===void 0&&(u=new Set,v.set(s,u));u.has(h)||(Al=!0,u.add(h),i=$b.bind(null,i,s,h),s.then(i,i))}function $b(i,s,h){var v=i.pingCache;v!==null&&v.delete(s),i.pingedLanes|=i.suspendedLanes&h,i.warmLanes&=~h,g0===i&&(K2&h)===h&&(y0===4||y0===3&&(K2&62914560)===K2&&300>J()-q9?(s0&2)===0&&M6(i,0):Sl|=h,_6===K2&&(_6=0)),A3(i)}function wg(i,s){s===0&&(s=fp()),i=g5(i,s),i!==null&&(o7(i,s),A3(i))}function Zb(i){var s=i.memoizedState,h=0;s!==null&&(h=s.retryLane),wg(i,h)}function Wb(i,s){var h=0;switch(i.tag){case 31:case 13:var v=i.stateNode,u=i.memoizedState;u!==null&&(h=u.retryLane);break;case 19:v=i.stateNode;break;case 22:v=i.stateNode._retryCache;break;default:throw Error(l(314))}v!==null&&v.delete(s),wg(i,h)}function Yb(i,s){return F3(i,s)}var Q9=null,C6=null,Il=!1,J9=!1,Nl=!1,N4=0;function A3(i){i!==C6&&i.next===null&&(C6===null?Q9=C6=i:C6=C6.next=i),J9=!0,Il||(Il=!0,Xb())}function j7(i,s){if(!Nl&&J9){Nl=!0;do for(var h=!1,v=Q9;v!==null;){if(i!==0){var u=v.pendingLanes;if(u===0)var m=0;else{var C=v.suspendedLanes,B=v.pingedLanes;m=(1<<31-A2(42|i)+1)-1,m&=u&~(C&~B),m=m&201326741?m&201326741|1:m?m|2:0}m!==0&&(h=!0,Fg(v,m))}else m=K2,m=l9(v,v===g0?m:0,v.cancelPendingCommit!==null||v.timeoutHandle!==-1),(m&3)===0||r7(v,m)||(h=!0,Fg(v,m));v=v.next}while(h);Nl=!1}}function Kb(){Cg()}function Cg(){J9=Il=!1;var i=0;N4!==0&&nF()&&(i=N4);for(var s=J(),h=null,v=Q9;v!==null;){var u=v.next,m=xg(v,s);m===0?(v.next=null,h===null?Q9=u:h.next=u,u===null&&(C6=h)):(h=v,(i!==0||(m&3)!==0)&&(J9=!0)),v=u}U0!==0&&U0!==5||j7(i),N4!==0&&(N4=0)}function xg(i,s){for(var h=i.suspendedLanes,v=i.pingedLanes,u=i.expirationTimes,m=i.pendingLanes&-62914561;0B)break;var r2=j.transferSize,p2=j.initiatorType;r2&&Lg(p2)&&(j=j.responseEnd,C+=r2*(j"u"?null:document;function qg(i,s,h){var v=x6;if(v&&typeof s=="string"&&s){var u=Y1(s);u='link[rel="'+i+'"][href="'+u+'"]',typeof h=="string"&&(u+='[crossorigin="'+h+'"]'),Gg.has(u)||(Gg.add(u),i={rel:i,crossOrigin:h,href:s},v.querySelector(u)===null&&(s=v.createElement("link"),l1(s,"link",i),$0(s),v.head.appendChild(s)))}}function uF(i){a4.D(i),qg("dns-prefetch",i,null)}function mF(i,s){a4.C(i,s),qg("preconnect",i,s)}function _F(i,s,h){a4.L(i,s,h);var v=x6;if(v&&i&&s){var u='link[rel="preload"][as="'+Y1(s)+'"]';s==="image"&&h&&h.imageSrcSet?(u+='[imagesrcset="'+Y1(h.imageSrcSet)+'"]',typeof h.imageSizes=="string"&&(u+='[imagesizes="'+Y1(h.imageSizes)+'"]')):u+='[href="'+Y1(i)+'"]';var m=u;switch(s){case"style":m=b6(i);break;case"script":m=F6(i)}l3.has(m)||(i=g({rel:"preload",href:s==="image"&&h&&h.imageSrcSet?void 0:i,as:s},h),l3.set(m,i),v.querySelector(u)!==null||s==="style"&&v.querySelector(Z7(m))||s==="script"&&v.querySelector(W7(m))||(s=v.createElement("link"),l1(s,"link",i),$0(s),v.head.appendChild(s)))}}function zF(i,s){a4.m(i,s);var h=x6;if(h&&i){var v=s&&typeof s.as=="string"?s.as:"script",u='link[rel="modulepreload"][as="'+Y1(v)+'"][href="'+Y1(i)+'"]',m=u;switch(v){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":m=F6(i)}if(!l3.has(m)&&(i=g({rel:"modulepreload",href:i},s),l3.set(m,i),h.querySelector(u)===null)){switch(v){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(h.querySelector(W7(m)))return}v=h.createElement("link"),l1(v,"link",i),$0(v),h.head.appendChild(v)}}}function MF(i,s,h){a4.S(i,s,h);var v=x6;if(v&&i){var u=$5(v).hoistableStyles,m=b6(i);s=s||"default";var C=u.get(m);if(!C){var B={loading:0,preload:null};if(C=v.querySelector(Z7(m)))B.loading=5;else{i=g({rel:"stylesheet",href:i,"data-precedence":s},h),(h=l3.get(m))&&ci(i,h);var j=C=v.createElement("link");$0(j),l1(j,"link",i),j._p=new Promise(function(K,r2){j.onload=K,j.onerror=r2}),j.addEventListener("load",function(){B.loading|=1}),j.addEventListener("error",function(){B.loading|=2}),B.loading|=4,ie(C,s,v)}C={type:"stylesheet",instance:C,count:1,state:B},u.set(m,C)}}}function wF(i,s){a4.X(i,s);var h=x6;if(h&&i){var v=$5(h).hoistableScripts,u=F6(i),m=v.get(u);m||(m=h.querySelector(W7(u)),m||(i=g({src:i,async:!0},s),(s=l3.get(u))&&ti(i,s),m=h.createElement("script"),$0(m),l1(m,"link",i),h.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},v.set(u,m))}}function CF(i,s){a4.M(i,s);var h=x6;if(h&&i){var v=$5(h).hoistableScripts,u=F6(i),m=v.get(u);m||(m=h.querySelector(W7(u)),m||(i=g({src:i,async:!0,type:"module"},s),(s=l3.get(u))&&ti(i,s),m=h.createElement("script"),$0(m),l1(m,"link",i),h.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},v.set(u,m))}}function $g(i,s,h,v){var u=(u=C2.current)?le(u):null;if(!u)throw Error(l(446));switch(i){case"meta":case"title":return null;case"style":return typeof h.precedence=="string"&&typeof h.href=="string"?(s=b6(h.href),h=$5(u).hoistableStyles,v=h.get(s),v||(v={type:"style",instance:null,count:0,state:null},h.set(s,v)),v):{type:"void",instance:null,count:0,state:null};case"link":if(h.rel==="stylesheet"&&typeof h.href=="string"&&typeof h.precedence=="string"){i=b6(h.href);var m=$5(u).hoistableStyles,C=m.get(i);if(C||(u=u.ownerDocument||u,C={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},m.set(i,C),(m=u.querySelector(Z7(i)))&&!m._p&&(C.instance=m,C.state.loading=5),l3.has(i)||(h={rel:"preload",as:"style",href:h.href,crossOrigin:h.crossOrigin,integrity:h.integrity,media:h.media,hrefLang:h.hrefLang,referrerPolicy:h.referrerPolicy},l3.set(i,h),m||xF(u,i,h,C.state))),s&&v===null)throw Error(l(528,""));return C}if(s&&v!==null)throw Error(l(529,""));return null;case"script":return s=h.async,h=h.src,typeof h=="string"&&s&&typeof s!="function"&&typeof s!="symbol"?(s=F6(h),h=$5(u).hoistableScripts,v=h.get(s),v||(v={type:"script",instance:null,count:0,state:null},h.set(s,v)),v):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,i))}}function b6(i){return'href="'+Y1(i)+'"'}function Z7(i){return'link[rel="stylesheet"]['+i+"]"}function Zg(i){return g({},i,{"data-precedence":i.precedence,precedence:null})}function xF(i,s,h,v){i.querySelector('link[rel="preload"][as="style"]['+s+"]")?v.loading=1:(s=i.createElement("link"),v.preload=s,s.addEventListener("load",function(){return v.loading|=1}),s.addEventListener("error",function(){return v.loading|=2}),l1(s,"link",h),$0(s),i.head.appendChild(s))}function F6(i){return'[src="'+Y1(i)+'"]'}function W7(i){return"script[async]"+i}function Wg(i,s,h){if(s.count++,s.instance===null)switch(s.type){case"style":var v=i.querySelector('style[data-href~="'+Y1(h.href)+'"]');if(v)return s.instance=v,$0(v),v;var u=g({},h,{"data-href":h.href,"data-precedence":h.precedence,href:null,precedence:null});return v=(i.ownerDocument||i).createElement("style"),$0(v),l1(v,"style",u),ie(v,h.precedence,i),s.instance=v;case"stylesheet":u=b6(h.href);var m=i.querySelector(Z7(u));if(m)return s.state.loading|=4,s.instance=m,$0(m),m;v=Zg(h),(u=l3.get(u))&&ci(v,u),m=(i.ownerDocument||i).createElement("link"),$0(m);var C=m;return C._p=new Promise(function(B,j){C.onload=B,C.onerror=j}),l1(m,"link",v),s.state.loading|=4,ie(m,h.precedence,i),s.instance=m;case"script":return m=F6(h.src),(u=i.querySelector(W7(m)))?(s.instance=u,$0(u),u):(v=h,(u=l3.get(m))&&(v=g({},h),ti(v,u)),i=i.ownerDocument||i,u=i.createElement("script"),$0(u),l1(u,"link",v),i.head.appendChild(u),s.instance=u);case"void":return null;default:throw Error(l(443,s.type))}else s.type==="stylesheet"&&(s.state.loading&4)===0&&(v=s.instance,s.state.loading|=4,ie(v,h.precedence,i));return s.instance}function ie(i,s,h){for(var v=h.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=v.length?v[v.length-1]:null,m=u,C=0;C title"):null)}function bF(i,s,h){if(h===1||s.itemProp!=null)return!1;switch(i){case"meta":case"title":return!0;case"style":if(typeof s.precedence!="string"||typeof s.href!="string"||s.href==="")break;return!0;case"link":if(typeof s.rel!="string"||typeof s.href!="string"||s.href===""||s.onLoad||s.onError)break;return s.rel==="stylesheet"?(i=s.disabled,typeof s.precedence=="string"&&i==null):!0;case"script":if(s.async&&typeof s.async!="function"&&typeof s.async!="symbol"&&!s.onLoad&&!s.onError&&s.src&&typeof s.src=="string")return!0}return!1}function Xg(i){return!(i.type==="stylesheet"&&(i.state.loading&3)===0)}function FF(i,s,h,v){if(h.type==="stylesheet"&&(typeof v.media!="string"||matchMedia(v.media).matches!==!1)&&(h.state.loading&4)===0){if(h.instance===null){var u=b6(v.href),m=s.querySelector(Z7(u));if(m){s=m._p,s!==null&&typeof s=="object"&&typeof s.then=="function"&&(i.count++,i=se.bind(i),s.then(i,i)),h.state.loading|=4,h.instance=m,$0(m);return}m=s.ownerDocument||s,v=Zg(v),(u=l3.get(u))&&ci(v,u),m=m.createElement("link"),$0(m);var C=m;C._p=new Promise(function(B,j){C.onload=B,C.onerror=j}),l1(m,"link",v),h.instance=m}i.stylesheets===null&&(i.stylesheets=new Map),i.stylesheets.set(h,s),(s=h.state.preload)&&(h.state.loading&3)===0&&(i.count++,h=se.bind(i),s.addEventListener("load",h),s.addEventListener("error",h))}}var li=0;function EF(i,s){return i.stylesheets&&i.count===0&&re(i,i.stylesheets),0li?50:800)+s);return i.unsuspend=h,function(){i.unsuspend=null,clearTimeout(v),clearTimeout(u)}}:null}function se(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)re(this,this.stylesheets);else if(this.unsuspend){var i=this.unsuspend;this.unsuspend=null,i()}}}var ne=null;function re(i,s){i.stylesheets=null,i.unsuspend!==null&&(i.count++,ne=new Map,s.forEach(yF,i),ne=null,se.call(i))}function yF(i,s){if(!(s.state.loading&4)){var h=ne.get(i);if(h)var v=h.get(null);else{h=new Map,ne.set(i,h);for(var u=i.querySelectorAll("link[data-precedence],style[data-precedence]"),m=0;m"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(c){console.error(c)}}return e(),pi.exports=jF(),pi.exports}var qF=GF();const $F=zc(qF);var wu="popstate";function ZF(e={}){function c(a,n){let{pathname:r="/",search:o="",hash:d=""}=N5(a.location.hash.substring(1));return!r.startsWith("/")&&!r.startsWith(".")&&(r="/"+r),na("",{pathname:r,search:o,hash:d},n.state&&n.state.usr||null,n.state&&n.state.key||"default")}function t(a,n){let r=a.document.querySelector("base"),o="";if(r&&r.getAttribute("href")){let d=a.location.href,p=d.indexOf("#");o=p===-1?d:d.slice(0,p)}return o+"#"+(typeof n=="string"?n:E8(n))}function l(a,n){h3(a.pathname.charAt(0)==="/",`relative pathnames are not supported in hash history.push(${JSON.stringify(n)})`)}return YF(c,t,l,e)}function F0(e,c){if(e===!1||e===null||typeof e>"u")throw new Error(c)}function h3(e,c){if(!e){typeof console<"u"&&console.warn(c);try{throw new Error(c)}catch{}}}function WF(){return Math.random().toString(36).substring(2,10)}function Cu(e,c){return{usr:e.state,key:e.key,idx:c}}function na(e,c,t=null,l){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof c=="string"?N5(c):c,state:t,key:c&&c.key||l||WF()}}function E8({pathname:e="/",search:c="",hash:t=""}){return c&&c!=="?"&&(e+=c.charAt(0)==="?"?c:"?"+c),t&&t!=="#"&&(e+=t.charAt(0)==="#"?t:"#"+t),e}function N5(e){let c={};if(e){let t=e.indexOf("#");t>=0&&(c.hash=e.substring(t),e=e.substring(0,t));let l=e.indexOf("?");l>=0&&(c.search=e.substring(l),e=e.substring(0,l)),e&&(c.pathname=e)}return c}function YF(e,c,t,l={}){let{window:a=document.defaultView,v5Compat:n=!1}=l,r=a.history,o="POP",d=null,p=f();p==null&&(p=0,r.replaceState({...r.state,idx:p},""));function f(){return(r.state||{idx:null}).idx}function g(){o="POP";let y=f(),x=y==null?null:y-p;p=y,d&&d({action:o,location:w.location,delta:x})}function _(y,x){o="PUSH";let k=na(w.location,y,x);t&&t(k,y),p=f()+1;let S=Cu(k,p),F=w.createHref(k);try{r.pushState(S,"",F)}catch(E){if(E instanceof DOMException&&E.name==="DataCloneError")throw E;a.location.assign(F)}n&&d&&d({action:o,location:w.location,delta:1})}function z(y,x){o="REPLACE";let k=na(w.location,y,x);t&&t(k,y),p=f();let S=Cu(k,p),F=w.createHref(k);r.replaceState(S,"",F),n&&d&&d({action:o,location:w.location,delta:0})}function M(y){return KF(y)}let w={get action(){return o},get location(){return e(a,r)},listen(y){if(d)throw new Error("A history only accepts one active listener");return a.addEventListener(wu,g),d=y,()=>{a.removeEventListener(wu,g),d=null}},createHref(y){return c(a,y)},createURL:M,encodeLocation(y){let x=M(y);return{pathname:x.pathname,search:x.search,hash:x.hash}},push:_,replace:z,go(y){return r.go(y)}};return w}function KF(e,c=!1){let t="http://localhost";typeof window<"u"&&(t=window.location.origin!=="null"?window.location.origin:window.location.href),F0(t,"No window.location.(origin|href) available to create URL");let l=typeof e=="string"?e:E8(e);return l=l.replace(/ $/,"%20"),!c&&l.startsWith("//")&&(l=t+l),new URL(l,t)}function W_(e,c,t="/"){return XF(e,c,t,!1)}function XF(e,c,t,l){let a=typeof c=="string"?N5(c):c,n=f4(a.pathname||"/",t);if(n==null)return null;let r=Y_(e);QF(r);let o=null;for(let d=0;o==null&&d{let f={relativePath:p===void 0?r.path||"":p,caseSensitive:r.caseSensitive===!0,childrenIndex:o,route:r};if(f.relativePath.startsWith("/")){if(!f.relativePath.startsWith(l)&&d)return;F0(f.relativePath.startsWith(l),`Absolute route path "${f.relativePath}" nested under path "${l}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),f.relativePath=f.relativePath.slice(l.length)}let g=v4([l,f.relativePath]),_=t.concat(f);r.children&&r.children.length>0&&(F0(r.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${g}".`),Y_(r.children,c,_,g,d)),!(r.path==null&&!r.index)&&c.push({path:g,score:aE(g,r.index),routesMeta:_})};return e.forEach((r,o)=>{if(r.path===""||!r.path?.includes("?"))n(r,o);else for(let d of K_(r.path))n(r,o,!0,d)}),c}function K_(e){let c=e.split("/");if(c.length===0)return[];let[t,...l]=c,a=t.endsWith("?"),n=t.replace(/\?$/,"");if(l.length===0)return a?[n,""]:[n];let r=K_(l.join("/")),o=[];return o.push(...r.map(d=>d===""?n:[n,d].join("/"))),a&&o.push(...r),o.map(d=>e.startsWith("/")&&d===""?"/":d)}function QF(e){e.sort((c,t)=>c.score!==t.score?t.score-c.score:sE(c.routesMeta.map(l=>l.childrenIndex),t.routesMeta.map(l=>l.childrenIndex)))}var JF=/^:[\w-]+$/,eE=3,cE=2,tE=1,lE=10,iE=-2,xu=e=>e==="*";function aE(e,c){let t=e.split("/"),l=t.length;return t.some(xu)&&(l+=iE),c&&(l+=cE),t.filter(a=>!xu(a)).reduce((a,n)=>a+(JF.test(n)?eE:n===""?tE:lE),l)}function sE(e,c){return e.length===c.length&&e.slice(0,-1).every((l,a)=>l===c[a])?e[e.length-1]-c[c.length-1]:0}function nE(e,c,t=!1){let{routesMeta:l}=e,a={},n="/",r=[];for(let o=0;o{if(f==="*"){let M=o[_]||"";r=n.slice(0,n.length-M.length).replace(/(.)\/+$/,"$1")}const z=o[_];return g&&!z?p[f]=void 0:p[f]=(z||"").replace(/%2F/g,"/"),p},{}),pathname:n,pathnameBase:r,pattern:e}}function rE(e,c=!1,t=!0){h3(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 l=[],a="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(r,o,d)=>(l.push({paramName:o,isOptional:d!=null}),d?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(l.push({paramName:"*"}),a+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):t?a+="\\/*$":e!==""&&e!=="/"&&(a+="(?:(?=\\/|$))"),[new RegExp(a,c?void 0:"i"),l]}function oE(e){try{return e.split("/").map(c=>decodeURIComponent(c).replace(/\//g,"%2F")).join("/")}catch(c){return h3(!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 (${c}).`),e}}function f4(e,c){if(c==="/")return e;if(!e.toLowerCase().startsWith(c.toLowerCase()))return null;let t=c.endsWith("/")?c.length-1:c.length,l=e.charAt(t);return l&&l!=="/"?null:e.slice(t)||"/"}var X_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,hE=e=>X_.test(e);function dE(e,c="/"){let{pathname:t,search:l="",hash:a=""}=typeof e=="string"?N5(e):e,n;if(t)if(hE(t))n=t;else{if(t.includes("//")){let r=t;t=t.replace(/\/\/+/g,"/"),h3(!1,`Pathnames cannot have embedded double slashes - normalizing ${r} -> ${t}`)}t.startsWith("/")?n=bu(t.substring(1),"/"):n=bu(t,c)}else n=c;return{pathname:n,search:fE(l),hash:gE(a)}}function bu(e,c){let t=c.replace(/\/+$/,"").split("/");return e.split("/").forEach(a=>{a===".."?t.length>1&&t.pop():a!=="."&&t.push(a)}),t.length>1?t.join("/"):"/"}function ui(e,c,t,l){return`Cannot include a '${e}' character in a manually specified \`to.${c}\` field [${JSON.stringify(l)}]. Please separate it out to the \`to.${t}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function pE(e){return e.filter((c,t)=>t===0||c.route.path&&c.route.path.length>0)}function Q_(e){let c=pE(e);return c.map((t,l)=>l===c.length-1?t.pathname:t.pathnameBase)}function J_(e,c,t,l=!1){let a;typeof e=="string"?a=N5(e):(a={...e},F0(!a.pathname||!a.pathname.includes("?"),ui("?","pathname","search",a)),F0(!a.pathname||!a.pathname.includes("#"),ui("#","pathname","hash",a)),F0(!a.search||!a.search.includes("#"),ui("#","search","hash",a)));let n=e===""||a.pathname==="",r=n?"/":a.pathname,o;if(r==null)o=t;else{let g=c.length-1;if(!l&&r.startsWith("..")){let _=r.split("/");for(;_[0]==="..";)_.shift(),g-=1;a.pathname=_.join("/")}o=g>=0?c[g]:"/"}let d=dE(a,o),p=r&&r!=="/"&&r.endsWith("/"),f=(n||r===".")&&t.endsWith("/");return!d.pathname.endsWith("/")&&(p||f)&&(d.pathname+="/"),d}var v4=e=>e.join("/").replace(/\/\/+/g,"/"),vE=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),fE=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,gE=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,uE=class{constructor(e,c,t,l=!1){this.status=e,this.statusText=c||"",this.internal=l,t instanceof Error?(this.data=t.toString(),this.error=t):this.data=t}};function mE(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function _E(e){return e.map(c=>c.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var ez=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function cz(e,c){let t=e;if(typeof t!="string"||!X_.test(t))return{absoluteURL:void 0,isExternal:!1,to:t};let l=t,a=!1;if(ez)try{let n=new URL(window.location.href),r=t.startsWith("//")?new URL(n.protocol+t):new URL(t),o=f4(r.pathname,c);r.origin===n.origin&&o!=null?t=o+r.search+r.hash:a=!0}catch{h3(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:l,isExternal:a,to:t}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var tz=["POST","PUT","PATCH","DELETE"];new Set(tz);var zE=["GET",...tz];new Set(zE);var K6=R.createContext(null);K6.displayName="DataRouter";var Mc=R.createContext(null);Mc.displayName="DataRouterState";var ME=R.createContext(!1),lz=R.createContext({isTransitioning:!1});lz.displayName="ViewTransition";var wE=R.createContext(new Map);wE.displayName="Fetchers";var CE=R.createContext(null);CE.displayName="Await";var d3=R.createContext(null);d3.displayName="Navigation";var N8=R.createContext(null);N8.displayName="Location";var u4=R.createContext({outlet:null,matches:[],isDataRoute:!1});u4.displayName="Route";var rs=R.createContext(null);rs.displayName="RouteError";var iz="REACT_ROUTER_ERROR",xE="REDIRECT",bE="ROUTE_ERROR_RESPONSE";function FE(e){if(e.startsWith(`${iz}:${xE}:{`))try{let c=JSON.parse(e.slice(28));if(typeof c=="object"&&c&&typeof c.status=="number"&&typeof c.statusText=="string"&&typeof c.location=="string"&&typeof c.reloadDocument=="boolean"&&typeof c.replace=="boolean")return c}catch{}}function EE(e){if(e.startsWith(`${iz}:${bE}:{`))try{let c=JSON.parse(e.slice(40));if(typeof c=="object"&&c&&typeof c.status=="number"&&typeof c.statusText=="string")return new uE(c.status,c.statusText,c.data)}catch{}}function yE(e,{relative:c}={}){F0(O8(),"useHref() may be used only in the context of a component.");let{basename:t,navigator:l}=R.useContext(d3),{hash:a,pathname:n,search:r}=U8(e,{relative:c}),o=n;return t!=="/"&&(o=n==="/"?t:v4([t,n])),l.createHref({pathname:o,search:r,hash:a})}function O8(){return R.useContext(N8)!=null}function a5(){return F0(O8(),"useLocation() may be used only in the context of a component."),R.useContext(N8).location}var az="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function sz(e){R.useContext(d3).static||R.useLayoutEffect(e)}function os(){let{isDataRoute:e}=R.useContext(u4);return e?OE():DE()}function DE(){F0(O8(),"useNavigate() may be used only in the context of a component.");let e=R.useContext(K6),{basename:c,navigator:t}=R.useContext(d3),{matches:l}=R.useContext(u4),{pathname:a}=a5(),n=JSON.stringify(Q_(l)),r=R.useRef(!1);return sz(()=>{r.current=!0}),R.useCallback((d,p={})=>{if(h3(r.current,az),!r.current)return;if(typeof d=="number"){t.go(d);return}let f=J_(d,JSON.parse(n),a,p.relative==="path");e==null&&c!=="/"&&(f.pathname=f.pathname==="/"?c:v4([c,f.pathname])),(p.replace?t.replace:t.push)(f,p.state,p)},[c,t,n,a,e])}R.createContext(null);function U8(e,{relative:c}={}){let{matches:t}=R.useContext(u4),{pathname:l}=a5(),a=JSON.stringify(Q_(t));return R.useMemo(()=>J_(e,JSON.parse(a),l,c==="path"),[e,a,l,c])}function AE(e,c){return nz(e,c)}function nz(e,c,t,l,a){F0(O8(),"useRoutes() may be used only in the context of a component.");let{navigator:n}=R.useContext(d3),{matches:r}=R.useContext(u4),o=r[r.length-1],d=o?o.params:{},p=o?o.pathname:"/",f=o?o.pathnameBase:"/",g=o&&o.route;{let k=g&&g.path||"";oz(p,!g||k.endsWith("*")||k.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${p}" (under ) 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. +`+v.stack}}var y4=Object.prototype.hasOwnProperty,D3=e.unstable_scheduleCallback,g5=e.unstable_cancelCallback,Q5=e.unstable_shouldYield,w7=e.unstable_requestPaint,K0=e.unstable_now,J5=e.unstable_getCurrentPriorityLevel,n2=e.unstable_ImmediatePriority,z2=e.unstable_UserBlockingPriority,W=e.unstable_NormalPriority,f2=e.unstable_LowPriority,v2=e.unstable_IdlePriority,k2=e.log,R2=e.unstable_setDisableYieldValue,n0=null,c0=null;function j2(a){if(typeof k2=="function"&&R2(a),c0&&typeof c0.setStrictMode=="function")try{c0.setStrictMode(n0,a)}catch{}}var J2=Math.clz32?Math.clz32:e6,W1=Math.log,X0=Math.LN2;function e6(a){return a>>>=0,a===0?32:31-(W1(a)/X0|0)|0}var D4=256,M9=262144,w9=4194304;function u5(a){var n=a&42;if(n!==0)return n;switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return a&261888;case 262144:case 524288:case 1048576:case 2097152:return a&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return a&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return a}}function C9(a,n,h){var v=a.pendingLanes;if(v===0)return 0;var u=0,m=a.suspendedLanes,b=a.pingedLanes;a=a.warmLanes;var A=v&134217727;return A!==0?(v=A&~m,v!==0?u=u5(v):(b&=A,b!==0?u=u5(b):h||(h=A&~a,h!==0&&(u=u5(h))))):(A=v&~m,A!==0?u=u5(A):b!==0?u=u5(b):h||(h=v&~a,h!==0&&(u=u5(h)))),u===0?0:n!==0&&n!==u&&(n&m)===0&&(m=u&-u,h=n&-n,m>=h||m===32&&(h&4194048)!==0)?n:u}function C7(a,n){return(a.pendingLanes&~(a.suspendedLanes&~a.pingedLanes)&n)===0}function dx(a,n){switch(a){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Hp(){var a=w9;return w9<<=1,(w9&62914560)===0&&(w9=4194304),a}function gt(a){for(var n=[],h=0;31>h;h++)n.push(a);return n}function b7(a,n){a.pendingLanes|=n,n!==268435456&&(a.suspendedLanes=0,a.pingedLanes=0,a.warmLanes=0)}function px(a,n,h,v,u,m){var b=a.pendingLanes;a.pendingLanes=h,a.suspendedLanes=0,a.pingedLanes=0,a.warmLanes=0,a.expiredLanes&=h,a.entangledLanes&=h,a.errorRecoveryDisabledLanes&=h,a.shellSuspendCounter=0;var A=a.entanglements,P=a.expirationTimes,K=a.hiddenUpdates;for(h=b&~h;0"u")return null;try{return a.activeElement||a.body}catch{return a.body}}var _x=/[\n"\\]/g;function K1(a){return a.replace(_x,function(n){return"\\"+n.charCodeAt(0).toString(16)+" "})}function wt(a,n,h,v,u,m,b,A){a.name="",b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"?a.type=b:a.removeAttribute("type"),n!=null?b==="number"?(n===0&&a.value===""||a.value!=n)&&(a.value=""+Y1(n)):a.value!==""+Y1(n)&&(a.value=""+Y1(n)):b!=="submit"&&b!=="reset"||a.removeAttribute("value"),n!=null?Ct(a,b,Y1(n)):h!=null?Ct(a,b,Y1(h)):v!=null&&a.removeAttribute("value"),u==null&&m!=null&&(a.defaultChecked=!!m),u!=null&&(a.checked=u&&typeof u!="function"&&typeof u!="symbol"),A!=null&&typeof A!="function"&&typeof A!="symbol"&&typeof A!="boolean"?a.name=""+Y1(A):a.removeAttribute("name")}function Wp(a,n,h,v,u,m,b,A){if(m!=null&&typeof m!="function"&&typeof m!="symbol"&&typeof m!="boolean"&&(a.type=m),n!=null||h!=null){if(!(m!=="submit"&&m!=="reset"||n!=null)){Mt(a);return}h=h!=null?""+Y1(h):"",n=n!=null?""+Y1(n):h,A||n===a.value||(a.value=n),a.defaultValue=n}v=v??u,v=typeof v!="function"&&typeof v!="symbol"&&!!v,a.checked=A?a.checked:!!v,a.defaultChecked=!!v,b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(a.name=b),Mt(a)}function Ct(a,n,h){n==="number"&&F9(a.ownerDocument)===a||a.defaultValue===""+h||(a.defaultValue=""+h)}function s6(a,n,h,v){if(a=a.options,n){n={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),yt=!1;if(K3)try{var y7={};Object.defineProperty(y7,"passive",{get:function(){yt=!0}}),window.addEventListener("test",y7,y7),window.removeEventListener("test",y7,y7)}catch{yt=!1}var S4=null,Dt=null,y9=null;function cv(){if(y9)return y9;var a,n=Dt,h=n.length,v,u="value"in S4?S4.value:S4.textContent,m=u.length;for(a=0;a=S7),nv=" ",rv=!1;function ov(a,n){switch(a){case"keyup":return $x.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hv(a){return a=a.detail,typeof a=="object"&&"data"in a?a.data:null}var h6=!1;function Wx(a,n){switch(a){case"compositionend":return hv(n);case"keypress":return n.which!==32?null:(rv=!0,nv);case"textInput":return a=n.data,a===nv&&rv?null:a;default:return null}}function Yx(a,n){if(h6)return a==="compositionend"||!Tt&&ov(a,n)?(a=cv(),y9=Dt=S4=null,h6=!1,a):null;switch(a){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:h,offset:n-a};a=v}e:{for(;h;){if(h.nextSibling){h=h.nextSibling;break e}h=h.parentNode}h=void 0}h=_v(h)}}function Mv(a,n){return a&&n?a===n?!0:a&&a.nodeType===3?!1:n&&n.nodeType===3?Mv(a,n.parentNode):"contains"in a?a.contains(n):a.compareDocumentPosition?!!(a.compareDocumentPosition(n)&16):!1:!1}function wv(a){a=a!=null&&a.ownerDocument!=null&&a.ownerDocument.defaultView!=null?a.ownerDocument.defaultView:window;for(var n=F9(a.document);n instanceof a.HTMLIFrameElement;){try{var h=typeof n.contentWindow.location.href=="string"}catch{h=!1}if(h)a=n.contentWindow;else break;n=F9(a.document)}return n}function Rt(a){var n=a&&a.nodeName&&a.nodeName.toLowerCase();return n&&(n==="input"&&(a.type==="text"||a.type==="search"||a.type==="tel"||a.type==="url"||a.type==="password")||n==="textarea"||a.contentEditable==="true")}var lF=K3&&"documentMode"in document&&11>=document.documentMode,d6=null,It=null,L7=null,Vt=!1;function Cv(a,n,h){var v=h.window===h?h.document:h.nodeType===9?h:h.ownerDocument;Vt||d6==null||d6!==F9(v)||(v=d6,"selectionStart"in v&&Rt(v)?v={start:v.selectionStart,end:v.selectionEnd}:(v=(v.ownerDocument&&v.ownerDocument.defaultView||window).getSelection(),v={anchorNode:v.anchorNode,anchorOffset:v.anchorOffset,focusNode:v.focusNode,focusOffset:v.focusOffset}),L7&&T7(L7,v)||(L7=v,v=Me(It,"onSelect"),0>=b,u-=b,A3=1<<32-J2(n)+u|h<V2?(K2=y2,y2=null):K2=y2.sibling;var i0=Q($,y2,Y[V2],o2);if(i0===null){y2===null&&(y2=K2);break}a&&y2&&i0.alternate===null&&n($,y2),G=m(i0,G,V2),l0===null?D2=i0:l0.sibling=i0,l0=i0,y2=K2}if(V2===Y.length)return h($,y2),Q2&&Q3($,V2),D2;if(y2===null){for(;V2V2?(K2=y2,y2=null):K2=y2.sibling;var Q4=Q($,y2,i0.value,o2);if(Q4===null){y2===null&&(y2=K2);break}a&&y2&&Q4.alternate===null&&n($,y2),G=m(Q4,G,V2),l0===null?D2=Q4:l0.sibling=Q4,l0=Q4,y2=K2}if(i0.done)return h($,y2),Q2&&Q3($,V2),D2;if(y2===null){for(;!i0.done;V2++,i0=Y.next())i0=h2($,i0.value,o2),i0!==null&&(G=m(i0,G,V2),l0===null?D2=i0:l0.sibling=i0,l0=i0);return Q2&&Q3($,V2),D2}for(y2=v(y2);!i0.done;V2++,i0=Y.next())i0=t2(y2,$,V2,i0.value,o2),i0!==null&&(a&&i0.alternate!==null&&y2.delete(i0.key===null?V2:i0.key),G=m(i0,G,V2),l0===null?D2=i0:l0.sibling=i0,l0=i0);return a&&y2.forEach(function(bE){return n($,bE)}),Q2&&Q3($,V2),D2}function p0($,G,Y,o2){if(typeof Y=="object"&&Y!==null&&Y.type===w&&Y.key===null&&(Y=Y.props.children),typeof Y=="object"&&Y!==null){switch(Y.$$typeof){case z:e:{for(var D2=Y.key;G!==null;){if(G.key===D2){if(D2=Y.type,D2===w){if(G.tag===7){h($,G.sibling),o2=u(G,Y.props.children),o2.return=$,$=o2;break e}}else if(G.elementType===D2||typeof D2=="object"&&D2!==null&&D2.$$typeof===U&&y5(D2)===G.type){h($,G.sibling),o2=u(G,Y.props),O7(o2,Y),o2.return=$,$=o2;break e}h($,G);break}else n($,G);G=G.sibling}Y.type===w?(o2=C5(Y.props.children,$.mode,o2,Y.key),o2.return=$,$=o2):(o2=I9(Y.type,Y.key,Y.props,null,$.mode,o2),O7(o2,Y),o2.return=$,$=o2)}return b($);case M:e:{for(D2=Y.key;G!==null;){if(G.key===D2)if(G.tag===4&&G.stateNode.containerInfo===Y.containerInfo&&G.stateNode.implementation===Y.implementation){h($,G.sibling),o2=u(G,Y.children||[]),o2.return=$,$=o2;break e}else{h($,G);break}else n($,G);G=G.sibling}o2=qt(Y,$.mode,o2),o2.return=$,$=o2}return b($);case U:return Y=y5(Y),p0($,G,Y,o2)}if(i2(Y))return b2($,G,Y,o2);if(Z(Y)){if(D2=Z(Y),typeof D2!="function")throw Error(l(150));return Y=D2.call(Y),B2($,G,Y,o2)}if(typeof Y.then=="function")return p0($,G,G9(Y),o2);if(Y.$$typeof===S)return p0($,G,O9($,Y),o2);q9($,Y)}return typeof Y=="string"&&Y!==""||typeof Y=="number"||typeof Y=="bigint"?(Y=""+Y,G!==null&&G.tag===6?(h($,G.sibling),o2=u(G,Y),o2.return=$,$=o2):(h($,G),o2=Gt(Y,$.mode,o2),o2.return=$,$=o2),b($)):h($,G)}return function($,G,Y,o2){try{N7=0;var D2=p0($,G,Y,o2);return C6=null,D2}catch(y2){if(y2===w6||y2===P9)throw y2;var l0=I1(29,y2,null,$.mode);return l0.lanes=o2,l0.return=$,l0}}}var A5=qv(!0),$v=qv(!1),H4=!1;function ll(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function il(a,n){a=a.updateQueue,n.updateQueue===a&&(n.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,callbacks:null})}function R4(a){return{lane:a,tag:0,payload:null,callback:null,next:null}}function I4(a,n,h){var v=a.updateQueue;if(v===null)return null;if(v=v.shared,(a0&2)!==0){var u=v.pending;return u===null?n.next=n:(n.next=u.next,u.next=n),v.pending=n,n=R9(a),Av(a,null,h),n}return H9(a,v,n,h),R9(a)}function U7(a,n,h){if(n=n.updateQueue,n!==null&&(n=n.shared,(h&4194048)!==0)){var v=n.lanes;v&=a.pendingLanes,h|=v,n.lanes=h,Ip(a,h)}}function al(a,n){var h=a.updateQueue,v=a.alternate;if(v!==null&&(v=v.updateQueue,h===v)){var u=null,m=null;if(h=h.firstBaseUpdate,h!==null){do{var b={lane:h.lane,tag:h.tag,payload:h.payload,callback:null,next:null};m===null?u=m=b:m=m.next=b,h=h.next}while(h!==null);m===null?u=m=n:m=m.next=n}else u=m=n;h={baseState:v.baseState,firstBaseUpdate:u,lastBaseUpdate:m,shared:v.shared,callbacks:v.callbacks},a.updateQueue=h;return}a=h.lastBaseUpdate,a===null?h.firstBaseUpdate=n:a.next=n,h.lastBaseUpdate=n}var sl=!1;function P7(){if(sl){var a=M6;if(a!==null)throw a}}function j7(a,n,h,v){sl=!1;var u=a.updateQueue;H4=!1;var m=u.firstBaseUpdate,b=u.lastBaseUpdate,A=u.shared.pending;if(A!==null){u.shared.pending=null;var P=A,K=P.next;P.next=null,b===null?m=K:b.next=K,b=P;var a2=a.alternate;a2!==null&&(a2=a2.updateQueue,A=a2.lastBaseUpdate,A!==b&&(A===null?a2.firstBaseUpdate=K:A.next=K,a2.lastBaseUpdate=P))}if(m!==null){var h2=u.baseState;b=0,a2=K=P=null,A=m;do{var Q=A.lane&-536870913,t2=Q!==A.lane;if(t2?(Y2&Q)===Q:(v&Q)===Q){Q!==0&&Q===z6&&(sl=!0),a2!==null&&(a2=a2.next={lane:0,tag:A.tag,payload:A.payload,callback:null,next:null});e:{var b2=a,B2=A;Q=n;var p0=h;switch(B2.tag){case 1:if(b2=B2.payload,typeof b2=="function"){h2=b2.call(p0,h2,Q);break e}h2=b2;break e;case 3:b2.flags=b2.flags&-65537|128;case 0:if(b2=B2.payload,Q=typeof b2=="function"?b2.call(p0,h2,Q):b2,Q==null)break e;h2=g({},h2,Q);break e;case 2:H4=!0}}Q=A.callback,Q!==null&&(a.flags|=64,t2&&(a.flags|=8192),t2=u.callbacks,t2===null?u.callbacks=[Q]:t2.push(Q))}else t2={lane:Q,tag:A.tag,payload:A.payload,callback:A.callback,next:null},a2===null?(K=a2=t2,P=h2):a2=a2.next=t2,b|=Q;if(A=A.next,A===null){if(A=u.shared.pending,A===null)break;t2=A,A=t2.next,t2.next=null,u.lastBaseUpdate=t2,u.shared.pending=null}}while(!0);a2===null&&(P=h2),u.baseState=P,u.firstBaseUpdate=K,u.lastBaseUpdate=a2,m===null&&(u.shared.lanes=0),P4|=b,a.lanes=b,a.memoizedState=h2}}function Zv(a,n){if(typeof a!="function")throw Error(l(191,a));a.call(n)}function Wv(a,n){var h=a.callbacks;if(h!==null)for(a.callbacks=null,a=0;am?m:8;var b=q.T,A={};q.T=A,Fl(a,!1,n,h);try{var P=u(),K=q.S;if(K!==null&&K(A,P),P!==null&&typeof P=="object"&&typeof P.then=="function"){var a2=pF(P,v);$7(a,n,a2,P1(a))}else $7(a,n,v,P1(a))}catch(h2){$7(a,n,{then:function(){},status:"rejected",reason:h2},P1())}finally{l2.p=m,b!==null&&A.types!==null&&(b.types=A.types),q.T=b}}function _F(){}function bl(a,n,h,v){if(a.tag!==5)throw Error(l(476));var u=yf(a).queue;Ef(a,u,n,m2,h===null?_F:function(){return Df(a),h(v)})}function yf(a){var n=a.memoizedState;if(n!==null)return n;n={memoizedState:m2,baseState:m2,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:t4,lastRenderedState:m2},next:null};var h={};return n.next={memoizedState:h,baseState:h,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:t4,lastRenderedState:h},next:null},a.memoizedState=n,a=a.alternate,a!==null&&(a.memoizedState=n),n}function Df(a){var n=yf(a);n.next===null&&(n=a.alternate.memoizedState),$7(a,n.next.queue,{},P1())}function xl(){return e1(o8)}function Af(){return B0().memoizedState}function Sf(){return B0().memoizedState}function zF(a){for(var n=a.return;n!==null;){switch(n.tag){case 24:case 3:var h=P1();a=R4(h);var v=I4(n,a,h);v!==null&&(y1(v,n,h),U7(v,n,h)),n={cache:Jt()},a.payload=n;return}n=n.return}}function MF(a,n,h){var v=P1();h={lane:v,revertLane:0,gesture:null,action:h,hasEagerState:!1,eagerState:null,next:null},ce(a)?kf(n,h):(h=Pt(a,n,h,v),h!==null&&(y1(h,a,v),Tf(h,n,v)))}function Bf(a,n,h){var v=P1();$7(a,n,h,v)}function $7(a,n,h,v){var u={lane:v,revertLane:0,gesture:null,action:h,hasEagerState:!1,eagerState:null,next:null};if(ce(a))kf(n,u);else{var m=a.alternate;if(a.lanes===0&&(m===null||m.lanes===0)&&(m=n.lastRenderedReducer,m!==null))try{var b=n.lastRenderedState,A=m(b,h);if(u.hasEagerState=!0,u.eagerState=A,R1(A,b))return H9(a,n,u,0),f0===null&&L9(),!1}catch{}if(h=Pt(a,n,u,v),h!==null)return y1(h,a,v),Tf(h,n,v),!0}return!1}function Fl(a,n,h,v){if(v={lane:2,revertLane:li(),gesture:null,action:v,hasEagerState:!1,eagerState:null,next:null},ce(a)){if(n)throw Error(l(479))}else n=Pt(a,h,v,2),n!==null&&y1(n,a,2)}function ce(a){var n=a.alternate;return a===I2||n!==null&&n===I2}function kf(a,n){x6=W9=!0;var h=a.pending;h===null?n.next=n:(n.next=h.next,h.next=n),a.pending=n}function Tf(a,n,h){if((h&4194048)!==0){var v=n.lanes;v&=a.pendingLanes,h|=v,n.lanes=h,Ip(a,h)}}var Z7={readContext:e1,use:X9,useCallback:F0,useContext:F0,useEffect:F0,useImperativeHandle:F0,useLayoutEffect:F0,useInsertionEffect:F0,useMemo:F0,useReducer:F0,useRef:F0,useState:F0,useDebugValue:F0,useDeferredValue:F0,useTransition:F0,useSyncExternalStore:F0,useId:F0,useHostTransitionStatus:F0,useFormState:F0,useActionState:F0,useOptimistic:F0,useMemoCache:F0,useCacheRefresh:F0};Z7.useEffectEvent=F0;var Lf={readContext:e1,use:X9,useCallback:function(a,n){return v1().memoizedState=[a,n===void 0?null:n],a},useContext:e1,useEffect:mf,useImperativeHandle:function(a,n,h){h=h!=null?h.concat([a]):null,J9(4194308,4,wf.bind(null,n,a),h)},useLayoutEffect:function(a,n){return J9(4194308,4,a,n)},useInsertionEffect:function(a,n){J9(4,2,a,n)},useMemo:function(a,n){var h=v1();n=n===void 0?null:n;var v=a();if(S5){j2(!0);try{a()}finally{j2(!1)}}return h.memoizedState=[v,n],v},useReducer:function(a,n,h){var v=v1();if(h!==void 0){var u=h(n);if(S5){j2(!0);try{h(n)}finally{j2(!1)}}}else u=n;return v.memoizedState=v.baseState=u,a={pending:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:u},v.queue=a,a=a.dispatch=MF.bind(null,I2,a),[v.memoizedState,a]},useRef:function(a){var n=v1();return a={current:a},n.memoizedState=a},useState:function(a){a=_l(a);var n=a.queue,h=Bf.bind(null,I2,n);return n.dispatch=h,[a.memoizedState,h]},useDebugValue:wl,useDeferredValue:function(a,n){var h=v1();return Cl(h,a,n)},useTransition:function(){var a=_l(!1);return a=Ef.bind(null,I2,a.queue,!0,!1),v1().memoizedState=a,[!1,a]},useSyncExternalStore:function(a,n,h){var v=I2,u=v1();if(Q2){if(h===void 0)throw Error(l(407));h=h()}else{if(h=n(),f0===null)throw Error(l(349));(Y2&127)!==0||ef(v,n,h)}u.memoizedState=h;var m={value:h,getSnapshot:n};return u.queue=m,mf(tf.bind(null,v,m,a),[a]),v.flags|=2048,E6(9,{destroy:void 0},cf.bind(null,v,m,h,n),null),h},useId:function(){var a=v1(),n=f0.identifierPrefix;if(Q2){var h=S3,v=A3;h=(v&~(1<<32-J2(v)-1)).toString(32)+h,n="_"+n+"R_"+h,h=Y9++,0<\/script>",m=m.removeChild(m.firstChild);break;case"select":m=typeof v.is=="string"?b.createElement("select",{is:v.is}):b.createElement("select"),v.multiple?m.multiple=!0:v.size&&(m.size=v.size);break;default:m=typeof v.is=="string"?b.createElement(u,{is:v.is}):b.createElement(u)}}m[Q0]=n,m[w1]=v;e:for(b=n.child;b!==null;){if(b.tag===5||b.tag===6)m.appendChild(b.stateNode);else if(b.tag!==4&&b.tag!==27&&b.child!==null){b.child.return=b,b=b.child;continue}if(b===n)break e;for(;b.sibling===null;){if(b.return===null||b.return===n)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}n.stateNode=m;e:switch(t1(m,u,v),u){case"button":case"input":case"select":case"textarea":v=!!v.autoFocus;break e;case"img":v=!0;break e;default:v=!1}v&&i4(n)}}return z0(n),Nl(n,n.type,a===null?null:a.memoizedProps,n.pendingProps,h),null;case 6:if(a&&n.stateNode!=null)a.memoizedProps!==v&&i4(n);else{if(typeof v!="string"&&n.stateNode===null)throw Error(l(166));if(a=C2.current,m6(n)){if(a=n.stateNode,h=n.memoizedProps,v=null,u=J0,u!==null)switch(u.tag){case 27:case 5:v=u.memoizedProps}a[Q0]=n,a=!!(a.nodeValue===h||v!==null&&v.suppressHydrationWarning===!0||Jg(a.nodeValue,h)),a||T4(n,!0)}else a=we(a).createTextNode(v),a[Q0]=n,n.stateNode=a}return z0(n),null;case 31:if(h=n.memoizedState,a===null||a.memoizedState!==null){if(v=m6(n),h!==null){if(a===null){if(!v)throw Error(l(318));if(a=n.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(l(557));a[Q0]=n}else b5(),(n.flags&128)===0&&(n.memoizedState=null),n.flags|=4;z0(n),a=!1}else h=Yt(),a!==null&&a.memoizedState!==null&&(a.memoizedState.hydrationErrors=h),a=!0;if(!a)return n.flags&256?(N1(n),n):(N1(n),null);if((n.flags&128)!==0)throw Error(l(558))}return z0(n),null;case 13:if(v=n.memoizedState,a===null||a.memoizedState!==null&&a.memoizedState.dehydrated!==null){if(u=m6(n),v!==null&&v.dehydrated!==null){if(a===null){if(!u)throw Error(l(318));if(u=n.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(l(317));u[Q0]=n}else b5(),(n.flags&128)===0&&(n.memoizedState=null),n.flags|=4;z0(n),u=!1}else u=Yt(),a!==null&&a.memoizedState!==null&&(a.memoizedState.hydrationErrors=u),u=!0;if(!u)return n.flags&256?(N1(n),n):(N1(n),null)}return N1(n),(n.flags&128)!==0?(n.lanes=h,n):(h=v!==null,a=a!==null&&a.memoizedState!==null,h&&(v=n.child,u=null,v.alternate!==null&&v.alternate.memoizedState!==null&&v.alternate.memoizedState.cachePool!==null&&(u=v.alternate.memoizedState.cachePool.pool),m=null,v.memoizedState!==null&&v.memoizedState.cachePool!==null&&(m=v.memoizedState.cachePool.pool),m!==u&&(v.flags|=2048)),h!==a&&h&&(n.child.flags|=8192),se(n,n.updateQueue),z0(n),null);case 4:return A2(),a===null&&ni(n.stateNode.containerInfo),z0(n),null;case 10:return e4(n.type),z0(n),null;case 19:if(e2(S0),v=n.memoizedState,v===null)return z0(n),null;if(u=(n.flags&128)!==0,m=v.rendering,m===null)if(u)Y7(v,!1);else{if(E0!==0||a!==null&&(a.flags&128)!==0)for(a=n.child;a!==null;){if(m=Z9(a),m!==null){for(n.flags|=128,Y7(v,!1),a=m.updateQueue,n.updateQueue=a,se(n,a),n.subtreeFlags=0,a=h,h=n.child;h!==null;)Sv(h,a),h=h.sibling;return H(S0,S0.current&1|2),Q2&&Q3(n,v.treeForkCount),n.child}a=a.sibling}v.tail!==null&&K0()>de&&(n.flags|=128,u=!0,Y7(v,!1),n.lanes=4194304)}else{if(!u)if(a=Z9(m),a!==null){if(n.flags|=128,u=!0,a=a.updateQueue,n.updateQueue=a,se(n,a),Y7(v,!0),v.tail===null&&v.tailMode==="hidden"&&!m.alternate&&!Q2)return z0(n),null}else 2*K0()-v.renderingStartTime>de&&h!==536870912&&(n.flags|=128,u=!0,Y7(v,!1),n.lanes=4194304);v.isBackwards?(m.sibling=n.child,n.child=m):(a=v.last,a!==null?a.sibling=m:n.child=m,v.last=m)}return v.tail!==null?(a=v.tail,v.rendering=a,v.tail=a.sibling,v.renderingStartTime=K0(),a.sibling=null,h=S0.current,H(S0,u?h&1|2:h&1),Q2&&Q3(n,v.treeForkCount),a):(z0(n),null);case 22:case 23:return N1(n),rl(),v=n.memoizedState!==null,a!==null?a.memoizedState!==null!==v&&(n.flags|=8192):v&&(n.flags|=8192),v?(h&536870912)!==0&&(n.flags&128)===0&&(z0(n),n.subtreeFlags&6&&(n.flags|=8192)):z0(n),h=n.updateQueue,h!==null&&se(n,h.retryQueue),h=null,a!==null&&a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(h=a.memoizedState.cachePool.pool),v=null,n.memoizedState!==null&&n.memoizedState.cachePool!==null&&(v=n.memoizedState.cachePool.pool),v!==h&&(n.flags|=2048),a!==null&&e2(E5),null;case 24:return h=null,a!==null&&(h=a.memoizedState.cache),n.memoizedState.cache!==h&&(n.flags|=2048),e4(T0),z0(n),null;case 25:return null;case 30:return null}throw Error(l(156,n.tag))}function FF(a,n){switch(Zt(n),n.tag){case 1:return a=n.flags,a&65536?(n.flags=a&-65537|128,n):null;case 3:return e4(T0),A2(),a=n.flags,(a&65536)!==0&&(a&128)===0?(n.flags=a&-65537|128,n):null;case 26:case 27:case 5:return b0(n),null;case 31:if(n.memoizedState!==null){if(N1(n),n.alternate===null)throw Error(l(340));b5()}return a=n.flags,a&65536?(n.flags=a&-65537|128,n):null;case 13:if(N1(n),a=n.memoizedState,a!==null&&a.dehydrated!==null){if(n.alternate===null)throw Error(l(340));b5()}return a=n.flags,a&65536?(n.flags=a&-65537|128,n):null;case 19:return e2(S0),null;case 4:return A2(),null;case 10:return e4(n.type),null;case 22:case 23:return N1(n),rl(),a!==null&&e2(E5),a=n.flags,a&65536?(n.flags=a&-65537|128,n):null;case 24:return e4(T0),null;case 25:return null;default:return null}}function ig(a,n){switch(Zt(n),n.tag){case 3:e4(T0),A2();break;case 26:case 27:case 5:b0(n);break;case 4:A2();break;case 31:n.memoizedState!==null&&N1(n);break;case 13:N1(n);break;case 19:e2(S0);break;case 10:e4(n.type);break;case 22:case 23:N1(n),rl(),a!==null&&e2(E5);break;case 24:e4(T0)}}function K7(a,n){try{var h=n.updateQueue,v=h!==null?h.lastEffect:null;if(v!==null){var u=v.next;h=u;do{if((h.tag&a)===a){v=void 0;var m=h.create,b=h.inst;v=m(),b.destroy=v}h=h.next}while(h!==u)}}catch(A){o0(n,n.return,A)}}function O4(a,n,h){try{var v=n.updateQueue,u=v!==null?v.lastEffect:null;if(u!==null){var m=u.next;v=m;do{if((v.tag&a)===a){var b=v.inst,A=b.destroy;if(A!==void 0){b.destroy=void 0,u=n;var P=h,K=A;try{K()}catch(a2){o0(u,P,a2)}}}v=v.next}while(v!==m)}}catch(a2){o0(n,n.return,a2)}}function ag(a){var n=a.updateQueue;if(n!==null){var h=a.stateNode;try{Wv(n,h)}catch(v){o0(a,a.return,v)}}}function sg(a,n,h){h.props=B5(a.type,a.memoizedProps),h.state=a.memoizedState;try{h.componentWillUnmount()}catch(v){o0(a,n,v)}}function X7(a,n){try{var h=a.ref;if(h!==null){switch(a.tag){case 26:case 27:case 5:var v=a.stateNode;break;case 30:v=a.stateNode;break;default:v=a.stateNode}typeof h=="function"?a.refCleanup=h(v):h.current=v}}catch(u){o0(a,n,u)}}function B3(a,n){var h=a.ref,v=a.refCleanup;if(h!==null)if(typeof v=="function")try{v()}catch(u){o0(a,n,u)}finally{a.refCleanup=null,a=a.alternate,a!=null&&(a.refCleanup=null)}else if(typeof h=="function")try{h(null)}catch(u){o0(a,n,u)}else h.current=null}function ng(a){var n=a.type,h=a.memoizedProps,v=a.stateNode;try{e:switch(n){case"button":case"input":case"select":case"textarea":h.autoFocus&&v.focus();break e;case"img":h.src?v.src=h.src:h.srcSet&&(v.srcset=h.srcSet)}}catch(u){o0(a,a.return,u)}}function Ol(a,n,h){try{var v=a.stateNode;ZF(v,a.type,h,n),v[w1]=n}catch(u){o0(a,a.return,u)}}function rg(a){return a.tag===5||a.tag===3||a.tag===26||a.tag===27&&Z4(a.type)||a.tag===4}function Ul(a){e:for(;;){for(;a.sibling===null;){if(a.return===null||rg(a.return))return null;a=a.return}for(a.sibling.return=a.return,a=a.sibling;a.tag!==5&&a.tag!==6&&a.tag!==18;){if(a.tag===27&&Z4(a.type)||a.flags&2||a.child===null||a.tag===4)continue e;a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}function Pl(a,n,h){var v=a.tag;if(v===5||v===6)a=a.stateNode,n?(h.nodeType===9?h.body:h.nodeName==="HTML"?h.ownerDocument.body:h).insertBefore(a,n):(n=h.nodeType===9?h.body:h.nodeName==="HTML"?h.ownerDocument.body:h,n.appendChild(a),h=h._reactRootContainer,h!=null||n.onclick!==null||(n.onclick=Y3));else if(v!==4&&(v===27&&Z4(a.type)&&(h=a.stateNode,n=null),a=a.child,a!==null))for(Pl(a,n,h),a=a.sibling;a!==null;)Pl(a,n,h),a=a.sibling}function ne(a,n,h){var v=a.tag;if(v===5||v===6)a=a.stateNode,n?h.insertBefore(a,n):h.appendChild(a);else if(v!==4&&(v===27&&Z4(a.type)&&(h=a.stateNode),a=a.child,a!==null))for(ne(a,n,h),a=a.sibling;a!==null;)ne(a,n,h),a=a.sibling}function og(a){var n=a.stateNode,h=a.memoizedProps;try{for(var v=a.type,u=n.attributes;u.length;)n.removeAttributeNode(u[0]);t1(n,v,h),n[Q0]=a,n[w1]=h}catch(m){o0(a,a.return,m)}}var a4=!1,R0=!1,jl=!1,hg=typeof WeakSet=="function"?WeakSet:Set,$0=null;function EF(a,n){if(a=a.containerInfo,hi=De,a=wv(a),Rt(a)){if("selectionStart"in a)var h={start:a.selectionStart,end:a.selectionEnd};else e:{h=(h=a.ownerDocument)&&h.defaultView||window;var v=h.getSelection&&h.getSelection();if(v&&v.rangeCount!==0){h=v.anchorNode;var u=v.anchorOffset,m=v.focusNode;v=v.focusOffset;try{h.nodeType,m.nodeType}catch{h=null;break e}var b=0,A=-1,P=-1,K=0,a2=0,h2=a,Q=null;c:for(;;){for(var t2;h2!==h||u!==0&&h2.nodeType!==3||(A=b+u),h2!==m||v!==0&&h2.nodeType!==3||(P=b+v),h2.nodeType===3&&(b+=h2.nodeValue.length),(t2=h2.firstChild)!==null;)Q=h2,h2=t2;for(;;){if(h2===a)break c;if(Q===h&&++K===u&&(A=b),Q===m&&++a2===v&&(P=b),(t2=h2.nextSibling)!==null)break;h2=Q,Q=h2.parentNode}h2=t2}h=A===-1||P===-1?null:{start:A,end:P}}else h=null}h=h||{start:0,end:0}}else h=null;for(di={focusedElem:a,selectionRange:h},De=!1,$0=n;$0!==null;)if(n=$0,a=n.child,(n.subtreeFlags&1028)!==0&&a!==null)a.return=n,$0=a;else for(;$0!==null;){switch(n=$0,m=n.alternate,a=n.flags,n.tag){case 0:if((a&4)!==0&&(a=n.updateQueue,a=a!==null?a.events:null,a!==null))for(h=0;h title"))),t1(m,v,h),m[Q0]=a,q0(m),v=m;break e;case"link":var b=uu("link","href",u).get(v+(h.href||""));if(b){for(var A=0;Ap0&&(b=p0,p0=B2,B2=b);var $=zv(A,B2),G=zv(A,p0);if($&&G&&(t2.rangeCount!==1||t2.anchorNode!==$.node||t2.anchorOffset!==$.offset||t2.focusNode!==G.node||t2.focusOffset!==G.offset)){var Y=h2.createRange();Y.setStart($.node,$.offset),t2.removeAllRanges(),B2>p0?(t2.addRange(Y),t2.extend(G.node,G.offset)):(Y.setEnd(G.node,G.offset),t2.addRange(Y))}}}}for(h2=[],t2=A;t2=t2.parentNode;)t2.nodeType===1&&h2.push({element:t2,left:t2.scrollLeft,top:t2.scrollTop});for(typeof A.focus=="function"&&A.focus(),A=0;Ah?32:h,q.T=null,h=Kl,Kl=null;var m=G4,b=h4;if(U0=0,B6=G4=null,h4=0,(a0&6)!==0)throw Error(l(331));var A=a0;if(a0|=4,wg(m.current),_g(m,m.current,b,h),a0=A,l8(0,!1),c0&&typeof c0.onPostCommitFiberRoot=="function")try{c0.onPostCommitFiberRoot(n0,m)}catch{}return!0}finally{l2.p=u,q.T=v,Ng(a,n)}}function Ug(a,n,h){n=Q1(h,n),n=Al(a.stateNode,n,2),a=I4(a,n,2),a!==null&&(b7(a,2),k3(a))}function o0(a,n,h){if(a.tag===3)Ug(a,a,h);else for(;n!==null;){if(n.tag===3){Ug(n,a,h);break}else if(n.tag===1){var v=n.stateNode;if(typeof n.type.getDerivedStateFromError=="function"||typeof v.componentDidCatch=="function"&&(j4===null||!j4.has(v))){a=Q1(h,a),h=Pf(2),v=I4(n,h,2),v!==null&&(jf(h,v,n,a),b7(v,2),k3(v));break}}n=n.return}}function ei(a,n,h){var v=a.pingCache;if(v===null){v=a.pingCache=new AF;var u=new Set;v.set(n,u)}else u=v.get(n),u===void 0&&(u=new Set,v.set(n,u));u.has(h)||($l=!0,u.add(h),a=LF.bind(null,a,n,h),n.then(a,a))}function LF(a,n,h){var v=a.pingCache;v!==null&&v.delete(n),a.pingedLanes|=a.suspendedLanes&h,a.warmLanes&=~h,f0===a&&(Y2&h)===h&&(E0===4||E0===3&&(Y2&62914560)===Y2&&300>K0()-he?(a0&2)===0&&k6(a,0):Zl|=h,S6===Y2&&(S6=0)),k3(a)}function Pg(a,n){n===0&&(n=Hp()),a=w5(a,n),a!==null&&(b7(a,n),k3(a))}function HF(a){var n=a.memoizedState,h=0;n!==null&&(h=n.retryLane),Pg(a,h)}function RF(a,n){var h=0;switch(a.tag){case 31:case 13:var v=a.stateNode,u=a.memoizedState;u!==null&&(h=u.retryLane);break;case 19:v=a.stateNode;break;case 22:v=a.stateNode._retryCache;break;default:throw Error(l(314))}v!==null&&v.delete(n),Pg(a,h)}function IF(a,n){return D3(a,n)}var me=null,L6=null,ci=!1,_e=!1,ti=!1,$4=0;function k3(a){a!==L6&&a.next===null&&(L6===null?me=L6=a:L6=L6.next=a),_e=!0,ci||(ci=!0,NF())}function l8(a,n){if(!ti&&_e){ti=!0;do for(var h=!1,v=me;v!==null;){if(a!==0){var u=v.pendingLanes;if(u===0)var m=0;else{var b=v.suspendedLanes,A=v.pingedLanes;m=(1<<31-J2(42|a)+1)-1,m&=u&~(b&~A),m=m&201326741?m&201326741|1:m?m|2:0}m!==0&&(h=!0,$g(v,m))}else m=Y2,m=C9(v,v===f0?m:0,v.cancelPendingCommit!==null||v.timeoutHandle!==-1),(m&3)===0||C7(v,m)||(h=!0,$g(v,m));v=v.next}while(h);ti=!1}}function VF(){jg()}function jg(){_e=ci=!1;var a=0;$4!==0&&YF()&&(a=$4);for(var n=K0(),h=null,v=me;v!==null;){var u=v.next,m=Gg(v,n);m===0?(v.next=null,h===null?me=u:h.next=u,u===null&&(L6=h)):(h=v,(a!==0||(m&3)!==0)&&(_e=!0)),v=u}U0!==0&&U0!==5||l8(a),$4!==0&&($4=0)}function Gg(a,n){for(var h=a.suspendedLanes,v=a.pingedLanes,u=a.expirationTimes,m=a.pendingLanes&-62914561;0A)break;var a2=P.transferSize,h2=P.initiatorType;a2&&eu(h2)&&(P=P.responseEnd,b+=a2*(P"u"?null:document;function pu(a,n,h){var v=H6;if(v&&typeof n=="string"&&n){var u=K1(n);u='link[rel="'+a+'"][href="'+u+'"]',typeof h=="string"&&(u+='[crossorigin="'+h+'"]'),du.has(u)||(du.add(u),a={rel:a,crossOrigin:h,href:n},v.querySelector(u)===null&&(n=v.createElement("link"),t1(n,"link",a),q0(n),v.head.appendChild(n)))}}function iE(a){d4.D(a),pu("dns-prefetch",a,null)}function aE(a,n){d4.C(a,n),pu("preconnect",a,n)}function sE(a,n,h){d4.L(a,n,h);var v=H6;if(v&&a&&n){var u='link[rel="preload"][as="'+K1(n)+'"]';n==="image"&&h&&h.imageSrcSet?(u+='[imagesrcset="'+K1(h.imageSrcSet)+'"]',typeof h.imageSizes=="string"&&(u+='[imagesizes="'+K1(h.imageSizes)+'"]')):u+='[href="'+K1(a)+'"]';var m=u;switch(n){case"style":m=R6(a);break;case"script":m=I6(a)}i3.has(m)||(a=g({rel:"preload",href:n==="image"&&h&&h.imageSrcSet?void 0:a,as:n},h),i3.set(m,a),v.querySelector(u)!==null||n==="style"&&v.querySelector(n8(m))||n==="script"&&v.querySelector(r8(m))||(n=v.createElement("link"),t1(n,"link",a),q0(n),v.head.appendChild(n)))}}function nE(a,n){d4.m(a,n);var h=H6;if(h&&a){var v=n&&typeof n.as=="string"?n.as:"script",u='link[rel="modulepreload"][as="'+K1(v)+'"][href="'+K1(a)+'"]',m=u;switch(v){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":m=I6(a)}if(!i3.has(m)&&(a=g({rel:"modulepreload",href:a},n),i3.set(m,a),h.querySelector(u)===null)){switch(v){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(h.querySelector(r8(m)))return}v=h.createElement("link"),t1(v,"link",a),q0(v),h.head.appendChild(v)}}}function rE(a,n,h){d4.S(a,n,h);var v=H6;if(v&&a){var u=i6(v).hoistableStyles,m=R6(a);n=n||"default";var b=u.get(m);if(!b){var A={loading:0,preload:null};if(b=v.querySelector(n8(m)))A.loading=5;else{a=g({rel:"stylesheet",href:a,"data-precedence":n},h),(h=i3.get(m))&&_i(a,h);var P=b=v.createElement("link");q0(P),t1(P,"link",a),P._p=new Promise(function(K,a2){P.onload=K,P.onerror=a2}),P.addEventListener("load",function(){A.loading|=1}),P.addEventListener("error",function(){A.loading|=2}),A.loading|=4,be(b,n,v)}b={type:"stylesheet",instance:b,count:1,state:A},u.set(m,b)}}}function oE(a,n){d4.X(a,n);var h=H6;if(h&&a){var v=i6(h).hoistableScripts,u=I6(a),m=v.get(u);m||(m=h.querySelector(r8(u)),m||(a=g({src:a,async:!0},n),(n=i3.get(u))&&zi(a,n),m=h.createElement("script"),q0(m),t1(m,"link",a),h.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},v.set(u,m))}}function hE(a,n){d4.M(a,n);var h=H6;if(h&&a){var v=i6(h).hoistableScripts,u=I6(a),m=v.get(u);m||(m=h.querySelector(r8(u)),m||(a=g({src:a,async:!0,type:"module"},n),(n=i3.get(u))&&zi(a,n),m=h.createElement("script"),q0(m),t1(m,"link",a),h.head.appendChild(m)),m={type:"script",instance:m,count:1,state:null},v.set(u,m))}}function vu(a,n,h,v){var u=(u=C2.current)?Ce(u):null;if(!u)throw Error(l(446));switch(a){case"meta":case"title":return null;case"style":return typeof h.precedence=="string"&&typeof h.href=="string"?(n=R6(h.href),h=i6(u).hoistableStyles,v=h.get(n),v||(v={type:"style",instance:null,count:0,state:null},h.set(n,v)),v):{type:"void",instance:null,count:0,state:null};case"link":if(h.rel==="stylesheet"&&typeof h.href=="string"&&typeof h.precedence=="string"){a=R6(h.href);var m=i6(u).hoistableStyles,b=m.get(a);if(b||(u=u.ownerDocument||u,b={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},m.set(a,b),(m=u.querySelector(n8(a)))&&!m._p&&(b.instance=m,b.state.loading=5),i3.has(a)||(h={rel:"preload",as:"style",href:h.href,crossOrigin:h.crossOrigin,integrity:h.integrity,media:h.media,hrefLang:h.hrefLang,referrerPolicy:h.referrerPolicy},i3.set(a,h),m||dE(u,a,h,b.state))),n&&v===null)throw Error(l(528,""));return b}if(n&&v!==null)throw Error(l(529,""));return null;case"script":return n=h.async,h=h.src,typeof h=="string"&&n&&typeof n!="function"&&typeof n!="symbol"?(n=I6(h),h=i6(u).hoistableScripts,v=h.get(n),v||(v={type:"script",instance:null,count:0,state:null},h.set(n,v)),v):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,a))}}function R6(a){return'href="'+K1(a)+'"'}function n8(a){return'link[rel="stylesheet"]['+a+"]"}function fu(a){return g({},a,{"data-precedence":a.precedence,precedence:null})}function dE(a,n,h,v){a.querySelector('link[rel="preload"][as="style"]['+n+"]")?v.loading=1:(n=a.createElement("link"),v.preload=n,n.addEventListener("load",function(){return v.loading|=1}),n.addEventListener("error",function(){return v.loading|=2}),t1(n,"link",h),q0(n),a.head.appendChild(n))}function I6(a){return'[src="'+K1(a)+'"]'}function r8(a){return"script[async]"+a}function gu(a,n,h){if(n.count++,n.instance===null)switch(n.type){case"style":var v=a.querySelector('style[data-href~="'+K1(h.href)+'"]');if(v)return n.instance=v,q0(v),v;var u=g({},h,{"data-href":h.href,"data-precedence":h.precedence,href:null,precedence:null});return v=(a.ownerDocument||a).createElement("style"),q0(v),t1(v,"style",u),be(v,h.precedence,a),n.instance=v;case"stylesheet":u=R6(h.href);var m=a.querySelector(n8(u));if(m)return n.state.loading|=4,n.instance=m,q0(m),m;v=fu(h),(u=i3.get(u))&&_i(v,u),m=(a.ownerDocument||a).createElement("link"),q0(m);var b=m;return b._p=new Promise(function(A,P){b.onload=A,b.onerror=P}),t1(m,"link",v),n.state.loading|=4,be(m,h.precedence,a),n.instance=m;case"script":return m=I6(h.src),(u=a.querySelector(r8(m)))?(n.instance=u,q0(u),u):(v=h,(u=i3.get(m))&&(v=g({},h),zi(v,u)),a=a.ownerDocument||a,u=a.createElement("script"),q0(u),t1(u,"link",v),a.head.appendChild(u),n.instance=u);case"void":return null;default:throw Error(l(443,n.type))}else n.type==="stylesheet"&&(n.state.loading&4)===0&&(v=n.instance,n.state.loading|=4,be(v,h.precedence,a));return n.instance}function be(a,n,h){for(var v=h.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=v.length?v[v.length-1]:null,m=u,b=0;b title"):null)}function pE(a,n,h){if(h===1||n.itemProp!=null)return!1;switch(a){case"meta":case"title":return!0;case"style":if(typeof n.precedence!="string"||typeof n.href!="string"||n.href==="")break;return!0;case"link":if(typeof n.rel!="string"||typeof n.href!="string"||n.href===""||n.onLoad||n.onError)break;return n.rel==="stylesheet"?(a=n.disabled,typeof n.precedence=="string"&&a==null):!0;case"script":if(n.async&&typeof n.async!="function"&&typeof n.async!="symbol"&&!n.onLoad&&!n.onError&&n.src&&typeof n.src=="string")return!0}return!1}function _u(a){return!(a.type==="stylesheet"&&(a.state.loading&3)===0)}function vE(a,n,h,v){if(h.type==="stylesheet"&&(typeof v.media!="string"||matchMedia(v.media).matches!==!1)&&(h.state.loading&4)===0){if(h.instance===null){var u=R6(v.href),m=n.querySelector(n8(u));if(m){n=m._p,n!==null&&typeof n=="object"&&typeof n.then=="function"&&(a.count++,a=Fe.bind(a),n.then(a,a)),h.state.loading|=4,h.instance=m,q0(m);return}m=n.ownerDocument||n,v=fu(v),(u=i3.get(u))&&_i(v,u),m=m.createElement("link"),q0(m);var b=m;b._p=new Promise(function(A,P){b.onload=A,b.onerror=P}),t1(m,"link",v),h.instance=m}a.stylesheets===null&&(a.stylesheets=new Map),a.stylesheets.set(h,n),(n=h.state.preload)&&(h.state.loading&3)===0&&(a.count++,h=Fe.bind(a),n.addEventListener("load",h),n.addEventListener("error",h))}}var Mi=0;function fE(a,n){return a.stylesheets&&a.count===0&&ye(a,a.stylesheets),0Mi?50:800)+n);return a.unsuspend=h,function(){a.unsuspend=null,clearTimeout(v),clearTimeout(u)}}:null}function Fe(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)ye(this,this.stylesheets);else if(this.unsuspend){var a=this.unsuspend;this.unsuspend=null,a()}}}var Ee=null;function ye(a,n){a.stylesheets=null,a.unsuspend!==null&&(a.count++,Ee=new Map,n.forEach(gE,a),Ee=null,Fe.call(a))}function gE(a,n){if(!(n.state.loading&4)){var h=Ee.get(a);if(h)var v=h.get(null);else{h=new Map,Ee.set(a,h);for(var u=a.querySelectorAll("link[data-precedence],style[data-precedence]"),m=0;m"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(c){console.error(c)}}return e(),Ai.exports=BE(),Ai.exports}var TE=kE();const LE=Vc(TE);var Pu="popstate";function HE(e={}){function c(i,s){let{pathname:r="/",search:o="",hash:d=""}=Z5(i.location.hash.substring(1));return!r.startsWith("/")&&!r.startsWith(".")&&(r="/"+r),Ba("",{pathname:r,search:o,hash:d},s.state&&s.state.usr||null,s.state&&s.state.key||"default")}function t(i,s){let r=i.document.querySelector("base"),o="";if(r&&r.getAttribute("href")){let d=i.location.href,p=d.indexOf("#");o=p===-1?d:d.slice(0,p)}return o+"#"+(typeof s=="string"?s:P8(s))}function l(i,s){d3(i.pathname.charAt(0)==="/",`relative pathnames are not supported in hash history.push(${JSON.stringify(s)})`)}return IE(c,t,l,e)}function x0(e,c){if(e===!1||e===null||typeof e>"u")throw new Error(c)}function d3(e,c){if(!e){typeof console<"u"&&console.warn(c);try{throw new Error(c)}catch{}}}function RE(){return Math.random().toString(36).substring(2,10)}function ju(e,c){return{usr:e.state,key:e.key,idx:c}}function Ba(e,c,t=null,l){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof c=="string"?Z5(c):c,state:t,key:c&&c.key||l||RE()}}function P8({pathname:e="/",search:c="",hash:t=""}){return c&&c!=="?"&&(e+=c.charAt(0)==="?"?c:"?"+c),t&&t!=="#"&&(e+=t.charAt(0)==="#"?t:"#"+t),e}function Z5(e){let c={};if(e){let t=e.indexOf("#");t>=0&&(c.hash=e.substring(t),e=e.substring(0,t));let l=e.indexOf("?");l>=0&&(c.search=e.substring(l),e=e.substring(0,l)),e&&(c.pathname=e)}return c}function IE(e,c,t,l={}){let{window:i=document.defaultView,v5Compat:s=!1}=l,r=i.history,o="POP",d=null,p=f();p==null&&(p=0,r.replaceState({...r.state,idx:p},""));function f(){return(r.state||{idx:null}).idx}function g(){o="POP";let D=f(),C=D==null?null:D-p;p=D,d&&d({action:o,location:w.location,delta:C})}function _(D,C){o="PUSH";let B=Ba(w.location,D,C);t&&t(B,D),p=f()+1;let S=ju(B,p),E=w.createHref(B);try{r.pushState(S,"",E)}catch(y){if(y instanceof DOMException&&y.name==="DataCloneError")throw y;i.location.assign(E)}s&&d&&d({action:o,location:w.location,delta:1})}function z(D,C){o="REPLACE";let B=Ba(w.location,D,C);t&&t(B,D),p=f();let S=ju(B,p),E=w.createHref(B);r.replaceState(S,"",E),s&&d&&d({action:o,location:w.location,delta:0})}function M(D){return VE(D)}let w={get action(){return o},get location(){return e(i,r)},listen(D){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(Pu,g),d=D,()=>{i.removeEventListener(Pu,g),d=null}},createHref(D){return c(i,D)},createURL:M,encodeLocation(D){let C=M(D);return{pathname:C.pathname,search:C.search,hash:C.hash}},push:_,replace:z,go(D){return r.go(D)}};return w}function VE(e,c=!1){let t="http://localhost";typeof window<"u"&&(t=window.location.origin!=="null"?window.location.origin:window.location.href),x0(t,"No window.location.(origin|href) available to create URL");let l=typeof e=="string"?e:P8(e);return l=l.replace(/ $/,"%20"),!c&&l.startsWith("//")&&(l=t+l),new URL(l,t)}function Lz(e,c,t="/"){return NE(e,c,t,!1)}function NE(e,c,t,l){let i=typeof c=="string"?Z5(c):c,s=C4(i.pathname||"/",t);if(s==null)return null;let r=Hz(e);OE(r);let o=null;for(let d=0;o==null&&d{let f={relativePath:p===void 0?r.path||"":p,caseSensitive:r.caseSensitive===!0,childrenIndex:o,route:r};if(f.relativePath.startsWith("/")){if(!f.relativePath.startsWith(l)&&d)return;x0(f.relativePath.startsWith(l),`Absolute route path "${f.relativePath}" nested under path "${l}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),f.relativePath=f.relativePath.slice(l.length)}let g=w4([l,f.relativePath]),_=t.concat(f);r.children&&r.children.length>0&&(x0(r.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${g}".`),Hz(r.children,c,_,g,d)),!(r.path==null&&!r.index)&&c.push({path:g,score:ZE(g,r.index),routesMeta:_})};return e.forEach((r,o)=>{if(r.path===""||!r.path?.includes("?"))s(r,o);else for(let d of Rz(r.path))s(r,o,!0,d)}),c}function Rz(e){let c=e.split("/");if(c.length===0)return[];let[t,...l]=c,i=t.endsWith("?"),s=t.replace(/\?$/,"");if(l.length===0)return i?[s,""]:[s];let r=Rz(l.join("/")),o=[];return o.push(...r.map(d=>d===""?s:[s,d].join("/"))),i&&o.push(...r),o.map(d=>e.startsWith("/")&&d===""?"/":d)}function OE(e){e.sort((c,t)=>c.score!==t.score?t.score-c.score:WE(c.routesMeta.map(l=>l.childrenIndex),t.routesMeta.map(l=>l.childrenIndex)))}var UE=/^:[\w-]+$/,PE=3,jE=2,GE=1,qE=10,$E=-2,Gu=e=>e==="*";function ZE(e,c){let t=e.split("/"),l=t.length;return t.some(Gu)&&(l+=$E),c&&(l+=jE),t.filter(i=>!Gu(i)).reduce((i,s)=>i+(UE.test(s)?PE:s===""?GE:qE),l)}function WE(e,c){return e.length===c.length&&e.slice(0,-1).every((l,i)=>l===c[i])?e[e.length-1]-c[c.length-1]:0}function YE(e,c,t=!1){let{routesMeta:l}=e,i={},s="/",r=[];for(let o=0;o{if(f==="*"){let M=o[_]||"";r=s.slice(0,s.length-M.length).replace(/(.)\/+$/,"$1")}const z=o[_];return g&&!z?p[f]=void 0:p[f]=(z||"").replace(/%2F/g,"/"),p},{}),pathname:s,pathnameBase:r,pattern:e}}function KE(e,c=!1,t=!0){d3(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 l=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(r,o,d)=>(l.push({paramName:o,isOptional:d!=null}),d?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(l.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):t?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,c?void 0:"i"),l]}function XE(e){try{return e.split("/").map(c=>decodeURIComponent(c).replace(/\//g,"%2F")).join("/")}catch(c){return d3(!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 (${c}).`),e}}function C4(e,c){if(c==="/")return e;if(!e.toLowerCase().startsWith(c.toLowerCase()))return null;let t=c.endsWith("/")?c.length-1:c.length,l=e.charAt(t);return l&&l!=="/"?null:e.slice(t)||"/"}var Iz=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,QE=e=>Iz.test(e);function JE(e,c="/"){let{pathname:t,search:l="",hash:i=""}=typeof e=="string"?Z5(e):e,s;if(t)if(QE(t))s=t;else{if(t.includes("//")){let r=t;t=t.replace(/\/\/+/g,"/"),d3(!1,`Pathnames cannot have embedded double slashes - normalizing ${r} -> ${t}`)}t.startsWith("/")?s=qu(t.substring(1),"/"):s=qu(t,c)}else s=c;return{pathname:s,search:ty(l),hash:ly(i)}}function qu(e,c){let t=c.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?t.length>1&&t.pop():i!=="."&&t.push(i)}),t.length>1?t.join("/"):"/"}function Ti(e,c,t,l){return`Cannot include a '${e}' character in a manually specified \`to.${c}\` field [${JSON.stringify(l)}]. Please separate it out to the \`to.${t}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function ey(e){return e.filter((c,t)=>t===0||c.route.path&&c.route.path.length>0)}function Vz(e){let c=ey(e);return c.map((t,l)=>l===c.length-1?t.pathname:t.pathnameBase)}function Nz(e,c,t,l=!1){let i;typeof e=="string"?i=Z5(e):(i={...e},x0(!i.pathname||!i.pathname.includes("?"),Ti("?","pathname","search",i)),x0(!i.pathname||!i.pathname.includes("#"),Ti("#","pathname","hash",i)),x0(!i.search||!i.search.includes("#"),Ti("#","search","hash",i)));let s=e===""||i.pathname==="",r=s?"/":i.pathname,o;if(r==null)o=t;else{let g=c.length-1;if(!l&&r.startsWith("..")){let _=r.split("/");for(;_[0]==="..";)_.shift(),g-=1;i.pathname=_.join("/")}o=g>=0?c[g]:"/"}let d=JE(i,o),p=r&&r!=="/"&&r.endsWith("/"),f=(s||r===".")&&t.endsWith("/");return!d.pathname.endsWith("/")&&(p||f)&&(d.pathname+="/"),d}var w4=e=>e.join("/").replace(/\/\/+/g,"/"),cy=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),ty=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,ly=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,iy=class{constructor(e,c,t,l=!1){this.status=e,this.statusText=c||"",this.internal=l,t instanceof Error?(this.data=t.toString(),this.error=t):this.data=t}};function ay(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function sy(e){return e.map(c=>c.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var Oz=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Uz(e,c){let t=e;if(typeof t!="string"||!Iz.test(t))return{absoluteURL:void 0,isExternal:!1,to:t};let l=t,i=!1;if(Oz)try{let s=new URL(window.location.href),r=t.startsWith("//")?new URL(s.protocol+t):new URL(t),o=C4(r.pathname,c);r.origin===s.origin&&o!=null?t=o+r.search+r.hash:i=!0}catch{d3(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:l,isExternal:i,to:t}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Pz=["POST","PUT","PATCH","DELETE"];new Set(Pz);var ny=["GET",...Pz];new Set(ny);var p7=R.createContext(null);p7.displayName="DataRouter";var Nc=R.createContext(null);Nc.displayName="DataRouterState";var ry=R.createContext(!1),jz=R.createContext({isTransitioning:!1});jz.displayName="ViewTransition";var oy=R.createContext(new Map);oy.displayName="Fetchers";var hy=R.createContext(null);hy.displayName="Await";var p3=R.createContext(null);p3.displayName="Navigation";var a9=R.createContext(null);a9.displayName="Location";var x4=R.createContext({outlet:null,matches:[],isDataRoute:!1});x4.displayName="Route";var Ss=R.createContext(null);Ss.displayName="RouteError";var Gz="REACT_ROUTER_ERROR",dy="REDIRECT",py="ROUTE_ERROR_RESPONSE";function vy(e){if(e.startsWith(`${Gz}:${dy}:{`))try{let c=JSON.parse(e.slice(28));if(typeof c=="object"&&c&&typeof c.status=="number"&&typeof c.statusText=="string"&&typeof c.location=="string"&&typeof c.reloadDocument=="boolean"&&typeof c.replace=="boolean")return c}catch{}}function fy(e){if(e.startsWith(`${Gz}:${py}:{`))try{let c=JSON.parse(e.slice(40));if(typeof c=="object"&&c&&typeof c.status=="number"&&typeof c.statusText=="string")return new iy(c.status,c.statusText,c.data)}catch{}}function gy(e,{relative:c}={}){x0(s9(),"useHref() may be used only in the context of a component.");let{basename:t,navigator:l}=R.useContext(p3),{hash:i,pathname:s,search:r}=n9(e,{relative:c}),o=s;return t!=="/"&&(o=s==="/"?t:w4([t,s])),l.createHref({pathname:o,search:r,hash:i})}function s9(){return R.useContext(a9)!=null}function d5(){return x0(s9(),"useLocation() may be used only in the context of a component."),R.useContext(a9).location}var qz="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function $z(e){R.useContext(p3).static||R.useLayoutEffect(e)}function Bs(){let{isDataRoute:e}=R.useContext(x4);return e?Dy():uy()}function uy(){x0(s9(),"useNavigate() may be used only in the context of a component.");let e=R.useContext(p7),{basename:c,navigator:t}=R.useContext(p3),{matches:l}=R.useContext(x4),{pathname:i}=d5(),s=JSON.stringify(Vz(l)),r=R.useRef(!1);return $z(()=>{r.current=!0}),R.useCallback((d,p={})=>{if(d3(r.current,qz),!r.current)return;if(typeof d=="number"){t.go(d);return}let f=Nz(d,JSON.parse(s),i,p.relative==="path");e==null&&c!=="/"&&(f.pathname=f.pathname==="/"?c:w4([c,f.pathname])),(p.replace?t.replace:t.push)(f,p.state,p)},[c,t,s,i,e])}R.createContext(null);function n9(e,{relative:c}={}){let{matches:t}=R.useContext(x4),{pathname:l}=d5(),i=JSON.stringify(Vz(t));return R.useMemo(()=>Nz(e,JSON.parse(i),l,c==="path"),[e,i,l,c])}function my(e,c){return Zz(e,c)}function Zz(e,c,t,l,i){x0(s9(),"useRoutes() may be used only in the context of a component.");let{navigator:s}=R.useContext(p3),{matches:r}=R.useContext(x4),o=r[r.length-1],d=o?o.params:{},p=o?o.pathname:"/",f=o?o.pathnameBase:"/",g=o&&o.route;{let B=g&&g.path||"";Yz(p,!g||B.endsWith("*")||B.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${p}" (under ) 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. -Please change the parent to .`)}let _=a5(),z;if(c){let k=typeof c=="string"?N5(c):c;F0(f==="/"||k.pathname?.startsWith(f),`When overriding the location using \`\` 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 "${f}" but pathname "${k.pathname}" was given in the \`location\` prop.`),z=k}else z=_;let M=z.pathname||"/",w=M;if(f!=="/"){let k=f.replace(/^\//,"").split("/");w="/"+M.replace(/^\//,"").split("/").slice(k.length).join("/")}let y=W_(e,{pathname:w});h3(g||y!=null,`No routes matched location "${z.pathname}${z.search}${z.hash}" `),h3(y==null||y[y.length-1].route.element!==void 0||y[y.length-1].route.Component!==void 0||y[y.length-1].route.lazy!==void 0,`Matched leaf route at location "${z.pathname}${z.search}${z.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let x=TE(y&&y.map(k=>Object.assign({},k,{params:Object.assign({},d,k.params),pathname:v4([f,n.encodeLocation?n.encodeLocation(k.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:k.pathname]),pathnameBase:k.pathnameBase==="/"?f:v4([f,n.encodeLocation?n.encodeLocation(k.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:k.pathnameBase])})),r,t,l,a);return c&&x?R.createElement(N8.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...z},navigationType:"POP"}},x):x}function SE(){let e=NE(),c=mE(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),t=e instanceof Error?e.stack:null,l="rgba(200,200,200, 0.5)",a={padding:"0.5rem",backgroundColor:l},n={padding:"2px 4px",backgroundColor:l},r=null;return console.error("Error handled by React Router default ErrorBoundary:",e),r=R.createElement(R.Fragment,null,R.createElement("p",null,"💿 Hey developer 👋"),R.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",R.createElement("code",{style:n},"ErrorBoundary")," or"," ",R.createElement("code",{style:n},"errorElement")," prop on your route.")),R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},c),t?R.createElement("pre",{style:a},t):null,r)}var BE=R.createElement(SE,null),rz=class extends R.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,c){return c.location!==e.location||c.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:c.error,location:c.location,revalidation:e.revalidation||c.revalidation}}componentDidCatch(e,c){this.props.onError?this.props.onError(e,c):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"){const t=EE(e.digest);t&&(e=t)}let c=e!==void 0?R.createElement(u4.Provider,{value:this.props.routeContext},R.createElement(rs.Provider,{value:e,children:this.props.component})):this.props.children;return this.context?R.createElement(kE,{error:e},c):c}};rz.contextType=ME;var mi=new WeakMap;function kE({children:e,error:c}){let{basename:t}=R.useContext(d3);if(typeof c=="object"&&c&&"digest"in c&&typeof c.digest=="string"){let l=FE(c.digest);if(l){let a=mi.get(c);if(a)throw a;let n=cz(l.location,t);if(ez&&!mi.get(c))if(n.isExternal||l.reloadDocument)window.location.href=n.absoluteURL||n.to;else{const r=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(n.to,{replace:l.replace}));throw mi.set(c,r),r}return R.createElement("meta",{httpEquiv:"refresh",content:`0;url=${n.absoluteURL||n.to}`})}}return e}function LE({routeContext:e,match:c,children:t}){let l=R.useContext(K6);return l&&l.static&&l.staticContext&&(c.route.errorElement||c.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=c.route.id),R.createElement(u4.Provider,{value:e},t)}function TE(e,c=[],t=null,l=null,a=null){if(e==null){if(!t)return null;if(t.errors)e=t.matches;else if(c.length===0&&!t.initialized&&t.matches.length>0)e=t.matches;else return null}let n=e,r=t?.errors;if(r!=null){let f=n.findIndex(g=>g.route.id&&r?.[g.route.id]!==void 0);F0(f>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(r).join(",")}`),n=n.slice(0,Math.min(n.length,f+1))}let o=!1,d=-1;if(t)for(let f=0;f=0?n=n.slice(0,d+1):n=[n[0]];break}}}let p=t&&l?(f,g)=>{l(f,{location:t.location,params:t.matches?.[0]?.params??{},unstable_pattern:_E(t.matches),errorInfo:g})}:void 0;return n.reduceRight((f,g,_)=>{let z,M=!1,w=null,y=null;t&&(z=r&&g.route.id?r[g.route.id]:void 0,w=g.route.errorElement||BE,o&&(d<0&&_===0?(oz("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),M=!0,y=null):d===_&&(M=!0,y=g.route.hydrateFallbackElement||null)));let x=c.concat(n.slice(0,_+1)),k=()=>{let S;return z?S=w:M?S=y:g.route.Component?S=R.createElement(g.route.Component,null):g.route.element?S=g.route.element:S=f,R.createElement(LE,{match:g,routeContext:{outlet:f,matches:x,isDataRoute:t!=null},children:S})};return t&&(g.route.ErrorBoundary||g.route.errorElement||_===0)?R.createElement(rz,{location:t.location,revalidation:t.revalidation,component:w,error:z,children:k(),routeContext:{outlet:null,matches:x,isDataRoute:!0},onError:p}):k()},null)}function hs(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function HE(e){let c=R.useContext(K6);return F0(c,hs(e)),c}function RE(e){let c=R.useContext(Mc);return F0(c,hs(e)),c}function VE(e){let c=R.useContext(u4);return F0(c,hs(e)),c}function ds(e){let c=VE(e),t=c.matches[c.matches.length-1];return F0(t.route.id,`${e} can only be used on routes that contain a unique "id"`),t.route.id}function IE(){return ds("useRouteId")}function NE(){let e=R.useContext(rs),c=RE("useRouteError"),t=ds("useRouteError");return e!==void 0?e:c.errors?.[t]}function OE(){let{router:e}=HE("useNavigate"),c=ds("useNavigate"),t=R.useRef(!1);return sz(()=>{t.current=!0}),R.useCallback(async(a,n={})=>{h3(t.current,az),t.current&&(typeof a=="number"?await e.navigate(a):await e.navigate(a,{fromRouteId:c,...n}))},[e,c])}var Fu={};function oz(e,c,t){!c&&!Fu[e]&&(Fu[e]=!0,h3(!1,t))}R.memo(UE);function UE({routes:e,future:c,state:t,onError:l}){return nz(e,void 0,t,l,c)}function Se(e){F0(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function PE({basename:e="/",children:c=null,location:t,navigationType:l="POP",navigator:a,static:n=!1,unstable_useTransitions:r}){F0(!O8(),"You cannot render a inside another . You should never have more than one in your app.");let o=e.replace(/^\/*/,"/"),d=R.useMemo(()=>({basename:o,navigator:a,static:n,unstable_useTransitions:r,future:{}}),[o,a,n,r]);typeof t=="string"&&(t=N5(t));let{pathname:p="/",search:f="",hash:g="",state:_=null,key:z="default"}=t,M=R.useMemo(()=>{let w=f4(p,o);return w==null?null:{location:{pathname:w,search:f,hash:g,state:_,key:z},navigationType:l}},[o,p,f,g,_,z,l]);return h3(M!=null,` is not able to match the URL "${p}${f}${g}" because it does not start with the basename, so the won't render anything.`),M==null?null:R.createElement(d3.Provider,{value:d},R.createElement(N8.Provider,{children:c,value:M}))}function jE({children:e,location:c}){return AE(ra(e),c)}function ra(e,c=[]){let t=[];return R.Children.forEach(e,(l,a)=>{if(!R.isValidElement(l))return;let n=[...c,a];if(l.type===R.Fragment){t.push.apply(t,ra(l.props.children,n));return}F0(l.type===Se,`[${typeof l.type=="string"?l.type:l.type.name}] is not a component. All component children of must be a or `),F0(!l.props.index||!l.props.children,"An index route cannot have child routes.");let r={id:l.props.id||n.join("-"),caseSensitive:l.props.caseSensitive,element:l.props.element,Component:l.props.Component,index:l.props.index,path:l.props.path,middleware:l.props.middleware,loader:l.props.loader,action:l.props.action,hydrateFallbackElement:l.props.hydrateFallbackElement,HydrateFallback:l.props.HydrateFallback,errorElement:l.props.errorElement,ErrorBoundary:l.props.ErrorBoundary,hasErrorBoundary:l.props.hasErrorBoundary===!0||l.props.ErrorBoundary!=null||l.props.errorElement!=null,shouldRevalidate:l.props.shouldRevalidate,handle:l.props.handle,lazy:l.props.lazy};l.props.children&&(r.children=ra(l.props.children,n)),t.push(r)}),t}var Be="get",ke="application/x-www-form-urlencoded";function wc(e){return typeof HTMLElement<"u"&&e instanceof HTMLElement}function GE(e){return wc(e)&&e.tagName.toLowerCase()==="button"}function qE(e){return wc(e)&&e.tagName.toLowerCase()==="form"}function $E(e){return wc(e)&&e.tagName.toLowerCase()==="input"}function ZE(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function WE(e,c){return e.button===0&&(!c||c==="_self")&&!ZE(e)}var ue=null;function YE(){if(ue===null)try{new FormData(document.createElement("form"),0),ue=!1}catch{ue=!0}return ue}var KE=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function _i(e){return e!=null&&!KE.has(e)?(h3(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${ke}"`),null):e}function XE(e,c){let t,l,a,n,r;if(qE(e)){let o=e.getAttribute("action");l=o?f4(o,c):null,t=e.getAttribute("method")||Be,a=_i(e.getAttribute("enctype"))||ke,n=new FormData(e)}else if(GE(e)||$E(e)&&(e.type==="submit"||e.type==="image")){let o=e.form;if(o==null)throw new Error('Cannot submit a
{ const sel = window.getSelection(); if (sel.rangeCount > 0) savedRangeRef.current = sel.getRangeAt(0).cloneRange(); }} - onMouseUp={() => { const sel = window.getSelection(); if (sel.rangeCount > 0) savedRangeRef.current = sel.getRangeAt(0).cloneRange(); }} - onKeyUp={() => { const sel = window.getSelection(); if (sel.rangeCount > 0) savedRangeRef.current = sel.getRangeAt(0).cloneRange(); }} + onBlur={saveSelection} + onMouseUp={saveSelection} + onKeyUp={saveSelection} onInput={(e) => { setInput(e.currentTarget.textContent); setHasImages(e.currentTarget.querySelectorAll('img').length > 0); const text = e.currentTarget.innerText; setIsMultiline(text.includes('\n') || e.currentTarget.scrollHeight > 50); checkTypedEmoji(); - // Handle Typing via Convex const now = Date.now(); if (now - lastTypingEmitRef.current > 2000 && currentUserId && channelId) { startTypingMutation({ channelId, userId: currentUserId, username }).catch(() => {}); @@ -812,14 +992,14 @@ const ChatArea = ({ channelId, channelName, username, channelKey, userId: curren /> {!input && !hasImages &&
Message #{channelName || channelId}
}
- {showGifPicker && ( - { if (typeof data === 'string') { sendMessage(data); setShowGifPicker(false); } else { insertEmoji(data); setShowGifPicker(false); } }} onClose={() => setShowGifPicker(false)} currentTab={pickerActiveTab} onTabChange={setPickerActiveTab} /> + { if (typeof data === 'string') { sendMessage(data); setPickerTab(null); } else { insertEmoji(data); setPickerTab(null); } }} onClose={() => setPickerTab(null)} currentTab={pickerTab} onTabChange={setPickerTab} /> )} - { if (showGifPicker && pickerActiveTab === 'Emoji') setShowGifPicker(false); else { setPickerActiveTab('Emoji'); setShowGifPicker(true); } }} /> + togglePicker('Emoji')} />
diff --git a/Frontend/Electron/src/components/GifPicker.jsx b/Frontend/Electron/src/components/GifPicker.jsx index 91cbb6a..2f6868c 100644 --- a/Frontend/Electron/src/components/GifPicker.jsx +++ b/Frontend/Electron/src/components/GifPicker.jsx @@ -3,44 +3,199 @@ import React, { useState, useEffect, useRef } from 'react'; import { useConvex } from 'convex/react'; import { api } from '../../../../convex/_generated/api'; +const EmojiItem = ({ emoji, onSelect }) => ( +
e.preventDefault()} + onClick={() => onSelect && onSelect({ type: 'emoji', ...emoji })} + title={`:${emoji.name}:`} + style={{ cursor: 'pointer', padding: '4px', borderRadius: '4px' }} + onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#40444b'} + onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'} + > + {emoji.name} +
+); + +const emojiGridStyle = { display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: '4px' }; + +const GifContent = ({ search, results, categories, onSelect, onCategoryClick }) => { + if (search || results.length > 0) { + return ( +
+ {results.map(gif => ( + {gif.title} e.preventDefault()} + onClick={() => onSelect(gif.media_formats?.gif?.url || gif.src)} + /> + ))} + {results.length === 0 &&
No GIFs found
} +
+ ); + } + + return ( +
+
+ Favorites +
+
+ {categories.map(cat => ( +
onCategoryClick(cat.name)} + style={{ + position: 'relative', + height: '100px', + borderRadius: '4px', + overflow: 'hidden', + cursor: 'pointer', + backgroundColor: '#202225' + }} + > +
+ ))} +
+
+ ); +}; + +const EmojiContent = ({ search, onSelect, collapsedCategories, toggleCategory }) => { + if (search) { + const filtered = AllEmojis + .filter(e => e.name.toLowerCase().includes(search.toLowerCase().replace(/:/g, ''))) + .slice(0, 100); + return ( +
+
+ {filtered.map((emoji, idx) => ( + + ))} +
+
+ ); + } + + return ( +
+ {Object.entries(CategorizedEmojis).map(([category, emojis]) => ( +
+
toggleCategory(category)} + style={{ + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + marginBottom: '8px', + padding: '4px', + borderRadius: '4px' + }} + onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#40444b'} + onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'} + > + + + +

+ {category} +

+
+ {!collapsedCategories[category] && ( +
+ {emojis.map((emoji, idx) => ( + + ))} +
+ )} +
+ ))} +
+ ); +}; + +const initialCollapsed = Object.fromEntries( + Object.keys(CategorizedEmojis).map(cat => [cat, true]) +); + const GifPicker = ({ onSelect, onClose, initialTab, currentTab, onTabChange }) => { const [search, setSearch] = useState(''); const [categories, setCategories] = useState([]); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [internalActiveTab, setInternalActiveTab] = useState(initialTab || 'GIFs'); + const [collapsedCategories, setCollapsedCategories] = useState(initialCollapsed); + const inputRef = useRef(null); + + const convex = useConvex(); - // Resolve effective active tab const activeTab = currentTab !== undefined ? currentTab : internalActiveTab; const setActiveTab = (tab) => { if (onTabChange) onTabChange(tab); if (currentTab === undefined) setInternalActiveTab(tab); }; - const [emojiCategories, setEmojiCategories] = useState({}); - const [collapsedCategories, setCollapsedCategories] = useState({}); - const inputRef = useRef(null); - - const convex = useConvex(); - useEffect(() => { - // Fetch categories via Convex action convex.action(api.gifs.categories, {}) .then(data => { if (data.categories) setCategories(data.categories); }) .catch(err => console.error('Failed to load categories', err)); - // Auto focus - if(inputRef.current) inputRef.current.focus(); - - // Load Emoji categories - setEmojiCategories(CategorizedEmojis); - - // Initialize collapsed state (all true) - const initialCollapsed = {}; - Object.keys(CategorizedEmojis).forEach(cat => initialCollapsed[cat] = true); - setCollapsedCategories(initialCollapsed); + if (inputRef.current) inputRef.current.focus(); }, []); useEffect(() => { @@ -64,10 +219,6 @@ const GifPicker = ({ onSelect, onClose, initialTab, currentTab, onTabChange }) = return () => clearTimeout(timeout); }, [search, activeTab]); - const handleCategoryClick = (categoryName) => { - setSearch(categoryName); - }; - const toggleCategory = (categoryName) => { setCollapsedCategories(prev => ({ ...prev, @@ -161,170 +312,9 @@ const GifPicker = ({ onSelect, onClose, initialTab, currentTab, onTabChange }) = {loading ? (
Loading...
) : activeTab === 'GIFs' ? ( - // GIF Tab Logic (Search Results OR Categories) - (search || results.length > 0) ? ( -
- {results.map(gif => ( - {gif.title} e.preventDefault()} - onClick={() => onSelect(gif.media_formats?.gif?.url || gif.src)} - /> - ))} - {results.length === 0 &&
No GIFs found
} -
- ) : ( - // GIF Categories -
-
- Favorites -
- {/* Grid of Categories */} -
- {categories.map(cat => ( -
handleCategoryClick(cat.name)} - style={{ - position: 'relative', - height: '100px', - borderRadius: '4px', - overflow: 'hidden', - cursor: 'pointer', - backgroundColor: '#202225' - }} - > -
- ))} -
-
- ) + ) : ( - // Emoji / Other Tabs -
- {search ? ( - // Emoji Search Results -
- {AllEmojis.filter(e => e.name.toLowerCase().includes(search.toLowerCase().replace(/:/g, ''))) - .slice(0, 100) - .map((emoji, idx) => ( -
e.preventDefault()} - onClick={() => onSelect && onSelect({ type: 'emoji', ...emoji })} - title={`:${emoji.name}:`} - style={{ cursor: 'pointer', padding: '4px', borderRadius: '4px' }} - onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#40444b'} - onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'} - > - {emoji.name} -
- ))} -
- ) : ( - // Emoji Categories - Object.entries(emojiCategories).map(([category, emojis]) => ( -
-
toggleCategory(category)} - style={{ - display: 'flex', - alignItems: 'center', - cursor: 'pointer', - marginBottom: '8px', - padding: '4px', - borderRadius: '4px' - }} - onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#40444b'} - onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'} - > - - - -

- {category} -

-
- {!collapsedCategories[category] && ( -
- {emojis.map((emoji, idx) => ( -
e.preventDefault()} - onClick={() => onSelect && onSelect({ type: 'emoji', ...emoji })} - title={`:${emoji.name}:`} - style={{ cursor: 'pointer', padding: '4px', borderRadius: '4px' }} - onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#40444b'} - onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'} - > - {emoji.name} -
- ))} -
- )} -
- )) - )} -
+ )} diff --git a/Frontend/Electron/src/components/ServerSettingsModal.jsx b/Frontend/Electron/src/components/ServerSettingsModal.jsx index 9a4af09..ba6e55e 100644 --- a/Frontend/Electron/src/components/ServerSettingsModal.jsx +++ b/Frontend/Electron/src/components/ServerSettingsModal.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from 'react'; +import React, { useState } from 'react'; import { useQuery, useConvex } from 'convex/react'; import { api } from '../../../../convex/_generated/api'; @@ -51,13 +51,9 @@ const ServerSettingsModal = ({ onClose }) => { }; const handleAssignRole = async (roleId, targetUserId, isAdding) => { + const action = isAdding ? api.roles.assign : api.roles.unassign; try { - if (isAdding) { - await convex.mutation(api.roles.assign, { roleId, userId: targetUserId }); - } else { - await convex.mutation(api.roles.unassign, { roleId, userId: targetUserId }); - } - // Convex reactive queries auto-update members list + await convex.mutation(action, { roleId, userId: targetUserId }); } catch (e) { console.error('Failed to assign/unassign role:', e); } @@ -92,17 +88,21 @@ const ServerSettingsModal = ({ onClose }) => { ); + const canManageRoles = myPermissions.manage_roles; + const disabledOpacity = canManageRoles ? 1 : 0.5; + const labelStyle = { display: 'block', color: '#b9bbbe', fontSize: '12px', fontWeight: '700', marginBottom: 8 }; + const editableRoles = roles.filter(r => r.name !== 'Owner'); + const renderRolesTab = () => (
- {/* Role List */}

ROLES

- {myPermissions.manage_roles && ( + {canManageRoles && ( )}
- {roles.filter(r => r.name !== 'Owner').map(r => ( + {editableRoles.map(r => (
setSelectedRole(r)} @@ -119,29 +119,28 @@ const ServerSettingsModal = ({ onClose }) => { ))}
- {/* Edit Panel */} {selectedRole ? (

Edit Role - {selectedRole.name}

- + handleUpdateRole(selectedRole._id, { name: e.target.value })} - disabled={!myPermissions.manage_roles} - style={{ width: '100%', padding: 10, background: '#202225', border: 'none', borderRadius: 4, color: 'white', marginBottom: 20, opacity: !myPermissions.manage_roles ? 0.5 : 1 }} + disabled={!canManageRoles} + style={{ width: '100%', padding: 10, background: '#202225', border: 'none', borderRadius: 4, color: 'white', marginBottom: 20, opacity: disabledOpacity }} /> - + handleUpdateRole(selectedRole._id, { color: e.target.value })} - disabled={!myPermissions.manage_roles} - style={{ width: '100%', height: 40, border: 'none', padding: 0, marginBottom: 20, opacity: !myPermissions.manage_roles ? 0.5 : 1 }} + disabled={!canManageRoles} + style={{ width: '100%', height: 40, border: 'none', padding: 0, marginBottom: 20, opacity: disabledOpacity }} /> - + {['manage_channels', 'manage_roles', 'create_invite', 'embed_links', 'attach_files'].map(perm => (
{perm.replace('_', ' ')} @@ -149,17 +148,17 @@ const ServerSettingsModal = ({ onClose }) => { type="checkbox" checked={selectedRole.permissions?.[perm] || false} onChange={(e) => { - const newPerms = { ...selectedRole.permissions, [perm]: e.target.checked }; - handleUpdateRole(selectedRole._id, { permissions: newPerms }); + handleUpdateRole(selectedRole._id, { + permissions: { ...selectedRole.permissions, [perm]: e.target.checked } + }); }} - disabled={!myPermissions.manage_roles} - style={{ transform: 'scale(1.5)', opacity: !myPermissions.manage_roles ? 0.5 : 1 }} + disabled={!canManageRoles} + style={{ transform: 'scale(1.5)', opacity: disabledOpacity }} />
))} - {/* Prevent deleting Default Roles */} - {myPermissions.manage_roles && selectedRole.name !== 'Owner' && selectedRole.name !== '@everyone' && ( + {canManageRoles && selectedRole.name !== 'Owner' && selectedRole.name !== '@everyone' && ( @@ -182,18 +181,18 @@ const ServerSettingsModal = ({ onClose }) => {
{m.username}
- {m.roles && m.roles.map(r => ( + {m.roles?.map(r => ( {r.name} ))}
-
- {roles.filter(r => r.name !== 'Owner').map(r => { - const hasRole = m.roles?.some(ur => ur._id === r._id); - return ( - myPermissions.manage_roles && ( + {canManageRoles && ( +
+ {editableRoles.map(r => { + const hasRole = m.roles?.some(ur => ur._id === r._id); + return (
+ ); + })} +
+ )}
))}
); + const renderTabContent = () => { + switch (activeTab) { + case 'Roles': return renderRolesTab(); + case 'Members': return renderMembersTab(); + default: return
Server Name: Secure Chat
Region: US-East
; + } + }; + return (
{renderSidebar()} @@ -222,9 +229,7 @@ const ServerSettingsModal = ({ onClose }) => {

{activeTab}

- {activeTab === 'Roles' && renderRolesTab()} - {activeTab === 'Members' && renderMembersTab()} - {activeTab === 'Overview' &&
Server Name: Secure Chat
Region: US-East
} + {renderTabContent()}
); diff --git a/Frontend/Electron/src/components/Sidebar.jsx b/Frontend/Electron/src/components/Sidebar.jsx index 75d59dc..87f6c77 100644 --- a/Frontend/Electron/src/components/Sidebar.jsx +++ b/Frontend/Electron/src/components/Sidebar.jsx @@ -17,7 +17,40 @@ import disconnectIcon from '../assets/icons/disconnect.svg'; import cameraIcon from '../assets/icons/camera.svg'; import screenIcon from '../assets/icons/screen.svg'; -// Helper Component for coloring SVGs +const USER_COLORS = ['#5865F2', '#EBA7CD', '#57F287', '#FEE75C', '#EB459E', '#ED4245']; + +const ICON_COLOR_DEFAULT = 'color-mix(in oklab, hsl(240 4.294% 68.039% / 1) 100%, #000 0%)'; +const ICON_COLOR_ACTIVE = 'hsl(357.692 67.826% 54.902% / 1)'; + +const controlButtonStyle = { + background: 'transparent', + border: 'none', + cursor: 'pointer', + padding: '6px', + borderRadius: '4px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' +}; + +function getUserColor(name) { + let hash = 0; + for (let i = 0; i < name.length; i++) { + hash = name.charCodeAt(i) + ((hash << 5) - hash); + } + return USER_COLORS[Math.abs(hash) % USER_COLORS.length]; +} + +function bytesToHex(bytes) { + return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join(''); +} + +function randomHex(length) { + const bytes = new Uint8Array(length); + crypto.getRandomValues(bytes); + return bytesToHex(bytes); +} + const ColoredIcon = ({ src, color, size = '20px' }) => (
{ const effectiveMute = isMuted || isDeafened; - const getUserColor = (name) => { - const colors = ['#5865F2', '#EBA7CD', '#57F287', '#FEE75C', '#EB459E', '#ED4245']; - let hash = 0; - for (let i = 0; i < name.length; i++) { - hash = name.charCodeAt(i) + ((hash << 5) - hash); - } - return colors[Math.abs(hash) % colors.length]; - }; - - const ICON_COLOR_DEFAULT = 'color-mix(in oklab, hsl(240 4.294% 68.039% / 1) 100%, #000 0%)'; - const ICON_COLOR_ACTIVE = 'hsl(357.692 67.826% 54.902% / 1)'; - return (
{ }}> {(username || '?').substring(0, 1).toUpperCase()}
- {/* Status Indicator */}
{ {/* Controls */}
- - - + +
+
+ + {isCreating && ( +
+
+
+ + +
+ setNewChannelName(e.target.value)} + style={{ + width: '100%', + background: '#202225', + border: '1px solid #7289da', + borderRadius: '4px', + color: '#dcddde', + padding: '4px 8px', + fontSize: '14px', + outline: 'none' + }} + /> +
+
+ Press Enter to Create {newChannelType === 'voice' && '(Voice)'} +
+
+ )} + + {channels.map(channel => ( + +
handleChannelClick(channel)} + style={{ + position: 'relative', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + paddingRight: '8px' + }} + > +
+ {channel.type === 'voice' ? ( +
+ 0 ? VOICE_ACTIVE_COLOR : "#8e9297"} + /> +
+ ) : ( + # + )} + {channel.name} +
+ + +
+ {renderVoiceUsers(channel)} +
+ ))} +
+ ); return (
- {/* Home Button */}
onViewChange('me')} @@ -424,7 +573,6 @@ const Sidebar = ({ channels, activeChannel, onSelectChannel, username, channelKe
- {/* The Server Icon (Secure Chat) */}
onViewChange('server')} @@ -432,222 +580,9 @@ const Sidebar = ({ channels, activeChannel, onSelectChannel, username, channelKe >Sc
- {/* Channel List Area */} - {view === 'me' ? ( -
- { - if (dm === 'friends') { - setActiveDMChannel(null); - } else { - setActiveDMChannel(dm); - } - }} - onOpenDM={onOpenDM} - /> -
- ) : ( -
-
- setIsServerSettingsOpen(true)} - title="Server Settings" - > - Secure Chat ▾ - -
- - -
-
- - {/* Inline Create Channel Input */} - {isCreating && ( -
-
-
- - -
- setNewChannelName(e.target.value)} - style={{ - width: '100%', - background: '#202225', - border: '1px solid #7289da', - borderRadius: '4px', - color: '#dcddde', - padding: '4px 8px', - fontSize: '14px', - outline: 'none' - }} - /> -
-
- Press Enter to Create {newChannelType === 'voice' && '(Voice)'} -
-
- )} - - {channels.map(channel => ( - -
{ - if (channel.type === 'voice') { - if (voiceChannelId === channel._id) { - onSelectChannel(channel._id); - } else { - connectToVoice(channel._id, channel.name, localStorage.getItem('userId')); - } - } else { - onSelectChannel(channel._id); - } - }} - style={{ - position: 'relative', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - paddingRight: '8px' - }} - > -
- {channel.type === 'voice' ? ( -
- 0 - ? "color-mix(in oklab, hsl(132.809 calc(1*34.902%) 50% /1) 100%, #000 0%)" - : "#8e9297" - } - /> -
- ) : ( - # - )} - {channel.name} -
- - -
- {channel.type === 'voice' && voiceStates[channel._id] && voiceStates[channel._id].length > 0 && ( -
- {voiceStates[channel._id].map(user => ( -
-
- {user.username.substring(0, 1).toUpperCase()} -
- {user.username} -
- {user.isScreenSharing && ( -
- Live -
- )} - {(user.isMuted || user.isDeafened) && ( - - )} - {user.isDeafened && ( - - )} -
-
- ))} -
- )} -
- ))} -
- )} + {view === 'me' ? renderDMView() : renderServerView()}
- {/* Voice Connection Panel */} + {connectionState === 'connected' && (
{voiceChannelName} / Secure Chat
- -
)} - {/* User Control Panel at Bottom, Spanning Full Width */} - {/* Modals */} {editingChannel && ( useContext(VoiceContext); +function playSound(type) { + const src = soundMap[type]; + if (!src) return; + const audio = new Audio(src); + audio.volume = 0.5; + audio.play().catch(e => console.error("Sound play failed", e)); +} + export const VoiceProvider = ({ children }) => { const [activeChannelId, setActiveChannelId] = useState(null); const [activeChannelName, setActiveChannelName] = useState(null); const [connectionState, setConnectionState] = useState('disconnected'); const [room, setRoom] = useState(null); const [token, setToken] = useState(null); - - const [activeSpeakers, setActiveSpeakers] = useState(new Set()); // Set + const [activeSpeakers, setActiveSpeakers] = useState(new Set()); const [isMuted, setIsMuted] = useState(false); const [isDeafened, setIsDeafened] = useState(false); + const [isScreenSharing, setIsScreenSharingLocal] = useState(false); const convex = useConvex(); - // Reactive voice states from Convex (replaces socket.io) const voiceStates = useQuery(api.voiceState.getAll) || {}; - // Sound Helper - const playSound = (type) => { - const sounds = { - join: joinSound, - leave: leaveSound, - mute: muteSound, - unmute: unmuteSound, - deafen: deafenSound, - undeafen: undeafenSound - }; - const src = sounds[type]; - if (src) { - const audio = new Audio(src); - audio.volume = 0.5; - audio.play().catch(e => console.error("Sound play failed", e)); + async function updateVoiceState(fields) { + const userId = localStorage.getItem('userId'); + if (!userId || !activeChannelId) return; + try { + await convex.mutation(api.voiceState.updateState, { userId, ...fields }); + } catch (e) { + console.error('Failed to update voice state:', e); } - }; + } const connectToVoice = async (channelId, channelName, userId) => { if (activeChannelId === channelId) return; @@ -60,7 +68,6 @@ export const VoiceProvider = ({ children }) => { setConnectionState('connecting'); try { - // Get LiveKit token via Convex action const { token: lkToken } = await convex.action(api.voice.getToken, { channelId, userId, @@ -71,30 +78,24 @@ export const VoiceProvider = ({ children }) => { setToken(lkToken); - // Disable adaptiveStream to ensure all tracks are available/subscribed immediately const newRoom = new Room({ adaptiveStream: false, dynacast: false, autoSubscribe: true }); - const liveKitUrl = import.meta.env.VITE_LIVEKIT_URL; - await newRoom.connect(liveKitUrl, lkToken); + await newRoom.connect(import.meta.env.VITE_LIVEKIT_URL, lkToken); - // Auto-enable microphone & Apply Mute/Deafen State - const shouldEnableMic = !isMuted && !isDeafened; - await newRoom.localParticipant.setMicrophoneEnabled(shouldEnableMic); + await newRoom.localParticipant.setMicrophoneEnabled(!isMuted && !isDeafened); setRoom(newRoom); setConnectionState('connected'); - window.voiceRoom = newRoom; // For debugging + window.voiceRoom = newRoom; playSound('join'); - // Update voice state in Convex await convex.mutation(api.voiceState.join, { channelId, userId, username: localStorage.getItem('username') || 'Unknown', - isMuted: isMuted, - isDeafened: isDeafened, + isMuted, + isDeafened, }); - // Events newRoom.on(RoomEvent.Disconnected, async (reason) => { console.warn('Voice Room Disconnected. Reason:', reason); playSound('leave'); @@ -104,7 +105,6 @@ export const VoiceProvider = ({ children }) => { setToken(null); setActiveSpeakers(new Set()); - // Remove voice state in Convex try { await convex.mutation(api.voiceState.leave, { userId }); } catch (e) { @@ -113,9 +113,7 @@ export const VoiceProvider = ({ children }) => { }); newRoom.on(RoomEvent.ActiveSpeakersChanged, (speakers) => { - const newActive = new Set(); - speakers.forEach(p => newActive.add(p.identity)); - setActiveSpeakers(newActive); + setActiveSpeakers(new Set(speakers.map(p => p.identity))); }); } catch (err) { @@ -137,63 +135,22 @@ export const VoiceProvider = ({ children }) => { if (room) { room.localParticipant.setMicrophoneEnabled(!nextState); } - - const userId = localStorage.getItem('userId'); - if (userId && activeChannelId) { - try { - await convex.mutation(api.voiceState.updateState, { - userId, - isMuted: nextState, - }); - } catch (e) { - console.error('Failed to update mute state:', e); - } - } + await updateVoiceState({ isMuted: nextState }); }; const toggleDeafen = async () => { const nextState = !isDeafened; setIsDeafened(nextState); playSound(nextState ? 'deafen' : 'undeafen'); - if (nextState) { - if (room && !isMuted) { - room.localParticipant.setMicrophoneEnabled(false); - } - } else { - if (room && !isMuted) { - room.localParticipant.setMicrophoneEnabled(true); - } - } - - const userId = localStorage.getItem('userId'); - if (userId && activeChannelId) { - try { - await convex.mutation(api.voiceState.updateState, { - userId, - isDeafened: nextState, - }); - } catch (e) { - console.error('Failed to update deafen state:', e); - } + if (room && !isMuted) { + room.localParticipant.setMicrophoneEnabled(!nextState); } + await updateVoiceState({ isDeafened: nextState }); }; - const [isScreenSharing, setIsScreenSharingLocal] = useState(false); - const setScreenSharing = async (active) => { setIsScreenSharingLocal(active); - - const userId = localStorage.getItem('userId'); - if (userId && activeChannelId) { - try { - await convex.mutation(api.voiceState.updateState, { - userId, - isScreenSharing: active, - }); - } catch (e) { - console.error('Failed to update screen sharing state:', e); - } - } + await updateVoiceState({ isScreenSharing: active }); }; return ( @@ -220,7 +177,6 @@ export const VoiceProvider = ({ children }) => { room={room} style={{ position: 'absolute', width: 0, height: 0, overflow: 'hidden' }} > - {/* Mute audio renderer if deafened */} )} diff --git a/Frontend/Electron/src/index.css b/Frontend/Electron/src/index.css index 00028e4..b83f6bc 100644 --- a/Frontend/Electron/src/index.css +++ b/Frontend/Electron/src/index.css @@ -273,6 +273,28 @@ body { background-color: rgba(2, 2, 2, 0.06); } +.message-grouped { + margin-top: 2px; +} + +.grouped-timestamp-wrapper { + display: flex; + align-items: center; + justify-content: center; + margin-top: 0; +} + +.grouped-timestamp { + display: none; + font-size: 0.65rem; + color: #72767d; + white-space: nowrap; +} + +.message-grouped:hover .grouped-timestamp { + display: block; +} + .message-avatar-wrapper { width: 40px; margin-right: 16px; @@ -631,6 +653,54 @@ body { cursor: help; } +/* Loading spinner */ +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +.loading-spinner { + width: 32px; + height: 32px; + border-radius: 50%; + border: 3px solid rgba(255, 255, 255, 0.1); + border-top-color: #5865f2; + animation: spin 0.8s linear infinite; +} + +/* Channel beginning indicator */ +.channel-beginning { + padding: 16px 16px 8px; + margin-bottom: 8px; +} + +.channel-beginning-icon { + width: 68px; + height: 68px; + border-radius: 50%; + background-color: #41434a; + display: flex; + align-items: center; + justify-content: center; + font-size: 36px; + font-weight: 600; + color: #fff; + margin-bottom: 8px; +} + +.channel-beginning-title { + font-size: 32px; + font-weight: 700; + color: #fff; + margin: 8px 0 4px; +} + +.channel-beginning-subtitle { + font-size: 15px; + color: #949ba4; + margin: 0; +} + /* Utility to hide scrollbar but allow scrolling */ .no-scrollbar { -ms-overflow-style: none; /* IE and Edge */ diff --git a/Frontend/Electron/src/pages/Chat.jsx b/Frontend/Electron/src/pages/Chat.jsx index 9bbbfe6..63a1f78 100644 --- a/Frontend/Electron/src/pages/Chat.jsx +++ b/Frontend/Electron/src/pages/Chat.jsx @@ -8,33 +8,27 @@ import { useVoice } from '../contexts/VoiceContext'; import FriendsView from '../components/FriendsView'; const Chat = () => { - const [view, setView] = useState('server'); // 'server' | 'me' + const [view, setView] = useState('server'); const [activeChannel, setActiveChannel] = useState(null); const [username, setUsername] = useState(''); const [userId, setUserId] = useState(null); - const [channelKeys, setChannelKeys] = useState({}); // { channelId: key_hex } - - // DM state - const [activeDMChannel, setActiveDMChannel] = useState(null); // { channel_id, other_username } + const [channelKeys, setChannelKeys] = useState({}); + const [activeDMChannel, setActiveDMChannel] = useState(null); const convex = useConvex(); - // Reactive channel list from Convex (auto-updates!) const channels = useQuery(api.channels.list) || []; - // Reactive channel keys from Convex const rawChannelKeys = useQuery( api.channelKeys.getKeysForUser, userId ? { userId } : "skip" ); - // Reactive DM channels from Convex const dmChannels = useQuery( api.dms.listDMs, userId ? { userId } : "skip" ) || []; - // Initialize user from localStorage useEffect(() => { const storedUsername = localStorage.getItem('username'); const storedUserId = localStorage.getItem('userId'); @@ -42,58 +36,50 @@ const Chat = () => { if (storedUserId) setUserId(storedUserId); }, []); - // Decrypt channel keys when raw keys change useEffect(() => { if (!rawChannelKeys || rawChannelKeys.length === 0) return; const privateKey = sessionStorage.getItem('privateKey'); if (!privateKey) return; - const decryptKeys = async () => { + async function decryptKeys() { const keys = {}; for (const item of rawChannelKeys) { try { const bundleJson = await window.cryptoAPI.privateDecrypt(privateKey, item.encrypted_key_bundle); - const bundle = JSON.parse(bundleJson); - Object.assign(keys, bundle); + Object.assign(keys, JSON.parse(bundleJson)); } catch (e) { console.error(`Failed to decrypt keys for channel ${item.channel_id}`, e); } } setChannelKeys(keys); - }; + } decryptKeys(); }, [rawChannelKeys]); - // Auto-select first text channel when channels load useEffect(() => { - if (!activeChannel && channels.length > 0) { - const firstTextChannel = channels.find(c => c.type === 'text'); - if (firstTextChannel) { - setActiveChannel(firstTextChannel._id); - } + if (activeChannel || channels.length === 0) return; + const firstTextChannel = channels.find(c => c.type === 'text'); + if (firstTextChannel) { + setActiveChannel(firstTextChannel._id); } }, [channels, activeChannel]); const openDM = useCallback(async (targetUserId, targetUsername) => { const uid = localStorage.getItem('userId'); - const privateKey = sessionStorage.getItem('privateKey'); if (!uid) return; try { - // 1. Find or create the DM channel const { channelId, created } = await convex.mutation(api.dms.openDM, { userId: uid, targetUserId }); - // 2. If newly created, generate + distribute an AES key for both users if (created) { const keyBytes = new Uint8Array(32); crypto.getRandomValues(keyBytes); const keyHex = Array.from(keyBytes).map(b => b.toString(16).padStart(2, '0')).join(''); - // Fetch both users' public keys const allUsers = await convex.query(api.auth.getPublicKeys, {}); const participants = allUsers.filter(u => u.id === uid || u.id === targetUserId); @@ -117,10 +103,8 @@ const Chat = () => { if (batchKeys.length > 0) { await convex.mutation(api.channelKeys.uploadKeys, { keys: batchKeys }); } - // Channel keys will auto-update via reactive query } - // 3. Set active DM and switch to me view setActiveDMChannel({ channel_id: channelId, other_username: targetUsername }); setView('me'); @@ -129,13 +113,10 @@ const Chat = () => { } }, [convex]); - // Helper to get active channel object const activeChannelObj = channels.find(c => c._id === activeChannel); - const { room, voiceStates } = useVoice(); - // Determine what to render in the main area - const renderMainContent = () => { + function renderMainContent() { if (view === 'me') { if (activeDMChannel) { return ( @@ -173,7 +154,7 @@ const Chat = () => {

Click the + in the sidebar to create your first encrypted channel.

); - }; + } return (
@@ -184,9 +165,7 @@ const Chat = () => { username={username} channelKeys={channelKeys} view={view} - onViewChange={(v) => { - setView(v); - }} + onViewChange={setView} onOpenDM={openDM} activeDMChannel={activeDMChannel} setActiveDMChannel={setActiveDMChannel} diff --git a/Frontend/Electron/src/pages/Login.jsx b/Frontend/Electron/src/pages/Login.jsx index 845f58e..0d92c47 100644 --- a/Frontend/Electron/src/pages/Login.jsx +++ b/Frontend/Electron/src/pages/Login.jsx @@ -3,6 +3,11 @@ import { Link, useNavigate } from 'react-router-dom'; import { useConvex } from 'convex/react'; import { api } from '../../../../convex/_generated/api'; +async function decryptEncryptedField(encryptedJson, keyHex) { + const obj = JSON.parse(encryptedJson); + return window.cryptoAPI.decryptData(obj.content, keyHex, obj.iv, obj.tag); +} + const Login = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); @@ -19,15 +24,12 @@ const Login = () => { try { console.log('Starting login for:', username); - // 1. Get Salt (via Convex query) const { salt } = await convex.query(api.auth.getSalt, { username }); console.log('Got salt'); - // 2. Derive Keys (DEK, DAK) const { dek, dak } = await window.cryptoAPI.deriveAuthKeys(password, salt); console.log('Derived keys'); - // 3. Verify with Convex const verifyData = await convex.mutation(api.auth.verifyUser, { username, dak }); if (verifyData.error) { @@ -43,39 +45,15 @@ const Login = () => { console.error('MISSING USERID IN VERIFY RESPONSE!', verifyData); } - // 4. Decrypt Master Key (using DEK) console.log('Decrypting Master Key...'); - const encryptedMKObj = JSON.parse(verifyData.encryptedMK); - const mkHex = await window.cryptoAPI.decryptData( - encryptedMKObj.content, - dek, - encryptedMKObj.iv, - encryptedMKObj.tag - ); + const mkHex = await decryptEncryptedField(verifyData.encryptedMK, dek); - // 5. Decrypt Private Keys (using MK) console.log('Decrypting Private Keys...'); const encryptedPrivateKeysObj = JSON.parse(verifyData.encryptedPrivateKeys); - // Decrypt Ed25519 Signing Key - const edPrivObj = encryptedPrivateKeysObj.ed; - const signingKey = await window.cryptoAPI.decryptData( - edPrivObj.content, - mkHex, - edPrivObj.iv, - edPrivObj.tag - ); + const signingKey = await decryptEncryptedField(JSON.stringify(encryptedPrivateKeysObj.ed), mkHex); + const rsaPriv = await decryptEncryptedField(JSON.stringify(encryptedPrivateKeysObj.rsa), mkHex); - // Decrypt RSA Private Key (Identity Key) - const rsaPrivObj = encryptedPrivateKeysObj.rsa; - const rsaPriv = await window.cryptoAPI.decryptData( - rsaPrivObj.content, - mkHex, - rsaPrivObj.iv, - rsaPrivObj.tag - ); - - // Store Keys in Session (Memory-like) storage sessionStorage.setItem('signingKey', signingKey); sessionStorage.setItem('privateKey', rsaPriv); console.log('Keys decrypted and stored in session.'); @@ -85,7 +63,6 @@ const Login = () => { localStorage.setItem('publicKey', verifyData.publicKey); } - // Verify immediate read back console.log('Immediate localStorage read check:', localStorage.getItem('userId')); navigate('/chat'); diff --git a/Frontend/Electron/src/pages/Register.jsx b/Frontend/Electron/src/pages/Register.jsx index a3da010..b10ecc2 100644 --- a/Frontend/Electron/src/pages/Register.jsx +++ b/Frontend/Electron/src/pages/Register.jsx @@ -3,12 +3,19 @@ import { Link, useNavigate, useLocation } from 'react-router-dom'; import { useConvex } from 'convex/react'; import { api } from '../../../../convex/_generated/api'; +function parseInviteParams(input) { + const codeMatch = input.match(/[?&]code=([^&]+)/); + const keyMatch = input.match(/[?&]key=([^&]+)/); + if (codeMatch && keyMatch) return { code: codeMatch[1], secret: keyMatch[1] }; + return null; +} + const Register = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); - const [inviteKeys, setInviteKeys] = useState(null); // { channelId: keyHex } + const [inviteKeys, setInviteKeys] = useState(null); const [inviteLinkInput, setInviteLinkInput] = useState(''); const [activeInviteCode, setActiveInviteCode] = useState(null); @@ -16,7 +23,6 @@ const Register = () => { const location = useLocation(); const convex = useConvex(); - // Helper to process code/key const processInvite = async (code, secret) => { if (!window.cryptoAPI) { setError("Critical Error: Secure Crypto API missing. Run in Electron."); @@ -24,16 +30,13 @@ const Register = () => { } try { - // Fetch Invite via Convex const result = await convex.query(api.invites.use, { code }); if (result.error) throw new Error(result.error); - const { encryptedPayload } = result; - // Decrypt Payload - const blob = JSON.parse(encryptedPayload); + const blob = JSON.parse(result.encryptedPayload); const decrypted = await window.cryptoAPI.decryptData(blob.c, secret, blob.iv, blob.t); - const keys = JSON.parse(decrypted); + console.log('Invite keys decrypted successfully:', Object.keys(keys).length); setInviteKeys(keys); setActiveInviteCode(code); @@ -44,7 +47,6 @@ const Register = () => { } }; - // Handle Invite Link parsing from URL useEffect(() => { const params = new URLSearchParams(location.search); const code = params.get('code'); @@ -57,17 +59,11 @@ const Register = () => { }, [location]); const handleManualInvite = () => { - try { - const codeMatch = inviteLinkInput.match(/[?&]code=([^&]+)/); - const keyMatch = inviteLinkInput.match(/[?&]key=([^&]+)/); - - if (codeMatch && keyMatch) { - processInvite(codeMatch[1], keyMatch[1]); - } else { - setError("Invalid invite link format."); - } - } catch (e) { - setError("Invalid URL."); + const parsed = parseInviteParams(inviteLinkInput); + if (parsed) { + processInvite(parsed.code, parsed.secret); + } else { + setError("Invalid invite link format."); } }; @@ -79,36 +75,18 @@ const Register = () => { try { console.log('Starting registration for:', username); - // 1. Generate Salt and Master Key (MK) const salt = await window.cryptoAPI.randomBytes(16); const mk = await window.cryptoAPI.randomBytes(32); - - console.log('Generated Salt and MK'); - - // 2. Derive Keys (DEK, DAK) const { dek, dak } = await window.cryptoAPI.deriveAuthKeys(password, salt); - console.log('Derived keys'); - - // 3. Encrypt MK with DEK - const encryptedMKObj = await window.cryptoAPI.encryptData(mk, dek); - const encryptedMK = JSON.stringify(encryptedMKObj); - - // 4. Hash DAK for Auth Proof + const encryptedMK = JSON.stringify(await window.cryptoAPI.encryptData(mk, dek)); const hak = await window.cryptoAPI.sha256(dak); - - // 5. Generate Key Pairs const keys = await window.cryptoAPI.generateKeys(); - // 6. Encrypt Private Keys with MK - const encryptedRsaPriv = await window.cryptoAPI.encryptData(keys.rsaPriv, mk); - const encryptedEdPriv = await window.cryptoAPI.encryptData(keys.edPriv, mk); - const encryptedPrivateKeys = JSON.stringify({ - rsa: encryptedRsaPriv, - ed: encryptedEdPriv + rsa: await window.cryptoAPI.encryptData(keys.rsaPriv, mk), + ed: await window.cryptoAPI.encryptData(keys.edPriv, mk) }); - // 7. Register via Convex const data = await convex.mutation(api.auth.createUserWithProfile, { username, salt, @@ -120,34 +98,25 @@ const Register = () => { inviteCode: activeInviteCode || undefined }); - if (data.error) { - throw new Error(data.error); - } - + if (data.error) throw new Error(data.error); console.log('Registration successful:', data); - // 8. Upload Invite Keys (If present) if (inviteKeys && data.userId) { console.log('Uploading invite keys...'); - const batchKeys = []; - for (const [channelId, channelKeyHex] of Object.entries(inviteKeys)) { - try { + const batchKeys = await Promise.all( + Object.entries(inviteKeys).map(async ([channelId, channelKeyHex]) => { const payload = JSON.stringify({ [channelId]: channelKeyHex }); const encryptedKeyBundle = await window.cryptoAPI.publicEncrypt(keys.rsaPub, payload); + return { channelId, userId: data.userId, encryptedKeyBundle, keyVersion: 1 }; + }).map(p => p.catch(err => { + console.error('Failed to encrypt key for channel:', err); + return null; + })) + ); - batchKeys.push({ - channelId, - userId: data.userId, - encryptedKeyBundle, - keyVersion: 1 - }); - } catch (keyErr) { - console.error('Failed to encrypt key for channel:', channelId, keyErr); - } - } - - if (batchKeys.length > 0) { - await convex.mutation(api.channelKeys.uploadKeys, { keys: batchKeys }); + const validKeys = batchKeys.filter(Boolean); + if (validKeys.length > 0) { + await convex.mutation(api.channelKeys.uploadKeys, { keys: validKeys }); console.log('Uploaded invite keys'); } } @@ -170,24 +139,19 @@ const Register = () => {
{error &&
{error}
} - {/* Manual Invite Input - Fallback for Desktop App */} {!inviteKeys && ( -
-
- setInviteLinkInput(e.target.value)} - style={{ flex: 1, marginRight: '8px' }} - /> - -
+
+ setInviteLinkInput(e.target.value)} + style={{ flex: 1, marginRight: '8px' }} + /> +
- - )} {inviteKeys ? ( diff --git a/convex/auth.ts b/convex/auth.ts index 6b1664e..bae7613 100644 --- a/convex/auth.ts +++ b/convex/auth.ts @@ -1,6 +1,16 @@ import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; +async function sha256Hex(input: string): Promise { + const buffer = await crypto.subtle.digest( + "SHA-256", + new TextEncoder().encode(input) + ); + return Array.from(new Uint8Array(buffer)) + .map((b) => b.toString(16).padStart(2, "0")) + .join(""); +} + // Get salt for a username (returns fake salt for non-existent users) export const getSalt = query({ args: { username: v.string() }, @@ -16,15 +26,7 @@ export const getSalt = query({ } // Generate deterministic fake salt for non-existent users (privacy) - // Simple HMAC-like approach using username - const encoder = new TextEncoder(); - const data = encoder.encode("SERVER_SECRET_KEY" + args.username); - const hashBuffer = await crypto.subtle.digest("SHA-256", data); - const hashArray = new Uint8Array(hashBuffer); - const fakeSalt = Array.from(hashArray) - .map((b) => b.toString(16).padStart(2, "0")) - .join(""); - + const fakeSalt = await sha256Hex("SERVER_SECRET_KEY" + args.username); return { salt: fakeSalt }; }, }); @@ -55,14 +57,7 @@ export const verifyUser = mutation({ return { error: "Invalid credentials" }; } - // Hash the DAK with SHA-256 and compare - const encoder = new TextEncoder(); - const dakBuffer = encoder.encode(args.dak); - const hashBuffer = await crypto.subtle.digest("SHA-256", dakBuffer); - const hashArray = new Uint8Array(hashBuffer); - const hashedDAK = Array.from(hashArray) - .map((b) => b.toString(16).padStart(2, "0")) - .join(""); + const hashedDAK = await sha256Hex(args.dak); if (hashedDAK === user.hashedAuthKey) { return { @@ -95,7 +90,6 @@ export const createUserWithProfile = mutation({ v.object({ error: v.string() }) ), handler: async (ctx, args) => { - // Check if username is taken const existing = await ctx.db .query("userProfiles") .withIndex("by_username", (q) => q.eq("username", args.username)) @@ -105,17 +99,14 @@ export const createUserWithProfile = mutation({ return { error: "Username taken" }; } - // Count existing users - const allUsers = await ctx.db.query("userProfiles").collect(); - const userCount = allUsers.length; + const isFirstUser = + (await ctx.db.query("userProfiles").first()) === null; - // Enforce invite code for non-first users - if (userCount > 0) { + if (!isFirstUser) { if (!args.inviteCode) { return { error: "Invite code required" }; } - // Validate invite const invite = await ctx.db .query("invites") .withIndex("by_code", (q) => q.eq("code", args.inviteCode)) @@ -137,11 +128,9 @@ export const createUserWithProfile = mutation({ return { error: "Invite max uses reached" }; } - // Increment invite usage await ctx.db.patch(invite._id, { uses: invite.uses + 1 }); } - // Create user profile const userId = await ctx.db.insert("userProfiles", { username: args.username, clientSalt: args.salt, @@ -150,12 +139,10 @@ export const createUserWithProfile = mutation({ publicIdentityKey: args.publicKey, publicSigningKey: args.signingKey, encryptedPrivateKeys: args.encryptedPrivateKeys, - isAdmin: userCount === 0, + isAdmin: isFirstUser, }); - // First user bootstrap: create Owner + @everyone roles if they don't exist - if (userCount === 0) { - // Create @everyone role + if (isFirstUser) { const everyoneRoleId = await ctx.db.insert("roles", { name: "@everyone", color: "#99aab5", @@ -168,7 +155,6 @@ export const createUserWithProfile = mutation({ isHoist: false, }); - // Create Owner role const ownerRoleId = await ctx.db.insert("roles", { name: "Owner", color: "#e91e63", @@ -183,11 +169,9 @@ export const createUserWithProfile = mutation({ isHoist: true, }); - // Assign both roles to first user await ctx.db.insert("userRoles", { userId, roleId: everyoneRoleId }); await ctx.db.insert("userRoles", { userId, roleId: ownerRoleId }); } else { - // Assign @everyone role to new user const everyoneRole = await ctx.db .query("roles") .filter((q) => q.eq(q.field("name"), "@everyone")) diff --git a/convex/channels.ts b/convex/channels.ts index 2863df0..ffc1f10 100644 --- a/convex/channels.ts +++ b/convex/channels.ts @@ -1,5 +1,26 @@ import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; +import { GenericMutationCtx } from "convex/server"; +import { DataModel, Id } from "./_generated/dataModel"; + +type TableWithChannelIndex = + | "channelKeys" + | "dmParticipants" + | "typingIndicators" + | "voiceStates"; + +async function deleteByChannel( + ctx: GenericMutationCtx, + table: TableWithChannelIndex, + channelId: Id<"channels"> +) { + const docs = await (ctx.db.query(table) as any) + .withIndex("by_channel", (q: any) => q.eq("channelId", channelId)) + .collect(); + for (const doc of docs) { + await ctx.db.delete(doc._id); + } +} // List all non-DM channels export const list = query({ @@ -49,7 +70,6 @@ export const create = mutation({ throw new Error("Channel name required"); } - // Check for duplicate name const existing = await ctx.db .query("channels") .withIndex("by_name", (q) => q.eq("name", args.name)) @@ -105,13 +125,12 @@ export const remove = mutation({ throw new Error("Channel not found"); } - // Delete messages + // Delete reactions for all messages in this channel const messages = await ctx.db .query("messages") .withIndex("by_channel", (q) => q.eq("channelId", args.id)) .collect(); for (const msg of messages) { - // Delete reactions for this message const reactions = await ctx.db .query("messageReactions") .withIndex("by_message", (q) => q.eq("messageId", msg._id)) @@ -122,43 +141,11 @@ export const remove = mutation({ await ctx.db.delete(msg._id); } - // Delete channel keys - const keys = await ctx.db - .query("channelKeys") - .withIndex("by_channel", (q) => q.eq("channelId", args.id)) - .collect(); - for (const key of keys) { - await ctx.db.delete(key._id); - } + await deleteByChannel(ctx, "channelKeys", args.id); + await deleteByChannel(ctx, "dmParticipants", args.id); + await deleteByChannel(ctx, "typingIndicators", args.id); + await deleteByChannel(ctx, "voiceStates", args.id); - // Delete DM participants - const dmParts = await ctx.db - .query("dmParticipants") - .withIndex("by_channel", (q) => q.eq("channelId", args.id)) - .collect(); - for (const dp of dmParts) { - await ctx.db.delete(dp._id); - } - - // Delete typing indicators - const typing = await ctx.db - .query("typingIndicators") - .withIndex("by_channel", (q) => q.eq("channelId", args.id)) - .collect(); - for (const t of typing) { - await ctx.db.delete(t._id); - } - - // Delete voice states - const voiceStates = await ctx.db - .query("voiceStates") - .withIndex("by_channel", (q) => q.eq("channelId", args.id)) - .collect(); - for (const vs of voiceStates) { - await ctx.db.delete(vs._id); - } - - // Delete channel itself await ctx.db.delete(args.id); return { success: true }; diff --git a/convex/dms.ts b/convex/dms.ts index 0f639d6..10269ee 100644 --- a/convex/dms.ts +++ b/convex/dms.ts @@ -1,7 +1,6 @@ import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; -// Find-or-create DM channel between two users export const openDM = mutation({ args: { userId: v.id("userProfiles"), @@ -16,11 +15,9 @@ export const openDM = mutation({ throw new Error("Cannot DM yourself"); } - // Deterministic channel name const sorted = [args.userId, args.targetUserId].sort(); const dmName = `dm-${sorted[0]}-${sorted[1]}`; - // Check if already exists const existing = await ctx.db .query("channels") .withIndex("by_name", (q) => q.eq("name", dmName)) @@ -30,27 +27,20 @@ export const openDM = mutation({ return { channelId: existing._id, created: false }; } - // Create DM channel const channelId = await ctx.db.insert("channels", { name: dmName, type: "dm", }); - // Add participants - await ctx.db.insert("dmParticipants", { - channelId, - userId: args.userId, - }); - await ctx.db.insert("dmParticipants", { - channelId, - userId: args.targetUserId, - }); + await Promise.all([ + ctx.db.insert("dmParticipants", { channelId, userId: args.userId }), + ctx.db.insert("dmParticipants", { channelId, userId: args.targetUserId }), + ]); return { channelId, created: true }; }, }); -// List user's DM channels with other user info export const listDMs = query({ args: { userId: v.id("userProfiles") }, returns: v.array( @@ -62,43 +52,36 @@ export const listDMs = query({ }) ), handler: async (ctx, args) => { - // Get all DM participations for this user const myParticipations = await ctx.db .query("dmParticipants") .withIndex("by_user", (q) => q.eq("userId", args.userId)) .collect(); - const result: Array<{ - channel_id: typeof myParticipations[0]["channelId"]; - channel_name: string; - other_user_id: string; - other_username: string; - }> = []; + const results = await Promise.all( + myParticipations.map(async (part) => { + const channel = await ctx.db.get(part.channelId); + if (!channel || channel.type !== "dm") return null; - for (const part of myParticipations) { - const channel = await ctx.db.get(part.channelId); - if (!channel || channel.type !== "dm") continue; + const otherParts = await ctx.db + .query("dmParticipants") + .withIndex("by_channel", (q) => q.eq("channelId", part.channelId)) + .collect(); - // Find other participant - const otherParts = await ctx.db - .query("dmParticipants") - .withIndex("by_channel", (q) => q.eq("channelId", part.channelId)) - .collect(); + const otherPart = otherParts.find((p) => p.userId !== args.userId); + if (!otherPart) return null; - const otherPart = otherParts.find((p) => p.userId !== args.userId); - if (!otherPart) continue; + const otherUser = await ctx.db.get(otherPart.userId); + if (!otherUser) return null; - const otherUser = await ctx.db.get(otherPart.userId); - if (!otherUser) continue; + return { + channel_id: part.channelId, + channel_name: channel.name, + other_user_id: otherUser._id as string, + other_username: otherUser.username, + }; + }) + ); - result.push({ - channel_id: part.channelId, - channel_name: channel.name, - other_user_id: otherUser._id, - other_username: otherUser.username, - }); - } - - return result; + return results.filter((r): r is NonNullable => r !== null); }, }); diff --git a/convex/messages.ts b/convex/messages.ts index 75ed81e..8b9dc2d 100644 --- a/convex/messages.ts +++ b/convex/messages.ts @@ -1,47 +1,36 @@ import { query, mutation } from "./_generated/server"; +import { paginationOptsValidator } from "convex/server"; import { v } from "convex/values"; -// List recent messages for a channel with reactions + username export const list = query({ args: { + paginationOpts: paginationOptsValidator, channelId: v.id("channels"), userId: v.optional(v.id("userProfiles")), }, - returns: v.array(v.any()), + returns: v.any(), handler: async (ctx, args) => { - const messages = await ctx.db + const result = await ctx.db .query("messages") .withIndex("by_channel", (q) => q.eq("channelId", args.channelId)) .order("desc") - .take(50); + .paginate(args.paginationOpts); - // Reverse to get chronological order - const chronological = messages.reverse(); - - // Enrich with username, signing key, and reactions - const enriched = await Promise.all( - chronological.map(async (msg) => { - // Get sender info + const enrichedPage = await Promise.all( + result.page.map(async (msg) => { const sender = await ctx.db.get(msg.senderId); - // Get reactions for this message const reactionDocs = await ctx.db .query("messageReactions") .withIndex("by_message", (q) => q.eq("messageId", msg._id)) .collect(); - // Aggregate reactions - const reactions: Record< - string, - { count: number; me: boolean } - > = {}; + const reactions: Record = {}; for (const r of reactionDocs) { - if (!reactions[r.emoji]) { - reactions[r.emoji] = { count: 0, me: false }; - } - reactions[r.emoji].count++; + const entry = (reactions[r.emoji] ??= { count: 0, me: false }); + entry.count++; if (args.userId && r.userId === args.userId) { - reactions[r.emoji].me = true; + entry.me = true; } } @@ -56,17 +45,15 @@ export const list = query({ created_at: new Date(msg._creationTime).toISOString(), username: sender?.username || "Unknown", public_signing_key: sender?.publicSigningKey || "", - reactions: - Object.keys(reactions).length > 0 ? reactions : null, + reactions: Object.keys(reactions).length > 0 ? reactions : null, }; }) ); - return enriched; + return { ...result, page: enrichedPage }; }, }); -// Send encrypted message export const send = mutation({ args: { channelId: v.id("channels"), @@ -86,17 +73,14 @@ export const send = mutation({ signature: args.signature, keyVersion: args.keyVersion, }); - return { id }; }, }); -// Delete a message export const remove = mutation({ args: { id: v.id("messages") }, returns: v.null(), handler: async (ctx, args) => { - // Delete reactions first const reactions = await ctx.db .query("messageReactions") .withIndex("by_message", (q) => q.eq("messageId", args.id)) diff --git a/convex/roles.ts b/convex/roles.ts index c7aa6e1..4558b2c 100644 --- a/convex/roles.ts +++ b/convex/roles.ts @@ -1,5 +1,30 @@ import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; +import { GenericQueryCtx } from "convex/server"; +import { DataModel, Id, Doc } from "./_generated/dataModel"; + +const PERMISSION_KEYS = [ + "manage_channels", + "manage_roles", + "create_invite", + "embed_links", + "attach_files", +] as const; + +async function getRolesForUser( + ctx: GenericQueryCtx, + userId: Id<"userProfiles"> +): Promise[]> { + const assignments = await ctx.db + .query("userRoles") + .withIndex("by_user", (q) => q.eq("userId", userId)) + .collect(); + + const roles = await Promise.all( + assignments.map((ur) => ctx.db.get(ur.roleId)) + ); + return roles.filter((r): r is Doc<"roles"> => r !== null); +} // List all roles export const list = query({ @@ -49,18 +74,17 @@ export const update = mutation({ const role = await ctx.db.get(args.id); if (!role) throw new Error("Role not found"); + const { id, ...fields } = args; const updates: Record = {}; - if (args.name !== undefined) updates.name = args.name; - if (args.color !== undefined) updates.color = args.color; - if (args.permissions !== undefined) updates.permissions = args.permissions; - if (args.position !== undefined) updates.position = args.position; - if (args.isHoist !== undefined) updates.isHoist = args.isHoist; - - if (Object.keys(updates).length > 0) { - await ctx.db.patch(args.id, updates); + for (const [key, value] of Object.entries(fields)) { + if (value !== undefined) updates[key] = value; } - return await ctx.db.get(args.id); + if (Object.keys(updates).length > 0) { + await ctx.db.patch(id, updates); + } + + return await ctx.db.get(id); }, }); @@ -72,7 +96,6 @@ export const remove = mutation({ const role = await ctx.db.get(args.id); if (!role) throw new Error("Role not found"); - // Delete user_role assignments const assignments = await ctx.db .query("userRoles") .withIndex("by_role", (q) => q.eq("roleId", args.id)) @@ -93,30 +116,14 @@ export const listMembers = query({ handler: async (ctx) => { const users = await ctx.db.query("userProfiles").collect(); - const result = await Promise.all( - users.map(async (user) => { - const userRoleAssignments = await ctx.db - .query("userRoles") - .withIndex("by_user", (q) => q.eq("userId", user._id)) - .collect(); - - const roles = await Promise.all( - userRoleAssignments.map(async (ur) => { - const role = await ctx.db.get(ur.roleId); - return role; - }) - ); - - return { - id: user._id, - username: user.username, - public_identity_key: user.publicIdentityKey, - roles: roles.filter(Boolean), - }; - }) + return await Promise.all( + users.map(async (user) => ({ + id: user._id, + username: user.username, + public_identity_key: user.publicIdentityKey, + roles: await getRolesForUser(ctx, user._id), + })) ); - - return result; }, }); @@ -128,7 +135,6 @@ export const assign = mutation({ }, returns: v.object({ success: v.boolean() }), handler: async (ctx, args) => { - // Check if already assigned const existing = await ctx.db .query("userRoles") .withIndex("by_user_and_role", (q) => @@ -181,30 +187,21 @@ export const getMyPermissions = query({ attach_files: v.boolean(), }), handler: async (ctx, args) => { - const userRoleAssignments = await ctx.db - .query("userRoles") - .withIndex("by_user", (q) => q.eq("userId", args.userId)) - .collect(); + const roles = await getRolesForUser(ctx, args.userId); - const finalPerms = { - manage_channels: false, - manage_roles: false, - create_invite: false, - embed_links: false, - attach_files: false, - }; - - for (const ur of userRoleAssignments) { - const role = await ctx.db.get(ur.roleId); - if (!role) continue; - const p = (role.permissions || {}) as Record; - if (p.manage_channels) finalPerms.manage_channels = true; - if (p.manage_roles) finalPerms.manage_roles = true; - if (p.create_invite) finalPerms.create_invite = true; - if (p.embed_links) finalPerms.embed_links = true; - if (p.attach_files) finalPerms.attach_files = true; + const finalPerms: Record = {}; + for (const key of PERMISSION_KEYS) { + finalPerms[key] = roles.some( + (role) => (role.permissions as Record)?.[key] + ); } - return finalPerms; + return finalPerms as { + manage_channels: boolean; + manage_roles: boolean; + create_invite: boolean; + embed_links: boolean; + attach_files: boolean; + }; }, }); diff --git a/convex/typing.ts b/convex/typing.ts index b550502..916ff3e 100644 --- a/convex/typing.ts +++ b/convex/typing.ts @@ -2,7 +2,8 @@ import { query, mutation, internalMutation } from "./_generated/server"; import { v } from "convex/values"; import { internal } from "./_generated/api"; -// Start typing indicator +const TYPING_TTL_MS = 6000; + export const startTyping = mutation({ args: { channelId: v.id("channels"), @@ -11,9 +12,8 @@ export const startTyping = mutation({ }, returns: v.null(), handler: async (ctx, args) => { - const expiresAt = Date.now() + 6000; // 6 second TTL + const expiresAt = Date.now() + TYPING_TTL_MS; - // Upsert: check if already exists const existing = await ctx.db .query("typingIndicators") .withIndex("by_channel", (q) => q.eq("channelId", args.channelId)) @@ -32,14 +32,11 @@ export const startTyping = mutation({ }); } - // Schedule cleanup - await ctx.scheduler.runAfter(6000, internal.typing.cleanExpired, {}); - + await ctx.scheduler.runAfter(TYPING_TTL_MS, internal.typing.cleanExpired, {}); return null; }, }); -// Stop typing indicator export const stopTyping = mutation({ args: { channelId: v.id("channels"), @@ -61,7 +58,6 @@ export const stopTyping = mutation({ }, }); -// Get typing users for a channel (reactive!) export const getTyping = query({ args: { channelId: v.id("channels") }, returns: v.array( @@ -79,21 +75,17 @@ export const getTyping = query({ return indicators .filter((t) => t.expiresAt > now) - .map((t) => ({ - userId: t.userId, - username: t.username, - })); + .map((t) => ({ userId: t.userId, username: t.username })); }, }); -// Internal: clean expired typing indicators export const cleanExpired = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { const now = Date.now(); - const all = await ctx.db.query("typingIndicators").collect(); - for (const t of all) { + const expired = await ctx.db.query("typingIndicators").collect(); + for (const t of expired) { if (t.expiresAt <= now) { await ctx.db.delete(t._id); } diff --git a/convex/voiceState.ts b/convex/voiceState.ts index ff2ed72..ebad364 100644 --- a/convex/voiceState.ts +++ b/convex/voiceState.ts @@ -1,7 +1,16 @@ import { query, mutation } from "./_generated/server"; import { v } from "convex/values"; -// Join voice channel +async function removeUserVoiceStates(ctx: any, userId: any) { + const existing = await ctx.db + .query("voiceStates") + .withIndex("by_user", (q: any) => q.eq("userId", userId)) + .collect(); + for (const vs of existing) { + await ctx.db.delete(vs._id); + } +} + export const join = mutation({ args: { channelId: v.id("channels"), @@ -12,17 +21,8 @@ export const join = mutation({ }, returns: v.null(), handler: async (ctx, args) => { - // Remove from any other voice channel first - const existing = await ctx.db - .query("voiceStates") - .withIndex("by_user", (q) => q.eq("userId", args.userId)) - .collect(); + await removeUserVoiceStates(ctx, args.userId); - for (const vs of existing) { - await ctx.db.delete(vs._id); - } - - // Add to new channel await ctx.db.insert("voiceStates", { channelId: args.channelId, userId: args.userId, @@ -36,27 +36,17 @@ export const join = mutation({ }, }); -// Leave voice channel export const leave = mutation({ args: { userId: v.id("userProfiles"), }, returns: v.null(), handler: async (ctx, args) => { - const existing = await ctx.db - .query("voiceStates") - .withIndex("by_user", (q) => q.eq("userId", args.userId)) - .collect(); - - for (const vs of existing) { - await ctx.db.delete(vs._id); - } - + await removeUserVoiceStates(ctx, args.userId); return null; }, }); -// Update mute/deafen/screenshare state export const updateState = mutation({ args: { userId: v.id("userProfiles"), @@ -69,47 +59,36 @@ export const updateState = mutation({ const existing = await ctx.db .query("voiceStates") .withIndex("by_user", (q) => q.eq("userId", args.userId)) - .collect(); + .first(); - if (existing.length > 0) { - const updates: Record = {}; - if (args.isMuted !== undefined) updates.isMuted = args.isMuted; - if (args.isDeafened !== undefined) updates.isDeafened = args.isDeafened; - if (args.isScreenSharing !== undefined) - updates.isScreenSharing = args.isScreenSharing; - - await ctx.db.patch(existing[0]._id, updates); + if (existing) { + const { userId: _, ...updates } = args; + const filtered = Object.fromEntries( + Object.entries(updates).filter(([, val]) => val !== undefined) + ); + await ctx.db.patch(existing._id, filtered); } return null; }, }); -// Get all voice states (reactive!) export const getAll = query({ args: {}, returns: v.any(), handler: async (ctx) => { const states = await ctx.db.query("voiceStates").collect(); - // Group by channel - const grouped: Record< - string, - Array<{ - userId: string; - username: string; - isMuted: boolean; - isDeafened: boolean; - isScreenSharing: boolean; - }> - > = {}; + const grouped: Record> = {}; for (const s of states) { - const channelId = s.channelId; - if (!grouped[channelId]) { - grouped[channelId] = []; - } - grouped[channelId].push({ + (grouped[s.channelId] ??= []).push({ userId: s.userId, username: s.username, isMuted: s.isMuted, diff --git a/discord html copy/Discord DM's/discord css.txt b/discord html copy/Discord DM's/discord css.txt new file mode 100644 index 0000000..99571bc --- /dev/null +++ b/discord html copy/Discord DM's/discord css.txt @@ -0,0 +1,836 @@ +element.style { + font-size: 100%; + --saturation-factor: 1; + dynamic-range-limit: no-limit; + --custom-zoom: 100; + --devtools-sidebar-width: 0px; +} +.mana-toggle-inputs .theme-darker, .mana-toggle-inputs .theme-midnight, .mana-toggle-inputs.theme-darker, .mana-toggle-inputs.theme-midnight { + --checkbox-background-default: hsl(var(--opacity-black-8-hsl) / 0.0784313725490196); + --checkbox-border-default: hsl(var(--opacity-64-hsl) / 0.6392156862745098); +} +.mana-toggle-inputs .theme-dark, .mana-toggle-inputs.theme-dark { + --checkbox-background-default: hsl(var(--opacity-black-8-hsl) / 0.0784313725490196); + --checkbox-border-default: hsl(var(--opacity-64-hsl) / 0.6392156862745098); +} +:root { + --custom-bg-surface-overlay: rgba(33, 34, 41, .8); +} +:root { + --custom-bg-surface-overlay: rgba(33, 34, 41, .8); +} +.theme-dark { + --legacy-elevation-low: 0 1px 5px 0 var(--opacity-black-28); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-20); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-700-hsl) / 0.6); +} +:root { + --legacy-elevation-low: 0 1px 5px var(--opacity-black-20); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-8); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-300-hsl) / 0.3); +} +:root { + --custom-premium-marketing-hero-heading-padding-top: 120px; +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-guild-list-padding: var(--space-md); + --custom-guild-list-width: calc(var(--guildbar-avatar-size) + var(--custom-guild-list-padding) * 2); + --custom-guild-sidebar-width: 268px; + --custom-app-sidebar-target-width: calc(var(--custom-guild-sidebar-width) + var(--custom-guild-list-width)); + --custom-rtc-account-height: 44px; + --custom-app-top-bar-height: 32px; + --custom-app-top-bar-item-radius: 6px; + --custom-channel-header-height: calc(var(--guildbar-avatar-size) + var(--space-xs)); + --custom-member-list-width: 264px; + --custom-channel-textarea-text-area-height: 56px; + --custom-chat-aligned-icon-offset: ((var(--chat-avatar-size) - var(--chat-input-icon-size)) / 2); + --custom-message-margin-horizontal: var(--space-md); +} +:root { + --custom-add-permissions-modal-focus-ring-width: 4px; + --custom-custom-role-icon-form-item-role-icon-preview-size: 32px; + --custom-guild-settings-roles-edit-shared-sidebar-width: 232px; + --custom-guild-settings-roles-intro-roles-transition: 250ms; + --custom-guild-settings-roles-intro-pause-transition: 166ms; + --custom-guild-settings-roles-intro-background-transition: 500ms; + --custom-guild-settings-roles-intro-banner-transition-delay: calc(var(--custom-guild-settings-roles-intro-roles-transition) + var(--custom-guild-settings-roles-intro-pause-transition)); + --custom-guild-settings-roles-intro-roles-transition-delay: calc(var(--custom-guild-settings-roles-intro-roles-transition) + var(--custom-guild-settings-roles-intro-pause-transition) * 2 + var(--custom-guild-settings-roles-intro-background-transition)); + --custom-guild-settings-community-intro-content-spacing: 32px; + --custom-guild-settings-community-intro-hover-distance: -12px; + --custom-guild-settings-community-intro-text-spacing: 8px; + --custom-guild-settings-discovery-landing-page-max-width-tab: 905px; + --custom-guild-settings-discovery-landing-page-settings-max-width: 520px; + --custom-guild-settings-partner-content-spacing: 32px; + --custom-event-detail-info-tab-base-spacing: 8px; + --custom-subscription-listing-previews-carousel-cards-get-cut-off-width: 724px; + --custom-editable-benefits-list-emoji-size: 24px; + --custom-edit-benefit-modal-emoji-size: 22px; + --custom-edit-benefit-modal-emoji-margin: 10px; + --custom-guild-settings-role-subscriptions-max-width: 905px; + --custom-guild-settings-role-subscriptions-overview-settings-max-width: 520px; + --custom-guild-settings-store-page-settings-max-width: 520px; + --custom-importable-benefits-list-listing-image-size: 40px; + --custom-import-benefits-modal-icon-size: 24px; + --custom-import-benefits-modal-role-icon-size: 40px; + --custom-role-icon-uploader-icon-size: 24px; + --custom-guild-role-subscription-style-constants-cover-image-aspect-ratio: 4; + --custom-historic-earnings-table-toggle-expand-column-width: 30px; + --custom-guild-role-subscription-card-basic-info-tier-image-size: 80px; + --custom-guild-role-subscription-card-basic-info-tier-image-size-mobile: 48px; + --custom-guild-role-subscriptions-overview-page-page-max-width: 1180px; + --custom-guild-dialog-popout-width: 250px; + --custom-guild-dialog-splash-ratio: 1.77778; + --custom-guild-dialog-icon-size: 84px; + --custom-guild-dialog-icon-padding: 4px; + --custom-guild-product-download-modal-header-image-width: 119px; + --custom-guild-onboarding-home-page-max-page-width: 1128px; + --custom-guild-onboarding-home-page-max-single-column-width: 704px; + --custom-home-resource-channels-obscured-blur-radius: 20px; + --custom-guild-member-application-review-sidebar-width: 29vw; + --custom-featured-items-popout-featured-items-popout-footer-height: 120px; + --custom-guild-boosting-sidebar-display-conditional-bottom-margin: 12px; + --custom-guild-boosting-marketing-progress-bar-marker-dimensions: 32px; + --custom-guild-boosting-marketing-progress-bar-end-markers-margin: 4px; + --custom-guild-boosting-marketing-progress-bar-marker-marker-dimensions: 32px; + --custom-guild-boosting-marketing-tier-cards-tier-card-border-radius: 16px; + --custom-go-live-modal-art-height: 112px; + --custom-gif-picker-gutter-size: 0 16px 12px 16px; + --custom-gif-picker-search-results-desired-item-width: 160px; + --custom-forum-composer-attachments-attachment-size: 78px; +Show all properties (149 more) +} +:root { + --custom-index-scrollbar-width: 10px; + --custom-index-scrollbar-margin: 3px; + --custom-auth-box-auth-box-padding: 32px; + --custom-wave-splash-responsive-width-mobile: 485px; + --custom-wave-splash-responsive-width-mobile-first: 486px; + --custom-wave-splash-responsive-width-desktop: 1080px; + --custom-wave-splash-max-qr-login-width: 830px; + --custom-channel-text-area-button-hover-scale: 0.85714; + --custom-drag-resize-container-handle-size: 8px; + --custom-drag-resize-container-handle-bleed: 2px; + --custom-drag-resize-container-handle-offset: calc(var(--custom-drag-resize-container-handle-bleed) - var(--custom-drag-resize-container-handle-size)); + --custom-embed-spoiler-blur-radius: 44px; + --custom-gradient-progress-notch-width: 8px; + --custom-gradient-progress-notch-height: 16px; + --custom-gradient-progress-notch-margin: 2px; + --custom-guild-discovery-card-card-height: 320px; + --custom-guild-discovery-card-card-height-with-tags: 350px; + --custom-icon-button-icon-lg-size: 36px; + --custom-icon-button-icon-md-size: 24px; + --custom-icon-button-icon-sm-size: 18px; + --custom-icon-button-icon-xs-size: 12px; + --custom-invite-button-resolving-background-width: 380px; + --custom-keybind-space-around-key: 8px; + --custom-keybind-shadow-width: 2px; + --custom-keybind-vertical-padding-total-height: 8px; + --custom-keybind-applied-vertical-padding: calc((var(--custom-keybind-vertical-padding-total-height) - var(--custom-keybind-shadow-width)) / 2); + --custom-full-screen-layer-animation-duration: 150ms; + --custom-layout-sidebar-width: 232px; + --custom-message-avatar-size: 40px; + --custom-message-avatar-decoration-size: calc(var(--custom-message-avatar-size) * var(--decoration-to-avatar-ratio)); + --custom-message-margin-compact-indent: 5rem; + --custom-message-spacing-vertical-container-cozy: 0.125rem; + --custom-message-padding-vertical-container-compact: 0.125rem; + --custom-message-meta-space: 0.25rem; + --custom-message-reply-indent: 0.625rem; + --custom-message-margin-left-content-cozy: calc(var(--custom-message-avatar-size, 40px) + var(--custom-message-margin-horizontal) + var(--custom-message-margin-horizontal)); + --custom-message-reply-message-preview-line-height: 1.125rem; + --custom-message-attachment-spoiler-blur-radius: 44px; + --custom-user-premium-guild-subscription-easter-egg-size: 196px; + --custom-notification-spacing: 12px; + --custom-notification-container-width: 300px; + --custom-notification-space-around-divider: 12px; + --custom-notification-box-shadow-opacity: 0.8; + --custom-notification-box-shadow-blur-radius: 7px; + --custom-notification-box-shadow-spread-radius: 3px; + --custom-widget-max-widget-height: 100vh; + --custom-widget-bar-padding: 12px; + --custom-widget-body-padding: 4px; + --custom-widget-bar-height: 20px; + --custom-premium-guild-progress-bar-progress-bar-width: 24px; +Show all properties (113 more) +} +.density-default { + --channels-name-line-height: 24px; + --channels-spine-inverted-offset-top: 6px; + --channels-spine-offset-left: 24px; +} +:root { + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extra-bold: 800; + --channels-name-line-height: 24px; + --channels-spine-inverted-offset-top: 6px; + --channels-spine-offset-left: 24px; + --chat-avatar-size: 40px; + --chat-input-icon-size: 20px; + --chat-markup-line-height: 1.375rem; + --chat-resize-handle-width: 8px; + --control-input-height-md: 40px; + --control-input-height-sm: 32px; + --control-item-height-md: 40px; + --control-item-height-sm: 32px; + --form-input-height: 44px; + --guildbar-avatar-size: 40px; + --guildbar-folder-size: 48px; + --icon-size-lg: 32px; + --icon-size-md: 24px; + --icon-size-sm: 18px; + --icon-size-xs: 16px; + --icon-size-xxs: 12px; + --modal-horizontal-padding: 24px; + --modal-vertical-padding: 16px; + --modal-width-large: 800px; + --modal-width-medium: 602px; + --modal-width-small: 442px; + --select-max-width: 248px; + --select-option-height: 40px; +} +:root { + --font-primary: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-headline: "ABC Ginto Nord", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-code: "gg mono", "Source Code Pro", Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + --font-clan-body: Fraunces, "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-clan-signature: Corinthia, "gg sans", cursive, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display-marketing: "ABC Ginto Discord", "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display-marketing-header: "ABC Ginto Nord Discord", "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.theme-dark { + --guild-header-text-shadow: 0 1px 1px hsl(var(--black-hsl) / 0.4); + --elevation-stroke: 0 0 0 1px hsl(var(--primary-900-hsl) / 0.15); + --elevation-low: 0 1px 0 hsl(var(--primary-900-hsl) / 0.2), 0 1.5px 0 hsl(var(--primary-860-hsl) / 0.05), 0 2px 0 hsl(var(--primary-900-hsl) / 0.05); + --elevation-medium: 0 4px 4px hsl(var(--black-hsl) / 0.16); + --elevation-high: 0 8px 16px hsl(var(--black-hsl) / 0.24); +} +:root { + --radius-none: 0px; + --radius-xs: 4px; + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 16px; + --radius-xl: 24px; + --radius-xxl: 32px; + --radius-round: 2147483647px; +} +.density-default { + --space-xxs: var(--space-4); + --space-xs: var(--space-8); + --space-sm: var(--space-12); + --space-md: var(--space-16); + --space-lg: var(--space-20); + --space-xl: var(--space-24); + --space-xxl: var(--space-32); +} +:root { + --size-0: 0px; + --size-4: 4px; + --size-8: 8px; + --size-12: 12px; + --size-16: 16px; + --size-20: 20px; + --size-24: 24px; + --size-32: 32px; + --size-48: 48px; + --size-64: 64px; + --size-80: 80px; + --size-96: 96px; + --size-128: 128px; + --size-160: 160px; + --size-192: 192px; + --size-xxs: var(--size-4); + --size-xs: var(--size-8); + --size-sm: var(--size-12); + --size-md: var(--size-16); + --size-lg: var(--size-20); + --size-xl: var(--size-24); + --size-xxl: var(--size-32); + --breakpoint-480: 480px; + --breakpoint-640: 640px; + --breakpoint-768: 768px; + --breakpoint-1024: 1024px; + --breakpoint-1280: 1280px; + --breakpoint-1536: 1536px; + --breakpoint-1800: 1800px; + --breakpoint-2500: 2500px; + --breakpoint-xxs: 480px; + --breakpoint-xs: 640px; + --breakpoint-sm: 768px; + --breakpoint-md: 1024px; + --breakpoint-lg: 1280px; + --breakpoint-xl: 1536px; + --breakpoint-xxl: 1800px; + --breakpoint-max: 2500px; + --space-0: 0px; + --space-4: 4px; + --space-6: 6px; + --space-8: 8px; + --space-10: 10px; + --space-12: 12px; + --space-16: 16px; + --space-20: 20px; + --space-24: 24px; + --space-26: 26px; + --space-30: 30px; + --space-32: 32px; +Show all properties (15 more) +} +.theme-darker, .theme-midnight { + --shadow-border: 0 0 0 1px hsl(none 0% 100% / 0.08); + --shadow-border-filter: drop-shadow(0 0 1px hsl(none 0% 100% / 0.08)); + --shadow-button-overlay: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-button-overlay-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-high: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-high-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-ledge: 0 2px 0 0 hsl(none 0% 0% / 0.05), 0 1.5px 0 0 hsl(none 0% 0% / 0.05), 0 1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-ledge-filter: drop-shadow(0 1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-low: 0 1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-filter: drop-shadow(0 1px 4px hsl(none 0% 0% / 0.14)); + --shadow-low-active: 0 0 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-active-filter: drop-shadow(0 0 4px hsl(none 0% 0% / 0.14)); + --shadow-low-hover: 0 4px 10px 0 hsl(none 0% 0% / 0.14); + --shadow-low-hover-filter: drop-shadow(0 4px 10px hsl(none 0% 0% / 0.14)); + --shadow-medium: 0 4px 8px 0 hsl(none 0% 0% / 0.16); + --shadow-medium-filter: drop-shadow(0 4px 8px hsl(none 0% 0% / 0.16)); + --shadow-mobile-navigator-x: 0 0 10px 0 hsl(none 0% 0% / 0.22); + --shadow-mobile-navigator-x-filter: drop-shadow(0 0 10px hsl(none 0% 0% / 0.22)); + --shadow-top-high: 0 -12px 32px 0 hsl(none 0% 0% / 0.24); + --shadow-top-high-filter: drop-shadow(0 -12px 32px hsl(none 0% 0% / 0.24)); + --shadow-top-ledge: 0 -2px 0 0 hsl(none 0% 0% / 0.05), 0 -1.5px 0 0 hsl(none 0% 0% / 0.05), 0 -1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-top-ledge-filter: drop-shadow(0 -1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-top-low: 0 -1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-top-low-filter: drop-shadow(0 -1px 4px hsl(none 0% 0% / 0.14)); +} +.theme-dark { + --shadow-border: 0 0 0 1px hsl(none 0% 100% / 0.08); + --shadow-border-filter: drop-shadow(0 0 1px hsl(none 0% 100% / 0.08)); + --shadow-button-overlay: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-button-overlay-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-high: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-high-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-ledge: 0 2px 0 0 hsl(none 0% 0% / 0.05), 0 1.5px 0 0 hsl(none 0% 0% / 0.05), 0 1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-ledge-filter: drop-shadow(0 1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-low: 0 1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-filter: drop-shadow(0 1px 4px hsl(none 0% 0% / 0.14)); + --shadow-low-active: 0 0 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-active-filter: drop-shadow(0 0 4px hsl(none 0% 0% / 0.14)); + --shadow-low-hover: 0 4px 10px 0 hsl(none 0% 0% / 0.14); + --shadow-low-hover-filter: drop-shadow(0 4px 10px hsl(none 0% 0% / 0.14)); + --shadow-medium: 0 4px 8px 0 hsl(none 0% 0% / 0.16); + --shadow-medium-filter: drop-shadow(0 4px 8px hsl(none 0% 0% / 0.16)); + --shadow-mobile-navigator-x: 0 0 10px 0 hsl(none 0% 0% / 0.22); + --shadow-mobile-navigator-x-filter: drop-shadow(0 0 10px hsl(none 0% 0% / 0.22)); + --shadow-top-high: 0 -12px 32px 0 hsl(none 0% 0% / 0.24); + --shadow-top-high-filter: drop-shadow(0 -12px 32px hsl(none 0% 0% / 0.24)); + --shadow-top-ledge: 0 -2px 0 0 hsl(none 0% 0% / 0.05), 0 -1.5px 0 0 hsl(none 0% 0% / 0.05), 0 -1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-top-ledge-filter: drop-shadow(0 -1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-top-low: 0 -1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-top-low-filter: drop-shadow(0 -1px 4px hsl(none 0% 0% / 0.14)); +} +.visual-refresh { + --blue-100: var(--blue-new-1); + --blue-100-hsl: var(--blue-new-1-hsl); + --blue-130: var(--blue-new-1); + --blue-130-hsl: var(--blue-new-1-hsl); + --blue-160: var(--blue-new-1); + --blue-160-hsl: var(--blue-new-1-hsl); + --blue-200: var(--blue-new-5); + --blue-200-hsl: var(--blue-new-5-hsl); + --blue-230: var(--blue-new-11); + --blue-230-hsl: var(--blue-new-11-hsl); + --blue-260: var(--blue-new-16); + --blue-260-hsl: var(--blue-new-16-hsl); + --blue-300: var(--blue-new-24); + --blue-300-hsl: var(--blue-new-24-hsl); + --blue-330: var(--blue-new-30); + --blue-330-hsl: var(--blue-new-30-hsl); + --blue-345: var(--blue-new-36); + --blue-345-hsl: var(--blue-new-36-hsl); + --blue-360: var(--blue-new-40); + --blue-360-hsl: var(--blue-new-40-hsl); + --blue-400: var(--blue-new-46); + --blue-400-hsl: var(--blue-new-46-hsl); + --blue-430: var(--blue-new-52); + --blue-430-hsl: var(--blue-new-52-hsl); + --blue-460: var(--blue-new-57); + --blue-460-hsl: var(--blue-new-57-hsl); + --blue-500: var(--blue-new-62); + --blue-500-hsl: var(--blue-new-62-hsl); + --blue-530: var(--blue-new-67); + --blue-530-hsl: var(--blue-new-67-hsl); + --blue-560: var(--blue-new-71); + --blue-560-hsl: var(--blue-new-71-hsl); + --blue-600: var(--blue-new-75); + --blue-600-hsl: var(--blue-new-75-hsl); + --blue-630: var(--blue-new-78); + --blue-630-hsl: var(--blue-new-78-hsl); + --blue-660: var(--blue-new-81); + --blue-660-hsl: var(--blue-new-81-hsl); + --blue-700: var(--blue-new-84); + --blue-700-hsl: var(--blue-new-84-hsl); + --blue-730: var(--blue-new-87); + --blue-730-hsl: var(--blue-new-87-hsl); + --blue-760: var(--blue-new-90); + --blue-760-hsl: var(--blue-new-90-hsl); + --blue-800: var(--blue-new-92); + --blue-800-hsl: var(--blue-new-92-hsl); + --blue-830: var(--blue-new-94); + --blue-830-hsl: var(--blue-new-94-hsl); + --blue-860: var(--blue-new-95); + --blue-860-hsl: var(--blue-new-95-hsl); +Show all properties (422 more) +} +:root { + --neutral-1: hsl(var(--neutral-1-hsl) / 1); + --neutral-1-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 100%; + --neutral-2: hsl(var(--neutral-2-hsl) / 1); + --neutral-2-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 98.431%; + --neutral-3: hsl(var(--neutral-3-hsl) / 1); + --neutral-3-hsl: 240 calc(var(--saturation-factor, 1) * 6.667%) 97.059%; + --neutral-4: hsl(var(--neutral-4-hsl) / 1); + --neutral-4-hsl: 240 calc(var(--saturation-factor, 1) * 4.348%) 95.49%; + --neutral-5: hsl(var(--neutral-5-hsl) / 1); + --neutral-5-hsl: 240 calc(var(--saturation-factor, 1) * 6.667%) 94.118%; + --neutral-6: hsl(var(--neutral-6-hsl) / 1); + --neutral-6-hsl: 210 calc(var(--saturation-factor, 1) * 5.263%) 92.549%; + --neutral-7: hsl(var(--neutral-7-hsl) / 1); + --neutral-7-hsl: 240 calc(var(--saturation-factor, 1) * 4.545%) 91.373%; + --neutral-8: hsl(var(--neutral-8-hsl) / 1); + --neutral-8-hsl: 240 calc(var(--saturation-factor, 1) * 3.846%) 89.804%; + --neutral-9: hsl(var(--neutral-9-hsl) / 1); + --neutral-9-hsl: 240 calc(var(--saturation-factor, 1) * 5.085%) 88.431%; + --neutral-10: hsl(var(--neutral-10-hsl) / 1); + --neutral-10-hsl: 240 calc(var(--saturation-factor, 1) * 4.478%) 86.863%; + --neutral-11: hsl(var(--neutral-11-hsl) / 1); + --neutral-11-hsl: 225 calc(var(--saturation-factor, 1) * 5.405%) 85.49%; + --neutral-12: hsl(var(--neutral-12-hsl) / 1); + --neutral-12-hsl: 225 calc(var(--saturation-factor, 1) * 4.878%) 83.922%; + --neutral-13: hsl(var(--neutral-13-hsl) / 1); + --neutral-13-hsl: 240 calc(var(--saturation-factor, 1) * 4.545%) 82.745%; + --neutral-14: hsl(var(--neutral-14-hsl) / 1); + --neutral-14-hsl: 240 calc(var(--saturation-factor, 1) * 4.167%) 81.176%; + --neutral-15: hsl(var(--neutral-15-hsl) / 1); + --neutral-15-hsl: 228 calc(var(--saturation-factor, 1) * 4.854%) 79.804%; + --neutral-16: hsl(var(--neutral-16-hsl) / 1); + --neutral-16-hsl: 228 calc(var(--saturation-factor, 1) * 4.505%) 78.235%; + --neutral-17: hsl(var(--neutral-17-hsl) / 1); + --neutral-17-hsl: 240 calc(var(--saturation-factor, 1) * 4.274%) 77.059%; + --neutral-18: hsl(var(--neutral-18-hsl) / 1); + --neutral-18-hsl: 240 calc(var(--saturation-factor, 1) * 4%) 75.49%; + --neutral-19: hsl(var(--neutral-19-hsl) / 1); + --neutral-19-hsl: 230 calc(var(--saturation-factor, 1) * 4.545%) 74.118%; + --neutral-20: hsl(var(--neutral-20-hsl) / 1); + --neutral-20-hsl: 230 calc(var(--saturation-factor, 1) * 4.286%) 72.549%; + --neutral-21: hsl(var(--neutral-21-hsl) / 1); + --neutral-21-hsl: 240 calc(var(--saturation-factor, 1) * 4.11%) 71.373%; + --neutral-22: hsl(var(--neutral-22-hsl) / 1); + --neutral-22-hsl: 231.429 calc(var(--saturation-factor, 1) * 4.575%) 70%; + --neutral-23: hsl(var(--neutral-23-hsl) / 1); + --neutral-23-hsl: 231.429 calc(var(--saturation-factor, 1) * 4.348%) 68.431%; + --neutral-24: hsl(var(--neutral-24-hsl) / 1); + --neutral-24-hsl: 240 calc(var(--saturation-factor, 1) * 4.192%) 67.255%; + --neutral-25: hsl(var(--neutral-25-hsl) / 1); + --neutral-25-hsl: 231.429 calc(var(--saturation-factor, 1) * 4%) 65.686%; +Show all properties (2780 more) +} +@supports (color:color-mix(in lch,red,blue)) { + .theme-darker { + --app-frame-background: color-mix(in oklab, var(--neutral-97) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --app-frame-border: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --app-message-embed-secondary-text: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --background-accent: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-low: color-mix(in oklab, var(--neutral-82) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lower: color-mix(in oklab, var(--neutral-86) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lowest: color-mix(in oklab, var(--neutral-92) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-code: color-mix(in oklab, hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-code-addition: color-mix(in oklab, hsl(var(--opacity-green-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-code-deletion: color-mix(in oklab, hsl(var(--opacity-red-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-info: color-mix(in oklab, hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-positive: color-mix(in oklab, hsl(var(--opacity-green-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-warning: color-mix(in oklab, hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-scrim: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --background-scrim-lightbox: color-mix(in oklab, hsl(var(--opacity-black-92-hsl) / 0.9215686274509803) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.9215686274509803) var(--custom-theme-base-color-amount, 0%)); + --background-secondary-alt: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-high: color-mix(in oklab, var(--neutral-79) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-higher: color-mix(in oklab, var(--neutral-76) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-highest: color-mix(in oklab, var(--neutral-73) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-end: color-mix(in oklab, hsl(var(--illo-pink-70-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-start: color-mix(in oklab, hsl(var(--illo-pink-50-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --bg-surface-raised: color-mix(in oklab, var(--plum-18) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --border-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-focus: color-mix(in oklab, var(--blue-new-30) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-muted: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-normal: color-mix(in oklab, hsl(var(--opacity-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-strong: color-mix(in oklab, hsl(var(--opacity-44-hsl) / 0.4392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.4392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-subtle: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --card-background-default: color-mix(in oklab, var(--neutral-79) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-primary-pressed-bg: color-mix(in oklab, var(--plum-19) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-bg: color-mix(in oklab, hsl(var(--opacity-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-pressed-bg: color-mix(in oklab, var(--plum-21) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --channel-icon: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channel-text-area-placeholder: color-mix(in oklab, var(--plum-11) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channels-default: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channeltextarea-background: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background: color-mix(in oklab, var(--plum-16) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background-default: color-mix(in oklab, var(--neutral-80) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-border: color-mix(in oklab, var(--plum-20) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --chat-text-muted: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-media-seekbar-container: color-mix(in oklab, hsl(var(--plum-6-hsl) / 0.24) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.24) var(--custom-theme-base-color-amount, 0%)); + --content-inventory-overlay-text-primary: color-mix(in oklab, hsl(var(--white-hsl) / 0.85) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.85) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-overlay-text-secondary: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --context-menu-backdrop-background: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --control-brand-foreground: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-brand-foreground-new: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-secondary-border-active: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --control-secondary-border-default: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --creator-revenue-icon-gradient-end: color-mix(in oklab, var(--teal-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); +Show all properties (171 more) + } +} +.theme-darker { + --app-frame-background: var(--neutral-97); + --app-frame-border: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --app-message-embed-secondary-text: hsl(var(--white-hsl) / 0.7); + --background-accent: var(--plum-15); + --background-base-low: var(--neutral-82); + --background-base-lower: var(--neutral-86); + --background-base-lowest: var(--neutral-92); + --background-brand: var(--blurple-50); + --background-code: hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196); + --background-code-addition: hsl(var(--opacity-green-12-hsl) / 0.12156862745098039); + --background-code-deletion: hsl(var(--opacity-red-12-hsl) / 0.12156862745098039); + --background-feedback-critical: hsl(var(--opacity-red-8-hsl) / 0.0784313725490196); + --background-feedback-info: hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196); + --background-feedback-notification: var(--red-new-46); + --background-feedback-positive: hsl(var(--opacity-green-8-hsl) / 0.0784313725490196); + --background-feedback-warning: hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196); + --background-mod-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --background-mod-normal: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --background-mod-strong: hsl(var(--opacity-20-hsl) / 0.2); + --background-mod-subtle: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --background-scrim: hsl(var(--opacity-black-72-hsl) / 0.7215686274509804); + --background-scrim-lightbox: hsl(var(--opacity-black-92-hsl) / 0.9215686274509803); + --background-secondary-alt: var(--plum-15); + --background-surface-high: var(--neutral-79); + --background-surface-higher: var(--neutral-76); + --background-surface-highest: var(--neutral-73); + --background-tile-gradient-pink-end: hsl(var(--illo-pink-70-hsl) / 0.3); + --background-tile-gradient-pink-start: hsl(var(--illo-pink-50-hsl) / 0.3); + --badge-background-brand: var(--blurple-50); + --badge-background-default: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --badge-expressive-background-default: var(--neutral-1); + --badge-expressive-text-default: var(--neutral-71); + --badge-notification-background: var(--red-new-46); + --badge-text-brand: var(--neutral-1); + --badge-text-default: var(--neutral-2); + --bg-surface-raised: var(--plum-18); + --border-feedback-critical: hsl(var(--opacity-red-20-hsl) / 0.2); + --border-focus: var(--blue-new-30); + --border-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --border-normal: hsl(var(--opacity-20-hsl) / 0.2); + --border-strong: hsl(var(--opacity-44-hsl) / 0.4392156862745098); + --border-subtle: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --button-danger-background-disabled: var(--red-new-50); + --button-outline-brand-background-hover: var(--brand-500); + --button-outline-brand-border-active: var(--brand-560); + --button-outline-primary-text: var(--white); + --card-background-default: var(--neutral-79); + --card-primary-pressed-bg: var(--plum-19); + --card-secondary-bg: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --card-secondary-pressed-bg: var(--plum-21); +Show all properties (396 more) +} +@supports (color:color-mix(in lch,red,blue)) { + .theme-dark { + --app-frame-background: color-mix(in oklab, var(--neutral-78) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --app-frame-border: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --app-message-embed-secondary-text: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --background-accent: color-mix(in oklab, var(--primary-530) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-low: color-mix(in oklab, var(--neutral-66) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lower: color-mix(in oklab, var(--neutral-69) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lowest: color-mix(in oklab, var(--neutral-73) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-code: color-mix(in oklab, hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-code-addition: color-mix(in oklab, hsl(var(--opacity-green-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-code-deletion: color-mix(in oklab, hsl(var(--opacity-red-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-info: color-mix(in oklab, hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-positive: color-mix(in oklab, hsl(var(--opacity-green-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-warning: color-mix(in oklab, hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-scrim: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --background-scrim-lightbox: color-mix(in oklab, hsl(var(--opacity-black-92-hsl) / 0.9215686274509803) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.9215686274509803) var(--custom-theme-base-color-amount, 0%)); + --background-secondary-alt: color-mix(in oklab, var(--primary-660) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-high: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-higher: color-mix(in oklab, var(--neutral-62) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-highest: color-mix(in oklab, var(--neutral-60) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-end: color-mix(in oklab, hsl(var(--illo-pink-70-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-start: color-mix(in oklab, hsl(var(--illo-pink-50-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --bg-surface-raised: color-mix(in oklab, var(--primary-560) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --border-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-focus: color-mix(in oklab, var(--blue-new-30) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-muted: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-normal: color-mix(in oklab, hsl(var(--opacity-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-strong: color-mix(in oklab, hsl(var(--opacity-44-hsl) / 0.4392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.4392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-subtle: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --card-background-default: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-primary-pressed-bg: color-mix(in oklab, var(--primary-645) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-bg: color-mix(in oklab, hsl(var(--opacity-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-pressed-bg: color-mix(in oklab, var(--primary-645) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --channel-icon: color-mix(in oklab, var(--neutral-28) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channel-text-area-placeholder: color-mix(in oklab, var(--primary-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channels-default: color-mix(in oklab, var(--neutral-28) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channeltextarea-background: color-mix(in oklab, var(--primary-560) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background: color-mix(in oklab, var(--primary-600) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background-default: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-border: color-mix(in oklab, var(--primary-700) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --chat-text-muted: color-mix(in oklab, var(--neutral-27) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-media-seekbar-container: color-mix(in oklab, hsl(var(--plum-6-hsl) / 0.24) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.24) var(--custom-theme-base-color-amount, 0%)); + --content-inventory-overlay-text-primary: color-mix(in oklab, hsl(var(--white-hsl) / 0.85) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.85) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-overlay-text-secondary: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --context-menu-backdrop-background: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --control-brand-foreground: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-brand-foreground-new: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-secondary-border-active: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --control-secondary-border-default: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --creator-revenue-icon-gradient-end: color-mix(in oklab, var(--teal-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); +Show all properties (171 more) + } +} +.theme-dark { + --app-frame-background: var(--neutral-78); + --app-frame-border: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --app-message-embed-secondary-text: hsl(var(--white-hsl) / 0.7); + --background-accent: var(--primary-530); + --background-base-low: var(--neutral-66); + --background-base-lower: var(--neutral-69); + --background-base-lowest: var(--neutral-73); + --background-brand: var(--blurple-50); + --background-code: hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196); + --background-code-addition: hsl(var(--opacity-green-12-hsl) / 0.12156862745098039); + --background-code-deletion: hsl(var(--opacity-red-12-hsl) / 0.12156862745098039); + --background-feedback-critical: hsl(var(--opacity-red-8-hsl) / 0.0784313725490196); + --background-feedback-info: hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196); + --background-feedback-notification: var(--red-new-46); + --background-feedback-positive: hsl(var(--opacity-green-8-hsl) / 0.0784313725490196); + --background-feedback-warning: hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196); + --background-mod-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --background-mod-normal: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --background-mod-strong: hsl(var(--opacity-20-hsl) / 0.2); + --background-mod-subtle: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --background-scrim: hsl(var(--opacity-black-72-hsl) / 0.7215686274509804); + --background-scrim-lightbox: hsl(var(--opacity-black-92-hsl) / 0.9215686274509803); + --background-secondary-alt: var(--primary-660); + --background-surface-high: var(--neutral-64); + --background-surface-higher: var(--neutral-62); + --background-surface-highest: var(--neutral-60); + --background-tile-gradient-pink-end: hsl(var(--illo-pink-70-hsl) / 0.3); + --background-tile-gradient-pink-start: hsl(var(--illo-pink-50-hsl) / 0.3); + --badge-background-brand: var(--blurple-50); + --badge-background-default: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --badge-expressive-background-default: var(--neutral-1); + --badge-expressive-text-default: var(--neutral-71); + --badge-notification-background: var(--red-new-46); + --badge-text-brand: var(--neutral-1); + --badge-text-default: var(--neutral-1); + --bg-surface-raised: var(--primary-560); + --border-feedback-critical: hsl(var(--opacity-red-20-hsl) / 0.2); + --border-focus: var(--blue-new-30); + --border-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --border-normal: hsl(var(--opacity-20-hsl) / 0.2); + --border-strong: hsl(var(--opacity-44-hsl) / 0.4392156862745098); + --border-subtle: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --button-danger-background-disabled: var(--red-new-50); + --button-outline-brand-background-hover: var(--brand-500); + --button-outline-brand-border-active: var(--brand-560); + --button-outline-primary-text: var(--white); + --card-background-default: var(--neutral-64); + --card-primary-pressed-bg: var(--primary-645); + --card-secondary-bg: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --card-secondary-pressed-bg: var(--primary-645); +Show all properties (396 more) +} +:root { + --application-subscription-end: hsl(var(--application-subscription-end-hsl) / 1); + --application-subscription-end-hsl: 196.564 calc(var(--saturation-factor, 1) * 98.788%) 32.353%; + --application-subscription-start: hsl(var(--application-subscription-start-hsl) / 1); + --application-subscription-start-hsl: 234.909 calc(var(--saturation-factor, 1) * 68.465%) 52.745%; + --battlenet: hsl(var(--battlenet-hsl) / 1); + --battlenet-hsl: 199.651 calc(var(--saturation-factor, 1) * 100%) 44.902%; + --bg-animated-gradient-background-indigo-1: hsl(var(--bg-animated-gradient-background-indigo-1-hsl) / 1); + --bg-animated-gradient-background-indigo-1-hsl: 241.5 calc(var(--saturation-factor, 1) * 57.143%) 27.451%; + --bg-animated-gradient-background-indigo-2: hsl(var(--bg-animated-gradient-background-indigo-2-hsl) / 1); + --bg-animated-gradient-background-indigo-2-hsl: 257.059 calc(var(--saturation-factor, 1) * 100%) 20%; + --bg-animated-gradient-background-not-black: hsl(var(--bg-animated-gradient-background-not-black-hsl) / 1); + --bg-animated-gradient-background-not-black-hsl: 240 calc(var(--saturation-factor, 1) * 7.143%) 5.49%; + --bg-animated-gradient-background-pink-1: hsl(var(--bg-animated-gradient-background-pink-1-hsl) / 1); + --bg-animated-gradient-background-pink-1-hsl: 327.831 calc(var(--saturation-factor, 1) * 80.583%) 59.608%; + --bg-gradient-aurora-1: hsl(var(--bg-gradient-aurora-1-hsl) / 1); + --bg-gradient-aurora-1-hsl: 219.74 calc(var(--saturation-factor, 1) * 86.517%) 17.451%; + --bg-gradient-aurora-2: hsl(var(--bg-gradient-aurora-2-hsl) / 1); + --bg-gradient-aurora-2-hsl: 237.778 calc(var(--saturation-factor, 1) * 76.415%) 41.569%; + --bg-gradient-aurora-3: hsl(var(--bg-gradient-aurora-3-hsl) / 1); + --bg-gradient-aurora-3-hsl: 183.556 calc(var(--saturation-factor, 1) * 78.035%) 33.922%; + --bg-gradient-aurora-4: hsl(var(--bg-gradient-aurora-4-hsl) / 1); + --bg-gradient-aurora-4-hsl: 169.2 calc(var(--saturation-factor, 1) * 60.241%) 32.549%; + --bg-gradient-aurora-5: hsl(var(--bg-gradient-aurora-5-hsl) / 1); + --bg-gradient-aurora-5-hsl: 229.839 calc(var(--saturation-factor, 1) * 92.537%) 26.275%; + --bg-gradient-blurple-twilight-1: hsl(var(--bg-gradient-blurple-twilight-1-hsl) / 1); + --bg-gradient-blurple-twilight-1-hsl: 233.904 calc(var(--saturation-factor, 1) * 79.574%) 53.922%; + --bg-gradient-blurple-twilight-2: hsl(var(--bg-gradient-blurple-twilight-2-hsl) / 1); + --bg-gradient-blurple-twilight-2-hsl: 245.294 calc(var(--saturation-factor, 1) * 63.75%) 31.373%; + --bg-gradient-chroma-glow-1: hsl(var(--bg-gradient-chroma-glow-1-hsl) / 1); + --bg-gradient-chroma-glow-1-hsl: 183.39 calc(var(--saturation-factor, 1) * 86.341%) 40.196%; + --bg-gradient-chroma-glow-2: hsl(var(--bg-gradient-chroma-glow-2-hsl) / 1); + --bg-gradient-chroma-glow-2-hsl: 258.113 calc(var(--saturation-factor, 1) * 89.831%) 46.275%; + --bg-gradient-chroma-glow-3: hsl(var(--bg-gradient-chroma-glow-3-hsl) / 1); + --bg-gradient-chroma-glow-3-hsl: 298.491 calc(var(--saturation-factor, 1) * 90.857%) 34.314%; + --bg-gradient-chroma-glow-4: hsl(var(--bg-gradient-chroma-glow-4-hsl) / 1); + --bg-gradient-chroma-glow-4-hsl: 264.767 calc(var(--saturation-factor, 1) * 100%) 66.275%; + --bg-gradient-chroma-glow-5: hsl(var(--bg-gradient-chroma-glow-5-hsl) / 1); + --bg-gradient-chroma-glow-5-hsl: 206.702 calc(var(--saturation-factor, 1) * 75.494%) 50.392%; + --bg-gradient-citrus-sherbert-1: hsl(var(--bg-gradient-citrus-sherbert-1-hsl) / 1); + --bg-gradient-citrus-sherbert-1-hsl: 39.683 calc(var(--saturation-factor, 1) * 88.732%) 58.235%; + --bg-gradient-citrus-sherbert-2: hsl(var(--bg-gradient-citrus-sherbert-2-hsl) / 1); + --bg-gradient-citrus-sherbert-2-hsl: 18 calc(var(--saturation-factor, 1) * 81.522%) 63.922%; + --bg-gradient-cotton-candy-1: hsl(var(--bg-gradient-cotton-candy-1-hsl) / 1); + --bg-gradient-cotton-candy-1-hsl: 349.315 calc(var(--saturation-factor, 1) * 76.842%) 81.373%; + --bg-gradient-cotton-candy-2: hsl(var(--bg-gradient-cotton-candy-2-hsl) / 1); + --bg-gradient-cotton-candy-2-hsl: 226.4 calc(var(--saturation-factor, 1) * 92.593%) 84.118%; + --bg-gradient-crimson-moon-1: hsl(var(--bg-gradient-crimson-moon-1-hsl) / 1); + --bg-gradient-crimson-moon-1-hsl: 0 calc(var(--saturation-factor, 1) * 88.608%) 30.98%; + --bg-gradient-crimson-moon-2: hsl(var(--bg-gradient-crimson-moon-2-hsl) / 1); + --bg-gradient-crimson-moon-2-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 0%; +Show all properties (526 more) +} +.theme-dark { + --legacy-elevation-low: 0 1px 5px 0 var(--opacity-black-28); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-20); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-700-hsl) / 0.6); +} +:root { + --legacy-elevation-low: 0 1px 5px var(--opacity-black-20); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-8); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-300-hsl) / 0.3); +} +:root { + --custom-paginator-round-button-size: 28px; +} +:root { + --custom-app-launcher-sticky-header-height: 66px; + --custom-app-launcher-container-border-radius: var(--radius-sm); +} +:root { + --custom-app-launcher-sticky-header-height: 66px; + --custom-app-launcher-container-border-radius: var(--radius-sm); +} +:root { + --custom-channel-members-bg: var(--background-base-lower); +} +:root { + --custom-user-profile-banner-height: 0; + --custom-user-profile-theme-padding: 0; + --custom-user-profile-base-layer-z-index: 0; + --custom-user-profile-bottom-layer-z-index: 1; + --custom-user-profile-middle-layer-z-index: 2; + --custom-user-profile-top-layer-z-index: 3; + --custom-user-profile-hoist-z-index: 4; + --custom-user-profile-toast-z-index: 5; +} +.root, [data-popout-root], :root { + --__spoiler-background-color--hidden: var(--spoiler-hidden-background); + --__spoiler-background-color--hidden--hover: var(--spoiler-hidden-background-hover); + --__spoiler-background-color--revealed: var(--background-mod-subtle); + --__spoiler-text-color--hidden: transparent; + --__spoiler-warning-text-color: var(--primary-200); + --__spoiler-warning-text-color--hover: var(--white); + --__spoiler-warning-background-color: var(--opacity-black-60); + --__spoiler-warning-background-color--hover: var(--opacity-black-88); + --__spoiler-container-box-shadow-color: var(--opacity-black-8); + --__obscured-background-blur-radius: 40px; + --__obscured-background-brightness: 0.55; +} +.theme-dark { + --brightness: calc(1.5 - var(--saturation-factor, 1) * 0.5); + --contrast: var(--saturation-factor, 1); +} +:root { + --expand-structural-duration: 100ms; + --expand-fade-duration: 200ms; + --expand-easing-function: ease-out; + --collapse-structural-duration: 150ms; + --collapse-fade-duration: 150ms; + --collapse-easing-function: ease-in; +} +.appMount__51fd7, body, html { + height: 100%; + width: 100%; +} +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, q, s, samp, small, span, strike, strong, table, tbody, td, tfoot, th, thead, tr, tt, ul, var { + border: 0; + font-family: inherit; + font-size: 100%; + font-style: inherit; + font-weight: inherit; + margin: 0; + padding: 0; + vertical-align: baseline; +} +[data-popout-root], html { + --brand-05a: hsla(var(--brand-500-hsl) / 0.05); + --brand-10a: hsla(var(--brand-500-hsl) / 0.1); + --brand-15a: hsla(var(--brand-500-hsl) / 0.15); + --brand-20a: hsla(var(--brand-500-hsl) / 0.2); + --brand-25a: hsla(var(--brand-500-hsl) / 0.25); + --brand-30a: hsla(var(--brand-500-hsl) / 0.3); + --brand-35a: hsla(var(--brand-500-hsl) / 0.35); + --brand-40a: hsla(var(--brand-500-hsl) / 0.4); + --brand-45a: hsla(var(--brand-500-hsl) / 0.45); + --brand-50a: hsla(var(--brand-500-hsl) / 0.5); + --brand-55a: hsla(var(--brand-500-hsl) / 0.55); + --brand-60a: hsla(var(--brand-500-hsl) / 0.6); + --brand-65a: hsla(var(--brand-500-hsl) / 0.65); + --brand-70a: hsla(var(--brand-500-hsl) / 0.7); + --brand-75a: hsla(var(--brand-500-hsl) / 0.75); + --brand-80a: hsla(var(--brand-500-hsl) / 0.8); + --brand-85a: hsla(var(--brand-500-hsl) / 0.85); + --brand-90a: hsla(var(--brand-500-hsl) / 0.9); + --brand-95a: hsla(var(--brand-500-hsl) / 0.95); +} +html[Attributes Style] { + -webkit-locale: "en-US"; +} +user agent stylesheet +:root { + view-transition-name: root; +} +user agent stylesheet +html { + display: block; +} + + + +
Direct Messages
Inbox
Upload to @graves
You can add comments before uploading.
+Hold shift to upload directly.
Direct Message

gravessvnfortysvn

Search svnfortysvn

chat

  1. Friday, January 9, 2026 12:06 PM

    If someone tries to fake to be us
  2. Friday, January 9, 2026 12:06 PM

    Ahhhhh
  3. Friday, January 9, 2026 12:07 PM

    I also see we are using the old MX records but google says they are still fine if they are working and are supported
  4. Friday, January 9, 2026 12:07 PM
    So should be good
  5. Friday, January 9, 2026 12:07 PM

    How do we update them?
  6. Friday, January 9, 2026 12:07 PM

    Same as everything else
  7. Friday, January 9, 2026 12:07 PM
    But it said it was fine
  8. Friday, January 9, 2026 12:08 PM
    You also gotta look up how to bring up your reputatation for email
  9. Friday, January 9, 2026 12:08 PM
    Because if everything says pass and 10/10 then its reputation
  10. Friday, January 9, 2026 12:08 PM
    Image
  11. Wednesday, January 28, 2026 10:00 PM

    Download
  12. Wednesday, January 28, 2026 11:14 PM

    72.26.56.3 +Vitali
  13. Thursday, January 29, 2026 9:17 PM

    • Madhouse Farms,
    • Chateau on Fifth,
    • Casa de palmas,
    • selfies and more studio,
    • The gardens by palacio,
    • La Julieta Eventos,
    • The Bryan House,
    • house of the orange blossom,
    • Hacienda San Miguel venue,
  14. Thursday, January 29, 2026 9:18 PM
    Two Dials On both side to lock on the mount + +- 300W Light up to 7500K +- Uses RGBW +- It offers a wide CTT range for those precise green/magenta adjustmnets +- And extensive color choices in HSI mode allowing precise color tuning usually found in higher-end lights + +- On board controls, remove control and NANLINK app +- Having bluetooth and 2.5Ghz modules to control via the NANLINK app + +- Comes with 2 extra fuses + +In the box +- Light +- Extra Fueses +- Reflector (Makes light brighter) +- Power cable + + +Different effets +- Hue Loop (Cycles through colors) +- CTT Loop +- INT loop +- FLASH +- PULSE +- STORM +- POLICE CAR +- TV +- PAPARAZZI +- CANDLE/FIRE +- DISCO +- BAD BULB +- FIREWORK +- EXPLOSION +- WELDING
  15. Saturday, January 31, 2026 7:15 PM

    Image
  16. Saturday, January 31, 2026 7:15 PM
    Image
  17. Saturday, January 31, 2026 7:15 PM
    Image
  18. Saturday, January 31, 2026 7:16 PM
    Image
  19. Monday, February 2, 2026 12:18 AM

  20. Monday, February 2, 2026 12:19 AM

    [CONVEX A(auth:signIn)] [Request ID: bdba3b568f26996b] Server Error Uncaught Error: Invalid password Called by client
  21. Tuesday, February 3, 2026 8:39 PM

    Domain for barrett +Logo +Feel more branding +New user tutorial + +Addresses + +Rush domain banner over locations +If subscribed. Checking for wash could check next time stored can be put in queue + +Personal services +Shoes shine for shoes +Personal vehicle washing + +Coming soon locations +Tierra Santa +Tres Lagos +Champions Lake + + +Receive Qr code when you register + +Send cart to club + +Easier to register car +Easier to manage subscriptions +Better sign up button + +Initial payment for sub +One month in advance payment + +When canceling subscription they must give 30 days in advance + +Support/contact +Send leave notice + +Add phone number to sign up + +Easiest application to use QR code + +When clicking Personal wash +How much +Drop off to barrett spa +Steps + +Basic wash +Full detail +Details for both packages + +Time slot of what time they'll be there + +How to charge user for merchant fees + + +Brand of clothing called wack + + +956 713 3788 Cell: + +Shoe shine, drop off shoes, or leave on cart + +Pos style adding services, simple way to add services + +Landing page simple +Informative +They have clothing +Lead to app
  22. Friday, February 6, 2026 11:02 PM

  23. Friday, February 6, 2026 11:21 PM

  24. Saturday, February 7, 2026 9:45 AM

    Image
  25. Saturday, February 7, 2026 2:03 PM

    NICEEEEEEEE
  26. Sunday, February 8, 2026 2:52 AM

    Image
    :thumbsup:
    Click to react
    :fire:
    Click to react
    :heart:
    Click to react
    Add Reaction
    Reply
    ForwardMore
  27. Sunday, February 8, 2026 2:55 AM
    Image
    :thumbsup:
    Click to react
    :fire:
    Click to react
    :heart:
    Click to react
    Add Reaction
    Reply
    ForwardMore
  28. Sunday, February 8, 2026 2:55 AM
    Image
  29. started a call that lasted an hour.Tuesday, February 10, 2026 12:50 AM
  30. Tuesday, February 10, 2026 1:09 AM

    Download

Send GIF
+ + +
\ No newline at end of file diff --git a/discord html copy/Discord Server/discord css.txt b/discord html copy/Discord Server/discord css.txt new file mode 100644 index 0000000..99571bc --- /dev/null +++ b/discord html copy/Discord Server/discord css.txt @@ -0,0 +1,836 @@ +element.style { + font-size: 100%; + --saturation-factor: 1; + dynamic-range-limit: no-limit; + --custom-zoom: 100; + --devtools-sidebar-width: 0px; +} +.mana-toggle-inputs .theme-darker, .mana-toggle-inputs .theme-midnight, .mana-toggle-inputs.theme-darker, .mana-toggle-inputs.theme-midnight { + --checkbox-background-default: hsl(var(--opacity-black-8-hsl) / 0.0784313725490196); + --checkbox-border-default: hsl(var(--opacity-64-hsl) / 0.6392156862745098); +} +.mana-toggle-inputs .theme-dark, .mana-toggle-inputs.theme-dark { + --checkbox-background-default: hsl(var(--opacity-black-8-hsl) / 0.0784313725490196); + --checkbox-border-default: hsl(var(--opacity-64-hsl) / 0.6392156862745098); +} +:root { + --custom-bg-surface-overlay: rgba(33, 34, 41, .8); +} +:root { + --custom-bg-surface-overlay: rgba(33, 34, 41, .8); +} +.theme-dark { + --legacy-elevation-low: 0 1px 5px 0 var(--opacity-black-28); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-20); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-700-hsl) / 0.6); +} +:root { + --legacy-elevation-low: 0 1px 5px var(--opacity-black-20); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-8); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-300-hsl) / 0.3); +} +:root { + --custom-premium-marketing-hero-heading-padding-top: 120px; +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-app-message-embed-base-info-gap: 4px; + --custom-app-message-embed-base-info-top: calc(var(--custom-app-message-embed-base-info-gap) - 2px); +} +:root { + --custom-guild-list-padding: var(--space-md); + --custom-guild-list-width: calc(var(--guildbar-avatar-size) + var(--custom-guild-list-padding) * 2); + --custom-guild-sidebar-width: 268px; + --custom-app-sidebar-target-width: calc(var(--custom-guild-sidebar-width) + var(--custom-guild-list-width)); + --custom-rtc-account-height: 44px; + --custom-app-top-bar-height: 32px; + --custom-app-top-bar-item-radius: 6px; + --custom-channel-header-height: calc(var(--guildbar-avatar-size) + var(--space-xs)); + --custom-member-list-width: 264px; + --custom-channel-textarea-text-area-height: 56px; + --custom-chat-aligned-icon-offset: ((var(--chat-avatar-size) - var(--chat-input-icon-size)) / 2); + --custom-message-margin-horizontal: var(--space-md); +} +:root { + --custom-add-permissions-modal-focus-ring-width: 4px; + --custom-custom-role-icon-form-item-role-icon-preview-size: 32px; + --custom-guild-settings-roles-edit-shared-sidebar-width: 232px; + --custom-guild-settings-roles-intro-roles-transition: 250ms; + --custom-guild-settings-roles-intro-pause-transition: 166ms; + --custom-guild-settings-roles-intro-background-transition: 500ms; + --custom-guild-settings-roles-intro-banner-transition-delay: calc(var(--custom-guild-settings-roles-intro-roles-transition) + var(--custom-guild-settings-roles-intro-pause-transition)); + --custom-guild-settings-roles-intro-roles-transition-delay: calc(var(--custom-guild-settings-roles-intro-roles-transition) + var(--custom-guild-settings-roles-intro-pause-transition) * 2 + var(--custom-guild-settings-roles-intro-background-transition)); + --custom-guild-settings-community-intro-content-spacing: 32px; + --custom-guild-settings-community-intro-hover-distance: -12px; + --custom-guild-settings-community-intro-text-spacing: 8px; + --custom-guild-settings-discovery-landing-page-max-width-tab: 905px; + --custom-guild-settings-discovery-landing-page-settings-max-width: 520px; + --custom-guild-settings-partner-content-spacing: 32px; + --custom-event-detail-info-tab-base-spacing: 8px; + --custom-subscription-listing-previews-carousel-cards-get-cut-off-width: 724px; + --custom-editable-benefits-list-emoji-size: 24px; + --custom-edit-benefit-modal-emoji-size: 22px; + --custom-edit-benefit-modal-emoji-margin: 10px; + --custom-guild-settings-role-subscriptions-max-width: 905px; + --custom-guild-settings-role-subscriptions-overview-settings-max-width: 520px; + --custom-guild-settings-store-page-settings-max-width: 520px; + --custom-importable-benefits-list-listing-image-size: 40px; + --custom-import-benefits-modal-icon-size: 24px; + --custom-import-benefits-modal-role-icon-size: 40px; + --custom-role-icon-uploader-icon-size: 24px; + --custom-guild-role-subscription-style-constants-cover-image-aspect-ratio: 4; + --custom-historic-earnings-table-toggle-expand-column-width: 30px; + --custom-guild-role-subscription-card-basic-info-tier-image-size: 80px; + --custom-guild-role-subscription-card-basic-info-tier-image-size-mobile: 48px; + --custom-guild-role-subscriptions-overview-page-page-max-width: 1180px; + --custom-guild-dialog-popout-width: 250px; + --custom-guild-dialog-splash-ratio: 1.77778; + --custom-guild-dialog-icon-size: 84px; + --custom-guild-dialog-icon-padding: 4px; + --custom-guild-product-download-modal-header-image-width: 119px; + --custom-guild-onboarding-home-page-max-page-width: 1128px; + --custom-guild-onboarding-home-page-max-single-column-width: 704px; + --custom-home-resource-channels-obscured-blur-radius: 20px; + --custom-guild-member-application-review-sidebar-width: 29vw; + --custom-featured-items-popout-featured-items-popout-footer-height: 120px; + --custom-guild-boosting-sidebar-display-conditional-bottom-margin: 12px; + --custom-guild-boosting-marketing-progress-bar-marker-dimensions: 32px; + --custom-guild-boosting-marketing-progress-bar-end-markers-margin: 4px; + --custom-guild-boosting-marketing-progress-bar-marker-marker-dimensions: 32px; + --custom-guild-boosting-marketing-tier-cards-tier-card-border-radius: 16px; + --custom-go-live-modal-art-height: 112px; + --custom-gif-picker-gutter-size: 0 16px 12px 16px; + --custom-gif-picker-search-results-desired-item-width: 160px; + --custom-forum-composer-attachments-attachment-size: 78px; +Show all properties (149 more) +} +:root { + --custom-index-scrollbar-width: 10px; + --custom-index-scrollbar-margin: 3px; + --custom-auth-box-auth-box-padding: 32px; + --custom-wave-splash-responsive-width-mobile: 485px; + --custom-wave-splash-responsive-width-mobile-first: 486px; + --custom-wave-splash-responsive-width-desktop: 1080px; + --custom-wave-splash-max-qr-login-width: 830px; + --custom-channel-text-area-button-hover-scale: 0.85714; + --custom-drag-resize-container-handle-size: 8px; + --custom-drag-resize-container-handle-bleed: 2px; + --custom-drag-resize-container-handle-offset: calc(var(--custom-drag-resize-container-handle-bleed) - var(--custom-drag-resize-container-handle-size)); + --custom-embed-spoiler-blur-radius: 44px; + --custom-gradient-progress-notch-width: 8px; + --custom-gradient-progress-notch-height: 16px; + --custom-gradient-progress-notch-margin: 2px; + --custom-guild-discovery-card-card-height: 320px; + --custom-guild-discovery-card-card-height-with-tags: 350px; + --custom-icon-button-icon-lg-size: 36px; + --custom-icon-button-icon-md-size: 24px; + --custom-icon-button-icon-sm-size: 18px; + --custom-icon-button-icon-xs-size: 12px; + --custom-invite-button-resolving-background-width: 380px; + --custom-keybind-space-around-key: 8px; + --custom-keybind-shadow-width: 2px; + --custom-keybind-vertical-padding-total-height: 8px; + --custom-keybind-applied-vertical-padding: calc((var(--custom-keybind-vertical-padding-total-height) - var(--custom-keybind-shadow-width)) / 2); + --custom-full-screen-layer-animation-duration: 150ms; + --custom-layout-sidebar-width: 232px; + --custom-message-avatar-size: 40px; + --custom-message-avatar-decoration-size: calc(var(--custom-message-avatar-size) * var(--decoration-to-avatar-ratio)); + --custom-message-margin-compact-indent: 5rem; + --custom-message-spacing-vertical-container-cozy: 0.125rem; + --custom-message-padding-vertical-container-compact: 0.125rem; + --custom-message-meta-space: 0.25rem; + --custom-message-reply-indent: 0.625rem; + --custom-message-margin-left-content-cozy: calc(var(--custom-message-avatar-size, 40px) + var(--custom-message-margin-horizontal) + var(--custom-message-margin-horizontal)); + --custom-message-reply-message-preview-line-height: 1.125rem; + --custom-message-attachment-spoiler-blur-radius: 44px; + --custom-user-premium-guild-subscription-easter-egg-size: 196px; + --custom-notification-spacing: 12px; + --custom-notification-container-width: 300px; + --custom-notification-space-around-divider: 12px; + --custom-notification-box-shadow-opacity: 0.8; + --custom-notification-box-shadow-blur-radius: 7px; + --custom-notification-box-shadow-spread-radius: 3px; + --custom-widget-max-widget-height: 100vh; + --custom-widget-bar-padding: 12px; + --custom-widget-body-padding: 4px; + --custom-widget-bar-height: 20px; + --custom-premium-guild-progress-bar-progress-bar-width: 24px; +Show all properties (113 more) +} +.density-default { + --channels-name-line-height: 24px; + --channels-spine-inverted-offset-top: 6px; + --channels-spine-offset-left: 24px; +} +:root { + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extra-bold: 800; + --channels-name-line-height: 24px; + --channels-spine-inverted-offset-top: 6px; + --channels-spine-offset-left: 24px; + --chat-avatar-size: 40px; + --chat-input-icon-size: 20px; + --chat-markup-line-height: 1.375rem; + --chat-resize-handle-width: 8px; + --control-input-height-md: 40px; + --control-input-height-sm: 32px; + --control-item-height-md: 40px; + --control-item-height-sm: 32px; + --form-input-height: 44px; + --guildbar-avatar-size: 40px; + --guildbar-folder-size: 48px; + --icon-size-lg: 32px; + --icon-size-md: 24px; + --icon-size-sm: 18px; + --icon-size-xs: 16px; + --icon-size-xxs: 12px; + --modal-horizontal-padding: 24px; + --modal-vertical-padding: 16px; + --modal-width-large: 800px; + --modal-width-medium: 602px; + --modal-width-small: 442px; + --select-max-width: 248px; + --select-option-height: 40px; +} +:root { + --font-primary: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-headline: "ABC Ginto Nord", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-code: "gg mono", "Source Code Pro", Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + --font-clan-body: Fraunces, "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-clan-signature: Corinthia, "gg sans", cursive, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display-marketing: "ABC Ginto Discord", "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display-marketing-header: "ABC Ginto Nord Discord", "gg sans", serif, "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +} +.theme-dark { + --guild-header-text-shadow: 0 1px 1px hsl(var(--black-hsl) / 0.4); + --elevation-stroke: 0 0 0 1px hsl(var(--primary-900-hsl) / 0.15); + --elevation-low: 0 1px 0 hsl(var(--primary-900-hsl) / 0.2), 0 1.5px 0 hsl(var(--primary-860-hsl) / 0.05), 0 2px 0 hsl(var(--primary-900-hsl) / 0.05); + --elevation-medium: 0 4px 4px hsl(var(--black-hsl) / 0.16); + --elevation-high: 0 8px 16px hsl(var(--black-hsl) / 0.24); +} +:root { + --radius-none: 0px; + --radius-xs: 4px; + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 16px; + --radius-xl: 24px; + --radius-xxl: 32px; + --radius-round: 2147483647px; +} +.density-default { + --space-xxs: var(--space-4); + --space-xs: var(--space-8); + --space-sm: var(--space-12); + --space-md: var(--space-16); + --space-lg: var(--space-20); + --space-xl: var(--space-24); + --space-xxl: var(--space-32); +} +:root { + --size-0: 0px; + --size-4: 4px; + --size-8: 8px; + --size-12: 12px; + --size-16: 16px; + --size-20: 20px; + --size-24: 24px; + --size-32: 32px; + --size-48: 48px; + --size-64: 64px; + --size-80: 80px; + --size-96: 96px; + --size-128: 128px; + --size-160: 160px; + --size-192: 192px; + --size-xxs: var(--size-4); + --size-xs: var(--size-8); + --size-sm: var(--size-12); + --size-md: var(--size-16); + --size-lg: var(--size-20); + --size-xl: var(--size-24); + --size-xxl: var(--size-32); + --breakpoint-480: 480px; + --breakpoint-640: 640px; + --breakpoint-768: 768px; + --breakpoint-1024: 1024px; + --breakpoint-1280: 1280px; + --breakpoint-1536: 1536px; + --breakpoint-1800: 1800px; + --breakpoint-2500: 2500px; + --breakpoint-xxs: 480px; + --breakpoint-xs: 640px; + --breakpoint-sm: 768px; + --breakpoint-md: 1024px; + --breakpoint-lg: 1280px; + --breakpoint-xl: 1536px; + --breakpoint-xxl: 1800px; + --breakpoint-max: 2500px; + --space-0: 0px; + --space-4: 4px; + --space-6: 6px; + --space-8: 8px; + --space-10: 10px; + --space-12: 12px; + --space-16: 16px; + --space-20: 20px; + --space-24: 24px; + --space-26: 26px; + --space-30: 30px; + --space-32: 32px; +Show all properties (15 more) +} +.theme-darker, .theme-midnight { + --shadow-border: 0 0 0 1px hsl(none 0% 100% / 0.08); + --shadow-border-filter: drop-shadow(0 0 1px hsl(none 0% 100% / 0.08)); + --shadow-button-overlay: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-button-overlay-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-high: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-high-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-ledge: 0 2px 0 0 hsl(none 0% 0% / 0.05), 0 1.5px 0 0 hsl(none 0% 0% / 0.05), 0 1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-ledge-filter: drop-shadow(0 1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-low: 0 1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-filter: drop-shadow(0 1px 4px hsl(none 0% 0% / 0.14)); + --shadow-low-active: 0 0 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-active-filter: drop-shadow(0 0 4px hsl(none 0% 0% / 0.14)); + --shadow-low-hover: 0 4px 10px 0 hsl(none 0% 0% / 0.14); + --shadow-low-hover-filter: drop-shadow(0 4px 10px hsl(none 0% 0% / 0.14)); + --shadow-medium: 0 4px 8px 0 hsl(none 0% 0% / 0.16); + --shadow-medium-filter: drop-shadow(0 4px 8px hsl(none 0% 0% / 0.16)); + --shadow-mobile-navigator-x: 0 0 10px 0 hsl(none 0% 0% / 0.22); + --shadow-mobile-navigator-x-filter: drop-shadow(0 0 10px hsl(none 0% 0% / 0.22)); + --shadow-top-high: 0 -12px 32px 0 hsl(none 0% 0% / 0.24); + --shadow-top-high-filter: drop-shadow(0 -12px 32px hsl(none 0% 0% / 0.24)); + --shadow-top-ledge: 0 -2px 0 0 hsl(none 0% 0% / 0.05), 0 -1.5px 0 0 hsl(none 0% 0% / 0.05), 0 -1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-top-ledge-filter: drop-shadow(0 -1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-top-low: 0 -1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-top-low-filter: drop-shadow(0 -1px 4px hsl(none 0% 0% / 0.14)); +} +.theme-dark { + --shadow-border: 0 0 0 1px hsl(none 0% 100% / 0.08); + --shadow-border-filter: drop-shadow(0 0 1px hsl(none 0% 100% / 0.08)); + --shadow-button-overlay: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-button-overlay-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-high: 0 12px 24px 0 hsl(none 0% 0% / 0.24); + --shadow-high-filter: drop-shadow(0 12px 24px hsl(none 0% 0% / 0.24)); + --shadow-ledge: 0 2px 0 0 hsl(none 0% 0% / 0.05), 0 1.5px 0 0 hsl(none 0% 0% / 0.05), 0 1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-ledge-filter: drop-shadow(0 1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-low: 0 1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-filter: drop-shadow(0 1px 4px hsl(none 0% 0% / 0.14)); + --shadow-low-active: 0 0 4px 0 hsl(none 0% 0% / 0.14); + --shadow-low-active-filter: drop-shadow(0 0 4px hsl(none 0% 0% / 0.14)); + --shadow-low-hover: 0 4px 10px 0 hsl(none 0% 0% / 0.14); + --shadow-low-hover-filter: drop-shadow(0 4px 10px hsl(none 0% 0% / 0.14)); + --shadow-medium: 0 4px 8px 0 hsl(none 0% 0% / 0.16); + --shadow-medium-filter: drop-shadow(0 4px 8px hsl(none 0% 0% / 0.16)); + --shadow-mobile-navigator-x: 0 0 10px 0 hsl(none 0% 0% / 0.22); + --shadow-mobile-navigator-x-filter: drop-shadow(0 0 10px hsl(none 0% 0% / 0.22)); + --shadow-top-high: 0 -12px 32px 0 hsl(none 0% 0% / 0.24); + --shadow-top-high-filter: drop-shadow(0 -12px 32px hsl(none 0% 0% / 0.24)); + --shadow-top-ledge: 0 -2px 0 0 hsl(none 0% 0% / 0.05), 0 -1.5px 0 0 hsl(none 0% 0% / 0.05), 0 -1px 0 0 hsl(none 0% 0% / 0.16); + --shadow-top-ledge-filter: drop-shadow(0 -1.5px 0 hsl(none 0% 0% / 0.24)); + --shadow-top-low: 0 -1px 4px 0 hsl(none 0% 0% / 0.14); + --shadow-top-low-filter: drop-shadow(0 -1px 4px hsl(none 0% 0% / 0.14)); +} +.visual-refresh { + --blue-100: var(--blue-new-1); + --blue-100-hsl: var(--blue-new-1-hsl); + --blue-130: var(--blue-new-1); + --blue-130-hsl: var(--blue-new-1-hsl); + --blue-160: var(--blue-new-1); + --blue-160-hsl: var(--blue-new-1-hsl); + --blue-200: var(--blue-new-5); + --blue-200-hsl: var(--blue-new-5-hsl); + --blue-230: var(--blue-new-11); + --blue-230-hsl: var(--blue-new-11-hsl); + --blue-260: var(--blue-new-16); + --blue-260-hsl: var(--blue-new-16-hsl); + --blue-300: var(--blue-new-24); + --blue-300-hsl: var(--blue-new-24-hsl); + --blue-330: var(--blue-new-30); + --blue-330-hsl: var(--blue-new-30-hsl); + --blue-345: var(--blue-new-36); + --blue-345-hsl: var(--blue-new-36-hsl); + --blue-360: var(--blue-new-40); + --blue-360-hsl: var(--blue-new-40-hsl); + --blue-400: var(--blue-new-46); + --blue-400-hsl: var(--blue-new-46-hsl); + --blue-430: var(--blue-new-52); + --blue-430-hsl: var(--blue-new-52-hsl); + --blue-460: var(--blue-new-57); + --blue-460-hsl: var(--blue-new-57-hsl); + --blue-500: var(--blue-new-62); + --blue-500-hsl: var(--blue-new-62-hsl); + --blue-530: var(--blue-new-67); + --blue-530-hsl: var(--blue-new-67-hsl); + --blue-560: var(--blue-new-71); + --blue-560-hsl: var(--blue-new-71-hsl); + --blue-600: var(--blue-new-75); + --blue-600-hsl: var(--blue-new-75-hsl); + --blue-630: var(--blue-new-78); + --blue-630-hsl: var(--blue-new-78-hsl); + --blue-660: var(--blue-new-81); + --blue-660-hsl: var(--blue-new-81-hsl); + --blue-700: var(--blue-new-84); + --blue-700-hsl: var(--blue-new-84-hsl); + --blue-730: var(--blue-new-87); + --blue-730-hsl: var(--blue-new-87-hsl); + --blue-760: var(--blue-new-90); + --blue-760-hsl: var(--blue-new-90-hsl); + --blue-800: var(--blue-new-92); + --blue-800-hsl: var(--blue-new-92-hsl); + --blue-830: var(--blue-new-94); + --blue-830-hsl: var(--blue-new-94-hsl); + --blue-860: var(--blue-new-95); + --blue-860-hsl: var(--blue-new-95-hsl); +Show all properties (422 more) +} +:root { + --neutral-1: hsl(var(--neutral-1-hsl) / 1); + --neutral-1-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 100%; + --neutral-2: hsl(var(--neutral-2-hsl) / 1); + --neutral-2-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 98.431%; + --neutral-3: hsl(var(--neutral-3-hsl) / 1); + --neutral-3-hsl: 240 calc(var(--saturation-factor, 1) * 6.667%) 97.059%; + --neutral-4: hsl(var(--neutral-4-hsl) / 1); + --neutral-4-hsl: 240 calc(var(--saturation-factor, 1) * 4.348%) 95.49%; + --neutral-5: hsl(var(--neutral-5-hsl) / 1); + --neutral-5-hsl: 240 calc(var(--saturation-factor, 1) * 6.667%) 94.118%; + --neutral-6: hsl(var(--neutral-6-hsl) / 1); + --neutral-6-hsl: 210 calc(var(--saturation-factor, 1) * 5.263%) 92.549%; + --neutral-7: hsl(var(--neutral-7-hsl) / 1); + --neutral-7-hsl: 240 calc(var(--saturation-factor, 1) * 4.545%) 91.373%; + --neutral-8: hsl(var(--neutral-8-hsl) / 1); + --neutral-8-hsl: 240 calc(var(--saturation-factor, 1) * 3.846%) 89.804%; + --neutral-9: hsl(var(--neutral-9-hsl) / 1); + --neutral-9-hsl: 240 calc(var(--saturation-factor, 1) * 5.085%) 88.431%; + --neutral-10: hsl(var(--neutral-10-hsl) / 1); + --neutral-10-hsl: 240 calc(var(--saturation-factor, 1) * 4.478%) 86.863%; + --neutral-11: hsl(var(--neutral-11-hsl) / 1); + --neutral-11-hsl: 225 calc(var(--saturation-factor, 1) * 5.405%) 85.49%; + --neutral-12: hsl(var(--neutral-12-hsl) / 1); + --neutral-12-hsl: 225 calc(var(--saturation-factor, 1) * 4.878%) 83.922%; + --neutral-13: hsl(var(--neutral-13-hsl) / 1); + --neutral-13-hsl: 240 calc(var(--saturation-factor, 1) * 4.545%) 82.745%; + --neutral-14: hsl(var(--neutral-14-hsl) / 1); + --neutral-14-hsl: 240 calc(var(--saturation-factor, 1) * 4.167%) 81.176%; + --neutral-15: hsl(var(--neutral-15-hsl) / 1); + --neutral-15-hsl: 228 calc(var(--saturation-factor, 1) * 4.854%) 79.804%; + --neutral-16: hsl(var(--neutral-16-hsl) / 1); + --neutral-16-hsl: 228 calc(var(--saturation-factor, 1) * 4.505%) 78.235%; + --neutral-17: hsl(var(--neutral-17-hsl) / 1); + --neutral-17-hsl: 240 calc(var(--saturation-factor, 1) * 4.274%) 77.059%; + --neutral-18: hsl(var(--neutral-18-hsl) / 1); + --neutral-18-hsl: 240 calc(var(--saturation-factor, 1) * 4%) 75.49%; + --neutral-19: hsl(var(--neutral-19-hsl) / 1); + --neutral-19-hsl: 230 calc(var(--saturation-factor, 1) * 4.545%) 74.118%; + --neutral-20: hsl(var(--neutral-20-hsl) / 1); + --neutral-20-hsl: 230 calc(var(--saturation-factor, 1) * 4.286%) 72.549%; + --neutral-21: hsl(var(--neutral-21-hsl) / 1); + --neutral-21-hsl: 240 calc(var(--saturation-factor, 1) * 4.11%) 71.373%; + --neutral-22: hsl(var(--neutral-22-hsl) / 1); + --neutral-22-hsl: 231.429 calc(var(--saturation-factor, 1) * 4.575%) 70%; + --neutral-23: hsl(var(--neutral-23-hsl) / 1); + --neutral-23-hsl: 231.429 calc(var(--saturation-factor, 1) * 4.348%) 68.431%; + --neutral-24: hsl(var(--neutral-24-hsl) / 1); + --neutral-24-hsl: 240 calc(var(--saturation-factor, 1) * 4.192%) 67.255%; + --neutral-25: hsl(var(--neutral-25-hsl) / 1); + --neutral-25-hsl: 231.429 calc(var(--saturation-factor, 1) * 4%) 65.686%; +Show all properties (2780 more) +} +@supports (color:color-mix(in lch,red,blue)) { + .theme-darker { + --app-frame-background: color-mix(in oklab, var(--neutral-97) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --app-frame-border: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --app-message-embed-secondary-text: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --background-accent: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-low: color-mix(in oklab, var(--neutral-82) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lower: color-mix(in oklab, var(--neutral-86) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lowest: color-mix(in oklab, var(--neutral-92) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-code: color-mix(in oklab, hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-code-addition: color-mix(in oklab, hsl(var(--opacity-green-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-code-deletion: color-mix(in oklab, hsl(var(--opacity-red-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-info: color-mix(in oklab, hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-positive: color-mix(in oklab, hsl(var(--opacity-green-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-warning: color-mix(in oklab, hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-scrim: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --background-scrim-lightbox: color-mix(in oklab, hsl(var(--opacity-black-92-hsl) / 0.9215686274509803) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.9215686274509803) var(--custom-theme-base-color-amount, 0%)); + --background-secondary-alt: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-high: color-mix(in oklab, var(--neutral-79) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-higher: color-mix(in oklab, var(--neutral-76) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-highest: color-mix(in oklab, var(--neutral-73) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-end: color-mix(in oklab, hsl(var(--illo-pink-70-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-start: color-mix(in oklab, hsl(var(--illo-pink-50-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --bg-surface-raised: color-mix(in oklab, var(--plum-18) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --border-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-focus: color-mix(in oklab, var(--blue-new-30) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-muted: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-normal: color-mix(in oklab, hsl(var(--opacity-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-strong: color-mix(in oklab, hsl(var(--opacity-44-hsl) / 0.4392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.4392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-subtle: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --card-background-default: color-mix(in oklab, var(--neutral-79) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-primary-pressed-bg: color-mix(in oklab, var(--plum-19) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-bg: color-mix(in oklab, hsl(var(--opacity-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-pressed-bg: color-mix(in oklab, var(--plum-21) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --channel-icon: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channel-text-area-placeholder: color-mix(in oklab, var(--plum-11) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channels-default: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channeltextarea-background: color-mix(in oklab, var(--plum-15) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background: color-mix(in oklab, var(--plum-16) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background-default: color-mix(in oklab, var(--neutral-80) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-border: color-mix(in oklab, var(--plum-20) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --chat-text-muted: color-mix(in oklab, var(--neutral-35) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-media-seekbar-container: color-mix(in oklab, hsl(var(--plum-6-hsl) / 0.24) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.24) var(--custom-theme-base-color-amount, 0%)); + --content-inventory-overlay-text-primary: color-mix(in oklab, hsl(var(--white-hsl) / 0.85) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.85) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-overlay-text-secondary: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --context-menu-backdrop-background: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --control-brand-foreground: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-brand-foreground-new: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-secondary-border-active: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --control-secondary-border-default: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --creator-revenue-icon-gradient-end: color-mix(in oklab, var(--teal-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); +Show all properties (171 more) + } +} +.theme-darker { + --app-frame-background: var(--neutral-97); + --app-frame-border: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --app-message-embed-secondary-text: hsl(var(--white-hsl) / 0.7); + --background-accent: var(--plum-15); + --background-base-low: var(--neutral-82); + --background-base-lower: var(--neutral-86); + --background-base-lowest: var(--neutral-92); + --background-brand: var(--blurple-50); + --background-code: hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196); + --background-code-addition: hsl(var(--opacity-green-12-hsl) / 0.12156862745098039); + --background-code-deletion: hsl(var(--opacity-red-12-hsl) / 0.12156862745098039); + --background-feedback-critical: hsl(var(--opacity-red-8-hsl) / 0.0784313725490196); + --background-feedback-info: hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196); + --background-feedback-notification: var(--red-new-46); + --background-feedback-positive: hsl(var(--opacity-green-8-hsl) / 0.0784313725490196); + --background-feedback-warning: hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196); + --background-mod-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --background-mod-normal: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --background-mod-strong: hsl(var(--opacity-20-hsl) / 0.2); + --background-mod-subtle: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --background-scrim: hsl(var(--opacity-black-72-hsl) / 0.7215686274509804); + --background-scrim-lightbox: hsl(var(--opacity-black-92-hsl) / 0.9215686274509803); + --background-secondary-alt: var(--plum-15); + --background-surface-high: var(--neutral-79); + --background-surface-higher: var(--neutral-76); + --background-surface-highest: var(--neutral-73); + --background-tile-gradient-pink-end: hsl(var(--illo-pink-70-hsl) / 0.3); + --background-tile-gradient-pink-start: hsl(var(--illo-pink-50-hsl) / 0.3); + --badge-background-brand: var(--blurple-50); + --badge-background-default: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --badge-expressive-background-default: var(--neutral-1); + --badge-expressive-text-default: var(--neutral-71); + --badge-notification-background: var(--red-new-46); + --badge-text-brand: var(--neutral-1); + --badge-text-default: var(--neutral-2); + --bg-surface-raised: var(--plum-18); + --border-feedback-critical: hsl(var(--opacity-red-20-hsl) / 0.2); + --border-focus: var(--blue-new-30); + --border-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --border-normal: hsl(var(--opacity-20-hsl) / 0.2); + --border-strong: hsl(var(--opacity-44-hsl) / 0.4392156862745098); + --border-subtle: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --button-danger-background-disabled: var(--red-new-50); + --button-outline-brand-background-hover: var(--brand-500); + --button-outline-brand-border-active: var(--brand-560); + --button-outline-primary-text: var(--white); + --card-background-default: var(--neutral-79); + --card-primary-pressed-bg: var(--plum-19); + --card-secondary-bg: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --card-secondary-pressed-bg: var(--plum-21); +Show all properties (396 more) +} +@supports (color:color-mix(in lch,red,blue)) { + .theme-dark { + --app-frame-background: color-mix(in oklab, var(--neutral-78) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --app-frame-border: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --app-message-embed-secondary-text: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --background-accent: color-mix(in oklab, var(--primary-530) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-low: color-mix(in oklab, var(--neutral-66) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lower: color-mix(in oklab, var(--neutral-69) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-base-lowest: color-mix(in oklab, var(--neutral-73) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-code: color-mix(in oklab, hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-code-addition: color-mix(in oklab, hsl(var(--opacity-green-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-code-deletion: color-mix(in oklab, hsl(var(--opacity-red-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-info: color-mix(in oklab, hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-positive: color-mix(in oklab, hsl(var(--opacity-green-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-feedback-warning: color-mix(in oklab, hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --background-scrim: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --background-scrim-lightbox: color-mix(in oklab, hsl(var(--opacity-black-92-hsl) / 0.9215686274509803) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.9215686274509803) var(--custom-theme-base-color-amount, 0%)); + --background-secondary-alt: color-mix(in oklab, var(--primary-660) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-high: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-higher: color-mix(in oklab, var(--neutral-62) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-surface-highest: color-mix(in oklab, var(--neutral-60) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-end: color-mix(in oklab, hsl(var(--illo-pink-70-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --background-tile-gradient-pink-start: color-mix(in oklab, hsl(var(--illo-pink-50-hsl) / 0.3) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.3) var(--custom-theme-base-color-amount, 0%)); + --bg-surface-raised: color-mix(in oklab, var(--primary-560) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --border-feedback-critical: color-mix(in oklab, hsl(var(--opacity-red-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-focus: color-mix(in oklab, var(--blue-new-30) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-muted: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-normal: color-mix(in oklab, hsl(var(--opacity-20-hsl) / 0.2) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.2) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-strong: color-mix(in oklab, hsl(var(--opacity-44-hsl) / 0.4392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.4392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --border-subtle: color-mix(in oklab, hsl(var(--opacity-12-hsl) / 0.12156862745098039) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.12156862745098039) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --card-background-default: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-primary-pressed-bg: color-mix(in oklab, var(--primary-645) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-bg: color-mix(in oklab, hsl(var(--opacity-8-hsl) / 0.0784313725490196) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0784313725490196) var(--custom-theme-base-color-amount, 0%)); + --card-secondary-pressed-bg: color-mix(in oklab, var(--primary-645) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --channel-icon: color-mix(in oklab, var(--neutral-28) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channel-text-area-placeholder: color-mix(in oklab, var(--primary-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channels-default: color-mix(in oklab, var(--neutral-28) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --channeltextarea-background: color-mix(in oklab, var(--primary-560) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background: color-mix(in oklab, var(--primary-600) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-background-default: color-mix(in oklab, var(--neutral-64) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-base-color-amount, 0%)); + --chat-border: color-mix(in oklab, var(--primary-700) 100%, var(--custom-theme-base-color, #000) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --chat-text-muted: color-mix(in oklab, var(--neutral-27) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-media-seekbar-container: color-mix(in oklab, hsl(var(--plum-6-hsl) / 0.24) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.24) var(--custom-theme-base-color-amount, 0%)); + --content-inventory-overlay-text-primary: color-mix(in oklab, hsl(var(--white-hsl) / 0.85) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.85) var(--custom-theme-text-color-amount, 0%)); + --content-inventory-overlay-text-secondary: color-mix(in oklab, hsl(var(--white-hsl) / 0.7) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7) var(--custom-theme-text-color-amount, 0%)); + --context-menu-backdrop-background: color-mix(in oklab, hsl(var(--opacity-black-72-hsl) / 0.7215686274509804) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.7215686274509804) var(--custom-theme-base-color-amount, 0%)); + --control-brand-foreground: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-brand-foreground-new: color-mix(in oklab, var(--brand-360) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); + --control-secondary-border-active: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --control-secondary-border-default: color-mix(in oklab, hsl(var(--opacity-4-hsl) / 0.0392156862745098) 100%, hsl(var(--custom-theme-base-color-hsl, 0 0% 0%) / 0.0392156862745098) var(--custom-theme-border-color-amount, var(--custom-theme-base-color-amount, 0%))); + --creator-revenue-icon-gradient-end: color-mix(in oklab, var(--teal-430) 100%, var(--custom-theme-text-color, #000) var(--custom-theme-text-color-amount, 0%)); +Show all properties (171 more) + } +} +.theme-dark { + --app-frame-background: var(--neutral-78); + --app-frame-border: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --app-message-embed-secondary-text: hsl(var(--white-hsl) / 0.7); + --background-accent: var(--primary-530); + --background-base-low: var(--neutral-66); + --background-base-lower: var(--neutral-69); + --background-base-lowest: var(--neutral-73); + --background-brand: var(--blurple-50); + --background-code: hsl(var(--opacity-blurple-8-hsl) / 0.0784313725490196); + --background-code-addition: hsl(var(--opacity-green-12-hsl) / 0.12156862745098039); + --background-code-deletion: hsl(var(--opacity-red-12-hsl) / 0.12156862745098039); + --background-feedback-critical: hsl(var(--opacity-red-8-hsl) / 0.0784313725490196); + --background-feedback-info: hsl(var(--opacity-blue-8-hsl) / 0.0784313725490196); + --background-feedback-notification: var(--red-new-46); + --background-feedback-positive: hsl(var(--opacity-green-8-hsl) / 0.0784313725490196); + --background-feedback-warning: hsl(var(--opacity-yellow-8-hsl) / 0.0784313725490196); + --background-mod-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --background-mod-normal: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --background-mod-strong: hsl(var(--opacity-20-hsl) / 0.2); + --background-mod-subtle: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --background-scrim: hsl(var(--opacity-black-72-hsl) / 0.7215686274509804); + --background-scrim-lightbox: hsl(var(--opacity-black-92-hsl) / 0.9215686274509803); + --background-secondary-alt: var(--primary-660); + --background-surface-high: var(--neutral-64); + --background-surface-higher: var(--neutral-62); + --background-surface-highest: var(--neutral-60); + --background-tile-gradient-pink-end: hsl(var(--illo-pink-70-hsl) / 0.3); + --background-tile-gradient-pink-start: hsl(var(--illo-pink-50-hsl) / 0.3); + --badge-background-brand: var(--blurple-50); + --badge-background-default: hsl(var(--opacity-16-hsl) / 0.1607843137254902); + --badge-expressive-background-default: var(--neutral-1); + --badge-expressive-text-default: var(--neutral-71); + --badge-notification-background: var(--red-new-46); + --badge-text-brand: var(--neutral-1); + --badge-text-default: var(--neutral-1); + --bg-surface-raised: var(--primary-560); + --border-feedback-critical: hsl(var(--opacity-red-20-hsl) / 0.2); + --border-focus: var(--blue-new-30); + --border-muted: hsl(var(--opacity-4-hsl) / 0.0392156862745098); + --border-normal: hsl(var(--opacity-20-hsl) / 0.2); + --border-strong: hsl(var(--opacity-44-hsl) / 0.4392156862745098); + --border-subtle: hsl(var(--opacity-12-hsl) / 0.12156862745098039); + --button-danger-background-disabled: var(--red-new-50); + --button-outline-brand-background-hover: var(--brand-500); + --button-outline-brand-border-active: var(--brand-560); + --button-outline-primary-text: var(--white); + --card-background-default: var(--neutral-64); + --card-primary-pressed-bg: var(--primary-645); + --card-secondary-bg: hsl(var(--opacity-8-hsl) / 0.0784313725490196); + --card-secondary-pressed-bg: var(--primary-645); +Show all properties (396 more) +} +:root { + --application-subscription-end: hsl(var(--application-subscription-end-hsl) / 1); + --application-subscription-end-hsl: 196.564 calc(var(--saturation-factor, 1) * 98.788%) 32.353%; + --application-subscription-start: hsl(var(--application-subscription-start-hsl) / 1); + --application-subscription-start-hsl: 234.909 calc(var(--saturation-factor, 1) * 68.465%) 52.745%; + --battlenet: hsl(var(--battlenet-hsl) / 1); + --battlenet-hsl: 199.651 calc(var(--saturation-factor, 1) * 100%) 44.902%; + --bg-animated-gradient-background-indigo-1: hsl(var(--bg-animated-gradient-background-indigo-1-hsl) / 1); + --bg-animated-gradient-background-indigo-1-hsl: 241.5 calc(var(--saturation-factor, 1) * 57.143%) 27.451%; + --bg-animated-gradient-background-indigo-2: hsl(var(--bg-animated-gradient-background-indigo-2-hsl) / 1); + --bg-animated-gradient-background-indigo-2-hsl: 257.059 calc(var(--saturation-factor, 1) * 100%) 20%; + --bg-animated-gradient-background-not-black: hsl(var(--bg-animated-gradient-background-not-black-hsl) / 1); + --bg-animated-gradient-background-not-black-hsl: 240 calc(var(--saturation-factor, 1) * 7.143%) 5.49%; + --bg-animated-gradient-background-pink-1: hsl(var(--bg-animated-gradient-background-pink-1-hsl) / 1); + --bg-animated-gradient-background-pink-1-hsl: 327.831 calc(var(--saturation-factor, 1) * 80.583%) 59.608%; + --bg-gradient-aurora-1: hsl(var(--bg-gradient-aurora-1-hsl) / 1); + --bg-gradient-aurora-1-hsl: 219.74 calc(var(--saturation-factor, 1) * 86.517%) 17.451%; + --bg-gradient-aurora-2: hsl(var(--bg-gradient-aurora-2-hsl) / 1); + --bg-gradient-aurora-2-hsl: 237.778 calc(var(--saturation-factor, 1) * 76.415%) 41.569%; + --bg-gradient-aurora-3: hsl(var(--bg-gradient-aurora-3-hsl) / 1); + --bg-gradient-aurora-3-hsl: 183.556 calc(var(--saturation-factor, 1) * 78.035%) 33.922%; + --bg-gradient-aurora-4: hsl(var(--bg-gradient-aurora-4-hsl) / 1); + --bg-gradient-aurora-4-hsl: 169.2 calc(var(--saturation-factor, 1) * 60.241%) 32.549%; + --bg-gradient-aurora-5: hsl(var(--bg-gradient-aurora-5-hsl) / 1); + --bg-gradient-aurora-5-hsl: 229.839 calc(var(--saturation-factor, 1) * 92.537%) 26.275%; + --bg-gradient-blurple-twilight-1: hsl(var(--bg-gradient-blurple-twilight-1-hsl) / 1); + --bg-gradient-blurple-twilight-1-hsl: 233.904 calc(var(--saturation-factor, 1) * 79.574%) 53.922%; + --bg-gradient-blurple-twilight-2: hsl(var(--bg-gradient-blurple-twilight-2-hsl) / 1); + --bg-gradient-blurple-twilight-2-hsl: 245.294 calc(var(--saturation-factor, 1) * 63.75%) 31.373%; + --bg-gradient-chroma-glow-1: hsl(var(--bg-gradient-chroma-glow-1-hsl) / 1); + --bg-gradient-chroma-glow-1-hsl: 183.39 calc(var(--saturation-factor, 1) * 86.341%) 40.196%; + --bg-gradient-chroma-glow-2: hsl(var(--bg-gradient-chroma-glow-2-hsl) / 1); + --bg-gradient-chroma-glow-2-hsl: 258.113 calc(var(--saturation-factor, 1) * 89.831%) 46.275%; + --bg-gradient-chroma-glow-3: hsl(var(--bg-gradient-chroma-glow-3-hsl) / 1); + --bg-gradient-chroma-glow-3-hsl: 298.491 calc(var(--saturation-factor, 1) * 90.857%) 34.314%; + --bg-gradient-chroma-glow-4: hsl(var(--bg-gradient-chroma-glow-4-hsl) / 1); + --bg-gradient-chroma-glow-4-hsl: 264.767 calc(var(--saturation-factor, 1) * 100%) 66.275%; + --bg-gradient-chroma-glow-5: hsl(var(--bg-gradient-chroma-glow-5-hsl) / 1); + --bg-gradient-chroma-glow-5-hsl: 206.702 calc(var(--saturation-factor, 1) * 75.494%) 50.392%; + --bg-gradient-citrus-sherbert-1: hsl(var(--bg-gradient-citrus-sherbert-1-hsl) / 1); + --bg-gradient-citrus-sherbert-1-hsl: 39.683 calc(var(--saturation-factor, 1) * 88.732%) 58.235%; + --bg-gradient-citrus-sherbert-2: hsl(var(--bg-gradient-citrus-sherbert-2-hsl) / 1); + --bg-gradient-citrus-sherbert-2-hsl: 18 calc(var(--saturation-factor, 1) * 81.522%) 63.922%; + --bg-gradient-cotton-candy-1: hsl(var(--bg-gradient-cotton-candy-1-hsl) / 1); + --bg-gradient-cotton-candy-1-hsl: 349.315 calc(var(--saturation-factor, 1) * 76.842%) 81.373%; + --bg-gradient-cotton-candy-2: hsl(var(--bg-gradient-cotton-candy-2-hsl) / 1); + --bg-gradient-cotton-candy-2-hsl: 226.4 calc(var(--saturation-factor, 1) * 92.593%) 84.118%; + --bg-gradient-crimson-moon-1: hsl(var(--bg-gradient-crimson-moon-1-hsl) / 1); + --bg-gradient-crimson-moon-1-hsl: 0 calc(var(--saturation-factor, 1) * 88.608%) 30.98%; + --bg-gradient-crimson-moon-2: hsl(var(--bg-gradient-crimson-moon-2-hsl) / 1); + --bg-gradient-crimson-moon-2-hsl: 0 calc(var(--saturation-factor, 1) * 0%) 0%; +Show all properties (526 more) +} +.theme-dark { + --legacy-elevation-low: 0 1px 5px 0 var(--opacity-black-28); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-20); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-700-hsl) / 0.6); +} +:root { + --legacy-elevation-low: 0 1px 5px var(--opacity-black-20); + --legacy-elevation-high: 0 2px 10px 0 var(--opacity-black-8); + --legacy-elevation-border: 0 0 0 1px hsl(var(--primary-300-hsl) / 0.3); +} +:root { + --custom-paginator-round-button-size: 28px; +} +:root { + --custom-app-launcher-sticky-header-height: 66px; + --custom-app-launcher-container-border-radius: var(--radius-sm); +} +:root { + --custom-app-launcher-sticky-header-height: 66px; + --custom-app-launcher-container-border-radius: var(--radius-sm); +} +:root { + --custom-channel-members-bg: var(--background-base-lower); +} +:root { + --custom-user-profile-banner-height: 0; + --custom-user-profile-theme-padding: 0; + --custom-user-profile-base-layer-z-index: 0; + --custom-user-profile-bottom-layer-z-index: 1; + --custom-user-profile-middle-layer-z-index: 2; + --custom-user-profile-top-layer-z-index: 3; + --custom-user-profile-hoist-z-index: 4; + --custom-user-profile-toast-z-index: 5; +} +.root, [data-popout-root], :root { + --__spoiler-background-color--hidden: var(--spoiler-hidden-background); + --__spoiler-background-color--hidden--hover: var(--spoiler-hidden-background-hover); + --__spoiler-background-color--revealed: var(--background-mod-subtle); + --__spoiler-text-color--hidden: transparent; + --__spoiler-warning-text-color: var(--primary-200); + --__spoiler-warning-text-color--hover: var(--white); + --__spoiler-warning-background-color: var(--opacity-black-60); + --__spoiler-warning-background-color--hover: var(--opacity-black-88); + --__spoiler-container-box-shadow-color: var(--opacity-black-8); + --__obscured-background-blur-radius: 40px; + --__obscured-background-brightness: 0.55; +} +.theme-dark { + --brightness: calc(1.5 - var(--saturation-factor, 1) * 0.5); + --contrast: var(--saturation-factor, 1); +} +:root { + --expand-structural-duration: 100ms; + --expand-fade-duration: 200ms; + --expand-easing-function: ease-out; + --collapse-structural-duration: 150ms; + --collapse-fade-duration: 150ms; + --collapse-easing-function: ease-in; +} +.appMount__51fd7, body, html { + height: 100%; + width: 100%; +} +a, abbr, acronym, address, applet, big, blockquote, body, caption, cite, code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5, h6, html, iframe, img, ins, kbd, label, legend, li, object, ol, p, pre, q, s, samp, small, span, strike, strong, table, tbody, td, tfoot, th, thead, tr, tt, ul, var { + border: 0; + font-family: inherit; + font-size: 100%; + font-style: inherit; + font-weight: inherit; + margin: 0; + padding: 0; + vertical-align: baseline; +} +[data-popout-root], html { + --brand-05a: hsla(var(--brand-500-hsl) / 0.05); + --brand-10a: hsla(var(--brand-500-hsl) / 0.1); + --brand-15a: hsla(var(--brand-500-hsl) / 0.15); + --brand-20a: hsla(var(--brand-500-hsl) / 0.2); + --brand-25a: hsla(var(--brand-500-hsl) / 0.25); + --brand-30a: hsla(var(--brand-500-hsl) / 0.3); + --brand-35a: hsla(var(--brand-500-hsl) / 0.35); + --brand-40a: hsla(var(--brand-500-hsl) / 0.4); + --brand-45a: hsla(var(--brand-500-hsl) / 0.45); + --brand-50a: hsla(var(--brand-500-hsl) / 0.5); + --brand-55a: hsla(var(--brand-500-hsl) / 0.55); + --brand-60a: hsla(var(--brand-500-hsl) / 0.6); + --brand-65a: hsla(var(--brand-500-hsl) / 0.65); + --brand-70a: hsla(var(--brand-500-hsl) / 0.7); + --brand-75a: hsla(var(--brand-500-hsl) / 0.75); + --brand-80a: hsla(var(--brand-500-hsl) / 0.8); + --brand-85a: hsla(var(--brand-500-hsl) / 0.85); + --brand-90a: hsla(var(--brand-500-hsl) / 0.9); + --brand-95a: hsla(var(--brand-500-hsl) / 0.95); +} +html[Attributes Style] { + -webkit-locale: "en-US"; +} +user agent stylesheet +:root { + view-transition-name: root; +} +user agent stylesheet +html { + display: block; +} + + + +
soup
Inbox
Upload to #germinal
You can add comments before uploading.
+Hold shift to upload directly.
Text Channel

soup: germinal

Search soup

germinal chat

  1. Sunday, February 8, 2026 6:54 PM

    Boring and timid
  2. Sunday, February 8, 2026 9:09 PM

    Download
  3. dꚙbyMonday, February 9, 2026 10:47 AM

    Discord will age-restrict accounts by default unless users verify their age via face scan or ID + + 157  71  1.3K  211.4K 
    Image
    Image
    FxTwitterYesterday at 8:54 AM
  4. Monday, February 9, 2026 10:47 AM
    Rip discord
  5. Monday, February 9, 2026 12:36 PM

    https://youtu.be/leM2NjGmCbY look who's gonna come back Monday, February 9, 2026 12:36 PM
  6. https://youtu.be/leM2NjGmCbY look who's gonna come back Monday, February 9, 2026 12:36 PM

    dꚙbyMonday, February 9, 2026 1:47 PM

    IS THAT YOUR MOM???
  7. Monday, February 9, 2026 1:47 PM

    yuh
  8. dꚙbyMonday, February 9, 2026 1:47 PM

    Gotta download it again
  9. dꚙbyMonday, February 9, 2026 4:30 PM

  10. Monday, February 9, 2026 4:48 PM

  11. Monday, February 9, 2026 4:53 PM
    Landscapers when they hear ICE is in the area: + + 91  459  4.9K  195.8K 
    FixupXYesterday at 12:12 PM
  12. dꚙbyMonday, February 9, 2026 5:20 PM

  13. Monday, February 9, 2026 5:22 PM

  14. Monday, February 9, 2026 5:37 PM

    That moment when Charleston White realises most of his hair has fallen out when vibing with Adin Ross + + 36  38  1.1K  53.3K 
    FixupX2/8/2026 5:09 PM
  15. dꚙbyMonday, February 9, 2026 6:07 PM

    Image
  16. Monday, February 9, 2026 6:21 PM

    Image
  17. Monday, February 9, 2026 6:29 PM

    Image
  18. dꚙbyMonday, February 9, 2026 6:43 PM

    Image
  19. dꚙbyMonday, February 9, 2026 9:13 PM

    Image
  20. Monday, February 9, 2026 9:17 PM
    Download
  21. dꚙbyMonday, February 9, 2026 9:50 PM

  22. dꚙbyMonday, February 9, 2026 10:19 PM

    Download
  23. dꚙbyMonday, February 9, 2026 11:09 PM

    Download
  24. Monday, February 9, 2026 11:22 PM

    Download
  25. Monday, February 9, 2026 11:27 PM
    Download
    :thumbsup:
    Click to react
    :fire:
    Click to react
    :heart:
    Click to react
    Add Reaction
    Reply
    ForwardMore
  26. dꚙbyTuesday, February 10, 2026 1:57 AM

    :thumbsup:
    Click to react
    :fire:
    Click to react
    :heart:
    Click to react
    Add Reaction
    Reply
    ForwardMore

Send GIF
+ + +
\ No newline at end of file