@warpgogol/forge 1.1.0 → 1.2.2

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.
@@ -1,103 +0,0 @@
1
- schema: forge/stack-profile@1
2
- id: obsidian-vault
3
- displayName: Obsidian Knowledge Base
4
- detect:
5
- anyOf:
6
- - .obsidian/app.json
7
- - vault/**/*.md
8
- domain: knowledge-base
9
- register: creative
10
- terminology:
11
- artifact: note
12
- artifactPlural: notes
13
- module: folder
14
- source: markdown file
15
- output: export
16
- verify: link-check
17
- operator: author
18
- scriptDir: scripts
19
- artifacts:
20
- - id: note
21
- extensions:
22
- - .md
23
- validate:
24
- command: note.link.validate
25
- - id: canvas
26
- extensions:
27
- - .canvas
28
- - id: attachment
29
- extensions:
30
- - .png
31
- - .jpg
32
- - .jpeg
33
- - .webp
34
- - .svg
35
- - .pdf
36
- - .mp4
37
- - .webm
38
- workspaceTypes:
39
- - id: vault
40
- detect:
41
- glob: "**/*.md"
42
- contains: "---"
43
- invariants:
44
- - id: NOTE-01
45
- rule: All [[wikilinks]] must resolve to an existing note file
46
- severity: error
47
- check:
48
- kind: link-resolution
49
- glob: "vault/**/*.md"
50
- - id: NOTE-02
51
- rule: Every note must have a title in frontmatter (title or first H1)
52
- severity: warning
53
- check:
54
- kind: frontmatter-required
55
- glob: "vault/**/*.md"
56
- fields: [title]
57
- - id: NOTE-03
58
- rule: No executable code files in vault/ (scripts go to scripts/ per ADR-0043)
59
- severity: error
60
- check:
61
- kind: path-exclusion
62
- glob: "vault/**/*.{ts,mjs,js,py,sh}"
63
- - id: NOTE-04
64
- rule: Note filenames must use kebab-case (lowercase letters, digits, hyphens)
65
- severity: warning
66
- check:
67
- kind: filename-pattern
68
- glob: "vault/**/*.md"
69
- pattern: "^[a-z0-9]+(-[a-z0-9]+)*\\.md$"
70
- workspace:
71
- dirs:
72
- - vault
73
- - scripts
74
- - .forge
75
- files:
76
- - path: .gitignore
77
- content: |
78
- node_modules
79
- .obsidian/workspace
80
- .obsidian/workspace.json
81
- .cache
82
- operator-profile.md
83
- - path: forge.yaml
84
- content: |
85
- schema: forge/config@1
86
- project:
87
- name: __PROJECT_NAME__
88
- stack:
89
- - obsidian-vault
90
- packageManager: pnpm
91
- paths:
92
- rfcsDir: docs/rfcs
93
- adrsDir: docs/adrs
94
- - path: package.json
95
- content: |
96
- {
97
- "name": "__PROJECT_NAME__",
98
- "version": "0.1.0",
99
- "private": true,
100
- "type": "module"
101
- }
102
- install:
103
- - pnpm add -D @warpgogol/forge
@@ -1,92 +0,0 @@
1
- ---
2
- name: ef-brand-video-generator
3
- description: "Generate brand video compositions from templates — logo animation, intro/outro, brand colors, typography. Use when the operator asks to generate a brand video."
4
- invocation: user
5
- category: fo
6
- concerns: content-mutation
7
- dependsOn: []
8
- languagePolicy: ref(PREFERENCES.md)
9
- triggers:
10
- - "generate a brand video"
11
- - "create a logo animation"
12
- - "brand intro video"
13
- - "brand outro video"
14
- source: domain-knowledge
15
- ---
16
-
17
- <!-- skill-lint-disable SKILL-17 -->
18
-
19
- Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
20
-
21
- # Brand Video Generator
22
-
23
- Generate brand video compositions from reusable templates. Brand videos typically include logo animations, intro/outro sequences, brand color overlays, and typography that matches brand guidelines.
24
-
25
- ## Template structure
26
-
27
- A brand video composition uses `@editframe/react` components with brand-specific assets:
28
-
29
- ```tsx
30
- import { Timegroup, Video, Image, Text } from "@editframe/react";
31
-
32
- export default function BrandIntro() {
33
- return (
34
- <Timegroup duration="3s" mode="sequence">
35
- <Image src="assets/logo.svg" duration="1s" fit="contain" />
36
- <Text duration="1s" style={{ color: "#FF6B00", fontSize: "64px" }}>
37
- Your Brand
38
- </Text>
39
- <Video src="assets/brand-bg.mp4" fit="cover" duration="1s" />
40
- </Timegroup>
41
- );
42
- }
43
- ```
44
-
45
- ## Brand asset checklist
46
-
47
- - **Logo** — SVG or PNG with transparent background
48
- - **Brand colors** — primary, secondary, accent as CSS color values
49
- - **Typography** — brand font family, weights, sizes
50
- - **Background video** — optional branded background clip
51
- - **Audio** — optional brand jingle or voiceover
52
-
53
- ## Common brand video patterns
54
-
55
- ### Logo animation
56
-
57
- Animate the logo in with a `Timegroup` using `mode="sequence"`:
58
-
59
- ```tsx
60
- <Timegroup duration="2s" mode="sequence">
61
- <Image src="assets/logo.svg" duration="0.5s" fit="contain" />
62
- <Text duration="1.5s" style={{ color: "#FF6B00", fontSize: "48px" }}>Your Brand</Text>
63
- </Timegroup>
64
- ```
65
-
66
- ### Intro/outro pair
67
-
68
- Create separate compositions for intro and outro, then combine them in a parent `Timegroup`:
69
-
70
- ```tsx
71
- <Timegroup duration="15s" mode="sequence">
72
- <BrandIntro />
73
- <MainContent />
74
- <BrandOutro />
75
- </Timegroup>
76
- ```
77
-
78
- ### Brand color overlay
79
-
80
- Use a semi-transparent `Image` or `Text` overlay with brand colors:
81
-
82
- ```tsx
83
- <Image src="assets/brand-overlay.png" duration="10s" fit="cover" />
84
- ```
85
-
86
- ## Rendering
87
-
88
- Run `ref(forge.yaml bindings.commands.build)` to render the brand video. Use `ref(forge.yaml bindings.commands.validate)` to check the composition before rendering.
89
-
90
- ## Customization
91
-
92
- Each brand video template accepts parameters for logo, colors, text, and timing. Adjust the `duration`, `mode`, and asset paths to match the brand guidelines.
@@ -1,156 +0,0 @@
1
- ---
2
- name: ef-composition
3
- description: "Guide creating a video composition with Editframe React components — time model, media elements, rendering. Use when the operator asks to create or build a video composition."
4
- invocation: user
5
- category: fo
6
- concerns: content-mutation
7
- dependsOn: []
8
- languagePolicy: ref(PREFERENCES.md)
9
- triggers:
10
- - "create a video composition"
11
- - "build a video with editframe"
12
- - "create a composition"
13
- - "add a scene to my video"
14
- source: https://editframe.com/skills/composition.md
15
- ---
16
-
17
- <!-- skill-lint-disable SKILL-17 -->
18
-
19
- Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
20
-
21
- # Video Composition
22
-
23
- Build video scenes with React components from `@editframe/react`, for example `<Timegroup>` and `<Video>`. Both HTML web component syntax (`<ef-timegroup>`) and React syntax (`<Timegroup>`) share the same composition model and rendering pipeline.
24
-
25
- Web component attributes use kebab-case (`file-id`, `api-host`). React props use camelCase (`fileId`, `apiHost`). Four attributes break this pattern: `sourcein`, `sourceout`, `trimstart`, `trimend` — same lowercase string in both forms.
26
-
27
- ## Quick Start
28
-
29
- ```tsx
30
- import { Configuration, Timegroup, Video, Text, Audio, Captions, Workbench } from "@editframe/react";
31
-
32
- export default function Composition() {
33
- return (
34
- <Workbench resolution="1920x1080">
35
- <Configuration>
36
- <Timegroup
37
- id="root"
38
- duration="10s"
39
- mode="contain"
40
- style={{ width: "1920px", height: "1080px", background: "#000", display: "flex", alignItems: "center", justifyContent: "center" }}
41
- >
42
- <Video src="assets/background.mp4" fit="contain" duration="10s" />
43
- <Text duration="5s" style={{ color: "white", fontSize: "48px", textAlign: "center" }}>
44
- Hello, Editframe!
45
- </Text>
46
- <Audio src="assets/narration.mp3" />
47
- <Captions src="assets/captions.vtt" />
48
- </Timegroup>
49
- </Configuration>
50
- </Workbench>
51
- );
52
- }
53
- ```
54
-
55
- Run `ref(forge.yaml bindings.commands.devServer)` to preview. Run `ref(forge.yaml bindings.commands.build)` to render.
56
-
57
- ## Duration units
58
-
59
- - `5s` — seconds
60
- - `500ms` — milliseconds
61
- - `2.5s` — fractional seconds
62
-
63
- ## Core concepts
64
-
65
- ### Time model
66
-
67
- A composition is a tree of `Timegroup` elements. The root `Timegroup` defines the composition's total duration. Child elements inherit timing context from their parent. Inside a `Workbench`, use `Timegroup` directly as the root temporal element — do NOT wrap it in `TimelineRoot`, which renders a `<div style="display: contents">` wrapper that breaks Workbench's DOM structure.
68
-
69
- ### Timegroups and sequencing
70
-
71
- - **`mode="sequence"`** — children play one after another
72
- - **`mode="fixed"`** — children play at absolute offsets
73
- - **`mode="contain"`** (default) — children fit within parent duration
74
- - **`mode="fit"`** — children scale to fit
75
-
76
- ### Transitions
77
-
78
- Use `ef-transition` or the `transition` prop to declare CSS-like transitions between scenes.
79
-
80
- ### Scripting
81
-
82
- Compositions support inline scripting via `ef-script` or the `script` prop for dynamic behavior during rendering.
83
-
84
- ## Media elements
85
-
86
- - **`Video`** (`ef-video`) — video source with `fit` mode (`contain`, `cover`, `fill`)
87
- - **`Audio`** (`ef-audio`) — audio source with FFT analysis (`fftSize`, `fftGain`, `fftDecay`)
88
- - **`Image`** (`ef-image`) — image source
89
- - **`Text`** (`ef-text`) — text overlay with positioning. Splits text into `ef-text-segment` children (`split="word"`, `split="char"`, `split="line"`). Set `stagger` to delay each segment's start. Segments render in light DOM with `data-active` attribute and `--ef-index`, `--ef-word-index`, `--ef-stagger-offset`, `--ef-seed` custom properties.
90
- - **`Captions`** (`ef-captions`) — synchronized captions with word-level highlighting. Accepts caption data via `captionsSrc` (URL to JSON), `captionsScript` (inline script id), or `captionsData` (JS property). JSON uses `segments` or `word_segments` shape with `start`/`end` times.
91
- - **`Waveform`** (`ef-waveform`) — visualizes an `ef-audio` or `ef-video` `target`. Modes: `bars`, `line`, `curve`, `bricks`, `pixel`, `wave`, `spikes`, `roundBars`.
92
- - **`Surface`** (`ef-surface`) — mirrors another element's pixels onto its own canvas. Set `target` to a canvas or any `HTMLElement` to reuse a video's decoded frames without re-decoding.
93
- - **`PanZoom`** (`ef-pan-zoom`) — pan and zoom control for video/image elements.
94
- - **`MotionBlur`** (`ef-motionblur`) — motion blur effect.
95
- - **`Configuration`** (`ef-configuration`) — opt-in element for API authentication. Add when deploying against the Editframe API: `apiHost` and `signingUrl` for signed-URL auth on cross-origin media, `imageProxy` for cross-origin image proxying. Skip for compositions using only local files.
96
-
97
- ## Rendering
98
-
99
- **Browser export.** Call `renderTimegroupToVideo(timegroup, options)` from `@editframe/elements` to encode a live `ef-timegroup` to a video file. Uses WebCodecs. Key options: `width`/`height`/`fps`, `from`/`to` (export range in seconds), `videoCodec`/`audioCodec`/`videoBitrate`/`audioBitrate`, `target` (mediabunny output target), `signal` (AbortSignal), `onProgress`.
100
-
101
- For in-app export from an interactive preview, use `ef-workbench`'s `exportVideo()` method (see the `ef-editor-gui` skill). For CLI/cloud rendering (`editframe render`), the `window.EF_RENDER` path handles offscreen cloning automatically.
102
-
103
- **Custom render data.** A CLI or Playwright host can inject arbitrary JSON into `window.EF_RENDER_DATA` before running the composition. Read it with `getRenderData<T>()` (module-level function) or `useRenderData<T>()` (React hook). Use this to parameterize a render without templating the composition.
104
-
105
- Run `ref(forge.yaml bindings.commands.build)` to produce the final video output. Use `ref(forge.yaml bindings.commands.validate)` to check composition structure before rendering.
106
-
107
- ## React
108
-
109
- Import components from `@editframe/react`. React props use camelCase. The composition is a standard React component that returns JSX.
110
-
111
- ### React Three Fiber
112
-
113
- Wrap a `<Timegroup>` child in `<CompositionCanvas>` from `@editframe/react/r3f` to get an R3F `<Canvas>` synced to composition time. Read the clock with `useCompositionTime()` which returns `{ time, duration }` in seconds.
114
-
115
- ```tsx
116
- <Timegroup mode="fixed" duration="14s">
117
- <CompositionCanvas shadows>
118
- <MyScene />
119
- </CompositionCanvas>
120
- </Timegroup>
121
- ```
122
-
123
- For 3D in a Web Worker, use `OffscreenCompositionCanvas` with `@react-three/offscreen`.
124
-
125
- ### Server-side rendering
126
-
127
- `@editframe/react/server` and `@editframe/elements/server` export composition components and types only — no custom-element registration, no DOM, canvas, or WebCodecs code. Import safely in Next.js or Remix server code. These server entry points do not include GUI components or hooks — render those on the client with `dynamic(() => import("@editframe/react"), { ssr: false })`.
128
-
129
- ### Package entry points
130
-
131
- | Import | Environment | Contains |
132
- | --- | --- | --- |
133
- | `@editframe/elements` | Browser | All custom elements, canvas/WebCodecs rendering |
134
- | `@editframe/elements/server` | Browser, Node, SSR | Types only, plus `getRenderInfo()` (browser-only at runtime) |
135
- | `@editframe/elements/gui` | Browser | Editor GUI custom elements (timeline, scrubber, handles) |
136
- | `@editframe/elements/styles.css` | Browser | Base + theme styles |
137
- | `@editframe/react` | Browser | React composition + GUI components, hooks |
138
- | `@editframe/react/server` | Browser, Node, SSR | Composition components only, no hooks/GUI |
139
- | `@editframe/react/r3f` | Browser | `CompositionCanvas`, `OffscreenCompositionCanvas`, `useCompositionTime` |
140
-
141
- ## Element reference
142
-
143
- | Element | React component | Key props |
144
- | --- | --- | --- |
145
- | `ef-timegroup` | `Timegroup` | `duration`, `mode`, `fps`, `offset`, `loop` |
146
- | `ef-video` | `Video` | `src`, `fit`, `duration`, `fileId`, `sourcein`, `sourceout`, `trimstart`, `trimend` |
147
- | `ef-audio` | `Audio` | `src`, `duration`, `volume`, `mute`, `loop`, `fftSize`, `fftGain` |
148
- | `ef-text` | `Text` | `duration`, `split`, `stagger` — text content passed as children, styling via `style` prop or CSS classes |
149
- | `ef-captions` | `Captions` | `captionsSrc`, `captionsScript`, `target`, `wordStyle`, `duration` |
150
- | `ef-image` | `Image` | `src`, `fit`, `duration`, `fileId` |
151
- | `ef-waveform` | `Waveform` | `target`, `mode`, `color` |
152
- | `ef-surface` | `Surface` | `target` |
153
- | `ef-pan-zoom` | `PanZoom` | `target`, `pan`, `zoom` |
154
- | `ef-configuration` | `Configuration` | `apiHost`, `signingUrl`, `imageProxy` |
155
- | `ef-transition` | `Transition` | `type`, `duration` |
156
- | `ef-script` | `Script` | `src`, `inline` |
@@ -1,68 +0,0 @@
1
- ---
2
- name: ef-composition-review
3
- description: Review an Editframe React composition for time model correctness, accessibility, and best practices
4
- invocation: user
5
- category: fo
6
- concerns: read-only
7
- dependsOn: []
8
- languagePolicy: ref(PREFERENCES.md)
9
- ---
10
-
11
- <!-- skill-lint-disable SKILL-17 -->
12
-
13
- # ef-composition-review
14
-
15
- Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
16
-
17
- A read-only review of an Editframe React composition file. The skill checks time model correctness, accessibility, asset references, automated invariants, and manual best practices. It does **not** modify any file — it produces a structured report and stops.
18
-
19
- ## Scope
20
-
21
- This skill reviews `.tsx` composition files that use `@editframe/react` components (`Workbench`, `Configuration`, `Timegroup`, `Video`, `Audio`, `Text`, `Captions`). It is designed for projects using the `editframe` stack profile.
22
-
23
- **TimelineRoot check:** If `TimelineRoot` is used inside `Workbench`, report it as an error — it renders a `<div style="display: contents">` wrapper that breaks Workbench's DOM structure. The correct structure is `Workbench > Configuration > Timegroup`.
24
-
25
- ## Process
26
-
27
- ### 1. Empty state check
28
-
29
- Scan the `compositions/` directory for `.tsx` files. If no compositions are found, report "No compositions found — nothing to review" and stop. Do not report false positives on an empty project.
30
-
31
- ### 2. Time model review
32
-
33
- For each composition file:
34
-
35
- - Check that the root `Timegroup` declares a `duration` prop or uses `mode="contain"` / `mode="fit"`.
36
- - Check that all `duration` and `offset` values are valid CSS time strings (e.g. `5s`, `300ms`, `2.5s`).
37
- - Check that `mode` values are one of: `sequence`, `fixed`, `contain`, `fit`.
38
- - Check that `fps` is a positive integer (e.g. `30`, `60`).
39
- - Check that `loop` is only present on the root `Timegroup` — nested Timegroups should not loop.
40
-
41
- ### 3. Accessibility review
42
-
43
- - Check that all `Audio` components with speech content have corresponding `Captions` components.
44
- - Check that `Text` components have sufficient contrast between foreground and background colors (if declared via inline styles or CSS classes).
45
-
46
- ### 4. Asset reference review
47
-
48
- - Check that all `src` props in `Video`, `Audio`, and `Image` components point to files that exist in the `assets/` directory.
49
- - Check that asset filenames use kebab-case (lowercase letters, digits, hyphens only).
50
-
51
- ### 5. Invariant check
52
-
53
- Run `forge doctor` to check all profile invariants automatically. For the `editframe` profile, this covers VIDEO-01 through VIDEO-09 (filename conventions, scene fit modes, captions, and time model invariants). Review the output and include any violations in the report.
54
-
55
- ### 6. Manual best practices
56
-
57
- Review aspects not covered by automated invariants:
58
-
59
- - Scene composition quality — are scenes well-structured with clear transitions?
60
- - Narrative pacing — does the timing flow naturally?
61
- - Visual hierarchy — are text elements readable and well-positioned?
62
- - Asset reuse — are assets reused efficiently across scenes?
63
-
64
- Do not duplicate checks that `forge doctor` already performs.
65
-
66
- ### 7. Report
67
-
68
- Summarize findings organized by category (time model, accessibility, assets, invariants, best practices). For each finding, include the file path, line number (if applicable), severity (error / warning / info), and a specific recommendation.
@@ -1,107 +0,0 @@
1
- ---
2
- name: ef-dev-server
3
- description: "Set up and manage the Editframe dev server for live preview and local asset serving. Use when the operator asks to set up or configure the Editframe dev server."
4
- invocation: user
5
- category: fo
6
- concerns: read-only
7
- dependsOn: []
8
- languagePolicy: ref(PREFERENCES.md)
9
- triggers:
10
- - "set up editframe dev server"
11
- - "configure editframe preview"
12
- - "local asset serving"
13
- - "dev server not working"
14
- source: https://editframe.com/skills/dev-server.md
15
- ---
16
-
17
- <!-- skill-lint-disable SKILL-17 -->
18
-
19
- Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
20
-
21
- # Dev Server
22
-
23
- The Editframe dev server provides JIT video transcoding, local image and caption serving, and a local files API that mirrors the production files API. It integrates with Vite, Next.js, or any framework-agnostic setup.
24
-
25
- ## Vite setup
26
-
27
- ```typescript
28
- // vite.config.ts
29
- import { defineConfig } from "vite";
30
- import { vitePluginEditframe } from "@editframe/vite-plugin";
31
-
32
- export default defineConfig({
33
- plugins: [
34
- vitePluginEditframe({
35
- root: "./src",
36
- cacheRoot: "./cache",
37
- }),
38
- ],
39
- });
40
- ```
41
-
42
- The plugin mounts onto Vite's own dev server. Compositions make same-origin requests. No separate port and no CORS setup are necessary.
43
-
44
- ## Next.js setup
45
-
46
- ```javascript
47
- // next.config.mjs
48
- import { withEditframe } from "@editframe/nextjs-plugin";
49
-
50
- export default withEditframe(
51
- { root: "./src", cacheRoot: "./cache" },
52
- {
53
- // your existing Next.js config
54
- },
55
- );
56
- ```
57
-
58
- `withEditframe` starts a sidecar HTTP server next to `next dev`, on port 3099 by default. Override the port with a `port` option. It also adds `rewrites()` rules that proxy Editframe's requests to that sidecar, so compositions still make same-origin requests. Run `next dev` as usual. No other setup is necessary.
59
-
60
- The sidecar does not start in production. Deploy against real media (cloud renders, uploaded files) instead.
61
-
62
- ## Framework-agnostic setup
63
-
64
- For a toolchain with no Vite or Next.js integration, call `@editframe/dev-server` directly:
65
-
66
- ```typescript
67
- import { createEditframeDevServer, createProdEfHandlers } from "@editframe/dev-server";
68
- import {
69
- generateTrack,
70
- generateScrubTrack,
71
- generateTrackFragmentIndex,
72
- cacheImage,
73
- findOrCreateCaptions,
74
- md5FilePath,
75
- } from "@editframe/assets";
76
- import { Client, createURLToken } from "@editframe/api";
77
-
78
- const server = createEditframeDevServer(
79
- { root: "./src", cacheRoot: "./cache" },
80
- { generateTrack, generateScrubTrack, generateTrackFragmentIndex, cacheImage, findOrCreateCaptions, md5FilePath },
81
- createProdEfHandlers({
82
- createURLToken,
83
- getClient: () => new Client(process.env.EF_TOKEN),
84
- }),
85
- );
86
-
87
- server.listen(3001, () => console.log("Editframe dev server running on http://localhost:3001"));
88
- ```
89
-
90
- ## What it enables
91
-
92
- - **JIT video transcoding** — reference a local video file directly (`<Video src="clip.mp4" />`). The dev server transcodes it into streamable segments on first request, then serves cached segments.
93
- - **Local image and caption serving** — `<Image>` and caption generation work against local files.
94
- - **A local files API** that mirrors the shape of the production files API.
95
- - **URL signing** — `ef-configuration`'s default `signing-url` forwards to the real Editframe cloud API. Set `EF_TOKEN` before starting the dev server. Set `EF_HOST` to point at a non-default API host.
96
-
97
- ## Framework-agnostic middleware integration
98
-
99
- If your toolchain already exposes a Connect-compatible middleware stack (Express, Connect, or a custom Vite integration), call `createEditframeRouter(...)` with the same three arguments instead. Mount the result with `.use()`. `createEditframeDevServer` wraps that same router in its own standalone `http.Server`, for toolchains with no middleware stack of their own.
100
-
101
- ## Visual regression testing (Vite only)
102
-
103
- The Vite plugin supports visual regression testing. Configure snapshot directories and thresholds in the plugin options.
104
-
105
- ## Debug logging
106
-
107
- Set `DEBUG=editframe:*` to enable verbose logging from the dev server and plugin.
@@ -1,131 +0,0 @@
1
- ---
2
- name: ef-editor-gui
3
- description: "Configure the Editframe editor GUI for visual composition editing — timeline, scrubber, canvas, preview controls. Use when the operator asks to set up or use the Editframe editor."
4
- invocation: user
5
- category: fo
6
- concerns: read-only
7
- dependsOn: []
8
- languagePolicy: ref(PREFERENCES.md)
9
- triggers:
10
- - "open editframe editor"
11
- - "set up editor gui"
12
- - "add timeline controls"
13
- - "visual editing"
14
- source: https://editframe.com/skills/editor-gui.md
15
- ---
16
-
17
- <!-- skill-lint-disable SKILL-17 -->
18
-
19
- Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
20
-
21
- # Editor Toolkit
22
-
23
- The Editframe editor toolkit provides visual composition editing controls: timeline, scrubber, canvas, preview, playback, and transformation.
24
-
25
- ## Quick start
26
-
27
- ```html
28
- <ef-timegroup id="my-video">
29
- <ef-video src="/video.mp4"></ef-video>
30
- </ef-timegroup>
31
-
32
- <ef-controls target="my-video">
33
- <ef-toggle-play></ef-toggle-play>
34
- <ef-scrubber></ef-scrubber>
35
- <ef-time-display></ef-time-display>
36
- </ef-controls>
37
- ```
38
-
39
- ## Core concepts: target and bridge
40
-
41
- Each playback control (`ef-play`, `ef-pause`, `ef-toggle-play`, `ef-toggle-loop`, `ef-volume`, `ef-mute`, `ef-scrubber`, `ef-time-display`) resolves the composition it drives in this order:
42
-
43
- 1. Its own `target="id-or-selector"` attribute, if set.
44
- 2. Walks up through ancestor `ef-controls`, `ef-preview`, and `ef-configuration` elements. An ancestor with its own `target` resolves there. A bare `ef-configuration` ancestor resolves to itself.
45
- 3. As a last resort, resolves to the nearest enclosing temporal root.
46
-
47
- `ef-controls` is a pure proxy — it renders nothing itself but gives descendant controls a shared `target`.
48
-
49
- ## Preview and canvas
50
-
51
- - **`ef-preview`** — renders a live preview of the composition
52
- - **`ef-canvas`** — interactive canvas with selection state
53
-
54
- ## Playback and display controls
55
-
56
- - **`ef-play`** / **`ef-pause`** / **`ef-toggle-play`** — playback controls
57
- - **`ef-toggle-loop`** — toggle loop mode
58
- - **`ef-volume`** / **`ef-mute`** — audio controls
59
- - **`ef-time-display`** — current time / total time display
60
- - **`ef-scrubber`** — seekable timeline scrubber
61
- - **`ef-fullscreen`** — fullscreen toggle
62
- - **`ef-pip`** — picture-in-picture toggle
63
-
64
- ## Timeline
65
-
66
- - **`ef-timeline`** — timeline container with rows
67
- - **`ef-timeline-row`** — a single track row
68
- - **`ef-timeline-ruler`** — time ruler with markers
69
- - **`ef-composition-thumbnail-strip`** — thumbnail overview of the composition
70
-
71
- ## Transform and manipulation
72
-
73
- - **`ef-transform-handles`** — drag, resize, rotate handles for elements
74
- - **`ef-trim-handles`** — trim start/end of video clips
75
- - **`ef-fit-scale`** — fit or scale the canvas to the viewport
76
-
77
- ## Overlay system
78
-
79
- - **`ef-overlay-layer`** — overlay container
80
- - **`ef-overlay-item`** — individual overlay panel
81
-
82
- ## Editor shells
83
-
84
- - **`ef-workbench`** — full editor layout with panels
85
- - **`ef-tree`** / **`ef-tree-item`** — hierarchy tree of composition elements
86
- - **`ef-hierarchy`** / **`ef-hierarchy-item`** — alternative hierarchy view with selection bridge
87
-
88
- ## Element reference
89
-
90
- | Element | Purpose |
91
- | -------------------------------- | ------------------------------------------------ |
92
- | `ef-canvas` | Interactive composition canvas |
93
- | `ef-canvas-selection-box` | Selection rectangle overlay on canvas |
94
- | `ef-composition-thumbnail-strip` | Thumbnail overview of the composition |
95
- | `ef-controls` | Proxy container for shared target |
96
- | `ef-dial` | Rotary dial control for parameters |
97
- | `ef-fit-scale` | Fit or scale canvas to viewport |
98
- | `ef-fullscreen` | Fullscreen toggle |
99
- | `ef-hierarchy` | Alternative hierarchy view with selection bridge |
100
- | `ef-hierarchy-item` | Item in hierarchy view |
101
- | `ef-mute` | Mute toggle |
102
- | `ef-overlay-item` | Individual overlay panel |
103
- | `ef-overlay-layer` | Overlay container |
104
- | `ef-pause` | Pause button |
105
- | `ef-pip` | Picture-in-picture toggle |
106
- | `ef-play` | Play button |
107
- | `ef-preview` | Live composition preview |
108
- | `ef-resolution` | Resolution selector |
109
- | `ef-scrubber` | Seekable timeline scrubber |
110
- | `ef-thumbnail-strip` | Thumbnail strip for timeline |
111
- | `ef-time-display` | Time display |
112
- | `ef-timeline` | Timeline container |
113
- | `ef-timeline-row` | Single track row in timeline |
114
- | `ef-timeline-ruler` | Time ruler with markers |
115
- | `ef-toggle-loop` | Toggle loop mode |
116
- | `ef-toggle-play` | Play/pause toggle |
117
- | `ef-transform-handles` | Drag, resize, rotate handles for elements |
118
- | `ef-tree` | Composition hierarchy tree |
119
- | `ef-tree-item` | Item in hierarchy tree |
120
- | `ef-trim-handles` | Trim start/end of video clips |
121
- | `ef-volume` | Volume control |
122
- | `ef-waveform-strip` | Audio waveform strip for timeline |
123
- | `ef-workbench` | Full editor layout with panels |
124
-
125
- ### `ef-workbench`
126
-
127
- Composes a hierarchy panel, a canvas and selection view, a timeline, and transport controls into one panel layout (DOM preview mode only).
128
-
129
- **Attributes:** `rendering` (boolean, collapses to bare stage during native render), `resolution` (string, e.g. `"1920x1080"`).
130
-
131
- **Methods:** `exportVideo(options?)` — renders the composition to an MP4 through an offscreen clone. Dispatches `export-start`, `export-progress`, `export-complete`, `export-error` events. Options: `width`, `height`, `fps`, `from`, `to`, `videoCodec`, `audioCodec`, `videoBitrate`, `audioBitrate`, `audioSampleRate`.