auricui-skill 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +29 -2
- package/bin/install.mjs +66 -0
- package/package.json +29 -4
- package/skill/SKILL.md +64 -0
- package/skill/agents/openai.yaml +4 -0
- package/skill/assets/examples/ApprovalCard.tsx +8 -0
- package/skill/assets/examples/BasicApp.tsx +38 -0
- package/skill/assets/examples/BriefingCard.tsx +8 -0
- package/skill/assets/examples/ChatControls.tsx +49 -0
- package/skill/assets/examples/ChatPanel.tsx +73 -0
- package/skill/assets/examples/Checkbox.tsx +13 -0
- package/skill/assets/examples/Combobox.tsx +14 -0
- package/skill/assets/examples/Drawer.tsx +10 -0
- package/skill/assets/examples/MemoryCard.tsx +9 -0
- package/skill/assets/examples/MessageList.tsx +8 -0
- package/skill/assets/examples/Theme.tsx +14 -0
- package/skill/assets/examples/ToolCall.tsx +8 -0
- package/skill/assets/examples/Tree.tsx +15 -0
- package/skill/assets/examples/examples.css +11 -0
- package/skill/assets/library/auricui-0.1.0-preview.1.tgz +0 -0
- package/skill/assets/library/auricui-0.1.0-preview.3.tgz +0 -0
- package/skill/assets/library/auricui-0.1.0-preview.4.tgz +0 -0
- package/skill/assets/upstream/LICENSE +21 -0
- package/skill/assets/upstream/apps/desktop/chat/src/App.tsx +1099 -0
- package/skill/assets/upstream/apps/desktop/chat/src/app-bridge.ts +154 -0
- package/skill/assets/upstream/apps/desktop/chat/src/chat.css +1812 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AddSkill.tsx +223 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AgentActivityRow.tsx +716 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AgentIcons.tsx +46 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentCard.tsx +34 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentPreview.tsx +331 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/BalanceNotice.tsx +22 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/BrandLogo.tsx +35 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ComposerCard.tsx +182 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ConversationSessionBar.tsx +292 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/CopyDiagnostics.tsx +24 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Divider.tsx +47 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/FileChangesList.tsx +119 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Markdown.tsx +198 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ModelPopover.tsx +280 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/NoticeCard.tsx +87 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Popover.tsx +195 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/PreviewFrame.tsx +129 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectConversation.tsx +852 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectStarters.tsx +118 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/Tooltip.tsx +191 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/TurnLog.tsx +583 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/TurnQuestionCard.tsx +133 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/dock-pane-bar.ts +14 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/project-version.ts +37 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/MentionMenuPlugin.tsx +372 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptEditor.tsx +476 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptPill.tsx +399 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptReferenceNode.tsx +164 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/index.ts +31 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/mention-menu.ts +206 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/prompt-text.ts +171 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/useStickToBottom.ts +320 -0
- package/skill/assets/upstream/apps/desktop/chat/src/components/useTicker.ts +55 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/index.ts +42 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/en-US.ts +408 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/es.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ja.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ko.ts +403 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/words.ts +6 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/zh-CN.ts +407 -0
- package/skill/assets/upstream/apps/desktop/chat/src/i18n/lookup.ts +12 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-activity-runs.ts +154 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-menu-rows.ts +41 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-refs.ts +105 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-transcript.ts +440 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/asset-lists.ts +75 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/attachment-place.ts +17 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/balance.ts +16 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-layer.ts +10 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-menu.ts +18 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-store.ts +101 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/composer-attachments.ts +189 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-attachments.ts +178 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-bridge.ts +291 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/developer.ts +39 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/esc-stop.ts +23 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/file-changes.ts +32 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/live-activity.ts +20 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/local-agent-run.ts +1174 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/local-sessions.ts +25 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/model-calls.ts +87 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/pretty-json.ts +12 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/preview-top.ts +15 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-resources.ts +66 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-sessions.ts +66 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/project-versions.ts +116 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/ref-pictures.ts +119 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/relative-time.ts +46 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/skill-pages.ts +29 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/step-file.ts +23 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/structural-share.ts +52 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-film.ts +44 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-transfer.ts +40 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/unprompted.ts +27 -0
- package/skill/assets/upstream/apps/desktop/chat/src/lib/upload-limits.ts +53 -0
- package/skill/assets/upstream/apps/desktop/chat/src/mount.tsx +19 -0
- package/skill/assets/upstream/apps/desktop/chat/src/state/local-agent-store.ts +296 -0
- package/skill/assets/upstream/apps/desktop/chat/src/studio-refs.ts +307 -0
- package/skill/assets/upstream/apps/desktop/package.json +51 -0
- package/skill/assets/upstream/apps/desktop/shell/bridge.ts +415 -0
- package/skill/assets/upstream/apps/desktop/shell/index.html +27 -0
- package/skill/assets/upstream/apps/desktop/shell/main.tsx +17 -0
- package/skill/assets/upstream/apps/desktop/shell/shell.css +17 -0
- package/skill/assets/upstream/apps/desktop/shell/vite.config.ts +65 -0
- package/skill/assets/upstream/apps/desktop/src/agent-definitions.mjs +31 -0
- package/skill/assets/upstream/packages/openfilm/LICENSE +21 -0
- package/skill/assets/upstream/packages/openfilm/package.json +88 -0
- package/skill/assets/upstream/packages/openfilm/src/film-doc.d.mts +125 -0
- package/skill/assets/upstream/packages/openfilm/src/film-doc.mjs +986 -0
- package/skill/assets/upstream/packages/openfilm/src/overrides.mjs +73 -0
- package/skill/assets/upstream/packages/openfilm/src/timeline.mjs +1280 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/bridge.js +209 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/film-subtitle.mjs +785 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/ops.mjs +403 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/stage.js +1649 -0
- package/skill/assets/upstream/packages/openfilm/studio/server/track-layout.mjs +43 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/App.tsx +156 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/api.ts +328 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/AudioMeters.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockThumbs.tsx +84 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockWaveform.tsx +201 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLoadingScreen.tsx +56 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLogo.tsx +25 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Card.tsx +89 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ColorPicker.tsx +204 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ConfirmDialog.tsx +96 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ContextMenu.tsx +422 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/DesktopDialog.tsx +271 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ExamplesGallery.tsx +372 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmFullscreenBar.tsx +147 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmInspector.tsx +2310 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmStageSelect.tsx +3296 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FocusNav.tsx +28 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FontFamilyPicker.tsx +293 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FramePicker.tsx +69 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/InspectorPanel.tsx +25 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Launcher.tsx +38 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LayersPanel.tsx +277 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LiveTime.tsx +101 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPool.tsx +1413 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPreview.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MenuSelect.tsx +161 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MgOutline.tsx +24 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/OperationHistory.tsx +184 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PaneDivider.tsx +292 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PasteAttrsDialog.tsx +69 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PlaybackMenu.tsx +110 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Popover.tsx +159 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectCover.tsx +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectHistoryControls.tsx +748 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectLayoutMenu.tsx +82 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectMenu.tsx +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectSources.tsx +587 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectView.tsx +3222 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsLibrary.tsx +567 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsView.tsx +1593 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PropertiesSection.tsx +418 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ResourceInspector.tsx +100 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SelectionToolbar.tsx +157 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SkillsLibrary.tsx +504 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SourcePreview.tsx +464 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SpendAsks.tsx +88 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageMaskOverlay.tsx +299 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageTransformFrame.tsx +246 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.module.css +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.tsx +884 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleOverlay.tsx +148 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleRow.tsx +419 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TabStrip.tsx +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Timeline.tsx +4911 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TimelineMarkers.tsx +329 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Toast.tsx +55 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Tooltip.tsx +193 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/UpdateButton.tsx +104 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ViewerBar.tsx +98 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/WhatsNew.tsx +147 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/dock-pane-bar.ts +16 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportCenter.tsx +1502 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportTray.tsx +284 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/film-stage-hit.ts +18 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-fields.tsx +863 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-look.tsx +1357 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/controls-bar.tsx +397 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/transport.tsx +294 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/replace-drop.ts +20 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/AgentsSection.tsx +613 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/CustomServices.tsx +104 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/DiagnosticsGroup.tsx +202 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ModelsSection.tsx +179 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProviderMark.tsx +24 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProvidersSection.tsx +177 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsModal.tsx +511 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsSelect.tsx +84 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ShortcutsSection.tsx +291 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/StorageGroup.tsx +119 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/theme.ts +47 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ui.tsx +139 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/use-settings.ts +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/stage-menu.tsx +283 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/timeline-head-extras.tsx +91 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/typing-target.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-editor-tools.tsx +408 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-page-changes.ts +48 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-project-history.ts +113 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/useBlockDrag.ts +639 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/Preview.tsx +426 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/player.ts +558 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/preview-frames.ts +36 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/steps.ts +36 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/undo.ts +156 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-film.ts +212 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-preview-renders.ts +89 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/globals.css +559 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/en.ts +1901 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/es.ts +1900 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/index.ts +130 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ja.ts +1900 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ko.ts +1896 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/words.ts +6 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/zh-CN.ts +1901 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/agent-row.ts +21 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/asset-timeline.ts +469 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/audio-levels.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/batch-map.ts +28 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/browser.ts +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/canvas-fit.ts +116 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/chat-marks.ts +114 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-attrs.ts +102 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-fade.ts +70 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-look.ts +520 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-mask.ts +536 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-replace.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/component-props.ts +128 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/context-length.ts +12 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/desktop-build.ts +44 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/diagnostics.ts +68 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/double-press.ts +22 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/dropped-overrides.ts +139 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-jobs.ts +191 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-spec.ts +261 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/field-input.ts +155 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-clip-edits.ts +82 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-frame.ts +134 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-overrides.ts +107 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-shape.ts +172 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film.ts +80 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-menu.ts +236 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-styles.ts +129 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/freeze-frame.ts +49 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/host.ts +438 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/inspect-scrub.ts +26 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap-store.ts +74 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap.ts +529 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/layers-tree.ts +133 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/look.ts +83 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/loudness.ts +58 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/markers.ts +152 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-bar.ts +58 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-folders.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-place.ts +102 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-queue.ts +107 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-selection.ts +64 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/menu-position.ts +77 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mg-transform.ts +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mixed.ts +3 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/page-changes.ts +45 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/picture-files.ts +19 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-prefs.ts +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-renders.ts +71 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-delete.ts +20 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-folders.ts +144 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-history.ts +188 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-sources.ts +283 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/projects-page.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/provider-marks.ts +35 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/providers.ts +163 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/resource-drag.ts +131 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/retry-image.ts +17 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved-insert.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved.ts +125 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/selection-toolbar.ts +158 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/shortcut-hint.ts +21 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/similar-layers.ts +46 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/solo.ts +19 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-clip.ts +60 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-crop.ts +232 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-gesture.ts +277 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-layers.ts +71 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-mask.ts +176 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-measure.ts +53 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-types.ts +155 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-refs.ts +248 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-version.ts +41 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitle-cues.ts +238 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitles.ts +263 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/tab-menu.ts +6 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/template-controls.ts +131 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/theme-changes.ts +31 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cache.ts +63 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cell.ts +8 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-frame.ts +76 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-pick.ts +42 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timecode.ts +161 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-clipboard.ts +279 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-drag.ts +589 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-edit.ts +1138 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-keys.ts +63 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-layout.ts +1038 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-nav.ts +160 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-prefs.ts +73 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-split.ts +40 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-view.ts +105 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/title.ts +39 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-heights.ts +55 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-lock.ts +27 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/transitions.ts +459 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/type-metrics.ts +83 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-film-subtitles.ts +111 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-fonts.ts +181 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-loaded-thumbs.ts +91 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-edits.ts +134 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-font.ts +51 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-style.ts +68 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/waveform-columns.ts +48 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/web-update.ts +41 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/whats-new.ts +401 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/workspace-resources.ts +373 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/src/main.tsx +10 -0
- package/skill/assets/upstream/packages/openfilm/studio/ui/vite.config.ts +12 -0
- package/skill/assets/upstream/packages/shared/package.json +45 -0
- package/skill/assets/upstream/packages/shared/src/agent-activity.ts +263 -0
- package/skill/assets/upstream/packages/shared/src/contract.ts +285 -0
- package/skill/assets/upstream/packages/shared/src/index.ts +17 -0
- package/skill/assets/upstream/packages/shared/src/markdown-blocks.ts +252 -0
- package/skill/assets/upstream/packages/shared/src/modality.ts +4 -0
- package/skill/assets/upstream/packages/shared/src/prompt-reference.ts +113 -0
- package/skill/assets/upstream/packages/shared/src/title.ts +76 -0
- package/skill/assets/upstream/packages/shared/src/turn.ts +68 -0
- package/skill/assets/upstream/packages/shared/src/video.ts +26 -0
- package/skill/references/agent-components.md +33 -0
- package/skill/references/api-index.json +2693 -0
- package/skill/references/chat-components.md +65 -0
- package/skill/references/components.md +23 -0
- package/skill/references/core-components.md +44 -0
- package/skill/references/dependencies.md +22 -0
- package/skill/references/esm-package.md +48 -0
- package/skill/references/integration.md +43 -0
- package/skill/references/library-manifest.json +12 -0
- package/skill/references/source-manifest.json +325 -0
- package/skill/references/studio-components.md +24 -0
- package/skill/references/theme-motion.md +49 -0
- package/skill/references/troubleshooting.md +27 -0
- package/skill/references/verification.md +13 -0
- package/skill/scripts/check_dependencies.py +109 -0
- package/skill/scripts/inspect_api.py +60 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stage's context menus (FilmStageSelect asks for one on a right-click): what was hit decides the
|
|
3
|
+
* list. A layer inside a page, a whole clip (the same actions as its block on the timeline), several layers boxed
|
|
4
|
+
* together; and after them on every menu, Show… / Unlock… for the layers that cannot be clicked any more. Items that
|
|
5
|
+
* cannot run stay, grayed, with the reason.
|
|
6
|
+
*
|
|
7
|
+
* Layer changes are overrides (the editor writes film.html); the clip's actions are the editor's, passed in.
|
|
8
|
+
*/
|
|
9
|
+
import type * as React from 'react';
|
|
10
|
+
import {
|
|
11
|
+
BringToFront, ClipboardPaste, Copy as CopyIcon, CopyPlus, CornerLeftUp, Download, Eye, EyeOff, HardDriveUpload, ImageIcon,
|
|
12
|
+
ImageUp, Layers, Lock, RotateCcw, Scissors, SendToBack, Trash2, Type as TypeIcon, Unlock,
|
|
13
|
+
} from 'lucide-react';
|
|
14
|
+
|
|
15
|
+
import type { ContextMenuEntry } from '@/components/ContextMenu';
|
|
16
|
+
import type { FilmDoc } from '@/lib/film';
|
|
17
|
+
import type { OverrideGeometry } from '@/lib/film-overrides';
|
|
18
|
+
import { shortcutHint } from '@/lib/shortcut-hint';
|
|
19
|
+
import { hintOf } from '@/lib/keymap';
|
|
20
|
+
import { currentKeymap, MAC } from '@/lib/keymap-store';
|
|
21
|
+
import type { AlignEdge } from '@/lib/stage-gesture';
|
|
22
|
+
import { recoverableLayers, type RecoverableLayer } from '@/lib/stage-layers';
|
|
23
|
+
import type { StageElement } from '@/lib/stage-types';
|
|
24
|
+
|
|
25
|
+
/** What the stage itself does for its menu, and where it was opened. */
|
|
26
|
+
/**
|
|
27
|
+
* Bringing a layer to the front of what it overlaps or sending it to the back (studio/server/stage.js `arrange`),
|
|
28
|
+
* worked out when asked: the overrides to write (a target in the page and its style), or why there is nothing to do.
|
|
29
|
+
*/
|
|
30
|
+
export interface StageArrangeResult {
|
|
31
|
+
edits: Array<{ target: { at: string; n?: number }; style: Record<string, string | number> }>;
|
|
32
|
+
reason: 'alone' | 'already' | 'blocked' | null;
|
|
33
|
+
}
|
|
34
|
+
export type StageArrange = (to: 'front' | 'back') => Promise<StageArrangeResult | null>;
|
|
35
|
+
|
|
36
|
+
export interface StageMenuContext {
|
|
37
|
+
/** Type the line in place; only for a layer with words. */
|
|
38
|
+
editText?: () => void;
|
|
39
|
+
/** Bring the layer to the front of what it overlaps / send it to the back (see StageArrange); null when it cannot be. */
|
|
40
|
+
arrange: StageArrange | null;
|
|
41
|
+
/** Where the menu was opened (stage overlay px). */
|
|
42
|
+
at: { x: number; y: number };
|
|
43
|
+
/** The layers boxed or Shift-clicked together (two or more). */
|
|
44
|
+
multi?: readonly StageElement[];
|
|
45
|
+
/** Line them up with an edge / middle of their union box (one save). */
|
|
46
|
+
align?: (edge: AlignEdge) => void;
|
|
47
|
+
/** The layer (or a layer around it) is locked. */
|
|
48
|
+
locked?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** A whole clip's actions: the editor's (the timeline runs the same ones), for the clip at `clipLoc`. */
|
|
52
|
+
export interface StageClipActions {
|
|
53
|
+
/** Whether the clip's track is locked: nothing that changes the clip runs, as on the timeline. */
|
|
54
|
+
isLocked(clipLoc: string): boolean;
|
|
55
|
+
/** Whether the playhead is over the clip (Split cuts there). */
|
|
56
|
+
canSplit(clipLoc: string): boolean;
|
|
57
|
+
split(clipLoc: string): void;
|
|
58
|
+
copy(clipLoc: string): void;
|
|
59
|
+
/** Whether anything was copied. */
|
|
60
|
+
canPaste(): boolean;
|
|
61
|
+
/** Paste at the playhead on the clip's track. */
|
|
62
|
+
paste(clipLoc: string): void;
|
|
63
|
+
/** A copy right after it on the same track. */
|
|
64
|
+
duplicate(clipLoc: string): void;
|
|
65
|
+
/** Its track to the top / bottom of the stack. */
|
|
66
|
+
bringToFront(clipLoc: string): void;
|
|
67
|
+
sendToBack(clipLoc: string): void;
|
|
68
|
+
/** Back to where it lands by default (its box removed). */
|
|
69
|
+
resetTransform(clipLoc: string): void;
|
|
70
|
+
exportClip?(clipId: string): void;
|
|
71
|
+
remove(clipLoc: string): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface StageMenuActions {
|
|
75
|
+
/** A layer's override changed (`null` removes it: reset). */
|
|
76
|
+
editOverride(element: StageElement, patch: OverrideGeometry | null): void;
|
|
77
|
+
/** Several layers' overrides at once: one save, one undo step. */
|
|
78
|
+
editOverrides(list: ReadonlyArray<{ element: StageElement; patch: OverrideGeometry | null }>): void;
|
|
79
|
+
/** Select the layer at `loc` in the clip at `clipLoc` (a parent). */
|
|
80
|
+
selectParent(loc: string, clipLoc?: string): void;
|
|
81
|
+
/** Select the whole clip (as on the timeline). */
|
|
82
|
+
selectClip(clipLoc: string): void;
|
|
83
|
+
/** Say something short to the person (why an action did nothing). */
|
|
84
|
+
notify?(message: string): void;
|
|
85
|
+
/** The whole clip's actions; without them a clip's menu is empty. */
|
|
86
|
+
clip?: StageClipActions;
|
|
87
|
+
/** Another file in a picture's place; without it a picture has no Replace. */
|
|
88
|
+
picture?: StagePictureActions;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Replacing the picture a layer draws (an <img>, a box painted with one image): written as the clip's override. */
|
|
92
|
+
export interface StagePictureActions {
|
|
93
|
+
/** The project's pictures, by their place in the project, each with where its thumbnail is read from. */
|
|
94
|
+
pictures(): Array<{ path: string; name: string; url?: string }>;
|
|
95
|
+
/** One from this computer, brought into the project: its place there (null: none picked). */
|
|
96
|
+
pickFromComputer?(): Promise<string | null>;
|
|
97
|
+
/** `path` (in the project) drawn in the layer's place; null: its own again. */
|
|
98
|
+
put(element: StageElement, path: string | null): void;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A picture's thumbnail in a menu, where its icon goes: wider than an icon, so the pictures read apart. */
|
|
102
|
+
export function pictureThumb(url: string | undefined): React.ReactNode {
|
|
103
|
+
return url
|
|
104
|
+
? <img src={url} alt="" draggable={false} loading="lazy" className="h-[14px] w-[22px] shrink-0 rounded-[2px] object-cover" />
|
|
105
|
+
: <ImageIcon size={14} />;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** The pictures a layer's Replace offers: the project's, one from this computer, and its own again once replaced. */
|
|
109
|
+
export function replacePictureEntries(el: StageElement, actions: StagePictureActions, t: (path: string) => string): ContextMenuEntry[] {
|
|
110
|
+
const picture = el.picture;
|
|
111
|
+
if (!picture) return [];
|
|
112
|
+
const list = actions.pictures().slice(0, 40);
|
|
113
|
+
const pick = actions.pickFromComputer;
|
|
114
|
+
const out: ContextMenuEntry[] = list.map((f) => ({ id: `picture:${f.path}`, label: f.name, icon: pictureThumb(f.url), onSelect: () => actions.put(el, f.path) }));
|
|
115
|
+
if (pick) {
|
|
116
|
+
if (out.length) out.push({ id: 'picture-sep', separator: true });
|
|
117
|
+
out.push({
|
|
118
|
+
id: 'picture-computer', label: t('inspector.templatePictureComputer'), icon: <HardDriveUpload size={14} />,
|
|
119
|
+
onSelect: () => { void pick().then((path) => { if (path) actions.put(el, path); }); },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
if (picture.changed) {
|
|
123
|
+
out.push({ id: 'picture-own-sep', separator: true });
|
|
124
|
+
out.push({ id: 'picture-own', label: t('stageMenu.pictureOwn'), icon: <RotateCcw size={14} />, onSelect: () => actions.put(el, null) });
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
type T = (path: string) => string;
|
|
130
|
+
|
|
131
|
+
/** Entries with separators only between groups (never first, last or twice). */
|
|
132
|
+
function list() {
|
|
133
|
+
const out: ContextMenuEntry[] = [];
|
|
134
|
+
let n = 0;
|
|
135
|
+
return {
|
|
136
|
+
out,
|
|
137
|
+
push: (entry: ContextMenuEntry) => out.push(entry),
|
|
138
|
+
sep: () => { if (out.length && !('separator' in out[out.length - 1]!)) out.push({ id: `sep-${n++}`, separator: true }); },
|
|
139
|
+
done: () => { while (out.length && 'separator' in out[out.length - 1]!) out.pop(); return out; },
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function stageMenu(el: StageElement, ctx: StageMenuContext, actions: StageMenuActions, t: T): readonly ContextMenuEntry[] {
|
|
144
|
+
const m = list();
|
|
145
|
+
const lockKeys = shortcutHint('L', { mod: true, shift: true });
|
|
146
|
+
const hideKeys = shortcutHint('H', { mod: true, shift: true });
|
|
147
|
+
|
|
148
|
+
/* several layers together (boxed, Shift-clicked) */
|
|
149
|
+
if (ctx.multi && ctx.multi.length > 1) {
|
|
150
|
+
const many = ctx.multi;
|
|
151
|
+
const allHidden = many.every((x) => x.override?.style?.visibility === 'hidden');
|
|
152
|
+
const allLocked = many.every((x) => x.override?.lock);
|
|
153
|
+
if (ctx.align) {
|
|
154
|
+
const align = ctx.align;
|
|
155
|
+
m.push({
|
|
156
|
+
id: 'align', label: t('stageMenu.align'), icon: <Layers size={14} />,
|
|
157
|
+
submenu: ([
|
|
158
|
+
['left', 'inspector.alignLeft'], ['hcenter', 'inspector.alignHCenter'], ['right', 'inspector.alignRight'],
|
|
159
|
+
['top', 'inspector.alignTop'], ['vcenter', 'inspector.alignVCenter'], ['bottom', 'inspector.alignBottom'],
|
|
160
|
+
] as const).map(([edge, key]) => ({ id: `align-${edge}`, label: t(key), onSelect: () => align(edge) })),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
m.push({
|
|
164
|
+
id: 'hide', label: allHidden ? t('stageMenu.showAll') : t('stageMenu.hideAll'), icon: allHidden ? <Eye size={14} /> : <EyeOff size={14} />, shortcut: hideKeys,
|
|
165
|
+
onSelect: () => actions.editOverrides(many.map((x) => ({ element: x, patch: { style: { visibility: allHidden ? null : 'hidden' } } }))),
|
|
166
|
+
});
|
|
167
|
+
m.push({
|
|
168
|
+
id: 'lock', label: allLocked ? t('stageMenu.unlock') : t('stageMenu.lock'), icon: allLocked ? <Unlock size={14} /> : <Lock size={14} />, shortcut: lockKeys,
|
|
169
|
+
onSelect: () => actions.editOverrides(many.map((x) => ({ element: x, patch: { lock: !allLocked } }))),
|
|
170
|
+
});
|
|
171
|
+
return m.done();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* a whole clip */
|
|
175
|
+
if (el.kind === 'clip' || el.isMgOuter) {
|
|
176
|
+
const clipLoc = el.clipLoc;
|
|
177
|
+
const clip = actions.clip;
|
|
178
|
+
if (!clip || !clipLoc) return [];
|
|
179
|
+
/* a locked track's clips can be copied and exported, nothing else (the timeline's own rule) */
|
|
180
|
+
const trackLocked = clip.isLocked(clipLoc);
|
|
181
|
+
const lockedHint = t('timeline.trackLocked');
|
|
182
|
+
m.push({
|
|
183
|
+
id: 'split', label: t('timeline.menuSplitHere'), icon: <Scissors size={14} />, disabled: trackLocked || !clip.canSplit(clipLoc),
|
|
184
|
+
hint: trackLocked ? lockedHint : t('timeline.menuSplitOutside'),
|
|
185
|
+
onSelect: () => clip.split(clipLoc),
|
|
186
|
+
});
|
|
187
|
+
m.push({ id: 'copy', label: t('timeline.menuCopy'), icon: <CopyIcon size={14} />, onSelect: () => clip.copy(clipLoc) });
|
|
188
|
+
m.push({
|
|
189
|
+
id: 'paste', label: t('timeline.menuPaste'), icon: <ClipboardPaste size={14} />, disabled: trackLocked || !clip.canPaste(),
|
|
190
|
+
hint: trackLocked ? lockedHint : t('timeline.menuPasteEmpty'),
|
|
191
|
+
onSelect: () => clip.paste(clipLoc),
|
|
192
|
+
});
|
|
193
|
+
m.push({ id: 'duplicate', label: t('stageMenu.duplicate'), icon: <CopyPlus size={14} />, disabled: trackLocked, hint: lockedHint, onSelect: () => clip.duplicate(clipLoc) });
|
|
194
|
+
m.sep();
|
|
195
|
+
m.push({ id: 'front', label: t('stageMenu.front'), icon: <BringToFront size={14} />, disabled: trackLocked, hint: lockedHint, onSelect: () => clip.bringToFront(clipLoc) });
|
|
196
|
+
m.push({ id: 'back', label: t('stageMenu.back'), icon: <SendToBack size={14} />, disabled: trackLocked, hint: lockedHint, onSelect: () => clip.sendToBack(clipLoc) });
|
|
197
|
+
m.push({ id: 'reset', label: t('stageMenu.resetTransform'), icon: <RotateCcw size={14} />, disabled: trackLocked, hint: lockedHint, onSelect: () => clip.resetTransform(clipLoc) });
|
|
198
|
+
const exportClip = clip.exportClip;
|
|
199
|
+
if (exportClip && el.clipId) {
|
|
200
|
+
const id = el.clipId;
|
|
201
|
+
m.push({ id: 'export', label: t('timeline.menuExportClip'), icon: <Download size={14} />, onSelect: () => exportClip(id) });
|
|
202
|
+
}
|
|
203
|
+
m.sep();
|
|
204
|
+
m.push({ id: 'delete', label: t('timeline.removeBlock'), icon: <Trash2 size={14} />, danger: true, shortcut: hintOf(currentKeymap(), 'remove', MAC), disabled: trackLocked, hint: lockedHint, onSelect: () => clip.remove(clipLoc) });
|
|
205
|
+
return m.done();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* a layer */
|
|
209
|
+
const hidden = el.override?.style?.visibility === 'hidden';
|
|
210
|
+
const locked = Boolean(ctx.locked || el.override?.lock);
|
|
211
|
+
const o = el.override;
|
|
212
|
+
const adjusted = Boolean(o && (o.t || o.s != null || o.r || o.text != null || (o.style && Object.keys(o.style).length)));
|
|
213
|
+
if (ctx.editText) {
|
|
214
|
+
m.push({ id: 'edit-text', label: t('stageMenu.editText'), icon: <TypeIcon size={14} />, shortcut: '↵', disabled: locked, hint: t('stageMenu.lockedHint'), onSelect: ctx.editText });
|
|
215
|
+
}
|
|
216
|
+
if (el.picture && actions.picture) {
|
|
217
|
+
m.push({ id: 'replace-picture', label: t('stageMenu.replacePicture'), icon: <ImageUp size={14} />, disabled: locked, hint: t('stageMenu.lockedHint'), submenu: replacePictureEntries(el, actions.picture, t) });
|
|
218
|
+
}
|
|
219
|
+
m.sep();
|
|
220
|
+
/* restacking writes z-index overrides where the layer meets what it overlaps (stage.js arrange), in one write; the
|
|
221
|
+
page stays as written. When there is nothing to do, it says why instead of doing nothing silently */
|
|
222
|
+
const arrange = ctx.arrange;
|
|
223
|
+
const reorder = (to: 'front' | 'back') => {
|
|
224
|
+
if (!arrange) return;
|
|
225
|
+
void arrange(to).then((r) => {
|
|
226
|
+
if (!r) return;
|
|
227
|
+
if (!r.edits.length) {
|
|
228
|
+
const key = r.reason === 'alone' ? 'stageMenu.arrangeAlone' : r.reason === 'blocked' ? 'stageMenu.arrangeBlocked'
|
|
229
|
+
: to === 'front' ? 'stageMenu.arrangeFrontAlready' : 'stageMenu.arrangeBackAlready';
|
|
230
|
+
actions.notify?.(t(key));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
actions.editOverrides(r.edits.map(({ target, style }) => ({
|
|
234
|
+
element: { ...el, loc: target.n ? `${target.at}#${target.n}` : target.at, instance: target.n } as StageElement,
|
|
235
|
+
patch: { style },
|
|
236
|
+
})));
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
m.push({ id: 'front', label: t('stageMenu.front'), icon: <BringToFront size={14} />, shortcut: ']', disabled: !arrange, hint: t('stageMenu.arrangeHint'), onSelect: () => reorder('front') });
|
|
240
|
+
m.push({ id: 'back', label: t('stageMenu.back'), icon: <SendToBack size={14} />, shortcut: '[', disabled: !arrange, hint: t('stageMenu.arrangeHint'), onSelect: () => reorder('back') });
|
|
241
|
+
m.push({
|
|
242
|
+
id: 'hide', label: hidden ? t('stageMenu.show') : t('stageMenu.hide'), icon: hidden ? <Eye size={14} /> : <EyeOff size={14} />, shortcut: hideKeys,
|
|
243
|
+
onSelect: () => actions.editOverride(el, { style: { visibility: hidden ? null : 'hidden' } }),
|
|
244
|
+
});
|
|
245
|
+
m.push({
|
|
246
|
+
id: 'lock', label: locked ? t('stageMenu.unlock') : t('stageMenu.lock'), icon: locked ? <Unlock size={14} /> : <Lock size={14} />, shortcut: lockKeys,
|
|
247
|
+
onSelect: () => actions.editOverride(el, { lock: !locked }),
|
|
248
|
+
});
|
|
249
|
+
m.push({
|
|
250
|
+
id: 'reset', label: t('stageMenu.reset'), icon: <RotateCcw size={14} />, disabled: !adjusted || locked, hint: locked ? t('stageMenu.lockedHint') : t('stageMenu.resetNone'),
|
|
251
|
+
onSelect: () => actions.editOverride(el, null),
|
|
252
|
+
});
|
|
253
|
+
m.sep();
|
|
254
|
+
/* the nearest layer around it (parents are nearest first) */
|
|
255
|
+
const parentLayer = el.parents?.[0];
|
|
256
|
+
if (parentLayer?.loc) m.push({ id: 'parent', label: t('stageMenu.selectParent'), icon: <CornerLeftUp size={14} />, onSelect: () => actions.selectParent(parentLayer.loc, el.clipLoc) });
|
|
257
|
+
const clipLoc = el.clipLoc;
|
|
258
|
+
if (clipLoc) m.push({ id: 'clip', label: t('stageMenu.selectClip'), icon: <Layers size={14} />, onSelect: () => actions.selectClip(clipLoc) });
|
|
259
|
+
const words = el.text?.value;
|
|
260
|
+
if (words) m.push({ id: 'copy-text', label: t('stageMenu.copyText'), icon: <CopyIcon size={14} />, onSelect: () => { void navigator.clipboard?.writeText(words).catch(() => {}); } });
|
|
261
|
+
return m.done();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Show… and Unlock…: the hidden and the locked layers of the film, by name, each a click from coming back. Empty when
|
|
266
|
+
* there are none.
|
|
267
|
+
*/
|
|
268
|
+
export function stageRecoveryMenu(
|
|
269
|
+
doc: FilmDoc | null | undefined,
|
|
270
|
+
recover: (layer: RecoverableLayer, action: 'show' | 'unlock') => void,
|
|
271
|
+
t: T,
|
|
272
|
+
): readonly ContextMenuEntry[] {
|
|
273
|
+
const layers = recoverableLayers(doc);
|
|
274
|
+
return (['show', 'unlock'] as const).flatMap((action) => {
|
|
275
|
+
const affected = layers.filter((layer) => (action === 'show' ? layer.hidden : layer.locked));
|
|
276
|
+
return affected.length ? [{
|
|
277
|
+
id: `recover-${action}`,
|
|
278
|
+
label: `${t(`stageMenu.${action}`)}…`,
|
|
279
|
+
icon: action === 'show' ? <Eye size={14} /> : <Unlock size={14} />,
|
|
280
|
+
submenu: affected.map((layer, i) => ({ id: `${action}-${i}`, label: layer.label, onSelect: () => recover(layer, action) })),
|
|
281
|
+
}] : [];
|
|
282
|
+
});
|
|
283
|
+
}
|
package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/timeline-head-extras.tsx
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a track's head has beside lock, hide and mute: solo (hear this track alone, in Studio only) and the edge to
|
|
3
|
+
* drag it taller or shorter by (lib/track-heights).
|
|
4
|
+
*/
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
|
|
7
|
+
import { useT } from '@/i18n';
|
|
8
|
+
import { clampTrackHeight } from '@/lib/track-heights';
|
|
9
|
+
import { Tooltip } from './Tooltip';
|
|
10
|
+
|
|
11
|
+
/** Solo: an S, lit while the track is soloed; ⌥-click soloes it alone. */
|
|
12
|
+
export function SoloButton({ on, onToggle }: { on: boolean; onToggle: (only: boolean) => void }) {
|
|
13
|
+
const t = useT();
|
|
14
|
+
const label = on ? t('editorTools.unsolo') : t('editorTools.solo');
|
|
15
|
+
return (
|
|
16
|
+
<Tooltip label={label}>
|
|
17
|
+
<button
|
|
18
|
+
type="button"
|
|
19
|
+
tabIndex={-1}
|
|
20
|
+
aria-label={label}
|
|
21
|
+
aria-pressed={on}
|
|
22
|
+
data-track-solo={on ? '1' : '0'}
|
|
23
|
+
onPointerDown={(e) => {
|
|
24
|
+
/* no focus on press: Space plays (as the other head buttons) */
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
e.stopPropagation();
|
|
27
|
+
}}
|
|
28
|
+
onClick={(e) => {
|
|
29
|
+
e.stopPropagation();
|
|
30
|
+
e.currentTarget.blur();
|
|
31
|
+
onToggle(e.altKey);
|
|
32
|
+
}}
|
|
33
|
+
className="flex h-full w-full items-center justify-center rounded-[4px] outline-none transition-colors hover:bg-[var(--bg-hover)]"
|
|
34
|
+
>
|
|
35
|
+
<span
|
|
36
|
+
className="flex h-[14px] w-[14px] items-center justify-center rounded-[3px] text-[9.5px] font-bold leading-none"
|
|
37
|
+
style={on
|
|
38
|
+
? { background: '#e8c547', color: '#1b1b1b' }
|
|
39
|
+
: { color: 'var(--text-dim)', boxShadow: 'inset 0 0 0 1px currentColor' }}
|
|
40
|
+
>
|
|
41
|
+
S
|
|
42
|
+
</span>
|
|
43
|
+
</button>
|
|
44
|
+
</Tooltip>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The bottom edge of a track's head: dragged, the track gets taller or shorter (`onResize` as it goes, `done` at the
|
|
50
|
+
* end); double-clicked, it goes back to its own height (null).
|
|
51
|
+
*/
|
|
52
|
+
export function TrackResizeHandle({ height, onResize }: {
|
|
53
|
+
height: number;
|
|
54
|
+
onResize: (height: number | null, done: boolean) => void;
|
|
55
|
+
}) {
|
|
56
|
+
const t = useT();
|
|
57
|
+
const start = (e: React.PointerEvent) => {
|
|
58
|
+
if (e.button !== 0) return;
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
const y0 = e.clientY;
|
|
62
|
+
const el = e.currentTarget as HTMLElement;
|
|
63
|
+
el.setPointerCapture(e.pointerId);
|
|
64
|
+
let last = height;
|
|
65
|
+
const move = (ev: PointerEvent) => {
|
|
66
|
+
const next = clampTrackHeight(height + ev.clientY - y0);
|
|
67
|
+
if (next !== last) { last = next; onResize(next, false); }
|
|
68
|
+
};
|
|
69
|
+
const up = () => {
|
|
70
|
+
el.removeEventListener('pointermove', move);
|
|
71
|
+
el.removeEventListener('pointerup', up);
|
|
72
|
+
el.removeEventListener('pointercancel', up);
|
|
73
|
+
if (last !== height) onResize(last, true);
|
|
74
|
+
};
|
|
75
|
+
el.addEventListener('pointermove', move);
|
|
76
|
+
el.addEventListener('pointerup', up);
|
|
77
|
+
el.addEventListener('pointercancel', up);
|
|
78
|
+
};
|
|
79
|
+
return (
|
|
80
|
+
<div
|
|
81
|
+
role="separator"
|
|
82
|
+
aria-orientation="horizontal"
|
|
83
|
+
aria-label={t('editorTools.resizeTrack')}
|
|
84
|
+
title={t('editorTools.resizeTrack')}
|
|
85
|
+
data-track-resize=""
|
|
86
|
+
onPointerDown={start}
|
|
87
|
+
onDoubleClick={(e) => { e.stopPropagation(); onResize(null, true); }}
|
|
88
|
+
className="absolute inset-x-0 -bottom-[3px] z-10 h-[6px] cursor-row-resize touch-none"
|
|
89
|
+
/>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether focus is in a typing context: Space must not play and Cmd/Ctrl+Z must not undo the whole film.
|
|
3
|
+
*
|
|
4
|
+
* The keys pressed in an app's own panel inside Studio's page (lib/host.ts `panel`, marked `data-studio-host-panel`)
|
|
5
|
+
* are the app's: Studio's shortcuts leave them alone, as they do a text field's.
|
|
6
|
+
*
|
|
7
|
+
* In-place text editing on the stage uses `contenteditable="plaintext-only"` (see
|
|
8
|
+
* FilmStageSelect). Matching only `[contenteditable="true"]` would miss it, and Space would be
|
|
9
|
+
* eaten by the play shortcut. `isContentEditable` recognizes both.
|
|
10
|
+
*
|
|
11
|
+
* Avoids `instanceof HTMLElement`: a target from another document (a page inside the picture) has its own set of
|
|
12
|
+
* constructors, so a cross-document instanceof is always false.
|
|
13
|
+
*/
|
|
14
|
+
export function isTypingTarget(target: EventTarget | null): boolean {
|
|
15
|
+
const el = elementOf(target);
|
|
16
|
+
if (!el) return false;
|
|
17
|
+
if (inHostPanel(el)) return true;
|
|
18
|
+
const field = typeof el.closest === 'function' ? el.closest('input, textarea, select') : null;
|
|
19
|
+
if (field) {
|
|
20
|
+
/* A focused slider, color swatch or checkbox is not typing: after dragging a volume or
|
|
21
|
+
picking a color in the inspector, focus stays on that control. Treating it as typing would
|
|
22
|
+
disable Space, Cmd/Ctrl+Z and Delete until the user clicks elsewhere, which looks like a broken undo. */
|
|
23
|
+
const type = (field as HTMLInputElement).type;
|
|
24
|
+
if ((field as Element).tagName === 'INPUT' && typeof type === 'string' && NON_TEXT_INPUTS.has(type)) return false;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return Boolean(el.isContentEditable);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Whether an event happened in an app's own panel inside Studio's page (lib/host.ts `panel`): its keys and presses are
|
|
32
|
+
* the app's, and leave Studio as it was (what is selected stays selected, nothing plays).
|
|
33
|
+
*/
|
|
34
|
+
export function inHostPanel(target: EventTarget | null): boolean {
|
|
35
|
+
const el = elementOf(target);
|
|
36
|
+
return Boolean(el && typeof el.closest === 'function' && el.closest('[data-studio-host-panel]'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function elementOf(target: EventTarget | null): HTMLElement | null {
|
|
40
|
+
if (!target || !('nodeType' in target)) return null;
|
|
41
|
+
const node = target as Node;
|
|
42
|
+
return node.nodeType === 1 ? node as HTMLElement : node.nodeType === 3 ? node.parentElement : null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const NON_TEXT_INPUTS = new Set(['range', 'color', 'checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'image']);
|