Stijnus commited on
Commit
2b585c2
·
1 Parent(s): 723c6a4

ui dark mode enhancements

Browse files
.cursorrules ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Project Overview
2
+
3
+ bolt.diy (previously oTToDev) is an open-source AI-powered full-stack web development platform that allows users to choose different LLM providers for coding assistance. The project supports multiple AI providers including OpenAI, Anthropic, Ollama, OpenRouter, Gemini, LMStudio, Mistral, xAI, HuggingFace, DeepSeek, and Groq.
4
+
5
+ # Personality
6
+
7
+ - Professional and technically precise
8
+ - Focus on best practices and clean code
9
+ - Provide clear explanations for code changes
10
+ - Maintain consistent code style with the existing codebase
11
+
12
+ # Techstack
13
+
14
+ - Framework: Remix
15
+ - Runtime: Node.js (>=18.18.0)
16
+ - Package Manager: pnpm
17
+ - UI: React with TypeScript
18
+ - Styling: UnoCSS
19
+ - Development Environment: Vite
20
+ - Testing: Vitest
21
+ - Deployment: Cloudflare Pages
22
+ - Containerization: Docker
23
+ - Code Quality: ESLint, Prettier, TypeScript
24
+
25
+ # our .env file
26
+
27
+ - Follow .env.example for required environment variables
28
+ - Keep API keys and sensitive data in .env.local
29
+ - Never commit .env files (they are gitignored)
30
+
31
+ # Error Fixing Process
32
+
33
+ 1. Identify the root cause through error messages and logs
34
+ 2. Check relevant components and dependencies
35
+ 3. Verify type safety and TypeScript compliance
36
+ 4. Test changes locally before committing
37
+ 5. Follow existing error handling patterns
38
+
39
+ # Our Codebase
40
+
41
+ - Main application code in /app directory
42
+ - Components follow a modular structure
43
+ - Server-side code in app/lib/.server
44
+ - Client-side utilities in app/lib/
45
+ - Type definitions in types/ directory
46
+ - Documentation in docs/ directory
47
+
48
+ # Current File Structure
49
+
50
+ - /app - Main application code
51
+ - /docs - Documentation
52
+ - /functions - Serverless functions
53
+ - /public - Static assets
54
+ - /scripts - Build and utility scripts
55
+ - /types - TypeScript definitions
56
+ - /icons - SVG icons and assets
57
+
58
+ # github upload process
59
+
60
+ 1. Follow conventional commit messages
61
+ 2. Run linting and tests before committing
62
+ 3. Create feature branches for new work
63
+ 4. Submit PRs with clear descriptions
64
+ 5. Ensure CI/CD checks pass
65
+
66
+ # Important
67
+
68
+ - Keep dependencies updated
69
+ - Follow TypeScript strict mode
70
+ - Maintain backward compatibility
71
+ - Document API changes
72
+ - Test cross-browser compatibility
73
+
74
+ # comments
75
+
76
+ - Use JSDoc for function documentation
77
+ - Keep comments clear and concise
78
+ - Document complex logic and business rules
79
+ - Update comments when changing code
80
+ - Remove redundant comments
81
+ - Always write comments that are relevant to the code they describe
82
+ - Ensure comments explain the "why" not just the "what"
83
+
84
+ # code review
85
+
86
+ - Check for type safety
87
+ - Verify error handling
88
+ - Ensure code follows project patterns
89
+ - Look for performance implications
90
+ - Validate accessibility standards
91
+
92
+ # code writing
93
+
94
+ - Follow TypeScript best practices
95
+ - Use functional components for React
96
+ - Implement proper error boundaries
97
+ - Write testable code
98
+ - Follow the DRY principle
99
+
100
+ # code refactoring
101
+
102
+ - Maintain backward compatibility
103
+ - Update tests alongside changes
104
+ - Document breaking changes
105
+ - Follow the project's type system
106
+ - Keep components modular and reusable
107
+
108
+ # Development Process
109
+
110
+ - Write 3 reasoning paragraphs before implementing solutions
111
+ - Analyze the problem space thoroughly before jumping to conclusions
112
+ - Consider all edge cases and potential impacts
113
+ - Process tasks with a Senior Developer mindset
114
+ - Continue working until the solution is complete and verified
115
+ - Remember and consider the full commit/change history when working
116
+
117
+ # Code Quality Guidelines
118
+
119
+ - Fewer lines of code is better, but not at the expense of readability
120
+ - Preserve existing comments and documentation
121
+ - Add meaningful comments explaining complex logic or business rules
122
+ - Follow the principle of "Clean Code, Clear Intent"
123
+ - Balance between conciseness and maintainability
124
+ - Think twice, code once - avoid premature optimization
125
+ - Never add comments just for the sake of commenting - ensure they add value
126
+
127
+ # Problem Solving Approach
128
+
129
+ 1. Understand the context fully before making changes
130
+ 2. Document your reasoning and assumptions
131
+ 3. Consider alternative approaches and their trade-offs
132
+ 4. Validate your solution against existing patterns
133
+ 5. Test thoroughly before considering work complete
134
+ 6. Review impact on related components
app/components/settings/debug/DebugTab.tsx CHANGED
@@ -502,9 +502,10 @@ export default function DebugTab() {
502
  disabled={loading.systemInfo}
503
  className={classNames(
504
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
505
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
506
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
507
- 'focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2',
 
508
  { 'opacity-50 cursor-not-allowed': loading.systemInfo },
509
  )}
510
  >
@@ -521,9 +522,10 @@ export default function DebugTab() {
521
  disabled={loading.performance}
522
  className={classNames(
523
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
524
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
525
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
526
- 'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2',
 
527
  { 'opacity-50 cursor-not-allowed': loading.performance },
528
  )}
529
  >
@@ -540,9 +542,10 @@ export default function DebugTab() {
540
  disabled={loading.errors}
541
  className={classNames(
542
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
543
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
544
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
545
- 'focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2',
 
546
  { 'opacity-50 cursor-not-allowed': loading.errors },
547
  )}
548
  >
@@ -558,9 +561,10 @@ export default function DebugTab() {
558
  onClick={exportDebugInfo}
559
  className={classNames(
560
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
561
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
562
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
563
- 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2',
 
564
  )}
565
  >
566
  <div className="i-ph:download w-4 h-4" />
@@ -604,8 +608,9 @@ export default function DebugTab() {
604
  onClick={handleLogSystemInfo}
605
  className={classNames(
606
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
607
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
608
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
 
609
  'transition-colors duration-200',
610
  )}
611
  >
@@ -616,8 +621,9 @@ export default function DebugTab() {
616
  onClick={getSystemInfo}
617
  className={classNames(
618
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
619
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
620
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
 
621
  'transition-colors duration-200',
622
  { 'opacity-50 cursor-not-allowed': loading.systemInfo },
623
  )}
@@ -761,9 +767,10 @@ export default function DebugTab() {
761
  onClick={handleLogPerformance}
762
  className={classNames(
763
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
764
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
765
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
766
- 'transition-colors duration-200',
 
767
  { 'opacity-50 cursor-not-allowed': loading.performance },
768
  )}
769
  disabled={loading.performance}
@@ -848,9 +855,10 @@ export default function DebugTab() {
848
  onClick={getWebAppInfo}
849
  className={classNames(
850
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
851
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
852
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
853
- 'transition-colors duration-200',
 
854
  { 'opacity-50 cursor-not-allowed': loading.webAppInfo },
855
  )}
856
  disabled={loading.webAppInfo}
@@ -924,9 +932,10 @@ export default function DebugTab() {
924
  onClick={checkErrors}
925
  className={classNames(
926
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
927
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
928
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
929
- 'transition-colors duration-200',
 
930
  { 'opacity-50 cursor-not-allowed': loading.errors },
931
  )}
932
  disabled={loading.errors}
 
502
  disabled={loading.systemInfo}
503
  className={classNames(
504
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
505
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
506
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
507
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
508
+ 'focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
509
  { 'opacity-50 cursor-not-allowed': loading.systemInfo },
510
  )}
511
  >
 
522
  disabled={loading.performance}
523
  className={classNames(
524
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
525
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
526
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
527
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
528
+ 'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
529
  { 'opacity-50 cursor-not-allowed': loading.performance },
530
  )}
531
  >
 
542
  disabled={loading.errors}
543
  className={classNames(
544
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
545
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
546
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
547
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
548
+ 'focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
549
  { 'opacity-50 cursor-not-allowed': loading.errors },
550
  )}
551
  >
 
561
  onClick={exportDebugInfo}
562
  className={classNames(
563
  'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
564
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
565
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
566
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
567
+ 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
568
  )}
569
  >
570
  <div className="i-ph:download w-4 h-4" />
 
608
  onClick={handleLogSystemInfo}
609
  className={classNames(
610
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
611
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
612
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
613
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
614
  'transition-colors duration-200',
615
  )}
616
  >
 
621
  onClick={getSystemInfo}
622
  className={classNames(
623
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
624
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
625
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
626
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
627
  'transition-colors duration-200',
628
  { 'opacity-50 cursor-not-allowed': loading.systemInfo },
629
  )}
 
767
  onClick={handleLogPerformance}
768
  className={classNames(
769
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
770
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
771
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
772
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
773
+ 'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
774
  { 'opacity-50 cursor-not-allowed': loading.performance },
775
  )}
776
  disabled={loading.performance}
 
855
  onClick={getWebAppInfo}
856
  className={classNames(
857
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
858
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
859
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
860
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
861
+ 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
862
  { 'opacity-50 cursor-not-allowed': loading.webAppInfo },
863
  )}
864
  disabled={loading.webAppInfo}
 
932
  onClick={checkErrors}
933
  className={classNames(
934
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
935
+ 'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
936
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
937
+ 'text-bolt-elements-textPrimary dark:hover:text-purple-500',
938
+ 'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
939
  { 'opacity-50 cursor-not-allowed': loading.errors },
940
  )}
941
  disabled={loading.errors}
app/components/settings/event-logs/EventLogsTab.tsx CHANGED
@@ -307,7 +307,7 @@ export function EventLogsTab() {
307
  setShowLevelFilter(!showLevelFilter);
308
  setShowCategoryFilter(false);
309
  }}
310
- className="flex items-center gap-2 px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
311
  >
312
  <div
313
  className={classNames('text-sm', selectedLevelOption?.icon || 'i-ph:funnel')}
@@ -324,7 +324,7 @@ export function EventLogsTab() {
324
 
325
  {showLevelFilter && (
326
  <div className="absolute left-0 top-full mt-1 z-20">
327
- <div className="p-1 rounded-lg shadow-lg bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700">
328
  {logLevelOptions.map((option) => (
329
  <button
330
  key={option.value}
@@ -335,11 +335,11 @@ export function EventLogsTab() {
335
  className={classNames(
336
  'flex items-center gap-2 w-full px-3 py-1.5 rounded-md text-sm transition-colors',
337
  option.value === selectedLevel
338
- ? 'bg-purple-100 dark:bg-purple-800/40 text-purple-900 dark:text-purple-200'
339
- : 'hover:bg-gray-100 dark:hover:bg-gray-700/50',
340
  )}
341
  >
342
- <div className={classNames(option.icon, 'text-base', option.color)} />
343
  <span>{option.label}</span>
344
  </button>
345
  ))}
@@ -357,7 +357,7 @@ export function EventLogsTab() {
357
  setShowCategoryFilter(!showCategoryFilter);
358
  setShowLevelFilter(false);
359
  }}
360
- className="flex items-center gap-2 px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
361
  >
362
  <div
363
  className={classNames('text-sm', selectedCategoryOption?.icon || 'i-ph:squares-four')}
@@ -376,7 +376,7 @@ export function EventLogsTab() {
376
 
377
  {showCategoryFilter && (
378
  <div className="absolute left-0 top-full mt-1 z-20">
379
- <div className="p-1 rounded-lg shadow-lg bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700">
380
  {logCategoryOptions.map((option) => (
381
  <button
382
  key={option.value}
@@ -387,11 +387,11 @@ export function EventLogsTab() {
387
  className={classNames(
388
  'flex items-center gap-2 w-full px-3 py-1.5 rounded-md text-sm transition-colors',
389
  option.value === selectedCategory
390
- ? 'bg-purple-100 dark:bg-purple-800/40 text-purple-900 dark:text-purple-200'
391
- : 'hover:bg-gray-100 dark:hover:bg-gray-700/50',
392
  )}
393
  >
394
- <div className={classNames(option.icon, 'text-base', option.color)} />
395
  <span>{option.label}</span>
396
  </button>
397
  ))}
 
307
  setShowLevelFilter(!showLevelFilter);
308
  setShowCategoryFilter(false);
309
  }}
310
+ className="flex items-center gap-2 px-3 py-1.5 rounded-lg hover:bg-purple-500/10 dark:hover:bg-purple-500/20 hover:text-purple-500 dark:hover:text-purple-500 transition-colors"
311
  >
312
  <div
313
  className={classNames('text-sm', selectedLevelOption?.icon || 'i-ph:funnel')}
 
324
 
325
  {showLevelFilter && (
326
  <div className="absolute left-0 top-full mt-1 z-20">
327
+ <div className="p-1 rounded-lg shadow-lg bg-white dark:bg-[#1A1A1A] border border-[#E5E5E5] dark:border-[#333333]">
328
  {logLevelOptions.map((option) => (
329
  <button
330
  key={option.value}
 
335
  className={classNames(
336
  'flex items-center gap-2 w-full px-3 py-1.5 rounded-md text-sm transition-colors',
337
  option.value === selectedLevel
338
+ ? 'bg-purple-500/10 dark:bg-purple-500/20 text-purple-500 dark:text-purple-500'
339
+ : 'hover:bg-purple-500/10 dark:hover:bg-purple-500/20 hover:text-purple-500 dark:hover:text-purple-500',
340
  )}
341
  >
342
+ <div className={classNames(option.icon, 'text-base')} style={{ color: option.color }} />
343
  <span>{option.label}</span>
344
  </button>
345
  ))}
 
357
  setShowCategoryFilter(!showCategoryFilter);
358
  setShowLevelFilter(false);
359
  }}
360
+ className="flex items-center gap-2 px-3 py-1.5 rounded-lg hover:bg-purple-500/10 dark:hover:bg-purple-500/20 hover:text-purple-500 dark:hover:text-purple-500 transition-colors"
361
  >
362
  <div
363
  className={classNames('text-sm', selectedCategoryOption?.icon || 'i-ph:squares-four')}
 
376
 
377
  {showCategoryFilter && (
378
  <div className="absolute left-0 top-full mt-1 z-20">
379
+ <div className="p-1 rounded-lg shadow-lg bg-white dark:bg-[#1A1A1A] border border-[#E5E5E5] dark:border-[#333333]">
380
  {logCategoryOptions.map((option) => (
381
  <button
382
  key={option.value}
 
387
  className={classNames(
388
  'flex items-center gap-2 w-full px-3 py-1.5 rounded-md text-sm transition-colors',
389
  option.value === selectedCategory
390
+ ? 'bg-purple-500/10 dark:bg-purple-500/20 text-purple-500 dark:text-purple-500'
391
+ : 'hover:bg-purple-500/10 dark:hover:bg-purple-500/20 hover:text-purple-500 dark:hover:text-purple-500',
392
  )}
393
  >
394
+ <div className={classNames(option.icon, 'text-base')} style={{ color: option.color }} />
395
  <span>{option.label}</span>
396
  </button>
397
  ))}
app/components/settings/providers/LocalProvidersTab.tsx CHANGED
@@ -280,7 +280,13 @@ const LocalProvidersTab = () => {
280
  {provider.name === 'Ollama' && provider.settings.enabled && (
281
  <motion.button
282
  onClick={() => setShowOllamaUpdater(true)}
283
- className={classNames(settingsStyles.button.base, settingsStyles.button.secondary, 'ml-2')}
 
 
 
 
 
 
284
  whileHover={{ scale: 1.02 }}
285
  whileTap={{ scale: 0.98 }}
286
  >
 
280
  {provider.name === 'Ollama' && provider.settings.enabled && (
281
  <motion.button
282
  onClick={() => setShowOllamaUpdater(true)}
283
+ className={classNames(
284
+ settingsStyles.button.base,
285
+ settingsStyles.button.secondary,
286
+ 'ml-2',
287
+ 'hover:bg-purple-500/10 hover:text-purple-500',
288
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500',
289
+ )}
290
  whileHover={{ scale: 1.02 }}
291
  whileTap={{ scale: 0.98 }}
292
  >
app/components/settings/providers/OllamaModelUpdater.tsx CHANGED
@@ -218,7 +218,12 @@ export default function OllamaModelUpdater() {
218
  <motion.button
219
  onClick={handleBulkUpdate}
220
  disabled={isBulkUpdating}
221
- className={classNames(settingsStyles.button.base, settingsStyles.button.primary)}
 
 
 
 
 
222
  whileHover={{ scale: 1.02 }}
223
  whileTap={{ scale: 0.98 }}
224
  >
@@ -280,7 +285,12 @@ export default function OllamaModelUpdater() {
280
  <motion.button
281
  onClick={() => handleSingleUpdate(model.name)}
282
  disabled={model.status === 'updating'}
283
- className={classNames(settingsStyles.button.base, settingsStyles.button.secondary)}
 
 
 
 
 
284
  whileHover={{ scale: 1.02 }}
285
  whileTap={{ scale: 0.98 }}
286
  >
 
218
  <motion.button
219
  onClick={handleBulkUpdate}
220
  disabled={isBulkUpdating}
221
+ className={classNames(
222
+ settingsStyles.button.base,
223
+ settingsStyles.button.primary,
224
+ 'hover:bg-purple-500/10 hover:text-purple-500',
225
+ 'dark:hover:bg-purple-500/20 dark:hover:text-purple-500',
226
+ )}
227
  whileHover={{ scale: 1.02 }}
228
  whileTap={{ scale: 0.98 }}
229
  >
 
285
  <motion.button
286
  onClick={() => handleSingleUpdate(model.name)}
287
  disabled={model.status === 'updating'}
288
+ className={classNames(
289
+ settingsStyles.button.base,
290
+ settingsStyles.button.secondary,
291
+ 'hover:bg-purple-500/10 hover:text-purple-500',
292
+ 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500',
293
+ )}
294
  whileHover={{ scale: 1.02 }}
295
  whileTap={{ scale: 0.98 }}
296
  >
app/components/settings/task-manager/TaskManagerTab.tsx CHANGED
@@ -570,8 +570,10 @@ export default function TaskManagerTab() {
570
  onClick={updateProcesses}
571
  className={classNames(
572
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
573
- 'bg-[#F5F5F5] dark:bg-[#1A1A1A] hover:bg-[#E5E5E5] dark:hover:bg-[#2A2A2A]',
574
- 'text-bolt-elements-textPrimary dark:text-bolt-elements-textPrimary',
 
 
575
  'transition-colors duration-200',
576
  { 'opacity-50 cursor-not-allowed': loading.processes },
577
  )}
 
570
  onClick={updateProcesses}
571
  className={classNames(
572
  'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
573
+ 'bg-[#F5F5F5] dark:bg-[#1A1A1A]',
574
+ 'hover:bg-purple-500/10 hover:text-purple-500',
575
+ 'dark:hover:bg-purple-500/20 dark:hover:text-purple-500',
576
+ 'text-bolt-elements-textPrimary',
577
  'transition-colors duration-200',
578
  { 'opacity-50 cursor-not-allowed': loading.processes },
579
  )}