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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The update in Studio's top bar, beside the projects button. The app's (lib/host.ts `update`): once a new version is
|
|
3
|
+
* downloaded, Restart to install it; refused while an agent works or Studio exports, it says why beside it and stays,
|
|
4
|
+
* ready; quitting installs it too. Studio run with npm (WebUpdateButton): a newer openfilm on npm is offered, and Update
|
|
5
|
+
* runs it in the background; Studio starts again on it and the page reloads.
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
8
|
+
import { CircleArrowDown, Loader2 } from 'lucide-react';
|
|
9
|
+
|
|
10
|
+
import { useT } from '@/i18n';
|
|
11
|
+
import { ApiError, api } from '../api';
|
|
12
|
+
import { studioHost, useHostUpdate } from '../lib/host';
|
|
13
|
+
import { refusedUpdate, webUpdateOf, type WebUpdate } from '../lib/web-update';
|
|
14
|
+
import { Tooltip } from './Tooltip';
|
|
15
|
+
|
|
16
|
+
const WAITING = { 'agent-busy': 'update.agentBusy', exporting: 'update.exporting', 'install-failed': 'update.installFailed' } as const;
|
|
17
|
+
|
|
18
|
+
export function UpdateButton() {
|
|
19
|
+
const t = useT();
|
|
20
|
+
const host = useHostUpdate();
|
|
21
|
+
if (!host) return null;
|
|
22
|
+
const { update, restart } = host;
|
|
23
|
+
const words = (key: string) => t(key).replace('{version}', update.version);
|
|
24
|
+
if (update.status === 'installing') {
|
|
25
|
+
return (
|
|
26
|
+
<span role="status" className="flex h-[26px] shrink-0 items-center gap-1.5 rounded-md px-2 text-[12px] text-[var(--text-dim)]">
|
|
27
|
+
<Loader2 size={13} className="animate-spin" />
|
|
28
|
+
{t('update.installing')}
|
|
29
|
+
</span>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
const waiting = update.waiting ? words(WAITING[update.waiting]) : null;
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
<Tooltip label={waiting ?? words('update.ready')} side="bottom">
|
|
36
|
+
<button type="button" onClick={() => void restart()}
|
|
37
|
+
className="flex h-[26px] shrink-0 items-center gap-1.5 rounded-md bg-[var(--accent-soft)] px-2 text-[12px] font-medium text-[var(--accent)] transition hover:brightness-110">
|
|
38
|
+
<CircleArrowDown size={14} />
|
|
39
|
+
{t('update.restart')}
|
|
40
|
+
</button>
|
|
41
|
+
</Tooltip>
|
|
42
|
+
{waiting ? <span role="status" className="min-w-0 truncate text-[12px] text-[var(--text-dim)]">{waiting}</span> : null}
|
|
43
|
+
</>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* looked at as the page opens and every few hours (Studio asks npm at most daily); while updating, every two seconds */
|
|
48
|
+
const LOOK_MS = 6 * 3_600_000;
|
|
49
|
+
const UPDATING_MS = 2000;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The newest openfilm for a Studio run with npm (none in the app, which updates itself, nor in a source checkout), and
|
|
53
|
+
* `start` to update to it. Shared by the top bar and Settings → About.
|
|
54
|
+
*/
|
|
55
|
+
export function useWebUpdate(): { update: WebUpdate | null; start: () => void } {
|
|
56
|
+
const [update, setUpdate] = useState<WebUpdate | null>(null);
|
|
57
|
+
const look = useCallback(() => { void api.version().then((v) => setUpdate(webUpdateOf(v))).catch(() => {}); }, []);
|
|
58
|
+
const updating = update?.status === 'updating';
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (studioHost) return undefined;
|
|
61
|
+
if (!updating) look();
|
|
62
|
+
const timer = setInterval(look, updating ? UPDATING_MS : LOOK_MS);
|
|
63
|
+
return () => clearInterval(timer);
|
|
64
|
+
}, [look, updating]);
|
|
65
|
+
const start = useCallback(() => {
|
|
66
|
+
if (!update || update.status === 'updating') return;
|
|
67
|
+
const { version } = update;
|
|
68
|
+
setUpdate({ status: 'updating', version });
|
|
69
|
+
void api.update().catch((e: unknown) => setUpdate(e instanceof ApiError
|
|
70
|
+
? refusedUpdate(version, e.body.code, e.message)
|
|
71
|
+
: { status: 'failed', version, error: e instanceof Error ? e.message : String(e) }));
|
|
72
|
+
}, [update]);
|
|
73
|
+
return { update, start };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Studio run with npm: Update when npm has a newer openfilm, its progress, or why it waits or failed. */
|
|
77
|
+
export function WebUpdateButton() {
|
|
78
|
+
const t = useT();
|
|
79
|
+
const { update, start } = useWebUpdate();
|
|
80
|
+
if (!update) return null;
|
|
81
|
+
const words = (key: string) => t(key).replace('{version}', update.version);
|
|
82
|
+
if (update.status === 'updating') {
|
|
83
|
+
return (
|
|
84
|
+
<span role="status" className="flex h-[26px] shrink-0 items-center gap-1.5 rounded-md px-2 text-[12px] text-[var(--text-dim)]">
|
|
85
|
+
<Loader2 size={13} className="animate-spin" />
|
|
86
|
+
{t('update.webUpdating')}
|
|
87
|
+
</span>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
const said = update.status === 'waiting' ? t(update.reason === 'exporting' ? 'update.webExporting' : 'update.webMaking')
|
|
91
|
+
: update.status === 'failed' ? t('update.webFailed').replace('{error}', update.error) : null;
|
|
92
|
+
return (
|
|
93
|
+
<>
|
|
94
|
+
<Tooltip label={said ?? words('update.webAvailable')} side="bottom">
|
|
95
|
+
<button type="button" onClick={start}
|
|
96
|
+
className="flex h-[26px] shrink-0 items-center gap-1.5 rounded-md bg-[var(--accent-soft)] px-2 text-[12px] font-medium text-[var(--accent)] transition hover:brightness-110">
|
|
97
|
+
<CircleArrowDown size={14} />
|
|
98
|
+
{t('update.webUpdate')}
|
|
99
|
+
</button>
|
|
100
|
+
</Tooltip>
|
|
101
|
+
{said ? <span role="status" className="min-w-0 truncate text-[12px] text-[var(--text-dim)]">{said}</span> : null}
|
|
102
|
+
</>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transport bar under the picture: the timecode on the left, play in the center, the playback settings and full
|
|
3
|
+
* screen on the right. As tall (32px) as the pane bar above the picture, so the picture sits evenly between two equal edges.
|
|
4
|
+
*/
|
|
5
|
+
import type React from 'react';
|
|
6
|
+
import { Expand, Pause, Play } from 'lucide-react';
|
|
7
|
+
import { useT } from '@/i18n';
|
|
8
|
+
import { formatTimecode, useTimecodeFps } from '@/lib/timecode';
|
|
9
|
+
import { PANE_BTN, PANE_ICON } from './dock-pane-bar';
|
|
10
|
+
import { LiveText, type PlaybackClock } from './LiveTime';
|
|
11
|
+
import { PlaybackMenu, type PlaybackSettings } from './PlaybackMenu';
|
|
12
|
+
import { Tooltip } from './Tooltip';
|
|
13
|
+
import { useKeyHint } from '@/lib/keymap-store';
|
|
14
|
+
|
|
15
|
+
/** The bar's buttons: the pane-bar size (22×22, icon 14) plus a keyboard focus ring (Tab must show where it is). */
|
|
16
|
+
const VIEW_BTN = `${PANE_BTN} outline-none focus-visible:ring-1 focus-visible:ring-[var(--accent)]`;
|
|
17
|
+
|
|
18
|
+
export function ViewerBar({
|
|
19
|
+
timeMs,
|
|
20
|
+
clock,
|
|
21
|
+
totalMs,
|
|
22
|
+
playing,
|
|
23
|
+
onPlayPause,
|
|
24
|
+
onFullscreen,
|
|
25
|
+
playback,
|
|
26
|
+
extra,
|
|
27
|
+
}: {
|
|
28
|
+
timeMs: number;
|
|
29
|
+
/** The time on the clock (playing, scrubbing): only the timecode follows it, the rest of the bar stays still. */
|
|
30
|
+
clock?: PlaybackClock | null;
|
|
31
|
+
totalMs: number;
|
|
32
|
+
playing: boolean;
|
|
33
|
+
onPlayPause: () => void;
|
|
34
|
+
/** Full screen; the button is disabled while the film has no length. */
|
|
35
|
+
onFullscreen?: () => void;
|
|
36
|
+
/** Loop and speed (see PlaybackMenu). Without it there is no settings button. */
|
|
37
|
+
playback?: PlaybackSettings | null;
|
|
38
|
+
/** Shown before the buttons on the right (the source viewer: the part marked). */
|
|
39
|
+
extra?: React.ReactNode;
|
|
40
|
+
}) {
|
|
41
|
+
const t = useT();
|
|
42
|
+
const keyHint = useKeyHint();
|
|
43
|
+
/* frames are counted at the project's rate: shown anew when it changes */
|
|
44
|
+
useTimecodeFps();
|
|
45
|
+
const playable = totalMs > 0;
|
|
46
|
+
const hours = totalMs >= 3_600_000;
|
|
47
|
+
|
|
48
|
+
/* `minmax(0,1fr)` rather than `1fr`: a 1fr column will not shrink below its content, and two full timecodes are 25
|
|
49
|
+
characters — a narrow pane would push the play button over the timecode. These columns shrink and clip. */
|
|
50
|
+
return (
|
|
51
|
+
<div className="grid h-8 shrink-0 grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-2 px-2">
|
|
52
|
+
{/* where we are is read constantly: body color, 12px; the length one step fainter. One line, never wrapped:
|
|
53
|
+
when it does not fit, the length is clipped first. No hour field for a film under an hour. */}
|
|
54
|
+
<span className="min-w-0 overflow-hidden text-ellipsis whitespace-nowrap text-[12px] tabular-nums text-[var(--text)]">
|
|
55
|
+
<LiveText clock={clock} timeMs={timeMs} format={(ms) => formatTimecode(ms, { hours })} />
|
|
56
|
+
<span className="text-[11px] text-[var(--text-faint)]">
|
|
57
|
+
{' / '}{formatTimecode(totalMs, { hours })}
|
|
58
|
+
</span>
|
|
59
|
+
</span>
|
|
60
|
+
<Tooltip label={playing ? t('viewer.pause') : t('viewer.play')} shortcut={keyHint('play-pause')}>
|
|
61
|
+
<button
|
|
62
|
+
type="button"
|
|
63
|
+
onClick={onPlayPause}
|
|
64
|
+
disabled={!playable}
|
|
65
|
+
/* no focus on click: the next Space would land on the button and draw a focus ring; Tab focus is kept */
|
|
66
|
+
onMouseDown={(e) => e.preventDefault()}
|
|
67
|
+
className={`${VIEW_BTN} disabled:pointer-events-none disabled:opacity-30`}
|
|
68
|
+
aria-label={playing ? t('viewer.pause') : t('viewer.play')}
|
|
69
|
+
>
|
|
70
|
+
{playing ? <Pause size={PANE_ICON} fill="currentColor" /> : <Play size={PANE_ICON} fill="currentColor" />}
|
|
71
|
+
</button>
|
|
72
|
+
</Tooltip>
|
|
73
|
+
<span className="flex items-center justify-end gap-1">
|
|
74
|
+
{extra}
|
|
75
|
+
{playback ? (
|
|
76
|
+
<PlaybackMenu
|
|
77
|
+
settings={playback}
|
|
78
|
+
disabled={!playable}
|
|
79
|
+
className={`${VIEW_BTN} !w-auto min-w-[22px] gap-1 px-1 disabled:pointer-events-none disabled:opacity-30`}
|
|
80
|
+
/>
|
|
81
|
+
) : null}
|
|
82
|
+
{onFullscreen ? (
|
|
83
|
+
<Tooltip label={t('viewer.fullscreen')}>
|
|
84
|
+
<button
|
|
85
|
+
type="button"
|
|
86
|
+
onClick={onFullscreen}
|
|
87
|
+
disabled={!playable}
|
|
88
|
+
className={`${VIEW_BTN} disabled:pointer-events-none disabled:opacity-30`}
|
|
89
|
+
aria-label={t('viewer.fullscreen')}
|
|
90
|
+
>
|
|
91
|
+
<Expand size={PANE_ICON} />
|
|
92
|
+
</button>
|
|
93
|
+
</Tooltip>
|
|
94
|
+
) : null}
|
|
95
|
+
</span>
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "What's new" after an update (lib/whats-new.ts): once Studio runs a newer version than the one whose notes were last
|
|
3
|
+
* shown, the notes since then, in the language shown, grouped as new, improved and fixed, with the full changelog a
|
|
4
|
+
* click away. Closing it marks this version seen. A new install shows nothing (it only remembers the version).
|
|
5
|
+
* Settings › About shows this release's notes again, and Developer previews the newest (WHATS_NEW_EVENT).
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { createPortal } from 'react-dom';
|
|
9
|
+
import { ArrowUpRight, Sparkles, Wrench, Zap, X } from 'lucide-react';
|
|
10
|
+
import { api } from '@/api';
|
|
11
|
+
import { useLanguage, useT } from '@/i18n';
|
|
12
|
+
import { RELEASES, WHATS_NEW_EVENT, compareVersions, notesToShow, releaseNotes, type NoteKind, type ReleaseNotes } from '@/lib/whats-new';
|
|
13
|
+
|
|
14
|
+
const CHANGELOG = 'https://github.com/openfilm/openfilm/releases';
|
|
15
|
+
const KINDS: readonly NoteKind[] = ['new', 'improved', 'fixed'];
|
|
16
|
+
const KIND_ICON: Record<NoteKind, React.ReactNode> = {
|
|
17
|
+
new: <Sparkles size={14} aria-hidden />,
|
|
18
|
+
improved: <Zap size={14} aria-hidden />,
|
|
19
|
+
fixed: <Wrench size={14} aria-hidden />,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function WhatsNew() {
|
|
23
|
+
const t = useT();
|
|
24
|
+
const language = useLanguage();
|
|
25
|
+
const [shown, setShown] = React.useState<ReleaseNotes[] | null>(null);
|
|
26
|
+
/** the version to mark seen when closed (after an update), null when opened on asking */
|
|
27
|
+
const [marking, setMarking] = React.useState<string | null>(null);
|
|
28
|
+
|
|
29
|
+
/* after an update: the notes since the version last shown; a new install only remembers its version */
|
|
30
|
+
React.useEffect(() => {
|
|
31
|
+
let live = true;
|
|
32
|
+
void Promise.all([api.version(), api.prefs()]).then(([v, prefs]) => {
|
|
33
|
+
if (!live) return;
|
|
34
|
+
const current = v.version;
|
|
35
|
+
if (!prefs.seenVersion) { void api.setPrefs({ seenVersion: current }).catch(() => {}); return; }
|
|
36
|
+
if (compareVersions(prefs.seenVersion, current) >= 0) return;
|
|
37
|
+
const list = notesToShow(prefs.seenVersion, current);
|
|
38
|
+
if (list.length) { setShown(list); setMarking(current); } else void api.setPrefs({ seenVersion: current }).catch(() => {});
|
|
39
|
+
}).catch(() => {});
|
|
40
|
+
return () => { live = false; };
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
/* asked for (Settings › About, Developer): those versions' notes */
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
const onAsk = (event: Event) => {
|
|
46
|
+
const versions = (event as CustomEvent<string[]>).detail ?? [];
|
|
47
|
+
const list = versions.map((v) => releaseNotes(v)).filter((r): r is ReleaseNotes => r !== null);
|
|
48
|
+
if (list.length) setShown(list);
|
|
49
|
+
};
|
|
50
|
+
window.addEventListener(WHATS_NEW_EVENT, onAsk);
|
|
51
|
+
return () => window.removeEventListener(WHATS_NEW_EVENT, onAsk);
|
|
52
|
+
}, []);
|
|
53
|
+
|
|
54
|
+
const close = React.useCallback(() => {
|
|
55
|
+
if (marking) void api.setPrefs({ seenVersion: marking }).catch(() => {});
|
|
56
|
+
setMarking(null);
|
|
57
|
+
setShown(null);
|
|
58
|
+
}, [marking]);
|
|
59
|
+
|
|
60
|
+
React.useEffect(() => {
|
|
61
|
+
if (!shown) return undefined;
|
|
62
|
+
/* Escape closes this alone: Settings, under it, leaves a key already handled */
|
|
63
|
+
const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { e.preventDefault(); e.stopPropagation(); close(); } };
|
|
64
|
+
window.addEventListener('keydown', onKey, true);
|
|
65
|
+
return () => window.removeEventListener('keydown', onKey, true);
|
|
66
|
+
}, [shown, close]);
|
|
67
|
+
|
|
68
|
+
if (!shown || typeof document === 'undefined') return null;
|
|
69
|
+
const newest = shown[0];
|
|
70
|
+
const date = (iso: string) => {
|
|
71
|
+
const d = new Date(`${iso}T12:00:00`);
|
|
72
|
+
return Number.isNaN(d.getTime()) ? iso : d.toLocaleDateString(language, { year: 'numeric', month: 'long', day: 'numeric' });
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return createPortal(
|
|
76
|
+
/* over Settings (z 10050), where About and Developer open it */
|
|
77
|
+
<div className="fixed inset-0 z-[10100] flex items-center justify-center bg-black/45 p-4 backdrop-blur-[2px]" onClick={close}>
|
|
78
|
+
<div
|
|
79
|
+
role="dialog"
|
|
80
|
+
aria-modal="true"
|
|
81
|
+
aria-labelledby="whats-new-title"
|
|
82
|
+
onClick={(e) => e.stopPropagation()}
|
|
83
|
+
className="flex max-h-[min(640px,88vh)] w-full max-w-[520px] flex-col overflow-hidden rounded-2xl border border-[var(--border)] bg-[var(--surface)] shadow-[var(--shadow-lg)]"
|
|
84
|
+
>
|
|
85
|
+
<div className="flex items-start gap-3 px-6 pb-2 pt-6">
|
|
86
|
+
<div className="min-w-0 flex-1">
|
|
87
|
+
<p className="text-[12px] font-medium uppercase tracking-[0.08em] text-[var(--text-faint)]">{t('whatsNew.eyebrow')}</p>
|
|
88
|
+
<h2 id="whats-new-title" className="mt-1 text-[20px] font-semibold text-[var(--text)]">
|
|
89
|
+
{t('whatsNew.title').replace('{version}', newest.version)}
|
|
90
|
+
</h2>
|
|
91
|
+
</div>
|
|
92
|
+
<button type="button" onClick={close} aria-label={t('whatsNew.close')}
|
|
93
|
+
className="-mr-2 -mt-1 rounded-lg p-1.5 text-[var(--text-faint)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text)]">
|
|
94
|
+
<X size={16} />
|
|
95
|
+
</button>
|
|
96
|
+
</div>
|
|
97
|
+
<div className="min-h-0 flex-1 overflow-y-auto px-6 pb-2">
|
|
98
|
+
{shown.map((release) => {
|
|
99
|
+
const notes = release.notes[language] ?? release.notes.en;
|
|
100
|
+
return (
|
|
101
|
+
<section key={release.version} className="py-3">
|
|
102
|
+
<p className="mb-2.5 text-[12.5px] text-[var(--text-muted)]">
|
|
103
|
+
{shown.length > 1 ? `OpenFilm ${release.version} · ` : ''}{date(release.date)}
|
|
104
|
+
</p>
|
|
105
|
+
<div className="flex flex-col gap-3.5">
|
|
106
|
+
{KINDS.map((kind) => {
|
|
107
|
+
const items = notes.filter((n) => n.kind === kind);
|
|
108
|
+
if (!items.length) return null;
|
|
109
|
+
return (
|
|
110
|
+
<div key={kind}>
|
|
111
|
+
<p className="mb-1.5 flex items-center gap-1.5 text-[12.5px] font-semibold text-[var(--text)]">
|
|
112
|
+
<span className="text-[var(--text-muted)]">{KIND_ICON[kind]}</span>
|
|
113
|
+
{t(`whatsNew.kind.${kind}`)}
|
|
114
|
+
</p>
|
|
115
|
+
<ul className="flex flex-col gap-1.5 pl-5">
|
|
116
|
+
{items.map((n, i) => (
|
|
117
|
+
<li key={i} className="list-disc text-[13.5px] leading-[1.6] text-[var(--text-muted)] marker:text-[var(--text-faint)]">{n.text}</li>
|
|
118
|
+
))}
|
|
119
|
+
</ul>
|
|
120
|
+
</div>
|
|
121
|
+
);
|
|
122
|
+
})}
|
|
123
|
+
</div>
|
|
124
|
+
</section>
|
|
125
|
+
);
|
|
126
|
+
})}
|
|
127
|
+
</div>
|
|
128
|
+
<div className="flex items-center gap-3 border-t border-[var(--border)] px-6 py-4">
|
|
129
|
+
<a href={CHANGELOG} target="_blank" rel="noreferrer"
|
|
130
|
+
className="inline-flex items-center gap-1 text-[13px] text-[var(--text-muted)] transition hover:text-[var(--text)]">
|
|
131
|
+
{t('whatsNew.changelog')}<ArrowUpRight size={14} aria-hidden />
|
|
132
|
+
</a>
|
|
133
|
+
<button type="button" onClick={close} autoFocus
|
|
134
|
+
className="ml-auto inline-flex h-9 items-center justify-center rounded-[8px] bg-[var(--text)] px-5 text-[14px] font-medium text-[var(--bg)] transition hover:opacity-90">
|
|
135
|
+
{t('whatsNew.ok')}
|
|
136
|
+
</button>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</div>,
|
|
140
|
+
document.body,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Whether this release has notes to show again (Settings › About). */
|
|
145
|
+
export const hasNotes = (version: string | undefined) => Boolean(version && releaseNotes(version));
|
|
146
|
+
/** The newest release's notes, for a preview before it ships (Developer). */
|
|
147
|
+
export const newestVersion = () => RELEASES[0]?.version ?? null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared styling for the bar at the top of each of the workspace's three panes; the side
|
|
3
|
+
* pane's bar is the original, and the viewer and inspector bars follow it.
|
|
4
|
+
*
|
|
5
|
+
* If any one pane changes its font size, colors, button box or spacing, the three bars stop
|
|
6
|
+
* lining up, so the styles live in one place.
|
|
7
|
+
*/
|
|
8
|
+
export const PANE_BAR = 'flex h-8 shrink-0 items-center gap-1 px-1.5';
|
|
9
|
+
export const PANE_TITLE = 'min-w-0 truncate text-[12px] font-medium text-[var(--text-muted)]';
|
|
10
|
+
export const PANE_BTN =
|
|
11
|
+
'flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-md text-[var(--text-dim)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text)]';
|
|
12
|
+
export const PANE_BTN_ON = 'bg-[var(--bg-hover)] text-[var(--text)]';
|
|
13
|
+
export const PANE_ICON = 14;
|
|
14
|
+
/** The viewer's two panel switches (assets, inspector): the buttons a person reaches for most, one size up. */
|
|
15
|
+
export const PANE_TOGGLE = PANE_BTN.replace('h-[22px] w-[22px]', 'h-7 w-7');
|
|
16
|
+
export const PANE_TOGGLE_ICON = 16;
|