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.
Files changed (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -2
  3. package/bin/install.mjs +66 -0
  4. package/package.json +29 -4
  5. package/skill/SKILL.md +64 -0
  6. package/skill/agents/openai.yaml +4 -0
  7. package/skill/assets/examples/ApprovalCard.tsx +8 -0
  8. package/skill/assets/examples/BasicApp.tsx +38 -0
  9. package/skill/assets/examples/BriefingCard.tsx +8 -0
  10. package/skill/assets/examples/ChatControls.tsx +49 -0
  11. package/skill/assets/examples/ChatPanel.tsx +73 -0
  12. package/skill/assets/examples/Checkbox.tsx +13 -0
  13. package/skill/assets/examples/Combobox.tsx +14 -0
  14. package/skill/assets/examples/Drawer.tsx +10 -0
  15. package/skill/assets/examples/MemoryCard.tsx +9 -0
  16. package/skill/assets/examples/MessageList.tsx +8 -0
  17. package/skill/assets/examples/Theme.tsx +14 -0
  18. package/skill/assets/examples/ToolCall.tsx +8 -0
  19. package/skill/assets/examples/Tree.tsx +15 -0
  20. package/skill/assets/examples/examples.css +11 -0
  21. package/skill/assets/library/auricui-0.1.0-preview.1.tgz +0 -0
  22. package/skill/assets/library/auricui-0.1.0-preview.3.tgz +0 -0
  23. package/skill/assets/library/auricui-0.1.0-preview.4.tgz +0 -0
  24. package/skill/assets/upstream/LICENSE +21 -0
  25. package/skill/assets/upstream/apps/desktop/chat/src/App.tsx +1099 -0
  26. package/skill/assets/upstream/apps/desktop/chat/src/app-bridge.ts +154 -0
  27. package/skill/assets/upstream/apps/desktop/chat/src/chat.css +1812 -0
  28. package/skill/assets/upstream/apps/desktop/chat/src/components/AddSkill.tsx +223 -0
  29. package/skill/assets/upstream/apps/desktop/chat/src/components/AgentActivityRow.tsx +716 -0
  30. package/skill/assets/upstream/apps/desktop/chat/src/components/AgentIcons.tsx +46 -0
  31. package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentCard.tsx +34 -0
  32. package/skill/assets/upstream/apps/desktop/chat/src/components/AttachmentPreview.tsx +331 -0
  33. package/skill/assets/upstream/apps/desktop/chat/src/components/BalanceNotice.tsx +22 -0
  34. package/skill/assets/upstream/apps/desktop/chat/src/components/BrandLogo.tsx +35 -0
  35. package/skill/assets/upstream/apps/desktop/chat/src/components/ComposerCard.tsx +182 -0
  36. package/skill/assets/upstream/apps/desktop/chat/src/components/ConversationSessionBar.tsx +292 -0
  37. package/skill/assets/upstream/apps/desktop/chat/src/components/CopyDiagnostics.tsx +24 -0
  38. package/skill/assets/upstream/apps/desktop/chat/src/components/Divider.tsx +47 -0
  39. package/skill/assets/upstream/apps/desktop/chat/src/components/FileChangesList.tsx +119 -0
  40. package/skill/assets/upstream/apps/desktop/chat/src/components/Markdown.tsx +198 -0
  41. package/skill/assets/upstream/apps/desktop/chat/src/components/ModelPopover.tsx +280 -0
  42. package/skill/assets/upstream/apps/desktop/chat/src/components/NoticeCard.tsx +87 -0
  43. package/skill/assets/upstream/apps/desktop/chat/src/components/Popover.tsx +195 -0
  44. package/skill/assets/upstream/apps/desktop/chat/src/components/PreviewFrame.tsx +129 -0
  45. package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectConversation.tsx +852 -0
  46. package/skill/assets/upstream/apps/desktop/chat/src/components/ProjectStarters.tsx +118 -0
  47. package/skill/assets/upstream/apps/desktop/chat/src/components/Tooltip.tsx +191 -0
  48. package/skill/assets/upstream/apps/desktop/chat/src/components/TurnLog.tsx +583 -0
  49. package/skill/assets/upstream/apps/desktop/chat/src/components/TurnQuestionCard.tsx +133 -0
  50. package/skill/assets/upstream/apps/desktop/chat/src/components/dock-pane-bar.ts +14 -0
  51. package/skill/assets/upstream/apps/desktop/chat/src/components/project-version.ts +37 -0
  52. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/MentionMenuPlugin.tsx +372 -0
  53. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptEditor.tsx +476 -0
  54. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptPill.tsx +399 -0
  55. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/PromptReferenceNode.tsx +164 -0
  56. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/index.ts +31 -0
  57. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/mention-menu.ts +206 -0
  58. package/skill/assets/upstream/apps/desktop/chat/src/components/prompt-editor/prompt-text.ts +171 -0
  59. package/skill/assets/upstream/apps/desktop/chat/src/components/useStickToBottom.ts +320 -0
  60. package/skill/assets/upstream/apps/desktop/chat/src/components/useTicker.ts +55 -0
  61. package/skill/assets/upstream/apps/desktop/chat/src/i18n/index.ts +42 -0
  62. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/en-US.ts +408 -0
  63. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/es.ts +407 -0
  64. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ja.ts +407 -0
  65. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/ko.ts +403 -0
  66. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/words.ts +6 -0
  67. package/skill/assets/upstream/apps/desktop/chat/src/i18n/locales/zh-CN.ts +407 -0
  68. package/skill/assets/upstream/apps/desktop/chat/src/i18n/lookup.ts +12 -0
  69. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-activity-runs.ts +154 -0
  70. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-menu-rows.ts +41 -0
  71. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-refs.ts +105 -0
  72. package/skill/assets/upstream/apps/desktop/chat/src/lib/agent-transcript.ts +440 -0
  73. package/skill/assets/upstream/apps/desktop/chat/src/lib/asset-lists.ts +75 -0
  74. package/skill/assets/upstream/apps/desktop/chat/src/lib/attachment-place.ts +17 -0
  75. package/skill/assets/upstream/apps/desktop/chat/src/lib/balance.ts +16 -0
  76. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-layer.ts +10 -0
  77. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-menu.ts +18 -0
  78. package/skill/assets/upstream/apps/desktop/chat/src/lib/chat-store.ts +101 -0
  79. package/skill/assets/upstream/apps/desktop/chat/src/lib/composer-attachments.ts +189 -0
  80. package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-attachments.ts +178 -0
  81. package/skill/assets/upstream/apps/desktop/chat/src/lib/desktop-bridge.ts +291 -0
  82. package/skill/assets/upstream/apps/desktop/chat/src/lib/developer.ts +39 -0
  83. package/skill/assets/upstream/apps/desktop/chat/src/lib/esc-stop.ts +23 -0
  84. package/skill/assets/upstream/apps/desktop/chat/src/lib/file-changes.ts +32 -0
  85. package/skill/assets/upstream/apps/desktop/chat/src/lib/live-activity.ts +20 -0
  86. package/skill/assets/upstream/apps/desktop/chat/src/lib/local-agent-run.ts +1174 -0
  87. package/skill/assets/upstream/apps/desktop/chat/src/lib/local-sessions.ts +25 -0
  88. package/skill/assets/upstream/apps/desktop/chat/src/lib/model-calls.ts +87 -0
  89. package/skill/assets/upstream/apps/desktop/chat/src/lib/pretty-json.ts +12 -0
  90. package/skill/assets/upstream/apps/desktop/chat/src/lib/preview-top.ts +15 -0
  91. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-resources.ts +66 -0
  92. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-sessions.ts +66 -0
  93. package/skill/assets/upstream/apps/desktop/chat/src/lib/project-versions.ts +116 -0
  94. package/skill/assets/upstream/apps/desktop/chat/src/lib/ref-pictures.ts +119 -0
  95. package/skill/assets/upstream/apps/desktop/chat/src/lib/relative-time.ts +46 -0
  96. package/skill/assets/upstream/apps/desktop/chat/src/lib/skill-pages.ts +29 -0
  97. package/skill/assets/upstream/apps/desktop/chat/src/lib/step-file.ts +23 -0
  98. package/skill/assets/upstream/apps/desktop/chat/src/lib/structural-share.ts +52 -0
  99. package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-film.ts +44 -0
  100. package/skill/assets/upstream/apps/desktop/chat/src/lib/studio-transfer.ts +40 -0
  101. package/skill/assets/upstream/apps/desktop/chat/src/lib/unprompted.ts +27 -0
  102. package/skill/assets/upstream/apps/desktop/chat/src/lib/upload-limits.ts +53 -0
  103. package/skill/assets/upstream/apps/desktop/chat/src/mount.tsx +19 -0
  104. package/skill/assets/upstream/apps/desktop/chat/src/state/local-agent-store.ts +296 -0
  105. package/skill/assets/upstream/apps/desktop/chat/src/studio-refs.ts +307 -0
  106. package/skill/assets/upstream/apps/desktop/package.json +51 -0
  107. package/skill/assets/upstream/apps/desktop/shell/bridge.ts +415 -0
  108. package/skill/assets/upstream/apps/desktop/shell/index.html +27 -0
  109. package/skill/assets/upstream/apps/desktop/shell/main.tsx +17 -0
  110. package/skill/assets/upstream/apps/desktop/shell/shell.css +17 -0
  111. package/skill/assets/upstream/apps/desktop/shell/vite.config.ts +65 -0
  112. package/skill/assets/upstream/apps/desktop/src/agent-definitions.mjs +31 -0
  113. package/skill/assets/upstream/packages/openfilm/LICENSE +21 -0
  114. package/skill/assets/upstream/packages/openfilm/package.json +88 -0
  115. package/skill/assets/upstream/packages/openfilm/src/film-doc.d.mts +125 -0
  116. package/skill/assets/upstream/packages/openfilm/src/film-doc.mjs +986 -0
  117. package/skill/assets/upstream/packages/openfilm/src/overrides.mjs +73 -0
  118. package/skill/assets/upstream/packages/openfilm/src/timeline.mjs +1280 -0
  119. package/skill/assets/upstream/packages/openfilm/studio/server/bridge.js +209 -0
  120. package/skill/assets/upstream/packages/openfilm/studio/server/film-subtitle.mjs +785 -0
  121. package/skill/assets/upstream/packages/openfilm/studio/server/ops.mjs +403 -0
  122. package/skill/assets/upstream/packages/openfilm/studio/server/stage.js +1649 -0
  123. package/skill/assets/upstream/packages/openfilm/studio/server/track-layout.mjs +43 -0
  124. package/skill/assets/upstream/packages/openfilm/studio/ui/src/App.tsx +156 -0
  125. package/skill/assets/upstream/packages/openfilm/studio/ui/src/api.ts +328 -0
  126. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/AudioMeters.tsx +188 -0
  127. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockThumbs.tsx +84 -0
  128. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BlockWaveform.tsx +201 -0
  129. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLoadingScreen.tsx +56 -0
  130. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/BrandLogo.tsx +25 -0
  131. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Card.tsx +89 -0
  132. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ColorPicker.tsx +204 -0
  133. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ConfirmDialog.tsx +96 -0
  134. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ContextMenu.tsx +422 -0
  135. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/DesktopDialog.tsx +271 -0
  136. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ExamplesGallery.tsx +372 -0
  137. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmFullscreenBar.tsx +147 -0
  138. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmInspector.tsx +2310 -0
  139. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FilmStageSelect.tsx +3296 -0
  140. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FocusNav.tsx +28 -0
  141. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FontFamilyPicker.tsx +293 -0
  142. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/FramePicker.tsx +69 -0
  143. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/InspectorPanel.tsx +25 -0
  144. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Launcher.tsx +38 -0
  145. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LayersPanel.tsx +277 -0
  146. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/LiveTime.tsx +101 -0
  147. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPool.tsx +1413 -0
  148. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MediaPreview.tsx +188 -0
  149. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MenuSelect.tsx +161 -0
  150. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/MgOutline.tsx +24 -0
  151. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/OperationHistory.tsx +184 -0
  152. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PaneDivider.tsx +292 -0
  153. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PasteAttrsDialog.tsx +69 -0
  154. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PlaybackMenu.tsx +110 -0
  155. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Popover.tsx +159 -0
  156. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectCover.tsx +60 -0
  157. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectHistoryControls.tsx +748 -0
  158. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectLayoutMenu.tsx +82 -0
  159. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectMenu.tsx +111 -0
  160. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectSources.tsx +587 -0
  161. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectView.tsx +3222 -0
  162. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsLibrary.tsx +567 -0
  163. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ProjectsView.tsx +1593 -0
  164. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/PropertiesSection.tsx +418 -0
  165. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ResourceInspector.tsx +100 -0
  166. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SelectionToolbar.tsx +157 -0
  167. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SkillsLibrary.tsx +504 -0
  168. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SourcePreview.tsx +464 -0
  169. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SpendAsks.tsx +88 -0
  170. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageMaskOverlay.tsx +299 -0
  171. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/StageTransformFrame.tsx +246 -0
  172. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.module.css +46 -0
  173. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleInspector.tsx +884 -0
  174. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleOverlay.tsx +148 -0
  175. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/SubtitleRow.tsx +419 -0
  176. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TabStrip.tsx +188 -0
  177. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Timeline.tsx +4911 -0
  178. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/TimelineMarkers.tsx +329 -0
  179. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Toast.tsx +55 -0
  180. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/Tooltip.tsx +193 -0
  181. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/UpdateButton.tsx +104 -0
  182. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/ViewerBar.tsx +98 -0
  183. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/WhatsNew.tsx +147 -0
  184. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/dock-pane-bar.ts +16 -0
  185. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportCenter.tsx +1502 -0
  186. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/export/ExportTray.tsx +284 -0
  187. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/film-stage-hit.ts +18 -0
  188. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-fields.tsx +863 -0
  189. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/inspector-look.tsx +1357 -0
  190. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/controls-bar.tsx +397 -0
  191. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/player-controls/transport.tsx +294 -0
  192. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/replace-drop.ts +20 -0
  193. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/AgentsSection.tsx +613 -0
  194. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/CustomServices.tsx +104 -0
  195. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/DiagnosticsGroup.tsx +202 -0
  196. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ModelsSection.tsx +179 -0
  197. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProviderMark.tsx +24 -0
  198. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ProvidersSection.tsx +177 -0
  199. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsModal.tsx +511 -0
  200. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/SettingsSelect.tsx +84 -0
  201. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ShortcutsSection.tsx +291 -0
  202. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/StorageGroup.tsx +119 -0
  203. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/theme.ts +47 -0
  204. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/ui.tsx +139 -0
  205. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/settings/use-settings.ts +10 -0
  206. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/stage-menu.tsx +283 -0
  207. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/timeline-head-extras.tsx +91 -0
  208. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/typing-target.ts +45 -0
  209. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-editor-tools.tsx +408 -0
  210. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-page-changes.ts +48 -0
  211. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/use-project-history.ts +113 -0
  212. package/skill/assets/upstream/packages/openfilm/studio/ui/src/components/useBlockDrag.ts +639 -0
  213. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/Preview.tsx +426 -0
  214. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/player.ts +558 -0
  215. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/preview-frames.ts +36 -0
  216. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/steps.ts +36 -0
  217. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/undo.ts +156 -0
  218. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-film.ts +212 -0
  219. package/skill/assets/upstream/packages/openfilm/studio/ui/src/editor/use-preview-renders.ts +89 -0
  220. package/skill/assets/upstream/packages/openfilm/studio/ui/src/globals.css +559 -0
  221. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/en.ts +1901 -0
  222. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/es.ts +1900 -0
  223. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/index.ts +130 -0
  224. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ja.ts +1900 -0
  225. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/ko.ts +1896 -0
  226. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/words.ts +6 -0
  227. package/skill/assets/upstream/packages/openfilm/studio/ui/src/i18n/zh-CN.ts +1901 -0
  228. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/agent-row.ts +21 -0
  229. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/asset-timeline.ts +469 -0
  230. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/audio-levels.ts +60 -0
  231. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/batch-map.ts +28 -0
  232. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/browser.ts +10 -0
  233. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/canvas-fit.ts +116 -0
  234. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/chat-marks.ts +114 -0
  235. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-attrs.ts +102 -0
  236. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-fade.ts +70 -0
  237. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-look.ts +520 -0
  238. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-mask.ts +536 -0
  239. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/clip-replace.ts +60 -0
  240. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/component-props.ts +128 -0
  241. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/context-length.ts +12 -0
  242. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/desktop-build.ts +44 -0
  243. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/diagnostics.ts +68 -0
  244. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/double-press.ts +22 -0
  245. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/dropped-overrides.ts +139 -0
  246. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-jobs.ts +191 -0
  247. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/export-spec.ts +261 -0
  248. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/field-input.ts +155 -0
  249. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-clip-edits.ts +82 -0
  250. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-frame.ts +134 -0
  251. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-overrides.ts +107 -0
  252. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film-shape.ts +172 -0
  253. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/film.ts +80 -0
  254. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-menu.ts +236 -0
  255. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/font-styles.ts +129 -0
  256. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/freeze-frame.ts +49 -0
  257. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/host.ts +438 -0
  258. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/inspect-scrub.ts +26 -0
  259. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap-store.ts +74 -0
  260. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/keymap.ts +529 -0
  261. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/layers-tree.ts +133 -0
  262. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/look.ts +83 -0
  263. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/loudness.ts +58 -0
  264. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/markers.ts +152 -0
  265. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-bar.ts +58 -0
  266. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-folders.ts +45 -0
  267. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-place.ts +102 -0
  268. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-queue.ts +107 -0
  269. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/media-selection.ts +64 -0
  270. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/menu-position.ts +77 -0
  271. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mg-transform.ts +111 -0
  272. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/mixed.ts +3 -0
  273. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/page-changes.ts +45 -0
  274. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/picture-files.ts +19 -0
  275. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-prefs.ts +46 -0
  276. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/preview-renders.ts +71 -0
  277. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-delete.ts +20 -0
  278. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-folders.ts +144 -0
  279. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-history.ts +188 -0
  280. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/project-sources.ts +283 -0
  281. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/projects-page.ts +40 -0
  282. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/provider-marks.ts +35 -0
  283. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/providers.ts +163 -0
  284. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/resource-drag.ts +131 -0
  285. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/retry-image.ts +17 -0
  286. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved-insert.ts +40 -0
  287. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/saved.ts +125 -0
  288. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/selection-toolbar.ts +158 -0
  289. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/shortcut-hint.ts +21 -0
  290. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/similar-layers.ts +46 -0
  291. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/solo.ts +19 -0
  292. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-clip.ts +60 -0
  293. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-crop.ts +232 -0
  294. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-gesture.ts +277 -0
  295. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-layers.ts +71 -0
  296. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-mask.ts +176 -0
  297. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-measure.ts +53 -0
  298. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/stage-types.ts +155 -0
  299. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-refs.ts +248 -0
  300. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/studio-version.ts +41 -0
  301. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitle-cues.ts +238 -0
  302. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/subtitles.ts +263 -0
  303. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/tab-menu.ts +6 -0
  304. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/template-controls.ts +131 -0
  305. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/theme-changes.ts +31 -0
  306. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cache.ts +63 -0
  307. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-cell.ts +8 -0
  308. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-frame.ts +76 -0
  309. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/thumb-pick.ts +42 -0
  310. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timecode.ts +161 -0
  311. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-clipboard.ts +279 -0
  312. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-drag.ts +589 -0
  313. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-edit.ts +1138 -0
  314. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-keys.ts +63 -0
  315. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-layout.ts +1038 -0
  316. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-nav.ts +160 -0
  317. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-prefs.ts +73 -0
  318. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-split.ts +40 -0
  319. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/timeline-view.ts +105 -0
  320. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/title.ts +39 -0
  321. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-heights.ts +55 -0
  322. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/track-lock.ts +27 -0
  323. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/transitions.ts +459 -0
  324. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/type-metrics.ts +83 -0
  325. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-film-subtitles.ts +111 -0
  326. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-fonts.ts +181 -0
  327. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-loaded-thumbs.ts +91 -0
  328. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-edits.ts +134 -0
  329. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-font.ts +51 -0
  330. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/use-subtitle-style.ts +68 -0
  331. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/waveform-columns.ts +48 -0
  332. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/web-update.ts +41 -0
  333. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/whats-new.ts +401 -0
  334. package/skill/assets/upstream/packages/openfilm/studio/ui/src/lib/workspace-resources.ts +373 -0
  335. package/skill/assets/upstream/packages/openfilm/studio/ui/src/main.tsx +10 -0
  336. package/skill/assets/upstream/packages/openfilm/studio/ui/vite.config.ts +12 -0
  337. package/skill/assets/upstream/packages/shared/package.json +45 -0
  338. package/skill/assets/upstream/packages/shared/src/agent-activity.ts +263 -0
  339. package/skill/assets/upstream/packages/shared/src/contract.ts +285 -0
  340. package/skill/assets/upstream/packages/shared/src/index.ts +17 -0
  341. package/skill/assets/upstream/packages/shared/src/markdown-blocks.ts +252 -0
  342. package/skill/assets/upstream/packages/shared/src/modality.ts +4 -0
  343. package/skill/assets/upstream/packages/shared/src/prompt-reference.ts +113 -0
  344. package/skill/assets/upstream/packages/shared/src/title.ts +76 -0
  345. package/skill/assets/upstream/packages/shared/src/turn.ts +68 -0
  346. package/skill/assets/upstream/packages/shared/src/video.ts +26 -0
  347. package/skill/references/agent-components.md +33 -0
  348. package/skill/references/api-index.json +2693 -0
  349. package/skill/references/chat-components.md +65 -0
  350. package/skill/references/components.md +23 -0
  351. package/skill/references/core-components.md +44 -0
  352. package/skill/references/dependencies.md +22 -0
  353. package/skill/references/esm-package.md +48 -0
  354. package/skill/references/integration.md +43 -0
  355. package/skill/references/library-manifest.json +12 -0
  356. package/skill/references/source-manifest.json +325 -0
  357. package/skill/references/studio-components.md +24 -0
  358. package/skill/references/theme-motion.md +49 -0
  359. package/skill/references/troubleshooting.md +27 -0
  360. package/skill/references/verification.md +13 -0
  361. package/skill/scripts/check_dependencies.py +109 -0
  362. package/skill/scripts/inspect_api.py +60 -0
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * Records whether the last focus change came from Tab or from a pointer.
5
+ *
6
+ * The `:focus-visible` heuristic treats any key press as keyboard use, so pressing Space
7
+ * (play) would draw a focus ring on a button that was just clicked. Tracking the source
8
+ * ourselves lets CSS draw the ring only after a real Tab.
9
+ */
10
+ export function FocusNav() {
11
+ React.useEffect(() => {
12
+ const root = document.documentElement;
13
+ root.setAttribute('data-focus-nav', 'pointer');
14
+ const onKey = (event: KeyboardEvent): void => {
15
+ if (event.key === 'Tab') root.setAttribute('data-focus-nav', 'tab');
16
+ };
17
+ const onPointer = (): void => {
18
+ root.setAttribute('data-focus-nav', 'pointer');
19
+ };
20
+ window.addEventListener('keydown', onKey, true);
21
+ window.addEventListener('pointerdown', onPointer, true);
22
+ return () => {
23
+ window.removeEventListener('keydown', onKey, true);
24
+ window.removeEventListener('pointerdown', onPointer, true);
25
+ };
26
+ }, []);
27
+ return null;
28
+ }
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Picking a font in the inspector.
3
+ *
4
+ * The menu has "In this project" first (the families the project's pages declare with @font-face, and the ones the
5
+ * page in hand names), then the recent picks, then every font installed here by script — the CJK groups first when
6
+ * the layer's text is CJK. **Each row is set in its own face** (a project font through its own files), a CJK font
7
+ * whose name is in Latin letters with a small sample of its script beside it.
8
+ *
9
+ * Hovering a row or moving through the rows with ↑/↓ shows that family on the picture; Esc, a click elsewhere or
10
+ * closing without a pick takes it back; Enter or a click keeps it (one change). Typing filters by name and alias and
11
+ * highlights the best match; ↑/↓/Enter work from the search box. A name in no list can still be typed and picked.
12
+ *
13
+ * A family the page cannot draw (not installed, not declared for the page) shows in the field with a warning.
14
+ */
15
+ import React from 'react';
16
+ import { createPortal } from 'react-dom';
17
+ import { AlertTriangle, Check, ChevronDown } from 'lucide-react';
18
+
19
+ import { useT } from '@/i18n';
20
+ import { CJK_TEXT, fontMenu, knownAvailable, rowFontFamily, sampleOf, type FontRow, type SectionId } from '@/lib/font-menu';
21
+ import { familyRenders, readRecentFonts, rememberRecentFont, useInstalledFonts, useProjectFonts } from '@/lib/use-fonts';
22
+ import { Tooltip } from './Tooltip';
23
+
24
+ const SECTION_LABEL: Record<SectionId, string> = {
25
+ project: 'inspector.fontGroupProject',
26
+ recent: 'inspector.fontGroupRecent',
27
+ 'zh-CN': 'inspector.fontGroupZh',
28
+ 'ja-JP': 'inspector.fontGroupJa',
29
+ 'ko-KR': 'inspector.fontGroupKo',
30
+ latin: 'inspector.fontGroupLatin',
31
+ };
32
+
33
+ export function FontFamilyPicker({
34
+ label,
35
+ value,
36
+ sample,
37
+ missing,
38
+ onPreview,
39
+ onRevert,
40
+ onCommit,
41
+ className,
42
+ }: {
43
+ label: string;
44
+ value: string;
45
+ /** The selected layer's text: decides whether the CJK groups come first. */
46
+ sample: string;
47
+ /** The page cannot draw `value`: the field warns. */
48
+ missing?: boolean;
49
+ /** Shows a family on the picture, nothing written. */
50
+ onPreview: (family: string) => void;
51
+ /** Takes the preview back off the picture. */
52
+ onRevert: () => void;
53
+ onCommit: (family: string) => void;
54
+ className: string;
55
+ }) {
56
+ const t = useT();
57
+ const installed = useInstalledFonts();
58
+ const { fonts: project, page } = useProjectFonts();
59
+ const [open, setOpen] = React.useState(false);
60
+ const [query, setQuery] = React.useState('');
61
+ const [active, setActive] = React.useState(0);
62
+ const [recent, setRecent] = React.useState<string[]>([]);
63
+ const anchor = React.useRef<HTMLButtonElement>(null);
64
+ const listRef = React.useRef<HTMLDivElement>(null);
65
+ /* the layer's family when the menu opened: the stage reports a previewed family as the layer's own */
66
+ const origin = React.useRef(value);
67
+ /* the family shown on the picture now (null: the layer's own) */
68
+ const previewing = React.useRef<string | null>(null);
69
+ /* the highlight moved by the keys: scroll it into view (a hovered row is in view already) */
70
+ const keyed = React.useRef(false);
71
+ const [at, setAt] = React.useState<{ left: number; top: number; width: number; maxHeight: number } | null>(null);
72
+
73
+ const place = React.useCallback(() => {
74
+ const box = anchor.current?.getBoundingClientRect();
75
+ if (!box) return;
76
+ const below = window.innerHeight - box.bottom - 12;
77
+ const above = box.top - 12;
78
+ /* below when there is room for a good part of it, else on the roomier side; never past the window */
79
+ const down = below >= 320 || below >= above;
80
+ const maxHeight = Math.max(160, Math.min(460, down ? below : above));
81
+ const top = down ? box.bottom + 4 : box.top - 4 - maxHeight;
82
+ const width = Math.max(box.width, 260);
83
+ setAt({ left: Math.max(8, Math.min(box.left, window.innerWidth - width - 8)), top, width, maxHeight });
84
+ }, []);
85
+
86
+ React.useLayoutEffect(() => {
87
+ if (!open) return undefined;
88
+ place();
89
+ window.addEventListener('resize', place);
90
+ window.addEventListener('scroll', place, true);
91
+ return () => {
92
+ window.removeEventListener('resize', place);
93
+ window.removeEventListener('scroll', place, true);
94
+ };
95
+ }, [open, place]);
96
+
97
+ const sections = React.useMemo(
98
+ () => fontMenu({ installed: installed ?? [], project, page, recent, query, cjkFirst: CJK_TEXT.test(sample) }),
99
+ [installed, project, page, recent, query, sample],
100
+ );
101
+ const rows = React.useMemo(() => sections.flatMap((s) => s.rows), [sections]);
102
+ const typed = query.trim();
103
+ const custom = typed && !rows.some((r) => r.family.toLowerCase() === typed.toLowerCase()) ? typed : null;
104
+ const options = React.useMemo(() => (custom ? [...rows.map((r) => r.family), custom] : rows.map((r) => r.family)), [rows, custom]);
105
+
106
+ /* typing: the best match highlighted (not shown on the picture: that is for the hand on a row, or the arrows) */
107
+ React.useEffect(() => { setActive(0); keyed.current = true; }, [query]);
108
+ React.useEffect(() => {
109
+ if (!open) return;
110
+ /* open on the current family */
111
+ setRecent(readRecentFonts());
112
+ const i = rows.findIndex((r) => r.family === origin.current);
113
+ setActive(i >= 0 ? i : 0);
114
+ keyed.current = true;
115
+ // eslint-disable-next-line react-hooks/exhaustive-deps
116
+ }, [open]);
117
+ React.useEffect(() => {
118
+ if (!open || !keyed.current) return;
119
+ keyed.current = false;
120
+ listRef.current?.querySelector(`[data-index="${active}"]`)?.scrollIntoView({ block: 'nearest' });
121
+ }, [active, open, at]);
122
+
123
+ const show = (family: string | undefined) => {
124
+ if (!family || family === origin.current) {
125
+ if (previewing.current != null) { previewing.current = null; onRevert(); }
126
+ return;
127
+ }
128
+ if (previewing.current === family) return;
129
+ previewing.current = family;
130
+ onPreview(family);
131
+ };
132
+ const close = () => {
133
+ setOpen(false);
134
+ setQuery('');
135
+ if (previewing.current != null) { previewing.current = null; onRevert(); }
136
+ };
137
+ const pick = (family: string) => {
138
+ setOpen(false);
139
+ setQuery('');
140
+ const was = previewing.current;
141
+ previewing.current = null;
142
+ if (!family || family === origin.current) { if (was != null) onRevert(); return; }
143
+ setRecent(rememberRecentFont(family));
144
+ onCommit(family);
145
+ };
146
+ const move = (by: number) => {
147
+ if (!options.length) return;
148
+ const next = Math.max(0, Math.min(options.length - 1, active + by));
149
+ keyed.current = true;
150
+ setActive(next);
151
+ show(options[next]);
152
+ };
153
+
154
+ /* the project's families the page cannot draw: marked in the menu as the field marks one */
155
+ const unavailable = (family: string) => {
156
+ if (installed == null) return false;
157
+ const known = knownAvailable(family, installed, project, page);
158
+ return known == null ? !familyRenders(family) : !known;
159
+ };
160
+
161
+ let index = -1;
162
+ const rowOf = (row: FontRow, section: SectionId) => {
163
+ index += 1;
164
+ const i = index;
165
+ const glyph = sampleOf(row);
166
+ const current = row.family === origin.current;
167
+ const gone = section === 'project' && unavailable(row.family);
168
+ return (
169
+ <button
170
+ key={`${section}:${row.family}`}
171
+ type="button"
172
+ role="option"
173
+ aria-selected={i === active}
174
+ data-index={i}
175
+ onPointerEnter={() => { setActive(i); show(row.family); }}
176
+ onClick={() => pick(row.family)}
177
+ className={`flex w-full items-center gap-2 px-2.5 py-1 text-left ${i === active ? 'bg-[var(--bg-hover)]' : ''}`}
178
+ >
179
+ <span className="flex w-3 shrink-0 justify-center">
180
+ {current ? <Check size={12} className="text-[var(--accent)]" aria-hidden /> : null}
181
+ </span>
182
+ <span
183
+ className={`min-w-0 flex-1 truncate text-[14px] ${row.elsewhere ? 'text-[var(--text-muted)]' : 'text-[var(--text)]'}`}
184
+ style={{ fontFamily: rowFontFamily(row) }}
185
+ >
186
+ {row.family}
187
+ </span>
188
+ {gone ? <AlertTriangle size={11} className="shrink-0 text-[var(--warn)]" aria-label={t('inspector.fontMissing')} /> : null}
189
+ {row.elsewhere ? <span className="shrink-0 text-[10px] text-[var(--text-faint)]">{t('inspector.fontElsewhere')}</span> : null}
190
+ {glyph ? (
191
+ <span aria-hidden className="shrink-0 text-[13px] text-[var(--text-faint)]" style={{ fontFamily: rowFontFamily(row) }}>{glyph}</span>
192
+ ) : null}
193
+ </button>
194
+ );
195
+ };
196
+
197
+ return (
198
+ <>
199
+ <button
200
+ ref={anchor}
201
+ type="button"
202
+ aria-label={label}
203
+ aria-haspopup="listbox"
204
+ aria-expanded={open}
205
+ onClick={() => {
206
+ if (open) { close(); return; }
207
+ origin.current = value;
208
+ setOpen(true);
209
+ }}
210
+ className={`${className} cursor-default text-left`}
211
+ >
212
+ <span className="w-2 shrink-0" />
213
+ <span
214
+ className={`min-w-0 flex-1 truncate text-[11px] ${missing ? 'text-[var(--text-muted)]' : 'text-[var(--text)]'}`}
215
+ style={value ? { fontFamily: rowFontFamily({ family: value, project: project.some((f) => f.family === value) }) } : undefined}
216
+ >
217
+ {value || '—'}
218
+ </span>
219
+ {missing ? (
220
+ <Tooltip label={t('inspector.fontMissing')}>
221
+ <span className="mr-1 flex shrink-0 items-center text-[var(--warn)]" aria-label={t('inspector.fontMissing')} role="img">
222
+ <AlertTriangle size={12} aria-hidden />
223
+ </span>
224
+ </Tooltip>
225
+ ) : null}
226
+ <ChevronDown size={12} className="mr-1.5 shrink-0 text-[var(--text-faint)]" aria-hidden />
227
+ </button>
228
+ {open && at && typeof document !== 'undefined' ? createPortal(
229
+ /* drawn on body, yet part of the inspector: the stage sees data-film-inspector and does not take a click or
230
+ Esc here as "clicked elsewhere, drop the selection" */
231
+ <div data-film-inspector="">
232
+ <div className="fixed inset-0 z-[10150]" onPointerDown={close} aria-hidden />
233
+ <div
234
+ role="dialog"
235
+ aria-label={label}
236
+ className="fixed z-[10151] flex flex-col overflow-hidden rounded-[8px] border border-[var(--border)] bg-[var(--panel)] shadow-[var(--shadow-lg)]"
237
+ style={{ left: at.left, top: at.top, width: at.width, maxHeight: at.maxHeight }}
238
+ >
239
+ <input
240
+ autoFocus
241
+ value={query}
242
+ onChange={(e) => setQuery(e.target.value)}
243
+ placeholder={t('inspector.fontSearch')}
244
+ aria-label={t('inspector.fontSearch')}
245
+ onKeyDown={(e) => {
246
+ if (e.key === 'ArrowDown') { e.preventDefault(); move(1); }
247
+ else if (e.key === 'ArrowUp') { e.preventDefault(); move(-1); }
248
+ else if (e.key === 'Enter') { e.preventDefault(); const f = options[active]; if (f) pick(f); }
249
+ /* close the menu only: bubbling up, the stage would take it as "deselect" */
250
+ else if (e.key === 'Escape') { e.preventDefault(); e.stopPropagation(); close(); }
251
+ }}
252
+ className="h-8 shrink-0 border-b border-[var(--border)] bg-transparent px-2.5 text-[12px] text-[var(--text)] outline-none placeholder:text-[var(--text-faint)]"
253
+ />
254
+ <div
255
+ ref={listRef}
256
+ role="listbox"
257
+ className="min-h-0 flex-1 overflow-y-auto py-1"
258
+ /* the hand left the rows: the picture shows the layer's own font again */
259
+ onPointerLeave={() => show(undefined)}
260
+ >
261
+ {installed == null && !rows.length ? (
262
+ <p className="px-2.5 py-2 text-[12px] text-[var(--text-faint)]">{t('inspector.fontLoading')}</p>
263
+ ) : null}
264
+ {sections.map((s) => (
265
+ <div key={s.id} role="group" aria-label={t(SECTION_LABEL[s.id])}>
266
+ <div className="px-2.5 pb-0.5 pt-1.5 text-[10.5px] font-medium text-[var(--text-faint)]">{t(SECTION_LABEL[s.id])}</div>
267
+ {s.rows.map((row) => rowOf(row, s.id))}
268
+ </div>
269
+ ))}
270
+ {custom ? (
271
+ <button
272
+ type="button"
273
+ role="option"
274
+ aria-selected={active === options.length - 1}
275
+ data-index={options.length - 1}
276
+ onPointerEnter={() => { setActive(options.length - 1); show(custom); }}
277
+ onClick={() => pick(custom)}
278
+ className={`flex w-full items-center px-2.5 py-1.5 text-left text-[12px] text-[var(--text-muted)] ${active === options.length - 1 ? 'bg-[var(--bg-hover)]' : ''}`}
279
+ >
280
+ {t('inspector.fontUse').replace('{name}', custom)}
281
+ </button>
282
+ ) : null}
283
+ {installed != null && !options.length ? (
284
+ <p className="px-2.5 py-2 text-[12px] text-[var(--text-faint)]">{t('inspector.fontNone')}</p>
285
+ ) : null}
286
+ </div>
287
+ </div>
288
+ </div>,
289
+ document.body,
290
+ ) : null}
291
+ </>
292
+ );
293
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The canvas's shapes (the inspector's Stage menu) and a ratio typed by hand (the export's delivery frame). Picking a
3
+ * shape changes the canvas itself: the film is scaled whole into it, centered, until the agent lays it out again.
4
+ */
5
+ import * as React from 'react';
6
+ import { Check } from 'lucide-react';
7
+ import { useT } from '@/i18n';
8
+ import { customFilmFrame, type FilmFrameId } from '@/lib/film-frame';
9
+
10
+ /** The shapes a canvas is offered in: landscape, then portrait. */
11
+ export const CANVAS_RATIOS: { group: 'wide' | 'tall'; id: FilmFrameId; phone?: true }[] = [
12
+ { group: 'wide', id: '16:9' },
13
+ { group: 'wide', id: '21:9' },
14
+ { group: 'wide', id: '4:3' },
15
+ { group: 'wide', id: '2.35:1' },
16
+ { group: 'wide', id: '2:1' },
17
+ { group: 'wide', id: '1.85:1' },
18
+ { group: 'tall', id: '9:16' },
19
+ { group: 'tall', id: '3:4' },
20
+ { group: 'tall', id: '9:19.5', phone: true },
21
+ { group: 'tall', id: '1:1' },
22
+ { group: 'tall', id: '1:2' },
23
+ ];
24
+
25
+ /** A ratio's name in the menu: "9:16", or "5.8″ phone" for a phone's screen. */
26
+ export function canvasRatioLabel(t: (key: string) => string, item: { id: FilmFrameId; phone?: true }): string {
27
+ return item.phone ? t('viewer.ratioPhone') : item.id;
28
+ }
29
+
30
+ /**
31
+ * A ratio of the person's own, typed as width and height ("2.39" by "1", "5" by "4"), from 1:4 to 4:1: Enter or the
32
+ * check puts it in use. Starts from the frame in use.
33
+ */
34
+ export function CustomFrame({ value, disabled, onPick, className = '', chip = false }: {
35
+ value: FilmFrameId;
36
+ disabled?: boolean;
37
+ onPick: (id: FilmFrameId) => void;
38
+ className?: string;
39
+ /** as one of a row of frame chips (the export dialog): the same height, border and corners, its fields capsules
40
+ inside it with an even gap; else a menu's row */
41
+ chip?: boolean;
42
+ }) {
43
+ const t = useT();
44
+ const [w0, h0] = value === 'native' ? ['16', '9'] : value.split(':');
45
+ const [w, setW] = React.useState(w0 ?? '16');
46
+ const [h, setH] = React.useState(h0 ?? '9');
47
+ const id = customFilmFrame(Number(w), Number(h));
48
+ const apply = () => { if (id) onPick(id); };
49
+ const field = chip
50
+ ? 'h-6 w-9 rounded-full bg-[var(--fill-tsp)] text-center text-[12px] font-medium tabular-nums text-[var(--text)] outline-none ring-[var(--text-faint)] focus:ring-1'
51
+ : 'h-6 w-12 rounded-[5px] border border-[var(--border)] bg-[var(--bg)] px-1.5 text-center text-[12px] tabular-nums text-[var(--text)] outline-none focus:border-[var(--accent)]';
52
+ return (
53
+ <div className={chip
54
+ ? `flex items-center gap-1 rounded-lg border border-[var(--border)] py-[4px] pl-2.5 pr-[4px] ${className}`
55
+ : `flex items-center gap-1.5 px-2 py-1 ${className}`}>
56
+ <span className={chip ? 'mr-1 text-[12px] font-medium text-[var(--text-muted)]' : 'mr-auto text-[11.5px] text-[var(--text-muted)]'}>{t('viewer.frameCustom')}</span>
57
+ <input aria-label={t('viewer.frameCustomW')} inputMode="decimal" value={w} disabled={disabled}
58
+ onChange={(e) => setW(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') apply(); }} className={field} />
59
+ <span className="text-[12px] text-[var(--text-faint)]">:</span>
60
+ <input aria-label={t('viewer.frameCustomH')} inputMode="decimal" value={h} disabled={disabled}
61
+ onChange={(e) => setH(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') apply(); }} className={field} />
62
+ <button type="button" disabled={disabled || !id} onClick={apply} aria-label={t('viewer.frameCustomApply')}
63
+ title={id ? undefined : t('viewer.frameCustomRange')}
64
+ className={`flex h-6 w-6 items-center justify-center ${chip ? 'rounded-full' : 'rounded-[5px]'} text-[var(--text-muted)] transition hover:bg-[var(--bg-hover)] hover:text-[var(--text)] disabled:opacity-30`}>
65
+ <Check size={13} />
66
+ </button>
67
+ </div>
68
+ );
69
+ }
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { X } from 'lucide-react';
3
+ import { useT } from '@/i18n';
4
+ import { PANE_BAR, PANE_TITLE, PANE_BTN, PANE_ICON } from './dock-pane-bar';
5
+ import { Tooltip } from './Tooltip';
6
+
7
+ /** The inspector's pane for anything that is not a film selection (a media file's properties). */
8
+ export function InspectorPanel({ title, width, onClose, children }: {
9
+ title: string; width: number; onClose: () => void; children: React.ReactNode;
10
+ }) {
11
+ const t = useT();
12
+ return (
13
+ <aside aria-label={title} data-inspector-panel data-film-inspector className="relative flex min-h-0 min-w-0 shrink-0 flex-col overflow-hidden rounded-[7px] bg-[var(--dock-pane)] text-[var(--text)]" style={{ width }} onKeyDown={event => {
14
+ if ((event.target as Element).closest('input, select, textarea, button')) event.stopPropagation();
15
+ }}>
16
+ <div className={PANE_BAR}>
17
+ <span className={`${PANE_TITLE} flex-1 px-1`}>{title}</span>
18
+ <Tooltip label={t('inspector.hide')} side="bottom">
19
+ <button type="button" aria-label={t('inspector.hide')} onClick={onClose} className={PANE_BTN}><X size={PANE_ICON} /></button>
20
+ </Tooltip>
21
+ </div>
22
+ <div className="min-h-0 flex-1 overflow-y-auto overscroll-contain px-3 pb-5">{children}</div>
23
+ </aside>
24
+ );
25
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The window of an app with tabs (lib/host.ts `tabs`) when no tab is open: an empty window (its top bar still drags
3
+ * it) and the projects window over it, as `+` opens it, only with nothing behind to close it to. The project picked
4
+ * opens in its tab. Shown while tabs are open too (a tab's page that could not load), its top bar has them, so they
5
+ * can always be reached. The top bar stays above the projects window's shade, in the window's color like the system's
6
+ * window buttons beside it: its logo opens Settings, as a project's does.
7
+ */
8
+ import { useT } from '@/i18n';
9
+ import { BrandLogo } from './BrandLogo';
10
+ import { ProjectsPopover } from './ProjectsLibrary';
11
+ import { SettingsModal } from './settings/SettingsModal';
12
+ import { useSettings } from './settings/use-settings';
13
+ import { TabStrip, useHostTabs } from './TabStrip';
14
+ import { Tooltip } from './Tooltip';
15
+
16
+ export function Launcher({ onOpen }: { onOpen: (projectId: string) => void }) {
17
+ const t = useT();
18
+ const [settings, setSettings] = useSettings();
19
+ const { tabs } = useHostTabs();
20
+ return (
21
+ <>
22
+ <div className="workspace-shell bg-[var(--dock-shell)]" />
23
+ {/* not inside the shell: a fixed box is a layer of its own, which would keep this bar under the shade */}
24
+ <div data-titlebar className="fixed inset-x-0 top-0 z-[10045] flex h-8 min-w-0 items-center gap-1 bg-[var(--dock-shell)] px-[6px]">
25
+ <div aria-hidden className="shrink-0 self-stretch" style={{ width: 'var(--titlebar-logo-x)' }} />
26
+ <Tooltip label={t('project.appMenu')} side="bottom">
27
+ <button type="button" aria-label={t('project.appMenu')} aria-haspopup="dialog" onClick={() => setSettings('general')}
28
+ className="flex h-[26px] w-[26px] shrink-0 items-center justify-center rounded-md text-[var(--text-dim)] transition hover:bg-[var(--bg-hover)]">
29
+ <BrandLogo size={15} />
30
+ </button>
31
+ </Tooltip>
32
+ {tabs.length ? <TabStrip /> : null}
33
+ </div>
34
+ <ProjectsPopover open currentProjectId="" onOpen={onOpen} onCurrentRemoved={() => {}} />
35
+ <SettingsModal open={settings !== null} section={settings ?? undefined} onClose={() => setSettings(null)} />
36
+ </>
37
+ );
38
+ }