fix: bump text sizes across all mesh/infonet/settings components

7px→11px, 8px→12px, 9px→13px, 10px→14px (text-sm) across MeshChat,
MeshTerminal, InfonetTerminal (all sub-components), ShodanPanel,
SettingsPanel, and OnboardingModal. 316 instances total.
This commit is contained in:
anoracleofra-code
2026-03-26 10:38:33 -06:00
parent 4897a54803
commit 04939ee6e8
19 changed files with 553 additions and 553 deletions
@@ -40,7 +40,7 @@ export default function BallotView({ onBack }: { onBack: () => void }) {
<div className="mt-6 grid gap-4 md:grid-cols-3">
<div className="border border-gray-800 bg-black/20 p-4">
<div className="text-[10px] text-cyan-400 uppercase tracking-[0.22em]">
<div className="text-sm text-cyan-400 uppercase tracking-[0.22em]">
Principle
</div>
<div className="mt-2 text-sm text-gray-300 leading-relaxed">
@@ -48,7 +48,7 @@ export default function BallotView({ onBack }: { onBack: () => void }) {
</div>
</div>
<div className="border border-gray-800 bg-black/20 p-4">
<div className="text-[10px] text-cyan-400 uppercase tracking-[0.22em]">
<div className="text-sm text-cyan-400 uppercase tracking-[0.22em]">
Current stance
</div>
<div className="mt-2 text-sm text-gray-300 leading-relaxed">
@@ -56,7 +56,7 @@ export default function BallotView({ onBack }: { onBack: () => void }) {
</div>
</div>
<div className="border border-gray-800 bg-black/20 p-4">
<div className="text-[10px] text-cyan-400 uppercase tracking-[0.22em]">
<div className="text-sm text-cyan-400 uppercase tracking-[0.22em]">
Testnet focus
</div>
<div className="mt-2 text-sm text-gray-300 leading-relaxed">
@@ -524,7 +524,7 @@ export default function GateView({
</div>
<button
onClick={() => void refreshGate()}
className="inline-flex items-center gap-2 px-3 py-2 border border-cyan-500/30 bg-cyan-950/20 text-cyan-300 hover:bg-cyan-900/30 transition-colors text-[10px] uppercase tracking-[0.22em]"
className="inline-flex items-center gap-2 px-3 py-2 border border-cyan-500/30 bg-cyan-950/20 text-cyan-300 hover:bg-cyan-900/30 transition-colors text-sm uppercase tracking-[0.22em]"
>
<RefreshCw size={13} />
Refresh
@@ -544,7 +544,7 @@ export default function GateView({
: 'Saved gate face is active for this room. Posts stay scoped to this gate while the room history persists on the obfuscated gate lane.'}
</div>
<div className="mt-3 text-[10px] font-mono text-cyan-400/85">
<div className="mt-3 text-sm font-mono text-cyan-400/85">
{status?.has_local_access
? `LIVE ROOM READY • ${status.identity_scope || entryMode || 'gate'} access`
: loading
@@ -588,7 +588,7 @@ export default function GateView({
</div>
) : null}
{voteNotice ? (
<div className="mb-2 shrink-0 border border-yellow-800/30 bg-yellow-950/10 px-3 py-1.5 text-[10px] text-yellow-400/80 font-mono">
<div className="mb-2 shrink-0 border border-yellow-800/30 bg-yellow-950/10 px-3 py-1.5 text-sm text-yellow-400/80 font-mono">
{voteNotice}
</div>
) : null}
@@ -604,7 +604,7 @@ export default function GateView({
<span className="text-gray-600 ml-2">PINNED</span>
</div>
<h2 className="text-sm md:text-base text-gray-300 leading-relaxed">{introMessage}</h2>
<div className="mt-3 pt-2 border-t border-gray-800/50 text-[10px] text-amber-400/70 tracking-wider uppercase">
<div className="mt-3 pt-2 border-t border-gray-800/50 text-sm text-amber-400/70 tracking-wider uppercase">
Fixed launch gate for the testnet catalog. Dynamic gate creation is disabled.
</div>
</div>
@@ -613,10 +613,10 @@ export default function GateView({
{threadedMessages.map(({ message, depth }) =>
message.system_seed ? (
<div key={message.event_id} className="border border-cyan-900/30 bg-cyan-950/10 px-3 py-3 max-w-3xl">
<div className="text-[8px] font-mono tracking-[0.28em] text-cyan-300/85">
<div className="text-[12px] font-mono tracking-[0.28em] text-cyan-300/85">
{message.fixed_gate ? 'FIXED GATE NOTICE' : 'GATE NOTICE'}
</div>
<div className="mt-2 text-[10px] font-mono text-cyan-100/80 leading-[1.7]">
<div className="mt-2 text-sm font-mono text-cyan-100/80 leading-[1.7]">
{message.message}
</div>
</div>
@@ -632,7 +632,7 @@ export default function GateView({
<div className={`flex-1 border ${depth > 0 ? 'border-gray-800/40 bg-black/10' : 'border-gray-800/70 bg-black/20'} px-3 py-3`}>
<div className="flex items-start justify-between gap-3">
<div className="min-w-0 flex-1">
<div className="flex items-center gap-2 text-[10px] font-mono">
<div className="flex items-center gap-2 text-sm font-mono">
<span className="text-green-400" title={String(message.public_key || message.node_id || '')}>
@{String(message.node_id || '').replace(/^!sb_/, '').slice(0, 8)
|| String(message.public_key || '').slice(0, 8)
@@ -640,7 +640,7 @@ export default function GateView({
</span>
{isEncryptedGateEnvelope(message) ? (
<span
className={`text-[8px] px-1 border ${
className={`text-[12px] px-1 border ${
gateEnvelopeState(message) === 'decrypted'
? 'text-cyan-300 border-cyan-700/60'
: 'text-amber-300 border-amber-700/60'
@@ -649,7 +649,7 @@ export default function GateView({
{gateEnvelopeState(message) === 'decrypted' ? 'DECRYPTED' : 'KEY LOCKED'}
</span>
) : null}
<span className="text-[var(--text-muted)] text-[9px]">{timeAgo(message.timestamp)}</span>
<span className="text-[var(--text-muted)] text-[13px]">{timeAgo(message.timestamp)}</span>
</div>
<div
className={`mt-2 text-[12px] leading-[1.7] whitespace-pre-wrap break-words ${
@@ -668,7 +668,7 @@ export default function GateView({
nodeId: String(message.node_id || ''),
})
}
className="inline-flex items-center gap-1 px-2 py-1 text-[9px] uppercase tracking-[0.18em] border border-cyan-900/40 text-cyan-400 hover:bg-cyan-950/20"
className="inline-flex items-center gap-1 px-2 py-1 text-[13px] uppercase tracking-[0.18em] border border-cyan-900/40 text-cyan-400 hover:bg-cyan-950/20"
>
<Reply size={11} />
Reply
@@ -677,7 +677,7 @@ export default function GateView({
<>
<button
onClick={() => void handleVote(String(message.event_id || ''), 1)}
className={`inline-flex items-center gap-1 px-2 py-1 text-[9px] uppercase tracking-[0.18em] border ${
className={`inline-flex items-center gap-1 px-2 py-1 text-[13px] uppercase tracking-[0.18em] border ${
votedOn[voteScopeKey(String(message.event_id || ''))] === 1
? 'border-cyan-400/60 text-cyan-300 bg-cyan-950/20'
: 'border-cyan-900/40 text-cyan-500 hover:bg-cyan-950/20'
@@ -688,7 +688,7 @@ export default function GateView({
</button>
<button
onClick={() => void handleVote(String(message.event_id || ''), -1)}
className={`inline-flex items-center gap-1 px-2 py-1 text-[9px] uppercase tracking-[0.18em] border ${
className={`inline-flex items-center gap-1 px-2 py-1 text-[13px] uppercase tracking-[0.18em] border ${
votedOn[voteScopeKey(String(message.event_id || ''))] === -1
? 'border-red-400/60 text-red-300 bg-red-950/20'
: 'border-cyan-900/40 text-red-400 hover:bg-red-950/20'
@@ -697,7 +697,7 @@ export default function GateView({
<ArrowDown size={11} />
Down
</button>
<span className="text-[10px] font-mono text-cyan-400/70">
<span className="text-sm font-mono text-cyan-400/70">
SCORE {(() => { const s = reps[String(message.event_id || '')] ?? 0; return s % 1 === 0 ? s : s.toFixed(1); })()}
</span>
</>
@@ -714,7 +714,7 @@ export default function GateView({
<div className="shrink-0 pt-3 mt-2 border-t border-gray-800/50">
{replyContext ? (
<div className="mb-2 flex items-center justify-between gap-2 border border-amber-900/30 bg-amber-950/10 px-3 py-2 text-[10px] text-amber-200/80">
<div className="mb-2 flex items-center justify-between gap-2 border border-amber-900/30 bg-amber-950/10 px-3 py-2 text-sm text-amber-200/80">
<span>
Replying to @{replyContext.eventId.slice(0, 8)}
</span>
@@ -745,7 +745,7 @@ export default function GateView({
<button
onClick={() => void handleSend()}
disabled={busy || !composer.trim() || !status?.has_local_access}
className="inline-flex items-center gap-2 px-4 py-3 border border-cyan-500/40 bg-cyan-950/20 text-cyan-300 hover:bg-cyan-900/30 transition-colors text-[10px] uppercase tracking-[0.22em] disabled:opacity-40"
className="inline-flex items-center gap-2 px-4 py-3 border border-cyan-500/40 bg-cyan-950/20 text-cyan-300 hover:bg-cyan-900/30 transition-colors text-sm uppercase tracking-[0.22em] disabled:opacity-40"
>
<Send size={13} />
Post
@@ -34,17 +34,17 @@ export default function HashchainEvents() {
{ROADMAP_ITEMS.map((item, i) => (
<div key={i} className="group cursor-pointer">
<div className="flex justify-between items-center mb-0.5">
<span className="text-[10px] text-green-400 uppercase tracking-widest border border-gray-800 px-1">
<span className="text-sm text-green-400 uppercase tracking-widest border border-gray-800 px-1">
{item.type}
</span>
<span className="text-[10px] font-bold text-cyan-400">
<span className="text-sm font-bold text-cyan-400">
{item.status}
</span>
</div>
<p className="text-xs text-gray-300 group-hover:text-white transition-colors mt-1">
{item.title}
</p>
<div className="text-[10px] text-gray-500 mt-1 leading-relaxed">
<div className="text-sm text-gray-500 mt-1 leading-relaxed">
{item.detail}
</div>
</div>
@@ -30,7 +30,7 @@ export default function IdentityHUD({ currentDomain = 'TRANSPORT' }: { currentDo
{isExpanded && (
<div className="mb-2 w-64 bg-[#0a0a0a] border border-gray-800 p-3 shadow-[0_0_20px_rgba(6,182,212,0.1)]">
<div className="flex justify-between items-center mb-3 border-b border-gray-800 pb-2">
<span className="text-[10px] text-gray-500 uppercase tracking-widest font-bold">Identity Domains</span>
<span className="text-sm text-gray-500 uppercase tracking-widest font-bold">Identity Domains</span>
<button onClick={() => setIsExpanded(false)} className="text-gray-500 hover:text-white">&times;</button>
</div>
@@ -43,8 +43,8 @@ export default function IdentityHUD({ currentDomain = 'TRANSPORT' }: { currentDo
<div className="flex items-center gap-2">
<span className={isActive ? 'text-cyan-400' : 'text-gray-600'}>{d.icon}</span>
<div>
<p className={`text-[10px] font-bold tracking-tighter ${isActive ? 'text-white' : 'text-gray-500'}`}>{d.name}</p>
<p className="text-[8px] text-gray-600 uppercase">{d.visibility}</p>
<p className={`text-sm font-bold tracking-tighter ${isActive ? 'text-white' : 'text-gray-500'}`}>{d.name}</p>
<p className="text-[12px] text-gray-600 uppercase">{d.visibility}</p>
</div>
</div>
{isActive && (
@@ -63,7 +63,7 @@ export default function IdentityHUD({ currentDomain = 'TRANSPORT' }: { currentDo
</div>
<div className="mt-3 pt-2 border-t border-gray-800">
<p className="text-[8px] text-red-500/70 uppercase leading-tight">
<p className="text-[12px] text-red-500/70 uppercase leading-tight">
CRITICAL: CROSS-DOMAIN LINKAGE IS PROTOCOL-FORBIDDEN.
ROTATING IDENTITY PURGES ALL LOCAL SESSION CACHE.
</p>
@@ -76,7 +76,7 @@ export default function IdentityHUD({ currentDomain = 'TRANSPORT' }: { currentDo
className={`flex items-center gap-3 px-4 py-2 border ${isExpanded ? 'border-cyan-500 bg-cyan-900/20' : 'border-gray-800 bg-gray-900/80'} backdrop-blur-md transition-all hover:border-cyan-400 group`}
>
<div className="flex flex-col items-end">
<span className="text-[10px] text-gray-500 uppercase tracking-widest leading-none mb-1">Active Domain</span>
<span className="text-sm text-gray-500 uppercase tracking-widest leading-none mb-1">Active Domain</span>
<span className={`text-xs font-bold tracking-widest ${domain.color} flex items-center gap-1`}>
{domain.icon} {domain.name}
</span>
@@ -496,7 +496,7 @@ export default function InfonetShell({ isOpen, onClose, onOpenLiveGate }: Infone
<button
key={section.name}
onClick={() => handleCommand(section.name === 'PROFILE' ? 'profile' : section.name.toLowerCase())}
className="flex items-center px-2 py-1 bg-cyan-900/10 border border-cyan-900/50 text-cyan-500 hover:bg-cyan-900/30 hover:text-cyan-400 hover:border-cyan-500/50 transition-all text-[10px] md:text-xs uppercase tracking-widest whitespace-nowrap"
className="flex items-center px-2 py-1 bg-cyan-900/10 border border-cyan-900/50 text-cyan-500 hover:bg-cyan-900/30 hover:text-cyan-400 hover:border-cyan-500/50 transition-all text-sm md:text-xs uppercase tracking-widest whitespace-nowrap"
>
{section.icon}
{section.name === 'PROFILE' ? 'SOVEREIGN' : section.name}
@@ -513,7 +513,7 @@ export default function InfonetShell({ isOpen, onClose, onOpenLiveGate }: Infone
<div className="flex-1 flex flex-col items-center">
<pre
className="text-white drop-shadow-[0_0_8px_rgba(156,163,175,0.8)] text-[10px] sm:text-xs md:text-sm leading-tight select-none text-left inline-block"
className="text-white drop-shadow-[0_0_8px_rgba(156,163,175,0.8)] text-sm sm:text-xs md:text-sm leading-tight select-none text-left inline-block"
style={{ fontFamily: 'Consolas, "Courier New", monospace' }}
>
{ASCII_HEADER}
@@ -623,7 +623,7 @@ export default function InfonetShell({ isOpen, onClose, onOpenLiveGate }: Infone
<div className="flex items-center justify-between px-4 py-2 border-b border-cyan-900/40 bg-cyan-950/20">
<div className="flex items-center gap-2">
<span className="w-1.5 h-1.5 rounded-full bg-amber-500 animate-pulse shadow-[0_0_6px_rgba(245,158,11,0.6)]" />
<span className="text-[9px] tracking-[0.3em] text-amber-400/80 uppercase">System Notice</span>
<span className="text-[13px] tracking-[0.3em] text-amber-400/80 uppercase">System Notice</span>
</div>
<button
onClick={() => setComingSoonModule(null)}
@@ -647,18 +647,18 @@ export default function InfonetShell({ isOpen, onClose, onOpenLiveGate }: Infone
<div className="flex items-center gap-2 mb-4 px-1">
<span className="w-1 h-1 rounded-full bg-amber-500 animate-pulse" />
<span className="text-[9px] tracking-[0.2em] text-amber-400/90 uppercase">
<span className="text-[13px] tracking-[0.2em] text-amber-400/90 uppercase">
{COMING_SOON_MODULES[comingSoonModule].status}
</span>
</div>
<div className="border-t border-gray-800 pt-4 flex items-center justify-between">
<span className="text-[8px] text-gray-600 tracking-[0.2em] uppercase">
<span className="text-[12px] text-gray-600 tracking-[0.2em] uppercase">
Infonet Sovereign Shell v0.1.1 Test-Net
</span>
<button
onClick={() => setComingSoonModule(null)}
className="px-4 py-1.5 border border-cyan-900/50 bg-cyan-950/20 text-cyan-400 text-[10px] tracking-[0.2em] uppercase hover:bg-cyan-900/30 hover:border-cyan-500/40 transition-all"
className="px-4 py-1.5 border border-cyan-900/50 bg-cyan-950/20 text-cyan-400 text-sm tracking-[0.2em] uppercase hover:bg-cyan-900/30 hover:border-cyan-500/40 transition-all"
>
Acknowledged
</button>
@@ -198,14 +198,14 @@ export default function LiveActivityLog() {
<Activity size={14} className="mr-2 animate-pulse text-green-400" />
Live Network Telemetry
</h3>
<span className="text-[10px] text-gray-500 font-mono">
<span className="text-sm text-gray-500 font-mono">
FEEDS: {logs.length} EVENTS
</span>
</div>
<div
ref={scrollRef}
className="flex-1 overflow-y-auto font-mono text-[10px] sm:text-xs space-y-1.5 pr-2 [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-gray-800"
className="flex-1 overflow-y-auto font-mono text-sm sm:text-xs space-y-1.5 pr-2 [&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-gray-800"
>
{logs.length === 0 && (
<div className="text-gray-600 italic text-center py-4">Waiting for data stream...</div>
@@ -107,7 +107,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
</button>
))}
</div>
<span className="text-[10px] text-gray-500 font-mono">{filteredMarkets.length} RESULTS</span>
<span className="text-sm text-gray-500 font-mono">{filteredMarkets.length} RESULTS</span>
</div>
{/* Search Bar */}
@@ -144,7 +144,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
<div className="flex items-start justify-between gap-4 mb-3">
<div className="flex-1">
<div className="text-gray-300 font-bold text-sm md:text-base leading-snug">{market.title}</div>
<div className="flex items-center gap-2 mt-1.5 text-[10px] font-mono">
<div className="flex items-center gap-2 mt-1.5 text-sm font-mono">
<span className={`${catConfig.color} uppercase tracking-widest`}>{market.category}</span>
{vol && <span className="text-gray-500">VOL: {vol}</span>}
{vol24 && <span className="text-gray-500">24H: {vol24}</span>}
@@ -155,12 +155,12 @@ export default function MarketView({ onBack }: MarketViewProps) {
{outcomes && outcomes.length > 0 ? (
<>
<div className="text-2xl font-bold text-cyan-400 font-mono">{outcomes[0].pct}%</div>
<div className="text-[9px] text-gray-400 uppercase truncate max-w-[100px]" title={outcomes[0].name}>{outcomes[0].name}</div>
<div className="text-[13px] text-gray-400 uppercase truncate max-w-[100px]" title={outcomes[0].name}>{outcomes[0].name}</div>
</>
) : (
<>
<div className="text-2xl font-bold text-emerald-400 font-mono">{pct}%</div>
<div className="text-[9px] text-gray-500 uppercase">CONSENSUS</div>
<div className="text-[13px] text-gray-500 uppercase">CONSENSUS</div>
</>
)}
</div>
@@ -169,21 +169,21 @@ export default function MarketView({ onBack }: MarketViewProps) {
{/* Probability bar */}
{outcomes && outcomes.length > 0 ? (
<div className="flex items-center gap-2 mb-3">
<span className="text-[9px] text-cyan-400 font-mono truncate max-w-[80px]" title={outcomes[0].name}>{outcomes[0].name}</span>
<span className="text-[13px] text-cyan-400 font-mono truncate max-w-[80px]" title={outcomes[0].name}>{outcomes[0].name}</span>
<div className="flex-1 h-2 bg-gray-900 overflow-hidden flex">
<div className="bg-cyan-500/60" style={{ width: `${outcomes[0].pct}%` }} />
<div className="bg-gray-700/30 flex-1" />
</div>
<span className="text-[9px] text-cyan-400 font-mono w-8 text-right">{outcomes[0].pct}%</span>
<span className="text-[13px] text-cyan-400 font-mono w-8 text-right">{outcomes[0].pct}%</span>
</div>
) : (
<div className="flex items-center gap-2 mb-3">
<span className="text-[9px] text-green-400 font-mono w-8">YES</span>
<span className="text-[13px] text-green-400 font-mono w-8">YES</span>
<div className="flex-1 h-2 bg-gray-900 overflow-hidden flex">
<div className="bg-emerald-500/60" style={{ width: `${pct}%` }} />
<div className="bg-red-500/30 flex-1" />
</div>
<span className="text-[9px] text-red-400 font-mono w-8 text-right">NO</span>
<span className="text-[13px] text-red-400 font-mono w-8 text-right">NO</span>
</div>
)}
@@ -191,7 +191,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
<div className="flex items-center justify-between flex-wrap gap-2">
<div className="flex items-center gap-1.5 flex-wrap">
{market.sources?.map((s, si) => (
<span key={si} className={`text-[9px] font-mono px-1.5 py-0.5 border ${
<span key={si} className={`text-[13px] font-mono px-1.5 py-0.5 border ${
s.name === 'POLY'
? 'bg-purple-500/15 text-purple-400 border-purple-500/20'
: 'bg-blue-500/15 text-blue-400 border-blue-500/20'
@@ -200,7 +200,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
</span>
))}
{consensus && consensus.total_picks > 0 && (
<span className="text-[9px] font-mono px-1.5 py-0.5 border bg-amber-500/10 text-amber-400 border-amber-500/20">
<span className="text-[13px] font-mono px-1.5 py-0.5 border bg-amber-500/10 text-amber-400 border-amber-500/20">
{consensus.total_picks} pick{consensus.total_picks !== 1 ? 's' : ''}
{consensus.total_staked > 0 ? ` · ${consensus.total_staked.toFixed(1)} REP` : ''}
</span>
@@ -209,7 +209,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
{/* Delta indicator */}
{market.delta_pct != null && market.delta_pct !== 0 && (
<span className={`text-[10px] font-mono font-bold ${market.delta_pct > 0 ? 'text-green-400' : 'text-red-400'}`}>
<span className={`text-sm font-mono font-bold ${market.delta_pct > 0 ? 'text-green-400' : 'text-red-400'}`}>
{market.delta_pct > 0 ? '▲' : '▼'} {Math.abs(market.delta_pct).toFixed(1)}%
</span>
)}
@@ -219,7 +219,7 @@ export default function MarketView({ onBack }: MarketViewProps) {
{outcomes && outcomes.length > 0 && (
<div className="mt-3 pt-2 border-t border-gray-800 space-y-1">
{outcomes.slice(0, 5).map((outcome, oi) => (
<div key={oi} className="flex items-center gap-2 text-[10px]">
<div key={oi} className="flex items-center gap-2 text-sm">
<span className="text-gray-400 w-24 truncate">{outcome.name}</span>
<div className="flex-1 h-1 bg-gray-900 overflow-hidden">
<div className="bg-cyan-500/50 h-full" style={{ width: `${outcome.pct}%` }} />
@@ -1369,7 +1369,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
</button>
<button
onClick={() => void refreshMailbox()}
className="flex items-center text-cyan-400 hover:text-cyan-300 uppercase text-[10px] tracking-[0.2em] border border-cyan-900/50 px-3 py-1 bg-cyan-900/10 disabled:opacity-50"
className="flex items-center text-cyan-400 hover:text-cyan-300 uppercase text-sm tracking-[0.2em] border border-cyan-900/50 px-3 py-1 bg-cyan-900/10 disabled:opacity-50"
disabled={!identity || syncing || !dmLaneReady}
>
<RefreshCcw size={13} className={`mr-2 ${syncing ? 'animate-spin' : ''}`} />
@@ -1474,7 +1474,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
<div className="text-cyan-300 text-sm mb-1">{mail.subject}</div>
<div className="text-xs text-gray-500 line-clamp-2">{messagePreview(mail)}</div>
{!mail.read && (
<div className="mt-2 text-[10px] tracking-[0.2em] uppercase text-cyan-400">
<div className="mt-2 text-sm tracking-[0.2em] uppercase text-cyan-400">
unread
</div>
)}
@@ -1498,7 +1498,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
{formatTimestamp(selectedMessage.timestamp)}
</div>
</div>
<div className="text-[10px] tracking-[0.18em] uppercase text-gray-500">
<div className="text-sm tracking-[0.18em] uppercase text-gray-500">
{selectedMessage.transport || 'local'}
</div>
</div>
@@ -1681,7 +1681,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
setActiveTab('compose');
}}
disabled={!dmLaneReady}
className="px-3 py-2 border border-cyan-500/30 text-cyan-300 text-[10px] tracking-[0.18em] uppercase disabled:opacity-50"
className="px-3 py-2 border border-cyan-500/30 text-cyan-300 text-sm tracking-[0.18em] uppercase disabled:opacity-50"
>
Compose
</button>
@@ -1690,7 +1690,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
blockContact(peerId);
setContacts(getContacts());
}}
className="px-3 py-2 border border-amber-500/30 text-amber-300 text-[10px] tracking-[0.18em] uppercase"
className="px-3 py-2 border border-amber-500/30 text-amber-300 text-sm tracking-[0.18em] uppercase"
>
Restrict
</button>
@@ -1699,7 +1699,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
removeContact(peerId);
setContacts(getContacts());
}}
className="px-3 py-2 border border-red-500/30 text-red-300 text-[10px] tracking-[0.18em] uppercase"
className="px-3 py-2 border border-red-500/30 text-red-300 text-sm tracking-[0.18em] uppercase"
>
Remove
</button>
@@ -1764,7 +1764,7 @@ export default function MessagesView({ onBack }: MessagesViewProps) {
unblockContact(peerId);
setContacts(getContacts());
}}
className="px-4 py-2 border border-cyan-500/40 bg-cyan-950/20 text-cyan-300 text-[10px] tracking-[0.18em] uppercase"
className="px-4 py-2 border border-cyan-500/40 bg-cyan-950/20 text-cyan-300 text-sm tracking-[0.18em] uppercase"
>
Restore
</button>
@@ -55,7 +55,7 @@ export default function NetworkStats() {
: stats.nodeEnabled ? 'SYNCING' : 'OFFLINE';
return (
<div className="flex flex-wrap items-center justify-center gap-x-5 gap-y-1 mt-5 text-[10px] font-mono text-gray-500">
<div className="flex flex-wrap items-center justify-center gap-x-5 gap-y-1 mt-5 text-sm font-mono text-gray-500">
<span>NODE <span className={nodeColor}>{nodeLabel}</span></span>
<span className="text-gray-700">|</span>
<span>MESH <span className={stats.meshtastic > 0 ? 'text-green-400' : 'text-gray-600'}>{stats.meshtastic.toLocaleString()}</span></span>
@@ -187,11 +187,11 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
</div>
<div className="grid grid-cols-2 gap-4 text-right">
<div>
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Lit</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Lit</p>
<p className="text-lg font-bold text-green-400">{upvotes}</p>
</div>
<div>
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Dislikes</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Dislikes</p>
<p className="text-lg font-bold text-red-400">{downvotes}</p>
</div>
</div>
@@ -202,21 +202,21 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
style={{ width: `${repProgress}%` }}
/>
</div>
<p className="mt-2 text-[10px] text-gray-500 uppercase tracking-tighter">
<p className="mt-2 text-sm text-gray-500 uppercase tracking-tighter">
Reputation is derived from live lit/dislike activity. Net rep can drop below zero even when the bar is clamped at zero.
</p>
</div>
<div className="grid grid-cols-2 gap-4 md:col-span-2 mt-2">
<div className="p-3 bg-gray-900/40 border border-gray-800">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Active Months</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Active Months</p>
<p className="text-xl text-white font-bold">0 MONTHS</p>
<p className="text-[9px] text-gray-600 mt-1 uppercase">No live citizenship accounting yet</p>
<p className="text-[13px] text-gray-600 mt-1 uppercase">No live citizenship accounting yet</p>
</div>
<div className="p-3 bg-gray-900/40 border border-gray-800">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Citizenship History</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Citizenship History</p>
<p className="text-xl text-gray-400 font-bold">0 MONTHS</p>
<p className="text-[9px] text-gray-600 mt-1 uppercase">Placeholder totals removed</p>
<p className="text-[13px] text-gray-600 mt-1 uppercase">Placeholder totals removed</p>
</div>
</div>
@@ -227,7 +227,7 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
<p className="text-xl text-cyan-400 font-bold">
{oracleRep.toFixed(1)} <span className="text-xs text-gray-500 font-normal">AVAILABLE</span>
</p>
<p className="text-[10px] text-gray-500 uppercase">
<p className="text-sm text-gray-500 uppercase">
Win Rate {oracleProfile.win_rate}% W {oracleProfile.predictions_won} / L {oracleProfile.predictions_lost}
</p>
</div>
@@ -237,7 +237,7 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
style={{ width: `${oracleProgress}%` }}
/>
</div>
<p className="text-[10px] text-gray-500 uppercase tracking-tighter">
<p className="text-sm text-gray-500 uppercase tracking-tighter">
Available: {oracleRep.toFixed(1)} | Locked: {oracleRepLocked.toFixed(1)} | Total: {oracleRepTotal.toFixed(1)}
</p>
</div>
@@ -251,7 +251,7 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="flex flex-col items-center justify-center p-4 border border-gray-800 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest mb-2">Vote Correlation</p>
<p className="text-sm text-gray-500 uppercase tracking-widest mb-2">Vote Correlation</p>
<div className="relative h-20 w-20">
<svg className="h-full w-full" viewBox="0 0 36 36">
<path className="stroke-gray-800 stroke-[3]" fill="none" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" />
@@ -261,14 +261,14 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
<span className="text-sm font-bold text-gray-400">0.00</span>
</div>
</div>
<p className="text-[8px] text-gray-500 mt-2 uppercase">NOT CALIBRATED</p>
<p className="text-[12px] text-gray-500 mt-2 uppercase">NOT CALIBRATED</p>
</div>
<div className="md:col-span-2 space-y-4">
<div>
<div className="flex justify-between items-center mb-1">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Clustering Coefficient</p>
<p className="text-[10px] text-gray-400 font-bold">0.00</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Clustering Coefficient</p>
<p className="text-sm text-gray-400 font-bold">0.00</p>
</div>
<div className="h-1 w-full bg-gray-900 overflow-hidden">
<div className="h-full bg-gray-500 w-0" />
@@ -276,8 +276,8 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
</div>
<div>
<div className="flex justify-between items-center mb-1">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Temporal Burst Detection</p>
<p className="text-[10px] text-gray-400 font-bold">0.00</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Temporal Burst Detection</p>
<p className="text-sm text-gray-400 font-bold">0.00</p>
</div>
<div className="h-1 w-full bg-gray-900 overflow-hidden">
<div className="h-full bg-gray-500 w-0" />
@@ -285,7 +285,7 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
</div>
<div className="p-2 border border-gray-800 bg-gray-900/20 flex items-start gap-2">
<AlertCircle size={14} className="text-gray-500 shrink-0 mt-0.5" />
<p className="text-[9px] text-gray-500 uppercase leading-tight">
<p className="text-[13px] text-gray-500 uppercase leading-tight">
Advanced network-health analytics are not calibrated for this profile yet. Live reputation above is authoritative; unresolved analytics stay zeroed.
</p>
</div>
@@ -299,27 +299,27 @@ export default function ProfileView({ onBack, persona, isCitizen, nodeId, public
</h2>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Root</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Root</p>
<p className="text-xs text-red-400 font-bold">NEVER PUBLIC</p>
</div>
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Transport</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Transport</p>
<p className="text-xs text-green-400 font-bold">PUBLIC MESH</p>
</div>
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">DM Alias</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">DM Alias</p>
<p className="text-xs text-cyan-400 font-bold">SEMI-OBFUSCATED</p>
</div>
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Gate Session</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Gate Session</p>
<p className="text-xs text-cyan-400 font-bold">ANONYMOUS</p>
</div>
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Gate Persona</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Gate Persona</p>
<p className="text-xs text-cyan-400 font-bold">{displayPersona}</p>
</div>
<div className="border border-gray-800 p-2 bg-[#0a0a0a]">
<p className="text-[10px] text-gray-500 uppercase tracking-widest">Credits</p>
<p className="text-sm text-gray-500 uppercase tracking-widest">Credits</p>
<p className="text-xs text-gray-300 font-bold">0.00 AVAILABLE</p>
</div>
</div>
@@ -70,7 +70,7 @@ export default function TerminalDashboard({ onNavigate, onComingSoon }: Terminal
<div className="flex items-center gap-2">
<span className="text-xs text-cyan-400 uppercase tracking-widest font-bold">GLOBAL THREAT INTERCEPT</span>
{threat && (
<span className={`text-[10px] px-2 py-0.5 ${threatStyle.bg} ${threatStyle.text} ${threatStyle.border} border animate-pulse font-bold`}>
<span className={`text-sm px-2 py-0.5 ${threatStyle.bg} ${threatStyle.text} ${threatStyle.border} border animate-pulse font-bold`}>
{threat.level}
</span>
)}
@@ -101,16 +101,16 @@ export default function TerminalDashboard({ onNavigate, onComingSoon }: Terminal
{filteredNews.length > 0 ? filteredNews.map((article, i) => (
<div key={article.id || i} className="group cursor-pointer">
<div className="flex items-baseline gap-2 mb-0.5">
<span className={`text-[10px] uppercase tracking-widest border border-gray-800 px-1 ${
<span className={`text-sm uppercase tracking-widest border border-gray-800 px-1 ${
article.risk_score >= 7 ? 'text-red-400' :
article.risk_score >= 4 ? 'text-yellow-400' : 'text-green-400'
}`}>
{article.risk_score >= 7 ? 'HIGH' : article.risk_score >= 4 ? 'MED' : 'LOW'}
</span>
<span className="text-[10px] text-gray-600 font-mono uppercase">{article.source}</span>
<span className="text-[10px] text-gray-500 font-mono">{formatTime(article.pub_date)}</span>
<span className="text-sm text-gray-600 font-mono uppercase">{article.source}</span>
<span className="text-sm text-gray-500 font-mono">{formatTime(article.pub_date)}</span>
{article.breaking && (
<span className="text-[10px] text-red-500 font-bold animate-pulse">BREAKING</span>
<span className="text-sm text-red-500 font-bold animate-pulse">BREAKING</span>
)}
</div>
<p className="text-sm text-gray-300 group-hover:text-white transition-colors leading-snug">{article.title}</p>
@@ -204,28 +204,28 @@ export default function TerminalDashboard({ onNavigate, onComingSoon }: Terminal
<div className="flex-1 border border-gray-800 bg-gray-900/20 p-3 flex flex-col justify-between">
<div className="space-y-2">
<div className="flex justify-between items-center border-b border-gray-800/50 pb-1">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Tracked Flights</span>
<span className="text-sm text-gray-500 uppercase tracking-widest">Tracked Flights</span>
<span className="text-xs text-green-400 font-mono">{flightCount.toLocaleString()}</span>
</div>
<div className="flex justify-between items-center border-b border-gray-800/50 pb-1">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Tracked Vessels</span>
<span className="text-sm text-gray-500 uppercase tracking-widest">Tracked Vessels</span>
<span className="text-xs text-cyan-400 font-mono">{shipCount.toLocaleString()}</span>
</div>
<div className="flex justify-between items-center border-b border-gray-800/50 pb-1">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Satellites</span>
<span className="text-sm text-gray-500 uppercase tracking-widest">Satellites</span>
<span className="text-xs text-gray-300 font-mono">{satCount.toLocaleString()}</span>
</div>
<div className="flex justify-between items-center border-b border-gray-800/50 pb-1">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Active Markets</span>
<span className="text-sm text-gray-500 uppercase tracking-widest">Active Markets</span>
<span className="text-xs text-gray-300 font-mono">{markets.length}</span>
</div>
<div className="flex justify-between items-center border-b border-gray-800/50 pb-1">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Correlations</span>
<span className="text-sm text-gray-500 uppercase tracking-widest">Correlations</span>
<span className="text-xs text-amber-400 font-mono">{correlationCount}</span>
</div>
<div className="flex justify-between items-center">
<span className="text-[10px] text-gray-500 uppercase tracking-widest">Threat Level</span>
<span className={`text-[10px] px-2 py-0.5 ${threatStyle.bg} ${threatStyle.text} ${threatStyle.border} border ${threat?.level === 'SEVERE' || threat?.level === 'HIGH' ? 'animate-pulse' : ''}`}>
<span className="text-sm text-gray-500 uppercase tracking-widest">Threat Level</span>
<span className={`text-sm px-2 py-0.5 ${threatStyle.bg} ${threatStyle.text} ${threatStyle.border} border ${threat?.level === 'SEVERE' || threat?.level === 'HIGH' ? 'animate-pulse' : ''}`}>
{threat?.level || 'UNKNOWN'} {threat?.score != null ? `(${threat.score})` : ''}
</span>
</div>
@@ -234,9 +234,9 @@ export default function TerminalDashboard({ onNavigate, onComingSoon }: Terminal
{/* Threat drivers */}
{threat?.drivers && threat.drivers.length > 0 && (
<div className="mt-3 pt-2 border-t border-gray-800">
<span className="text-[8px] text-gray-500 uppercase tracking-widest block mb-1">THREAT DRIVERS</span>
<span className="text-[12px] text-gray-500 uppercase tracking-widest block mb-1">THREAT DRIVERS</span>
{threat.drivers.slice(0, 3).map((driver, i) => (
<p key={i} className="text-[9px] text-gray-400 leading-tight"> {driver}</p>
<p key={i} className="text-[13px] text-gray-400 leading-tight"> {driver}</p>
))}
</div>
)}
@@ -247,8 +247,8 @@ export default function TerminalDashboard({ onNavigate, onComingSoon }: Terminal
<div className="bg-green-500 flex-1"></div>
</div>
<div className="flex justify-between mt-1">
<span className="text-[8px] text-gray-500 uppercase">Threat Score</span>
<span className="text-[8px] text-gray-500 uppercase">{threat?.score ?? '—'}/100</span>
<span className="text-[12px] text-gray-500 uppercase">Threat Score</span>
<span className="text-[12px] text-gray-500 uppercase">{threat?.score ?? '—'}/100</span>
</div>
</div>
</div>
@@ -10,7 +10,7 @@ export default function TrendingPosts() {
<MessageSquare size={14} className="mr-2" /> Gates
</h3>
<div className="space-y-3">
<div className="text-[10px] text-gray-500 leading-relaxed">
<div className="text-sm text-gray-500 leading-relaxed">
<p className="text-amber-400/80 font-bold mb-1">TEST-NET ACTIVE</p>
<p>Gates are decentralized chatrooms running on the Infonet mesh. All messages are end-to-end encrypted via Wormhole.</p>
<p className="mt-2">Type <span className="text-green-400 font-bold">gates</span> or <span className="text-green-400 font-bold">g/</span> to browse available rooms.</p>
@@ -28,7 +28,7 @@ export default function WeatherWidget() {
const dateString = time.toLocaleDateString('en-US', { timeZone: loc.tz, month: 'short', day: 'numeric' });
return (
<div className="flex items-center gap-2 text-[10px] md:text-xs text-gray-400 border border-gray-800 bg-gray-900/30 px-2 py-1 shrink-0 font-mono tracking-widest uppercase whitespace-nowrap">
<div className="flex items-center gap-2 text-sm md:text-xs text-gray-400 border border-gray-800 bg-gray-900/30 px-2 py-1 shrink-0 font-mono tracking-widest uppercase whitespace-nowrap">
<span>{dateString} {timeString}</span>
<span className="text-gray-700">|</span>
<span
@@ -44,7 +44,7 @@ export default function InfonetTerminal({ isOpen, onClose, onOpenLiveGate }: Inf
<div className="flex items-center justify-between px-4 py-2 border-b border-gray-800/60 bg-[#080808] shrink-0 select-none">
<div className="flex items-center gap-2">
<div className="w-2 h-2 rounded-full bg-cyan-500/60 shadow-[0_0_6px_rgba(6,182,212,0.4)]" />
<span className="text-[10px] tracking-[0.3em] text-gray-500 uppercase">
<span className="text-sm tracking-[0.3em] text-gray-500 uppercase">
Infonet Sovereign Shell v0.1.1
</span>
</div>