@studioindia/designx 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/bin/designx.js +2 -2
- package/dist/assets/{AppPreviewPanel-r56nQGPH.js → AppPreviewPanel-BHaogGvG.js} +1 -1
- package/dist/assets/index-B4DsP2aY.js +415 -0
- package/dist/assets/{index-CAWjWFwD.js → index-BSj8C6Y3.js} +1 -1
- package/dist/assets/index-CQNunw04.css +10 -0
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/server.cjs +271 -1
- package/dist/assets/index-CBUxOHiU.js +0 -406
- package/dist/assets/index-vZi_8zoX.css +0 -10
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as Os,d as pn,e as Is}from"./index-
|
|
1
|
+
import{g as Os,d as pn,e as Is}from"./index-B4DsP2aY.js";function Ns(e,n){for(var t=0;t<n.length;t++){const r=n[t];if(typeof r!="string"&&!Array.isArray(r)){for(const c in r)if(c!=="default"&&!(c in e)){const i=Object.getOwnPropertyDescriptor(r,c);i&&Object.defineProperty(e,c,i.get?i:{enumerable:!0,get:()=>r[c]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var Ze={},Ii="1.13.8",Fa=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||Function("return this")()||{},nr=Array.prototype,Ni=Object.prototype,Ca=typeof Symbol<"u"?Symbol.prototype:null,Ls=nr.push,dt=nr.slice,it=Ni.toString,Ms=Ni.hasOwnProperty,$c=typeof ArrayBuffer<"u",qs=typeof DataView<"u",Ps=Array.isArray,Sa=Object.keys,Ba=Object.create,ka=$c&&ArrayBuffer.isView,zs=isNaN,js=isFinite,Yc=!{toString:null}.propertyIsEnumerable("toString"),Wa=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],Xs=Math.pow(2,53)-1;function ze(e,n){return n=n==null?e.length-1:+n,function(){for(var t=Math.max(arguments.length-n,0),r=Array(t),c=0;c<t;c++)r[c]=arguments[c+n];switch(n){case 0:return e.call(this,r);case 1:return e.call(this,arguments[0],r);case 2:return e.call(this,arguments[0],arguments[1],r)}var i=Array(n+1);for(c=0;c<n;c++)i[c]=arguments[c];return i[n]=r,e.apply(this,i)}}function bn(e){var n=typeof e;return n==="function"||n==="object"&&!!e}function Kc(e){return e===null}function Li(e){return e===void 0}function Mi(e){return e===!0||e===!1||it.call(e)==="[object Boolean]"}function Qc(e){return!!(e&&e.nodeType===1)}function Pe(e){var n="[object "+e+"]";return function(t){return it.call(t)===n}}const tr=Pe("String"),qi=Pe("Number"),Jc=Pe("Date"),eu=Pe("RegExp"),nu=Pe("Error"),Pi=Pe("Symbol"),zi=Pe("ArrayBuffer");var tu=Pe("Function"),Vs=Fa.document&&Fa.document.childNodes;typeof/./!="function"&&typeof Int8Array!="object"&&typeof Vs!="function"&&(tu=function(e){return typeof e=="function"||!1});const qe=tu,ru=Pe("Object");var iu=qs&&(!/\[native code\]/.test(String(DataView))||ru(new DataView(new ArrayBuffer(8)))),ji=typeof Map<"u"&&ru(new Map),Hs=Pe("DataView");function Gs(e){return e!=null&&qe(e.getInt8)&&zi(e.buffer)}const at=iu?Gs:Hs,yn=Ps||Pe("Array");function Dn(e,n){return e!=null&&Ms.call(e,n)}var Ri=Pe("Arguments");(function(){Ri(arguments)||(Ri=function(e){return Dn(e,"callee")})})();const rr=Ri;function au(e){return!Pi(e)&&js(e)&&!isNaN(parseFloat(e))}function Xi(e){return qi(e)&&zs(e)}function Vi(e){return function(){return e}}function ou(e){return function(n){var t=e(n);return typeof t=="number"&&t>=0&&t<=Xs}}function cu(e){return function(n){return n==null?void 0:n[e]}}const Yt=cu("byteLength"),Zs=ou(Yt);var $s=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;function Ys(e){return ka?ka(e)&&!at(e):Zs(e)&&$s.test(it.call(e))}const Hi=$c?Ys:Vi(!1),Me=cu("length");function Ks(e){for(var n={},t=e.length,r=0;r<t;++r)n[e[r]]=!0;return{contains:function(c){return n[c]===!0},push:function(c){return n[c]=!0,e.push(c)}}}function uu(e,n){n=Ks(n);var t=Wa.length,r=e.constructor,c=qe(r)&&r.prototype||Ni,i="constructor";for(Dn(e,i)&&!n.contains(i)&&n.push(i);t--;)i=Wa[t],i in e&&e[i]!==c[i]&&!n.contains(i)&&n.push(i)}function Oe(e){if(!bn(e))return[];if(Sa)return Sa(e);var n=[];for(var t in e)Dn(e,t)&&n.push(t);return Yc&&uu(e,n),n}function su(e){if(e==null)return!0;var n=Me(e);return typeof n=="number"&&(yn(e)||tr(e)||rr(e))?n===0:Me(Oe(e))===0}function Gi(e,n){var t=Oe(n),r=t.length;if(e==null)return!r;for(var c=Object(e),i=0;i<r;i++){var a=t[i];if(n[a]!==c[a]||!(a in c))return!1}return!0}function Ae(e){if(e instanceof Ae)return e;if(!(this instanceof Ae))return new Ae(e);this._wrapped=e}Ae.VERSION=Ii;Ae.prototype.value=function(){return this._wrapped};Ae.prototype.valueOf=Ae.prototype.toJSON=Ae.prototype.value;Ae.prototype.toString=function(){return String(this._wrapped)};function Ra(e){return new Uint8Array(e.buffer||e,e.byteOffset||0,Yt(e))}var Oa="[object DataView]";function du(e,n){for(var t=[{a:e,b:n}],r=[],c=[];t.length;){var i=t.pop();if(i===!0){r.pop(),c.pop();continue}if(e=i.a,n=i.b,e===n){if(e!==0||1/e===1/n)continue;return!1}if(e==null||n==null)return!1;if(e!==e){if(n!==n)continue;return!1}var a=typeof e;if(a!=="function"&&a!=="object"&&typeof n!="object")return!1;e instanceof Ae&&(e=e._wrapped),n instanceof Ae&&(n=n._wrapped);var o=it.call(e);if(o!==it.call(n))return!1;if(iu&&o=="[object Object]"&&at(e)){if(!at(n))return!1;o=Oa}switch(o){case"[object RegExp]":case"[object String]":if(""+e==""+n)continue;return!1;case"[object Number]":t.push({a:+e,b:+n});continue;case"[object Date]":case"[object Boolean]":if(+e==+n)continue;return!1;case"[object Symbol]":if(Ca.valueOf.call(e)===Ca.valueOf.call(n))continue;return!1;case"[object ArrayBuffer]":case Oa:t.push({a:Ra(e),b:Ra(n)});continue}var u=o==="[object Array]";if(!u&&Hi(e)){var h=Yt(e);if(h!==Yt(n))return!1;if(e.buffer===n.buffer&&e.byteOffset===n.byteOffset)continue;u=!0}if(!u){if(typeof e!="object"||typeof n!="object")return!1;var b=e.constructor,m=n.constructor;if(b!==m&&!(qe(b)&&b instanceof b&&qe(m)&&m instanceof m)&&"constructor"in e&&"constructor"in n)return!1}for(var g=r.length;g--;)if(r[g]===e){if(c[g]===n)break;return!1}if(!(g>=0))if(r.push(e),c.push(n),t.push(!0),u){if(g=e.length,g!==n.length)return!1;for(;g--;)t.push({a:e[g],b:n[g]})}else{var f=Oe(e),y;if(g=f.length,Oe(n).length!==g)return!1;for(;g--;){if(y=f[g],!Dn(n,y))return!1;t.push({a:e[y],b:n[y]})}}}return!0}function jn(e){if(!bn(e))return[];var n=[];for(var t in e)n.push(t);return Yc&&uu(e,n),n}function Zi(e){var n=Me(e);return function(t){if(t==null)return!1;var r=jn(t);if(Me(r))return!1;for(var c=0;c<n;c++)if(!qe(t[e[c]]))return!1;return e!==hu||!qe(t[$i])}}var $i="forEach",lu="has",Yi=["clear","delete"],fu=["get",lu,"set"],Qs=Yi.concat($i,fu),hu=Yi.concat(fu),Js=["add"].concat(Yi,$i,lu);const pu=ji?Zi(Qs):Pe("Map"),gu=ji?Zi(hu):Pe("WeakMap"),mu=ji?Zi(Js):Pe("Set"),bu=Pe("WeakSet");function kn(e){for(var n=Oe(e),t=n.length,r=Array(t),c=0;c<t;c++)r[c]=e[n[c]];return r}function yu(e){for(var n=Oe(e),t=n.length,r=Array(t),c=0;c<t;c++)r[c]=[n[c],e[n[c]]];return r}function Ki(e){for(var n={},t=Oe(e),r=0,c=t.length;r<c;r++)n[e[t[r]]]=t[r];return n}function ot(e){var n=[];for(var t in e)qe(e[t])&&n.push(t);return n.sort()}function Qi(e,n){return function(t){var r=arguments.length;if(n&&(t=Object(t)),r<2||t==null)return t;for(var c=1;c<r;c++)for(var i=arguments[c],a=e(i),o=a.length,u=0;u<o;u++){var h=a[u];(!n||t[h]===void 0)&&(t[h]=i[h])}return t}}const Ji=Qi(jn),Pn=Qi(Oe),ea=Qi(jn,!0);function ed(){return function(){}}function Du(e){if(!bn(e))return{};if(Ba)return Ba(e);var n=ed();n.prototype=e;var t=new n;return n.prototype=null,t}function vu(e,n){var t=Du(e);return n&&Pn(t,n),t}function xu(e){return bn(e)?yn(e)?e.slice():Ji({},e):e}function _u(e,n){return n(e),e}function na(e){return yn(e)?e:[e]}Ae.toPath=na;function lt(e){return Ae.toPath(e)}function ta(e,n){for(var t=n.length,r=0;r<t;r++){if(e==null)return;e=e[n[r]]}return t?e:void 0}function ra(e,n,t){var r=ta(e,lt(n));return Li(r)?t:r}function Uu(e,n){n=lt(n);for(var t=n.length,r=0;r<t;r++){var c=n[r];if(!Dn(e,c))return!1;e=e[c]}return!!t}function ir(e){return e}function Bn(e){return e=Pn({},e),function(n){return Gi(n,e)}}function ar(e){return e=lt(e),function(n){return ta(n,e)}}function ft(e,n,t){if(n===void 0)return e;switch(t??3){case 1:return function(r){return e.call(n,r)};case 3:return function(r,c,i){return e.call(n,r,c,i)};case 4:return function(r,c,i,a){return e.call(n,r,c,i,a)}}return function(){return e.apply(n,arguments)}}function Tu(e,n,t){return e==null?ir:qe(e)?ft(e,n,t):bn(e)&&!yn(e)?Bn(e):ar(e)}function or(e,n){return Tu(e,n,1/0)}Ae.iteratee=or;function je(e,n,t){return Ae.iteratee!==or?Ae.iteratee(e,n):Tu(e,n,t)}function wu(e,n,t){n=je(n,t);for(var r=Oe(e),c=r.length,i={},a=0;a<c;a++){var o=r[a];i[o]=n(e[o],o,e)}return i}function ia(){}function Eu(e){return e==null?ia:function(n){return ra(e,n)}}function Au(e,n,t){var r=Array(Math.max(0,e));n=ft(n,t,1);for(var c=0;c<e;c++)r[c]=n(c);return r}function Kt(e,n){return n==null&&(n=e,e=0),e+Math.floor(Math.random()*(n-e+1))}const zn=Date.now||function(){return new Date().getTime()};function Fu(e){var n=function(i){return e[i]},t="(?:"+Oe(e).join("|")+")",r=RegExp(t),c=RegExp(t,"g");return function(i){return i=i==null?"":""+i,r.test(i)?i.replace(c,n):i}}const Cu={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},Su=Fu(Cu),nd=Ki(Cu),Bu=Fu(nd),ku=Ae.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var Fr=/(.)^/,td={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},rd=/\\|'|\r|\n|\u2028|\u2029/g;function id(e){return"\\"+td[e]}var ad=/^\s*(\w|\$)+\s*$/;function Wu(e,n,t){!n&&t&&(n=t),n=ea({},n,Ae.templateSettings);var r=RegExp([(n.escape||Fr).source,(n.interpolate||Fr).source,(n.evaluate||Fr).source].join("|")+"|$","g"),c=0,i="__p+='";e.replace(r,function(h,b,m,g,f){return i+=e.slice(c,f).replace(rd,id),c=f+h.length,b?i+=`'+
|
|
2
2
|
((__t=(`+b+`))==null?'':_.escape(__t))+
|
|
3
3
|
'`:m?i+=`'+
|
|
4
4
|
((__t=(`+m+`))==null?'':__t)+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600&family=Space+Mono:wght@400;700&display=swap";@font-face{font-family:Roobert;src:url(/fonts/Roobert-Regular.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Roobert;src:url(/fonts/Roobert-Medium.woff2) format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Roobert;src:url(/fonts/Roobert-SemiBold.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
|
2
|
+
Theme: GitHub
|
|
3
|
+
Description: Light theme as seen on github.com
|
|
4
|
+
Author: github.com
|
|
5
|
+
Maintainer: @Hirse
|
|
6
|
+
Updated: 2021-05-15
|
|
7
|
+
|
|
8
|
+
Outdated base version: https://github.com/primer/github-syntax-light
|
|
9
|
+
Current colors taken from GitHub's CSS
|
|
10
|
+
*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--dx-font-mono);font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--dx-surface-canvas: #faf9f7;--dx-surface-card: #ffffff;--dx-text-primary: #000000;--dx-text-secondary: #9f9b93;--dx-text-tertiary: #55534e;--dx-text-inverse: #ffffff;--dx-border-primary: #dad4c8;--dx-border-secondary: #eee9df;--dx-border-cool: #e6e8ec;--dx-border-dark: #525a69;--dx-phase-onboarding: #fbbd41;--dx-phase-discover: #3bd3fd;--dx-phase-ideate: #c1b0ff;--dx-phase-design: #84e7a5;--dx-phase-plan: #01418d;--dx-phase-deliver: #fc7981;--dx-phase-measure: #43089f;--dx-matcha-300: #84e7a5;--dx-matcha-600: #078a52;--dx-matcha-800: #02492a;--dx-slushie-500: #3bd3fd;--dx-slushie-800: #0089ad;--dx-lemon-400: #f8cc65;--dx-lemon-500: #fbbd41;--dx-lemon-700: #d08a11;--dx-lemon-800: #9d6a09;--dx-ube-300: #c1b0ff;--dx-ube-800: #43089f;--dx-ube-900: #32037d;--dx-pomegranate-400: #fc7981;--dx-blueberry-800: #01418d;--dx-status-success: #078a52;--dx-status-warning: #d08a11;--dx-status-error: #fc7981;--dx-status-info: #3bd3fd;--dx-shadow-clay: 0px 1px 1px rgba(0, 0, 0, .1), 0px -1px 1px rgba(0, 0, 0, .04) inset, 0px -.5px 1px rgba(0, 0, 0, .05);--dx-shadow-hover: -7px 7px 0px rgb(0, 0, 0);--dx-shadow-hover-lemon: -7px 7px 0px #fbbd41;--dx-shadow-hover-subtle: -3px 3px 0px rgb(0, 0, 0);--dx-radius-sharp: 4px;--dx-radius-standard: 8px;--dx-radius-card: 12px;--dx-radius-feature: 24px;--dx-radius-section: 40px;--dx-radius-pill: 1584px;--dx-font-primary: "Roobert", "Figtree", Arial, sans-serif;--dx-font-mono: "Space Mono", monospace;--dx-font-features-display: "ss01", "ss03", "ss10", "ss11", "ss12";--dx-font-features-body: "ss03", "ss10", "ss11", "ss12";--dx-focus-ring: 2px solid rgb(20, 110, 245)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--dx-font-primary);font-feature-settings:var(--dx-font-features-body);background-color:var(--dx-surface-canvas);color:var(--dx-text-primary);line-height:1.5;letter-spacing:-.16px;min-height:100dvh}::-moz-selection{background-color:var(--dx-ube-300);color:var(--dx-text-primary)}::selection{background-color:var(--dx-ube-300);color:var(--dx-text-primary)}:focus-visible{outline:var(--dx-focus-ring);outline-offset:2px}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-16{bottom:4rem}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-1\.5{right:.375rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mt-0\.5{margin-top:-.125rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[80vh\]{height:80vh}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-\[160px\]{max-height:160px}.max-h-\[256px\]{max-height:256px}.max-h-\[600px\]{max-height:600px}.min-h-\[24px\]{min-height:24px}.min-h-\[56vh\]{min-height:56vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[260px\]{width:260px}.w-\[380px\]{width:380px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[18px\]{min-width:18px}.min-w-\[240px\]{min-width:240px}.min-w-full{min-width:100%}.max-w-5xl{max-width:64rem}.max-w-\[220px\]{max-width:220px}.max-w-\[640px\]{max-width:640px}.max-w-\[720px\]{max-width:720px}.max-w-\[75\%\]{max-width:75%}.max-w-\[80\%\]{max-width:80%}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border>:not([hidden])~:not([hidden]){border-color:var(--dx-border-primary)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-card{border-radius:var(--dx-radius-card)}.rounded-feature{border-radius:var(--dx-radius-feature)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-pill{border-radius:var(--dx-radius-pill)}.rounded-sharp{border-radius:var(--dx-radius-sharp)}.rounded-standard{border-radius:var(--dx-radius-standard)}.rounded-b-card{border-bottom-right-radius:var(--dx-radius-card);border-bottom-left-radius:var(--dx-radius-card)}.rounded-t-card{border-top-left-radius:var(--dx-radius-card);border-top-right-radius:var(--dx-radius-card)}.rounded-br-sharp{border-bottom-right-radius:var(--dx-radius-sharp)}.rounded-tr-card{border-top-right-radius:var(--dx-radius-card)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-border{border-color:var(--dx-border-primary)}.border-border-secondary{border-color:var(--dx-border-secondary)}.border-emerald-300{--tw-border-opacity: 1;border-color:rgb(110 231 183 / var(--tw-border-opacity, 1))}.border-lemon-500{border-color:var(--dx-lemon-500)}.border-matcha-300{border-color:var(--dx-matcha-300)}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-text-primary{border-color:var(--dx-text-primary)}.border-text-secondary{border-color:var(--dx-text-secondary)}.border-text-tertiary{border-color:var(--dx-text-tertiary)}.border-transparent{border-color:transparent}.border-ube-300{border-color:var(--dx-ube-300)}.bg-\[rgba\(0\,0\,0\,0\.35\)\]{background-color:#00000059}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blueberry-800{background-color:var(--dx-blueberry-800)}.bg-border{background-color:var(--dx-border-primary)}.bg-border-secondary{background-color:var(--dx-border-secondary)}.bg-canvas{background-color:var(--dx-surface-canvas)}.bg-card{background-color:var(--dx-surface-card)}.bg-cyan-50{--tw-bg-opacity: 1;background-color:rgb(236 254 255 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-lemon-400{background-color:var(--dx-lemon-400)}.bg-lemon-500{background-color:var(--dx-lemon-500)}.bg-lemon-800{background-color:var(--dx-lemon-800)}.bg-matcha-300{background-color:var(--dx-matcha-300)}.bg-pomegranate-400{background-color:var(--dx-pomegranate-400)}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-slushie-500{background-color:var(--dx-slushie-500)}.bg-text-primary{background-color:var(--dx-text-primary)}.bg-transparent{background-color:transparent}.bg-ube-300{background-color:var(--dx-ube-300)}.bg-ube-800{background-color:var(--dx-ube-800)}.bg-white\/50{background-color:#ffffff80}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-3{padding-bottom:.75rem}.pb-32{padding-bottom:8rem}.pb-36{padding-bottom:9rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pr-8{padding-right:2rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:var(--dx-font-mono)}.font-primary{font-family:var(--dx-font-primary)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.82em\]{font-size:.82em}.text-\[0\.8em\]{font-size:.8em}.text-\[0\.9rem\]{font-size:.9rem}.text-base{font-size:1rem;line-height:1.5rem}.text-body{font-size:1.125rem;line-height:1.6;letter-spacing:-.36px;font-weight:400}.text-body-large{font-size:1.25rem;line-height:1.4;letter-spacing:normal;font-weight:400}.text-body-medium{font-size:1rem;line-height:1.4;letter-spacing:-.16px;font-weight:500}.text-body-standard{font-size:1rem;line-height:1.5;letter-spacing:normal;font-weight:400}.text-button{font-size:1rem;line-height:1.5;letter-spacing:-.16px;font-weight:500}.text-button-large{font-size:1.5rem;line-height:1.5;letter-spacing:normal;font-weight:400}.text-button-small{font-size:.8rem;line-height:1.5;letter-spacing:-.128px;font-weight:500}.text-caption{font-size:.875rem;line-height:1.5;letter-spacing:-.14px;font-weight:400}.text-card-heading{font-size:2rem;line-height:1.1;letter-spacing:-.64px;font-weight:600}.text-feature-title{font-size:1.25rem;line-height:1.4;letter-spacing:-.4px;font-weight:600}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-section-heading{font-size:2.75rem;line-height:1.1;letter-spacing:-1.32px;font-weight:600}.text-sm{font-size:.875rem;line-height:1.25rem}.text-small{font-size:.75rem;line-height:1.5;letter-spacing:normal;font-weight:400}.text-sub-heading{font-size:1.25rem;line-height:1.5;letter-spacing:-.16px;font-weight:500}.text-uppercase-label{font-size:.75rem;line-height:1.2;letter-spacing:1.08px;font-weight:600}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-canvas{color:var(--dx-surface-canvas)}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-lemon-400{color:var(--dx-lemon-400)}.text-lemon-500{color:var(--dx-lemon-500)}.text-lemon-700{color:var(--dx-lemon-700)}.text-lemon-800{color:var(--dx-lemon-800)}.text-matcha-600{color:var(--dx-matcha-600)}.text-matcha-800{color:var(--dx-matcha-800)}.text-pomegranate-400{color:var(--dx-pomegranate-400)}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-status-success{color:var(--dx-status-success)}.text-text-inverse{color:var(--dx-text-inverse)}.text-text-primary{color:var(--dx-text-primary)}.text-text-secondary{color:var(--dx-text-secondary)}.text-text-tertiary{color:var(--dx-text-tertiary)}.text-ube-800{color:var(--dx-ube-800)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-clay{--tw-shadow: var(--dx-shadow-clay);--tw-shadow-colored: var(--dx-shadow-clay);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-hover-subtle{--tw-shadow: var(--dx-shadow-hover-subtle);--tw-shadow-colored: var(--dx-shadow-hover-subtle);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.font-features-display{font-feature-settings:"ss01","ss03","ss10","ss11","ss12"}.\[a-z\:_-\]{a-z:-}.hljs{background:var(--dx-surface-canvas);padding:0}@keyframes artifact-spotlight{0%{box-shadow:0 0 0 2px var(--spotlight-color)}60%{box-shadow:0 0 0 2px var(--spotlight-color)}to{box-shadow:none}}.artifact-spotlight{animation:artifact-spotlight 1.6s ease-out forwards}.placeholder\:text-text-secondary::-moz-placeholder{color:var(--dx-text-secondary)}.placeholder\:text-text-secondary::placeholder{color:var(--dx-text-secondary)}.first\:pt-3:first-child{padding-top:.75rem}.last\:border-r-0:last-child{border-right-width:0px}.focus-within\:border-text-primary:focus-within{border-color:var(--dx-text-primary)}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-1:hover{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-rotate-6:hover{--tw-rotate: -6deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-border:hover{border-color:var(--dx-border-primary)}.hover\:border-text-primary:hover{border-color:var(--dx-text-primary)}.hover\:border-text-tertiary:hover{border-color:var(--dx-text-tertiary)}.hover\:bg-\[rgba\(0\,0\,0\,0\.04\)\]:hover{background-color:#0000000a}.hover\:bg-border-secondary:hover{background-color:var(--dx-border-secondary)}.hover\:bg-lemon-400:hover{background-color:var(--dx-lemon-400)}.hover\:bg-text-secondary:hover{background-color:var(--dx-text-secondary)}.hover\:bg-white\/80:hover{background-color:#fffc}.hover\:text-pomegranate-400:hover{color:var(--dx-pomegranate-400)}.hover\:text-text-primary:hover{color:var(--dx-text-primary)}.hover\:text-text-secondary:hover{color:var(--dx-text-secondary)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-clay:hover{--tw-shadow: var(--dx-shadow-clay);--tw-shadow-colored: var(--dx-shadow-clay);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-hover-hard:hover{--tw-shadow: var(--dx-shadow-hover);--tw-shadow-colored: var(--dx-shadow-hover);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-hover-subtle:hover{--tw-shadow: var(--dx-shadow-hover-subtle);--tw-shadow-colored: var(--dx-shadow-hover-subtle);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-text-primary:focus{border-color:var(--dx-text-primary)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-lemon-500:focus-visible{--tw-ring-color: var(--dx-lemon-500)}.focus-visible\:ring-text-inverse:focus-visible{--tw-ring-color: var(--dx-text-inverse)}.focus-visible\:ring-text-primary:focus-visible{--tw-ring-color: var(--dx-text-primary)}.focus-visible\:ring-ube-300:focus-visible{--tw-ring-color: var(--dx-ube-300)}.enabled\:hover\:-translate-y-1:hover:enabled{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:enabled\:-translate-y-1:enabled:hover{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.enabled\:hover\:-rotate-6:hover:enabled{--tw-rotate: -6deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:enabled\:-rotate-6:enabled:hover{--tw-rotate: -6deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.enabled\:hover\:shadow-hover-hard:hover:enabled{--tw-shadow: var(--dx-shadow-hover);--tw-shadow-colored: var(--dx-shadow-hover);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:enabled\:shadow-hover-hard:enabled:hover{--tw-shadow: var(--dx-shadow-hover);--tw-shadow-colored: var(--dx-shadow-hover);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:enabled\:shadow-hover-lemon:enabled:hover{--tw-shadow: var(--dx-shadow-hover-lemon);--tw-shadow-colored: var(--dx-shadow-hover-lemon);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:bg-text-primary{background-color:var(--dx-text-primary)}.group:hover .group-hover\:text-canvas{color:var(--dx-surface-canvas)}.group:hover .group-hover\:text-text-primary{color:var(--dx-text-primary)}.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
package/dist/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>DesignX</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-B4DsP2aY.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CQNunw04.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/package.json
CHANGED
package/server.cjs
CHANGED
|
@@ -46216,7 +46216,7 @@ var __dirname = import_node_path.default.dirname(__filename);
|
|
|
46216
46216
|
var app = (0, import_express.default)();
|
|
46217
46217
|
var IS_PROD = process.env.NODE_ENV === "production";
|
|
46218
46218
|
var PORT = parseInt(process.env.PORT ?? "3001", 10);
|
|
46219
|
-
var DESIGNX_DATA_DIR = process.env.DESIGNX_DATA_DIR ?? import_node_path.default.join((0, import_node_os.homedir)(), "
|
|
46219
|
+
var DESIGNX_DATA_DIR = process.env.DESIGNX_DATA_DIR ?? import_node_path.default.join((0, import_node_os.homedir)(), "DesignX");
|
|
46220
46220
|
var DIST_DIR = import_node_path.default.join(__dirname, IS_PROD ? "dist" : "../dist");
|
|
46221
46221
|
var COPILOT_API_URL = "https://api.githubcopilot.com";
|
|
46222
46222
|
var AUTO_PINNED_MODEL = "claude-sonnet-4.6";
|
|
@@ -47727,6 +47727,276 @@ app.get("/api/data/projects/:slug/export", (req, res) => {
|
|
|
47727
47727
|
res.status(500).json({ error: String(err) });
|
|
47728
47728
|
}
|
|
47729
47729
|
});
|
|
47730
|
+
var AUTH_FILE = import_node_path.default.join(DESIGNX_DATA_DIR, "auth.json");
|
|
47731
|
+
app.get("/api/auth", (_req, res) => {
|
|
47732
|
+
try {
|
|
47733
|
+
if (!import_node_fs.default.existsSync(AUTH_FILE)) {
|
|
47734
|
+
res.json({});
|
|
47735
|
+
return;
|
|
47736
|
+
}
|
|
47737
|
+
res.json(readJson(AUTH_FILE, {}));
|
|
47738
|
+
} catch {
|
|
47739
|
+
res.json({});
|
|
47740
|
+
}
|
|
47741
|
+
});
|
|
47742
|
+
app.put("/api/auth", (req, res) => {
|
|
47743
|
+
try {
|
|
47744
|
+
writeJson(AUTH_FILE, req.body);
|
|
47745
|
+
try {
|
|
47746
|
+
import_node_fs.default.chmodSync(AUTH_FILE, 384);
|
|
47747
|
+
} catch {
|
|
47748
|
+
}
|
|
47749
|
+
res.json({ ok: true });
|
|
47750
|
+
} catch (err) {
|
|
47751
|
+
res.status(500).json({ error: String(err) });
|
|
47752
|
+
}
|
|
47753
|
+
});
|
|
47754
|
+
app.delete("/api/auth", (_req, res) => {
|
|
47755
|
+
try {
|
|
47756
|
+
if (import_node_fs.default.existsSync(AUTH_FILE)) import_node_fs.default.unlinkSync(AUTH_FILE);
|
|
47757
|
+
res.json({ ok: true });
|
|
47758
|
+
} catch (err) {
|
|
47759
|
+
res.status(500).json({ error: String(err) });
|
|
47760
|
+
}
|
|
47761
|
+
});
|
|
47762
|
+
var TOKEN_STATS_FILE = import_node_path.default.join(KB_JOBS_DIR, "token-stats.json");
|
|
47763
|
+
app.get("/api/data/token-stats", (_req, res) => {
|
|
47764
|
+
try {
|
|
47765
|
+
if (!import_node_fs.default.existsSync(TOKEN_STATS_FILE)) {
|
|
47766
|
+
res.json(null);
|
|
47767
|
+
return;
|
|
47768
|
+
}
|
|
47769
|
+
res.json(readJson(TOKEN_STATS_FILE, null));
|
|
47770
|
+
} catch {
|
|
47771
|
+
res.json(null);
|
|
47772
|
+
}
|
|
47773
|
+
});
|
|
47774
|
+
app.put("/api/data/token-stats", (req, res) => {
|
|
47775
|
+
try {
|
|
47776
|
+
writeJson(TOKEN_STATS_FILE, req.body);
|
|
47777
|
+
res.json({ ok: true });
|
|
47778
|
+
} catch (err) {
|
|
47779
|
+
res.status(500).json({ error: String(err) });
|
|
47780
|
+
}
|
|
47781
|
+
});
|
|
47782
|
+
app.get("/api/kb/:slug/context", (req, res) => {
|
|
47783
|
+
const { slug } = req.params;
|
|
47784
|
+
if (!safeSlug(slug)) {
|
|
47785
|
+
res.status(400).json({ error: "Invalid slug" });
|
|
47786
|
+
return;
|
|
47787
|
+
}
|
|
47788
|
+
try {
|
|
47789
|
+
const uploadDir = import_node_path.default.join(projectDir(slug), "uploads");
|
|
47790
|
+
if (!import_node_fs.default.existsSync(uploadDir)) {
|
|
47791
|
+
res.json({ entries: [], totalChars: 0 });
|
|
47792
|
+
return;
|
|
47793
|
+
}
|
|
47794
|
+
const TEXT_EXTS = /* @__PURE__ */ new Set([
|
|
47795
|
+
".txt",
|
|
47796
|
+
".md",
|
|
47797
|
+
".mdx",
|
|
47798
|
+
".json",
|
|
47799
|
+
".yaml",
|
|
47800
|
+
".yml",
|
|
47801
|
+
".csv",
|
|
47802
|
+
".html",
|
|
47803
|
+
".htm",
|
|
47804
|
+
".xml",
|
|
47805
|
+
".js",
|
|
47806
|
+
".ts",
|
|
47807
|
+
".jsx",
|
|
47808
|
+
".tsx",
|
|
47809
|
+
".py",
|
|
47810
|
+
".java",
|
|
47811
|
+
".cs",
|
|
47812
|
+
".go",
|
|
47813
|
+
".rs",
|
|
47814
|
+
".rb",
|
|
47815
|
+
".php",
|
|
47816
|
+
".sh",
|
|
47817
|
+
".bash",
|
|
47818
|
+
".zsh",
|
|
47819
|
+
".env",
|
|
47820
|
+
".conf",
|
|
47821
|
+
".ini",
|
|
47822
|
+
".toml"
|
|
47823
|
+
]);
|
|
47824
|
+
const PER_FILE_CAP = 8e4;
|
|
47825
|
+
const TOTAL_CAP = 2e5;
|
|
47826
|
+
let totalChars = 0;
|
|
47827
|
+
const entries = [];
|
|
47828
|
+
for (const name of import_node_fs.default.readdirSync(uploadDir)) {
|
|
47829
|
+
if (totalChars >= TOTAL_CAP) break;
|
|
47830
|
+
const filePath = import_node_path.default.join(uploadDir, name);
|
|
47831
|
+
if (import_node_fs.default.statSync(filePath).isDirectory()) continue;
|
|
47832
|
+
const ext = import_node_path.default.extname(name).toLowerCase();
|
|
47833
|
+
if (ext && !TEXT_EXTS.has(ext)) continue;
|
|
47834
|
+
try {
|
|
47835
|
+
const raw = import_node_fs.default.readFileSync(filePath, "utf8");
|
|
47836
|
+
const limit = Math.min(PER_FILE_CAP, TOTAL_CAP - totalChars);
|
|
47837
|
+
const truncated = raw.length > limit;
|
|
47838
|
+
const content = truncated ? raw.slice(0, limit) : raw;
|
|
47839
|
+
entries.push({ name, content, truncated });
|
|
47840
|
+
totalChars += content.length;
|
|
47841
|
+
} catch {
|
|
47842
|
+
}
|
|
47843
|
+
}
|
|
47844
|
+
res.json({ entries, totalChars });
|
|
47845
|
+
} catch (err) {
|
|
47846
|
+
res.status(500).json({ error: String(err) });
|
|
47847
|
+
}
|
|
47848
|
+
});
|
|
47849
|
+
app.post("/api/byok/chat", async (req, res) => {
|
|
47850
|
+
const provider = req.headers["x-byok-provider"];
|
|
47851
|
+
const apiKey = req.headers["x-byok-key"];
|
|
47852
|
+
if (typeof provider !== "string" || typeof apiKey !== "string" || !provider || !apiKey) {
|
|
47853
|
+
res.status(400).json({ error: "x-byok-provider and x-byok-key headers required." });
|
|
47854
|
+
return;
|
|
47855
|
+
}
|
|
47856
|
+
if (provider !== "openai" && provider !== "anthropic") {
|
|
47857
|
+
res.status(400).json({ error: 'x-byok-provider must be "openai" or "anthropic".' });
|
|
47858
|
+
return;
|
|
47859
|
+
}
|
|
47860
|
+
const body = req.body;
|
|
47861
|
+
try {
|
|
47862
|
+
if (provider === "openai") {
|
|
47863
|
+
const upstream2 = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
47864
|
+
method: "POST",
|
|
47865
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` },
|
|
47866
|
+
body: JSON.stringify(body),
|
|
47867
|
+
signal: AbortSignal.timeout(12e4)
|
|
47868
|
+
});
|
|
47869
|
+
res.status(upstream2.status);
|
|
47870
|
+
const ct = upstream2.headers.get("content-type");
|
|
47871
|
+
if (ct) res.setHeader("Content-Type", ct);
|
|
47872
|
+
if (!upstream2.body) {
|
|
47873
|
+
res.end();
|
|
47874
|
+
return;
|
|
47875
|
+
}
|
|
47876
|
+
const reader2 = upstream2.body.getReader();
|
|
47877
|
+
while (true) {
|
|
47878
|
+
const { done, value } = await reader2.read();
|
|
47879
|
+
if (done) {
|
|
47880
|
+
res.end();
|
|
47881
|
+
break;
|
|
47882
|
+
}
|
|
47883
|
+
res.write(Buffer.from(value));
|
|
47884
|
+
}
|
|
47885
|
+
return;
|
|
47886
|
+
}
|
|
47887
|
+
const inMessages = body.messages ?? [];
|
|
47888
|
+
const sysMsg = inMessages.find((m) => m.role === "system");
|
|
47889
|
+
const chatMsgs = inMessages.filter((m) => m.role !== "system");
|
|
47890
|
+
const anthropicBody = {
|
|
47891
|
+
model: body.model ?? "claude-3-5-sonnet-20241022",
|
|
47892
|
+
messages: chatMsgs,
|
|
47893
|
+
max_tokens: body.max_tokens ?? 4096,
|
|
47894
|
+
stream: true
|
|
47895
|
+
};
|
|
47896
|
+
if (sysMsg) anthropicBody.system = sysMsg.content;
|
|
47897
|
+
const upstream = await fetch("https://api.anthropic.com/v1/messages", {
|
|
47898
|
+
method: "POST",
|
|
47899
|
+
headers: {
|
|
47900
|
+
"Content-Type": "application/json",
|
|
47901
|
+
"x-api-key": apiKey,
|
|
47902
|
+
"anthropic-version": "2023-06-01"
|
|
47903
|
+
},
|
|
47904
|
+
body: JSON.stringify(anthropicBody)
|
|
47905
|
+
});
|
|
47906
|
+
if (!upstream.ok) {
|
|
47907
|
+
const errText = await upstream.text().catch(() => "");
|
|
47908
|
+
res.status(upstream.status).json({ error: errText.slice(0, 500) });
|
|
47909
|
+
return;
|
|
47910
|
+
}
|
|
47911
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
47912
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
47913
|
+
res.setHeader("Connection", "keep-alive");
|
|
47914
|
+
if (!upstream.body) {
|
|
47915
|
+
res.end();
|
|
47916
|
+
return;
|
|
47917
|
+
}
|
|
47918
|
+
const reader = upstream.body.getReader();
|
|
47919
|
+
const decoder = new TextDecoder();
|
|
47920
|
+
let sseBuffer = "";
|
|
47921
|
+
const msgId = (0, import_node_crypto.randomUUID)();
|
|
47922
|
+
const modelId = String(body.model ?? "anthropic");
|
|
47923
|
+
while (true) {
|
|
47924
|
+
const { done, value } = await reader.read();
|
|
47925
|
+
if (done) {
|
|
47926
|
+
res.write("data: [DONE]\n\n");
|
|
47927
|
+
res.end();
|
|
47928
|
+
break;
|
|
47929
|
+
}
|
|
47930
|
+
sseBuffer += decoder.decode(value, { stream: true });
|
|
47931
|
+
const lines = sseBuffer.split("\n");
|
|
47932
|
+
sseBuffer = lines.pop() ?? "";
|
|
47933
|
+
for (const line of lines) {
|
|
47934
|
+
if (!line.startsWith("data: ")) continue;
|
|
47935
|
+
const raw = line.slice(6).trim();
|
|
47936
|
+
if (raw === "" || raw === "[DONE]") continue;
|
|
47937
|
+
try {
|
|
47938
|
+
const evt = JSON.parse(raw);
|
|
47939
|
+
if (evt.type === "content_block_delta" && evt.delta?.type === "text_delta" && evt.delta.text) {
|
|
47940
|
+
res.write(`data: ${JSON.stringify({ id: msgId, object: "chat.completion.chunk", model: modelId, choices: [{ index: 0, delta: { content: evt.delta.text }, finish_reason: null }] })}
|
|
47941
|
+
|
|
47942
|
+
`);
|
|
47943
|
+
} else if (evt.type === "message_delta" && evt.usage) {
|
|
47944
|
+
const outTok = evt.usage.output_tokens ?? 0;
|
|
47945
|
+
res.write(`data: ${JSON.stringify({ id: msgId, object: "chat.completion.chunk", model: modelId, choices: [{ index: 0, delta: {}, finish_reason: "stop" }], usage: { prompt_tokens: 0, completion_tokens: outTok, total_tokens: outTok } })}
|
|
47946
|
+
|
|
47947
|
+
`);
|
|
47948
|
+
}
|
|
47949
|
+
} catch {
|
|
47950
|
+
}
|
|
47951
|
+
}
|
|
47952
|
+
}
|
|
47953
|
+
} catch (err) {
|
|
47954
|
+
if (!res.headersSent) {
|
|
47955
|
+
res.status(502).json({ error: err instanceof Error ? err.message : "BYOK request failed." });
|
|
47956
|
+
}
|
|
47957
|
+
}
|
|
47958
|
+
});
|
|
47959
|
+
app.post("/api/byok/test", async (req, res) => {
|
|
47960
|
+
const provider = req.headers["x-byok-provider"];
|
|
47961
|
+
const apiKey = req.headers["x-byok-key"];
|
|
47962
|
+
if (typeof provider !== "string" || typeof apiKey !== "string" || !provider || !apiKey) {
|
|
47963
|
+
res.status(400).json({ ok: false, error: "x-byok-provider and x-byok-key headers required." });
|
|
47964
|
+
return;
|
|
47965
|
+
}
|
|
47966
|
+
try {
|
|
47967
|
+
if (provider === "openai") {
|
|
47968
|
+
const r = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
47969
|
+
method: "POST",
|
|
47970
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` },
|
|
47971
|
+
body: JSON.stringify({ model: "gpt-4o-mini", messages: [{ role: "user", content: "Hi" }], max_tokens: 1, stream: false }),
|
|
47972
|
+
signal: AbortSignal.timeout(1e4)
|
|
47973
|
+
});
|
|
47974
|
+
if (r.ok) {
|
|
47975
|
+
res.json({ ok: true });
|
|
47976
|
+
return;
|
|
47977
|
+
}
|
|
47978
|
+
const t = await r.text().catch(() => "");
|
|
47979
|
+
res.json({ ok: false, error: `OpenAI ${r.status}: ${t.slice(0, 200)}` });
|
|
47980
|
+
} else if (provider === "anthropic") {
|
|
47981
|
+
const r = await fetch("https://api.anthropic.com/v1/messages", {
|
|
47982
|
+
method: "POST",
|
|
47983
|
+
headers: { "Content-Type": "application/json", "x-api-key": apiKey, "anthropic-version": "2023-06-01" },
|
|
47984
|
+
body: JSON.stringify({ model: "claude-3-5-haiku-20241022", messages: [{ role: "user", content: "Hi" }], max_tokens: 1, stream: false }),
|
|
47985
|
+
signal: AbortSignal.timeout(1e4)
|
|
47986
|
+
});
|
|
47987
|
+
if (r.ok) {
|
|
47988
|
+
res.json({ ok: true });
|
|
47989
|
+
return;
|
|
47990
|
+
}
|
|
47991
|
+
const t = await r.text().catch(() => "");
|
|
47992
|
+
res.json({ ok: false, error: `Anthropic ${r.status}: ${t.slice(0, 200)}` });
|
|
47993
|
+
} else {
|
|
47994
|
+
res.status(400).json({ ok: false, error: "Unknown provider." });
|
|
47995
|
+
}
|
|
47996
|
+
} catch (err) {
|
|
47997
|
+
res.json({ ok: false, error: err instanceof Error ? err.message : "Test failed." });
|
|
47998
|
+
}
|
|
47999
|
+
});
|
|
47730
48000
|
if (IS_PROD) {
|
|
47731
48001
|
app.use(import_express.default.static(DIST_DIR));
|
|
47732
48002
|
app.use((_req, res) => {
|