@joycostudio/studio 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -2
- package/dist/{chunk-2RGQF5X5.js → chunk-6KZJEKOL.js} +147 -59
- package/dist/chunk-6KZJEKOL.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +27 -4
- package/dist/client.js +1 -1
- package/dist/next.js +1 -1
- package/dist/react.d.ts +26 -3
- package/dist/react.js +445 -322
- package/dist/react.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/chunk-2RGQF5X5.js.map +0 -1
package/dist/react.js
CHANGED
|
@@ -11,16 +11,24 @@ import {
|
|
|
11
11
|
PlugZap,
|
|
12
12
|
Unplug
|
|
13
13
|
} from "lucide-react";
|
|
14
|
-
import { useEffect as
|
|
14
|
+
import { useEffect as useEffect6, useRef as useRef3, useState as useState10 } from "react";
|
|
15
15
|
|
|
16
16
|
// package.json
|
|
17
|
-
var version = "0.1.
|
|
17
|
+
var version = "0.1.6";
|
|
18
18
|
|
|
19
19
|
// src/client/studio.ts
|
|
20
20
|
import {
|
|
21
21
|
button,
|
|
22
22
|
schemaValues
|
|
23
23
|
} from "@joycostudio/xyz/debug";
|
|
24
|
+
|
|
25
|
+
// src/client/share.ts
|
|
26
|
+
async function copyLink(url) {
|
|
27
|
+
if (navigator.clipboard?.writeText) return navigator.clipboard.writeText(url);
|
|
28
|
+
window.prompt("Copy this link", url);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// src/client/studio.ts
|
|
24
32
|
var COMPARE_MESSAGE = "joyco-studio:compare";
|
|
25
33
|
function postCompare(target, tool, showSaved) {
|
|
26
34
|
const message = { type: COMPARE_MESSAGE, tool, showSaved };
|
|
@@ -73,73 +81,12 @@ function useToolConfig(handle) {
|
|
|
73
81
|
|
|
74
82
|
// src/react/inspector.tsx
|
|
75
83
|
import { bindDebugSchema } from "@joycostudio/xyz/debug";
|
|
76
|
-
import { SquareSplitHorizontal } from "lucide-react";
|
|
77
|
-
import { useEffect, useRef, useState as
|
|
78
|
-
|
|
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
|
-
};
|
|
84
|
+
import { Check, Link, SquareSplitHorizontal } from "lucide-react";
|
|
85
|
+
import { useEffect as useEffect2, useRef, useState as useState3 } from "react";
|
|
113
86
|
|
|
114
|
-
// src/react/
|
|
115
|
-
import {
|
|
116
|
-
import {
|
|
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
|
-
}
|
|
87
|
+
// src/react/changes.tsx
|
|
88
|
+
import { ArrowRight, ChevronUp, Undo2 } from "lucide-react";
|
|
89
|
+
import { useEffect, useId, useState as useState2 } from "react";
|
|
143
90
|
|
|
144
91
|
// src/react/ui/button.tsx
|
|
145
92
|
import { cva } from "class-variance-authority";
|
|
@@ -153,7 +100,7 @@ function cn(...inputs) {
|
|
|
153
100
|
|
|
154
101
|
// src/react/ui/button.tsx
|
|
155
102
|
import { Slot } from "radix-ui";
|
|
156
|
-
import { jsx
|
|
103
|
+
import { jsx } from "react/jsx-runtime";
|
|
157
104
|
var buttonVariants = cva(
|
|
158
105
|
"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
106
|
{
|
|
@@ -191,7 +138,7 @@ function Button({
|
|
|
191
138
|
...props
|
|
192
139
|
}) {
|
|
193
140
|
const Comp = asChild ? Slot.Root : "button";
|
|
194
|
-
return /* @__PURE__ */
|
|
141
|
+
return /* @__PURE__ */ jsx(
|
|
195
142
|
Comp,
|
|
196
143
|
{
|
|
197
144
|
"data-slot": "button",
|
|
@@ -203,27 +150,6 @@ function Button({
|
|
|
203
150
|
);
|
|
204
151
|
}
|
|
205
152
|
|
|
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
153
|
// src/react/ui/tooltip.tsx
|
|
228
154
|
import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
|
|
229
155
|
|
|
@@ -233,7 +159,7 @@ import { createPortal } from "react-dom";
|
|
|
233
159
|
|
|
234
160
|
// src/react/generated/studio.css
|
|
235
161
|
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))}}`;
|
|
162
|
+
@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{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))}}`;
|
|
237
163
|
|
|
238
164
|
// src/react/shadow-css.ts
|
|
239
165
|
var ROOT_FONT_SIZE = 16;
|
|
@@ -253,7 +179,7 @@ function toShadowCss(css) {
|
|
|
253
179
|
}
|
|
254
180
|
|
|
255
181
|
// src/react/shadow-root.tsx
|
|
256
|
-
import { jsx as
|
|
182
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
257
183
|
var sheet;
|
|
258
184
|
function studioStyleSheet() {
|
|
259
185
|
if (!sheet) {
|
|
@@ -280,7 +206,7 @@ function StudioShadowRoot({ children }) {
|
|
|
280
206
|
}, []);
|
|
281
207
|
return (
|
|
282
208
|
// `display: contents` keeps the host out of layout; inline so host stylesheets can't override it.
|
|
283
|
-
/* @__PURE__ */
|
|
209
|
+
/* @__PURE__ */ jsx2("div", { ref: attach, "data-studio-host": "", style: { display: "contents" }, children: root && createPortal(/* @__PURE__ */ jsx2(PortalContainer.Provider, { value: root, children }), root) })
|
|
284
210
|
);
|
|
285
211
|
}
|
|
286
212
|
function activeElement() {
|
|
@@ -291,15 +217,15 @@ function activeElement() {
|
|
|
291
217
|
var eventTarget = (event) => event.composedPath()[0] ?? event.target;
|
|
292
218
|
|
|
293
219
|
// src/react/ui/tooltip.tsx
|
|
294
|
-
import { jsx as
|
|
220
|
+
import { jsx as jsx3, jsxs } from "react/jsx-runtime";
|
|
295
221
|
function TooltipProvider({ delay = 0, ...props }) {
|
|
296
|
-
return /* @__PURE__ */
|
|
222
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
|
|
297
223
|
}
|
|
298
224
|
function Tooltip({ ...props }) {
|
|
299
|
-
return /* @__PURE__ */
|
|
225
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
|
|
300
226
|
}
|
|
301
227
|
function TooltipTrigger({ ...props }) {
|
|
302
|
-
return /* @__PURE__ */
|
|
228
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
|
|
303
229
|
}
|
|
304
230
|
function TooltipContent({
|
|
305
231
|
className,
|
|
@@ -310,7 +236,7 @@ function TooltipContent({
|
|
|
310
236
|
children,
|
|
311
237
|
...props
|
|
312
238
|
}) {
|
|
313
|
-
return /* @__PURE__ */
|
|
239
|
+
return /* @__PURE__ */ jsx3(TooltipPrimitive.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx3(
|
|
314
240
|
TooltipPrimitive.Positioner,
|
|
315
241
|
{
|
|
316
242
|
align,
|
|
@@ -329,7 +255,7 @@ function TooltipContent({
|
|
|
329
255
|
...props,
|
|
330
256
|
children: [
|
|
331
257
|
children,
|
|
332
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__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
259
|
]
|
|
334
260
|
}
|
|
335
261
|
)
|
|
@@ -343,10 +269,183 @@ function Hint({
|
|
|
343
269
|
...props
|
|
344
270
|
}) {
|
|
345
271
|
return /* @__PURE__ */ jsxs(Tooltip, { disabled, children: [
|
|
346
|
-
/* @__PURE__ */
|
|
347
|
-
/* @__PURE__ */
|
|
272
|
+
/* @__PURE__ */ jsx3(TooltipTrigger, { render: children }),
|
|
273
|
+
/* @__PURE__ */ jsx3(TooltipContent, { ...props, children: content })
|
|
274
|
+
] });
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// src/react/changes.tsx
|
|
278
|
+
import { Fragment, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
279
|
+
var label = (path) => path.map((key) => key.charAt(0).toUpperCase() + key.slice(1)).join(" \u203A ");
|
|
280
|
+
var COLOR = /^(#|rgba?\(|hsla?\(|hwb\(|lab\(|lch\(|oklab\(|oklch\(|color\()/i;
|
|
281
|
+
function Value({ value, className }) {
|
|
282
|
+
const text = typeof value === "number" ? String(Number(value.toFixed(4))) : typeof value === "string" ? value : JSON.stringify(value) ?? "\u2014";
|
|
283
|
+
const color = typeof value === "string" && COLOR.test(value) && CSS.supports("color", value) ? value : null;
|
|
284
|
+
return /* @__PURE__ */ jsxs2("span", { className: cn("flex min-w-0 items-center gap-1", className), title: text, children: [
|
|
285
|
+
color && /* @__PURE__ */ jsx4(
|
|
286
|
+
"span",
|
|
287
|
+
{
|
|
288
|
+
"aria-hidden": true,
|
|
289
|
+
className: "size-2.5 shrink-0 rounded-sm border border-white/15",
|
|
290
|
+
style: { background: color }
|
|
291
|
+
}
|
|
292
|
+
),
|
|
293
|
+
/* @__PURE__ */ jsx4("span", { className: "truncate", children: text })
|
|
348
294
|
] });
|
|
349
295
|
}
|
|
296
|
+
function Changes({ handle }) {
|
|
297
|
+
const [open, setOpen] = useState2(false);
|
|
298
|
+
const list = useId();
|
|
299
|
+
const { diff, dirty } = handle;
|
|
300
|
+
useEffect(() => {
|
|
301
|
+
if (!dirty) setOpen(false);
|
|
302
|
+
}, [dirty]);
|
|
303
|
+
if (!diff.length) return null;
|
|
304
|
+
const names = diff.map(({ path }) => label(path)).join(", ");
|
|
305
|
+
return /* @__PURE__ */ jsxs2("div", { "data-slot": "studio-changes", className: "grid gap-1", children: [
|
|
306
|
+
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 }) => {
|
|
307
|
+
const name = label(path);
|
|
308
|
+
return /* @__PURE__ */ jsxs2(
|
|
309
|
+
"li",
|
|
310
|
+
{
|
|
311
|
+
"data-slot": "studio-change",
|
|
312
|
+
className: "flex items-center gap-2 rounded-md py-1 pr-0.5 pl-1.5 hover:bg-secondary",
|
|
313
|
+
children: [
|
|
314
|
+
/* @__PURE__ */ jsxs2("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [
|
|
315
|
+
/* @__PURE__ */ jsx4("span", { className: "truncate text-foreground", title: name, children: name }),
|
|
316
|
+
/* @__PURE__ */ jsxs2("span", { className: "flex min-w-0 items-center gap-1.5 text-[11px]", children: [
|
|
317
|
+
/* @__PURE__ */ jsx4(Value, { value: before, className: "text-muted-foreground" }),
|
|
318
|
+
/* @__PURE__ */ jsx4(ArrowRight, { "aria-label": "changed to", className: "size-3 shrink-0 text-faint" }),
|
|
319
|
+
/* @__PURE__ */ jsx4(Value, { value: after, className: "text-warning" })
|
|
320
|
+
] })
|
|
321
|
+
] }),
|
|
322
|
+
/* @__PURE__ */ jsx4(Hint, { content: "Revert to saved", side: "left", children: /* @__PURE__ */ jsx4(
|
|
323
|
+
Button,
|
|
324
|
+
{
|
|
325
|
+
variant: "ghost",
|
|
326
|
+
size: "icon-xs",
|
|
327
|
+
"aria-label": `Revert ${name}`,
|
|
328
|
+
disabled: handle.comparing,
|
|
329
|
+
className: "cursor-pointer text-muted-foreground hover:text-foreground",
|
|
330
|
+
onClick: () => handle.revert(path),
|
|
331
|
+
children: /* @__PURE__ */ jsx4(Undo2, {})
|
|
332
|
+
}
|
|
333
|
+
) })
|
|
334
|
+
]
|
|
335
|
+
},
|
|
336
|
+
JSON.stringify(path)
|
|
337
|
+
);
|
|
338
|
+
}) }),
|
|
339
|
+
/* @__PURE__ */ jsxs2(
|
|
340
|
+
"button",
|
|
341
|
+
{
|
|
342
|
+
type: "button",
|
|
343
|
+
"aria-expanded": open,
|
|
344
|
+
"aria-controls": list,
|
|
345
|
+
onClick: () => setOpen(!open),
|
|
346
|
+
title: open ? void 0 : names,
|
|
347
|
+
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",
|
|
348
|
+
children: [
|
|
349
|
+
/* @__PURE__ */ jsx4(ChevronUp, { "aria-hidden": true, className: cn("size-3 shrink-0 transition-transform", open && "rotate-180") }),
|
|
350
|
+
/* @__PURE__ */ jsxs2("span", { className: "truncate", children: [
|
|
351
|
+
diff.length,
|
|
352
|
+
" changed",
|
|
353
|
+
!open && /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
354
|
+
": ",
|
|
355
|
+
/* @__PURE__ */ jsx4("span", { className: "text-foreground", children: names })
|
|
356
|
+
] })
|
|
357
|
+
] })
|
|
358
|
+
]
|
|
359
|
+
}
|
|
360
|
+
)
|
|
361
|
+
] });
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// src/react/theme.ts
|
|
365
|
+
var tweakpaneTheme = {
|
|
366
|
+
"--tp-base-background-color": "transparent",
|
|
367
|
+
"--tp-base-shadow-color": "transparent",
|
|
368
|
+
"--tp-base-border-radius": "0px",
|
|
369
|
+
"--tp-base-font-family": "var(--studio-font)",
|
|
370
|
+
"--tp-blade-border-radius": "var(--radius)",
|
|
371
|
+
"--tp-blade-horizontal-padding": "4px",
|
|
372
|
+
"--tp-blade-value-width": "168px",
|
|
373
|
+
"--tp-container-horizontal-padding": "8px",
|
|
374
|
+
"--tp-container-vertical-padding": "6px",
|
|
375
|
+
"--tp-container-unit-size": "22px",
|
|
376
|
+
"--tp-container-unit-spacing": "6px",
|
|
377
|
+
"--tp-container-background-color": "var(--card)",
|
|
378
|
+
"--tp-container-background-color-hover": "var(--field)",
|
|
379
|
+
"--tp-container-background-color-focus": "var(--field-hover)",
|
|
380
|
+
"--tp-container-background-color-active": "var(--field-active)",
|
|
381
|
+
"--tp-container-foreground-color": "var(--muted-foreground)",
|
|
382
|
+
"--tp-input-background-color": "var(--field)",
|
|
383
|
+
"--tp-input-background-color-hover": "var(--field-hover)",
|
|
384
|
+
"--tp-input-background-color-focus": "var(--field-active)",
|
|
385
|
+
"--tp-input-background-color-active": "var(--field-active)",
|
|
386
|
+
"--tp-input-foreground-color": "var(--foreground)",
|
|
387
|
+
// Buttons and slider knobs: lighter than fields so the knob reads against the track.
|
|
388
|
+
"--tp-button-background-color": "var(--knob)",
|
|
389
|
+
"--tp-button-background-color-hover": "var(--knob-hover)",
|
|
390
|
+
"--tp-button-background-color-focus": "var(--knob-hover)",
|
|
391
|
+
"--tp-button-background-color-active": "var(--muted-foreground)",
|
|
392
|
+
"--tp-button-foreground-color": "var(--foreground)",
|
|
393
|
+
"--tp-groove-foreground-color": "var(--border)",
|
|
394
|
+
"--tp-label-foreground-color": "var(--muted-foreground)",
|
|
395
|
+
"--tp-monitor-background-color": "var(--card)",
|
|
396
|
+
"--tp-monitor-foreground-color": "var(--muted-foreground)"
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
// src/react/tool-icon.tsx
|
|
400
|
+
import { SlidersHorizontal } from "lucide";
|
|
401
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
402
|
+
var camel = (name) => name.replace(/-([a-z])/g, (_, char) => char.toUpperCase());
|
|
403
|
+
function ToolIcon({ icon = SlidersHorizontal, ...props }) {
|
|
404
|
+
return /* @__PURE__ */ jsx5(
|
|
405
|
+
"svg",
|
|
406
|
+
{
|
|
407
|
+
viewBox: "0 0 24 24",
|
|
408
|
+
fill: "none",
|
|
409
|
+
stroke: "currentColor",
|
|
410
|
+
strokeWidth: 2,
|
|
411
|
+
strokeLinecap: "round",
|
|
412
|
+
strokeLinejoin: "round",
|
|
413
|
+
"aria-hidden": true,
|
|
414
|
+
...props,
|
|
415
|
+
children: icon.map(([Tag, attrs], index) => {
|
|
416
|
+
const Element = Tag;
|
|
417
|
+
return /* @__PURE__ */ jsx5(
|
|
418
|
+
Element,
|
|
419
|
+
{
|
|
420
|
+
...Object.fromEntries(Object.entries(attrs).map(([name, value]) => [camel(name), value]))
|
|
421
|
+
},
|
|
422
|
+
index
|
|
423
|
+
);
|
|
424
|
+
})
|
|
425
|
+
}
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// src/react/ui/kbd.tsx
|
|
430
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
431
|
+
function Kbd({ className, ...props }) {
|
|
432
|
+
return /* @__PURE__ */ jsx6(
|
|
433
|
+
"kbd",
|
|
434
|
+
{
|
|
435
|
+
"data-slot": "kbd",
|
|
436
|
+
className: cn(
|
|
437
|
+
"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",
|
|
438
|
+
"[&_svg:not([class*='size-'])]:size-3",
|
|
439
|
+
"[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
|
|
440
|
+
className
|
|
441
|
+
),
|
|
442
|
+
...props
|
|
443
|
+
}
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
function KbdGroup({ className, ...props }) {
|
|
447
|
+
return /* @__PURE__ */ jsx6("span", { "data-slot": "kbd-group", className: cn("inline-flex items-center gap-1", className), ...props });
|
|
448
|
+
}
|
|
350
449
|
|
|
351
450
|
// src/react/ui/panel.tsx
|
|
352
451
|
import { Slot as Slot3 } from "radix-ui";
|
|
@@ -355,22 +454,22 @@ import { forwardRef as forwardRef2 } from "react";
|
|
|
355
454
|
// src/react/surface.tsx
|
|
356
455
|
import { Slot as Slot2 } from "radix-ui";
|
|
357
456
|
import { forwardRef } from "react";
|
|
358
|
-
import { jsx as
|
|
457
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
359
458
|
var StudioSurface = forwardRef(
|
|
360
459
|
function StudioSurface2({ asChild = false, className, ...props }, ref) {
|
|
361
460
|
const Comp = asChild ? Slot2.Root : "div";
|
|
362
|
-
return /* @__PURE__ */
|
|
461
|
+
return /* @__PURE__ */ jsx7(Comp, { ref, "data-slot": "studio-surface", className: cn("studio-surface", className), ...props });
|
|
363
462
|
}
|
|
364
463
|
);
|
|
365
464
|
var StudioToolbar = forwardRef(function StudioToolbar2({ className, ...props }, ref) {
|
|
366
|
-
return /* @__PURE__ */
|
|
465
|
+
return /* @__PURE__ */ jsx7(StudioSurface, { ref, role: "group", className: cn("studio-toolbar", className), ...props });
|
|
367
466
|
});
|
|
368
467
|
|
|
369
468
|
// src/react/ui/panel.tsx
|
|
370
|
-
import { jsx as
|
|
469
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
371
470
|
var Panel = forwardRef2(function Panel2({ className, asChild = false, ...props }, ref) {
|
|
372
471
|
const Comp = asChild ? Slot3.Root : "div";
|
|
373
|
-
return /* @__PURE__ */
|
|
472
|
+
return /* @__PURE__ */ jsx8(
|
|
374
473
|
Comp,
|
|
375
474
|
{
|
|
376
475
|
ref,
|
|
@@ -384,10 +483,10 @@ var Panel = forwardRef2(function Panel2({ className, asChild = false, ...props }
|
|
|
384
483
|
);
|
|
385
484
|
});
|
|
386
485
|
function PanelHeader({ className, ...props }) {
|
|
387
|
-
return /* @__PURE__ */
|
|
486
|
+
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
487
|
}
|
|
389
488
|
var PanelContent = forwardRef2(function PanelContent2({ className, ...props }, ref) {
|
|
390
|
-
return /* @__PURE__ */
|
|
489
|
+
return /* @__PURE__ */ jsx8(
|
|
391
490
|
"div",
|
|
392
491
|
{
|
|
393
492
|
ref,
|
|
@@ -398,18 +497,18 @@ var PanelContent = forwardRef2(function PanelContent2({ className, ...props }, r
|
|
|
398
497
|
);
|
|
399
498
|
});
|
|
400
499
|
function PanelFooter({ className, ...props }) {
|
|
401
|
-
return /* @__PURE__ */
|
|
500
|
+
return /* @__PURE__ */ jsx8(StudioSurface, { asChild: true, className: cn("grid gap-2 p-2", className), children: /* @__PURE__ */ jsx8("footer", { "data-slot": "panel-footer", ...props }) });
|
|
402
501
|
}
|
|
403
502
|
|
|
404
503
|
// src/react/inspector.tsx
|
|
405
|
-
import { Fragment, jsx as
|
|
504
|
+
import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
406
505
|
function describe(studio, handle) {
|
|
407
506
|
const { state } = handle;
|
|
408
507
|
if (handle.comparing) return { tone: "text-sky-400", text: "Showing saved" };
|
|
409
508
|
if (studio.connection.phase !== "connected") return { tone: "text-faint", text: "Not persisting" };
|
|
410
509
|
if (!state) return { tone: "text-destructive", text: "Restart studio dev" };
|
|
411
510
|
if (state.conflict) return { tone: "text-destructive", text: "Changed on disk" };
|
|
412
|
-
if (
|
|
511
|
+
if (handle.dirty) return { tone: "text-warning", text: "Unsaved" };
|
|
413
512
|
return { tone: "text-success", text: state.saved.hash ? "Saved" : "Not on disk yet" };
|
|
414
513
|
}
|
|
415
514
|
function adoptTweakpaneStyles(container) {
|
|
@@ -428,10 +527,29 @@ function Inspector({
|
|
|
428
527
|
useStudio(studio);
|
|
429
528
|
const container = useRef(null);
|
|
430
529
|
const pane = useRef(null);
|
|
431
|
-
const [failure, setFailure] =
|
|
432
|
-
const
|
|
433
|
-
const
|
|
434
|
-
|
|
530
|
+
const [failure, setFailure] = useState3(null);
|
|
531
|
+
const [copied, setCopied] = useState3(false);
|
|
532
|
+
const { definition, state } = handle;
|
|
533
|
+
const canDiscard = handle.dirty && !handle.comparing;
|
|
534
|
+
const canSave = canDiscard && !!state;
|
|
535
|
+
const save = (force = false) => void handle.save({ force }).then((result) => setFailure(result.ok ? null : result.message ?? result.error));
|
|
536
|
+
const share = () => {
|
|
537
|
+
const url = new URL(location.href);
|
|
538
|
+
url.hash = definition.id;
|
|
539
|
+
copyLink(handle.shareUrl(url)).then(
|
|
540
|
+
() => {
|
|
541
|
+
setFailure(null);
|
|
542
|
+
setCopied(true);
|
|
543
|
+
},
|
|
544
|
+
() => setFailure("Could not copy the share link")
|
|
545
|
+
);
|
|
546
|
+
};
|
|
547
|
+
useEffect2(() => {
|
|
548
|
+
if (!copied) return;
|
|
549
|
+
const timer = setTimeout(() => setCopied(false), 1500);
|
|
550
|
+
return () => clearTimeout(timer);
|
|
551
|
+
}, [copied]);
|
|
552
|
+
useEffect2(() => {
|
|
435
553
|
let disposed = false;
|
|
436
554
|
let teardown = () => {
|
|
437
555
|
};
|
|
@@ -457,33 +575,28 @@ function Inspector({
|
|
|
457
575
|
teardown();
|
|
458
576
|
};
|
|
459
577
|
}, [handle]);
|
|
460
|
-
|
|
578
|
+
useEffect2(() => {
|
|
461
579
|
const onKeyDown = (event) => {
|
|
462
580
|
if (event.key !== "s" || !(event.metaKey || event.ctrlKey)) return;
|
|
463
581
|
event.preventDefault();
|
|
464
|
-
if (
|
|
582
|
+
if (canSave) save();
|
|
465
583
|
};
|
|
466
584
|
addEventListener("keydown", onKeyDown);
|
|
467
585
|
return () => removeEventListener("keydown", onKeyDown);
|
|
468
586
|
});
|
|
469
|
-
|
|
587
|
+
useEffect2(() => {
|
|
470
588
|
if (pane.current) pane.current.disabled = handle.comparing;
|
|
471
589
|
});
|
|
472
|
-
const { definition, state } = handle;
|
|
473
590
|
const ConfigFile = fileHref ? "a" : "span";
|
|
474
591
|
const status = describe(studio, handle);
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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 })
|
|
592
|
+
return /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
593
|
+
/* @__PURE__ */ jsxs3(PanelHeader, { children: [
|
|
594
|
+
/* @__PURE__ */ jsxs3("strong", { className: "flex min-w-0 items-center gap-2 text-foreground", children: [
|
|
595
|
+
/* @__PURE__ */ jsx9(ToolIcon, { icon: definition.icon, className: "size-3.5 shrink-0" }),
|
|
596
|
+
/* @__PURE__ */ jsx9("span", { className: "truncate", title: definition.title ?? definition.id, children: definition.title ?? definition.id })
|
|
484
597
|
] }),
|
|
485
|
-
/* @__PURE__ */
|
|
486
|
-
/* @__PURE__ */
|
|
598
|
+
/* @__PURE__ */ jsxs3("div", { className: "mt-1 flex items-center gap-3 pl-5.5 text-[11px]", children: [
|
|
599
|
+
/* @__PURE__ */ jsx9(
|
|
487
600
|
ConfigFile,
|
|
488
601
|
{
|
|
489
602
|
"data-slot": "studio-config-file",
|
|
@@ -493,37 +606,33 @@ function Inspector({
|
|
|
493
606
|
children: definition.file
|
|
494
607
|
}
|
|
495
608
|
),
|
|
496
|
-
/* @__PURE__ */
|
|
609
|
+
/* @__PURE__ */ jsxs3(
|
|
497
610
|
"span",
|
|
498
611
|
{
|
|
499
612
|
className: `flex shrink-0 items-center gap-1.5 ${status.tone}`,
|
|
500
613
|
title: state ? `Draft revision ${state.draft.revision}` : void 0,
|
|
501
614
|
children: [
|
|
502
|
-
/* @__PURE__ */
|
|
615
|
+
/* @__PURE__ */ jsx9("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-current" }),
|
|
503
616
|
status.text
|
|
504
617
|
]
|
|
505
618
|
}
|
|
506
619
|
)
|
|
507
620
|
] })
|
|
508
621
|
] }),
|
|
509
|
-
/* @__PURE__ */
|
|
510
|
-
/* @__PURE__ */
|
|
511
|
-
failure && /* @__PURE__ */
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
/* @__PURE__ */ jsx8("span", { className: "text-foreground", children: changes.join(", ") })
|
|
516
|
-
] }),
|
|
517
|
-
/* @__PURE__ */ jsxs2("div", { className: "flex gap-2", children: [
|
|
518
|
-
/* @__PURE__ */ jsx8(
|
|
622
|
+
/* @__PURE__ */ jsx9(PanelContent, { ref: container, "data-slot": "studio-controls", style: tweakpaneTheme }),
|
|
623
|
+
/* @__PURE__ */ jsxs3(PanelFooter, { children: [
|
|
624
|
+
failure && /* @__PURE__ */ jsx9("div", { className: "text-destructive", children: failure }),
|
|
625
|
+
/* @__PURE__ */ jsx9(Changes, { handle }),
|
|
626
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex gap-2", children: [
|
|
627
|
+
/* @__PURE__ */ jsx9(
|
|
519
628
|
Hint,
|
|
520
629
|
{
|
|
521
630
|
className: "flex items-center gap-2",
|
|
522
|
-
content: /* @__PURE__ */
|
|
631
|
+
content: /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
523
632
|
"Hold to compare with saved ",
|
|
524
|
-
/* @__PURE__ */
|
|
633
|
+
/* @__PURE__ */ jsx9(Kbd, { children: "\\" })
|
|
525
634
|
] }),
|
|
526
|
-
children: /* @__PURE__ */
|
|
635
|
+
children: /* @__PURE__ */ jsx9(
|
|
527
636
|
Button,
|
|
528
637
|
{
|
|
529
638
|
variant: "secondary",
|
|
@@ -538,27 +647,41 @@ function Inspector({
|
|
|
538
647
|
},
|
|
539
648
|
onPointerUp: () => onCompare(false),
|
|
540
649
|
onPointerCancel: () => onCompare(false),
|
|
541
|
-
children: /* @__PURE__ */
|
|
650
|
+
children: /* @__PURE__ */ jsx9(SquareSplitHorizontal, {})
|
|
542
651
|
}
|
|
543
652
|
)
|
|
544
653
|
}
|
|
545
654
|
),
|
|
546
|
-
/* @__PURE__ */
|
|
655
|
+
/* @__PURE__ */ jsx9(Hint, { content: copied ? "Link copied" : "Copy a link with this config", children: /* @__PURE__ */ jsx9(
|
|
656
|
+
Button,
|
|
657
|
+
{
|
|
658
|
+
variant: "secondary",
|
|
659
|
+
size: "icon-sm",
|
|
660
|
+
"aria-label": "Copy a link with this config",
|
|
661
|
+
className: "shrink-0",
|
|
662
|
+
onClick: share,
|
|
663
|
+
children: copied ? /* @__PURE__ */ jsx9(Check, { className: "text-success" }) : /* @__PURE__ */ jsx9(Link, {})
|
|
664
|
+
}
|
|
665
|
+
) }),
|
|
666
|
+
/* @__PURE__ */ jsx9(
|
|
547
667
|
Button,
|
|
548
668
|
{
|
|
549
669
|
variant: "secondary",
|
|
550
670
|
size: "sm",
|
|
551
671
|
className: "flex-1",
|
|
552
|
-
disabled: !
|
|
553
|
-
onClick: () =>
|
|
672
|
+
disabled: !canDiscard,
|
|
673
|
+
onClick: () => {
|
|
674
|
+
setFailure(null);
|
|
675
|
+
handle.discard();
|
|
676
|
+
},
|
|
554
677
|
children: "Discard"
|
|
555
678
|
}
|
|
556
679
|
),
|
|
557
|
-
state?.conflict ? /* @__PURE__ */
|
|
680
|
+
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: [
|
|
558
681
|
"Save",
|
|
559
|
-
/* @__PURE__ */
|
|
560
|
-
/* @__PURE__ */
|
|
561
|
-
/* @__PURE__ */
|
|
682
|
+
/* @__PURE__ */ jsxs3(KbdGroup, { children: [
|
|
683
|
+
/* @__PURE__ */ jsx9(Kbd, { children: "\u2318" }),
|
|
684
|
+
/* @__PURE__ */ jsx9(Kbd, { children: "S" })
|
|
562
685
|
] })
|
|
563
686
|
] })
|
|
564
687
|
] })
|
|
@@ -567,13 +690,13 @@ function Inspector({
|
|
|
567
690
|
}
|
|
568
691
|
|
|
569
692
|
// src/react/logo.tsx
|
|
570
|
-
import { jsx as
|
|
693
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
571
694
|
function Logo(props) {
|
|
572
|
-
return /* @__PURE__ */
|
|
695
|
+
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" }) });
|
|
573
696
|
}
|
|
574
697
|
|
|
575
698
|
// src/react/pinned-tools.ts
|
|
576
|
-
import { useEffect as
|
|
699
|
+
import { useEffect as useEffect3, useState as useState4 } from "react";
|
|
577
700
|
var STORAGE_KEY = "joyco-studio:pinned-tools";
|
|
578
701
|
var CHANGE_EVENT = "joyco-studio:pins-changed";
|
|
579
702
|
function readPins() {
|
|
@@ -585,8 +708,8 @@ function readPins() {
|
|
|
585
708
|
}
|
|
586
709
|
}
|
|
587
710
|
function usePinnedTools(studio) {
|
|
588
|
-
const [pins, setPins] =
|
|
589
|
-
|
|
711
|
+
const [pins, setPins] = useState4([]);
|
|
712
|
+
useEffect3(() => {
|
|
590
713
|
setPins(readPins());
|
|
591
714
|
const onChange = (event) => setPins(event.detail);
|
|
592
715
|
const onStorage = (event) => {
|
|
@@ -614,17 +737,17 @@ function usePinnedTools(studio) {
|
|
|
614
737
|
|
|
615
738
|
// src/react/preview-canvas.tsx
|
|
616
739
|
import { RotateCw } from "lucide-react";
|
|
617
|
-
import { forwardRef as forwardRef3, useImperativeHandle, useRef as useRef2, useState as
|
|
740
|
+
import { forwardRef as forwardRef3, useImperativeHandle, useRef as useRef2, useState as useState6 } from "react";
|
|
618
741
|
|
|
619
742
|
// src/react/canvas-toolbar.tsx
|
|
620
743
|
import { Maximize, Minimize, Pin, PinOff } from "lucide-react";
|
|
621
|
-
import { useState as
|
|
622
|
-
import { jsx as
|
|
623
|
-
function CanvasToolbar({ label, expanded = false, onToggle, children }) {
|
|
624
|
-
const [ghost, setGhost] =
|
|
744
|
+
import { useState as useState5 } from "react";
|
|
745
|
+
import { jsx as jsx11, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
746
|
+
function CanvasToolbar({ label: label2, expanded = false, onToggle, children }) {
|
|
747
|
+
const [ghost, setGhost] = useState5(false);
|
|
625
748
|
const ExpandIcon = expanded ? Minimize : Maximize;
|
|
626
749
|
const PinIcon = ghost ? PinOff : Pin;
|
|
627
|
-
return /* @__PURE__ */
|
|
750
|
+
return /* @__PURE__ */ jsx11(
|
|
628
751
|
"div",
|
|
629
752
|
{
|
|
630
753
|
className: "studio-canvas-toolbar",
|
|
@@ -632,22 +755,22 @@ function CanvasToolbar({ label, expanded = false, onToggle, children }) {
|
|
|
632
755
|
"data-expanded": expanded || void 0,
|
|
633
756
|
"data-ghost": !expanded && ghost || void 0,
|
|
634
757
|
role: "group",
|
|
635
|
-
"aria-label":
|
|
636
|
-
children: /* @__PURE__ */
|
|
758
|
+
"aria-label": label2,
|
|
759
|
+
children: /* @__PURE__ */ jsxs4(StudioToolbar, { className: "studio-canvas-actions", children: [
|
|
637
760
|
children,
|
|
638
|
-
onToggle && /* @__PURE__ */
|
|
639
|
-
/* @__PURE__ */
|
|
761
|
+
onToggle && /* @__PURE__ */ jsx11("div", { className: "studio-canvas-toggle", children: /* @__PURE__ */ jsxs4("button", { "data-slot": "toolbar-action", type: "button", "aria-pressed": expanded, onClick: onToggle, children: [
|
|
762
|
+
/* @__PURE__ */ jsx11(ExpandIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true }),
|
|
640
763
|
expanded ? "Contain canvas" : "Expand"
|
|
641
764
|
] }) }),
|
|
642
|
-
!expanded && /* @__PURE__ */
|
|
765
|
+
!expanded && /* @__PURE__ */ jsx11(
|
|
643
766
|
"button",
|
|
644
767
|
{
|
|
645
768
|
type: "button",
|
|
646
|
-
"aria-label": `Auto-hide ${
|
|
769
|
+
"aria-label": `Auto-hide ${label2.toLowerCase()} header`,
|
|
647
770
|
"aria-pressed": ghost,
|
|
648
771
|
title: ghost ? "Pin header" : "Auto-hide header",
|
|
649
772
|
onClick: () => setGhost(!ghost),
|
|
650
|
-
children: /* @__PURE__ */
|
|
773
|
+
children: /* @__PURE__ */ jsx11(PinIcon, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
|
|
651
774
|
}
|
|
652
775
|
)
|
|
653
776
|
] })
|
|
@@ -656,13 +779,13 @@ function CanvasToolbar({ label, expanded = false, onToggle, children }) {
|
|
|
656
779
|
}
|
|
657
780
|
|
|
658
781
|
// src/react/preview-canvas.tsx
|
|
659
|
-
import { jsx as
|
|
782
|
+
import { jsx as jsx12, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
660
783
|
var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", expanded: controlled, onExpandedChange, onReload, toolbar, ...props }, ref) {
|
|
661
|
-
const [localExpanded, setExpanded] =
|
|
784
|
+
const [localExpanded, setExpanded] = useState6(false);
|
|
662
785
|
const expanded = controlled ?? localExpanded;
|
|
663
786
|
const frame = useRef2(null);
|
|
664
787
|
useImperativeHandle(ref, () => frame.current, []);
|
|
665
|
-
return /* @__PURE__ */
|
|
788
|
+
return /* @__PURE__ */ jsxs5(
|
|
666
789
|
"section",
|
|
667
790
|
{
|
|
668
791
|
className: "studio-preview-canvas",
|
|
@@ -670,7 +793,7 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
|
|
|
670
793
|
"data-expanded": expanded || void 0,
|
|
671
794
|
"aria-label": `${title} canvas`,
|
|
672
795
|
children: [
|
|
673
|
-
/* @__PURE__ */
|
|
796
|
+
/* @__PURE__ */ jsxs5(
|
|
674
797
|
CanvasToolbar,
|
|
675
798
|
{
|
|
676
799
|
label: "Preview canvas",
|
|
@@ -680,7 +803,7 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
|
|
|
680
803
|
onExpandedChange?.(!expanded);
|
|
681
804
|
},
|
|
682
805
|
children: [
|
|
683
|
-
/* @__PURE__ */
|
|
806
|
+
/* @__PURE__ */ jsx12(
|
|
684
807
|
"button",
|
|
685
808
|
{
|
|
686
809
|
type: "button",
|
|
@@ -690,30 +813,30 @@ var PreviewCanvas = forwardRef3(function PreviewCanvas2({ title = "Preview", exp
|
|
|
690
813
|
onReload?.();
|
|
691
814
|
if (frame.current) frame.current.src = frame.current.src;
|
|
692
815
|
},
|
|
693
|
-
children: /* @__PURE__ */
|
|
816
|
+
children: /* @__PURE__ */ jsx12(RotateCw, { size: 14, strokeWidth: 1.5, "aria-hidden": true })
|
|
694
817
|
}
|
|
695
818
|
),
|
|
696
|
-
/* @__PURE__ */
|
|
819
|
+
/* @__PURE__ */ jsx12("div", { className: "studio-preview-source", children: toolbar ?? /* @__PURE__ */ jsx12("span", { className: "studio-preview-title", children: title }) })
|
|
697
820
|
]
|
|
698
821
|
}
|
|
699
822
|
),
|
|
700
|
-
/* @__PURE__ */
|
|
823
|
+
/* @__PURE__ */ jsx12("iframe", { ...props, ref: frame, title })
|
|
701
824
|
]
|
|
702
825
|
}
|
|
703
826
|
);
|
|
704
827
|
});
|
|
705
828
|
|
|
706
829
|
// src/react/session-flag.ts
|
|
707
|
-
import { useEffect as
|
|
830
|
+
import { useEffect as useEffect4, useState as useState7 } from "react";
|
|
708
831
|
function useSessionFlag(key) {
|
|
709
|
-
const [value, setValue] =
|
|
832
|
+
const [value, setValue] = useState7(() => {
|
|
710
833
|
try {
|
|
711
834
|
return sessionStorage.getItem(key) === "true";
|
|
712
835
|
} catch {
|
|
713
836
|
return false;
|
|
714
837
|
}
|
|
715
838
|
});
|
|
716
|
-
|
|
839
|
+
useEffect4(() => {
|
|
717
840
|
try {
|
|
718
841
|
sessionStorage.setItem(key, String(value));
|
|
719
842
|
} catch {
|
|
@@ -747,15 +870,15 @@ function useIsMobile() {
|
|
|
747
870
|
// src/react/ui/sheet.tsx
|
|
748
871
|
import { XIcon } from "lucide-react";
|
|
749
872
|
import { Dialog as SheetPrimitive } from "@base-ui/react/dialog";
|
|
750
|
-
import { jsx as
|
|
873
|
+
import { jsx as jsx13, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
751
874
|
function Sheet({ ...props }) {
|
|
752
|
-
return /* @__PURE__ */
|
|
875
|
+
return /* @__PURE__ */ jsx13(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
753
876
|
}
|
|
754
877
|
function SheetPortal({ ...props }) {
|
|
755
|
-
return /* @__PURE__ */
|
|
878
|
+
return /* @__PURE__ */ jsx13(SheetPrimitive.Portal, { "data-slot": "sheet-portal", container: usePortalContainer(), ...props });
|
|
756
879
|
}
|
|
757
880
|
function SheetOverlay({ className, ...props }) {
|
|
758
|
-
return /* @__PURE__ */
|
|
881
|
+
return /* @__PURE__ */ jsx13(
|
|
759
882
|
SheetPrimitive.Backdrop,
|
|
760
883
|
{
|
|
761
884
|
"data-slot": "sheet-overlay",
|
|
@@ -774,9 +897,9 @@ function SheetContent({
|
|
|
774
897
|
showCloseButton = true,
|
|
775
898
|
...props
|
|
776
899
|
}) {
|
|
777
|
-
return /* @__PURE__ */
|
|
778
|
-
/* @__PURE__ */
|
|
779
|
-
/* @__PURE__ */
|
|
900
|
+
return /* @__PURE__ */ jsxs6(SheetPortal, { children: [
|
|
901
|
+
/* @__PURE__ */ jsx13(SheetOverlay, {}),
|
|
902
|
+
/* @__PURE__ */ jsxs6(
|
|
780
903
|
SheetPrimitive.Popup,
|
|
781
904
|
{
|
|
782
905
|
"data-slot": "sheet-content",
|
|
@@ -791,9 +914,9 @@ function SheetContent({
|
|
|
791
914
|
...props,
|
|
792
915
|
children: [
|
|
793
916
|
children,
|
|
794
|
-
showCloseButton && /* @__PURE__ */
|
|
795
|
-
/* @__PURE__ */
|
|
796
|
-
/* @__PURE__ */
|
|
917
|
+
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: [
|
|
918
|
+
/* @__PURE__ */ jsx13(XIcon, { className: "size-4" }),
|
|
919
|
+
/* @__PURE__ */ jsx13("span", { className: "sr-only", children: "Close" })
|
|
797
920
|
] })
|
|
798
921
|
]
|
|
799
922
|
}
|
|
@@ -801,10 +924,10 @@ function SheetContent({
|
|
|
801
924
|
] });
|
|
802
925
|
}
|
|
803
926
|
function SheetHeader({ className, ...props }) {
|
|
804
|
-
return /* @__PURE__ */
|
|
927
|
+
return /* @__PURE__ */ jsx13("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props });
|
|
805
928
|
}
|
|
806
929
|
function SheetTitle({ className, ...props }) {
|
|
807
|
-
return /* @__PURE__ */
|
|
930
|
+
return /* @__PURE__ */ jsx13(
|
|
808
931
|
SheetPrimitive.Title,
|
|
809
932
|
{
|
|
810
933
|
"data-slot": "sheet-title",
|
|
@@ -814,7 +937,7 @@ function SheetTitle({ className, ...props }) {
|
|
|
814
937
|
);
|
|
815
938
|
}
|
|
816
939
|
function SheetDescription({ className, ...props }) {
|
|
817
|
-
return /* @__PURE__ */
|
|
940
|
+
return /* @__PURE__ */ jsx13(
|
|
818
941
|
SheetPrimitive.Description,
|
|
819
942
|
{
|
|
820
943
|
"data-slot": "sheet-description",
|
|
@@ -825,7 +948,7 @@ function SheetDescription({ className, ...props }) {
|
|
|
825
948
|
}
|
|
826
949
|
|
|
827
950
|
// src/react/ui/sidebar.tsx
|
|
828
|
-
import { jsx as
|
|
951
|
+
import { jsx as jsx14, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
829
952
|
var SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
830
953
|
var SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
831
954
|
var SIDEBAR_WIDTH = "256px";
|
|
@@ -880,7 +1003,7 @@ function SidebarProvider({
|
|
|
880
1003
|
}),
|
|
881
1004
|
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
|
|
882
1005
|
);
|
|
883
|
-
return /* @__PURE__ */
|
|
1006
|
+
return /* @__PURE__ */ jsx14(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx14(TooltipProvider, { delay: 0, children: /* @__PURE__ */ jsx14(
|
|
884
1007
|
"div",
|
|
885
1008
|
{
|
|
886
1009
|
"data-slot": "sidebar-wrapper",
|
|
@@ -906,7 +1029,7 @@ function Sidebar({
|
|
|
906
1029
|
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
|
|
907
1030
|
const Surface = variant === "floating" ? Panel : "div";
|
|
908
1031
|
if (collapsible === "none") {
|
|
909
|
-
return /* @__PURE__ */
|
|
1032
|
+
return /* @__PURE__ */ jsx14(
|
|
910
1033
|
"div",
|
|
911
1034
|
{
|
|
912
1035
|
"data-slot": "sidebar",
|
|
@@ -917,7 +1040,7 @@ function Sidebar({
|
|
|
917
1040
|
);
|
|
918
1041
|
}
|
|
919
1042
|
if (isMobile) {
|
|
920
|
-
return /* @__PURE__ */
|
|
1043
|
+
return /* @__PURE__ */ jsx14(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs7(
|
|
921
1044
|
SheetContent,
|
|
922
1045
|
{
|
|
923
1046
|
"data-sidebar": "sidebar",
|
|
@@ -929,16 +1052,16 @@ function Sidebar({
|
|
|
929
1052
|
},
|
|
930
1053
|
side,
|
|
931
1054
|
children: [
|
|
932
|
-
/* @__PURE__ */
|
|
933
|
-
/* @__PURE__ */
|
|
934
|
-
/* @__PURE__ */
|
|
1055
|
+
/* @__PURE__ */ jsxs7(SheetHeader, { className: "sr-only", children: [
|
|
1056
|
+
/* @__PURE__ */ jsx14(SheetTitle, { children: "Sidebar" }),
|
|
1057
|
+
/* @__PURE__ */ jsx14(SheetDescription, { children: "Displays the mobile sidebar." })
|
|
935
1058
|
] }),
|
|
936
|
-
/* @__PURE__ */
|
|
1059
|
+
/* @__PURE__ */ jsx14("div", { className: "flex h-full w-full flex-col", children })
|
|
937
1060
|
]
|
|
938
1061
|
}
|
|
939
1062
|
) });
|
|
940
1063
|
}
|
|
941
|
-
return /* @__PURE__ */
|
|
1064
|
+
return /* @__PURE__ */ jsxs7(
|
|
942
1065
|
"div",
|
|
943
1066
|
{
|
|
944
1067
|
className: "group peer hidden text-sidebar-foreground md:block",
|
|
@@ -948,7 +1071,7 @@ function Sidebar({
|
|
|
948
1071
|
"data-side": side,
|
|
949
1072
|
"data-slot": "sidebar",
|
|
950
1073
|
children: [
|
|
951
|
-
/* @__PURE__ */
|
|
1074
|
+
/* @__PURE__ */ jsx14(
|
|
952
1075
|
"div",
|
|
953
1076
|
{
|
|
954
1077
|
"data-slot": "sidebar-gap",
|
|
@@ -960,7 +1083,7 @@ function Sidebar({
|
|
|
960
1083
|
)
|
|
961
1084
|
}
|
|
962
1085
|
),
|
|
963
|
-
/* @__PURE__ */
|
|
1086
|
+
/* @__PURE__ */ jsx14(
|
|
964
1087
|
"div",
|
|
965
1088
|
{
|
|
966
1089
|
"data-slot": "sidebar-container",
|
|
@@ -972,7 +1095,7 @@ function Sidebar({
|
|
|
972
1095
|
className
|
|
973
1096
|
),
|
|
974
1097
|
...props,
|
|
975
|
-
children: /* @__PURE__ */
|
|
1098
|
+
children: /* @__PURE__ */ jsx14(
|
|
976
1099
|
Surface,
|
|
977
1100
|
{
|
|
978
1101
|
"data-sidebar": "sidebar",
|
|
@@ -988,7 +1111,7 @@ function Sidebar({
|
|
|
988
1111
|
);
|
|
989
1112
|
}
|
|
990
1113
|
function SidebarHeader({ className, ...props }) {
|
|
991
|
-
return /* @__PURE__ */
|
|
1114
|
+
return /* @__PURE__ */ jsx14(
|
|
992
1115
|
"div",
|
|
993
1116
|
{
|
|
994
1117
|
"data-slot": "sidebar-header",
|
|
@@ -999,7 +1122,7 @@ function SidebarHeader({ className, ...props }) {
|
|
|
999
1122
|
);
|
|
1000
1123
|
}
|
|
1001
1124
|
function SidebarFooter({ className, ...props }) {
|
|
1002
|
-
return /* @__PURE__ */
|
|
1125
|
+
return /* @__PURE__ */ jsx14(
|
|
1003
1126
|
"div",
|
|
1004
1127
|
{
|
|
1005
1128
|
"data-slot": "sidebar-footer",
|
|
@@ -1010,7 +1133,7 @@ function SidebarFooter({ className, ...props }) {
|
|
|
1010
1133
|
);
|
|
1011
1134
|
}
|
|
1012
1135
|
function SidebarContent({ className, ...props }) {
|
|
1013
|
-
return /* @__PURE__ */
|
|
1136
|
+
return /* @__PURE__ */ jsx14(
|
|
1014
1137
|
"div",
|
|
1015
1138
|
{
|
|
1016
1139
|
"data-slot": "sidebar-content",
|
|
@@ -1024,7 +1147,7 @@ function SidebarContent({ className, ...props }) {
|
|
|
1024
1147
|
);
|
|
1025
1148
|
}
|
|
1026
1149
|
function SidebarGroup({ className, ...props }) {
|
|
1027
|
-
return /* @__PURE__ */
|
|
1150
|
+
return /* @__PURE__ */ jsx14(
|
|
1028
1151
|
"div",
|
|
1029
1152
|
{
|
|
1030
1153
|
"data-slot": "sidebar-group",
|
|
@@ -1035,7 +1158,7 @@ function SidebarGroup({ className, ...props }) {
|
|
|
1035
1158
|
);
|
|
1036
1159
|
}
|
|
1037
1160
|
function SidebarMenu({ className, ...props }) {
|
|
1038
|
-
return /* @__PURE__ */
|
|
1161
|
+
return /* @__PURE__ */ jsx14(
|
|
1039
1162
|
"ul",
|
|
1040
1163
|
{
|
|
1041
1164
|
"data-slot": "sidebar-menu",
|
|
@@ -1046,7 +1169,7 @@ function SidebarMenu({ className, ...props }) {
|
|
|
1046
1169
|
);
|
|
1047
1170
|
}
|
|
1048
1171
|
function SidebarMenuItem({ className, ...props }) {
|
|
1049
|
-
return /* @__PURE__ */
|
|
1172
|
+
return /* @__PURE__ */ jsx14(
|
|
1050
1173
|
"li",
|
|
1051
1174
|
{
|
|
1052
1175
|
"data-slot": "sidebar-menu-item",
|
|
@@ -1087,7 +1210,7 @@ function SidebarMenuButton({
|
|
|
1087
1210
|
}) {
|
|
1088
1211
|
const Comp = asChild ? Slot4.Root : "button";
|
|
1089
1212
|
const { isMobile, state } = useSidebar();
|
|
1090
|
-
const button2 = /* @__PURE__ */
|
|
1213
|
+
const button2 = /* @__PURE__ */ jsx14(
|
|
1091
1214
|
Comp,
|
|
1092
1215
|
{
|
|
1093
1216
|
"data-slot": "sidebar-menu-button",
|
|
@@ -1100,7 +1223,7 @@ function SidebarMenuButton({
|
|
|
1100
1223
|
);
|
|
1101
1224
|
if (!tooltip) return button2;
|
|
1102
1225
|
const { children, ...hint } = typeof tooltip === "string" ? { children: tooltip } : tooltip;
|
|
1103
|
-
return /* @__PURE__ */
|
|
1226
|
+
return /* @__PURE__ */ jsx14(Hint, { side: "right", align: "center", disabled: state !== "collapsed" || isMobile, ...hint, content: children, children: button2 });
|
|
1104
1227
|
}
|
|
1105
1228
|
function SidebarMenuAction({
|
|
1106
1229
|
className,
|
|
@@ -1109,7 +1232,7 @@ function SidebarMenuAction({
|
|
|
1109
1232
|
...props
|
|
1110
1233
|
}) {
|
|
1111
1234
|
const Comp = asChild ? Slot4.Root : "button";
|
|
1112
|
-
return /* @__PURE__ */
|
|
1235
|
+
return /* @__PURE__ */ jsx14(
|
|
1113
1236
|
Comp,
|
|
1114
1237
|
{
|
|
1115
1238
|
"data-slot": "sidebar-menu-action",
|
|
@@ -1128,7 +1251,7 @@ function SidebarMenuAction({
|
|
|
1128
1251
|
}
|
|
1129
1252
|
|
|
1130
1253
|
// src/react/studio.tsx
|
|
1131
|
-
import { Fragment as
|
|
1254
|
+
import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1132
1255
|
var CONNECTION = {
|
|
1133
1256
|
connected: { icon: PlugZap, tone: "text-success", label: "Runtime connected" },
|
|
1134
1257
|
connecting: { icon: LoaderCircle, tone: "text-warning animate-spin", label: "Connecting to runtime" },
|
|
@@ -1137,22 +1260,22 @@ var CONNECTION = {
|
|
|
1137
1260
|
};
|
|
1138
1261
|
function StudioFooter({ connection }) {
|
|
1139
1262
|
const { state, toggleSidebar } = useSidebar();
|
|
1140
|
-
const { icon: Status, tone, label } = CONNECTION[connection.phase];
|
|
1263
|
+
const { icon: Status, tone, label: label2 } = CONNECTION[connection.phase];
|
|
1141
1264
|
const Toggle = state === "expanded" ? PanelLeftClose : PanelLeftOpen;
|
|
1142
|
-
return /* @__PURE__ */
|
|
1143
|
-
/* @__PURE__ */
|
|
1144
|
-
/* @__PURE__ */
|
|
1145
|
-
/* @__PURE__ */
|
|
1265
|
+
return /* @__PURE__ */ jsx15(SidebarFooter, { children: /* @__PURE__ */ jsxs8(SidebarMenu, { children: [
|
|
1266
|
+
/* @__PURE__ */ jsx15(SidebarMenuItem, { children: /* @__PURE__ */ jsxs8(SidebarMenuButton, { tooltip: label2, className: "cursor-default hover:bg-transparent active:bg-transparent", children: [
|
|
1267
|
+
/* @__PURE__ */ jsx15(Status, { className: tone }),
|
|
1268
|
+
/* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: label2 })
|
|
1146
1269
|
] }) }),
|
|
1147
|
-
/* @__PURE__ */
|
|
1270
|
+
/* @__PURE__ */ jsx15(SidebarMenuItem, { children: /* @__PURE__ */ jsxs8(
|
|
1148
1271
|
SidebarMenuButton,
|
|
1149
1272
|
{
|
|
1150
1273
|
"aria-label": `${state === "expanded" ? "Collapse" : "Expand"} sidebar`,
|
|
1151
1274
|
tooltip: `${state === "expanded" ? "Collapse" : "Expand"} sidebar`,
|
|
1152
1275
|
onClick: toggleSidebar,
|
|
1153
1276
|
children: [
|
|
1154
|
-
/* @__PURE__ */
|
|
1155
|
-
/* @__PURE__ */
|
|
1277
|
+
/* @__PURE__ */ jsx15(Toggle, {}),
|
|
1278
|
+
/* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: "Collapse" })
|
|
1156
1279
|
]
|
|
1157
1280
|
}
|
|
1158
1281
|
) })
|
|
@@ -1182,11 +1305,11 @@ function forwardShortcuts(frame) {
|
|
|
1182
1305
|
function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
1183
1306
|
useStudio(studio);
|
|
1184
1307
|
const { tools, pinned, togglePin } = usePinnedTools(studio);
|
|
1185
|
-
const [mounted, setMounted] =
|
|
1308
|
+
const [mounted, setMounted] = useState10(false);
|
|
1186
1309
|
const [sidebarHidden, setSidebarHidden] = useSessionFlag("joyco-studio:sidebar-hidden");
|
|
1187
1310
|
const [inspectorHidden, setInspectorHidden] = useSessionFlag("joyco-studio:inspector-hidden");
|
|
1188
1311
|
const [canvasExpanded, setCanvasExpanded] = useSessionFlag("joyco-studio:canvas-expanded");
|
|
1189
|
-
const [selected, setSelected] =
|
|
1312
|
+
const [selected, setSelected] = useState10(studio.definitions[0]?.id);
|
|
1190
1313
|
const preview = useRef3(null);
|
|
1191
1314
|
const definition = studio.definitions.find((tool) => tool.id === selected);
|
|
1192
1315
|
const handle = studio.tools.find((tool) => tool.definition.id === selected);
|
|
@@ -1195,7 +1318,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1195
1318
|
const show = { left: () => setSidebarHidden(false), right: () => setInspectorHidden(false) };
|
|
1196
1319
|
const layout = useRef3(hidden);
|
|
1197
1320
|
layout.current = hidden;
|
|
1198
|
-
|
|
1321
|
+
useEffect6(() => {
|
|
1199
1322
|
const onKey = (event) => {
|
|
1200
1323
|
if (event.defaultPrevented || event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) return;
|
|
1201
1324
|
if (event.key.toLowerCase() !== "b") return;
|
|
@@ -1218,10 +1341,10 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1218
1341
|
handle.compare(showSaved);
|
|
1219
1342
|
postCompare(preview.current?.contentWindow, handle.definition.id, showSaved);
|
|
1220
1343
|
};
|
|
1221
|
-
|
|
1344
|
+
useEffect6(() => () => handle?.compare(false), [handle]);
|
|
1222
1345
|
const current = useRef3({ handle, compare });
|
|
1223
1346
|
current.current = { handle, compare };
|
|
1224
|
-
|
|
1347
|
+
useEffect6(() => {
|
|
1225
1348
|
const onKey = (event) => {
|
|
1226
1349
|
if (event.key !== COMPARE_KEY || editable(event) || event.repeat) return;
|
|
1227
1350
|
event.preventDefault();
|
|
@@ -1239,7 +1362,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1239
1362
|
removeEventListener("blur", release);
|
|
1240
1363
|
};
|
|
1241
1364
|
}, []);
|
|
1242
|
-
|
|
1365
|
+
useEffect6(() => {
|
|
1243
1366
|
const onKey = (event) => {
|
|
1244
1367
|
const action = event.defaultPrevented ? null : historyAction(event);
|
|
1245
1368
|
if (!action) return;
|
|
@@ -1249,7 +1372,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1249
1372
|
addEventListener("keydown", onKey);
|
|
1250
1373
|
return () => removeEventListener("keydown", onKey);
|
|
1251
1374
|
}, []);
|
|
1252
|
-
|
|
1375
|
+
useEffect6(() => {
|
|
1253
1376
|
const fromHash = () => {
|
|
1254
1377
|
const id = decodeURIComponent(location.hash.slice(1));
|
|
1255
1378
|
if (studio.definitions.some((tool) => tool.id === id)) setSelected(id);
|
|
@@ -1261,7 +1384,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1261
1384
|
}, [studio]);
|
|
1262
1385
|
if (!mounted) return null;
|
|
1263
1386
|
const sidebarOpen = !document.cookie.split("; ").includes("sidebar_state=false");
|
|
1264
|
-
return /* @__PURE__ */
|
|
1387
|
+
return /* @__PURE__ */ jsx15(StudioShadowRoot, { children: /* @__PURE__ */ jsxs8(
|
|
1265
1388
|
SidebarProvider,
|
|
1266
1389
|
{
|
|
1267
1390
|
defaultOpen: sidebarOpen,
|
|
@@ -1269,7 +1392,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1269
1392
|
"data-sidebar-panel": hidden.left ? "hidden" : "shown",
|
|
1270
1393
|
className: "studio-workspace relative h-svh min-h-0 overflow-hidden text-xs",
|
|
1271
1394
|
children: [
|
|
1272
|
-
definition?.preview ? /* @__PURE__ */
|
|
1395
|
+
definition?.preview ? /* @__PURE__ */ jsx15(
|
|
1273
1396
|
Preview,
|
|
1274
1397
|
{
|
|
1275
1398
|
"data-slot": "studio-preview",
|
|
@@ -1280,44 +1403,44 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1280
1403
|
...Preview === PreviewCanvas && { expanded: canvasExpanded, onExpandedChange: setCanvasExpanded }
|
|
1281
1404
|
},
|
|
1282
1405
|
definition.id
|
|
1283
|
-
) : /* @__PURE__ */
|
|
1406
|
+
) : /* @__PURE__ */ jsx15("div", { className: "absolute inset-0 grid place-items-center text-faint", children: definition ? "This tool has no preview" : "No tools registered" }),
|
|
1284
1407
|
["left", "right"].filter((side) => hidden[side] && (side === "left" || handle)).map((side) => {
|
|
1285
1408
|
const Chevron = side === "left" ? ChevronRight : ChevronLeft;
|
|
1286
|
-
const
|
|
1287
|
-
return /* @__PURE__ */
|
|
1409
|
+
const label2 = side === "left" ? "Show tools" : "Show inspector";
|
|
1410
|
+
return /* @__PURE__ */ jsx15(
|
|
1288
1411
|
"div",
|
|
1289
1412
|
{
|
|
1290
1413
|
"data-slot": "studio-panel-edge",
|
|
1291
1414
|
"data-side": side,
|
|
1292
1415
|
className: cn("group/edge absolute inset-y-0 z-20 w-8", side === "left" ? "left-0" : "right-0"),
|
|
1293
|
-
children: /* @__PURE__ */
|
|
1416
|
+
children: /* @__PURE__ */ jsx15(
|
|
1294
1417
|
Hint,
|
|
1295
1418
|
{
|
|
1296
1419
|
side: side === "left" ? "right" : "left",
|
|
1297
1420
|
sideOffset: 8,
|
|
1298
1421
|
className: "flex items-center gap-2",
|
|
1299
|
-
content: /* @__PURE__ */
|
|
1300
|
-
|
|
1422
|
+
content: /* @__PURE__ */ jsxs8(Fragment3, { children: [
|
|
1423
|
+
label2,
|
|
1301
1424
|
" ",
|
|
1302
|
-
/* @__PURE__ */
|
|
1303
|
-
/* @__PURE__ */
|
|
1304
|
-
/* @__PURE__ */
|
|
1305
|
-
/* @__PURE__ */
|
|
1425
|
+
/* @__PURE__ */ jsx15("span", { className: "text-faint", children: "\xB7 both" }),
|
|
1426
|
+
/* @__PURE__ */ jsxs8(KbdGroup, { children: [
|
|
1427
|
+
/* @__PURE__ */ jsx15(Kbd, { children: "\u2318/Ctrl" }),
|
|
1428
|
+
/* @__PURE__ */ jsx15(Kbd, { children: "B" })
|
|
1306
1429
|
] })
|
|
1307
1430
|
] }),
|
|
1308
|
-
children: /* @__PURE__ */
|
|
1431
|
+
children: /* @__PURE__ */ jsx15(Panel, { asChild: true, children: /* @__PURE__ */ jsx15(
|
|
1309
1432
|
Button,
|
|
1310
1433
|
{
|
|
1311
1434
|
"data-slot": "studio-panel-reveal",
|
|
1312
1435
|
variant: "ghost",
|
|
1313
1436
|
size: "icon",
|
|
1314
|
-
"aria-label":
|
|
1437
|
+
"aria-label": label2,
|
|
1315
1438
|
onClick: show[side],
|
|
1316
1439
|
className: cn(
|
|
1317
1440
|
"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",
|
|
1318
1441
|
side === "left" ? "left-1 -translate-x-[calc(100%+0.25rem)]" : "right-1 translate-x-[calc(100%+0.25rem)]"
|
|
1319
1442
|
),
|
|
1320
|
-
children: /* @__PURE__ */
|
|
1443
|
+
children: /* @__PURE__ */ jsx15(Chevron, { "aria-hidden": true })
|
|
1321
1444
|
}
|
|
1322
1445
|
) })
|
|
1323
1446
|
}
|
|
@@ -1326,7 +1449,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1326
1449
|
side
|
|
1327
1450
|
);
|
|
1328
1451
|
}),
|
|
1329
|
-
/* @__PURE__ */
|
|
1452
|
+
/* @__PURE__ */ jsxs8(
|
|
1330
1453
|
Sidebar,
|
|
1331
1454
|
{
|
|
1332
1455
|
collapsible: "icon",
|
|
@@ -1338,30 +1461,30 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1338
1461
|
hidden.left && "-translate-x-[calc(100%+1rem)]"
|
|
1339
1462
|
),
|
|
1340
1463
|
children: [
|
|
1341
|
-
/* @__PURE__ */
|
|
1342
|
-
/* @__PURE__ */
|
|
1343
|
-
/* @__PURE__ */
|
|
1344
|
-
/* @__PURE__ */
|
|
1464
|
+
/* @__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: [
|
|
1465
|
+
/* @__PURE__ */ jsx15(Logo, { className: "h-3.5 w-auto shrink-0" }),
|
|
1466
|
+
/* @__PURE__ */ jsx15("strong", { className: "tracking-[0.08em] whitespace-nowrap", children: "STUDIO" }),
|
|
1467
|
+
/* @__PURE__ */ jsxs8("span", { "data-slot": "studio-version", className: "text-[10px] text-faint group-data-[collapsible=icon]:hidden", children: [
|
|
1345
1468
|
"v",
|
|
1346
1469
|
version
|
|
1347
1470
|
] })
|
|
1348
1471
|
] }) }),
|
|
1349
|
-
/* @__PURE__ */
|
|
1472
|
+
/* @__PURE__ */ jsx15(SidebarContent, { children: /* @__PURE__ */ jsx15(SidebarGroup, { children: /* @__PURE__ */ jsx15(SidebarMenu, { children: tools.map((tool) => {
|
|
1350
1473
|
const title = tool.title ?? tool.id;
|
|
1351
1474
|
const isPinned = pinned.has(tool.id);
|
|
1352
1475
|
const { state, dirty } = studio.tools.find((handle2) => handle2.definition.id === tool.id) ?? {};
|
|
1353
1476
|
const pinLabel = `${isPinned ? "Unpin" : "Pin"} ${title}`;
|
|
1354
|
-
return /* @__PURE__ */
|
|
1355
|
-
/* @__PURE__ */
|
|
1477
|
+
return /* @__PURE__ */ jsxs8(SidebarMenuItem, { children: [
|
|
1478
|
+
/* @__PURE__ */ jsxs8(
|
|
1356
1479
|
SidebarMenuButton,
|
|
1357
1480
|
{
|
|
1358
1481
|
isActive: tool.id === selected,
|
|
1359
1482
|
tooltip: title,
|
|
1360
1483
|
onClick: () => location.hash = tool.id,
|
|
1361
1484
|
children: [
|
|
1362
|
-
/* @__PURE__ */
|
|
1363
|
-
/* @__PURE__ */
|
|
1364
|
-
dirty && /* @__PURE__ */
|
|
1485
|
+
/* @__PURE__ */ jsxs8("span", { className: "relative", children: [
|
|
1486
|
+
/* @__PURE__ */ jsx15(ToolIcon, { icon: tool.icon, className: "size-4" }),
|
|
1487
|
+
dirty && /* @__PURE__ */ jsx15(
|
|
1365
1488
|
"span",
|
|
1366
1489
|
{
|
|
1367
1490
|
"aria-label": state?.conflict ? "Changed on disk" : "Unsaved",
|
|
@@ -1372,11 +1495,11 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1372
1495
|
}
|
|
1373
1496
|
)
|
|
1374
1497
|
] }),
|
|
1375
|
-
/* @__PURE__ */
|
|
1498
|
+
/* @__PURE__ */ jsx15("span", { className: "text-clip! group-data-[collapsible=icon]:hidden", children: title })
|
|
1376
1499
|
]
|
|
1377
1500
|
}
|
|
1378
1501
|
),
|
|
1379
|
-
/* @__PURE__ */
|
|
1502
|
+
/* @__PURE__ */ jsx15(Hint, { content: pinLabel, side: "right", children: /* @__PURE__ */ jsx15(
|
|
1380
1503
|
SidebarMenuAction,
|
|
1381
1504
|
{
|
|
1382
1505
|
type: "button",
|
|
@@ -1388,16 +1511,16 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1388
1511
|
"cursor-pointer [&>svg]:size-3 [@media(hover:none)]:opacity-100",
|
|
1389
1512
|
isPinned && "text-sidebar-primary"
|
|
1390
1513
|
),
|
|
1391
|
-
children: /* @__PURE__ */
|
|
1514
|
+
children: /* @__PURE__ */ jsx15(Pin2, { "aria-hidden": true, fill: isPinned ? "currentColor" : "none" })
|
|
1392
1515
|
}
|
|
1393
1516
|
) })
|
|
1394
1517
|
] }, tool.id);
|
|
1395
1518
|
}) }) }) }),
|
|
1396
|
-
/* @__PURE__ */
|
|
1519
|
+
/* @__PURE__ */ jsx15(StudioFooter, { connection: studio.connection })
|
|
1397
1520
|
]
|
|
1398
1521
|
}
|
|
1399
1522
|
),
|
|
1400
|
-
handle && /* @__PURE__ */
|
|
1523
|
+
handle && /* @__PURE__ */ jsx15(Panel, { asChild: true, children: /* @__PURE__ */ jsx15(
|
|
1401
1524
|
"aside",
|
|
1402
1525
|
{
|
|
1403
1526
|
"data-slot": "studio-inspector",
|
|
@@ -1407,7 +1530,7 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1407
1530
|
"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",
|
|
1408
1531
|
hidden.right && "translate-x-[calc(100%+1rem)]"
|
|
1409
1532
|
),
|
|
1410
|
-
children: /* @__PURE__ */
|
|
1533
|
+
children: /* @__PURE__ */ jsx15(
|
|
1411
1534
|
Inspector,
|
|
1412
1535
|
{
|
|
1413
1536
|
studio,
|
|
@@ -1426,9 +1549,9 @@ function Studio({ studio, previewComponent, getConfigFileHref }) {
|
|
|
1426
1549
|
|
|
1427
1550
|
// src/react/debug.tsx
|
|
1428
1551
|
import { DebugManager } from "@joycostudio/xyz/debug";
|
|
1429
|
-
import { useEffect as
|
|
1552
|
+
import { useEffect as useEffect7 } from "react";
|
|
1430
1553
|
function StudioDebug({ studio }) {
|
|
1431
|
-
|
|
1554
|
+
useEffect7(() => {
|
|
1432
1555
|
const debug = new DebugManager({
|
|
1433
1556
|
createPane: async () => new (await import("tweakpane")).Pane({ title: "debug" }),
|
|
1434
1557
|
binding: { registerFrame: everyFrame }
|
|
@@ -1442,15 +1565,15 @@ function StudioDebug({ studio }) {
|
|
|
1442
1565
|
// src/react/command-menu.tsx
|
|
1443
1566
|
import { Dialog } from "@base-ui/react/dialog";
|
|
1444
1567
|
import { Pin as Pin3 } from "lucide-react";
|
|
1445
|
-
import { useEffect as
|
|
1568
|
+
import { useEffect as useEffect8, useRef as useRef4, useState as useState11 } from "react";
|
|
1446
1569
|
|
|
1447
1570
|
// src/react/ui/command.tsx
|
|
1448
1571
|
import * as React3 from "react";
|
|
1449
1572
|
import { Command as CommandPrimitive } from "cmdk";
|
|
1450
1573
|
import { SearchIcon } from "lucide-react";
|
|
1451
|
-
import { jsx as
|
|
1574
|
+
import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1452
1575
|
function Command({ className, ...props }) {
|
|
1453
|
-
return /* @__PURE__ */
|
|
1576
|
+
return /* @__PURE__ */ jsx16(
|
|
1454
1577
|
CommandPrimitive,
|
|
1455
1578
|
{
|
|
1456
1579
|
"data-slot": "command",
|
|
@@ -1463,9 +1586,9 @@ function Command({ className, ...props }) {
|
|
|
1463
1586
|
);
|
|
1464
1587
|
}
|
|
1465
1588
|
var CommandInput = React3.forwardRef(function CommandInput2({ className, ...props }, ref) {
|
|
1466
|
-
return /* @__PURE__ */
|
|
1467
|
-
/* @__PURE__ */
|
|
1468
|
-
/* @__PURE__ */
|
|
1589
|
+
return /* @__PURE__ */ jsxs9("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [
|
|
1590
|
+
/* @__PURE__ */ jsx16(SearchIcon, { "aria-hidden": true, className: "size-4 shrink-0 opacity-50" }),
|
|
1591
|
+
/* @__PURE__ */ jsx16(
|
|
1469
1592
|
CommandPrimitive.Input,
|
|
1470
1593
|
{
|
|
1471
1594
|
ref,
|
|
@@ -1480,7 +1603,7 @@ var CommandInput = React3.forwardRef(function CommandInput2({ className, ...prop
|
|
|
1480
1603
|
] });
|
|
1481
1604
|
});
|
|
1482
1605
|
function CommandList({ className, ...props }) {
|
|
1483
|
-
return /* @__PURE__ */
|
|
1606
|
+
return /* @__PURE__ */ jsx16(
|
|
1484
1607
|
CommandPrimitive.List,
|
|
1485
1608
|
{
|
|
1486
1609
|
"data-slot": "command-list",
|
|
@@ -1490,10 +1613,10 @@ function CommandList({ className, ...props }) {
|
|
|
1490
1613
|
);
|
|
1491
1614
|
}
|
|
1492
1615
|
function CommandEmpty({ ...props }) {
|
|
1493
|
-
return /* @__PURE__ */
|
|
1616
|
+
return /* @__PURE__ */ jsx16(CommandPrimitive.Empty, { "data-slot": "command-empty", className: "py-6 text-center text-sm", ...props });
|
|
1494
1617
|
}
|
|
1495
1618
|
function CommandItem({ className, ...props }) {
|
|
1496
|
-
return /* @__PURE__ */
|
|
1619
|
+
return /* @__PURE__ */ jsx16(
|
|
1497
1620
|
CommandPrimitive.Item,
|
|
1498
1621
|
{
|
|
1499
1622
|
"data-slot": "command-item",
|
|
@@ -1507,14 +1630,14 @@ function CommandItem({ className, ...props }) {
|
|
|
1507
1630
|
}
|
|
1508
1631
|
|
|
1509
1632
|
// src/react/command-menu.tsx
|
|
1510
|
-
import { jsx as
|
|
1633
|
+
import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1511
1634
|
function StudioCommandMenu(props) {
|
|
1512
|
-
return /* @__PURE__ */
|
|
1635
|
+
return /* @__PURE__ */ jsx17(StudioShadowRoot, { children: /* @__PURE__ */ jsx17(CommandMenu, { ...props }) });
|
|
1513
1636
|
}
|
|
1514
1637
|
function CommandMenu({ studio, studioPath = "/studio", navigate }) {
|
|
1515
1638
|
const { tools, pinned } = usePinnedTools(studio);
|
|
1516
|
-
const [open, setOpen] =
|
|
1517
|
-
const [session, setSession] =
|
|
1639
|
+
const [open, setOpen] = useState11(false);
|
|
1640
|
+
const [session, setSession] = useState11(0);
|
|
1518
1641
|
const isOpen = useRef4(open);
|
|
1519
1642
|
isOpen.current = open;
|
|
1520
1643
|
const show = (next) => {
|
|
@@ -1522,7 +1645,7 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
|
|
|
1522
1645
|
setOpen(next);
|
|
1523
1646
|
};
|
|
1524
1647
|
const input = useRef4(null);
|
|
1525
|
-
|
|
1648
|
+
useEffect8(() => {
|
|
1526
1649
|
if (window.frameElement?.getAttribute("data-slot") === "studio-preview") return;
|
|
1527
1650
|
const onKey = (event) => {
|
|
1528
1651
|
if (event.defaultPrevented || event.isComposing || event.altKey || !(event.metaKey || event.ctrlKey)) return;
|
|
@@ -1546,47 +1669,47 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
|
|
|
1546
1669
|
window.location.assign(target.href);
|
|
1547
1670
|
}
|
|
1548
1671
|
};
|
|
1549
|
-
return /* @__PURE__ */
|
|
1550
|
-
/* @__PURE__ */
|
|
1551
|
-
/* @__PURE__ */
|
|
1552
|
-
/* @__PURE__ */
|
|
1553
|
-
/* @__PURE__ */
|
|
1554
|
-
/* @__PURE__ */
|
|
1555
|
-
/* @__PURE__ */
|
|
1672
|
+
return /* @__PURE__ */ jsx17(Dialog.Root, { open, onOpenChange: show, children: /* @__PURE__ */ jsxs10(Dialog.Portal, { container: usePortalContainer(), children: [
|
|
1673
|
+
/* @__PURE__ */ jsx17(Dialog.Backdrop, { "data-slot": "studio-command-overlay" }),
|
|
1674
|
+
/* @__PURE__ */ jsxs10(Dialog.Popup, { "data-slot": "studio-command-menu", initialFocus: input, children: [
|
|
1675
|
+
/* @__PURE__ */ jsxs10("div", { "data-slot": "studio-command-heading", children: [
|
|
1676
|
+
/* @__PURE__ */ jsxs10(Dialog.Title, { "aria-label": "Studio tools", children: [
|
|
1677
|
+
/* @__PURE__ */ jsx17(Logo, { "aria-hidden": true }),
|
|
1678
|
+
/* @__PURE__ */ jsx17("strong", { children: "STUDIO" })
|
|
1556
1679
|
] }),
|
|
1557
|
-
/* @__PURE__ */
|
|
1680
|
+
/* @__PURE__ */ jsx17(Dialog.Close, { "aria-label": "Close tool menu", children: /* @__PURE__ */ jsx17(Kbd, { children: "esc" }) })
|
|
1558
1681
|
] }),
|
|
1559
|
-
/* @__PURE__ */
|
|
1560
|
-
/* @__PURE__ */
|
|
1561
|
-
/* @__PURE__ */
|
|
1562
|
-
/* @__PURE__ */
|
|
1563
|
-
/* @__PURE__ */
|
|
1564
|
-
tools.map((tool) => /* @__PURE__ */
|
|
1682
|
+
/* @__PURE__ */ jsx17(Dialog.Description, { "data-slot": "studio-command-description", children: "Open a tool in Studio." }),
|
|
1683
|
+
/* @__PURE__ */ jsxs10(Command, { label: "Studio tools", loop: true, vimBindings: false, children: [
|
|
1684
|
+
/* @__PURE__ */ jsx17(CommandInput, { ref: input, placeholder: "Search tools\u2026" }),
|
|
1685
|
+
/* @__PURE__ */ jsxs10(CommandList, { children: [
|
|
1686
|
+
/* @__PURE__ */ jsx17(CommandEmpty, { children: studio.definitions.length ? "No tools found." : "No tools registered yet." }),
|
|
1687
|
+
tools.map((tool) => /* @__PURE__ */ jsxs10(
|
|
1565
1688
|
CommandItem,
|
|
1566
1689
|
{
|
|
1567
1690
|
value: tool.id,
|
|
1568
1691
|
keywords: [tool.title ?? tool.id],
|
|
1569
1692
|
onSelect: () => select(tool.id),
|
|
1570
1693
|
children: [
|
|
1571
|
-
/* @__PURE__ */
|
|
1572
|
-
/* @__PURE__ */
|
|
1573
|
-
pinned.has(tool.id) && /* @__PURE__ */
|
|
1694
|
+
/* @__PURE__ */ jsx17(ToolIcon, { icon: tool.icon }),
|
|
1695
|
+
/* @__PURE__ */ jsx17("span", { "data-slot": "studio-command-label", children: tool.title ?? tool.id }),
|
|
1696
|
+
pinned.has(tool.id) && /* @__PURE__ */ jsx17(Pin3, { "aria-hidden": true })
|
|
1574
1697
|
]
|
|
1575
1698
|
},
|
|
1576
1699
|
tool.id
|
|
1577
1700
|
))
|
|
1578
1701
|
] })
|
|
1579
1702
|
] }, session),
|
|
1580
|
-
/* @__PURE__ */
|
|
1581
|
-
/* @__PURE__ */
|
|
1582
|
-
/* @__PURE__ */
|
|
1583
|
-
/* @__PURE__ */
|
|
1584
|
-
/* @__PURE__ */
|
|
1703
|
+
/* @__PURE__ */ jsxs10("div", { "data-slot": "studio-command-footer", "aria-hidden": true, children: [
|
|
1704
|
+
/* @__PURE__ */ jsxs10("span", { children: [
|
|
1705
|
+
/* @__PURE__ */ jsxs10(KbdGroup, { children: [
|
|
1706
|
+
/* @__PURE__ */ jsx17(Kbd, { children: "\u2191" }),
|
|
1707
|
+
/* @__PURE__ */ jsx17(Kbd, { children: "\u2193" })
|
|
1585
1708
|
] }),
|
|
1586
1709
|
"navigate"
|
|
1587
1710
|
] }),
|
|
1588
|
-
/* @__PURE__ */
|
|
1589
|
-
/* @__PURE__ */
|
|
1711
|
+
/* @__PURE__ */ jsxs10("span", { children: [
|
|
1712
|
+
/* @__PURE__ */ jsx17(Kbd, { children: "\u21B5" }),
|
|
1590
1713
|
" open tool"
|
|
1591
1714
|
] })
|
|
1592
1715
|
] })
|
|
@@ -1596,7 +1719,7 @@ function CommandMenu({ studio, studioPath = "/studio", navigate }) {
|
|
|
1596
1719
|
|
|
1597
1720
|
// src/react/select.tsx
|
|
1598
1721
|
import { Select } from "@base-ui/react/select";
|
|
1599
|
-
import { Check, ChevronDown, ChevronUp } from "lucide-react";
|
|
1722
|
+
import { Check as Check2, ChevronDown, ChevronUp as ChevronUp2 } from "lucide-react";
|
|
1600
1723
|
|
|
1601
1724
|
// src/react/select-labels.ts
|
|
1602
1725
|
import { Children, isValidElement } from "react";
|
|
@@ -1610,41 +1733,41 @@ function itemLabels(children, labels = {}) {
|
|
|
1610
1733
|
}
|
|
1611
1734
|
|
|
1612
1735
|
// src/react/select.tsx
|
|
1613
|
-
import { jsx as
|
|
1614
|
-
function StudioSelect({ label, title, className, children, ...props }) {
|
|
1615
|
-
return /* @__PURE__ */
|
|
1616
|
-
/* @__PURE__ */
|
|
1736
|
+
import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1737
|
+
function StudioSelect({ label: label2, title, className, children, ...props }) {
|
|
1738
|
+
return /* @__PURE__ */ jsxs11(Select.Root, { items: itemLabels(children), ...props, children: [
|
|
1739
|
+
/* @__PURE__ */ jsxs11(
|
|
1617
1740
|
Select.Trigger,
|
|
1618
1741
|
{
|
|
1619
1742
|
"data-slot": "select-trigger",
|
|
1620
|
-
"aria-label":
|
|
1743
|
+
"aria-label": label2,
|
|
1621
1744
|
title,
|
|
1622
1745
|
className: cn(
|
|
1623
1746
|
"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",
|
|
1624
1747
|
className
|
|
1625
1748
|
),
|
|
1626
1749
|
children: [
|
|
1627
|
-
/* @__PURE__ */
|
|
1628
|
-
/* @__PURE__ */
|
|
1750
|
+
/* @__PURE__ */ jsx18(Select.Value, {}),
|
|
1751
|
+
/* @__PURE__ */ jsx18(Select.Icon, { children: /* @__PURE__ */ jsx18(ChevronDown, { className: "shrink-0 text-muted-foreground", size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
|
|
1629
1752
|
]
|
|
1630
1753
|
}
|
|
1631
1754
|
),
|
|
1632
|
-
/* @__PURE__ */
|
|
1755
|
+
/* @__PURE__ */ jsx18(Select.Portal, { container: usePortalContainer(), children: /* @__PURE__ */ jsx18(Select.Positioner, { align: "end", sideOffset: 6, alignItemWithTrigger: false, className: "isolate z-50", children: /* @__PURE__ */ jsxs11(
|
|
1633
1756
|
Select.Popup,
|
|
1634
1757
|
{
|
|
1635
1758
|
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",
|
|
1636
1759
|
"data-slot": "select-content",
|
|
1637
1760
|
children: [
|
|
1638
|
-
/* @__PURE__ */
|
|
1639
|
-
/* @__PURE__ */
|
|
1640
|
-
/* @__PURE__ */
|
|
1761
|
+
/* @__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 }) }),
|
|
1762
|
+
/* @__PURE__ */ jsx18(Select.List, { children }),
|
|
1763
|
+
/* @__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 }) })
|
|
1641
1764
|
]
|
|
1642
1765
|
}
|
|
1643
1766
|
) }) })
|
|
1644
1767
|
] });
|
|
1645
1768
|
}
|
|
1646
1769
|
function StudioSelectItem({ className, children, ...props }) {
|
|
1647
|
-
return /* @__PURE__ */
|
|
1770
|
+
return /* @__PURE__ */ jsxs11(
|
|
1648
1771
|
Select.Item,
|
|
1649
1772
|
{
|
|
1650
1773
|
"data-slot": "select-item",
|
|
@@ -1654,8 +1777,8 @@ function StudioSelectItem({ className, children, ...props }) {
|
|
|
1654
1777
|
),
|
|
1655
1778
|
...props,
|
|
1656
1779
|
children: [
|
|
1657
|
-
/* @__PURE__ */
|
|
1658
|
-
/* @__PURE__ */
|
|
1780
|
+
/* @__PURE__ */ jsx18(Select.ItemText, { children }),
|
|
1781
|
+
/* @__PURE__ */ jsx18(Select.ItemIndicator, { className: "absolute right-2", children: /* @__PURE__ */ jsx18(Check2, { size: 14, strokeWidth: 1.5, "aria-hidden": true }) })
|
|
1659
1782
|
]
|
|
1660
1783
|
}
|
|
1661
1784
|
);
|
|
@@ -1663,9 +1786,9 @@ function StudioSelectItem({ className, children, ...props }) {
|
|
|
1663
1786
|
|
|
1664
1787
|
// src/react/ui/input.tsx
|
|
1665
1788
|
import { forwardRef as forwardRef5 } from "react";
|
|
1666
|
-
import { jsx as
|
|
1789
|
+
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
1667
1790
|
var Input = forwardRef5(function Input2({ className, ...props }, ref) {
|
|
1668
|
-
return /* @__PURE__ */
|
|
1791
|
+
return /* @__PURE__ */ jsx19(
|
|
1669
1792
|
"input",
|
|
1670
1793
|
{
|
|
1671
1794
|
ref,
|