Files
iotDashboard/frontend/src/App.css

166 lines
2.9 KiB
CSS

/* 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));
}