@clipkit/editor 1.0.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.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +51 -0
  3. package/dist/Editor.d.ts +3 -0
  4. package/dist/Editor.d.ts.map +1 -0
  5. package/dist/Editor.js +73 -0
  6. package/dist/Editor.js.map +1 -0
  7. package/dist/ExportDialog.d.ts +12 -0
  8. package/dist/ExportDialog.d.ts.map +1 -0
  9. package/dist/ExportDialog.js +30 -0
  10. package/dist/ExportDialog.js.map +1 -0
  11. package/dist/MotionPathOverlay.d.ts +5 -0
  12. package/dist/MotionPathOverlay.d.ts.map +1 -0
  13. package/dist/MotionPathOverlay.js +156 -0
  14. package/dist/MotionPathOverlay.js.map +1 -0
  15. package/dist/PerfHud.d.ts +2 -0
  16. package/dist/PerfHud.d.ts.map +1 -0
  17. package/dist/PerfHud.js +85 -0
  18. package/dist/PerfHud.js.map +1 -0
  19. package/dist/Stage.d.ts +2 -0
  20. package/dist/Stage.d.ts.map +1 -0
  21. package/dist/Stage.js +406 -0
  22. package/dist/Stage.js.map +1 -0
  23. package/dist/StageOverlay.d.ts +7 -0
  24. package/dist/StageOverlay.d.ts.map +1 -0
  25. package/dist/StageOverlay.js +508 -0
  26. package/dist/StageOverlay.js.map +1 -0
  27. package/dist/commands.d.ts +18 -0
  28. package/dist/commands.d.ts.map +1 -0
  29. package/dist/commands.js +103 -0
  30. package/dist/commands.js.map +1 -0
  31. package/dist/configuration.d.ts +9 -0
  32. package/dist/configuration.d.ts.map +1 -0
  33. package/dist/configuration.js +21 -0
  34. package/dist/configuration.js.map +1 -0
  35. package/dist/controls/AnimationsStack.d.ts +8 -0
  36. package/dist/controls/AnimationsStack.d.ts.map +1 -0
  37. package/dist/controls/AnimationsStack.js +188 -0
  38. package/dist/controls/AnimationsStack.js.map +1 -0
  39. package/dist/controls/CameraControl.d.ts +19 -0
  40. package/dist/controls/CameraControl.d.ts.map +1 -0
  41. package/dist/controls/CameraControl.js +47 -0
  42. package/dist/controls/CameraControl.js.map +1 -0
  43. package/dist/controls/CaptionLengthControl.d.ts +5 -0
  44. package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
  45. package/dist/controls/CaptionLengthControl.js +11 -0
  46. package/dist/controls/CaptionLengthControl.js.map +1 -0
  47. package/dist/controls/CaptionTranscribe.d.ts +2 -0
  48. package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
  49. package/dist/controls/CaptionTranscribe.js +95 -0
  50. package/dist/controls/CaptionTranscribe.js.map +1 -0
  51. package/dist/controls/ColorPicker.d.ts +17 -0
  52. package/dist/controls/ColorPicker.d.ts.map +1 -0
  53. package/dist/controls/ColorPicker.js +354 -0
  54. package/dist/controls/ColorPicker.js.map +1 -0
  55. package/dist/controls/ControlRenderer.d.ts +20 -0
  56. package/dist/controls/ControlRenderer.d.ts.map +1 -0
  57. package/dist/controls/ControlRenderer.js +106 -0
  58. package/dist/controls/ControlRenderer.js.map +1 -0
  59. package/dist/controls/CropControl.d.ts +2 -0
  60. package/dist/controls/CropControl.d.ts.map +1 -0
  61. package/dist/controls/CropControl.js +177 -0
  62. package/dist/controls/CropControl.js.map +1 -0
  63. package/dist/controls/EffectsStack.d.ts +8 -0
  64. package/dist/controls/EffectsStack.d.ts.map +1 -0
  65. package/dist/controls/EffectsStack.js +89 -0
  66. package/dist/controls/EffectsStack.js.map +1 -0
  67. package/dist/controls/GradeControl.d.ts +2 -0
  68. package/dist/controls/GradeControl.d.ts.map +1 -0
  69. package/dist/controls/GradeControl.js +120 -0
  70. package/dist/controls/GradeControl.js.map +1 -0
  71. package/dist/controls/KeyframeDiamond.d.ts +11 -0
  72. package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
  73. package/dist/controls/KeyframeDiamond.js +87 -0
  74. package/dist/controls/KeyframeDiamond.js.map +1 -0
  75. package/dist/controls/LightingControls.d.ts +24 -0
  76. package/dist/controls/LightingControls.d.ts.map +1 -0
  77. package/dist/controls/LightingControls.js +108 -0
  78. package/dist/controls/LightingControls.js.map +1 -0
  79. package/dist/controls/ShapePresetControl.d.ts +4 -0
  80. package/dist/controls/ShapePresetControl.d.ts.map +1 -0
  81. package/dist/controls/ShapePresetControl.js +30 -0
  82. package/dist/controls/ShapePresetControl.js.map +1 -0
  83. package/dist/controls/ValueField.d.ts +10 -0
  84. package/dist/controls/ValueField.d.ts.map +1 -0
  85. package/dist/controls/ValueField.js +158 -0
  86. package/dist/controls/ValueField.js.map +1 -0
  87. package/dist/controls/VolumeControl.d.ts +10 -0
  88. package/dist/controls/VolumeControl.d.ts.map +1 -0
  89. package/dist/controls/VolumeControl.js +75 -0
  90. package/dist/controls/VolumeControl.js.map +1 -0
  91. package/dist/controls/compound.d.ts +46 -0
  92. package/dist/controls/compound.d.ts.map +1 -0
  93. package/dist/controls/compound.js +160 -0
  94. package/dist/controls/compound.js.map +1 -0
  95. package/dist/controls/layout.d.ts +38 -0
  96. package/dist/controls/layout.d.ts.map +1 -0
  97. package/dist/controls/layout.js +162 -0
  98. package/dist/controls/layout.js.map +1 -0
  99. package/dist/controls/primitives.d.ts +83 -0
  100. package/dist/controls/primitives.d.ts.map +1 -0
  101. package/dist/controls/primitives.js +194 -0
  102. package/dist/controls/primitives.js.map +1 -0
  103. package/dist/controls/transcribe.worker.d.ts +2 -0
  104. package/dist/controls/transcribe.worker.d.ts.map +1 -0
  105. package/dist/controls/transcribe.worker.js +22 -0
  106. package/dist/controls/transcribe.worker.js.map +1 -0
  107. package/dist/frame/AddElementBar.d.ts +2 -0
  108. package/dist/frame/AddElementBar.d.ts.map +1 -0
  109. package/dist/frame/AddElementBar.js +103 -0
  110. package/dist/frame/AddElementBar.js.map +1 -0
  111. package/dist/frame/Breadcrumbs.d.ts +2 -0
  112. package/dist/frame/Breadcrumbs.d.ts.map +1 -0
  113. package/dist/frame/Breadcrumbs.js +32 -0
  114. package/dist/frame/Breadcrumbs.js.map +1 -0
  115. package/dist/frame/GroupFlash.d.ts +2 -0
  116. package/dist/frame/GroupFlash.d.ts.map +1 -0
  117. package/dist/frame/GroupFlash.js +65 -0
  118. package/dist/frame/GroupFlash.js.map +1 -0
  119. package/dist/frame/Resizable.d.ts +12 -0
  120. package/dist/frame/Resizable.d.ts.map +1 -0
  121. package/dist/frame/Resizable.js +37 -0
  122. package/dist/frame/Resizable.js.map +1 -0
  123. package/dist/frame/Section.d.ts +23 -0
  124. package/dist/frame/Section.d.ts.map +1 -0
  125. package/dist/frame/Section.js +23 -0
  126. package/dist/frame/Section.js.map +1 -0
  127. package/dist/frame/ZoomControl.d.ts +9 -0
  128. package/dist/frame/ZoomControl.d.ts.map +1 -0
  129. package/dist/frame/ZoomControl.js +15 -0
  130. package/dist/frame/ZoomControl.js.map +1 -0
  131. package/dist/index.d.ts +9 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +13 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lib/camera-gizmo.d.ts +15 -0
  136. package/dist/lib/camera-gizmo.d.ts.map +1 -0
  137. package/dist/lib/camera-gizmo.js +57 -0
  138. package/dist/lib/camera-gizmo.js.map +1 -0
  139. package/dist/lib/camera-tool.d.ts +43 -0
  140. package/dist/lib/camera-tool.d.ts.map +1 -0
  141. package/dist/lib/camera-tool.js +80 -0
  142. package/dist/lib/camera-tool.js.map +1 -0
  143. package/dist/lib/caption-segments.d.ts +17 -0
  144. package/dist/lib/caption-segments.d.ts.map +1 -0
  145. package/dist/lib/caption-segments.js +50 -0
  146. package/dist/lib/caption-segments.js.map +1 -0
  147. package/dist/lib/group.d.ts +12 -0
  148. package/dist/lib/group.d.ts.map +1 -0
  149. package/dist/lib/group.js +61 -0
  150. package/dist/lib/group.js.map +1 -0
  151. package/dist/lib/keyframes.d.ts +29 -0
  152. package/dist/lib/keyframes.d.ts.map +1 -0
  153. package/dist/lib/keyframes.js +92 -0
  154. package/dist/lib/keyframes.js.map +1 -0
  155. package/dist/lib/sfx-preview.d.ts +18 -0
  156. package/dist/lib/sfx-preview.d.ts.map +1 -0
  157. package/dist/lib/sfx-preview.js +74 -0
  158. package/dist/lib/sfx-preview.js.map +1 -0
  159. package/dist/lib/shape-presets.d.ts +35 -0
  160. package/dist/lib/shape-presets.d.ts.map +1 -0
  161. package/dist/lib/shape-presets.js +81 -0
  162. package/dist/lib/shape-presets.js.map +1 -0
  163. package/dist/lib/ungroup.d.ts +12 -0
  164. package/dist/lib/ungroup.d.ts.map +1 -0
  165. package/dist/lib/ungroup.js +40 -0
  166. package/dist/lib/ungroup.js.map +1 -0
  167. package/dist/lib/utils.d.ts +3 -0
  168. package/dist/lib/utils.d.ts.map +1 -0
  169. package/dist/lib/utils.js +9 -0
  170. package/dist/lib/utils.js.map +1 -0
  171. package/dist/panels/AssetsPanel.d.ts +2 -0
  172. package/dist/panels/AssetsPanel.d.ts.map +1 -0
  173. package/dist/panels/AssetsPanel.js +108 -0
  174. package/dist/panels/AssetsPanel.js.map +1 -0
  175. package/dist/panels/InspectorPanel.d.ts +2 -0
  176. package/dist/panels/InspectorPanel.d.ts.map +1 -0
  177. package/dist/panels/InspectorPanel.js +286 -0
  178. package/dist/panels/InspectorPanel.js.map +1 -0
  179. package/dist/panels/InterpolationPanel.d.ts +2 -0
  180. package/dist/panels/InterpolationPanel.d.ts.map +1 -0
  181. package/dist/panels/InterpolationPanel.js +226 -0
  182. package/dist/panels/InterpolationPanel.js.map +1 -0
  183. package/dist/panels/LayersTree.d.ts +4 -0
  184. package/dist/panels/LayersTree.d.ts.map +1 -0
  185. package/dist/panels/LayersTree.js +137 -0
  186. package/dist/panels/LayersTree.js.map +1 -0
  187. package/dist/panels/LeftRail.d.ts +6 -0
  188. package/dist/panels/LeftRail.d.ts.map +1 -0
  189. package/dist/panels/LeftRail.js +35 -0
  190. package/dist/panels/LeftRail.js.map +1 -0
  191. package/dist/panels/SourcePanel.d.ts +2 -0
  192. package/dist/panels/SourcePanel.d.ts.map +1 -0
  193. package/dist/panels/SourcePanel.js +470 -0
  194. package/dist/panels/SourcePanel.js.map +1 -0
  195. package/dist/panels/TimelinePanel.d.ts +11 -0
  196. package/dist/panels/TimelinePanel.d.ts.map +1 -0
  197. package/dist/panels/TimelinePanel.js +98 -0
  198. package/dist/panels/TimelinePanel.js.map +1 -0
  199. package/dist/panels/assets/SfxBrowser.d.ts +2 -0
  200. package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
  201. package/dist/panels/assets/SfxBrowser.js +49 -0
  202. package/dist/panels/assets/SfxBrowser.js.map +1 -0
  203. package/dist/panels/assets/use-assets.d.ts +11 -0
  204. package/dist/panels/assets/use-assets.d.ts.map +1 -0
  205. package/dist/panels/assets/use-assets.js +84 -0
  206. package/dist/panels/assets/use-assets.js.map +1 -0
  207. package/dist/panels/assets/use-sfx.d.ts +6 -0
  208. package/dist/panels/assets/use-sfx.d.ts.map +1 -0
  209. package/dist/panels/assets/use-sfx.js +47 -0
  210. package/dist/panels/assets/use-sfx.js.map +1 -0
  211. package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
  212. package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
  213. package/dist/panels/timeline/CanvasTimeline.js +1536 -0
  214. package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
  215. package/dist/panels/timeline/Clip.d.ts +37 -0
  216. package/dist/panels/timeline/Clip.d.ts.map +1 -0
  217. package/dist/panels/timeline/Clip.js +176 -0
  218. package/dist/panels/timeline/Clip.js.map +1 -0
  219. package/dist/panels/timeline/CurveEditor.d.ts +2 -0
  220. package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
  221. package/dist/panels/timeline/CurveEditor.js +233 -0
  222. package/dist/panels/timeline/CurveEditor.js.map +1 -0
  223. package/dist/panels/timeline/MixerRail.d.ts +7 -0
  224. package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
  225. package/dist/panels/timeline/MixerRail.js +295 -0
  226. package/dist/panels/timeline/MixerRail.js.map +1 -0
  227. package/dist/panels/timeline/Waveform.d.ts +11 -0
  228. package/dist/panels/timeline/Waveform.d.ts.map +1 -0
  229. package/dist/panels/timeline/Waveform.js +63 -0
  230. package/dist/panels/timeline/Waveform.js.map +1 -0
  231. package/dist/panels/timeline/clip-style.d.ts +10 -0
  232. package/dist/panels/timeline/clip-style.d.ts.map +1 -0
  233. package/dist/panels/timeline/clip-style.js +20 -0
  234. package/dist/panels/timeline/clip-style.js.map +1 -0
  235. package/dist/panels/timeline/filmstrip.d.ts +7 -0
  236. package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
  237. package/dist/panels/timeline/filmstrip.js +135 -0
  238. package/dist/panels/timeline/filmstrip.js.map +1 -0
  239. package/dist/panels/timeline/timeline-layout.d.ts +65 -0
  240. package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
  241. package/dist/panels/timeline/timeline-layout.js +118 -0
  242. package/dist/panels/timeline/timeline-layout.js.map +1 -0
  243. package/dist/types.d.ts +68 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +3 -0
  246. package/dist/types.js.map +1 -0
  247. package/package.json +56 -0
  248. package/src/styles.css +185 -0
@@ -0,0 +1,137 @@
1
+ // Layers tree (EDITORS B8) — the document's element structure as a
2
+ // flat-style tree: nesting via group expansion, rename (double-click),
3
+ // visibility (the protocol's `visible` field — a DOCUMENT knob),
4
+ // paint-order reorder (▲▼ swap `layer` values — the protocol's actual
5
+ // ordering mechanism; same-layer pairs swap array positions), and
6
+ // group / ungroup. Grouping wraps the selection in a COORDINATE-
7
+ // IDENTITY group (x 0, y 0, anchors 0, time 0) so children render
8
+ // byte-identically; ungroup is enabled ONLY when that exact inverse
9
+ // holds — the tree never silently moves pixels.
10
+ 'use client';
11
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
12
+ import { useMemo, useState } from 'react';
13
+ import { elementLayer, useEditor, useEditorStore, } from '@clipkit/editor-core';
14
+ import { Type, Square, Image as ImageIcon, Film, Music, Folder, Captions, Sparkles, PenTool, Eye, EyeOff, ChevronUp, ChevronDown, Ungroup, Group, } from 'lucide-react';
15
+ import { cn } from '../lib/utils.js';
16
+ const TYPE_ICON = {
17
+ text: Type, shape: Square, image: ImageIcon, video: Film, audio: Music,
18
+ group: Folder, caption: Captions, particles: Sparkles, svg: PenTool,
19
+ };
20
+ export function LayersTree() {
21
+ const actions = useEditor();
22
+ const source = useEditorStore((s) => s.source);
23
+ const selection = useEditorStore((s) => s.selection);
24
+ const [expanded, setExpanded] = useState(new Set());
25
+ const [renaming, setRenaming] = useState(null);
26
+ // Topmost first: layer ascending (layer 1 = front/on top), array order as tiebreak.
27
+ const top = useMemo(() => [...source.elements].sort((a, b) => elementLayer(a) - elementLayer(b) ||
28
+ source.elements.indexOf(a) - source.elements.indexOf(b)), [source]);
29
+ const writeElements = (next) => actions.patchSource({ elements: next });
30
+ // ── Reorder: swap the paint-order carriers of two elements ────────
31
+ const swapPaint = (a, b) => {
32
+ // Layers are unique per container, so a and b always differ — swap their
33
+ // layer values. (No array-position fallback: there are no layer ties.)
34
+ const la = elementLayer(a);
35
+ const lb = elementLayer(b);
36
+ const next = source.elements.map((el) => el === a ? { ...el, layer: lb } : el === b ? { ...el, layer: la } : el);
37
+ writeElements(next);
38
+ };
39
+ // ── Group / ungroup ────────────────────────────────────────────────
40
+ const selectedTop = top.filter((el) => el.id && selection.includes(el.id));
41
+ const canGroup = selectedTop.length >= 2;
42
+ const groupSelection = () => {
43
+ if (!canGroup)
44
+ return;
45
+ const ids = new Set(selectedTop.map((el) => el.id));
46
+ const children = source.elements.filter((el) => el.id && ids.has(el.id));
47
+ const rest = source.elements.filter((el) => !el.id || !ids.has(el.id));
48
+ const group = {
49
+ type: 'group',
50
+ id: `group-${Date.now().toString(36)}`,
51
+ // Coordinate identity: local space == composition space, child
52
+ // times stay absolute. Children render byte-identically.
53
+ x: 0, y: 0, x_anchor: 0, y_anchor: 0, time: 0,
54
+ layer: Math.max(...children.map((el) => elementLayer(el))),
55
+ elements: children,
56
+ };
57
+ writeElements([...rest, group]);
58
+ actions.selectOne(group.id);
59
+ };
60
+ /** Exact-inverse check: ungrouping must not move pixels. */
61
+ const isIdentityGroup = (g) => {
62
+ if (g.type !== 'group')
63
+ return false;
64
+ const zeroish = (v) => v === undefined || v === 0;
65
+ return (zeroish(g.x) && zeroish(g.y) &&
66
+ zeroish(g.x_anchor) && zeroish(g.y_anchor) &&
67
+ zeroish(g.time) &&
68
+ g.rotation === undefined && g.scale === undefined &&
69
+ g.opacity === undefined && g.clip !== true &&
70
+ g.mask === undefined &&
71
+ g.time_remap === undefined);
72
+ };
73
+ const ungroup = (g) => {
74
+ const next = [];
75
+ for (const el of source.elements) {
76
+ if (el === g)
77
+ next.push(...g.elements);
78
+ else
79
+ next.push(el);
80
+ }
81
+ writeElements(next);
82
+ actions.setSelection(g.elements.map((el) => el.id).filter((id) => !!id));
83
+ };
84
+ // ── Rows ───────────────────────────────────────────────────────────
85
+ const renderRow = (el, depth, siblings, index) => {
86
+ const id = el.id ?? `__anon_${depth}_${index}`;
87
+ const sel = el.id ? selection.includes(el.id) : false;
88
+ const isGroup = el.type === 'group';
89
+ const open = isGroup && expanded.has(id);
90
+ const hidden = el.visible === false;
91
+ const children = isGroup ? el.elements : [];
92
+ const TypeIcon = TYPE_ICON[el.type] ?? Square;
93
+ return (_jsxs("div", { children: [_jsxs("div", { className: cn('group/row flex items-center gap-1 h-7 pr-1 border-b border-border/30 cursor-default', sel ? 'bg-primary/12' : 'hover:bg-card', hidden && 'opacity-50'), style: { paddingLeft: 6 + depth * 12 }, onClick: () => el.id && actions.selectOne(el.id), onDoubleClick: () => el.id && setRenaming(el.id), children: [isGroup ? (_jsx("button", { type: "button", className: "w-3 shrink-0 text-muted-foreground hover:text-foreground", onClick: (e) => {
94
+ e.stopPropagation();
95
+ setExpanded((prev) => {
96
+ const next = new Set(prev);
97
+ if (next.has(id))
98
+ next.delete(id);
99
+ else
100
+ next.add(id);
101
+ return next;
102
+ });
103
+ }, "aria-expanded": open, children: _jsx("svg", { width: "6", height: "6", viewBox: "0 0 8 8", "aria-hidden": "true", className: cn('transition-transform', open && 'rotate-90'), children: _jsx("path", { d: "M2 1 L6 4 L2 7 Z", fill: "currentColor" }) }) })) : (_jsx("span", { className: "w-3 shrink-0" })), _jsx("span", { className: "w-4 shrink-0 grid place-items-center text-muted-foreground", children: _jsx(TypeIcon, { size: 12 }) }), renaming === el.id ? (_jsx("input", { autoFocus: true, className: "flex-1 min-w-0 h-5 bg-transparent border border-primary/50 rounded px-1 text-[11px] outline-none", defaultValue: el.name ?? '', onClick: (e) => e.stopPropagation(), onBlur: (e) => {
104
+ if (el.id) {
105
+ actions.updateElement(el.id, {
106
+ name: e.target.value || undefined,
107
+ });
108
+ }
109
+ setRenaming(null);
110
+ }, onKeyDown: (e) => {
111
+ if (e.key === 'Enter')
112
+ e.target.blur();
113
+ if (e.key === 'Escape')
114
+ setRenaming(null);
115
+ } })) : (_jsx("span", { className: "flex-1 min-w-0 truncate text-[11px] text-foreground/90", children: el.name ?? el.id ?? el.type })), _jsxs("span", { className: "hidden group-hover/row:flex items-center gap-0.5", children: [depth === 0 && (_jsxs(_Fragment, { children: [_jsx(RowBtn, { label: "Raise (swap paint order)", disabled: index === 0, onClick: () => swapPaint(el, siblings[index - 1]), children: _jsx(ChevronUp, { size: 12 }) }), _jsx(RowBtn, { label: "Lower (swap paint order)", disabled: index === siblings.length - 1, onClick: () => swapPaint(el, siblings[index + 1]), children: _jsx(ChevronDown, { size: 12 }) })] })), isGroup && (_jsx(RowBtn, { label: isIdentityGroup(el)
116
+ ? 'Ungroup'
117
+ : 'Ungroup disabled — this group transforms its children (ungrouping would move pixels)', disabled: !isIdentityGroup(el), onClick: () => ungroup(el), children: _jsx(Ungroup, { size: 12 }) }))] }), _jsx("button", { type: "button", className: cn('w-5 shrink-0 grid place-items-center', hidden
118
+ ? 'text-foreground'
119
+ : 'text-muted-foreground hover:text-foreground'), title: hidden ? 'Show (writes visible)' : 'Hide (writes visible: false)', onClick: (e) => {
120
+ e.stopPropagation();
121
+ if (el.id) {
122
+ actions.updateElement(el.id, {
123
+ visible: hidden ? undefined : false,
124
+ });
125
+ }
126
+ }, children: hidden ? _jsx(EyeOff, { size: 14 }) : _jsx(Eye, { size: 14 }) })] }), open &&
127
+ children.map((child, ci) => renderRow(child, depth + 1, children, ci))] }, id));
128
+ };
129
+ return (_jsxs("div", { className: "flex flex-col h-full overflow-y-auto", children: [_jsxs("div", { className: "flex items-center justify-between h-7 px-2 border-b border-border shrink-0", children: [_jsxs("span", { className: "text-[10px] text-muted-foreground", children: [source.elements.length, " elements"] }), _jsxs("button", { type: "button", className: "h-5 px-1.5 rounded inline-flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground hover:bg-card transition disabled:opacity-30", disabled: !canGroup, title: "Group selection (coordinate-identity wrapper)", onClick: groupSelection, children: [_jsx(Group, { size: 11 }), " Group"] })] }), top.map((el, i) => renderRow(el, 0, top, i))] }));
130
+ }
131
+ function RowBtn({ label, disabled, onClick, children, }) {
132
+ return (_jsx("button", { type: "button", className: "w-4 h-4 grid place-items-center text-[8px] text-muted-foreground/60 hover:text-foreground disabled:opacity-20", title: label, disabled: disabled, onClick: (e) => {
133
+ e.stopPropagation();
134
+ onClick();
135
+ }, children: children }));
136
+ }
137
+ //# sourceMappingURL=LayersTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LayersTree.js","sourceRoot":"","sources":["../../src/panels/LayersTree.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type LeftRailTabId = 'assets' | 'layers' | 'source';
2
+ export declare function LeftRail({ onActiveTabChange, }: {
3
+ /** Fires on tab switches — the shell auto-widens for Source. */
4
+ onActiveTabChange?: (tab: LeftRailTabId) => void;
5
+ }): import("react").JSX.Element | null;
6
+ //# sourceMappingURL=LeftRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeftRail.d.ts","sourceRoot":"","sources":["../../src/panels/LeftRail.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAG3D,wBAAgB,QAAQ,CAAC,EACvB,iBAAiB,GAClB,EAAE;IACD,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CAClD,sCAkDA"}
@@ -0,0 +1,35 @@
1
+ // Left panel — tabbed Assets / Layers / Source per the design refs
2
+ // (Source ruled in by Ian 2026-06-11: the B10 JSON pane lives here as
3
+ // a third tab rather than a separate dock). B1 shipped the frame; the
4
+ // bin (B9) is still pending, the tree (B8) and JSON pane (B10) are in.
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { useState } from 'react';
8
+ import { useConfiguration } from '../configuration.js';
9
+ import { cn } from '../lib/utils.js';
10
+ import { AssetsPanel } from './AssetsPanel.js';
11
+ import { LayersTree } from './LayersTree.js';
12
+ import { SourcePanel } from './SourcePanel.js';
13
+ export function LeftRail({ onActiveTabChange, }) {
14
+ const { configuration } = useConfiguration();
15
+ const tabs = [];
16
+ if (configuration.views.assets)
17
+ tabs.push({ id: 'assets', label: 'Assets' });
18
+ if (configuration.views.layers)
19
+ tabs.push({ id: 'layers', label: 'Layers' });
20
+ if (configuration.views.json)
21
+ tabs.push({ id: 'source', label: 'Source' });
22
+ const [active, setActive] = useState(tabs[0]?.id ?? 'assets');
23
+ if (tabs.length === 0)
24
+ return null;
25
+ const current = tabs.some((t) => t.id === active) ? active : tabs[0].id;
26
+ return (_jsxs("div", { className: "flex flex-col h-full bg-background", children: [_jsx("div", { className: "flex items-center gap-3 h-9 px-3 border-b border-border shrink-0", children: tabs.map((t) => (_jsx("button", { type: "button", onClick: () => {
27
+ setActive(t.id);
28
+ onActiveTabChange?.(t.id);
29
+ }, className: cn('text-[11px] font-medium transition-colors', current === t.id
30
+ ? 'text-foreground'
31
+ : 'text-muted-foreground hover:text-foreground'), children: t.label }, t.id))) }), _jsx("div", { className: cn('flex-1 min-h-0',
32
+ // CodeMirror owns its own scroller; the other tabs scroll here.
33
+ current === 'source' ? 'overflow-hidden' : 'overflow-y-auto'), children: current === 'source' ? (_jsx(SourcePanel, {})) : current === 'layers' ? (_jsx(LayersTree, {})) : (_jsx(AssetsPanel, {})) })] }));
34
+ }
35
+ //# sourceMappingURL=LeftRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeftRail.js","sourceRoot":"","sources":["../../src/panels/LeftRail.tsx"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AAEvE,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAK/C,MAAM,UAAU,QAAQ,CAAC,EACvB,iBAAiB,GAIlB;IACC,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAwC,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,QAAQ,CAAC,CAAC;IACrE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;IAEzE,OAAO,CACL,eAAK,SAAS,EAAC,oCAAoC,aACjD,cAAK,SAAS,EAAC,kEAAkE,YAC9E,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,iBAEE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE;wBACZ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAChB,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5B,CAAC,EACD,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,OAAO,KAAK,CAAC,CAAC,EAAE;wBACd,CAAC,CAAC,iBAAiB;wBACnB,CAAC,CAAC,6CAA6C,CAClD,YAEA,CAAC,CAAC,KAAK,IAbH,CAAC,CAAC,EAAE,CAcF,CACV,CAAC,GACE,EACN,cACE,SAAS,EAAE,EAAE,CACX,gBAAgB;gBAChB,gEAAgE;gBAChE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAC7D,YAEA,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CACtB,KAAC,WAAW,KAAG,CAChB,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CACzB,KAAC,UAAU,KAAG,CACf,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,KAAG,CAChB,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function SourcePanel(): import("react").JSX.Element;
2
+ //# sourceMappingURL=SourcePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourcePanel.d.ts","sourceRoot":"","sources":["../../src/panels/SourcePanel.tsx"],"names":[],"mappings":"AAgSA,wBAAgB,WAAW,gCAyP1B"}