@joycostudio/studio 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js CHANGED
@@ -11,38 +11,26 @@ import {
11
11
  PlugZap,
12
12
  Unplug
13
13
  } from "lucide-react";
14
- import { useEffect as useEffect5, useRef as useRef3, useState as useState9 } from "react";
14
+ import { useEffect as useEffect6, useRef as useRef3, useState as useState10 } from "react";
15
15
 
16
16
  // package.json
17
- var version = "0.1.5";
17
+ var version = "0.2.0";
18
+
19
+ // src/client/studio.ts
20
+ import { button } from "@joycostudio/xyz/debug";
21
+
22
+ // src/client/share.ts
23
+ async function copyLink(url) {
24
+ if (navigator.clipboard?.writeText) return navigator.clipboard.writeText(url);
25
+ window.prompt("Copy this link", url);
26
+ }
18
27
 
19
28
  // src/client/studio.ts
20
- import {
21
- button,
22
- schemaValues
23
- } from "@joycostudio/xyz/debug";
24
29
  var COMPARE_MESSAGE = "joyco-studio:compare";
25
30
  function postCompare(target, tool, showSaved) {
26
31
  const message = { type: COMPARE_MESSAGE, tool, showSaved };
27
32
  target?.postMessage(message, location.origin);
28
33
  }
29
- function resetSlidersOnDoubleClick(handle) {
30
- return (folder, { fields }) => {
31
- const sliders = fields().filter(({ field }) => field.kind === "slider");
32
- const onDoubleClick = (event) => {
33
- if (handle.comparing || event.target.closest("input")) return;
34
- const slider = sliders.find(({ blade }) => blade.element.contains(event.target));
35
- if (slider?.field.kind !== "slider") return;
36
- const saved = slider.path.reduce(
37
- (values, key) => values?.[key],
38
- schemaValues(handle.definition.controls(structuredClone(handle.saved)))
39
- );
40
- if (typeof saved === "number") slider.field.write(saved);
41
- };
42
- folder.element.addEventListener("dblclick", onDoubleClick);
43
- return () => folder.element.removeEventListener("dblclick", onDoubleClick);
44
- };
45
- }
46
34
  function everyFrame(refresh) {
47
35
  let frame = requestAnimationFrame(function tick() {
48
36
  refresh();
@@ -73,73 +61,12 @@ function useToolConfig(handle) {
73
61
 
74
62
  // src/react/inspector.tsx
75
63
  import { bindDebugSchema } from "@joycostudio/xyz/debug";
76
- import { SquareSplitHorizontal } from "lucide-react";
77
- import { useEffect, useRef, useState as useState2 } from "react";
64
+ import { Check, Link, SquareSplitHorizontal } from "lucide-react";
65
+ import { useEffect as useEffect2, useRef, useState as useState3 } from "react";
78
66
 
79
- // src/react/theme.ts
80
- var tweakpaneTheme = {
81
- "--tp-base-background-color": "transparent",
82
- "--tp-base-shadow-color": "transparent",
83
- "--tp-base-border-radius": "0px",
84
- "--tp-base-font-family": "var(--studio-font)",
85
- "--tp-blade-border-radius": "var(--radius)",
86
- "--tp-blade-horizontal-padding": "4px",
87
- "--tp-blade-value-width": "168px",
88
- "--tp-container-horizontal-padding": "8px",
89
- "--tp-container-vertical-padding": "6px",
90
- "--tp-container-unit-size": "22px",
91
- "--tp-container-unit-spacing": "6px",
92
- "--tp-container-background-color": "var(--card)",
93
- "--tp-container-background-color-hover": "var(--field)",
94
- "--tp-container-background-color-focus": "var(--field-hover)",
95
- "--tp-container-background-color-active": "var(--field-active)",
96
- "--tp-container-foreground-color": "var(--muted-foreground)",
97
- "--tp-input-background-color": "var(--field)",
98
- "--tp-input-background-color-hover": "var(--field-hover)",
99
- "--tp-input-background-color-focus": "var(--field-active)",
100
- "--tp-input-background-color-active": "var(--field-active)",
101
- "--tp-input-foreground-color": "var(--foreground)",
102
- // Buttons and slider knobs: lighter than fields so the knob reads against the track.
103
- "--tp-button-background-color": "var(--knob)",
104
- "--tp-button-background-color-hover": "var(--knob-hover)",
105
- "--tp-button-background-color-focus": "var(--knob-hover)",
106
- "--tp-button-background-color-active": "var(--muted-foreground)",
107
- "--tp-button-foreground-color": "var(--foreground)",
108
- "--tp-groove-foreground-color": "var(--border)",
109
- "--tp-label-foreground-color": "var(--muted-foreground)",
110
- "--tp-monitor-background-color": "var(--card)",
111
- "--tp-monitor-foreground-color": "var(--muted-foreground)"
112
- };
113
-
114
- // src/react/tool-icon.tsx
115
- import { SlidersHorizontal } from "lucide";
116
- import { jsx } from "react/jsx-runtime";
117
- var camel = (name) => name.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
118
- function ToolIcon({ icon = SlidersHorizontal, ...props }) {
119
- return /* @__PURE__ */ jsx(
120
- "svg",
121
- {
122
- viewBox: "0 0 24 24",
123
- fill: "none",
124
- stroke: "currentColor",
125
- strokeWidth: 2,
126
- strokeLinecap: "round",
127
- strokeLinejoin: "round",
128
- "aria-hidden": true,
129
- ...props,
130
- children: icon.map(([Tag, attrs], index) => {
131
- const Element = Tag;
132
- return /* @__PURE__ */ jsx(
133
- Element,
134
- {
135
- ...Object.fromEntries(Object.entries(attrs).map(([name, value]) => [camel(name), value]))
136
- },
137
- index
138
- );
139
- })
140
- }
141
- );
142
- }
67
+ // src/react/changes.tsx
68
+ import { ArrowRight, ChevronUp, Undo2 } from "lucide-react";
69
+ import { useEffect, useId, useState as useState2 } from "react";
143
70
 
144
71
  // src/react/ui/button.tsx
145
72
  import { cva } from "class-variance-authority";
@@ -153,7 +80,7 @@ function cn(...inputs) {
153
80
 
154
81
  // src/react/ui/button.tsx
155
82
  import { Slot } from "radix-ui";
156
- import { jsx as jsx2 } from "react/jsx-runtime";
83
+ import { jsx } from "react/jsx-runtime";
157
84
  var buttonVariants = cva(
158
85
  "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
159
86
  {
@@ -191,7 +118,7 @@ function Button({
191
118
  ...props
192
119
  }) {
193
120
  const Comp = asChild ? Slot.Root : "button";
194
- return /* @__PURE__ */ jsx2(
121
+ return /* @__PURE__ */ jsx(
195
122
  Comp,
196
123
  {
197
124
  "data-slot": "button",
@@ -203,27 +130,6 @@ function Button({
203
130
  );
204
131
  }
205
132
 
206
- // src/react/ui/kbd.tsx
207
- import { jsx as jsx3 } from "react/jsx-runtime";
208
- function Kbd({ className, ...props }) {
209
- return /* @__PURE__ */ jsx3(
210
- "kbd",
211
- {
212
- "data-slot": "kbd",
213
- className: cn(
214
- "bg-muted text-muted-foreground border-border pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm border border-b-2 px-1 font-mono text-xs font-normal select-none",
215
- "[&_svg:not([class*='size-'])]:size-3",
216
- "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
217
- className
218
- ),
219
- ...props
220
- }
221
- );
222
- }
223
- function KbdGroup({ className, ...props }) {
224
- return /* @__PURE__ */ jsx3("span", { "data-slot": "kbd-group", className: cn("inline-flex items-center gap-1", className), ...props });
225
- }
226
-
227
133
  // src/react/ui/tooltip.tsx
228
134
  import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
229
135
 
@@ -233,7 +139,7 @@ import { createPortal } from "react-dom";
233
139
 
234
140
  // src/react/generated/studio.css
235
141
  var studio_default = `/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
236
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--color-sky-400:oklch(74.6% .16 232.661);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--radius-xs:.125rem;--radius-lg:calc(var(--radius) + 2px);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--studio-font);--default-mono-font-family:var(--studio-font);--color-border:var(--border);--color-sidebar:var(--sidebar)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--foreground)}}@layer components{.studio-surface{border-radius:calc(var(--radius) - 2px);background:var(--card);padding:6px}.studio-toolbar{pointer-events:auto;flex-wrap:wrap;align-items:center;gap:4px;display:flex}.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]{border-radius:calc(var(--radius) - 2px);min-height:28px;color:var(--muted-foreground);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;align-items:center;gap:6px;padding:4px 8px;font-size:11px;display:inline-flex}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):hover{color:var(--foreground);background:var(--field-hover)}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):is(:active,[aria-pressed=true]){color:var(--foreground);background:var(--field-active)}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):focus-visible{outline:2px solid var(--ring);outline-offset:2px}.studio-canvas-toolbar{z-index:20;min-width:0;color:var(--muted-foreground);pointer-events:none;flex-shrink:0;position:relative}.studio-canvas-actions{opacity:1;transition:opacity .2s ease-out,translate .2s ease-out;translate:0}.studio-canvas-toolbar[data-ghost]{position:absolute;inset:4px 4px auto}.studio-canvas-toolbar[data-ghost]:before{content:"";pointer-events:auto;height:24px;position:absolute;inset:-4px 0 auto}.studio-canvas-toolbar[data-ghost] .studio-canvas-actions{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);opacity:0;transition-delay:3s;translate:0 calc(-100% - 8px)}.studio-canvas-toolbar[data-ghost]:is(:hover,:has(:focus-visible,[aria-expanded=true],[data-state=open])) .studio-canvas-actions{opacity:1;transition-delay:0s;translate:0}@media (hover:none){.studio-canvas-toolbar[data-ghost] .studio-canvas-actions{opacity:1;translate:0}}.studio-canvas-toolbar[data-expanded]{height:80px;position:absolute;inset:0 0 auto}.studio-canvas-toolbar[data-expanded] .studio-canvas-actions{pointer-events:none;background:0 0;height:100%;padding:0}.studio-canvas-toolbar[data-expanded] .studio-canvas-actions>:not(.studio-canvas-toggle){display:none}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle{width:min(280px,100%);height:100%;padding-top:max(12px, env(safe-area-inset-top));pointer-events:auto;justify-content:center;align-items:flex-start;margin-inline:auto;display:flex}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{border-color:var(--sidebar-border);border-radius:var(--radius);min-height:30px;color:var(--foreground);background:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);font-size:inherit;opacity:0;transition:opacity .2s ease-out 3s,translate .2s ease-out 3s;translate:0 -8px;box-shadow:0 4px 12px #0006}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button:hover{background:var(--field-hover)}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle:hover>button,.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button:focus-visible{opacity:1;transition-delay:0s;translate:0}@media (hover:none){.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{opacity:1;translate:0}}@media (prefers-reduced-motion:reduce){.studio-canvas-actions,.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{transition-duration:0s}}.studio-preview-canvas{border:1px solid var(--sidebar-border);border-radius:calc(var(--radius) + 2px);background:var(--sidebar);flex-direction:column;gap:4px;min-width:0;min-height:0;padding:4px;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.studio-preview-canvas{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}.studio-preview-canvas{font:12px/1.5 var(--studio-font);box-shadow:0 12px 24px #0006}.studio-preview-source{align-items:center;min-width:0;margin-right:auto;display:flex}.studio-preview-title{padding-inline:8px}.studio-preview-canvas>iframe{border-radius:calc(var(--radius) - 2px);background:var(--background);border:0;flex:1;width:100%;min-height:0}.studio-preview-canvas[data-expanded]{z-index:30;background:var(--background);border:0;border-radius:0;padding:0;position:fixed;inset:0}.studio-preview-canvas[data-expanded]>iframe{border-radius:0}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-2{inset-block:calc(var(--spacing) * 2)}.-top-0\\.5{top:calc(var(--spacing) * -.5)}.top-0{top:0}.top-1\\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.-right-0\\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:var(--spacing)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mt-1{margin-top:var(--spacing)}.mt-auto{margin-top:auto}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-auto{height:auto}.h-full{height:100%}.h-svh{height:100svh}.max-h-\\(--available-height\\){max-height:var(--available-height)}.max-h-\\[300px\\]{max-height:300px}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-svh{min-height:100svh}.w-\\(--sidebar-width\\){width:var(--sidebar-width)}.w-\\(--studio-inspector-width\\){width:var(--studio-inspector-width)}.w-3\\/4{width:75%}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-full{max-width:100%}.min-w-\\(--anchor-width\\){min-width:var(--anchor-width)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-translate-x-\\[calc\\(100\\%\\+0\\.25rem\\)\\]{--tw-translate-x:calc(calc(100% + .25rem) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-\\[calc\\(100\\%\\+1rem\\)\\]{--tw-translate-x:calc(calc(100% + 1rem) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\\[calc\\(100\\%\\+0\\.25rem\\)\\]{--tw-translate-x:calc(100% + .25rem);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\\[calc\\(100\\%\\+1rem\\)\\]{--tw-translate-x:calc(100% + 1rem);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\\[calc\\(-50\\%-2px\\)\\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.scroll-py-1{scroll-padding-block:var(--spacing)}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.place-items-center{place-items:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\\[2px\\]{border-radius:2px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.bg-\\(--field\\){background-color:var(--field)}.bg-background{background-color:var(--background)}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-current{background-color:currentColor}.bg-destructive{background-color:var(--destructive)}.bg-foreground{background-color:var(--foreground)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar,.bg-sidebar\\/85{background-color:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.bg-sidebar\\/85{background-color:color-mix(in oklab, var(--sidebar) 85%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.fill-foreground{fill:var(--foreground)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pt-2\\.5{padding-top:calc(var(--spacing) * 2.5)}.pr-0{padding-right:0}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5\\.5{padding-left:calc(var(--spacing) * 5.5)}.text-center{text-align:center}.text-left{text-align:left}.font-\\(family-name\\:--studio-font\\),.font-mono{font-family:var(--studio-font)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\\[0\\.08em\\]{--tw-tracking:.08em;letter-spacing:.08em}.text-balance{text-wrap:balance}.text-clip\\!{text-overflow:clip!important}.whitespace-nowrap{white-space:nowrap}.text-background{color:var(--background)}.text-destructive{color:var(--destructive)}.text-faint{color:var(--faint)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-sidebar-primary{color:var(--sidebar-primary)}.text-sky-400{color:var(--color-sky-400)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[left\\,right\\,width\\,translate\\]{transition-property:left,right,width,translate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[padding\\]{transition-property:padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[translate\\,opacity\\]{transition-property:translate,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}.group-focus-within\\/menu-item\\:opacity-100:is(:where(.group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\\/edge\\:translate-x-0:is(:where(.group\\/edge):hover *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\\/edge\\:opacity-100:is(:where(.group\\/edge):hover *),.group-hover\\/menu-item\\:opacity-100:is(:where(.group\\/menu-item):hover *){opacity:1}}.group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8:is(:where(.group\\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)))}.group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px)}.group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\\[collapsible\\=icon\\]\\:pl-\\[calc\\(1\\.5rem-0\\.875rem\\*352\\/144\\/2\\)\\]:is(:where(.group)[data-collapsible=icon] *){padding-left:.430556rem}.group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\\[side\\=left\\]\\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\\[side\\=right\\]\\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\\[side\\=right\\]\\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.peer\\/menu-button)[data-active=true]~*){color:var(--sidebar-accent-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}@media (hover:hover){.hover\\:bg-\\(--field-hover\\):hover{background-color:var(--field-hover)}.hover\\:bg-accent:hover{background-color:var(--accent)}.hover\\:bg-destructive\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\\:bg-sidebar\\/95:hover{background-color:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-sidebar\\/95:hover{background-color:color-mix(in oklab, var(--sidebar) 95%, transparent)}}.hover\\:bg-transparent:hover{background-color:#0000}.hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\\:text-foreground:hover{color:var(--foreground)}.hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-100:hover{opacity:1}.hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\\:translate-x-0:focus{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.focus\\:opacity-100:focus{opacity:1}.focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\\:bg-transparent:active{background-color:#0000}.active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled{opacity:.5}.has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.has-\\[\\>svg\\]\\:px-1\\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.aria-pressed\\:bg-primary[aria-pressed=true]{background-color:var(--primary)}.aria-pressed\\:text-primary-foreground[aria-pressed=true]{color:var(--primary-foreground)}.data-closed\\:animate-out[data-closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\\:duration-300[data-closed]{--tw-duration:.3s;transition-duration:.3s}.data-closed\\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-closed\\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-closed\\:slide-out-to-bottom[data-closed]{--tw-exit-translate-y:100%}.data-closed\\:slide-out-to-left[data-closed]{--tw-exit-translate-x:-100%}.data-closed\\:slide-out-to-right[data-closed]{--tw-exit-translate-x:100%}.data-closed\\:slide-out-to-top[data-closed]{--tw-exit-translate-y:-100%}.data-open\\:animate-in[data-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\\:duration-500[data-open]{--tw-duration:.5s;transition-duration:.5s}.data-open\\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-open\\:zoom-in-95[data-open]{--tw-enter-scale:.95}.data-open\\:slide-in-from-bottom[data-open]{--tw-enter-translate-y:100%}.data-open\\:slide-in-from-left[data-open]{--tw-enter-translate-x:-100%}.data-open\\:slide-in-from-right[data-open]{--tw-enter-translate-x:100%}.data-open\\:slide-in-from-top[data-open]{--tw-enter-translate-y:-100%}.data-\\[active\\=true\\]\\:bg-sidebar-accent[data-active=true]{background-color:var(--sidebar-accent)}.data-\\[active\\=true\\]\\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\\[active\\=true\\]\\:text-sidebar-accent-foreground[data-active=true]{color:var(--sidebar-accent-foreground)}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.data-\\[highlighted\\]\\:bg-\\(--field-hover\\)[data-highlighted]{background-color:var(--field-hover)}.data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted]{color:var(--accent-foreground)}.data-\\[instant\\]\\:animate-none[data-instant]{animation:none}.data-\\[selected\\=true\\]\\:bg-accent[data-selected=true]{background-color:var(--accent)}.data-\\[selected\\=true\\]\\:text-accent-foreground[data-selected=true]{color:var(--accent-foreground)}.data-\\[side\\=bottom\\]\\:top-1[data-side=bottom]{top:var(--spacing)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\\[side\\=left\\]\\:top-1\\/2\\![data-side=left]{top:50%!important}.data-\\[side\\=left\\]\\:-right-1[data-side=left]{right:calc(var(--spacing) * -1)}.data-\\[side\\=left\\]\\:-translate-y-1\\/2[data-side=left]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\\[side\\=right\\]\\:top-1\\/2\\![data-side=right]{top:50%!important}.data-\\[side\\=right\\]\\:-left-1[data-side=right]{left:calc(var(--spacing) * -1)}.data-\\[side\\=right\\]\\:-translate-y-1\\/2[data-side=right]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\\[side\\=top\\]\\:-bottom-2\\.5[data-side=top]{bottom:calc(var(--spacing) * -2.5)}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\\[state\\=open\\]\\:opacity-100[data-state=open]{opacity:1}@media (hover:hover){.data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--sidebar-accent)}.data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--sidebar-accent-foreground)}}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transition-none{transition-property:none}}@media (min-width:40rem){.sm\\:max-w-sm{max-width:var(--container-sm)}}@media (min-width:48rem){.md\\:block{display:block}.md\\:flex{display:flex}.md\\:opacity-0{opacity:0}.md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (prefers-color-scheme:dark){.dark\\:border-input{border-color:var(--input)}.dark\\:bg-destructive\\/60{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/60{background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}@media (hover:hover){.dark\\:hover\\:bg-accent\\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\\:hover\\:bg-input\\/50:hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}}.dark\\:focus-visible\\:ring-destructive\\/40:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:focus-visible\\:ring-destructive\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:ring-destructive\\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\\[\\&\\>button\\]\\:hidden>button{display:none}.\\[\\&\\>span\\:first-child\\]\\:truncate>span:first-child,.\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\\[\\&\\>svg\\]\\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}@media (hover:none){.\\[\\@media\\(hover\\:none\\)\\]\\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\\[\\@media\\(hover\\:none\\)\\]\\:opacity-100{opacity:1}}[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background{color:var(--background)}@media (prefers-color-scheme:dark){[data-slot=tooltip-content] .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){[data-slot=tooltip-content] .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10{background-color:color-mix(in oklab, var(--background) 10%, transparent)}}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.studio-workspace{color:var(--foreground);background:var(--background);font:12px/1.5 var(--studio-font);cursor:default}.studio-workspace [data-slot=studio-config-file][href]{cursor:pointer;text-underline-offset:3px;text-decoration:none}.studio-workspace [data-slot=studio-config-file][href]:is(:hover,:focus-visible){text-decoration-line:underline}.studio-workspace [data-slot=studio-config-file][href]:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.studio-workspace :is([data-slot=sidebar-header],[data-slot=sidebar-footer]){isolation:isolate;flex-shrink:0;position:relative}.studio-workspace :is([data-slot=sidebar-header],[data-slot=sidebar-footer]):before{content:"";z-index:-1;border-radius:calc(var(--radius-lg) - .25rem);background:var(--card);pointer-events:none;position:absolute;inset:4px}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]{min-height:36px;color:var(--muted-foreground);gap:10px;font-size:13px;line-height:20px}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]>span:first-child{flex-shrink:0;display:flex}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]:is(:hover,:focus-visible,[data-active=true]){color:var(--sidebar-accent-foreground)}.studio-workspace{--studio-inspector-width:20rem;--preview-left:8px;--preview-right:8px;--preview-bottom:8px;position:relative}@media (min-width:768px){.studio-workspace[data-sidebar-panel=shown]{--preview-left:var(--sidebar-width)}.studio-workspace[data-sidebar-panel=shown]:has([data-slot=sidebar][data-state=collapsed]){--preview-left:calc(var(--sidebar-width-icon) + 1rem + 2px)}}@media (min-width:1024px){.studio-workspace:has([data-slot=studio-inspector][aria-hidden=false]){--preview-right:calc(var(--studio-inspector-width) + 1rem)}}@media (max-width:1023px){.studio-workspace:is(:has(>[data-slot=preview-canvas]:not([data-expanded])),[data-preview-layout=custom]):has([data-slot=studio-inspector][aria-hidden=false]){--preview-bottom:40%}.studio-workspace:is(:has(>[data-slot=preview-canvas]:not([data-expanded])),[data-preview-layout=custom]) [data-slot=studio-inspector]{inset:calc(60% + 8px) 8px 8px var(--preview-left);width:auto}}.studio-workspace>[data-slot=preview-canvas]{z-index:0}.studio-workspace>[data-slot=preview-canvas]:not([data-expanded]){inset:8px var(--preview-right) var(--preview-bottom) var(--preview-left);position:absolute}.studio-workspace>iframe[data-slot=studio-preview]{background:var(--background);border:0;width:100%;height:100%;position:absolute;inset:0}.studio-workspace[data-preview-layout=custom]>iframe[data-slot=studio-preview]{inset:0 calc(var(--preview-right) - 8px) calc(var(--preview-bottom) - 8px) calc(var(--preview-left) - 8px);width:calc(100% - var(--preview-left) - var(--preview-right) + 16px);height:calc(100% - var(--preview-bottom) + 8px)}:root{--background:#000;--foreground:#d6d7dc;--card:#ffffff0a;--card-foreground:#d6d7dc;--popover:#18191c;--popover-foreground:#d6d7dc;--primary:#e6e7ea;--primary-foreground:#000;--secondary:#ffffff14;--secondary-foreground:#d6d7dc;--muted:#18191c;--muted-foreground:#8b8c94;--faint:#5d5e66;--accent:#18191c;--accent-foreground:#d6d7dc;--destructive:#f87171;--success:#4ade80;--warning:#facc15;--border:#26272b;--input:#26272b;--ring:#5d5e66;--radius:.5rem;--field:#ffffff0f;--field-hover:#ffffff17;--field-active:#ffffff1f;--knob:#4a4b52;--knob-hover:#5a5b63;--sidebar:#000;--sidebar-foreground:#8b8c94;--sidebar-primary:#e6e7ea;--sidebar-primary-foreground:#000;--sidebar-accent:#ffffff14;--sidebar-accent-foreground:#d6d7dc;--sidebar-border:#26272b;--sidebar-ring:#5d5e66;--studio-font:ui-monospace, SFMono-Regular, Menlo, monospace;color-scheme:dark}[data-slot=studio-controls] :is(.tp-lblv_l,.tp-fldv_t):first-letter{text-transform:uppercase}[data-slot=studio-command-overlay]{z-index:1000;background:#0000004d;position:fixed;inset:0}[data-slot=studio-command-menu]{z-index:1001;border:1px solid var(--sidebar-border);border-radius:calc(var(--radius) + 2px);background:var(--sidebar);width:min(480px,100vw - 32px);max-height:calc(100dvh - min(20vh,160px) - 16px);position:fixed;top:min(20vh,160px);left:50%;overflow:auto;transform:translate(-50%)}@supports (color:color-mix(in lab, red, red)){[data-slot=studio-command-menu]{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}[data-slot=studio-command-menu]{color:var(--foreground);color-scheme:dark;font:12px/1.5 var(--studio-font);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);box-shadow:0 20px 25px -5px #0006,0 8px 10px -6px #0006}[data-slot=studio-command-menu],[data-slot=studio-command-menu] *{box-sizing:border-box}[data-slot=studio-command-menu] svg{width:16px;height:16px;color:inherit;flex-shrink:0}[data-slot=studio-command-menu] [data-slot=kbd]{pointer-events:none;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--muted);width:fit-content;min-width:20px;height:20px;font:inherit;color:var(--muted-foreground);-webkit-user-select:none;user-select:none;border-bottom-width:2px;justify-content:center;align-items:center;gap:4px;padding:0 4px;font-size:12px;font-weight:400;display:inline-flex}[data-slot=studio-command-menu] [data-slot=kbd-group]{align-items:center;gap:4px;display:inline-flex}[data-slot=studio-command-menu] button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px}[data-slot=studio-command-menu] button:focus-visible{outline:2px solid var(--sidebar-ring);outline-offset:2px}[data-slot=studio-command-menu] [data-slot=studio-command-heading]{align-items:center;gap:8px;height:40px;padding:0 12px 0 16px;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-heading] h2{font:inherit;flex:1;align-items:center;gap:10px;margin:0;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-heading] svg{width:auto;height:14px}[data-slot=studio-command-menu] [data-slot=studio-command-heading] strong{letter-spacing:.08em;white-space:nowrap;font-weight:700}[data-slot=studio-command-menu] [data-slot=studio-command-heading] button{padding:0}[data-slot=studio-command-menu] [data-slot=studio-command-heading] button:hover{background:var(--sidebar-accent)}[data-slot=studio-command-menu] [data-slot=studio-command-description]{display:none}[data-slot=studio-command-menu] [data-slot=command]{height:auto;color:inherit;background:0 0;flex-direction:column;display:flex;overflow:hidden}[data-slot=studio-command-menu] [data-slot=command-input-wrapper]{border-radius:var(--radius);background:var(--field);height:36px;color:var(--muted-foreground);border:1px solid #0000;align-items:center;gap:8px;margin:8px;padding:0 8px;display:flex}[data-slot=studio-command-menu] [data-slot=command-input-wrapper]:focus-within{border-color:var(--sidebar-ring)}[data-slot=studio-command-menu] [data-slot=command-input-wrapper] svg{opacity:1}[data-slot=studio-command-menu] [data-slot=command-input]{width:100%;min-width:0;height:100%;color:var(--sidebar-primary);font:inherit;background:0 0;border:0;outline:none;padding:0}[data-slot=studio-command-menu] [data-slot=command-input]::placeholder{color:var(--muted-foreground)}[data-slot=studio-command-menu] [data-slot=command-list]{overscroll-behavior:contain;max-height:300px;padding:0 8px 8px;scroll-padding:4px;overflow-y:auto}[data-slot=studio-command-menu] [data-slot=command-item]{border-radius:calc(var(--radius) - 2px);min-height:36px;font:inherit;color:var(--sidebar-foreground);cursor:pointer;align-items:center;gap:8px;padding:8px;display:flex}[data-slot=studio-command-menu] [data-slot=command-item][data-selected=true]{background:var(--sidebar-accent);color:var(--sidebar-accent-foreground)}[data-slot=studio-command-menu] [data-slot=studio-command-label]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}[data-slot=studio-command-menu] [data-slot=command-empty]{text-align:center;font:inherit;color:var(--muted-foreground);padding:24px 8px}[data-slot=studio-command-menu] [data-slot=studio-command-footer]{border-top:1px solid var(--sidebar-border);color:var(--muted-foreground);align-items:center;gap:16px;padding:8px 12px;font-size:10px;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-footer]>span{align-items:center;gap:6px;display:inline-flex}[data-studio-root]{all:initial;color:var(--foreground);font:12px/1.5 var(--studio-font);color-scheme:dark;display:contents}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}`;
142
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--color-sky-400:oklch(74.6% .16 232.661);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--radius-xs:.125rem;--radius-lg:calc(var(--radius) + 2px);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--studio-font);--default-mono-font-family:var(--studio-font);--color-border:var(--border);--color-sidebar:var(--sidebar)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);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}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--foreground)}}@layer components{.studio-surface{border-radius:calc(var(--radius) - 2px);background:var(--card);padding:6px}.studio-toolbar{pointer-events:auto;flex-wrap:wrap;align-items:center;gap:4px;display:flex}.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]{border-radius:calc(var(--radius) - 2px);min-height:28px;color:var(--muted-foreground);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;align-items:center;gap:6px;padding:4px 8px;font-size:11px;display:inline-flex}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):hover{color:var(--foreground);background:var(--field-hover)}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):is(:active,[aria-pressed=true]){color:var(--foreground);background:var(--field-active)}:is(.studio-toolbar>button:not([data-slot=select-trigger]),.studio-toolbar [data-slot=toolbar-action]):focus-visible{outline:2px solid var(--ring);outline-offset:2px}.studio-canvas-toolbar{z-index:20;min-width:0;color:var(--muted-foreground);pointer-events:none;flex-shrink:0;position:relative}.studio-canvas-actions{opacity:1;transition:opacity .2s ease-out,translate .2s ease-out;translate:0}.studio-canvas-toolbar[data-ghost]{position:absolute;inset:4px 4px auto}.studio-canvas-toolbar[data-ghost]:before{content:"";pointer-events:auto;height:24px;position:absolute;inset:-4px 0 auto}.studio-canvas-toolbar[data-ghost] .studio-canvas-actions{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);opacity:0;transition-delay:3s;translate:0 calc(-100% - 8px)}.studio-canvas-toolbar[data-ghost]:is(:hover,:has(:focus-visible,[aria-expanded=true],[data-state=open])) .studio-canvas-actions{opacity:1;transition-delay:0s;translate:0}@media (hover:none){.studio-canvas-toolbar[data-ghost] .studio-canvas-actions{opacity:1;translate:0}}.studio-canvas-toolbar[data-expanded]{height:80px;position:absolute;inset:0 0 auto}.studio-canvas-toolbar[data-expanded] .studio-canvas-actions{pointer-events:none;background:0 0;height:100%;padding:0}.studio-canvas-toolbar[data-expanded] .studio-canvas-actions>:not(.studio-canvas-toggle){display:none}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle{width:min(280px,100%);height:100%;padding-top:max(12px, env(safe-area-inset-top));pointer-events:auto;justify-content:center;align-items:flex-start;margin-inline:auto;display:flex}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{border-color:var(--sidebar-border);border-radius:var(--radius);min-height:30px;color:var(--foreground);background:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);font-size:inherit;opacity:0;transition:opacity .2s ease-out 3s,translate .2s ease-out 3s;translate:0 -8px;box-shadow:0 4px 12px #0006}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button:hover{background:var(--field-hover)}.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle:hover>button,.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button:focus-visible{opacity:1;transition-delay:0s;translate:0}@media (hover:none){.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{opacity:1;translate:0}}@media (prefers-reduced-motion:reduce){.studio-canvas-actions,.studio-canvas-toolbar[data-expanded] .studio-canvas-toggle>button{transition-duration:0s}}.studio-preview-canvas{border:1px solid var(--sidebar-border);border-radius:calc(var(--radius) + 2px);background:var(--sidebar);flex-direction:column;gap:4px;min-width:0;min-height:0;padding:4px;display:flex;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.studio-preview-canvas{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}.studio-preview-canvas{font:12px/1.5 var(--studio-font);box-shadow:0 12px 24px #0006}.studio-preview-source{align-items:center;min-width:0;margin-right:auto;display:flex}.studio-preview-title{padding-inline:8px}.studio-preview-canvas>iframe{border-radius:calc(var(--radius) - 2px);background:var(--background);border:0;flex:1;width:100%;min-height:0}.studio-preview-canvas[data-expanded]{z-index:30;background:var(--background);border:0;border-radius:0;padding:0;position:fixed;inset:0}.studio-preview-canvas[data-expanded]>iframe{border-radius:0}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.inset-y-2{inset-block:calc(var(--spacing) * 2)}.-top-0\\.5{top:calc(var(--spacing) * -.5)}.top-0{top:0}.top-1\\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.-right-0\\.5{right:calc(var(--spacing) * -.5)}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.left-0{left:0}.left-1{left:var(--spacing)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mt-1{margin-top:var(--spacing)}.mt-auto{margin-top:auto}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.size-1\\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-auto{height:auto}.h-full{height:100%}.h-svh{height:100svh}.max-h-\\(--available-height\\){max-height:var(--available-height)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\\[300px\\]{max-height:300px}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-svh{min-height:100svh}.w-\\(--sidebar-width\\){width:var(--sidebar-width)}.w-\\(--studio-inspector-width\\){width:var(--studio-inspector-width)}.w-3\\/4{width:75%}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.max-w-full{max-width:100%}.min-w-\\(--anchor-width\\){min-width:var(--anchor-width)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.origin-\\(--transform-origin\\){transform-origin:var(--transform-origin)}.-translate-x-\\[calc\\(100\\%\\+0\\.25rem\\)\\]{--tw-translate-x:calc(calc(100% + .25rem) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-\\[calc\\(100\\%\\+1rem\\)\\]{--tw-translate-x:calc(calc(100% + 1rem) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\\[calc\\(100\\%\\+0\\.25rem\\)\\]{--tw-translate-x:calc(100% + .25rem);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\\[calc\\(100\\%\\+1rem\\)\\]{--tw-translate-x:calc(100% + 1rem);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\\[calc\\(-50\\%-2px\\)\\]{--tw-translate-y:calc(-50% - 2px);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-45{rotate:45deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.scroll-py-1{scroll-padding-block:var(--spacing)}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.place-items-center{place-items:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\\[2px\\]{border-radius:2px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) + 2px)}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:calc(var(--radius) - 2px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--border)}.border-input{border-color:var(--input)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-white\\/15{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.border-white\\/15{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.bg-\\(--field\\){background-color:var(--field)}.bg-background{background-color:var(--background)}.bg-black\\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-current{background-color:currentColor}.bg-destructive{background-color:var(--destructive)}.bg-foreground{background-color:var(--foreground)}.bg-muted{background-color:var(--muted)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar,.bg-sidebar\\/85{background-color:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.bg-sidebar\\/85{background-color:color-mix(in oklab, var(--sidebar) 85%, transparent)}}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--warning)}.fill-foreground{fill:var(--foreground)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:0}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.ps-3{padding-inline-start:calc(var(--spacing) * 3)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pt-2\\.5{padding-top:calc(var(--spacing) * 2.5)}.pr-0{padding-right:0}.pr-0\\.5{padding-right:calc(var(--spacing) * .5)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-1\\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5\\.5{padding-left:calc(var(--spacing) * 5.5)}.text-center{text-align:center}.text-left{text-align:left}.font-\\(family-name\\:--studio-font\\),.font-mono{font-family:var(--studio-font)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[10px\\]{font-size:10px}.text-\\[11px\\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\\[0\\.08em\\]{--tw-tracking:.08em;letter-spacing:.08em}.text-balance{text-wrap:balance}.text-clip\\!{text-overflow:clip!important}.whitespace-nowrap{white-space:nowrap}.text-background{color:var(--background)}.text-destructive{color:var(--destructive)}.text-faint{color:var(--faint)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-sidebar-primary{color:var(--sidebar-primary)}.text-sky-400{color:var(--color-sky-400)}.text-success{color:var(--success)}.text-warning{color:var(--warning)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\\[0_0_0_1px_var\\(--sidebar-border\\)\\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-border));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,box-shadow\\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[left\\,right\\,width\\,translate\\]{transition-property:left,right,width,translate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[left\\,right\\,width\\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[padding\\]{transition-property:padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[translate\\,opacity\\]{transition-property:translate,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\,height\\,padding\\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[width\\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.paused{animation-play-state:paused}.running{animation-play-state:running}.group-focus-within\\/menu-item\\:opacity-100:is(:where(.group\\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\\/edge\\:translate-x-0:is(:where(.group\\/edge):hover *){--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\\/edge\\:opacity-100:is(:where(.group\\/edge):hover *),.group-hover\\/menu-item\\:opacity-100:is(:where(.group\\/menu-item):hover *){opacity:1}}.group-has-data-\\[sidebar\\=menu-action\\]\\/menu-item\\:pr-8:is(:where(.group\\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-\\[collapsible\\=icon\\]\\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\\[collapsible\\=icon\\]\\:size-8\\!:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\\[collapsible\\=icon\\]\\:w-\\(--sidebar-width-icon\\):is(:where(.group)[data-collapsible=icon] *){width:var(--sidebar-width-icon)}.group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\)\\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)))}.group-data-\\[collapsible\\=icon\\]\\:w-\\[calc\\(var\\(--sidebar-width-icon\\)\\+\\(--spacing\\(4\\)\\)\\+2px\\)\\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + (calc(var(--spacing) * 4)) + 2px)}.group-data-\\[collapsible\\=icon\\]\\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\\[collapsible\\=icon\\]\\:p-0\\!:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\\[collapsible\\=icon\\]\\:p-2\\!:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\\[collapsible\\=icon\\]\\:pl-\\[calc\\(1\\.5rem-0\\.875rem\\*352\\/144\\/2\\)\\]:is(:where(.group)[data-collapsible=icon] *){padding-left:.430556rem}.group-data-\\[collapsible\\=offcanvas\\]\\:right-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width) * -1)}.group-data-\\[collapsible\\=offcanvas\\]\\:left-\\[calc\\(var\\(--sidebar-width\\)\\*-1\\)\\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width) * -1)}.group-data-\\[collapsible\\=offcanvas\\]\\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:0}.group-data-\\[side\\=left\\]\\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\\[side\\=right\\]\\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\\[side\\=right\\]\\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}@media (hover:hover){.peer-hover\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.peer\\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-data-\\[active\\=true\\]\\/menu-button\\:text-sidebar-accent-foreground:is(:where(.peer\\/menu-button)[data-active=true]~*){color:var(--sidebar-accent-foreground)}.placeholder\\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}@media (hover:hover){.hover\\:bg-\\(--field-hover\\):hover{background-color:var(--field-hover)}.hover\\:bg-accent:hover{background-color:var(--accent)}.hover\\:bg-destructive\\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-destructive\\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\\:bg-secondary:hover,.hover\\:bg-secondary\\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\\:bg-sidebar\\/95:hover{background-color:var(--sidebar)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-sidebar\\/95:hover{background-color:color-mix(in oklab, var(--sidebar) 95%, transparent)}}.hover\\:bg-transparent:hover{background-color:#0000}.hover\\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\\:text-foreground:hover{color:var(--foreground)}.hover\\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-100:hover{opacity:1}.hover\\:shadow-\\[0_0_0_1px_var\\(--sidebar-accent\\)\\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--sidebar-accent));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\\:translate-x-0:focus{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.focus\\:opacity-100:focus{opacity:1}.focus\\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus-visible\\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-\\[3px\\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-destructive\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.active\\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\\:bg-transparent:active{background-color:#0000}.active\\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\:opacity-50:disabled,.inert\\:opacity-50:is([inert],[inert] *){opacity:.5}.has-data-\\[variant\\=inset\\]\\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.has-\\[\\>svg\\]\\:px-1\\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\\[\\>svg\\]\\:px-2\\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\\[\\>svg\\]\\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\\[\\>svg\\]\\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-disabled\\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}.aria-invalid\\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\\:ring-destructive\\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.aria-pressed\\:bg-primary[aria-pressed=true]{background-color:var(--primary)}.aria-pressed\\:text-primary-foreground[aria-pressed=true]{color:var(--primary-foreground)}.data-closed\\:animate-out[data-closed]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\\:duration-300[data-closed]{--tw-duration:.3s;transition-duration:.3s}.data-closed\\:fade-out-0[data-closed]{--tw-exit-opacity:0}.data-closed\\:zoom-out-95[data-closed]{--tw-exit-scale:.95}.data-closed\\:slide-out-to-bottom[data-closed]{--tw-exit-translate-y:100%}.data-closed\\:slide-out-to-left[data-closed]{--tw-exit-translate-x:-100%}.data-closed\\:slide-out-to-right[data-closed]{--tw-exit-translate-x:100%}.data-closed\\:slide-out-to-top[data-closed]{--tw-exit-translate-y:-100%}.data-open\\:animate-in[data-open]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\\:duration-500[data-open]{--tw-duration:.5s;transition-duration:.5s}.data-open\\:fade-in-0[data-open]{--tw-enter-opacity:0}.data-open\\:zoom-in-95[data-open]{--tw-enter-scale:.95}.data-open\\:slide-in-from-bottom[data-open]{--tw-enter-translate-y:100%}.data-open\\:slide-in-from-left[data-open]{--tw-enter-translate-x:-100%}.data-open\\:slide-in-from-right[data-open]{--tw-enter-translate-x:100%}.data-open\\:slide-in-from-top[data-open]{--tw-enter-translate-y:-100%}.data-\\[active\\=true\\]\\:bg-sidebar-accent[data-active=true]{background-color:var(--sidebar-accent)}.data-\\[active\\=true\\]\\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\\[active\\=true\\]\\:text-sidebar-accent-foreground[data-active=true]{color:var(--sidebar-accent-foreground)}.data-\\[disabled\\]\\:pointer-events-none[data-disabled]{pointer-events:none}.data-\\[disabled\\]\\:opacity-50[data-disabled]{opacity:.5}.data-\\[disabled\\=true\\]\\:pointer-events-none[data-disabled=true]{pointer-events:none}.data-\\[disabled\\=true\\]\\:opacity-50[data-disabled=true]{opacity:.5}.data-\\[highlighted\\]\\:bg-\\(--field-hover\\)[data-highlighted]{background-color:var(--field-hover)}.data-\\[highlighted\\]\\:text-accent-foreground[data-highlighted]{color:var(--accent-foreground)}.data-\\[instant\\]\\:animate-none[data-instant]{animation:none}.data-\\[selected\\=true\\]\\:bg-accent[data-selected=true]{background-color:var(--accent)}.data-\\[selected\\=true\\]\\:text-accent-foreground[data-selected=true]{color:var(--accent-foreground)}.data-\\[side\\=bottom\\]\\:top-1[data-side=bottom]{top:var(--spacing)}.data-\\[side\\=bottom\\]\\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\\[side\\=left\\]\\:top-1\\/2\\![data-side=left]{top:50%!important}.data-\\[side\\=left\\]\\:-right-1[data-side=left]{right:calc(var(--spacing) * -1)}.data-\\[side\\=left\\]\\:-translate-y-1\\/2[data-side=left]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[side\\=left\\]\\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\\[side\\=right\\]\\:top-1\\/2\\![data-side=right]{top:50%!important}.data-\\[side\\=right\\]\\:-left-1[data-side=right]{left:calc(var(--spacing) * -1)}.data-\\[side\\=right\\]\\:-translate-y-1\\/2[data-side=right]{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\\[side\\=right\\]\\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\\[side\\=top\\]\\:-bottom-2\\.5[data-side=top]{bottom:calc(var(--spacing) * -2.5)}.data-\\[side\\=top\\]\\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\\[state\\=open\\]\\:opacity-100[data-state=open]{opacity:1}@media (hover:hover){.data-\\[state\\=open\\]\\:hover\\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--sidebar-accent)}.data-\\[state\\=open\\]\\:hover\\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--sidebar-accent-foreground)}}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transition-none{transition-property:none}}@media (min-width:40rem){.sm\\:max-w-sm{max-width:var(--container-sm)}}@media (min-width:48rem){.md\\:block{display:block}.md\\:flex{display:flex}.md\\:opacity-0{opacity:0}.md\\:after\\:hidden:after{content:var(--tw-content);display:none}}@media (prefers-color-scheme:dark){.dark\\:border-input{border-color:var(--input)}.dark\\:bg-destructive\\/60{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-destructive\\/60{background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}.dark\\:bg-input\\/30{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\:bg-input\\/30{background-color:color-mix(in oklab, var(--input) 30%, transparent)}}@media (hover:hover){.dark\\:hover\\:bg-accent\\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-accent\\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.dark\\:hover\\:bg-input\\/50:hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\\:hover\\:bg-input\\/50:hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}}.dark\\:focus-visible\\:ring-destructive\\/40:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:focus-visible\\:ring-destructive\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\\:aria-invalid\\:ring-destructive\\/40[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\\:aria-invalid\\:ring-destructive\\/40[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}}.\\[\\&_svg\\]\\:pointer-events-none svg{pointer-events:none}.\\[\\&_svg\\]\\:shrink-0 svg{flex-shrink:0}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&_svg\\:not\\(\\[class\\*\\=\\'text-\\'\\]\\)\\]\\:text-muted-foreground svg:not([class*=text-]){color:var(--muted-foreground)}.\\[\\&\\>button\\]\\:hidden>button{display:none}.\\[\\&\\>span\\:first-child\\]\\:truncate>span:first-child,.\\[\\&\\>span\\:last-child\\]\\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\\[\\&\\>svg\\]\\:size-3>svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\\[\\&\\>svg\\]\\:shrink-0>svg{flex-shrink:0}@media (hover:none){.\\[\\@media\\(hover\\:none\\)\\]\\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\\[\\@media\\(hover\\:none\\)\\]\\:opacity-100{opacity:1}}[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/20{background-color:color-mix(in oklab, var(--background) 20%, transparent)}}[data-slot=tooltip-content] .\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:text-background{color:var(--background)}@media (prefers-color-scheme:dark){[data-slot=tooltip-content] .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){[data-slot=tooltip-content] .dark\\:\\[\\[data-slot\\=tooltip-content\\]_\\&\\]\\:bg-background\\/10{background-color:color-mix(in oklab, var(--background) 10%, transparent)}}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}.studio-workspace{color:var(--foreground);background:var(--background);font:12px/1.5 var(--studio-font);cursor:default}.studio-workspace [data-slot=studio-config-file][href]{cursor:pointer;text-underline-offset:3px;text-decoration:none}.studio-workspace [data-slot=studio-config-file][href]:is(:hover,:focus-visible){text-decoration-line:underline}.studio-workspace [data-slot=studio-config-file][href]:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.studio-workspace :is([data-slot=sidebar-header],[data-slot=sidebar-footer]){isolation:isolate;flex-shrink:0;position:relative}.studio-workspace :is([data-slot=sidebar-header],[data-slot=sidebar-footer]):before{content:"";z-index:-1;border-radius:calc(var(--radius-lg) - .25rem);background:var(--card);pointer-events:none;position:absolute;inset:4px}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]{min-height:36px;color:var(--muted-foreground);gap:10px;font-size:13px;line-height:20px}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]>span:first-child{flex-shrink:0;display:flex}.studio-workspace [data-slot=sidebar-content] [data-slot=sidebar-menu-button]:is(:hover,:focus-visible,[data-active=true]){color:var(--sidebar-accent-foreground)}.studio-workspace{--studio-inspector-width:20rem;--preview-left:8px;--preview-right:8px;--preview-bottom:8px;position:relative}@media (min-width:768px){.studio-workspace[data-sidebar-panel=shown]{--preview-left:var(--sidebar-width)}.studio-workspace[data-sidebar-panel=shown]:has([data-slot=sidebar][data-state=collapsed]){--preview-left:calc(var(--sidebar-width-icon) + 1rem + 2px)}}@media (min-width:1024px){.studio-workspace:has([data-slot=studio-inspector][aria-hidden=false]){--preview-right:calc(var(--studio-inspector-width) + 1rem)}}@media (max-width:1023px){.studio-workspace:is(:has(>[data-slot=preview-canvas]:not([data-expanded])),[data-preview-layout=custom]):has([data-slot=studio-inspector][aria-hidden=false]){--preview-bottom:40%}.studio-workspace:is(:has(>[data-slot=preview-canvas]:not([data-expanded])),[data-preview-layout=custom]) [data-slot=studio-inspector]{inset:calc(60% + 8px) 8px 8px var(--preview-left);width:auto}}.studio-workspace>[data-slot=preview-canvas]{z-index:0}.studio-workspace>[data-slot=preview-canvas]:not([data-expanded]){inset:8px var(--preview-right) var(--preview-bottom) var(--preview-left);position:absolute}.studio-workspace>iframe[data-slot=studio-preview]{background:var(--background);border:0;width:100%;height:100%;position:absolute;inset:0}.studio-workspace[data-preview-layout=custom]>iframe[data-slot=studio-preview]{inset:0 calc(var(--preview-right) - 8px) calc(var(--preview-bottom) - 8px) calc(var(--preview-left) - 8px);width:calc(100% - var(--preview-left) - var(--preview-right) + 16px);height:calc(100% - var(--preview-bottom) + 8px)}:root{--background:#000;--foreground:#d6d7dc;--card:#ffffff0a;--card-foreground:#d6d7dc;--popover:#18191c;--popover-foreground:#d6d7dc;--primary:#e6e7ea;--primary-foreground:#000;--secondary:#ffffff14;--secondary-foreground:#d6d7dc;--muted:#18191c;--muted-foreground:#8b8c94;--faint:#5d5e66;--accent:#18191c;--accent-foreground:#d6d7dc;--destructive:#f87171;--success:#4ade80;--warning:#facc15;--border:#26272b;--input:#26272b;--ring:#5d5e66;--radius:.5rem;--field:#ffffff0f;--field-hover:#ffffff17;--field-active:#ffffff1f;--knob:#4a4b52;--knob-hover:#5a5b63;--sidebar:#000;--sidebar-foreground:#8b8c94;--sidebar-primary:#e6e7ea;--sidebar-primary-foreground:#000;--sidebar-accent:#ffffff14;--sidebar-accent-foreground:#d6d7dc;--sidebar-border:#26272b;--sidebar-ring:#5d5e66;--studio-font:ui-monospace, SFMono-Regular, Menlo, monospace;color-scheme:dark}[data-slot=studio-controls] :is(.tp-lblv_l,.tp-fldv_t):first-letter{text-transform:uppercase}[data-slot=studio-controls] .dialkit-root{--dial-glass-bg:var(--background);--dial-surface:var(--field);--dial-surface-hover:var(--field-hover);--dial-surface-active:var(--field-active);--dial-border:var(--border);--dial-text-root:var(--foreground);--dial-text-section:var(--muted-foreground);--dial-text-label:var(--muted-foreground);font-family:var(--studio-font)}[data-slot=studio-command-overlay]{z-index:1000;background:#0000004d;position:fixed;inset:0}[data-slot=studio-command-menu]{z-index:1001;border:1px solid var(--sidebar-border);border-radius:calc(var(--radius) + 2px);background:var(--sidebar);width:min(480px,100vw - 32px);max-height:calc(100dvh - min(20vh,160px) - 16px);position:fixed;top:min(20vh,160px);left:50%;overflow:auto;transform:translate(-50%)}@supports (color:color-mix(in lab, red, red)){[data-slot=studio-command-menu]{background:color-mix(in srgb, var(--sidebar) 85%, transparent)}}[data-slot=studio-command-menu]{color:var(--foreground);color-scheme:dark;font:12px/1.5 var(--studio-font);-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);box-shadow:0 20px 25px -5px #0006,0 8px 10px -6px #0006}[data-slot=studio-command-menu],[data-slot=studio-command-menu] *{box-sizing:border-box}[data-slot=studio-command-menu] svg{width:16px;height:16px;color:inherit;flex-shrink:0}[data-slot=studio-command-menu] [data-slot=kbd]{pointer-events:none;border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);background:var(--muted);width:fit-content;min-width:20px;height:20px;font:inherit;color:var(--muted-foreground);-webkit-user-select:none;user-select:none;border-bottom-width:2px;justify-content:center;align-items:center;gap:4px;padding:0 4px;font-size:12px;font-weight:400;display:inline-flex}[data-slot=studio-command-menu] [data-slot=kbd-group]{align-items:center;gap:4px;display:inline-flex}[data-slot=studio-command-menu] button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px}[data-slot=studio-command-menu] button:focus-visible{outline:2px solid var(--sidebar-ring);outline-offset:2px}[data-slot=studio-command-menu] [data-slot=studio-command-heading]{align-items:center;gap:8px;height:40px;padding:0 12px 0 16px;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-heading] h2{font:inherit;flex:1;align-items:center;gap:10px;margin:0;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-heading] svg{width:auto;height:14px}[data-slot=studio-command-menu] [data-slot=studio-command-heading] strong{letter-spacing:.08em;white-space:nowrap;font-weight:700}[data-slot=studio-command-menu] [data-slot=studio-command-heading] button{padding:0}[data-slot=studio-command-menu] [data-slot=studio-command-heading] button:hover{background:var(--sidebar-accent)}[data-slot=studio-command-menu] [data-slot=studio-command-description]{display:none}[data-slot=studio-command-menu] [data-slot=command]{height:auto;color:inherit;background:0 0;flex-direction:column;display:flex;overflow:hidden}[data-slot=studio-command-menu] [data-slot=command-input-wrapper]{border-radius:var(--radius);background:var(--field);height:36px;color:var(--muted-foreground);border:1px solid #0000;align-items:center;gap:8px;margin:8px;padding:0 8px;display:flex}[data-slot=studio-command-menu] [data-slot=command-input-wrapper]:focus-within{border-color:var(--sidebar-ring)}[data-slot=studio-command-menu] [data-slot=command-input-wrapper] svg{opacity:1}[data-slot=studio-command-menu] [data-slot=command-input]{width:100%;min-width:0;height:100%;color:var(--sidebar-primary);font:inherit;background:0 0;border:0;outline:none;padding:0}[data-slot=studio-command-menu] [data-slot=command-input]::placeholder{color:var(--muted-foreground)}[data-slot=studio-command-menu] [data-slot=command-list]{overscroll-behavior:contain;max-height:300px;padding:0 8px 8px;scroll-padding:4px;overflow-y:auto}[data-slot=studio-command-menu] [data-slot=command-item]{border-radius:calc(var(--radius) - 2px);min-height:36px;font:inherit;color:var(--sidebar-foreground);cursor:pointer;align-items:center;gap:8px;padding:8px;display:flex}[data-slot=studio-command-menu] [data-slot=command-item][data-selected=true]{background:var(--sidebar-accent);color:var(--sidebar-accent-foreground)}[data-slot=studio-command-menu] [data-slot=studio-command-label]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}[data-slot=studio-command-menu] [data-slot=command-empty]{text-align:center;font:inherit;color:var(--muted-foreground);padding:24px 8px}[data-slot=studio-command-menu] [data-slot=studio-command-footer]{border-top:1px solid var(--sidebar-border);color:var(--muted-foreground);align-items:center;gap:16px;padding:8px 12px;font-size:10px;display:flex}[data-slot=studio-command-menu] [data-slot=studio-command-footer]>span{align-items:center;gap:6px;display:inline-flex}[data-studio-root]{all:initial;color:var(--foreground);font:12px/1.5 var(--studio-font);color-scheme:dark;display:contents}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}`;
237
143
 
238
144
  // src/react/shadow-css.ts
239
145
  var ROOT_FONT_SIZE = 16;
@@ -253,7 +159,7 @@ function toShadowCss(css) {
253
159
  }
254
160
 
255
161
  // src/react/shadow-root.tsx
256
- import { jsx as jsx4 } from "react/jsx-runtime";
162
+ import { jsx as jsx2 } from "react/jsx-runtime";
257
163
  var sheet;
258
164
  function studioStyleSheet() {
259
165
  if (!sheet) {
@@ -280,7 +186,7 @@ function StudioShadowRoot({ children }) {
280
186
  }, []);
281
187
  return (
282
188
  // `display: contents` keeps the host out of layout; inline so host stylesheets can't override it.
283
- /* @__PURE__ */ jsx4("div", { ref: attach, "data-studio-host": "", style: { display: "contents" }, children: root && createPortal(/* @__PURE__ */ jsx4(PortalContainer.Provider, { value: root, children }), root) })
189
+ /* @__PURE__ */ jsx2("div", { ref: attach, "data-studio-host": "", style: { display: "contents" }, children: root && createPortal(/* @__PURE__ */ jsx2(PortalContainer.Provider, { value: root, children }), root) })
284
190
  );
285
191
  }
286
192
  function activeElement() {
@@ -291,15 +197,15 @@ function activeElement() {
291
197
  var eventTarget = (event) => event.composedPath()[0] ?? event.target;
292
198
 
293
199
  // src/react/ui/tooltip.tsx
294
- import { jsx as jsx5, jsxs } from "react/jsx-runtime";
200
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
295
201
  function TooltipProvider({ delay = 0, ...props }) {
296
- return /* @__PURE__ */ jsx5(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
202
+ return /* @__PURE__ */ jsx3(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
297
203
  }
298
204
  function Tooltip({ ...props }) {
299
- return /* @__PURE__ */ jsx5(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
205
+ return /* @__PURE__ */ jsx3(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
300
206
  }
301
207
  function TooltipTrigger({ ...props }) {
302
- return /* @__PURE__ */ jsx5(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
208
+ return /* @__PURE__ */ jsx3(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
303
209
  }
304
210
  function TooltipContent({
305
211
  className,
@@ -310,7 +216,7 @@ function TooltipContent({
310
216
  children,
311
217
  ...props
312
218
  }) {
313
- return /* @__PURE__ */ jsx5(TooltipPrimitive.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx5(
219
+ return /* @__PURE__ */ jsx3(TooltipPrimitive.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx3(
314
220
  TooltipPrimitive.Positioner,
315
221
  {
316
222
  align,
@@ -329,7 +235,7 @@ function TooltipContent({
329
235
  ...props,
330
236
  children: [
331
237
  children,
332
- /* @__PURE__ */ jsx5(TooltipPrimitive.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })
238
+ /* @__PURE__ */ jsx3(TooltipPrimitive.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" })
333
239
  ]
334
240
  }
335
241
  )
@@ -343,11 +249,184 @@ function Hint({
343
249
  ...props
344
250
  }) {
345
251
  return /* @__PURE__ */ jsxs(Tooltip, { disabled, children: [
346
- /* @__PURE__ */ jsx5(TooltipTrigger, { render: children }),
347
- /* @__PURE__ */ jsx5(TooltipContent, { ...props, children: content })
252
+ /* @__PURE__ */ jsx3(TooltipTrigger, { render: children }),
253
+ /* @__PURE__ */ jsx3(TooltipContent, { ...props, children: content })
254
+ ] });
255
+ }
256
+
257
+ // src/react/changes.tsx
258
+ import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
259
+ var label = (path) => path.map((key) => key.charAt(0).toUpperCase() + key.slice(1)).join(" \u203A ");
260
+ var COLOR = /^(#|rgba?\(|hsla?\(|hwb\(|lab\(|lch\(|oklab\(|oklch\(|color\()/i;
261
+ function Value({ value, className }) {
262
+ const text = typeof value === "number" ? String(Number(value.toFixed(4))) : typeof value === "string" ? value : JSON.stringify(value) ?? "\u2014";
263
+ const color = typeof value === "string" && COLOR.test(value) && CSS.supports("color", value) ? value : null;
264
+ return /* @__PURE__ */ jsxs2("span", { className: cn("flex min-w-0 items-center gap-1", className), title: text, children: [
265
+ color && /* @__PURE__ */ jsx4(
266
+ "span",
267
+ {
268
+ "aria-hidden": true,
269
+ className: "size-2.5 shrink-0 rounded-sm border border-white/15",
270
+ style: { background: color }
271
+ }
272
+ ),
273
+ /* @__PURE__ */ jsx4("span", { className: "truncate", children: text })
274
+ ] });
275
+ }
276
+ function Changes({ handle }) {
277
+ const [open, setOpen] = useState2(false);
278
+ const list = useId();
279
+ const { diff, dirty } = handle;
280
+ useEffect(() => {
281
+ if (!dirty) setOpen(false);
282
+ }, [dirty]);
283
+ if (!diff.length) return null;
284
+ const names = diff.map(({ path }) => label(path)).join(", ");
285
+ return /* @__PURE__ */ jsxs2("div", { "data-slot": "studio-changes", className: "grid gap-1", children: [
286
+ open && /* @__PURE__ */ jsx4("ul", { id: list, "aria-label": "Unsaved changes", className: "-mx-1 grid max-h-64 overflow-y-auto", children: diff.map(({ path, before, after }) => {
287
+ const name = label(path);
288
+ return /* @__PURE__ */ jsxs2(
289
+ "li",
290
+ {
291
+ "data-slot": "studio-change",
292
+ className: "flex items-center gap-2 rounded-md py-1 pr-0.5 pl-1.5 hover:bg-secondary",
293
+ children: [
294
+ /* @__PURE__ */ jsxs2("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [
295
+ /* @__PURE__ */ jsx4("span", { className: "truncate text-foreground", title: name, children: name }),
296
+ /* @__PURE__ */ jsxs2("span", { className: "flex min-w-0 items-center gap-1.5 text-[11px]", children: [
297
+ /* @__PURE__ */ jsx4(Value, { value: before, className: "text-muted-foreground" }),
298
+ /* @__PURE__ */ jsx4(ArrowRight, { "aria-label": "changed to", className: "size-3 shrink-0 text-faint" }),
299
+ /* @__PURE__ */ jsx4(Value, { value: after, className: "text-warning" })
300
+ ] })
301
+ ] }),
302
+ /* @__PURE__ */ jsx4(Hint, { content: "Revert to saved", side: "left", children: /* @__PURE__ */ jsx4(
303
+ Button,
304
+ {
305
+ variant: "ghost",
306
+ size: "icon-xs",
307
+ "aria-label": `Revert ${name}`,
308
+ disabled: handle.comparing,
309
+ className: "cursor-pointer text-muted-foreground hover:text-foreground",
310
+ onClick: () => handle.revert(path),
311
+ children: /* @__PURE__ */ jsx4(Undo2, {})
312
+ }
313
+ ) })
314
+ ]
315
+ },
316
+ JSON.stringify(path)
317
+ );
318
+ }) }),
319
+ /* @__PURE__ */ jsxs2(
320
+ "button",
321
+ {
322
+ type: "button",
323
+ "aria-expanded": open,
324
+ "aria-controls": list,
325
+ onClick: () => setOpen(!open),
326
+ title: open ? void 0 : names,
327
+ className: "flex min-w-0 cursor-pointer items-center gap-1.5 rounded-sm text-left text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring/50",
328
+ children: [
329
+ /* @__PURE__ */ jsx4(ChevronUp, { "aria-hidden": true, className: cn("size-3 shrink-0 transition-transform", open && "rotate-180") }),
330
+ /* @__PURE__ */ jsxs2("span", { className: "truncate", children: [
331
+ diff.length,
332
+ " changed",
333
+ !open && /* @__PURE__ */ jsxs2(Fragment, { children: [
334
+ ": ",
335
+ /* @__PURE__ */ jsx4("span", { className: "text-foreground", children: names })
336
+ ] })
337
+ ] })
338
+ ]
339
+ }
340
+ )
348
341
  ] });
349
342
  }
350
343
 
344
+ // src/react/theme.ts
345
+ var tweakpaneTheme = {
346
+ "--tp-base-background-color": "transparent",
347
+ "--tp-base-shadow-color": "transparent",
348
+ "--tp-base-border-radius": "0px",
349
+ "--tp-base-font-family": "var(--studio-font)",
350
+ "--tp-blade-border-radius": "var(--radius)",
351
+ "--tp-blade-horizontal-padding": "4px",
352
+ "--tp-blade-value-width": "168px",
353
+ "--tp-container-horizontal-padding": "8px",
354
+ "--tp-container-vertical-padding": "6px",
355
+ "--tp-container-unit-size": "22px",
356
+ "--tp-container-unit-spacing": "6px",
357
+ "--tp-container-background-color": "var(--card)",
358
+ "--tp-container-background-color-hover": "var(--field)",
359
+ "--tp-container-background-color-focus": "var(--field-hover)",
360
+ "--tp-container-background-color-active": "var(--field-active)",
361
+ "--tp-container-foreground-color": "var(--muted-foreground)",
362
+ "--tp-input-background-color": "var(--field)",
363
+ "--tp-input-background-color-hover": "var(--field-hover)",
364
+ "--tp-input-background-color-focus": "var(--field-active)",
365
+ "--tp-input-background-color-active": "var(--field-active)",
366
+ "--tp-input-foreground-color": "var(--foreground)",
367
+ // Buttons and slider knobs: lighter than fields so the knob reads against the track.
368
+ "--tp-button-background-color": "var(--knob)",
369
+ "--tp-button-background-color-hover": "var(--knob-hover)",
370
+ "--tp-button-background-color-focus": "var(--knob-hover)",
371
+ "--tp-button-background-color-active": "var(--muted-foreground)",
372
+ "--tp-button-foreground-color": "var(--foreground)",
373
+ "--tp-groove-foreground-color": "var(--border)",
374
+ "--tp-label-foreground-color": "var(--muted-foreground)",
375
+ "--tp-monitor-background-color": "var(--card)",
376
+ "--tp-monitor-foreground-color": "var(--muted-foreground)"
377
+ };
378
+
379
+ // src/react/tool-icon.tsx
380
+ import { SlidersHorizontal } from "lucide";
381
+ import { jsx as jsx5 } from "react/jsx-runtime";
382
+ var camel = (name) => name.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
383
+ function ToolIcon({ icon = SlidersHorizontal, ...props }) {
384
+ return /* @__PURE__ */ jsx5(
385
+ "svg",
386
+ {
387
+ viewBox: "0 0 24 24",
388
+ fill: "none",
389
+ stroke: "currentColor",
390
+ strokeWidth: 2,
391
+ strokeLinecap: "round",
392
+ strokeLinejoin: "round",
393
+ "aria-hidden": true,
394
+ ...props,
395
+ children: icon.map(([Tag, attrs], index) => {
396
+ const Element = Tag;
397
+ return /* @__PURE__ */ jsx5(
398
+ Element,
399
+ {
400
+ ...Object.fromEntries(Object.entries(attrs).map(([name, value]) => [camel(name), value]))
401
+ },
402
+ index
403
+ );
404
+ })
405
+ }
406
+ );
407
+ }
408
+
409
+ // src/react/ui/kbd.tsx
410
+ import { jsx as jsx6 } from "react/jsx-runtime";
411
+ function Kbd({ className, ...props }) {
412
+ return /* @__PURE__ */ jsx6(
413
+ "kbd",
414
+ {
415
+ "data-slot": "kbd",
416
+ className: cn(
417
+ "bg-muted text-muted-foreground border-border pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm border border-b-2 px-1 font-mono text-xs font-normal select-none",
418
+ "[&_svg:not([class*='size-'])]:size-3",
419
+ "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
420
+ className
421
+ ),
422
+ ...props
423
+ }
424
+ );
425
+ }
426
+ function KbdGroup({ className, ...props }) {
427
+ return /* @__PURE__ */ jsx6("span", { "data-slot": "kbd-group", className: cn("inline-flex items-center gap-1", className), ...props });
428
+ }
429
+
351
430
  // src/react/ui/panel.tsx
352
431
  import { Slot as Slot3 } from "radix-ui";
353
432
  import { forwardRef as forwardRef2 } from "react";
@@ -355,22 +434,22 @@ import { forwardRef as forwardRef2 } from "react";
355
434
  // src/react/surface.tsx
356
435
  import { Slot as Slot2 } from "radix-ui";
357
436
  import { forwardRef } from "react";
358
- import { jsx as jsx6 } from "react/jsx-runtime";
437
+ import { jsx as jsx7 } from "react/jsx-runtime";
359
438
  var StudioSurface = forwardRef(
360
439
  function StudioSurface2({ asChild = false, className, ...props }, ref) {
361
440
  const Comp = asChild ? Slot2.Root : "div";
362
- return /* @__PURE__ */ jsx6(Comp, { ref, "data-slot": "studio-surface", className: cn("studio-surface", className), ...props });
441
+ return /* @__PURE__ */ jsx7(Comp, { ref, "data-slot": "studio-surface", className: cn("studio-surface", className), ...props });
363
442
  }
364
443
  );
365
444
  var StudioToolbar = forwardRef(function StudioToolbar2({ className, ...props }, ref) {
366
- return /* @__PURE__ */ jsx6(StudioSurface, { ref, role: "group", className: cn("studio-toolbar", className), ...props });
445
+ return /* @__PURE__ */ jsx7(StudioSurface, { ref, role: "group", className: cn("studio-toolbar", className), ...props });
367
446
  });
368
447
 
369
448
  // src/react/ui/panel.tsx
370
- import { jsx as jsx7 } from "react/jsx-runtime";
449
+ import { jsx as jsx8 } from "react/jsx-runtime";
371
450
  var Panel = forwardRef2(function Panel2({ className, asChild = false, ...props }, ref) {
372
451
  const Comp = asChild ? Slot3.Root : "div";
373
- return /* @__PURE__ */ jsx7(
452
+ return /* @__PURE__ */ jsx8(
374
453
  Comp,
375
454
  {
376
455
  ref,
@@ -384,10 +463,10 @@ var Panel = forwardRef2(function Panel2({ className, asChild = false, ...props }
384
463
  );
385
464
  });
386
465
  function PanelHeader({ className, ...props }) {
387
- return /* @__PURE__ */ jsx7(StudioSurface, { asChild: true, className: cn("px-3 pt-2.5 pb-2", className), children: /* @__PURE__ */ jsx7("header", { "data-slot": "panel-header", ...props }) });
466
+ return /* @__PURE__ */ jsx8(StudioSurface, { asChild: true, className: cn("px-3 pt-2.5 pb-2", className), children: /* @__PURE__ */ jsx8("header", { "data-slot": "panel-header", ...props }) });
388
467
  }
389
468
  var PanelContent = forwardRef2(function PanelContent2({ className, ...props }, ref) {
390
- return /* @__PURE__ */ jsx7(
469
+ return /* @__PURE__ */ jsx8(
391
470
  "div",
392
471
  {
393
472
  ref,
@@ -398,11 +477,12 @@ var PanelContent = forwardRef2(function PanelContent2({ className, ...props }, r
398
477
  );
399
478
  });
400
479
  function PanelFooter({ className, ...props }) {
401
- return /* @__PURE__ */ jsx7(StudioSurface, { asChild: true, className: cn("grid gap-2 p-2", className), children: /* @__PURE__ */ jsx7("footer", { "data-slot": "panel-footer", ...props }) });
480
+ return /* @__PURE__ */ jsx8(StudioSurface, { asChild: true, className: cn("grid gap-2 p-2", className), children: /* @__PURE__ */ jsx8("footer", { "data-slot": "panel-footer", ...props }) });
402
481
  }
403
482
 
404
483
  // src/react/inspector.tsx
405
- import { Fragment, jsx as jsx8, jsxs as jsxs2 } from "react/jsx-runtime";
484
+ import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs3 } from "react/jsx-runtime";
485
+ var MISSING_UI = "[studio] Pick a controls UI: createStudio({ ui: tweakpane(() => import('tweakpane')) }), or dialkit(), from @joycostudio/studio/ui.";
406
486
  function describe(studio, handle) {
407
487
  const { state } = handle;
408
488
  if (handle.comparing) return { tone: "text-sky-400", text: "Showing saved" };
@@ -412,13 +492,6 @@ function describe(studio, handle) {
412
492
  if (handle.dirty) return { tone: "text-warning", text: "Unsaved" };
413
493
  return { tone: "text-success", text: state.saved.hash ? "Saved" : "Not on disk yet" };
414
494
  }
415
- function adoptTweakpaneStyles(container) {
416
- const root = container.getRootNode();
417
- if (!(root instanceof ShadowRoot)) return;
418
- for (const style of document.head.querySelectorAll("style[data-tp-style]")) {
419
- if (!root.querySelector(`style[data-tp-style="${style.dataset.tpStyle}"]`)) root.append(style.cloneNode(true));
420
- }
421
- }
422
495
  function Inspector({
423
496
  studio,
424
497
  handle,
@@ -427,39 +500,56 @@ function Inspector({
427
500
  }) {
428
501
  useStudio(studio);
429
502
  const container = useRef(null);
430
- const pane = useRef(null);
431
- const [failure, setFailure] = useState2(null);
503
+ const [failure, setFailure] = useState3(null);
504
+ const [copied, setCopied] = useState3(false);
432
505
  const { definition, state } = handle;
433
506
  const canDiscard = handle.dirty && !handle.comparing;
434
507
  const canSave = canDiscard && !!state;
435
508
  const save = (force = false) => void handle.save({ force }).then((result) => setFailure(result.ok ? null : result.message ?? result.error));
436
- useEffect(() => {
509
+ const share = () => {
510
+ const url = new URL(location.href);
511
+ url.hash = definition.id;
512
+ copyLink(handle.shareUrl(url)).then(
513
+ () => {
514
+ setFailure(null);
515
+ setCopied(true);
516
+ },
517
+ () => setFailure("Could not copy the share link")
518
+ );
519
+ };
520
+ useEffect2(() => {
521
+ if (!copied) return;
522
+ const timer = setTimeout(() => setCopied(false), 1500);
523
+ return () => clearTimeout(timer);
524
+ }, [copied]);
525
+ const { ui } = studio;
526
+ useEffect2(() => {
527
+ if (!ui) return;
437
528
  let disposed = false;
438
529
  let teardown = () => {
439
530
  };
440
- void import("tweakpane").then(({ Pane }) => {
441
- if (disposed || !container.current) return;
442
- const instance = new Pane({ container: container.current });
443
- pane.current = instance;
444
- const bound = bindDebugSchema(instance, {
445
- schema: () => handle.controls(),
446
- extend: resetSlidersOnDoubleClick(handle)
447
- });
448
- adoptTweakpaneStyles(container.current);
531
+ const title = definition.title ?? definition.id;
532
+ void ui.inline(container.current, { title }).then((host) => {
533
+ if (disposed || !container.current) return host.dispose();
534
+ const bound = bindDebugSchema(host, { schema: () => handle.controls() });
535
+ const root = container.current.getRootNode();
536
+ if (root instanceof ShadowRoot) void ui.adoptStyles(root);
449
537
  const unsubscribe = handle.subscribe(() => bound.refresh());
450
538
  teardown = () => {
451
539
  unsubscribe();
452
540
  bound.dispose();
453
- instance.dispose();
454
- pane.current = null;
541
+ host.dispose();
455
542
  };
456
543
  });
457
544
  return () => {
458
545
  disposed = true;
459
546
  teardown();
460
547
  };
461
- }, [handle]);
462
- useEffect(() => {
548
+ }, [handle, ui]);
549
+ useEffect2(() => {
550
+ if (container.current) container.current.inert = handle.comparing;
551
+ });
552
+ useEffect2(() => {
463
553
  const onKeyDown = (event) => {
464
554
  if (event.key !== "s" || !(event.metaKey || event.ctrlKey)) return;
465
555
  event.preventDefault();
@@ -468,22 +558,16 @@ function Inspector({
468
558
  addEventListener("keydown", onKeyDown);
469
559
  return () => removeEventListener("keydown", onKeyDown);
470
560
  });
471
- useEffect(() => {
472
- if (pane.current) pane.current.disabled = handle.comparing;
473
- });
474
561
  const ConfigFile = fileHref ? "a" : "span";
475
562
  const status = describe(studio, handle);
476
- const changes = handle.changes.map(
477
- (path) => path.split(".").map((key) => key.charAt(0).toUpperCase() + key.slice(1)).join(" \u203A ")
478
- );
479
- return /* @__PURE__ */ jsxs2(Fragment, { children: [
480
- /* @__PURE__ */ jsxs2(PanelHeader, { children: [
481
- /* @__PURE__ */ jsxs2("strong", { className: "flex min-w-0 items-center gap-2 text-foreground", children: [
482
- /* @__PURE__ */ jsx8(ToolIcon, { icon: definition.icon, className: "size-3.5 shrink-0" }),
483
- /* @__PURE__ */ jsx8("span", { className: "truncate", title: definition.title ?? definition.id, children: definition.title ?? definition.id })
563
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
564
+ /* @__PURE__ */ jsxs3(PanelHeader, { children: [
565
+ /* @__PURE__ */ jsxs3("strong", { className: "flex min-w-0 items-center gap-2 text-foreground", children: [
566
+ /* @__PURE__ */ jsx9(ToolIcon, { icon: definition.icon, className: "size-3.5 shrink-0" }),
567
+ /* @__PURE__ */ jsx9("span", { className: "truncate", title: definition.title ?? definition.id, children: definition.title ?? definition.id })
484
568
  ] }),
485
- /* @__PURE__ */ jsxs2("div", { className: "mt-1 flex items-center gap-3 pl-5.5 text-[11px]", children: [
486
- /* @__PURE__ */ jsx8(
569
+ /* @__PURE__ */ jsxs3("div", { className: "mt-1 flex items-center gap-3 pl-5.5 text-[11px]", children: [
570
+ /* @__PURE__ */ jsx9(
487
571
  ConfigFile,
488
572
  {
489
573
  "data-slot": "studio-config-file",
@@ -493,37 +577,43 @@ function Inspector({
493
577
  children: definition.file
494
578
  }
495
579
  ),
496
- /* @__PURE__ */ jsxs2(
580
+ /* @__PURE__ */ jsxs3(
497
581
  "span",
498
582
  {
499
583
  className: `flex shrink-0 items-center gap-1.5 ${status.tone}`,
500
584
  title: state ? `Draft revision ${state.draft.revision}` : void 0,
501
585
  children: [
502
- /* @__PURE__ */ jsx8("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-current" }),
586
+ /* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-current" }),
503
587
  status.text
504
588
  ]
505
589
  }
506
590
  )
507
591
  ] })
508
592
  ] }),
509
- /* @__PURE__ */ jsx8(PanelContent, { ref: container, "data-slot": "studio-controls", style: tweakpaneTheme }),
510
- /* @__PURE__ */ jsxs2(PanelFooter, { children: [
511
- failure && /* @__PURE__ */ jsx8("div", { className: "text-destructive", children: failure }),
512
- changes.length > 0 && /* @__PURE__ */ jsxs2("div", { className: "truncate text-muted-foreground", title: changes.join(", "), children: [
513
- changes.length,
514
- " changed: ",
515
- /* @__PURE__ */ jsx8("span", { className: "text-foreground", children: changes.join(", ") })
516
- ] }),
517
- /* @__PURE__ */ jsxs2("div", { className: "flex gap-2", children: [
518
- /* @__PURE__ */ jsx8(
593
+ /* @__PURE__ */ jsx9(
594
+ PanelContent,
595
+ {
596
+ ref: container,
597
+ "data-slot": "studio-controls",
598
+ "data-ui": ui?.kind,
599
+ className: "inert:opacity-50",
600
+ style: tweakpaneTheme,
601
+ children: !ui && /* @__PURE__ */ jsx9("p", { className: "p-2 text-destructive", children: MISSING_UI })
602
+ }
603
+ ),
604
+ /* @__PURE__ */ jsxs3(PanelFooter, { children: [
605
+ failure && /* @__PURE__ */ jsx9("div", { className: "text-destructive", children: failure }),
606
+ /* @__PURE__ */ jsx9(Changes, { handle }),
607
+ /* @__PURE__ */ jsxs3("div", { className: "flex gap-2", children: [
608
+ /* @__PURE__ */ jsx9(
519
609
  Hint,
520
610
  {
521
611
  className: "flex items-center gap-2",
522
- content: /* @__PURE__ */ jsxs2(Fragment, { children: [
612
+ content: /* @__PURE__ */ jsxs3(Fragment2, { children: [
523
613
  "Hold to compare with saved ",
524
- /* @__PURE__ */ jsx8(Kbd, { children: "\\" })
614
+ /* @__PURE__ */ jsx9(Kbd, { children: "\\" })
525
615
  ] }),
526
- children: /* @__PURE__ */ jsx8(
616
+ children: /* @__PURE__ */ jsx9(
527
617
  Button,
528
618
  {
529
619
  variant: "secondary",
@@ -538,12 +628,23 @@ function Inspector({
538
628
  },
539
629
  onPointerUp: () => onCompare(false),
540
630
  onPointerCancel: () => onCompare(false),
541
- children: /* @__PURE__ */ jsx8(SquareSplitHorizontal, {})
631
+ children: /* @__PURE__ */ jsx9(SquareSplitHorizontal, {})
542
632
  }
543
633
  )
544
634
  }
545
635
  ),
546
- /* @__PURE__ */ jsx8(
636
+ /* @__PURE__ */ jsx9(Hint, { content: copied ? "Link copied" : "Copy a link with this config", children: /* @__PURE__ */ jsx9(
637
+ Button,
638
+ {
639
+ variant: "secondary",
640
+ size: "icon-sm",
641
+ "aria-label": "Copy a link with this config",
642
+ className: "shrink-0",
643
+ onClick: share,
644
+ children: copied ? /* @__PURE__ */ jsx9(Check, { className: "text-success" }) : /* @__PURE__ */ jsx9(Link, {})
645
+ }
646
+ ) }),
647
+ /* @__PURE__ */ jsx9(
547
648
  Button,
548
649
  {
549
650
  variant: "secondary",
@@ -557,11 +658,11 @@ function Inspector({
557
658
  children: "Discard"
558
659
  }
559
660
  ),
560
- state?.conflict ? /* @__PURE__ */ jsx8(Button, { variant: "destructive", size: "sm", className: "flex-1", onClick: () => save(true), children: "Overwrite file" }) : /* @__PURE__ */ jsxs2(Button, { size: "sm", className: "flex-1", disabled: !canSave, onClick: () => save(), children: [
661
+ state?.conflict ? /* @__PURE__ */ jsx9(Button, { variant: "destructive", size: "sm", className: "flex-1", onClick: () => save(true), children: "Overwrite file" }) : /* @__PURE__ */ jsxs3(Button, { size: "sm", className: "flex-1", disabled: !canSave, onClick: () => save(), children: [
561
662
  "Save",
562
- /* @__PURE__ */ jsxs2(KbdGroup, { children: [
563
- /* @__PURE__ */ jsx8(Kbd, { children: "\u2318" }),
564
- /* @__PURE__ */ jsx8(Kbd, { children: "S" })
663
+ /* @__PURE__ */ jsxs3(KbdGroup, { children: [
664
+ /* @__PURE__ */ jsx9(Kbd, { children: "\u2318" }),
665
+ /* @__PURE__ */ jsx9(Kbd, { children: "S" })
565
666
  ] })
566
667
  ] })
567
668
  ] })
@@ -570,13 +671,13 @@ function Inspector({
570
671
  }
571
672
 
572
673
  // src/react/logo.tsx
573
- import { jsx as jsx9 } from "react/jsx-runtime";
674
+ import { jsx as jsx10 } from "react/jsx-runtime";
574
675
  function Logo(props) {
575
- return /* @__PURE__ */ jsx9("svg", { viewBox: "0 0 352 144", fill: "currentColor", "aria-label": "JOYCO", role: "img", ...props, children: /* @__PURE__ */ jsx9("path", { d: "M328 96L280 144H0V40H176V112H192V24H0V0H352V24H328V96Z" }) });
676
+ return /* @__PURE__ */ jsx10("svg", { viewBox: "0 0 352 144", fill: "currentColor", "aria-label": "JOYCO", role: "img", ...props, children: /* @__PURE__ */ jsx10("path", { d: "M328 96L280 144H0V40H176V112H192V24H0V0H352V24H328V96Z" }) });
576
677
  }
577
678
 
578
679
  // src/react/pinned-tools.ts
579
- import { useEffect as useEffect2, useState as useState3 } from "react";
680
+ import { useEffect as useEffect3, useState as useState4 } from "react";
580
681
  var STORAGE_KEY = "joyco-studio:pinned-tools";
581
682
  var CHANGE_EVENT = "joyco-studio:pins-changed";
582
683
  function readPins() {
@@ -588,8 +689,8 @@ function readPins() {
588
689
  }
589
690
  }
590
691
  function usePinnedTools(studio) {
591
- const [pins, setPins] = useState3([]);
592
- useEffect2(() => {
692
+ const [pins, setPins] = useState4([]);
693
+ useEffect3(() => {
593
694
  setPins(readPins());
594
695
  const onChange = (event) => setPins(event.detail);
595
696
  const onStorage = (event) => {
@@ -617,17 +718,17 @@ function usePinnedTools(studio) {
617
718
 
618
719
  // src/react/preview-canvas.tsx
619
720
  import { RotateCw } from "lucide-react";
620
- import { forwardRef as forwardRef3, useImperativeHandle, useRef as useRef2, useState as useState5 } from "react";
721
+ import { forwardRef as forwardRef3, useImperativeHandle, useRef as useRef2, useState as useState6 } from "react";
621
722
 
622
723
  // src/react/canvas-toolbar.tsx
623
724
  import { Maximize, Minimize, Pin, PinOff } from "lucide-react";
624
- import { useState as useState4 } from "react";
625
- import { jsx as jsx10, jsxs as jsxs3 } from "react/jsx-runtime";
626
- function CanvasToolbar({ label, expanded = false, onToggle, children }) {
627
- const [ghost, setGhost] = useState4(false);
725
+ import { useState as useState5 } from "react";
726
+ import { jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
727
+ function CanvasToolbar({ label: label2, expanded = false, onToggle, children }) {
728
+ const [ghost, setGhost] = useState5(false);
628
729
  const ExpandIcon = expanded ? Minimize : Maximize;
629
730
  const PinIcon = ghost ? PinOff : Pin;
630
- return /* @__PURE__ */ jsx10(
731
+ return /* @__PURE__ */ jsx11(
631
732
  "div",
632
733
  {
633
734
  className: "studio-canvas-toolbar",
@@ -635,22 +736,22 @@ function CanvasToolbar({ label, expanded = false, onToggle, children }) {
635
736
  "data-expanded": expanded || void 0,
636
737
  "data-ghost": !expanded && ghost || void 0,
637
738
  role: "group",
638
- "aria-label": label,
639
- children: /* @__PURE__ */ jsxs3(StudioToolbar, { className: "studio-canvas-actions", children: [
739
+ "aria-label": label2,
740
+ children: /* @__PURE__ */ jsxs4(StudioToolbar, { className: "studio-canvas-actions", children: [
640
741
  children,
641
- onToggle && /* @__PURE__ */ jsx10("div", { className: "studio-canvas-toggle", children: /* @__PURE__ */ jsxs3("button", { "data-slot": "toolbar-action", type: "button", "aria-pressed": expanded, onClick: onToggle, children: [
642
- /* @__PURE__ */ jsx10(ExpandIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true }),
742
+ onToggle && /* @__PURE__ */ jsx11("div", { className: "studio-canvas-toggle", children: /* @__PURE__ */ jsxs4("button", { "data-slot": "toolbar-action", type: "button", "aria-pressed": expanded, onClick: onToggle, children: [
743
+ /* @__PURE__ */ jsx11(ExpandIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true }),
643
744
  expanded ? "Contain canvas" : "Expand"
644
745
  ] }) }),
645
- !expanded && /* @__PURE__ */ jsx10(
746
+ !expanded && /* @__PURE__ */ jsx11(
646
747
  "button",
647
748
  {
648
749
  type: "button",
649
- "aria-label": `Auto-hide ${label.toLowerCase()} header`,
750
+ "aria-label": `Auto-hide ${label2.toLowerCase()} header`,
650
751
  "aria-pressed": ghost,
651
752
  title: ghost ? "Pin header" : "Auto-hide header",
652
753
  onClick: () => setGhost(!ghost),
653
- children: /* @__PURE__ */ jsx10(PinIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
754
+ children: /* @__PURE__ */ jsx11(PinIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
654
755
  }
655
756
  )
656
757
  ] })
@@ -659,13 +760,13 @@ function CanvasToolbar({ label, expanded = false, onToggle, children }) {
659
760
  }
660
761
 
661
762
  // src/react/preview-canvas.tsx
662
- import { jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
763
+ import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
663
764
  var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", expanded: controlled, onExpandedChange, onReload, toolbar, ...props }, ref) {
664
- const [localExpanded, setExpanded] = useState5(false);
765
+ const [localExpanded, setExpanded] = useState6(false);
665
766
  const expanded = controlled ?? localExpanded;
666
767
  const frame = useRef2(null);
667
768
  useImperativeHandle(ref, () => frame.current, []);
668
- return /* @__PURE__ */ jsxs4(
769
+ return /* @__PURE__ */ jsxs5(
669
770
  "section",
670
771
  {
671
772
  className: "studio-preview-canvas",
@@ -673,7 +774,7 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
673
774
  "data-expanded": expanded || void 0,
674
775
  "aria-label": `${title} canvas`,
675
776
  children: [
676
- /* @__PURE__ */ jsxs4(
777
+ /* @__PURE__ */ jsxs5(
677
778
  CanvasToolbar,
678
779
  {
679
780
  label: "Preview canvas",
@@ -683,7 +784,7 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
683
784
  onExpandedChange?.(!expanded);
684
785
  },
685
786
  children: [
686
- /* @__PURE__ */ jsx11(
787
+ /* @__PURE__ */ jsx12(
687
788
  "button",
688
789
  {
689
790
  type: "button",
@@ -693,30 +794,30 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
693
794
  onReload?.();
694
795
  if (frame.current) frame.current.src = frame.current.src;
695
796
  },
696
- children: /* @__PURE__ */ jsx11(RotateCw, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
797
+ children: /* @__PURE__ */ jsx12(RotateCw, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
697
798
  }
698
799
  ),
699
- /* @__PURE__ */ jsx11("div", { className: "studio-preview-source", children: toolbar ?? /* @__PURE__ */ jsx11("span", { className: "studio-preview-title", children: title }) })
800
+ /* @__PURE__ */ jsx12("div", { className: "studio-preview-source", children: toolbar ?? /* @__PURE__ */ jsx12("span", { className: "studio-preview-title", children: title }) })
700
801
  ]
701
802
  }
702
803
  ),
703
- /* @__PURE__ */ jsx11("iframe", { ...props, ref: frame, title })
804
+ /* @__PURE__ */ jsx12("iframe", { ...props, ref: frame, title })
704
805
  ]
705
806
  }
706
807
  );
707
808
  });
708
809
 
709
810
  // src/react/session-flag.ts
710
- import { useEffect as useEffect3, useState as useState6 } from "react";
811
+ import { useEffect as useEffect4, useState as useState7 } from "react";
711
812
  function useSessionFlag(key) {
712
- const [value, setValue] = useState6(() => {
813
+ const [value, setValue] = useState7(() => {
713
814
  try {
714
815
  return sessionStorage.getItem(key) === "true";
715
816
  } catch {
716
817
  return false;
717
818
  }
718
819
  });
719
- useEffect3(() => {
820
+ useEffect4(() => {
720
821
  try {
721
822
  sessionStorage.setItem(key, String(value));
722
823
  } catch {
@@ -750,15 +851,15 @@ function useIsMobile() {
750
851
  // src/react/ui/sheet.tsx
751
852
  import { XIcon } from "lucide-react";
752
853
  import { Dialog as SheetPrimitive } from "@base-ui/react/dialog";
753
- import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
854
+ import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
754
855
  function Sheet({ ...props }) {
755
- return /* @__PURE__ */ jsx12(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
856
+ return /* @__PURE__ */ jsx13(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
756
857
  }
757
858
  function SheetPortal({ ...props }) {
758
- return /* @__PURE__ */ jsx12(SheetPrimitive.Portal, { "data-slot": "sheet-portal", container: usePortalContainer(), ...props });
859
+ return /* @__PURE__ */ jsx13(SheetPrimitive.Portal, { "data-slot": "sheet-portal", container: usePortalContainer(), ...props });
759
860
  }
760
861
  function SheetOverlay({ className, ...props }) {
761
- return /* @__PURE__ */ jsx12(
862
+ return /* @__PURE__ */ jsx13(
762
863
  SheetPrimitive.Backdrop,
763
864
  {
764
865
  "data-slot": "sheet-overlay",
@@ -777,9 +878,9 @@ function SheetContent({
777
878
  showCloseButton = true,
778
879
  ...props
779
880
  }) {
780
- return /* @__PURE__ */ jsxs5(SheetPortal, { children: [
781
- /* @__PURE__ */ jsx12(SheetOverlay, {}),
782
- /* @__PURE__ */ jsxs5(
881
+ return /* @__PURE__ */ jsxs6(SheetPortal, { children: [
882
+ /* @__PURE__ */ jsx13(SheetOverlay, {}),
883
+ /* @__PURE__ */ jsxs6(
783
884
  SheetPrimitive.Popup,
784
885
  {
785
886
  "data-slot": "sheet-content",
@@ -794,9 +895,9 @@ function SheetContent({
794
895
  ...props,
795
896
  children: [
796
897
  children,
797
- showCloseButton && /* @__PURE__ */ jsxs5(SheetPrimitive.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none", children: [
798
- /* @__PURE__ */ jsx12(XIcon, { className: "size-4" }),
799
- /* @__PURE__ */ jsx12("span", { className: "sr-only", children: "Close" })
898
+ showCloseButton && /* @__PURE__ */ jsxs6(SheetPrimitive.Close, { className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none", children: [
899
+ /* @__PURE__ */ jsx13(XIcon, { className: "size-4" }),
900
+ /* @__PURE__ */ jsx13("span", { className: "sr-only", children: "Close" })
800
901
  ] })
801
902
  ]
802
903
  }
@@ -804,10 +905,10 @@ function SheetContent({
804
905
  ] });
805
906
  }
806
907
  function SheetHeader({ className, ...props }) {
807
- return /* @__PURE__ */ jsx12("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props });
908
+ return /* @__PURE__ */ jsx13("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props });
808
909
  }
809
910
  function SheetTitle({ className, ...props }) {
810
- return /* @__PURE__ */ jsx12(
911
+ return /* @__PURE__ */ jsx13(
811
912
  SheetPrimitive.Title,
812
913
  {
813
914
  "data-slot": "sheet-title",
@@ -817,7 +918,7 @@ function SheetTitle({ className, ...props }) {
817
918
  );
818
919
  }
819
920
  function SheetDescription({ className, ...props }) {
820
- return /* @__PURE__ */ jsx12(
921
+ return /* @__PURE__ */ jsx13(
821
922
  SheetPrimitive.Description,
822
923
  {
823
924
  "data-slot": "sheet-description",
@@ -828,7 +929,7 @@ function SheetDescription({ className, ...props }) {
828
929
  }
829
930
 
830
931
  // src/react/ui/sidebar.tsx
831
- import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
932
+ import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
832
933
  var SIDEBAR_COOKIE_NAME = "sidebar_state";
833
934
  var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
834
935
  var SIDEBAR_WIDTH = "256px";
@@ -883,7 +984,7 @@ function SidebarProvider({
883
984
  }),
884
985
  [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
885
986
  );
886
- return /* @__PURE__ */ jsx13(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx13(TooltipProvider, { delay: 0, children: /* @__PURE__ */ jsx13(
987
+ return /* @__PURE__ */ jsx14(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx14(TooltipProvider, { delay: 0, children: /* @__PURE__ */ jsx14(
887
988
  "div",
888
989
  {
889
990
  "data-slot": "sidebar-wrapper",
@@ -909,7 +1010,7 @@ function Sidebar({
909
1010
  const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
910
1011
  const Surface = variant === "floating" ? Panel : "div";
911
1012
  if (collapsible === "none") {
912
- return /* @__PURE__ */ jsx13(
1013
+ return /* @__PURE__ */ jsx14(
913
1014
  "div",
914
1015
  {
915
1016
  "data-slot": "sidebar",
@@ -920,7 +1021,7 @@ function Sidebar({
920
1021
  );
921
1022
  }
922
1023
  if (isMobile) {
923
- return /* @__PURE__ */ jsx13(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs6(
1024
+ return /* @__PURE__ */ jsx14(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs7(
924
1025
  SheetContent,
925
1026
  {
926
1027
  "data-sidebar": "sidebar",
@@ -932,16 +1033,16 @@ function Sidebar({
932
1033
  },
933
1034
  side,
934
1035
  children: [
935
- /* @__PURE__ */ jsxs6(SheetHeader, { className: "sr-only", children: [
936
- /* @__PURE__ */ jsx13(SheetTitle, { children: "Sidebar" }),
937
- /* @__PURE__ */ jsx13(SheetDescription, { children: "Displays the mobile sidebar." })
1036
+ /* @__PURE__ */ jsxs7(SheetHeader, { className: "sr-only", children: [
1037
+ /* @__PURE__ */ jsx14(SheetTitle, { children: "Sidebar" }),
1038
+ /* @__PURE__ */ jsx14(SheetDescription, { children: "Displays the mobile sidebar." })
938
1039
  ] }),
939
- /* @__PURE__ */ jsx13("div", { className: "flex h-full w-full flex-col", children })
1040
+ /* @__PURE__ */ jsx14("div", { className: "flex h-full w-full flex-col", children })
940
1041
  ]
941
1042
  }
942
1043
  ) });
943
1044
  }
944
- return /* @__PURE__ */ jsxs6(
1045
+ return /* @__PURE__ */ jsxs7(
945
1046
  "div",
946
1047
  {
947
1048
  className: "group peer hidden text-sidebar-foreground md:block",
@@ -951,7 +1052,7 @@ function Sidebar({
951
1052
  "data-side": side,
952
1053
  "data-slot": "sidebar",
953
1054
  children: [
954
- /* @__PURE__ */ jsx13(
1055
+ /* @__PURE__ */ jsx14(
955
1056
  "div",
956
1057
  {
957
1058
  "data-slot": "sidebar-gap",
@@ -963,7 +1064,7 @@ function Sidebar({
963
1064
  )
964
1065
  }
965
1066
  ),
966
- /* @__PURE__ */ jsx13(
1067
+ /* @__PURE__ */ jsx14(
967
1068
  "div",
968
1069
  {
969
1070
  "data-slot": "sidebar-container",
@@ -975,7 +1076,7 @@ function Sidebar({
975
1076
  className
976
1077
  ),
977
1078
  ...props,
978
- children: /* @__PURE__ */ jsx13(
1079
+ children: /* @__PURE__ */ jsx14(
979
1080
  Surface,
980
1081
  {
981
1082
  "data-sidebar": "sidebar",
@@ -991,7 +1092,7 @@ function Sidebar({
991
1092
  );
992
1093
  }
993
1094
  function SidebarHeader({ className, ...props }) {
994
- return /* @__PURE__ */ jsx13(
1095
+ return /* @__PURE__ */ jsx14(
995
1096
  "div",
996
1097
  {
997
1098
  "data-slot": "sidebar-header",
@@ -1002,7 +1103,7 @@ function SidebarHeader({ className, ...props }) {
1002
1103
  );
1003
1104
  }
1004
1105
  function SidebarFooter({ className, ...props }) {
1005
- return /* @__PURE__ */ jsx13(
1106
+ return /* @__PURE__ */ jsx14(
1006
1107
  "div",
1007
1108
  {
1008
1109
  "data-slot": "sidebar-footer",
@@ -1013,7 +1114,7 @@ function SidebarFooter({ className, ...props }) {
1013
1114
  );
1014
1115
  }
1015
1116
  function SidebarContent({ className, ...props }) {
1016
- return /* @__PURE__ */ jsx13(
1117
+ return /* @__PURE__ */ jsx14(
1017
1118
  "div",
1018
1119
  {
1019
1120
  "data-slot": "sidebar-content",
@@ -1027,7 +1128,7 @@ function SidebarContent({ className, ...props }) {
1027
1128
  );
1028
1129
  }
1029
1130
  function SidebarGroup({ className, ...props }) {
1030
- return /* @__PURE__ */ jsx13(
1131
+ return /* @__PURE__ */ jsx14(
1031
1132
  "div",
1032
1133
  {
1033
1134
  "data-slot": "sidebar-group",
@@ -1038,7 +1139,7 @@ function SidebarGroup({ className, ...props }) {
1038
1139
  );
1039
1140
  }
1040
1141
  function SidebarMenu({ className, ...props }) {
1041
- return /* @__PURE__ */ jsx13(
1142
+ return /* @__PURE__ */ jsx14(
1042
1143
  "ul",
1043
1144
  {
1044
1145
  "data-slot": "sidebar-menu",
@@ -1049,7 +1150,7 @@ function SidebarMenu({ className, ...props }) {
1049
1150
  );
1050
1151
  }
1051
1152
  function SidebarMenuItem({ className, ...props }) {
1052
- return /* @__PURE__ */ jsx13(
1153
+ return /* @__PURE__ */ jsx14(
1053
1154
  "li",
1054
1155
  {
1055
1156
  "data-slot": "sidebar-menu-item",
@@ -1090,7 +1191,7 @@ function SidebarMenuButton({
1090
1191
  }) {
1091
1192
  const Comp = asChild ? Slot4.Root : "button";
1092
1193
  const { isMobile, state } = useSidebar();
1093
- const button2 = /* @__PURE__ */ jsx13(
1194
+ const button2 = /* @__PURE__ */ jsx14(
1094
1195
  Comp,
1095
1196
  {
1096
1197
  "data-slot": "sidebar-menu-button",
@@ -1103,7 +1204,7 @@ function SidebarMenuButton({
1103
1204
  );
1104
1205
  if (!tooltip) return button2;
1105
1206
  const { children, ...hint } = typeof tooltip === "string" ? { children: tooltip } : tooltip;
1106
- return /* @__PURE__ */ jsx13(Hint, { side: "right", align: "center", disabled: state !== "collapsed" || isMobile, ...hint, content: children, children: button2 });
1207
+ return /* @__PURE__ */ jsx14(Hint, { side: "right", align: "center", disabled: state !== "collapsed" || isMobile, ...hint, content: children, children: button2 });
1107
1208
  }
1108
1209
  function SidebarMenuAction({
1109
1210
  className,
@@ -1112,7 +1213,7 @@ function SidebarMenuAction({
1112
1213
  ...props
1113
1214
  }) {
1114
1215
  const Comp = asChild ? Slot4.Root : "button";
1115
- return /* @__PURE__ */ jsx13(
1216
+ return /* @__PURE__ */ jsx14(
1116
1217
  Comp,
1117
1218
  {
1118
1219
  "data-slot": "sidebar-menu-action",
@@ -1131,7 +1232,7 @@ function SidebarMenuAction({
1131
1232
  }
1132
1233
 
1133
1234
  // src/react/studio.tsx
1134
- import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
1235
+ import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
1135
1236
  var CONNECTION = {
1136
1237
  connected: { icon: PlugZap, tone: "text-success", label: "Runtime connected" },
1137
1238
  connecting: { icon: LoaderCircle, tone: "text-warning animate-spin", label: "Connecting to runtime" },
@@ -1140,22 +1241,22 @@ var CONNECTION = {
1140
1241
  };
1141
1242
  function StudioFooter({ connection }) {
1142
1243
  const { state, toggleSidebar } = useSidebar();
1143
- const { icon: Status, tone, label } = CONNECTION[connection.phase];
1244
+ const { icon: Status, tone, label: label2 } = CONNECTION[connection.phase];
1144
1245
  const Toggle = state === "expanded" ? PanelLeftClose : PanelLeftOpen;
1145
- return /* @__PURE__ */ jsx14(SidebarFooter, { children: /* @__PURE__ */ jsxs7(SidebarMenu, { children: [
1146
- /* @__PURE__ */ jsx14(SidebarMenuItem, { children: /* @__PURE__ */ jsxs7(SidebarMenuButton, { tooltip: label, className: "cursor-default hover:bg-transparent active:bg-transparent", children: [
1147
- /* @__PURE__ */ jsx14(Status, { className: tone }),
1148
- /* @__PURE__ */ jsx14("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: label })
1246
+ return /* @__PURE__ */ jsx15(SidebarFooter, { children: /* @__PURE__ */ jsxs8(SidebarMenu, { children: [
1247
+ /* @__PURE__ */ jsx15(SidebarMenuItem, { children: /* @__PURE__ */ jsxs8(SidebarMenuButton, { tooltip: label2, className: "cursor-default hover:bg-transparent active:bg-transparent", children: [
1248
+ /* @__PURE__ */ jsx15(Status, { className: tone }),
1249
+ /* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: label2 })
1149
1250
  ] }) }),
1150
- /* @__PURE__ */ jsx14(SidebarMenuItem, { children: /* @__PURE__ */ jsxs7(
1251
+ /* @__PURE__ */ jsx15(SidebarMenuItem, { children: /* @__PURE__ */ jsxs8(
1151
1252
  SidebarMenuButton,
1152
1253
  {
1153
1254
  "aria-label": `${state === "expanded" ? "Collapse" : "Expand"} sidebar`,
1154
1255
  tooltip: `${state === "expanded" ? "Collapse" : "Expand"} sidebar`,
1155
1256
  onClick: toggleSidebar,
1156
1257
  children: [
1157
- /* @__PURE__ */ jsx14(Toggle, {}),
1158
- /* @__PURE__ */ jsx14("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: "Collapse" })
1258
+ /* @__PURE__ */ jsx15(Toggle, {}),
1259
+ /* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: "Collapse" })
1159
1260
  ]
1160
1261
  }
1161
1262
  ) })
@@ -1185,11 +1286,11 @@ function forwardShortcuts(frame) {
1185
1286
  function Studio({ studio, previewComponent, getConfigFileHref }) {
1186
1287
  useStudio(studio);
1187
1288
  const { tools, pinned, togglePin } = usePinnedTools(studio);
1188
- const [mounted, setMounted] = useState9(false);
1289
+ const [mounted, setMounted] = useState10(false);
1189
1290
  const [sidebarHidden, setSidebarHidden] = useSessionFlag("joyco-studio:sidebar-hidden");
1190
1291
  const [inspectorHidden, setInspectorHidden] = useSessionFlag("joyco-studio:inspector-hidden");
1191
1292
  const [canvasExpanded, setCanvasExpanded] = useSessionFlag("joyco-studio:canvas-expanded");
1192
- const [selected, setSelected] = useState9(studio.definitions[0]?.id);
1293
+ const [selected, setSelected] = useState10(studio.definitions[0]?.id);
1193
1294
  const preview = useRef3(null);
1194
1295
  const definition = studio.definitions.find((tool) => tool.id === selected);
1195
1296
  const handle = studio.tools.find((tool) => tool.definition.id === selected);
@@ -1198,7 +1299,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1198
1299
  const show = { left: () => setSidebarHidden(false), right: () => setInspectorHidden(false) };
1199
1300
  const layout = useRef3(hidden);
1200
1301
  layout.current = hidden;
1201
- useEffect5(() => {
1302
+ useEffect6(() => {
1202
1303
  const onKey = (event) => {
1203
1304
  if (event.defaultPrevented || event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) return;
1204
1305
  if (event.key.toLowerCase() !== "b") return;
@@ -1221,10 +1322,10 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1221
1322
  handle.compare(showSaved);
1222
1323
  postCompare(preview.current?.contentWindow, handle.definition.id, showSaved);
1223
1324
  };
1224
- useEffect5(() => () => handle?.compare(false), [handle]);
1325
+ useEffect6(() => () => handle?.compare(false), [handle]);
1225
1326
  const current = useRef3({ handle, compare });
1226
1327
  current.current = { handle, compare };
1227
- useEffect5(() => {
1328
+ useEffect6(() => {
1228
1329
  const onKey = (event) => {
1229
1330
  if (event.key !== COMPARE_KEY || editable(event) || event.repeat) return;
1230
1331
  event.preventDefault();
@@ -1242,7 +1343,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1242
1343
  removeEventListener("blur", release);
1243
1344
  };
1244
1345
  }, []);
1245
- useEffect5(() => {
1346
+ useEffect6(() => {
1246
1347
  const onKey = (event) => {
1247
1348
  const action = event.defaultPrevented ? null : historyAction(event);
1248
1349
  if (!action) return;
@@ -1252,7 +1353,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1252
1353
  addEventListener("keydown", onKey);
1253
1354
  return () => removeEventListener("keydown", onKey);
1254
1355
  }, []);
1255
- useEffect5(() => {
1356
+ useEffect6(() => {
1256
1357
  const fromHash = () => {
1257
1358
  const id = decodeURIComponent(location.hash.slice(1));
1258
1359
  if (studio.definitions.some((tool) => tool.id === id)) setSelected(id);
@@ -1264,7 +1365,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1264
1365
  }, [studio]);
1265
1366
  if (!mounted) return null;
1266
1367
  const sidebarOpen = !document.cookie.split("; ").includes("sidebar_state=false");
1267
- return /* @__PURE__ */ jsx14(StudioShadowRoot, { children: /* @__PURE__ */ jsxs7(
1368
+ return /* @__PURE__ */ jsx15(StudioShadowRoot, { children: /* @__PURE__ */ jsxs8(
1268
1369
  SidebarProvider,
1269
1370
  {
1270
1371
  defaultOpen: sidebarOpen,
@@ -1272,7 +1373,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1272
1373
  "data-sidebar-panel": hidden.left ? "hidden" : "shown",
1273
1374
  className: "studio-workspace relative h-svh min-h-0 overflow-hidden text-xs",
1274
1375
  children: [
1275
- definition?.preview ? /* @__PURE__ */ jsx14(
1376
+ definition?.preview ? /* @__PURE__ */ jsx15(
1276
1377
  Preview,
1277
1378
  {
1278
1379
  "data-slot": "studio-preview",
@@ -1283,44 +1384,44 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1283
1384
  ...Preview === PreviewCanvas && { expanded: canvasExpanded, onExpandedChange: setCanvasExpanded }
1284
1385
  },
1285
1386
  definition.id
1286
- ) : /* @__PURE__ */ jsx14("div", { className: "absolute inset-0 grid place-items-center text-faint", children: definition ? "This tool has no preview" : "No tools registered" }),
1387
+ ) : /* @__PURE__ */ jsx15("div", { className: "absolute inset-0 grid place-items-center text-faint", children: definition ? "This tool has no preview" : "No tools registered" }),
1287
1388
  ["left", "right"].filter((side) => hidden[side] && (side === "left" || handle)).map((side) => {
1288
1389
  const Chevron = side === "left" ? ChevronRight : ChevronLeft;
1289
- const label = side === "left" ? "Show tools" : "Show inspector";
1290
- return /* @__PURE__ */ jsx14(
1390
+ const label2 = side === "left" ? "Show tools" : "Show inspector";
1391
+ return /* @__PURE__ */ jsx15(
1291
1392
  "div",
1292
1393
  {
1293
1394
  "data-slot": "studio-panel-edge",
1294
1395
  "data-side": side,
1295
1396
  className: cn("group/edge absolute inset-y-0 z-20 w-8", side === "left" ? "left-0" : "right-0"),
1296
- children: /* @__PURE__ */ jsx14(
1397
+ children: /* @__PURE__ */ jsx15(
1297
1398
  Hint,
1298
1399
  {
1299
1400
  side: side === "left" ? "right" : "left",
1300
1401
  sideOffset: 8,
1301
1402
  className: "flex items-center gap-2",
1302
- content: /* @__PURE__ */ jsxs7(Fragment2, { children: [
1303
- label,
1403
+ content: /* @__PURE__ */ jsxs8(Fragment3, { children: [
1404
+ label2,
1304
1405
  " ",
1305
- /* @__PURE__ */ jsx14("span", { className: "text-faint", children: "\xB7 both" }),
1306
- /* @__PURE__ */ jsxs7(KbdGroup, { children: [
1307
- /* @__PURE__ */ jsx14(Kbd, { children: "\u2318/Ctrl" }),
1308
- /* @__PURE__ */ jsx14(Kbd, { children: "B" })
1406
+ /* @__PURE__ */ jsx15("span", { className: "text-faint", children: "\xB7 both" }),
1407
+ /* @__PURE__ */ jsxs8(KbdGroup, { children: [
1408
+ /* @__PURE__ */ jsx15(Kbd, { children: "\u2318/Ctrl" }),
1409
+ /* @__PURE__ */ jsx15(Kbd, { children: "B" })
1309
1410
  ] })
1310
1411
  ] }),
1311
- children: /* @__PURE__ */ jsx14(Panel, { asChild: true, children: /* @__PURE__ */ jsx14(
1412
+ children: /* @__PURE__ */ jsx15(Panel, { asChild: true, children: /* @__PURE__ */ jsx15(
1312
1413
  Button,
1313
1414
  {
1314
1415
  "data-slot": "studio-panel-reveal",
1315
1416
  variant: "ghost",
1316
1417
  size: "icon",
1317
- "aria-label": label,
1418
+ "aria-label": label2,
1318
1419
  onClick: show[side],
1319
1420
  className: cn(
1320
1421
  "absolute top-1/2 h-16 w-6 -translate-y-1/2 cursor-pointer px-0 text-sidebar-foreground opacity-0 transition-[translate,opacity] duration-200 ease-out hover:bg-sidebar/95 hover:text-foreground focus:translate-x-0 focus:opacity-100 group-hover/edge:translate-x-0 group-hover/edge:opacity-100 motion-reduce:transition-none [@media(hover:none)]:translate-x-0 [@media(hover:none)]:opacity-100",
1321
1422
  side === "left" ? "left-1 -translate-x-[calc(100%+0.25rem)]" : "right-1 translate-x-[calc(100%+0.25rem)]"
1322
1423
  ),
1323
- children: /* @__PURE__ */ jsx14(Chevron, { "aria-hidden": true })
1424
+ children: /* @__PURE__ */ jsx15(Chevron, { "aria-hidden": true })
1324
1425
  }
1325
1426
  ) })
1326
1427
  }
@@ -1329,7 +1430,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1329
1430
  side
1330
1431
  );
1331
1432
  }),
1332
- /* @__PURE__ */ jsxs7(
1433
+ /* @__PURE__ */ jsxs8(
1333
1434
  Sidebar,
1334
1435
  {
1335
1436
  collapsible: "icon",
@@ -1341,30 +1442,30 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1341
1442
  hidden.left && "-translate-x-[calc(100%+1rem)]"
1342
1443
  ),
1343
1444
  children: [
1344
- /* @__PURE__ */ jsx14(SidebarHeader, { className: "h-10 flex-row items-center overflow-hidden py-0 pr-0 pl-4 transition-[padding] duration-200 ease-out group-data-[collapsible=icon]:pl-[calc(1.5rem-0.875rem*352/144/2)] motion-reduce:transition-none", children: /* @__PURE__ */ jsxs7("span", { className: "flex items-center gap-2.5 text-foreground", children: [
1345
- /* @__PURE__ */ jsx14(Logo, { className: "h-3.5 w-auto shrink-0" }),
1346
- /* @__PURE__ */ jsx14("strong", { className: "tracking-[0.08em] whitespace-nowrap", children: "STUDIO" }),
1347
- /* @__PURE__ */ jsxs7("span", { "data-slot": "studio-version", className: "text-[10px] text-faint group-data-[collapsible=icon]:hidden", children: [
1445
+ /* @__PURE__ */ jsx15(SidebarHeader, { className: "h-10 flex-row items-center overflow-hidden py-0 pr-0 pl-4 transition-[padding] duration-200 ease-out group-data-[collapsible=icon]:pl-[calc(1.5rem-0.875rem*352/144/2)] motion-reduce:transition-none", children: /* @__PURE__ */ jsxs8("span", { className: "flex items-center gap-2.5 text-foreground", children: [
1446
+ /* @__PURE__ */ jsx15(Logo, { className: "h-3.5 w-auto shrink-0" }),
1447
+ /* @__PURE__ */ jsx15("strong", { className: "tracking-[0.08em] whitespace-nowrap", children: "STUDIO" }),
1448
+ /* @__PURE__ */ jsxs8("span", { "data-slot": "studio-version", className: "text-[10px] text-faint group-data-[collapsible=icon]:hidden", children: [
1348
1449
  "v",
1349
1450
  version
1350
1451
  ] })
1351
1452
  ] }) }),
1352
- /* @__PURE__ */ jsx14(SidebarContent, { children: /* @__PURE__ */ jsx14(SidebarGroup, { children: /* @__PURE__ */ jsx14(SidebarMenu, { children: tools.map((tool) => {
1453
+ /* @__PURE__ */ jsx15(SidebarContent, { children: /* @__PURE__ */ jsx15(SidebarGroup, { children: /* @__PURE__ */ jsx15(SidebarMenu, { children: tools.map((tool) => {
1353
1454
  const title = tool.title ?? tool.id;
1354
1455
  const isPinned = pinned.has(tool.id);
1355
1456
  const { state, dirty } = studio.tools.find((handle2) => handle2.definition.id === tool.id) ?? {};
1356
1457
  const pinLabel = `${isPinned ? "Unpin" : "Pin"} ${title}`;
1357
- return /* @__PURE__ */ jsxs7(SidebarMenuItem, { children: [
1358
- /* @__PURE__ */ jsxs7(
1458
+ return /* @__PURE__ */ jsxs8(SidebarMenuItem, { children: [
1459
+ /* @__PURE__ */ jsxs8(
1359
1460
  SidebarMenuButton,
1360
1461
  {
1361
1462
  isActive: tool.id === selected,
1362
1463
  tooltip: title,
1363
1464
  onClick: () => location.hash = tool.id,
1364
1465
  children: [
1365
- /* @__PURE__ */ jsxs7("span", { className: "relative", children: [
1366
- /* @__PURE__ */ jsx14(ToolIcon, { icon: tool.icon, className: "size-4" }),
1367
- dirty && /* @__PURE__ */ jsx14(
1466
+ /* @__PURE__ */ jsxs8("span", { className: "relative", children: [
1467
+ /* @__PURE__ */ jsx15(ToolIcon, { icon: tool.icon, className: "size-4" }),
1468
+ dirty && /* @__PURE__ */ jsx15(
1368
1469
  "span",
1369
1470
  {
1370
1471
  "aria-label": state?.conflict ? "Changed on disk" : "Unsaved",
@@ -1375,11 +1476,11 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1375
1476
  }
1376
1477
  )
1377
1478
  ] }),
1378
- /* @__PURE__ */ jsx14("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: title })
1479
+ /* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: title })
1379
1480
  ]
1380
1481
  }
1381
1482
  ),
1382
- /* @__PURE__ */ jsx14(Hint, { content: pinLabel, side: "right", children: /* @__PURE__ */ jsx14(
1483
+ /* @__PURE__ */ jsx15(Hint, { content: pinLabel, side: "right", children: /* @__PURE__ */ jsx15(
1383
1484
  SidebarMenuAction,
1384
1485
  {
1385
1486
  type: "button",
@@ -1391,16 +1492,16 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1391
1492
  "cursor-pointer [&>svg]:size-3 [@media(hover:none)]:opacity-100",
1392
1493
  isPinned && "text-sidebar-primary"
1393
1494
  ),
1394
- children: /* @__PURE__ */ jsx14(Pin2, { "aria-hidden": true, fill: isPinned ? "currentColor" : "none" })
1495
+ children: /* @__PURE__ */ jsx15(Pin2, { "aria-hidden": true, fill: isPinned ? "currentColor" : "none" })
1395
1496
  }
1396
1497
  ) })
1397
1498
  ] }, tool.id);
1398
1499
  }) }) }) }),
1399
- /* @__PURE__ */ jsx14(StudioFooter, { connection: studio.connection })
1500
+ /* @__PURE__ */ jsx15(StudioFooter, { connection: studio.connection })
1400
1501
  ]
1401
1502
  }
1402
1503
  ),
1403
- handle && /* @__PURE__ */ jsx14(Panel, { asChild: true, children: /* @__PURE__ */ jsx14(
1504
+ handle && /* @__PURE__ */ jsx15(Panel, { asChild: true, children: /* @__PURE__ */ jsx15(
1404
1505
  "aside",
1405
1506
  {
1406
1507
  "data-slot": "studio-inspector",
@@ -1410,7 +1511,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1410
1511
  "absolute inset-y-2 right-2 z-10 flex w-(--studio-inspector-width) flex-col gap-1 p-1 transition-transform duration-200 ease-out motion-reduce:transition-none",
1411
1512
  hidden.right && "translate-x-[calc(100%+1rem)]"
1412
1513
  ),
1413
- children: /* @__PURE__ */ jsx14(
1514
+ children: /* @__PURE__ */ jsx15(
1414
1515
  Inspector,
1415
1516
  {
1416
1517
  studio,
@@ -1428,14 +1529,12 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
1428
1529
  }
1429
1530
 
1430
1531
  // src/react/debug.tsx
1431
- import { DebugManager } from "@joycostudio/xyz/debug";
1432
- import { useEffect as useEffect6 } from "react";
1532
+ import { createDebug } from "@joycostudio/xyz/debug";
1533
+ import { useEffect as useEffect7 } from "react";
1433
1534
  function StudioDebug({ studio }) {
1434
- useEffect6(() => {
1435
- const debug = new DebugManager({
1436
- createPane: async () => new (await import("tweakpane")).Pane({ title: "debug" }),
1437
- binding: { registerFrame: everyFrame }
1438
- });
1535
+ useEffect7(() => {
1536
+ if (!studio.ui) return console.error(MISSING_UI);
1537
+ const debug = createDebug(studio.ui.floating, { binding: { registerFrame: everyFrame } });
1439
1538
  for (const tool of studio.tools) debug.register(tool);
1440
1539
  return () => debug.dispose();
1441
1540
  }, [studio]);
@@ -1445,15 +1544,15 @@ function StudioDebug({ studio }) {
1445
1544
  // src/react/command-menu.tsx
1446
1545
  import { Dialog } from "@base-ui/react/dialog";
1447
1546
  import { Pin as Pin3 } from "lucide-react";
1448
- import { useEffect as useEffect7, useRef as useRef4, useState as useState10 } from "react";
1547
+ import { useEffect as useEffect8, useRef as useRef4, useState as useState11 } from "react";
1449
1548
 
1450
1549
  // src/react/ui/command.tsx
1451
1550
  import * as React3 from "react";
1452
1551
  import { Command as CommandPrimitive } from "cmdk";
1453
1552
  import { SearchIcon } from "lucide-react";
1454
- import { jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
1553
+ import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
1455
1554
  function Command({ className, ...props }) {
1456
- return /* @__PURE__ */ jsx15(
1555
+ return /* @__PURE__ */ jsx16(
1457
1556
  CommandPrimitive,
1458
1557
  {
1459
1558
  "data-slot": "command",
@@ -1466,9 +1565,9 @@ function Command({ className, ...props }) {
1466
1565
  );
1467
1566
  }
1468
1567
  var CommandInput = React3.forwardRef(function CommandInput2({ className, ...props }, ref) {
1469
- return /* @__PURE__ */ jsxs8("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [
1470
- /* @__PURE__ */ jsx15(SearchIcon, { "aria-hidden": true, className: "size-4 shrink-0 opacity-50" }),
1471
- /* @__PURE__ */ jsx15(
1568
+ return /* @__PURE__ */ jsxs9("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [
1569
+ /* @__PURE__ */ jsx16(SearchIcon, { "aria-hidden": true, className: "size-4 shrink-0 opacity-50" }),
1570
+ /* @__PURE__ */ jsx16(
1472
1571
  CommandPrimitive.Input,
1473
1572
  {
1474
1573
  ref,
@@ -1483,7 +1582,7 @@ var CommandInput = React3.forwardRef(function CommandInput2({ className, ...prop
1483
1582
  ] });
1484
1583
  });
1485
1584
  function CommandList({ className, ...props }) {
1486
- return /* @__PURE__ */ jsx15(
1585
+ return /* @__PURE__ */ jsx16(
1487
1586
  CommandPrimitive.List,
1488
1587
  {
1489
1588
  "data-slot": "command-list",
@@ -1493,10 +1592,10 @@ function CommandList({ className, ...props }) {
1493
1592
  );
1494
1593
  }
1495
1594
  function CommandEmpty({ ...props }) {
1496
- return /* @__PURE__ */ jsx15(CommandPrimitive.Empty, { "data-slot": "command-empty", className: "py-6 text-center text-sm", ...props });
1595
+ return /* @__PURE__ */ jsx16(CommandPrimitive.Empty, { "data-slot": "command-empty", className: "py-6 text-center text-sm", ...props });
1497
1596
  }
1498
1597
  function CommandItem({ className, ...props }) {
1499
- return /* @__PURE__ */ jsx15(
1598
+ return /* @__PURE__ */ jsx16(
1500
1599
  CommandPrimitive.Item,
1501
1600
  {
1502
1601
  "data-slot": "command-item",
@@ -1510,14 +1609,14 @@ function CommandItem({ className, ...props }) {
1510
1609
  }
1511
1610
 
1512
1611
  // src/react/command-menu.tsx
1513
- import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
1612
+ import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
1514
1613
  function StudioCommandMenu(props) {
1515
- return /* @__PURE__ */ jsx16(StudioShadowRoot, { children: /* @__PURE__ */ jsx16(CommandMenu, { ...props }) });
1614
+ return /* @__PURE__ */ jsx17(StudioShadowRoot, { children: /* @__PURE__ */ jsx17(CommandMenu, { ...props }) });
1516
1615
  }
1517
1616
  function CommandMenu({ studio, studioPath = "/studio", navigate }) {
1518
1617
  const { tools, pinned } = usePinnedTools(studio);
1519
- const [open, setOpen] = useState10(false);
1520
- const [session, setSession] = useState10(0);
1618
+ const [open, setOpen] = useState11(false);
1619
+ const [session, setSession] = useState11(0);
1521
1620
  const isOpen = useRef4(open);
1522
1621
  isOpen.current = open;
1523
1622
  const show = (next) => {
@@ -1525,7 +1624,7 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
1525
1624
  setOpen(next);
1526
1625
  };
1527
1626
  const input = useRef4(null);
1528
- useEffect7(() => {
1627
+ useEffect8(() => {
1529
1628
  if (window.frameElement?.getAttribute("data-slot") === "studio-preview") return;
1530
1629
  const onKey = (event) => {
1531
1630
  if (event.defaultPrevented || event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) return;
@@ -1549,47 +1648,47 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
1549
1648
  window.location.assign(target.href);
1550
1649
  }
1551
1650
  };
1552
- return /* @__PURE__ */ jsx16(Dialog.Root, { open, onOpenChange: show, children: /* @__PURE__ */ jsxs9(Dialog.Portal, { container: usePortalContainer(), children: [
1553
- /* @__PURE__ */ jsx16(Dialog.Backdrop, { "data-slot": "studio-command-overlay" }),
1554
- /* @__PURE__ */ jsxs9(Dialog.Popup, { "data-slot": "studio-command-menu", initialFocus: input, children: [
1555
- /* @__PURE__ */ jsxs9("div", { "data-slot": "studio-command-heading", children: [
1556
- /* @__PURE__ */ jsxs9(Dialog.Title, { "aria-label": "Studio tools", children: [
1557
- /* @__PURE__ */ jsx16(Logo, { "aria-hidden": true }),
1558
- /* @__PURE__ */ jsx16("strong", { children: "STUDIO" })
1651
+ return /* @__PURE__ */ jsx17(Dialog.Root, { open, onOpenChange: show, children: /* @__PURE__ */ jsxs10(Dialog.Portal, { container: usePortalContainer(), children: [
1652
+ /* @__PURE__ */ jsx17(Dialog.Backdrop, { "data-slot": "studio-command-overlay" }),
1653
+ /* @__PURE__ */ jsxs10(Dialog.Popup, { "data-slot": "studio-command-menu", initialFocus: input, children: [
1654
+ /* @__PURE__ */ jsxs10("div", { "data-slot": "studio-command-heading", children: [
1655
+ /* @__PURE__ */ jsxs10(Dialog.Title, { "aria-label": "Studio tools", children: [
1656
+ /* @__PURE__ */ jsx17(Logo, { "aria-hidden": true }),
1657
+ /* @__PURE__ */ jsx17("strong", { children: "STUDIO" })
1559
1658
  ] }),
1560
- /* @__PURE__ */ jsx16(Dialog.Close, { "aria-label": "Close tool menu", children: /* @__PURE__ */ jsx16(Kbd, { children: "esc" }) })
1659
+ /* @__PURE__ */ jsx17(Dialog.Close, { "aria-label": "Close tool menu", children: /* @__PURE__ */ jsx17(Kbd, { children: "esc" }) })
1561
1660
  ] }),
1562
- /* @__PURE__ */ jsx16(Dialog.Description, { "data-slot": "studio-command-description", children: "Open a tool in Studio." }),
1563
- /* @__PURE__ */ jsxs9(Command, { label: "Studio tools", loop: true, vimBindings: false, children: [
1564
- /* @__PURE__ */ jsx16(CommandInput, { ref: input, placeholder: "Search tools\u2026" }),
1565
- /* @__PURE__ */ jsxs9(CommandList, { children: [
1566
- /* @__PURE__ */ jsx16(CommandEmpty, { children: studio.definitions.length ? "No tools found." : "No tools registered yet." }),
1567
- tools.map((tool) => /* @__PURE__ */ jsxs9(
1661
+ /* @__PURE__ */ jsx17(Dialog.Description, { "data-slot": "studio-command-description", children: "Open a tool in Studio." }),
1662
+ /* @__PURE__ */ jsxs10(Command, { label: "Studio tools", loop: true, vimBindings: false, children: [
1663
+ /* @__PURE__ */ jsx17(CommandInput, { ref: input, placeholder: "Search tools\u2026" }),
1664
+ /* @__PURE__ */ jsxs10(CommandList, { children: [
1665
+ /* @__PURE__ */ jsx17(CommandEmpty, { children: studio.definitions.length ? "No tools found." : "No tools registered yet." }),
1666
+ tools.map((tool) => /* @__PURE__ */ jsxs10(
1568
1667
  CommandItem,
1569
1668
  {
1570
1669
  value: tool.id,
1571
1670
  keywords: [tool.title ?? tool.id],
1572
1671
  onSelect: () => select(tool.id),
1573
1672
  children: [
1574
- /* @__PURE__ */ jsx16(ToolIcon, { icon: tool.icon }),
1575
- /* @__PURE__ */ jsx16("span", { "data-slot": "studio-command-label", children: tool.title ?? tool.id }),
1576
- pinned.has(tool.id) && /* @__PURE__ */ jsx16(Pin3, { "aria-hidden": true })
1673
+ /* @__PURE__ */ jsx17(ToolIcon, { icon: tool.icon }),
1674
+ /* @__PURE__ */ jsx17("span", { "data-slot": "studio-command-label", children: tool.title ?? tool.id }),
1675
+ pinned.has(tool.id) && /* @__PURE__ */ jsx17(Pin3, { "aria-hidden": true })
1577
1676
  ]
1578
1677
  },
1579
1678
  tool.id
1580
1679
  ))
1581
1680
  ] })
1582
1681
  ] }, session),
1583
- /* @__PURE__ */ jsxs9("div", { "data-slot": "studio-command-footer", "aria-hidden": true, children: [
1584
- /* @__PURE__ */ jsxs9("span", { children: [
1585
- /* @__PURE__ */ jsxs9(KbdGroup, { children: [
1586
- /* @__PURE__ */ jsx16(Kbd, { children: "\u2191" }),
1587
- /* @__PURE__ */ jsx16(Kbd, { children: "\u2193" })
1682
+ /* @__PURE__ */ jsxs10("div", { "data-slot": "studio-command-footer", "aria-hidden": true, children: [
1683
+ /* @__PURE__ */ jsxs10("span", { children: [
1684
+ /* @__PURE__ */ jsxs10(KbdGroup, { children: [
1685
+ /* @__PURE__ */ jsx17(Kbd, { children: "\u2191" }),
1686
+ /* @__PURE__ */ jsx17(Kbd, { children: "\u2193" })
1588
1687
  ] }),
1589
1688
  "navigate"
1590
1689
  ] }),
1591
- /* @__PURE__ */ jsxs9("span", { children: [
1592
- /* @__PURE__ */ jsx16(Kbd, { children: "\u21B5" }),
1690
+ /* @__PURE__ */ jsxs10("span", { children: [
1691
+ /* @__PURE__ */ jsx17(Kbd, { children: "\u21B5" }),
1593
1692
  " open tool"
1594
1693
  ] })
1595
1694
  ] })
@@ -1599,7 +1698,7 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
1599
1698
 
1600
1699
  // src/react/select.tsx
1601
1700
  import { Select } from "@base-ui/react/select";
1602
- import { Check, ChevronDown, ChevronUp } from "lucide-react";
1701
+ import { Check as Check2, ChevronDown, ChevronUp as ChevronUp2 } from "lucide-react";
1603
1702
 
1604
1703
  // src/react/select-labels.ts
1605
1704
  import { Children, isValidElement } from "react";
@@ -1613,41 +1712,41 @@ function itemLabels(children, labels = {}) {
1613
1712
  }
1614
1713
 
1615
1714
  // src/react/select.tsx
1616
- import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
1617
- function StudioSelect({ label, title, className, children, ...props }) {
1618
- return /* @__PURE__ */ jsxs10(Select.Root, { items: itemLabels(children), ...props, children: [
1619
- /* @__PURE__ */ jsxs10(
1715
+ import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
1716
+ function StudioSelect({ label: label2, title, className, children, ...props }) {
1717
+ return /* @__PURE__ */ jsxs11(Select.Root, { items: itemLabels(children), ...props, children: [
1718
+ /* @__PURE__ */ jsxs11(
1620
1719
  Select.Trigger,
1621
1720
  {
1622
1721
  "data-slot": "select-trigger",
1623
- "aria-label": label,
1722
+ "aria-label": label2,
1624
1723
  title,
1625
1724
  className: cn(
1626
1725
  "border-input text-foreground focus-visible:border-ring focus-visible:ring-ring/50 flex h-7 max-w-full shrink-0 items-center justify-between gap-2 rounded-md border bg-(--field) px-2 text-xs whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-(--field-hover) focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span:first-child]:truncate",
1627
1726
  className
1628
1727
  ),
1629
1728
  children: [
1630
- /* @__PURE__ */ jsx17(Select.Value, {}),
1631
- /* @__PURE__ */ jsx17(Select.Icon, { children: /* @__PURE__ */ jsx17(ChevronDown, { className: "shrink-0 text-muted-foreground", size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
1729
+ /* @__PURE__ */ jsx18(Select.Value, {}),
1730
+ /* @__PURE__ */ jsx18(Select.Icon, { children: /* @__PURE__ */ jsx18(ChevronDown, { className: "shrink-0 text-muted-foreground", size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
1632
1731
  ]
1633
1732
  }
1634
1733
  ),
1635
- /* @__PURE__ */ jsx17(Select.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx17(Select.Positioner, { align: "end", sideOffset: 6, alignItemWithTrigger: false, className: "isolate z-50", children: /* @__PURE__ */ jsxs10(
1734
+ /* @__PURE__ */ jsx18(Select.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx18(Select.Positioner, { align: "end", sideOffset: 6, alignItemWithTrigger: false, className: "isolate z-50", children: /* @__PURE__ */ jsxs11(
1636
1735
  Select.Popup,
1637
1736
  {
1638
1737
  className: "relative max-h-(--available-height) min-w-(--anchor-width) overflow-y-auto rounded-md border border-border bg-popover p-1 font-(family-name:--studio-font) text-xs font-normal text-popover-foreground shadow-md outline-none",
1639
1738
  "data-slot": "select-content",
1640
1739
  children: [
1641
- /* @__PURE__ */ jsx17(Select.ScrollUpArrow, { className: "sticky top-0 z-10 flex w-full justify-center bg-popover py-1", children: /* @__PURE__ */ jsx17(ChevronUp, { size: 14, "aria-hidden": true }) }),
1642
- /* @__PURE__ */ jsx17(Select.List, { children }),
1643
- /* @__PURE__ */ jsx17(Select.ScrollDownArrow, { className: "sticky bottom-0 z-10 flex w-full justify-center bg-popover py-1", children: /* @__PURE__ */ jsx17(ChevronDown, { size: 14, "aria-hidden": true }) })
1740
+ /* @__PURE__ */ jsx18(Select.ScrollUpArrow, { className: "sticky top-0 z-10 flex w-full justify-center bg-popover py-1", children: /* @__PURE__ */ jsx18(ChevronUp2, { size: 14, "aria-hidden": true }) }),
1741
+ /* @__PURE__ */ jsx18(Select.List, { children }),
1742
+ /* @__PURE__ */ jsx18(Select.ScrollDownArrow, { className: "sticky bottom-0 z-10 flex w-full justify-center bg-popover py-1", children: /* @__PURE__ */ jsx18(ChevronDown, { size: 14, "aria-hidden": true }) })
1644
1743
  ]
1645
1744
  }
1646
1745
  ) }) })
1647
1746
  ] });
1648
1747
  }
1649
1748
  function StudioSelectItem({ className, children, ...props }) {
1650
- return /* @__PURE__ */ jsxs10(
1749
+ return /* @__PURE__ */ jsxs11(
1651
1750
  Select.Item,
1652
1751
  {
1653
1752
  "data-slot": "select-item",
@@ -1657,8 +1756,8 @@ function StudioSelectItem({ className, children, ...props }) {
1657
1756
  ),
1658
1757
  ...props,
1659
1758
  children: [
1660
- /* @__PURE__ */ jsx17(Select.ItemText, { children }),
1661
- /* @__PURE__ */ jsx17(Select.ItemIndicator, { className: "absolute right-2", children: /* @__PURE__ */ jsx17(Check, { size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
1759
+ /* @__PURE__ */ jsx18(Select.ItemText, { children }),
1760
+ /* @__PURE__ */ jsx18(Select.ItemIndicator, { className: "absolute right-2", children: /* @__PURE__ */ jsx18(Check2, { size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
1662
1761
  ]
1663
1762
  }
1664
1763
  );
@@ -1666,9 +1765,9 @@ function StudioSelectItem({ className, children, ...props }) {
1666
1765
 
1667
1766
  // src/react/ui/input.tsx
1668
1767
  import { forwardRef as forwardRef5 } from "react";
1669
- import { jsx as jsx18 } from "react/jsx-runtime";
1768
+ import { jsx as jsx19 } from "react/jsx-runtime";
1670
1769
  var Input = forwardRef5(function Input2({ className, ...props }, ref) {
1671
- return /* @__PURE__ */ jsx18(
1770
+ return /* @__PURE__ */ jsx19(
1672
1771
  "input",
1673
1772
  {
1674
1773
  ref,