@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.
Files changed (98) hide show
  1. package/dist/index.js +16 -28
  2. package/dist/index.js.map +1 -1
  3. package/dist/skills/editframe-brand-video-generator/README.md +155 -0
  4. package/dist/skills/editframe-brand-video-generator/SKILL.md +207 -0
  5. package/dist/skills/editframe-brand-video-generator/references/brand-examples.md +178 -0
  6. package/dist/skills/editframe-brand-video-generator/references/color-psychology.md +227 -0
  7. package/dist/skills/editframe-brand-video-generator/references/composition-patterns.md +383 -0
  8. package/dist/skills/editframe-brand-video-generator/references/editing.md +66 -0
  9. package/dist/skills/editframe-brand-video-generator/references/emotional-arcs.md +496 -0
  10. package/dist/skills/editframe-brand-video-generator/references/genre-selection.md +135 -0
  11. package/dist/skills/editframe-brand-video-generator/references/transition-styles.md +611 -0
  12. package/dist/skills/editframe-brand-video-generator/references/typography-personalities.md +326 -0
  13. package/dist/skills/editframe-brand-video-generator/references/video-archetypes.md +86 -0
  14. package/dist/skills/editframe-brand-video-generator/references/video-fundamentals.md +169 -0
  15. package/dist/skills/editframe-brand-video-generator/references/visual-metaphors.md +50 -0
  16. package/dist/skills/editframe-composition/SKILL.md +169 -0
  17. package/dist/skills/editframe-composition/references/audio.md +483 -0
  18. package/dist/skills/editframe-composition/references/captions.md +844 -0
  19. package/dist/skills/editframe-composition/references/composition-model.md +73 -0
  20. package/dist/skills/editframe-composition/references/configuration.md +403 -0
  21. package/dist/skills/editframe-composition/references/css-parts.md +105 -0
  22. package/dist/skills/editframe-composition/references/css-variables.md +640 -0
  23. package/dist/skills/editframe-composition/references/entry-points.md +810 -0
  24. package/dist/skills/editframe-composition/references/events.md +499 -0
  25. package/dist/skills/editframe-composition/references/getting-started.md +259 -0
  26. package/dist/skills/editframe-composition/references/hooks.md +234 -0
  27. package/dist/skills/editframe-composition/references/image.md +241 -0
  28. package/dist/skills/editframe-composition/references/r3f.md +580 -0
  29. package/dist/skills/editframe-composition/references/render-api.md +484 -0
  30. package/dist/skills/editframe-composition/references/render-strategies.md +119 -0
  31. package/dist/skills/editframe-composition/references/render-to-video.md +1101 -0
  32. package/dist/skills/editframe-composition/references/scripting.md +606 -0
  33. package/dist/skills/editframe-composition/references/sequencing.md +116 -0
  34. package/dist/skills/editframe-composition/references/server-rendering.md +753 -0
  35. package/dist/skills/editframe-composition/references/surface.md +329 -0
  36. package/dist/skills/editframe-composition/references/text.md +627 -0
  37. package/dist/skills/editframe-composition/references/time-model.md +99 -0
  38. package/dist/skills/editframe-composition/references/timegroup-modes.md +102 -0
  39. package/dist/skills/editframe-composition/references/timegroup.md +457 -0
  40. package/dist/skills/editframe-composition/references/timeline-root.md +398 -0
  41. package/dist/skills/editframe-composition/references/transcription.md +47 -0
  42. package/dist/skills/editframe-composition/references/transitions.md +608 -0
  43. package/dist/skills/editframe-composition/references/use-media-info.md +357 -0
  44. package/dist/skills/editframe-composition/references/video.md +506 -0
  45. package/dist/skills/editframe-composition/references/waveform.md +327 -0
  46. package/dist/skills/editframe-editor-gui/SKILL.md +152 -0
  47. package/dist/skills/editframe-editor-gui/references/active-root-temporal.md +657 -0
  48. package/dist/skills/editframe-editor-gui/references/canvas.md +947 -0
  49. package/dist/skills/editframe-editor-gui/references/controls.md +366 -0
  50. package/dist/skills/editframe-editor-gui/references/dial.md +756 -0
  51. package/dist/skills/editframe-editor-gui/references/editor-toolkit.md +587 -0
  52. package/dist/skills/editframe-editor-gui/references/filmstrip.md +460 -0
  53. package/dist/skills/editframe-editor-gui/references/fit-scale.md +772 -0
  54. package/dist/skills/editframe-editor-gui/references/focus-overlay.md +561 -0
  55. package/dist/skills/editframe-editor-gui/references/hierarchy.md +544 -0
  56. package/dist/skills/editframe-editor-gui/references/overlay-item.md +634 -0
  57. package/dist/skills/editframe-editor-gui/references/overlay-layer.md +429 -0
  58. package/dist/skills/editframe-editor-gui/references/pan-zoom.md +568 -0
  59. package/dist/skills/editframe-editor-gui/references/pause.md +397 -0
  60. package/dist/skills/editframe-editor-gui/references/play.md +370 -0
  61. package/dist/skills/editframe-editor-gui/references/preview.md +391 -0
  62. package/dist/skills/editframe-editor-gui/references/resizable-box.md +749 -0
  63. package/dist/skills/editframe-editor-gui/references/scrubber.md +588 -0
  64. package/dist/skills/editframe-editor-gui/references/thumbnail-strip.md +566 -0
  65. package/dist/skills/editframe-editor-gui/references/time-display.md +492 -0
  66. package/dist/skills/editframe-editor-gui/references/timeline-ruler.md +489 -0
  67. package/dist/skills/editframe-editor-gui/references/timeline.md +604 -0
  68. package/dist/skills/editframe-editor-gui/references/toggle-loop.md +618 -0
  69. package/dist/skills/editframe-editor-gui/references/toggle-play.md +526 -0
  70. package/dist/skills/editframe-editor-gui/references/transform-handles.md +924 -0
  71. package/dist/skills/editframe-editor-gui/references/trim-handles.md +725 -0
  72. package/dist/skills/editframe-editor-gui/references/workbench.md +453 -0
  73. package/dist/skills/editframe-motion-design/SKILL.md +101 -0
  74. package/dist/skills/editframe-motion-design/references/0-editframe.md +299 -0
  75. package/dist/skills/editframe-motion-design/references/1-intent.md +201 -0
  76. package/dist/skills/editframe-motion-design/references/2-physics-model.md +405 -0
  77. package/dist/skills/editframe-motion-design/references/3-attention.md +350 -0
  78. package/dist/skills/editframe-motion-design/references/4-process.md +418 -0
  79. package/dist/skills/editframe-vite-plugin/SKILL.md +75 -0
  80. package/dist/skills/editframe-vite-plugin/references/file-api.md +111 -0
  81. package/dist/skills/editframe-vite-plugin/references/getting-started.md +96 -0
  82. package/dist/skills/editframe-vite-plugin/references/jit-transcoding.md +91 -0
  83. package/dist/skills/editframe-vite-plugin/references/local-assets.md +75 -0
  84. package/dist/skills/editframe-vite-plugin/references/visual-testing.md +136 -0
  85. package/dist/skills/editframe-webhooks/SKILL.md +126 -0
  86. package/dist/skills/editframe-webhooks/references/events.md +382 -0
  87. package/dist/skills/editframe-webhooks/references/getting-started.md +232 -0
  88. package/dist/skills/editframe-webhooks/references/security.md +418 -0
  89. package/dist/skills/editframe-webhooks/references/testing.md +409 -0
  90. package/dist/skills/editframe-webhooks/references/troubleshooting.md +457 -0
  91. package/dist/templates/html/AGENTS.md +13 -0
  92. package/dist/templates/react/AGENTS.md +13 -0
  93. package/dist/utils.js +15 -16
  94. package/dist/utils.js.map +1 -1
  95. package/package.json +1 -1
  96. package/tsdown.config.ts +4 -0
  97. package/dist/detectAgent.js +0 -89
  98. 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.