foss-design 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,8 +14,8 @@
14
14
  document.documentElement.dataset.theme = dark ? 'dark' : 'light'
15
15
  } catch (e) {}
16
16
  </script>
17
- <script type="module" crossorigin src="./assets/index-CUXYA4jJ.js"></script>
18
- <link rel="stylesheet" crossorigin href="./assets/index-DG4Nv6cf.css">
17
+ <script type="module" crossorigin src="./assets/index-D6sHcSw6.js"></script>
18
+ <link rel="stylesheet" crossorigin href="./assets/index-BL2Cxj98.css">
19
19
  </head>
20
20
  <body>
21
21
  <div id="root"></div>
@@ -6747,7 +6747,10 @@ function AppTopBar() {
6747
6747
  })
6748
6748
  ] }),
6749
6749
  /* @__PURE__ */ jsx(PhoneTabs, { location }),
6750
- slots.belowBar
6750
+ slots.belowBar ? /* @__PURE__ */ jsx("div", {
6751
+ className: "shrink-0",
6752
+ children: slots.belowBar
6753
+ }) : null
6751
6754
  ] });
6752
6755
  }
6753
6756
  /** The section tabs on a phone, where the bar has no room for them: a row under it. */
@@ -7075,6 +7078,78 @@ async function copyText(text, label = "Copied") {
7075
7078
  }
7076
7079
  }
7077
7080
  //#endregion
7081
+ //#region src/shared/routes.ts
7082
+ function split(path) {
7083
+ return path.split("/").filter(Boolean);
7084
+ }
7085
+ function compileRoute(pattern) {
7086
+ return {
7087
+ pattern,
7088
+ segments: split(pattern).map((part) => {
7089
+ if (part === "*") return { kind: "splat" };
7090
+ if (part.startsWith(":")) return {
7091
+ kind: "param",
7092
+ optional: part.endsWith("?")
7093
+ };
7094
+ return {
7095
+ kind: "static",
7096
+ value: part
7097
+ };
7098
+ })
7099
+ };
7100
+ }
7101
+ function decode(part) {
7102
+ try {
7103
+ return decodeURIComponent(part);
7104
+ } catch {
7105
+ return part;
7106
+ }
7107
+ }
7108
+ /** How well a route matches a path (higher is more specific), or null when it does not. */
7109
+ function scoreRoute(route, path) {
7110
+ const parts = split(path.split(/[?#]/)[0] ?? "").map(decode);
7111
+ const walk = (s, p) => {
7112
+ if (s === route.segments.length) return p === parts.length ? 0 : null;
7113
+ const segment = route.segments[s];
7114
+ if (segment.kind === "splat") return 0;
7115
+ if (segment.kind === "static") {
7116
+ if (parts[p] !== segment.value) return null;
7117
+ const rest = walk(s + 1, p + 1);
7118
+ return rest === null ? null : rest + 4;
7119
+ }
7120
+ if (p < parts.length) {
7121
+ const rest = walk(s + 1, p + 1);
7122
+ if (rest !== null) return rest + 2;
7123
+ }
7124
+ return segment.optional ? walk(s + 1, p) : null;
7125
+ };
7126
+ return walk(0, 0);
7127
+ }
7128
+ /** The most specific match for a path; the first one listed wins a tie. */
7129
+ function matchRoute(entries, path) {
7130
+ let best = null;
7131
+ for (const entry of entries) for (const route of entry.routes) {
7132
+ const score = scoreRoute(route, path);
7133
+ if (score !== null && (!best || score > best.score)) best = {
7134
+ score,
7135
+ value: entry.value
7136
+ };
7137
+ }
7138
+ return best?.value ?? null;
7139
+ }
7140
+ /**
7141
+ * The app path a link points at, from its `href` as written: an absolute path as it is, a
7142
+ * relative one against the route of the screen it is in (or `/`). Null for links that do not
7143
+ * lead to another page of the app: `#…`, other schemes, other sites.
7144
+ */
7145
+ function linkPath(href, base = "/") {
7146
+ const raw = href.trim();
7147
+ if (!raw || raw.startsWith("#")) return null;
7148
+ if (/^[a-z][a-z0-9+.-]*:/i.test(raw) || raw.startsWith("//")) return null;
7149
+ const url = new URL(raw, `http://app.invalid${base.replace(/\/:[^/]+\??|\/\*$/g, "/x")}`);
7150
+ return url.pathname + url.search + url.hash;
7151
+ }
7152
+ //#endregion
7078
7153
  //#region viewer/src/lib/frames.ts
7079
7154
  /** Routes runtime messages to whoever listens to the frame that sent them. */
7080
7155
  var handlers = /* @__PURE__ */ new Map();
@@ -7154,11 +7229,13 @@ function absoluteUrl(url) {
7154
7229
  return new URL(url, document.baseURI).toString();
7155
7230
  }
7156
7231
  /**
7157
- * A link or form the runtime kept from leaving its frame. A path whose last part names a screen
7158
- * or URL item on the canvas (`/settings`, `settings.html`) goes there; a link to another site
7159
- * opens in a new tab; anything else says where it pointed.
7232
+ * A link, form or history push the runtime kept from leaving its frame. The path goes to the
7233
+ * screen whose `route` matches it best (a relative `href` resolves against the route of the
7234
+ * screen it is in); without routes, a path whose last part names a screen still opens it. A
7235
+ * link to another site opens in a new tab. A push nobody's route matches belongs to the
7236
+ * screen's own router; a link or form that leads nowhere stays put with a note.
7160
7237
  */
7161
- function followLink(message, canvas, go) {
7238
+ function followLink(message, canvas, go, from) {
7162
7239
  if (message.form) {
7163
7240
  toast("Forms are not sent from a screen", void 0, "info");
7164
7241
  return;
@@ -7169,14 +7246,25 @@ function followLink(message, canvas, go) {
7169
7246
  else toast("Link to another site", message.href, "info");
7170
7247
  return;
7171
7248
  }
7172
- const path = message.path.split(/[?#]/)[0].replace(/\/+$/, "");
7173
- let name = path.slice(path.lastIndexOf("/") + 1).replace(/\.html?$/, "");
7249
+ const frames = canvas.pages.flatMap((page) => page.sections.flatMap((section) => section.items.filter((item) => item.kind === "screen" || item.kind === "url")));
7250
+ const here = frames.find((item) => item.id === from);
7251
+ const path = message.raw === void 0 ? message.path : linkPath(message.raw, here?.routes?.[0]);
7252
+ if (path === null) return;
7253
+ const routed = matchRoute(frames.map((item) => ({
7254
+ routes: (item.routes ?? []).map(compileRoute),
7255
+ value: item.id
7256
+ })), path);
7257
+ if (routed) {
7258
+ if (routed !== from) go(routed);
7259
+ return;
7260
+ }
7261
+ const bare = path.split(/[?#]/)[0].replace(/\/+$/, "");
7262
+ let name = bare.slice(bare.lastIndexOf("/") + 1).replace(/\.html?$/, "");
7174
7263
  try {
7175
7264
  name = decodeURIComponent(name);
7176
7265
  } catch {}
7177
- const ids = new Set(canvas.pages.flatMap((page) => page.sections.flatMap((section) => section.items.filter((item) => item.kind === "screen" || item.kind === "url").map((item) => item.id))));
7178
- if (name && ids.has(name)) go(name);
7179
- else toast("Not a screen on this canvas", message.path, "info");
7266
+ if (name && name !== from && frames.some((item) => item.id === name)) go(name);
7267
+ else if (!message.pushed) toast("No screen for this link", path, "info");
7180
7268
  }
7181
7269
  //#endregion
7182
7270
  //#region viewer/src/components/inspector.tsx
@@ -7916,7 +8004,7 @@ function PanelFoot({ left, right }) {
7916
8004
  /** Bottom summary strip. */
7917
8005
  function Strip({ children, className }) {
7918
8006
  return /* @__PURE__ */ jsx("div", {
7919
- className: cn("flex min-h-[38px] items-center gap-2 border-t border-rule bg-soft px-4 py-2 text-[12.5px] text-muted", className),
8007
+ className: cn("flex min-h-[38px] shrink-0 items-center gap-2 border-t border-rule bg-soft px-4 py-2 text-[12.5px] text-muted", className),
7920
8008
  children
7921
8009
  });
7922
8010
  }
@@ -8851,7 +8939,7 @@ function FullPage({ canvasId, itemId }) {
8851
8939
  else if (message.type === "go") {
8852
8940
  const id = message.target.includes("/") ? message.target.split("/")[1] : message.target;
8853
8941
  if (items.some((entry) => entry.id === id)) navigate(fullHref(canvasId, id, theme), { replace: true });
8854
- } else if (message.type === "link" && canvas) followLink(message, canvas, (id) => navigate(fullHref(canvasId, id, theme), { replace: true }));
8942
+ } else if (message.type === "link" && canvas) followLink(message, canvas, (id) => navigate(fullHref(canvasId, id, theme), { replace: true }), itemId);
8855
8943
  });
8856
8944
  }, [url, item?.kind]);
8857
8945
  if (error) return /* @__PURE__ */ jsx(NotFound, {
@@ -9088,7 +9176,10 @@ function CanvasBar({ canvas, page, theme, onTheme, sidebar, onSidebar, onPlay, c
9088
9176
  slots.barEnd
9089
9177
  ]
9090
9178
  })
9091
- ] }), slots.belowBar] });
9179
+ ] }), slots.belowBar ? /* @__PURE__ */ jsx("div", {
9180
+ className: "shrink-0",
9181
+ children: slots.belowBar
9182
+ }) : null] });
9092
9183
  }
9093
9184
  /** The selected item's name and actions, floating over the bottom of the canvas. */
9094
9185
  function SelectionBar({ canvas, store, layoutItems, theme, onPlay, inspect }) {
@@ -12154,7 +12245,7 @@ function CanvasView({ canvas, page }) {
12154
12245
  console.warn(`[design] go("${target}"): no such screen`);
12155
12246
  },
12156
12247
  onLink(from, message) {
12157
- followLink(message, canvas, (id) => this.onGo(from, id));
12248
+ followLink(message, canvas, (id) => this.onGo(from, id), from);
12158
12249
  },
12159
12250
  onWheel(frame, message) {
12160
12251
  const root = frame.closest(".canvas-root");
@@ -12297,7 +12388,7 @@ function CanvasView({ canvas, page }) {
12297
12388
  },
12298
12389
  canPlay: order.length > 0
12299
12390
  }), /* @__PURE__ */ jsxs("div", {
12300
- className: "flex min-h-0 grow",
12391
+ className: "flex min-h-0 grow basis-0",
12301
12392
  children: [
12302
12393
  /* @__PURE__ */ jsx(SlidePanel, {
12303
12394
  open: sidebar && !!page,
@@ -12663,7 +12754,7 @@ function Player({ canvas, itemId }) {
12663
12754
  } else if (message.type === "link") followLink(message, canvas, (id) => {
12664
12755
  const target = all.find((e) => e.item.id === id);
12665
12756
  if (target) navigate(playHref(canvas.id, target.item.id, target.pageId));
12666
- });
12757
+ }, item?.id);
12667
12758
  });
12668
12759
  }, [
12669
12760
  item,
@@ -12799,9 +12890,12 @@ function Player({ canvas, itemId }) {
12799
12890
  ]
12800
12891
  })
12801
12892
  ] }),
12802
- slots.belowBar,
12893
+ slots.belowBar ? /* @__PURE__ */ jsx("div", {
12894
+ className: "shrink-0",
12895
+ children: slots.belowBar
12896
+ }) : null,
12803
12897
  /* @__PURE__ */ jsxs("div", {
12804
- className: "flex min-h-0 grow",
12898
+ className: "flex min-h-0 grow basis-0",
12805
12899
  children: [/* @__PURE__ */ jsxs("div", {
12806
12900
  ref: stage,
12807
12901
  className: `canvas-dots relative min-w-0 grow ${fit === "actual" ? "overflow-auto" : "overflow-hidden"}`,
@@ -12937,7 +13031,7 @@ function PhoneViewer({ canvas, pageId, itemId }) {
12937
13031
  else if (message.type === "error") setErrors((list) => list.includes(message.message) ? list : [...list, message.message]);
12938
13032
  else if (message.type === "updated") setErrors([]);
12939
13033
  else if (message.type === "go") goTo(message.target.includes("/") ? message.target.split("/")[1] : message.target);
12940
- else if (message.type === "link") followLink(message, canvas, goTo);
13034
+ else if (message.type === "link") followLink(message, canvas, goTo, item.id);
12941
13035
  });
12942
13036
  }, [frameEl, src]);
12943
13037
  useEffect(() => {
@@ -13051,7 +13145,10 @@ function PhoneViewer({ canvas, pageId, itemId }) {
13051
13145
  slots.barEnd
13052
13146
  ] })
13053
13147
  }),
13054
- slots.belowBar,
13148
+ slots.belowBar ? /* @__PURE__ */ jsx("div", {
13149
+ className: "shrink-0",
13150
+ children: slots.belowBar
13151
+ }) : null,
13055
13152
  /* @__PURE__ */ jsxs("div", {
13056
13153
  ref: stage,
13057
13154
  onTouchStart,
@@ -1076,6 +1076,10 @@
1076
1076
  flex-grow: 1;
1077
1077
  }
1078
1078
 
1079
+ .basis-0 {
1080
+ flex-basis: 0;
1081
+ }
1082
+
1079
1083
  .-translate-x-1\/2 {
1080
1084
  --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
1081
1085
  translate: var(--tw-translate-x) var(--tw-translate-y);
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Screen routes: the app URL a screen stands for (`/databases/:id`), so a plain link in any
3
+ * screen (`href="/databases/orders-db"`) opens the screen that shows that URL. Patterns work
4
+ * like a router's: `:param` matches one segment, `:param?` an optional one, a trailing `*` the
5
+ * rest of the path.
6
+ */
7
+ type Segment = {
8
+ kind: 'static';
9
+ value: string;
10
+ } | {
11
+ kind: 'param';
12
+ optional: boolean;
13
+ } | {
14
+ kind: 'splat';
15
+ };
16
+ export interface CompiledRoute {
17
+ pattern: string;
18
+ segments: Segment[];
19
+ }
20
+ /** What is wrong with a pattern, or null. */
21
+ export declare function routeError(pattern: string): string | null;
22
+ export declare function compileRoute(pattern: string): CompiledRoute;
23
+ /** How well a route matches a path (higher is more specific), or null when it does not. */
24
+ export declare function scoreRoute(route: CompiledRoute, path: string): number | null;
25
+ export interface Routed<T> {
26
+ routes: CompiledRoute[];
27
+ value: T;
28
+ }
29
+ /** The most specific match for a path; the first one listed wins a tie. */
30
+ export declare function matchRoute<T>(entries: Routed<T>[], path: string): T | null;
31
+ /**
32
+ * The app path a link points at, from its `href` as written: an absolute path as it is, a
33
+ * relative one against the route of the screen it is in (or `/`). Null for links that do not
34
+ * lead to another page of the app: `#…`, other schemes, other sites.
35
+ */
36
+ export declare function linkPath(href: string, base?: string): string | null;
37
+ export {};
@@ -47,6 +47,8 @@ interface ItemBase {
47
47
  id: string;
48
48
  title: string;
49
49
  description?: string;
50
+ /** Screens and url items: the app URL patterns they stand for (`/databases/:id`). */
51
+ routes?: string[];
50
52
  /** Free-layout position on the page, in canvas pixels. */
51
53
  x?: number;
52
54
  y?: number;
@@ -296,6 +298,10 @@ export type RuntimeMessage = {
296
298
  href: string;
297
299
  path: string | null;
298
300
  form: boolean;
301
+ /** The `href` as written (0.4.3+), resolved by the viewer against the screen's route. */
302
+ raw?: string;
303
+ /** Sent by the screen's own `history.pushState`, not a click: the screen already moved. */
304
+ pushed?: boolean;
299
305
  } | {
300
306
  source: 'design-runtime';
301
307
  key: string;
@@ -23,11 +23,13 @@ export declare function frameSrc(url: string, theme: Theme, extra?: Record<strin
23
23
  /** Absolute URL for opening a frame in a new tab. */
24
24
  export declare function absoluteUrl(url: string): string;
25
25
  /**
26
- * A link or form the runtime kept from leaving its frame. A path whose last part names a screen
27
- * or URL item on the canvas (`/settings`, `settings.html`) goes there; a link to another site
28
- * opens in a new tab; anything else says where it pointed.
26
+ * A link, form or history push the runtime kept from leaving its frame. The path goes to the
27
+ * screen whose `route` matches it best (a relative `href` resolves against the route of the
28
+ * screen it is in); without routes, a path whose last part names a screen still opens it. A
29
+ * link to another site opens in a new tab. A push nobody's route matches belongs to the
30
+ * screen's own router; a link or form that leads nowhere stays put with a note.
29
31
  */
30
32
  export declare function followLink(message: Extract<RuntimeMessage, {
31
33
  type: 'link';
32
- }>, canvas: CanvasDoc, go: (id: string) => void): void;
34
+ }>, canvas: CanvasDoc, go: (id: string) => void, from?: string): void;
33
35
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foss-design",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "Design canvases and design systems for coding agents: live, animated, clickable screens on an infinite canvas, served locally from a .design folder.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,2 +0,0 @@
1
- /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @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{--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-leading:initial;--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-duration:initial;--tw-ease:initial}::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-leading:initial;--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-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"IBM Plex Sans", system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, monospace;--spacing:.25rem;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--leading-tight:1.25;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"IBM Plex Sans", system-ui, sans-serif;--default-mono-font-family:"IBM Plex Mono", ui-monospace, monospace;--color-ink:var(--ink);--shadow-pop:var(--shadow-pop);--shadow-frame:var(--shadow-frame)}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::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;-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}html,body{background:var(--bg);color:var(--ink);font-family:var(--font-sans);-webkit-text-size-adjust:100%;overscroll-behavior:none;font-size:14px;line-height:1.45}body{min-height:100dvh;margin:0}#root{flex-direction:column;min-height:100dvh;display:flex;overflow:clip}button{font:inherit}:focus-visible{outline:2px solid var(--action);outline-offset:2px}:where(.overflow-y-auto,.overflow-auto,.overflow-hidden) :focus-visible{outline-offset:-2px}::selection{background:var(--action-soft)}@supports selector(::-webkit-scrollbar){::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-corner{background:0 0}::-webkit-scrollbar-thumb{background:var(--scrollbar) padding-box;border:3px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-hover)}::-webkit-scrollbar-button{display:none}}@supports not selector(::-webkit-scrollbar){*{scrollbar-width:thin;scrollbar-color:var(--scrollbar) transparent}}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.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-x-6{inset-inline:calc(var(--spacing) * 6)}.inset-y-5{inset-block:calc(var(--spacing) * 5)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-\[2px\]{top:2px}.top-\[52px\]{top:52px}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.left-0{left:0}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing) * 4)}.left-5{left:calc(var(--spacing) * 5)}.left-\[2px\]{left:2px}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[60\]{z-index:60}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-auto{margin-block:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-px{margin-top:1px}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.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)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[7px\]{width:7px;height:7px}.size-\[14px\]{width:14px;height:14px}.h-ctrl{height:32px}@media (max-width:767px){.h-ctrl{height:40px}}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.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-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-\[2px\]{height:2px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[44px\]{height:44px}.h-\[46px\]{height:46px}.h-\[52px\]{height:52px}.h-\[54px\]{height:54px}.h-\[60px\]{height:60px}.h-\[88px\]{height:88px}.h-\[112px\]{height:112px}.h-\[132px\]{height:132px}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[82dvh\]{max-height:82dvh}.max-h-\[96px\]{max-height:96px}.max-h-\[640px\]{max-height:640px}.max-h-\[calc\(100dvh-52px\)\]{max-height:calc(100dvh - 52px)}.max-h-\[min\(56vh\,520px\)\]{max-height:min(56vh,520px)}.max-h-\[min\(560px\,76vh\)\]{max-height:min(560px,76vh)}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-\[38px\]{min-height:38px}.min-h-\[46px\]{min-height:46px}.min-h-\[48px\]{min-height:48px}.min-h-\[50vh\]{min-height:50vh}.min-h-full{min-height:100%}.w-ctrl{width:32px}@media (max-width:767px){.w-ctrl{width:40px}}.w-5{width:calc(var(--spacing) * 5)}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-\[32px\]{width:32px}.w-\[38\%\]{width:38%}.w-\[44px\]{width:44px}.w-\[62\%\]{width:62%}.w-\[86px\]{width:86px}.w-\[92px\]{width:92px}.w-\[108px\]{width:108px}.w-\[220px\]{width:220px}.w-\[264px\]{width:264px}.w-\[300px\]{width:300px}.w-\[320px\]{width:320px}.w-\[460px\]{width:460px}.w-\[480px\]{width:480px}.w-\[560px\]{width:560px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-\[80\%\]{max-width:80%}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[400px\]{max-width:400px}.max-w-\[760px\]{max-width:760px}.max-w-\[1100px\]{max-width:1100px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[1440px\]{max-width:1440px}.max-w-\[calc\(100vw-24px\)\]{max-width:calc(100vw - 24px)}.max-w-\[min\(420px\,calc\(100vw-32px\)\)\]{max-width:min(420px,100vw - 32px)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\[3ch\]{min-width:3ch}.min-w-\[18px\]{min-width:18px}.min-w-\[52px\]{min-width:52px}.min-w-\[56px\]{min-width:56px}.min-w-full{min-width:100%}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink-\[20\]{flex-shrink:20}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);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)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-\[q-fade-in_160ms_ease-out\]{animation:.16s ease-out q-fade-in}.animate-\[q-pop_120ms_ease-out\]{animation:.12s ease-out q-pop}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-y{resize:vertical}.grid-cols-\[28px_minmax\(0\,1fr\)_28px\]{grid-template-columns:28px minmax(0,1fr) 28px}.grid-cols-\[92px_minmax\(0\,1fr\)\]{grid-template-columns:92px minmax(0,1fr)}.grid-rows-\[20px_auto_20px\]{grid-template-rows:20px auto 20px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.content-center{align-content:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.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)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded-\[1px\]{border-radius:1px}.rounded-\[3px\]{border-radius:3px}.rounded-\[4px\]{border-radius:4px}.rounded-\[6px\]{border-radius:6px}.rounded-\[8px\]{border-radius:8px}.rounded-\[9px\]{border-radius:9px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-full{border-radius:2147483647px}.rounded-t-\[14px\]{border-top-left-radius:14px;border-top-right-radius:14px}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.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-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-action-line{border-color:var(--action-line)}.border-danger,.border-danger\/40{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--danger) 40%, transparent)}}.border-note-line{border-color:var(--note-line)}.border-primary{border-color:var(--primary)}.border-rule{border-color:var(--rule)}.border-rule-strong{border-color:var(--rule-strong)}.border-transparent{border-color:#0000}.checker{background-color:var(--surface);background-image:linear-gradient(45deg, var(--soft2) 25%, transparent 25%), linear-gradient(-45deg, var(--soft2) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--soft2) 75%), linear-gradient(-45deg, transparent 75%, var(--soft2) 75%);background-position:0 0,0 8px,8px -8px,-8px 0;background-size:16px 16px}.bg-\[\#6fa8dc\]\/25{background-color:#6fa8dc40;background-color:lab(66.4792% -8.4376 -32.6413/.25)}.bg-\[\#93c47d\]\/20{background-color:#93c47d33;background-color:lab(74.3863% -26.5347 30.2911/.2)}.bg-\[\#f6b26b\]\/15{background-color:#f6b26b26;background-color:lab(78.0588% 20.0952 46.1567/.15)}.bg-\[\#f9e27d\]\/15{background-color:#f9e27d26;background-color:lab(90.2485% -1.16244 51.8854/.15)}.bg-action{background-color:var(--action)}.bg-action-soft{background-color:var(--action-soft)}.bg-action\/70{background-color:var(--action)}@supports (color:color-mix(in lab, red, red)){.bg-action\/70{background-color:color-mix(in oklab, var(--action) 70%, transparent)}}.bg-danger{background-color:var(--danger)}.bg-danger-soft{background-color:var(--danger-soft)}.bg-ink{background-color:var(--ink)}.bg-ink2{background-color:var(--ink2)}.bg-note{background-color:var(--note)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-overlay{background-color:var(--overlay)}.bg-primary{background-color:var(--primary)}.bg-rule{background-color:var(--rule)}.bg-rule-strong{background-color:var(--rule-strong)}.bg-soft{background-color:var(--soft)}.bg-soft2{background-color:var(--soft2)}.bg-surface,.bg-surface\/40{background-color:var(--surface)}@supports (color:color-mix(in lab, red, red)){.bg-surface\/40{background-color:color-mix(in oklab, var(--surface) 40%, transparent)}}.bg-track{background-color:var(--track)}.bg-transparent{background-color:#0000}.fill-action{fill:var(--action)}.fill-none{fill:none}.fill-primary{fill:var(--primary)}.fill-primary-ink{fill:var(--primary-ink)}.stroke-ink{stroke:var(--ink)}.stroke-rule{stroke:var(--rule)}.stroke-rule-strong{stroke:var(--rule-strong)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-top{object-position:top}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[3px\]{padding:3px}.px-ctrl{padding-inline:12px}@media (max-width:767px){.px-ctrl{padding-inline:14px}}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-\[5px\]{padding-inline:5px}.px-\[10px\]{padding-inline:10px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.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-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-\[7px\]{padding-block:7px}.py-px{padding-block:1px}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-\[12vh\]{padding-top:12vh}.pt-\[env\(safe-area-inset-top\)\]{padding-top:env(safe-area-inset-top)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.pb-\[max\(6px\,env\(safe-area-inset-bottom\)\)\]{padding-bottom:max(6px, env(safe-area-inset-bottom))}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:IBM Plex Mono,ui-monospace,monospace}.text-ctrl{font-size:13.5px}@media (max-width:767px){.text-ctrl{font-size:14px}}.text-\[9\.5px\]{font-size:9.5px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[22px\]{font-size:22px}.text-\[40px\]{font-size:40px}.text-\[52px\]{font-size:52px}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.015em\]{--tw-tracking:-.015em;letter-spacing:-.015em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-action{color:var(--action)}.text-danger-text{color:var(--danger-text)}.text-inherit{color:inherit}.text-ink{color:var(--ink)}.text-ink2{color:var(--ink2)}.text-muted{color:var(--muted)}.text-ok-text{color:var(--ok-text)}.text-on-danger{color:var(--on-danger)}.text-primary-ink{color:var(--primary-ink)}.uppercase{text-transform:uppercase}.tabular{font-variant-numeric:tabular-nums}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-100{opacity:1}.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_1px_2px_rgba\(0\,0\,0\,0\.10\)\]{--tw-shadow:0 1px 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-\[0_1px_2px_rgba\(0\,0\,0\,0\.25\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow:inset 0 0 0 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-\[inset_0_0_0_1px_rgba\(0\,0\,0\,0\.12\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#0000001f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_var\(--rule-strong\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,var(--rule-strong));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-frame{--tw-shadow:var(--shadow-frame);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-pop{--tw-shadow:var(--shadow-pop);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-\[1\.5px\]{outline-style:var(--tw-outline-style);outline-width:1.5px}.outline-action,.outline-action\/60{outline-color:var(--action)}@supports (color:color-mix(in lab, red, red)){.outline-action\/60{outline-color:color-mix(in oklab, var(--action) 60%, transparent)}}.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,)}.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-\[background-color\,opacity\]{transition-property:background-color,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[flex-grow\]{transition-property:flex-grow;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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;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-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-\[cubic-bezier\(0\.2\,0\.7\,0\.2\,1\)\]{--tw-ease:cubic-bezier(.2,.7,.2,1);transition-timing-function:cubic-bezier(.2,.7,.2,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.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}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-muted::placeholder{color:var(--muted)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.focus-within\:opacity-100:focus-within{opacity:1}.focus-within\:outline-2:focus-within{outline-style:var(--tw-outline-style);outline-width:2px}.focus-within\:outline-offset-2:focus-within{outline-offset:2px}.focus-within\:outline-action:focus-within{outline-color:var(--action)}@media (hover:hover){.hover\:grow-\[1\.6\]:hover{flex-grow:1.6}.hover\:border-rule:hover{border-color:var(--rule)}.hover\:border-rule-strong:hover{border-color:var(--rule-strong)}.hover\:bg-soft:hover{background-color:var(--soft)}.hover\:bg-soft2:hover{background-color:var(--soft2)}.hover\:text-ink:hover{color:var(--ink)}.hover\:text-ink2:hover{color:var(--ink2)}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:outline-offset-\[-2px\]:focus-visible{outline-offset:-2px}.active\:bg-soft2:active{background-color:var(--soft2)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.aria-disabled\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.aria-disabled\:opacity-45[aria-disabled=true]{opacity:.45}.data-\[disabled\]\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[highlighted\]\:bg-soft[data-highlighted]{background-color:var(--soft)}.data-\[state\=closed\]\:animate-\[q-pop-out_100ms_ease-in_forwards\][data-state=closed]{animation:.1s ease-in forwards q-pop-out}.data-\[state\=delayed-open\]\:animate-\[q-pop_120ms_ease-out\][data-state=delayed-open],.data-\[state\=open\]\:animate-\[q-pop_120ms_ease-out\][data-state=open]{animation:.12s ease-out q-pop}@media not all and (min-width:80rem){.max-xl\:grid-cols-1\!{grid-template-columns:repeat(1,minmax(0,1fr))!important}}@media not all and (min-width:64rem){.max-lg\:static{position:static}.max-lg\:hidden{display:none}.max-lg\:max-h-none{max-height:none}.max-lg\:w-auto\!{width:auto!important}.max-lg\:grid-cols-1\!{grid-template-columns:repeat(1,minmax(0,1fr))!important}.max-lg\:gap-0{gap:0}.max-lg\:gap-1{gap:var(--spacing)}.max-lg\:overflow-visible{overflow:visible}.max-lg\:pb-0{padding-bottom:0}}@media not all and (min-width:48rem){.max-md\:flex{display:flex}.max-md\:hidden{display:none}.max-md\:w-ctrl\!{width:32px!important}@media (max-width:767px){.max-md\:w-ctrl\!{width:40px!important}}.max-md\:flex-col{flex-direction:column}.max-md\:items-stretch{align-items:stretch}.max-md\:justify-center{justify-content:center}.max-md\:gap-3{gap:calc(var(--spacing) * 3)}.max-md\:border-0\!{border-style:var(--tw-border-style)!important;border-width:0!important}.max-md\:bg-transparent\!{background-color:#0000!important}.max-md\:p-0\!{padding:0!important}.max-md\:px-4{padding-inline:calc(var(--spacing) * 4)}.max-md\:pt-4{padding-top:calc(var(--spacing) * 4)}}.dark\:shadow-\[inset_0_0_0_1px_rgba\(255\,255\,255\,0\.12\)\]:where([data-theme=dark],[data-theme=dark] *){--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,#ffffff1f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media not all and (min-width:64rem){.max-lg\:\[\&_nav\]\:flex-row nav{flex-direction:row}.max-lg\:\[\&_nav\]\:flex-wrap nav{flex-wrap:wrap}}}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-greek-400-normal-_efipK4i.woff2)format("woff2"),url(./ibm-plex-sans-greek-400-normal-D9ESIMu3.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-sans-latin-400-normal-CDDApCn2.woff2)format("woff2"),url(./ibm-plex-sans-latin-400-normal-CYLoc0-x.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-greek-500-normal-JMMifIXV.woff2)format("woff2"),url(./ibm-plex-sans-greek-500-normal-CuWXN6rf.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-sans-latin-500-normal-6ng42L7E.woff2)format("woff2"),url(./ibm-plex-sans-latin-500-normal-BgVn5rGT.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2)format("woff2"),url(./ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2)format("woff2"),url(./ibm-plex-sans-greek-600-normal-D-CqTdkO.woff)format("woff");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2)format("woff2"),url(./ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2)format("woff2"),url(./ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2)format("woff2"),url(./ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2)format("woff2"),url(./ibm-plex-mono-latin-400-normal-CvHOgSBP.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2)format("woff2"),url(./ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2)format("woff2"),url(./ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2)format("woff2"),url(./ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2)format("woff2"),url(./ibm-plex-mono-latin-500-normal-CB9ihrfo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg:#edeff2;--surface:#fff;--soft:#f5f6f8;--soft2:#e8ebef;--ink:#1b1f24;--ink2:#3a414a;--muted:#59626d;--rule:#dce0e5;--rule-strong:#b5bcc5;--action:#a55700;--action-soft:#fbebd6;--action-line:#edcb9c;--ok:#1f7045;--ok-text:#1f7045;--ok-soft:#e2f1e8;--danger:#b42318;--danger-text:#b42318;--danger-soft:#fce8e6;--on-danger:#fff;--primary:#1b1f24;--primary-ink:#fff;--track:#d6dae0;--overlay:#1b1f2466;--shadow-pop:0 16px 40px #1b1f2429;--shadow-frame:0 1px 2px #1b1f240f, 0 8px 24px #1b1f240f;--grid-dot:#c9ced5;--note:#fdf3e3;--note-line:#edd6b1;--scrollbar:#c3c9d0;--scrollbar-hover:#9aa2ac;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--bg:#141619;--surface:#1b1e22;--soft:#202328;--soft2:#2a2e34;--ink:#e6e8eb;--ink2:#c3c8ce;--muted:#8a929c;--rule:#2a2e34;--rule-strong:#474d55;--action:#f0a040;--action-soft:#35280f;--action-line:#6b4a17;--ok:#58bd86;--ok-text:#6ccb97;--ok-soft:#183024;--danger:#e5645a;--danger-text:#f28b82;--danger-soft:#3a1d1a;--on-danger:#1a0b09;--primary:#e6e8eb;--primary-ink:#141619;--track:#2a2e34;--overlay:#0000008c;--shadow-pop:0 16px 40px #00000080;--shadow-frame:0 1px 2px #0000004d, 0 8px 24px #00000040;--grid-dot:#30343a;--note:#2a2415;--note-line:#574420;--scrollbar:#3a3f46;--scrollbar-hover:#565d66;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}@keyframes q-pop{0%{opacity:0;transform:translateY(-4px)scale(.98)}to{opacity:1;transform:none}}@keyframes q-pop-out{0%{opacity:1;transform:none}to{opacity:0;transform:translateY(-2px)scale(.98)}}@keyframes q-fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.prose{color:var(--ink2);overflow-wrap:anywhere;font-size:14px;line-height:1.6}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.prose h1,.prose h2,.prose h3,.prose h4{color:var(--ink);margin:1.6em 0 .5em;font-weight:600;line-height:1.3}.prose h1{letter-spacing:-.01em;font-size:22px}.prose h2{font-size:17px}.prose h3{font-size:15px}.prose p,.prose ul,.prose ol,.prose pre,.prose table,.prose blockquote{margin:0 0 .9em}.prose ul,.prose ol{padding-left:1.3em}.prose ul{list-style:outside}.prose ol{list-style:decimal}.prose li+li{margin-top:.25em}.prose li::marker{color:var(--muted)}.prose strong{color:var(--ink);font-weight:600}.prose a{color:var(--ink);text-decoration:underline;-webkit-text-decoration-color:var(--rule-strong);-webkit-text-decoration-color:var(--rule-strong);-webkit-text-decoration-color:var(--rule-strong);text-decoration-color:var(--rule-strong);text-underline-offset:3px}.prose a:hover{-webkit-text-decoration-color:var(--ink2);-webkit-text-decoration-color:var(--ink2);-webkit-text-decoration-color:var(--ink2);text-decoration-color:var(--ink2)}.prose code{font-family:var(--font-mono);background:var(--soft2);border-radius:4px;padding:.1em .35em;font-size:.9em}.prose pre{background:var(--soft);border:1px solid var(--rule);border-radius:8px;padding:12px 14px;font-size:12.5px;line-height:1.55;overflow-x:auto}.prose pre code{font-size:inherit;background:0 0;padding:0}.prose blockquote{border-left:2px solid var(--rule-strong);color:var(--muted);padding-left:12px}.prose hr{border:0;border-top:1px solid var(--rule);margin:1.5em 0}.prose table{border-collapse:collapse;width:100%;font-size:13px}.prose th,.prose td{border-top:1px solid var(--rule);text-align:left;vertical-align:top;padding:6px 10px 6px 0}.prose th{color:var(--muted);font-weight:500}.prose img{border-radius:6px;max-width:100%}.prose.prose-note{font-size:17px;line-height:1.55}.prose.prose-plain{font-size:20px;line-height:1.5}:root{--sh-class:#7a4a00;--sh-identifier:#1b1f24;--sh-sign:#59626d;--sh-property:#1f5a8a;--sh-entity:#6d3fa0;--sh-jsxliterals:#1b1f24;--sh-string:#1f7045;--sh-keyword:#a55700;--sh-comment:#8d959f}:root[data-theme=dark]{--sh-class:#f0c070;--sh-identifier:#e6e8eb;--sh-sign:#8a929c;--sh-property:#7fb8e6;--sh-entity:#c49cf0;--sh-jsxliterals:#e6e8eb;--sh-string:#6ccb97;--sh-keyword:#f0a040;--sh-comment:#6e7680}.canvas-dots{background-color:var(--bg);background-image:radial-gradient(circle, var(--grid-dot) 1px, transparent 1.2px)}.canvas-root{background-color:var(--bg)}.canvas-grid{pointer-events:none;background-image:radial-gradient(circle, var(--grid-dot) 1px, transparent 1.2px);will-change:transform;position:absolute;inset:-96px}.canvas-world{transform-origin:0 0;position:absolute;top:0;left:0}.canvas-world.moving{will-change:transform}.canvas-world.far .canvas-section{visibility:hidden}.canvas-panning iframe{pointer-events:none}.canvas-overlay{pointer-events:none;position:absolute;inset:0;overflow:hidden}.canvas-overlay [data-at]{transform:translate(calc(var(--x) * var(--z) * 1px + var(--tx) * 1px), calc(var(--y) * var(--z) * 1px + var(--ty) * 1px));position:absolute;top:0;left:0}.canvas-overlay .frame-label{width:calc(var(--w) * var(--z) * 1px);translate:0 -100%;container-type:inline-size}@container (width<=250px){.frame-device{display:none}}.canvas-overlay .frame-outline{width:calc(var(--w) * var(--z) * 1px);height:calc(var(--h) * var(--z) * 1px)}.canvas-overlay[data-tiny=true] .frame-label{display:none}@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-leading{syntax:"*";inherits:false}@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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}