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.
- package/.roo/rules-code/rules.md +88 -0
- package/dist/cli/index.js +1 -45
- package/dist/core/installers/clients/BaseClientInstaller.d.ts +1 -5
- package/dist/core/installers/clients/BaseClientInstaller.js +40 -38
- package/dist/core/installers/clients/ClientInstaller.d.ts +9 -9
- package/dist/core/installers/clients/ClientInstaller.js +105 -99
- package/dist/core/installers/requirements/BaseInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.d.ts +9 -1
- package/dist/core/installers/requirements/CommandInstaller.js +46 -12
- package/dist/core/installers/requirements/GeneralInstaller.d.ts +11 -1
- package/dist/core/installers/requirements/GeneralInstaller.js +46 -10
- package/dist/core/installers/requirements/InstallerFactory.d.ts +3 -1
- package/dist/core/installers/requirements/InstallerFactory.js +3 -2
- package/dist/core/installers/requirements/NpmInstaller.d.ts +4 -2
- package/dist/core/installers/requirements/NpmInstaller.js +38 -22
- package/dist/core/installers/requirements/PipInstaller.d.ts +3 -1
- package/dist/core/installers/requirements/PipInstaller.js +58 -36
- package/dist/core/installers/requirements/RequirementInstaller.d.ts +4 -1
- package/dist/core/loaders/InstallOperationManager.d.ts +115 -0
- package/dist/core/loaders/InstallOperationManager.js +311 -0
- package/dist/core/loaders/SystemSettingsManager.d.ts +54 -0
- package/dist/core/loaders/SystemSettingsManager.js +257 -0
- package/dist/core/metadatas/constants.d.ts +7 -0
- package/dist/core/metadatas/constants.js +7 -0
- package/dist/core/metadatas/recordingConstants.d.ts +44 -0
- package/dist/core/metadatas/recordingConstants.js +45 -0
- package/dist/core/metadatas/types.d.ts +21 -0
- package/dist/core/onboard/FeedOnboardService.d.ts +7 -3
- package/dist/core/onboard/FeedOnboardService.js +52 -5
- package/dist/core/onboard/InstallOperationManager.d.ts +23 -0
- package/dist/core/onboard/InstallOperationManager.js +144 -0
- package/dist/core/onboard/OnboardStatusManager.js +2 -1
- package/dist/core/validators/StdioServerValidator.js +4 -3
- package/dist/services/InstallationService.d.ts +2 -37
- package/dist/services/InstallationService.js +45 -313
- package/dist/services/MCPManager.d.ts +1 -1
- package/dist/services/MCPManager.js +53 -47
- package/dist/services/RequirementService.d.ts +85 -12
- package/dist/services/RequirementService.js +488 -49
- package/dist/services/ServerService.d.ts +0 -6
- package/dist/services/ServerService.js +0 -74
- package/dist/services/TelemetryService.d.ts +15 -0
- package/dist/services/TelemetryService.js +54 -0
- package/dist/utils/adoUtils.js +6 -3
- package/dist/utils/githubAuth.js +65 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +78 -1
- package/dist/utils/macroExpressionUtils.js +3 -25
- package/dist/utils/osUtils.d.ts +22 -1
- package/dist/utils/osUtils.js +92 -1
- package/dist/utils/versionUtils.d.ts +20 -0
- package/dist/utils/versionUtils.js +76 -0
- package/dist/web/public/css/modal.css +292 -1
- package/dist/web/public/css/serverCategoryList.css +120 -0
- package/dist/web/public/css/serverDetails.css +14 -1
- package/dist/web/public/index.html +126 -21
- package/dist/web/public/js/flights/flights.js +1 -1
- package/dist/web/public/js/modal/index.js +8 -14
- package/dist/web/public/js/modal/installModal.js +3 -4
- package/dist/web/public/js/modal/installation.js +122 -137
- package/dist/web/public/js/modal/loadingModal.js +155 -25
- package/dist/web/public/js/modal/messageQueue.js +45 -101
- package/dist/web/public/js/modal/modalSetup.js +125 -43
- package/dist/web/public/js/modal/modalUtils.js +0 -12
- package/dist/web/public/js/modal.js +23 -10
- package/dist/web/public/js/onboard/formProcessor.js +18 -11
- package/dist/web/public/js/onboard/publishHandler.js +35 -3
- package/dist/web/public/js/onboard/templates.js +5 -1
- package/dist/web/public/js/onboard/uiHandlers.js +266 -39
- package/dist/web/public/js/onboard/validationHandlers.js +71 -39
- package/dist/web/public/js/serverCategoryDetails.js +60 -11
- package/dist/web/public/js/serverCategoryList.js +93 -9
- package/dist/web/public/js/settings.js +314 -0
- package/dist/web/public/onboard.html +2 -2
- package/dist/web/public/settings.html +135 -0
- package/dist/web/public/styles.css +32 -0
- package/dist/web/server.js +93 -1
- package/{src/web/public/js/onboard → docs}/ONBOARDING_PAGE_DESIGN.md +15 -125
- package/docs/Telemetry.md +136 -0
- package/memory-bank/activeContext.md +26 -0
- package/memory-bank/decisionLog.md +91 -0
- package/memory-bank/productContext.md +41 -0
- package/memory-bank/progress.md +35 -0
- package/memory-bank/systemPatterns.md +10 -0
- package/package.json +2 -1
- package/src/cli/index.ts +1 -48
- package/src/core/installers/clients/BaseClientInstaller.ts +64 -50
- package/src/core/installers/clients/ClientInstaller.ts +130 -130
- package/src/core/installers/requirements/BaseInstaller.ts +9 -1
- package/src/core/installers/requirements/CommandInstaller.ts +47 -13
- package/src/core/installers/requirements/GeneralInstaller.ts +48 -10
- package/src/core/installers/requirements/InstallerFactory.ts +4 -3
- package/src/core/installers/requirements/NpmInstaller.ts +90 -68
- package/src/core/installers/requirements/PipInstaller.ts +81 -55
- package/src/core/installers/requirements/RequirementInstaller.ts +4 -3
- package/src/core/loaders/InstallOperationManager.ts +367 -0
- package/src/core/loaders/SystemSettingsManager.ts +278 -0
- package/src/core/metadatas/constants.ts +9 -0
- package/src/core/metadatas/recordingConstants.ts +62 -0
- package/src/core/metadatas/types.ts +23 -0
- package/src/core/onboard/FeedOnboardService.ts +59 -5
- package/src/core/onboard/OnboardStatusManager.ts +2 -1
- package/src/core/validators/StdioServerValidator.ts +4 -3
- package/src/services/InstallationService.ts +54 -399
- package/src/services/MCPManager.ts +61 -64
- package/src/services/RequirementService.ts +564 -67
- package/src/services/ServerService.ts +0 -90
- package/src/services/TelemetryService.ts +59 -0
- package/src/utils/adoUtils.ts +6 -4
- package/src/utils/githubAuth.ts +84 -1
- package/src/utils/logger.ts +83 -1
- package/src/utils/macroExpressionUtils.ts +4 -21
- package/src/utils/osUtils.ts +92 -1
- package/src/utils/versionUtils.ts +98 -13
- package/src/web/public/css/modal.css +292 -1
- package/src/web/public/css/serverCategoryList.css +120 -0
- package/src/web/public/css/serverDetails.css +14 -1
- package/src/web/public/index.html +126 -21
- package/src/web/public/js/flights/flights.js +1 -1
- package/src/web/public/js/modal/index.js +8 -14
- package/src/web/public/js/modal/installModal.js +3 -4
- package/src/web/public/js/modal/installation.js +122 -137
- package/src/web/public/js/modal/loadingModal.js +155 -25
- package/src/web/public/js/modal/modalSetup.js +125 -43
- package/src/web/public/js/modal/modalUtils.js +0 -12
- package/src/web/public/js/modal.js +23 -10
- package/src/web/public/js/onboard/formProcessor.js +18 -11
- package/src/web/public/js/onboard/publishHandler.js +35 -3
- package/src/web/public/js/onboard/templates.js +5 -1
- package/src/web/public/js/onboard/uiHandlers.js +266 -39
- package/src/web/public/js/onboard/validationHandlers.js +71 -39
- package/src/web/public/js/serverCategoryDetails.js +60 -11
- package/src/web/public/js/serverCategoryList.js +93 -9
- package/src/web/public/js/settings.js +314 -0
- package/src/web/public/onboard.html +2 -2
- package/src/web/public/settings.html +135 -0
- package/src/web/public/styles.css +32 -0
- package/src/web/server.ts +96 -1
- package/dist/cli/commands/start.d.ts +0 -2
- package/dist/cli/commands/start.js +0 -32
- package/dist/cli/commands/sync.d.ts +0 -2
- package/dist/cli/commands/sync.js +0 -17
- package/dist/core/ConfigurationLoader.d.ts +0 -32
- package/dist/core/ConfigurationLoader.js +0 -236
- package/dist/core/ConfigurationProvider.d.ts +0 -35
- package/dist/core/ConfigurationProvider.js +0 -375
- package/dist/core/InstallationService.d.ts +0 -50
- package/dist/core/InstallationService.js +0 -350
- package/dist/core/MCPManager.d.ts +0 -28
- package/dist/core/MCPManager.js +0 -188
- package/dist/core/RequirementService.d.ts +0 -40
- package/dist/core/RequirementService.js +0 -110
- package/dist/core/ServerSchemaLoader.d.ts +0 -11
- package/dist/core/ServerSchemaLoader.js +0 -43
- package/dist/core/ServerSchemaProvider.d.ts +0 -17
- package/dist/core/ServerSchemaProvider.js +0 -120
- package/dist/core/constants.d.ts +0 -47
- package/dist/core/constants.js +0 -94
- package/dist/core/installers/BaseInstaller.d.ts +0 -74
- package/dist/core/installers/BaseInstaller.js +0 -253
- package/dist/core/installers/ClientInstaller.d.ts +0 -23
- package/dist/core/installers/ClientInstaller.js +0 -564
- package/dist/core/installers/CommandInstaller.d.ts +0 -37
- package/dist/core/installers/CommandInstaller.js +0 -173
- package/dist/core/installers/GeneralInstaller.d.ts +0 -33
- package/dist/core/installers/GeneralInstaller.js +0 -85
- package/dist/core/installers/InstallerFactory.d.ts +0 -54
- package/dist/core/installers/InstallerFactory.js +0 -97
- package/dist/core/installers/NpmInstaller.d.ts +0 -26
- package/dist/core/installers/NpmInstaller.js +0 -127
- package/dist/core/installers/PipInstaller.d.ts +0 -28
- package/dist/core/installers/PipInstaller.js +0 -127
- package/dist/core/installers/RequirementInstaller.d.ts +0 -33
- package/dist/core/installers/RequirementInstaller.js +0 -3
- package/dist/core/types.d.ts +0 -166
- package/dist/core/types.js +0 -16
- package/dist/services/InstallRequestValidator.d.ts +0 -21
- package/dist/services/InstallRequestValidator.js +0 -99
- package/dist/web/public/js/modal/installHandler.js +0 -227
- package/dist/web/public/js/modal/loadingUI.js +0 -74
- package/dist/web/public/js/modal/modalUI.js +0 -214
- package/dist/web/public/js/modal/version.js +0 -20
- 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:
|
|
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:
|
|
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;
|