Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
62c43d6
design: import initial OpenScreen artifact set
EtienneLescot Jun 27, 2026
358e71b
refactor(design): consolidate design assets and add specification
EtienneLescot Jun 27, 2026
c553bb0
docs:update design
EtienneLescot Jun 27, 2026
7976fe8
refactor(design): update titlebar layout and brand mark implementation
EtienneLescot Jun 28, 2026
b8516f2
docs:update design
EtienneLescot Jun 28, 2026
85fd564
docs:update design
EtienneLescot Jun 29, 2026
8cb39c6
docs:update design
EtienneLescot Jun 29, 2026
b7a0d18
docs(ai-edition): merge plan, inventories, and collision analysis
EtienneLescot Jun 25, 2026
568bcf4
feat(ai-edition): Phases 0-9 implementation (v3 editor model + AI fea…
EtienneLescot Jun 27, 2026
897bdb2
feat(ai-edition): full editor shell with all panes, modals, chat, sto…
EtienneLescot Jun 29, 2026
917efc9
feat: implement AI Edition editor improvements and repair locale synt…
EtienneLescot Jun 29, 2026
7282468
refactor(ai-edition): resolve CodeRabbit review feedback on bottombar…
EtienneLescot Jun 29, 2026
6f93bbd
fix(ai-edition): guard undo/redo on projectId and clear history when …
EtienneLescot Jun 29, 2026
8d1e7c7
fix(ai-edition): fix primaryAssetId removal, correct duplicate extens…
EtienneLescot Jun 29, 2026
ad28e5b
feat(ai-edition): add schema range refinements and implement multi-as…
EtienneLescot Jun 29, 2026
2aecf5c
fix(ai-edition): address CodeRabbit review 4594805796
EtienneLescot Jun 30, 2026
a46ac8c
feat(ai-edition): make the Axcut editor the only editor + fix 0-byte …
Jun 30, 2026
91a61b3
fix(recording): remove 3-second watchdog that was killing normal reco…
Jun 30, 2026
056201f
revert(useScreenRecorder): drop bitrate cap, resolution cap, and canv…
Jun 30, 2026
166b8c4
feat(recording): add MediaRecorder.statistics diagnostic for 0-byte r…
Jun 30, 2026
f490d67
fix(preview): scrub thumb stuck at 0% — rAF closure captured empty clips
Jun 30, 2026
aed071a
fix(preview): push virtual time even when no clip exists yet
Jun 30, 2026
43f38e7
fix(preview): CSS scrub thumb stuck at 0% when no clip exists
Jun 30, 2026
9a945d6
feat(ai-edition): multi-session chat history + clip editing
EtienneLescot Jul 1, 2026
5a317fb
docs+fix(ai-edition): consolidate docs into one roadmap; fix token al…
EtienneLescot Jul 1, 2026
19b10c5
feat(ai-edition): multi-clip timeline track + working media drag-drop
EtienneLescot Jul 1, 2026
9c424b5
fix(ai-edition): stop loadedmetadata from corrupting the wrong clip's…
EtienneLescot Jul 1, 2026
21d1b1a
docs(ai-edition): source-ground the timeline-interaction gap analysis
EtienneLescot Jul 1, 2026
3a8fe2b
feat(ai-edition): skip resize + delete inside clip blocks
EtienneLescot Jul 1, 2026
37e32d3
feat(ai-edition): real Edit Clip dialog with embedded preview + dragg…
EtienneLescot Jul 1, 2026
3a0b1eb
feat(ai-edition): Ctrl+C/V clip duplicate
EtienneLescot Jul 1, 2026
74457fd
feat(ai-edition): drag-resize + move for zoom/speed/annotation region…
EtienneLescot Jul 1, 2026
2671cfc
docs(ai-edition): mark P0 timeline interaction gaps done (commits 7ed…
EtienneLescot Jul 1, 2026
713b76a
fix(ai-edition): unify placeholder duration; wire zoombar + horizonta…
EtienneLescot Jul 1, 2026
e3984be
Revert "fix(ai-edition): unify placeholder duration; wire zoombar + h…
EtienneLescot Jul 1, 2026
52c67e1
fix(ai-edition): unify placeholder duration to 60s (the only good hal…
EtienneLescot Jul 1, 2026
2c484d9
docs(ai-edition): replace coarse timeline plan with 25-item granular …
EtienneLescot Jul 1, 2026
1bbc9ff
feat(ai-edition): port startGlobalPointerDrag helper (T01)
EtienneLescot Jul 1, 2026
297fc75
feat(ai-edition): custom viewport model — translateX pan + fit/zoom p…
EtienneLescot Jul 1, 2026
887c11e
feat(ai-edition): Alt+drag pan, pointer reorder, clip join borders (T…
EtienneLescot Jul 1, 2026
bba6dde
docs(ai-edition): mark T01-T09 (spine) as done
EtienneLescot Jul 1, 2026
e230d9c
fix(ai-edition): probe duration on insert; fix 4 user-reported bugs
EtienneLescot Jul 1, 2026
0083f61
fix(ai-edition): clip-block visual merge removed; reorder marker on t…
EtienneLescot Jul 1, 2026
b77408f
fix(ai-edition): stop blocking the drop on probeVideoDuration
EtienneLescot Jul 1, 2026
02da202
feat(ai-edition): lanes-in-canvas (T10)
EtienneLescot Jul 1, 2026
9a68b4c
feat(ai-edition): navigator strip + viewport state lift (T11-T13)
EtienneLescot Jul 1, 2026
ea024fe
feat(ai-edition): header row + Place-skip mode (T14-T15)
EtienneLescot Jul 1, 2026
b376119
feat(ai-edition): cursor classes + viewport-aware skip controls (T16-…
EtienneLescot Jul 1, 2026
7baa6ed
docs(ai-edition): mark T10-T18 done
EtienneLescot Jul 1, 2026
f808d83
fix(ai-edition): navigator handles now adjust zoom; place-skip shows …
EtienneLescot Jul 1, 2026
c64c381
fix(ai-edition): merge Place-skip into Scissors; show navigator strip
EtienneLescot Jul 1, 2026
8e7f5c4
fix(ai-edition): place-skip click + cursor work over clip blocks
EtienneLescot Jul 1, 2026
4dec208
fix(ai-edition): navigator strip visible — moved CSS to the right module
EtienneLescot Jul 1, 2026
df31703
fix(ai-edition): crosshair cursor + full-height placement marker
EtienneLescot Jul 1, 2026
a41444f
fix(ai-edition): placement marker spans full canvas height (ruler → t…
EtienneLescot Jul 1, 2026
2d6ee0e
fix(ai-edition): playhead + placement-marker heads land inside the ti…
EtienneLescot Jul 1, 2026
9b98282
fix(ai-edition): playhead + placement-marker reach the timing ruler (…
EtienneLescot Jul 1, 2026
a2b7431
feat(ai-edition): T19 preview-scrubs during skip-edge resize; T20 res…
EtienneLescot Jul 1, 2026
da204c4
docs(ai-edition): T21 duplicate-clip parity already shipped
EtienneLescot Jul 1, 2026
52b84f0
feat(ai-edition): T24 snap-guide + T25 floating drag tooltip during s…
EtienneLescot Jul 1, 2026
5712c4d
docs(ai-edition): mark T19-T25 done
EtienneLescot Jul 1, 2026
bbbcd4d
docs(ai-edition): expand P1/P2/P3 into per-task tables with file+line…
EtienneLescot Jul 2, 2026
d100f93
feat(ai-edition): P1 agent tool runtime — schema, dispatch, checkpoin…
EtienneLescot Jul 2, 2026
6eadcec
feat(ai-edition): F2.1 auto-zoom wand + F2.2/F2.3 inspector options +…
EtienneLescot Jul 2, 2026
1049db6
feat(ai-edition): F2.6 region snap-guide+tooltip, F2.7 multi-select d…
EtienneLescot Jul 2, 2026
d3d3bc2
feat(ai-edition): P3 polish — asset size, camera-sidecar toast, pane …
EtienneLescot Jul 2, 2026
4a5b518
docs(ai-edition): mark P1 + F2.x + P3.1/2/3/4c/7 done; refresh build …
EtienneLescot Jul 2, 2026
1060499
fix(electron): don't crash main process on EPIPE/ECONNRESET
EtienneLescot Jul 2, 2026
fb0e583
test(ai-edition): wire Playwright test agents + data-* hooks for beha…
EtienneLescot Jul 2, 2026
f80086c
test(ai-edition): agentic roadmap coverage — 6 specs + 7 behavior tests
EtienneLescot Jul 2, 2026
e380ef8
fix(ai-edition): browser-shim auto-loads last project on mount
EtienneLescot Jul 2, 2026
04a7034
chore(ai-edition): wire open-computer-use MCP server for agentic desk…
EtienneLescot Jul 2, 2026
119a639
docs(specs): computer-use e2e test roadmap — 19 sequenced spec files
EtienneLescot Jul 2, 2026
5132964
feat(ai-edition/llm): close provider + reasoning parity gap with axcut
EtienneLescot Jul 2, 2026
6f5b47c
feat(ai-edition/llm): SSE streaming + proper Codex Responses wire
EtienneLescot Jul 2, 2026
783bac6
feat(ai-edition/llm): context compaction + real budget badge + compac…
EtienneLescot Jul 2, 2026
9ca863e
docs(ai-edition): add provider parity plan
EtienneLescot Jul 2, 2026
5f1b4a8
feat(ai-edition): wire zoom regions into the live preview
EtienneLescot Jul 2, 2026
c584d76
feat(ai-edition): wire annotation regions (text/image/figure/blur) in…
EtienneLescot Jul 2, 2026
aeea914
feat(ai-edition): wire speed regions into the live preview
EtienneLescot Jul 2, 2026
6bd38d0
feat(ai-edition): add continuous scale slider to zoom inspector
EtienneLescot Jul 2, 2026
0e16300
feat(ai-edition): add speed-value editing UI to the speed inspector
EtienneLescot Jul 2, 2026
20f609c
refactor(ai-edition): remove unused annotation/zoom preview scaffolding
EtienneLescot Jul 2, 2026
9443bea
feat(ai-edition): annotation + zoom-focus overlay rendering on virtua…
EtienneLescot Jul 2, 2026
b9fd737
chore: ignore opencode.json (personal dev config)
EtienneLescot Jul 2, 2026
3c6d094
Refactor AI Edition Components: Remove Zoom and Speed Region Logic
EtienneLescot Jul 2, 2026
5cdd9b6
feat(ai-edition): add annotation overlays, zoom focus, and timeline h…
EtienneLescot Jul 2, 2026
7868254
chore: ignore .worktrees/ and untrack opencode.json
EtienneLescot Jul 2, 2026
0c0b524
docs(ai-edition): add DSL data-flow diagram
EtienneLescot Jul 2, 2026
b628686
feat(ai-edition): wire cursor pipeline into RightPanes
EtienneLescot Jul 2, 2026
9f87d23
fix(ai-edition): scope region lane collision to same row
EtienneLescot Jul 2, 2026
807cbbf
feat(ai-edition): give skip regions their own timeline lane, matching…
EtienneLescot Jul 2, 2026
d49b2e4
fix(ai-edition): keep zoom in/out animation wall-clock constant under…
EtienneLescot Jul 2, 2026
329e237
fix(ai-edition): make preview canvas actually contain-fit the selecte…
EtienneLescot Jul 2, 2026
74ddfae
fix(ai-edition): render aspect-ratio menu through a portal to escape …
EtienneLescot Jul 2, 2026
940ae5c
feat: extend AI provider model discovery across all auth kinds
EtienneLescot Jul 2, 2026
d9f54a1
chore(ai-edition): drop chatRun debug logging
EtienneLescot Jul 3, 2026
c43675d
fix(ai-edition): open full settings when no provider configured yet; …
EtienneLescot Jul 3, 2026
85abea3
fix(ai-edition): hide OS cursor over preview when synthetic cursor is…
EtienneLescot Jul 3, 2026
71ac37e
fix(ai-edition): make browser-shim LLM config/credentials stateful
EtienneLescot Jul 3, 2026
8ccf8f8
fix(ai-edition): browser-shim now tracks documents per project id
EtienneLescot Jul 3, 2026
1ee26bd
fix(ai-edition): persist browser-shim chat sessions across reload
EtienneLescot Jul 3, 2026
471c2f8
feat(ai-edition): reshape source transcript modal to match axcut refe…
EtienneLescot Jul 3, 2026
8ee964a
feat(ai-edition): wire source transcript modal to per-asset regenerate
EtienneLescot Jul 3, 2026
76d823f
fix(ai-edition): correct MiniMax base URL to /anthropic/v1
EtienneLescot Jul 3, 2026
07ba608
feat(ai-edition): port axcut's deepagents runtime + stream chat events
EtienneLescot Jul 3, 2026
7f68984
feat(ai-edition): per-message rewind + manual compact (axcut chat UI …
EtienneLescot Jul 3, 2026
a6e4bfe
fix(ai-edition): plumb language selection + detection through Whisper…
EtienneLescot Jul 3, 2026
8415c4c
feat(ai-edition): inline session rename + optimistic timeline-ops sta…
EtienneLescot Jul 3, 2026
b1d7879
fix(launch): drop HUD bar drop shadow halo
EtienneLescot Jul 3, 2026
2603d69
feat(ai-edition): aggregated transcript pane (axcut Current Transcrip…
EtienneLescot Jul 3, 2026
bdcbde5
fix(ai-edition): chat strip layout + per-message rewind always available
EtienneLescot Jul 3, 2026
2f282fd
fix(ai-edition): panelBody flex-basis 0 so it takes remaining space, …
EtienneLescot Jul 3, 2026
f6d0b8e
fix(ai-edition): restore grid layout for the chat panel
EtienneLescot Jul 3, 2026
b07f307
fix(ai-edition): fix word spacing, add hover restore icon to transcri…
EtienneLescot Jul 3, 2026
cc3968a
fix(ai-edition): constrain leftPanel so grid rows propagate down
EtienneLescot Jul 3, 2026
fee6566
fix(ai-edition): default-keep-all when clip wordRefs is empty
EtienneLescot Jul 3, 2026
9246e2c
fix(ai-edition): flex column for the chat panel
EtienneLescot Jul 3, 2026
8e756cb
fix(ai-edition): tell the agent the DSL is the SSOT, prefer addSkip
EtienneLescot Jul 3, 2026
b33049d
fix(ai-edition): explicit tool-selection rules for the agent
EtienneLescot Jul 3, 2026
c7b86a3
feat(ai-edition): make right-pane transcript editable (LCS -> timeline)
EtienneLescot Jul 3, 2026
1aa818e
fix(ai-edition): refuse replaceTimeline when user clips are on the ti…
EtienneLescot Jul 3, 2026
a8239e5
refactor(ai-edition): right pane uses skip-range model (axcut Current…
EtienneLescot Jul 3, 2026
402141c
feat(ai-edition): right-pane cue-word highlight + auto-scroll (axcut …
EtienneLescot Jul 3, 2026
fae573e
fix(ai-edition): auto-scroll the cue word into the visible area
EtienneLescot Jul 3, 2026
84ff295
style(ai-edition): size transcript text area to fit the pane height
EtienneLescot Jul 3, 2026
bad2045
fix(ai-edition): single external scroll, drop nested per-clip scrollbar
EtienneLescot Jul 3, 2026
a3f6f95
fix(ai-edition): Backspace at word start now trims the current word
EtienneLescot Jul 3, 2026
0931bc6
fix(ai-edition): pointer-up finds the right word for non-filler clicks
EtienneLescot Jul 3, 2026
e903dfa
refactor(ai-edition): drop the filler concept from the transcript ren…
EtienneLescot Jul 3, 2026
711bc31
fix(ai-edition): read kept/skip state from words array, not DOM
EtienneLescot Jul 3, 2026
01396ed
fix(ai-edition): range-select+Backspace trimmed only the first few words
EtienneLescot Jul 3, 2026
ae2a067
fix(ai-edition): serialize timeline-edit saves to prevent race condit…
EtienneLescot Jul 3, 2026
754f952
fix(ai-edition): use skip-range asset's own duration instead of prima…
EtienneLescot Jul 4, 2026
15f97d7
fix(ai-edition): simplify model label display and enhance chat input …
EtienneLescot Jul 4, 2026
83e57e5
refactor(ai-edition): move transport bar from preview into timeline h…
EtienneLescot Jul 4, 2026
8c0f2e2
Implement code changes to enhance functionality and improve performance
EtienneLescot Jul 4, 2026
be24adb
Implement feature X to enhance user experience and optimize performance
EtienneLescot Jul 4, 2026
2a3612e
feat(ai-edition): resolve camera/cursor links per asset, not per project
EtienneLescot Jul 4, 2026
97c5a97
Refactor code structure for improved readability and maintainability
EtienneLescot Jul 4, 2026
7c1528d
refactor(ai-edition): extract PreviewCompositor and playback-clock
EtienneLescot Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ xcuserdata/
release/**
*.kiro/
.claude/
.worktrees/
# npx electron-builder --mac --win

# Playwright
Expand All @@ -66,3 +67,5 @@ result-*

# Auto-caption model + ORT wasm — regenerated at build by scripts/fetch-caption-model.mjs
/caption-assets/
opencode.json
opencode.json
53 changes: 53 additions & 0 deletions .opencode/prompts/playwright-test-generator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
You are a Playwright Test Generator, an expert in browser automation and end-to-end testing.
Your specialty is creating robust, reliable Playwright tests that accurately simulate user interactions and validate
application behavior.

# For each test you generate
- Obtain the test plan with all the steps and verification specification
- Run the `generator_setup_page` tool to set up page for the scenario
- For each step and verification in the scenario, do the following:
- Use Playwright tool to manually execute it in real-time.
- Use the step description as the intent for each Playwright tool call.
- Retrieve generator log via `generator_read_log`
- Immediately after reading the test log, invoke `generator_write_test` with the generated source code
- File should contain single test
- File name must be fs-friendly scenario name
- Test must be placed in a describe matching the top-level test plan item
- Test title must match the scenario name
- Includes a comment with the step text before each step execution. Do not duplicate comments if step requires
multiple actions.
- Always use best practices from the log when generating tests.

<example-generation>
For following plan:

```markdown file=specs/plan.md
### 1. Adding New Todos
**Seed:** `tests/seed.spec.ts`

#### 1.1 Add Valid Todo
**Steps:**
1. Click in the "What needs to be done?" input field

#### 1.2 Add Multiple Todos
...
```

Following file is generated:

```ts file=add-valid-todo.spec.ts
// spec: specs/plan.md
// seed: tests/seed.spec.ts

test.describe('Adding New Todos', () => {
test('Add Valid Todo', async { page } => {
// 1. Click in the "What needs to be done?" input field
await page.click(...);

...
});
});
```
</example-generation>

<example>Context: User wants to generate a test for the test plan item. <test-suite><!-- Verbatim name of the test spec group w/o ordinal like "Multiplication tests" --></test-suite> <test-name><!-- Name of the test case without the ordinal like "should add two numbers" --></test-name> <test-file><!-- Name of the file to save the test into, like tests/multiplication/should-add-two-numbers.spec.ts --></test-file> <seed-file><!-- Seed file path from test plan --></seed-file> <body><!-- Test case content including steps and expectations --></body></example>
37 changes: 37 additions & 0 deletions .opencode/prompts/playwright-test-healer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
You are the Playwright Test Healer, an expert test automation engineer specializing in debugging and
resolving Playwright test failures. Your mission is to systematically identify, diagnose, and fix
broken Playwright tests using a methodical approach.

Your workflow:
1. **Initial Execution**: Run all tests using `test_run` tool to identify failing tests
2. **Debug failed tests**: For each failing test run `test_debug`.
3. **Error Investigation**: When the test pauses on errors, use available Playwright MCP tools to:
- Examine the error details
- Capture page snapshot to understand the context
- Analyze selectors, timing issues, or assertion failures
4. **Root Cause Analysis**: Determine the underlying cause of the failure by examining:
- Element selectors that may have changed
- Timing and synchronization issues
- Data dependencies or test environment problems
- Application changes that broke test assumptions
5. **Code Remediation**: Edit the test code to address identified issues, focusing on:
- Updating selectors to match current application state
- Fixing assertions and expected values
- Improving test reliability and maintainability
- For inherently dynamic data, utilize regular expressions to produce resilient locators
6. **Verification**: Restart the test after each fix to validate the changes
7. **Iteration**: Repeat the investigation and fixing process until the test passes cleanly

Key principles:
- Be systematic and thorough in your debugging approach
- Document your findings and reasoning for each fix
- Prefer robust, maintainable solutions over quick hacks
- Use Playwright best practices for reliable test automation
- If multiple errors exist, fix them one at a time and retest
- Provide clear explanations of what was broken and how you fixed it
- You will continue this process until the test runs successfully without any failures or errors.
- If the error persists and you have high level of confidence that the test is correct, mark this test as test.fixme()
so that it is skipped during the execution. Add a comment before the failing step explaining what is happening instead
of the expected behavior.
- Do not ask user questions, you are not interactive tool, do the most reasonable thing possible to pass the test.
- Never wait for networkidle or use other discouraged or deprecated apis
44 changes: 44 additions & 0 deletions .opencode/prompts/playwright-test-planner.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
You are an expert web test planner with extensive experience in quality assurance, user experience testing, and test
scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage
planning.

You will:

1. **Navigate and Explore**
- Invoke the `planner_setup_page` tool once to set up page before using any other tools
- Explore the browser snapshot
- Do not take screenshots unless absolutely necessary
- Use `browser_*` tools to navigate and discover interface
- Thoroughly explore the interface, identifying all interactive elements, forms, navigation paths, and functionality

2. **Analyze User Flows**
- Map out the primary user journeys and identify critical paths through the application
- Consider different user types and their typical behaviors

3. **Design Comprehensive Scenarios**

Create detailed test scenarios that cover:
- Happy path scenarios (normal user behavior)
- Edge cases and boundary conditions
- Error handling and validation

4. **Structure Test Plans**

Each scenario must include:
- Clear, descriptive title
- Detailed step-by-step instructions
- Expected outcomes where appropriate
- Assumptions about starting state (always assume blank/fresh state)
- Success criteria and failure conditions

5. **Create Documentation**

Submit your test plan using `planner_save_plan` tool.

**Quality Standards**:
- Write steps that are specific enough for any tester to follow
- Include negative testing scenarios
- Ensure scenarios are independent and can be run in any order

**Output Format**: Always save the complete test plan as a markdown file with clear headings, numbered steps, and
professional formatting suitable for sharing with development and QA teams.
14 changes: 12 additions & 2 deletions biome.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.12/schema.json",
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
"files": { "ignoreUnknown": false, "includes": ["**", "!**/*.css"] },
"files": {
"ignoreUnknown": false,
"includes": ["**", "!**/*.css", "!**/design/**", "!**/.worktrees/**"]
},
"formatter": {
"enabled": true,
"indentStyle": "tab",
Expand Down Expand Up @@ -92,7 +95,14 @@
"useGetterReturn": "error"
}
},
"includes": ["**", "**/dist", "**/.eslintrc.cjs", "!**/*.css"]
"includes": [
"**",
"**/dist",
"**/.eslintrc.cjs",
"!**/*.css",
"!**/design/**",
"!**/.worktrees/**"
]
},
"javascript": { "formatter": { "quoteStyle": "double" } },
"overrides": [
Expand Down
156 changes: 156 additions & 0 deletions design/DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# OpenScreen Design System

> Category: Video & Productivity Tools
> Surface: Desktop web (Electron)
> Source: tokens extracted from `openscreen-editor-2.html` (canonical)

A high-fidelity, professional dark-and-light desktop application design system
optimized for video recording, post-processing editing, and timeline
manipulation. Mint is the single brand accent; red is reserved strictly for
REC / cut / skip / trim / transcript-highlight states; amber covers warnings.

---

## Color Palette

### Light theme (`:root`)

| Role | Token | Hex | Notes |
|---|---|---|---|
| Canvas | `--bg` | `#fafbfc` | Off-white, never pure white; soft radial gradient |
| Panel | `--surface` | `#ffffff` | Raised panels on canvas |
| Card | `--surface-1` | `#f7f8fa` | Tier 1 raised |
| Tier 2 | `--surface-2` | `#f3f5f8` | Raised on panel |
| Hover | `--surface-3` | `#eef0f3` | Active/hover state |
| Popover | `--surface-hi` | `#ffffff` | Highest elevation |
| Border | `--border` | `#e7e9ee` | Soft hairline |
| Border soft | `--border-soft` | `#f1f2f5` | Subtle dividers |
| Border hi | `--border-hi` | `#d1d5db` | Emphasis lines |
| Foreground | `--fg` | `#1f2937` | Slate, not pure black |
| Foreground emphasis | `--fg-emphasis` | `#111827` | Headlines |
| Muted | `--muted` | `#6b7280` | Body / labels |
| Meta | `--meta` | `#9ca3af` | Timestamps, captions |
| Brand (mint) | `--accent` | `#10b981` | Primary action, focus ring, toggle-on |
| Brand glow | `--brand-glow` | `rgba(16,185,129,0.35)` | Focus / hover |
| Danger | `--danger` | `#ef4444` | REC, skip, trim, transcript highlight |
| Warning | `--warn` | `#f59e0b` | Soft amber |
| Success | `--success` | `#10b981` | Alias of brand |

### Dark theme (`:root[data-theme="dark"]`)

| Role | Token | Hex | Notes |
|---|---|---|---|
| Canvas | `--bg` | `#0a0d12` | Near-black with faint blue cast |
| Panel | `--surface` | `#14181f` | Tier 1 panel |
| Card | `--surface-1` | `#14181f` | Same as panel base |
| Tier 2 | `--surface-2` | `#1c2029` | Raised |
| Hover | `--surface-3` | `#252a35` | Hover/active |
| Popover | `--surface-hi` | `#2e3440` | Highest |
| Border | `--border` | `#252a35` | Reads on canvas |
| Foreground | `--fg` | `#e6e9ef` | Off-white, never pure `#ffffff` |
| Muted | `--muted` | `#8b95a3` | Tuned for AA on dark |
| Brand (mint) | `--accent` | `#10b981` | Same hue, brighter tone on `--brand-lo: #34d399` |
| Danger | `--danger` | `#f87171` | Softer red for dark bg |

### Traffic lights (macOS chrome)

| Token | Hex |
|---|---|
| `--light-red` | `#ff5f57` |
| `--light-yellow` | `#febc2e` |
| `--light-green` | `#28c840` |

---

## Typography

- **Display:** system-ui stack — `system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif`
- **Body:** system-ui stack (same as display)
- **Mono:** `ui-monospace, "SF Mono", Menlo, Monaco, Consolas, monospace`

### Type scale (desktop editor, base 13px)

| Token | Size | Use |
|---|---|---|
| `--fs-app` | 13px | Base UI |
| `--fs-app-sm` | 12px | Secondary |
| `--fs-app-lg` | 14px | Primary UI |
| `--fs-title` | 16px | Panel titles |
| `--fs-section` | 11px | Section headers (uppercase, tracked) |
| `--fs-display` | 24px | Hero numerals |

Nothing below 11px.

---

## Layout

- **Radius:** 8px standard; `--r-xs: 4px`, `--r-sm: 6px`, `--r-md: 8px`, `--r-lg: 12px`, `--r-pill: 9999px`
- **Border weight:** 1px
- **Spacing:** 4px baseline grid (`--sp-1` through `--sp-6`)
- **Editor wireframe:**
- Titlebar: 34px
- Left utility rail: 48px
- Left panel: 320px
- Right properties: 320px
- Resize handle: 6px
- Bottom timeline/toolbar: 224px

### Posture rules

- **One accent, used at most twice per screen.** Default budget is eyebrow + primary CTA.
- **Red is reserved** for REC, cut, skip, trim, and transcript highlight only. It is not a brand color.
- **Mint is the single brand color** for active state, focus ring, toggle-on, and brand mark.
- **Off-white canvas, tiered surfaces.** Never use pure `#000` or pure `#fff` for editorial chrome.
- **Soft elevation, slate-based shadows.** Two `--elev-card` and `--elev-pop` are enough.
- **System-ui type, mono numerics.** No web fonts loaded; ships the declared fallback stack.

---

## Motion

- `--motion-fast: 120ms` — hover, focus ring
- `--motion-base: 180ms` — state transitions
- `--ease: cubic-bezier(0.2, 0, 0, 1)` — standard easing

---

## Voice & Tone

- **Adjectives:** high-fidelity, professional, calm, restrained.
- **Tone:** a confident dark-themed tool. Marketing prose is sparse; product UI carries the work.
- **Messaging pillar:** video recording, post-processing editing, and timeline manipulation — same three jobs the editor does.

### Vocabulary

- **Use:** Record, Trim, Cut, Skip, Timeline, Clip, Track, Transcript.
- **Avoid:** playful emoji feature labels (✨ 🚀 🎯), "AI-powered" in product chrome, generic SaaS copy ("supercharge your workflow").

---

## Imagery

- **Style:** schematic, palette-derived. Scene illustration in preview is grayscale made from the same neutrals — not literal artwork.
- **Treatment:** replace placeholder scenes with real project footage when shipping.
- **Avoid:** stock photography, decorative illustration in tool chrome, hand-drawn mascots.

---

## Files in this directory

| File | Role |
|---|---|
| `openscreen-editor-2.html` | Latest editor (light + dark themes in one file). Canonical source of tokens. |
| `openscreen-editor.html` | First editor pass. Light-only. |
| `editor.html` | Earlier experimental editor with red REC accent. |
| `openscreen-landing.html` | Marketing landing page. |
| `index.html` | Launcher / overview. |
| `DESIGN.md` | This document. |

---

## Open questions / follow-ups

- `editor.html` uses a different red-dominant accent and predates the mint brand color. Keep as historical reference; do not import its tokens into new work.
- Landing page (`openscreen-landing.html`) is light-only; consider a dark variant once product photography is sourced.
- No logo asset is committed yet. Brand mark should be a simple wordmark or geometric mark in mint on the dark canvas.
Loading
Loading