markupr 2.1.8 → 2.5.0

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 (300) hide show
  1. package/README.md +292 -15
  2. package/dist/cli/index.mjs +3593 -0
  3. package/dist/main/index.mjs +743 -220
  4. package/dist/mcp/index.mjs +4053 -0
  5. package/package.json +32 -7
  6. package/.claude/commands/review-feedback.md +0 -47
  7. package/.eslintrc.json +0 -35
  8. package/.github/CODEOWNERS +0 -16
  9. package/.github/FUNDING.yml +0 -1
  10. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -56
  11. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -54
  12. package/.github/PULL_REQUEST_TEMPLATE.md +0 -89
  13. package/.github/dependabot.yml +0 -70
  14. package/.github/workflows/ci.yml +0 -184
  15. package/.github/workflows/deploy-landing.yml +0 -134
  16. package/.github/workflows/nightly.yml +0 -288
  17. package/.github/workflows/release.yml +0 -318
  18. package/CHANGELOG.md +0 -127
  19. package/CLAUDE.md +0 -137
  20. package/CODE_OF_CONDUCT.md +0 -9
  21. package/CONTRIBUTING.md +0 -390
  22. package/PRODUCT_VISION.md +0 -277
  23. package/SECURITY.md +0 -51
  24. package/SIGNING_INSTRUCTIONS.md +0 -284
  25. package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +0 -130
  26. package/assets/svg-source/dmg-background.svg +0 -70
  27. package/assets/svg-source/icon.svg +0 -20
  28. package/assets/svg-source/tray-icon-processing.svg +0 -7
  29. package/assets/svg-source/tray-icon-recording.svg +0 -7
  30. package/assets/svg-source/tray-icon.svg +0 -6
  31. package/assets/tray-complete.png +0 -0
  32. package/assets/tray-complete@2x.png +0 -0
  33. package/assets/tray-completeTemplate.png +0 -0
  34. package/assets/tray-completeTemplate@2x.png +0 -0
  35. package/assets/tray-error.png +0 -0
  36. package/assets/tray-error@2x.png +0 -0
  37. package/assets/tray-errorTemplate.png +0 -0
  38. package/assets/tray-errorTemplate@2x.png +0 -0
  39. package/assets/tray-icon-processing.png +0 -0
  40. package/assets/tray-icon-processing@2x.png +0 -0
  41. package/assets/tray-icon-processingTemplate.png +0 -0
  42. package/assets/tray-icon-processingTemplate@2x.png +0 -0
  43. package/assets/tray-icon-recording.png +0 -0
  44. package/assets/tray-icon-recording@2x.png +0 -0
  45. package/assets/tray-icon-recordingTemplate.png +0 -0
  46. package/assets/tray-icon-recordingTemplate@2x.png +0 -0
  47. package/assets/tray-icon.png +0 -0
  48. package/assets/tray-icon@2x.png +0 -0
  49. package/assets/tray-iconTemplate.png +0 -0
  50. package/assets/tray-iconTemplate@2x.png +0 -0
  51. package/assets/tray-idle.png +0 -0
  52. package/assets/tray-idle@2x.png +0 -0
  53. package/assets/tray-idleTemplate.png +0 -0
  54. package/assets/tray-idleTemplate@2x.png +0 -0
  55. package/assets/tray-processing-0.png +0 -0
  56. package/assets/tray-processing-0@2x.png +0 -0
  57. package/assets/tray-processing-0Template.png +0 -0
  58. package/assets/tray-processing-0Template@2x.png +0 -0
  59. package/assets/tray-processing-1.png +0 -0
  60. package/assets/tray-processing-1@2x.png +0 -0
  61. package/assets/tray-processing-1Template.png +0 -0
  62. package/assets/tray-processing-1Template@2x.png +0 -0
  63. package/assets/tray-processing-2.png +0 -0
  64. package/assets/tray-processing-2@2x.png +0 -0
  65. package/assets/tray-processing-2Template.png +0 -0
  66. package/assets/tray-processing-2Template@2x.png +0 -0
  67. package/assets/tray-processing-3.png +0 -0
  68. package/assets/tray-processing-3@2x.png +0 -0
  69. package/assets/tray-processing-3Template.png +0 -0
  70. package/assets/tray-processing-3Template@2x.png +0 -0
  71. package/assets/tray-processing.png +0 -0
  72. package/assets/tray-processing@2x.png +0 -0
  73. package/assets/tray-processingTemplate.png +0 -0
  74. package/assets/tray-processingTemplate@2x.png +0 -0
  75. package/assets/tray-recording.png +0 -0
  76. package/assets/tray-recording@2x.png +0 -0
  77. package/assets/tray-recordingTemplate.png +0 -0
  78. package/assets/tray-recordingTemplate@2x.png +0 -0
  79. package/build/DMG_BACKGROUND_SPEC.md +0 -50
  80. package/build/dmg-background.png +0 -0
  81. package/build/dmg-background@2x.png +0 -0
  82. package/build/entitlements.mac.inherit.plist +0 -27
  83. package/build/entitlements.mac.plist +0 -41
  84. package/build/favicon-16.png +0 -0
  85. package/build/favicon-180.png +0 -0
  86. package/build/favicon-192.png +0 -0
  87. package/build/favicon-32.png +0 -0
  88. package/build/favicon-48.png +0 -0
  89. package/build/favicon-512.png +0 -0
  90. package/build/favicon-64.png +0 -0
  91. package/build/icon-128.png +0 -0
  92. package/build/icon-16.png +0 -0
  93. package/build/icon-24.png +0 -0
  94. package/build/icon-256.png +0 -0
  95. package/build/icon-32.png +0 -0
  96. package/build/icon-48.png +0 -0
  97. package/build/icon-64.png +0 -0
  98. package/build/icon.icns +0 -0
  99. package/build/icon.ico +0 -0
  100. package/build/icon.iconset/icon_128x128.png +0 -0
  101. package/build/icon.iconset/icon_128x128@2x.png +0 -0
  102. package/build/icon.iconset/icon_16x16.png +0 -0
  103. package/build/icon.iconset/icon_16x16@2x.png +0 -0
  104. package/build/icon.iconset/icon_256x256.png +0 -0
  105. package/build/icon.iconset/icon_256x256@2x.png +0 -0
  106. package/build/icon.iconset/icon_32x32.png +0 -0
  107. package/build/icon.iconset/icon_32x32@2x.png +0 -0
  108. package/build/icon.iconset/icon_512x512.png +0 -0
  109. package/build/icon.iconset/icon_512x512@2x.png +0 -0
  110. package/build/icon.png +0 -0
  111. package/build/installer-header.bmp +0 -0
  112. package/build/installer-header.png +0 -0
  113. package/build/installer-sidebar.bmp +0 -0
  114. package/build/installer-sidebar.png +0 -0
  115. package/build/installer.nsh +0 -45
  116. package/build/overlay-processing.png +0 -0
  117. package/build/overlay-recording.png +0 -0
  118. package/build/toolbar-record.png +0 -0
  119. package/build/toolbar-screenshot.png +0 -0
  120. package/build/toolbar-settings.png +0 -0
  121. package/build/toolbar-stop.png +0 -0
  122. package/dist/preload/index.mjs +0 -907
  123. package/dist/renderer/assets/index-CCmUjl9K.js +0 -19495
  124. package/dist/renderer/assets/index-CUqz_Gs6.css +0 -2270
  125. package/dist/renderer/index.html +0 -27
  126. package/docs/AI_AGENT_QUICKSTART.md +0 -42
  127. package/docs/AI_PIPELINE_DESIGN.md +0 -595
  128. package/docs/API.md +0 -514
  129. package/docs/ARCHITECTURE.md +0 -460
  130. package/docs/CONFIGURATION.md +0 -336
  131. package/docs/DEVELOPMENT.md +0 -508
  132. package/docs/EXPORT_FORMATS.md +0 -451
  133. package/docs/GETTING_STARTED.md +0 -236
  134. package/docs/KEYBOARD_SHORTCUTS.md +0 -334
  135. package/docs/TROUBLESHOOTING.md +0 -418
  136. package/docs/landing/index.html +0 -672
  137. package/docs/landing/script.js +0 -342
  138. package/docs/landing/styles.css +0 -1543
  139. package/electron-builder.yml +0 -140
  140. package/electron.vite.config.ts +0 -63
  141. package/railway.json +0 -12
  142. package/scripts/build.mjs +0 -51
  143. package/scripts/generate-icons.mjs +0 -314
  144. package/scripts/generate-installer-images.cjs +0 -253
  145. package/scripts/generate-tray-icons.mjs +0 -258
  146. package/scripts/notarize.cjs +0 -180
  147. package/scripts/one-click-clean-test.sh +0 -147
  148. package/scripts/postinstall.mjs +0 -36
  149. package/scripts/setup-markupr.sh +0 -55
  150. package/setup +0 -17
  151. package/site/index.html +0 -1835
  152. package/site/package.json +0 -11
  153. package/site/railway.json +0 -12
  154. package/site/server.js +0 -31
  155. package/src/main/AutoUpdater.ts +0 -392
  156. package/src/main/CrashRecovery.ts +0 -655
  157. package/src/main/ErrorHandler.ts +0 -703
  158. package/src/main/HotkeyManager.ts +0 -399
  159. package/src/main/MenuManager.ts +0 -529
  160. package/src/main/PermissionManager.ts +0 -420
  161. package/src/main/SessionController.ts +0 -1465
  162. package/src/main/TrayManager.ts +0 -540
  163. package/src/main/ai/AIPipelineManager.ts +0 -199
  164. package/src/main/ai/ClaudeAnalyzer.ts +0 -339
  165. package/src/main/ai/ImageOptimizer.ts +0 -176
  166. package/src/main/ai/StructuredMarkdownBuilder.ts +0 -379
  167. package/src/main/ai/index.ts +0 -16
  168. package/src/main/ai/types.ts +0 -258
  169. package/src/main/analysis/ClarificationGenerator.ts +0 -385
  170. package/src/main/analysis/FeedbackAnalyzer.ts +0 -531
  171. package/src/main/analysis/index.ts +0 -19
  172. package/src/main/audio/AudioCapture.ts +0 -978
  173. package/src/main/audio/audioUtils.ts +0 -100
  174. package/src/main/audio/index.ts +0 -20
  175. package/src/main/capture/index.ts +0 -1
  176. package/src/main/index.ts +0 -1693
  177. package/src/main/ipc/captureHandlers.ts +0 -272
  178. package/src/main/ipc/index.ts +0 -45
  179. package/src/main/ipc/outputHandlers.ts +0 -302
  180. package/src/main/ipc/sessionHandlers.ts +0 -56
  181. package/src/main/ipc/settingsHandlers.ts +0 -471
  182. package/src/main/ipc/types.ts +0 -56
  183. package/src/main/ipc/windowHandlers.ts +0 -277
  184. package/src/main/output/ClipboardService.ts +0 -369
  185. package/src/main/output/ExportService.ts +0 -539
  186. package/src/main/output/FileManager.ts +0 -416
  187. package/src/main/output/MarkdownGenerator.ts +0 -791
  188. package/src/main/output/MarkdownPatcher.ts +0 -299
  189. package/src/main/output/index.ts +0 -186
  190. package/src/main/output/sessionAdapter.ts +0 -207
  191. package/src/main/output/templates/html-template.ts +0 -553
  192. package/src/main/pipeline/FrameExtractor.ts +0 -330
  193. package/src/main/pipeline/PostProcessor.ts +0 -399
  194. package/src/main/pipeline/TranscriptAnalyzer.ts +0 -226
  195. package/src/main/pipeline/index.ts +0 -36
  196. package/src/main/platform/WindowsTaskbar.ts +0 -600
  197. package/src/main/platform/index.ts +0 -16
  198. package/src/main/settings/SettingsManager.ts +0 -730
  199. package/src/main/settings/index.ts +0 -19
  200. package/src/main/transcription/ModelDownloadManager.ts +0 -494
  201. package/src/main/transcription/TierManager.ts +0 -219
  202. package/src/main/transcription/TranscriptionRecoveryService.ts +0 -340
  203. package/src/main/transcription/WhisperService.ts +0 -748
  204. package/src/main/transcription/index.ts +0 -56
  205. package/src/main/transcription/types.ts +0 -135
  206. package/src/main/windows/PopoverManager.ts +0 -284
  207. package/src/main/windows/TaskbarIntegration.ts +0 -452
  208. package/src/main/windows/index.ts +0 -23
  209. package/src/preload/index.ts +0 -1047
  210. package/src/renderer/App.tsx +0 -515
  211. package/src/renderer/AppWrapper.tsx +0 -28
  212. package/src/renderer/assets/logo-dark.svg +0 -7
  213. package/src/renderer/assets/logo.svg +0 -7
  214. package/src/renderer/audio/AudioCaptureRenderer.ts +0 -454
  215. package/src/renderer/capture/ScreenRecordingRenderer.ts +0 -492
  216. package/src/renderer/components/AnnotationOverlay.tsx +0 -836
  217. package/src/renderer/components/AudioWaveform.tsx +0 -811
  218. package/src/renderer/components/ClarificationQuestions.tsx +0 -656
  219. package/src/renderer/components/CountdownTimer.tsx +0 -495
  220. package/src/renderer/components/CrashRecoveryDialog.tsx +0 -632
  221. package/src/renderer/components/DonateButton.tsx +0 -127
  222. package/src/renderer/components/ErrorBoundary.tsx +0 -308
  223. package/src/renderer/components/ExportDialog.tsx +0 -872
  224. package/src/renderer/components/HotkeyHint.tsx +0 -261
  225. package/src/renderer/components/KeyboardShortcuts.tsx +0 -787
  226. package/src/renderer/components/ModelDownloadDialog.tsx +0 -844
  227. package/src/renderer/components/Onboarding.tsx +0 -1830
  228. package/src/renderer/components/ProcessingOverlay.tsx +0 -157
  229. package/src/renderer/components/RecordingOverlay.tsx +0 -423
  230. package/src/renderer/components/SessionHistory.tsx +0 -1746
  231. package/src/renderer/components/SessionReview.tsx +0 -1321
  232. package/src/renderer/components/SettingsPanel.tsx +0 -217
  233. package/src/renderer/components/Skeleton.tsx +0 -347
  234. package/src/renderer/components/StatusIndicator.tsx +0 -86
  235. package/src/renderer/components/ThemeProvider.tsx +0 -429
  236. package/src/renderer/components/Tooltip.tsx +0 -370
  237. package/src/renderer/components/TranscriptionPreview.tsx +0 -183
  238. package/src/renderer/components/TranscriptionTierSelector.tsx +0 -640
  239. package/src/renderer/components/UpdateNotification.tsx +0 -377
  240. package/src/renderer/components/WindowSelector.tsx +0 -947
  241. package/src/renderer/components/index.ts +0 -99
  242. package/src/renderer/components/primitives/ApiKeyInput.tsx +0 -98
  243. package/src/renderer/components/primitives/ColorPicker.tsx +0 -65
  244. package/src/renderer/components/primitives/DangerButton.tsx +0 -45
  245. package/src/renderer/components/primitives/DirectoryPicker.tsx +0 -41
  246. package/src/renderer/components/primitives/Dropdown.tsx +0 -34
  247. package/src/renderer/components/primitives/KeyRecorder.tsx +0 -117
  248. package/src/renderer/components/primitives/SettingsSection.tsx +0 -32
  249. package/src/renderer/components/primitives/Slider.tsx +0 -43
  250. package/src/renderer/components/primitives/Toggle.tsx +0 -36
  251. package/src/renderer/components/primitives/index.ts +0 -10
  252. package/src/renderer/components/settings/AdvancedTab.tsx +0 -174
  253. package/src/renderer/components/settings/AppearanceTab.tsx +0 -77
  254. package/src/renderer/components/settings/GeneralTab.tsx +0 -40
  255. package/src/renderer/components/settings/HotkeysTab.tsx +0 -79
  256. package/src/renderer/components/settings/RecordingTab.tsx +0 -84
  257. package/src/renderer/components/settings/index.ts +0 -9
  258. package/src/renderer/components/settings/settingsStyles.ts +0 -673
  259. package/src/renderer/components/settings/tabConfig.tsx +0 -85
  260. package/src/renderer/components/settings/useSettingsPanel.ts +0 -447
  261. package/src/renderer/contexts/ProcessingContext.tsx +0 -227
  262. package/src/renderer/contexts/RecordingContext.tsx +0 -683
  263. package/src/renderer/contexts/UIContext.tsx +0 -326
  264. package/src/renderer/contexts/index.ts +0 -24
  265. package/src/renderer/donateMessages.ts +0 -69
  266. package/src/renderer/hooks/index.ts +0 -75
  267. package/src/renderer/hooks/useAnimation.tsx +0 -544
  268. package/src/renderer/hooks/useTheme.ts +0 -313
  269. package/src/renderer/index.html +0 -26
  270. package/src/renderer/main.tsx +0 -52
  271. package/src/renderer/styles/animations.css +0 -1093
  272. package/src/renderer/styles/app-shell.css +0 -662
  273. package/src/renderer/styles/globals.css +0 -515
  274. package/src/renderer/styles/theme.ts +0 -578
  275. package/src/renderer/types/electron.d.ts +0 -385
  276. package/src/shared/hotkeys.ts +0 -283
  277. package/src/shared/types.ts +0 -809
  278. package/tests/clipboard.test.ts +0 -228
  279. package/tests/e2e/criticalPaths.test.ts +0 -594
  280. package/tests/feedbackAnalyzer.test.ts +0 -303
  281. package/tests/integration/sessionFlow.test.ts +0 -583
  282. package/tests/markdownGenerator.test.ts +0 -418
  283. package/tests/output.test.ts +0 -96
  284. package/tests/setup.ts +0 -486
  285. package/tests/unit/appIntegration.test.ts +0 -676
  286. package/tests/unit/appViewState.test.ts +0 -281
  287. package/tests/unit/audioIpcChannels.test.ts +0 -17
  288. package/tests/unit/exportService.test.ts +0 -492
  289. package/tests/unit/hotkeys.test.ts +0 -92
  290. package/tests/unit/navigationPreload.test.ts +0 -94
  291. package/tests/unit/onboardingFlow.test.ts +0 -345
  292. package/tests/unit/permissionManager.test.ts +0 -175
  293. package/tests/unit/permissionManagerExpanded.test.ts +0 -296
  294. package/tests/unit/screenRecordingRenderer.test.ts +0 -368
  295. package/tests/unit/sessionController.test.ts +0 -515
  296. package/tests/unit/tierManager.test.ts +0 -61
  297. package/tests/unit/tierManagerExpanded.test.ts +0 -142
  298. package/tests/unit/transcriptAnalyzer.test.ts +0 -64
  299. package/tsconfig.json +0 -25
  300. package/vitest.config.ts +0 -46
@@ -1,662 +0,0 @@
1
- :root {
2
- --ff-shell-bg:
3
- radial-gradient(circle at 10% -18%, rgba(10, 132, 255, 0.16), transparent 46%),
4
- radial-gradient(circle at 90% -16%, rgba(94, 106, 240, 0.12), transparent 44%),
5
- linear-gradient(180deg, #090c14 0%, #0c1018 60%, #0b0f16 100%);
6
- --ff-surface: rgba(22, 28, 39, 0.82);
7
- --ff-surface-strong: rgba(26, 33, 45, 0.9);
8
- --ff-border: rgba(150, 162, 183, 0.22);
9
- --ff-border-strong: rgba(167, 178, 198, 0.34);
10
- --ff-text-primary: #eef3ff;
11
- --ff-text-secondary: #c6d0e3;
12
- --ff-text-muted: #8f9db5;
13
- --ff-live: #ff3b30;
14
- --ff-live-soft: rgba(255, 59, 48, 0.24);
15
- --ff-accent: #0a84ff;
16
- --ff-accent-soft: rgba(10, 132, 255, 0.22);
17
- --ff-success: #34c759;
18
- --ff-error: #ff3b30;
19
- }
20
-
21
- .ff-shell {
22
- width: 100%;
23
- min-height: 100%;
24
- padding: 12px;
25
- background: var(--ff-shell-bg);
26
- color: var(--ff-text-primary);
27
- font-family: 'SF Pro Text', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Helvetica Neue',
28
- Arial, sans-serif;
29
- }
30
-
31
- .ff-shell--hud {
32
- padding: 0;
33
- background: transparent;
34
- }
35
-
36
- .ff-shell__card {
37
- border: 1px solid var(--ff-border);
38
- border-radius: 18px;
39
- background: linear-gradient(180deg, var(--ff-surface-strong) 0%, var(--ff-surface) 100%);
40
- box-shadow:
41
- 0 12px 32px rgba(3, 6, 12, 0.5),
42
- inset 0 1px 0 rgba(217, 224, 236, 0.11);
43
- padding: 16px;
44
- display: flex;
45
- flex-direction: column;
46
- gap: 12px;
47
- max-height: calc(100vh - 24px);
48
- overflow-y: auto;
49
- overscroll-behavior: contain;
50
- animation: ffShellIn 180ms ease-out;
51
- }
52
-
53
- .ff-shell__card--hud {
54
- border: none;
55
- border-radius: 0;
56
- background: transparent;
57
- box-shadow: none;
58
- padding: 0;
59
- gap: 0;
60
- overflow: visible;
61
- max-height: none;
62
- animation: none;
63
- }
64
-
65
- .ff-shell__header {
66
- display: flex;
67
- align-items: flex-start;
68
- justify-content: space-between;
69
- gap: 10px;
70
- }
71
-
72
- .ff-shell__eyebrow {
73
- font-size: 11px;
74
- letter-spacing: 0.08em;
75
- text-transform: uppercase;
76
- color: var(--ff-text-muted);
77
- font-weight: 600;
78
- }
79
-
80
- .ff-shell__title {
81
- margin-top: 2px;
82
- font-size: 24px;
83
- line-height: 1.1;
84
- letter-spacing: -0.02em;
85
- color: var(--ff-text-primary);
86
- }
87
-
88
- .ff-shell__quiet-btn {
89
- font-size: 12px;
90
- color: var(--ff-text-secondary);
91
- background: rgba(138, 149, 171, 0.14);
92
- border: 1px solid rgba(138, 149, 171, 0.26);
93
- border-radius: 999px;
94
- padding: 7px 11px;
95
- min-height: 30px;
96
- display: inline-flex;
97
- align-items: center;
98
- justify-content: center;
99
- transition: background 140ms ease, border-color 140ms ease, color 140ms ease;
100
- }
101
-
102
- .ff-shell__quiet-btn:hover {
103
- background: rgba(138, 149, 171, 0.24);
104
- border-color: rgba(164, 176, 199, 0.45);
105
- color: var(--ff-text-primary);
106
- }
107
-
108
- .ff-shell__subtitle {
109
- color: var(--ff-text-secondary);
110
- font-size: 13px;
111
- line-height: 1.45;
112
- }
113
-
114
- .ff-shell__controls {
115
- display: grid;
116
- gap: 8px;
117
- }
118
-
119
- .ff-shell__primary-btn,
120
- .ff-shell__secondary-btn {
121
- width: 100%;
122
- min-height: 42px;
123
- border-radius: 12px;
124
- border: 1px solid transparent;
125
- padding: 11px 14px;
126
- font-size: 14px;
127
- font-weight: 600;
128
- transition: transform 120ms ease, opacity 120ms ease, border-color 140ms ease, background 140ms ease;
129
- }
130
-
131
- .ff-shell__primary-btn {
132
- color: #ffffff;
133
- background: linear-gradient(180deg, #0a84ff 0%, #0077ed 100%);
134
- box-shadow: 0 6px 14px rgba(10, 132, 255, 0.26);
135
- }
136
-
137
- .ff-shell__primary-btn.is-live {
138
- background: linear-gradient(180deg, #ff453a 0%, #d92f25 100%);
139
- box-shadow: 0 6px 14px rgba(255, 69, 58, 0.25);
140
- }
141
-
142
- .ff-shell__primary-btn:hover:not(:disabled) {
143
- filter: brightness(1.03);
144
- }
145
-
146
- .ff-shell__secondary-btn {
147
- color: var(--ff-text-secondary);
148
- background: rgba(124, 137, 160, 0.12);
149
- border-color: rgba(124, 137, 160, 0.24);
150
- }
151
-
152
- .ff-shell__secondary-btn:hover:not(:disabled) {
153
- background: rgba(124, 137, 160, 0.22);
154
- border-color: rgba(124, 137, 160, 0.38);
155
- color: var(--ff-text-primary);
156
- }
157
-
158
- .ff-shell__primary-btn:disabled,
159
- .ff-shell__secondary-btn:disabled {
160
- opacity: 0.55;
161
- cursor: not-allowed;
162
- }
163
-
164
- .ff-shell__primary-btn:not(:disabled):active,
165
- .ff-shell__secondary-btn:not(:disabled):active {
166
- transform: translateY(1px);
167
- }
168
-
169
- .ff-shell__meta {
170
- display: flex;
171
- flex-wrap: wrap;
172
- gap: 8px;
173
- }
174
-
175
- .ff-shell__meta span {
176
- display: inline-flex;
177
- align-items: center;
178
- border: 1px solid rgba(131, 144, 168, 0.26);
179
- background: rgba(131, 144, 168, 0.12);
180
- border-radius: 999px;
181
- padding: 5px 10px;
182
- font-size: 11px;
183
- color: var(--ff-text-secondary);
184
- }
185
-
186
- .ff-shell__meta span.is-ready {
187
- border-color: rgba(52, 199, 89, 0.42);
188
- background: rgba(52, 199, 89, 0.14);
189
- color: #7de0a0;
190
- }
191
-
192
- .ff-shell__meta span.is-optional {
193
- border-color: rgba(255, 159, 10, 0.35);
194
- background: rgba(255, 159, 10, 0.14);
195
- color: #f2bd66;
196
- }
197
-
198
- .ff-shell__meta-pill {
199
- display: inline-flex;
200
- align-items: center;
201
- border: 1px solid rgba(131, 144, 168, 0.25);
202
- background: rgba(131, 144, 168, 0.12);
203
- border-radius: 999px;
204
- padding: 5px 10px;
205
- font-size: 11px;
206
- color: var(--ff-text-secondary);
207
- }
208
-
209
- .ff-shell__byok-cta {
210
- border-radius: 12px;
211
- padding: 12px;
212
- border: 1px solid rgba(255, 159, 10, 0.35);
213
- background: rgba(255, 159, 10, 0.1);
214
- display: grid;
215
- gap: 6px;
216
- }
217
-
218
- .ff-shell__byok-title {
219
- font-size: 13px;
220
- font-weight: 600;
221
- color: #f2bd66;
222
- }
223
-
224
- .ff-shell__byok-detail {
225
- font-size: 12px;
226
- color: #ddb46f;
227
- }
228
-
229
- .ff-shell__byok-btn {
230
- justify-self: start;
231
- min-height: 30px;
232
- border-radius: 9px;
233
- border: 1px solid rgba(255, 159, 10, 0.44);
234
- background: rgba(255, 159, 10, 0.16);
235
- color: #ffe0ad;
236
- font-size: 12px;
237
- font-weight: 600;
238
- padding: 6px 10px;
239
- }
240
-
241
- .ff-shell__transcript {
242
- border-radius: 12px;
243
- padding: 11px;
244
- border: 1px solid rgba(10, 132, 255, 0.28);
245
- background: rgba(10, 132, 255, 0.08);
246
- }
247
-
248
- .ff-shell__transcript-label {
249
- font-size: 11px;
250
- color: var(--ff-text-muted);
251
- margin-bottom: 6px;
252
- text-transform: uppercase;
253
- letter-spacing: 0.06em;
254
- }
255
-
256
- .ff-shell__transcript p {
257
- font-size: 13px;
258
- line-height: 1.4;
259
- }
260
-
261
- .ff-shell__transcript-scroll {
262
- max-height: 190px;
263
- overflow-y: auto;
264
- display: grid;
265
- gap: 7px;
266
- padding-right: 4px;
267
- }
268
-
269
- .ff-shell__transcript-line {
270
- font-size: 13px;
271
- line-height: 1.45;
272
- color: var(--ff-text-primary);
273
- }
274
-
275
- .ff-shell__transcript-interim {
276
- font-size: 13px;
277
- line-height: 1.45;
278
- color: var(--ff-text-secondary);
279
- font-style: italic;
280
- opacity: 0.92;
281
- }
282
-
283
- .ff-shell__transcript-placeholder {
284
- font-size: 12px;
285
- color: var(--ff-text-muted);
286
- }
287
-
288
- .ff-shell__report {
289
- border-radius: 14px;
290
- border: 1px solid rgba(70, 160, 255, 0.34);
291
- background: rgba(70, 160, 255, 0.1);
292
- padding: 12px;
293
- display: grid;
294
- gap: 8px;
295
- }
296
-
297
- .ff-shell__report-label {
298
- font-size: 11px;
299
- text-transform: uppercase;
300
- letter-spacing: 0.06em;
301
- color: #98c2ff;
302
- }
303
-
304
- .ff-shell__path {
305
- font-family: 'SF Mono', Menlo, Monaco, 'Cascadia Mono', monospace;
306
- font-size: 11px;
307
- color: var(--ff-text-primary);
308
- overflow-wrap: anywhere;
309
- background: rgba(11, 15, 24, 0.72);
310
- border: 1px solid rgba(130, 142, 165, 0.28);
311
- border-radius: 9px;
312
- padding: 9px;
313
- }
314
-
315
- .ff-shell__report-actions {
316
- display: flex;
317
- flex-wrap: wrap;
318
- gap: 7px;
319
- }
320
-
321
- .ff-shell__report-actions button {
322
- flex: 1 1 140px;
323
- min-height: 34px;
324
- border-radius: 10px;
325
- border: 1px solid rgba(130, 142, 165, 0.28);
326
- background: rgba(25, 31, 42, 0.84);
327
- color: var(--ff-text-secondary);
328
- font-size: 12px;
329
- padding: 8px 10px;
330
- transition: background 140ms ease, border-color 140ms ease, color 140ms ease;
331
- }
332
-
333
- .ff-shell__report-actions button:hover {
334
- background: rgba(34, 41, 54, 0.95);
335
- border-color: rgba(153, 166, 189, 0.42);
336
- color: var(--ff-text-primary);
337
- }
338
-
339
- .ff-shell__error {
340
- border-radius: 12px;
341
- border: 1px solid rgba(255, 59, 48, 0.35);
342
- background: rgba(255, 59, 48, 0.14);
343
- color: #ff9a92;
344
- padding: 10px 11px;
345
- font-size: 12px;
346
- }
347
-
348
- .ff-shell__recent {
349
- border: 1px solid rgba(130, 142, 165, 0.24);
350
- border-radius: 14px;
351
- background: rgba(19, 25, 35, 0.78);
352
- padding: 11px;
353
- display: grid;
354
- gap: 10px;
355
- }
356
-
357
- .ff-shell__recent-header {
358
- display: flex;
359
- align-items: center;
360
- justify-content: space-between;
361
- }
362
-
363
- .ff-shell__recent-header h2 {
364
- font-size: 13px;
365
- letter-spacing: 0.01em;
366
- }
367
-
368
- .ff-shell__recent-header button {
369
- color: var(--ff-text-secondary);
370
- font-size: 11px;
371
- border-radius: 8px;
372
- border: 1px solid rgba(131, 144, 168, 0.28);
373
- padding: 6px 8px;
374
- background: rgba(131, 144, 168, 0.12);
375
- }
376
-
377
- .ff-shell__recent-list {
378
- display: grid;
379
- gap: 8px;
380
- }
381
-
382
- .ff-shell__recent-item {
383
- border: 1px solid rgba(131, 144, 168, 0.22);
384
- background: rgba(14, 20, 30, 0.72);
385
- border-radius: 10px;
386
- padding: 9px;
387
- display: grid;
388
- gap: 8px;
389
- }
390
-
391
- .ff-shell__recent-open {
392
- display: flex;
393
- align-items: center;
394
- justify-content: space-between;
395
- gap: 8px;
396
- font-size: 12px;
397
- color: var(--ff-text-primary);
398
- }
399
-
400
- .ff-shell__recent-open span:last-child {
401
- color: var(--ff-text-muted);
402
- font-size: 11px;
403
- white-space: nowrap;
404
- }
405
-
406
- .ff-shell__recent-meta {
407
- display: flex;
408
- flex-wrap: wrap;
409
- gap: 8px;
410
- align-items: center;
411
- font-size: 11px;
412
- color: var(--ff-text-secondary);
413
- }
414
-
415
- .ff-shell__recent-meta button {
416
- margin-left: auto;
417
- min-height: 28px;
418
- color: var(--ff-text-secondary);
419
- border: 1px solid rgba(131, 144, 168, 0.28);
420
- background: rgba(131, 144, 168, 0.12);
421
- border-radius: 8px;
422
- padding: 4px 8px;
423
- font-size: 11px;
424
- }
425
-
426
- .ff-shell__empty {
427
- font-size: 12px;
428
- color: var(--ff-text-muted);
429
- }
430
-
431
- .ff-shell__footer {
432
- display: grid;
433
- gap: 5px;
434
- }
435
-
436
- .ff-shell__footer p {
437
- font-size: 11px;
438
- color: var(--ff-text-muted);
439
- }
440
-
441
- .ff-shell__donate {
442
- margin-top: 4px;
443
- align-self: flex-start;
444
- }
445
-
446
- .ff-shell--recording .ff-shell__card {
447
- border-color: rgba(255, 59, 48, 0.35);
448
- }
449
-
450
- .ff-shell--recording .ff-shell__title::after {
451
- content: '';
452
- display: inline-flex;
453
- margin-left: 8px;
454
- width: 8px;
455
- height: 8px;
456
- border-radius: 999px;
457
- background: var(--ff-live);
458
- box-shadow: 0 0 0 6px var(--ff-live-soft);
459
- animation: ffLivePulse 1.6s ease-in-out infinite;
460
- }
461
-
462
- .ff-shell--complete .ff-shell__card {
463
- border-color: rgba(52, 199, 89, 0.42);
464
- }
465
-
466
- .ff-shell--error .ff-shell__card {
467
- border-color: rgba(255, 59, 48, 0.38);
468
- }
469
-
470
- @keyframes ffLivePulse {
471
- 0%,
472
- 100% {
473
- box-shadow: 0 0 0 0 var(--ff-live-soft);
474
- opacity: 1;
475
- }
476
- 50% {
477
- box-shadow: 0 0 0 8px rgba(255, 59, 48, 0);
478
- opacity: 0.68;
479
- }
480
- }
481
-
482
- @keyframes ffShellIn {
483
- from {
484
- opacity: 0;
485
- transform: translateY(5px);
486
- }
487
- to {
488
- opacity: 1;
489
- transform: translateY(0);
490
- }
491
- }
492
-
493
- @keyframes ffSpinnerSpin {
494
- to {
495
- transform: rotate(360deg);
496
- }
497
- }
498
-
499
- .ff-shell--processing .ff-shell__card::before {
500
- content: '';
501
- display: block;
502
- width: 22px;
503
- height: 22px;
504
- margin: 8px auto;
505
- border: 2.5px solid rgba(123, 138, 166, 0.3);
506
- border-top-color: var(--ff-accent);
507
- border-radius: 50%;
508
- animation: ffSpinnerSpin 0.85s linear infinite;
509
- }
510
-
511
- /* Post-processing progress indicator */
512
- .ff-shell__processing {
513
- border-radius: 12px;
514
- padding: 14px;
515
- border: 1px solid rgba(10, 132, 255, 0.32);
516
- background: rgba(10, 132, 255, 0.1);
517
- display: grid;
518
- gap: 10px;
519
- }
520
-
521
- .ff-shell__processing-label {
522
- font-size: 14px;
523
- font-weight: 600;
524
- color: var(--ff-text-primary);
525
- text-align: center;
526
- display: inline-flex;
527
- align-items: center;
528
- justify-content: center;
529
- gap: 6px;
530
- }
531
-
532
- .ff-shell__processing-dots {
533
- display: inline-flex;
534
- align-items: center;
535
- justify-content: flex-start;
536
- min-width: 28px;
537
- font-family: 'SF Mono', 'Menlo', monospace;
538
- letter-spacing: 0.08em;
539
- color: rgba(219, 234, 255, 0.9);
540
- opacity: 0.92;
541
- }
542
-
543
- .ff-shell__processing-bar-track {
544
- height: 7px;
545
- border-radius: 3px;
546
- background: rgba(10, 132, 255, 0.18);
547
- overflow: hidden;
548
- }
549
-
550
- .ff-shell__processing-bar-fill {
551
- position: relative;
552
- height: 100%;
553
- border-radius: 3px;
554
- background: linear-gradient(90deg, #0a84ff 0%, #4ab0ff 100%);
555
- transition: width 860ms cubic-bezier(0.19, 0.91, 0.21, 1);
556
- min-width: 0;
557
- }
558
-
559
- .ff-shell__processing-bar-fill::after {
560
- content: '';
561
- position: absolute;
562
- inset: 0;
563
- background: linear-gradient(
564
- 100deg,
565
- rgba(255, 255, 255, 0) 0%,
566
- rgba(255, 255, 255, 0.26) 45%,
567
- rgba(255, 255, 255, 0) 100%
568
- );
569
- transform: translateX(-140%);
570
- animation: ffProcessSweep 1.5s linear infinite;
571
- }
572
-
573
- .ff-shell__processing-info {
574
- display: flex;
575
- align-items: center;
576
- justify-content: space-between;
577
- gap: 8px;
578
- }
579
-
580
- .ff-shell__processing-percent {
581
- font-size: 13px;
582
- font-weight: 600;
583
- color: var(--ff-accent);
584
- font-variant-numeric: tabular-nums;
585
- min-width: 36px;
586
- }
587
-
588
- .ff-shell__processing-step {
589
- font-size: 12px;
590
- color: var(--ff-text-secondary);
591
- text-align: right;
592
- flex: 1;
593
- }
594
-
595
- .ff-shell__error-guidance {
596
- margin-top: 8px;
597
- font-size: 11px;
598
- color: var(--ff-text-muted);
599
- line-height: 1.45;
600
- }
601
-
602
- .ff-shell__error-retry {
603
- margin-top: 10px;
604
- padding: 8px 13px;
605
- font-size: 12px;
606
- font-weight: 600;
607
- color: #ff9a92;
608
- background: rgba(255, 59, 48, 0.1);
609
- border: 1px solid rgba(255, 59, 48, 0.3);
610
- border-radius: 10px;
611
- cursor: pointer;
612
- transition: background 140ms ease, border-color 140ms ease;
613
- }
614
-
615
- .ff-shell__error-retry:hover {
616
- background: rgba(255, 59, 48, 0.17);
617
- border-color: rgba(255, 59, 48, 0.4);
618
- }
619
-
620
- @keyframes ffProcessSweep {
621
- to {
622
- transform: translateX(140%);
623
- }
624
- }
625
-
626
- :focus-visible {
627
- outline: 2px solid var(--ff-accent);
628
- outline-offset: 2px;
629
- }
630
-
631
- @media (max-width: 520px) {
632
- .ff-shell {
633
- padding: 10px;
634
- }
635
-
636
- .ff-shell__card {
637
- padding: 14px;
638
- max-height: calc(100vh - 20px);
639
- }
640
-
641
- .ff-shell__header {
642
- gap: 8px;
643
- }
644
-
645
- .ff-shell__title {
646
- font-size: 22px;
647
- }
648
-
649
- .ff-shell__report-actions button {
650
- flex-basis: 100%;
651
- }
652
- }
653
-
654
- @media (prefers-reduced-motion: reduce) {
655
- *,
656
- *::before,
657
- *::after {
658
- animation-duration: 0.01ms !important;
659
- animation-iteration-count: 1 !important;
660
- transition-duration: 0.01ms !important;
661
- }
662
- }