imcp 0.0.19 → 0.1.2

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 (183) hide show
  1. package/.roo/rules-code/rules.md +88 -0
  2. package/dist/cli/index.js +1 -45
  3. package/dist/core/installers/clients/BaseClientInstaller.d.ts +1 -5
  4. package/dist/core/installers/clients/BaseClientInstaller.js +40 -38
  5. package/dist/core/installers/clients/ClientInstaller.d.ts +9 -9
  6. package/dist/core/installers/clients/ClientInstaller.js +105 -99
  7. package/dist/core/installers/requirements/BaseInstaller.d.ts +9 -1
  8. package/dist/core/installers/requirements/CommandInstaller.d.ts +9 -1
  9. package/dist/core/installers/requirements/CommandInstaller.js +46 -12
  10. package/dist/core/installers/requirements/GeneralInstaller.d.ts +11 -1
  11. package/dist/core/installers/requirements/GeneralInstaller.js +46 -10
  12. package/dist/core/installers/requirements/InstallerFactory.d.ts +3 -1
  13. package/dist/core/installers/requirements/InstallerFactory.js +3 -2
  14. package/dist/core/installers/requirements/NpmInstaller.d.ts +4 -2
  15. package/dist/core/installers/requirements/NpmInstaller.js +38 -22
  16. package/dist/core/installers/requirements/PipInstaller.d.ts +3 -1
  17. package/dist/core/installers/requirements/PipInstaller.js +58 -36
  18. package/dist/core/installers/requirements/RequirementInstaller.d.ts +4 -1
  19. package/dist/core/loaders/InstallOperationManager.d.ts +115 -0
  20. package/dist/core/loaders/InstallOperationManager.js +311 -0
  21. package/dist/core/loaders/SystemSettingsManager.d.ts +54 -0
  22. package/dist/core/loaders/SystemSettingsManager.js +257 -0
  23. package/dist/core/metadatas/constants.d.ts +7 -0
  24. package/dist/core/metadatas/constants.js +7 -0
  25. package/dist/core/metadatas/recordingConstants.d.ts +44 -0
  26. package/dist/core/metadatas/recordingConstants.js +45 -0
  27. package/dist/core/metadatas/types.d.ts +21 -0
  28. package/dist/core/onboard/FeedOnboardService.d.ts +7 -3
  29. package/dist/core/onboard/FeedOnboardService.js +52 -5
  30. package/dist/core/onboard/InstallOperationManager.d.ts +23 -0
  31. package/dist/core/onboard/InstallOperationManager.js +144 -0
  32. package/dist/core/onboard/OnboardStatusManager.js +2 -1
  33. package/dist/core/validators/StdioServerValidator.js +4 -3
  34. package/dist/services/InstallationService.d.ts +2 -37
  35. package/dist/services/InstallationService.js +45 -313
  36. package/dist/services/MCPManager.d.ts +1 -1
  37. package/dist/services/MCPManager.js +53 -47
  38. package/dist/services/RequirementService.d.ts +85 -12
  39. package/dist/services/RequirementService.js +488 -49
  40. package/dist/services/ServerService.d.ts +0 -6
  41. package/dist/services/ServerService.js +0 -74
  42. package/dist/services/TelemetryService.d.ts +15 -0
  43. package/dist/services/TelemetryService.js +54 -0
  44. package/dist/utils/adoUtils.js +6 -3
  45. package/dist/utils/githubAuth.js +65 -0
  46. package/dist/utils/logger.d.ts +16 -0
  47. package/dist/utils/logger.js +78 -1
  48. package/dist/utils/macroExpressionUtils.js +3 -25
  49. package/dist/utils/osUtils.d.ts +22 -1
  50. package/dist/utils/osUtils.js +92 -1
  51. package/dist/utils/versionUtils.d.ts +20 -0
  52. package/dist/utils/versionUtils.js +76 -0
  53. package/dist/web/public/css/modal.css +292 -1
  54. package/dist/web/public/css/serverCategoryList.css +120 -0
  55. package/dist/web/public/css/serverDetails.css +14 -1
  56. package/dist/web/public/index.html +126 -21
  57. package/dist/web/public/js/flights/flights.js +1 -1
  58. package/dist/web/public/js/modal/index.js +8 -14
  59. package/dist/web/public/js/modal/installModal.js +3 -4
  60. package/dist/web/public/js/modal/installation.js +122 -137
  61. package/dist/web/public/js/modal/loadingModal.js +155 -25
  62. package/dist/web/public/js/modal/messageQueue.js +45 -101
  63. package/dist/web/public/js/modal/modalSetup.js +125 -43
  64. package/dist/web/public/js/modal/modalUtils.js +0 -12
  65. package/dist/web/public/js/modal.js +23 -10
  66. package/dist/web/public/js/onboard/formProcessor.js +18 -11
  67. package/dist/web/public/js/onboard/publishHandler.js +35 -3
  68. package/dist/web/public/js/onboard/templates.js +5 -1
  69. package/dist/web/public/js/onboard/uiHandlers.js +266 -39
  70. package/dist/web/public/js/onboard/validationHandlers.js +71 -39
  71. package/dist/web/public/js/serverCategoryDetails.js +60 -11
  72. package/dist/web/public/js/serverCategoryList.js +93 -9
  73. package/dist/web/public/js/settings.js +314 -0
  74. package/dist/web/public/onboard.html +2 -2
  75. package/dist/web/public/settings.html +135 -0
  76. package/dist/web/public/styles.css +32 -0
  77. package/dist/web/server.js +93 -1
  78. package/{src/web/public/js/onboard → docs}/ONBOARDING_PAGE_DESIGN.md +15 -125
  79. package/docs/Telemetry.md +136 -0
  80. package/memory-bank/activeContext.md +26 -0
  81. package/memory-bank/decisionLog.md +91 -0
  82. package/memory-bank/productContext.md +41 -0
  83. package/memory-bank/progress.md +35 -0
  84. package/memory-bank/systemPatterns.md +10 -0
  85. package/package.json +2 -1
  86. package/src/cli/index.ts +1 -48
  87. package/src/core/installers/clients/BaseClientInstaller.ts +64 -50
  88. package/src/core/installers/clients/ClientInstaller.ts +130 -130
  89. package/src/core/installers/requirements/BaseInstaller.ts +9 -1
  90. package/src/core/installers/requirements/CommandInstaller.ts +47 -13
  91. package/src/core/installers/requirements/GeneralInstaller.ts +48 -10
  92. package/src/core/installers/requirements/InstallerFactory.ts +4 -3
  93. package/src/core/installers/requirements/NpmInstaller.ts +90 -68
  94. package/src/core/installers/requirements/PipInstaller.ts +81 -55
  95. package/src/core/installers/requirements/RequirementInstaller.ts +4 -3
  96. package/src/core/loaders/InstallOperationManager.ts +367 -0
  97. package/src/core/loaders/SystemSettingsManager.ts +278 -0
  98. package/src/core/metadatas/constants.ts +9 -0
  99. package/src/core/metadatas/recordingConstants.ts +62 -0
  100. package/src/core/metadatas/types.ts +23 -0
  101. package/src/core/onboard/FeedOnboardService.ts +59 -5
  102. package/src/core/onboard/OnboardStatusManager.ts +2 -1
  103. package/src/core/validators/StdioServerValidator.ts +4 -3
  104. package/src/services/InstallationService.ts +54 -399
  105. package/src/services/MCPManager.ts +61 -64
  106. package/src/services/RequirementService.ts +564 -67
  107. package/src/services/ServerService.ts +0 -90
  108. package/src/services/TelemetryService.ts +59 -0
  109. package/src/utils/adoUtils.ts +6 -4
  110. package/src/utils/githubAuth.ts +84 -1
  111. package/src/utils/logger.ts +83 -1
  112. package/src/utils/macroExpressionUtils.ts +4 -21
  113. package/src/utils/osUtils.ts +92 -1
  114. package/src/utils/versionUtils.ts +98 -13
  115. package/src/web/public/css/modal.css +292 -1
  116. package/src/web/public/css/serverCategoryList.css +120 -0
  117. package/src/web/public/css/serverDetails.css +14 -1
  118. package/src/web/public/index.html +126 -21
  119. package/src/web/public/js/flights/flights.js +1 -1
  120. package/src/web/public/js/modal/index.js +8 -14
  121. package/src/web/public/js/modal/installModal.js +3 -4
  122. package/src/web/public/js/modal/installation.js +122 -137
  123. package/src/web/public/js/modal/loadingModal.js +155 -25
  124. package/src/web/public/js/modal/modalSetup.js +125 -43
  125. package/src/web/public/js/modal/modalUtils.js +0 -12
  126. package/src/web/public/js/modal.js +23 -10
  127. package/src/web/public/js/onboard/formProcessor.js +18 -11
  128. package/src/web/public/js/onboard/publishHandler.js +35 -3
  129. package/src/web/public/js/onboard/templates.js +5 -1
  130. package/src/web/public/js/onboard/uiHandlers.js +266 -39
  131. package/src/web/public/js/onboard/validationHandlers.js +71 -39
  132. package/src/web/public/js/serverCategoryDetails.js +60 -11
  133. package/src/web/public/js/serverCategoryList.js +93 -9
  134. package/src/web/public/js/settings.js +314 -0
  135. package/src/web/public/onboard.html +2 -2
  136. package/src/web/public/settings.html +135 -0
  137. package/src/web/public/styles.css +32 -0
  138. package/src/web/server.ts +96 -1
  139. package/dist/cli/commands/start.d.ts +0 -2
  140. package/dist/cli/commands/start.js +0 -32
  141. package/dist/cli/commands/sync.d.ts +0 -2
  142. package/dist/cli/commands/sync.js +0 -17
  143. package/dist/core/ConfigurationLoader.d.ts +0 -32
  144. package/dist/core/ConfigurationLoader.js +0 -236
  145. package/dist/core/ConfigurationProvider.d.ts +0 -35
  146. package/dist/core/ConfigurationProvider.js +0 -375
  147. package/dist/core/InstallationService.d.ts +0 -50
  148. package/dist/core/InstallationService.js +0 -350
  149. package/dist/core/MCPManager.d.ts +0 -28
  150. package/dist/core/MCPManager.js +0 -188
  151. package/dist/core/RequirementService.d.ts +0 -40
  152. package/dist/core/RequirementService.js +0 -110
  153. package/dist/core/ServerSchemaLoader.d.ts +0 -11
  154. package/dist/core/ServerSchemaLoader.js +0 -43
  155. package/dist/core/ServerSchemaProvider.d.ts +0 -17
  156. package/dist/core/ServerSchemaProvider.js +0 -120
  157. package/dist/core/constants.d.ts +0 -47
  158. package/dist/core/constants.js +0 -94
  159. package/dist/core/installers/BaseInstaller.d.ts +0 -74
  160. package/dist/core/installers/BaseInstaller.js +0 -253
  161. package/dist/core/installers/ClientInstaller.d.ts +0 -23
  162. package/dist/core/installers/ClientInstaller.js +0 -564
  163. package/dist/core/installers/CommandInstaller.d.ts +0 -37
  164. package/dist/core/installers/CommandInstaller.js +0 -173
  165. package/dist/core/installers/GeneralInstaller.d.ts +0 -33
  166. package/dist/core/installers/GeneralInstaller.js +0 -85
  167. package/dist/core/installers/InstallerFactory.d.ts +0 -54
  168. package/dist/core/installers/InstallerFactory.js +0 -97
  169. package/dist/core/installers/NpmInstaller.d.ts +0 -26
  170. package/dist/core/installers/NpmInstaller.js +0 -127
  171. package/dist/core/installers/PipInstaller.d.ts +0 -28
  172. package/dist/core/installers/PipInstaller.js +0 -127
  173. package/dist/core/installers/RequirementInstaller.d.ts +0 -33
  174. package/dist/core/installers/RequirementInstaller.js +0 -3
  175. package/dist/core/types.d.ts +0 -166
  176. package/dist/core/types.js +0 -16
  177. package/dist/services/InstallRequestValidator.d.ts +0 -21
  178. package/dist/services/InstallRequestValidator.js +0 -99
  179. package/dist/web/public/js/modal/installHandler.js +0 -227
  180. package/dist/web/public/js/modal/loadingUI.js +0 -74
  181. package/dist/web/public/js/modal/modalUI.js +0 -214
  182. package/dist/web/public/js/modal/version.js +0 -20
  183. package/src/web/public/js/modal/messageQueue.js +0 -112
@@ -1,3 +1,40 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import axios from 'axios';
5
+ import { Logger } from './logger.js'; // Assuming logger.js is in the same directory
6
+ // ANSI color codes
7
+ const COLORS = {
8
+ reset: '\x1b[0m',
9
+ yellow: '\x1b[33m'
10
+ };
11
+ const PACKAGE_NAME = 'imcp'; // Default package name
12
+ export function getPackageVersion() {
13
+ try {
14
+ // First try npm environment variable (available during npm scripts)
15
+ if (process.env.npm_package_version) {
16
+ return { packageName: PACKAGE_NAME, packageVersion: process.env.npm_package_version };
17
+ }
18
+ // Fall back to reading package.json
19
+ // Get directory name of current module
20
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
21
+ // Traverse up to find package.json (max 3 levels up)
22
+ let currentDir = __dirname;
23
+ for (let i = 0; i < 3; i++) {
24
+ const packagePath = path.join(currentDir, 'package.json');
25
+ if (fs.existsSync(packagePath)) {
26
+ const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
27
+ return { packageName: PACKAGE_NAME, packageVersion: packageJson.version };
28
+ }
29
+ currentDir = path.join(currentDir, '..');
30
+ }
31
+ return { packageName: PACKAGE_NAME, packageVersion: 'unknown' };
32
+ }
33
+ catch (error) {
34
+ console.error('Failed to get package version:', error);
35
+ return { packageName: PACKAGE_NAME, packageVersion: 'unknown' };
36
+ }
37
+ }
1
38
  /**
2
39
  * Utility functions for version comparison and management
3
40
  */
@@ -23,4 +60,43 @@ export function compareVersions(v1, v2) {
23
60
  }
24
61
  return 0;
25
62
  }
63
+ /**
64
+ * Check if there's a newer version of the package available
65
+ */
66
+ export async function checkForUpdates() {
67
+ Logger.debug(`Checking for updates...`);
68
+ try {
69
+ const version = await getAppVersion();
70
+ if (version.availableUpdate) {
71
+ console.log(`${COLORS.yellow}Update available for ${version.name}: ${version.version} → ${version.availableUpdate.latestVersion}${COLORS.reset}`);
72
+ console.log(`${COLORS.yellow}Relaunch with \`npx -y ${version.name}@latest serve\` or update package with \`npm install -g ${version.name}@latest\`${COLORS.reset}`);
73
+ }
74
+ }
75
+ catch (error) {
76
+ // Log the npm error
77
+ Logger.debug(`Failed to check npm registry: ${error instanceof Error ? error.message : String(error)}`);
78
+ }
79
+ }
80
+ /**
81
+ * Retrieves the application version and information about available updates.
82
+ * @returns A promise that resolves to an object containing the current packageVersion and any availableUpdates.
83
+ */
84
+ export async function getAppVersion() {
85
+ let availableUpdate = undefined;
86
+ const { packageName, packageVersion } = getPackageVersion();
87
+ // Check for updates from npm registry
88
+ try {
89
+ const npmResponse = await axios.get(`https://registry.npmjs.org/${packageName}`);
90
+ if (npmResponse.data && npmResponse.data['dist-tags'] && npmResponse.data['dist-tags'].latest) {
91
+ const latestVersion = npmResponse.data['dist-tags'].latest;
92
+ if (compareVersions(latestVersion, packageVersion) > 0) {
93
+ availableUpdate = { latestVersion, message: `New version (${latestVersion}) is available. Relaunch with \`npx -y ${packageName}@latest serve\`` };
94
+ }
95
+ }
96
+ }
97
+ catch (npmError) {
98
+ Logger.debug(`Failed to fetch latest version from npm for ${packageName}: ${npmError instanceof Error ? npmError.message : String(npmError)}`);
99
+ }
100
+ return { name: packageName, version: packageVersion, availableUpdate };
101
+ }
26
102
  //# sourceMappingURL=versionUtils.js.map
@@ -1,6 +1,66 @@
1
1
  /* Import Inter font */
2
2
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
3
3
 
4
+ /* --- Custom: Loading Modal Overall Status Sizing --- */
5
+ .installation-status-header {
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ margin-bottom: 2rem;
10
+ }
11
+
12
+ .overall-status-icon {
13
+ width: 80px !important;
14
+ height: 80px !important;
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ font-size: 3rem !important;
19
+ margin-bottom: 1rem;
20
+ }
21
+
22
+ .overall-status-icon .status-spinner,
23
+ .overall-status-icon .status-icon-circled,
24
+ .overall-status-icon .status-icon {
25
+ width: 80px !important;
26
+ height: 80px !important;
27
+ font-size: 3rem !important;
28
+ }
29
+
30
+ .overall-status-text {
31
+ font-size: 1.5rem !important; /* Reduced from 2.2rem */
32
+ font-weight: 600; /* Slightly lighter weight */
33
+ color: #2563eb;
34
+ margin: 0;
35
+ text-align: center;
36
+ letter-spacing: 0.01em;
37
+ padding: 0 1rem; /* Added padding for better spacing */
38
+ }
39
+
40
+ .overall-status-icon {
41
+ width: 60px !important; /* Reduced from 80px */
42
+ height: 60px !important;
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ font-size: 2.5rem !important; /* Reduced from 3rem */
47
+ margin-bottom: 0.75rem;
48
+ border-radius: 50%;
49
+ background: rgba(37, 99, 235, 0.1);
50
+ padding: 0.5rem;
51
+ }
52
+
53
+ .overall-status-icon .status-spinner,
54
+ .overall-status-icon .status-icon-circled,
55
+ .overall-status-icon .status-icon {
56
+ width: 100% !important;
57
+ height: 100% !important;
58
+ font-size: inherit !important;
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ }
63
+
4
64
  /* Base styles */
5
65
  body {
6
66
  font-family: 'Inter', system-ui, -apple-system, sans-serif;
@@ -31,7 +91,7 @@ body {
31
91
  border: 3px solid #3498db !important;
32
92
  color: #222 !important;
33
93
  min-width: 320px;
34
- min-height: 120px;
94
+ min-height: 320px; /* Increased height for larger modal */
35
95
  opacity: 1 !important;
36
96
  box-shadow: 0 0 16px #3498db;
37
97
  position: relative;
@@ -463,4 +523,235 @@ body {
463
523
  border-radius: 3px;
464
524
  border: 1px solid #e2e8f0;
465
525
  color: #2563eb;
526
+ }
527
+
528
+ /* Step message styling */
529
+ .message-line.step-message {
530
+ display: flex;
531
+ align-items: flex-start; /* Align items to the top for timestamp */
532
+ padding: 1px 0; /* Further reduced padding */
533
+ font-size: 0.75rem; /* Further reduced font size for steps */
534
+ margin-bottom: 2px; /* Further reduced margin */
535
+ line-height: 1.4; /* Adjust line height for compactness */
536
+ }
537
+
538
+ .step-icon {
539
+ margin-right: 6px; /* Reduced margin */
540
+ font-size: 0.8rem; /* Further smaller icon */
541
+ width: 14px; /* Fixed width for alignment */
542
+ text-align: center;
543
+ flex-shrink: 0; /* Prevent icon from shrinking */
544
+ margin-top: 1px; /* Align icon better with first line of text */
545
+ }
546
+
547
+ .step-icon.success-icon {
548
+ color: #10b981; /* Green */
549
+ }
550
+
551
+ .step-icon.error-icon {
552
+ color: #ef4444; /* Red */
553
+ }
554
+
555
+ .step-icon.pending-icon {
556
+ color: #6b7280; /* Gray */
557
+ }
558
+
559
+ .step-text-content {
560
+ flex-grow: 1;
561
+ display: flex;
562
+ flex-direction: column; /* Stack text and timestamp */
563
+ }
564
+
565
+ .step-text {
566
+ /* flex-grow: 1; */ /* Handled by step-text-content */
567
+ }
568
+
569
+ .step-timestamp {
570
+ font-size: 0.65rem; /* Very small for timestamp */
571
+ color: #9ca3af; /* Lighter gray for timestamp */
572
+ margin-left: 0px; /* Align with step text, icon has its own margin */
573
+ padding-top: 1px;
574
+ }
575
+
576
+ /* New Loading Modal Styles */
577
+ .installation-status-header {
578
+ display: flex;
579
+ align-items: center;
580
+ padding-bottom: 1rem;
581
+ margin-bottom: 1rem;
582
+ border-bottom: 1px solid #e5e7eb; /* Light gray border */
583
+ }
584
+
585
+ .overall-status-icon {
586
+ margin-right: 1rem;
587
+ display: flex;
588
+ align-items: center;
589
+ justify-content: center;
590
+ width: 32px; /* Increased size for overall status icon */
591
+ height: 32px;
592
+ }
593
+
594
+ .overall-status-icon .status-icon {
595
+ font-size: 24px; /* Larger icon */
596
+ }
597
+
598
+ .overall-status-icon.completed .icon-check-container {
599
+ display: flex;
600
+ align-items: center;
601
+ justify-content: center;
602
+ width: 28px; /* Slightly larger to accommodate circle + check */
603
+ height: 28px;
604
+ border-radius: 50%;
605
+ background-color: #10b981; /* Green background for circle */
606
+ border: 2px solid #059669; /* Darker green border */
607
+ }
608
+
609
+ .overall-status-icon.completed .icon-check-container .icon-check {
610
+ color: #ffffff; /* White checkmark */
611
+ font-size: 18px; /* Adjust size of checkmark within circle */
612
+ line-height: 1; /* Ensure check is centered */
613
+ }
614
+
615
+ .overall-status-icon.failed .icon-cross {
616
+ color: #ef4444; /* Red */
617
+ }
618
+
619
+ .status-spinner {
620
+ border: 3px solid #f3f3f3; /* Light grey */
621
+ border-top: 3px solid #3498db; /* Blue */
622
+ border-radius: 50%;
623
+ width: 24px;
624
+ height: 24px;
625
+ animation: spin 1s linear infinite;
626
+ }
627
+
628
+ @keyframes spin {
629
+ 0% { transform: rotate(0deg); }
630
+ 100% { transform: rotate(360deg); }
631
+ }
632
+
633
+ .overall-status-text {
634
+ font-size: 1.125rem; /* Equivalent to text-lg in Tailwind */
635
+ font-weight: 600; /* semibold */
636
+ color: #374151; /* gray-700 */
637
+ }
638
+
639
+ .installation-steps-container {
640
+ /* Styles for the container of the steps list */
641
+ }
642
+
643
+ .steps-list-header {
644
+ font-size: 0.875rem; /* text-sm */
645
+ font-weight: 500; /* medium */
646
+ color: #6b7280; /* gray-500 */
647
+ margin-bottom: 0.5rem;
648
+ padding-left: 4px; /* Align with step items */
649
+ }
650
+
651
+ .install-step-details-list {
652
+ list-style: none;
653
+ padding: 0;
654
+ margin: 0;
655
+ max-height: 250px; /* Or any desired height */
656
+ overflow-y: auto;
657
+ scrollbar-width: thin;
658
+ scrollbar-color: #a0aec0 #e2e8f0; /* Adjust colors as needed */
659
+ }
660
+
661
+ .install-step-details-list::-webkit-scrollbar {
662
+ width: 6px;
663
+ }
664
+
665
+ .install-step-details-list::-webkit-scrollbar-track {
666
+ background: #e2e8f0;
667
+ border-radius: 3px;
668
+ }
669
+
670
+ .install-step-details-list::-webkit-scrollbar-thumb {
671
+ background-color: #a0aec0;
672
+ border-radius: 3px;
673
+ }
674
+
675
+
676
+ .step-detail-item {
677
+ display: flex;
678
+ align-items: flex-start; /* Align icon with the top of the text block */
679
+ justify-content: flex-start; /* Explicitly align content to the start (left) */
680
+ padding: 0.3rem 0.25rem; /* Compact padding */
681
+ font-size: 0.8rem; /* text-xs or sm */
682
+ border-bottom: 1px solid #f3f4f6; /* very light separator */
683
+ }
684
+ .step-detail-item:last-child {
685
+ border-bottom: none;
686
+ }
687
+
688
+ .step-detail-item .step-icon { /* Re-using .step-icon from previous attempt, ensure it's general enough */
689
+ margin-right: 0.5rem;
690
+ font-size: 0.85rem;
691
+ width: 16px;
692
+ text-align: center;
693
+ flex-shrink: 0;
694
+ margin-top: 1px; /* Small adjustment for alignment */
695
+ }
696
+
697
+ .step-detail-item.success .icon-check-small {
698
+ color: #10b981;
699
+ }
700
+
701
+ .step-detail-item.error .icon-cross-small {
702
+ color: #ef4444;
703
+ }
704
+
705
+ .step-info {
706
+ flex-grow: 1;
707
+ display: flex;
708
+ flex-direction: column;
709
+ align-items: flex-start; /* Ensure children (name, message) are left-aligned */
710
+ text-align: left; /* Ensure text within step-info defaults to left */
711
+ }
712
+
713
+ .step-name {
714
+ font-weight: 500; /* medium */
715
+ color: #4b5563; /* gray-600 */
716
+ /* text-align: left; */ /* Should be inherited from .step-info or default */
717
+ }
718
+
719
+ .step-message {
720
+ font-size: 0.75rem; /* text-xs */
721
+ color: #6b7280; /* gray-500 */
722
+ word-break: break-word;
723
+ text-align: left; /* Explicitly align the message text to the left */
724
+ width: 100%; /* Ensure it takes full available width if align-items: flex-start on parent isn't enough */
725
+ }
726
+
727
+ .step-detail-item.error .step-message {
728
+ color: #ef4444; /* Red for error messages */
729
+ }
730
+
731
+ .step-detail-item .step-timestamp { /* Re-using .step-timestamp */
732
+ font-size: 0.7rem; /* Slightly larger than before for readability */
733
+ color: #a0aec0; /* gray-400 */
734
+ margin-left: 0.75rem;
735
+ white-space: nowrap;
736
+ flex-shrink: 0;
737
+ padding-top: 1px; /* Align with step-name */
738
+ }
739
+
740
+ /* Close button for the loading modal specifically */
741
+ #installLoadingModal .modal-content .modal-close-btn {
742
+ position: absolute;
743
+ top: 10px;
744
+ right: 15px;
745
+ font-size: 1.8rem;
746
+ font-weight: bold;
747
+ color: #aaa;
748
+ background: none;
749
+ border: none;
750
+ cursor: pointer;
751
+ padding: 0;
752
+ line-height: 1;
753
+ }
754
+
755
+ #installLoadingModal .modal-content .modal-close-btn:hover {
756
+ color: #333;
466
757
  }
@@ -0,0 +1,120 @@
1
+ /* Server Category List Styles */
2
+ .category-toggle {
3
+ cursor: pointer;
4
+ display: flex;
5
+ align-items: center;
6
+ color: #4b5563; /* gray-600 */
7
+ transition: all 0.2s;
8
+ }
9
+
10
+ .category-toggle:hover {
11
+ color: #1e40af; /* blue-800 */
12
+ }
13
+
14
+ .category-toggle i {
15
+ font-size: 1.25rem;
16
+ transition: transform 0.2s;
17
+ }
18
+
19
+ .category-toggle.collapsed i {
20
+ transform: rotate(-90deg);
21
+ }
22
+
23
+ .server-list-container {
24
+ transition: height 0.3s ease, opacity 0.3s ease, margin 0.3s ease;
25
+ overflow: hidden;
26
+ }
27
+
28
+ .server-list-container.collapsed {
29
+ height: 0 !important;
30
+ opacity: 0;
31
+ margin-top: 0;
32
+ margin-bottom: 0;
33
+ }
34
+
35
+ .category-section {
36
+ margin-bottom: 1rem;
37
+ border-bottom: 1px solid #e5e7eb; /* gray-200 */
38
+ padding-bottom: 0.5rem;
39
+ }
40
+
41
+ .category-section:last-child {
42
+ border-bottom: none;
43
+ margin-bottom: 0;
44
+ }
45
+
46
+ .category-header {
47
+ display: flex;
48
+ justify-content: space-between;
49
+ align-items: center;
50
+ margin-bottom: 0.5rem;
51
+ }
52
+
53
+ /* Pin button styles */
54
+ .pin-button {
55
+ cursor: pointer;
56
+ display: flex;
57
+ align-items: center;
58
+ color: #9ca3af; /* gray-400 */
59
+ margin-right: 8px;
60
+ transition: all 0.2s ease;
61
+ }
62
+
63
+ .pin-button:hover {
64
+ color: #4b5563; /* gray-600 */
65
+ }
66
+
67
+ .pin-button.pinned {
68
+ color: #2563eb; /* blue-600 */
69
+ }
70
+
71
+ .pin-button.pinned:hover {
72
+ color: #1d4ed8; /* blue-700 */
73
+ }
74
+
75
+ /* Pinned server section */
76
+ .server-item.pinned {
77
+ border-left: 3px solid #2563eb; /* blue-600 */
78
+ background-color: #f0f7ff; /* very light blue */
79
+ position: relative;
80
+ transition: all 0.2s ease-in-out;
81
+ }
82
+
83
+ /* Pin animation */
84
+ .server-item {
85
+ transition: transform 0.3s ease, border-left 0.2s ease, background-color 0.2s ease;
86
+ }
87
+
88
+ /* Visual indicator for pinned items at the top */
89
+ .server-item.pinned::before {
90
+ content: "";
91
+ position: absolute;
92
+ top: -3px;
93
+ left: 0;
94
+ right: 0;
95
+ height: 3px;
96
+ background-color: #2563eb; /* blue-600 */
97
+ opacity: 0;
98
+ transition: opacity 0.2s ease;
99
+ }
100
+
101
+ /* Show top indicator for the first pinned item */
102
+ .server-item.pinned:first-child::before {
103
+ opacity: 1;
104
+ }
105
+
106
+ /* Add hover effect to pinned items */
107
+ .server-item.pinned:hover {
108
+ background-color: #e6f0ff; /* slightly darker on hover */
109
+ }
110
+
111
+ /* Pin animation effect */
112
+ @keyframes pin-animation {
113
+ 0% { transform: scale(1); }
114
+ 50% { transform: scale(1.03); }
115
+ 100% { transform: scale(1); }
116
+ }
117
+
118
+ .pin-animation {
119
+ animation: pin-animation 0.3s ease;
120
+ }
@@ -110,10 +110,23 @@
110
110
  padding: 0.5rem 1.5rem;
111
111
  text-align: center;
112
112
  font-weight: 600;
113
- transition: all 0.15s ease;
113
+ transition: none; /* No delay for hover effect */
114
114
  white-space: nowrap;
115
115
  }
116
116
 
117
+ /* Update button (orange) */
118
+ .btn-update {
119
+ background-color: #fb923c; /* orange-400 */
120
+ color: #fff;
121
+ border: none;
122
+ }
123
+ .btn-update:hover, .btn-update:focus {
124
+ background-color: #f97316; /* orange-500 */
125
+ color: #fff;
126
+ border: none;
127
+ box-shadow: 0 0 0 2px #fed7aa;
128
+ }
129
+
117
130
  /* Status badges */
118
131
  .server-item-info .flex-wrap span {
119
132
  display: inline-flex;