diff --git a/package.json b/package.json index 8007fb6b..84573eb0 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@jridgewell/sourcemap-codec": "catalog:resolutions", "@nuxt/devtools": "catalog:devtools", "@nuxt/kit": "catalog:build", + "@nuxt/vite-builder": "catalog:build", "@rolldown/debug": "catalog:deps", "chokidar": "catalog:resolutions", "esbuild": "catalog:build", diff --git a/packages/core/package.json b/packages/core/package.json index ec67812e..f8effd4f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -70,6 +70,7 @@ "ws": "catalog:deps" }, "devDependencies": { + "@clack/prompts": "catalog:inlined", "@vitejs/devtools": "workspace:*", "@vitejs/devtools-vite": "workspace:*", "@vitejs/plugin-vue": "catalog:build", diff --git a/packages/core/src/client/inject/index.ts b/packages/core/src/client/inject/index.ts index fcda02ef..61977014 100644 --- a/packages/core/src/client/inject/index.ts +++ b/packages/core/src/client/inject/index.ts @@ -10,15 +10,7 @@ export async function init(): Promise { // eslint-disable-next-line no-console console.log('[VITE DEVTOOLS] Client injected') - const rpcReturn = await getDevToolsRpcClient() - const { rpc } = rpcReturn - - // eslint-disable-next-line no-console - console.log('[VITE DEVTOOLS] RPC', rpc) - - const rpcFunctions = await rpc.$call('vite:internal:rpc:server:list') - // eslint-disable-next-line no-console - console.log('[VITE DEVTOOLS] RPC Functions', rpcFunctions) + const rpc = await getDevToolsRpcClient() const state = useLocalStorage( 'vite-devtools-dock-state', @@ -36,7 +28,7 @@ export async function init(): Promise { const context = await createDocksContext( 'embedded', - rpcReturn, + rpc, state, ) diff --git a/packages/core/src/client/standalone/App.vue b/packages/core/src/client/standalone/App.vue index 2896695f..e8c69dd8 100644 --- a/packages/core/src/client/standalone/App.vue +++ b/packages/core/src/client/standalone/App.vue @@ -8,8 +8,7 @@ import ViewEntry from '../webcomponents/components/ViewEntry.vue' import { createDocksContext } from '../webcomponents/state/context' import { PersistedDomViewsManager } from '../webcomponents/utils/PersistedDomViewsManager' -const rpcReturn = await getDevToolsRpcClient() -const { rpc } = rpcReturn +const rpc = await getDevToolsRpcClient() // eslint-disable-next-line no-console console.log('[VITE DEVTOOLS] RPC', rpc) @@ -19,7 +18,7 @@ const persistedDoms = markRaw(new PersistedDomViewsManager(viewsContainer)) const context: DocksContext = await createDocksContext( 'standalone', - rpcReturn, + rpc, ) context.docks.selectedId ||= context.docks.entries[0]?.id ?? null diff --git a/packages/core/src/client/webcomponents/.generated/css.ts b/packages/core/src/client/webcomponents/.generated/css.ts index 025263e9..5bd6b465 100644 --- a/packages/core/src/client/webcomponents/.generated/css.ts +++ b/packages/core/src/client/webcomponents/.generated/css.ts @@ -1,3 +1,3 @@ /* eslint-disable eslint-comments/no-unlimited-disable */ /* eslint-disable */ -export default "*{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:after{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:before{--un-content:\"\"}:after{--un-content:\"\"}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){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-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button{-webkit-appearance:button;background-color:transparent;background-image:none}[type=button]{-webkit-appearance:button;background-color:transparent;background-image:none}[type=reset]{-webkit-appearance:button;background-color:transparent;background-image:none}[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{height:auto}::-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{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::placeholder{opacity:1;color:#9ca3af}textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.xterm{cursor:text;user-select:none;position:relative}.xterm.focus{outline:none}.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-message{z-index:10;color:transparent;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility:not(.debug){z-index:10;color:transparent;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:transparent}.xterm .xterm-accessibility-tree{user-select:text;white-space:pre}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:underline double}.xterm-underline-3{text-decoration:underline wavy}.xterm-underline-4{text-decoration:underline dotted}.xterm-underline-5{text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}:root{--un-text-opacity:100%}#vite-devtools-anchor{z-index:2147483644;box-sizing:border-box;transform-origin:50%;width:0;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:15px;position:fixed;transform:translate(-50%,-50%)rotate(0)}#vite-devtools-anchor #vite-devtools-dock-container{width:max-content;min-width:100px;height:40px;display:flex;position:absolute;top:0;left:0;transform:translate(-50%,-50%)}#vite-devtools-anchor.vite-devtools-vertical #vite-devtools-dock-container{transition-property:all;transition-duration:.5s;transition-timing-function:cubic-bezier(.4,0,.2,1);transform:translate(-50%,-50%)rotate(90deg)}#vite-devtools-anchor #vite-devtools-dock{touch-action:none;user-select:none;--vdt-backdrop-blur:blur(5px);height:40px;backdrop-filter:var(--vdt-backdrop-blur)var(--vdt-backdrop-brightness)var(--vdt-backdrop-contrast)var(--vdt-backdrop-grayscale)var(--vdt-backdrop-hue-rotate)var(--vdt-backdrop-invert)var(--vdt-backdrop-opacity)var(--vdt-backdrop-saturate)var(--vdt-backdrop-sepia);--vdt-text-opacity:1;color:rgba(255,255,255,var(--vdt-text-opacity));--vdt-shadow:var(--vdt-shadow-inset)0 1px 3px 0 var(--vdt-shadow-color,rgba(0,0,0,.1)),var(--vdt-shadow-inset)0 1px 2px -1px var(--vdt-shadow-color,rgba(0,0,0,.1));box-shadow:var(--vdt-ring-offset-shadow),var(--vdt-ring-shadow),var(--vdt-shadow);width:calc-size(max-content,size);background-color:rgba(255,255,255,.5);-webkit-border-radius:9999px;border-radius:9999px;margin:auto;padding-left:1rem;padding-right:1rem;transition-property:all;transition-duration:.5s;transition-timing-function:cubic-bezier(.4,0,.2,1)}@media (prefers-color-scheme:dark){#vite-devtools-anchor #vite-devtools-dock{background-color:rgba(17,17,17,.5)}}#vite-devtools-anchor.vite-devtools-minimized #vite-devtools-dock{width:22px;height:22px;padding:2px 0}#vite-devtools-anchor.vite-devtools-minimized .vite-devtools-dock-bracket{opacity:.5;width:.375rem}#vite-devtools-anchor:hover #vite-devtools-glowing{opacity:.6}#vite-devtools-anchor #vite-devtools-glowing{pointer-events:none;z-index:-1;opacity:0;--vdt-blur:blur(60px);width:160px;height:160px;filter:var(--vdt-blur)var(--vdt-brightness)var(--vdt-contrast)var(--vdt-drop-shadow)var(--vdt-grayscale)var(--vdt-hue-rotate)var(--vdt-invert)var(--vdt-saturate)var(--vdt-sepia);background-image:linear-gradient(45deg,#61d9ff,#7a23a1,#715ebd);-webkit-border-radius:9999px;border-radius:9999px;transition-property:all;transition-duration:1s;transition-timing-function:cubic-bezier(0,0,.2,1);position:absolute;top:0;left:0;transform:translate(-50%,-50%)}@media print{#vite-devtools-anchor{display:none}}.vite-devtools-resize-handle-horizontal{cursor:ns-resize;-webkit-border-radius:.375rem;border-radius:.375rem;height:10px;margin-top:-5px;margin-bottom:-5px;position:absolute;left:6px;right:6px}.vite-devtools-resize-handle-vertical{cursor:ew-resize;-webkit-border-radius:.375rem;border-radius:.375rem;width:10px;margin-left:-5px;margin-right:-5px;position:absolute;top:6px;bottom:0}.vite-devtools-resize-handle-corner{-webkit-border-radius:.375rem;border-radius:.375rem;width:14px;height:14px;margin:-6px;position:absolute}.vite-devtools-resize-handle{z-index:30}.vite-devtools-resize-handle:hover{background-color:rgba(156,163,175,.1)}*{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }:before{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }:after{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }::backdrop{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }.i-carbon-clean{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 20h-6v-2h6zm4 8h-6v-2h6zm-2-4h-6v-2h6z'/%3E%3Cpath fill='currentColor' d='M17.003 20a4.9 4.9 0 0 0-2.404-4.173L22 3l-1.73-1l-7.577 13.126a5.7 5.7 0 0 0-5.243 1.503C3.706 20.24 3.996 28.682 4.01 29.04a1 1 0 0 0 1 .96h14.991a1 1 0 0 0 .6-1.8c-3.54-2.656-3.598-8.146-3.598-8.2m-5.073-3.003A3.11 3.11 0 0 1 15.004 20c0 .038.002.208.017.469l-5.9-2.624a3.8 3.8 0 0 1 2.809-.848M15.45 28A5.2 5.2 0 0 1 14 25h-2a6.5 6.5 0 0 0 .968 3h-2.223A16.6 16.6 0 0 1 10 24H8a17.3 17.3 0 0 0 .665 4H6c.031-1.836.29-5.892 1.803-8.553l7.533 3.35A13 13 0 0 0 17.596 28Z'/%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-check-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M232 56v144a16 16 0 0 1-16 16H40a16 16 0 0 1-16-16V56a16 16 0 0 1 16-16h176a16 16 0 0 1 16 16' opacity='.2'/%3E%3Cpath d='m205.66 85.66l-96 96a8 8 0 0 1-11.32 0l-40-40a8 8 0 0 1 11.32-11.32L104 164.69l90.34-90.35a8 8 0 0 1 11.32 11.32'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-rocket-launch-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M184 120v61.65a8 8 0 0 1-2.34 5.65l-34.35 34.35a8 8 0 0 1-13.57-4.53L128 176Zm-48-48H74.35a8 8 0 0 0-5.65 2.34l-34.35 34.35a8 8 0 0 0 4.53 13.57L80 128ZM40 216c37.65 0 50.69-19.69 54.56-28.18l-26.38-26.38C59.69 165.31 40 178.35 40 216' opacity='.2'/%3E%3Cpath d='M223.85 47.12a16 16 0 0 0-15-15c-12.58-.75-44.73.4-71.41 27.07L132.69 64H74.36A15.9 15.9 0 0 0 63 68.68L28.7 103a16 16 0 0 0 9.07 27.16l38.47 5.37l44.21 44.21l5.37 38.49a15.94 15.94 0 0 0 10.78 12.92a16.1 16.1 0 0 0 5.1.83a15.9 15.9 0 0 0 11.3-4.68l34.32-34.3a15.9 15.9 0 0 0 4.68-11.36v-58.33l4.77-4.77c26.68-26.68 27.83-58.83 27.08-71.42M74.36 80h42.33l-39.53 39.52L40 114.34Zm74.41-9.45a76.65 76.65 0 0 1 59.11-22.47a76.46 76.46 0 0 1-22.42 59.16L128 164.68L91.32 128ZM176 181.64L141.67 216l-5.19-37.17L176 139.31Zm-74.16 9.5C97.34 201 82.29 224 40 224a8 8 0 0 1-8-8c0-42.29 23-57.34 32.86-61.85a8 8 0 0 1 6.64 14.56c-6.43 2.93-20.62 12.36-23.12 38.91c26.55-2.5 36-16.69 38.91-23.12a8 8 0 1 1 14.56 6.64Z'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-warning-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M215.46 216H40.54c-12.62 0-20.54-13.21-14.41-23.91l87.46-151.87c6.3-11 22.52-11 28.82 0l87.46 151.87c6.13 10.7-1.79 23.91-14.41 23.91' opacity='.2'/%3E%3Cpath d='M236.8 188.09L149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19a23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2a7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12a12 12 0 0 1 12 12'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-svg-spinners-8-dots-rotate{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg%3E%3Ccircle cx='3' cy='12' r='2' fill='currentColor'/%3E%3Ccircle cx='21' cy='12' r='2' fill='currentColor'/%3E%3Ccircle cx='12' cy='21' r='2' fill='currentColor'/%3E%3Ccircle cx='12' cy='3' r='2' fill='currentColor'/%3E%3Ccircle cx='5.64' cy='5.64' r='2' fill='currentColor'/%3E%3Ccircle cx='18.36' cy='18.36' r='2' fill='currentColor'/%3E%3Ccircle cx='5.64' cy='18.36' r='2' fill='currentColor'/%3E%3Ccircle cx='18.36' cy='5.64' r='2' fill='currentColor'/%3E%3CanimateTransform attributeName='transform' dur='1.5s' repeatCount='indefinite' type='rotate' values='0 12 12;360 12 12'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.container{width:100%}.z-floating-tooltip{z-index:2147483645}.border-base{--vdt-border-opacity:.13;border-color:rgba(136,136,136,var(--vdt-border-opacity))}.bg-active{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}.bg-glass{--vdt-backdrop-blur:blur(5px);backdrop-filter:var(--vdt-backdrop-blur)var(--vdt-backdrop-brightness)var(--vdt-backdrop-contrast)var(--vdt-backdrop-grayscale)var(--vdt-backdrop-hue-rotate)var(--vdt-backdrop-invert)var(--vdt-backdrop-opacity)var(--vdt-backdrop-saturate)var(--vdt-backdrop-sepia);background-color:rgba(255,255,255,.5)}.hover\\:bg-active:hover{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}@media (prefers-color-scheme:dark){.bg-glass{background-color:rgba(17,17,17,.5)}}@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}}.pointer-events-none{pointer-events:none}.disabled\\:pointer-events-none:disabled{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;bottom:0;left:0;right:0}.bottom-0{bottom:0}.left--1{left:-.25rem}.left-1\\/2{left:50%}.right--1{right:-.25rem}.top-1\\/2{top:50%}.z--1{z-index:-1}.grid{display:grid}.grid-rows-\\[max-content_1fr\\]{grid-template-rows:max-content 1fr}.m-auto{margin:auto}.h-10{height:2.5rem}.h-3{height:.75rem}.h-5{height:1.25rem}.h-full{height:100%}.w-10{width:2.5rem}.w-2\\.5{width:.625rem}.w-3{width:.75rem}.w-5{width:1.25rem}.w-full{width:100%}.w-max{width:max-content}.flex{display:flex}.flex-col{flex-direction:column}.translate-x--1\\/2{--vdt-translate-x:-50%;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.translate-y--1\\/2{--vdt-translate-y:-50%;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.rotate-270{--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-rotate:270deg;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.scale-120{--vdt-scale-x:1.2;--vdt-scale-y:1.2;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.hover\\:scale-120:hover{--vdt-scale-x:1.2;--vdt-scale-y:1.2;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.scale-y--100{--vdt-scale-y:-1;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.transform{transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.select-none{user-select:none}.resize{resize:both}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.of-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.rounded{-webkit-border-radius:.25rem;border-radius:.25rem}.rounded-lg{-webkit-border-radius:.5rem;border-radius:.5rem}.rounded-xl{-webkit-border-radius:.75rem;border-radius:.75rem}.rounded-t{-webkit-border-top-left-radius:.25rem;border-top-left-radius:.25rem;-webkit-border-top-right-radius:.25rem;border-top-right-radius:.25rem}.bg-black{--vdt-bg-opacity:1;background-color:rgba(0,0,0,var(--vdt-bg-opacity))}.bg-lime6{--vdt-bg-opacity:1;background-color:rgba(101,163,13,var(--vdt-bg-opacity))}.hover\\:bg-\\[\\#8881\\]:hover{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}.hover\\:bg-lime7:hover{--vdt-bg-opacity:1;background-color:rgba(77,124,15,var(--vdt-bg-opacity))}.disabled\\:bg-gray6\\!:disabled{--vdt-bg-opacity:1!important;background-color:rgba(75,85,99,var(--vdt-bg-opacity))!important}.fill-black{--vdt-fill-opacity:1;fill:rgba(0,0,0,var(--vdt-fill-opacity))}.p1{padding:.25rem}.p1\\.5{padding:.375rem}.px,.px4{padding-left:1rem;padding-right:1rem}.px2{padding-left:.5rem;padding-right:.5rem}.px3{padding-left:.75rem;padding-right:.75rem}.py1{padding-top:.25rem;padding-bottom:.25rem}.py1\\.5{padding-top:.375rem;padding-bottom:.375rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-purple{--vdt-text-opacity:1;color:rgba(192,132,252,var(--vdt-text-opacity))}.font-bold{font-weight:700}.tab{tab-size:4}.op0,.opacity-0{opacity:0}.op100,.opacity-100{opacity:1}.op50{opacity:.5}.op60\\!{opacity:.6!important}.op75{opacity:.75}.shadow{--vdt-shadow:var(--vdt-shadow-inset)0 1px 3px 0 var(--vdt-shadow-color,rgba(0,0,0,.1)),var(--vdt-shadow-inset)0 1px 2px -1px var(--vdt-shadow-color,rgba(0,0,0,.1));box-shadow:var(--vdt-ring-offset-shadow),var(--vdt-ring-shadow),var(--vdt-shadow)}.saturate-0{--vdt-saturate:saturate(0);filter:var(--vdt-blur)var(--vdt-brightness)var(--vdt-contrast)var(--vdt-drop-shadow)var(--vdt-grayscale)var(--vdt-hue-rotate)var(--vdt-invert)var(--vdt-saturate)var(--vdt-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@media (prefers-color-scheme:dark){.dark\\:fill-white{--vdt-fill-opacity:1;fill:rgba(255,255,255,var(--vdt-fill-opacity))}}" +export default "*{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:before{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:after{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:before{--un-content:\"\"}:after{--un-content:\"\"}html{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){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-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button{-webkit-appearance:button;background-color:transparent;background-image:none}[type=button]{-webkit-appearance:button;background-color:transparent;background-image:none}[type=reset]{-webkit-appearance:button;background-color:transparent;background-image:none}[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{height:auto}::-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{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::placeholder{opacity:1;color:#9ca3af}textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.xterm{cursor:text;user-select:none;position:relative}.xterm.focus{outline:none}.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;top:0;bottom:0;left:0;right:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-message{z-index:10;color:transparent;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility:not(.debug){z-index:10;color:transparent;pointer-events:none;position:absolute;top:0;bottom:0;left:0;right:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:transparent}.xterm .xterm-accessibility-tree{user-select:text;white-space:pre}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:underline double}.xterm-underline-3{text-decoration:underline wavy}.xterm-underline-4{text-decoration:underline dotted}.xterm-underline-5{text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}:root{--un-text-opacity:100%}#vite-devtools-anchor{z-index:2147483644;box-sizing:border-box;transform-origin:50%;width:0;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:15px;position:fixed;transform:translate(-50%,-50%)rotate(0)}#vite-devtools-anchor #vite-devtools-dock-container{width:max-content;min-width:100px;height:40px;display:flex;position:absolute;top:0;left:0;transform:translate(-50%,-50%)}#vite-devtools-anchor.vite-devtools-vertical #vite-devtools-dock-container{transition-property:all;transition-duration:.5s;transition-timing-function:cubic-bezier(.4,0,.2,1);transform:translate(-50%,-50%)rotate(90deg)}#vite-devtools-anchor #vite-devtools-dock{touch-action:none;user-select:none;--vdt-backdrop-blur:blur(5px);height:40px;backdrop-filter:var(--vdt-backdrop-blur)var(--vdt-backdrop-brightness)var(--vdt-backdrop-contrast)var(--vdt-backdrop-grayscale)var(--vdt-backdrop-hue-rotate)var(--vdt-backdrop-invert)var(--vdt-backdrop-opacity)var(--vdt-backdrop-saturate)var(--vdt-backdrop-sepia);--vdt-text-opacity:1;color:rgba(255,255,255,var(--vdt-text-opacity));--vdt-shadow:var(--vdt-shadow-inset)0 1px 3px 0 var(--vdt-shadow-color,rgba(0,0,0,.1)),var(--vdt-shadow-inset)0 1px 2px -1px var(--vdt-shadow-color,rgba(0,0,0,.1));box-shadow:var(--vdt-ring-offset-shadow),var(--vdt-ring-shadow),var(--vdt-shadow);width:calc-size(max-content,size);background-color:rgba(255,255,255,.5);-webkit-border-radius:9999px;border-radius:9999px;margin:auto;padding-left:1rem;padding-right:1rem;transition-property:all;transition-duration:.5s;transition-timing-function:cubic-bezier(.4,0,.2,1)}@media (prefers-color-scheme:dark){#vite-devtools-anchor #vite-devtools-dock{background-color:rgba(17,17,17,.5)}}#vite-devtools-anchor.vite-devtools-minimized #vite-devtools-dock{width:22px;height:22px;padding:2px 0}#vite-devtools-anchor.vite-devtools-minimized .vite-devtools-dock-bracket{opacity:.5;width:.375rem}#vite-devtools-anchor:hover #vite-devtools-glowing{opacity:.6}#vite-devtools-anchor #vite-devtools-glowing{pointer-events:none;z-index:-1;opacity:0;--vdt-blur:blur(60px);width:160px;height:160px;filter:var(--vdt-blur)var(--vdt-brightness)var(--vdt-contrast)var(--vdt-drop-shadow)var(--vdt-grayscale)var(--vdt-hue-rotate)var(--vdt-invert)var(--vdt-saturate)var(--vdt-sepia);background-image:linear-gradient(45deg,#61d9ff,#7a23a1,#715ebd);-webkit-border-radius:9999px;border-radius:9999px;transition-property:all;transition-duration:1s;transition-timing-function:cubic-bezier(0,0,.2,1);position:absolute;top:0;left:0;transform:translate(-50%,-50%)}@media print{#vite-devtools-anchor{display:none}}.vite-devtools-resize-handle-horizontal{cursor:ns-resize;-webkit-border-radius:.375rem;border-radius:.375rem;height:10px;margin-top:-5px;margin-bottom:-5px;position:absolute;left:6px;right:6px}.vite-devtools-resize-handle-vertical{cursor:ew-resize;-webkit-border-radius:.375rem;border-radius:.375rem;width:10px;margin-left:-5px;margin-right:-5px;position:absolute;top:6px;bottom:0}.vite-devtools-resize-handle-corner{-webkit-border-radius:.375rem;border-radius:.375rem;width:14px;height:14px;margin:-6px;position:absolute}.vite-devtools-resize-handle{z-index:30}.vite-devtools-resize-handle:hover{background-color:rgba(156,163,175,.1)}*{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }:before{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }:after{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }::backdrop{--vdt-rotate:0;--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-scale-x:1;--vdt-scale-y:1;--vdt-scale-z:1;--vdt-skew-x:0;--vdt-skew-y:0;--vdt-translate-x:0;--vdt-translate-y:0;--vdt-translate-z:0;--vdt-pan-x: ;--vdt-pan-y: ;--vdt-pinch-zoom: ;--vdt-scroll-snap-strictness:proximity;--vdt-ordinal: ;--vdt-slashed-zero: ;--vdt-numeric-figure: ;--vdt-numeric-spacing: ;--vdt-numeric-fraction: ;--vdt-border-spacing-x:0;--vdt-border-spacing-y:0;--vdt-ring-offset-shadow:0 0 transparent;--vdt-ring-shadow:0 0 transparent;--vdt-shadow-inset: ;--vdt-shadow:0 0 transparent;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:rgba(147,197,253,.5);--vdt-blur: ;--vdt-brightness: ;--vdt-contrast: ;--vdt-drop-shadow: ;--vdt-grayscale: ;--vdt-hue-rotate: ;--vdt-invert: ;--vdt-saturate: ;--vdt-sepia: ;--vdt-backdrop-blur: ;--vdt-backdrop-brightness: ;--vdt-backdrop-contrast: ;--vdt-backdrop-grayscale: ;--vdt-backdrop-hue-rotate: ;--vdt-backdrop-invert: ;--vdt-backdrop-opacity: ;--vdt-backdrop-saturate: ;--vdt-backdrop-sepia: }.i-carbon-clean{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M26 20h-6v-2h6zm4 8h-6v-2h6zm-2-4h-6v-2h6z'/%3E%3Cpath fill='currentColor' d='M17.003 20a4.9 4.9 0 0 0-2.404-4.173L22 3l-1.73-1l-7.577 13.126a5.7 5.7 0 0 0-5.243 1.503C3.706 20.24 3.996 28.682 4.01 29.04a1 1 0 0 0 1 .96h14.991a1 1 0 0 0 .6-1.8c-3.54-2.656-3.598-8.146-3.598-8.2m-5.073-3.003A3.11 3.11 0 0 1 15.004 20c0 .038.002.208.017.469l-5.9-2.624a3.8 3.8 0 0 1 2.809-.848M15.45 28A5.2 5.2 0 0 1 14 25h-2a6.5 6.5 0 0 0 .968 3h-2.223A16.6 16.6 0 0 1 10 24H8a17.3 17.3 0 0 0 .665 4H6c.031-1.836.29-5.892 1.803-8.553l7.533 3.35A13 13 0 0 0 17.596 28Z'/%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-check-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M232 56v144a16 16 0 0 1-16 16H40a16 16 0 0 1-16-16V56a16 16 0 0 1 16-16h176a16 16 0 0 1 16 16' opacity='.2'/%3E%3Cpath d='m205.66 85.66l-96 96a8 8 0 0 1-11.32 0l-40-40a8 8 0 0 1 11.32-11.32L104 164.69l90.34-90.35a8 8 0 0 1 11.32 11.32'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-rocket-launch-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M184 120v61.65a8 8 0 0 1-2.34 5.65l-34.35 34.35a8 8 0 0 1-13.57-4.53L128 176Zm-48-48H74.35a8 8 0 0 0-5.65 2.34l-34.35 34.35a8 8 0 0 0 4.53 13.57L80 128ZM40 216c37.65 0 50.69-19.69 54.56-28.18l-26.38-26.38C59.69 165.31 40 178.35 40 216' opacity='.2'/%3E%3Cpath d='M223.85 47.12a16 16 0 0 0-15-15c-12.58-.75-44.73.4-71.41 27.07L132.69 64H74.36A15.9 15.9 0 0 0 63 68.68L28.7 103a16 16 0 0 0 9.07 27.16l38.47 5.37l44.21 44.21l5.37 38.49a15.94 15.94 0 0 0 10.78 12.92a16.1 16.1 0 0 0 5.1.83a15.9 15.9 0 0 0 11.3-4.68l34.32-34.3a15.9 15.9 0 0 0 4.68-11.36v-58.33l4.77-4.77c26.68-26.68 27.83-58.83 27.08-71.42M74.36 80h42.33l-39.53 39.52L40 114.34Zm74.41-9.45a76.65 76.65 0 0 1 59.11-22.47a76.46 76.46 0 0 1-22.42 59.16L128 164.68L91.32 128ZM176 181.64L141.67 216l-5.19-37.17L176 139.31Zm-74.16 9.5C97.34 201 82.29 224 40 224a8 8 0 0 1-8-8c0-42.29 23-57.34 32.86-61.85a8 8 0 0 1 6.64 14.56c-6.43 2.93-20.62 12.36-23.12 38.91c26.55-2.5 36-16.69 38.91-23.12a8 8 0 1 1 14.56 6.64Z'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-ph-warning-duotone{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 256' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg fill='currentColor'%3E%3Cpath d='M215.46 216H40.54c-12.62 0-20.54-13.21-14.41-23.91l87.46-151.87c6.3-11 22.52-11 28.82 0l87.46 151.87c6.13 10.7-1.79 23.91-14.41 23.91' opacity='.2'/%3E%3Cpath d='M236.8 188.09L149.35 36.22a24.76 24.76 0 0 0-42.7 0L19.2 188.09a23.51 23.51 0 0 0 0 23.72A24.35 24.35 0 0 0 40.55 224h174.9a24.35 24.35 0 0 0 21.33-12.19a23.51 23.51 0 0 0 .02-23.72m-13.87 15.71a8.5 8.5 0 0 1-7.48 4.2H40.55a8.5 8.5 0 0 1-7.48-4.2a7.59 7.59 0 0 1 0-7.72l87.45-151.87a8.75 8.75 0 0 1 15 0l87.45 151.87a7.59 7.59 0 0 1-.04 7.72M120 144v-40a8 8 0 0 1 16 0v40a8 8 0 0 1-16 0m20 36a12 12 0 1 1-12-12a12 12 0 0 1 12 12'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.i-svg-spinners-8-dots-rotate{--vdt-icon:url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 24 24' width='1em' height='1em' xmlns='http://www.w3.org/2000/svg' %3E%3Cg%3E%3Ccircle cx='3' cy='12' r='2' fill='currentColor'/%3E%3Ccircle cx='21' cy='12' r='2' fill='currentColor'/%3E%3Ccircle cx='12' cy='21' r='2' fill='currentColor'/%3E%3Ccircle cx='12' cy='3' r='2' fill='currentColor'/%3E%3Ccircle cx='5.64' cy='5.64' r='2' fill='currentColor'/%3E%3Ccircle cx='18.36' cy='18.36' r='2' fill='currentColor'/%3E%3Ccircle cx='5.64' cy='18.36' r='2' fill='currentColor'/%3E%3Ccircle cx='18.36' cy='5.64' r='2' fill='currentColor'/%3E%3CanimateTransform attributeName='transform' dur='1.5s' repeatCount='indefinite' type='rotate' values='0 12 12;360 12 12'/%3E%3C/g%3E%3C/svg%3E\");-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;mask-size:100% 100%}.container{width:100%}.z-floating-tooltip{z-index:2147483645}.border-base{--vdt-border-opacity:.13;border-color:rgba(136,136,136,var(--vdt-border-opacity))}.bg-active{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}.bg-glass{--vdt-backdrop-blur:blur(5px);backdrop-filter:var(--vdt-backdrop-blur)var(--vdt-backdrop-brightness)var(--vdt-backdrop-contrast)var(--vdt-backdrop-grayscale)var(--vdt-backdrop-hue-rotate)var(--vdt-backdrop-invert)var(--vdt-backdrop-opacity)var(--vdt-backdrop-saturate)var(--vdt-backdrop-sepia);background-color:rgba(255,255,255,.5)}.hover\\:bg-active:hover{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}@media (prefers-color-scheme:dark){.bg-glass{background-color:rgba(17,17,17,.5)}}@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}}.pointer-events-none{pointer-events:none}.disabled\\:pointer-events-none:disabled{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;bottom:0;left:0;right:0}.bottom-0{bottom:0}.left--1{left:-.25rem}.left-1\\/2{left:50%}.right--1{right:-.25rem}.top-1\\/2{top:50%}.z--1{z-index:-1}.grid{display:grid}.grid-rows-\\[max-content_1fr\\]{grid-template-rows:max-content 1fr}.m-auto{margin:auto}.h-10{height:2.5rem}.h-3{height:.75rem}.h-5{height:1.25rem}.h-full{height:100%}.w-10{width:2.5rem}.w-2\\.5{width:.625rem}.w-3{width:.75rem}.w-5{width:1.25rem}.w-full{width:100%}.w-max{width:max-content}.flex{display:flex}.flex-col{flex-direction:column}.translate-x--1\\/2{--vdt-translate-x:-50%;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.translate-y--1\\/2{--vdt-translate-y:-50%;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.rotate-270{--vdt-rotate-x:0;--vdt-rotate-y:0;--vdt-rotate-z:0;--vdt-rotate:270deg;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.scale-120{--vdt-scale-x:1.2;--vdt-scale-y:1.2;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.hover\\:scale-120:hover{--vdt-scale-x:1.2;--vdt-scale-y:1.2;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.scale-y--100{--vdt-scale-y:-1;transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.transform{transform:translateX(var(--vdt-translate-x))translateY(var(--vdt-translate-y))translateZ(var(--vdt-translate-z))rotate(var(--vdt-rotate))rotateX(var(--vdt-rotate-x))rotateY(var(--vdt-rotate-y))rotateZ(var(--vdt-rotate-z))skewX(var(--vdt-skew-x))skewY(var(--vdt-skew-y))scaleX(var(--vdt-scale-x))scaleY(var(--vdt-scale-y))scaleZ(var(--vdt-scale-z))}.select-none{user-select:none}.resize{resize:both}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.of-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.ws-nowrap{white-space:nowrap}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.rounded{-webkit-border-radius:.25rem;border-radius:.25rem}.rounded-lg{-webkit-border-radius:.5rem;border-radius:.5rem}.rounded-xl{-webkit-border-radius:.75rem;border-radius:.75rem}.rounded-t{-webkit-border-top-left-radius:.25rem;border-top-left-radius:.25rem;-webkit-border-top-right-radius:.25rem;border-top-right-radius:.25rem}.bg-black{--vdt-bg-opacity:1;background-color:rgba(0,0,0,var(--vdt-bg-opacity))}.bg-lime6{--vdt-bg-opacity:1;background-color:rgba(101,163,13,var(--vdt-bg-opacity))}.hover\\:bg-\\[\\#8881\\]:hover{--vdt-bg-opacity:.07;background-color:rgba(136,136,136,var(--vdt-bg-opacity))}.hover\\:bg-lime7:hover{--vdt-bg-opacity:1;background-color:rgba(77,124,15,var(--vdt-bg-opacity))}.disabled\\:bg-gray6\\!:disabled{--vdt-bg-opacity:1!important;background-color:rgba(75,85,99,var(--vdt-bg-opacity))!important}.fill-black{--vdt-fill-opacity:1;fill:rgba(0,0,0,var(--vdt-fill-opacity))}.p1{padding:.25rem}.p1\\.5{padding:.375rem}.p2{padding:.5rem}.px,.px4{padding-left:1rem;padding-right:1rem}.px2{padding-left:.5rem;padding-right:.5rem}.px3{padding-left:.75rem;padding-right:.75rem}.py1{padding-top:.25rem;padding-bottom:.25rem}.py1\\.5{padding-top:.375rem;padding-bottom:.375rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-orange{--vdt-text-opacity:1;color:rgba(251,146,60,var(--vdt-text-opacity))}.text-purple{--vdt-text-opacity:1;color:rgba(192,132,252,var(--vdt-text-opacity))}.font-bold{font-weight:700}.tab{tab-size:4}.op0,.opacity-0{opacity:0}.op100,.opacity-100{opacity:1}.op50{opacity:.5}.op60\\!{opacity:.6!important}.op75{opacity:.75}.shadow{--vdt-shadow:var(--vdt-shadow-inset)0 1px 3px 0 var(--vdt-shadow-color,rgba(0,0,0,.1)),var(--vdt-shadow-inset)0 1px 2px -1px var(--vdt-shadow-color,rgba(0,0,0,.1));box-shadow:var(--vdt-ring-offset-shadow),var(--vdt-ring-shadow),var(--vdt-shadow)}.saturate-0{--vdt-saturate:saturate(0);filter:var(--vdt-blur)var(--vdt-brightness)var(--vdt-contrast)var(--vdt-drop-shadow)var(--vdt-grayscale)var(--vdt-hue-rotate)var(--vdt-invert)var(--vdt-saturate)var(--vdt-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@media (prefers-color-scheme:dark){.dark\\:fill-white{--vdt-fill-opacity:1;fill:rgba(255,255,255,var(--vdt-fill-opacity))}}" diff --git a/packages/core/src/client/webcomponents/components/ViewBuiltinTerminalPanel.vue b/packages/core/src/client/webcomponents/components/ViewBuiltinTerminalPanel.vue index d667383b..f6d1b5b8 100644 --- a/packages/core/src/client/webcomponents/components/ViewBuiltinTerminalPanel.vue +++ b/packages/core/src/client/webcomponents/components/ViewBuiltinTerminalPanel.vue @@ -37,7 +37,7 @@ onMounted(async () => { props.terminal.terminal = term if (props.terminal.buffer == null) { - const { buffer } = await props.context.rpc.$call('vite:internal:terminals:read', props.terminal.info.id) + const { buffer } = await props.context.rpc.call('vite:internal:terminals:read', props.terminal.info.id) props.terminal.buffer = markRaw(buffer) } diff --git a/packages/core/src/client/webcomponents/components/ViewLauncher.vue b/packages/core/src/client/webcomponents/components/ViewLauncher.vue index 143d389d..06651633 100644 --- a/packages/core/src/client/webcomponents/components/ViewLauncher.vue +++ b/packages/core/src/client/webcomponents/components/ViewLauncher.vue @@ -10,7 +10,7 @@ const props = defineProps<{ }>() function onLaunch() { - props.context.rpc.$call('vite:internal:docks:on-launch', props.entry.id) + props.context.rpc.call('vite:internal:docks:on-launch', props.entry.id) } const status = computed(() => props.entry.launcher.status || 'idle') diff --git a/packages/core/src/client/webcomponents/state/context.ts b/packages/core/src/client/webcomponents/state/context.ts index 5c48b32c..48e9c0b5 100644 --- a/packages/core/src/client/webcomponents/state/context.ts +++ b/packages/core/src/client/webcomponents/state/context.ts @@ -1,4 +1,4 @@ -import type { ClientRpcReturn, DockClientScriptContext, DockEntryState, DockPanelStorage, DocksContext } from '@vitejs/devtools-kit/client' +import type { DevToolsRpcClient, DockClientScriptContext, DockEntryState, DockPanelStorage, DocksContext } from '@vitejs/devtools-kit/client' import type { Ref } from 'vue' import { computed, markRaw, reactive, ref, toRefs, watchEffect } from 'vue' import { createDockEntryState, DEFAULT_DOCK_PANEL_STORE, useDocksEntries } from './docks' @@ -7,7 +7,7 @@ import { executeSetupScript } from './setup-script' let _docksContext: DocksContext | undefined export async function createDocksContext( clientType: 'embedded' | 'standalone', - rpcReturn: ClientRpcReturn, + rpc: DevToolsRpcClient, panelStore?: Ref, ): Promise { if (_docksContext) { @@ -15,7 +15,7 @@ export async function createDocksContext( } const selectedId = ref(null) - const dockEntries = await useDocksEntries(rpcReturn) + const dockEntries = await useDocksEntries(rpc) const selected = computed(() => dockEntries.value.find(entry => entry.id === selectedId.value) ?? null) const dockEntryStateMap: Map = reactive(new Map()) @@ -76,8 +76,7 @@ export async function createDocksContext( return true }, }, - rpc: rpcReturn.rpc, - clientRpc: rpcReturn.clientRpc, + rpc, clientType, }) diff --git a/packages/core/src/client/webcomponents/state/docks.ts b/packages/core/src/client/webcomponents/state/docks.ts index 787372fb..063ec697 100644 --- a/packages/core/src/client/webcomponents/state/docks.ts +++ b/packages/core/src/client/webcomponents/state/docks.ts @@ -1,5 +1,5 @@ import type { DevToolsDockEntry, DevToolsRpcClientFunctions } from '@vitejs/devtools-kit' -import type { ClientRpcReturn, DockEntryState, DockEntryStateEvents, DockPanelStorage } from '@vitejs/devtools-kit/client' +import type { DevToolsRpcClient, DockEntryState, DockEntryStateEvents, DockPanelStorage } from '@vitejs/devtools-kit/client' import type { Ref, ShallowRef } from 'vue' import { createEventEmitter } from '@vitejs/devtools-kit/utils/events' import { markRaw, reactive, shallowRef, watch } from 'vue' @@ -53,18 +53,18 @@ export function createDockEntryState( } let _docksEntriesRef: ShallowRef | undefined -export async function useDocksEntries(rpcReturn: ClientRpcReturn): Promise> { +export async function useDocksEntries(rpc: DevToolsRpcClient): Promise> { if (_docksEntriesRef) { return _docksEntriesRef } const dockEntries = _docksEntriesRef = shallowRef([]) async function updateDocksEntries() { - dockEntries.value = (await rpcReturn.rpc.$call('vite:internal:docks:list')) + dockEntries.value = (await rpc.call('vite:internal:docks:list')) .map(entry => Object.freeze(entry)) // eslint-disable-next-line no-console console.log('[VITE DEVTOOLS] Docks Entries Updated', [...dockEntries.value]) } - rpcReturn.clientRpc.register({ + rpc.client.register({ name: 'vite:internal:docks:updated' satisfies keyof DevToolsRpcClientFunctions, type: 'action', handler: () => updateDocksEntries(), diff --git a/packages/core/src/client/webcomponents/state/terminals.ts b/packages/core/src/client/webcomponents/state/terminals.ts index d87412f1..02cf1ac6 100644 --- a/packages/core/src/client/webcomponents/state/terminals.ts +++ b/packages/core/src/client/webcomponents/state/terminals.ts @@ -17,7 +17,7 @@ export function useTerminals(context: DocksContext): Reactive> = _terminalsMap = reactive(new Map()) async function updateTerminals() { - const terminals = await context.rpc.$call('vite:internal:terminals:list') + const terminals = await context.rpc.call('vite:internal:terminals:list') for (const terminal of terminals) { if (map.has(terminal.id)) { @@ -34,12 +34,12 @@ export function useTerminals(context: DocksContext): Reactive updateTerminals(), }) - context.clientRpc.register({ + context.rpc.client.register({ name: 'vite:internal:terminals:stream-chunk' satisfies keyof DevToolsRpcClientFunctions, type: 'action', handler: (data: DevToolsTerminalSessionStreamChunkEvent) => { diff --git a/packages/core/src/node/context.ts b/packages/core/src/node/context.ts index fb5eab37..c99d1d7b 100644 --- a/packages/core/src/node/context.ts +++ b/packages/core/src/node/context.ts @@ -44,15 +44,15 @@ export async function createDevToolsContext( // Register hosts side effects docksHost.events.on('dock:entry:updated', debounce(() => { - rpcHost.boardcast?.$callOptional('vite:internal:docks:updated') + rpcHost.boardcast('vite:internal:docks:updated') }, 10)) terminalsHost.events.on('terminal:session:updated', debounce(() => { - rpcHost.boardcast?.$callOptional('vite:internal:terminals:updated') + rpcHost.boardcast('vite:internal:terminals:updated') // New terminals might affect the visibility of the terminals dock entry, we trigger it here as well - rpcHost.boardcast?.$callOptional('vite:internal:docks:updated') + rpcHost.boardcast('vite:internal:docks:updated') }, 10)) terminalsHost.events.on('terminal:session:stream-chunk', (data) => { - rpcHost.boardcast?.$callOptional('vite:internal:terminals:stream-chunk', data) + rpcHost.boardcast('vite:internal:terminals:stream-chunk', data) }) // Register plugins diff --git a/packages/core/src/node/host-functions.ts b/packages/core/src/node/host-functions.ts index c73a0715..966dcb0c 100644 --- a/packages/core/src/node/host-functions.ts +++ b/packages/core/src/node/host-functions.ts @@ -1,13 +1,27 @@ -import type { DevToolsNodeContext, DevToolsRpcClientFunctions, DevToolsRpcServerFunctions } from '@vitejs/devtools-kit' +import type { DevToolsNodeContext, DevToolsRpcClientFunctions, DevToolsRpcServerFunctions, RpcFunctionsHost as RpcFunctionsHostType } from '@vitejs/devtools-kit' import type { BirpcGroup } from 'birpc' import { RpcFunctionsCollectorBase } from 'birpc-x' -export class RpcFunctionsHost extends RpcFunctionsCollectorBase { - boardcast: BirpcGroup['broadcast'] = undefined! +export class RpcFunctionsHost extends RpcFunctionsCollectorBase implements RpcFunctionsHostType { + /** + * @internal + */ + rpcGroup: BirpcGroup = undefined! - constructor( - context: DevToolsNodeContext, - ) { + constructor(context: DevToolsNodeContext) { super(context) } + + boardcast< + T extends keyof DevToolsRpcClientFunctions, + Args extends Parameters, + >( + name: T, + ...args: Args + ): Promise<(Awaited> | undefined)[]> { + if (!this.rpcGroup) + throw new Error('RpcFunctionsHost.rpcGroup is not set, it likely to be an internal bug of Vite DevTools') + // @ts-expect-error - BirpcGroup.broadcast.$callOptional is not typed correctly + return this.rpcGroup.broadcast.$callOptional(name, ...args) + } } diff --git a/packages/core/src/node/ws.ts b/packages/core/src/node/ws.ts index 3e2226b9..75aefff1 100644 --- a/packages/core/src/node/ws.ts +++ b/packages/core/src/node/ws.ts @@ -1,6 +1,7 @@ /* eslint-disable no-console */ import type { ConnectionMeta, DevToolsNodeContext, DevToolsRpcClientFunctions, DevToolsRpcServerFunctions } from '@vitejs/devtools-kit' import type { WebSocket } from 'ws' +import type { RpcFunctionsHost } from './host-functions' import { createRpcServer } from '@vitejs/devtools-rpc' import { createWsRpcPreset } from '@vitejs/devtools-rpc/presets/ws/server' import c from 'ansis' @@ -15,7 +16,7 @@ export interface CreateWsServerOptions { } export async function createWsServer(options: CreateWsServerOptions) { - const rpcHost = options.context.rpc + const rpcHost = options.context.rpc as unknown as RpcFunctionsHost const port = options.portWebSocket ?? await getPort({ port: 7812, random: true }) const wsClients = new Set() @@ -32,21 +33,24 @@ export async function createWsServer(options: CreateWsServerOptions) { }, }) - const rpc = createRpcServer( + const rpcGroup = createRpcServer( rpcHost.functions, { preset, rpcOptions: { - onGeneralError(error, name) { + onFunctionError(error, name) { console.error(c.red`⬢ RPC error on executing "${c.bold(name)}":`) console.error(error) - throw error + }, + onGeneralError(error) { + console.error(c.red`⬢ RPC error on executing rpc`) + console.error(error) }, }, }, ) - rpcHost.boardcast = rpc.broadcast + rpcHost.rpcGroup = rpcGroup const getConnectionMeta = async (): Promise => { return { @@ -57,7 +61,7 @@ export async function createWsServer(options: CreateWsServerOptions) { return { port, - rpc, + rpc: rpcGroup, rpcHost, getConnectionMeta, } diff --git a/packages/kit/package.json b/packages/kit/package.json index 63af7946..8f38029e 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -22,6 +22,7 @@ ".": "./dist/index.mjs", "./client": "./dist/client.mjs", "./utils/events": "./dist/utils/events.mjs", + "./utils/nanoid": "./dist/utils/nanoid.mjs", "./package.json": "./package.json" }, "main": "./dist/index.mjs", @@ -44,6 +45,7 @@ "birpc-x": "catalog:deps" }, "devDependencies": { + "my-ua-parser": "catalog:frontend", "tsdown": "catalog:build", "vite": "catalog:build" } diff --git a/packages/kit/src/client/docks.ts b/packages/kit/src/client/docks.ts index 770c4458..92e26171 100644 --- a/packages/kit/src/client/docks.ts +++ b/packages/kit/src/client/docks.ts @@ -38,10 +38,6 @@ export interface DocksContext extends DevToolsClientContext { * The docks entries context */ readonly docks: DocksEntriesContext - /** - * The client-side RPC functions to be called from the server - */ - readonly clientRpc: DevToolsClientRpcHost } export type DevToolsClientRpcHost = RpcFunctionsCollector @@ -87,3 +83,6 @@ export interface DockEntryStateEvents { 'dom:panel:mounted': (panel: HTMLDivElement) => void 'dom:iframe:mounted': (iframe: HTMLIFrameElement) => void } + +export interface RpcClientEvents { +} diff --git a/packages/kit/src/client/rpc.ts b/packages/kit/src/client/rpc.ts index d9105c52..c9350c06 100644 --- a/packages/kit/src/client/rpc.ts +++ b/packages/kit/src/client/rpc.ts @@ -1,10 +1,11 @@ import type { WebSocketRpcClientOptions } from '@vitejs/devtools-rpc/presets/ws/client' import type { BirpcOptions, BirpcReturn } from 'birpc' -import type { ConnectionMeta, DevToolsRpcClientFunctions, DevToolsRpcServerFunctions } from '../types' -import type { DevToolsClientContext, DevToolsClientRpcHost } from './docks' +import type { ConnectionMeta, DevToolsRpcClientFunctions, DevToolsRpcServerFunctions, EventEmitter } from '../types' +import type { DevToolsClientContext, DevToolsClientRpcHost, RpcClientEvents } from './docks' import { createRpcClient } from '@vitejs/devtools-rpc' import { createWsRpcPreset } from '@vitejs/devtools-rpc/presets/ws/client' import { RpcFunctionsCollectorBase } from 'birpc-x' +import { createEventEmitter } from '../utils/events' const CONNECTION_META_KEY = '__VITE_DEVTOOLS_CONNECTION_META__' @@ -21,19 +22,38 @@ export interface DevToolsRpcClientOptions { rpcOptions?: Partial> } -export type DevToolsRpcClient = BirpcReturn - -export interface ClientRpcReturn { - connectionMeta: ConnectionMeta - rpc: DevToolsRpcClient - clientRpc: DevToolsClientRpcHost +export interface DevToolsRpcClient { + /** + * The events of the client + */ + events: EventEmitter + /** + * The connection meta + */ + readonly connectionMeta: ConnectionMeta + /** + * Call a RPC function on the server + */ + call: BirpcReturn['$call'] + /** + * Call a RPC event on the server, and does not expect a response + */ + callEvent: BirpcReturn['$callEvent'] + /** + * Call a RPC optional function on the server + */ + callOptional: BirpcReturn['$callOptional'] + /** + * The client RPC host + */ + client: DevToolsClientRpcHost } function findConnectionMetaFromWindows(): ConnectionMeta | undefined { const getters = [ - () => (window as any)[CONNECTION_META_KEY], - () => (globalThis as any)[CONNECTION_META_KEY], - () => (parent.window as any)[CONNECTION_META_KEY], + () => (window as any)?.[CONNECTION_META_KEY], + () => (globalThis as any)?.[CONNECTION_META_KEY], + () => (parent.window as any)?.[CONNECTION_META_KEY], ] for (const getter of getters) { @@ -48,11 +68,12 @@ function findConnectionMetaFromWindows(): ConnectionMeta | undefined { export async function getDevToolsRpcClient( options: DevToolsRpcClientOptions = {}, -): Promise { +): Promise { const { baseURL = '/.devtools/', rpcOptions = {}, } = options + const events = createEventEmitter() const bases = Array.isArray(baseURL) ? baseURL : [baseURL] let connectionMeta: ConnectionMeta | undefined = options.connectionMeta || findConnectionMetaFromWindows() @@ -84,7 +105,9 @@ export async function getDevToolsRpcClient( rpc: undefined!, } const clientRpc: DevToolsClientRpcHost = new RpcFunctionsCollectorBase(context) - const rpc = createRpcClient( + + // Create the RPC client + const serverRpc = createRpcClient( clientRpc.functions, { preset: createWsRpcPreset({ @@ -94,12 +117,27 @@ export async function getDevToolsRpcClient( rpcOptions, }, ) - // @ts-expect-error assign to readonly property - context.rpc = rpc - return { + const rpc: DevToolsRpcClient = { + events, connectionMeta, - rpc, - clientRpc, + call: (...args: any): any => { + // @ts-expect-error casting + return serverRpc.call(...args) + }, + callEvent: (...args: any): any => { + // @ts-expect-error casting + return serverRpc.callEvent(...args) + }, + callOptional: (...args: any): any => { + // @ts-expect-error casting + return serverRpc.callOptional(...args) + }, + client: clientRpc, } + + // @ts-expect-error assign to readonly property + context.rpc = rpc + + return rpc } diff --git a/packages/kit/src/types/rpc.ts b/packages/kit/src/types/rpc.ts index 6ae5ed8f..be9d1de9 100644 --- a/packages/kit/src/types/rpc.ts +++ b/packages/kit/src/types/rpc.ts @@ -1,8 +1,13 @@ -import type { BirpcGroup } from 'birpc' import type { RpcFunctionsCollectorBase } from 'birpc-x' import type { DevToolsRpcClientFunctions, DevToolsRpcServerFunctions } from './rpc-augments' import type { DevToolsNodeContext } from './vite-plugin' export type RpcFunctionsHost = RpcFunctionsCollectorBase & { - boardcast: BirpcGroup['broadcast'] + boardcast: < + T extends keyof DevToolsRpcClientFunctions, + Args extends Parameters, + >( + name: T, + ...args: Args + ) => Promise<(Awaited> | undefined)[]> } diff --git a/packages/kit/src/utils/nanoid.ts b/packages/kit/src/utils/nanoid.ts new file mode 100644 index 00000000..f6c7eab6 --- /dev/null +++ b/packages/kit/src/utils/nanoid.ts @@ -0,0 +1,10 @@ +// port from nanoid +// https://github.com/ai/nanoid +const urlAlphabet = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +export function nanoid(size = 21) { + let id = '' + let i = size + while (i--) + id += urlAlphabet[(Math.random() * 64) | 0] + return id +} diff --git a/packages/kit/src/utils/promise.ts b/packages/kit/src/utils/promise.ts new file mode 100644 index 00000000..87bef2ee --- /dev/null +++ b/packages/kit/src/utils/promise.ts @@ -0,0 +1,17 @@ +export function promiseWithResolver(): { + promise: Promise + resolve: (value: T) => void + reject: (error: Error) => void +} { + let resolve: (value: T) => void | undefined + let reject: (error: Error) => void | undefined + const promise = new Promise((_resolve, _reject) => { + resolve = _resolve + reject = _reject + }) + return { + promise, + resolve: resolve!, + reject: reject!, + } +} diff --git a/packages/kit/tsdown.config.ts b/packages/kit/tsdown.config.ts index 06749f77..647bcf0c 100644 --- a/packages/kit/tsdown.config.ts +++ b/packages/kit/tsdown.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ entry: { 'index': 'src/index.ts', 'utils/events': 'src/utils/events.ts', + 'utils/nanoid': 'src/utils/nanoid.ts', 'client': 'src/client/index.ts', }, exports: true, diff --git a/packages/rpc/src/presets/ws/client.ts b/packages/rpc/src/presets/ws/client.ts index a4640c5f..a815ba1a 100644 --- a/packages/rpc/src/presets/ws/client.ts +++ b/packages/rpc/src/presets/ws/client.ts @@ -1,3 +1,4 @@ +import type { ChannelOptions } from 'birpc' import type { RpcClientPreset } from '..' import { parse, stringify } from 'structured-clone-es' import { defineRpcClientPreset } from '..' @@ -11,12 +12,7 @@ export interface WebSocketRpcClientOptions { function NOOP() {} -export const createWsRpcPreset: RpcClientPreset<(options: WebSocketRpcClientOptions) => { - on: (handler: (data: string) => void) => void - post: (data: string) => void - serialize: (obj: any) => string - deserialize: (str: string) => unknown -}> = defineRpcClientPreset((options: WebSocketRpcClientOptions) => { +export const createWsRpcPreset: RpcClientPreset<(options: WebSocketRpcClientOptions) => ChannelOptions> = defineRpcClientPreset((options: WebSocketRpcClientOptions) => { const ws = new WebSocket(options.url) const { onConnected = NOOP, diff --git a/packages/vite/src/app/components/data/AssetDetails.vue b/packages/vite/src/app/components/data/AssetDetails.vue index 3673dfde..c2b716be 100644 --- a/packages/vite/src/app/components/data/AssetDetails.vue +++ b/packages/vite/src/app/components/data/AssetDetails.vue @@ -25,7 +25,7 @@ const { state } = useAsyncState( if (!props.lazy) return - const res = await rpc.value.$call( + const res = await rpc.value.call( 'vite:rolldown:get-asset-details', { session: props.session.id, @@ -62,7 +62,7 @@ const _importers = computed(() => props.lazy ? state.value?.importers : props.im const _imports = computed(() => props.lazy ? state.value?.imports : props.imports) function openInEditor() { - rpc.value.$call( + rpc.value.call( 'vite:core:open-in-editor', `${props.session.meta.dir}/${props.asset.filename}`, ) diff --git a/packages/vite/src/app/components/data/AssetDetailsLoader.vue b/packages/vite/src/app/components/data/AssetDetailsLoader.vue index dae34c57..32016271 100644 --- a/packages/vite/src/app/components/data/AssetDetailsLoader.vue +++ b/packages/vite/src/app/components/data/AssetDetailsLoader.vue @@ -15,7 +15,7 @@ const emit = defineEmits<{ const rpc = useRpc() const { state } = useAsyncState( async () => { - const res = await rpc.value.$call( + const res = await rpc.value.call( 'vite:rolldown:get-asset-details', { session: props.session.id, diff --git a/packages/vite/src/app/components/data/ChunkDetails.vue b/packages/vite/src/app/components/data/ChunkDetails.vue index 4dd75cf9..216af473 100644 --- a/packages/vite/src/app/components/data/ChunkDetails.vue +++ b/packages/vite/src/app/components/data/ChunkDetails.vue @@ -42,7 +42,7 @@ const { state, isLoading } = useAsyncState( if (props.chunks) return - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-chunks-graph', { session: props.session.id }, ) diff --git a/packages/vite/src/app/components/data/ChunkDetailsLoader.vue b/packages/vite/src/app/components/data/ChunkDetailsLoader.vue index c2e1f837..e3820412 100644 --- a/packages/vite/src/app/components/data/ChunkDetailsLoader.vue +++ b/packages/vite/src/app/components/data/ChunkDetailsLoader.vue @@ -15,7 +15,7 @@ const emit = defineEmits<{ const rpc = useRpc() const { state, isLoading } = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-chunk-info', { session: props.session.id, diff --git a/packages/vite/src/app/components/data/ModuleDetailsLoader.vue b/packages/vite/src/app/components/data/ModuleDetailsLoader.vue index c93fd89c..89eb4d65 100644 --- a/packages/vite/src/app/components/data/ModuleDetailsLoader.vue +++ b/packages/vite/src/app/components/data/ModuleDetailsLoader.vue @@ -28,7 +28,7 @@ watchEffect(async () => { nextTick(async () => { transforms.value = [] transformsLoading.value = true - transforms.value = await rpc.value.$call( + transforms.value = await rpc.value.call( 'vite:rolldown:get-module-transforms', arg, ) @@ -43,7 +43,7 @@ const info = computedAsync(async () => { } return { transforms: transforms.value, - ...(await rpc.value.$call( + ...(await rpc.value.call( 'vite:rolldown:get-module-info', arg, )), diff --git a/packages/vite/src/app/components/data/PackageDetailsLoader.vue b/packages/vite/src/app/components/data/PackageDetailsLoader.vue index 845f42ba..800445c5 100644 --- a/packages/vite/src/app/components/data/PackageDetailsLoader.vue +++ b/packages/vite/src/app/components/data/PackageDetailsLoader.vue @@ -19,7 +19,7 @@ const parsedPackage = computed(() => { const rpc = useRpc() const { state, isLoading } = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-package-details', { session: props.session.id, diff --git a/packages/vite/src/app/components/data/PluginDetailsLoader.vue b/packages/vite/src/app/components/data/PluginDetailsLoader.vue index 719d1d2e..e5667370 100644 --- a/packages/vite/src/app/components/data/PluginDetailsLoader.vue +++ b/packages/vite/src/app/components/data/PluginDetailsLoader.vue @@ -25,7 +25,7 @@ const route = useRoute() const rpc = useRpc() const { state, isLoading } = useAsyncState( async () => { - const res = await rpc.value.$call( + const res = await rpc.value.call( 'vite:rolldown:get-plugin-details', { session: props.session.id, diff --git a/packages/vite/src/app/composables/rpc.ts b/packages/vite/src/app/composables/rpc.ts index a6a0bfd3..af42f6f9 100644 --- a/packages/vite/src/app/composables/rpc.ts +++ b/packages/vite/src/app/composables/rpc.ts @@ -1,5 +1,5 @@ import type {} from '@vitejs/devtools' -import type { ClientRpcReturn } from '@vitejs/devtools-kit/client' +import type { DevToolsRpcClient } from '@vitejs/devtools-kit/client' import type {} from '../../node/rpc' import { useRuntimeConfig } from '#app/nuxt' import { getDevToolsRpcClient } from '@vitejs/devtools-kit/client' @@ -13,12 +13,12 @@ export const connectionState = reactive<{ error: null, }) -const rpc = shallowRef(undefined!) +const rpc = shallowRef(undefined!) export async function connect() { const runtimeConfig = useRuntimeConfig() try { - const result = await getDevToolsRpcClient({ + rpc.value = await getDevToolsRpcClient({ baseURL: [ '/.devtools/', runtimeConfig.app.baseURL, @@ -43,7 +43,6 @@ export async function connect() { }, }) - rpc.value = result.rpc connectionState.connected = true } catch (e) { diff --git a/packages/vite/src/app/pages/compare/[sessions]/index.vue b/packages/vite/src/app/pages/compare/[sessions]/index.vue index baf01aa5..922d8319 100644 --- a/packages/vite/src/app/pages/compare/[sessions]/index.vue +++ b/packages/vite/src/app/pages/compare/[sessions]/index.vue @@ -15,7 +15,7 @@ const sessions = ref([]) onMounted(async () => { isLoading.value = true - const summary = await rpc.value.$call( + const summary = await rpc.value.call( 'vite:rolldown:get-session-compare-summary', { sessions: params.sessions.split(',') }, ) diff --git a/packages/vite/src/app/pages/index.vue b/packages/vite/src/app/pages/index.vue index 74744e03..dab70052 100644 --- a/packages/vite/src/app/pages/index.vue +++ b/packages/vite/src/app/pages/index.vue @@ -32,7 +32,7 @@ const normalizedSelectedSessions = computed(() => { }) const rpc = useRpc() -const sessions = await rpc.value.$call('vite:rolldown:list-sessions') +const sessions = await rpc.value.call('vite:rolldown:list-sessions') function selectSession(session: BuildInfo) { if (selectedSessionIds.value.includes(session.id)) { diff --git a/packages/vite/src/app/pages/session/[session].vue b/packages/vite/src/app/pages/session/[session].vue index ef8ef735..bfbb57cd 100644 --- a/packages/vite/src/app/pages/session/[session].vue +++ b/packages/vite/src/app/pages/session/[session].vue @@ -82,7 +82,7 @@ useSideNav(() => { }) onMounted(async () => { - const summary = await rpc.value.$call( + const summary = await rpc.value.call( 'vite:rolldown:get-session-summary', { session: params.session }, ) diff --git a/packages/vite/src/app/pages/session/[session]/assets.vue b/packages/vite/src/app/pages/session/[session]/assets.vue index 61aea8cf..76d5f01b 100644 --- a/packages/vite/src/app/pages/session/[session]/assets.vue +++ b/packages/vite/src/app/pages/session/[session]/assets.vue @@ -52,7 +52,7 @@ const assetViewTypes = [ const rpc = useRpc() const { state: assets, isLoading } = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-assets-list', { session: props.session.id }, ) diff --git a/packages/vite/src/app/pages/session/[session]/chunks.vue b/packages/vite/src/app/pages/session/[session]/chunks.vue index af2f7a7c..860eebb8 100644 --- a/packages/vite/src/app/pages/session/[session]/chunks.vue +++ b/packages/vite/src/app/pages/session/[session]/chunks.vue @@ -37,7 +37,7 @@ const searchValue = ref<{ search: string | false }>({ const rpc = useRpc() const { state: chunks, isLoading } = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-chunks-graph', { session: props.session.id }, ) diff --git a/packages/vite/src/app/pages/session/[session]/packages.vue b/packages/vite/src/app/pages/session/[session]/packages.vue index 6745782b..9e3539ed 100644 --- a/packages/vite/src/app/pages/session/[session]/packages.vue +++ b/packages/vite/src/app/pages/session/[session]/packages.vue @@ -31,7 +31,7 @@ const packageTypeRules = [ match: /.*/, name: 'transitive', description: 'Transitive Dependencies', - icon: 'i-octicon:package-24 light:filter-invert-30!', + icon: 'i-octicon:package-24 light:filter-invert-30!', }, ] const rpc = useRpc() @@ -41,7 +41,7 @@ const searchValue = ref<{ search: string, selected: string[] }>({ }) const { state: packages, isLoading } = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-packages', { session: props.session.id }, ) diff --git a/packages/vite/src/app/pages/session/[session]/raw.vue b/packages/vite/src/app/pages/session/[session]/raw.vue index d6f0f5b4..58b428b4 100644 --- a/packages/vite/src/app/pages/session/[session]/raw.vue +++ b/packages/vite/src/app/pages/session/[session]/raw.vue @@ -12,7 +12,7 @@ const query = useRoute().query const events = useAsyncState( async () => { - return await rpc.value.$call( + return await rpc.value.call( 'vite:rolldown:get-module-raw-events', { session: props.session.id, diff --git a/packages/vite/src/nuxt.config.ts b/packages/vite/src/nuxt.config.ts index 87ec3a52..9d67c831 100644 --- a/packages/vite/src/nuxt.config.ts +++ b/packages/vite/src/nuxt.config.ts @@ -30,6 +30,8 @@ export default defineNuxtConfig({ alias: { '@vitejs/devtools-rpc': pkgPath('rpc/src'), + '@vitejs/devtools-rpc/presets/ws/server': pkgPath('rpc/src/presets/ws/server.ts'), + '@vitejs/devtools-rpc/presets/ws/client': pkgPath('rpc/src/presets/ws/client.ts'), '@vitejs/devtools-kit/client': pkgPath('kit/src/client/index.ts'), '@vitejs/devtools-kit/utils/events': pkgPath('kit/src/utils/events.ts'), '@vitejs/devtools-kit': pkgPath('kit/src/index.ts'), diff --git a/patches/@unocss__inspector.patch b/patches/@unocss__inspector.patch deleted file mode 100644 index 7aa8c231..00000000 --- a/patches/@unocss__inspector.patch +++ /dev/null @@ -1,57 +0,0 @@ -diff --git a/dist/index.d.cts b/dist/index.d.cts -new file mode 100644 -index 0000000000000000000000000000000000000000..dfda43ac9d13b9797ecf6ba74f37372095adbd47 ---- /dev/null -+++ b/dist/index.d.cts -@@ -0,0 +1,2 @@ -+export * from "/Users/antfu/i/unocss/packages-integrations/inspector/src/index.js"; -+export { default } from "/Users/antfu/i/unocss/packages-integrations/inspector/src/index.js"; -\ No newline at end of file -diff --git a/dist/index.mjs b/dist/index.mjs -index 0fb5d8feb0c3924850e0d1b01489aaf7099ec1e9..7dd9d9e00daf2ffc0e415f100d734fccfd28b622 100644 ---- a/dist/index.mjs -+++ b/dist/index.mjs -@@ -820,9 +820,9 @@ async function analyzer(modules, ctx) { - - const _dirname = typeof __dirname !== "undefined" ? __dirname : dirname(fileURLToPath(import.meta.url)); - function UnocssInspector(ctx) { -+ const baseUrl = "__unocss"; - async function configureServer(server) { - await ctx.ready; -- const baseUrl = "__unocss"; - server.middlewares.use(`/${baseUrl}`, sirv(resolve(_dirname, "../dist/client"), { - single: true, - dev: true -@@ -915,7 +915,18 @@ function UnocssInspector(ctx) { - return { - name: "unocss:inspector", - apply: "serve", -- configureServer -+ configureServer, -+ devtools: { -+ setup(ctx2) { -+ ctx2.docks.register({ -+ id: "unocss", -+ title: "UnoCSS", -+ icon: "https://unocss.dev/logo.svg", -+ type: "iframe", -+ url: `/${baseUrl}` -+ }); -+ } -+ } - }; - } - function getCircularReplacer() { -diff --git a/package.json b/package.json -index 7fcf740ef248ff716df3588302aa49e68839d9e3..28a9a284073fc89a17e5597813483424b4a2d8d0 100644 ---- a/package.json -+++ b/package.json -@@ -48,5 +48,8 @@ - "dev": "nr stub && vite", - "update-post": "vite build", - "test:attw": "attw --pack --config-path ../../.attw-esm-only.json" -+ }, -+ "devDependencies": { -+ "@vitejs/devtools-kit": "^0.0.0-alpha.10" - } - } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00fdd427..d4fb56cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -208,6 +208,9 @@ catalogs: idb-keyval: specifier: ^6.2.2 version: 6.2.2 + my-ua-parser: + specifier: ^2.0.4 + version: 2.0.4 nanovis: specifier: ^1.0.0 version: 1.0.0 @@ -264,6 +267,9 @@ catalogs: '@antfu/utils': specifier: ^9.3.0 version: 9.3.0 + '@clack/prompts': + specifier: ^0.11.0 + version: 0.11.0 stream-json: specifier: ^1.9.1 version: 1.9.1 @@ -308,6 +314,7 @@ overrides: '@jridgewell/sourcemap-codec': 1.5.0 '@nuxt/devtools': ^3.1.1 '@nuxt/kit': ^4.2.2 + '@nuxt/vite-builder': https://pkg.pr.new/@nuxt/vite-builder@33682 '@rolldown/debug': ^1.0.0-beta.54 chokidar: ^5.0.0 esbuild: ^0.27.1 @@ -317,11 +324,6 @@ overrides: semver: ^7.7.3 vite: ^8.0.0-beta.2 -patchedDependencies: - '@unocss/inspector': - hash: 8b95c4e22db546efe5357328b436b4fb0775b18a0a1e566230a087b6b2b15410 - path: patches/@unocss__inspector.patch - importers: .: @@ -519,6 +521,9 @@ importers: specifier: catalog:deps version: 8.18.3 devDependencies: + '@clack/prompts': + specifier: catalog:inlined + version: 0.11.0 '@vitejs/devtools': specifier: workspace:* version: 'link:' @@ -562,6 +567,9 @@ importers: specifier: catalog:deps version: 0.0.6 devDependencies: + my-ua-parser: + specifier: catalog:frontend + version: 2.0.4 tsdown: specifier: catalog:build version: 0.17.4(@vitejs/devtools@0.0.0-alpha.19(@pnpm/logger@1001.0.1)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.8.2)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)))(publint@0.3.16)(synckit@0.11.11)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3)) @@ -1455,8 +1463,9 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - '@nuxt/vite-builder@4.2.2': - resolution: {integrity: sha512-Bot8fpJNtHZrM4cS1iSR7bEAZ1mFLAtJvD/JOSQ6kT62F4hSFWfMubMXOwDkLK2tnn3bnAdSqGy1nLNDBCahpQ==} + '@nuxt/vite-builder@https://pkg.pr.new/@nuxt/vite-builder@33682': + resolution: {tarball: https://pkg.pr.new/@nuxt/vite-builder@33682} + version: 4.2.1 engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: nuxt: ^4.2.2 @@ -5090,6 +5099,9 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + my-ua-parser@2.0.4: + resolution: {integrity: sha512-lhPyjoce3SRNXqgozoVti8XWC6oWY/rMcXljvov9IAgHKj2ZTU3dR5iQ7jLrIj02xD4Ggn6doTi7K2pnSbjzeg==} + nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} @@ -6461,12 +6473,12 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - vite-plugin-checker@0.12.0: - resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} + vite-plugin-checker@0.11.0: + resolution: {integrity: sha512-iUdO9Pl9UIBRPAragwi3as/BXXTtRu4G12L3CMrjx+WVTd9g/MsqNakreib9M/2YRVkhZYiTEwdH2j4Dm0w7lw==} engines: {node: '>=16.11'} peerDependencies: '@biomejs/biome': '>=1.7' - eslint: '>=9.39.1' + eslint: '>=7' meow: ^13.2.0 optionator: ^0.9.4 oxlint: '>=1' @@ -7770,11 +7782,11 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/vite-builder@4.2.2(@types/node@24.10.1)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.2.2(@parcel/watcher@2.5.1)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.25)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.2(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)': + '@nuxt/vite-builder@https://pkg.pr.new/@nuxt/vite-builder@33682(@types/node@24.10.1)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.2.2(@parcel/watcher@2.5.1)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.25)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.2(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)': dependencies: '@nuxt/kit': 4.2.2(magicast@0.5.1) '@rollup/plugin-replace': 6.0.3(rollup@4.53.3) - '@vitejs/plugin-vue': 6.0.2(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.3(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': 5.1.2(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) autoprefixer: 10.4.22(postcss@8.5.6) consola: 3.4.2 @@ -7801,7 +7813,7 @@ snapshots: unenv: 2.0.0-rc.24 vite: 8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vite-node: 5.2.0(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) + vite-plugin-checker: 0.11.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)) vue: 3.5.25(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -8823,7 +8835,7 @@ snapshots: dependencies: '@unocss/core': 66.5.10 - '@unocss/inspector@66.5.10(patch_hash=8b95c4e22db546efe5357328b436b4fb0775b18a0a1e566230a087b6b2b15410)': + '@unocss/inspector@66.5.10': dependencies: '@unocss/core': 66.5.10 '@unocss/rule-utils': 66.5.10 @@ -8950,7 +8962,7 @@ snapshots: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.5.10 '@unocss/core': 66.5.10 - '@unocss/inspector': 66.5.10(patch_hash=8b95c4e22db546efe5357328b436b4fb0775b18a0a1e566230a087b6b2b15410) + '@unocss/inspector': 66.5.10 chokidar: 5.0.0 magic-string: 0.30.21 pathe: 2.0.3 @@ -9173,7 +9185,7 @@ snapshots: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.53 + '@rolldown/pluginutils': 1.0.0-beta.54 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.28.5) vite: 8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) vue: 3.5.25(typescript@5.9.3) @@ -11733,6 +11745,8 @@ snapshots: muggle-string@0.4.1: {} + my-ua-parser@2.0.4: {} + nano-spawn@2.0.0: {} nanoevents@6.0.2: {} @@ -11912,7 +11926,7 @@ snapshots: '@nuxt/nitro-server': 4.2.2(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(nuxt@4.2.2(@parcel/watcher@2.5.1)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.25)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.2(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-beta.54)(typescript@5.9.3) '@nuxt/schema': 4.2.2 '@nuxt/telemetry': 2.6.6(magicast@0.5.1) - '@nuxt/vite-builder': 4.2.2(@types/node@24.10.1)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.2.2(@parcel/watcher@2.5.1)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.25)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.2(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) + '@nuxt/vite-builder': https://pkg.pr.new/@nuxt/vite-builder@33682(@types/node@24.10.1)(eslint@9.39.2(jiti@2.6.1))(magicast@0.5.1)(nuxt@4.2.2(@parcel/watcher@2.5.1)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.25)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.2(jiti@2.6.1))(idb-keyval@6.2.2)(ioredis@5.8.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.54)(rollup@4.53.3)(terser@5.44.1)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2) '@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 c12: 3.3.2(magicast@0.5.1) @@ -13453,7 +13467,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.12.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): + vite-plugin-checker@0.11.0(eslint@9.39.2(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.0.0-beta.2(@types/node@24.10.1)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 5.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8880382b..05d7d032 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ catalogMode: prefer ignoreWorkspaceRootCheck: true - shamefullyHoist: true shellEmulator: true trustPolicy: no-downgrade @@ -9,13 +8,11 @@ packages: - packages/* - docs -patchedDependencies: - '@unocss/inspector': patches/@unocss__inspector.patch - catalogs: build: '@antfu/ni': ^28.0.0 '@nuxt/kit': ^4.2.2 + '@nuxt/vite-builder': https://pkg.pr.new/@nuxt/vite-builder@33682 '@unocss/nuxt': ^66.5.10 '@vitejs/plugin-vue': ^6.0.3 '@vueuse/nuxt': ^14.1.0 @@ -93,6 +90,7 @@ catalogs: floating-vue: ^5.2.2 fuse.js: ^7.1.0 idb-keyval: ^6.2.2 + my-ua-parser: ^2.0.4 nanovis: ^1.0.0 splitpanes: ^4.0.4 theme-vitesse: ^1.0.0 @@ -113,6 +111,7 @@ catalogs: '@iconify-json/tabler': ^1.2.23 inlined: '@antfu/utils': ^9.3.0 + '@clack/prompts': ^0.11.0 stream-json: ^1.9.1 playground: vite-plugin-vue-tracer: ^1.1.3