Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
d91f56d
fix(timeline): tighten core editing interactions
lightninglu10 Aug 26, 2026
41418e6
fix(playback): harden preview and direct export
lightninglu10 Aug 26, 2026
1bf50f8
refactor(timeline): simplify click seeking
lightninglu10 Aug 26, 2026
60b0d5b
fix(timeline): clear committed hover previews
lightninglu10 Aug 27, 2026
0d05212
fix(timeline): ignore clicks during voiceover takes
lightninglu10 Aug 27, 2026
e4a2af3
fix(timeline): source drilled export mixer from active composition
lightninglu10 Aug 27, 2026
a331e43
Fix cross-sequence linked clipboard track mapping
lightninglu10 Aug 27, 2026
4f42471
fix export render cancellation ownership
lightninglu10 Aug 27, 2026
7112c68
fix(preview): invalidate stale source presentations
lightninglu10 Aug 27, 2026
2824a65
test direct export render lifecycle
lightninglu10 Aug 27, 2026
237b707
Complete atomic clipboard lane recovery
lightninglu10 Aug 27, 2026
92d550d
test(preview): guard deferred source replacement work
lightninglu10 Aug 27, 2026
8a6deac
fix(editor): close hardening review gaps
lightninglu10 Aug 27, 2026
9bdb4e4
fix(editor): fence export and preview ownership races
lightninglu10 Aug 27, 2026
8eaf76d
fix(preview): retire invalidated source canvases
lightninglu10 Aug 27, 2026
70012b8
fix(preview): scope source binding generations
lightninglu10 Aug 27, 2026
b5fb12a
fix(editor): repair timeline seek and clip boundary playback
lightninglu10 Aug 27, 2026
0493156
fix(timeline): invalidate stale hover previews
lightninglu10 Aug 27, 2026
8502149
fix(export): drain in-flight encodes on errors
lightninglu10 Aug 27, 2026
aa62303
fix(export): observe encode failures immediately
lightninglu10 Aug 27, 2026
b305682
refactor(export): keep encode loop complexity bounded
lightninglu10 Aug 27, 2026
3804eb5
fix(export): preserve first frame-loop failure
lightninglu10 Aug 27, 2026
d6ce167
fix(export): order frame failures at source
lightninglu10 Aug 27, 2026
08f3823
fix(export): preserve primary frame-loop failures
lightninglu10 Aug 27, 2026
76f8421
fix(timeline): enforce locked track mutation invariants
lightninglu10 Aug 27, 2026
79dda7b
fix(timeline): make lock guards atomic across edit actions
lightninglu10 Aug 27, 2026
0d979dd
fix(timeline): close remaining lock invariant gaps
lightninglu10 Aug 27, 2026
8bb7305
fix(timeline): preserve nested group ancestry
lightninglu10 Aug 27, 2026
e4f2bbf
fix(timeline): fail closed on malformed track hierarchy
lightninglu10 Aug 27, 2026
8a18a88
feat(timeline): support linked cohort drag targeting
lightninglu10 Aug 27, 2026
bec045c
fix(timeline): validate linked cohort drag placement
lightninglu10 Aug 27, 2026
f85fd5a
fix(timeline): harden linked drag rejection
lightninglu10 Aug 27, 2026
767afd0
fix(timeline): own post-drag release clicks
lightninglu10 Aug 27, 2026
caa8616
fix(integration): reconcile hierarchy and test storage
lightninglu10 Aug 27, 2026
4d981f1
feat(shortcuts): make transport bindings canonical
lightninglu10 Aug 27, 2026
bb3e404
fix(host): guard shortcut settings ownership epochs
lightninglu10 Aug 27, 2026
ca50c49
fix: make shortcut labels reactive in editor menus
lightninglu10 Aug 27, 2026
b4cc7a9
fix: resolve duplicate shortcut bindings
lightninglu10 Aug 27, 2026
e3f0d16
fix(shortcuts): guard dialog control key events
lightninglu10 Aug 27, 2026
f5217b8
fix(shortcuts): align reactive authority and guards
lightninglu10 Aug 27, 2026
0c7dea9
fix(host): cancel deferred shortcut ownership
lightninglu10 Aug 27, 2026
1d7a805
test(shortcuts): enforce unique imported bindings
lightninglu10 Aug 27, 2026
9507e63
refactor(shortcuts): keep conflict resolution bounded
lightninglu10 Aug 27, 2026
eada890
fix(host): surface shortcut conflict notices
lightninglu10 Aug 27, 2026
69a975d
fix(shortcuts): reconcile runtime ownership
lightninglu10 Aug 27, 2026
eed11e3
fix(shortcuts): retry host writes and alias collisions
lightninglu10 Aug 27, 2026
d1a75a4
fix global runtime hotkey ownership
lightninglu10 Aug 27, 2026
f67249d
Fix atomic runtime hotkey ownership
lightninglu10 Aug 27, 2026
f5a632f
fix hotkey registration gates
lightninglu10 Aug 27, 2026
88158b8
fix hotkey proxy and import boundary
lightninglu10 Aug 27, 2026
1b602ca
fix(qa): resolve hotkey imports lexically
lightninglu10 Aug 27, 2026
cdfb4e3
fix(qa): match Rolldown lexical import folding
lightninglu10 Aug 27, 2026
4ade5ae
fix(shortcuts): repair runtime hotkey boundary parity
lightninglu10 Aug 27, 2026
98a863a
fix(qa): track mutable and erased runtime bindings
lightninglu10 Aug 27, 2026
dcf85d7
fix(hotkeys): match Rolldown control-flow folding
lightninglu10 Aug 27, 2026
e478e7f
fix(integration): preserve host and shortcut boundaries
lightninglu10 Aug 27, 2026
4fc8b79
chore(release): bump editor surface to 0.3.9
lightninglu10 Aug 27, 2026
bd5f55b
chore(provenance): refresh package manifest hash
lightninglu10 Aug 27, 2026
925ebf3
chore(format): normalize source monitor imports
lightninglu10 Aug 27, 2026
573c72f
fix(timeline): expose contiguous rolling trim handle
lightninglu10 Aug 27, 2026
676d6f5
fix(timeline): add keyboard-accessible clip roots
lightninglu10 Aug 27, 2026
df9c0f6
fix(editor): add responsive mobile layout
lightninglu10 Aug 27, 2026
5709e47
fix(observability): preflight expected media fallbacks
lightninglu10 Aug 27, 2026
cf81dce
chore(integration): record PR 30 QA reconciliation
lightninglu10 Aug 27, 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
1 change: 1 addition & 0 deletions .fallowrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"src/index.{ts,tsx,js,jsx}",
"src/main.{ts,tsx,js,jsx}",
"src/test/setup.ts",
"tests/browser/host-responsive.tsx",
"headless/probe.mjs",
"headless/smoke.mjs",
"headless/media-smoke.mjs"
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ out

# Testing
coverage
playwright-report/
test-results/

# Misc
.cache
Expand Down
68 changes: 68 additions & 0 deletions artifacts/freecut-v1-final-integration-manifest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# FreeCut v1 final integration manifest

## PR #30 QA-blocker reconciliation

- Superseded QA head: `925ebf37b01692c4b066407a9ee6a8563fd8028f`
- Integration base: `origin/codepress-main` at `aedf4d70b86615a73fcb382a2843eb14606d1eb4`
- Destination: `v1-release-integration-final`
- Package: `@quantfive/freecut-editor-surface@0.3.9` (version unchanged)
- Source integration head before this evidence/provenance commit: `5709e474515443fefd994507099b9cd2afc65749`

### Commit inventory

The four fixes were cherry-picked with `-x`, in this order, from the exact superseded QA head:

| Order | Source commit | Integrated commit | Purpose |
| --- | --- | --- | --- |
| 1 | `f22464674582b2afe987cbb3486ddc60fd7d53ea` | `573c72f2b5ca1b7bd6020f59a3000980ed18f13f` | Contiguous shared-edge rolling trim |
| 2 | `c9494a515e27074482bf7ba8bbd1998f4fc8ced3` | `676d6f5cde3577457d996ca5e25edfe06ad99923` | Keyboard-accessible clips and scrollbars |
| 3 | `bec5c41eea03db70b08ec4506e2a6a72c458e37b` | `df9c0f63e82a7874333efa10a93495b6f3a41bee` | Responsive mobile editor |
| 4 | `e0bd5e66011fdb7646c8be2b8939a172dd68bc30` | `5709e474515443fefd994507099b9cd2afc65749` | Runtime observability |

All four source commits have parent `925ebf37b01692c4b066407a9ee6a8563fd8028f`.

### Conflict and overlap resolution

- `TimelineItem` had one textual import conflict. The resolution retains one named, focusable semantic clip root and keeps the shared rolling-trim sliders, trim/fade controls, and indicators as sibling interaction surfaces. This avoids nested native controls and keeps pointer gestures, Razor, playback shortcuts, lock rejection, and keyboard slider steps under their intended owners.
- The responsive commit applied without textual conflicts. Focused React and real-Chrome rows verified compact standalone and embedded-host layouts while retaining keyboard scrollbars, rolling handles, Razor routing, lock invariants, linked drag, live shortcut labels, and the desktop geometry branch.
- The observability commit auto-merged its `audio-meter-panel.tsx` overlap with the responsive layout. The result retains the compact/mobile panel contract and uses the shared media URL for waveform loading; no page-owned object URL is revoked. Export capability fallback remains preflight-only, while genuine render and worker-runtime failures remain primary errors.

### Package and provenance

- Two independent deterministic package builds produced byte-identical tarballs.
- New artifact: `artifacts/freecut-editor-surface-0.3.9.tgz`
- New SHA-256: `27855709f334dcac4eda5adc7771c9b0a1fd0b5f47e9a3844c391218ac9ba77c`
- The prior `59012...` QA artifact is superseded by this source-derived artifact.
- A fresh consumer installed the exact tarball and rendered `@quantfive/freecut-editor-surface@0.3.9`: 1 test file, 2 tests passed.
- The responsive Playwright script changed root `package.json`; the supported package-manifest hash in `provenance/freecut-baseline.json` and `provenance/dependency-inventory.json` was refreshed to `7786ffe5cde5b09b6f88fc4fd13af399365ac0d6dc32f320d6f719c6f62edc89`. Lockfile, dependency inventory, asset inventory, release workflow, and package version are unchanged.

### Verification results

All commands ran under Node `22.20.0` and npm `11.8.0` unless the command itself launched a browser.

| Gate | Result |
| --- | --- |
| Four-worker focused Vitest union | PASS — 17 files, 184 tests |
| Responsive real-Chrome standalone 390 / host 390 / desktop 1440 rows | PASS — 3/3 |
| Real Chromium QA smoke | PASS — system Chrome 151; ready, frame result, width, and PNG pixel checks |
| LOCK49 focused matrix | PASS — 12 files, 156 tests |
| DRAG45 focused matrix | PASS — 7 files, 90 tests |
| Shortcut and host-settings matrix | PASS — 15 files, 182 tests |
| Export-focused matrix | PASS — 41 files, 399 tests |
| Full serial Vitest (`maxWorkers=1`, file parallelism disabled) | PASS — 710 files, 5,288 tests; fixed thresholds unchanged |
| `npm run check` | PASS — 2,482 files, no warnings, lint errors, or type errors |
| Scoped format and diff checks | PASS — 46 formatted files; `git diff --check` clean |
| Production build | PASS |
| Boundaries / deps contracts / legacy imports / wrapper health | PASS — 1,707 source files; 161 deps and 298 contract files; 46 wrappers, 0 unused |
| Changed health / edge budgets | PASS — no introduced dead code, complexity, or duplication; all 8 seams within budgets |
| Runtime hotkey import boundary | PASS — 1,735 source files |
| Unused-export and class-member audits | Existing baseline findings only; every reported path is unchanged from the superseded QA head and both allowlists are unchanged |
| Provenance verification | PASS — source, licenses/notices, 51 runtime and 16 development dependencies, and 5 asset roots |
| Publish/release guards | PASS — 7/7 guard tests; package remains `0.3.9`; package manifest, lockfile, and publish workflow guards unchanged |
| Portable headless contracts | PASS — 43 Node contracts, real-Chrome render/edit/lifecycle, 19 edit operations, and 192,044-byte media/audio contract |
| QA redaction | PASS — 7 files scanned and 6/6 fail-closed self-tests |
| Full pre-push hook | PASS — all 7 steps |

### Hosted evidence for superseded head

Before integration, live PR #30 was OPEN and DRAFT at the exact superseded head. Its hosted `Quality Checks`, `Verify and package baseline`, and `Preview Sync Stress` checks were all `SUCCESS`. This is evidence for the old head only; no PR body, state, comment, or readiness change was made.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
"routes": "tsr generate",
"test": "vp test",
"test:run": "vp test run",
"test:responsive": "playwright test --config playwright.mobile.config.ts",
"test:editor-hardening": "vp test run src/features/timeline/components/timeline-content.test.tsx src/features/timeline/components/timeline-item/use-timeline-item-pointer-handlers.test.tsx src/features/timeline/hooks/shortcuts/use-clipboard-shortcuts.test.tsx src/features/timeline/hooks/shortcuts/use-playback-shortcuts.test.tsx src/features/timeline/stores/export-snapshot.test.ts src/features/export/components/export-dialog.test.tsx src/features/export/hooks/client-render-source.test.ts src/features/export/hooks/use-client-render.test.tsx src/features/preview/workers/consume-video-samples.test.ts src/features/preview/utils/media-resolver.test.ts src/features/preview/hooks/use-preview-media-resolution.test.tsx src/features/preview/components/source-composition.generation.test.tsx src/features/preview/components/video-preview.sync.test.tsx src/infrastructure/browser/blob-url-manager.test.ts",
"test:preview-sync": "vp test run src/features/preview/components/video-preview.sync.test.tsx",
"test:preview-sync:stress": "node scripts/preview-sync-stress.mjs --runs 20",
"test:coverage": "vp test run --coverage",
Expand Down
6 changes: 6 additions & 0 deletions packages/freecut-editor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ provider details, URLs, paths, and media bytes remain host-owned.
The same 0.3.0 surface retains the host-backed caption tracks, bounded cues,
caption styles, and display toggles from 0.2.0.

Hosts can also provide the optional `EditorHost.shortcuts` port. Its versioned
`HostShortcutSettings` payload carries the same override map used by FreeCut's
shortcut editor, including J/K/L transport. UI changes call `setSettings`, and
host or agent changes can flow back through `subscribe`, so embedded shortcut
configuration never becomes a UI-only setting.

This package is built from a specific FreeCut commit. To create the local
consumer artifact from a clean checkout, run:

Expand Down
34 changes: 34 additions & 0 deletions packages/freecut-editor/consumer-smoke.test.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
// @vitest-environment jsdom
/// <reference path="./consumer-smoke-style.d.ts" />

import '@testing-library/jest-dom'
import '@quantfive/freecut-editor-surface/style.css'
import { render, screen, waitFor } from '@testing-library/react'
import { beforeAll, describe, expect, it, vi } from 'vite-plus/test'
import {
FreeCutEditorSurface,
HOTKEYS,
capabilityForCommand,
createHostShortcutSettings,
isHostCapabilityEnabled,
type EditorHost,
type EditorTranscriptPort,
type EmbeddedEditorSnapshot,
type HostEditPredicate,
type HostNotice,
} from '@quantfive/freecut-editor-surface'

const snapshot: EmbeddedEditorSnapshot = {
Expand Down Expand Up @@ -44,6 +50,16 @@ function fakeHost(): EditorHost {
submitEdit: vi.fn(() => {
throw new Error('consumer smoke does not submit an edit')
}),
subscribe: vi.fn(() => () => undefined),
shortcuts: {
getSettings: () =>
createHostShortcutSettings({
SHUTTLE_REVERSE: 'q',
SHUTTLE_PAUSE: 'w',
SHUTTLE_FORWARD: 'e',
}),
setSettings: vi.fn(),
},
}
}

Expand Down Expand Up @@ -108,10 +124,28 @@ describe('published FreeCut browser entry', () => {

expect(screen.getByTestId('properties-clip-panel-host')).toBeInTheDocument()
expect(await screen.findByTestId('caption-editor')).toBeInTheDocument()
expect(HOTKEYS).toMatchObject({
SHUTTLE_REVERSE: 'j',
SHUTTLE_PAUSE: 'k',
SHUTTLE_FORWARD: 'l',
EDIT_KEYFRAME_ADD: 'shift+k',
})
expect(host.load).toHaveBeenCalledTimes(1)
expect(host.subscribe).toHaveBeenCalledTimes(1)
expect(capabilityForCommand('move_item')).toBe('timeline.move')
expect(capabilityForCommand('ripple_delete')).toBe('timeline.remove')
expect(capabilityForCommand('set_caption_style')).toBe('timeline.caption')
expect(isHostCapabilityEnabled(host.capabilities, 'timeline.add')).toBe(false)

const predicate: HostEditPredicate = 'sourceRange'
const notice: HostNotice = {
kind: 'unsupported',
message: 'Unsupported edit',
detail: { code: 'ambiguous_change', failedPredicates: [predicate] },
}
const requestTranscription = vi.fn<NonNullable<EditorTranscriptPort['requestTranscription']>>()
expect(notice.detail?.failedPredicates).toEqual(['sourceRange'])
expect(requestTranscription).toBeTypeOf('function')
})

it('sizes the published surface against its container, never the viewport', async () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/freecut-editor/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@quantfive/freecut-editor-surface",
"version": "0.3.8",
"version": "0.3.9",
"description": "The host-backed FreeCut browser editor surface.",
"license": "MIT",
"repository": {
Expand Down
97 changes: 97 additions & 0 deletions packages/freecut-editor/src/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,82 @@
import type { ComponentType, ReactNode } from 'react'

export type HotkeyKey =
| 'PLAY_PAUSE'
| 'SHUTTLE_REVERSE'
| 'SHUTTLE_PAUSE'
| 'SHUTTLE_FORWARD'
| 'PREVIOUS_FRAME'
| 'NEXT_FRAME'
| 'GO_TO_START'
| 'GO_TO_END'
| 'NEXT_SNAP_POINT'
| 'PREVIOUS_SNAP_POINT'
| 'SPLIT_AT_PLAYHEAD'
| 'SPLIT_AT_PLAYHEAD_ALT'
| 'JOIN_ITEMS'
| 'DELETE_SELECTED'
| 'DELETE_SELECTED_ALT'
| 'RIPPLE_DELETE'
| 'RIPPLE_DELETE_ALT'
| 'FREEZE_FRAME'
| 'LINK_AUDIO_VIDEO'
| 'UNLINK_AUDIO_VIDEO'
| 'TOGGLE_LINKED_SELECTION'
| 'NUDGE_LEFT'
| 'NUDGE_RIGHT'
| 'NUDGE_UP'
| 'NUDGE_DOWN'
| 'NUDGE_LEFT_LARGE'
| 'NUDGE_RIGHT_LARGE'
| 'NUDGE_UP_LARGE'
| 'NUDGE_DOWN_LARGE'
| 'UNDO'
| 'REDO'
| 'ZOOM_IN'
| 'ZOOM_OUT'
| 'ZOOM_TO_FIT'
| 'ZOOM_TO_100'
| 'ZOOM_TO_100_ALT'
| 'COPY'
| 'CUT'
| 'PASTE'
| 'SELECTION_TOOL'
| 'TRIM_EDIT_TOOL'
| 'RAZOR_TOOL'
| 'RATE_STRETCH_TOOL'
| 'SLIP_TOOL'
| 'SLIDE_TOOL'
| 'SAVE'
| 'EXPORT'
| 'TOGGLE_SNAP'
| 'TOGGLE_CANVAS_SNAP'
| 'OPEN_SCENE_BROWSER'
| 'WORKSPACE_EDIT'
| 'WORKSPACE_COLOR'
| 'WORKSPACE_ANIMATE'
| 'ADD_MARKER'
| 'REMOVE_MARKER'
| 'PREVIOUS_MARKER'
| 'NEXT_MARKER'
| 'CLEAR_KEYFRAMES'
| 'KEYFRAME_EDITOR_GRAPH'
| 'KEYFRAME_EDITOR_DOPESHEET'
| 'KEYFRAME_EDITOR_SPLIT'
| 'EDIT_KEYFRAME_ADD'
| 'KEYFRAME_PREVIOUS'
| 'KEYFRAME_NEXT'
| 'KEYFRAME_TOGGLE_AUTO'
| 'KEYFRAME_FIT'
| 'MARK_IN'
| 'MARK_OUT'
| 'CLEAR_IN_OUT'
| 'INSERT_EDIT'
| 'OVERWRITE_EDIT'

export type HotkeyOverrideMap = Partial<Record<HotkeyKey, string>>

export declare const HOTKEYS: Readonly<Record<HotkeyKey, string>>

export type EditorCapability =
| 'project.navigate'
| 'project.save'
Expand Down Expand Up @@ -354,6 +431,25 @@ export interface EditorHostNavigation {
back(): void
}

export declare const HOST_SHORTCUTS_SCHEMA: 'freecut-host-shortcuts'
export declare const HOST_SHORTCUTS_VERSION: 1

export interface HostShortcutSettings {
schema: typeof HOST_SHORTCUTS_SCHEMA
version: typeof HOST_SHORTCUTS_VERSION
overrides: HotkeyOverrideMap
}

export interface EditorShortcutPort {
getSettings(): Promise<HostShortcutSettings> | HostShortcutSettings
setSettings(settings: HostShortcutSettings): Promise<void> | void
subscribe?(listener: (settings: HostShortcutSettings) => void): () => void
}

export declare function createHostShortcutSettings(
overrides?: HotkeyOverrideMap,
): HostShortcutSettings

export interface EditorHost {
readonly capabilities: EditorCapabilityMap
load(): Promise<EmbeddedEditorSnapshot> | EmbeddedEditorSnapshot
Expand All @@ -362,6 +458,7 @@ export interface EditorHost {
): Promise<ResolvedMediaLocator | null> | ResolvedMediaLocator | null
submitEdit(batch: EditCommandBatch): Promise<HostEditResult> | HostEditResult
subscribe?(listener: (snapshot: EmbeddedEditorSnapshot) => void): () => void
shortcuts?: EditorShortcutPort
transcript?: EditorTranscriptPort
navigation?: EditorHostNavigation
notify?(notice: HostNotice): void
Expand Down
7 changes: 7 additions & 0 deletions packages/freecut-editor/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
export { FreeCutEditorSurface } from '@/features/editor/host/editor-surface'
export { EditorHostProvider } from '@/features/editor/host/context-provider'
export { HOTKEYS } from '@/config/hotkeys'
export type { HotkeyKey, HotkeyOverrideMap } from '@/config/hotkeys'
export {
DEFAULT_HOST_CAPABILITIES,
HOST_SHORTCUTS_SCHEMA,
HOST_SHORTCUTS_VERSION,
MAX_TRANSCRIPT_COMMAND_TEXT_BYTES,
MAX_TRANSCRIPT_CURSOR_LENGTH,
MAX_TRANSCRIPT_DURATION_US,
Expand All @@ -11,6 +15,7 @@ export {
MAX_TRANSCRIPT_SELECTIONS,
SUPPORTED_HOST_COMMANDS,
capabilityForCommand,
createHostShortcutSettings,
createLocalEditorHost,
isHostCapabilityEnabled,
} from '@/features/editor/host/contract'
Expand All @@ -21,6 +26,7 @@ export type {
EditorCapabilityMap,
EditorHost,
EditorHostNavigation,
EditorShortcutPort,
EmbeddedEditorAsset,
EmbeddedEditorProject,
EmbeddedEditorSnapshot,
Expand All @@ -32,6 +38,7 @@ export type {
HostEditResult,
HostMediaKind,
HostNotice,
HostShortcutSettings,
HostTranscriptCommandAction,
HostTranscriptCommandPreview,
HostTranscriptCommandPreviewRequest,
Expand Down
21 changes: 21 additions & 0 deletions playwright.mobile.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { defineConfig } from 'playwright/test'

export default defineConfig({
testDir: './tests/browser',
testMatch: 'responsive-editor.spec.ts',
fullyParallel: false,
workers: 1,
reporter: 'line',
use: {
baseURL: 'http://127.0.0.1:4178',
channel: 'chrome',
headless: true,
trace: 'retain-on-failure',
},
webServer: {
command: 'npm run dev -- --port 4178 --strictPort',
url: 'http://127.0.0.1:4178',
reuseExistingServer: true,
timeout: 120_000,
},
})
2 changes: 1 addition & 1 deletion provenance/dependency-inventory.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"generatedFrom": "package.json",
"packageName": "freecut",
"packageVersion": "0.0.0",
"packageJsonSha256": "0fcaa186e39d48d5e4e95339c0a853543aeea2a8bbbb54691a51502eb4d3bd5b",
"packageJsonSha256": "7786ffe5cde5b09b6f88fc4fd13af399365ac0d6dc32f320d6f719c6f62edc89",
"lockfile": {
"path": "package-lock.json",
"lockfileVersion": 3,
Expand Down
2 changes: 1 addition & 1 deletion provenance/freecut-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
],
"dependencies": {
"packageJson": "package.json",
"packageJsonSha256": "0fcaa186e39d48d5e4e95339c0a853543aeea2a8bbbb54691a51502eb4d3bd5b",
"packageJsonSha256": "7786ffe5cde5b09b6f88fc4fd13af399365ac0d6dc32f320d6f719c6f62edc89",
"lockfile": "package-lock.json",
"lockfileVersion": 3,
"lockfileSha256": "b4a86741ce7891da1f63df01b6fdd4ed507e8887d5097c6a0f93fc2ea6f3420e",
Expand Down
19 changes: 19 additions & 0 deletions scripts/runtime-hotkey-import-boundary.d.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
export interface RuntimeHotkeyBoundarySource {
path: string
source: string
}

export interface RuntimeHotkeyImportViolation {
path: string
line: number
column: number
allowedPath: string
message: string
}

export declare const RUNTIME_HOTKEY_ADAPTER_PATH: 'src/hooks/use-hotkey-registration.ts'

export declare function findReactHotkeysHookImportViolations(
sources: RuntimeHotkeyBoundarySource[],
allowedPath?: string,
): RuntimeHotkeyImportViolation[]
Loading
Loading