@pixerate/editor-svelte 0.171.1 → 0.172.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/dist/animation-editor/ShotInspector.svelte +5 -1
- package/dist/animation-editor/ShotLayers.svelte +177 -0
- package/dist/animation-editor/ShotLayers.svelte.d.ts +10 -0
- package/dist/animation-editor/ShotTransition.svelte +94 -0
- package/dist/animation-editor/ShotTransition.svelte.d.ts +10 -0
- package/dist/animation-editor/index.d.ts +6 -0
- package/dist/animation-editor/index.js +2 -0
- package/package.json +2 -2
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { describeMotionElements, freshShotId, motionCameraFramed, motionCueChoices, motionCueFromKey, motionCueKey, type AnimationEditorController, type MotionEdit } from '@pixerate/editor/animation-editor';
|
|
3
3
|
import { animationEditorStateOf } from './createAnimationEditor.svelte.js';
|
|
4
4
|
import ShotCameraMoves from './ShotCameraMoves.svelte';
|
|
5
|
+
import ShotLayers from './ShotLayers.svelte';
|
|
6
|
+
import ShotTransition from './ShotTransition.svelte';
|
|
5
7
|
|
|
6
8
|
interface Props {
|
|
7
9
|
controller: AnimationEditorController;
|
|
@@ -67,7 +69,7 @@
|
|
|
67
69
|
|
|
68
70
|
<!--
|
|
69
71
|
The selected shot: label, hold, speed, the node the camera frames, the cue it starts on (a
|
|
70
|
-
beat or a narration word)
|
|
72
|
+
beat or a narration word), its camera moves (ShotCameraMoves), its transition in (ShotTransition) and its layers (ShotLayers). Also adds, moves and deletes shots. Every change is one undo step.
|
|
71
73
|
-->
|
|
72
74
|
<div class="flex flex-col gap-1.5 text-xs {className}" data-shot-inspector="">
|
|
73
75
|
<div class="flex items-center gap-1">
|
|
@@ -118,6 +120,8 @@
|
|
|
118
120
|
</div>
|
|
119
121
|
{/if}
|
|
120
122
|
{#if current}<ShotCameraMoves {controller} shot={current.id} />{/if}
|
|
123
|
+
{#if current}<ShotTransition {controller} shot={current.id} />{/if}
|
|
124
|
+
{#if current}<ShotLayers {controller} shot={current.id} />{/if}
|
|
121
125
|
{#if message}
|
|
122
126
|
<p class="text-red-500" role="alert" data-edit-error="">{message}</p>
|
|
123
127
|
{/if}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { AnimationEditorController, MotionLayerSubject, MotionShotLayer, MotionShotLayerChanges, MotionShotLayerResult } from '@pixerate/editor/animation-editor';
|
|
3
|
+
import { EFFECT_LAYER_ROLES, effectLayerOffered, type EffectLayerRole, type EffectSummary } from '@pixerate/editor/effects';
|
|
4
|
+
import EffectParameters from '../effects/EffectParameters.svelte';
|
|
5
|
+
import { effectDescriptionOf } from '../effects/effects.svelte.js';
|
|
6
|
+
import { animationEditorStateOf } from './createAnimationEditor.svelte.js';
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
controller: AnimationEditorController;
|
|
10
|
+
/** The shot whose layers to edit. */
|
|
11
|
+
shot: string;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { controller, shot, class: className = '' }: Props = $props();
|
|
16
|
+
const view = animationEditorStateOf(() => controller);
|
|
17
|
+
const editor = $derived(view.current);
|
|
18
|
+
const current = $derived(editor.scene.shots.find((s) => s.id === shot));
|
|
19
|
+
const layers = $derived(current?.layers ?? []);
|
|
20
|
+
const input = 'w-full min-w-0 rounded border border-border bg-transparent px-1 py-0.5 text-xs';
|
|
21
|
+
const button = 'rounded border border-border px-1 text-[11px] disabled:opacity-40';
|
|
22
|
+
|
|
23
|
+
// The provider's layer effects, loaded when the provider changes.
|
|
24
|
+
let effects = $state<EffectSummary[]>([]);
|
|
25
|
+
$effect(() => {
|
|
26
|
+
const provider = editor.effectsProvider;
|
|
27
|
+
let live = true;
|
|
28
|
+
if (!provider) {
|
|
29
|
+
effects = [];
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
void Promise.resolve(provider.list()).then(
|
|
33
|
+
(all) => live && (effects = all.filter(effectLayerOffered)),
|
|
34
|
+
() => live && (effects = [])
|
|
35
|
+
);
|
|
36
|
+
return () => (live = false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
let open = $state<string | null>(null);
|
|
40
|
+
let message = $state<string | null>(null);
|
|
41
|
+
const openLayer = $derived(layers.find((l) => l.id === open));
|
|
42
|
+
const description = effectDescriptionOf(() => controller.effectsProvider, () => openLayer?.effect);
|
|
43
|
+
|
|
44
|
+
function report(r: Promise<MotionShotLayerResult>) {
|
|
45
|
+
void r.then((x) => {
|
|
46
|
+
message = x.ok ? null : x.error;
|
|
47
|
+
if (x.ok && x.layer) open = x.layer.id;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function add(value: string) {
|
|
51
|
+
if (!value) return;
|
|
52
|
+
if (value === ':picture') return report(controller.addShotLayer(shot, { subject: { slot: 'picture' } }));
|
|
53
|
+
if (value === ':words') return report(controller.addShotLayer(shot, { subject: { text: 'Title' }, role: 'overlay' }));
|
|
54
|
+
const e = effects.find((x) => x.id === value);
|
|
55
|
+
report(controller.addShotLayer(shot, { effect: value, ...(e?.uses.includes('filter') ? { subject: { slot: 'picture' } } : {}) }));
|
|
56
|
+
}
|
|
57
|
+
function set(layer: MotionShotLayer, changes: MotionShotLayerChanges, merge?: string | null) {
|
|
58
|
+
report(controller.updateShotLayer(layer.id, changes, { merge: merge ?? undefined }));
|
|
59
|
+
}
|
|
60
|
+
function number(layer: MotionShotLayer, raw: string, field: 'opacity' | 'fade', max: number) {
|
|
61
|
+
if (raw.trim() === '') return set(layer, { [field]: null });
|
|
62
|
+
const n = Number(raw);
|
|
63
|
+
if (Number.isFinite(n) && n >= 0 && n <= max) set(layer, { [field]: n });
|
|
64
|
+
}
|
|
65
|
+
function subjectKind(s: MotionLayerSubject | undefined): string {
|
|
66
|
+
return !s ? '' : 'slot' in s ? 'slot' : 'text' in s ? 'text' : 'image' in s ? 'image' : 'svg';
|
|
67
|
+
}
|
|
68
|
+
function subjectValue(s: MotionLayerSubject | undefined): string {
|
|
69
|
+
return !s ? '' : 'slot' in s ? s.slot : 'text' in s ? s.text : 'image' in s ? s.image : s.svg;
|
|
70
|
+
}
|
|
71
|
+
function subjectLabel(s: MotionLayerSubject | undefined): string {
|
|
72
|
+
if (!s) return '';
|
|
73
|
+
if ('slot' in s) return `slot ${s.slot}`;
|
|
74
|
+
if ('text' in s) return `“${s.text}”`;
|
|
75
|
+
return 'image' in s ? 'picture' : 'SVG';
|
|
76
|
+
}
|
|
77
|
+
function setKind(layer: MotionShotLayer, k: string) {
|
|
78
|
+
const v = subjectValue(layer.subject);
|
|
79
|
+
set(layer, { subject: k === '' ? null : k === 'slot' ? { slot: v || 'picture' } : k === 'text' ? { text: v || 'Title' } : k === 'image' ? { image: v || 'https://' } : { svg: v || '<svg xmlns="http://www.w3.org/2000/svg"/>' } });
|
|
80
|
+
}
|
|
81
|
+
function untilKey(layer: MotionShotLayer): string {
|
|
82
|
+
return typeof layer.until === 'object' ? String(layer.until.shots) : layer.until === undefined ? '1' : 'ms';
|
|
83
|
+
}
|
|
84
|
+
function reset(layer: MotionShotLayer, k: string) {
|
|
85
|
+
const { [k]: _gone, ...rest } = layer.values ?? {};
|
|
86
|
+
set(layer, { values: Object.keys(rest).length ? rest : null, preset: null });
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<!--
|
|
91
|
+
A shot's layers: provider effects (backgrounds, filters, overlays, titles) and bare pictures or
|
|
92
|
+
words shown with the shot, bottom to top, with their role, subject, opacity, fade, length and
|
|
93
|
+
controls. Add one from the provider's layer effects or as a picture or words; restack or remove
|
|
94
|
+
it. Every change is one undo step (a slider drag is one).
|
|
95
|
+
-->
|
|
96
|
+
{#if current && (layers.length || effects.length || !editor.readOnly)}
|
|
97
|
+
<div class="grid grid-cols-[6.5rem_1fr] items-center gap-x-2 gap-y-1 {className}" data-shot-layers="">
|
|
98
|
+
<span class="text-muted-foreground">Layers</span>
|
|
99
|
+
<select class={input} aria-label="Add a layer" disabled={editor.readOnly} value="" onchange={(e) => add(e.currentTarget.value)}>
|
|
100
|
+
<option value="">add a layer…</option>
|
|
101
|
+
<option value=":picture">Picture</option>
|
|
102
|
+
<option value=":words">Words</option>
|
|
103
|
+
{#each effects as e (e.id)}
|
|
104
|
+
<option value={e.id}>{e.name} ({e.uses.filter((u) => u !== 'interactive').join(', ')})</option>
|
|
105
|
+
{/each}
|
|
106
|
+
</select>
|
|
107
|
+
{#each [...layers.keys()].reverse() as i (layers[i].id)}
|
|
108
|
+
{@const layer = layers[i]}
|
|
109
|
+
<button type="button" class="truncate text-left text-xs" aria-expanded={open === layer.id} onclick={() => (open = open === layer.id ? null : layer.id)} data-shot-layer={layer.id}>
|
|
110
|
+
{layer.name ?? layer.effect ?? 'Picture'}
|
|
111
|
+
</button>
|
|
112
|
+
<div class="flex items-center gap-1">
|
|
113
|
+
<span class="flex-1 truncate text-[10px] text-muted-foreground">{layer.role ?? (layer.rect ? 'subject' : 'background')} {subjectLabel(layer.subject)}</span>
|
|
114
|
+
<button type="button" class={button} aria-label="Move {layer.id} up" disabled={editor.readOnly || i === layers.length - 1} onclick={() => report(controller.moveShotLayer(layer.id, i + 1))}>↑</button>
|
|
115
|
+
<button type="button" class={button} aria-label="Move {layer.id} down" disabled={editor.readOnly || i === 0} onclick={() => report(controller.moveShotLayer(layer.id, i - 1))}>↓</button>
|
|
116
|
+
<button type="button" class={button} aria-label="Remove {layer.id}" disabled={editor.readOnly} onclick={() => report(controller.removeShotLayer(layer.id))}>×</button>
|
|
117
|
+
</div>
|
|
118
|
+
{#if open === layer.id}
|
|
119
|
+
<div class="col-span-2 grid grid-cols-[4.5rem_1fr] items-center gap-x-2 gap-y-1 border-l border-border pl-2" data-shot-layer-controls={layer.id}>
|
|
120
|
+
<span class="text-muted-foreground">Role</span>
|
|
121
|
+
<select class={input} aria-label="Layer role" disabled={editor.readOnly} value={layer.role ?? ''} onchange={(e) => set(layer, { role: (e.currentTarget.value || null) as EffectLayerRole | null })}>
|
|
122
|
+
<option value="">{layer.rect ? 'subject' : 'background'} (default)</option>
|
|
123
|
+
{#each EFFECT_LAYER_ROLES as r (r)}<option value={r}>{r}</option>{/each}
|
|
124
|
+
</select>
|
|
125
|
+
<span class="text-muted-foreground">Subject</span>
|
|
126
|
+
<div class="flex gap-1">
|
|
127
|
+
<select class="{input} w-20 flex-none" aria-label="Subject kind" disabled={editor.readOnly} value={subjectKind(layer.subject)} onchange={(e) => setKind(layer, e.currentTarget.value)}>
|
|
128
|
+
<option value="">none</option>
|
|
129
|
+
<option value="image">picture</option>
|
|
130
|
+
<option value="svg">SVG</option>
|
|
131
|
+
<option value="text">words</option>
|
|
132
|
+
<option value="slot">slot</option>
|
|
133
|
+
</select>
|
|
134
|
+
{#if layer.subject}
|
|
135
|
+
{@const kind = subjectKind(layer.subject)}
|
|
136
|
+
<input
|
|
137
|
+
class={input}
|
|
138
|
+
aria-label={kind === 'image' ? 'Picture URL' : kind === 'svg' ? 'SVG markup' : kind === 'text' ? 'Words' : 'Slot name'}
|
|
139
|
+
disabled={editor.readOnly}
|
|
140
|
+
value={subjectValue(layer.subject)}
|
|
141
|
+
onchange={(e) => e.currentTarget.value.trim() && set(layer, { subject: { [kind]: e.currentTarget.value } as MotionLayerSubject })}
|
|
142
|
+
/>
|
|
143
|
+
{/if}
|
|
144
|
+
</div>
|
|
145
|
+
<span class="text-muted-foreground">Opacity</span>
|
|
146
|
+
<input class={input} type="number" min="0" max="1" step="0.05" aria-label="Layer opacity" placeholder="1" disabled={editor.readOnly} value={layer.opacity ?? ''} onchange={(e) => number(layer, e.currentTarget.value, 'opacity', 1)} />
|
|
147
|
+
<span class="text-muted-foreground">Fade</span>
|
|
148
|
+
<input class={input} type="number" min="0" step="50" aria-label="Layer fade (ms)" placeholder="0" disabled={editor.readOnly} value={layer.fade ?? ''} onchange={(e) => number(layer, e.currentTarget.value, 'fade', 60000)} />
|
|
149
|
+
<span class="text-muted-foreground">Until</span>
|
|
150
|
+
<select class={input} aria-label="Layer lasts until" disabled={editor.readOnly} value={untilKey(layer)} onchange={(e) => set(layer, { until: e.currentTarget.value === '1' ? null : { shots: Number(e.currentTarget.value) } })}>
|
|
151
|
+
<option value="1">the next shot</option>
|
|
152
|
+
<option value="2">the shot after next</option>
|
|
153
|
+
<option value="3">three shots on</option>
|
|
154
|
+
{#if typeof layer.until === 'number'}<option value="ms">{layer.until} ms</option>{/if}
|
|
155
|
+
</select>
|
|
156
|
+
{#if description.error}
|
|
157
|
+
<p class="col-span-2 text-[11px] text-amber-500">{description.error}</p>
|
|
158
|
+
{:else if description.description && !editor.readOnly}
|
|
159
|
+
<div class="col-span-2">
|
|
160
|
+
<EffectParameters
|
|
161
|
+
description={description.description}
|
|
162
|
+
values={layer.values ?? {}}
|
|
163
|
+
onchange={(k, v, g) => set(layer, { values: { ...(layer.values ?? {}), [k]: v as never }, preset: null }, g)}
|
|
164
|
+
onreset={(k) => reset(layer, k)}
|
|
165
|
+
onpresetname={(name) => set(layer, { preset: name, values: null })}
|
|
166
|
+
/>
|
|
167
|
+
</div>
|
|
168
|
+
{/if}
|
|
169
|
+
</div>
|
|
170
|
+
{/if}
|
|
171
|
+
{/each}
|
|
172
|
+
{#if !editor.effectsProvider && layers.some((l) => l.effect)}
|
|
173
|
+
<p class="col-span-2 text-[10px] text-muted-foreground">No effects provider is set, so effect layers are not drawn.</p>
|
|
174
|
+
{/if}
|
|
175
|
+
{#if message}<p class="col-span-2 text-[11px] text-destructive" role="alert">{message}</p>{/if}
|
|
176
|
+
</div>
|
|
177
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnimationEditorController } from '@pixerate/editor/animation-editor';
|
|
2
|
+
interface Props {
|
|
3
|
+
controller: AnimationEditorController;
|
|
4
|
+
/** The shot whose layers to edit. */
|
|
5
|
+
shot: string;
|
|
6
|
+
class?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const ShotLayers: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type ShotLayers = ReturnType<typeof ShotLayers>;
|
|
10
|
+
export default ShotLayers;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { AnimationEditorController, MotionShotLayerResult } from '@pixerate/editor/animation-editor';
|
|
3
|
+
import type { EffectSummary } from '@pixerate/editor/effects';
|
|
4
|
+
import EffectParameters from '../effects/EffectParameters.svelte';
|
|
5
|
+
import { effectDescriptionOf } from '../effects/effects.svelte.js';
|
|
6
|
+
import { animationEditorStateOf } from './createAnimationEditor.svelte.js';
|
|
7
|
+
|
|
8
|
+
interface Props {
|
|
9
|
+
controller: AnimationEditorController;
|
|
10
|
+
/** The shot the transition leads into (not the first shot). */
|
|
11
|
+
shot: string;
|
|
12
|
+
class?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let { controller, shot, class: className = '' }: Props = $props();
|
|
16
|
+
const view = animationEditorStateOf(() => controller);
|
|
17
|
+
const editor = $derived(view.current);
|
|
18
|
+
const index = $derived(editor.scene.shots.findIndex((s) => s.id === shot));
|
|
19
|
+
const transition = $derived(editor.scene.shots[index]?.transition);
|
|
20
|
+
const input = 'w-full min-w-0 rounded border border-border bg-transparent px-1 py-0.5 text-xs';
|
|
21
|
+
|
|
22
|
+
// The provider's transitions, loaded when the provider changes.
|
|
23
|
+
let transitions = $state<EffectSummary[]>([]);
|
|
24
|
+
$effect(() => {
|
|
25
|
+
const provider = editor.effectsProvider;
|
|
26
|
+
let live = true;
|
|
27
|
+
if (!provider) {
|
|
28
|
+
transitions = [];
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
void Promise.resolve(provider.list()).then(
|
|
32
|
+
(all) => live && (transitions = all.filter((e) => e.uses.includes('transition') && e.kind !== 'camera')),
|
|
33
|
+
() => live && (transitions = [])
|
|
34
|
+
);
|
|
35
|
+
return () => (live = false);
|
|
36
|
+
});
|
|
37
|
+
const known = $derived(transitions.some((t) => t.id === transition?.effect));
|
|
38
|
+
const loaded = effectDescriptionOf(() => controller.effectsProvider, () => transition?.effect);
|
|
39
|
+
let message = $state<string | null>(null);
|
|
40
|
+
|
|
41
|
+
function report(r: Promise<MotionShotLayerResult> | MotionShotLayerResult) {
|
|
42
|
+
void Promise.resolve(r).then((x) => (message = x.ok ? null : x.error));
|
|
43
|
+
}
|
|
44
|
+
function pick(id: string) {
|
|
45
|
+
report(id ? controller.setShotTransition(shot, { effect: id, ...(transition?.ms ? { ms: transition.ms } : {}) }) : controller.clearShotTransition(shot));
|
|
46
|
+
}
|
|
47
|
+
function set(changes: { ms?: number; values?: Record<string, unknown> | null; preset?: string | null }, merge?: string | null) {
|
|
48
|
+
const next: Record<string, unknown> = { ...transition, ...changes };
|
|
49
|
+
for (const k of Object.keys(next)) if (next[k] === null) delete next[k];
|
|
50
|
+
report(controller.setShotTransition(shot, next as never, { merge: merge ?? undefined }));
|
|
51
|
+
}
|
|
52
|
+
function length(raw: string) {
|
|
53
|
+
if (Number(raw) > 0) set({ ms: Number(raw) });
|
|
54
|
+
else message = 'Length is a number of ms above 0.';
|
|
55
|
+
}
|
|
56
|
+
function reset(k: string) {
|
|
57
|
+
const { [k]: _gone, ...rest } = transition?.values ?? {};
|
|
58
|
+
set({ values: Object.keys(rest).length ? rest : null, preset: null });
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<!--
|
|
63
|
+
The provider transition into a shot from the one before: pick it, set its length, preset and
|
|
64
|
+
controls, or clear it. Hidden on the first shot. Every change is one undo step.
|
|
65
|
+
-->
|
|
66
|
+
{#if index > 0 && (transitions.length || transition)}
|
|
67
|
+
<div class="grid grid-cols-[6.5rem_1fr] items-center gap-x-2 gap-y-1 {className}" data-shot-transition="">
|
|
68
|
+
<span class="text-muted-foreground">Transition in</span>
|
|
69
|
+
<select class={input} aria-label="Transition in" disabled={editor.readOnly} value={transition?.effect ?? ''} onchange={(e) => pick(e.currentTarget.value)}>
|
|
70
|
+
<option value="">cut</option>
|
|
71
|
+
{#if transition && !known}<option value={transition.effect}>{transition.name ?? transition.effect} (not in the provider)</option>{/if}
|
|
72
|
+
{#each transitions as t (t.id)}<option value={t.id}>{t.name}</option>{/each}
|
|
73
|
+
</select>
|
|
74
|
+
{#if transition && known && !editor.readOnly}
|
|
75
|
+
<div class="col-span-2 flex flex-col gap-1 border-l border-border pl-2" data-shot-transition-controls="">
|
|
76
|
+
<div class="flex items-center gap-1">
|
|
77
|
+
<span class="w-16 text-muted-foreground">Length</span>
|
|
78
|
+
<input class={input} type="number" min="1" step="50" aria-label="Transition length" value={transition.ms ?? ''} onchange={(e) => length(e.currentTarget.value)} />
|
|
79
|
+
<span class="text-[10px] text-muted-foreground">ms</span>
|
|
80
|
+
</div>
|
|
81
|
+
{#if loaded.description}
|
|
82
|
+
<EffectParameters
|
|
83
|
+
description={loaded.description}
|
|
84
|
+
values={transition.values ?? {}}
|
|
85
|
+
onchange={(k, v, g) => set({ values: { ...(transition.values ?? {}), [k]: v }, preset: null }, g)}
|
|
86
|
+
onreset={(k) => reset(k)}
|
|
87
|
+
onpresetname={(name) => set({ preset: name, values: null })}
|
|
88
|
+
/>
|
|
89
|
+
{/if}
|
|
90
|
+
</div>
|
|
91
|
+
{/if}
|
|
92
|
+
{#if message}<p class="col-span-2 text-[11px] text-destructive" role="alert">{message}</p>{/if}
|
|
93
|
+
</div>
|
|
94
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnimationEditorController } from '@pixerate/editor/animation-editor';
|
|
2
|
+
interface Props {
|
|
3
|
+
controller: AnimationEditorController;
|
|
4
|
+
/** The shot the transition leads into (not the first shot). */
|
|
5
|
+
shot: string;
|
|
6
|
+
class?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const ShotTransition: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type ShotTransition = ReturnType<typeof ShotTransition>;
|
|
10
|
+
export default ShotTransition;
|
|
@@ -8,6 +8,8 @@ import type CommandInspectorComponent from "./CommandInspector.svelte";
|
|
|
8
8
|
import type EasePickerComponent from "./EasePicker.svelte";
|
|
9
9
|
import type ShotInspectorComponent from "./ShotInspector.svelte";
|
|
10
10
|
import type ShotCameraMovesComponent from "./ShotCameraMoves.svelte";
|
|
11
|
+
import type ShotLayersComponent from "./ShotLayers.svelte";
|
|
12
|
+
import type ShotTransitionComponent from "./ShotTransition.svelte";
|
|
11
13
|
import type SceneSettingsComponent from "./SceneSettings.svelte";
|
|
12
14
|
import type AnimationRecordPanelComponent from "./AnimationRecordPanel.svelte";
|
|
13
15
|
export { default as AnimationEditor } from "./AnimationEditor.svelte";
|
|
@@ -19,6 +21,8 @@ export { default as CommandInspector } from "./CommandInspector.svelte";
|
|
|
19
21
|
export { default as EasePicker } from "./EasePicker.svelte";
|
|
20
22
|
export { default as ShotInspector } from "./ShotInspector.svelte";
|
|
21
23
|
export { default as ShotCameraMoves } from "./ShotCameraMoves.svelte";
|
|
24
|
+
export { default as ShotLayers } from "./ShotLayers.svelte";
|
|
25
|
+
export { default as ShotTransition } from "./ShotTransition.svelte";
|
|
22
26
|
export { default as SceneSettings } from "./SceneSettings.svelte";
|
|
23
27
|
export { default as AnimationEffectsPanel } from "./AnimationEffectsPanel.svelte";
|
|
24
28
|
export { default as AnimationRecordPanel } from "./AnimationRecordPanel.svelte";
|
|
@@ -32,5 +36,7 @@ export type CommandInspectorProps = ComponentProps<typeof CommandInspectorCompon
|
|
|
32
36
|
export type EasePickerProps = ComponentProps<typeof EasePickerComponent>;
|
|
33
37
|
export type ShotInspectorProps = ComponentProps<typeof ShotInspectorComponent>;
|
|
34
38
|
export type ShotCameraMovesProps = ComponentProps<typeof ShotCameraMovesComponent>;
|
|
39
|
+
export type ShotLayersProps = ComponentProps<typeof ShotLayersComponent>;
|
|
40
|
+
export type ShotTransitionProps = ComponentProps<typeof ShotTransitionComponent>;
|
|
35
41
|
export type SceneSettingsProps = ComponentProps<typeof SceneSettingsComponent>;
|
|
36
42
|
export type AnimationRecordPanelProps = ComponentProps<typeof AnimationRecordPanelComponent>;
|
|
@@ -7,6 +7,8 @@ export { default as CommandInspector } from "./CommandInspector.svelte";
|
|
|
7
7
|
export { default as EasePicker } from "./EasePicker.svelte";
|
|
8
8
|
export { default as ShotInspector } from "./ShotInspector.svelte";
|
|
9
9
|
export { default as ShotCameraMoves } from "./ShotCameraMoves.svelte";
|
|
10
|
+
export { default as ShotLayers } from "./ShotLayers.svelte";
|
|
11
|
+
export { default as ShotTransition } from "./ShotTransition.svelte";
|
|
10
12
|
export { default as SceneSettings } from "./SceneSettings.svelte";
|
|
11
13
|
export { default as AnimationEffectsPanel } from "./AnimationEffectsPanel.svelte";
|
|
12
14
|
export { default as AnimationRecordPanel } from "./AnimationRecordPanel.svelte";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixerate/editor-svelte",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.172.0",
|
|
4
4
|
"description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
|
|
5
5
|
"author": "Pixerate",
|
|
6
6
|
"license": "MIT",
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
"**/*.css"
|
|
166
166
|
],
|
|
167
167
|
"dependencies": {
|
|
168
|
-
"@pixerate/editor": "0.
|
|
168
|
+
"@pixerate/editor": "0.233.0"
|
|
169
169
|
},
|
|
170
170
|
"peerDependencies": {
|
|
171
171
|
"@dagrejs/dagre": "^1.1.4",
|