diff --git a/web/client/src/App.css b/web/client/src/App.css new file mode 100644 index 0000000..f4673e4 --- /dev/null +++ b/web/client/src/App.css @@ -0,0 +1,369 @@ +/* ============================================ + Minecraft-Themed Inventory Manager Dashboard + ============================================ */ + +@import url('https://fonts.googleapis.com/css2?family=Silkscreen:wght@400;700&display=swap'); + +:root { + --mc-dark: #1a1a1a; + --mc-darker: #0e0e0e; + --mc-stone: #7b7b7b; + --mc-stone-light: #9d9d9d; + --mc-stone-dark: #4b4b4b; + --mc-dirt: #6b5030; + --mc-dirt-dark: #4a3520; + --mc-oak: #8b6d3c; + --mc-oak-dark: #6b4e28; + --mc-oak-light: #b89b60; + --mc-grass: #5b8731; + --mc-grass-light: #80b94e; + --mc-grass-dark: #3d6b1a; + --mc-inv-bg: #c6c6c6; + --mc-inv-slot: #8b8b8b; + --mc-inv-slot-border: #373737; + --mc-inv-slot-light: #ffffff; + --mc-text-white: #e0e0e0; + --mc-text-gray: #a0a0a0; + --mc-text-dark: #404040; + --mc-text-yellow: #ffff55; + --mc-text-green: #55ff55; + --mc-text-red: #ff5555; + --mc-text-aqua: #55ffff; + --mc-text-gold: #ffaa00; + --mc-text-light-purple: #ff55ff; + --mc-text-blue: #5555ff; + --mc-diamond: #4aedd9; + --mc-emerald: #17dd62; + --mc-redstone: #ff0000; + --mc-lapis: #345ec3; + --mc-border-highlight: #ffffff55; + --mc-border-shadow: #00000088; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Silkscreen', 'Courier New', monospace; + background: #2c2c2c; + color: var(--mc-text-white); + image-rendering: pixelated; + overflow: hidden; +} + +.app { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + overflow: hidden; +} + +/* === Header === */ +.app-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.75rem 1.25rem; + background: var(--mc-oak-dark); + border-bottom: 3px solid var(--mc-dark); + box-shadow: + inset 0 2px 0 var(--mc-oak-light), + inset 0 -2px 0 var(--mc-dirt-dark); + flex-shrink: 0; +} + +.app-header h1 { + font-size: 1.1rem; + font-weight: 700; + color: var(--mc-text-yellow); + text-shadow: 2px 2px 0 var(--mc-dark); + letter-spacing: 0.05em; +} + +/* === Connection Status === */ +.connection-status { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.375rem 0.75rem; + border: 2px solid var(--mc-dark); + font-weight: 700; + font-size: 0.7rem; + text-shadow: 1px 1px 0 var(--mc-dark); +} + +.connection-status.connected { + background: var(--mc-grass-dark); + color: var(--mc-text-green); + box-shadow: inset 0 1px 0 var(--mc-grass-light), inset 0 -1px 0 #2a5010; +} + +.connection-status.disconnected { + background: #6b1a1a; + color: var(--mc-text-red); + box-shadow: inset 0 1px 0 #a03030, inset 0 -1px 0 #400e0e; +} + +.status-dot { + width: 0.5rem; + height: 0.5rem; + border-radius: 0; + animation: mc-blink 1.5s steps(2) infinite; +} + +.connected .status-dot { + background: var(--mc-text-green); + box-shadow: 0 0 4px var(--mc-text-green); +} + +.disconnected .status-dot { + background: var(--mc-text-red); + box-shadow: 0 0 4px var(--mc-text-red); +} + +@keyframes mc-blink { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +/* === Command Toast === */ +.command-toast { + position: fixed; + top: 60px; + left: 50%; + transform: translateX(-50%); + padding: 0.5rem 1.5rem; + border: 2px solid var(--mc-dark); + font-size: 0.75rem; + font-weight: 700; + z-index: 1000; + text-shadow: 1px 1px 0 var(--mc-dark); + animation: toast-in 0.2s ease; +} + +.command-toast.success { + background: var(--mc-grass-dark); + color: var(--mc-text-green); +} + +.command-toast.error { + background: #6b1a1a; + color: var(--mc-text-red); +} + +@keyframes toast-in { + from { opacity: 0; transform: translateX(-50%) translateY(-10px); } + to { opacity: 1; transform: translateX(-50%) translateY(0); } +} + +/* === Main Content === */ +.app-content { + flex: 1; + display: flex; + overflow: hidden; +} + +/* === Sidebar === */ +.sidebar { + width: 280px; + background: #333; + border-right: 3px solid var(--mc-dark); + overflow-y: auto; + flex-shrink: 0; +} + +/* === Main Panel === */ +.main-panel { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +/* === Panel Tabs === */ +.panel-tabs { + display: flex; + gap: 0.25rem; + padding: 0.5rem; + background: #3b3b3b; + border-bottom: 3px solid var(--mc-dark); + overflow-x: auto; + flex-shrink: 0; +} + +.panel-tabs button { + padding: 0.5rem 1rem; + border: 2px solid var(--mc-dark); + background: #5a5a5a; + color: var(--mc-text-gray); + border-radius: 0; + font-size: 0.875rem; + font-weight: 700; + cursor: pointer; + transition: all 0.1s; + white-space: nowrap; + font-family: 'Silkscreen', 'Courier New', monospace; + text-shadow: 1px 1px 0 var(--mc-dark); + box-shadow: inset 0 -2px 0 #444, inset 0 2px 0 #777; +} + +.panel-tabs button:hover { + background: #6b6b6b; + color: var(--mc-text-white); +} + +.panel-tabs button.active { + background: #4a8c2a; + color: white; + box-shadow: inset 0 2px 0 #6ab04c, inset 0 -2px 0 #2d6b1a; +} + +.panel-content-wrapper { + flex: 1; + overflow: hidden; + display: flex; + flex-direction: column; +} + +/* === Scrollbar === */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #2c2c2c; +} + +::-webkit-scrollbar-thumb { + background: #5a5a5a; + border: 1px solid var(--mc-dark); +} + +::-webkit-scrollbar-thumb:hover { + background: #6b6b6b; +} + +/* === Section styling === */ +.detail-section { + margin-bottom: 1rem; + padding: 0.875rem; + background: #3b3b3b; + border: 3px solid var(--mc-dark); + border-radius: 0; + box-shadow: + inset 0 2px 0 #555, + inset 0 -2px 0 #2a2a2a; +} + +.detail-section h3 { + font-size: 0.8rem; + margin-bottom: 0.75rem; + color: var(--mc-text-gold); + font-weight: 700; + display: flex; + align-items: center; + gap: 0.5rem; + text-shadow: 1px 1px 0 var(--mc-dark); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +/* === MC Button === */ +.mc-btn { + padding: 0.5rem 0.75rem; + border: 2px solid var(--mc-dark); + border-radius: 0; + font-size: 0.7rem; + font-weight: 700; + cursor: pointer; + transition: all 0.05s; + color: white; + display: flex; + align-items: center; + justify-content: center; + gap: 0.25rem; + white-space: nowrap; + font-family: 'Silkscreen', 'Courier New', monospace; + text-shadow: 1px 1px 0 var(--mc-dark); + background: #6b6b6b; + box-shadow: inset 0 2px 0 #999, inset 0 -2px 0 #444; +} + +.mc-btn:hover { + background: #7b7b7b; + box-shadow: inset 0 2px 0 #aaa, inset 0 -2px 0 #555; +} + +.mc-btn:active { + background: #555; + box-shadow: inset 0 2px 0 #333, inset 0 -2px 0 #777; +} + +.mc-btn.green { + background: var(--mc-grass-dark); + box-shadow: inset 0 2px 0 var(--mc-grass-light), inset 0 -2px 0 #2a5010; +} +.mc-btn.green:hover { background: var(--mc-grass); } + +.mc-btn.red { + background: #8b2e2e; + box-shadow: inset 0 2px 0 #bb4444, inset 0 -2px 0 #661a1a; +} +.mc-btn.red:hover { background: #a03e3e; } + +.mc-btn.blue { + background: #2e4a8b; + box-shadow: inset 0 2px 0 #4466bb, inset 0 -2px 0 #1a2a66; +} +.mc-btn.blue:hover { background: #3e5a9b; } + +.mc-btn.gold { + background: #8b6b2e; + box-shadow: inset 0 2px 0 #bb9944, inset 0 -2px 0 #664a1a; +} +.mc-btn.gold:hover { background: #9b7b3e; } + +/* === Responsive === */ +@media (max-width: 1024px) { + .sidebar { + width: 220px; + } +} + +@media (max-width: 768px) { + .app-content { + flex-direction: column; + } + + .sidebar { + width: 100%; + max-height: 200px; + border-right: none; + border-bottom: 3px solid var(--mc-dark); + } +} + +@media (max-width: 480px) { + .app-header h1 { + font-size: 0.85rem; + } + + .panel-tabs button { + font-size: 0.7rem; + padding: 0.4rem 0.6rem; + } +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +}