claudedesk 4.3.1 → 4.4.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 (124) hide show
  1. package/.github/workflows/ci.yml +44 -2
  2. package/CLAUDE.md +36 -3
  3. package/PHASE_1_IMPLEMENTATION.md +313 -0
  4. package/PHASE_2_PARTIAL_IMPLEMENTATION.md +286 -0
  5. package/dist/main/cli-manager.js +67 -2
  6. package/dist/main/command-registry.js +196 -0
  7. package/dist/main/git-manager.js +841 -0
  8. package/dist/main/index.js +25 -1
  9. package/dist/main/ipc-handlers.js +347 -3
  10. package/dist/main/layout-presets-manager.js +233 -0
  11. package/dist/main/model-history-manager.js +187 -0
  12. package/dist/main/session-manager.js +83 -26
  13. package/dist/main/session-persistence.js +1 -0
  14. package/dist/main/session-pool.js +40 -9
  15. package/dist/main/settings-persistence.js +67 -12
  16. package/dist/renderer/assets/index-BNeYLqV4.css +32 -0
  17. package/dist/renderer/assets/index-D5O5Ljoo.js +17189 -0
  18. package/dist/renderer/index.html +2 -2
  19. package/dist/shared/ipc-contract.js +79 -0
  20. package/dist/shared/model-detector.js +83 -0
  21. package/dist/shared/types/command-types.js +5 -0
  22. package/dist/shared/types/git-types.js +2 -0
  23. package/dist/types/layout-presets.js +11 -0
  24. package/docs/git-integration-implementation-tasks.md +974 -0
  25. package/docs/git-integration-product-spec.md +916 -0
  26. package/docs/git-integration-ui-spec.md +1464 -0
  27. package/docs/repo-index.md +83 -8
  28. package/e2e/app-launch.spec.ts +31 -0
  29. package/e2e/fixtures/electron.ts +34 -0
  30. package/e2e/keyboard-shortcuts.spec.ts +50 -0
  31. package/e2e/session.spec.ts +34 -0
  32. package/e2e/split-view.spec.ts +21 -0
  33. package/package.json +16 -3
  34. package/playwright.config.ts +15 -0
  35. package/src/main/cli-manager.ts +74 -3
  36. package/src/main/command-registry.ts +221 -0
  37. package/src/main/git-manager.test.ts +374 -0
  38. package/src/main/git-manager.ts +909 -0
  39. package/src/main/index.ts +31 -1
  40. package/src/main/ipc-emitter.test.ts +60 -0
  41. package/src/main/ipc-handlers.ts +295 -3
  42. package/src/main/ipc-registry.test.ts +75 -0
  43. package/src/main/layout-presets-manager.ts +268 -0
  44. package/src/main/model-history-manager.ts +196 -0
  45. package/src/main/session-manager.ts +102 -30
  46. package/src/main/session-persistence.test.ts +215 -0
  47. package/src/main/session-persistence.ts +1 -0
  48. package/src/main/session-pool.ts +31 -9
  49. package/src/main/settings-persistence.ts +74 -12
  50. package/src/renderer/App.tsx +215 -43
  51. package/src/renderer/components/CustomLayoutBuilder.tsx +143 -0
  52. package/src/renderer/components/GitPanel.test.tsx +181 -0
  53. package/src/renderer/components/GitPanel.tsx +1407 -0
  54. package/src/renderer/components/LayoutPicker.tsx +182 -0
  55. package/src/renderer/components/LayoutPreviewCard.tsx +175 -0
  56. package/src/renderer/components/ModelHistoryPanel.tsx +435 -0
  57. package/src/renderer/components/PaneHeader.test.tsx +96 -0
  58. package/src/renderer/components/PaneHeader.tsx +28 -0
  59. package/src/renderer/components/SplitLayout.test.tsx +153 -0
  60. package/src/renderer/components/SplitLayout.tsx +36 -1
  61. package/src/renderer/components/Terminal.tsx +10 -10
  62. package/src/renderer/components/WelcomeWizard.tsx +143 -0
  63. package/src/renderer/components/WizardStepper.tsx +135 -0
  64. package/src/renderer/components/ui/ClaudeReadinessProgress.tsx +168 -0
  65. package/src/renderer/components/ui/CommitDialog.test.tsx +134 -0
  66. package/src/renderer/components/ui/CommitDialog.tsx +464 -0
  67. package/src/renderer/components/ui/EmptyState.test.tsx +87 -0
  68. package/src/renderer/components/ui/EmptyState.tsx +115 -86
  69. package/src/renderer/components/ui/FeatureShowcase.tsx +187 -0
  70. package/src/renderer/components/ui/FuelGaugeBar.tsx +59 -0
  71. package/src/renderer/components/ui/FuelStatusIndicator.tsx +358 -0
  72. package/src/renderer/components/ui/FuelTooltip.tsx +267 -0
  73. package/src/renderer/components/ui/HelpButton.tsx +43 -0
  74. package/src/renderer/components/ui/ModelBadge.tsx +72 -0
  75. package/src/renderer/components/ui/ModelSwitcher.tsx +180 -0
  76. package/src/renderer/components/ui/PanelFooter.tsx +90 -0
  77. package/src/renderer/components/ui/PanelHeader.tsx +87 -0
  78. package/src/renderer/components/ui/PanelHelpOverlay.tsx +274 -0
  79. package/src/renderer/components/ui/QuickActionCard.tsx +103 -0
  80. package/src/renderer/components/ui/RecentSessionsList.tsx +154 -0
  81. package/src/renderer/components/ui/SessionStatusIndicator.tsx +104 -0
  82. package/src/renderer/components/ui/SettingsDialog.tsx +94 -0
  83. package/src/renderer/components/ui/ShortcutsPanel.tsx +433 -0
  84. package/src/renderer/components/ui/StatusPopover.tsx +344 -0
  85. package/src/renderer/components/ui/TabBar.test.tsx +124 -0
  86. package/src/renderer/components/ui/TabBar.tsx +152 -168
  87. package/src/renderer/components/ui/ToolbarDropdown.tsx +227 -0
  88. package/src/renderer/components/ui/ToolsDropdown.tsx +119 -0
  89. package/src/renderer/components/ui/TooltipCoach.tsx +217 -0
  90. package/src/renderer/components/ui/WelcomeHero.tsx +85 -0
  91. package/src/renderer/components/ui/index.ts +5 -0
  92. package/src/renderer/components/wizard/Step1_Welcome.tsx +166 -0
  93. package/src/renderer/components/wizard/Step2_LayoutPicker.tsx +246 -0
  94. package/src/renderer/components/wizard/Step3_Features.tsx +278 -0
  95. package/src/renderer/components/wizard/Step4_Ready.tsx +279 -0
  96. package/src/renderer/hooks/useGit.test.ts +140 -0
  97. package/src/renderer/hooks/useGit.ts +395 -0
  98. package/src/renderer/hooks/useLayoutPicker.ts +77 -0
  99. package/src/renderer/hooks/useModelHistory.ts +69 -0
  100. package/src/renderer/hooks/useSessionManager.test.ts +146 -0
  101. package/src/renderer/hooks/useSessionManager.ts +5 -0
  102. package/src/renderer/hooks/useSplitView.test.ts +168 -0
  103. package/src/renderer/hooks/useSplitView.ts +126 -128
  104. package/src/renderer/styles/globals.css +505 -0
  105. package/src/renderer/utils/fuzzy-search.test.ts +121 -0
  106. package/src/renderer/utils/layout-tree.test.ts +310 -0
  107. package/src/renderer/utils/layout-tree.ts +170 -0
  108. package/src/renderer/utils/variable-resolver.test.ts +102 -0
  109. package/src/shared/ipc-contract.ts +157 -0
  110. package/src/shared/ipc-types.ts +52 -1
  111. package/src/shared/message-parser.test.ts +79 -0
  112. package/src/shared/model-detector.test.ts +90 -0
  113. package/src/shared/model-detector.ts +97 -0
  114. package/src/shared/types/command-types.ts +26 -0
  115. package/src/shared/types/git-types.ts +126 -0
  116. package/src/types/layout-presets.ts +22 -0
  117. package/test/helpers/electron-api-mock.ts +52 -0
  118. package/test/setup-main.ts +61 -0
  119. package/test/setup-renderer.ts +8 -0
  120. package/tsconfig.json +1 -0
  121. package/tsconfig.main.json +2 -1
  122. package/vitest.workspace.ts +37 -0
  123. package/dist/renderer/assets/index-CR22a7j2.css +0 -32
  124. package/dist/renderer/assets/index-Dp-eceNq.js +0 -13915
@@ -0,0 +1,246 @@
1
+ interface Step2LayoutPickerProps {
2
+ onNext: () => void;
3
+ onBack: () => void;
4
+ }
5
+
6
+ const layoutExamples = [
7
+ {
8
+ id: 'single',
9
+ name: 'Single Pane',
10
+ icon: <rect x="2" y="2" width="20" height="20" rx="2" fill="currentColor" opacity="0.3" />
11
+ },
12
+ {
13
+ id: 'horizontal',
14
+ name: 'Horizontal Split',
15
+ icon: (
16
+ <>
17
+ <rect x="2" y="2" width="9" height="20" rx="2" fill="currentColor" opacity="0.3" />
18
+ <rect x="13" y="2" width="9" height="20" rx="2" fill="currentColor" opacity="0.3" />
19
+ </>
20
+ )
21
+ },
22
+ {
23
+ id: 'vertical',
24
+ name: 'Vertical Split',
25
+ icon: (
26
+ <>
27
+ <rect x="2" y="2" width="20" height="9" rx="2" fill="currentColor" opacity="0.3" />
28
+ <rect x="2" y="13" width="20" height="9" rx="2" fill="currentColor" opacity="0.3" />
29
+ </>
30
+ )
31
+ },
32
+ {
33
+ id: 'quad',
34
+ name: 'Quad Grid',
35
+ icon: (
36
+ <>
37
+ <rect x="2" y="2" width="9" height="9" rx="2" fill="currentColor" opacity="0.3" />
38
+ <rect x="13" y="2" width="9" height="9" rx="2" fill="currentColor" opacity="0.3" />
39
+ <rect x="2" y="13" width="9" height="9" rx="2" fill="currentColor" opacity="0.3" />
40
+ <rect x="13" y="13" width="9" height="9" rx="2" fill="currentColor" opacity="0.3" />
41
+ </>
42
+ )
43
+ }
44
+ ];
45
+
46
+ export function Step2_LayoutPicker({ onNext, onBack }: Step2LayoutPickerProps) {
47
+ return (
48
+ <div className="wizard-step-content">
49
+ <h2 className="step-title">Choose Your Workspace Layout</h2>
50
+ <p className="step-subtitle">
51
+ ClaudeDesk supports up to 4 terminal panes simultaneously.
52
+ You can change your layout anytime from the toolbar.
53
+ </p>
54
+
55
+ <div className="layout-examples">
56
+ {layoutExamples.map((layout, index) => (
57
+ <div
58
+ key={layout.id}
59
+ className="layout-example"
60
+ style={{ animationDelay: `${index * 0.1}s` }}
61
+ >
62
+ <svg width="120" height="120" viewBox="0 0 24 24" className="layout-icon">
63
+ {layout.icon}
64
+ </svg>
65
+ <span className="layout-name">{layout.name}</span>
66
+ </div>
67
+ ))}
68
+ </div>
69
+
70
+ <p className="layout-hint">
71
+ 💡 Tip: Use <kbd>Ctrl+\</kbd> to toggle split view and <kbd>Ctrl+Shift+L</kbd> to open the layout picker
72
+ </p>
73
+
74
+ <div className="wizard-actions">
75
+ <button className="wizard-back-btn" onClick={onBack}>
76
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
77
+ <polyline points="15 18 9 12 15 6" strokeLinecap="round" strokeLinejoin="round" />
78
+ </svg>
79
+ Back
80
+ </button>
81
+ <button className="wizard-next-btn" onClick={onNext}>
82
+ Continue
83
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
84
+ <polyline points="9 18 15 12 9 6" strokeLinecap="round" strokeLinejoin="round" />
85
+ </svg>
86
+ </button>
87
+ </div>
88
+
89
+ <style>{`
90
+ .wizard-step-content {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ width: 100%;
95
+ animation: step-fade-in 0.4s ease;
96
+ }
97
+
98
+ @keyframes step-fade-in {
99
+ from {
100
+ opacity: 0;
101
+ transform: translateY(10px);
102
+ }
103
+ to {
104
+ opacity: 1;
105
+ transform: translateY(0);
106
+ }
107
+ }
108
+
109
+ .step-title {
110
+ font-size: 24px;
111
+ font-weight: 600;
112
+ color: #e9e9ea;
113
+ margin: 0 0 12px 0;
114
+ letter-spacing: -0.3px;
115
+ }
116
+
117
+ .step-subtitle {
118
+ font-size: 14px;
119
+ color: #a9b1d6;
120
+ margin: 0 0 32px 0;
121
+ text-align: center;
122
+ max-width: 600px;
123
+ line-height: 1.6;
124
+ }
125
+
126
+ .layout-examples {
127
+ display: grid;
128
+ grid-template-columns: repeat(4, 1fr);
129
+ gap: 24px;
130
+ margin-bottom: 32px;
131
+ }
132
+
133
+ .layout-example {
134
+ display: flex;
135
+ flex-direction: column;
136
+ align-items: center;
137
+ gap: 12px;
138
+ padding: 20px;
139
+ background: #1f2335;
140
+ border: 2px solid #3d4458;
141
+ border-radius: 12px;
142
+ transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
143
+ animation: card-fade-in 0.5s ease backwards;
144
+ }
145
+
146
+ @keyframes card-fade-in {
147
+ from {
148
+ opacity: 0;
149
+ transform: translateY(20px);
150
+ }
151
+ to {
152
+ opacity: 1;
153
+ transform: translateY(0);
154
+ }
155
+ }
156
+
157
+ .layout-example:hover {
158
+ transform: translateY(-4px);
159
+ border-color: #7aa2f7;
160
+ }
161
+
162
+ .layout-icon {
163
+ color: #7aa2f7;
164
+ }
165
+
166
+ .layout-name {
167
+ font-size: 13px;
168
+ color: #e9e9ea;
169
+ font-weight: 500;
170
+ }
171
+
172
+ .layout-hint {
173
+ font-size: 13px;
174
+ color: #a9b1d6;
175
+ margin-bottom: 32px;
176
+ text-align: center;
177
+ padding: 16px 24px;
178
+ background: #1f2335;
179
+ border: 1px solid #3d4458;
180
+ border-radius: 8px;
181
+ }
182
+
183
+ .layout-hint kbd {
184
+ display: inline-block;
185
+ padding: 3px 6px;
186
+ background: #24283b;
187
+ border: 1px solid #3d4458;
188
+ border-radius: 4px;
189
+ font-size: 11px;
190
+ font-family: 'JetBrains Mono', monospace;
191
+ color: #7aa2f7;
192
+ }
193
+
194
+ .wizard-actions {
195
+ display: flex;
196
+ gap: 16px;
197
+ align-items: center;
198
+ }
199
+
200
+ .wizard-back-btn {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 8px;
204
+ padding: 10px 20px;
205
+ background: #24283b;
206
+ border: 1px solid #3d4458;
207
+ border-radius: 8px;
208
+ color: #a9b1d6;
209
+ font-size: 13px;
210
+ font-weight: 500;
211
+ font-family: 'JetBrains Mono', monospace;
212
+ cursor: pointer;
213
+ transition: all 0.2s ease;
214
+ }
215
+
216
+ .wizard-back-btn:hover {
217
+ background: #292e42;
218
+ border-color: #7aa2f7;
219
+ color: #7aa2f7;
220
+ }
221
+
222
+ .wizard-next-btn {
223
+ display: flex;
224
+ align-items: center;
225
+ gap: 8px;
226
+ padding: 10px 24px;
227
+ background: linear-gradient(135deg, #7aa2f7, #7dcfff);
228
+ border: none;
229
+ border-radius: 8px;
230
+ color: #1a1b26;
231
+ font-size: 13px;
232
+ font-weight: 600;
233
+ font-family: 'JetBrains Mono', monospace;
234
+ cursor: pointer;
235
+ transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
236
+ box-shadow: 0 4px 16px rgba(122, 162, 247, 0.3);
237
+ }
238
+
239
+ .wizard-next-btn:hover {
240
+ transform: translateY(-2px);
241
+ box-shadow: 0 8px 24px rgba(122, 162, 247, 0.4);
242
+ }
243
+ `}</style>
244
+ </div>
245
+ );
246
+ }
@@ -0,0 +1,278 @@
1
+ interface Step3FeaturesProps {
2
+ onNext: () => void;
3
+ onBack: () => void;
4
+ onTryFeature: (feature: string) => void;
5
+ }
6
+
7
+ const features = [
8
+ {
9
+ id: 'atlas',
10
+ icon: (
11
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
12
+ <polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6" />
13
+ <line x1="8" y1="2" x2="8" y2="18" />
14
+ <line x1="16" y1="6" x2="16" y2="22" />
15
+ </svg>
16
+ ),
17
+ title: 'Repository Atlas',
18
+ description: 'Generate an AI-powered map of your codebase. Automatically discovers file structure, analyzes imports, infers domains, and creates navigation guides for Claude.',
19
+ action: 'Try Atlas'
20
+ },
21
+ {
22
+ id: 'teams',
23
+ icon: (
24
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
25
+ <path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2" />
26
+ <circle cx="9" cy="7" r="4" />
27
+ <path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75" />
28
+ </svg>
29
+ ),
30
+ title: 'Agent Teams',
31
+ description: 'Coordinate multiple AI agents working together. Visualize agent relationships, monitor task progress, and see real-time message streams between team members.',
32
+ action: 'Try Teams'
33
+ },
34
+ {
35
+ id: 'checkpoints',
36
+ icon: (
37
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
38
+ <path d="M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z" />
39
+ <polyline points="17 21 17 13 7 13 7 21" />
40
+ <polyline points="7 3 7 8 15 8" />
41
+ </svg>
42
+ ),
43
+ title: 'Checkpoints',
44
+ description: 'Save conversation states at any point. Restore previous contexts, experiment with different approaches, or create branching conversation threads.',
45
+ action: 'Try Checkpoints'
46
+ },
47
+ {
48
+ id: 'templates',
49
+ icon: (
50
+ <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
51
+ <path d="M14.5 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V7.5L14.5 2z" />
52
+ <polyline points="14 2 14 8 20 8" />
53
+ <line x1="12" y1="18" x2="12" y2="12" />
54
+ <line x1="9" y1="15" x2="15" y2="15" />
55
+ </svg>
56
+ ),
57
+ title: 'Prompt Templates',
58
+ description: 'Create reusable prompt templates for common tasks. Use variables, clipboard integration, and file references to speed up repetitive workflows.',
59
+ action: 'Try Templates'
60
+ }
61
+ ];
62
+
63
+ export function Step3Features({ onNext, onBack, onTryFeature }: Step3FeaturesProps) {
64
+ return (
65
+ <div className="wizard-step-content">
66
+ <h2 className="step-title">Explore Powerful Features</h2>
67
+ <p className="step-subtitle">
68
+ Click "Try" to test any feature right now, or continue to see keyboard shortcuts.
69
+ </p>
70
+
71
+ <div className="features-grid">
72
+ {features.map((feature, index) => (
73
+ <div
74
+ key={feature.id}
75
+ className="feature-card"
76
+ style={{ animationDelay: `${index * 0.1}s` }}
77
+ >
78
+ <div className="feature-icon">{feature.icon}</div>
79
+ <h3 className="feature-title">{feature.title}</h3>
80
+ <p className="feature-description">{feature.description}</p>
81
+ <button
82
+ className="feature-try-btn"
83
+ onClick={() => onTryFeature(feature.id)}
84
+ >
85
+ {feature.action}
86
+ </button>
87
+ </div>
88
+ ))}
89
+ </div>
90
+
91
+ <div className="wizard-actions">
92
+ <button className="wizard-back-btn" onClick={onBack}>
93
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
94
+ <polyline points="15 18 9 12 15 6" strokeLinecap="round" strokeLinejoin="round" />
95
+ </svg>
96
+ Back
97
+ </button>
98
+ <button className="wizard-next-btn" onClick={onNext}>
99
+ Continue
100
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
101
+ <polyline points="9 18 15 12 9 6" strokeLinecap="round" strokeLinejoin="round" />
102
+ </svg>
103
+ </button>
104
+ </div>
105
+
106
+ <style>{`
107
+ .wizard-step-content {
108
+ display: flex;
109
+ flex-direction: column;
110
+ align-items: center;
111
+ width: 100%;
112
+ animation: step-fade-in 0.4s ease;
113
+ }
114
+
115
+ @keyframes step-fade-in {
116
+ from {
117
+ opacity: 0;
118
+ transform: translateY(10px);
119
+ }
120
+ to {
121
+ opacity: 1;
122
+ transform: translateY(0);
123
+ }
124
+ }
125
+
126
+ .step-title {
127
+ font-size: 24px;
128
+ font-weight: 600;
129
+ color: #e9e9ea;
130
+ margin: 0 0 12px 0;
131
+ letter-spacing: -0.3px;
132
+ }
133
+
134
+ .step-subtitle {
135
+ font-size: 14px;
136
+ color: #a9b1d6;
137
+ margin: 0 0 32px 0;
138
+ text-align: center;
139
+ max-width: 600px;
140
+ line-height: 1.6;
141
+ }
142
+
143
+ .features-grid {
144
+ display: grid;
145
+ grid-template-columns: repeat(2, 1fr);
146
+ gap: 20px;
147
+ width: 100%;
148
+ max-width: 900px;
149
+ margin-bottom: 32px;
150
+ }
151
+
152
+ .feature-card {
153
+ padding: 24px;
154
+ background: #1f2335;
155
+ border: 2px solid #3d4458;
156
+ border-radius: 12px;
157
+ display: flex;
158
+ flex-direction: column;
159
+ align-items: flex-start;
160
+ transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
161
+ animation: card-fade-in 0.5s ease backwards;
162
+ }
163
+
164
+ @keyframes card-fade-in {
165
+ from {
166
+ opacity: 0;
167
+ transform: translateY(20px);
168
+ }
169
+ to {
170
+ opacity: 1;
171
+ transform: translateY(0);
172
+ }
173
+ }
174
+
175
+ .feature-card:hover {
176
+ transform: translateY(-4px);
177
+ border-color: #7aa2f7;
178
+ box-shadow: 0 12px 32px rgba(122, 162, 247, 0.2);
179
+ }
180
+
181
+ .feature-icon {
182
+ width: 56px;
183
+ height: 56px;
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ background: rgba(122, 162, 247, 0.1);
188
+ border-radius: 14px;
189
+ color: #7aa2f7;
190
+ margin-bottom: 16px;
191
+ }
192
+
193
+ .feature-title {
194
+ font-size: 16px;
195
+ font-weight: 600;
196
+ color: #e9e9ea;
197
+ margin: 0 0 8px 0;
198
+ }
199
+
200
+ .feature-description {
201
+ font-size: 12px;
202
+ color: #a9b1d6;
203
+ margin: 0 0 16px 0;
204
+ line-height: 1.6;
205
+ flex: 1;
206
+ }
207
+
208
+ .feature-try-btn {
209
+ padding: 8px 16px;
210
+ background: #24283b;
211
+ border: 1px solid #7aa2f7;
212
+ border-radius: 6px;
213
+ color: #7aa2f7;
214
+ font-size: 12px;
215
+ font-weight: 500;
216
+ font-family: 'JetBrains Mono', monospace;
217
+ cursor: pointer;
218
+ transition: all 0.2s ease;
219
+ }
220
+
221
+ .feature-try-btn:hover {
222
+ background: #7aa2f7;
223
+ color: #1a1b26;
224
+ }
225
+
226
+ .wizard-actions {
227
+ display: flex;
228
+ gap: 16px;
229
+ align-items: center;
230
+ }
231
+
232
+ .wizard-back-btn {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 8px;
236
+ padding: 10px 20px;
237
+ background: #24283b;
238
+ border: 1px solid #3d4458;
239
+ border-radius: 8px;
240
+ color: #a9b1d6;
241
+ font-size: 13px;
242
+ font-weight: 500;
243
+ font-family: 'JetBrains Mono', monospace;
244
+ cursor: pointer;
245
+ transition: all 0.2s ease;
246
+ }
247
+
248
+ .wizard-back-btn:hover {
249
+ background: #292e42;
250
+ border-color: #7aa2f7;
251
+ color: #7aa2f7;
252
+ }
253
+
254
+ .wizard-next-btn {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 8px;
258
+ padding: 10px 24px;
259
+ background: linear-gradient(135deg, #7aa2f7, #7dcfff);
260
+ border: none;
261
+ border-radius: 8px;
262
+ color: #1a1b26;
263
+ font-size: 13px;
264
+ font-weight: 600;
265
+ font-family: 'JetBrains Mono', monospace;
266
+ cursor: pointer;
267
+ transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
268
+ box-shadow: 0 4px 16px rgba(122, 162, 247, 0.3);
269
+ }
270
+
271
+ .wizard-next-btn:hover {
272
+ transform: translateY(-2px);
273
+ box-shadow: 0 8px 24px rgba(122, 162, 247, 0.4);
274
+ }
275
+ `}</style>
276
+ </div>
277
+ );
278
+ }