synor/apps/desktop-wallet/src/index.css
Gulshan Yadav 6b5a232a5e feat: Desktop wallet, gas estimator UI, and 30-day monitoring stack
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
2026-01-10 04:38:09 +05:30

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;
}
}