@smoove/studio 0.1.1

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.
Files changed (276) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/components/brand/brand.d.ts +9 -0
  4. package/dist/components/brand/brand.d.ts.map +1 -0
  5. package/dist/components/brand/brand.js +11 -0
  6. package/dist/components/brand/brand.js.map +1 -0
  7. package/dist/components/button/button.d.ts +21 -0
  8. package/dist/components/button/button.d.ts.map +1 -0
  9. package/dist/components/button/button.js +20 -0
  10. package/dist/components/button/button.js.map +1 -0
  11. package/dist/components/button/icon-button.d.ts +27 -0
  12. package/dist/components/button/icon-button.d.ts.map +1 -0
  13. package/dist/components/button/icon-button.js +19 -0
  14. package/dist/components/button/icon-button.js.map +1 -0
  15. package/dist/components/header/header-title.d.ts +8 -0
  16. package/dist/components/header/header-title.d.ts.map +1 -0
  17. package/dist/components/header/header-title.js +7 -0
  18. package/dist/components/header/header-title.js.map +1 -0
  19. package/dist/components/header/header.d.ts +7 -0
  20. package/dist/components/header/header.d.ts.map +1 -0
  21. package/dist/components/header/header.js +7 -0
  22. package/dist/components/header/header.js.map +1 -0
  23. package/dist/components/header/zoom.d.ts +3 -0
  24. package/dist/components/header/zoom.d.ts.map +1 -0
  25. package/dist/components/header/zoom.js +16 -0
  26. package/dist/components/header/zoom.js.map +1 -0
  27. package/dist/components/icon/icon.d.ts +11 -0
  28. package/dist/components/icon/icon.d.ts.map +1 -0
  29. package/dist/components/icon/icon.js +7 -0
  30. package/dist/components/icon/icon.js.map +1 -0
  31. package/dist/components/icon/paths.d.ts +47 -0
  32. package/dist/components/icon/paths.d.ts.map +1 -0
  33. package/dist/components/icon/paths.js +54 -0
  34. package/dist/components/icon/paths.js.map +1 -0
  35. package/dist/components/left-panel/library.d.ts +8 -0
  36. package/dist/components/left-panel/library.d.ts.map +1 -0
  37. package/dist/components/left-panel/library.js +49 -0
  38. package/dist/components/left-panel/library.js.map +1 -0
  39. package/dist/components/left-panel/sidebar-group.d.ts +12 -0
  40. package/dist/components/left-panel/sidebar-group.d.ts.map +1 -0
  41. package/dist/components/left-panel/sidebar-group.js +11 -0
  42. package/dist/components/left-panel/sidebar-group.js.map +1 -0
  43. package/dist/components/left-panel/sidebar-item.d.ts +17 -0
  44. package/dist/components/left-panel/sidebar-item.d.ts.map +1 -0
  45. package/dist/components/left-panel/sidebar-item.js +12 -0
  46. package/dist/components/left-panel/sidebar-item.js.map +1 -0
  47. package/dist/components/left-panel/sidebar.d.ts +8 -0
  48. package/dist/components/left-panel/sidebar.d.ts.map +1 -0
  49. package/dist/components/left-panel/sidebar.js +8 -0
  50. package/dist/components/left-panel/sidebar.js.map +1 -0
  51. package/dist/components/primitives/dialog.d.ts +33 -0
  52. package/dist/components/primitives/dialog.d.ts.map +1 -0
  53. package/dist/components/primitives/dialog.js +30 -0
  54. package/dist/components/primitives/dialog.js.map +1 -0
  55. package/dist/components/primitives/menu.d.ts +25 -0
  56. package/dist/components/primitives/menu.d.ts.map +1 -0
  57. package/dist/components/primitives/menu.js +31 -0
  58. package/dist/components/primitives/menu.js.map +1 -0
  59. package/dist/components/primitives/number-field.d.ts +12 -0
  60. package/dist/components/primitives/number-field.d.ts.map +1 -0
  61. package/dist/components/primitives/number-field.js +7 -0
  62. package/dist/components/primitives/number-field.js.map +1 -0
  63. package/dist/components/primitives/portal-context.d.ts +9 -0
  64. package/dist/components/primitives/portal-context.d.ts.map +1 -0
  65. package/dist/components/primitives/portal-context.js +10 -0
  66. package/dist/components/primitives/portal-context.js.map +1 -0
  67. package/dist/components/primitives/select.d.ts +14 -0
  68. package/dist/components/primitives/select.d.ts.map +1 -0
  69. package/dist/components/primitives/select.js +11 -0
  70. package/dist/components/primitives/select.js.map +1 -0
  71. package/dist/components/primitives/slider.d.ts +10 -0
  72. package/dist/components/primitives/slider.d.ts.map +1 -0
  73. package/dist/components/primitives/slider.js +7 -0
  74. package/dist/components/primitives/slider.js.map +1 -0
  75. package/dist/components/primitives/switch.d.ts +5 -0
  76. package/dist/components/primitives/switch.d.ts.map +1 -0
  77. package/dist/components/primitives/switch.js +6 -0
  78. package/dist/components/primitives/switch.js.map +1 -0
  79. package/dist/components/primitives/tabs.d.ts +23 -0
  80. package/dist/components/primitives/tabs.d.ts.map +1 -0
  81. package/dist/components/primitives/tabs.js +17 -0
  82. package/dist/components/primitives/tabs.js.map +1 -0
  83. package/dist/components/primitives/tooltip.d.ts +9 -0
  84. package/dist/components/primitives/tooltip.d.ts.map +1 -0
  85. package/dist/components/primitives/tooltip.js +11 -0
  86. package/dist/components/primitives/tooltip.js.map +1 -0
  87. package/dist/components/render/export-frame-dialog.d.ts +8 -0
  88. package/dist/components/render/export-frame-dialog.d.ts.map +1 -0
  89. package/dist/components/render/export-frame-dialog.js +60 -0
  90. package/dist/components/render/export-frame-dialog.js.map +1 -0
  91. package/dist/components/render/render-dialog.d.ts +8 -0
  92. package/dist/components/render/render-dialog.d.ts.map +1 -0
  93. package/dist/components/render/render-dialog.js +95 -0
  94. package/dist/components/render/render-dialog.js.map +1 -0
  95. package/dist/components/render/render-queue.d.ts +5 -0
  96. package/dist/components/render/render-queue.d.ts.map +1 -0
  97. package/dist/components/render/render-queue.js +40 -0
  98. package/dist/components/render/render-queue.js.map +1 -0
  99. package/dist/components/right-panel/panel-handle.d.ts +3 -0
  100. package/dist/components/right-panel/panel-handle.d.ts.map +1 -0
  101. package/dist/components/right-panel/panel-handle.js +9 -0
  102. package/dist/components/right-panel/panel-handle.js.map +1 -0
  103. package/dist/components/right-panel/panel-tabs.d.ts +3 -0
  104. package/dist/components/right-panel/panel-tabs.d.ts.map +1 -0
  105. package/dist/components/right-panel/panel-tabs.js +26 -0
  106. package/dist/components/right-panel/panel-tabs.js.map +1 -0
  107. package/dist/components/right-panel/panel.d.ts +8 -0
  108. package/dist/components/right-panel/panel.d.ts.map +1 -0
  109. package/dist/components/right-panel/panel.js +16 -0
  110. package/dist/components/right-panel/panel.js.map +1 -0
  111. package/dist/components/schema-form/field.d.ts +9 -0
  112. package/dist/components/schema-form/field.d.ts.map +1 -0
  113. package/dist/components/schema-form/field.js +102 -0
  114. package/dist/components/schema-form/field.js.map +1 -0
  115. package/dist/components/schema-form/schema-form.d.ts +3 -0
  116. package/dist/components/schema-form/schema-form.d.ts.map +1 -0
  117. package/dist/components/schema-form/schema-form.js +18 -0
  118. package/dist/components/schema-form/schema-form.js.map +1 -0
  119. package/dist/components/stage/stage.d.ts +12 -0
  120. package/dist/components/stage/stage.d.ts.map +1 -0
  121. package/dist/components/stage/stage.js +103 -0
  122. package/dist/components/stage/stage.js.map +1 -0
  123. package/dist/components/studio/features.d.ts +4 -0
  124. package/dist/components/studio/features.d.ts.map +1 -0
  125. package/dist/components/studio/features.js +18 -0
  126. package/dist/components/studio/features.js.map +1 -0
  127. package/dist/components/studio/layout.d.ts +19 -0
  128. package/dist/components/studio/layout.d.ts.map +1 -0
  129. package/dist/components/studio/layout.js +17 -0
  130. package/dist/components/studio/layout.js.map +1 -0
  131. package/dist/components/studio/studio-context.d.ts +53 -0
  132. package/dist/components/studio/studio-context.d.ts.map +1 -0
  133. package/dist/components/studio/studio-context.js +3 -0
  134. package/dist/components/studio/studio-context.js.map +1 -0
  135. package/dist/components/studio/studio.d.ts +21 -0
  136. package/dist/components/studio/studio.d.ts.map +1 -0
  137. package/dist/components/studio/studio.js +38 -0
  138. package/dist/components/studio/studio.js.map +1 -0
  139. package/dist/components/timeline/layered-body.d.ts +8 -0
  140. package/dist/components/timeline/layered-body.d.ts.map +1 -0
  141. package/dist/components/timeline/layered-body.js +75 -0
  142. package/dist/components/timeline/layered-body.js.map +1 -0
  143. package/dist/components/timeline/region-handles.d.ts +8 -0
  144. package/dist/components/timeline/region-handles.d.ts.map +1 -0
  145. package/dist/components/timeline/region-handles.js +13 -0
  146. package/dist/components/timeline/region-handles.js.map +1 -0
  147. package/dist/components/timeline/ruler.d.ts +7 -0
  148. package/dist/components/timeline/ruler.d.ts.map +1 -0
  149. package/dist/components/timeline/ruler.js +19 -0
  150. package/dist/components/timeline/ruler.js.map +1 -0
  151. package/dist/components/timeline/scrubber.d.ts +6 -0
  152. package/dist/components/timeline/scrubber.d.ts.map +1 -0
  153. package/dist/components/timeline/scrubber.js +25 -0
  154. package/dist/components/timeline/scrubber.js.map +1 -0
  155. package/dist/components/timeline/timeline-header.d.ts +3 -0
  156. package/dist/components/timeline/timeline-header.d.ts.map +1 -0
  157. package/dist/components/timeline/timeline-header.js +36 -0
  158. package/dist/components/timeline/timeline-header.js.map +1 -0
  159. package/dist/components/timeline/timeline.d.ts +5 -0
  160. package/dist/components/timeline/timeline.d.ts.map +1 -0
  161. package/dist/components/timeline/timeline.js +16 -0
  162. package/dist/components/timeline/timeline.js.map +1 -0
  163. package/dist/components/timeline/transport.d.ts +5 -0
  164. package/dist/components/timeline/transport.d.ts.map +1 -0
  165. package/dist/components/timeline/transport.js +21 -0
  166. package/dist/components/timeline/transport.js.map +1 -0
  167. package/dist/components/timeline/use-scrub-surface.d.ts +20 -0
  168. package/dist/components/timeline/use-scrub-surface.d.ts.map +1 -0
  169. package/dist/components/timeline/use-scrub-surface.js +56 -0
  170. package/dist/components/timeline/use-scrub-surface.js.map +1 -0
  171. package/dist/components/toasts/toasts.d.ts +4 -0
  172. package/dist/components/toasts/toasts.d.ts.map +1 -0
  173. package/dist/components/toasts/toasts.js +22 -0
  174. package/dist/components/toasts/toasts.js.map +1 -0
  175. package/dist/hooks/use-composition.d.ts +10 -0
  176. package/dist/hooks/use-composition.d.ts.map +1 -0
  177. package/dist/hooks/use-composition.js +13 -0
  178. package/dist/hooks/use-composition.js.map +1 -0
  179. package/dist/hooks/use-layers.d.ts +9 -0
  180. package/dist/hooks/use-layers.d.ts.map +1 -0
  181. package/dist/hooks/use-layers.js +34 -0
  182. package/dist/hooks/use-layers.js.map +1 -0
  183. package/dist/hooks/use-playback.d.ts +15 -0
  184. package/dist/hooks/use-playback.d.ts.map +1 -0
  185. package/dist/hooks/use-playback.js +38 -0
  186. package/dist/hooks/use-playback.js.map +1 -0
  187. package/dist/hooks/use-props-form.d.ts +15 -0
  188. package/dist/hooks/use-props-form.d.ts.map +1 -0
  189. package/dist/hooks/use-props-form.js +22 -0
  190. package/dist/hooks/use-props-form.js.map +1 -0
  191. package/dist/hooks/use-real-fps.d.ts +3 -0
  192. package/dist/hooks/use-real-fps.d.ts.map +1 -0
  193. package/dist/hooks/use-real-fps.js +27 -0
  194. package/dist/hooks/use-real-fps.js.map +1 -0
  195. package/dist/hooks/use-shortcuts.d.ts +7 -0
  196. package/dist/hooks/use-shortcuts.d.ts.map +1 -0
  197. package/dist/hooks/use-shortcuts.js +53 -0
  198. package/dist/hooks/use-shortcuts.js.map +1 -0
  199. package/dist/hooks/use-studio.d.ts +4 -0
  200. package/dist/hooks/use-studio.d.ts.map +1 -0
  201. package/dist/hooks/use-studio.js +10 -0
  202. package/dist/hooks/use-studio.js.map +1 -0
  203. package/dist/index.d.ts +145 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +117 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/lib/cn.d.ts +3 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +8 -0
  210. package/dist/lib/cn.js.map +1 -0
  211. package/dist/lib/constants.d.ts +28 -0
  212. package/dist/lib/constants.d.ts.map +1 -0
  213. package/dist/lib/constants.js +38 -0
  214. package/dist/lib/constants.js.map +1 -0
  215. package/dist/lib/cva.d.ts +25 -0
  216. package/dist/lib/cva.d.ts.map +1 -0
  217. package/dist/lib/cva.js +23 -0
  218. package/dist/lib/cva.js.map +1 -0
  219. package/dist/lib/format.d.ts +13 -0
  220. package/dist/lib/format.d.ts.map +1 -0
  221. package/dist/lib/format.js +25 -0
  222. package/dist/lib/format.js.map +1 -0
  223. package/dist/lib/ids.d.ts +3 -0
  224. package/dist/lib/ids.d.ts.map +1 -0
  225. package/dist/lib/ids.js +6 -0
  226. package/dist/lib/ids.js.map +1 -0
  227. package/dist/registry/define-registry.d.ts +8 -0
  228. package/dist/registry/define-registry.d.ts.map +1 -0
  229. package/dist/registry/define-registry.js +71 -0
  230. package/dist/registry/define-registry.js.map +1 -0
  231. package/dist/registry/props-signal.d.ts +9 -0
  232. package/dist/registry/props-signal.d.ts.map +1 -0
  233. package/dist/registry/props-signal.js +25 -0
  234. package/dist/registry/props-signal.js.map +1 -0
  235. package/dist/schema/kf.d.ts +28 -0
  236. package/dist/schema/kf.d.ts.map +1 -0
  237. package/dist/schema/kf.js +82 -0
  238. package/dist/schema/kf.js.map +1 -0
  239. package/dist/schema/types.d.ts +69 -0
  240. package/dist/schema/types.d.ts.map +1 -0
  241. package/dist/schema/types.js +4 -0
  242. package/dist/schema/types.js.map +1 -0
  243. package/dist/server/index.d.ts +6 -0
  244. package/dist/server/index.d.ts.map +1 -0
  245. package/dist/server/index.js +7 -0
  246. package/dist/server/index.js.map +1 -0
  247. package/dist/server/map.d.ts +19 -0
  248. package/dist/server/map.d.ts.map +1 -0
  249. package/dist/server/map.js +63 -0
  250. package/dist/server/map.js.map +1 -0
  251. package/dist/server/render-queue.d.ts +46 -0
  252. package/dist/server/render-queue.d.ts.map +1 -0
  253. package/dist/server/render-queue.js +147 -0
  254. package/dist/server/render-queue.js.map +1 -0
  255. package/dist/server/temp-storage.d.ts +13 -0
  256. package/dist/server/temp-storage.d.ts.map +1 -0
  257. package/dist/server/temp-storage.js +55 -0
  258. package/dist/server/temp-storage.js.map +1 -0
  259. package/dist/server/types.d.ts +57 -0
  260. package/dist/server/types.d.ts.map +1 -0
  261. package/dist/server/types.js +2 -0
  262. package/dist/server/types.js.map +1 -0
  263. package/dist/signals/signal-bridge.d.ts +18 -0
  264. package/dist/signals/signal-bridge.d.ts.map +1 -0
  265. package/dist/signals/signal-bridge.js +39 -0
  266. package/dist/signals/signal-bridge.js.map +1 -0
  267. package/dist/store/store.d.ts +74 -0
  268. package/dist/store/store.d.ts.map +1 -0
  269. package/dist/store/store.js +276 -0
  270. package/dist/store/store.js.map +1 -0
  271. package/dist/styles/studio.css +2 -0
  272. package/dist/types.d.ts +112 -0
  273. package/dist/types.d.ts.map +1 -0
  274. package/dist/types.js +2 -0
  275. package/dist/types.js.map +1 -0
  276. package/package.json +66 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 shemi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # @smoove/studio
2
+
3
+ A composable React studio UI for [smoove](https://smoove.dev)
4
+ compositions — catalog sidebar, stage, timeline, props panel, and render
5
+ dialogs, assembled from a `<Studio>` compound component.
6
+
7
+ Declare your composition catalog with `defineRegistry()`, wrap `<Studio>`
8
+ around it, and compose the panels you want. The demo app in the smoove repo
9
+ is exactly this: a registry plus routing around `@smoove/studio`.
10
+
11
+ ## Install
12
+
13
+ ```sh
14
+ pnpm add konva react react-dom @smoove/core @smoove/player @smoove/studio
15
+ ```
16
+
17
+ `konva`, `react`, `react-dom`, `@smoove/core`, and `@smoove/player` are
18
+ peer dependencies. `@smoove/renderer` is an optional peer — add it to
19
+ enable the render dialogs and queue.
20
+
21
+ ## Quick example
22
+
23
+ ```tsx
24
+ import { defineRegistry, Studio } from "@smoove/studio";
25
+ import "@smoove/studio/styles.css";
26
+ import orbit from "./compositions/orbit";
27
+ import pulse from "./compositions/pulse";
28
+
29
+ const registry = defineRegistry([pulse, orbit]);
30
+
31
+ export function App() {
32
+ return (
33
+ <Studio registry={registry} onNavigate={(id) => console.log(id)}>
34
+ <Studio.Sidebar>
35
+ <Studio.Brand />
36
+ <Studio.Library />
37
+ </Studio.Sidebar>
38
+ <Studio.Body>
39
+ <Studio.Stage />
40
+ <Studio.Timeline />
41
+ </Studio.Body>
42
+ <Studio.Toasts />
43
+ </Studio>
44
+ );
45
+ }
46
+ ```
47
+
48
+ Hooks (`useStudio`, `useComposition`, `usePlayback`, `usePropsForm`, ...)
49
+ are exported for building your own panels on the same state.
50
+
51
+ Pair with [`@smoove/vite`](https://www.npmjs.com/package/@smoove/vite) for
52
+ invisible hot-reload of registry compositions.
53
+
54
+ ## Docs
55
+
56
+ Full documentation lives at [smoove.dev](https://smoove.dev).
57
+
58
+ ## License
59
+
60
+ MIT
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from "react";
2
+ /** Sidebar header: logo + wordmark + version tag. */
3
+ export declare function Brand({ name, tag, icon, onClick, }: {
4
+ name?: ReactNode;
5
+ tag?: ReactNode;
6
+ icon?: ReactNode;
7
+ onClick?: () => void;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=brand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../../src/components/brand/brand.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,OAAO,CAAC;AA+B9C,qDAAqD;AACrD,wBAAgB,KAAK,CAAC,EACpB,IAKC,EACD,GAAY,EACZ,IAA8B,EAC9B,OAAO,GACR,EAAE;IACD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,2CAcA"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ function BrandMark({ size = 24 }) {
4
+ const gradId = useId();
5
+ return (_jsxs("svg", { width: size, height: size, viewBox: "35.5 31.5 57 57", fill: "none", "aria-hidden": "true", style: { display: "block" }, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: gradId, x1: "40", y1: "60", x2: "84", y2: "60", gradientUnits: "userSpaceOnUse", children: [_jsx("stop", { stopColor: "#FF5640" }), _jsx("stop", { offset: "1", stopColor: "#15CDA8" })] }) }), _jsxs("g", { stroke: `url(#${gradId})`, strokeWidth: "9", strokeLinecap: "round", children: [_jsx("line", { x1: "40", y1: "38", x2: "40", y2: "82" }), _jsx("line", { x1: "52", y1: "44", x2: "52", y2: "76" }), _jsx("line", { x1: "64", y1: "50", x2: "64", y2: "70" }), _jsx("line", { x1: "76", y1: "56", x2: "76", y2: "64" })] }), _jsx("circle", { cx: "89", cy: "60", r: "3.5", fill: "#FFC23C" })] }));
6
+ }
7
+ /** Sidebar header: logo + wordmark + version tag. */
8
+ export function Brand({ name = (_jsxs(_Fragment, { children: [_jsx("b", { className: "text-ink-1", children: "Smoove" }), _jsx("span", { className: "text-ink-3 font-semibold", children: "Studio" })] })), tag = "v1.0", icon = _jsx(BrandMark, { size: 16 }), onClick, }) {
9
+ return (_jsxs("div", { className: "flex items-center gap-2.5 h-14 flex-none px-4.5 border-b border-line", children: [_jsxs("button", { className: "flex items-center gap-2.5 h-14 outline-0", type: "button", onClick: onClick, children: [icon, _jsx("div", { className: "font-display text-[15px] font-bold tracking-tight", children: name })] }), tag && (_jsx("div", { className: "ml-auto text-[10px] font-semibold tracking-[.08em] text-ink-3 uppercase border border-line-2 rounded-[5px] px-1.5 py-0.5", children: tag }))] }));
10
+ }
11
+ //# sourceMappingURL=brand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../../src/components/brand/brand.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9C,SAAS,SAAS,CAAC,EAAE,IAAI,GAAG,EAAE,EAAqB;IACjD,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IAEvB,OAAO,CACL,eACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,iBAAiB,EACzB,IAAI,EAAC,MAAM,iBACC,MAAM,EAClB,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,aAE3B,yBACE,0BAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,aAAa,EAAC,gBAAgB,aACxF,eAAM,SAAS,EAAC,SAAS,GAAG,EAC5B,eAAM,MAAM,EAAC,GAAG,EAAC,SAAS,EAAC,SAAS,GAAG,IACxB,GACZ,EACP,aAAG,MAAM,EAAE,QAAQ,MAAM,GAAG,EAAE,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,aACjE,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACtC,EACJ,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,GAAG,IAC7C,CACP,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,GAAG,CACL,8BACE,YAAG,SAAS,EAAC,YAAY,uBAAW,EACpC,eAAM,SAAS,EAAC,0BAA0B,uBAAc,IACvD,CACJ,EACD,GAAG,GAAG,MAAM,EACZ,IAAI,GAAG,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,EAC9B,OAAO,GAMR;IACC,OAAO,CACL,eAAK,SAAS,EAAC,sEAAsE,aACnF,kBAAQ,SAAS,EAAC,0CAA0C,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,aACxF,IAAI,EACL,cAAK,SAAS,EAAC,mDAAmD,YAAE,IAAI,GAAO,IACxE,EACR,GAAG,IAAI,CACN,cAAK,SAAS,EAAC,0HAA0H,YACtI,GAAG,GACA,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ButtonHTMLAttributes } from "react";
2
+ import type { IconName } from "../icon/paths.js";
3
+ export type ButtonTone = "primary" | "default" | "ghost" | "danger";
4
+ export type ButtonSize = "sm" | "md";
5
+ export declare const buttonCls: (props?: {
6
+ tone?: "default" | "primary" | "ghost" | "danger" | undefined;
7
+ size?: "sm" | "md" | undefined;
8
+ } & {
9
+ className?: string;
10
+ }) => string;
11
+ export type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
12
+ tone?: ButtonTone;
13
+ size?: ButtonSize;
14
+ icon?: IconName;
15
+ };
16
+ export declare const Button: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
17
+ tone?: ButtonTone;
18
+ size?: ButtonSize;
19
+ icon?: IconName;
20
+ } & import("react").RefAttributes<HTMLButtonElement>>;
21
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAc,MAAM,OAAO,CAAC;AAG9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,eAAO,MAAM,SAAS;;;;;YAerB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,MAAM;WALV,UAAU;WACV,UAAU;WACV,QAAQ;qDAaf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { cva } from "../../lib/cva.js";
4
+ import { Icon } from "../icon/icon.js";
5
+ export const buttonCls = cva("inline-flex items-center justify-center gap-2 font-semibold whitespace-nowrap rounded-ui transition-colors disabled:opacity-45 disabled:cursor-not-allowed outline-none focus-visible:ring-2 focus-visible:ring-accent/50", {
6
+ variants: {
7
+ tone: {
8
+ primary: "text-white border border-transparent bg-gradient-to-b from-accent-2 to-accent shadow-[0_2px_14px_-3px_var(--color-accent-soft)] hover:brightness-110",
9
+ default: "text-ink-1 bg-bg-2 border border-line-2 hover:bg-bg-3",
10
+ ghost: "text-ink-2 bg-transparent border border-transparent hover:bg-bg-2 hover:text-ink-1",
11
+ danger: "text-danger bg-transparent border border-transparent hover:bg-danger/12",
12
+ },
13
+ size: { sm: "text-xs px-2.5 py-1.5", md: "text-[13px] px-3.5 py-2" },
14
+ },
15
+ defaultVariants: { tone: "default", size: "md" },
16
+ });
17
+ export const Button = forwardRef(function Button({ tone, size, className, icon, children, type = "button", ...rest }, ref) {
18
+ return (_jsxs("button", { ref: ref, type: type, className: buttonCls({ tone, size, className }), ...rest, children: [icon && _jsx(Icon, { name: icon, size: 15 }), children] }));
19
+ });
20
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/components/button/button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA6B,UAAU,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAMvC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAC1B,2NAA2N,EAC3N;IACE,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,OAAO,EACL,sJAAsJ;YACxJ,OAAO,EAAE,uDAAuD;YAChE,KAAK,EAAE,oFAAoF;YAC3F,MAAM,EAAE,yEAAyE;SAClF;QACD,IAAI,EAAE,EAAE,EAAE,EAAE,uBAAuB,EAAE,EAAE,EAAE,yBAAyB,EAAE;KACrE;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CACjD,CACF,CAAC;AAQF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CAC9E,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,EACnE,GAAG;IAEH,OAAO,CACL,kBAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,KAAM,IAAI,aACpF,IAAI,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,EACtC,QAAQ,IACF,CACV,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type ButtonHTMLAttributes, type ReactNode } from "react";
2
+ import type { IconName } from "../icon/paths.js";
3
+ export type IconButtonTone = "default" | "bordered" | "danger";
4
+ export type IconButtonSize = "sm" | "md";
5
+ export declare const iconBtnCls: (props?: {
6
+ size?: "sm" | "md" | undefined;
7
+ tone?: "default" | "danger" | "bordered" | undefined;
8
+ } & {
9
+ className?: string;
10
+ }) => string;
11
+ export type IconButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
12
+ icon?: IconName;
13
+ size?: IconButtonSize;
14
+ tone?: IconButtonTone;
15
+ active?: boolean;
16
+ iconSize?: number;
17
+ children?: ReactNode;
18
+ };
19
+ export declare const IconButton: import("react").ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
20
+ icon?: IconName;
21
+ size?: IconButtonSize;
22
+ tone?: IconButtonTone;
23
+ active?: boolean;
24
+ iconSize?: number;
25
+ children?: ReactNode;
26
+ } & import("react").RefAttributes<HTMLButtonElement>>;
27
+ //# sourceMappingURL=icon-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/button/icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,eAAO,MAAM,UAAU;;;;;YAatB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,GAAG;IACxF,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,UAAU;WARd,QAAQ;WACR,cAAc;WACd,cAAc;aACZ,OAAO;eACL,MAAM;eACN,SAAS;qDAmBpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { cva } from "../../lib/cva.js";
4
+ import { Icon } from "../icon/icon.js";
5
+ export const iconBtnCls = cva("grid place-items-center rounded-ui text-ink-2 transition-colors outline-none focus-visible:ring-2 focus-visible:ring-accent/50 disabled:opacity-40 disabled:cursor-not-allowed", {
6
+ variants: {
7
+ size: { sm: "size-[34px]", md: "size-[38px]" },
8
+ tone: {
9
+ default: "hover:bg-bg-3 hover:text-ink-1 data-[active]:text-accent-2",
10
+ bordered: "bg-bg-2 border border-line hover:bg-bg-3 hover:text-ink-1 hover:border-line-2",
11
+ danger: "hover:bg-danger/14 hover:text-danger",
12
+ },
13
+ },
14
+ defaultVariants: { size: "md", tone: "default" },
15
+ });
16
+ export const IconButton = forwardRef(function IconButton({ icon, size, tone, active, iconSize, className, children, type = "button", ...rest }, ref) {
17
+ return (_jsxs("button", { ref: ref, type: type, "data-active": active ? "" : undefined, className: iconBtnCls({ size, tone, className }), ...rest, children: [icon && _jsx(Icon, { name: icon, size: iconSize ?? (size === "sm" ? 16 : 18) }), children] }));
18
+ });
19
+ //# sourceMappingURL=icon-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.js","sourceRoot":"","sources":["../../../src/components/button/icon-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA6B,UAAU,EAAkB,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAMvC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAC3B,gLAAgL,EAChL;IACE,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE;QAC9C,IAAI,EAAE;YACJ,OAAO,EAAE,4DAA4D;YACrE,QAAQ,EAAE,+EAA+E;YACzF,MAAM,EAAE,sCAAsC;SAC/C;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;CACjD,CACF,CAAC;AAWF,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAqC,SAAS,UAAU,CAC1F,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,EACrF,GAAG;IAEH,OAAO,CACL,kBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,iBACG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EACpC,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,KAC5C,IAAI,aAEP,IAAI,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAI,EACzE,QAAQ,IACF,CACV,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { IconName } from "../icon/paths.js";
2
+ /** Composition title block: icon + title + mono subtitle. */
3
+ export declare function HeaderTitle({ icon, title, sub }: {
4
+ icon: IconName;
5
+ title: string;
6
+ sub?: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=header-title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-title.d.ts","sourceRoot":"","sources":["../../../src/components/header/header-title.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,2CAchG"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "../icon/icon.js";
3
+ /** Composition title block: icon + title + mono subtitle. */
4
+ export function HeaderTitle({ icon, title, sub }) {
5
+ return (_jsxs("div", { className: "flex items-center gap-2.5 min-w-0", children: [_jsx("span", { className: "size-8 flex-none rounded-ui grid place-items-center bg-bg-2 border border-line text-accent-2", children: _jsx(Icon, { name: icon, size: 16 }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[14px] font-bold tracking-tight text-ink-1 truncate leading-tight", children: title }), sub && _jsx("div", { className: "text-[11px] text-ink-3 font-mono truncate mt-0.5", children: sub })] })] }));
6
+ }
7
+ //# sourceMappingURL=header-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-title.js","sourceRoot":"","sources":["../../../src/components/header/header-title.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAmD;IAC/F,OAAO,CACL,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,8FAA8F,YAC5G,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,GACzB,EACP,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,wEAAwE,YACpF,KAAK,GACF,EACL,GAAG,IAAI,cAAK,SAAS,EAAC,kDAAkD,YAAE,GAAG,GAAO,IACjF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from "react";
2
+ /** Top bar container. */
3
+ export declare function Header({ children, className }: {
4
+ children: ReactNode;
5
+ className?: string;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/components/header/header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,yBAAyB;AACzB,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAW1F"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/cn.js";
3
+ /** Top bar container. */
4
+ export function Header({ children, className }) {
5
+ return (_jsx("header", { className: cn("flex items-center gap-3 px-4 h-14 flex-none bg-bg-1 border-b border-line", className), children: children }));
6
+ }
7
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/components/header/header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,yBAAyB;AACzB,MAAM,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IACzF,OAAO,CACL,iBACE,SAAS,EAAE,EAAE,CACX,0EAA0E,EAC1E,SAAS,CACV,YAEA,QAAQ,GACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Zoom control: Fit + 25–200% steps (Base UI Menu). */
2
+ export declare function Zoom(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=zoom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/components/header/zoom.tsx"],"names":[],"mappings":"AAMA,wDAAwD;AACxD,wBAAgB,IAAI,4CA+BnB"}
@@ -0,0 +1,16 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useStudio } from "../../hooks/use-studio.js";
3
+ import { ZOOM_STEPS } from "../../lib/constants.js";
4
+ import { useSignalValue } from "../../signals/signal-bridge.js";
5
+ import { Icon } from "../icon/icon.js";
6
+ import { MenuItem, MenuSeparator, StMenu } from "../primitives/menu.js";
7
+ /** Zoom control: Fit + 25–200% steps (Base UI Menu). */
8
+ export function Zoom() {
9
+ const store = useStudio();
10
+ const zoom = useSignalValue(store.zoom);
11
+ const fitScale = useSignalValue(store.fitScale);
12
+ const shown = zoom === "fit" ? Math.round(fitScale * 100) : Math.round(zoom * 100);
13
+ const trigger = (_jsxs("button", { type: "button", className: "flex items-center gap-1.5 bg-bg-2 border border-line rounded-ui text-[12px] font-semibold text-ink-1 pl-3 pr-2 py-2 hover:bg-bg-3 hover:border-line-2 data-[popup-open]:bg-bg-3 outline-none", children: [_jsxs("span", { className: "font-mono min-w-[32px]", children: [shown, "%"] }), _jsx("span", { className: "text-ink-3", children: _jsx(Icon, { name: "chevron", size: 13 }) })] }));
14
+ return (_jsxs(StMenu, { trigger: trigger, side: "bottom", align: "end", children: [_jsx(MenuItem, { selected: zoom === "fit", onClick: () => store.setZoom("fit"), children: "Fit to size" }), _jsx(MenuSeparator, {}), ZOOM_STEPS.map((z) => (_jsx(MenuItem, { selected: zoom === z, onClick: () => store.setZoom(z), children: z === 1 ? "100%" : `${z * 100}%` }, z)))] }));
15
+ }
16
+ //# sourceMappingURL=zoom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/components/header/zoom.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAExE,wDAAwD;AACxD,MAAM,UAAU,IAAI;IAClB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAEnF,MAAM,OAAO,GAAG,CACd,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8LAA8L,aAExM,gBAAM,SAAS,EAAC,wBAAwB,aAAE,KAAK,SAAS,EACxD,eAAM,SAAS,EAAC,YAAY,YAC1B,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAE,EAAE,GAAI,GAC5B,IACA,CACV,CAAC;IAEF,OAAO,CACL,MAAC,MAAM,IAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,aACjD,KAAC,QAAQ,IAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,4BAE5D,EACX,KAAC,aAAa,KAAG,EAChB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACrB,KAAC,QAAQ,IAAS,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YACpE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IADpB,CAAC,CAEL,CACZ,CAAC,IACK,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CSSProperties } from "react";
2
+ import { type IconName } from "./paths.js";
3
+ export type IconProps = {
4
+ name: IconName;
5
+ size?: number;
6
+ className?: string;
7
+ style?: CSSProperties;
8
+ };
9
+ /** Inline-SVG icon. `name` selects a glyph; `size` sets width/height (px). */
10
+ export declare function Icon({ name, size, className, style }: IconProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../src/components/icon/icon.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,KAAK,QAAQ,EAAS,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,2CAapE"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PATHS } from "./paths.js";
3
+ /** Inline-SVG icon. `name` selects a glyph; `size` sets width/height (px). */
4
+ export function Icon({ name, size = 16, className, style }) {
5
+ return (_jsx("svg", { width: size, height: size, viewBox: "0 0 18 18", className: className, style: { display: "block", flex: "0 0 auto", ...style }, "aria-hidden": "true", children: PATHS[name] }));
6
+ }
7
+ //# sourceMappingURL=icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.js","sourceRoot":"","sources":["../../../src/components/icon/icon.tsx"],"names":[],"mappings":";AACA,OAAO,EAAiB,KAAK,EAAE,MAAM,YAAY,CAAC;AASlD,8EAA8E;AAC9E,MAAM,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAa;IACnE,OAAO,CACL,cACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,WAAW,EACnB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,iBAC3C,MAAM,YAEjB,KAAK,CAAC,IAAI,CAAC,GACR,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ /** Inline-SVG glyph set (viewBox 0 0 18 18). Ported from the SmooveStudio design. */
2
+ export declare const PATHS: {
3
+ search: import("react/jsx-runtime").JSX.Element;
4
+ chevron: import("react/jsx-runtime").JSX.Element;
5
+ chevronRight: import("react/jsx-runtime").JSX.Element;
6
+ play: import("react/jsx-runtime").JSX.Element;
7
+ pause: import("react/jsx-runtime").JSX.Element;
8
+ prev: import("react/jsx-runtime").JSX.Element;
9
+ next: import("react/jsx-runtime").JSX.Element;
10
+ volume: import("react/jsx-runtime").JSX.Element;
11
+ mute: import("react/jsx-runtime").JSX.Element;
12
+ loop: import("react/jsx-runtime").JSX.Element;
13
+ fullscreen: import("react/jsx-runtime").JSX.Element;
14
+ fullscreenExit: import("react/jsx-runtime").JSX.Element;
15
+ check: import("react/jsx-runtime").JSX.Element;
16
+ close: import("react/jsx-runtime").JSX.Element;
17
+ sliders: import("react/jsx-runtime").JSX.Element;
18
+ info: import("react/jsx-runtime").JSX.Element;
19
+ code: import("react/jsx-runtime").JSX.Element;
20
+ panelRight: import("react/jsx-runtime").JSX.Element;
21
+ text: import("react/jsx-runtime").JSX.Element;
22
+ layout: import("react/jsx-runtime").JSX.Element;
23
+ image: import("react/jsx-runtime").JSX.Element;
24
+ media: import("react/jsx-runtime").JSX.Element;
25
+ basic: import("react/jsx-runtime").JSX.Element;
26
+ spark: import("react/jsx-runtime").JSX.Element;
27
+ dots: import("react/jsx-runtime").JSX.Element;
28
+ layers: import("react/jsx-runtime").JSX.Element;
29
+ progress: import("react/jsx-runtime").JSX.Element;
30
+ eye: import("react/jsx-runtime").JSX.Element;
31
+ eyeOff: import("react/jsx-runtime").JSX.Element;
32
+ markIn: import("react/jsx-runtime").JSX.Element;
33
+ markOut: import("react/jsx-runtime").JSX.Element;
34
+ server: import("react/jsx-runtime").JSX.Element;
35
+ camera: import("react/jsx-runtime").JSX.Element;
36
+ film: import("react/jsx-runtime").JSX.Element;
37
+ download: import("react/jsx-runtime").JSX.Element;
38
+ queue: import("react/jsx-runtime").JSX.Element;
39
+ trash: import("react/jsx-runtime").JSX.Element;
40
+ clock: import("react/jsx-runtime").JSX.Element;
41
+ loader: import("react/jsx-runtime").JSX.Element;
42
+ plus: import("react/jsx-runtime").JSX.Element;
43
+ minus: import("react/jsx-runtime").JSX.Element;
44
+ grip: import("react/jsx-runtime").JSX.Element;
45
+ };
46
+ export type IconName = keyof typeof PATHS;
47
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/components/icon/paths.tsx"],"names":[],"mappings":"AAUA,qFAAqF;AACrF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmMmB,CAAC;AAEtC,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const p = {
3
+ fill: "none",
4
+ stroke: "currentColor",
5
+ strokeWidth: 1.7,
6
+ strokeLinecap: "round",
7
+ strokeLinejoin: "round",
8
+ };
9
+ /** Inline-SVG glyph set (viewBox 0 0 18 18). Ported from the SmooveStudio design. */
10
+ export const PATHS = {
11
+ search: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "7.5", cy: "7.5", r: "4.5", ...p }), _jsx("path", { d: "M11 11l3.5 3.5", ...p })] })),
12
+ chevron: _jsx("path", { d: "M4 6.5l4 4 4-4", ...p }),
13
+ chevronRight: _jsx("path", { d: "M6.5 4l4 4-4 4", ...p }),
14
+ play: _jsx("path", { d: "M6 4.5l9 5.5-9 5.5z", fill: "currentColor", stroke: "none" }),
15
+ pause: (_jsxs("g", { fill: "currentColor", stroke: "none", children: [_jsx("rect", { x: "5", y: "4", width: "3.2", height: "12", rx: "1" }), _jsx("rect", { x: "11.8", y: "4", width: "3.2", height: "12", rx: "1" })] })),
16
+ prev: (_jsxs("g", { fill: "currentColor", stroke: "none", children: [_jsx("path", { d: "M14 5v10l-7-5z" }), _jsx("rect", { x: "4.5", y: "5", width: "2.2", height: "10", rx: "1" })] })),
17
+ next: (_jsxs("g", { fill: "currentColor", stroke: "none", children: [_jsx("path", { d: "M6 5v10l7-5z" }), _jsx("rect", { x: "13.3", y: "5", width: "2.2", height: "10", rx: "1" })] })),
18
+ volume: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M4 8v4h2.5L11 15.5v-11L6.5 8z", fill: "currentColor", stroke: "none" }), _jsx("path", { d: "M13.2 7.2a3.6 3.6 0 010 5.6M15 5.4a6 6 0 010 9.2", ...p })] })),
19
+ mute: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M4 8v4h2.5L11 15.5v-11L6.5 8z", fill: "currentColor", stroke: "none" }), _jsx("path", { d: "M13.5 8l3 4M16.5 8l-3 4", ...p })] })),
20
+ loop: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M4 8V7.5A2.5 2.5 0 016.5 5H12", ...p }), _jsx("path", { d: "M10.5 3l2 2-2 2", ...p }), _jsx("path", { d: "M14 10v.5A2.5 2.5 0 0111.5 13H6", ...p }), _jsx("path", { d: "M7.5 15l-2-2 2-2", ...p })] })),
21
+ fullscreen: _jsx("path", { d: "M4 7V4h3M16 7V4h-3M4 13v3h3M16 13v3h-3", ...p }),
22
+ fullscreenExit: _jsx("path", { d: "M7 4v3H4M13 4v3h3M7 16v-3H4M13 16v-3h3", ...p }),
23
+ check: _jsx("path", { d: "M4 8.5l3 3 6-6.5", ...p }),
24
+ close: _jsx("path", { d: "M5 5l8 8M13 5l-8 8", ...p }),
25
+ sliders: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M4 6h6M14 6h2M4 12h2M10 12h6", ...p }), _jsx("circle", { cx: "12", cy: "6", r: "2", ...p }), _jsx("circle", { cx: "8", cy: "12", r: "2", ...p })] })),
26
+ info: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "9", cy: "9", r: "6.2", ...p }), _jsx("path", { d: "M9 8v4M9 5.6v.01", ...p })] })),
27
+ code: _jsx("path", { d: "M7 6l-3 3 3 3M11 6l3 3-3 3", ...p }),
28
+ panelRight: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "4", width: "12", height: "10", rx: "1.6", ...p }), _jsx("path", { d: "M11 4v10", ...p })] })),
29
+ text: _jsx("path", { d: "M4 5h10M9 5v9M6.5 14h5", ...p }),
30
+ layout: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3.5", y: "3.5", width: "11", height: "11", rx: "1.5", ...p }), _jsx("path", { d: "M3.5 7.5h11M8 7.5v7", ...p })] })),
31
+ image: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3.5", y: "4", width: "11", height: "10", rx: "1.5", ...p }), _jsx("circle", { cx: "7", cy: "7.5", r: "1.2", ...p }), _jsx("path", { d: "M4 13l3.5-3.5 3 2.5L13 9l1.5 1.3", ...p })] })),
32
+ media: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "9", cy: "9", r: "6", ...p }), _jsx("path", { d: "M7.5 6.5l4 2.5-4 2.5z", fill: "currentColor", stroke: "none" })] })),
33
+ basic: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "9", cy: "9", r: "6", ...p }), _jsx("path", { d: "M9 5.5v7M5.5 9h7", ...p })] })),
34
+ spark: (_jsxs("g", { transform: "scale(0.15)", children: [_jsxs("g", { stroke: "currentColor", strokeWidth: "9", strokeLinecap: "round", children: [_jsx("line", { x1: "40", y1: "38", x2: "40", y2: "82" }), _jsx("line", { x1: "52", y1: "44", x2: "52", y2: "76" }), _jsx("line", { x1: "64", y1: "50", x2: "64", y2: "70" }), _jsx("line", { x1: "76", y1: "56", x2: "76", y2: "64" })] }), _jsx("circle", { cx: "89", cy: "60", r: "3.5", fill: "#FFC23C", stroke: "none" })] })),
35
+ dots: (_jsxs("g", { fill: "currentColor", stroke: "none", children: [_jsx("circle", { cx: "9", cy: "4.4", r: "1.45" }), _jsx("circle", { cx: "9", cy: "9", r: "1.45" }), _jsx("circle", { cx: "9", cy: "13.6", r: "1.45" })] })),
36
+ layers: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M9 3l6 3-6 3-6-3 6-3z", ...p }), _jsx("path", { d: "M3 9l6 3 6-3M3 12l6 3 6-3", ...p })] })),
37
+ progress: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M3 9h12", ...p }), _jsx("circle", { cx: "11.5", cy: "9", r: "2.2", fill: "currentColor", stroke: "none" })] })),
38
+ eye: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M2 9s2.6-4.6 7-4.6S16 9 16 9s-2.6 4.6-7 4.6S2 9 2 9z", ...p }), _jsx("circle", { cx: "9", cy: "9", r: "1.9", ...p })] })),
39
+ eyeOff: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M2.2 9s2.6-4.6 6.8-4.6c1.2 0 2.3.4 3.2.9M16 9s-1 1.8-2.9 3M9 13.6c-4.4 0-6.8-4.6-6.8-4.6", ...p }), _jsx("path", { d: "M3.4 3.4l11.2 11.2", ...p })] })),
40
+ markIn: _jsx("path", { d: "M10.5 4H6v10h4.5", ...p }),
41
+ markOut: _jsx("path", { d: "M7.5 4H12v10H7.5", ...p }),
42
+ server: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "3.5", width: "12", height: "4.6", rx: "1.3", ...p }), _jsx("rect", { x: "3", y: "9.9", width: "12", height: "4.6", rx: "1.3", ...p }), _jsx("path", { d: "M5.6 5.8h.01M5.6 12.2h.01", ...p })] })),
43
+ camera: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "2.6", y: "6", width: "12.8", height: "8.4", rx: "1.8", ...p }), _jsx("circle", { cx: "9", cy: "10.2", r: "2.5", ...p }), _jsx("path", { d: "M6.6 6l1-1.6h2.8l1 1.6", ...p })] })),
44
+ film: (_jsxs(_Fragment, { children: [_jsx("rect", { x: "3", y: "4", width: "12", height: "10", rx: "1.5", ...p }), _jsx("path", { d: "M6.5 4v10M11.5 4v10M3 7.2h3.5M11.5 7.2H15M3 10.8h3.5M11.5 10.8H15", ...p })] })),
45
+ download: (_jsxs(_Fragment, { children: [_jsx("path", { d: "M9 3v8M5.6 7.6L9 11l3.4-3.4", ...p }), _jsx("path", { d: "M3.6 13.6h10.8", ...p })] })),
46
+ queue: _jsx("path", { d: "M4 5h10M4 9h10M4 13h6", ...p }),
47
+ trash: _jsx("path", { d: "M4 5.6h10M7.4 5.6V4.2h3.2v1.4M5.4 5.6l.7 8.8h5.8l.7-8.8", ...p }),
48
+ clock: (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "9", cy: "9", r: "6", ...p }), _jsx("path", { d: "M9 5.4V9l2.6 1.6", ...p })] })),
49
+ loader: _jsx("path", { d: "M9 3a6 6 0 11-5.2 3", ...p }),
50
+ plus: _jsx("path", { d: "M9 4v10M4 9h10", ...p }),
51
+ minus: _jsx("path", { d: "M4 9h10", ...p }),
52
+ grip: (_jsxs("g", { fill: "currentColor", stroke: "none", children: [_jsx("circle", { cx: "7", cy: "5", r: "1.3" }), _jsx("circle", { cx: "11", cy: "5", r: "1.3" }), _jsx("circle", { cx: "7", cy: "9", r: "1.3" }), _jsx("circle", { cx: "11", cy: "9", r: "1.3" }), _jsx("circle", { cx: "7", cy: "13", r: "1.3" }), _jsx("circle", { cx: "11", cy: "13", r: "1.3" })] })),
53
+ };
54
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/components/icon/paths.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,cAAc;IACtB,WAAW,EAAE,GAAG;IAChB,aAAa,EAAE,OAAgB;IAC/B,cAAc,EAAE,OAAgB;CACjC,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,CACN,8BACE,iBAAQ,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,KAAK,CAAC,GAAI,EAC3C,eAAM,CAAC,EAAC,gBAAgB,KAAK,CAAC,GAAI,IACjC,CACJ;IACD,OAAO,EAAE,eAAM,CAAC,EAAC,gBAAgB,KAAK,CAAC,GAAI;IAC3C,YAAY,EAAE,eAAM,CAAC,EAAC,gBAAgB,KAAK,CAAC,GAAI;IAChD,IAAI,EAAE,eAAM,CAAC,EAAC,qBAAqB,EAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,GAAG;IACxE,KAAK,EAAE,CACL,aAAG,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,aAClC,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EACnD,eAAM,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,IACpD,CACL;IACD,IAAI,EAAE,CACJ,aAAG,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,aAClC,eAAM,CAAC,EAAC,gBAAgB,GAAG,EAC3B,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,IACnD,CACL;IACD,IAAI,EAAE,CACJ,aAAG,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,aAClC,eAAM,CAAC,EAAC,cAAc,GAAG,EACzB,eAAM,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,IACpD,CACL;IACD,MAAM,EAAE,CACN,8BACE,eAAM,CAAC,EAAC,+BAA+B,EAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,GAAG,EAC5E,eAAM,CAAC,EAAC,kDAAkD,KAAK,CAAC,GAAI,IACnE,CACJ;IACD,IAAI,EAAE,CACJ,8BACE,eAAM,CAAC,EAAC,+BAA+B,EAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,GAAG,EAC5E,eAAM,CAAC,EAAC,yBAAyB,KAAK,CAAC,GAAI,IAC1C,CACJ;IACD,IAAI,EAAE,CACJ,8BACE,eAAM,CAAC,EAAC,+BAA+B,KAAK,CAAC,GAAI,EACjD,eAAM,CAAC,EAAC,iBAAiB,KAAK,CAAC,GAAI,EACnC,eAAM,CAAC,EAAC,iCAAiC,KAAK,CAAC,GAAI,EACnD,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI,IACnC,CACJ;IACD,UAAU,EAAE,eAAM,CAAC,EAAC,wCAAwC,KAAK,CAAC,GAAI;IACtE,cAAc,EAAE,eAAM,CAAC,EAAC,wCAAwC,KAAK,CAAC,GAAI;IAC1E,KAAK,EAAE,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI;IAC3C,KAAK,EAAE,eAAM,CAAC,EAAC,oBAAoB,KAAK,CAAC,GAAI;IAC7C,OAAO,EAAE,CACP,8BACE,eAAM,CAAC,EAAC,8BAA8B,KAAK,CAAC,GAAI,EAChD,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,KAAK,CAAC,GAAI,EACtC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,KAAK,CAAC,GAAI,IACrC,CACJ;IACD,IAAI,EAAE,CACJ,8BACE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,KAAK,CAAC,GAAI,EACvC,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI,IACnC,CACJ;IACD,IAAI,EAAE,eAAM,CAAC,EAAC,4BAA4B,KAAK,CAAC,GAAI;IACpD,UAAU,EAAE,CACV,8BACE,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC3D,eAAM,CAAC,EAAC,UAAU,KAAK,CAAC,GAAI,IAC3B,CACJ;IACD,IAAI,EAAE,eAAM,CAAC,EAAC,wBAAwB,KAAK,CAAC,GAAI;IAChD,MAAM,EAAE,CACN,8BACE,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC/D,eAAM,CAAC,EAAC,qBAAqB,KAAK,CAAC,GAAI,IACtC,CACJ;IACD,KAAK,EAAE,CACL,8BACE,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC7D,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,KAAK,CAAC,GAAI,EACzC,eAAM,CAAC,EAAC,kCAAkC,KAAK,CAAC,GAAI,IACnD,CACJ;IACD,KAAK,EAAE,CACL,8BACE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,KAAK,CAAC,GAAI,EACrC,eAAM,CAAC,EAAC,uBAAuB,EAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,GAAG,IACnE,CACJ;IACD,KAAK,EAAE,CACL,8BACE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,KAAK,CAAC,GAAI,EACrC,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI,IACnC,CACJ;IACD,KAAK,EAAE,CAIL,aAAG,SAAS,EAAC,aAAa,aACxB,aAAG,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,aAC5D,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACtC,EACJ,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,EAAC,MAAM,EAAC,MAAM,GAAG,IAC7D,CACL;IACD,IAAI,EAAE,CACJ,aAAG,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,aAClC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,MAAM,GAAG,EACnC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,MAAM,GAAG,EACjC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,EAAC,MAAM,GAAG,IAClC,CACL;IACD,MAAM,EAAE,CACN,8BACE,eAAM,CAAC,EAAC,uBAAuB,KAAK,CAAC,GAAI,EACzC,eAAM,CAAC,EAAC,2BAA2B,KAAK,CAAC,GAAI,IAC5C,CACJ;IACD,QAAQ,EAAE,CACR,8BACE,eAAM,CAAC,EAAC,SAAS,KAAK,CAAC,GAAI,EAC3B,iBAAQ,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,GAAG,IACpE,CACJ;IACD,GAAG,EAAE,CACH,8BACE,eAAM,CAAC,EAAC,sDAAsD,KAAK,CAAC,GAAI,EACxE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,KAAK,CAAC,GAAI,IACtC,CACJ;IACD,MAAM,EAAE,CACN,8BACE,eACE,CAAC,EAAC,0FAA0F,KACxF,CAAC,GACL,EACF,eAAM,CAAC,EAAC,oBAAoB,KAAK,CAAC,GAAI,IACrC,CACJ;IACD,MAAM,EAAE,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI;IAC5C,OAAO,EAAE,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI;IAC7C,MAAM,EAAE,CACN,8BACE,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC9D,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC9D,eAAM,CAAC,EAAC,2BAA2B,KAAK,CAAC,GAAI,IAC5C,CACJ;IACD,MAAM,EAAE,CACN,8BACE,eAAM,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAChE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,MAAM,EAAC,CAAC,EAAC,KAAK,KAAK,CAAC,GAAI,EAC1C,eAAM,CAAC,EAAC,wBAAwB,KAAK,CAAC,GAAI,IACzC,CACJ;IACD,IAAI,EAAE,CACJ,8BACE,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,KAAK,CAAC,GAAI,EAC3D,eAAM,CAAC,EAAC,mEAAmE,KAAK,CAAC,GAAI,IACpF,CACJ;IACD,QAAQ,EAAE,CACR,8BACE,eAAM,CAAC,EAAC,6BAA6B,KAAK,CAAC,GAAI,EAC/C,eAAM,CAAC,EAAC,gBAAgB,KAAK,CAAC,GAAI,IACjC,CACJ;IACD,KAAK,EAAE,eAAM,CAAC,EAAC,uBAAuB,KAAK,CAAC,GAAI;IAChD,KAAK,EAAE,eAAM,CAAC,EAAC,yDAAyD,KAAK,CAAC,GAAI;IAClF,KAAK,EAAE,CACL,8BACE,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,KAAK,CAAC,GAAI,EACrC,eAAM,CAAC,EAAC,kBAAkB,KAAK,CAAC,GAAI,IACnC,CACJ;IACD,MAAM,EAAE,eAAM,CAAC,EAAC,qBAAqB,KAAK,CAAC,GAAI;IAC/C,IAAI,EAAE,eAAM,CAAC,EAAC,gBAAgB,KAAK,CAAC,GAAI;IACxC,KAAK,EAAE,eAAM,CAAC,EAAC,SAAS,KAAK,CAAC,GAAI;IAClC,IAAI,EAAE,CACJ,aAAG,IAAI,EAAC,cAAc,EAAC,MAAM,EAAC,MAAM,aAClC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EACjC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EAChC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,CAAC,EAAC,KAAK,GAAG,EACjC,iBAAQ,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,GAAG,EACjC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,KAAK,GAAG,IAChC,CACL;CACkC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Searchable composition catalog — ungrouped rows first, then named groups. */
2
+ export declare function Library({ heading, searchPlaceholder, search, }: {
3
+ heading?: string;
4
+ searchPlaceholder?: string;
5
+ /** Show the search field (set false to omit it). */
6
+ search?: boolean;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/components/left-panel/library.tsx"],"names":[],"mappings":"AAQA,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,EACtB,OAAwB,EACxB,iBAA0C,EAC1C,MAAa,GACd,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,2CAsGA"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { useStudio } from "../../hooks/use-studio.js";
4
+ import { useSignalValue } from "../../signals/signal-bridge.js";
5
+ import { Icon } from "../icon/icon.js";
6
+ import { SidebarGroup } from "./sidebar-group.js";
7
+ import { SidebarItem } from "./sidebar-item.js";
8
+ /** Searchable composition catalog — ungrouped rows first, then named groups. */
9
+ export function Library({ heading = "Compositions", searchPlaceholder = "Search compositions…", search = true, }) {
10
+ const store = useStudio();
11
+ const selectedId = useSignalValue(store.selectedId);
12
+ const status = useSignalValue(store.loadStatus); // re-render rows as comps load
13
+ const [q, setQ] = useState("");
14
+ const ql = q.trim().toLowerCase();
15
+ // Ungrouped entries render as a flat list; entries with a `group` collapse
16
+ // under that heading. Order is preserved from the registry.
17
+ const { flat, groups } = useMemo(() => {
18
+ const flat = [];
19
+ const map = new Map();
20
+ for (const e of store.entries) {
21
+ if (e.group) {
22
+ const list = map.get(e.group) ?? [];
23
+ list.push(e);
24
+ map.set(e.group, list);
25
+ }
26
+ else {
27
+ flat.push(e);
28
+ }
29
+ }
30
+ return { flat, groups: [...map.entries()].map(([group, items]) => ({ group, items })) };
31
+ }, [store.entries]);
32
+ const match = (e, group) => !ql ||
33
+ (e.title ?? e.id).toLowerCase().includes(ql) ||
34
+ (e.tags ?? []).some((t) => t.toLowerCase().includes(ql)) ||
35
+ (group ?? "").toLowerCase().includes(ql);
36
+ const flatHits = flat.filter((e) => match(e));
37
+ const groupHits = groups
38
+ .map((g) => ({ ...g, items: g.items.filter((e) => match(e, g.group)) }))
39
+ .filter((g) => g.items.length > 0);
40
+ const total = flat.length + groups.reduce((n, g) => n + g.items.length, 0);
41
+ const empty = flatHits.length === 0 && groupHits.length === 0;
42
+ const renderItem = (e) => {
43
+ const active = e.id === selectedId;
44
+ const loading = status[e.id] === "loading";
45
+ return (_jsx(SidebarItem, { active: active, title: e.title ?? e.id, dot: active && !loading, loading: loading, onClick: () => store.select(e.id) }, e.id));
46
+ };
47
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [search && (_jsx("div", { className: "px-3 pt-3 pb-2", children: _jsxs("div", { className: "relative", children: [_jsx("span", { className: "pointer-events-none absolute left-2.5 top-1/2 -translate-y-1/2 text-ink-3", children: _jsx(Icon, { name: "search", size: 15 }) }), _jsx("input", { value: q, onChange: (e) => setQ(e.target.value), placeholder: searchPlaceholder, className: "w-full rounded-control border border-line bg-bg-2 pl-8 pr-2.5 py-[7px] text-[12.5px] text-ink-1 outline-none transition-colors placeholder:text-ink-3 focus:border-accent-line" })] }) })), _jsxs("div", { className: "scroll min-h-0 flex-1 overflow-y-auto px-2 pb-6", children: [_jsxs("div", { className: "flex items-center justify-between px-2 pt-1 pb-1.5", children: [_jsx("span", { className: "text-[10px] font-bold uppercase tracking-[.12em] text-ink-3", children: heading }), _jsx("span", { className: "font-mono text-[10px] text-ink-3", children: total })] }), empty ? (_jsxs("div", { className: "px-2 py-8 text-center text-[12px] text-ink-3", children: ["No compositions match \u201C", q.trim(), "\u201D"] })) : (_jsxs(_Fragment, { children: [flatHits.map(renderItem), groupHits.map(({ group, items }) => (_jsx(SidebarGroup, { label: group, count: items.length, defaultOpen: true, forceOpen: ql ? true : undefined, children: items.map(renderItem) }, group)))] }))] })] }));
48
+ }
49
+ //# sourceMappingURL=library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/components/left-panel/library.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type ReactNode } from "react";
2
+ export type SidebarGroupProps = {
3
+ label: string;
4
+ count?: number;
5
+ defaultOpen?: boolean;
6
+ /** When set, controls open state externally (e.g. force-open while searching). */
7
+ forceOpen?: boolean;
8
+ children: ReactNode;
9
+ };
10
+ /** Collapsible composition group — its rows are indented behind a guide rail. */
11
+ export declare function SidebarGroup({ label, count, defaultOpen, forceOpen, children, }: SidebarGroupProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=sidebar-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-group.d.ts","sourceRoot":"","sources":["../../../src/components/left-panel/sidebar-group.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAIjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kFAAkF;IAClF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,WAAkB,EAClB,SAAS,EACT,QAAQ,GACT,EAAE,iBAAiB,2CAmCnB"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { Icon } from "../icon/icon.js";
5
+ /** Collapsible composition group — its rows are indented behind a guide rail. */
6
+ export function SidebarGroup({ label, count, defaultOpen = true, forceOpen, children, }) {
7
+ const [open, setOpen] = useState(defaultOpen);
8
+ const isOpen = forceOpen != null ? forceOpen : open;
9
+ return (_jsxs("div", { className: "mt-0.5", children: [_jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "group flex w-full items-center gap-1.5 rounded-control px-1.5 py-1.5 text-ink-3 transition-colors hover:text-ink-1", children: [_jsx("span", { className: cn("flex transition-transform duration-200", !isOpen && "-rotate-90"), children: _jsx(Icon, { name: "chevron", size: 13 }) }), _jsx("span", { className: "text-[11px] font-semibold uppercase tracking-[.07em]", children: label }), count != null && (_jsx("span", { className: "ml-auto grid h-[17px] min-w-[17px] place-items-center rounded-full bg-bg-2 px-1.5 font-mono text-[10px] font-medium text-ink-3 transition-colors group-hover:text-ink-2", children: count }))] }), _jsx("div", { className: cn("grid transition-[grid-template-rows,opacity] duration-200", isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"), children: _jsx("div", { className: "min-h-0 overflow-hidden", children: _jsxs("div", { className: "relative ml-1.5 pl-2", children: [_jsx("span", { className: "absolute bottom-0.5 left-0 top-0.5 w-px bg-line" }), children] }) }) })] }));
10
+ }
11
+ //# sourceMappingURL=sidebar-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-group.js","sourceRoot":"","sources":["../../../src/components/left-panel/sidebar-group.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAkB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAWvC,iFAAiF;AACjF,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,KAAK,EACL,WAAW,GAAG,IAAI,EAClB,SAAS,EACT,QAAQ,GACU;IAClB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,aACrB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACjC,SAAS,EAAC,oHAAoH,aAE9H,eAAM,SAAS,EAAE,EAAE,CAAC,wCAAwC,EAAE,CAAC,MAAM,IAAI,YAAY,CAAC,YACpF,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAE,EAAE,GAAI,GAC5B,EACP,eAAM,SAAS,EAAC,sDAAsD,YAAE,KAAK,GAAQ,EACpF,KAAK,IAAI,IAAI,IAAI,CAChB,eAAM,SAAS,EAAC,yKAAyK,YACtL,KAAK,GACD,CACR,IACM,EACT,cACE,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,2BAA2B,CACrE,YAED,cAAK,SAAS,EAAC,yBAAyB,YACtC,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,iDAAiD,GAAG,EACnE,QAAQ,IACL,GACF,GACF,IACF,CACP,CAAC;AACJ,CAAC"}