@vitejs/devtools 0.0.0-alpha.2 → 0.0.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,95 @@
1
+ import { a as ansis_default, c as fromNodeMiddleware, d as createDevToolsContext, i as getPort, l as sendRedirect, n as createDevToolsMiddleware, o as createApp, r as MARK_NODE, s as eventHandler, t as DevTools, u as toNodeListener } from "./plugins-DfJlAQ2j.js";
2
+ import { t as dirClientStandalone } from "./dirs-C0s1Ghvy.js";
3
+ import process from "node:process";
4
+ import { existsSync } from "node:fs";
5
+ import sirv from "sirv";
6
+ import { resolveConfig } from "vite";
7
+ import fs from "node:fs/promises";
8
+ import { createServer } from "node:http";
9
+ import open from "open";
10
+ import { join, relative, resolve } from "pathe";
11
+
12
+ //#region src/node/standalone.ts
13
+ async function startStandaloneDevTools(options = {}) {
14
+ const { cwd = process.cwd(), command = "build", mode = "production" } = options;
15
+ const resolved = await resolveConfig({
16
+ configFile: options.config,
17
+ root: cwd,
18
+ plugins: [DevTools()]
19
+ }, command, mode);
20
+ dedupeVitePlugins(resolved.plugins, (plugin) => plugin.name?.startsWith("vite:devtools"));
21
+ return {
22
+ config: resolved,
23
+ context: await createDevToolsContext(resolved)
24
+ };
25
+ }
26
+ function dedupeVitePlugins(plugins, include) {
27
+ const toDelete = [];
28
+ const map = /* @__PURE__ */ new Map();
29
+ for (let i = 0; i < plugins.length; i++) {
30
+ const plugin = plugins[i];
31
+ if (!plugin || !include(plugin)) continue;
32
+ if (map.has(plugin.name)) toDelete.push(i);
33
+ else map.set(plugin.name, plugin);
34
+ }
35
+ toDelete.sort((a, b) => b - a);
36
+ for (const i of toDelete) plugins.splice(i, 1);
37
+ return plugins;
38
+ }
39
+
40
+ //#endregion
41
+ //#region src/node/cli-commands.ts
42
+ async function start(options) {
43
+ const { host } = options;
44
+ const port = await getPort({
45
+ host,
46
+ port: options.port == null ? void 0 : +options.port,
47
+ portRange: [9999, 15e3]
48
+ });
49
+ const devtools = await startStandaloneDevTools({ cwd: options.root });
50
+ const { h3 } = await createDevToolsMiddleware({
51
+ cwd: devtools.config.root,
52
+ context: devtools.context
53
+ });
54
+ const app = createApp();
55
+ for (const { baseUrl, distDir } of devtools.context.views.buildStaticDirs) app.use(baseUrl, fromNodeMiddleware(sirv(distDir, {
56
+ dev: true,
57
+ single: true
58
+ })));
59
+ app.use("/.devtools/", h3.handler);
60
+ app.use("/", eventHandler(async (event) => {
61
+ if (event.node.req.url === "/") return sendRedirect(event, "/.devtools/");
62
+ }));
63
+ createServer(toNodeListener(app)).listen(port, host, async () => {
64
+ console.log(ansis_default.green`${MARK_NODE} Vite DevTools started at`, ansis_default.green(`http://${host === "127.0.0.1" ? "localhost" : host}:${port}`), "\n");
65
+ if (options.open) await open(`http://${host === "127.0.0.1" ? "localhost" : host}:${port}`);
66
+ });
67
+ }
68
+ async function build(options) {
69
+ console.log(ansis_default.cyan`${MARK_NODE} Building static Vite DevTools...`);
70
+ const devtools = await startStandaloneDevTools({
71
+ cwd: options.root,
72
+ config: options.config
73
+ });
74
+ const outDir = resolve(devtools.config.root, options.outDir);
75
+ if (existsSync(outDir)) await fs.rm(outDir, { recursive: true });
76
+ const devToolsRoot = join(outDir, ".devtools");
77
+ await fs.mkdir(devToolsRoot, { recursive: true });
78
+ await fs.cp(dirClientStandalone, devToolsRoot, { recursive: true });
79
+ for (const { baseUrl, distDir } of devtools.context.views.buildStaticDirs) {
80
+ console.log(ansis_default.cyan`${MARK_NODE} Copying static files from ${distDir} to ${join(outDir, baseUrl)}`);
81
+ await fs.mkdir(join(outDir, baseUrl), { recursive: true });
82
+ await fs.cp(distDir, join(outDir, baseUrl), { recursive: true });
83
+ }
84
+ await fs.mkdir(resolve(devToolsRoot, "api"), { recursive: true });
85
+ await fs.writeFile(resolve(devToolsRoot, ".vdt-connection.json"), JSON.stringify({ backend: "static" }, null, 2), "utf-8");
86
+ console.log(ansis_default.cyan`${MARK_NODE} Writing RPC dump to ${resolve(devToolsRoot, ".vdt-rpc-dump.json")}`);
87
+ const dump = {};
88
+ for (const [key, value] of Object.entries(devtools.context.rpc.functions)) if (value.type === "static") dump[key] = await value.handler?.();
89
+ await fs.writeFile(resolve(devToolsRoot, ".vdt-rpc-dump.json"), JSON.stringify(dump, null, 2), "utf-8");
90
+ console.log(ansis_default.green`${MARK_NODE} Built to ${relative(devtools.config.root, outDir)}`);
91
+ throw new Error("[Vite DevTools] Build mode of Vite DevTools is not yet complete");
92
+ }
93
+
94
+ //#endregion
95
+ export { start as n, build as t };
@@ -0,0 +1,18 @@
1
+ //#region src/node/cli-commands.d.ts
2
+ interface StartOptions {
3
+ root?: string;
4
+ config?: string;
5
+ host: string;
6
+ port?: string | number;
7
+ open?: boolean;
8
+ }
9
+ declare function start(options: StartOptions): Promise<void>;
10
+ interface BuildOptions {
11
+ root: string;
12
+ config?: string;
13
+ outDir: string;
14
+ base: string;
15
+ }
16
+ declare function build(options: BuildOptions): Promise<void>;
17
+ //#endregion
18
+ export { BuildOptions, StartOptions, build, start };
@@ -0,0 +1,4 @@
1
+ import "./plugins-DfJlAQ2j.js";
2
+ import { n as start, t as build } from "./cli-commands-BBPbCd8A.js";
3
+
4
+ export { build, start };
package/dist/cli.js CHANGED
@@ -1,82 +1,15 @@
1
- import { MARK_NODE, ansis_default, createApp, createDevToolsContext, createDevToolsMiddleware, eventHandler, getPort, sendRedirect, toNodeListener } from "./server-B_q0HJ88.js";
2
- import { dirClientStandalone } from "./dirs-B7dOX6eI.js";
3
- import { existsSync } from "node:fs";
1
+ import "./plugins-DfJlAQ2j.js";
2
+ import { n as start, t as build } from "./cli-commands-BBPbCd8A.js";
4
3
  import process from "node:process";
5
- import { loadConfigFromFile, resolveConfig } from "vite";
6
- import fs from "node:fs/promises";
7
- import { createServer } from "node:http";
8
4
  import cac from "cac";
9
- import open from "open";
10
- import { join, relative, resolve } from "pathe";
11
5
 
12
- //#region src/node/standalone.ts
13
- async function startStandaloneDevTools(options = {}) {
14
- const { cwd = process.cwd(), command = "build", mode = "production" } = options;
15
- const loaded = await loadConfigFromFile({
16
- command,
17
- mode
18
- }, options.config, cwd);
19
- const resolved = await resolveConfig(loaded?.config || {}, command, mode);
20
- const context = await createDevToolsContext(resolved);
21
- return {
22
- config: resolved,
23
- context
24
- };
25
- }
26
-
27
- //#endregion
28
6
  //#region src/node/cli.ts
29
7
  const cli = cac("vite-devtools");
30
8
  process.on("SIGINT", () => {
31
9
  process.exit(0);
32
10
  });
33
- cli.command("build", "Build devtools with current config file for static hosting").option("--root <root>", "Root directory", { default: process.cwd() }).option("--config <config>", "Vite config file").option("--base <baseURL>", "Base URL for deployment", { default: "/" }).option("--outDir <dir>", "Output directory", { default: ".vite-devtools" }).action(async (options) => {
34
- console.log(ansis_default.cyan`${MARK_NODE} Building static Vite DevTools...`);
35
- const devtools = await startStandaloneDevTools({
36
- cwd: options.root,
37
- config: options.config
38
- });
39
- const outDir = resolve(devtools.config.root, options.outDir);
40
- if (existsSync(outDir)) await fs.rm(outDir, { recursive: true });
41
- const devToolsRoot = join(outDir, "__vite_devtools__");
42
- await fs.mkdir(devToolsRoot, { recursive: true });
43
- await fs.cp(dirClientStandalone, devToolsRoot, { recursive: true });
44
- for (const { baseUrl, distDir } of devtools.context.staticDirs) {
45
- console.log(ansis_default.cyan`${MARK_NODE} Copying static files from ${distDir} to ${join(outDir, baseUrl)}`);
46
- await fs.mkdir(join(outDir, baseUrl), { recursive: true });
47
- await fs.cp(distDir, join(outDir, baseUrl), { recursive: true });
48
- }
49
- await fs.mkdir(resolve(devToolsRoot, "api"), { recursive: true });
50
- await fs.writeFile(resolve(devToolsRoot, "api/connection.json"), JSON.stringify({ backend: "static" }, null, 2), "utf-8");
51
- console.log(ansis_default.cyan`${MARK_NODE} Writing RPC dump to ${resolve(devToolsRoot, "api/rpc-dump.json")}`);
52
- const dump = {};
53
- for (const [key, value] of Object.entries(devtools.context.rpc.functions)) if (value.type === "static") dump[key] = await value.handler?.();
54
- await fs.writeFile(resolve(devToolsRoot, "api/rpc-dump.json"), JSON.stringify(dump, null, 2), "utf-8");
55
- console.log(ansis_default.green`${MARK_NODE} Built to ${relative(devtools.config.root, outDir)}`);
56
- throw new Error("[Vite DevTools] Build mode of Vite DevTools is not yet complete");
57
- });
58
- cli.command("", "Start devtools").option("--root <root>", "Root directory", { default: process.cwd() }).option("--config <config>", "Vite config file").option("--host <host>", "Host", { default: process.env.HOST || "127.0.0.1" }).option("--port <port>", "Port", { default: process.env.PORT || 9999 }).option("--open", "Open browser", { default: true }).action(async (options) => {
59
- const host = options.host;
60
- const port = await getPort({
61
- port: options.port,
62
- portRange: [9999, 15e3],
63
- host
64
- });
65
- const devtools = await startStandaloneDevTools({ cwd: options.root });
66
- const { h3 } = await createDevToolsMiddleware({
67
- cwd: devtools.config.root,
68
- context: devtools.context
69
- });
70
- const app = createApp();
71
- app.use("/__vite_devtools__", h3.handler);
72
- app.use("/", eventHandler(async (event) => {
73
- return sendRedirect(event, "/__vite_devtools__/");
74
- }));
75
- createServer(toNodeListener(app)).listen(port, host, async () => {
76
- console.log(ansis_default.green`${MARK_NODE} Vite DevTools started at`, ansis_default.green(`http://${host === "127.0.0.1" ? "localhost" : host}:${port}`), "\n");
77
- if (options.open) await open(`http://${host === "127.0.0.1" ? "localhost" : host}:${port}`);
78
- });
79
- });
11
+ cli.command("build", "Build devtools with current config file for static hosting").option("--root <root>", "Root directory", { default: process.cwd() }).option("--config <config>", "Vite config file").option("--base <baseURL>", "Base URL for deployment", { default: "/" }).option("--outDir <dir>", "Output directory", { default: ".vite-devtools" }).action(build);
12
+ cli.command("", "Start devtools").option("--root <root>", "Root directory", { default: process.cwd() }).option("--config <config>", "Vite config file").option("--host <host>", "Host", { default: process.env.HOST || "127.0.0.1" }).option("--port <port>", "Port", { default: process.env.PORT || 9999 }).option("--open", "Open browser", { default: true }).action(start);
80
13
  cli.help();
81
14
  cli.parse();
82
15
 
@@ -1,29 +1,101 @@
1
- import { useLocalStorage } from "../core-uTAXYiA1.js";
1
+ import { A as watchEffect, F as ref, L as toRefs, N as markRaw, P as reactive, m as computed, n as createDockEntryState, o as useLocalStorage, r as useDocksEntries, t as DEFAULT_DOCK_PANEL_STORE } from "../docks-B3cDUs1u.js";
2
2
  import { getDevToolsRpcClient } from "@vitejs/devtools-kit/client";
3
3
 
4
+ //#region src/client/webcomponents/state/setup-script.ts
5
+ function _executeSetupScript(entry, context) {
6
+ const id = `${entry.type}:${entry.id}`;
7
+ return import(
8
+ /* @vite-ignore */
9
+ ["/.devtools", "imports"].join("-")
10
+ ).then((module) => {
11
+ const importFn = module.importsMap[id];
12
+ if (!importFn) return Promise.reject(/* @__PURE__ */ new Error(`[VITE DEVTOOLS] No import found for id: ${id}`));
13
+ return importFn().then((fn) => fn(context));
14
+ }).catch((error) => {
15
+ console.error("[VITE DEVTOOLS] Error executing import action", error);
16
+ return Promise.reject(error);
17
+ });
18
+ }
19
+ const _setupPromises = /* @__PURE__ */ new Map();
20
+ function executeSetupScript(entry, context) {
21
+ if (_setupPromises.has(entry.id)) return _setupPromises.get(entry.id);
22
+ const promise = _executeSetupScript(entry, context);
23
+ _setupPromises.set(entry.id, promise);
24
+ return promise;
25
+ }
26
+
27
+ //#endregion
28
+ //#region src/client/webcomponents/state/context.ts
29
+ let _docksContext;
30
+ async function createDocksContext(clientType, rpc, panelStore) {
31
+ if (_docksContext) return _docksContext;
32
+ const selectedId = ref(null);
33
+ const dockEntries = await useDocksEntries(rpc);
34
+ const selected = computed(() => dockEntries.value.find((entry) => entry.id === selectedId.value) ?? null);
35
+ const dockEntryStateMap = reactive(/* @__PURE__ */ new Map());
36
+ watchEffect(() => {
37
+ for (const entry of dockEntries.value) {
38
+ if (dockEntryStateMap.has(entry.id)) {
39
+ dockEntryStateMap.get(entry.id).entryMeta = entry;
40
+ continue;
41
+ }
42
+ dockEntryStateMap.set(entry.id, createDockEntryState(entry, selected));
43
+ }
44
+ });
45
+ panelStore ||= ref(DEFAULT_DOCK_PANEL_STORE());
46
+ _docksContext = reactive({
47
+ panel: {
48
+ store: panelStore,
49
+ isDragging: false,
50
+ isResizing: false,
51
+ isVertical: computed(() => panelStore.value.position === "left" || panelStore.value.position === "right")
52
+ },
53
+ docks: {
54
+ selectedId,
55
+ selected,
56
+ entries: dockEntries,
57
+ entryToStateMap: markRaw(dockEntryStateMap),
58
+ getStateById: (id) => dockEntryStateMap.get(id),
59
+ switchEntry: async (id = null) => {
60
+ if (id == null) {
61
+ selectedId.value = null;
62
+ return true;
63
+ }
64
+ const entry = dockEntries.value.find((e) => e.id === id);
65
+ if (!entry) return false;
66
+ if (entry.type === "action" || entry.type === "custom-render" || entry.type === "iframe" && entry.clientScript) {
67
+ const current = dockEntryStateMap.get(id);
68
+ await executeSetupScript(entry, reactive({
69
+ ...toRefs(_docksContext),
70
+ current
71
+ }));
72
+ }
73
+ selectedId.value = entry.id;
74
+ panelStore.value.open = true;
75
+ return true;
76
+ }
77
+ },
78
+ rpc,
79
+ clientType
80
+ });
81
+ return _docksContext;
82
+ }
83
+
84
+ //#endregion
4
85
  //#region src/client/inject/index.ts
5
86
  async function init() {
6
87
  console.log("[VITE DEVTOOLS] Client injected");
7
- const { rpc } = await getDevToolsRpcClient();
8
- console.log("[VITE DEVTOOLS] RPC", rpc);
9
- const docks = await rpc["vite:core:list-dock-entries"]();
10
- console.log("[VITE DEVTOOLS] Docks", docks);
11
- const rpcFunctions = await rpc["vite:core:list-rpc-functions"]();
12
- console.log("[VITE DEVTOOLS] RPC Functions", rpcFunctions);
13
- const state = useLocalStorage("vite-devtools-dock-state", {
88
+ const context = await createDocksContext("embedded", await getDevToolsRpcClient(), useLocalStorage("vite-devtools-dock-state", {
14
89
  width: 80,
15
90
  height: 80,
16
91
  top: 0,
17
92
  left: 0,
18
93
  position: "left",
19
94
  open: false,
20
- minimizePanelInactive: 3e3
21
- }, { mergeDefaults: true });
95
+ inactiveTimeout: 3e3
96
+ }, { mergeDefaults: true }));
22
97
  const { DockEmbedded } = await import("@vitejs/devtools/client/webcomponents");
23
- const dockEl = new DockEmbedded({
24
- state,
25
- docks
26
- });
98
+ const dockEl = new DockEmbedded({ context });
27
99
  document.body.appendChild(dockEl);
28
100
  }
29
101
  if (window.parent !== window) console.log("[VITE DEVTOOLS] Skipping in iframe");
@@ -0,0 +1 @@
1
+ *,:before,:after{box-sizing:border-box;border-style:solid;border-width:0;border-color:var(--un-default-border-color,#e5e7eb)}:before,:after{--un-content:""}html,: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,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]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration: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,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:#0000;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,textarea::placeholder{opacity:1;color:#9ca3af}button,[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}html,body,#app{height:100%;margin:0;padding:0}html.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}: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,Helvetica Neue,Arial,Noto Sans,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;-webkit-user-select:none;user-select:none;--vdt-backdrop-blur:blur(5px);height:40px;-webkit-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);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:rgb(255 255 255/var(--vdt-text-opacity));--vdt-shadow:var(--vdt-shadow-inset)0 1px 3px 0 var(--vdt-shadow-color,#0000001a),var(--vdt-shadow-inset)0 1px 2px -1px var(--vdt-shadow-color,#0000001a);box-shadow:var(--vdt-ring-offset-shadow),var(--vdt-ring-shadow),var(--vdt-shadow);width:calc-size(max-content,size);background-color:#ffffff80;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:#11111180}}#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);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;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;border-radius:.375rem;width:10px;margin-left:-5px;margin-right:-5px;position:absolute;top:6px;bottom:0}.vite-devtools-resize-handle-corner{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:#9ca3af1a}*,:before,:after,::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 #0000;--vdt-ring-shadow:0 0 #0000;--vdt-shadow-inset: ;--vdt-shadow:0 0 #0000;--vdt-ring-inset: ;--vdt-ring-offset-width:0px;--vdt-ring-offset-color:#fff;--vdt-ring-width:0px;--vdt-ring-color:#93c5fd80;--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;-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;-webkit-mask-size:100% 100%;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;-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;-webkit-mask-size:100% 100%;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;-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;-webkit-mask-size:100% 100%;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;-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;-webkit-mask-size:100% 100%;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;-webkit-mask:var(--vdt-icon)no-repeat;mask:var(--vdt-icon)no-repeat;color:inherit;background-color:currentColor;width:1em;height:1em;-webkit-mask-size:100% 100%;mask-size:100% 100%}.container{width:100%}.border-base{--vdt-border-opacity:.13;border-color:rgb(136 136 136/var(--vdt-border-opacity))}.bg-active,.hover\:bg-active:hover{--vdt-bg-opacity:.07;background-color:rgb(136 136 136/var(--vdt-bg-opacity))}@media (width>=640px){.container{max-width:640px}}@media (width>=768px){.container{max-width:768px}}@media (width>=1024px){.container{max-width:1024px}}@media (width>=1280px){.container{max-width:1280px}}@media (width>=1536px){.container{max-width:1536px}}.pointer-events-auto{pointer-events:auto}.disabled\:pointer-events-none:disabled{pointer-events:none}.relative{position:relative}.z--1{z-index:-1}.grid{display:grid}.cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.grid-rows-\[max-content_1fr\]{grid-template-rows:max-content 1fr}.m-auto,.ma{margin:auto}.h-10{height:2.5rem}.h-5{height:1.25rem}.h-7{height:1.75rem}.h-full{height:100%}.h-screen{height:100vh}.h1{height:.25rem}.w-10{width:2.5rem}.w-5{width:1.25rem}.w-7{width:1.75rem}.w-full{width:100%}.w-screen{width:100vw}.flex{display:flex}.flex-col{flex-direction:column}.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,.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))}.select-none{-webkit-user-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}.of-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.rounded{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.bg-black{--vdt-bg-opacity:1;background-color:rgb(0 0 0/var(--vdt-bg-opacity))}.bg-lime6{--vdt-bg-opacity:1;background-color:rgb(101 163 13/var(--vdt-bg-opacity))}.hover\:bg-\[\#8881\]:hover{--vdt-bg-opacity:.07;background-color:rgb(136 136 136/var(--vdt-bg-opacity))}.hover\:bg-lime7:hover{--vdt-bg-opacity:1;background-color:rgb(77 124 15/var(--vdt-bg-opacity))}.disabled\:bg-gray6\!:disabled{--vdt-bg-opacity:1!important;background-color:rgb(75 85 99/var(--vdt-bg-opacity))!important}.p1\.5{padding:.375rem}.p2{padding:.5rem}.px3{padding-left:.75rem;padding-right:.75rem}.px4{padding-left:1rem;padding-right:1rem}.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-purple{--vdt-text-opacity:1;color:rgb(192 132 252/var(--vdt-text-opacity))}.font-bold{font-weight:700}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.tab{tab-size:4}.op50{opacity:.5}.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,-webkit-backdrop-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)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@media (prefers-color-scheme:dark){.dark\:bg-black{--vdt-bg-opacity:1;background-color:rgb(0 0 0/var(--vdt-bg-opacity))}.dark\:text-white{--vdt-text-opacity:1;color:rgb(255 255 255/var(--vdt-text-opacity))}}