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,1543 @@
1
+ /* markupr Landing Page Styles */
2
+
3
+ /* ============================================
4
+ CSS Custom Properties (Design Tokens)
5
+ ============================================ */
6
+ :root {
7
+ /* Colors */
8
+ --bg-primary: #0F0F1A;
9
+ --bg-secondary: #1A1A2E;
10
+ --bg-tertiary: #16213E;
11
+ --bg-card: #1E1E32;
12
+ --bg-card-hover: #252540;
13
+
14
+ --primary: #6366F1;
15
+ --primary-light: #818CF8;
16
+ --primary-dark: #4F46E5;
17
+ --secondary: #8B5CF6;
18
+ --secondary-light: #A78BFA;
19
+ --accent: #EC4899;
20
+ --accent-light: #F472B6;
21
+
22
+ --text-primary: #E2E8F0;
23
+ --text-secondary: #94A3B8;
24
+ --text-muted: #64748B;
25
+
26
+ --border: #334155;
27
+ --border-light: #475569;
28
+
29
+ --success: #10B981;
30
+ --warning: #F59E0B;
31
+ --error: #EF4444;
32
+
33
+ /* Gradients */
34
+ --gradient-primary: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
35
+ --gradient-accent: linear-gradient(135deg, var(--accent) 0%, var(--secondary) 100%);
36
+ --gradient-glow: radial-gradient(ellipse at center, rgba(99, 102, 241, 0.15) 0%, transparent 70%);
37
+
38
+ /* Spacing */
39
+ --space-xs: 0.25rem;
40
+ --space-sm: 0.5rem;
41
+ --space-md: 1rem;
42
+ --space-lg: 1.5rem;
43
+ --space-xl: 2rem;
44
+ --space-2xl: 3rem;
45
+ --space-3xl: 4rem;
46
+ --space-4xl: 6rem;
47
+
48
+ /* Typography */
49
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
50
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
51
+
52
+ /* Border Radius */
53
+ --radius-sm: 0.375rem;
54
+ --radius-md: 0.5rem;
55
+ --radius-lg: 0.75rem;
56
+ --radius-xl: 1rem;
57
+ --radius-2xl: 1.5rem;
58
+ --radius-full: 9999px;
59
+
60
+ /* Shadows */
61
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
62
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
63
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
64
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
65
+ --shadow-glow: 0 0 40px rgba(99, 102, 241, 0.3);
66
+
67
+ /* Transitions */
68
+ --transition-fast: 150ms ease;
69
+ --transition-base: 200ms ease;
70
+ --transition-slow: 300ms ease;
71
+
72
+ /* Z-index layers */
73
+ --z-dropdown: 100;
74
+ --z-sticky: 200;
75
+ --z-fixed: 300;
76
+ --z-modal: 400;
77
+ --z-tooltip: 500;
78
+ }
79
+
80
+ /* ============================================
81
+ Base & Reset
82
+ ============================================ */
83
+ *, *::before, *::after {
84
+ margin: 0;
85
+ padding: 0;
86
+ box-sizing: border-box;
87
+ }
88
+
89
+ html {
90
+ scroll-behavior: smooth;
91
+ -webkit-font-smoothing: antialiased;
92
+ -moz-osx-font-smoothing: grayscale;
93
+ }
94
+
95
+ body {
96
+ font-family: var(--font-sans);
97
+ background: var(--bg-primary);
98
+ color: var(--text-primary);
99
+ line-height: 1.6;
100
+ overflow-x: hidden;
101
+ }
102
+
103
+ a {
104
+ color: inherit;
105
+ text-decoration: none;
106
+ }
107
+
108
+ img {
109
+ max-width: 100%;
110
+ height: auto;
111
+ }
112
+
113
+ button {
114
+ font-family: inherit;
115
+ cursor: pointer;
116
+ border: none;
117
+ background: none;
118
+ }
119
+
120
+ /* ============================================
121
+ Layout
122
+ ============================================ */
123
+ .container {
124
+ width: 100%;
125
+ max-width: 1200px;
126
+ margin: 0 auto;
127
+ padding: 0 var(--space-lg);
128
+ }
129
+
130
+ /* ============================================
131
+ Navigation
132
+ ============================================ */
133
+ .nav {
134
+ position: fixed;
135
+ top: 0;
136
+ left: 0;
137
+ right: 0;
138
+ z-index: var(--z-fixed);
139
+ background: rgba(15, 15, 26, 0.8);
140
+ backdrop-filter: blur(12px);
141
+ border-bottom: 1px solid transparent;
142
+ transition: all var(--transition-base);
143
+ }
144
+
145
+ .nav.scrolled {
146
+ border-color: var(--border);
147
+ background: rgba(15, 15, 26, 0.95);
148
+ }
149
+
150
+ .nav-container {
151
+ display: flex;
152
+ align-items: center;
153
+ justify-content: space-between;
154
+ max-width: 1200px;
155
+ margin: 0 auto;
156
+ padding: var(--space-md) var(--space-lg);
157
+ }
158
+
159
+ .nav-logo {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: var(--space-sm);
163
+ font-weight: 700;
164
+ font-size: 1.25rem;
165
+ }
166
+
167
+ .logo-icon {
168
+ font-size: 1.5rem;
169
+ }
170
+
171
+ .nav-links {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: var(--space-xl);
175
+ }
176
+
177
+ .nav-links a {
178
+ color: var(--text-secondary);
179
+ font-weight: 500;
180
+ font-size: 0.9375rem;
181
+ transition: color var(--transition-fast);
182
+ }
183
+
184
+ .nav-links a:hover {
185
+ color: var(--text-primary);
186
+ }
187
+
188
+ .nav-cta {
189
+ padding: var(--space-sm) var(--space-lg) !important;
190
+ background: var(--gradient-primary);
191
+ border-radius: var(--radius-full);
192
+ color: white !important;
193
+ }
194
+
195
+ .nav-cta:hover {
196
+ transform: translateY(-1px);
197
+ box-shadow: var(--shadow-glow);
198
+ }
199
+
200
+ .nav-mobile-toggle {
201
+ display: none;
202
+ flex-direction: column;
203
+ gap: 5px;
204
+ padding: var(--space-sm);
205
+ }
206
+
207
+ .nav-mobile-toggle span {
208
+ width: 24px;
209
+ height: 2px;
210
+ background: var(--text-primary);
211
+ transition: all var(--transition-fast);
212
+ }
213
+
214
+ /* ============================================
215
+ Buttons
216
+ ============================================ */
217
+ .btn {
218
+ display: inline-flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ gap: var(--space-sm);
222
+ padding: var(--space-md) var(--space-xl);
223
+ font-weight: 600;
224
+ font-size: 0.9375rem;
225
+ border-radius: var(--radius-lg);
226
+ transition: all var(--transition-base);
227
+ }
228
+
229
+ .btn-icon {
230
+ width: 18px;
231
+ height: 18px;
232
+ }
233
+
234
+ .btn-primary {
235
+ background: var(--gradient-primary);
236
+ color: white;
237
+ box-shadow: 0 4px 14px rgba(99, 102, 241, 0.4);
238
+ }
239
+
240
+ .btn-primary:hover {
241
+ transform: translateY(-2px);
242
+ box-shadow: 0 6px 20px rgba(99, 102, 241, 0.5);
243
+ }
244
+
245
+ .btn-secondary {
246
+ background: var(--bg-card);
247
+ color: var(--text-primary);
248
+ border: 1px solid var(--border);
249
+ }
250
+
251
+ .btn-secondary:hover {
252
+ background: var(--bg-card-hover);
253
+ border-color: var(--border-light);
254
+ transform: translateY(-2px);
255
+ }
256
+
257
+ .btn-lg {
258
+ padding: var(--space-lg) var(--space-2xl);
259
+ font-size: 1rem;
260
+ }
261
+
262
+ .btn-block {
263
+ width: 100%;
264
+ }
265
+
266
+ /* ============================================
267
+ Hero Section
268
+ ============================================ */
269
+ .hero {
270
+ position: relative;
271
+ min-height: 100vh;
272
+ display: flex;
273
+ flex-direction: column;
274
+ justify-content: center;
275
+ padding: 120px 0 var(--space-4xl);
276
+ overflow: hidden;
277
+ }
278
+
279
+ .hero-bg {
280
+ position: absolute;
281
+ inset: 0;
282
+ pointer-events: none;
283
+ }
284
+
285
+ .hero-gradient {
286
+ position: absolute;
287
+ top: -50%;
288
+ left: 50%;
289
+ transform: translateX(-50%);
290
+ width: 150%;
291
+ height: 100%;
292
+ background: radial-gradient(ellipse at center, rgba(99, 102, 241, 0.15) 0%, transparent 60%);
293
+ }
294
+
295
+ .hero-grid {
296
+ position: absolute;
297
+ inset: 0;
298
+ background-image:
299
+ linear-gradient(rgba(99, 102, 241, 0.03) 1px, transparent 1px),
300
+ linear-gradient(90deg, rgba(99, 102, 241, 0.03) 1px, transparent 1px);
301
+ background-size: 60px 60px;
302
+ mask-image: linear-gradient(to bottom, black 0%, transparent 80%);
303
+ }
304
+
305
+ .hero-content {
306
+ position: relative;
307
+ z-index: 1;
308
+ text-align: center;
309
+ max-width: 800px;
310
+ margin: 0 auto;
311
+ }
312
+
313
+ .hero-badge {
314
+ display: inline-flex;
315
+ align-items: center;
316
+ gap: var(--space-sm);
317
+ padding: var(--space-sm) var(--space-lg);
318
+ background: var(--bg-card);
319
+ border: 1px solid var(--border);
320
+ border-radius: var(--radius-full);
321
+ font-size: 0.875rem;
322
+ color: var(--text-secondary);
323
+ margin-bottom: var(--space-xl);
324
+ animation: fadeInUp 0.6s ease;
325
+ }
326
+
327
+ .badge-dot {
328
+ width: 8px;
329
+ height: 8px;
330
+ background: var(--success);
331
+ border-radius: 50%;
332
+ animation: pulse 2s ease infinite;
333
+ }
334
+
335
+ .hero-title {
336
+ font-size: clamp(2.5rem, 6vw, 4rem);
337
+ font-weight: 800;
338
+ line-height: 1.1;
339
+ margin-bottom: var(--space-lg);
340
+ animation: fadeInUp 0.6s ease 0.1s both;
341
+ }
342
+
343
+ .gradient-text {
344
+ display: block;
345
+ background: var(--gradient-primary);
346
+ -webkit-background-clip: text;
347
+ -webkit-text-fill-color: transparent;
348
+ background-clip: text;
349
+ }
350
+
351
+ .hero-subtitle {
352
+ font-size: 1.25rem;
353
+ color: var(--text-secondary);
354
+ margin-bottom: var(--space-2xl);
355
+ animation: fadeInUp 0.6s ease 0.2s both;
356
+ }
357
+
358
+ .hero-ctas {
359
+ display: flex;
360
+ flex-wrap: wrap;
361
+ justify-content: center;
362
+ gap: var(--space-md);
363
+ margin-bottom: var(--space-3xl);
364
+ animation: fadeInUp 0.6s ease 0.3s both;
365
+ }
366
+
367
+ .hero-stats {
368
+ display: flex;
369
+ justify-content: center;
370
+ align-items: center;
371
+ gap: var(--space-2xl);
372
+ animation: fadeInUp 0.6s ease 0.4s both;
373
+ }
374
+
375
+ .stat {
376
+ text-align: center;
377
+ }
378
+
379
+ .stat-value {
380
+ display: block;
381
+ font-size: 1.75rem;
382
+ font-weight: 700;
383
+ color: var(--text-primary);
384
+ }
385
+
386
+ .stat-label {
387
+ font-size: 0.875rem;
388
+ color: var(--text-muted);
389
+ }
390
+
391
+ .stat-divider {
392
+ width: 1px;
393
+ height: 40px;
394
+ background: var(--border);
395
+ }
396
+
397
+ /* Hero Visual - App Window */
398
+ .hero-visual {
399
+ position: relative;
400
+ max-width: 900px;
401
+ margin: var(--space-4xl) auto 0;
402
+ animation: fadeInUp 0.8s ease 0.5s both;
403
+ }
404
+
405
+ .app-window {
406
+ background: var(--bg-secondary);
407
+ border-radius: var(--radius-xl);
408
+ border: 1px solid var(--border);
409
+ overflow: hidden;
410
+ box-shadow: var(--shadow-xl), var(--shadow-glow);
411
+ }
412
+
413
+ .window-header {
414
+ display: flex;
415
+ align-items: center;
416
+ padding: var(--space-md) var(--space-lg);
417
+ background: var(--bg-tertiary);
418
+ border-bottom: 1px solid var(--border);
419
+ }
420
+
421
+ .window-controls {
422
+ display: flex;
423
+ gap: var(--space-sm);
424
+ }
425
+
426
+ .control {
427
+ width: 12px;
428
+ height: 12px;
429
+ border-radius: 50%;
430
+ }
431
+
432
+ .control.close { background: #FF5F56; }
433
+ .control.minimize { background: #FFBD2E; }
434
+ .control.maximize { background: #27C93F; }
435
+
436
+ .window-title {
437
+ flex: 1;
438
+ text-align: center;
439
+ font-size: 0.875rem;
440
+ color: var(--text-muted);
441
+ }
442
+
443
+ .window-content {
444
+ padding: var(--space-xl);
445
+ }
446
+
447
+ .app-demo {
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: var(--space-lg);
451
+ }
452
+
453
+ .demo-recording {
454
+ display: flex;
455
+ align-items: center;
456
+ gap: var(--space-lg);
457
+ padding: var(--space-lg);
458
+ background: var(--bg-card);
459
+ border-radius: var(--radius-lg);
460
+ }
461
+
462
+ .recording-indicator {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: var(--space-sm);
466
+ color: var(--accent);
467
+ font-weight: 500;
468
+ }
469
+
470
+ .recording-dot {
471
+ width: 10px;
472
+ height: 10px;
473
+ background: var(--accent);
474
+ border-radius: 50%;
475
+ animation: pulse 1.5s ease infinite;
476
+ }
477
+
478
+ .waveform {
479
+ display: flex;
480
+ align-items: center;
481
+ gap: 3px;
482
+ flex: 1;
483
+ }
484
+
485
+ .waveform span {
486
+ width: 3px;
487
+ background: var(--primary);
488
+ border-radius: 2px;
489
+ animation: wave 1s ease infinite;
490
+ }
491
+
492
+ .waveform span:nth-child(1) { height: 8px; animation-delay: 0s; }
493
+ .waveform span:nth-child(2) { height: 16px; animation-delay: 0.1s; }
494
+ .waveform span:nth-child(3) { height: 12px; animation-delay: 0.2s; }
495
+ .waveform span:nth-child(4) { height: 20px; animation-delay: 0.3s; }
496
+ .waveform span:nth-child(5) { height: 10px; animation-delay: 0.4s; }
497
+ .waveform span:nth-child(6) { height: 18px; animation-delay: 0.5s; }
498
+ .waveform span:nth-child(7) { height: 14px; animation-delay: 0.6s; }
499
+ .waveform span:nth-child(8) { height: 22px; animation-delay: 0.7s; }
500
+ .waveform span:nth-child(9) { height: 8px; animation-delay: 0.8s; }
501
+ .waveform span:nth-child(10) { height: 16px; animation-delay: 0.9s; }
502
+
503
+ .demo-transcript {
504
+ padding: var(--space-lg);
505
+ background: var(--bg-card);
506
+ border-radius: var(--radius-lg);
507
+ border-left: 3px solid var(--primary);
508
+ }
509
+
510
+ .transcript-line {
511
+ font-style: italic;
512
+ color: var(--text-secondary);
513
+ }
514
+
515
+ .transcript-line.typing::after {
516
+ content: '|';
517
+ animation: blink 1s step-end infinite;
518
+ }
519
+
520
+ .demo-screenshots {
521
+ display: flex;
522
+ gap: var(--space-md);
523
+ }
524
+
525
+ .screenshot-item {
526
+ flex: 1;
527
+ padding: var(--space-md);
528
+ background: var(--bg-card);
529
+ border-radius: var(--radius-md);
530
+ border: 1px solid var(--border);
531
+ transition: all var(--transition-fast);
532
+ }
533
+
534
+ .screenshot-item.active {
535
+ border-color: var(--primary);
536
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.2);
537
+ }
538
+
539
+ .screenshot-thumb {
540
+ height: 60px;
541
+ background: linear-gradient(135deg, var(--bg-tertiary) 0%, var(--bg-secondary) 100%);
542
+ border-radius: var(--radius-sm);
543
+ margin-bottom: var(--space-sm);
544
+ }
545
+
546
+ .screenshot-time {
547
+ font-size: 0.75rem;
548
+ color: var(--text-muted);
549
+ }
550
+
551
+ /* ============================================
552
+ Section Styles
553
+ ============================================ */
554
+ section {
555
+ padding: var(--space-4xl) 0;
556
+ }
557
+
558
+ .section-header {
559
+ text-align: center;
560
+ max-width: 600px;
561
+ margin: 0 auto var(--space-3xl);
562
+ }
563
+
564
+ .section-tag {
565
+ display: inline-block;
566
+ padding: var(--space-xs) var(--space-md);
567
+ background: rgba(99, 102, 241, 0.1);
568
+ color: var(--primary-light);
569
+ font-size: 0.75rem;
570
+ font-weight: 600;
571
+ text-transform: uppercase;
572
+ letter-spacing: 0.1em;
573
+ border-radius: var(--radius-full);
574
+ margin-bottom: var(--space-md);
575
+ }
576
+
577
+ .section-title {
578
+ font-size: clamp(1.75rem, 4vw, 2.5rem);
579
+ font-weight: 700;
580
+ margin-bottom: var(--space-md);
581
+ }
582
+
583
+ .section-subtitle {
584
+ color: var(--text-secondary);
585
+ font-size: 1.125rem;
586
+ }
587
+
588
+ /* ============================================
589
+ Features Section
590
+ ============================================ */
591
+ .features {
592
+ background: var(--bg-secondary);
593
+ }
594
+
595
+ .features-grid {
596
+ display: grid;
597
+ grid-template-columns: repeat(3, 1fr);
598
+ gap: var(--space-xl);
599
+ }
600
+
601
+ .feature-card {
602
+ padding: var(--space-2xl);
603
+ background: var(--bg-card);
604
+ border: 1px solid var(--border);
605
+ border-radius: var(--radius-xl);
606
+ transition: all var(--transition-base);
607
+ }
608
+
609
+ .feature-card:hover {
610
+ transform: translateY(-4px);
611
+ border-color: var(--primary);
612
+ box-shadow: 0 0 30px rgba(99, 102, 241, 0.15);
613
+ }
614
+
615
+ .feature-icon {
616
+ width: 48px;
617
+ height: 48px;
618
+ display: flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ background: var(--gradient-primary);
622
+ border-radius: var(--radius-lg);
623
+ margin-bottom: var(--space-lg);
624
+ }
625
+
626
+ .feature-icon svg {
627
+ width: 24px;
628
+ height: 24px;
629
+ color: white;
630
+ }
631
+
632
+ .feature-title {
633
+ font-size: 1.25rem;
634
+ font-weight: 600;
635
+ margin-bottom: var(--space-sm);
636
+ }
637
+
638
+ .feature-desc {
639
+ color: var(--text-secondary);
640
+ line-height: 1.7;
641
+ }
642
+
643
+ /* ============================================
644
+ How It Works Section
645
+ ============================================ */
646
+ .steps-container {
647
+ max-width: 800px;
648
+ margin: 0 auto;
649
+ }
650
+
651
+ .step {
652
+ display: flex;
653
+ gap: var(--space-2xl);
654
+ padding: var(--space-2xl) 0;
655
+ border-bottom: 1px solid var(--border);
656
+ }
657
+
658
+ .step:last-child {
659
+ border-bottom: none;
660
+ }
661
+
662
+ .step-number {
663
+ flex-shrink: 0;
664
+ width: 48px;
665
+ height: 48px;
666
+ display: flex;
667
+ align-items: center;
668
+ justify-content: center;
669
+ background: var(--gradient-primary);
670
+ color: white;
671
+ font-size: 1.25rem;
672
+ font-weight: 700;
673
+ border-radius: var(--radius-full);
674
+ }
675
+
676
+ .step-content {
677
+ flex: 1;
678
+ }
679
+
680
+ .step-title {
681
+ font-size: 1.25rem;
682
+ font-weight: 600;
683
+ margin-bottom: var(--space-sm);
684
+ }
685
+
686
+ .step-desc {
687
+ color: var(--text-secondary);
688
+ margin-bottom: var(--space-lg);
689
+ }
690
+
691
+ .step-desc kbd {
692
+ display: inline-block;
693
+ padding: 2px 8px;
694
+ background: var(--bg-card);
695
+ border: 1px solid var(--border);
696
+ border-radius: var(--radius-sm);
697
+ font-family: var(--font-mono);
698
+ font-size: 0.875rem;
699
+ }
700
+
701
+ .step-visual {
702
+ padding: var(--space-lg);
703
+ background: var(--bg-card);
704
+ border-radius: var(--radius-lg);
705
+ border: 1px solid var(--border);
706
+ }
707
+
708
+ .keyboard-shortcut {
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ gap: var(--space-sm);
713
+ }
714
+
715
+ .keyboard-shortcut .key {
716
+ display: flex;
717
+ align-items: center;
718
+ justify-content: center;
719
+ min-width: 40px;
720
+ height: 40px;
721
+ padding: 0 var(--space-md);
722
+ background: var(--bg-tertiary);
723
+ border: 1px solid var(--border);
724
+ border-radius: var(--radius-md);
725
+ font-family: var(--font-mono);
726
+ font-size: 1.25rem;
727
+ box-shadow: 0 2px 0 var(--border);
728
+ }
729
+
730
+ .keyboard-shortcut .plus {
731
+ color: var(--text-muted);
732
+ font-weight: 300;
733
+ }
734
+
735
+ .narration-demo {
736
+ display: flex;
737
+ align-items: center;
738
+ justify-content: center;
739
+ gap: var(--space-xl);
740
+ }
741
+
742
+ .voice-wave {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 4px;
746
+ }
747
+
748
+ .voice-wave span {
749
+ width: 4px;
750
+ background: var(--secondary);
751
+ border-radius: 2px;
752
+ animation: wave 0.8s ease infinite;
753
+ }
754
+
755
+ .voice-wave span:nth-child(1) { height: 12px; animation-delay: 0s; }
756
+ .voice-wave span:nth-child(2) { height: 24px; animation-delay: 0.1s; }
757
+ .voice-wave span:nth-child(3) { height: 16px; animation-delay: 0.2s; }
758
+ .voice-wave span:nth-child(4) { height: 28px; animation-delay: 0.3s; }
759
+ .voice-wave span:nth-child(5) { height: 20px; animation-delay: 0.4s; }
760
+
761
+ .camera-flash {
762
+ font-size: 2rem;
763
+ animation: flash 2s ease infinite;
764
+ }
765
+
766
+ .annotation-demo {
767
+ position: relative;
768
+ height: 80px;
769
+ display: flex;
770
+ align-items: center;
771
+ justify-content: center;
772
+ }
773
+
774
+ .annotation-box {
775
+ position: absolute;
776
+ width: 60px;
777
+ height: 40px;
778
+ border: 2px solid var(--accent);
779
+ border-radius: var(--radius-sm);
780
+ left: 20%;
781
+ }
782
+
783
+ .annotation-circle {
784
+ position: absolute;
785
+ width: 30px;
786
+ height: 30px;
787
+ border: 2px solid var(--warning);
788
+ border-radius: 50%;
789
+ top: 10%;
790
+ right: 30%;
791
+ }
792
+
793
+ .annotation-arrow {
794
+ position: absolute;
795
+ width: 60px;
796
+ height: 2px;
797
+ background: var(--primary);
798
+ right: 15%;
799
+ bottom: 30%;
800
+ transform: rotate(-20deg);
801
+ }
802
+
803
+ .annotation-arrow::after {
804
+ content: '';
805
+ position: absolute;
806
+ right: 0;
807
+ top: -4px;
808
+ border: 5px solid transparent;
809
+ border-left-color: var(--primary);
810
+ }
811
+
812
+ .export-options {
813
+ display: flex;
814
+ align-items: center;
815
+ justify-content: center;
816
+ gap: var(--space-md);
817
+ }
818
+
819
+ .export-badge {
820
+ display: flex;
821
+ align-items: center;
822
+ justify-content: center;
823
+ width: 50px;
824
+ height: 50px;
825
+ background: var(--bg-tertiary);
826
+ border: 1px solid var(--border);
827
+ border-radius: var(--radius-md);
828
+ font-family: var(--font-mono);
829
+ font-weight: 600;
830
+ font-size: 0.875rem;
831
+ }
832
+
833
+ /* ============================================
834
+ Demo Section
835
+ ============================================ */
836
+ .demo {
837
+ background: var(--bg-secondary);
838
+ }
839
+
840
+ .demo-container {
841
+ display: grid;
842
+ grid-template-columns: 2fr 1fr;
843
+ gap: var(--space-2xl);
844
+ max-width: 1000px;
845
+ margin: 0 auto;
846
+ }
847
+
848
+ .video-wrapper {
849
+ position: relative;
850
+ border-radius: var(--radius-xl);
851
+ overflow: hidden;
852
+ border: 1px solid var(--border);
853
+ }
854
+
855
+ .video-placeholder {
856
+ position: relative;
857
+ aspect-ratio: 16/9;
858
+ background: linear-gradient(135deg, var(--bg-tertiary) 0%, var(--bg-card) 100%);
859
+ display: flex;
860
+ align-items: center;
861
+ justify-content: center;
862
+ }
863
+
864
+ .play-button {
865
+ width: 80px;
866
+ height: 80px;
867
+ display: flex;
868
+ align-items: center;
869
+ justify-content: center;
870
+ background: var(--gradient-primary);
871
+ border-radius: 50%;
872
+ cursor: pointer;
873
+ transition: all var(--transition-base);
874
+ }
875
+
876
+ .play-button svg {
877
+ width: 32px;
878
+ height: 32px;
879
+ margin-left: 4px;
880
+ }
881
+
882
+ .play-button:hover {
883
+ transform: scale(1.1);
884
+ box-shadow: var(--shadow-glow);
885
+ }
886
+
887
+ .video-duration {
888
+ position: absolute;
889
+ bottom: var(--space-md);
890
+ right: var(--space-md);
891
+ padding: var(--space-xs) var(--space-sm);
892
+ background: rgba(0, 0, 0, 0.7);
893
+ border-radius: var(--radius-sm);
894
+ font-size: 0.75rem;
895
+ }
896
+
897
+ .demo-gif {
898
+ border-radius: var(--radius-xl);
899
+ overflow: hidden;
900
+ border: 1px solid var(--border);
901
+ }
902
+
903
+ .gif-placeholder {
904
+ height: 100%;
905
+ background: var(--bg-card);
906
+ display: flex;
907
+ flex-direction: column;
908
+ align-items: center;
909
+ justify-content: center;
910
+ padding: var(--space-xl);
911
+ }
912
+
913
+ .gif-animation {
914
+ width: 100%;
915
+ margin-bottom: var(--space-md);
916
+ }
917
+
918
+ .gif-screen {
919
+ position: relative;
920
+ height: 150px;
921
+ background: var(--bg-tertiary);
922
+ border-radius: var(--radius-md);
923
+ border: 1px solid var(--border);
924
+ overflow: hidden;
925
+ }
926
+
927
+ .gif-cursor {
928
+ position: absolute;
929
+ width: 12px;
930
+ height: 12px;
931
+ background: var(--accent);
932
+ border-radius: 50%;
933
+ animation: cursorMove 3s ease infinite;
934
+ }
935
+
936
+ .gif-recording-bar {
937
+ position: absolute;
938
+ bottom: 10px;
939
+ left: 10px;
940
+ right: 10px;
941
+ height: 20px;
942
+ background: var(--bg-card);
943
+ border-radius: var(--radius-sm);
944
+ overflow: hidden;
945
+ }
946
+
947
+ .gif-recording-bar::after {
948
+ content: '';
949
+ position: absolute;
950
+ left: 0;
951
+ top: 0;
952
+ height: 100%;
953
+ width: 30%;
954
+ background: var(--gradient-primary);
955
+ border-radius: var(--radius-sm);
956
+ animation: recordingProgress 3s ease infinite;
957
+ }
958
+
959
+ .gif-label {
960
+ font-size: 0.75rem;
961
+ color: var(--text-muted);
962
+ }
963
+
964
+ /* ============================================
965
+ Testimonials Section
966
+ ============================================ */
967
+ .testimonials-grid {
968
+ display: grid;
969
+ grid-template-columns: repeat(3, 1fr);
970
+ gap: var(--space-xl);
971
+ }
972
+
973
+ .testimonial-card {
974
+ padding: var(--space-2xl);
975
+ background: var(--bg-card);
976
+ border: 1px solid var(--border);
977
+ border-radius: var(--radius-xl);
978
+ display: flex;
979
+ flex-direction: column;
980
+ }
981
+
982
+ .testimonial-content {
983
+ flex: 1;
984
+ margin-bottom: var(--space-xl);
985
+ }
986
+
987
+ .quote-icon {
988
+ font-size: 3rem;
989
+ font-family: Georgia, serif;
990
+ line-height: 1;
991
+ color: var(--primary);
992
+ opacity: 0.5;
993
+ margin-bottom: var(--space-md);
994
+ }
995
+
996
+ .testimonial-text {
997
+ color: var(--text-secondary);
998
+ font-size: 1.0625rem;
999
+ line-height: 1.7;
1000
+ }
1001
+
1002
+ .testimonial-author {
1003
+ display: flex;
1004
+ align-items: center;
1005
+ gap: var(--space-md);
1006
+ }
1007
+
1008
+ .author-avatar {
1009
+ width: 48px;
1010
+ height: 48px;
1011
+ display: flex;
1012
+ align-items: center;
1013
+ justify-content: center;
1014
+ background: var(--gradient-primary);
1015
+ border-radius: 50%;
1016
+ font-weight: 600;
1017
+ font-size: 0.875rem;
1018
+ }
1019
+
1020
+ .author-name {
1021
+ display: block;
1022
+ font-weight: 600;
1023
+ }
1024
+
1025
+ .author-role {
1026
+ font-size: 0.875rem;
1027
+ color: var(--text-muted);
1028
+ }
1029
+
1030
+ /* ============================================
1031
+ Pricing Section
1032
+ ============================================ */
1033
+ .pricing {
1034
+ background: var(--bg-secondary);
1035
+ }
1036
+
1037
+ .pricing-grid {
1038
+ display: grid;
1039
+ grid-template-columns: repeat(2, 1fr);
1040
+ gap: var(--space-xl);
1041
+ max-width: 800px;
1042
+ margin: 0 auto;
1043
+ }
1044
+
1045
+ .pricing-card {
1046
+ position: relative;
1047
+ padding: var(--space-2xl);
1048
+ background: var(--bg-card);
1049
+ border: 1px solid var(--border);
1050
+ border-radius: var(--radius-xl);
1051
+ }
1052
+
1053
+ .pricing-card.featured {
1054
+ border-color: var(--primary);
1055
+ box-shadow: 0 0 40px rgba(99, 102, 241, 0.2);
1056
+ }
1057
+
1058
+ .pricing-badge {
1059
+ position: absolute;
1060
+ top: 0;
1061
+ left: 50%;
1062
+ transform: translate(-50%, -50%);
1063
+ padding: var(--space-xs) var(--space-lg);
1064
+ background: var(--gradient-primary);
1065
+ color: white;
1066
+ font-size: 0.75rem;
1067
+ font-weight: 600;
1068
+ border-radius: var(--radius-full);
1069
+ }
1070
+
1071
+ .pricing-header {
1072
+ text-align: center;
1073
+ padding-bottom: var(--space-xl);
1074
+ border-bottom: 1px solid var(--border);
1075
+ margin-bottom: var(--space-xl);
1076
+ }
1077
+
1078
+ .pricing-tier {
1079
+ font-size: 1.5rem;
1080
+ font-weight: 700;
1081
+ margin-bottom: var(--space-md);
1082
+ }
1083
+
1084
+ .pricing-price {
1085
+ display: flex;
1086
+ align-items: baseline;
1087
+ justify-content: center;
1088
+ gap: var(--space-xs);
1089
+ margin-bottom: var(--space-md);
1090
+ }
1091
+
1092
+ .price-amount {
1093
+ font-size: 3rem;
1094
+ font-weight: 800;
1095
+ }
1096
+
1097
+ .price-period {
1098
+ color: var(--text-muted);
1099
+ }
1100
+
1101
+ .pricing-desc {
1102
+ color: var(--text-secondary);
1103
+ font-size: 0.9375rem;
1104
+ }
1105
+
1106
+ .pricing-features {
1107
+ list-style: none;
1108
+ margin-bottom: var(--space-xl);
1109
+ }
1110
+
1111
+ .pricing-features li {
1112
+ display: flex;
1113
+ align-items: center;
1114
+ gap: var(--space-md);
1115
+ padding: var(--space-sm) 0;
1116
+ color: var(--text-secondary);
1117
+ }
1118
+
1119
+ .pricing-features svg {
1120
+ width: 20px;
1121
+ height: 20px;
1122
+ color: var(--success);
1123
+ flex-shrink: 0;
1124
+ }
1125
+
1126
+ .pricing-features strong {
1127
+ color: var(--text-primary);
1128
+ }
1129
+
1130
+ .coming-soon {
1131
+ display: flex;
1132
+ align-items: center;
1133
+ gap: var(--space-sm);
1134
+ }
1135
+
1136
+ .badge {
1137
+ padding: 2px 8px;
1138
+ background: var(--secondary);
1139
+ color: white;
1140
+ font-size: 0.625rem;
1141
+ font-weight: 600;
1142
+ border-radius: var(--radius-full);
1143
+ text-transform: uppercase;
1144
+ }
1145
+
1146
+ /* ============================================
1147
+ Download Section
1148
+ ============================================ */
1149
+ .download-content {
1150
+ text-align: center;
1151
+ }
1152
+
1153
+ .download-grid {
1154
+ display: grid;
1155
+ grid-template-columns: repeat(2, 1fr);
1156
+ gap: var(--space-xl);
1157
+ max-width: 700px;
1158
+ margin: 0 auto;
1159
+ }
1160
+
1161
+ .download-card {
1162
+ padding: var(--space-2xl);
1163
+ background: var(--bg-card);
1164
+ border: 1px solid var(--border);
1165
+ border-radius: var(--radius-xl);
1166
+ text-align: center;
1167
+ transition: all var(--transition-base);
1168
+ }
1169
+
1170
+ .download-card:hover {
1171
+ transform: translateY(-4px);
1172
+ border-color: var(--primary);
1173
+ box-shadow: 0 0 30px rgba(99, 102, 241, 0.15);
1174
+ }
1175
+
1176
+ .download-icon {
1177
+ width: 64px;
1178
+ height: 64px;
1179
+ margin: 0 auto var(--space-lg);
1180
+ display: flex;
1181
+ align-items: center;
1182
+ justify-content: center;
1183
+ }
1184
+
1185
+ .download-icon svg {
1186
+ width: 48px;
1187
+ height: 48px;
1188
+ color: var(--text-secondary);
1189
+ }
1190
+
1191
+ .download-title {
1192
+ font-size: 1.5rem;
1193
+ font-weight: 700;
1194
+ margin-bottom: var(--space-sm);
1195
+ }
1196
+
1197
+ .download-version {
1198
+ color: var(--primary-light);
1199
+ font-weight: 500;
1200
+ margin-bottom: var(--space-md);
1201
+ }
1202
+
1203
+ .download-requirements {
1204
+ font-size: 0.875rem;
1205
+ color: var(--text-muted);
1206
+ margin-bottom: var(--space-xl);
1207
+ line-height: 1.7;
1208
+ }
1209
+
1210
+ /* ============================================
1211
+ CTA Section
1212
+ ============================================ */
1213
+ .cta {
1214
+ background: linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);
1215
+ text-align: center;
1216
+ }
1217
+
1218
+ .cta-content {
1219
+ max-width: 600px;
1220
+ margin: 0 auto;
1221
+ padding: var(--space-4xl);
1222
+ background: var(--gradient-glow);
1223
+ border-radius: var(--radius-2xl);
1224
+ }
1225
+
1226
+ .cta-title {
1227
+ font-size: clamp(1.5rem, 3vw, 2rem);
1228
+ font-weight: 700;
1229
+ margin-bottom: var(--space-md);
1230
+ }
1231
+
1232
+ .cta-subtitle {
1233
+ color: var(--text-secondary);
1234
+ margin-bottom: var(--space-xl);
1235
+ }
1236
+
1237
+ .cta-actions {
1238
+ display: flex;
1239
+ flex-wrap: wrap;
1240
+ gap: var(--space-md);
1241
+ justify-content: center;
1242
+ }
1243
+
1244
+ .cta-support-note {
1245
+ margin-top: var(--space-md);
1246
+ color: var(--text-muted);
1247
+ font-size: 0.9rem;
1248
+ }
1249
+
1250
+ /* ============================================
1251
+ Footer
1252
+ ============================================ */
1253
+ .footer {
1254
+ background: var(--bg-secondary);
1255
+ padding: var(--space-4xl) 0 var(--space-xl);
1256
+ border-top: 1px solid var(--border);
1257
+ }
1258
+
1259
+ .footer-grid {
1260
+ display: grid;
1261
+ grid-template-columns: 2fr 3fr;
1262
+ gap: var(--space-4xl);
1263
+ margin-bottom: var(--space-3xl);
1264
+ }
1265
+
1266
+ .footer-logo {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ gap: var(--space-sm);
1270
+ font-weight: 700;
1271
+ font-size: 1.25rem;
1272
+ margin-bottom: var(--space-md);
1273
+ }
1274
+
1275
+ .footer-tagline {
1276
+ color: var(--text-secondary);
1277
+ margin-bottom: var(--space-lg);
1278
+ }
1279
+
1280
+ .footer-social {
1281
+ display: flex;
1282
+ gap: var(--space-md);
1283
+ }
1284
+
1285
+ .social-link {
1286
+ width: 40px;
1287
+ height: 40px;
1288
+ display: flex;
1289
+ align-items: center;
1290
+ justify-content: center;
1291
+ background: var(--bg-card);
1292
+ border: 1px solid var(--border);
1293
+ border-radius: var(--radius-md);
1294
+ color: var(--text-secondary);
1295
+ transition: all var(--transition-fast);
1296
+ }
1297
+
1298
+ .social-link:hover {
1299
+ color: var(--text-primary);
1300
+ border-color: var(--primary);
1301
+ background: rgba(99, 102, 241, 0.1);
1302
+ }
1303
+
1304
+ .social-link svg {
1305
+ width: 20px;
1306
+ height: 20px;
1307
+ }
1308
+
1309
+ .footer-links {
1310
+ display: grid;
1311
+ grid-template-columns: repeat(3, 1fr);
1312
+ gap: var(--space-xl);
1313
+ }
1314
+
1315
+ .footer-heading {
1316
+ font-weight: 600;
1317
+ margin-bottom: var(--space-lg);
1318
+ }
1319
+
1320
+ .footer-column ul {
1321
+ list-style: none;
1322
+ }
1323
+
1324
+ .footer-column li {
1325
+ margin-bottom: var(--space-sm);
1326
+ }
1327
+
1328
+ .footer-column a {
1329
+ color: var(--text-secondary);
1330
+ transition: color var(--transition-fast);
1331
+ }
1332
+
1333
+ .footer-column a:hover {
1334
+ color: var(--primary-light);
1335
+ }
1336
+
1337
+ .footer-bottom {
1338
+ display: flex;
1339
+ justify-content: space-between;
1340
+ align-items: center;
1341
+ padding-top: var(--space-xl);
1342
+ border-top: 1px solid var(--border);
1343
+ font-size: 0.875rem;
1344
+ color: var(--text-muted);
1345
+ }
1346
+
1347
+ .footer-made {
1348
+ color: var(--text-secondary);
1349
+ }
1350
+
1351
+ /* ============================================
1352
+ Animations
1353
+ ============================================ */
1354
+ @keyframes fadeInUp {
1355
+ from {
1356
+ opacity: 0;
1357
+ transform: translateY(20px);
1358
+ }
1359
+ to {
1360
+ opacity: 1;
1361
+ transform: translateY(0);
1362
+ }
1363
+ }
1364
+
1365
+ @keyframes pulse {
1366
+ 0%, 100% { opacity: 1; }
1367
+ 50% { opacity: 0.5; }
1368
+ }
1369
+
1370
+ @keyframes wave {
1371
+ 0%, 100% { transform: scaleY(1); }
1372
+ 50% { transform: scaleY(1.5); }
1373
+ }
1374
+
1375
+ @keyframes blink {
1376
+ 0%, 100% { opacity: 1; }
1377
+ 50% { opacity: 0; }
1378
+ }
1379
+
1380
+ @keyframes flash {
1381
+ 0%, 80%, 100% { opacity: 1; }
1382
+ 90% { opacity: 0; transform: scale(1.2); }
1383
+ }
1384
+
1385
+ @keyframes cursorMove {
1386
+ 0% { top: 20px; left: 20px; }
1387
+ 25% { top: 50px; left: 100px; }
1388
+ 50% { top: 80px; left: 60px; }
1389
+ 75% { top: 40px; left: 140px; }
1390
+ 100% { top: 20px; left: 20px; }
1391
+ }
1392
+
1393
+ @keyframes recordingProgress {
1394
+ 0% { width: 0%; }
1395
+ 100% { width: 100%; }
1396
+ }
1397
+
1398
+ /* AOS (Animate on Scroll) */
1399
+ [data-aos] {
1400
+ opacity: 0;
1401
+ transition: opacity 0.6s ease, transform 0.6s ease;
1402
+ }
1403
+
1404
+ [data-aos="fade-up"] {
1405
+ transform: translateY(30px);
1406
+ }
1407
+
1408
+ [data-aos="fade-right"] {
1409
+ transform: translateX(-30px);
1410
+ }
1411
+
1412
+ [data-aos="fade-left"] {
1413
+ transform: translateX(30px);
1414
+ }
1415
+
1416
+ [data-aos="zoom-in"] {
1417
+ transform: scale(0.95);
1418
+ }
1419
+
1420
+ [data-aos].aos-animate {
1421
+ opacity: 1;
1422
+ transform: translate(0) scale(1);
1423
+ }
1424
+
1425
+ /* ============================================
1426
+ Responsive Design
1427
+ ============================================ */
1428
+ @media (max-width: 1024px) {
1429
+ .features-grid {
1430
+ grid-template-columns: repeat(2, 1fr);
1431
+ }
1432
+
1433
+ .testimonials-grid {
1434
+ grid-template-columns: repeat(2, 1fr);
1435
+ }
1436
+
1437
+ .demo-container {
1438
+ grid-template-columns: 1fr;
1439
+ }
1440
+
1441
+ .demo-gif {
1442
+ display: none;
1443
+ }
1444
+ }
1445
+
1446
+ @media (max-width: 768px) {
1447
+ .nav-links {
1448
+ display: none;
1449
+ position: absolute;
1450
+ top: 100%;
1451
+ left: 0;
1452
+ right: 0;
1453
+ flex-direction: column;
1454
+ padding: var(--space-lg);
1455
+ background: var(--bg-primary);
1456
+ border-bottom: 1px solid var(--border);
1457
+ gap: var(--space-md);
1458
+ }
1459
+
1460
+ .nav-links.active {
1461
+ display: flex;
1462
+ }
1463
+
1464
+ .nav-mobile-toggle {
1465
+ display: flex;
1466
+ }
1467
+
1468
+ .nav-mobile-toggle.active span:nth-child(1) {
1469
+ transform: rotate(45deg) translate(5px, 5px);
1470
+ }
1471
+
1472
+ .nav-mobile-toggle.active span:nth-child(2) {
1473
+ opacity: 0;
1474
+ }
1475
+
1476
+ .nav-mobile-toggle.active span:nth-child(3) {
1477
+ transform: rotate(-45deg) translate(5px, -5px);
1478
+ }
1479
+
1480
+ .hero-stats {
1481
+ flex-direction: column;
1482
+ gap: var(--space-lg);
1483
+ }
1484
+
1485
+ .stat-divider {
1486
+ width: 40px;
1487
+ height: 1px;
1488
+ }
1489
+
1490
+ .features-grid {
1491
+ grid-template-columns: 1fr;
1492
+ }
1493
+
1494
+ .step {
1495
+ flex-direction: column;
1496
+ gap: var(--space-lg);
1497
+ }
1498
+
1499
+ .testimonials-grid {
1500
+ grid-template-columns: 1fr;
1501
+ }
1502
+
1503
+ .pricing-grid {
1504
+ grid-template-columns: 1fr;
1505
+ }
1506
+
1507
+ .download-grid {
1508
+ grid-template-columns: 1fr;
1509
+ }
1510
+
1511
+ .footer-grid {
1512
+ grid-template-columns: 1fr;
1513
+ gap: var(--space-2xl);
1514
+ }
1515
+
1516
+ .footer-links {
1517
+ grid-template-columns: repeat(2, 1fr);
1518
+ }
1519
+
1520
+ .footer-bottom {
1521
+ flex-direction: column;
1522
+ gap: var(--space-md);
1523
+ text-align: center;
1524
+ }
1525
+ }
1526
+
1527
+ @media (max-width: 480px) {
1528
+ .container {
1529
+ padding: 0 var(--space-md);
1530
+ }
1531
+
1532
+ .hero-ctas {
1533
+ flex-direction: column;
1534
+ }
1535
+
1536
+ .hero-ctas .btn {
1537
+ width: 100%;
1538
+ }
1539
+
1540
+ .footer-links {
1541
+ grid-template-columns: 1fr;
1542
+ }
1543
+ }