diff --git a/.emergent/emergent.yml b/.emergent/emergent.yml index 06634b6..4614a11 100644 --- a/.emergent/emergent.yml +++ b/.emergent/emergent.yml @@ -1,4 +1,4 @@ { "job_id": "fc0ddb3f-43c1-4a3d-a1b6-f0b4e0393b91", - "created_at": "2026-01-27T12:01:15.014238+00:00Z" + "created_at": "2026-01-27T14:46:36.370031+00:00Z" } diff --git a/.gitignore b/.gitignore index 4f8c687..9554ad7 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,19 @@ frontend/node_modules/.cache/default-development/6.pack # Environment files *.env *.env.* +-e +# Environment files +*.env +*.env.* +-e +# Environment files +*.env +*.env.* +-e +# Environment files +*.env +*.env.* +-e +# Environment files +*.env +*.env.* diff --git a/design_guidelines.json b/design_guidelines.json new file mode 100644 index 0000000..02356e2 --- /dev/null +++ b/design_guidelines.json @@ -0,0 +1,141 @@ +{ + "identity": { + "persona": "E1 - The Anti-AI Designer", + "mission": "Redesign BattleTech Forces Manager into a 'Tactical Command Interface'. Reject generic SaaS aesthetics. Embrace 'FUI' (Fictional User Interface) principles: density, purpose, and industrial grit.", + "principles": [ + "Density is Information: BattleTech is about data. Don't hide it. Organize it.", + "Diegetic Immersion: The UI should feel like a physical console in a DropShip.", + "Function over Form: Every border, line, and color must have a tactical meaning.", + "High Contrast: Combat happens in the dark. Data must pop." + ] + }, + "typography": { + "fonts": { + "headings": { + "family": "Rajdhani, sans-serif", + "weights": ["600", "700"], + "usage": "Page titles, Section headers, Modal titles. Use uppercase often." + }, + "body": { + "family": "Inter, sans-serif", + "weights": ["400", "500"], + "usage": "Long form text, notes, descriptions." + }, + "data": { + "family": "JetBrains Mono, monospace", + "weights": ["400", "500"], + "usage": "Stats (BV, Tons), Tables, IDs, Coordinates." + } + }, + "scale": { + "h1": "text-4xl font-bold tracking-tight uppercase", + "h2": "text-2xl font-bold tracking-wide uppercase border-l-4 border-primary pl-3", + "h3": "text-lg font-semibold tracking-wider uppercase text-muted-foreground", + "data-lg": "text-xl font-mono font-medium", + "data-sm": "text-xs font-mono text-muted-foreground" + } + }, + "colors": { + "palette_name": "Orbital Command", + "background": { + "default": "#09090b", + "surface": "#121214", + "panel": "#18181b" + }, + "primary": { + "default": "#F59E0B", + "glow": "rgba(245, 158, 11, 0.5)", + "dim": "#78350f" + }, + "secondary": { + "default": "#06B6D4", + "glow": "rgba(6, 182, 212, 0.5)", + "dim": "#164e63" + }, + "status": { + "operational": "#10B981", + "damaged": "#F59E0B", + "critical": "#EF4444", + "destroyed": "#7F1D1D" + }, + "text": { + "primary": "#FAFAFA", + "secondary": "#A1A1AA", + "muted": "#52525B" + }, + "border": { + "default": "#27272A", + "active": "#F59E0B" + } + }, + "visual_enhancers": { + "borders": { + "tech": "border border-border/50 relative overflow-hidden", + "chamfer": "clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px)" + }, + "effects": { + "scanline": "background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0) 50%, rgba(0,0,0,0.2) 50%, rgba(0,0,0,0.2)); background-size: 100% 4px;", + "glass_panel": "bg-background/80 backdrop-blur-md border border-white/10 shadow-xl", + "glow_text": "text-shadow: 0 0 10px var(--tw-shadow-color)" + } + }, + "components": { + "TacticalCard": { + "description": "Main container for data. Uses chamfered corners or 'tech' borders.", + "classes": "relative bg-card border border-border/40 p-6 overflow-hidden group hover:border-primary/50 transition-colors duration-300", + "decoration": "Add absolute positioned 'brackets' (SVGs) at corners for the HUD look." + }, + "DataGrid": { + "description": "Dense table for rosters.", + "classes": "w-full text-sm font-mono", + "header": "bg-muted/20 text-muted-foreground uppercase tracking-wider text-xs py-3 px-4 text-left", + "row": "border-b border-border/40 hover:bg-primary/5 transition-colors cursor-pointer" + }, + "StatusBadge": { + "description": "Indicator for unit status.", + "classes": "inline-flex items-center px-2.5 py-0.5 rounded-none text-xs font-medium uppercase tracking-wide border border-current bg-transparent" + }, + "TechButton": { + "description": "Primary action element.", + "classes": "relative inline-flex items-center justify-center px-6 py-2 overflow-hidden font-mono font-medium tracking-tighter text-white bg-transparent border border-primary group hover:bg-primary/10 transition-all active:scale-95", + "variant_ghost": "border-transparent hover:bg-muted/20 text-muted-foreground hover:text-foreground" + }, + "StatBar": { + "description": "Health/Armor display.", + "style": "Segmented blocks instead of smooth gradient. Gap-1 between blocks." + } + }, + "layout": { + "grid_system": "Bento Grid (CSS Grid)", + "spacing": "Compact but breathable. Use p-4 for panels, gap-4 for grid.", + "dashboard_structure": { + "header": "h-16 border-b border-border/40 flex items-center justify-between px-6 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50", + "main": "p-6 grid grid-cols-1 md:grid-cols-12 gap-6 max-w-[1920px] mx-auto", + "sidebar": "hidden" + } + }, + "pdf_export": { + "style": "Classified Document", + "background": "#FFFFFF", + "text": "#000000", + "font": "Courier Prime, monospace", + "header": "CONFIDENTIAL // FORCE REPORT", + "footer": "GENERATED BY BATTLETECH FORCES MANAGER // DO NOT DISTRIBUTE", + "borders": "2px solid #000000" + }, + "instructions_to_main_agent": [ + "1. INSTALL FONTS: Add 'Rajdhani' and 'JetBrains Mono' via Google Fonts in index.html or CSS import.", + "2. UPDATE TAILWIND: Configure the 'Orbital Command' colors in tailwind.config.js.", + "3. COMPONENT OVERRIDE: Modify shadcn components (Card, Button, Table) to remove rounded corners (rounded-none or rounded-sm) and add borders.", + "4. LAYOUT: Implement the Bento Grid for the main dashboard. Use 'col-span' classes to size widgets appropriately.", + "5. PDF: Rewrite the PDF generation logic to use the 'Classified Document' style (high contrast black on white).", + "6. DATA-TESTID: Ensure every interactive element has a data-testid attribute." + ], + "UNIVERSAL_GUIDELINES_FOR_MAIN_AGENT": [ + "Avoid 'rounded-xl' or 'rounded-2xl'. This is a military app. Use 'rounded-none' or 'rounded-sm'.", + "Use uppercase text for labels and headers.", + "Opacity is your friend. Use bg-primary/10 for subtle highlights.", + "Don't use gradients for backgrounds. Use solid dark colors or subtle noise textures.", + "Animations should be fast (150ms) and linear or 'ease-out'. No bouncy springs." + ] +} diff --git a/frontend/src/App.js b/frontend/src/App.js index 8774aa1..74b138b 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { Shield, Wrench, Download, Database, Users, Plus, User, Target, List, FileText } from 'lucide-react'; +import { Shield, Wrench, Download, Database, Users, Plus, User, Target, List, FileText, Calendar, Crosshair } from 'lucide-react'; import { Tabs, TabsList, TabsTrigger, TabsContent } from './components/ui/tabs'; import { Select } from './components/ui/select'; import { Button } from './components/ui/button'; @@ -43,6 +43,15 @@ export default function App() { UNIT_STATUS.DESTROYED, ]; + const STATUS_LABELS = { + [UNIT_STATUS.OPERATIONAL]: 'OPR', + [UNIT_STATUS.DAMAGED]: 'DMG', + [UNIT_STATUS.DISABLED]: 'DIS', + [UNIT_STATUS.REPAIRING]: 'REP', + [UNIT_STATUS.UNAVAILABLE]: 'UNV', + [UNIT_STATUS.DESTROYED]: 'DES', + }; + const getStatusCounts = (units = []) => { const counts = STATUS_ORDER.reduce((acc, status) => { acc[status] = 0; @@ -74,17 +83,14 @@ export default function App() { const mechs = selectedForce.mechs || []; const elementals = selectedForce.elementals || []; - // Sum base BV for mechs (excluding destroyed) const mechBaseBV = mechs .filter(m => m.status !== UNIT_STATUS.DESTROYED) .reduce((sum, mech) => sum + (mech.bv || 0), 0); - // Sum adjusted BV for mechs (excluding destroyed) const mechAdjustedBV = mechs .filter(m => m.status !== UNIT_STATUS.DESTROYED) .reduce((sum, mech) => sum + getMechAdjustedBV(selectedForce, mech), 0); - // Sum BV for elementals (excluding destroyed) const elementalBV = elementals .filter(e => e.status !== UNIT_STATUS.DESTROYED) .reduce((sum, e) => sum + (e.bv || 0), 0); @@ -129,345 +135,373 @@ export default function App() { setEditingDate(false); }; + // Loading State if (loading) { return (
- -

Loading forces data...

+
+ +
+
+

+ Initializing Command Interface +

); } + // Error State if (error) { return (
-
+
-

Error Loading Data

-

{error}

-

- Make sure{' '} - data/forces/manifest.json{' '} - exists in the repository. +

+ System Error +

+

{error}

+

+ Verify: data/forces/manifest.json

); } - const HeaderContent = () => ( -
-
-
-
-
- -
-
-

BattleTech Forces Manager

-

Classic Mech & Pilot Management System

-
-
- -
- - - - - - - + // Status Bar Component + const StatusBar = ({ counts, label }) => ( +
+ {label} + {STATUS_ORDER.map((status) => { + const count = counts?.[status] || 0; + const isActive = count > 0; + return ( +
+ {STATUS_LABELS[status]} + + {count} +
-
-
-
+ ); + })} +
); return (
{selectedForce ? ( - {/* Sticky Header Group */} -
- - + {/* === COMMAND HEADER === */} +
+ {/* Top Bar */} +
+ {/* Logo & Title */} +
+
+
+ +
+
+

+ BattleTech Forces Manager +

+

+ Classic Mech & Pilot Management System +

+
+
+
+ + {/* Force Selector & Actions */} +
+ + + + + + + +
+
+ {/* Force Info Banner */} -
-
-
- {selectedForce.image && ( +
+
+ {/* Force Image */} + {selectedForce.image && ( +
{selectedForce.name} - )} - - {/* Special Abilities Table - between image and main content */} - {selectedForce.specialAbilities && selectedForce.specialAbilities.length > 0 && ( -
-

- Special Abilities -

- - + + )} + + {/* Force Details */} +
+
+
+

+ {selectedForce.name} +

+

+ {selectedForce.description} +

+
+ + {/* Special Abilities */} + {selectedForce.specialAbilities && selectedForce.specialAbilities.length > 0 && ( +
+

+ Special Abilities +

+
{selectedForce.specialAbilities.map((ability, index) => ( -
- - - +
+ {ability.title}: + {ability.description} +
))} - -
{ability.title}{ability.description}
-
- )} - -
-

{selectedForce.name}

-

{selectedForce.description}

-
-
- Current Date (in-universe): - setTempDate(e.target.value)} - disabled={!editingDate} - placeholder="3025-01-01" - /> - {editingDate ? ( - <> - - - - ) : ( - - )} +
+ )} +
+ + {/* Stats Grid */} +
+ {/* Date */} +
+ + {editingDate ? ( +
+ setTempDate(e.target.value)} + placeholder="3025-01-01" + /> + + +
+ ) : ( + + )}
-
-
- Warchest: - - {selectedForce.currentWarchest} WP - - Starting: - {selectedForce.startingWarchest} WP - Base BV: - {formatNumber(forceBV.baseBV)} - Adjusted BV: - {formatNumber(forceBV.adjustedBV)} - {selectedForce.originalBaseBV !== undefined && ( - <> - (Original BV: - {formatNumber(selectedForce.originalBaseBV)}/{formatNumber(selectedForce.originalAdjustedBV)}) - - )} + {/* Divider */} +
+ + {/* Warchest */} +
+
+
Warchest
+
+ {formatNumber(selectedForce.currentWarchest)} WP +
+
+
+ / {formatNumber(selectedForce.startingWarchest)}
+
-
- - - - - ))} - - - - - - {STATUS_ORDER.map((status) => ( - - ))} - - - - {STATUS_ORDER.map((status) => ( - - ))} - - -
- {STATUS_ORDER.map((status) => ( - - {status} -
Mechs: - - {mechStatusCounts ? mechStatusCounts[status] : 0} - -
Elementals: - - {elementalStatusCounts ? elementalStatusCounts[status] : 0} - -
+ {/* Divider */} +
+ + {/* BV Stats */} +
+
+
Base BV
+
{formatNumber(forceBV.baseBV)}
+
+
+
Adjusted BV
+
{formatNumber(forceBV.adjustedBV)}
+ + {/* Divider */} +
+ + {/* Status Bars */} +
+ + +
- {/* Tabs List */} -
-
- - - - Mechs - - - - Elementals - - - - Pilots - - - - Missions - - - - Downtime - - - - Ledger - - - - Notes - - - - Snapshots - - - - Data Editor - - -
+ {/* Navigation Tabs */} +
+ + + + Mechs + + + + Elementals + + + + Pilots + + + + Missions + + + + Downtime + + + + Ledger + + + + Notes + + + + Snapshots + + + + Data + +
-
+
- {/* Main Content */} -
- + {/* === MAIN CONTENT === */} +
+ - + - + - + - + - + - + - + - +
+ + {/* Footer */} +
+

+ BattleTech Forces Manager • Orbital Command Interface • All Rights Reserved +

+
) : ( - <> - -
-
- -

No forces available. Check your data/forces/ folder.

+
+
+
+
+ +
+

+ BattleTech Forces Manager +

+
+
+
+
+ +

+ No forces available +

+

+ Check data/forces/ directory +

- +
)} {/* Add Force Dialog */} diff --git a/frontend/src/components/PDFExport.jsx b/frontend/src/components/PDFExport.jsx index 79020c5..9c58ab4 100644 --- a/frontend/src/components/PDFExport.jsx +++ b/frontend/src/components/PDFExport.jsx @@ -23,95 +23,110 @@ const formatNumber = (num) => { .replace(/\B(?=(\d{3})+(?!\d))/g, "'"); }; -// Military-themed styles for PDF +// CLASSIFIED DOCUMENT - High contrast black on white for printing const styles = StyleSheet.create({ page: { - padding: 28, - fontFamily: 'Helvetica', + padding: 40, + fontFamily: 'Courier', fontSize: 9, backgroundColor: '#FFFFFF', + color: '#000000', }, - // Sci-fi frame and accents + // Document border pageBackground: { position: 'absolute', - top: 18, - left: 18, - right: 18, - bottom: 18, - border: '0.75 solid #CBD5F5', + top: 20, + left: 20, + right: 20, + bottom: 20, + border: '2 solid #000000', }, pageCornerAccent: { position: 'absolute', - width: 32, + width: 20, height: 2, - backgroundColor: '#111827', + backgroundColor: '#000000', + }, + // Classification header + classificationHeader: { + textAlign: 'center', + fontSize: 10, + fontWeight: 'bold', + letterSpacing: 4, + marginBottom: 16, + paddingBottom: 8, + borderBottom: '1 solid #000000', }, // Cover/Header Section coverSection: { - marginBottom: 16, - borderBottom: '1 solid #D1D5DB', - paddingBottom: 10, + marginBottom: 20, + borderBottom: '2 solid #000000', + paddingBottom: 16, }, coverHeaderRow: { flexDirection: 'row', alignItems: 'flex-start', - marginBottom: 8, + marginBottom: 12, }, forceImageWrapper: { - width: 70, - marginRight: 10, + width: 80, + marginRight: 16, + border: '1 solid #000000', + padding: 4, }, forceTitleWrapper: { flex: 1, }, forceTitle: { - fontSize: 22, + fontSize: 24, fontWeight: 'bold', - color: '#111827', + color: '#000000', marginBottom: 4, textTransform: 'uppercase', - letterSpacing: 1.5, + letterSpacing: 2, }, forceSubtitle: { fontSize: 9, - color: '#6B7280', + color: '#333333', marginBottom: 8, - fontStyle: 'italic', }, forceStatsRow: { flexDirection: 'row', - justifyContent: 'space-between', - marginTop: 6, + justifyContent: 'flex-start', + marginTop: 8, + gap: 12, }, forceStatBox: { - padding: 6, - backgroundColor: '#F9FAFB', - borderLeft: '2 solid #4B5320', - minWidth: 110, + padding: 8, + backgroundColor: '#F5F5F5', + border: '1 solid #000000', + minWidth: 100, }, forceStatLabel: { fontSize: 7, - color: '#666', + color: '#333333', textTransform: 'uppercase', letterSpacing: 1, marginBottom: 2, }, forceStatValue: { - fontSize: 12, + fontSize: 14, fontWeight: 'bold', - color: '#2C2C2C', + color: '#000000', }, // Section Headers sectionHeader: { - fontSize: 14, + fontSize: 12, fontWeight: 'bold', - color: '#1A1A1A', + color: '#000000', textTransform: 'uppercase', - letterSpacing: 1.5, - marginTop: 18, - marginBottom: 10, + letterSpacing: 2, + marginTop: 20, + marginBottom: 12, paddingBottom: 6, - borderBottom: '2 solid #4B5320', + borderBottom: '2 solid #000000', + backgroundColor: '#EEEEEE', + padding: 8, }, // Roster grid rosterGrid: { @@ -121,59 +136,74 @@ const styles = StyleSheet.create({ }, rosterItem: { width: '48%', - marginBottom: 8, + marginBottom: 10, }, // Unit Cards unitCard: { - padding: 8, - border: '0.75 solid #D1D5DB', - borderLeft: '3 solid #4B5320', + padding: 10, + border: '1 solid #000000', backgroundColor: '#FFFFFF', }, unitHeader: { flexDirection: 'row', justifyContent: 'space-between', + alignItems: 'flex-start', marginBottom: 6, paddingBottom: 4, - borderBottom: '1 solid #E0E0E0', + borderBottom: '1 solid #CCCCCC', }, unitName: { - fontSize: 12, + fontSize: 10, fontWeight: 'bold', - color: '#1A1A1A', + color: '#000000', + textTransform: 'uppercase', + maxWidth: '70%', }, unitBadge: { - fontSize: 8, - color: '#FFF', - backgroundColor: '#16A34A', // operational - green - padding: '2 6', - borderRadius: 2, + fontSize: 7, + color: '#FFFFFF', + backgroundColor: '#16A34A', + padding: '2 5', + textTransform: 'uppercase', + flexShrink: 0, }, unitBadgeDamaged: { - backgroundColor: '#F59E0B', // damaged - amber + backgroundColor: '#F59E0B', + color: '#000000', }, unitBadgeDisabled: { - backgroundColor: '#9CA3AF', // disabled/unavailable - gray + backgroundColor: '#9CA3AF', + color: '#000000', }, unitBadgeDestroyed: { - backgroundColor: '#DC2626', // destroyed/KIA - red + backgroundColor: '#DC2626', + color: '#FFFFFF', }, unitBadgeKIA: { backgroundColor: '#DC2626', + color: '#FFFFFF', }, unitBadgeRepairing: { - backgroundColor: '#3B82F6', // repairing - blue + backgroundColor: '#3B82F6', + color: '#FFFFFF', + }, + unitBadgeUnavailable: { + backgroundColor: '#6B7280', + color: '#FFFFFF', }, unitContentRow: { flexDirection: 'row', }, unitImageWrapper: { - width: 80, + width: 70, alignItems: 'flex-start', - marginRight: 6, + marginRight: 8, + border: '1 solid #CCCCCC', + padding: 2, }, unitStatsWrapper: { flex: 1, + overflow: 'hidden', }, unitStatsGrid: { flexDirection: 'row', @@ -181,152 +211,159 @@ const styles = StyleSheet.create({ }, unitStatItem: { flexDirection: 'row', - minWidth: '45%', - marginRight: 6, + width: '100%', marginBottom: 3, }, unitStatLabel: { fontSize: 8, - color: '#666', + color: '#666666', marginRight: 4, + flexShrink: 0, }, unitStatValue: { fontSize: 8, fontWeight: 'bold', - color: '#2C2C2C', + color: '#000000', + flex: 1, }, unitHistory: { fontSize: 8, - color: '#374151', - marginTop: 5, - padding: 5, - backgroundColor: '#F9FAFB', - borderLeft: '1.5 solid #D1D5DB', - fontStyle: 'italic', + color: '#333333', + marginTop: 6, + padding: 6, + backgroundColor: '#F5F5F5', + border: '1 solid #CCCCCC', }, // Mission Log missionCard: { - marginBottom: 10, - padding: 8, - border: '1 solid #CCCCCC', - borderTop: '3 solid #4B5320', - backgroundColor: '#FAFAFA', + marginBottom: 12, + padding: 10, + border: '1 solid #000000', + backgroundColor: '#FFFFFF', }, missionHeader: { - marginBottom: 6, + marginBottom: 8, + borderBottom: '1 solid #CCCCCC', + paddingBottom: 6, }, missionName: { - fontSize: 12, + fontSize: 11, fontWeight: 'bold', - color: '#1A1A1A', - marginBottom: 3, + color: '#000000', + textTransform: 'uppercase', + marginBottom: 4, }, missionMeta: { fontSize: 8, - color: '#666', + color: '#666666', marginBottom: 4, }, missionSection: { - marginTop: 6, + marginTop: 8, }, missionSectionTitle: { fontSize: 8, fontWeight: 'bold', - color: '#4A4A4A', - marginBottom: 3, + color: '#000000', + marginBottom: 4, textTransform: 'uppercase', }, missionText: { fontSize: 8, - color: '#555', - lineHeight: 1.4, + color: '#333333', + lineHeight: 1.5, }, missionUnits: { fontSize: 8, - color: '#555', - marginLeft: 10, + color: '#333333', + marginLeft: 12, }, - // Activity log table-style rows + // Activity log activityRow: { flexDirection: 'row', - marginBottom: 2, + marginBottom: 3, + borderBottom: '0.5 solid #EEEEEE', + paddingBottom: 2, }, activityDate: { - width: '24%', + width: '22%', fontSize: 8, - color: '#6B7280', + color: '#666666', }, activityText: { flex: 1, fontSize: 8, - color: '#555', + color: '#333333', }, - // Decorative hexagon grid (bottom-right) for sci-fi feel + // Decorative elements removed for cleaner print hexRow: { - flexDirection: 'row', + display: 'none', }, hex: { - width: 10, - height: 10, - borderRadius: 2, - border: '0.5 solid #E5E7EB', - margin: 1, + display: 'none', }, hexRowOffset: { - marginLeft: 5, + display: 'none', }, // Warchest accounting warchestSection: { - marginTop: 10, + marginTop: 12, marginBottom: 16, - padding: 8, - border: '0.75 solid #D1D5DB', + padding: 10, + border: '1 solid #000000', backgroundColor: '#FFFFFF', }, warchestHeaderRow: { flexDirection: 'row', justifyContent: 'space-between', - marginBottom: 4, + marginBottom: 6, + borderBottom: '1 solid #CCCCCC', + paddingBottom: 4, }, warchestHeaderText: { fontSize: 10, fontWeight: 'bold', - color: '#111827', + color: '#000000', + textTransform: 'uppercase', }, warchestTableHeader: { flexDirection: 'row', - borderBottom: '1 solid #E5E7EB', - paddingBottom: 3, - marginBottom: 3, + borderBottom: '1 solid #000000', + paddingBottom: 4, + marginBottom: 4, + backgroundColor: '#EEEEEE', + padding: 4, }, warchestTableHeaderCell: { fontSize: 7, fontWeight: 'bold', - color: '#6B7280', + color: '#000000', + textTransform: 'uppercase', }, warchestTableRow: { flexDirection: 'row', - paddingVertical: 2, + paddingVertical: 3, + borderBottom: '0.5 solid #EEEEEE', }, warchestCellDate: { width: '18%', fontSize: 8, - color: '#374151', + color: '#333333', }, warchestCellType: { width: '14%', fontSize: 8, - color: '#374151', + color: '#333333', }, warchestCellUnit: { width: '23%', fontSize: 8, - color: '#374151', + color: '#333333', }, warchestCellDesc: { width: '25%', fontSize: 8, - color: '#4B5563', + color: '#333333', }, warchestCellCost: { width: '10%', @@ -339,25 +376,25 @@ const styles = StyleSheet.create({ textAlign: 'right', }, warchestCostNegative: { - color: '#B91C1C', // red-700 + color: '#DC2626', fontWeight: 'bold', }, warchestGainPositive: { - color: '#166534', // green-700 + color: '#16A34A', fontWeight: 'bold', }, warchestSummaryRow: { - marginTop: 4, - borderTop: '1 solid #E5E7EB', - paddingTop: 3, + marginTop: 6, + borderTop: '1 solid #000000', + paddingTop: 4, }, warchestSummaryText: { fontSize: 8, - color: '#111827', + color: '#000000', }, - // Snapshot status table + // Snapshot status snapshotRow: { - marginTop: 2, + marginTop: 3, flexDirection: 'row', justifyContent: 'space-between', }, @@ -367,54 +404,71 @@ const styles = StyleSheet.create({ }, snapshotStatusHeaderRow: { flexDirection: 'row', - marginBottom: 1, + marginBottom: 2, }, snapshotStatusHeaderLabel: { - width: 12, + width: 20, fontSize: 7, - color: '#6B7280', + color: '#666666', }, snapshotStatusHeaderCell: { - flexGrow: 1, + width: 28, fontSize: 7, textAlign: 'center', - color: '#6B7280', + color: '#666666', }, snapshotStatusRow: { flexDirection: 'row', - marginBottom: 1, + marginBottom: 2, }, snapshotStatusRowLabel: { - width: 12, + width: 20, fontSize: 7, fontWeight: 'bold', - color: '#6B7280', + color: '#333333', }, snapshotStatusCell: { - flexGrow: 1, + width: 28, alignItems: 'center', + textAlign: 'center', }, snapshotStatusValue: { fontSize: 7, fontWeight: 'bold', }, snapshotMetaCol: { - marginLeft: 8, + marginLeft: 10, justifyContent: 'center', }, snapshotMetaText: { fontSize: 8, - color: '#4B5563', + color: '#333333', }, // Footer + pageFooter: { + position: 'absolute', + bottom: 25, + left: 40, + right: 40, + flexDirection: 'row', + justifyContent: 'space-between', + borderTop: '1 solid #000000', + paddingTop: 6, + }, + pageFooterText: { + fontSize: 7, + color: '#666666', + textTransform: 'uppercase', + letterSpacing: 1, + }, pageNumber: { position: 'absolute', - fontSize: 9, - bottom: 18, + fontSize: 8, + bottom: 25, left: 0, right: 0, textAlign: 'center', - color: '#999', + color: '#333333', }, }); @@ -460,6 +514,8 @@ const VARIANT_TO_STYLE = { disabled: [styles.unitBadge, styles.unitBadgeDisabled], destroyed: [styles.unitBadge, styles.unitBadgeDestroyed], repairing: [styles.unitBadge, styles.unitBadgeRepairing], + unavailable: [styles.unitBadge, styles.unitBadgeUnavailable], + kia: [styles.unitBadge, styles.unitBadgeKIA], }; const getStatusBadgeStyle = (status) => { @@ -520,36 +576,27 @@ const ForcePDF = ({ force, achievementDefs = [] }) => { {/* Page frame & accents */} - - - - + + + + + + {/* Classification Header */} + + CONFIDENTIAL // FORCE STATUS REPORT + {/* Force Information Header */} - - - {force.image && ( )} @@ -631,107 +678,58 @@ const ForcePDF = ({ force, achievementDefs = [] }) => { )} - {/* Snapshots summary (first page, after notes) */} - {snapshots.length > 0 && ( - - - █ CAMPAIGN SNAPSHOTS - - {snapshots.map((snap) => { - const mechStatus = buildStatusCountsForSnapshot(snap, 'mechs'); - const elementalStatus = buildStatusCountsForSnapshot(snap, 'elementals'); - - return ( - - - {snap.createdAt} – {snap.label} ({ - snap.type === 'pre-mission' - ? 'Pre-Mission' - : snap.type === 'post-mission' - ? 'Post-Mission' - : 'Post-Downtime' - }) - - - - - - - {STATUS_ORDER.map((status) => ( - - {STATUS_LABELS[status]} - - ))} - - - - M: - {STATUS_ORDER.map((status) => ( - - - {mechStatus[status] || 0} - - - ))} - - - - E: - {STATUS_ORDER.map((status) => ( - - - {elementalStatus[status] || 0} - - - ))} - - + {/* Snapshots summary - paginated (max 10 per page) */} + {snapshots.length > 0 && (() => { + const SNAPSHOTS_PER_PAGE = 10; + const pages = []; + for (let i = 0; i < snapshots.length; i += SNAPSHOTS_PER_PAGE) { + pages.push(snapshots.slice(i, i + SNAPSHOTS_PER_PAGE)); + } + + // Helper to format status counts as a single string + const formatStatusLine = (label, statusCounts) => { + const parts = STATUS_ORDER.map(status => { + const count = statusCounts[status] || 0; + return `${STATUS_LABELS[status]}:${count}`; + }); + return `${label} ${parts.join(' ')}`; + }; + + return pages.map((pageSnapshots, pageIndex) => ( + 0}> + + {pageIndex === 0 ? '█ CAMPAIGN SNAPSHOTS' : `█ CAMPAIGN SNAPSHOTS (cont. ${pageIndex + 1}/${pages.length})`} + + {pageSnapshots.map((snap) => { + const mechStatus = buildStatusCountsForSnapshot(snap, 'mechs'); + const elementalStatus = buildStatusCountsForSnapshot(snap, 'elementals'); + const snapTypeLabel = snap.type === 'pre-mission' ? 'Pre-Mission' : snap.type === 'post-mission' ? 'Post-Mission' : 'Post-Downtime'; + const dateLabel = snap.createdAt || '—'; + const snapLabel = snap.label || '—'; + const wpValue = formatNumber(snap.currentWarchest || 0); + const wpDelta = snap.netWarchestChange || 0; + const wpDeltaStr = `${wpDelta >= 0 ? '+' : ''}${formatNumber(wpDelta)}`; - - - Missions completed: {snap.missionsCompleted} - - - Warchest: {formatNumber(snap.currentWarchest)} WP - - - Net Δ WP:{' '} - {snap.netWarchestChange >= 0 ? '+' : ''} - {formatNumber(snap.netWarchestChange)} - - + return ( + + + {`${dateLabel} — ${snapLabel} (${snapTypeLabel})`} + + + {formatStatusLine('Mechs:', mechStatus)} + + + {formatStatusLine('Elem:', elementalStatus)} + + + {`Missions: ${snap.missionsCompleted || 0} | WP: ${wpValue} | Δ: ${wpDeltaStr}`} + - - ); - })} - - )} + ); + })} + + )); + })()} {/* Pilot Roster Section */} @@ -773,18 +771,14 @@ const ForcePDF = ({ force, achievementDefs = [] }) => { - - Gunnery: - {pilot.gunnery || 0} - - - Piloting: - {pilot.piloting || 0} + + G/P: + {pilot.gunnery || 0}/{pilot.piloting || 0} {assignedMech && ( - - Assigned Mech: - {assignedMech.name} + + Mech: + {assignedMech.name} )} diff --git a/frontend/src/index.css b/frontend/src/index.css index 34f7618..7e9e6f9 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,4 +1,4 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Roboto+Mono:wght@400;500;600&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Rajdhani:wght@500;600;700&display=swap'); @tailwind base; @tailwind components; @@ -6,52 +6,43 @@ @layer base { :root { - /* Military tactical dark theme - Battletech inspired */ - --background: 220 13% 9%; /* Deep dark gray-blue #14161a */ - --foreground: 210 15% 90%; /* Light gray for text */ + /* ORBITAL COMMAND - Tactical Dark Theme */ + --background: 240 6% 4%; /* Deep void #09090b */ + --foreground: 0 0% 98%; /* Near white #FAFAFA */ - --card: 220 13% 12%; /* Slightly lighter than background */ - --card-foreground: 210 15% 90%; + --card: 240 4% 7%; /* Surface #121214 */ + --card-foreground: 0 0% 98%; - --popover: 220 13% 12%; - --popover-foreground: 210 15% 90%; + --popover: 240 4% 10%; /* Panel #18181b */ + --popover-foreground: 0 0% 98%; - --primary: 25 95% 53%; /* Aerospace Orange #FF4F00 */ - --primary-foreground: 220 13% 9%; + --primary: 38 92% 50%; /* Amber #F59E0B */ + --primary-foreground: 240 6% 4%; - --secondary: 58 31% 21%; /* Army Green #454B1B */ - --secondary-foreground: 210 15% 90%; + --secondary: 187 94% 43%; /* Cyan #06B6D4 */ + --secondary-foreground: 0 0% 98%; - --muted: 220 10% 18%; /* Muted dark gray */ - --muted-foreground: 210 10% 60%; + --muted: 240 4% 16%; /* Dark zinc */ + --muted-foreground: 240 5% 65%; /* #A1A1AA */ - --accent: 30 100% 45%; /* Dark Orange accent #C76E00 */ - --accent-foreground: 210 15% 95%; + --accent: 38 92% 50%; /* Amber accent */ + --accent-foreground: 240 6% 4%; - --destructive: 0 72% 51%; - --destructive-foreground: 210 15% 95%; + --destructive: 0 84% 60%; /* Red #EF4444 */ + --destructive-foreground: 0 0% 98%; - --border: 220 13% 20%; /* Subtle border */ - --input: 220 13% 18%; - --ring: 25 95% 53%; /* Orange ring for focus */ + --border: 240 4% 16%; /* #27272A */ + --input: 240 4% 10%; + --ring: 38 92% 50%; /* Amber ring */ - --radius: 0.25rem; + --radius: 0.125rem; /* Minimal radius - military angular */ - /* Custom tactical tokens */ - --tactical-panel: 220 13% 11%; - --tactical-highlight: 25 95% 53%; - --status-operational: 142 76% 36%; - --status-damaged: 38 92% 50%; - --status-disabled: 0 72% 51%; - --status-destroyed: 0 72% 51%; - --status-repairing: 217 91% 60%; - - /* Shadows */ - --shadow-tactical: 0 4px 12px -2px rgba(255, 79, 0, 0.15); - --shadow-panel: 0 2px 8px rgba(0, 0, 0, 0.4); - - /* Transitions */ - --transition-smooth: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + /* Status colors */ + --status-operational: 160 84% 39%; /* Emerald #10B981 */ + --status-damaged: 38 92% 50%; /* Amber #F59E0B */ + --status-critical: 0 84% 60%; /* Red #EF4444 */ + --status-destroyed: 0 63% 31%; /* Dark red #7F1D1D */ + --status-repairing: 187 94% 43%; /* Cyan #06B6D4 */ } } @@ -59,72 +50,191 @@ * { @apply border-border; } + + html { + scroll-behavior: smooth; + } + body { - @apply bg-background text-foreground; + @apply bg-background text-foreground antialiased; + font-family: 'Inter', system-ui, sans-serif; font-feature-settings: 'rlig' 1, 'calt' 1; } + + h1, h2, h3, h4, h5, h6 { + font-family: 'Rajdhani', sans-serif; + @apply font-semibold tracking-wide; + } } @layer components { + /* === TACTICAL PANELS === */ .tactical-panel { - @apply bg-card border border-border rounded-md shadow-lg; - box-shadow: var(--shadow-panel); + @apply relative bg-card border border-border/40 overflow-hidden; + @apply transition-colors duration-150; + } + + .tactical-panel:hover { + @apply border-border/60; + } + + .tactical-panel::before { + content: ''; + @apply absolute top-0 left-0 w-1 h-full bg-primary/60; } .tactical-header { - @apply border-b border-border bg-muted/30 px-4 py-3; + @apply border-b border-border/40 bg-muted/20 px-4 py-3; + @apply flex items-center justify-between; } - .status-badge { - @apply inline-flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-medium uppercase tracking-wider; + .tactical-header h3 { + @apply text-sm font-semibold uppercase tracking-wider text-foreground/90; + font-family: 'Rajdhani', sans-serif; } + /* === DATA TABLES === */ .data-table { - @apply w-full border-collapse; + @apply w-full border-collapse font-mono text-sm; } .data-table th { - @apply bg-muted/50 px-4 py-3 text-left text-xs font-semibold uppercase tracking-wider text-muted-foreground border-b border-border; + @apply bg-muted/30 px-4 py-3 text-left; + @apply text-[11px] font-semibold uppercase tracking-wider text-muted-foreground; + @apply border-b border-border/60; + font-family: 'Rajdhani', sans-serif; } .data-table td { - @apply px-4 py-3 text-sm border-b border-border/50; + @apply px-4 py-3 border-b border-border/30; + @apply text-sm text-foreground/90; } .data-table tbody tr { - @apply transition-colors duration-150; + @apply transition-all duration-100; } .data-table tbody tr:hover { - @apply bg-muted/20; + @apply bg-primary/5; + } + + /* === STATUS BADGES === */ + .status-badge { + @apply inline-flex items-center gap-1.5 px-2 py-0.5; + @apply text-[10px] font-semibold uppercase tracking-wider; + @apply border bg-transparent; + font-family: 'Rajdhani', sans-serif; + } + + .status-operational { + @apply text-operational border-operational/50 bg-operational/10; + } + + .status-damaged { + @apply text-damaged border-damaged/50 bg-damaged/10; } - .tactical-input { - @apply w-full bg-input border border-border rounded px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring transition-shadow; + .status-critical, + .status-disabled { + @apply text-critical border-critical/50 bg-critical/10; } - .tactical-button { - @apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded font-medium text-sm transition-all; - transition: var(--transition-smooth); + .status-destroyed { + @apply text-red-400 border-red-900/50 bg-red-900/20; } - .tactical-button-primary { - @apply tactical-button bg-primary text-primary-foreground hover:bg-primary/90; + .status-repairing, + .status-unavailable { + @apply text-repairing border-repairing/50 bg-repairing/10; } - .tactical-button-secondary { - @apply tactical-button bg-secondary text-secondary-foreground hover:bg-secondary/80; + /* === BUTTONS === */ + .btn-tactical { + @apply relative inline-flex items-center justify-center gap-2; + @apply px-4 py-2 text-sm font-medium uppercase tracking-wider; + @apply border border-primary/60 bg-transparent text-primary; + @apply transition-all duration-150 ease-out; + @apply hover:bg-primary/10 hover:border-primary; + @apply active:scale-[0.98]; + font-family: 'Rajdhani', sans-serif; } - .tactical-button-ghost { - @apply tactical-button hover:bg-muted/50; + .btn-tactical-solid { + @apply btn-tactical bg-primary text-background; + @apply hover:bg-primary/90; + } + + .btn-tactical-ghost { + @apply btn-tactical border-transparent text-muted-foreground; + @apply hover:text-foreground hover:bg-muted/30; + } + + /* === INPUTS === */ + .input-tactical { + @apply w-full bg-input border border-border/60 px-3 py-2; + @apply text-sm text-foreground placeholder:text-muted-foreground; + @apply focus:outline-none focus:border-primary/60 focus:ring-1 focus:ring-primary/30; + @apply transition-all duration-150; + font-family: 'JetBrains Mono', monospace; + } + + /* === STAT DISPLAYS === */ + .stat-value { + @apply font-mono text-xl font-medium text-primary; + font-family: 'JetBrains Mono', monospace; + } + + .stat-label { + @apply text-[10px] uppercase tracking-wider text-muted-foreground; + font-family: 'Rajdhani', sans-serif; + } + + /* === CORNER BRACKETS (HUD Effect) === */ + .hud-corners { + @apply relative; + } + + .hud-corners::before, + .hud-corners::after { + content: ''; + @apply absolute w-3 h-3 border-primary/40; + @apply pointer-events-none; + } + + .hud-corners::before { + @apply top-0 left-0 border-t border-l; + } + + .hud-corners::after { + @apply bottom-0 right-0 border-b border-r; + } + + /* === GLOWING TEXT === */ + .glow-text { + text-shadow: 0 0 10px hsl(var(--primary) / 0.5); + } + + /* === SECTION DIVIDER === */ + .section-divider { + @apply relative flex items-center gap-4 my-6; + } + + .section-divider::before, + .section-divider::after { + content: ''; + @apply flex-1 h-px bg-border/40; + } + + .section-divider span { + @apply text-xs uppercase tracking-widest text-muted-foreground; + font-family: 'Rajdhani', sans-serif; } } -/* Scrollbar styling */ +/* === SCROLLBARS === */ ::-webkit-scrollbar { - width: 8px; - height: 8px; + width: 6px; + height: 6px; } ::-webkit-scrollbar-track { @@ -132,15 +242,14 @@ } ::-webkit-scrollbar-thumb { - background: hsl(var(--muted)); - border-radius: 4px; + background: hsl(var(--border)); } ::-webkit-scrollbar-thumb:hover { - background: hsl(var(--muted-foreground)); + background: hsl(var(--muted-foreground) / 0.5); } -/* Hide number input spinners/arrows for cleaner look while keeping direct editing */ +/* === NUMBER INPUT CLEANUP === */ input[type='number']::-webkit-inner-spin-button, input[type='number']::-webkit-outer-spin-button { -webkit-appearance: none; @@ -151,3 +260,8 @@ input[type='number'] { -moz-appearance: textfield; appearance: textfield; } + +/* === SELECTION === */ +::selection { + @apply bg-primary/30 text-foreground; +} diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index f0b8355..9e4c215 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -41,6 +41,12 @@ module.exports = { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))', }, + // Orbital Command status colors + operational: '#10B981', + damaged: '#F59E0B', + critical: '#EF4444', + destroyed: '#7F1D1D', + repairing: '#06B6D4', }, borderRadius: { lg: 'var(--radius)', @@ -49,7 +55,18 @@ module.exports = { }, fontFamily: { sans: ['Inter', 'system-ui', 'sans-serif'], - mono: ['Roboto Mono', 'monospace'], + heading: ['Rajdhani', 'sans-serif'], + mono: ['JetBrains Mono', 'monospace'], + }, + animation: { + 'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite', + 'scan': 'scan 8s linear infinite', + }, + keyframes: { + scan: { + '0%': { transform: 'translateY(-100%)' }, + '100%': { transform: 'translateY(100%)' }, + }, }, }, }, diff --git a/static/css/main.css b/static/css/main.css index f1f6652..179bb1d 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -1,6 +1,6 @@ -@import url(https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Roboto+Mono:wght@400;500;600&display=swap);*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } +@import url(https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Rajdhani:wght@500;600;700&display=swap);*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } /* ! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com -*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,sans-serif;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:Roboto Mono,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:220 13% 9%;--foreground:210 15% 90%;--card:220 13% 12%;--card-foreground:210 15% 90%;--popover:220 13% 12%;--popover-foreground:210 15% 90%;--primary:25 95% 53%;--primary-foreground:220 13% 9%;--secondary:58 31% 21%;--secondary-foreground:210 15% 90%;--muted:220 10% 18%;--muted-foreground:210 10% 60%;--accent:30 100% 45%;--accent-foreground:210 15% 95%;--destructive:0 72% 51%;--destructive-foreground:210 15% 95%;--border:220 13% 20%;--input:220 13% 18%;--ring:25 95% 53%;--radius:0.25rem;--tactical-panel:220 13% 11%;--tactical-highlight:25 95% 53%;--status-operational:142 76% 36%;--status-damaged:38 92% 50%;--status-disabled:0 72% 51%;--status-destroyed:0 72% 51%;--status-repairing:217 91% 60%;--shadow-tactical:0 4px 12px -2px #ff4f0026;--shadow-panel:0 2px 8px #0006;--transition-smooth:0.2s cubic-bezier(0.4,0,0.2,1)}*{border-color:#2c313a;border-color:hsl(var(--border))}body{font-feature-settings:"rlig" 1,"calt" 1;background-color:#14161a;background-color:hsl(var(--background));color:#e2e6e9;color:hsl(var(--foreground))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.tactical-panel{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);background-color:#1b1d23;background-color:hsl(var(--card));border-color:#2c313a;border-color:hsl(var(--border));border-radius:calc(.25rem - 2px);border-radius:calc(var(--radius) - 2px);border-width:1px;box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:0 2px 8px #0006;box-shadow:var(--shadow-panel)}.tactical-header{background-color:#292c324d;background-color:hsl(var(--muted)/.3);border-bottom-width:1px;border-color:#2c313a;border-color:hsl(var(--border));padding:.75rem 1rem}.data-table{border-collapse:collapse;width:100%}.data-table th{background-color:#292c3280;background-color:hsl(var(--muted)/.5);border-bottom-width:1px;border-color:#2c313a;border-color:hsl(var(--border));color:#8f99a3;color:hsl(var(--muted-foreground));font-size:.75rem;font-weight:600;letter-spacing:.05em;line-height:1rem;padding:.75rem 1rem;text-align:left;text-transform:uppercase}.data-table td{border-bottom-width:1px;border-color:#2c313a80;border-color:hsl(var(--border)/.5);font-size:.875rem;line-height:1.25rem;padding:.75rem 1rem}.data-table tbody tr{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.data-table tbody tr:hover{background-color:#292c3233;background-color:hsl(var(--muted)/.2)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{inset:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-16{height:4rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.max-h-10{max-height:2.5rem}.max-h-32{max-height:8rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-\[90vh\]{max-height:90vh}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-48{min-width:12rem}.min-w-full{min-width:100%}.max-w-10{max-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-32{max-width:8rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-64{max-width:16rem}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded,.rounded-lg{border-radius:.25rem}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(.25rem - 2px);border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(.25rem - 4px);border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-amber-500{--tw-border-opacity:1;border-color:#f59e0b;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.border-amber-600\/50{border-color:#d9770680}.border-blue-500{--tw-border-opacity:1;border-color:#3b82f6;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-border{border-color:#2c313a;border-color:hsl(var(--border))}.border-border\/50{border-color:#2c313a80;border-color:hsl(var(--border)/.5)}.border-destructive{border-color:#dc2828;border-color:hsl(var(--destructive))}.border-green-500{--tw-border-opacity:1;border-color:#22c55e;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-muted{border-color:#292c32;border-color:hsl(var(--muted))}.border-primary{border-color:#f97415;border-color:hsl(var(--primary))}.border-primary\/20{border-color:#f9741533;border-color:hsl(var(--primary)/.2)}.border-purple-500{--tw-border-opacity:1;border-color:#a855f7;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-yellow-600{--tw-border-opacity:1;border-color:#ca8a04;border-color:rgb(202 138 4/var(--tw-border-opacity,1))}.bg-accent{background-color:#e67300;background-color:hsl(var(--accent))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-600{--tw-bg-opacity:1;background-color:#d97706;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.bg-amber-900\/20{background-color:#78350f33}.bg-amber-950\/50{background-color:#451a0380}.bg-background{background-color:#14161a;background-color:hsl(var(--background))}.bg-background\/50{background-color:#14161a80;background-color:hsl(var(--background)/.5)}.bg-background\/80{background-color:#14161acc;background-color:hsl(var(--background)/.8)}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-600{--tw-bg-opacity:1;background-color:#2563eb;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-card{background-color:#1b1d23;background-color:hsl(var(--card))}.bg-card\/50{background-color:#1b1d2380;background-color:hsl(var(--card)/.5)}.bg-destructive{background-color:#dc2828;background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:#dc28281a;background-color:hsl(var(--destructive)/.1)}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-600{--tw-bg-opacity:1;background-color:#16a34a;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-input{background-color:#282c34;background-color:hsl(var(--input))}.bg-muted{background-color:#292c32;background-color:hsl(var(--muted))}.bg-muted\/10{background-color:#292c321a;background-color:hsl(var(--muted)/.1)}.bg-muted\/20{background-color:#292c3233;background-color:hsl(var(--muted)/.2)}.bg-muted\/30{background-color:#292c324d;background-color:hsl(var(--muted)/.3)}.bg-muted\/50{background-color:#292c3280;background-color:hsl(var(--muted)/.5)}.bg-popover{background-color:#1b1d23;background-color:hsl(var(--popover))}.bg-primary{background-color:#f97415;background-color:hsl(var(--primary))}.bg-primary\/10{background-color:#f974151a;background-color:hsl(var(--primary)/.1)}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-600{--tw-bg-opacity:1;background-color:#dc2626;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-red-700{--tw-bg-opacity:1;background-color:#b91c1c;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.bg-secondary{background-color:#464525;background-color:hsl(var(--secondary))}.bg-transparent{background-color:initial}.bg-yellow-600\/10{background-color:#ca8a041a}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:Roboto Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-accent-foreground{color:#f0f2f4;color:hsl(var(--accent-foreground))}.text-amber-100{--tw-text-opacity:1;color:#fef3c7;color:rgb(254 243 199/var(--tw-text-opacity,1))}.text-amber-100\/80{color:#fef3c7cc}.text-amber-100\/90{color:#fef3c7e6}.text-amber-200{--tw-text-opacity:1;color:#fde68a;color:rgb(253 230 138/var(--tw-text-opacity,1))}.text-amber-400{--tw-text-opacity:1;color:#fbbf24;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:#f59e0b;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-600{--tw-text-opacity:1;color:#d97706;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:#60a5fa;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:#2563eb;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-cyan-400{--tw-text-opacity:1;color:#22d3ee;color:rgb(34 211 238/var(--tw-text-opacity,1))}.text-destructive{color:#dc2828;color:hsl(var(--destructive))}.text-destructive-foreground{color:#f0f2f4;color:hsl(var(--destructive-foreground))}.text-emerald-400{--tw-text-opacity:1;color:#34d399;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-foreground{color:#e2e6e9;color:hsl(var(--foreground))}.text-green-400{--tw-text-opacity:1;color:#4ade80;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:#16a34a;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-muted-foreground{color:#8f99a3;color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:#8f99a380;color:hsl(var(--muted-foreground)/.5)}.text-orange-400{--tw-text-opacity:1;color:#fb923c;color:rgb(251 146 60/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:#f97316;color:rgb(249 115 22/var(--tw-text-opacity,1))}.text-primary{color:#f97415;color:hsl(var(--primary))}.text-primary-foreground{color:#14161a;color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity:1;color:#f87171;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:#dc2626;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:#b91c1c;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-secondary-foreground{color:#e2e6e9;color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity:1;color:#fff;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:#eab308;color:rgb(234 179 8/var(--tw-text-opacity,1))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}::-webkit-scrollbar{height:8px;width:8px}::-webkit-scrollbar-track{background:#14161a;background:hsl(var(--background))}::-webkit-scrollbar-thumb{background:#292c32;background:hsl(var(--muted));border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#8f99a3;background:hsl(var(--muted-foreground))}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;appearance:textfield}.last\:border-0:last-child{border-width:0}.hover\:bg-accent:hover{background-color:#e67300;background-color:hsl(var(--accent))}.hover\:bg-accent\/90:hover{background-color:#e67300e6;background-color:hsl(var(--accent)/.9)}.hover\:bg-background\/50:hover{background-color:#14161a80;background-color:hsl(var(--background)/.5)}.hover\:bg-destructive\/90:hover{background-color:#dc2828e6;background-color:hsl(var(--destructive)/.9)}.hover\:bg-muted\/30:hover{background-color:#292c324d;background-color:hsl(var(--muted)/.3)}.hover\:bg-muted\/50:hover{background-color:#292c3280;background-color:hsl(var(--muted)/.5)}.hover\:bg-muted\/80:hover{background-color:#292c32cc;background-color:hsl(var(--muted)/.8)}.hover\:bg-primary\/90:hover{background-color:#f97415e6;background-color:hsl(var(--primary)/.9)}.hover\:bg-secondary\/80:hover{background-color:#464525cc;background-color:hsl(var(--secondary)/.8)}.hover\:text-foreground:hover{color:#e2e6e9;color:hsl(var(--foreground))}.hover\:opacity-100:hover{opacity:1}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-primary:focus{--tw-ring-color:hsl(var(--primary))}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{outline:2px solid #0000;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}@media (min-width:640px){.sm\:text-left{text-align:left}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:1024px){.lg\:w-auto{width:auto}} -/*# sourceMappingURL=main.42641c8c.css.map*/ \ No newline at end of file +*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,sans-serif;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:JetBrains Mono,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:240 6% 4%;--foreground:0 0% 98%;--card:240 4% 7%;--card-foreground:0 0% 98%;--popover:240 4% 10%;--popover-foreground:0 0% 98%;--primary:38 92% 50%;--primary-foreground:240 6% 4%;--secondary:187 94% 43%;--secondary-foreground:0 0% 98%;--muted:240 4% 16%;--muted-foreground:240 5% 65%;--accent:38 92% 50%;--accent-foreground:240 6% 4%;--destructive:0 84% 60%;--destructive-foreground:0 0% 98%;--border:240 4% 16%;--input:240 4% 10%;--ring:38 92% 50%;--radius:0.125rem;--status-operational:160 84% 39%;--status-damaged:38 92% 50%;--status-critical:0 84% 60%;--status-destroyed:0 63% 31%;--status-repairing:187 94% 43%}*{border-color:#27272a;border-color:hsl(var(--border))}html{scroll-behavior:smooth}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"rlig" 1,"calt" 1;background-color:#0a0a0b;background-color:hsl(var(--background));color:#fafafa;color:hsl(var(--foreground));font-family:Inter,system-ui,sans-serif}h1,h2,h3,h4,h5,h6{font-family:Rajdhani,sans-serif;font-weight:600;letter-spacing:.025em}.tactical-panel{background-color:#111113;background-color:hsl(var(--card));border-color:#27272a66;border-color:hsl(var(--border)/.4);border-width:1px;overflow:hidden;position:relative;transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.tactical-panel:hover{border-color:#27272a99;border-color:hsl(var(--border)/.6)}.tactical-panel:before{background-color:#f59f0a99;background-color:hsl(var(--primary)/.6);content:"";height:100%;left:0;position:absolute;top:0;width:.25rem}.tactical-header{align-items:center;background-color:#27272a33;background-color:hsl(var(--muted)/.2);border-bottom-width:1px;border-color:#27272a66;border-color:hsl(var(--border)/.4);display:flex;justify-content:space-between;padding:.75rem 1rem}.tactical-header h3{color:#fafafae6;color:hsl(var(--foreground)/.9);font-family:Rajdhani,sans-serif;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.data-table,.tactical-header h3{font-size:.875rem;line-height:1.25rem}.data-table{border-collapse:collapse;font-family:JetBrains Mono,monospace;width:100%}.data-table th{background-color:#27272a4d;background-color:hsl(var(--muted)/.3);border-bottom-width:1px;border-color:#27272a99;border-color:hsl(var(--border)/.6);color:#a1a1aa;color:hsl(var(--muted-foreground));font-family:Rajdhani,sans-serif;font-size:11px;font-weight:600;letter-spacing:.05em;padding:.75rem 1rem;text-align:left;text-transform:uppercase}.data-table td{border-bottom-width:1px;border-color:#27272a4d;border-color:hsl(var(--border)/.3);color:#fafafae6;color:hsl(var(--foreground)/.9);font-size:.875rem;line-height:1.25rem;padding:.75rem 1rem}.data-table tbody tr{transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.data-table tbody tr:hover{background-color:#f59f0a0d;background-color:hsl(var(--primary)/.05)}.hud-corners{position:relative}.hud-corners:after,.hud-corners:before{border-color:#f59f0a66;border-color:hsl(var(--primary)/.4);content:"";height:.75rem;pointer-events:none;position:absolute;width:.75rem}.hud-corners:before{border-left-width:1px;border-top-width:1px;left:0;top:0}.hud-corners:after{border-bottom-width:1px;border-right-width:1px;bottom:0;right:0}.glow-text{text-shadow:0 0 10px #f59f0a80;text-shadow:0 0 10px hsl(var(--primary)/.5)}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{inset:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-28{height:7rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.max-h-10{max-height:2.5rem}.max-h-32{max-height:8rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-\[90vh\]{max-height:90vh}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-9{width:2.25rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-48{min-width:12rem}.min-w-full{min-width:100%}.max-w-10{max-width:2.5rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[1920px\]{max-width:1920px}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1}.flex-shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.125rem;border-radius:var(--radius)}.rounded-md{border-radius:calc(.125rem - 2px);border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(.125rem - 4px);border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-amber-500{--tw-border-opacity:1;border-color:#f59e0b;border-color:rgb(245 158 11/var(--tw-border-opacity,1))}.border-amber-600\/50{border-color:#d9770680}.border-blue-500{--tw-border-opacity:1;border-color:#3b82f6;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-border{border-color:#27272a;border-color:hsl(var(--border))}.border-border\/30{border-color:#27272a4d;border-color:hsl(var(--border)/.3)}.border-border\/40{border-color:#27272a66;border-color:hsl(var(--border)/.4)}.border-border\/50{border-color:#27272a80;border-color:hsl(var(--border)/.5)}.border-border\/60{border-color:#27272a99;border-color:hsl(var(--border)/.6)}.border-critical\/50{border-color:#ef444480}.border-damaged\/50{border-color:#f59e0b80}.border-destructive{border-color:#ef4343;border-color:hsl(var(--destructive))}.border-green-500{--tw-border-opacity:1;border-color:#22c55e;border-color:rgb(34 197 94/var(--tw-border-opacity,1))}.border-muted{border-color:#27272a;border-color:hsl(var(--muted))}.border-operational\/50{border-color:#10b98180}.border-primary\/20{border-color:#f59f0a33;border-color:hsl(var(--primary)/.2)}.border-primary\/30{border-color:#f59f0a4d;border-color:hsl(var(--primary)/.3)}.border-primary\/40{border-color:#f59f0a66;border-color:hsl(var(--primary)/.4)}.border-purple-500{--tw-border-opacity:1;border-color:#a855f7;border-color:rgb(168 85 247/var(--tw-border-opacity,1))}.border-red-900\/50{border-color:#7f1d1d80}.border-repairing\/50{border-color:#06b6d480}.border-transparent{border-color:#0000}.border-yellow-600{--tw-border-opacity:1;border-color:#ca8a04;border-color:rgb(202 138 4/var(--tw-border-opacity,1))}.bg-accent{background-color:#f59f0a;background-color:hsl(var(--accent))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-600{--tw-bg-opacity:1;background-color:#d97706;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.bg-amber-900\/20{background-color:#78350f33}.bg-amber-950\/50{background-color:#451a0380}.bg-background{background-color:#0a0a0b;background-color:hsl(var(--background))}.bg-background\/50{background-color:#0a0a0b80;background-color:hsl(var(--background)/.5)}.bg-background\/80{background-color:#0a0a0bcc;background-color:hsl(var(--background)/.8)}.bg-background\/95{background-color:#0a0a0bf2;background-color:hsl(var(--background)/.95)}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-600{--tw-bg-opacity:1;background-color:#2563eb;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-border\/40{background-color:#27272a66;background-color:hsl(var(--border)/.4)}.bg-card{background-color:#111113;background-color:hsl(var(--card))}.bg-card\/50{background-color:#11111380;background-color:hsl(var(--card)/.5)}.bg-critical\/10{background-color:#ef44441a}.bg-damaged\/10{background-color:#f59e0b1a}.bg-destructive{background-color:#ef4343;background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:#ef43431a;background-color:hsl(var(--destructive)/.1)}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-600{--tw-bg-opacity:1;background-color:#16a34a;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.bg-input{background-color:#18181b;background-color:hsl(var(--input))}.bg-muted{background-color:#27272a;background-color:hsl(var(--muted))}.bg-muted\/10{background-color:#27272a1a;background-color:hsl(var(--muted)/.1)}.bg-muted\/20{background-color:#27272a33;background-color:hsl(var(--muted)/.2)}.bg-muted\/30{background-color:#27272a4d;background-color:hsl(var(--muted)/.3)}.bg-muted\/50{background-color:#27272a80;background-color:hsl(var(--muted)/.5)}.bg-operational\/10{background-color:#10b9811a}.bg-popover{background-color:#18181b;background-color:hsl(var(--popover))}.bg-primary{background-color:#f59f0a;background-color:hsl(var(--primary))}.bg-primary\/10{background-color:#f59f0a1a;background-color:hsl(var(--primary)/.1)}.bg-primary\/20{background-color:#f59f0a33;background-color:hsl(var(--primary)/.2)}.bg-primary\/5{background-color:#f59f0a0d;background-color:hsl(var(--primary)/.05)}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-600{--tw-bg-opacity:1;background-color:#dc2626;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-red-700{--tw-bg-opacity:1;background-color:#b91c1c;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.bg-red-900\/20{background-color:#7f1d1d33}.bg-repairing\/10{background-color:#06b6d41a}.bg-secondary{background-color:#07bdd5;background-color:hsl(var(--secondary))}.bg-transparent{background-color:initial}.bg-yellow-600\/10{background-color:#ca8a041a}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-9{padding-left:2.25rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-heading{font-family:Rajdhani,sans-serif}.font-mono{font-family:JetBrains Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent-foreground{color:#0a0a0b;color:hsl(var(--accent-foreground))}.text-amber-100{--tw-text-opacity:1;color:#fef3c7;color:rgb(254 243 199/var(--tw-text-opacity,1))}.text-amber-100\/80{color:#fef3c7cc}.text-amber-100\/90{color:#fef3c7e6}.text-amber-200{--tw-text-opacity:1;color:#fde68a;color:rgb(253 230 138/var(--tw-text-opacity,1))}.text-amber-400{--tw-text-opacity:1;color:#fbbf24;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-500{--tw-text-opacity:1;color:#f59e0b;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-amber-600{--tw-text-opacity:1;color:#d97706;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:#60a5fa;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-blue-600{--tw-text-opacity:1;color:#2563eb;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-critical{--tw-text-opacity:1;color:#ef4444;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-cyan-400{--tw-text-opacity:1;color:#22d3ee;color:rgb(34 211 238/var(--tw-text-opacity,1))}.text-damaged{--tw-text-opacity:1;color:#f59e0b;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-destructive{color:#ef4343;color:hsl(var(--destructive))}.text-destructive-foreground{color:#fafafa;color:hsl(var(--destructive-foreground))}.text-emerald-400{--tw-text-opacity:1;color:#34d399;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-foreground{color:#fafafa;color:hsl(var(--foreground))}.text-green-400{--tw-text-opacity:1;color:#4ade80;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:#16a34a;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-muted-foreground{color:#a1a1aa;color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:#a1a1aa80;color:hsl(var(--muted-foreground)/.5)}.text-operational{--tw-text-opacity:1;color:#10b981;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-orange-400{--tw-text-opacity:1;color:#fb923c;color:rgb(251 146 60/var(--tw-text-opacity,1))}.text-orange-500{--tw-text-opacity:1;color:#f97316;color:rgb(249 115 22/var(--tw-text-opacity,1))}.text-primary{color:#f59f0a;color:hsl(var(--primary))}.text-primary-foreground{color:#0a0a0b;color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity:1;color:#f87171;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:#dc2626;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:#b91c1c;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-repairing{--tw-text-opacity:1;color:#06b6d4;color:rgb(6 182 212/var(--tw-text-opacity,1))}.text-secondary{color:#07bdd5;color:hsl(var(--secondary))}.text-secondary-foreground{color:#fafafa;color:hsl(var(--secondary-foreground))}.text-white{--tw-text-opacity:1;color:#fff;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:#eab308;color:rgb(234 179 8/var(--tw-text-opacity,1))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}::-webkit-scrollbar{height:6px;width:6px}::-webkit-scrollbar-track{background:#0a0a0b;background:hsl(var(--background))}::-webkit-scrollbar-thumb{background:#27272a;background:hsl(var(--border))}::-webkit-scrollbar-thumb:hover{background:#a1a1aa80;background:hsl(var(--muted-foreground)/.5)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-webkit-appearance:textfield;appearance:textfield}::selection{background-color:#f59f0a4d;background-color:hsl(var(--primary)/.3);color:#fafafa;color:hsl(var(--foreground))}.hover\:border-primary\/40:hover{border-color:#f59f0a66;border-color:hsl(var(--primary)/.4)}.hover\:bg-accent:hover{background-color:#f59f0a;background-color:hsl(var(--accent))}.hover\:bg-accent\/90:hover{background-color:#f59f0ae6;background-color:hsl(var(--accent)/.9)}.hover\:bg-background\/50:hover{background-color:#0a0a0b80;background-color:hsl(var(--background)/.5)}.hover\:bg-destructive\/90:hover{background-color:#ef4343e6;background-color:hsl(var(--destructive)/.9)}.hover\:bg-muted\/30:hover{background-color:#27272a4d;background-color:hsl(var(--muted)/.3)}.hover\:bg-muted\/50:hover{background-color:#27272a80;background-color:hsl(var(--muted)/.5)}.hover\:bg-muted\/80:hover{background-color:#27272acc;background-color:hsl(var(--muted)/.8)}.hover\:bg-primary\/10:hover{background-color:#f59f0a1a;background-color:hsl(var(--primary)/.1)}.hover\:bg-primary\/90:hover{background-color:#f59f0ae6;background-color:hsl(var(--primary)/.9)}.hover\:bg-secondary\/80:hover{background-color:#07bdd5cc;background-color:hsl(var(--secondary)/.8)}.hover\:text-foreground:hover{color:#fafafa;color:hsl(var(--foreground))}.hover\:text-primary:hover{color:#f59f0a;color:hsl(var(--primary))}.hover\:opacity-100:hover{opacity:1}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-primary:focus{--tw-ring-color:hsl(var(--primary))}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus-visible\:outline-none:focus-visible{outline:2px solid #0000;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}.data-\[state\=active\]\:border-primary\/40[data-state=active]{border-color:#f59f0a66;border-color:hsl(var(--primary)/.4)}.data-\[state\=active\]\:bg-primary\/10[data-state=active]{background-color:#f59f0a1a;background-color:hsl(var(--primary)/.1)}.data-\[state\=active\]\:text-primary[data-state=active]{color:#f59f0a;color:hsl(var(--primary))}@supports ((-webkit-backdrop-filter:var(--tw )) or (backdrop-filter:var(--tw ))){.supports-\[backdrop-filter\]\:bg-background\/80{background-color:#0a0a0bcc;background-color:hsl(var(--background)/.8)}}@media (min-width:640px){.sm\:text-left{text-align:left}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} +/*# sourceMappingURL=main.9bc1702c.css.map*/ \ No newline at end of file diff --git a/static/js/main.js b/static/js/main.js index d266d7a..aa5408f 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1,3 +1,3 @@ -/*! For license information please see main.c260549b.js.LICENSE.txt */ -(()=>{var e={122:e=>{"use strict";e.exports=function e(t,n){if(t===n)return!0;if(t&&n&&"object"==typeof t&&"object"==typeof n){if(t.constructor!==n.constructor)return!1;var r,i,a;if(Array.isArray(t)){if((r=t.length)!=n.length)return!1;for(i=r;0!==i--;)if(!e(t[i],n[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if((r=(a=Object.keys(t)).length)!==Object.keys(n).length)return!1;for(i=r;0!==i--;)if(!Object.prototype.hasOwnProperty.call(n,a[i]))return!1;for(i=r;0!==i--;){var s=a[i];if(!e(t[s],n[s]))return!1}return!0}return t!==t&&n!==n}},224:e=>{var t=function(){"use strict";function e(e,t){return null!=t&&e instanceof t}var t,n,r;try{t=Map}catch(o){t=function(){}}try{n=Set}catch(o){n=function(){}}try{r=Promise}catch(o){r=function(){}}function i(a,o,l,c,u){"object"===typeof o&&(l=o.depth,c=o.prototype,u=o.includeNonEnumerable,o=o.circular);var d=[],A=[],h="undefined"!=typeof Buffer;return"undefined"==typeof o&&(o=!0),"undefined"==typeof l&&(l=1/0),function a(l,f){if(null===l)return null;if(0===f)return l;var g,p;if("object"!=typeof l)return l;if(e(l,t))g=new t;else if(e(l,n))g=new n;else if(e(l,r))g=new r(function(e,t){l.then(function(t){e(a(t,f-1))},function(e){t(a(e,f-1))})});else if(i.__isArray(l))g=[];else if(i.__isRegExp(l))g=new RegExp(l.source,s(l)),l.lastIndex&&(g.lastIndex=l.lastIndex);else if(i.__isDate(l))g=new Date(l.getTime());else{if(h&&Buffer.isBuffer(l))return g=Buffer.allocUnsafe?Buffer.allocUnsafe(l.length):new Buffer(l.length),l.copy(g),g;e(l,Error)?g=Object.create(l):"undefined"==typeof c?(p=Object.getPrototypeOf(l),g=Object.create(p)):(g=Object.create(c),p=c)}if(o){var m=d.indexOf(l);if(-1!=m)return A[m];d.push(l),A.push(g)}for(var y in e(l,t)&&l.forEach(function(e,t){var n=a(t,f-1),r=a(e,f-1);g.set(n,r)}),e(l,n)&&l.forEach(function(e){var t=a(e,f-1);g.add(t)}),l){var b;p&&(b=Object.getOwnPropertyDescriptor(p,y)),b&&null==b.set||(g[y]=a(l[y],f-1))}if(Object.getOwnPropertySymbols){var v=Object.getOwnPropertySymbols(l);for(y=0;y{var t="-".charCodeAt(0),n="+".charCodeAt(0),r=".".charCodeAt(0),i="e".charCodeAt(0),a="E".charCodeAt(0);e.exports=function(e){var s,o,l,c=0,u=e.length;if(0===u||!function(e){var i,a=e.charCodeAt(0);if(a===n||a===t){if((i=e.charCodeAt(1))>=48&&i<=57)return!0;var s=e.charCodeAt(2);return i===r&&s>=48&&s<=57}return a===r?(i=e.charCodeAt(1))>=48&&i<=57:a>=48&&a<=57}(e))return!1;for((s=e.charCodeAt(c))!==n&&s!==t||c++;c57);)c+=1;if(s=e.charCodeAt(c),o=e.charCodeAt(c+1),s===r&&o>=48&&o<=57)for(c+=2;c57);)c+=1;if(s=e.charCodeAt(c),o=e.charCodeAt(c+1),l=e.charCodeAt(c+2),(s===i||s===a)&&(o>=48&&o<=57||(o===n||o===t)&&l>=48&&l<=57))for(c+=o===n||o===t?3:2;c57);)c+=1;return{number:e.slice(0,c),unit:e.slice(c)}}},301:e=>{"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},477:()=>{},548:function(e,t,n){!function(){var t;e.exports=(t=n(4488),n(2238),t.pad.ZeroPadding={pad:function(e,t){var n=4*t;e.clamp(),e.sigBytes+=n-(e.sigBytes%n||n)},unpad:function(e){var t=e.words,n=e.sigBytes-1;for(n=e.sigBytes-1;n>=0;n--)if(t[n>>>2]>>>24-n%4*8&255){e.sigBytes=n+1;break}}},t.pad.ZeroPadding)}()},579:(e,t,n)=>{"use strict";e.exports=n(1153)},615:(e,t,n)=>{var r=n(7887),i=10,a=11;function s(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(var r=0;r'),new s("",0,"\n"),new s("",3,""),new s("",0,"]"),new s("",0," for "),new s("",14,""),new s("",2,""),new s("",0," a "),new s("",0," that "),new s(" ",i,""),new s("",0,". "),new s(".",0,""),new s(" ",0,", "),new s("",15,""),new s("",0," with "),new s("",0,"'"),new s("",0," from "),new s("",0," by "),new s("",16,""),new s("",17,""),new s(" the ",0,""),new s("",4,""),new s("",0,". The "),new s("",a,""),new s("",0," on "),new s("",0," as "),new s("",0," is "),new s("",7,""),new s("",1,"ing "),new s("",0,"\n\t"),new s("",0,":"),new s(" ",0,". "),new s("",0,"ed "),new s("",20,""),new s("",18,""),new s("",6,""),new s("",0,"("),new s("",i,", "),new s("",8,""),new s("",0," at "),new s("",0,"ly "),new s(" the ",0," of "),new s("",5,""),new s("",9,""),new s(" ",i,", "),new s("",i,'"'),new s(".",0,"("),new s("",a," "),new s("",i,'">'),new s("",0,'="'),new s(" ",0,"."),new s(".com/",0,""),new s(" the ",0," of the "),new s("",i,"'"),new s("",0,". This "),new s("",0,","),new s(".",0," "),new s("",i,"("),new s("",i,"."),new s("",0," not "),new s(" ",0,'="'),new s("",0,"er "),new s(" ",a," "),new s("",0,"al "),new s(" ",a,""),new s("",0,"='"),new s("",a,'"'),new s("",i,". "),new s(" ",0,"("),new s("",0,"ful "),new s(" ",i,". "),new s("",0,"ive "),new s("",0,"less "),new s("",a,"'"),new s("",0,"est "),new s(" ",i,"."),new s("",a,'">'),new s(" ",0,"='"),new s("",i,","),new s("",0,"ize "),new s("",a,"."),new s("\xc2\xa0",0,""),new s(" ",0,","),new s("",i,'="'),new s("",a,'="'),new s("",0,"ous "),new s("",a,", "),new s("",i,"='"),new s(" ",i,","),new s(" ",a,'="'),new s(" ",a,", "),new s("",a,","),new s("",a,"("),new s("",a,". "),new s(" ",a,"."),new s("",a,"='"),new s(" ",a,". "),new s(" ",i,'="'),new s(" ",a,"='"),new s(" ",i,"='")];function l(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}t.kTransforms=o,t.kNumTransforms=o.length,t.transformDictionaryWord=function(e,t,n,s,c){var u,d=o[c].prefix,A=o[c].suffix,h=o[c].transform,f=h<12?0:h-11,g=0,p=t;f>s&&(f=s);for(var m=0;m0;){var y=l(e,u);u+=y,s-=y}for(var b=0;b{!function(e){"use strict";var t="undefined"!==typeof Uint8Array?Uint8Array:Array,n="+".charCodeAt(0),r="/".charCodeAt(0),i="0".charCodeAt(0),a="a".charCodeAt(0),s="A".charCodeAt(0),o="-".charCodeAt(0),l="_".charCodeAt(0);function c(e){var t=e.charCodeAt(0);return t===n||t===o?62:t===r||t===l?63:t0)throw new Error("Invalid string. Length must be a multiple of 4");var l=e.length;s="="===e.charAt(l-2)?2:"="===e.charAt(l-1)?1:0,o=new t(3*e.length/4-s),i=s>0?e.length-4:e.length;var u=0;function d(e){o[u++]=e}for(n=0,r=0;n>16),d((65280&a)>>8),d(255&a);return 2===s?d(255&(a=c(e.charAt(n))<<2|c(e.charAt(n+1))>>4)):1===s&&(d((a=c(e.charAt(n))<<10|c(e.charAt(n+1))<<4|c(e.charAt(n+2))>>2)>>8&255),d(255&a)),o},e.fromByteArray=function(e){var t,n,r,i=e.length%3,a="";function s(e){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)}function o(e){return s(e>>18&63)+s(e>>12&63)+s(e>>6&63)+s(63&e)}for(t=0,r=e.length-i;t>2),a+=s(n<<4&63),a+="==";break;case 2:a+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10),a+=s(n>>4&63),a+=s(n<<2&63),a+="="}return a}}(t)},1112:function(e,t,n){!function(){var t;e.exports=(t=n(4488),n(2238),t.mode.CFB=function(){var e=t.lib.BlockCipherMode.extend();function n(e,t,n,r){var i,a=this._iv;a?(i=a.slice(0),this._iv=void 0):i=this._prevBlock,r.encryptBlock(i,0);for(var s=0;s{var r=n(8301),i=n(9849),a=Object.hasOwnProperty,s=Object.create(null);for(var o in r)a.call(r,o)&&(s[r[o]]=o);var l=e.exports={to:{},get:{}};function c(e,t,n){return Math.min(Math.max(t,e),n)}function u(e){var t=Math.round(e).toString(16).toUpperCase();return t.length<2?"0"+t:t}l.get=function(e){var t,n;switch(e.substring(0,3).toLowerCase()){case"hsl":t=l.get.hsl(e),n="hsl";break;case"hwb":t=l.get.hwb(e),n="hwb";break;default:t=l.get.rgb(e),n="rgb"}return t?{model:n,value:t}:null},l.get.rgb=function(e){if(!e)return null;var t,n,i,s=[0,0,0,1];if(t=e.match(/^#([a-f0-9]{6})([a-f0-9]{2})?$/i)){for(i=t[2],t=t[1],n=0;n<3;n++){var o=2*n;s[n]=parseInt(t.slice(o,o+2),16)}i&&(s[3]=parseInt(i,16)/255)}else if(t=e.match(/^#([a-f0-9]{3,4})$/i)){for(i=(t=t[1])[3],n=0;n<3;n++)s[n]=parseInt(t[n]+t[n],16);i&&(s[3]=parseInt(i+i,16)/255)}else if(t=e.match(/^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/)){for(n=0;n<3;n++)s[n]=parseInt(t[n+1],0);t[4]&&(t[5]?s[3]=.01*parseFloat(t[4]):s[3]=parseFloat(t[4]))}else{if(!(t=e.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/)))return(t=e.match(/^(\w+)$/))?"transparent"===t[1]?[0,0,0,0]:a.call(r,t[1])?((s=r[t[1]])[3]=1,s):null:null;for(n=0;n<3;n++)s[n]=Math.round(2.55*parseFloat(t[n+1]));t[4]&&(t[5]?s[3]=.01*parseFloat(t[4]):s[3]=parseFloat(t[4]))}for(n=0;n<3;n++)s[n]=c(s[n],0,255);return s[3]=c(s[3],0,1),s},l.get.hsl=function(e){if(!e)return null;var t=e.match(/^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/);if(t){var n=parseFloat(t[4]);return[(parseFloat(t[1])%360+360)%360,c(parseFloat(t[2]),0,100),c(parseFloat(t[3]),0,100),c(isNaN(n)?1:n,0,1)]}return null},l.get.hwb=function(e){if(!e)return null;var t=e.match(/^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/);if(t){var n=parseFloat(t[4]);return[(parseFloat(t[1])%360+360)%360,c(parseFloat(t[2]),0,100),c(parseFloat(t[3]),0,100),c(isNaN(n)?1:n,0,1)]}return null},l.to.hex=function(){var e=i(arguments);return"#"+u(e[0])+u(e[1])+u(e[2])+(e[3]<1?u(Math.round(255*e[3])):"")},l.to.rgb=function(){var e=i(arguments);return e.length<4||1===e[3]?"rgb("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+")":"rgba("+Math.round(e[0])+", "+Math.round(e[1])+", "+Math.round(e[2])+", "+e[3]+")"},l.to.rgb.percent=function(){var e=i(arguments),t=Math.round(e[0]/255*100),n=Math.round(e[1]/255*100),r=Math.round(e[2]/255*100);return e.length<4||1===e[3]?"rgb("+t+"%, "+n+"%, "+r+"%)":"rgba("+t+"%, "+n+"%, "+r+"%, "+e[3]+")"},l.to.hsl=function(){var e=i(arguments);return e.length<4||1===e[3]?"hsl("+e[0]+", "+e[1]+"%, "+e[2]+"%)":"hsla("+e[0]+", "+e[1]+"%, "+e[2]+"%, "+e[3]+")"},l.to.hwb=function(){var e=i(arguments),t="";return e.length>=4&&1!==e[3]&&(t=", "+e[3]),"hwb("+e[0]+", "+e[1]+"%, "+e[2]+"%"+t+")"},l.to.keyword=function(e){return s[e.slice(0,3)]}},1153:(e,t,n)=>{"use strict";var r=n(5043),i=Symbol.for("react.element"),a=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,o=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)s.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:i,type:e,key:c,ref:u,props:a,_owner:o.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},1504:e=>{e.exports=function(e){if("string"!==typeof e)return!1;var i=e.match(t);if(!i)return!1;var a=i[1];if(!a)return!1;if(n.test(a)||r.test(a))return!0;return!1};var t=/^(?:\w+:)?\/\/(\S+)$/,n=/^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/,r=/^[^\s\.]+\.\S{2,}$/},1529:e=>{e.exports=function(e){var t=0,n=0,r=0,i=0;return e.map(function(e){var a=(e=e.slice())[0],s=a.toUpperCase();if(a!=s)switch(e[0]=s,a){case"a":e[6]+=r,e[7]+=i;break;case"v":e[1]+=i;break;case"h":e[1]+=r;break;default:for(var o=1;o>>16,e[1],e[0]<<16|e[3]>>>16,e[2],e[1]<<16|e[0]>>>16,e[3],e[2]<<16|e[1]>>>16],r=this._C=[e[2]<<16|e[2]>>>16,4294901760&e[0]|65535&e[1],e[3]<<16|e[3]>>>16,4294901760&e[1]|65535&e[2],e[0]<<16|e[0]>>>16,4294901760&e[2]|65535&e[3],e[1]<<16|e[1]>>>16,4294901760&e[3]|65535&e[0]];this._b=0;for(var i=0;i<4;i++)l.call(this);for(i=0;i<8;i++)r[i]^=n[i+4&7];if(t){var a=t.words,s=a[0],o=a[1],c=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),u=16711935&(o<<8|o>>>24)|4278255360&(o<<24|o>>>8),d=c>>>16|4294901760&u,A=u<<16|65535&c;for(r[0]^=c,r[1]^=d,r[2]^=u,r[3]^=A,r[4]^=c,r[5]^=d,r[6]^=u,r[7]^=A,i=0;i<4;i++)l.call(this)}},_doProcessBlock:function(e,t){var n=this._X;l.call(this),i[0]=n[0]^n[5]>>>16^n[3]<<16,i[1]=n[2]^n[7]>>>16^n[5]<<16,i[2]=n[4]^n[1]>>>16^n[7]<<16,i[3]=n[6]^n[3]>>>16^n[1]<<16;for(var r=0;r<4;r++)i[r]=16711935&(i[r]<<8|i[r]>>>24)|4278255360&(i[r]<<24|i[r]>>>8),e[t+r]^=i[r]},blockSize:4,ivSize:2});function l(){for(var e=this._X,t=this._C,n=0;n<8;n++)a[n]=t[n];for(t[0]=t[0]+1295307597+this._b|0,t[1]=t[1]+3545052371+(t[0]>>>0>>0?1:0)|0,t[2]=t[2]+886263092+(t[1]>>>0>>0?1:0)|0,t[3]=t[3]+1295307597+(t[2]>>>0>>0?1:0)|0,t[4]=t[4]+3545052371+(t[3]>>>0>>0?1:0)|0,t[5]=t[5]+886263092+(t[4]>>>0>>0?1:0)|0,t[6]=t[6]+1295307597+(t[5]>>>0>>0?1:0)|0,t[7]=t[7]+3545052371+(t[6]>>>0>>0?1:0)|0,this._b=t[7]>>>0>>0?1:0,n=0;n<8;n++){var r=e[n]+t[n],i=65535&r,o=r>>>16,l=((i*i>>>17)+i*o>>>15)+o*o,c=((4294901760&r)*r|0)+((65535&r)*r|0);s[n]=l^c}e[0]=s[0]+(s[7]<<16|s[7]>>>16)+(s[6]<<16|s[6]>>>16)|0,e[1]=s[1]+(s[0]<<8|s[0]>>>24)+s[7]|0,e[2]=s[2]+(s[1]<<16|s[1]>>>16)+(s[0]<<16|s[0]>>>16)|0,e[3]=s[3]+(s[2]<<8|s[2]>>>24)+s[1]|0,e[4]=s[4]+(s[3]<<16|s[3]>>>16)+(s[2]<<16|s[2]>>>16)|0,e[5]=s[5]+(s[4]<<8|s[4]>>>24)+s[3]|0,e[6]=s[6]+(s[5]<<16|s[5]>>>16)+(s[4]<<16|s[4]>>>16)|0,e[7]=s[7]+(s[6]<<8|s[6]>>>24)+s[5]|0}e.RabbitLegacy=n._createHelper(o)}(),t.RabbitLegacy)}()},1884:function(e,t,n){!function(){var t;e.exports=(t=n(4488),n(2238),t.pad.AnsiX923={pad:function(e,t){var n=e.sigBytes,r=4*t,i=r-n%r,a=n+i-1;e.clamp(),e.words[a>>>2]|=i<<24-a%4*8,e.sigBytes+=i},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},t.pad.Ansix923)}()},2002:function(e,t,n){!function(){var t;e.exports=(t=n(4488),function(){var e=t,n=e.lib,r=n.WordArray,i=n.Hasher,a=e.algo,s=[],o=a.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],a=n[2],o=n[3],l=n[4],c=0;c<80;c++){if(c<16)s[c]=0|e[t+c];else{var u=s[c-3]^s[c-8]^s[c-14]^s[c-16];s[c]=u<<1|u>>>31}var d=(r<<5|r>>>27)+l+s[c];d+=c<20?1518500249+(i&a|~i&o):c<40?1859775393+(i^a^o):c<60?(i&a|i&o|a&o)-1894007588:(i^a^o)-899497514,l=o,o=a,a=i<<30|i>>>2,i=r,r=d}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+o|0,n[4]=n[4]+l|0},_doFinalize:function(){var e=this._data,t=e.words,n=8*this._nDataBytes,r=8*e.sigBytes;return t[r>>>5]|=128<<24-r%32,t[14+(r+64>>>9<<4)]=Math.floor(n/4294967296),t[15+(r+64>>>9<<4)]=n,e.sigBytes=4*t.length,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});e.SHA1=i._createHelper(o),e.HmacSHA1=i._createHmacHelper(o)}(),t.SHA1)}()},2123:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(i){return!1}}()?Object.assign:function(e,i){for(var a,s,o=function(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l>>2];e.sigBytes-=t}},g=(r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:h,padding:f}),reset:function(){var e;u.reset.call(this);var t=this.cfg,n=t.iv,r=t.mode;this._xformMode==this._ENC_XFORM_MODE?e=r.createEncryptor:(e=r.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==e?this._mode.init(this,n&&n.words):(this._mode=e.call(r,this,n&&n.words),this._mode.__creator=e)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e,t=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(t.pad(this._data,this.blockSize),e=this._process(!0)):(e=this._process(!0),t.unpad(e)),e},blockSize:4}),r.CipherParams=i.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}})),p=(n.format={}).OpenSSL={stringify:function(e){var t=e.ciphertext,n=e.salt;return(n?a.create([1398893684,1701076831]).concat(n).concat(t):t).toString(l)},parse:function(e){var t,n=l.parse(e),r=n.words;return 1398893684==r[0]&&1701076831==r[1]&&(t=a.create(r.slice(2,4)),r.splice(0,4),n.sigBytes-=16),g.create({ciphertext:n,salt:t})}},m=r.SerializableCipher=i.extend({cfg:i.extend({format:p}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=e.createEncryptor(n,r),a=i.finalize(t),s=i.cfg;return g.create({ciphertext:a,key:n,iv:s.iv,algorithm:e,mode:s.mode,padding:s.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),e.createDecryptor(n,r).finalize(t.ciphertext)},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),y=(n.kdf={}).OpenSSL={execute:function(e,t,n,r,i){if(r||(r=a.random(8)),i)s=c.create({keySize:t+n,hasher:i}).compute(e,r);else var s=c.create({keySize:t+n}).compute(e,r);var o=a.create(s.words.slice(t),4*n);return s.sigBytes=4*t,g.create({key:s,iv:o,salt:r})}},b=r.PasswordBasedCipher=m.extend({cfg:m.cfg.extend({kdf:y}),encrypt:function(e,t,n,r){var i=(r=this.cfg.extend(r)).kdf.execute(n,e.keySize,e.ivSize,r.salt,r.hasher);r.iv=i.iv;var a=m.encrypt.call(this,e,t,i.key,r);return a.mixIn(i),a},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=r.kdf.execute(n,e.keySize,e.ivSize,t.salt,r.hasher);return r.iv=i.iv,m.decrypt.call(this,e,t,i.key,r)}})}()))}()},2425:(e,t,n)=>{var r=n(6564),i=n(3897),a=/[0-9]/,s=/[a-z|\-]/i,o=/\s/,l=/:/,c=/,/,u=/and$/,d=/@/;e.exports={parse:function(e){var t=function(e){for(var t=[],n=[];e.length>0;){var a=e.shift();if("number"!==a.type&&"literal"!==a.type){if("operator"===a.type){if(l.test(a.value)){a={type:"query",key:t.pop(),value:e.shift()},t.push(a);continue}for(;n.length>0;)t.unshift(n.pop());n.push(a)}}else t.push(a)}for(;n.length>0;)t.unshift(n.pop());return function e(){var n=t.shift();if("number"===n.type)return parseInt(n.value);if("literal"===n.type)return n.value;if("operator"===n.type){var a=e(),s=e();return i(n.value,a,s)}return"query"===n.type?(a=n.key.value,s=n.value.value,r(a,s)):void 0}()}(function(e){for(var t=0,n=[];t{const r=n(8680),{swap32LE:i}=n(8975);e.exports=class{constructor(e){const t="function"===typeof e.readUInt32BE&&"function"===typeof e.slice;if(t||e instanceof Uint8Array){let n;if(t)this.highStart=e.readUInt32LE(0),this.errorValue=e.readUInt32LE(4),n=e.readUInt32LE(8),e=e.slice(12);else{const t=new DataView(e.buffer);this.highStart=t.getUint32(0,!0),this.errorValue=t.getUint32(4,!0),n=t.getUint32(8,!0),e=e.subarray(12)}e=r(e,new Uint8Array(n)),e=r(e,new Uint8Array(n)),i(e),this.data=new Uint32Array(e.buffer)}else({data:this.data,highStart:this.highStart,errorValue:this.errorValue}=e)}get(e){let t;return e<0||e>1114111?this.errorValue:e<55296||e>56319&&e<=65535?(t=(this.data[e>>5]<<2)+(31&e),this.data[t]):e<=65535?(t=(this.data[2048+(e-55296>>5)]<<2)+(31&e),this.data[t]):e>11)],t=this.data[t+(e>>5&63)],t=(t<<2)+(31&e),this.data[t]):this.data[this.data.length-4]}}},2730:(e,t,n)=>{"use strict";var r=n(5043),i=n(8853);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n