OpenCut/apps/web/src/lib/progress/default.ts

173 lines
11 KiB
TypeScript

import type { ProgressDoc } from './types'
export const DEFAULT_PROGRESS_DOC: ProgressDoc = {
version: 1,
updatedAt: '2026-05-08T00:00:00.000Z',
phases: [
{
id: 'model',
title: 'Model',
description: 'Pure data, no behavior. The shape everything else depends on.',
items: [
{ id: 'model.time', title: 'Time model', description: 'Time, TimeRange, FrameRate, conversions.', status: 'todo', weight: 0.2 },
{ id: 'model.geometry', title: 'Geometry primitives', description: 'Vec2, Rect, Color, Transform, easing.', status: 'todo', weight: 0.2 },
{ id: 'model.id', title: 'Identifier system', description: 'Typed, branded IDs.', status: 'todo', weight: 0.1 },
{ id: 'model.property', title: 'Property system', description: 'Typed animatable values, schema, animation curve, keyframe.', status: 'todo', weight: 0.7 },
{ id: 'model.asset-ref', title: 'Asset reference type', description: 'Opaque handle, resolved by the asset service.', status: 'todo', weight: 0.1 },
{ id: 'model.element', title: 'Element model', description: 'Open-typed payload, properties, children.', status: 'todo', weight: 0.4 },
{ id: 'model.track', title: 'Track model', status: 'todo', weight: 0.2 },
{ id: 'model.scene', title: 'Scene model', description: 'A scene contains tracks. Compositions are scenes.', status: 'todo', weight: 0.4 },
{ id: 'model.project', title: 'Project model', description: 'Tree of scenes, project-level properties.', status: 'todo', weight: 0.3 },
{ id: 'model.selection', title: 'Selection model', description: 'Multi-element, mixed types.', status: 'todo', weight: 0.3 },
],
},
{
id: 'commands',
title: 'Command bus',
description: 'The single mutation primitive. Undo, scripting, plugins, ripple all flow through it.',
items: [
{ id: 'commands.define', title: 'Command definition + invocation', status: 'todo', weight: 0.4 },
{ id: 'commands.undo', title: 'Undo / redo', status: 'todo', weight: 0.5 },
{ id: 'commands.diff', title: 'Diff emission for observers', status: 'todo', weight: 0.4 },
{ id: 'commands.registry', title: 'Command registry', status: 'todo', weight: 0.2 },
{ id: 'commands.ripple', title: 'Ripple as first diff observer', description: 'Proves the observer architecture.', status: 'todo', weight: 0.4 },
],
},
{
id: 'registry',
title: 'Registry & contributions',
description: 'Every extensible surface is a typed registry. Built-ins write to the same registries plugins do.',
items: [
{ id: 'registry.core', title: 'Typed registry core', status: 'todo', weight: 0.3 },
{ id: 'registry.element-types', title: 'Element type registry', status: 'todo', weight: 0.2 },
{ id: 'registry.property-types', title: 'Property type registry', description: 'How a float, color, vec2 property renders.', status: 'todo', weight: 0.4 },
{ id: 'registry.effects', title: 'Effect / filter / mask / transition registries', status: 'todo', weight: 0.3 },
{ id: 'registry.inspector-tabs', title: 'Inspector tab registry', status: 'todo', weight: 0.3 },
{ id: 'registry.context-menu', title: 'Context menu registry', status: 'todo', weight: 0.3 },
{ id: 'registry.preview-overlay', title: 'Preview overlay registry', status: 'todo', weight: 0.3 },
{ id: 'registry.timeline-overlay', title: 'Timeline overlay registry', status: 'todo', weight: 0.3 },
{ id: 'registry.panel', title: 'Panel registry', status: 'todo', weight: 0.3 },
{ id: 'registry.snap-source', title: 'Snap source registry', status: 'todo', weight: 0.2 },
{ id: 'registry.asset-provider', title: 'Asset provider registry', status: 'todo', weight: 0.2 },
{ id: 'registry.project-settings', title: 'Project settings section registry', status: 'todo', weight: 0.2 },
],
},
{
id: 'api',
title: 'Editor API',
description: 'The public, versioned surface. The only way for plugins (and built-ins) to do anything.',
items: [
{ id: 'api.read', title: 'Read API', description: 'Project, scene, selection, viewport, time.', status: 'todo', weight: 0.4 },
{ id: 'api.write', title: 'Write API', description: 'Only via commands.', status: 'todo', weight: 0.3 },
{ id: 'api.subscribe', title: 'Subscription API', status: 'todo', weight: 0.4 },
{ id: 'api.contribute', title: 'Contribution API', description: 'Surfaces every registry to plugins.', status: 'todo', weight: 0.4 },
{ id: 'api.ui', title: 'UI rendering API', description: 'Declarative, same shape on every platform.', status: 'todo', weight: 0.7 },
{ id: 'api.versioning', title: 'API versioning & stability', status: 'todo', weight: 0.2 },
],
},
{
id: 'services',
title: 'Core services',
description: 'Cross-cutting services every command and overlay needs.',
items: [
{ id: 'services.snap', title: 'Snap service', status: 'todo', weight: 0.4 },
{ id: 'services.placement', title: 'Placement service', description: 'Move groups, overlap detection, plan emission.', status: 'todo', weight: 0.7 },
{ id: 'services.bindings', title: 'Binding service', description: 'Shortcuts, keymap, override layer.', status: 'todo', weight: 0.4 },
{ id: 'services.assets', title: 'Asset service', description: 'Resolves AssetRef per platform.', status: 'todo', weight: 0.5 },
],
},
{
id: 'engine',
title: 'Engine',
description: 'The Rust core. Project + time + size in, pixels out.',
items: [
{ id: 'engine.graph', title: 'Render graph', status: 'todo', weight: 0.8 },
{ id: 'engine.wgpu', title: 'WGPU pipeline', status: 'todo', weight: 1.0 },
{ id: 'engine.effects', title: 'Effect host', status: 'todo', weight: 0.7 },
{ id: 'engine.mask', title: 'Mask host', status: 'todo', weight: 0.5 },
{ id: 'engine.sampling', title: 'Time-keyed scene sampling', status: 'todo', weight: 0.5 },
{ id: 'engine.headless', title: 'Headless deterministic renderer', description: 'For tests, scripting, export.', status: 'todo', weight: 0.4 },
],
},
{
id: 'io',
title: 'IO & persistence',
description: 'Project format, asset storage, migrations.',
items: [
{ id: 'io.format', title: 'Project file format', description: 'Directory bundle, manifest, asset references by default.', status: 'todo', weight: 0.5 },
{ id: 'io.save-load', title: 'Save / load', status: 'todo', weight: 0.4 },
{ id: 'io.pack', title: 'Asset packing', description: 'Embed vs reference toggle.', status: 'todo', weight: 0.3 },
{ id: 'io.migrations', title: 'Migration system', status: 'todo', weight: 0.3 },
],
},
{
id: 'web-host',
title: 'Web host',
description: 'The thin React shell that mounts contributed UI.',
items: [
{ id: 'web.panels', title: 'Panel system', status: 'todo', weight: 0.4 },
{ id: 'web.preview', title: 'Preview surface', description: 'GPU surface, mounts overlays.', status: 'todo', weight: 0.6 },
{ id: 'web.timeline', title: 'Timeline surface', status: 'todo', weight: 0.7 },
{ id: 'web.inspector', title: 'Inspector surface', status: 'todo', weight: 0.4 },
{ id: 'web.assets', title: 'Asset surface', status: 'todo', weight: 0.3 },
{ id: 'web.context-menu', title: 'Context menu surface', status: 'todo', weight: 0.2 },
{ id: 'web.input', title: 'Keyboard input → bindings', status: 'todo', weight: 0.3 },
{ id: 'web.shortcuts-dialog', title: 'Shortcut settings dialog', status: 'todo', weight: 0.3 },
],
},
{
id: 'builtins',
title: 'Built-in plugins',
description: 'Every feature ships as a plugin against the public API.',
items: [
{ id: 'plugin.video', title: 'Video element + transform tab', status: 'todo', weight: 0.6 },
{ id: 'plugin.audio', title: 'Audio element + audio tab', status: 'todo', weight: 0.5 },
{ id: 'plugin.text', title: 'Text element + text tab', status: 'todo', weight: 0.5 },
{ id: 'plugin.adjustment', title: 'Adjustment layer', status: 'todo', weight: 0.3 },
{ id: 'plugin.composition-ref', title: 'Composition reference', status: 'todo', weight: 0.5 },
{ id: 'plugin.stickers', title: 'Stickers (logos, flags, shapes)', status: 'todo', weight: 0.4 },
{ id: 'plugin.masks', title: 'Masks (square, circle, heart, star, text, custom)', status: 'todo', weight: 0.7 },
{ id: 'plugin.effects', title: 'Effects (initial set)', status: 'todo', weight: 0.7 },
{ id: 'plugin.filters', title: 'Filters (LUT-based)', status: 'todo', weight: 0.4 },
{ id: 'plugin.transitions', title: 'Transitions', status: 'todo', weight: 0.5 },
{ id: 'plugin.bookmarks', title: 'Bookmarks', status: 'todo', weight: 0.3 },
{ id: 'plugin.snapping', title: 'Snapping toggle UI + built-in snap sources', status: 'todo', weight: 0.3 },
{ id: 'plugin.guides', title: 'Guide overlays', description: 'Grid, TikTok, Reels, Shorts, Snapchat.', status: 'todo', weight: 0.3 },
{ id: 'plugin.speed', title: 'Speed property + maintain-pitch', status: 'todo', weight: 0.3 },
{ id: 'plugin.blending', title: 'Blending (opacity + mode)', status: 'todo', weight: 0.2 },
{ id: 'plugin.project-settings', title: 'Project settings sections', status: 'todo', weight: 0.2 },
{ id: 'plugin.graph-editor', title: 'Graph editor', description: 'Operates over animation curves; presets.', status: 'todo', weight: 0.7 },
],
},
{
id: 'scripting',
title: 'Scripting',
description: 'Same Editor API, callable from outside the UI.',
items: [
{ id: 'scripting.runtime', title: 'Embedded scripting runtime', status: 'todo', weight: 0.6 },
{ id: 'scripting.bindings', title: 'Scripting bound to Editor API', status: 'todo', weight: 0.4 },
{ id: 'scripting.headless', title: 'Headless mode', description: 'Run scripts without UI.', status: 'todo', weight: 0.3 },
],
},
{
id: 'desktop',
title: 'Desktop host (gpui)',
items: [
{ id: 'desktop.shell', title: 'gpui shell scaffold', status: 'todo', weight: 0.5 },
{ id: 'desktop.panels', title: 'Panel system port', status: 'todo', weight: 0.4 },
{ id: 'desktop.input', title: 'Native input integration', status: 'todo', weight: 0.3 },
{ id: 'desktop.io', title: 'Native file dialogs / IO', status: 'todo', weight: 0.3 },
],
},
{
id: 'mobile',
title: 'Mobile host',
items: [
{ id: 'mobile.shell', title: 'Native shell scaffold', status: 'todo', weight: 0.6 },
{ id: 'mobile.touch', title: 'Touch input model', status: 'todo', weight: 0.5 },
{ id: 'mobile.io', title: 'Native file picker / IO', status: 'todo', weight: 0.3 },
],
},
],
}