@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.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/dist/Editor.d.ts +3 -0
- package/dist/Editor.d.ts.map +1 -0
- package/dist/Editor.js +73 -0
- package/dist/Editor.js.map +1 -0
- package/dist/ExportDialog.d.ts +12 -0
- package/dist/ExportDialog.d.ts.map +1 -0
- package/dist/ExportDialog.js +30 -0
- package/dist/ExportDialog.js.map +1 -0
- package/dist/MotionPathOverlay.d.ts +5 -0
- package/dist/MotionPathOverlay.d.ts.map +1 -0
- package/dist/MotionPathOverlay.js +156 -0
- package/dist/MotionPathOverlay.js.map +1 -0
- package/dist/PerfHud.d.ts +2 -0
- package/dist/PerfHud.d.ts.map +1 -0
- package/dist/PerfHud.js +85 -0
- package/dist/PerfHud.js.map +1 -0
- package/dist/Stage.d.ts +2 -0
- package/dist/Stage.d.ts.map +1 -0
- package/dist/Stage.js +406 -0
- package/dist/Stage.js.map +1 -0
- package/dist/StageOverlay.d.ts +7 -0
- package/dist/StageOverlay.d.ts.map +1 -0
- package/dist/StageOverlay.js +508 -0
- package/dist/StageOverlay.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +103 -0
- package/dist/commands.js.map +1 -0
- package/dist/configuration.d.ts +9 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +21 -0
- package/dist/configuration.js.map +1 -0
- package/dist/controls/AnimationsStack.d.ts +8 -0
- package/dist/controls/AnimationsStack.d.ts.map +1 -0
- package/dist/controls/AnimationsStack.js +188 -0
- package/dist/controls/AnimationsStack.js.map +1 -0
- package/dist/controls/CameraControl.d.ts +19 -0
- package/dist/controls/CameraControl.d.ts.map +1 -0
- package/dist/controls/CameraControl.js +47 -0
- package/dist/controls/CameraControl.js.map +1 -0
- package/dist/controls/CaptionLengthControl.d.ts +5 -0
- package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
- package/dist/controls/CaptionLengthControl.js +11 -0
- package/dist/controls/CaptionLengthControl.js.map +1 -0
- package/dist/controls/CaptionTranscribe.d.ts +2 -0
- package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
- package/dist/controls/CaptionTranscribe.js +95 -0
- package/dist/controls/CaptionTranscribe.js.map +1 -0
- package/dist/controls/ColorPicker.d.ts +17 -0
- package/dist/controls/ColorPicker.d.ts.map +1 -0
- package/dist/controls/ColorPicker.js +354 -0
- package/dist/controls/ColorPicker.js.map +1 -0
- package/dist/controls/ControlRenderer.d.ts +20 -0
- package/dist/controls/ControlRenderer.d.ts.map +1 -0
- package/dist/controls/ControlRenderer.js +106 -0
- package/dist/controls/ControlRenderer.js.map +1 -0
- package/dist/controls/CropControl.d.ts +2 -0
- package/dist/controls/CropControl.d.ts.map +1 -0
- package/dist/controls/CropControl.js +177 -0
- package/dist/controls/CropControl.js.map +1 -0
- package/dist/controls/EffectsStack.d.ts +8 -0
- package/dist/controls/EffectsStack.d.ts.map +1 -0
- package/dist/controls/EffectsStack.js +89 -0
- package/dist/controls/EffectsStack.js.map +1 -0
- package/dist/controls/GradeControl.d.ts +2 -0
- package/dist/controls/GradeControl.d.ts.map +1 -0
- package/dist/controls/GradeControl.js +120 -0
- package/dist/controls/GradeControl.js.map +1 -0
- package/dist/controls/KeyframeDiamond.d.ts +11 -0
- package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
- package/dist/controls/KeyframeDiamond.js +87 -0
- package/dist/controls/KeyframeDiamond.js.map +1 -0
- package/dist/controls/LightingControls.d.ts +24 -0
- package/dist/controls/LightingControls.d.ts.map +1 -0
- package/dist/controls/LightingControls.js +108 -0
- package/dist/controls/LightingControls.js.map +1 -0
- package/dist/controls/ShapePresetControl.d.ts +4 -0
- package/dist/controls/ShapePresetControl.d.ts.map +1 -0
- package/dist/controls/ShapePresetControl.js +30 -0
- package/dist/controls/ShapePresetControl.js.map +1 -0
- package/dist/controls/ValueField.d.ts +10 -0
- package/dist/controls/ValueField.d.ts.map +1 -0
- package/dist/controls/ValueField.js +158 -0
- package/dist/controls/ValueField.js.map +1 -0
- package/dist/controls/VolumeControl.d.ts +10 -0
- package/dist/controls/VolumeControl.d.ts.map +1 -0
- package/dist/controls/VolumeControl.js +75 -0
- package/dist/controls/VolumeControl.js.map +1 -0
- package/dist/controls/compound.d.ts +46 -0
- package/dist/controls/compound.d.ts.map +1 -0
- package/dist/controls/compound.js +160 -0
- package/dist/controls/compound.js.map +1 -0
- package/dist/controls/layout.d.ts +38 -0
- package/dist/controls/layout.d.ts.map +1 -0
- package/dist/controls/layout.js +162 -0
- package/dist/controls/layout.js.map +1 -0
- package/dist/controls/primitives.d.ts +83 -0
- package/dist/controls/primitives.d.ts.map +1 -0
- package/dist/controls/primitives.js +194 -0
- package/dist/controls/primitives.js.map +1 -0
- package/dist/controls/transcribe.worker.d.ts +2 -0
- package/dist/controls/transcribe.worker.d.ts.map +1 -0
- package/dist/controls/transcribe.worker.js +22 -0
- package/dist/controls/transcribe.worker.js.map +1 -0
- package/dist/frame/AddElementBar.d.ts +2 -0
- package/dist/frame/AddElementBar.d.ts.map +1 -0
- package/dist/frame/AddElementBar.js +103 -0
- package/dist/frame/AddElementBar.js.map +1 -0
- package/dist/frame/Breadcrumbs.d.ts +2 -0
- package/dist/frame/Breadcrumbs.d.ts.map +1 -0
- package/dist/frame/Breadcrumbs.js +32 -0
- package/dist/frame/Breadcrumbs.js.map +1 -0
- package/dist/frame/GroupFlash.d.ts +2 -0
- package/dist/frame/GroupFlash.d.ts.map +1 -0
- package/dist/frame/GroupFlash.js +65 -0
- package/dist/frame/GroupFlash.js.map +1 -0
- package/dist/frame/Resizable.d.ts +12 -0
- package/dist/frame/Resizable.d.ts.map +1 -0
- package/dist/frame/Resizable.js +37 -0
- package/dist/frame/Resizable.js.map +1 -0
- package/dist/frame/Section.d.ts +23 -0
- package/dist/frame/Section.d.ts.map +1 -0
- package/dist/frame/Section.js +23 -0
- package/dist/frame/Section.js.map +1 -0
- package/dist/frame/ZoomControl.d.ts +9 -0
- package/dist/frame/ZoomControl.d.ts.map +1 -0
- package/dist/frame/ZoomControl.js +15 -0
- package/dist/frame/ZoomControl.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/camera-gizmo.d.ts +15 -0
- package/dist/lib/camera-gizmo.d.ts.map +1 -0
- package/dist/lib/camera-gizmo.js +57 -0
- package/dist/lib/camera-gizmo.js.map +1 -0
- package/dist/lib/camera-tool.d.ts +43 -0
- package/dist/lib/camera-tool.d.ts.map +1 -0
- package/dist/lib/camera-tool.js +80 -0
- package/dist/lib/camera-tool.js.map +1 -0
- package/dist/lib/caption-segments.d.ts +17 -0
- package/dist/lib/caption-segments.d.ts.map +1 -0
- package/dist/lib/caption-segments.js +50 -0
- package/dist/lib/caption-segments.js.map +1 -0
- package/dist/lib/group.d.ts +12 -0
- package/dist/lib/group.d.ts.map +1 -0
- package/dist/lib/group.js +61 -0
- package/dist/lib/group.js.map +1 -0
- package/dist/lib/keyframes.d.ts +29 -0
- package/dist/lib/keyframes.d.ts.map +1 -0
- package/dist/lib/keyframes.js +92 -0
- package/dist/lib/keyframes.js.map +1 -0
- package/dist/lib/sfx-preview.d.ts +18 -0
- package/dist/lib/sfx-preview.d.ts.map +1 -0
- package/dist/lib/sfx-preview.js +74 -0
- package/dist/lib/sfx-preview.js.map +1 -0
- package/dist/lib/shape-presets.d.ts +35 -0
- package/dist/lib/shape-presets.d.ts.map +1 -0
- package/dist/lib/shape-presets.js +81 -0
- package/dist/lib/shape-presets.js.map +1 -0
- package/dist/lib/ungroup.d.ts +12 -0
- package/dist/lib/ungroup.d.ts.map +1 -0
- package/dist/lib/ungroup.js +40 -0
- package/dist/lib/ungroup.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/panels/AssetsPanel.d.ts +2 -0
- package/dist/panels/AssetsPanel.d.ts.map +1 -0
- package/dist/panels/AssetsPanel.js +108 -0
- package/dist/panels/AssetsPanel.js.map +1 -0
- package/dist/panels/InspectorPanel.d.ts +2 -0
- package/dist/panels/InspectorPanel.d.ts.map +1 -0
- package/dist/panels/InspectorPanel.js +286 -0
- package/dist/panels/InspectorPanel.js.map +1 -0
- package/dist/panels/InterpolationPanel.d.ts +2 -0
- package/dist/panels/InterpolationPanel.d.ts.map +1 -0
- package/dist/panels/InterpolationPanel.js +226 -0
- package/dist/panels/InterpolationPanel.js.map +1 -0
- package/dist/panels/LayersTree.d.ts +4 -0
- package/dist/panels/LayersTree.d.ts.map +1 -0
- package/dist/panels/LayersTree.js +137 -0
- package/dist/panels/LayersTree.js.map +1 -0
- package/dist/panels/LeftRail.d.ts +6 -0
- package/dist/panels/LeftRail.d.ts.map +1 -0
- package/dist/panels/LeftRail.js +35 -0
- package/dist/panels/LeftRail.js.map +1 -0
- package/dist/panels/SourcePanel.d.ts +2 -0
- package/dist/panels/SourcePanel.d.ts.map +1 -0
- package/dist/panels/SourcePanel.js +470 -0
- package/dist/panels/SourcePanel.js.map +1 -0
- package/dist/panels/TimelinePanel.d.ts +11 -0
- package/dist/panels/TimelinePanel.d.ts.map +1 -0
- package/dist/panels/TimelinePanel.js +98 -0
- package/dist/panels/TimelinePanel.js.map +1 -0
- package/dist/panels/assets/SfxBrowser.d.ts +2 -0
- package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
- package/dist/panels/assets/SfxBrowser.js +49 -0
- package/dist/panels/assets/SfxBrowser.js.map +1 -0
- package/dist/panels/assets/use-assets.d.ts +11 -0
- package/dist/panels/assets/use-assets.d.ts.map +1 -0
- package/dist/panels/assets/use-assets.js +84 -0
- package/dist/panels/assets/use-assets.js.map +1 -0
- package/dist/panels/assets/use-sfx.d.ts +6 -0
- package/dist/panels/assets/use-sfx.d.ts.map +1 -0
- package/dist/panels/assets/use-sfx.js +47 -0
- package/dist/panels/assets/use-sfx.js.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.js +1536 -0
- package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
- package/dist/panels/timeline/Clip.d.ts +37 -0
- package/dist/panels/timeline/Clip.d.ts.map +1 -0
- package/dist/panels/timeline/Clip.js +176 -0
- package/dist/panels/timeline/Clip.js.map +1 -0
- package/dist/panels/timeline/CurveEditor.d.ts +2 -0
- package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
- package/dist/panels/timeline/CurveEditor.js +233 -0
- package/dist/panels/timeline/CurveEditor.js.map +1 -0
- package/dist/panels/timeline/MixerRail.d.ts +7 -0
- package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
- package/dist/panels/timeline/MixerRail.js +295 -0
- package/dist/panels/timeline/MixerRail.js.map +1 -0
- package/dist/panels/timeline/Waveform.d.ts +11 -0
- package/dist/panels/timeline/Waveform.d.ts.map +1 -0
- package/dist/panels/timeline/Waveform.js +63 -0
- package/dist/panels/timeline/Waveform.js.map +1 -0
- package/dist/panels/timeline/clip-style.d.ts +10 -0
- package/dist/panels/timeline/clip-style.d.ts.map +1 -0
- package/dist/panels/timeline/clip-style.js +20 -0
- package/dist/panels/timeline/clip-style.js.map +1 -0
- package/dist/panels/timeline/filmstrip.d.ts +7 -0
- package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
- package/dist/panels/timeline/filmstrip.js +135 -0
- package/dist/panels/timeline/filmstrip.js.map +1 -0
- package/dist/panels/timeline/timeline-layout.d.ts +65 -0
- package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
- package/dist/panels/timeline/timeline-layout.js +118 -0
- package/dist/panels/timeline/timeline-layout.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
- package/src/styles.css +185 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightingControls.d.ts","sourceRoot":"","sources":["../../src/controls/LightingControls.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAuD7E,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAqEA;AAID,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA4EA;AAID,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAwCA;AAID,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAClE,+BAqGA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Material / Lights / Environment controls (LIGHTING-PLAN P1.4, §4.8).
|
|
2
|
+
// Custom controls for the per-element `material` field and the Source
|
|
3
|
+
// scope's `lights` (array) and `environment` (gradient) — registered in
|
|
4
|
+
// ControlRenderer, surfaced via the registry overrides. Each edits its
|
|
5
|
+
// whole nested value and writes it back through the patch path.
|
|
6
|
+
//
|
|
7
|
+
// Scalar fields are animatable via inline Keyframe[] arrays (the runtime
|
|
8
|
+
// resolves them). When a field already holds a curve we show an
|
|
9
|
+
// "animated" chip instead of a number well, so this static panel never
|
|
10
|
+
// clobbers a keyframed value.
|
|
11
|
+
'use client';
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { cn } from '../lib/utils.js';
|
|
14
|
+
import { ColorControl, NumberControl, SelectControl, TextControl } from './primitives.js';
|
|
15
|
+
const BOX = 'flex flex-col w-full border border-border/60 rounded px-2 py-1.5 gap-0.5';
|
|
16
|
+
const ROW = 'flex items-center gap-2 h-8';
|
|
17
|
+
const LABEL = 'text-[10px] text-muted-foreground w-16 shrink-0 truncate';
|
|
18
|
+
const ADD_BTN = 'h-5 px-1.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-card transition';
|
|
19
|
+
const SUBHEAD = 'text-[10px] font-medium text-muted-foreground/80 mt-1 mb-0.5';
|
|
20
|
+
function isAnimated(v) {
|
|
21
|
+
return Array.isArray(v);
|
|
22
|
+
}
|
|
23
|
+
/** Number well, or an "animated" chip when the field holds a curve. */
|
|
24
|
+
function NumOrAnim({ value, fallback, onChange, scrub, ...rest }) {
|
|
25
|
+
if (isAnimated(value)) {
|
|
26
|
+
return (_jsx("span", { className: "flex-1 min-w-0 h-7 grid place-items-center rounded bg-field text-[10px] text-muted-foreground/70", children: "animated" }));
|
|
27
|
+
}
|
|
28
|
+
return (_jsx(NumberControl, { value: typeof value === 'number' ? value : fallback, fluid: true, stepper: true, onChange: onChange, onScrubStart: scrub.onScrubStart, onScrubEnd: scrub.onScrubEnd, ...rest }));
|
|
29
|
+
}
|
|
30
|
+
// ─── Material (per element) ────────────────────────────────────────────────
|
|
31
|
+
export function MaterialControl({ value, onChange, onScrubStart, onScrubEnd, }) {
|
|
32
|
+
const scrub = { onScrubStart, onScrubEnd };
|
|
33
|
+
if (!value) {
|
|
34
|
+
return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ roughness: 0.4, metalness: 0.6, reflectivity: 1 }, false), children: "+ Add material" }));
|
|
35
|
+
}
|
|
36
|
+
const set = (patch, live) => onChange({ ...value, ...patch }, live);
|
|
37
|
+
return (_jsxs("div", { className: BOX, children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Roughness" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.roughness, fallback: 0.4, min: 0.02, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ roughness: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Metalness" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.metalness, fallback: 0.6, min: 0, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ metalness: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Reflectivity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.reflectivity, fallback: 1, min: 0, max: 2, step: 0.05, scrub: scrub, onChange: (v, live) => set({ reflectivity: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Emissive" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.emissive, fallback: 0, min: 0, max: 1, step: 0.05, scrub: scrub, onChange: (v, live) => set({ emissive: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Normal map" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(TextControl, { value: value.normal_map ?? '', fluid: true, onChange: (v) => set({ normal_map: v || undefined }, false) }) })] }), value.normal_map ? (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Nrm scale" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.normal_scale, fallback: 1, min: 0, max: 4, step: 0.05, scrub: scrub, onChange: (v, live) => set({ normal_scale: v }, live) }) })] })) : null, _jsx("div", { className: "flex pt-0.5", children: _jsx("button", { type: "button", className: cn(ADD_BTN, 'ml-auto'), onClick: () => onChange(undefined, false), children: "Remove" }) })] }));
|
|
38
|
+
}
|
|
39
|
+
// ─── Lights (Source) ───────────────────────────────────────────────────────
|
|
40
|
+
export function LightsControl({ value, onChange, onScrubStart, onScrubEnd, }) {
|
|
41
|
+
const scrub = { onScrubStart, onScrubEnd };
|
|
42
|
+
const lights = value ?? [];
|
|
43
|
+
const setAt = (i, patch, live) => {
|
|
44
|
+
const next = lights.map((l, j) => (j === i ? { ...l, ...patch } : l));
|
|
45
|
+
onChange(next, live);
|
|
46
|
+
};
|
|
47
|
+
const removeAt = (i) => {
|
|
48
|
+
const next = lights.filter((_, j) => j !== i);
|
|
49
|
+
onChange(next.length ? next : undefined, false);
|
|
50
|
+
};
|
|
51
|
+
const add = (light) => onChange([...lights, light], false);
|
|
52
|
+
return (_jsxs("div", { className: BOX, children: [lights.map((l, i) => (_jsxs("div", { className: "border-b border-border/40 last:border-0 pb-1 mb-1 last:pb-0 last:mb-0", children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Type" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(SelectControl, { value: l.type, options: ['ambient', 'directional'], fluid: true, onChange: (v) => {
|
|
53
|
+
// Switching type: keep color/intensity, drop/add the
|
|
54
|
+
// directional-only angle fields with sane defaults.
|
|
55
|
+
if (v === 'directional')
|
|
56
|
+
setAt(i, { type: 'directional', azimuth: 30, elevation: 45 }, false);
|
|
57
|
+
else
|
|
58
|
+
setAt(i, { type: 'ambient' }, false);
|
|
59
|
+
} }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => removeAt(i), children: "Remove" })] })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Color" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(ColorControl, { value: l.color ?? '#ffffff', fluid: true, onChange: (v) => setAt(i, { color: v }, false) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Intensity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: l.intensity, fallback: 1, min: 0, max: 10, step: 0.1, scrub: scrub, onChange: (v, live) => setAt(i, { intensity: v }, live) }) })] }), l.type === 'directional' && (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Direction" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-2 gap-2", children: [_jsx(NumOrAnim, { value: l.azimuth, fallback: 30, suffix: "\u00B0", prefix: "Az", scrub: scrub, onChange: (v, live) => setAt(i, { azimuth: v }, live) }), _jsx(NumOrAnim, { value: l.elevation, fallback: 45, suffix: "\u00B0", prefix: "El", scrub: scrub, onChange: (v, live) => setAt(i, { elevation: v }, live) })] })] }))] }, i))), _jsxs("div", { className: "flex gap-1 pt-0.5", children: [_jsx("button", { type: "button", className: ADD_BTN, onClick: () => add({ type: 'ambient', color: '#ffffff', intensity: 0.6 }), children: "+ Ambient" }), _jsx("button", { type: "button", className: ADD_BTN, onClick: () => add({ type: 'directional', color: '#ffffff', intensity: 2, azimuth: 30, elevation: 45 }), children: "+ Directional" })] })] }));
|
|
60
|
+
}
|
|
61
|
+
// ─── Bloom (Source) ────────────────────────────────────────────────────────
|
|
62
|
+
export function BloomControl({ value, onChange, onScrubStart, onScrubEnd, }) {
|
|
63
|
+
const scrub = { onScrubStart, onScrubEnd };
|
|
64
|
+
if (!value) {
|
|
65
|
+
return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ threshold: 0.75, intensity: 1, radius: 24 }, false), children: "+ Add bloom" }));
|
|
66
|
+
}
|
|
67
|
+
const set = (patch, live) => onChange({ ...value, ...patch }, live);
|
|
68
|
+
return (_jsxs("div", { className: BOX, children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Threshold" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.threshold, fallback: 0.75, min: 0, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ threshold: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Intensity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.intensity, fallback: 1, min: 0, max: 4, step: 0.05, scrub: scrub, onChange: (v, live) => set({ intensity: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Radius" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(NumOrAnim, { value: value.radius, fallback: 24, min: 1, max: 200, step: 1, scrub: scrub, onChange: (v, live) => set({ radius: v }, live) }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] })] }));
|
|
69
|
+
}
|
|
70
|
+
// ─── Environment (Source) ──────────────────────────────────────────────────
|
|
71
|
+
export function EnvironmentControl({ value, onChange, }) {
|
|
72
|
+
if (!value) {
|
|
73
|
+
return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ type: 'gradient', stops: [
|
|
74
|
+
{ offset: 0, color: '#0a0e16' },
|
|
75
|
+
{ offset: 1, color: '#7fb4ff' },
|
|
76
|
+
] }, false), children: "+ Add environment" }));
|
|
77
|
+
}
|
|
78
|
+
// Type selector — gradient sky vs equirect image. Switching swaps to a
|
|
79
|
+
// sensible default of the other type.
|
|
80
|
+
const typeRow = (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Type" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(SelectControl, { value: value.type, options: ['gradient', 'image'], fluid: true, onChange: (v) => {
|
|
81
|
+
if (v === 'image')
|
|
82
|
+
onChange({ type: 'image', src: '' }, false);
|
|
83
|
+
else
|
|
84
|
+
onChange({ type: 'gradient', stops: [
|
|
85
|
+
{ offset: 0, color: '#0a0e16' }, { offset: 1, color: '#7fb4ff' },
|
|
86
|
+
] }, false);
|
|
87
|
+
} }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] }));
|
|
88
|
+
if (value.type === 'image') {
|
|
89
|
+
return (_jsxs("div", { className: BOX, children: [typeRow, _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Image URL" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(TextControl, { value: value.src ?? '', fluid: true, onChange: (v) => onChange({ type: 'image', src: v }, false) }) })] }), _jsx("div", { className: SUBHEAD, children: "Equirectangular (2:1) \u2014 surfaces mirror it." })] }));
|
|
90
|
+
}
|
|
91
|
+
const stops = value.stops ?? [];
|
|
92
|
+
const setStop = (i, patch) => {
|
|
93
|
+
const next = stops.map((s, j) => (j === i ? { ...s, ...patch } : s));
|
|
94
|
+
onChange({ type: 'gradient', stops: next }, false);
|
|
95
|
+
};
|
|
96
|
+
const removeStop = (i) => {
|
|
97
|
+
if (stops.length <= 2)
|
|
98
|
+
return; // a gradient needs ≥2 stops
|
|
99
|
+
onChange({ type: 'gradient', stops: stops.filter((_, j) => j !== i) }, false);
|
|
100
|
+
};
|
|
101
|
+
const addStop = () => {
|
|
102
|
+
if (stops.length >= 4)
|
|
103
|
+
return; // shader samples up to 4
|
|
104
|
+
onChange({ type: 'gradient', stops: [...stops, { offset: 0.5, color: '#3a4a66' }] }, false);
|
|
105
|
+
};
|
|
106
|
+
return (_jsxs("div", { className: BOX, children: [typeRow, _jsx("div", { className: SUBHEAD, children: "Gradient sky (offset 0 = down, 1 = up)" }), stops.map((s, i) => (_jsxs("div", { className: ROW, children: [_jsx("div", { className: "w-16 shrink-0", children: _jsx(ColorControl, { value: s.color ?? '#ffffff', fluid: true, onChange: (v) => setStop(i, { color: v }) }) }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(NumberControl, { value: typeof s.offset === 'number' ? s.offset : 0, min: 0, max: 1, step: 0.01, fluid: true, stepper: true, onChange: (v) => setStop(i, { offset: v }) }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), disabled: stops.length <= 2, onClick: () => removeStop(i), children: "\u2715" })] })] }, i))), _jsx("div", { className: "flex gap-1 pt-0.5", children: _jsx("button", { type: "button", className: ADD_BTN, disabled: stops.length >= 4, onClick: addStop, children: "+ Stop" }) })] }));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=LightingControls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightingControls.js","sourceRoot":"","sources":["../../src/controls/LightingControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShapePresetControl.d.ts","sourceRoot":"","sources":["../../src/controls/ShapePresetControl.tsx"],"names":[],"mappings":"AAcA,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,+BAqBhE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// ShapePresetControl — the inspector's shape picker. Picking a preset patches
|
|
2
|
+
// the selected element between primitive (rectangle/ellipse) and path form
|
|
3
|
+
// (triangle/star/line/…) in one undoable edit. Geometry lives in
|
|
4
|
+
// lib/shape-presets (shared with the add-bar's Shape dropdown).
|
|
5
|
+
'use client';
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
import { useEditor, useEditorStore } from '@clipkit/editor-core';
|
|
8
|
+
import { SelectControl } from './primitives.js';
|
|
9
|
+
import { SHAPE_PRESETS, presetFields, detectPreset } from '../lib/shape-presets.js';
|
|
10
|
+
const LABELS = SHAPE_PRESETS.map((p) => p.label);
|
|
11
|
+
export function ShapePresetControl({ fluid }) {
|
|
12
|
+
const { updateElement } = useEditor();
|
|
13
|
+
const selId = useEditorStore((s) => s.selection[0]);
|
|
14
|
+
const el = useEditorStore((s) => s.source.elements.find((e) => e.id === selId));
|
|
15
|
+
const color = (typeof el?.fill_color === 'string' && el.fill_color) ||
|
|
16
|
+
(typeof el?.paths?.[0]?.fill === 'string' && el.paths[0].fill) ||
|
|
17
|
+
'#6366f1';
|
|
18
|
+
const currentId = detectPreset(el);
|
|
19
|
+
const currentLabel = SHAPE_PRESETS.find((p) => p.id === currentId)?.label ?? 'Rectangle';
|
|
20
|
+
const onChange = (label) => {
|
|
21
|
+
if (!selId)
|
|
22
|
+
return;
|
|
23
|
+
const p = SHAPE_PRESETS.find((x) => x.label === label);
|
|
24
|
+
if (!p)
|
|
25
|
+
return;
|
|
26
|
+
updateElement(selId, presetFields(p, color));
|
|
27
|
+
};
|
|
28
|
+
return _jsx(SelectControl, { value: currentLabel, options: LABELS, fluid: fluid, onChange: onChange });
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ShapePresetControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShapePresetControl.js","sourceRoot":"","sources":["../../src/controls/ShapePresetControl.tsx"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,iEAAiE;AACjE,gEAAgE;AAEhE,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEpF,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjD,MAAM,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAuB;IAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAA6B,CAAC;IAE5G,MAAM,KAAK,GACT,CAAC,OAAO,EAAE,EAAE,UAAU,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC;QACrD,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC/D,SAAS,CAAC;IAEZ,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC;IAEzF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAqB,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type FieldSpec } from '@clipkit/editor-core';
|
|
2
|
+
export declare function ValueField({ spec, value, elementId, animated, onScrubStart, onScrubEnd, }: {
|
|
3
|
+
spec: FieldSpec;
|
|
4
|
+
value: unknown;
|
|
5
|
+
elementId: string | null;
|
|
6
|
+
animated: boolean;
|
|
7
|
+
onScrubStart?: () => void;
|
|
8
|
+
onScrubEnd?: () => void;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ValueField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueField.d.ts","sourceRoot":"","sources":["../../src/controls/ValueField.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAwBhH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAoLA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// The default knob for an animatable numeric / length property.
|
|
3
|
+
//
|
|
4
|
+
// Layout: [ label ] [ inputinput… unit▾ ] [ ◆ ]
|
|
5
|
+
// └─ the dropdown is PART of the input well (right segment,
|
|
6
|
+
// rounded, looks continuous). It picks the input TYPE:
|
|
7
|
+
// px / % (units) or Expression. NEVER keyframes.
|
|
8
|
+
// The plain label scrubs on drag. The keyframe diamond is its own affordance and
|
|
9
|
+
// shows in value mode (hidden for expressions) — keyframing is the diamond, not a
|
|
10
|
+
// dropdown option.
|
|
11
|
+
import { useRef, useState } from 'react';
|
|
12
|
+
import { createPortal } from 'react-dom';
|
|
13
|
+
import { elementTime, useEditor, useEditorContext, useEditorStore } from '@clipkit/editor-core';
|
|
14
|
+
import { compileExpr } from '@clipkit/runtime';
|
|
15
|
+
import { findElementById, sampleAnimation, setKeyframeValueAt } from '../lib/keyframes.js';
|
|
16
|
+
import { KeyframeDiamond } from './KeyframeDiamond.js';
|
|
17
|
+
import { cn } from '../lib/utils.js';
|
|
18
|
+
const UNITS = ['px', '%']; // the units we actually read in the editor
|
|
19
|
+
const isExprVal = (v) => typeof v === 'object' && v !== null && typeof v.expr === 'string';
|
|
20
|
+
/** Split a length value into number + unit ("50%" → {n:50,u:'%'}, 100 → {n:100,u:'px'}). */
|
|
21
|
+
function splitLen(v) {
|
|
22
|
+
if (typeof v === 'number')
|
|
23
|
+
return { n: v, u: 'px' };
|
|
24
|
+
if (typeof v === 'string') {
|
|
25
|
+
const m = /^(-?\d*\.?\d+)\s*(px|%)?$/.exec(v.trim());
|
|
26
|
+
if (m)
|
|
27
|
+
return { n: parseFloat(m[1]), u: m[2] ?? 'px' };
|
|
28
|
+
const num = parseFloat(v);
|
|
29
|
+
if (Number.isFinite(num))
|
|
30
|
+
return { n: num, u: 'px' };
|
|
31
|
+
}
|
|
32
|
+
return { n: 0, u: 'px' };
|
|
33
|
+
}
|
|
34
|
+
const joinLen = (n, u) => (u === 'px' ? n : `${n}${u}`);
|
|
35
|
+
export function ValueField({ spec, value, elementId, animated, onScrubStart, onScrubEnd, }) {
|
|
36
|
+
const { store } = useEditorContext();
|
|
37
|
+
const actions = useEditor();
|
|
38
|
+
const path = spec.path;
|
|
39
|
+
const hasUnits = spec.control === 'length';
|
|
40
|
+
const isPercent = spec.control === 'percent';
|
|
41
|
+
const isExpr = isExprVal(value);
|
|
42
|
+
// Sampled value at the playhead (when keyframed).
|
|
43
|
+
const sampled = useEditorStore((s) => {
|
|
44
|
+
if (!animated || !elementId)
|
|
45
|
+
return undefined;
|
|
46
|
+
const el = findElementById(s.source.elements, elementId);
|
|
47
|
+
const anim = el?.keyframe_animations?.find((a) => a.property === path);
|
|
48
|
+
if (!el || !anim)
|
|
49
|
+
return undefined;
|
|
50
|
+
const v = sampleAnimation(anim, Math.max(0, s.playback.time - elementTime(el)));
|
|
51
|
+
return Array.isArray(v) ? undefined : v;
|
|
52
|
+
});
|
|
53
|
+
const shown = sampled !== undefined ? sampled : value;
|
|
54
|
+
const curUnit = hasUnits ? splitLen(shown).u : 'px';
|
|
55
|
+
const asNumber = () => typeof shown === 'number' ? shown
|
|
56
|
+
: typeof shown === 'string' ? splitLen(shown).n
|
|
57
|
+
: isExprVal(shown) ? (parseFloat(shown.expr) || 0)
|
|
58
|
+
: 0;
|
|
59
|
+
// ── write the VALUE (keyframe-aware: write the keyframe when animated) ───────
|
|
60
|
+
const writeValue = (v, live) => {
|
|
61
|
+
if (!elementId)
|
|
62
|
+
return;
|
|
63
|
+
if (animated) {
|
|
64
|
+
const st = store.getState();
|
|
65
|
+
const el = findElementById(st.source.elements, elementId);
|
|
66
|
+
const anims = el?.keyframe_animations ?? [];
|
|
67
|
+
const ai = anims.findIndex((a) => a.property === path);
|
|
68
|
+
if (el && ai >= 0) {
|
|
69
|
+
const local = Math.round(Math.max(0, st.playback.time - elementTime(el)) * 1000) / 1000;
|
|
70
|
+
const patch = { keyframe_animations: setKeyframeValueAt(anims, ai, local, v) };
|
|
71
|
+
if (live)
|
|
72
|
+
actions.moveElements([{ id: elementId, patch }], { skipHistory: true });
|
|
73
|
+
else
|
|
74
|
+
actions.updateElement(elementId, patch);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const patch = { [path]: v };
|
|
79
|
+
if (live)
|
|
80
|
+
actions.moveElements([{ id: elementId, patch }], { skipHistory: true });
|
|
81
|
+
else
|
|
82
|
+
actions.updateElement(elementId, patch);
|
|
83
|
+
};
|
|
84
|
+
// ── dropdown: pick the input TYPE (unit, or Expression) ─────────────────────
|
|
85
|
+
const toValue = (unit) => {
|
|
86
|
+
if (!elementId)
|
|
87
|
+
return;
|
|
88
|
+
const num = asNumber();
|
|
89
|
+
actions.updateElement(elementId, { [path]: hasUnits ? joinLen(num, unit) : num });
|
|
90
|
+
};
|
|
91
|
+
const toExpression = () => {
|
|
92
|
+
if (!elementId)
|
|
93
|
+
return;
|
|
94
|
+
const st = store.getState();
|
|
95
|
+
const el = findElementById(st.source.elements, elementId);
|
|
96
|
+
const anims = (el?.keyframe_animations ?? []).filter((a) => a.property !== path);
|
|
97
|
+
actions.updateElement(elementId, { keyframe_animations: anims, [path]: { expr: String(asNumber()) } });
|
|
98
|
+
};
|
|
99
|
+
// ── label scrub (drag the LABEL; number tracks live) ────────────────────────
|
|
100
|
+
const drag = useRef(null);
|
|
101
|
+
const labelScrub = !isExpr ? {
|
|
102
|
+
onPointerDown: (e) => { drag.current = { x: e.clientX, v: asNumber(), on: false }; e.currentTarget.setPointerCapture(e.pointerId); },
|
|
103
|
+
onPointerMove: (e) => {
|
|
104
|
+
const d = drag.current;
|
|
105
|
+
if (!d)
|
|
106
|
+
return;
|
|
107
|
+
const dx = e.clientX - d.x;
|
|
108
|
+
if (!d.on && Math.abs(dx) < 3)
|
|
109
|
+
return;
|
|
110
|
+
if (!d.on) {
|
|
111
|
+
d.on = true;
|
|
112
|
+
onScrubStart?.();
|
|
113
|
+
}
|
|
114
|
+
const step = spec.step ?? 1;
|
|
115
|
+
const next = Math.round((d.v + (dx / 2) * step) / step) * step;
|
|
116
|
+
writeValue(hasUnits ? joinLen(next, curUnit) : next, true);
|
|
117
|
+
},
|
|
118
|
+
onPointerUp: () => { if (drag.current?.on)
|
|
119
|
+
onScrubEnd?.(); drag.current = null; },
|
|
120
|
+
} : {};
|
|
121
|
+
// ── input + dropdown well ────────────────────────────────────────────────────
|
|
122
|
+
const [text, setText] = useState(null);
|
|
123
|
+
const [menu, setMenu] = useState(false);
|
|
124
|
+
const inputCls = 'flex-1 min-w-0 w-full bg-transparent text-[11px] font-mono tabular-nums text-foreground/90 outline-none px-1.5';
|
|
125
|
+
// the dropdown button label: current unit, or "fx" in expression mode
|
|
126
|
+
const token = isExpr ? 'fx' : hasUnits ? curUnit : isPercent ? '%' : '';
|
|
127
|
+
const btnRef = useRef(null);
|
|
128
|
+
const [pos, setPos] = useState(null);
|
|
129
|
+
const openMenu = () => {
|
|
130
|
+
const r = btnRef.current?.getBoundingClientRect();
|
|
131
|
+
if (r)
|
|
132
|
+
setPos({ top: r.bottom + 4, right: Math.max(4, window.innerWidth - r.right) });
|
|
133
|
+
setMenu((m) => !m);
|
|
134
|
+
};
|
|
135
|
+
const dropdown = (_jsxs("div", { className: "shrink-0 self-stretch flex", children: [_jsxs("button", { ref: btnRef, type: "button", onClick: openMenu, className: "flex items-center gap-0.5 pl-1.5 pr-1 border-l border-border/60 text-[10px] text-muted-foreground hover:text-foreground hover:bg-field-hover rounded-r-md transition-colors", title: "px / % / expression", children: [token && _jsx("span", { className: "tabular-nums", children: token }), _jsx("svg", { width: "7", height: "7", viewBox: "0 0 8 8", className: "opacity-60", children: _jsx("path", { d: "M1 2.5 4 5.5 7 2.5", stroke: "currentColor", fill: "none", strokeWidth: "1.2" }) })] }), menu && pos && createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-[60]", onPointerDown: () => setMenu(false) }), _jsxs("div", { className: "fixed z-[61] w-28 rounded-md border border-border bg-popover shadow-md py-1 text-[11px]", style: { top: pos.top, right: pos.right }, children: [(hasUnits ? UNITS : ['value']).map((u) => (_jsx("button", { type: "button", onClick: () => { toValue(u === 'value' ? 'px' : u); setMenu(false); }, className: cn('w-full text-left px-2 py-1 hover:bg-field-hover', !isExpr && (u === 'value' || u === curUnit) && 'text-primary'), children: u === 'value' ? 'Value' : u }, u))), _jsx("div", { className: "my-1 border-t border-border" }), _jsx("button", { type: "button", onClick: () => { toExpression(); setMenu(false); }, className: cn('w-full text-left px-2 py-1 hover:bg-field-hover', isExpr && 'text-primary'), children: "Expression" })] })] }), document.body)] }));
|
|
136
|
+
let well;
|
|
137
|
+
if (isExpr) {
|
|
138
|
+
const exprStr = isExprVal(value) ? value.expr : '';
|
|
139
|
+
const valid = exprStr.trim() === '' || compileExpr(exprStr) !== null;
|
|
140
|
+
well = (_jsxs("div", { className: "h-6 flex items-center bg-field hover:bg-field-hover focus-within:ring-1 focus-within:ring-ring rounded-md transition-colors flex-1 min-w-0", children: [_jsx("span", { className: cn('text-[10px] shrink-0 pl-1.5', valid ? 'text-green-500' : 'text-red-500'), title: valid ? 'valid' : 'parse error', children: "\u25CF" }), _jsx("input", { className: cn(inputCls, 'text-left'), spellCheck: false, placeholder: "960 + sin(t*PI)*40", value: text ?? exprStr, onChange: (e) => { setText(e.target.value); if (elementId)
|
|
141
|
+
actions.moveElements([{ id: elementId, patch: { [path]: { expr: e.target.value } } }], { skipHistory: true }); }, onBlur: (e) => { if (elementId)
|
|
142
|
+
actions.updateElement(elementId, { [path]: { expr: e.target.value } }); setText(null); } }), dropdown] }));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const { n } = splitLen(shown);
|
|
146
|
+
const display = text ?? String(Math.round(n * 1000) / 1000);
|
|
147
|
+
well = (_jsxs("div", { className: "h-6 flex items-center bg-field hover:bg-field-hover focus-within:ring-1 focus-within:ring-ring rounded-md transition-colors flex-1 min-w-0", children: [_jsx("input", { className: cn(inputCls, 'text-right'), inputMode: "decimal", value: display, onChange: (e) => { if (/^-?\d*\.?\d*$/.test(e.target.value))
|
|
148
|
+
setText(e.target.value); }, onFocus: () => setText(String(n)), onBlur: (e) => { const p = parseFloat(e.target.value); if (Number.isFinite(p))
|
|
149
|
+
writeValue(hasUnits ? joinLen(p, curUnit) : p, false); setText(null); }, onKeyDown: (e) => { if (e.key === 'Enter')
|
|
150
|
+
e.target.blur(); if (e.key === 'Escape') {
|
|
151
|
+
setText(null);
|
|
152
|
+
e.target.blur();
|
|
153
|
+
} } }), dropdown] }));
|
|
154
|
+
}
|
|
155
|
+
// ── row: label · input-with-dropdown · keyframe diamond (value mode only) ────
|
|
156
|
+
return (_jsxs("div", { className: "flex items-center gap-2 h-8", children: [_jsx("span", { className: cn('w-16 shrink-0 text-[11px] text-muted-foreground truncate select-none', !isExpr && 'cursor-ew-resize'), ...labelScrub, title: !isExpr ? 'drag to scrub' : undefined, children: spec.label }), _jsxs("div", { className: "flex-1 flex items-center gap-1 min-w-0", children: [well, !isExpr && spec.animatable && elementId ? (_jsx(KeyframeDiamond, { elementId: elementId, property: path, animated: animated, current: shown })) : null] })] }));
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=ValueField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueField.js","sourceRoot":"","sources":["../../src/controls/ValueField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ScrubHandlers } from './primitives.js';
|
|
2
|
+
export declare function VolumeControl({ elementId, value, commit, trailing, ...scrub }: {
|
|
3
|
+
elementId: string;
|
|
4
|
+
/** The element's `volume` (number %, Keyframe[], or unauthored). */
|
|
5
|
+
value: unknown;
|
|
6
|
+
commit: (patch: Record<string, unknown>, live: boolean) => void;
|
|
7
|
+
/** The ◇ keyframe diamond from the inspector. */
|
|
8
|
+
trailing?: React.ReactNode;
|
|
9
|
+
} & ScrubHandlers): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=VolumeControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeControl.d.ts","sourceRoot":"","sources":["../../src/controls/VolumeControl.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMnF,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACT,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,iDAAiD;IACjD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,aAAa,+BAiHhB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Volume block (Ian's reference HTML, M/S dropped by ruling — they're
|
|
2
|
+
// preview-only and don't map to the document; the mixer rail keeps
|
|
3
|
+
// them) — the audio section's `volume` composite: a fluid number well
|
|
4
|
+
// in the left half-column, a rotary KNOB in the right (270° sweep,
|
|
5
|
+
// drag to scrub on the one-undo-step contract), and live peak meters
|
|
6
|
+
// underneath (engine.getAudioLevels() on rAF, painted out-of-band).
|
|
7
|
+
'use client';
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
9
|
+
import { useEffect, useRef } from 'react';
|
|
10
|
+
import { useEditorContext } from '@clipkit/editor-core';
|
|
11
|
+
import { cn } from '../lib/utils.js';
|
|
12
|
+
import { KeyframedChip, NumberControl } from './primitives.js';
|
|
13
|
+
const SWEEP = 270; // degrees of knob travel for 0..VOL_MAX
|
|
14
|
+
const VOL_MAX = 200; // unity (100% = 0 dB) is not the ceiling — allow boost
|
|
15
|
+
const C = 2 * Math.PI * 13; // arc circumference (r=13 in a 28px dial)
|
|
16
|
+
export function VolumeControl({ elementId, value, commit, trailing, ...scrub }) {
|
|
17
|
+
const animated = Array.isArray(value);
|
|
18
|
+
const volume = typeof value === 'number' ? value : 100;
|
|
19
|
+
// ── Knob drag (vertical scrub, standard one-undo-step contract) ──
|
|
20
|
+
const dragRef = useRef(null);
|
|
21
|
+
const onKnobDown = (e) => {
|
|
22
|
+
if (animated)
|
|
23
|
+
return;
|
|
24
|
+
dragRef.current = { startY: e.clientY, startV: volume, scrubbed: false };
|
|
25
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
26
|
+
};
|
|
27
|
+
const onKnobMove = (e) => {
|
|
28
|
+
const d = dragRef.current;
|
|
29
|
+
if (!d)
|
|
30
|
+
return;
|
|
31
|
+
const dy = d.startY - e.clientY;
|
|
32
|
+
if (!d.scrubbed && Math.abs(dy) < 3)
|
|
33
|
+
return;
|
|
34
|
+
if (!d.scrubbed) {
|
|
35
|
+
d.scrubbed = true;
|
|
36
|
+
scrub.onScrubStart?.();
|
|
37
|
+
}
|
|
38
|
+
const next = Math.round(Math.min(VOL_MAX, Math.max(0, d.startV + dy * 0.6)));
|
|
39
|
+
commit({ volume: next }, true);
|
|
40
|
+
};
|
|
41
|
+
const onKnobUp = () => {
|
|
42
|
+
const d = dragRef.current;
|
|
43
|
+
dragRef.current = null;
|
|
44
|
+
if (d?.scrubbed)
|
|
45
|
+
scrub.onScrubEnd?.();
|
|
46
|
+
};
|
|
47
|
+
const angle = -SWEEP / 2 + (volume / VOL_MAX) * SWEEP;
|
|
48
|
+
const dash = (volume / VOL_MAX) * (SWEEP / 360) * C;
|
|
49
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-start gap-2 py-1", children: [_jsx("span", { className: "w-16 shrink-0 text-[11px] text-muted-foreground pt-1.5 truncate", children: "Volume" }), _jsxs("div", { className: "flex-1 grid grid-cols-2 gap-2 min-w-0 items-stretch", children: [_jsx("div", { className: "flex flex-col gap-2 min-w-0", children: animated ? (_jsxs("div", { className: "flex items-center gap-1 h-6", children: [_jsx(KeyframedChip, {}), trailing] })) : (_jsx(NumberControl, { value: volume, min: 0, max: VOL_MAX, step: 1, suffix: "%", fluid: true, trailing: trailing, onChange: (v, live) => commit({ volume: v }, live), ...scrub })) }), _jsxs("div", { className: cn('relative h-14 bg-field rounded-md min-w-0 select-none touch-none', animated ? 'opacity-50' : 'cursor-ns-resize'), onPointerDown: onKnobDown, onPointerMove: onKnobMove, onPointerUp: onKnobUp, title: animated ? 'Volume is keyframed' : `Volume ${volume}%`, role: "slider", "aria-valuemin": 0, "aria-valuemax": VOL_MAX, "aria-valuenow": volume, "aria-label": "Volume knob", children: [_jsxs("div", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] bg-secondary rounded-full", children: [_jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 28 28", className: "absolute inset-0", style: { color: 'var(--color-playhead)' }, children: [_jsx("circle", { cx: "14", cy: "14", r: "13", fill: "none", stroke: "var(--color-border)", strokeWidth: "2", strokeDasharray: `${(SWEEP / 360) * C} ${C}`, transform: "rotate(135 14 14)" }), _jsx("circle", { cx: "14", cy: "14", r: "13", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeDasharray: `${dash} ${C}`, transform: "rotate(135 14 14)" })] }), _jsx("div", { className: "absolute inset-[3px] rounded-full bg-secondary" })] }), _jsx("div", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-9 h-9 pointer-events-none", children: _jsx("div", { className: "w-full h-full", style: { transform: `rotate(${angle}deg)` }, children: _jsx("div", { className: "absolute left-1/2 top-[9px] -translate-x-1/2 w-[2px] h-[7px] rounded-full bg-foreground" }) }) })] })] })] }), _jsxs("div", { className: "flex items-center gap-2 h-5", children: [_jsx("span", { className: "w-16 shrink-0" }), _jsxs("div", { className: "flex-1 min-w-0 flex flex-col gap-1", children: [_jsx(MeterBar, { elementId: elementId }), _jsx(MeterBar, { elementId: elementId, lag: true })] })] })] }));
|
|
50
|
+
}
|
|
51
|
+
/** A 2px zoned bar (green→amber→red) with a cover revealing the level. */
|
|
52
|
+
function MeterBar({ elementId, lag }) {
|
|
53
|
+
const { engine } = useEditorContext();
|
|
54
|
+
const coverRef = useRef(null);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const el = coverRef.current;
|
|
57
|
+
if (!el || !engine)
|
|
58
|
+
return;
|
|
59
|
+
let raf = 0;
|
|
60
|
+
let smoothed = 0;
|
|
61
|
+
const paint = () => {
|
|
62
|
+
const levels = engine.getAudioLevels();
|
|
63
|
+
const peak = levels.elements[elementId];
|
|
64
|
+
const v = peak ? Math.min(1, Math.max(peak.l, peak.r)) : 0;
|
|
65
|
+
// The second bar trails slightly so the pair reads stereo-ish.
|
|
66
|
+
smoothed = lag ? smoothed * 0.6 + v * 0.4 : v;
|
|
67
|
+
el.style.width = `${Math.round((1 - smoothed) * 100)}%`;
|
|
68
|
+
raf = requestAnimationFrame(paint);
|
|
69
|
+
};
|
|
70
|
+
paint();
|
|
71
|
+
return () => cancelAnimationFrame(raf);
|
|
72
|
+
}, [engine, elementId, lag]);
|
|
73
|
+
return (_jsxs("div", { className: "relative h-[2px] bg-field rounded-sm overflow-hidden", children: [_jsx("div", { className: "absolute inset-y-0 left-0", style: { width: '60%', background: 'oklch(0.7 0.17 150)' } }), _jsx("div", { className: "absolute inset-y-0", style: { left: '60%', width: '20%', background: 'oklch(0.78 0.16 80)' } }), _jsx("div", { className: "absolute inset-y-0 right-0", style: { width: '20%', background: 'var(--color-destructive)' } }), _jsx("div", { ref: coverRef, className: "absolute inset-y-0 right-0 bg-field", style: { width: '100%' } })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=VolumeControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VolumeControl.js","sourceRoot":"","sources":["../../src/controls/VolumeControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { CaptionWord, LinearGradient, RadialGradient, TextMask, TextSpan } from '@clipkit/protocol';
|
|
2
|
+
type Gradient = LinearGradient | RadialGradient;
|
|
3
|
+
export declare function GradientControl({ value, onChange, onScrubStart, onScrubEnd, }: {
|
|
4
|
+
value: Gradient | undefined;
|
|
5
|
+
onChange: (next: Gradient | undefined, live?: boolean) => void;
|
|
6
|
+
onScrubStart?: () => void;
|
|
7
|
+
onScrubEnd?: () => void;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
export declare function BoxShadowControl({ value, onChange, }: {
|
|
10
|
+
value: {
|
|
11
|
+
color: string;
|
|
12
|
+
offset_x?: number;
|
|
13
|
+
offset_y?: number;
|
|
14
|
+
blur?: number;
|
|
15
|
+
} | undefined;
|
|
16
|
+
onChange: (next: typeof value) => void;
|
|
17
|
+
}): import("react").JSX.Element;
|
|
18
|
+
export declare function TextBackgroundControl({ color, radius, padding, commit, }: {
|
|
19
|
+
color: string | undefined;
|
|
20
|
+
radius: number | undefined;
|
|
21
|
+
padding: number | [number, number] | undefined;
|
|
22
|
+
commit: (patch: Record<string, unknown>, live: boolean) => void;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
24
|
+
export declare function TextMaskControl({ value, onChange, }: {
|
|
25
|
+
value: TextMask | undefined;
|
|
26
|
+
onChange: (next: TextMask | undefined) => void;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
export declare function CaptionWordsControl({ value, onChange, }: {
|
|
29
|
+
value: CaptionWord[] | undefined;
|
|
30
|
+
onChange: (next: CaptionWord[]) => void;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
export declare function TextSpansControl({ value, onChange, onScrubStart, onScrubEnd, }: {
|
|
33
|
+
value: TextSpan[] | undefined;
|
|
34
|
+
onChange: (next: TextSpan[] | undefined, live?: boolean) => void;
|
|
35
|
+
onScrubStart?: () => void;
|
|
36
|
+
onScrubEnd?: () => void;
|
|
37
|
+
}): import("react").JSX.Element;
|
|
38
|
+
export declare function TextareaControl({ value, onChange, onScrubStart, onScrubEnd, }: {
|
|
39
|
+
value: string;
|
|
40
|
+
/** `live` true while typing (skip history); commit happens on blur. */
|
|
41
|
+
onChange: (next: string, live: boolean) => void;
|
|
42
|
+
onScrubStart?: () => void;
|
|
43
|
+
onScrubEnd?: () => void;
|
|
44
|
+
}): import("react").JSX.Element;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=compound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../src/controls/compound.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAE3B,KAAK,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAuChD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA+KA;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1F,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC;CACxC,+BAyDA;AAID,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACjE,+BAkDA;AAID,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;CAChD,+BAuDA;AAID,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CACzC,+BAiDA;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAqDA;AAID,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA2BA"}
|