@editframe/create 0.43.0 → 0.45.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/README.md +11 -0
- package/dist/index.js +16 -28
- package/dist/index.js.map +1 -1
- package/dist/skills/editframe-brand-video-generator/README.md +155 -0
- package/dist/skills/editframe-brand-video-generator/SKILL.md +207 -0
- package/dist/skills/editframe-brand-video-generator/references/brand-examples.md +178 -0
- package/dist/skills/editframe-brand-video-generator/references/color-psychology.md +227 -0
- package/dist/skills/editframe-brand-video-generator/references/composition-patterns.md +383 -0
- package/dist/skills/editframe-brand-video-generator/references/editing.md +66 -0
- package/dist/skills/editframe-brand-video-generator/references/emotional-arcs.md +496 -0
- package/dist/skills/editframe-brand-video-generator/references/genre-selection.md +135 -0
- package/dist/skills/editframe-brand-video-generator/references/transition-styles.md +611 -0
- package/dist/skills/editframe-brand-video-generator/references/typography-personalities.md +326 -0
- package/dist/skills/editframe-brand-video-generator/references/video-archetypes.md +86 -0
- package/dist/skills/editframe-brand-video-generator/references/video-fundamentals.md +169 -0
- package/dist/skills/editframe-brand-video-generator/references/visual-metaphors.md +50 -0
- package/dist/skills/editframe-composition/SKILL.md +169 -0
- package/dist/skills/editframe-composition/references/audio.md +483 -0
- package/dist/skills/editframe-composition/references/captions.md +844 -0
- package/dist/skills/editframe-composition/references/composition-model.md +73 -0
- package/dist/skills/editframe-composition/references/configuration.md +403 -0
- package/dist/skills/editframe-composition/references/css-parts.md +105 -0
- package/dist/skills/editframe-composition/references/css-variables.md +640 -0
- package/dist/skills/editframe-composition/references/entry-points.md +810 -0
- package/dist/skills/editframe-composition/references/events.md +499 -0
- package/dist/skills/editframe-composition/references/getting-started.md +259 -0
- package/dist/skills/editframe-composition/references/hooks.md +234 -0
- package/dist/skills/editframe-composition/references/image.md +241 -0
- package/dist/skills/editframe-composition/references/r3f.md +580 -0
- package/dist/skills/editframe-composition/references/render-api.md +484 -0
- package/dist/skills/editframe-composition/references/render-strategies.md +119 -0
- package/dist/skills/editframe-composition/references/render-to-video.md +1101 -0
- package/dist/skills/editframe-composition/references/scripting.md +606 -0
- package/dist/skills/editframe-composition/references/sequencing.md +116 -0
- package/dist/skills/editframe-composition/references/server-rendering.md +753 -0
- package/dist/skills/editframe-composition/references/surface.md +329 -0
- package/dist/skills/editframe-composition/references/text.md +627 -0
- package/dist/skills/editframe-composition/references/time-model.md +99 -0
- package/dist/skills/editframe-composition/references/timegroup-modes.md +102 -0
- package/dist/skills/editframe-composition/references/timegroup.md +457 -0
- package/dist/skills/editframe-composition/references/timeline-root.md +398 -0
- package/dist/skills/editframe-composition/references/transcription.md +47 -0
- package/dist/skills/editframe-composition/references/transitions.md +608 -0
- package/dist/skills/editframe-composition/references/use-media-info.md +357 -0
- package/dist/skills/editframe-composition/references/video.md +506 -0
- package/dist/skills/editframe-composition/references/waveform.md +327 -0
- package/dist/skills/editframe-editor-gui/SKILL.md +152 -0
- package/dist/skills/editframe-editor-gui/references/active-root-temporal.md +657 -0
- package/dist/skills/editframe-editor-gui/references/canvas.md +947 -0
- package/dist/skills/editframe-editor-gui/references/controls.md +366 -0
- package/dist/skills/editframe-editor-gui/references/dial.md +756 -0
- package/dist/skills/editframe-editor-gui/references/editor-toolkit.md +587 -0
- package/dist/skills/editframe-editor-gui/references/filmstrip.md +460 -0
- package/dist/skills/editframe-editor-gui/references/fit-scale.md +772 -0
- package/dist/skills/editframe-editor-gui/references/focus-overlay.md +561 -0
- package/dist/skills/editframe-editor-gui/references/hierarchy.md +544 -0
- package/dist/skills/editframe-editor-gui/references/overlay-item.md +634 -0
- package/dist/skills/editframe-editor-gui/references/overlay-layer.md +429 -0
- package/dist/skills/editframe-editor-gui/references/pan-zoom.md +568 -0
- package/dist/skills/editframe-editor-gui/references/pause.md +397 -0
- package/dist/skills/editframe-editor-gui/references/play.md +370 -0
- package/dist/skills/editframe-editor-gui/references/preview.md +391 -0
- package/dist/skills/editframe-editor-gui/references/resizable-box.md +749 -0
- package/dist/skills/editframe-editor-gui/references/scrubber.md +588 -0
- package/dist/skills/editframe-editor-gui/references/thumbnail-strip.md +566 -0
- package/dist/skills/editframe-editor-gui/references/time-display.md +492 -0
- package/dist/skills/editframe-editor-gui/references/timeline-ruler.md +489 -0
- package/dist/skills/editframe-editor-gui/references/timeline.md +604 -0
- package/dist/skills/editframe-editor-gui/references/toggle-loop.md +618 -0
- package/dist/skills/editframe-editor-gui/references/toggle-play.md +526 -0
- package/dist/skills/editframe-editor-gui/references/transform-handles.md +924 -0
- package/dist/skills/editframe-editor-gui/references/trim-handles.md +725 -0
- package/dist/skills/editframe-editor-gui/references/workbench.md +453 -0
- package/dist/skills/editframe-motion-design/SKILL.md +101 -0
- package/dist/skills/editframe-motion-design/references/0-editframe.md +299 -0
- package/dist/skills/editframe-motion-design/references/1-intent.md +201 -0
- package/dist/skills/editframe-motion-design/references/2-physics-model.md +405 -0
- package/dist/skills/editframe-motion-design/references/3-attention.md +350 -0
- package/dist/skills/editframe-motion-design/references/4-process.md +418 -0
- package/dist/skills/editframe-vite-plugin/SKILL.md +75 -0
- package/dist/skills/editframe-vite-plugin/references/file-api.md +111 -0
- package/dist/skills/editframe-vite-plugin/references/getting-started.md +96 -0
- package/dist/skills/editframe-vite-plugin/references/jit-transcoding.md +91 -0
- package/dist/skills/editframe-vite-plugin/references/local-assets.md +75 -0
- package/dist/skills/editframe-vite-plugin/references/visual-testing.md +136 -0
- package/dist/skills/editframe-webhooks/SKILL.md +126 -0
- package/dist/skills/editframe-webhooks/references/events.md +382 -0
- package/dist/skills/editframe-webhooks/references/getting-started.md +232 -0
- package/dist/skills/editframe-webhooks/references/security.md +418 -0
- package/dist/skills/editframe-webhooks/references/testing.md +409 -0
- package/dist/skills/editframe-webhooks/references/troubleshooting.md +457 -0
- package/dist/templates/html/AGENTS.md +13 -0
- package/dist/templates/react/AGENTS.md +13 -0
- package/dist/utils.js +15 -16
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/tsdown.config.ts +4 -0
- package/dist/detectAgent.js +0 -89
- package/dist/detectAgent.js.map +0 -1
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Overlay Layer Element
|
|
3
|
+
description: Container that positions overlay items absolutely over a composition, anchoring them to their target elements during playback.
|
|
4
|
+
type: reference
|
|
5
|
+
nav:
|
|
6
|
+
parent: "Overlay System"
|
|
7
|
+
priority: 10
|
|
8
|
+
api:
|
|
9
|
+
attributes:
|
|
10
|
+
- name: panZoomTransform
|
|
11
|
+
type: "{ x: number, y: number, scale: number }"
|
|
12
|
+
description: Pan/zoom transform (fallback when context unavailable)
|
|
13
|
+
methods:
|
|
14
|
+
- name: registerOverlayItem(item)
|
|
15
|
+
signature: "registerOverlayItem(item: EFOverlayItem): void"
|
|
16
|
+
description: Register an overlay item for coordinated updates
|
|
17
|
+
- name: unregisterOverlayItem(item)
|
|
18
|
+
signature: "unregisterOverlayItem(item: EFOverlayItem): void"
|
|
19
|
+
description: Unregister an overlay item
|
|
20
|
+
react:
|
|
21
|
+
generate: true
|
|
22
|
+
componentName: OverlayLayer
|
|
23
|
+
importPath: "@editframe/react"
|
|
24
|
+
additionalProps:
|
|
25
|
+
- name: className
|
|
26
|
+
type: string
|
|
27
|
+
description: CSS classes for styling
|
|
28
|
+
- name: children
|
|
29
|
+
type: ReactNode
|
|
30
|
+
description: OverlayItem children to render
|
|
31
|
+
nav:
|
|
32
|
+
parent: "Components / Overlay System"
|
|
33
|
+
priority: 50
|
|
34
|
+
related: ["overlay-item", "preview"]
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
<!-- html-only -->
|
|
38
|
+
# ef-overlay-layer
|
|
39
|
+
<!-- /html-only -->
|
|
40
|
+
<!-- react-only -->
|
|
41
|
+
# OverlayLayer
|
|
42
|
+
<!-- /react-only -->
|
|
43
|
+
|
|
44
|
+
Container for positioned overlays that track element positions in a canvas or composition.
|
|
45
|
+
|
|
46
|
+
<!-- react-only -->
|
|
47
|
+
## Import
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
import { OverlayLayer } from "@editframe/react";
|
|
51
|
+
```
|
|
52
|
+
<!-- /react-only -->
|
|
53
|
+
|
|
54
|
+
## Basic Usage
|
|
55
|
+
|
|
56
|
+
<!-- html-only -->
|
|
57
|
+
Overlay layer provides a coordinate system for overlays:
|
|
58
|
+
|
|
59
|
+
```html live
|
|
60
|
+
<div class="relative w-[600px] h-[400px] border border-gray-300 rounded overflow-hidden">
|
|
61
|
+
<ef-overlay-layer class="absolute inset-0 pointer-events-none">
|
|
62
|
+
<ef-overlay-item target="#target-box" class="border-2 border-blue-500 pointer-events-auto">
|
|
63
|
+
<div class="absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-1 rounded">Label</div>
|
|
64
|
+
</ef-overlay-item>
|
|
65
|
+
</ef-overlay-layer>
|
|
66
|
+
|
|
67
|
+
<div id="target-box" class="absolute top-8 left-8 w-32 h-24 bg-gray-200 rounded"></div>
|
|
68
|
+
</div>
|
|
69
|
+
```
|
|
70
|
+
<!-- /html-only -->
|
|
71
|
+
<!-- react-only -->
|
|
72
|
+
```tsx
|
|
73
|
+
import { OverlayLayer, OverlayItem, Preview, Timegroup, Video } from "@editframe/react";
|
|
74
|
+
|
|
75
|
+
export const App = () => {
|
|
76
|
+
return (
|
|
77
|
+
<div className="relative w-full h-screen">
|
|
78
|
+
<Preview className="w-full h-full" />
|
|
79
|
+
|
|
80
|
+
<OverlayLayer className="absolute inset-0 pointer-events-none">
|
|
81
|
+
<OverlayItem elementId="video-1">
|
|
82
|
+
<div className="border-2 border-blue-500" />
|
|
83
|
+
</OverlayItem>
|
|
84
|
+
</OverlayLayer>
|
|
85
|
+
|
|
86
|
+
<Timegroup mode="contain" className="w-[1920px] h-[1080px]">
|
|
87
|
+
<Video id="video-1" src="/assets/video.mp4" className="size-full" />
|
|
88
|
+
</Timegroup>
|
|
89
|
+
</div>
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
```
|
|
93
|
+
<!-- /react-only -->
|
|
94
|
+
|
|
95
|
+
## With Pan/Zoom
|
|
96
|
+
|
|
97
|
+
<!-- html-only -->
|
|
98
|
+
Overlay layer automatically syncs with ef-pan-zoom transforms:
|
|
99
|
+
|
|
100
|
+
```html live
|
|
101
|
+
<div class="relative w-[600px] h-[400px] border border-gray-300 rounded overflow-hidden">
|
|
102
|
+
<ef-pan-zoom class="w-full h-full">
|
|
103
|
+
<div class="w-[1200px] h-[800px] bg-gray-100">
|
|
104
|
+
<div id="element-1" class="absolute top-12 left-12 w-40 h-32 bg-blue-500 text-white flex items-center justify-center rounded">
|
|
105
|
+
Element 1
|
|
106
|
+
</div>
|
|
107
|
+
<div id="element-2" class="absolute top-48 left-48 w-40 h-32 bg-green-500 text-white flex items-center justify-center rounded">
|
|
108
|
+
Element 2
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</ef-pan-zoom>
|
|
112
|
+
|
|
113
|
+
<ef-overlay-layer class="absolute inset-0 pointer-events-none">
|
|
114
|
+
<ef-overlay-item target="#element-1" class="border-2 border-blue-600"></ef-overlay-item>
|
|
115
|
+
<ef-overlay-item target="#element-2" class="border-2 border-green-600"></ef-overlay-item>
|
|
116
|
+
</ef-overlay-layer>
|
|
117
|
+
</div>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Pan and zoom the canvas - overlays stay perfectly positioned on their targets.
|
|
121
|
+
<!-- /html-only -->
|
|
122
|
+
<!-- react-only -->
|
|
123
|
+
```tsx
|
|
124
|
+
import { PanZoom, OverlayLayer, OverlayItem } from "@editframe/react";
|
|
125
|
+
|
|
126
|
+
export const ZoomableEditor = () => {
|
|
127
|
+
return (
|
|
128
|
+
<div className="relative w-full h-screen">
|
|
129
|
+
<PanZoom className="w-full h-full" autoFit>
|
|
130
|
+
<Preview className="w-[1920px] h-[1080px]" />
|
|
131
|
+
|
|
132
|
+
{/* OverlayLayer automatically syncs with PanZoom transform */}
|
|
133
|
+
<OverlayLayer className="absolute inset-0">
|
|
134
|
+
<OverlayItem elementId="text-1">
|
|
135
|
+
<div className="border-2 border-green-500" />
|
|
136
|
+
</OverlayItem>
|
|
137
|
+
</OverlayLayer>
|
|
138
|
+
|
|
139
|
+
<Timegroup mode="fixed" duration="5s" className="w-[1920px] h-[1080px]">
|
|
140
|
+
<Text
|
|
141
|
+
id="text-1"
|
|
142
|
+
duration="5s"
|
|
143
|
+
className="absolute top-20 left-20 text-white text-4xl"
|
|
144
|
+
>
|
|
145
|
+
Title Text
|
|
146
|
+
</Text>
|
|
147
|
+
</Timegroup>
|
|
148
|
+
</PanZoom>
|
|
149
|
+
</div>
|
|
150
|
+
);
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
<!-- /react-only -->
|
|
154
|
+
|
|
155
|
+
## Architecture
|
|
156
|
+
|
|
157
|
+
Overlay layer runs a single RAF loop that:
|
|
158
|
+
|
|
159
|
+
1. Reads the current pan/zoom transform
|
|
160
|
+
2. Applies transform to the layer container
|
|
161
|
+
3. Updates all registered overlay items
|
|
162
|
+
4. Schedules next frame
|
|
163
|
+
|
|
164
|
+
This ensures all overlays update synchronously without individual RAF loops.
|
|
165
|
+
|
|
166
|
+
## Transform Context
|
|
167
|
+
|
|
168
|
+
<!-- html-only -->
|
|
169
|
+
Overlay layer consumes pan/zoom transform from context when nested inside ef-pan-zoom:
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<ef-pan-zoom>
|
|
173
|
+
<!-- Transform provided via context -->
|
|
174
|
+
<ef-overlay-layer>
|
|
175
|
+
<ef-overlay-item target="#element"></ef-overlay-item>
|
|
176
|
+
</ef-overlay-layer>
|
|
177
|
+
</ef-pan-zoom>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
For sibling relationships, overlay layer reads transform directly from the DOM:
|
|
181
|
+
|
|
182
|
+
```html
|
|
183
|
+
<div class="relative">
|
|
184
|
+
<ef-pan-zoom>
|
|
185
|
+
<!-- Pan/zoom content -->
|
|
186
|
+
</ef-pan-zoom>
|
|
187
|
+
|
|
188
|
+
<!-- Sibling overlay layer reads transform from ef-pan-zoom -->
|
|
189
|
+
<ef-overlay-layer class="absolute inset-0">
|
|
190
|
+
<ef-overlay-item target="#element"></ef-overlay-item>
|
|
191
|
+
</ef-overlay-layer>
|
|
192
|
+
</div>
|
|
193
|
+
```
|
|
194
|
+
<!-- /html-only -->
|
|
195
|
+
<!-- react-only -->
|
|
196
|
+
OverlayLayer automatically discovers and syncs with PanZoom transforms via Lit context. When placed inside a PanZoom component, no manual transform wiring is needed.
|
|
197
|
+
<!-- /react-only -->
|
|
198
|
+
|
|
199
|
+
<!-- html-only -->
|
|
200
|
+
## Fallback Transform
|
|
201
|
+
|
|
202
|
+
Provide transform as property for testing or standalone usage:
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
const overlayLayer = document.querySelector('ef-overlay-layer');
|
|
206
|
+
overlayLayer.panZoomTransform = { x: 0, y: 0, scale: 1 };
|
|
207
|
+
```
|
|
208
|
+
<!-- /html-only -->
|
|
209
|
+
|
|
210
|
+
## Coordinate System
|
|
211
|
+
|
|
212
|
+
Overlay layer creates a coordinate space that:
|
|
213
|
+
|
|
214
|
+
- Matches the transformed canvas position
|
|
215
|
+
- Allows overlay items to use absolute positioning
|
|
216
|
+
- Updates every frame via RAF loop
|
|
217
|
+
- Supports pointer events through `pointer-events: auto` on overlay items
|
|
218
|
+
|
|
219
|
+
<!-- html-only -->
|
|
220
|
+
## Registration
|
|
221
|
+
|
|
222
|
+
Overlay items auto-register with their parent layer:
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
// Registration happens automatically in connectedCallback
|
|
226
|
+
const item = document.createElement('ef-overlay-item');
|
|
227
|
+
item.target = '#my-element';
|
|
228
|
+
overlayLayer.appendChild(item); // Item registers itself
|
|
229
|
+
|
|
230
|
+
// Unregistration happens in disconnectedCallback
|
|
231
|
+
item.remove(); // Item unregisters itself
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Manual registration is possible but not required:
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
const overlayLayer = document.querySelector('ef-overlay-layer');
|
|
238
|
+
const overlayItem = document.querySelector('ef-overlay-item');
|
|
239
|
+
|
|
240
|
+
overlayLayer.registerOverlayItem(overlayItem);
|
|
241
|
+
// Later...
|
|
242
|
+
overlayLayer.unregisterOverlayItem(overlayItem);
|
|
243
|
+
```
|
|
244
|
+
<!-- /html-only -->
|
|
245
|
+
|
|
246
|
+
## Pointer Events
|
|
247
|
+
|
|
248
|
+
<!-- html-only -->
|
|
249
|
+
Overlay layer has `pointer-events: none` by default. Enable pointer events on individual items:
|
|
250
|
+
|
|
251
|
+
```html
|
|
252
|
+
<ef-overlay-layer>
|
|
253
|
+
<ef-overlay-item target="#element" class="pointer-events-auto cursor-pointer">
|
|
254
|
+
<button>Click me</button>
|
|
255
|
+
</ef-overlay-item>
|
|
256
|
+
</ef-overlay-layer>
|
|
257
|
+
```
|
|
258
|
+
<!-- /html-only -->
|
|
259
|
+
<!-- react-only -->
|
|
260
|
+
OverlayLayer has `pointer-events: none` by default. Child elements should set `pointer-events: auto` to receive interactions.
|
|
261
|
+
<!-- /react-only -->
|
|
262
|
+
|
|
263
|
+
<!-- react-only -->
|
|
264
|
+
## With Transform Handles
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
import { OverlayLayer, OverlayItem, TransformHandles } from "@editframe/react";
|
|
268
|
+
|
|
269
|
+
export const Editor = () => {
|
|
270
|
+
const [bounds, setBounds] = useState({ x: 100, y: 100, width: 400, height: 300 });
|
|
271
|
+
|
|
272
|
+
return (
|
|
273
|
+
<div className="relative w-full h-screen">
|
|
274
|
+
<Preview className="w-full h-full" />
|
|
275
|
+
|
|
276
|
+
<OverlayLayer className="absolute inset-0">
|
|
277
|
+
<OverlayItem elementId="selected-element">
|
|
278
|
+
<TransformHandles
|
|
279
|
+
bounds={bounds}
|
|
280
|
+
enableRotation
|
|
281
|
+
onBoundsChange={(e) => setBounds(e.detail)}
|
|
282
|
+
/>
|
|
283
|
+
</OverlayItem>
|
|
284
|
+
</OverlayLayer>
|
|
285
|
+
|
|
286
|
+
<Timegroup mode="contain" className="w-[1920px] h-[1080px]">
|
|
287
|
+
<Video
|
|
288
|
+
id="selected-element"
|
|
289
|
+
src="/assets/video.mp4"
|
|
290
|
+
className="absolute"
|
|
291
|
+
style={{
|
|
292
|
+
left: bounds.x,
|
|
293
|
+
top: bounds.y,
|
|
294
|
+
width: bounds.width,
|
|
295
|
+
height: bounds.height
|
|
296
|
+
}}
|
|
297
|
+
/>
|
|
298
|
+
</Timegroup>
|
|
299
|
+
</div>
|
|
300
|
+
);
|
|
301
|
+
};
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Multiple Overlays
|
|
305
|
+
|
|
306
|
+
```tsx
|
|
307
|
+
import { OverlayLayer, OverlayItem } from "@editframe/react";
|
|
308
|
+
|
|
309
|
+
export const MultiOverlay = () => {
|
|
310
|
+
return (
|
|
311
|
+
<div className="relative w-full h-screen">
|
|
312
|
+
<Preview className="w-full h-full" />
|
|
313
|
+
|
|
314
|
+
<OverlayLayer className="absolute inset-0">
|
|
315
|
+
{/* Selection highlight */}
|
|
316
|
+
<OverlayItem elementId="element-1">
|
|
317
|
+
<div className="border-2 border-blue-500 bg-blue-500/10" />
|
|
318
|
+
</OverlayItem>
|
|
319
|
+
|
|
320
|
+
{/* Hover highlight */}
|
|
321
|
+
<OverlayItem elementId="element-2">
|
|
322
|
+
<div className="border-2 border-yellow-500 bg-yellow-500/10" />
|
|
323
|
+
</OverlayItem>
|
|
324
|
+
|
|
325
|
+
{/* Label */}
|
|
326
|
+
<OverlayItem elementId="element-1">
|
|
327
|
+
<div className="absolute -top-6 left-0 bg-black text-white px-2 py-1 text-xs rounded">
|
|
328
|
+
Video Layer
|
|
329
|
+
</div>
|
|
330
|
+
</OverlayItem>
|
|
331
|
+
</OverlayLayer>
|
|
332
|
+
|
|
333
|
+
<Timegroup mode="sequence" className="w-[1920px] h-[1080px]">
|
|
334
|
+
<Video id="element-1" src="/assets/video1.mp4" />
|
|
335
|
+
<Video id="element-2" src="/assets/video2.mp4" />
|
|
336
|
+
</Timegroup>
|
|
337
|
+
</div>
|
|
338
|
+
);
|
|
339
|
+
};
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Custom Overlay Styling
|
|
343
|
+
|
|
344
|
+
```tsx
|
|
345
|
+
import { OverlayLayer, OverlayItem } from "@editframe/react";
|
|
346
|
+
|
|
347
|
+
export const StyledOverlays = () => {
|
|
348
|
+
return (
|
|
349
|
+
<OverlayLayer className="absolute inset-0">
|
|
350
|
+
{/* Dashed border overlay */}
|
|
351
|
+
<OverlayItem elementId="element-1">
|
|
352
|
+
<div className="border-2 border-dashed border-purple-500" />
|
|
353
|
+
</OverlayItem>
|
|
354
|
+
|
|
355
|
+
{/* Gradient border overlay */}
|
|
356
|
+
<OverlayItem elementId="element-2">
|
|
357
|
+
<div
|
|
358
|
+
className="border-4"
|
|
359
|
+
style={{
|
|
360
|
+
borderImage: "linear-gradient(45deg, #ff0080, #00ff80) 1"
|
|
361
|
+
}}
|
|
362
|
+
/>
|
|
363
|
+
</OverlayItem>
|
|
364
|
+
|
|
365
|
+
{/* Shadow overlay */}
|
|
366
|
+
<OverlayItem elementId="element-3">
|
|
367
|
+
<div className="border-2 border-white shadow-2xl" />
|
|
368
|
+
</OverlayItem>
|
|
369
|
+
</OverlayLayer>
|
|
370
|
+
);
|
|
371
|
+
};
|
|
372
|
+
```
|
|
373
|
+
<!-- /react-only -->
|
|
374
|
+
|
|
375
|
+
## Performance
|
|
376
|
+
|
|
377
|
+
Single RAF loop ensures:
|
|
378
|
+
|
|
379
|
+
- No RAF proliferation (one loop for all overlays)
|
|
380
|
+
- No change detection overhead
|
|
381
|
+
- No delay between transform and overlay updates
|
|
382
|
+
- Synchronized updates across all overlay items
|
|
383
|
+
|
|
384
|
+
## Positioning
|
|
385
|
+
|
|
386
|
+
<!-- html-only -->
|
|
387
|
+
Overlay layer uses `position: absolute` and `inset: 0` to fill its container:
|
|
388
|
+
|
|
389
|
+
```html
|
|
390
|
+
<div class="relative w-full h-full">
|
|
391
|
+
<!-- Overlay layer fills parent -->
|
|
392
|
+
<ef-overlay-layer></ef-overlay-layer>
|
|
393
|
+
</div>
|
|
394
|
+
```
|
|
395
|
+
<!-- /html-only -->
|
|
396
|
+
<!-- react-only -->
|
|
397
|
+
OverlayLayer must be positioned with `position: absolute` or `fixed` to properly overlay content.
|
|
398
|
+
<!-- /react-only -->
|
|
399
|
+
|
|
400
|
+
## Transform Origin
|
|
401
|
+
|
|
402
|
+
Overlay layer uses `transform-origin: 0 0` to match canvas transform behavior.
|
|
403
|
+
|
|
404
|
+
<!-- react-only -->
|
|
405
|
+
## Architecture Notes
|
|
406
|
+
|
|
407
|
+
- OverlayLayer runs a single RAF loop that updates all child OverlayItems synchronously
|
|
408
|
+
- Automatically discovers and syncs with PanZoom transforms via Lit context
|
|
409
|
+
- Overlays track element positions in real-time using `getBoundingClientRect()`
|
|
410
|
+
- No change detection - updates happen every frame for smooth tracking
|
|
411
|
+
- Child elements should set `pointer-events: auto` to receive interactions
|
|
412
|
+
<!-- /react-only -->
|
|
413
|
+
|
|
414
|
+
## Important Notes
|
|
415
|
+
|
|
416
|
+
<!-- html-only -->
|
|
417
|
+
- Must be positioned with `position: absolute` or `fixed`
|
|
418
|
+
- Use with ef-overlay-item children to track specific elements
|
|
419
|
+
- Automatically handles pan/zoom transforms when inside ef-pan-zoom
|
|
420
|
+
- Updates continuously - no manual refresh needed
|
|
421
|
+
- All overlay items update in sync to prevent visual glitches
|
|
422
|
+
<!-- /html-only -->
|
|
423
|
+
<!-- react-only -->
|
|
424
|
+
- Must be positioned with `position: absolute` or `fixed`
|
|
425
|
+
- Use with OverlayItem children to track specific elements
|
|
426
|
+
- Automatically handles pan/zoom transforms when inside PanZoom
|
|
427
|
+
- Updates continuously - no manual refresh needed
|
|
428
|
+
- All OverlayItems update in sync to prevent visual glitches
|
|
429
|
+
<!-- /react-only -->
|