@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,366 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Controls Element
|
|
3
|
+
description: Context bridge that routes playback control actions to non-ancestor timeline elements in complex, nested editor layouts.
|
|
4
|
+
type: reference
|
|
5
|
+
nav:
|
|
6
|
+
parent: "Playback Controls"
|
|
7
|
+
priority: 10
|
|
8
|
+
api:
|
|
9
|
+
attributes:
|
|
10
|
+
- name: target
|
|
11
|
+
type: string
|
|
12
|
+
required: true
|
|
13
|
+
description: ID of the target element to control
|
|
14
|
+
react:
|
|
15
|
+
generate: true
|
|
16
|
+
componentName: Controls
|
|
17
|
+
importPath: "@editframe/react"
|
|
18
|
+
additionalProps:
|
|
19
|
+
- name: className
|
|
20
|
+
type: string
|
|
21
|
+
description: CSS classes for styling
|
|
22
|
+
nav:
|
|
23
|
+
parent: "Tools"
|
|
24
|
+
priority: 41
|
|
25
|
+
related: ["preview", "workbench"]
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
<!-- html-only -->
|
|
29
|
+
# ef-controls
|
|
30
|
+
<!-- /html-only -->
|
|
31
|
+
<!-- react-only -->
|
|
32
|
+
# Controls
|
|
33
|
+
<!-- /react-only -->
|
|
34
|
+
|
|
35
|
+
<!-- html-only -->
|
|
36
|
+
Bridges playback contexts from a target element to its children, enabling controls that don't share a common ancestor with the composition.
|
|
37
|
+
<!-- /html-only -->
|
|
38
|
+
<!-- react-only -->
|
|
39
|
+
Playback controls for timeline navigation.
|
|
40
|
+
<!-- /react-only -->
|
|
41
|
+
|
|
42
|
+
<!-- react-only -->
|
|
43
|
+
## Import
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import { Controls } from "@editframe/react";
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Individual Control Components
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import {
|
|
53
|
+
Play,
|
|
54
|
+
Pause,
|
|
55
|
+
TogglePlay,
|
|
56
|
+
ToggleLoop,
|
|
57
|
+
Scrubber,
|
|
58
|
+
TimeDisplay,
|
|
59
|
+
} from "@editframe/react";
|
|
60
|
+
```
|
|
61
|
+
<!-- /react-only -->
|
|
62
|
+
|
|
63
|
+
## Basic Usage
|
|
64
|
+
|
|
65
|
+
<!-- html-only -->
|
|
66
|
+
Control a composition from outside its DOM tree:
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<ef-timegroup id="my-composition" mode="sequence" class="w-[720px] h-[480px] bg-black">
|
|
70
|
+
<ef-video src="https://assets.editframe.com/bars-n-tone.mp4" class="size-full object-contain"></ef-video>
|
|
71
|
+
</ef-timegroup>
|
|
72
|
+
|
|
73
|
+
<ef-controls target="my-composition" class="flex gap-2 mt-4">
|
|
74
|
+
<ef-toggle-play>
|
|
75
|
+
<button slot="play" class="px-4 py-2 bg-blue-600 text-white rounded">Play</button>
|
|
76
|
+
<button slot="pause" class="px-4 py-2 bg-gray-600 text-white rounded">Pause</button>
|
|
77
|
+
</ef-toggle-play>
|
|
78
|
+
<ef-time-display class="text-gray-300"></ef-time-display>
|
|
79
|
+
</ef-controls>
|
|
80
|
+
```
|
|
81
|
+
<!-- /html-only -->
|
|
82
|
+
<!-- react-only -->
|
|
83
|
+
```tsx
|
|
84
|
+
import { Controls, Preview } from "@editframe/react";
|
|
85
|
+
|
|
86
|
+
<div className="flex flex-col">
|
|
87
|
+
<Preview className="w-full h-[600px]" />
|
|
88
|
+
<Controls className="w-full bg-gray-800 p-2" />
|
|
89
|
+
</div>
|
|
90
|
+
```
|
|
91
|
+
<!-- /react-only -->
|
|
92
|
+
|
|
93
|
+
<!-- html-only -->
|
|
94
|
+
## Context Bridging
|
|
95
|
+
|
|
96
|
+
`ef-controls` provides these contexts to its children:
|
|
97
|
+
|
|
98
|
+
- **playing** - Current playback state (boolean)
|
|
99
|
+
- **loop** - Loop state (boolean)
|
|
100
|
+
- **currentTimeMs** - Current playhead position (number)
|
|
101
|
+
- **durationMs** - Total duration (number)
|
|
102
|
+
- **targetTemporal** - Reference to the controlled element
|
|
103
|
+
- **focusedElement** - Currently focused element
|
|
104
|
+
|
|
105
|
+
Child elements like `ef-play`, `ef-pause`, `ef-toggle-play`, `ef-scrubber`, and `ef-time-display` automatically consume these contexts.
|
|
106
|
+
|
|
107
|
+
## Non-Adjacent Controls
|
|
108
|
+
|
|
109
|
+
Use `ef-controls` when your playback controls are not descendants of the composition:
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<!-- Composition in one part of the page -->
|
|
113
|
+
<div class="video-area">
|
|
114
|
+
<ef-timegroup id="video-player" mode="contain" class="w-full aspect-video">
|
|
115
|
+
<ef-video src="video.mp4" class="size-full"></ef-video>
|
|
116
|
+
</ef-timegroup>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Controls in a fixed toolbar -->
|
|
120
|
+
<div class="fixed bottom-0 left-0 right-0 bg-black p-4">
|
|
121
|
+
<ef-controls target="video-player" class="flex justify-center gap-4">
|
|
122
|
+
<ef-toggle-play>
|
|
123
|
+
<button slot="play">▶</button>
|
|
124
|
+
<button slot="pause">⏸</button>
|
|
125
|
+
</ef-toggle-play>
|
|
126
|
+
<ef-scrubber class="flex-1"></ef-scrubber>
|
|
127
|
+
<ef-time-display></ef-time-display>
|
|
128
|
+
</ef-controls>
|
|
129
|
+
</div>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Target Types
|
|
133
|
+
|
|
134
|
+
`ef-controls` supports targeting:
|
|
135
|
+
|
|
136
|
+
- **ef-timegroup** - Control a composition directly
|
|
137
|
+
- **ef-video** - Control a single video element
|
|
138
|
+
- **ef-audio** - Control a single audio element
|
|
139
|
+
- **ef-preview** - Control via preview's context (if preview wraps the target)
|
|
140
|
+
|
|
141
|
+
## Multiple Control Sets
|
|
142
|
+
|
|
143
|
+
Multiple `ef-controls` elements can target the same composition:
|
|
144
|
+
|
|
145
|
+
```html
|
|
146
|
+
<ef-timegroup id="main" mode="contain">
|
|
147
|
+
<!-- composition -->
|
|
148
|
+
</ef-timegroup>
|
|
149
|
+
|
|
150
|
+
<!-- Desktop controls -->
|
|
151
|
+
<ef-controls target="main" class="desktop-only">
|
|
152
|
+
<ef-toggle-play>
|
|
153
|
+
<button slot="play">Play</button>
|
|
154
|
+
<button slot="pause">Pause</button>
|
|
155
|
+
</ef-toggle-play>
|
|
156
|
+
</ef-controls>
|
|
157
|
+
|
|
158
|
+
<!-- Mobile controls -->
|
|
159
|
+
<ef-controls target="main" class="mobile-only">
|
|
160
|
+
<ef-toggle-play>
|
|
161
|
+
<button slot="play">▶</button>
|
|
162
|
+
<button slot="pause">⏸</button>
|
|
163
|
+
</ef-toggle-play>
|
|
164
|
+
</ef-controls>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Without ef-controls
|
|
168
|
+
|
|
169
|
+
If controls are direct descendants of a timegroup, you don't need `ef-controls`:
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<ef-timegroup mode="contain">
|
|
173
|
+
<ef-video src="video.mp4"></ef-video>
|
|
174
|
+
|
|
175
|
+
<!-- These controls work without ef-controls because they're descendants -->
|
|
176
|
+
<div class="absolute bottom-4 left-4 flex gap-2">
|
|
177
|
+
<ef-toggle-play>
|
|
178
|
+
<button slot="play">Play</button>
|
|
179
|
+
<button slot="pause">Pause</button>
|
|
180
|
+
</ef-toggle-play>
|
|
181
|
+
</div>
|
|
182
|
+
</ef-timegroup>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Use `ef-controls` when the target is **not** an ancestor of the control elements.
|
|
186
|
+
<!-- /html-only -->
|
|
187
|
+
|
|
188
|
+
<!-- react-only -->
|
|
189
|
+
## Individual Controls
|
|
190
|
+
|
|
191
|
+
Build custom control layouts:
|
|
192
|
+
|
|
193
|
+
```tsx
|
|
194
|
+
import { TogglePlay, ToggleLoop, Scrubber, TimeDisplay } from "@editframe/react";
|
|
195
|
+
|
|
196
|
+
<div className="flex items-center gap-4 bg-gray-800 p-4">
|
|
197
|
+
<TogglePlay className="w-10 h-10" />
|
|
198
|
+
<TimeDisplay className="text-white text-sm font-mono" />
|
|
199
|
+
<Scrubber className="flex-1" />
|
|
200
|
+
<ToggleLoop className="w-10 h-10" />
|
|
201
|
+
</div>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Styled Controls
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
<div className="flex items-center gap-3 bg-gradient-to-r from-slate-800 to-slate-900 p-4 rounded-lg shadow-lg">
|
|
208
|
+
<TogglePlay className="text-white hover:text-blue-400 transition" />
|
|
209
|
+
<Scrubber className="flex-1 h-2" />
|
|
210
|
+
<TimeDisplay className="text-white text-xs font-mono bg-black/30 px-2 py-1 rounded" />
|
|
211
|
+
<ToggleLoop className="text-white hover:text-green-400 transition" />
|
|
212
|
+
</div>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Full Editor Controls
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
import {
|
|
219
|
+
Preview,
|
|
220
|
+
TogglePlay,
|
|
221
|
+
ToggleLoop,
|
|
222
|
+
Scrubber,
|
|
223
|
+
TimeDisplay
|
|
224
|
+
} from "@editframe/react";
|
|
225
|
+
|
|
226
|
+
export const VideoEditor = () => {
|
|
227
|
+
return (
|
|
228
|
+
<div className="h-screen flex flex-col bg-gray-900">
|
|
229
|
+
{/* Preview */}
|
|
230
|
+
<div className="flex-1 flex items-center justify-center p-8">
|
|
231
|
+
<Preview className="w-full max-w-[1280px] aspect-video bg-black rounded-lg" />
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
{/* Controls Bar */}
|
|
235
|
+
<div className="bg-gray-800 border-t border-gray-700">
|
|
236
|
+
<div className="flex items-center gap-4 px-6 py-3">
|
|
237
|
+
{/* Play/Pause */}
|
|
238
|
+
<TogglePlay className="w-8 h-8 text-white hover:text-blue-400" />
|
|
239
|
+
|
|
240
|
+
{/* Time Display */}
|
|
241
|
+
<TimeDisplay className="text-white text-sm font-mono min-w-[120px]" />
|
|
242
|
+
|
|
243
|
+
{/* Scrubber */}
|
|
244
|
+
<div className="flex-1">
|
|
245
|
+
<Scrubber className="w-full h-2" />
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
{/* Loop Toggle */}
|
|
249
|
+
<ToggleLoop className="w-8 h-8 text-white hover:text-green-400" />
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
);
|
|
254
|
+
};
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Minimal Controls
|
|
258
|
+
|
|
259
|
+
```tsx
|
|
260
|
+
<div className="flex items-center gap-2 p-2 bg-black/80 rounded">
|
|
261
|
+
<TogglePlay className="w-6 h-6 text-white" />
|
|
262
|
+
<Scrubber className="flex-1" />
|
|
263
|
+
</div>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## Scrubber Component
|
|
267
|
+
|
|
268
|
+
The timeline scrubber for seeking:
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
import { Scrubber } from "@editframe/react";
|
|
272
|
+
|
|
273
|
+
<Scrubber
|
|
274
|
+
className="w-full h-2 bg-gray-700 rounded cursor-pointer"
|
|
275
|
+
/>
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### CSS Custom Properties
|
|
279
|
+
|
|
280
|
+
| Property | Default | Description |
|
|
281
|
+
|----------|---------|-------------|
|
|
282
|
+
| `--ef-scrubber-height` | `4px` | Track height |
|
|
283
|
+
| `--ef-scrubber-background` | `rgba(255, 255, 255, 0.2)` | Track background color |
|
|
284
|
+
| `--ef-scrubber-progress-color` | `#fff` | Progress bar and handle color |
|
|
285
|
+
| `--ef-scrubber-handle-size` | `12px` | Handle diameter |
|
|
286
|
+
|
|
287
|
+
### CSS Shadow Parts
|
|
288
|
+
|
|
289
|
+
Style internal elements from the outside using `::part()`:
|
|
290
|
+
|
|
291
|
+
| Part | Description |
|
|
292
|
+
|------|-------------|
|
|
293
|
+
| `scrubber` | The track container |
|
|
294
|
+
| `progress` | The filled progress bar |
|
|
295
|
+
| `handle` | The draggable seek handle |
|
|
296
|
+
|
|
297
|
+
```tsx
|
|
298
|
+
<Scrubber
|
|
299
|
+
className={`
|
|
300
|
+
w-full h-1.5 bg-white/20 rounded-full cursor-pointer
|
|
301
|
+
[&::part(progress)]:bg-red-500
|
|
302
|
+
[&::part(progress)]:rounded-full
|
|
303
|
+
[&::part(handle)]:bg-white
|
|
304
|
+
[&::part(handle)]:w-3
|
|
305
|
+
[&::part(handle)]:h-3
|
|
306
|
+
[&::part(handle)]:rounded-full
|
|
307
|
+
`}
|
|
308
|
+
/>
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## TimeDisplay Component
|
|
312
|
+
|
|
313
|
+
Shows current time and duration:
|
|
314
|
+
|
|
315
|
+
```tsx
|
|
316
|
+
import { TimeDisplay } from "@editframe/react";
|
|
317
|
+
|
|
318
|
+
<TimeDisplay className="text-white text-sm font-mono" />
|
|
319
|
+
// Displays: "00:05 / 00:30"
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
## TogglePlay Component
|
|
323
|
+
|
|
324
|
+
Play/pause button:
|
|
325
|
+
|
|
326
|
+
```tsx
|
|
327
|
+
import { TogglePlay } from "@editframe/react";
|
|
328
|
+
|
|
329
|
+
<TogglePlay className="w-10 h-10 text-white hover:text-blue-400" />
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## ToggleLoop Component
|
|
333
|
+
|
|
334
|
+
Enable/disable looping:
|
|
335
|
+
|
|
336
|
+
```tsx
|
|
337
|
+
import { ToggleLoop } from "@editframe/react";
|
|
338
|
+
|
|
339
|
+
<ToggleLoop className="w-10 h-10 text-white hover:text-green-400" />
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
## Custom Control Bar
|
|
343
|
+
|
|
344
|
+
```tsx
|
|
345
|
+
const CustomControls = () => {
|
|
346
|
+
return (
|
|
347
|
+
<div className="fixed bottom-0 left-0 right-0 bg-gradient-to-t from-black to-transparent p-6">
|
|
348
|
+
<div className="max-w-4xl mx-auto">
|
|
349
|
+
{/* Scrubber on top */}
|
|
350
|
+
<Scrubber className="w-full h-1 mb-4" />
|
|
351
|
+
|
|
352
|
+
{/* Buttons below */}
|
|
353
|
+
<div className="flex items-center justify-between">
|
|
354
|
+
<div className="flex items-center gap-4">
|
|
355
|
+
<TogglePlay className="w-12 h-12 text-white" />
|
|
356
|
+
<TimeDisplay className="text-white text-lg font-mono" />
|
|
357
|
+
</div>
|
|
358
|
+
|
|
359
|
+
<ToggleLoop className="w-10 h-10 text-white" />
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
363
|
+
);
|
|
364
|
+
};
|
|
365
|
+
```
|
|
366
|
+
<!-- /react-only -->
|