markupr 2.1.8

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 (299) hide show
  1. package/.claude/commands/review-feedback.md +47 -0
  2. package/.eslintrc.json +35 -0
  3. package/.github/CODEOWNERS +16 -0
  4. package/.github/FUNDING.yml +1 -0
  5. package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
  7. package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
  8. package/.github/dependabot.yml +70 -0
  9. package/.github/workflows/ci.yml +184 -0
  10. package/.github/workflows/deploy-landing.yml +134 -0
  11. package/.github/workflows/nightly.yml +288 -0
  12. package/.github/workflows/release.yml +318 -0
  13. package/CHANGELOG.md +127 -0
  14. package/CLAUDE.md +137 -0
  15. package/CODE_OF_CONDUCT.md +9 -0
  16. package/CONTRIBUTING.md +390 -0
  17. package/LICENSE +21 -0
  18. package/PRODUCT_VISION.md +277 -0
  19. package/README.md +517 -0
  20. package/SECURITY.md +51 -0
  21. package/SIGNING_INSTRUCTIONS.md +284 -0
  22. package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
  23. package/assets/svg-source/dmg-background.svg +70 -0
  24. package/assets/svg-source/icon.svg +20 -0
  25. package/assets/svg-source/tray-icon-processing.svg +7 -0
  26. package/assets/svg-source/tray-icon-recording.svg +7 -0
  27. package/assets/svg-source/tray-icon.svg +6 -0
  28. package/assets/tray-complete.png +0 -0
  29. package/assets/tray-complete@2x.png +0 -0
  30. package/assets/tray-completeTemplate.png +0 -0
  31. package/assets/tray-completeTemplate@2x.png +0 -0
  32. package/assets/tray-error.png +0 -0
  33. package/assets/tray-error@2x.png +0 -0
  34. package/assets/tray-errorTemplate.png +0 -0
  35. package/assets/tray-errorTemplate@2x.png +0 -0
  36. package/assets/tray-icon-processing.png +0 -0
  37. package/assets/tray-icon-processing@2x.png +0 -0
  38. package/assets/tray-icon-processingTemplate.png +0 -0
  39. package/assets/tray-icon-processingTemplate@2x.png +0 -0
  40. package/assets/tray-icon-recording.png +0 -0
  41. package/assets/tray-icon-recording@2x.png +0 -0
  42. package/assets/tray-icon-recordingTemplate.png +0 -0
  43. package/assets/tray-icon-recordingTemplate@2x.png +0 -0
  44. package/assets/tray-icon.png +0 -0
  45. package/assets/tray-icon@2x.png +0 -0
  46. package/assets/tray-iconTemplate.png +0 -0
  47. package/assets/tray-iconTemplate@2x.png +0 -0
  48. package/assets/tray-idle.png +0 -0
  49. package/assets/tray-idle@2x.png +0 -0
  50. package/assets/tray-idleTemplate.png +0 -0
  51. package/assets/tray-idleTemplate@2x.png +0 -0
  52. package/assets/tray-processing-0.png +0 -0
  53. package/assets/tray-processing-0@2x.png +0 -0
  54. package/assets/tray-processing-0Template.png +0 -0
  55. package/assets/tray-processing-0Template@2x.png +0 -0
  56. package/assets/tray-processing-1.png +0 -0
  57. package/assets/tray-processing-1@2x.png +0 -0
  58. package/assets/tray-processing-1Template.png +0 -0
  59. package/assets/tray-processing-1Template@2x.png +0 -0
  60. package/assets/tray-processing-2.png +0 -0
  61. package/assets/tray-processing-2@2x.png +0 -0
  62. package/assets/tray-processing-2Template.png +0 -0
  63. package/assets/tray-processing-2Template@2x.png +0 -0
  64. package/assets/tray-processing-3.png +0 -0
  65. package/assets/tray-processing-3@2x.png +0 -0
  66. package/assets/tray-processing-3Template.png +0 -0
  67. package/assets/tray-processing-3Template@2x.png +0 -0
  68. package/assets/tray-processing.png +0 -0
  69. package/assets/tray-processing@2x.png +0 -0
  70. package/assets/tray-processingTemplate.png +0 -0
  71. package/assets/tray-processingTemplate@2x.png +0 -0
  72. package/assets/tray-recording.png +0 -0
  73. package/assets/tray-recording@2x.png +0 -0
  74. package/assets/tray-recordingTemplate.png +0 -0
  75. package/assets/tray-recordingTemplate@2x.png +0 -0
  76. package/build/DMG_BACKGROUND_SPEC.md +50 -0
  77. package/build/dmg-background.png +0 -0
  78. package/build/dmg-background@2x.png +0 -0
  79. package/build/entitlements.mac.inherit.plist +27 -0
  80. package/build/entitlements.mac.plist +41 -0
  81. package/build/favicon-16.png +0 -0
  82. package/build/favicon-180.png +0 -0
  83. package/build/favicon-192.png +0 -0
  84. package/build/favicon-32.png +0 -0
  85. package/build/favicon-48.png +0 -0
  86. package/build/favicon-512.png +0 -0
  87. package/build/favicon-64.png +0 -0
  88. package/build/icon-128.png +0 -0
  89. package/build/icon-16.png +0 -0
  90. package/build/icon-24.png +0 -0
  91. package/build/icon-256.png +0 -0
  92. package/build/icon-32.png +0 -0
  93. package/build/icon-48.png +0 -0
  94. package/build/icon-64.png +0 -0
  95. package/build/icon.icns +0 -0
  96. package/build/icon.ico +0 -0
  97. package/build/icon.iconset/icon_128x128.png +0 -0
  98. package/build/icon.iconset/icon_128x128@2x.png +0 -0
  99. package/build/icon.iconset/icon_16x16.png +0 -0
  100. package/build/icon.iconset/icon_16x16@2x.png +0 -0
  101. package/build/icon.iconset/icon_256x256.png +0 -0
  102. package/build/icon.iconset/icon_256x256@2x.png +0 -0
  103. package/build/icon.iconset/icon_32x32.png +0 -0
  104. package/build/icon.iconset/icon_32x32@2x.png +0 -0
  105. package/build/icon.iconset/icon_512x512.png +0 -0
  106. package/build/icon.iconset/icon_512x512@2x.png +0 -0
  107. package/build/icon.png +0 -0
  108. package/build/installer-header.bmp +0 -0
  109. package/build/installer-header.png +0 -0
  110. package/build/installer-sidebar.bmp +0 -0
  111. package/build/installer-sidebar.png +0 -0
  112. package/build/installer.nsh +45 -0
  113. package/build/overlay-processing.png +0 -0
  114. package/build/overlay-recording.png +0 -0
  115. package/build/toolbar-record.png +0 -0
  116. package/build/toolbar-screenshot.png +0 -0
  117. package/build/toolbar-settings.png +0 -0
  118. package/build/toolbar-stop.png +0 -0
  119. package/dist/main/index.mjs +12612 -0
  120. package/dist/preload/index.mjs +907 -0
  121. package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
  122. package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
  123. package/dist/renderer/index.html +27 -0
  124. package/docs/AI_AGENT_QUICKSTART.md +42 -0
  125. package/docs/AI_PIPELINE_DESIGN.md +595 -0
  126. package/docs/API.md +514 -0
  127. package/docs/ARCHITECTURE.md +460 -0
  128. package/docs/CONFIGURATION.md +336 -0
  129. package/docs/DEVELOPMENT.md +508 -0
  130. package/docs/EXPORT_FORMATS.md +451 -0
  131. package/docs/GETTING_STARTED.md +236 -0
  132. package/docs/KEYBOARD_SHORTCUTS.md +334 -0
  133. package/docs/TROUBLESHOOTING.md +418 -0
  134. package/docs/landing/index.html +672 -0
  135. package/docs/landing/script.js +342 -0
  136. package/docs/landing/styles.css +1543 -0
  137. package/electron-builder.yml +140 -0
  138. package/electron.vite.config.ts +63 -0
  139. package/package.json +108 -0
  140. package/railway.json +12 -0
  141. package/scripts/build.mjs +51 -0
  142. package/scripts/generate-icons.mjs +314 -0
  143. package/scripts/generate-installer-images.cjs +253 -0
  144. package/scripts/generate-tray-icons.mjs +258 -0
  145. package/scripts/notarize.cjs +180 -0
  146. package/scripts/one-click-clean-test.sh +147 -0
  147. package/scripts/postinstall.mjs +36 -0
  148. package/scripts/setup-markupr.sh +55 -0
  149. package/setup +17 -0
  150. package/site/index.html +1835 -0
  151. package/site/package.json +11 -0
  152. package/site/railway.json +12 -0
  153. package/site/server.js +31 -0
  154. package/src/main/AutoUpdater.ts +392 -0
  155. package/src/main/CrashRecovery.ts +655 -0
  156. package/src/main/ErrorHandler.ts +703 -0
  157. package/src/main/HotkeyManager.ts +399 -0
  158. package/src/main/MenuManager.ts +529 -0
  159. package/src/main/PermissionManager.ts +420 -0
  160. package/src/main/SessionController.ts +1465 -0
  161. package/src/main/TrayManager.ts +540 -0
  162. package/src/main/ai/AIPipelineManager.ts +199 -0
  163. package/src/main/ai/ClaudeAnalyzer.ts +339 -0
  164. package/src/main/ai/ImageOptimizer.ts +176 -0
  165. package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
  166. package/src/main/ai/index.ts +16 -0
  167. package/src/main/ai/types.ts +258 -0
  168. package/src/main/analysis/ClarificationGenerator.ts +385 -0
  169. package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
  170. package/src/main/analysis/index.ts +19 -0
  171. package/src/main/audio/AudioCapture.ts +978 -0
  172. package/src/main/audio/audioUtils.ts +100 -0
  173. package/src/main/audio/index.ts +20 -0
  174. package/src/main/capture/index.ts +1 -0
  175. package/src/main/index.ts +1693 -0
  176. package/src/main/ipc/captureHandlers.ts +272 -0
  177. package/src/main/ipc/index.ts +45 -0
  178. package/src/main/ipc/outputHandlers.ts +302 -0
  179. package/src/main/ipc/sessionHandlers.ts +56 -0
  180. package/src/main/ipc/settingsHandlers.ts +471 -0
  181. package/src/main/ipc/types.ts +56 -0
  182. package/src/main/ipc/windowHandlers.ts +277 -0
  183. package/src/main/output/ClipboardService.ts +369 -0
  184. package/src/main/output/ExportService.ts +539 -0
  185. package/src/main/output/FileManager.ts +416 -0
  186. package/src/main/output/MarkdownGenerator.ts +791 -0
  187. package/src/main/output/MarkdownPatcher.ts +299 -0
  188. package/src/main/output/index.ts +186 -0
  189. package/src/main/output/sessionAdapter.ts +207 -0
  190. package/src/main/output/templates/html-template.ts +553 -0
  191. package/src/main/pipeline/FrameExtractor.ts +330 -0
  192. package/src/main/pipeline/PostProcessor.ts +399 -0
  193. package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
  194. package/src/main/pipeline/index.ts +36 -0
  195. package/src/main/platform/WindowsTaskbar.ts +600 -0
  196. package/src/main/platform/index.ts +16 -0
  197. package/src/main/settings/SettingsManager.ts +730 -0
  198. package/src/main/settings/index.ts +19 -0
  199. package/src/main/transcription/ModelDownloadManager.ts +494 -0
  200. package/src/main/transcription/TierManager.ts +219 -0
  201. package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
  202. package/src/main/transcription/WhisperService.ts +748 -0
  203. package/src/main/transcription/index.ts +56 -0
  204. package/src/main/transcription/types.ts +135 -0
  205. package/src/main/windows/PopoverManager.ts +284 -0
  206. package/src/main/windows/TaskbarIntegration.ts +452 -0
  207. package/src/main/windows/index.ts +23 -0
  208. package/src/preload/index.ts +1047 -0
  209. package/src/renderer/App.tsx +515 -0
  210. package/src/renderer/AppWrapper.tsx +28 -0
  211. package/src/renderer/assets/logo-dark.svg +7 -0
  212. package/src/renderer/assets/logo.svg +7 -0
  213. package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
  214. package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
  215. package/src/renderer/components/AnnotationOverlay.tsx +836 -0
  216. package/src/renderer/components/AudioWaveform.tsx +811 -0
  217. package/src/renderer/components/ClarificationQuestions.tsx +656 -0
  218. package/src/renderer/components/CountdownTimer.tsx +495 -0
  219. package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
  220. package/src/renderer/components/DonateButton.tsx +127 -0
  221. package/src/renderer/components/ErrorBoundary.tsx +308 -0
  222. package/src/renderer/components/ExportDialog.tsx +872 -0
  223. package/src/renderer/components/HotkeyHint.tsx +261 -0
  224. package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
  225. package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
  226. package/src/renderer/components/Onboarding.tsx +1830 -0
  227. package/src/renderer/components/ProcessingOverlay.tsx +157 -0
  228. package/src/renderer/components/RecordingOverlay.tsx +423 -0
  229. package/src/renderer/components/SessionHistory.tsx +1746 -0
  230. package/src/renderer/components/SessionReview.tsx +1321 -0
  231. package/src/renderer/components/SettingsPanel.tsx +217 -0
  232. package/src/renderer/components/Skeleton.tsx +347 -0
  233. package/src/renderer/components/StatusIndicator.tsx +86 -0
  234. package/src/renderer/components/ThemeProvider.tsx +429 -0
  235. package/src/renderer/components/Tooltip.tsx +370 -0
  236. package/src/renderer/components/TranscriptionPreview.tsx +183 -0
  237. package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
  238. package/src/renderer/components/UpdateNotification.tsx +377 -0
  239. package/src/renderer/components/WindowSelector.tsx +947 -0
  240. package/src/renderer/components/index.ts +99 -0
  241. package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
  242. package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
  243. package/src/renderer/components/primitives/DangerButton.tsx +45 -0
  244. package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
  245. package/src/renderer/components/primitives/Dropdown.tsx +34 -0
  246. package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
  247. package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
  248. package/src/renderer/components/primitives/Slider.tsx +43 -0
  249. package/src/renderer/components/primitives/Toggle.tsx +36 -0
  250. package/src/renderer/components/primitives/index.ts +10 -0
  251. package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
  252. package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
  253. package/src/renderer/components/settings/GeneralTab.tsx +40 -0
  254. package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
  255. package/src/renderer/components/settings/RecordingTab.tsx +84 -0
  256. package/src/renderer/components/settings/index.ts +9 -0
  257. package/src/renderer/components/settings/settingsStyles.ts +673 -0
  258. package/src/renderer/components/settings/tabConfig.tsx +85 -0
  259. package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
  260. package/src/renderer/contexts/ProcessingContext.tsx +227 -0
  261. package/src/renderer/contexts/RecordingContext.tsx +683 -0
  262. package/src/renderer/contexts/UIContext.tsx +326 -0
  263. package/src/renderer/contexts/index.ts +24 -0
  264. package/src/renderer/donateMessages.ts +69 -0
  265. package/src/renderer/hooks/index.ts +75 -0
  266. package/src/renderer/hooks/useAnimation.tsx +544 -0
  267. package/src/renderer/hooks/useTheme.ts +313 -0
  268. package/src/renderer/index.html +26 -0
  269. package/src/renderer/main.tsx +52 -0
  270. package/src/renderer/styles/animations.css +1093 -0
  271. package/src/renderer/styles/app-shell.css +662 -0
  272. package/src/renderer/styles/globals.css +515 -0
  273. package/src/renderer/styles/theme.ts +578 -0
  274. package/src/renderer/types/electron.d.ts +385 -0
  275. package/src/shared/hotkeys.ts +283 -0
  276. package/src/shared/types.ts +809 -0
  277. package/tests/clipboard.test.ts +228 -0
  278. package/tests/e2e/criticalPaths.test.ts +594 -0
  279. package/tests/feedbackAnalyzer.test.ts +303 -0
  280. package/tests/integration/sessionFlow.test.ts +583 -0
  281. package/tests/markdownGenerator.test.ts +418 -0
  282. package/tests/output.test.ts +96 -0
  283. package/tests/setup.ts +486 -0
  284. package/tests/unit/appIntegration.test.ts +676 -0
  285. package/tests/unit/appViewState.test.ts +281 -0
  286. package/tests/unit/audioIpcChannels.test.ts +17 -0
  287. package/tests/unit/exportService.test.ts +492 -0
  288. package/tests/unit/hotkeys.test.ts +92 -0
  289. package/tests/unit/navigationPreload.test.ts +94 -0
  290. package/tests/unit/onboardingFlow.test.ts +345 -0
  291. package/tests/unit/permissionManager.test.ts +175 -0
  292. package/tests/unit/permissionManagerExpanded.test.ts +296 -0
  293. package/tests/unit/screenRecordingRenderer.test.ts +368 -0
  294. package/tests/unit/sessionController.test.ts +515 -0
  295. package/tests/unit/tierManager.test.ts +61 -0
  296. package/tests/unit/tierManagerExpanded.test.ts +142 -0
  297. package/tests/unit/transcriptAnalyzer.test.ts +64 -0
  298. package/tsconfig.json +25 -0
  299. package/vitest.config.ts +46 -0
@@ -0,0 +1,673 @@
1
+ /**
2
+ * Settings Panel Styles
3
+ *
4
+ * Shared style definitions used across all settings primitives and tab components.
5
+ */
6
+
7
+ import type React from 'react';
8
+
9
+ export type ExtendedCSSProperties = React.CSSProperties & {
10
+ WebkitAppRegion?: 'drag' | 'no-drag';
11
+ };
12
+
13
+ export const styles: Record<string, ExtendedCSSProperties> = {
14
+ // Overlay & Panel
15
+ overlay: {
16
+ position: 'fixed',
17
+ inset: 0,
18
+ display: 'flex',
19
+ alignItems: 'center',
20
+ justifyContent: 'center',
21
+ zIndex: 100,
22
+ padding: 12,
23
+ },
24
+
25
+ backdrop: {
26
+ position: 'absolute',
27
+ inset: 0,
28
+ backgroundColor: 'rgba(5, 8, 15, 0.44)',
29
+ backdropFilter: 'blur(8px)',
30
+ WebkitBackdropFilter: 'blur(8px)',
31
+ },
32
+
33
+ panel: {
34
+ position: 'relative',
35
+ width: '100%',
36
+ maxWidth: 940,
37
+ maxHeight: '92vh',
38
+ backgroundColor: 'rgba(14, 19, 29, 0.92)',
39
+ borderRadius: 16,
40
+ boxShadow: '0 24px 56px rgba(2, 6, 14, 0.62), 0 0 0 1px rgba(145, 160, 186, 0.24)',
41
+ display: 'flex',
42
+ flexDirection: 'column',
43
+ overflow: 'hidden',
44
+ transition: 'opacity 0.3s ease, transform 0.3s ease',
45
+ WebkitAppRegion: 'no-drag',
46
+ },
47
+
48
+ // Header
49
+ header: {
50
+ display: 'flex',
51
+ alignItems: 'center',
52
+ justifyContent: 'space-between',
53
+ padding: '20px 24px',
54
+ borderBottom: '1px solid rgba(145, 160, 186, 0.24)',
55
+ WebkitAppRegion: 'drag',
56
+ },
57
+
58
+ headerTitle: {
59
+ fontSize: 18,
60
+ fontWeight: 600,
61
+ color: 'var(--text-primary)',
62
+ margin: 0,
63
+ },
64
+
65
+ headerTitleWrap: {
66
+ display: 'flex',
67
+ alignItems: 'center',
68
+ gap: 10,
69
+ },
70
+
71
+ byokBadge: {
72
+ border: '1px solid rgba(245, 158, 11, 0.4)',
73
+ backgroundColor: 'rgba(245, 158, 11, 0.16)',
74
+ color: 'var(--status-warning)',
75
+ fontSize: 11,
76
+ fontWeight: 600,
77
+ borderRadius: 999,
78
+ padding: '4px 10px',
79
+ cursor: 'pointer',
80
+ whiteSpace: 'nowrap',
81
+ },
82
+
83
+ closeButton: {
84
+ width: 32,
85
+ height: 32,
86
+ display: 'flex',
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ backgroundColor: 'transparent',
90
+ border: 'none',
91
+ borderRadius: 8,
92
+ color: 'var(--text-tertiary)',
93
+ cursor: 'pointer',
94
+ transition: 'all 0.2s ease',
95
+ WebkitAppRegion: 'no-drag',
96
+ },
97
+
98
+ // Content
99
+ content: {
100
+ display: 'flex',
101
+ flex: 1,
102
+ overflow: 'hidden',
103
+ minHeight: 0,
104
+ },
105
+
106
+ // Sidebar
107
+ sidebar: {
108
+ width: 200,
109
+ padding: '16px 12px',
110
+ borderRight: '1px solid rgba(145, 160, 186, 0.2)',
111
+ display: 'flex',
112
+ flexDirection: 'column',
113
+ gap: 4,
114
+ flexShrink: 0,
115
+ },
116
+
117
+ sidebarCompact: {
118
+ width: '100%',
119
+ borderRight: 'none',
120
+ borderBottom: '1px solid rgba(145, 160, 186, 0.24)',
121
+ flexDirection: 'row',
122
+ flexWrap: 'wrap',
123
+ gap: 6,
124
+ padding: '12px',
125
+ },
126
+
127
+ tabButton: {
128
+ display: 'flex',
129
+ alignItems: 'center',
130
+ gap: 10,
131
+ width: '100%',
132
+ padding: '10px 12px',
133
+ backgroundColor: 'transparent',
134
+ border: '1px solid transparent',
135
+ borderRadius: 8,
136
+ color: 'var(--text-tertiary)',
137
+ fontSize: 14,
138
+ fontWeight: 500,
139
+ cursor: 'pointer',
140
+ transition: 'all 0.15s ease',
141
+ textAlign: 'left',
142
+ },
143
+
144
+ tabButtonCompact: {
145
+ width: 'auto',
146
+ flex: '1 1 calc(50% - 6px)',
147
+ justifyContent: 'center',
148
+ },
149
+
150
+ tabLabel: {
151
+ flex: 1,
152
+ },
153
+
154
+ // Tab Panel
155
+ tabPanel: {
156
+ flex: 1,
157
+ overflow: 'auto',
158
+ padding: 24,
159
+ minHeight: 0,
160
+ },
161
+
162
+ tabPanelCompact: {
163
+ padding: 16,
164
+ },
165
+
166
+ tabContent: {
167
+ display: 'flex',
168
+ flexDirection: 'column',
169
+ gap: 32,
170
+ },
171
+
172
+ // Section
173
+ section: {
174
+ display: 'flex',
175
+ flexDirection: 'column',
176
+ gap: 16,
177
+ },
178
+
179
+ sectionHeader: {
180
+ display: 'flex',
181
+ justifyContent: 'space-between',
182
+ alignItems: 'flex-start',
183
+ gap: 12,
184
+ },
185
+
186
+ sectionTitle: {
187
+ fontSize: 14,
188
+ fontWeight: 600,
189
+ color: 'var(--text-secondary)',
190
+ margin: 0,
191
+ textTransform: 'uppercase',
192
+ letterSpacing: '0.05em',
193
+ },
194
+
195
+ sectionDescription: {
196
+ fontSize: 13,
197
+ color: 'var(--text-tertiary)',
198
+ marginTop: 2,
199
+ },
200
+
201
+ sectionContent: {
202
+ display: 'flex',
203
+ flexDirection: 'column',
204
+ gap: 12,
205
+ backgroundColor: 'rgba(18, 25, 37, 0.82)',
206
+ borderRadius: 12,
207
+ padding: 16,
208
+ border: '1px solid rgba(145, 160, 186, 0.2)',
209
+ },
210
+
211
+ resetSectionButton: {
212
+ width: 28,
213
+ height: 28,
214
+ display: 'flex',
215
+ alignItems: 'center',
216
+ justifyContent: 'center',
217
+ backgroundColor: 'transparent',
218
+ border: '1px solid rgba(145, 160, 186, 0.34)',
219
+ borderRadius: 6,
220
+ color: 'var(--text-tertiary)',
221
+ cursor: 'pointer',
222
+ transition: 'all 0.15s ease',
223
+ flexShrink: 0,
224
+ },
225
+
226
+ // Setting Row
227
+ settingRow: {
228
+ display: 'flex',
229
+ alignItems: 'flex-start',
230
+ justifyContent: 'space-between',
231
+ gap: 16,
232
+ minHeight: 40,
233
+ flexWrap: 'wrap',
234
+ },
235
+
236
+ settingRowVertical: {
237
+ display: 'flex',
238
+ flexDirection: 'column',
239
+ gap: 12,
240
+ },
241
+
242
+ settingInfo: {
243
+ display: 'flex',
244
+ flexDirection: 'column',
245
+ gap: 2,
246
+ flex: 1,
247
+ },
248
+
249
+ settingLabel: {
250
+ fontSize: 14,
251
+ fontWeight: 500,
252
+ color: 'var(--text-primary)',
253
+ },
254
+
255
+ settingDescription: {
256
+ fontSize: 12,
257
+ color: 'var(--text-tertiary)',
258
+ lineHeight: 1.4,
259
+ },
260
+
261
+ // Toggle
262
+ toggle: {
263
+ width: 44,
264
+ height: 24,
265
+ borderRadius: 12,
266
+ border: 'none',
267
+ padding: 0,
268
+ cursor: 'pointer',
269
+ transition: 'background-color 0.2s ease',
270
+ position: 'relative',
271
+ flexShrink: 0,
272
+ },
273
+
274
+ toggleKnob: {
275
+ position: 'absolute',
276
+ top: 2,
277
+ width: 20,
278
+ height: 20,
279
+ borderRadius: '50%',
280
+ backgroundColor: 'var(--text-inverse)',
281
+ boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',
282
+ transition: 'transform 0.2s ease',
283
+ },
284
+
285
+ // Select
286
+ select: {
287
+ minWidth: 180,
288
+ padding: '8px 12px',
289
+ backgroundColor: 'rgba(12, 18, 29, 0.84)',
290
+ border: '1px solid rgba(145, 160, 186, 0.34)',
291
+ borderRadius: 8,
292
+ color: 'var(--text-primary)',
293
+ fontSize: 13,
294
+ cursor: 'pointer',
295
+ transition: 'border-color 0.2s ease',
296
+ maxWidth: '100%',
297
+ },
298
+
299
+ // Slider
300
+ sliderContainer: {
301
+ display: 'flex',
302
+ alignItems: 'center',
303
+ gap: 12,
304
+ minWidth: 220,
305
+ maxWidth: 320,
306
+ width: '100%',
307
+ },
308
+
309
+ sliderValue: {
310
+ fontSize: 13,
311
+ fontWeight: 500,
312
+ color: 'var(--text-link)',
313
+ minWidth: 48,
314
+ textAlign: 'right',
315
+ fontVariantNumeric: 'tabular-nums',
316
+ },
317
+
318
+ slider: {
319
+ width: 120,
320
+ height: 4,
321
+ borderRadius: 2,
322
+ backgroundColor: 'rgba(124, 137, 160, 0.42)',
323
+ cursor: 'pointer',
324
+ },
325
+
326
+ // Directory Picker
327
+ directoryPicker: {
328
+ display: 'flex',
329
+ gap: 8,
330
+ minWidth: 0,
331
+ width: '100%',
332
+ },
333
+
334
+ directoryInput: {
335
+ flex: 1,
336
+ padding: '8px 12px',
337
+ backgroundColor: 'rgba(12, 18, 29, 0.84)',
338
+ border: '1px solid rgba(145, 160, 186, 0.34)',
339
+ borderRadius: 8,
340
+ color: 'var(--text-primary)',
341
+ fontSize: 13,
342
+ overflow: 'hidden',
343
+ textOverflow: 'ellipsis',
344
+ whiteSpace: 'nowrap',
345
+ minWidth: 0,
346
+ },
347
+
348
+ browseButton: {
349
+ padding: '8px 12px',
350
+ backgroundColor: 'rgba(124, 137, 160, 0.14)',
351
+ border: '1px solid rgba(145, 160, 186, 0.34)',
352
+ borderRadius: 8,
353
+ color: 'var(--text-primary)',
354
+ fontSize: 13,
355
+ fontWeight: 500,
356
+ cursor: 'pointer',
357
+ transition: 'all 0.15s ease',
358
+ whiteSpace: 'nowrap',
359
+ },
360
+
361
+ // Key Recorder
362
+ keyRecorder: {
363
+ minWidth: 140,
364
+ padding: '8px 12px',
365
+ backgroundColor: 'rgba(12, 18, 29, 0.84)',
366
+ border: '1px solid rgba(145, 160, 186, 0.34)',
367
+ borderRadius: 8,
368
+ color: 'var(--text-primary)',
369
+ fontSize: 13,
370
+ cursor: 'pointer',
371
+ transition: 'all 0.15s ease',
372
+ display: 'flex',
373
+ alignItems: 'center',
374
+ justifyContent: 'center',
375
+ },
376
+
377
+ keyRecorderRecording: {
378
+ color: 'var(--text-link)',
379
+ animation: 'pulse 1s ease-in-out infinite',
380
+ },
381
+
382
+ keyRecorderValue: {
383
+ fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace',
384
+ fontSize: 12,
385
+ },
386
+
387
+ conflictWarning: {
388
+ display: 'flex',
389
+ alignItems: 'center',
390
+ gap: 6,
391
+ color: 'var(--status-warning)',
392
+ fontSize: 12,
393
+ marginTop: 4,
394
+ },
395
+
396
+ // Color Picker
397
+ colorPickerContainer: {
398
+ display: 'flex',
399
+ flexWrap: 'wrap',
400
+ gap: 8,
401
+ alignItems: 'center',
402
+ },
403
+
404
+ colorSwatch: {
405
+ width: 32,
406
+ height: 32,
407
+ borderRadius: '50%',
408
+ border: 'none',
409
+ cursor: 'pointer',
410
+ transition: 'all 0.15s ease',
411
+ },
412
+
413
+ customColorContainer: {
414
+ display: 'flex',
415
+ flexDirection: 'column',
416
+ alignItems: 'center',
417
+ gap: 4,
418
+ marginLeft: 8,
419
+ },
420
+
421
+ customColorInput: {
422
+ width: 32,
423
+ height: 32,
424
+ borderRadius: '50%',
425
+ border: '2px solid rgba(145, 160, 186, 0.34)',
426
+ backgroundColor: 'transparent',
427
+ cursor: 'pointer',
428
+ },
429
+
430
+ customColorLabel: {
431
+ fontSize: 10,
432
+ color: 'var(--text-tertiary)',
433
+ },
434
+
435
+ // API Key
436
+ apiKeyContainer: {
437
+ display: 'flex',
438
+ gap: 8,
439
+ flexWrap: 'wrap',
440
+ },
441
+
442
+ apiKeyInputWrapper: {
443
+ flex: 1,
444
+ position: 'relative',
445
+ display: 'flex',
446
+ alignItems: 'center',
447
+ },
448
+
449
+ apiKeyInput: {
450
+ width: '100%',
451
+ padding: '10px 40px 10px 12px',
452
+ backgroundColor: 'rgba(12, 18, 29, 0.84)',
453
+ border: '1px solid rgba(145, 160, 186, 0.34)',
454
+ borderRadius: 8,
455
+ color: 'var(--text-primary)',
456
+ fontSize: 13,
457
+ transition: 'border-color 0.2s ease',
458
+ },
459
+
460
+ apiKeyVisibilityButton: {
461
+ position: 'absolute',
462
+ right: 8,
463
+ width: 28,
464
+ height: 28,
465
+ display: 'flex',
466
+ alignItems: 'center',
467
+ justifyContent: 'center',
468
+ backgroundColor: 'transparent',
469
+ border: 'none',
470
+ borderRadius: 4,
471
+ color: 'var(--text-tertiary)',
472
+ cursor: 'pointer',
473
+ transition: 'color 0.15s ease',
474
+ },
475
+
476
+ apiKeyTestButton: {
477
+ display: 'flex',
478
+ alignItems: 'center',
479
+ gap: 6,
480
+ padding: '10px 16px',
481
+ backgroundColor: 'var(--accent-default)',
482
+ border: 'none',
483
+ borderRadius: 8,
484
+ color: 'var(--text-inverse)',
485
+ fontSize: 13,
486
+ fontWeight: 500,
487
+ cursor: 'pointer',
488
+ transition: 'all 0.15s ease',
489
+ whiteSpace: 'nowrap',
490
+ },
491
+
492
+ apiKeyError: {
493
+ display: 'block',
494
+ fontSize: 12,
495
+ color: 'var(--status-error)',
496
+ marginTop: 4,
497
+ },
498
+
499
+ apiKeySuccess: {
500
+ display: 'block',
501
+ fontSize: 12,
502
+ color: 'var(--status-success)',
503
+ marginTop: 4,
504
+ },
505
+
506
+ // Service Info
507
+ serviceInfo: {
508
+ display: 'flex',
509
+ alignItems: 'flex-start',
510
+ gap: 12,
511
+ padding: 12,
512
+ backgroundColor: 'rgba(10, 132, 255, 0.08)',
513
+ borderRadius: 8,
514
+ border: '1px solid rgba(59, 130, 246, 0.2)',
515
+ marginBottom: 12,
516
+ },
517
+
518
+ serviceName: {
519
+ display: 'block',
520
+ fontSize: 14,
521
+ fontWeight: 600,
522
+ color: 'var(--text-primary)',
523
+ },
524
+
525
+ serviceDescription: {
526
+ display: 'block',
527
+ fontSize: 12,
528
+ color: 'var(--text-secondary)',
529
+ marginTop: 2,
530
+ lineHeight: 1.4,
531
+ },
532
+
533
+ // Buttons
534
+ secondaryButton: {
535
+ padding: '8px 16px',
536
+ backgroundColor: 'rgba(124, 137, 160, 0.14)',
537
+ border: '1px solid rgba(145, 160, 186, 0.34)',
538
+ borderRadius: 8,
539
+ color: 'var(--text-primary)',
540
+ fontSize: 13,
541
+ fontWeight: 500,
542
+ cursor: 'pointer',
543
+ transition: 'all 0.15s ease',
544
+ },
545
+
546
+ dangerButton: {
547
+ padding: '8px 16px',
548
+ backgroundColor: 'rgba(239, 68, 68, 0.1)',
549
+ border: '1px solid rgba(239, 68, 68, 0.3)',
550
+ borderRadius: 8,
551
+ color: 'var(--status-error)',
552
+ fontSize: 13,
553
+ fontWeight: 500,
554
+ cursor: 'pointer',
555
+ transition: 'all 0.15s ease',
556
+ },
557
+
558
+ // Theme Preview
559
+ themePreview: {
560
+ padding: 16,
561
+ backgroundColor: 'rgba(118, 118, 128, 0.09)',
562
+ borderRadius: 8,
563
+ },
564
+
565
+ previewCard: {
566
+ padding: 16,
567
+ borderRadius: 12,
568
+ border: '1px solid',
569
+ transition: 'all 0.2s ease',
570
+ },
571
+
572
+ previewHeader: {
573
+ display: 'flex',
574
+ alignItems: 'center',
575
+ gap: 10,
576
+ marginBottom: 16,
577
+ },
578
+
579
+ previewDot: {
580
+ width: 10,
581
+ height: 10,
582
+ borderRadius: '50%',
583
+ transition: 'background-color 0.2s ease',
584
+ },
585
+
586
+ previewTitle: {
587
+ fontSize: 14,
588
+ fontWeight: 500,
589
+ transition: 'color 0.2s ease',
590
+ },
591
+
592
+ previewButton: {
593
+ width: '100%',
594
+ padding: '10px 16px',
595
+ borderRadius: 8,
596
+ border: 'none',
597
+ color: 'var(--text-inverse)',
598
+ fontSize: 13,
599
+ fontWeight: 600,
600
+ cursor: 'default',
601
+ transition: 'background-color 0.2s ease',
602
+ },
603
+
604
+ // Hotkey Reference
605
+ hotkeyReference: {
606
+ display: 'flex',
607
+ flexDirection: 'column',
608
+ gap: 12,
609
+ padding: 4,
610
+ },
611
+
612
+ hotkeyRefItem: {
613
+ display: 'flex',
614
+ alignItems: 'center',
615
+ justifyContent: 'space-between',
616
+ },
617
+
618
+ hotkeyRefLabel: {
619
+ fontSize: 13,
620
+ color: 'var(--text-secondary)',
621
+ },
622
+
623
+ // Footer
624
+ footer: {
625
+ display: 'flex',
626
+ alignItems: 'center',
627
+ justifyContent: 'space-between',
628
+ padding: '16px 24px',
629
+ borderTop: '1px solid rgba(145, 160, 186, 0.24)',
630
+ backgroundColor: 'rgba(14, 19, 29, 0.88)',
631
+ flexWrap: 'wrap',
632
+ gap: 10,
633
+ },
634
+
635
+ footerLeft: {
636
+ display: 'flex',
637
+ alignItems: 'center',
638
+ gap: 16,
639
+ flexWrap: 'wrap',
640
+ },
641
+
642
+ footerText: {
643
+ fontSize: 12,
644
+ color: 'var(--text-tertiary)',
645
+ },
646
+
647
+ savedIndicator: {
648
+ marginLeft: 8,
649
+ color: 'var(--status-success)',
650
+ },
651
+
652
+ resetAllButton: {
653
+ padding: '8px 16px',
654
+ backgroundColor: 'transparent',
655
+ border: '1px solid rgba(145, 160, 186, 0.34)',
656
+ borderRadius: 8,
657
+ color: 'var(--text-secondary)',
658
+ fontSize: 12,
659
+ fontWeight: 500,
660
+ cursor: 'pointer',
661
+ transition: 'all 0.15s ease',
662
+ },
663
+
664
+ // Spinner
665
+ spinner: {
666
+ width: 14,
667
+ height: 14,
668
+ border: '2px solid rgba(255, 255, 255, 0.3)',
669
+ borderTopColor: 'var(--text-inverse)',
670
+ borderRadius: '50%',
671
+ animation: 'spin 0.8s linear infinite',
672
+ },
673
+ };