187 lines
3.3 KiB
SCSS
187 lines
3.3 KiB
SCSS
// Responsive breakpoints
|
|
@mixin respond-above($breakpoint) {
|
|
@media (min-width: $breakpoint) {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@mixin respond-below($breakpoint) {
|
|
@media (max-width: #{$breakpoint - 1px}) {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
// Flexbox utilities
|
|
@mixin flex-center {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
@mixin flex-between {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
@mixin flex-column {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
// Grid utilities
|
|
@mixin grid-responsive(
|
|
$columns-mobile: 1,
|
|
$columns-tablet: 2,
|
|
$columns-desktop: 3,
|
|
$gap: $spacing-md
|
|
) {
|
|
display: grid;
|
|
gap: $gap;
|
|
grid-template-columns: repeat($columns-mobile, 1fr);
|
|
|
|
@include respond-above($breakpoint-md) {
|
|
grid-template-columns: repeat($columns-tablet, 1fr);
|
|
}
|
|
|
|
@include respond-above($breakpoint-lg) {
|
|
grid-template-columns: repeat($columns-desktop, 1fr);
|
|
}
|
|
}
|
|
|
|
// Button mixins
|
|
@mixin button-base {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: $radius-md;
|
|
font-weight: 500;
|
|
transition: all $transition-fast;
|
|
cursor: pointer;
|
|
border: none;
|
|
text-decoration: none;
|
|
|
|
&:disabled {
|
|
opacity: 0.5;
|
|
cursor: not-allowed;
|
|
}
|
|
}
|
|
|
|
@mixin button-primary {
|
|
@include button-base;
|
|
background-color: $primary;
|
|
color: white;
|
|
|
|
&:hover:not(:disabled) {
|
|
background-color: $primary-dark;
|
|
}
|
|
}
|
|
|
|
@mixin button-secondary {
|
|
@include button-base;
|
|
background-color: $gray-100;
|
|
color: $gray-700;
|
|
border: 1px solid $gray-200;
|
|
|
|
&:hover:not(:disabled) {
|
|
background-color: $gray-200;
|
|
}
|
|
}
|
|
|
|
// Card mixins
|
|
@mixin card-base {
|
|
background-color: white;
|
|
border-radius: $radius-2xl;
|
|
box-shadow: $shadow-sm;
|
|
border: 1px solid $gray-100;
|
|
}
|
|
|
|
@mixin card-padding($size: md) {
|
|
@if $size == sm {
|
|
padding: $spacing-md;
|
|
} @else if $size == md {
|
|
padding: $spacing-lg;
|
|
} @else if $size == lg {
|
|
padding: $spacing-xl;
|
|
}
|
|
}
|
|
|
|
// Status indicators
|
|
@mixin status-indicator($color) {
|
|
width: 0.5rem;
|
|
height: 0.5rem;
|
|
border-radius: 50%;
|
|
background-color: $color;
|
|
}
|
|
|
|
// Sensor type styling
|
|
@mixin sensor-type-style($bg-color, $text-color) {
|
|
background-color: $bg-color;
|
|
color: $text-color;
|
|
padding: $spacing-sm;
|
|
border-radius: $radius-lg;
|
|
}
|
|
|
|
// Battery indicator
|
|
@mixin battery-indicator {
|
|
height: 0.25rem;
|
|
background-color: $gray-200;
|
|
border-radius: 9999px;
|
|
overflow: hidden;
|
|
|
|
.fill {
|
|
height: 100%;
|
|
border-radius: inherit;
|
|
transition: all $transition-normal;
|
|
|
|
&.good {
|
|
background-color: $battery-good;
|
|
}
|
|
|
|
&.warning {
|
|
background-color: $battery-warning;
|
|
}
|
|
|
|
&.critical {
|
|
background-color: $battery-critical;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Custom slider
|
|
@mixin custom-slider {
|
|
width: 100%;
|
|
height: 0.5rem;
|
|
background-color: $gray-200;
|
|
border-radius: $radius-lg;
|
|
appearance: none;
|
|
cursor: pointer;
|
|
|
|
&::-webkit-slider-thumb {
|
|
appearance: none;
|
|
height: 1.25rem;
|
|
width: 1.25rem;
|
|
border-radius: 50%;
|
|
background: $primary;
|
|
cursor: pointer;
|
|
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
&::-moz-range-thumb {
|
|
height: 1.25rem;
|
|
width: 1.25rem;
|
|
border-radius: 50%;
|
|
background: $primary;
|
|
cursor: pointer;
|
|
border: none;
|
|
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
|
|
}
|
|
}
|
|
|
|
// Truncate text
|
|
@mixin truncate {
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|