/* Custom styles for the IoT Dashboard */ #root { width: 100%; min-height: 100vh; } /* Custom scrollbar for the drawer */ .drawer-side::-webkit-scrollbar { width: 8px; } .drawer-side::-webkit-scrollbar-track { background: transparent; } .drawer-side::-webkit-scrollbar-thumb { background: hsl(var(--bc) / 0.2); border-radius: 4px; } .drawer-side::-webkit-scrollbar-thumb:hover { background: hsl(var(--bc) / 0.3); } /* Smooth transitions for interactive elements */ .btn, .card { transition: all 0.2s ease-in-out; } .card:hover { transform: translateY(-2px); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); } /* Badge animations */ .badge { transition: all 0.2s ease-in-out; } /* Stats animation on load */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .stats { animation: fadeInUp 0.5s ease-out; } /* Responsive table scrolling */ .overflow-x-auto { scrollbar-width: thin; scrollbar-color: hsl(var(--bc) / 0.2) transparent; } .overflow-x-auto::-webkit-scrollbar { height: 8px; } .overflow-x-auto::-webkit-scrollbar-track { background: transparent; } .overflow-x-auto::-webkit-scrollbar-thumb { background: hsl(var(--bc) / 0.2); border-radius: 4px; } /* Loading spinner custom styles */ .loading { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* React Grid Layout Overrides */ .react-grid-layout { position: relative; } .react-grid-item { transition: all 200ms ease; transition-property: left, top, width, height; } .react-grid-item img { pointer-events: none; user-select: none; } .react-grid-item > .react-resizable-handle { position: absolute; width: 20px; height: 20px; } .react-grid-item > .react-resizable-handle::after { content: ""; position: absolute; right: 3px; bottom: 3px; width: 5px; height: 5px; border-right: 2px solid hsl(var(--bc) / 0.4); border-bottom: 2px solid hsl(var(--bc) / 0.4); } .react-resizable-hide > .react-resizable-handle { display: none; } .react-grid-item > .react-resizable-handle.react-resizable-handle-se { bottom: 0; right: 0; cursor: se-resize; } .react-grid-item.resizing { transition: none; z-index: 100; will-change: width, height; } .react-grid-item.react-draggable-dragging { transition: none; z-index: 100; will-change: transform; } .react-grid-item.dropping { visibility: hidden; } .react-grid-item.react-grid-placeholder { background: hsl(var(--p) / 0.2); opacity: 0.2; transition-duration: 100ms; z-index: 2; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; border-radius: 0.5rem; } .react-grid-item > .react-resizable-handle::after { border-right: 2px solid hsl(var(--p)); border-bottom: 2px solid hsl(var(--p)); }