Security (Desktop Wallet): - Implement BIP39 mnemonic generation with cryptographic RNG - Add Argon2id password-based key derivation (64MB, 3 iterations) - Add ChaCha20-Poly1305 authenticated encryption for seed storage - Add mnemonic auto-clear (60s timeout) and clipboard auto-clear (30s) - Add sanitized error logging to prevent credential leaks - Strengthen CSP with object-src, base-uri, form-action, frame-ancestors - Clear sensitive state on component unmount Explorer (Gas Estimator): - Add Gas Estimation page with from/to/amount/data inputs - Add bech32 address validation (synor1/tsynor1 prefix) - Add BigInt-based amount parsing to avoid floating point errors - Add production guard for mock mode (cannot enable in prod builds) Monitoring (30-day Testnet): - Add Prometheus config with 30-day retention - Add comprehensive alert rules for node health, consensus, network, mempool - Add Alertmanager with severity-based routing and inhibition rules - Add Grafana with auto-provisioned datasource and dashboard - Add Synor testnet dashboard with uptime SLA tracking Docker: - Update docker-compose.testnet.yml with monitoring profile - Fix node-exporter for macOS Docker Desktop compatibility - Change Grafana port to 3001 to avoid conflict
74 lines
1.5 KiB
CSS
74 lines
1.5 KiB
CSS
@tailwind base;
|
|
@tailwind components;
|
|
@tailwind utilities;
|
|
|
|
/* Custom scrollbar */
|
|
::-webkit-scrollbar {
|
|
width: 8px;
|
|
height: 8px;
|
|
}
|
|
|
|
::-webkit-scrollbar-track {
|
|
background: theme('colors.gray.900');
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
background: theme('colors.gray.700');
|
|
border-radius: 4px;
|
|
}
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
background: theme('colors.gray.600');
|
|
}
|
|
|
|
/* Custom selection */
|
|
::selection {
|
|
background: theme('colors.synor.500/30');
|
|
}
|
|
|
|
/* Prevent text selection during drag */
|
|
.no-select {
|
|
user-select: none;
|
|
-webkit-user-select: none;
|
|
}
|
|
|
|
/* Smooth transitions */
|
|
* {
|
|
@apply transition-colors duration-150;
|
|
}
|
|
|
|
/* Focus styles */
|
|
*:focus-visible {
|
|
@apply outline-none ring-2 ring-synor-500 ring-offset-2 ring-offset-gray-950;
|
|
}
|
|
|
|
/* Button base styles */
|
|
@layer components {
|
|
.btn {
|
|
@apply px-4 py-2 rounded-lg font-medium transition-all duration-200 inline-flex items-center justify-center gap-2;
|
|
}
|
|
|
|
.btn-primary {
|
|
@apply bg-synor-600 hover:bg-synor-500 text-white;
|
|
}
|
|
|
|
.btn-secondary {
|
|
@apply bg-gray-800 hover:bg-gray-700 text-gray-100;
|
|
}
|
|
|
|
.btn-danger {
|
|
@apply bg-red-600 hover:bg-red-500 text-white;
|
|
}
|
|
|
|
.btn-ghost {
|
|
@apply bg-transparent hover:bg-gray-800 text-gray-300 hover:text-white;
|
|
}
|
|
|
|
.input {
|
|
@apply w-full px-4 py-3 bg-gray-900 border border-gray-700 rounded-lg text-white placeholder-gray-500 focus:border-synor-500 focus:ring-1 focus:ring-synor-500;
|
|
}
|
|
|
|
.card {
|
|
@apply bg-gray-900 border border-gray-800 rounded-xl p-6;
|
|
}
|
|
}
|