@editframe/create 0.44.0 → 0.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 -1
- package/tsdown.config.ts +4 -0
- package/dist/detectAgent.js +0 -89
- package/dist/detectAgent.js.map +0 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Composition Model
|
|
3
|
+
description: Mental model for how timegroup trees, temporal scheduling, and element rendering work together in an Editframe composition.
|
|
4
|
+
type: explanation
|
|
5
|
+
nav:
|
|
6
|
+
parent: "Concepts"
|
|
7
|
+
priority: 10
|
|
8
|
+
related: ["timegroup", "timegroup-modes", "time-model"]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Timegroup tree structure
|
|
12
|
+
|
|
13
|
+
A composition is a tree of nested timegroups. The root timegroup acts as the top-level container, and every media element, text block, or nested timegroup sits as a child within it. This tree structure determines both the visual layering order and the temporal relationships between elements.
|
|
14
|
+
|
|
15
|
+
Timegroups can nest arbitrarily deep. A root timegroup might contain a video element, a text element, and a child timegroup that itself contains an image sequence. Each level of nesting creates a new timing scope: the parent controls when the child subtree starts and how long it runs, while the child manages the relative timing of its own children.
|
|
16
|
+
|
|
17
|
+
## Temporal scheduling
|
|
18
|
+
|
|
19
|
+
Time flows from the root of the tree down to the leaves. The root timegroup drives the master clock. When the root advances to a given time, each child receives a time value relative to its own start point. This relative time is called `ownCurrentTimeMs`.
|
|
20
|
+
|
|
21
|
+
An element does not know or care about the absolute position in the overall composition. It only knows its own local time. A video element at `ownCurrentTimeMs: 2000` is 2 seconds into its own playback, regardless of where it sits in the global timeline. This local-time model makes it straightforward to rearrange, nest, or reuse subtrees without recalculating offsets.
|
|
22
|
+
|
|
23
|
+
Each element also has a `startMs` and `durationMs` that define when it becomes active within its parent's timeline. Outside that window, the element is inactive and produces no output.
|
|
24
|
+
|
|
25
|
+
## Timegroup modes
|
|
26
|
+
|
|
27
|
+
A timegroup's mode determines how it calculates its own duration from its children:
|
|
28
|
+
|
|
29
|
+
- **sequence** -- Children play one after another. The timegroup's duration is the sum of all child durations. Each child's start time is the cumulative duration of all preceding siblings. This is the natural choice for slide decks, sequential scenes, or any content that plays in order.
|
|
30
|
+
|
|
31
|
+
- **fixed** -- The timegroup has an explicit duration set directly. Children are positioned within that fixed window. Content that extends beyond the boundary is clipped; content shorter than the boundary leaves dead time.
|
|
32
|
+
|
|
33
|
+
- **contain** -- The timegroup shrink-wraps to fit its longest child. All children start at time zero by default, and the timegroup's duration equals the maximum child duration. This is useful for layered compositions where multiple elements play simultaneously.
|
|
34
|
+
|
|
35
|
+
## Media elements
|
|
36
|
+
|
|
37
|
+
Video, audio, and image elements represent source media within the tree. Video and audio have intrinsic durations derived from their source files. An image has no intrinsic duration, so it displays for whatever duration its parent assigns.
|
|
38
|
+
|
|
39
|
+
Media elements decode their source material frame by frame during rendering. A video element at `ownCurrentTimeMs: 1500` seeks to the 1.5-second mark of its source file and produces the corresponding frame. Audio elements produce sample data for the current time window.
|
|
40
|
+
|
|
41
|
+
## Text and captions
|
|
42
|
+
|
|
43
|
+
Text elements render styled HTML content within the composition. They participate in the same timing model as media elements: they have a start time and duration, and they produce visual output when active.
|
|
44
|
+
|
|
45
|
+
Captions are a specialized form of text that synchronize individual words or phrases to specific time ranges. Each caption segment maps to a span of time, enabling word-level highlighting and timed appearance.
|
|
46
|
+
|
|
47
|
+
Both text and captions support animations through CSS transitions and frame tasks. A frame task is a function that runs on every frame, receiving the current time and allowing dynamic style changes such as fade-ins, position shifts, or color transitions.
|
|
48
|
+
|
|
49
|
+
## Surface
|
|
50
|
+
|
|
51
|
+
A surface element mirrors the rendered output of another element. Rather than producing its own content, it references a target element by ID and displays whatever that element currently renders.
|
|
52
|
+
|
|
53
|
+
This enables picture-in-picture layouts, reflection effects, and multi-view compositions without duplicating source media. The surface updates automatically as the target element's output changes over time.
|
|
54
|
+
|
|
55
|
+
## Context system
|
|
56
|
+
|
|
57
|
+
Elements communicate through a DOM-based context system. When a timegroup mounts, it provides a context that downstream elements and controls can consume. Playback controls such as play, pause, and scrubber components connect to a timegroup by reading from this context.
|
|
58
|
+
|
|
59
|
+
Controls can also target a specific timegroup using the `target` attribute with an element reference or selector. This allows a single interface to contain controls for multiple independent timegroups, each bound explicitly rather than through context inheritance.
|
|
60
|
+
|
|
61
|
+
The context system follows the DOM hierarchy. A control nested inside a timegroup automatically connects to the nearest ancestor timegroup unless an explicit target overrides that behavior.
|
|
62
|
+
|
|
63
|
+
## Rendering pipeline
|
|
64
|
+
|
|
65
|
+
During rendering, the tree is evaluated frame by frame at a fixed frame rate. At each frame:
|
|
66
|
+
|
|
67
|
+
1. The root timegroup advances to the next time position.
|
|
68
|
+
2. Time propagates down the tree. Each element receives its local `ownCurrentTimeMs`.
|
|
69
|
+
3. Active elements resolve their visual state: media elements decode a frame, text elements compute their styled output, surfaces sample their target.
|
|
70
|
+
4. The results composite into a single canvas in tree order, with later siblings drawing on top of earlier ones.
|
|
71
|
+
5. The final canvas pixel data is captured as one frame of the output video.
|
|
72
|
+
|
|
73
|
+
This process repeats for every frame in the composition's total duration. Audio is mixed in a parallel pass, combining all active audio sources according to the same timing model. The final output is a video file that faithfully reproduces the composition tree's state at every point in time.
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Configuration Element
|
|
3
|
+
description: Configuration wrapper for selecting media engine (ffmpeg or native) and setting API credentials for Editframe compositions.
|
|
4
|
+
type: reference
|
|
5
|
+
nav:
|
|
6
|
+
parent: "Advanced"
|
|
7
|
+
priority: 10
|
|
8
|
+
api:
|
|
9
|
+
attributes:
|
|
10
|
+
- name: api-host
|
|
11
|
+
type: string
|
|
12
|
+
description: Override API host for asset resolution
|
|
13
|
+
- name: signing-url
|
|
14
|
+
type: string
|
|
15
|
+
default: "/@ef-sign-url"
|
|
16
|
+
description: URL endpoint for signed URL generation
|
|
17
|
+
- name: media-engine
|
|
18
|
+
type: string
|
|
19
|
+
default: "cloud"
|
|
20
|
+
description: Media engine selection
|
|
21
|
+
values: ["cloud", "local", "jit"]
|
|
22
|
+
react:
|
|
23
|
+
generate: true
|
|
24
|
+
componentName: Configuration
|
|
25
|
+
importPath: "@editframe/react"
|
|
26
|
+
propMapping:
|
|
27
|
+
api-host: apiHost
|
|
28
|
+
signing-url: signingURL
|
|
29
|
+
media-engine: mediaEngine
|
|
30
|
+
additionalProps:
|
|
31
|
+
- name: children
|
|
32
|
+
type: React.ReactNode
|
|
33
|
+
description: Application content (typically TimelineRoot)
|
|
34
|
+
nav:
|
|
35
|
+
parent: "Core Concepts"
|
|
36
|
+
priority: 0
|
|
37
|
+
related: ["timeline-root"]
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
<!-- html-only -->
|
|
41
|
+
# ef-configuration
|
|
42
|
+
<!-- /html-only -->
|
|
43
|
+
<!-- react-only -->
|
|
44
|
+
# Configuration
|
|
45
|
+
<!-- /react-only -->
|
|
46
|
+
|
|
47
|
+
Configuration wrapper for media engine selection and API settings.
|
|
48
|
+
|
|
49
|
+
<!-- react-only -->
|
|
50
|
+
## Import
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import { Configuration } from "@editframe/react";
|
|
54
|
+
```
|
|
55
|
+
<!-- /react-only -->
|
|
56
|
+
|
|
57
|
+
## Basic Usage
|
|
58
|
+
|
|
59
|
+
Wrap your composition to configure media handling:
|
|
60
|
+
|
|
61
|
+
<!-- html-only -->
|
|
62
|
+
```html
|
|
63
|
+
<ef-configuration media-engine="cloud">
|
|
64
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px] bg-black">
|
|
65
|
+
<ef-video src="https://assets.editframe.com/bars-n-tone.mp4" class="size-full"></ef-video>
|
|
66
|
+
</ef-timegroup>
|
|
67
|
+
</ef-configuration>
|
|
68
|
+
```
|
|
69
|
+
<!-- /html-only -->
|
|
70
|
+
<!-- react-only -->
|
|
71
|
+
```tsx
|
|
72
|
+
// Video.tsx
|
|
73
|
+
import { Timegroup } from "@editframe/react";
|
|
74
|
+
|
|
75
|
+
export const Video = () => {
|
|
76
|
+
return (
|
|
77
|
+
<Timegroup mode="sequence" className="w-[1920px] h-[1080px]">
|
|
78
|
+
{/* Your composition */}
|
|
79
|
+
</Timegroup>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// main.tsx
|
|
84
|
+
import ReactDOM from "react-dom/client";
|
|
85
|
+
import { Configuration, TimelineRoot } from "@editframe/react";
|
|
86
|
+
import { Video } from "./Video";
|
|
87
|
+
|
|
88
|
+
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
89
|
+
<Configuration apiHost="https://api.example.com" mediaEngine="local">
|
|
90
|
+
<TimelineRoot id="root" component={Video} />
|
|
91
|
+
</Configuration>
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
<!-- /react-only -->
|
|
95
|
+
|
|
96
|
+
## Media Engine Options
|
|
97
|
+
|
|
98
|
+
<!-- html-only -->
|
|
99
|
+
The `media-engine` attribute controls how media files are loaded and processed.
|
|
100
|
+
<!-- /html-only -->
|
|
101
|
+
<!-- react-only -->
|
|
102
|
+
Controls how media files are loaded and processed. Three options are available:
|
|
103
|
+
<!-- /react-only -->
|
|
104
|
+
|
|
105
|
+
### Cloud Mode (Default)
|
|
106
|
+
|
|
107
|
+
Automatically selects the appropriate engine based on URL:
|
|
108
|
+
- Remote URLs (`http://`, `https://`) use JIT transcoding
|
|
109
|
+
- Local paths use asset engine
|
|
110
|
+
|
|
111
|
+
<!-- html-only -->
|
|
112
|
+
```html live
|
|
113
|
+
<ef-configuration media-engine="cloud">
|
|
114
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px] bg-black">
|
|
115
|
+
<ef-video src="https://assets.editframe.com/bars-n-tone.mp4" class="size-full object-contain"></ef-video>
|
|
116
|
+
</ef-timegroup>
|
|
117
|
+
</ef-configuration>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Use when:** Building production applications with mixed local and remote assets.
|
|
121
|
+
<!-- /html-only -->
|
|
122
|
+
<!-- react-only -->
|
|
123
|
+
```tsx
|
|
124
|
+
<Configuration mediaEngine="cloud">
|
|
125
|
+
<Timegroup mode="sequence">
|
|
126
|
+
<Video src="https://cdn.example.com/video.mp4" /> {/* JIT transcoding */}
|
|
127
|
+
<Video src="/assets/local.mp4" /> {/* Local assets */}
|
|
128
|
+
</Timegroup>
|
|
129
|
+
</Configuration>
|
|
130
|
+
```
|
|
131
|
+
<!-- /react-only -->
|
|
132
|
+
|
|
133
|
+
### Local Mode
|
|
134
|
+
|
|
135
|
+
Forces all sources through the local asset engine using `@ef-*` URLs:
|
|
136
|
+
|
|
137
|
+
<!-- html-only -->
|
|
138
|
+
```html
|
|
139
|
+
<ef-configuration media-engine="local">
|
|
140
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
141
|
+
<ef-video src="video.mp4" class="size-full"></ef-video>
|
|
142
|
+
</ef-timegroup>
|
|
143
|
+
</ef-configuration>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Use when:**
|
|
147
|
+
- Development with local files only
|
|
148
|
+
- Testing without network access
|
|
149
|
+
- Working with bundled assets
|
|
150
|
+
<!-- /html-only -->
|
|
151
|
+
<!-- react-only -->
|
|
152
|
+
- All sources use local asset endpoints
|
|
153
|
+
- No transcoding applied
|
|
154
|
+
- Best for local development with Vite plugin
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
<Configuration mediaEngine="local">
|
|
158
|
+
<Timegroup mode="sequence">
|
|
159
|
+
<Video src="/assets/video.mp4" /> {/* → /@ef-assets/... */}
|
|
160
|
+
</Timegroup>
|
|
161
|
+
</Configuration>
|
|
162
|
+
```
|
|
163
|
+
<!-- /react-only -->
|
|
164
|
+
|
|
165
|
+
### JIT Mode
|
|
166
|
+
|
|
167
|
+
Forces all sources through JIT transcoding using `/api/v1/transcode/*` URLs:
|
|
168
|
+
|
|
169
|
+
<!-- html-only -->
|
|
170
|
+
```html
|
|
171
|
+
<ef-configuration media-engine="jit">
|
|
172
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
173
|
+
<ef-video src="https://example.com/video.mp4" class="size-full"></ef-video>
|
|
174
|
+
</ef-timegroup>
|
|
175
|
+
</ef-configuration>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Use when:**
|
|
179
|
+
- On-demand transcoding needed
|
|
180
|
+
- Working with incompatible video formats
|
|
181
|
+
- Development with Editframe Vite plugin
|
|
182
|
+
<!-- /html-only -->
|
|
183
|
+
<!-- react-only -->
|
|
184
|
+
- All sources are transcoded on-demand
|
|
185
|
+
- Useful for testing transcoding behavior
|
|
186
|
+
- May have slower initial load
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
<Configuration mediaEngine="jit">
|
|
190
|
+
<Timegroup mode="sequence">
|
|
191
|
+
<Video src="/assets/video.mp4" /> {/* → /api/v1/transcode/... */}
|
|
192
|
+
</Timegroup>
|
|
193
|
+
</Configuration>
|
|
194
|
+
```
|
|
195
|
+
<!-- /react-only -->
|
|
196
|
+
|
|
197
|
+
## API Host Override
|
|
198
|
+
|
|
199
|
+
When no `ef-configuration` ancestor is present, all source-based elements (`ef-video`, `ef-audio`, `ef-image`, `ef-captions`) fall back to `window.location.origin` as the API host. This means elements work without any configuration wrapper — API requests go to the same origin as the page, which is handled by the Vite plugin in development and by telecine in production.
|
|
200
|
+
|
|
201
|
+
Use `ef-configuration` with `api-host` when you need to override that default:
|
|
202
|
+
|
|
203
|
+
<!-- html-only -->
|
|
204
|
+
Override the API host for asset resolution in production:
|
|
205
|
+
|
|
206
|
+
```html
|
|
207
|
+
<ef-configuration api-host="https://api.editframe.com">
|
|
208
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
209
|
+
<ef-video src="video.mp4" class="size-full"></ef-video>
|
|
210
|
+
</ef-timegroup>
|
|
211
|
+
</ef-configuration>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Use when:**
|
|
215
|
+
- Deploying to custom domains
|
|
216
|
+
- Using proxy servers
|
|
217
|
+
- Testing against staging environments
|
|
218
|
+
<!-- /html-only -->
|
|
219
|
+
<!-- react-only -->
|
|
220
|
+
Set the API endpoint for transcription and rendering:
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
<Configuration apiHost="https://api.editframe.com">
|
|
224
|
+
<Timegroup mode="sequence">
|
|
225
|
+
{/* Composition */}
|
|
226
|
+
</Timegroup>
|
|
227
|
+
</Configuration>
|
|
228
|
+
```
|
|
229
|
+
<!-- /react-only -->
|
|
230
|
+
|
|
231
|
+
## Signing URL
|
|
232
|
+
|
|
233
|
+
Configure the endpoint for generating signed URLs:
|
|
234
|
+
|
|
235
|
+
<!-- html-only -->
|
|
236
|
+
```html
|
|
237
|
+
<ef-configuration signing-url="/api/sign-url">
|
|
238
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
239
|
+
<ef-video src="video.mp4" class="size-full"></ef-video>
|
|
240
|
+
</ef-timegroup>
|
|
241
|
+
</ef-configuration>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Use when:**
|
|
245
|
+
- Custom authentication flows
|
|
246
|
+
- Non-standard URL signing
|
|
247
|
+
- Backend integration requirements
|
|
248
|
+
<!-- /html-only -->
|
|
249
|
+
<!-- react-only -->
|
|
250
|
+
Defaults to `/@ef-sign-url`:
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
<Configuration
|
|
254
|
+
apiHost="https://api.example.com"
|
|
255
|
+
signingURL="/custom-signing-endpoint"
|
|
256
|
+
>
|
|
257
|
+
<Timegroup mode="sequence">
|
|
258
|
+
{/* Composition */}
|
|
259
|
+
</Timegroup>
|
|
260
|
+
</Configuration>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
The signing URL is used to:
|
|
264
|
+
- Generate signed URLs for secure media access
|
|
265
|
+
- Authenticate transcoding requests
|
|
266
|
+
- Control access to media files
|
|
267
|
+
|
|
268
|
+
In development, the Vite plugin provides this endpoint automatically.
|
|
269
|
+
<!-- /react-only -->
|
|
270
|
+
|
|
271
|
+
## Development vs Production
|
|
272
|
+
|
|
273
|
+
<!-- html-only -->
|
|
274
|
+
### Local Development Setup
|
|
275
|
+
|
|
276
|
+
Use `local` mode with Vite plugin for fast iteration:
|
|
277
|
+
|
|
278
|
+
```html
|
|
279
|
+
<ef-configuration media-engine="local" signing-url="/@ef-sign-url">
|
|
280
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
281
|
+
<ef-video src="./assets/video.mp4" class="size-full"></ef-video>
|
|
282
|
+
</ef-timegroup>
|
|
283
|
+
</ef-configuration>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Production Setup
|
|
287
|
+
|
|
288
|
+
Use `cloud` mode with custom API host:
|
|
289
|
+
|
|
290
|
+
```html
|
|
291
|
+
<ef-configuration media-engine="cloud" api-host="https://api.yourdomain.com">
|
|
292
|
+
<ef-timegroup mode="contain" class="w-[720px] h-[480px]">
|
|
293
|
+
<ef-video src="https://cdn.yourdomain.com/video.mp4" class="size-full"></ef-video>
|
|
294
|
+
</ef-timegroup>
|
|
295
|
+
</ef-configuration>
|
|
296
|
+
```
|
|
297
|
+
<!-- /html-only -->
|
|
298
|
+
<!-- react-only -->
|
|
299
|
+
```tsx
|
|
300
|
+
const apiHost = import.meta.env.VITE_API_HOST || "http://localhost:3000";
|
|
301
|
+
const mediaEngine = import.meta.env.PROD ? "cloud" : "local";
|
|
302
|
+
|
|
303
|
+
export const Video = () => {
|
|
304
|
+
return (
|
|
305
|
+
<Configuration apiHost={apiHost} mediaEngine={mediaEngine}>
|
|
306
|
+
<Timegroup mode="sequence" className="w-[1920px] h-[1080px]">
|
|
307
|
+
{/* Your composition */}
|
|
308
|
+
</Timegroup>
|
|
309
|
+
</Configuration>
|
|
310
|
+
);
|
|
311
|
+
};
|
|
312
|
+
```
|
|
313
|
+
<!-- /react-only -->
|
|
314
|
+
|
|
315
|
+
## Context Provision
|
|
316
|
+
|
|
317
|
+
<!-- html-only -->
|
|
318
|
+
`ef-configuration` provides settings via Lit context to all descendant elements. This means you only need one configuration wrapper at the root level:
|
|
319
|
+
|
|
320
|
+
```html
|
|
321
|
+
<ef-configuration media-engine="cloud">
|
|
322
|
+
<ef-timegroup mode="sequence" class="w-[720px] h-[480px]">
|
|
323
|
+
<!-- All children inherit configuration -->
|
|
324
|
+
<ef-video src="clip1.mp4" class="size-full"></ef-video>
|
|
325
|
+
<ef-video src="clip2.mp4" class="size-full"></ef-video>
|
|
326
|
+
<ef-video src="clip3.mp4" class="size-full"></ef-video>
|
|
327
|
+
</ef-timegroup>
|
|
328
|
+
</ef-configuration>
|
|
329
|
+
```
|
|
330
|
+
<!-- /html-only -->
|
|
331
|
+
<!-- react-only -->
|
|
332
|
+
If you don't need API features (transcription) or want default settings, you can omit Configuration:
|
|
333
|
+
|
|
334
|
+
```tsx
|
|
335
|
+
export const Video = () => {
|
|
336
|
+
return (
|
|
337
|
+
<Timegroup mode="sequence" className="w-[1920px] h-[1080px]">
|
|
338
|
+
{/* Your composition */}
|
|
339
|
+
</Timegroup>
|
|
340
|
+
);
|
|
341
|
+
};
|
|
342
|
+
```
|
|
343
|
+
<!-- /react-only -->
|
|
344
|
+
|
|
345
|
+
## Multiple Configurations
|
|
346
|
+
|
|
347
|
+
<!-- html-only -->
|
|
348
|
+
Nest configurations to override settings for specific subtrees:
|
|
349
|
+
|
|
350
|
+
```html
|
|
351
|
+
<ef-configuration media-engine="cloud">
|
|
352
|
+
<ef-timegroup mode="sequence" class="w-[720px] h-[480px]">
|
|
353
|
+
<!-- Remote video uses cloud mode -->
|
|
354
|
+
<ef-video src="https://cdn.example.com/intro.mp4" class="size-full"></ef-video>
|
|
355
|
+
|
|
356
|
+
<!-- Local videos use local mode -->
|
|
357
|
+
<ef-configuration media-engine="local">
|
|
358
|
+
<ef-video src="./local-clip.mp4" class="size-full"></ef-video>
|
|
359
|
+
</ef-configuration>
|
|
360
|
+
</ef-timegroup>
|
|
361
|
+
</ef-configuration>
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
> **Note:** Inner configurations override outer settings only for their descendants. Settings merge — unspecified attributes inherit from parent configuration.
|
|
365
|
+
<!-- /html-only -->
|
|
366
|
+
<!-- react-only -->
|
|
367
|
+
## Typical Setup
|
|
368
|
+
|
|
369
|
+
```tsx
|
|
370
|
+
// VideoComposition.tsx
|
|
371
|
+
import { Timegroup, Video, Audio } from "@editframe/react";
|
|
372
|
+
|
|
373
|
+
export const VideoComposition = () => {
|
|
374
|
+
return (
|
|
375
|
+
<Timegroup
|
|
376
|
+
|
|
377
|
+
mode="sequence"
|
|
378
|
+
className="w-[1920px] h-[1080px] bg-black"
|
|
379
|
+
>
|
|
380
|
+
<Timegroup mode="fixed" duration="10s" className="absolute w-full h-full">
|
|
381
|
+
<Video src="/assets/intro.mp4" className="size-full object-cover" />
|
|
382
|
+
<Audio src="/assets/music.mp3" volume={0.3} />
|
|
383
|
+
</Timegroup>
|
|
384
|
+
</Timegroup>
|
|
385
|
+
);
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
// main.tsx
|
|
389
|
+
import React from "react";
|
|
390
|
+
import ReactDOM from "react-dom/client";
|
|
391
|
+
import { Configuration, TimelineRoot } from "@editframe/react";
|
|
392
|
+
import { VideoComposition } from "./VideoComposition";
|
|
393
|
+
|
|
394
|
+
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
395
|
+
<Configuration
|
|
396
|
+
apiHost={import.meta.env.VITE_EDITFRAME_API}
|
|
397
|
+
mediaEngine="local"
|
|
398
|
+
>
|
|
399
|
+
<TimelineRoot id="root" component={VideoComposition} />
|
|
400
|
+
</Configuration>
|
|
401
|
+
);
|
|
402
|
+
```
|
|
403
|
+
<!-- /react-only -->
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: CSS Parts Reference
|
|
3
|
+
description: "Catalog of CSS ::part() selectors for styling internal shadow DOM elements of Editframe web components from external stylesheets."
|
|
4
|
+
type: reference
|
|
5
|
+
nav:
|
|
6
|
+
parent: "Advanced"
|
|
7
|
+
priority: 60
|
|
8
|
+
related: ["css-variables", "editor-toolkit"]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# CSS Parts Reference
|
|
12
|
+
|
|
13
|
+
Editframe elements use Shadow DOM to encapsulate internal markup. Each component exposes named parts via the `part` attribute, letting you style internals with `::part()` CSS selectors without breaking encapsulation.
|
|
14
|
+
|
|
15
|
+
## ef-scrubber
|
|
16
|
+
|
|
17
|
+
| Part | Description |
|
|
18
|
+
|------|-------------|
|
|
19
|
+
| `scrubber` | Outer track container |
|
|
20
|
+
| `progress` | Filled portion indicating current position |
|
|
21
|
+
| `handle` | Draggable circular knob |
|
|
22
|
+
| `playhead` | Vertical line at the current time position |
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
ef-scrubber::part(scrubber) { background: #1a1a2e; border-radius: 4px; }
|
|
26
|
+
ef-scrubber::part(progress) { background: #e94560; }
|
|
27
|
+
ef-scrubber::part(handle) { background: #e94560; width: 14px; height: 14px; }
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## ef-time-display
|
|
31
|
+
|
|
32
|
+
| Part | Description |
|
|
33
|
+
|------|-------------|
|
|
34
|
+
| `time` | Span containing the formatted `current / duration` text |
|
|
35
|
+
|
|
36
|
+
```css
|
|
37
|
+
ef-time-display::part(time) { font-family: monospace; color: #aaa; }
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## ef-workbench
|
|
41
|
+
|
|
42
|
+
| Part | Description |
|
|
43
|
+
|------|-------------|
|
|
44
|
+
| `toolbar` | Top toolbar row with mode indicators and controls |
|
|
45
|
+
| `canvas` | Central preview area where the composition is rendered |
|
|
46
|
+
|
|
47
|
+
## ef-timeline
|
|
48
|
+
|
|
49
|
+
| Part | Description |
|
|
50
|
+
|------|-------------|
|
|
51
|
+
| `header` | Controls row above the tracks (playback, time display, zoom) |
|
|
52
|
+
| `tracks` | Scrollable viewport containing all track rows |
|
|
53
|
+
| `ruler` | Time ruler bar along the top of the tracks area |
|
|
54
|
+
| `playhead` | Vertical playhead line spanning all tracks |
|
|
55
|
+
|
|
56
|
+
## ef-timeline-row
|
|
57
|
+
|
|
58
|
+
| Part | Description |
|
|
59
|
+
|------|-------------|
|
|
60
|
+
| `label` | Row label area (element name, icon, detail text) |
|
|
61
|
+
| `track` | Row track area displaying the clip bar |
|
|
62
|
+
|
|
63
|
+
## ef-hierarchy
|
|
64
|
+
|
|
65
|
+
| Part | Description |
|
|
66
|
+
|------|-------------|
|
|
67
|
+
| `list` | Outer container wrapping the hierarchy tree |
|
|
68
|
+
| `header` | Optional header above the tree items |
|
|
69
|
+
|
|
70
|
+
## ef-hierarchy-item
|
|
71
|
+
|
|
72
|
+
| Part | Description |
|
|
73
|
+
|------|-------------|
|
|
74
|
+
| `row` | Item row container (receives `data-focused` and `data-selected` attributes) |
|
|
75
|
+
| `icon` | Element-type icon span |
|
|
76
|
+
| `label` | Element name text span |
|
|
77
|
+
|
|
78
|
+
## Combined Example
|
|
79
|
+
|
|
80
|
+
Style an entire editor theme by targeting parts across multiple elements:
|
|
81
|
+
|
|
82
|
+
```css
|
|
83
|
+
/* Dark coral theme */
|
|
84
|
+
ef-workbench::part(toolbar) { background: #1a1a2e; }
|
|
85
|
+
ef-workbench::part(canvas) { background: #0f0f1a; }
|
|
86
|
+
|
|
87
|
+
ef-scrubber::part(scrubber) { background: #16213e; height: 6px; }
|
|
88
|
+
ef-scrubber::part(progress) { background: #e94560; }
|
|
89
|
+
ef-scrubber::part(handle) { background: #e94560; }
|
|
90
|
+
|
|
91
|
+
ef-timeline::part(header) { background: #16213e; }
|
|
92
|
+
ef-timeline::part(ruler) { background: #0f3460; }
|
|
93
|
+
ef-timeline::part(playhead) { background: #e94560; }
|
|
94
|
+
|
|
95
|
+
ef-time-display::part(time) { color: #e94560; font-variant-numeric: tabular-nums; }
|
|
96
|
+
|
|
97
|
+
ef-hierarchy-item::part(row):hover { background: rgba(255, 255, 255, 0.05); }
|
|
98
|
+
ef-hierarchy-item::part(label) { font-size: 0.75rem; }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Notes
|
|
102
|
+
|
|
103
|
+
- `::part()` selectors cannot be chained -- `::part(a)::part(b)` is invalid. Style each part independently.
|
|
104
|
+
- Parts work inside media queries, container queries, and `:host()` selectors.
|
|
105
|
+
- For nested shadow roots, use `exportparts` on the host to forward inner parts to outer consumers.
|