710 lines
13 KiB
SCSS
710 lines
13 KiB
SCSS
|
|
// ========================================
|
||
|
|
// COMPONENT STYLES - Modern UI Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
|
||
|
|
@import './design-tokens';
|
||
|
|
|
||
|
|
// Card Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-card {
|
||
|
|
background: $card-bg;
|
||
|
|
backdrop-filter: $backdrop-blur-md;
|
||
|
|
border: 1px solid $card-border;
|
||
|
|
border-radius: $radius-xl;
|
||
|
|
box-shadow: $card-shadow;
|
||
|
|
padding: $space-6;
|
||
|
|
transition: all $duration-300 $ease-out;
|
||
|
|
position: relative;
|
||
|
|
overflow: hidden;
|
||
|
|
|
||
|
|
&::before {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
height: 1px;
|
||
|
|
background: $glass-gradient;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
transform: translateY(-2px);
|
||
|
|
box-shadow: $shadow-xl;
|
||
|
|
border-color: rgba($primary-500, 0.2);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.glassmorphism {
|
||
|
|
background: rgba(255, 255, 255, 0.1);
|
||
|
|
backdrop-filter: $backdrop-blur-lg;
|
||
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.gradient {
|
||
|
|
background: $gradient-primary;
|
||
|
|
color: $white;
|
||
|
|
border: none;
|
||
|
|
|
||
|
|
&::before {
|
||
|
|
background: rgba(255, 255, 255, 0.1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.card-header {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: space-between;
|
||
|
|
margin-bottom: $space-4;
|
||
|
|
padding-bottom: $space-4;
|
||
|
|
border-bottom: 1px solid $gray-200;
|
||
|
|
|
||
|
|
.card-title {
|
||
|
|
font-size: $text-xl;
|
||
|
|
font-weight: $font-semibold;
|
||
|
|
color: $gray-900;
|
||
|
|
margin: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.card-actions {
|
||
|
|
display: flex;
|
||
|
|
gap: $space-2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.card-body {
|
||
|
|
color: $gray-700;
|
||
|
|
line-height: $leading-relaxed;
|
||
|
|
}
|
||
|
|
|
||
|
|
.card-footer {
|
||
|
|
margin-top: $space-4;
|
||
|
|
padding-top: $space-4;
|
||
|
|
border-top: 1px solid $gray-200;
|
||
|
|
display: flex;
|
||
|
|
justify-content: flex-end;
|
||
|
|
gap: $space-3;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Button Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-btn {
|
||
|
|
display: inline-flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: center;
|
||
|
|
gap: $space-2;
|
||
|
|
padding: $space-3 $space-6;
|
||
|
|
font-size: $text-sm;
|
||
|
|
font-weight: $font-medium;
|
||
|
|
line-height: 1;
|
||
|
|
border-radius: $radius-lg;
|
||
|
|
border: 1px solid transparent;
|
||
|
|
cursor: pointer;
|
||
|
|
transition: all $duration-200 $ease-out;
|
||
|
|
text-decoration: none;
|
||
|
|
position: relative;
|
||
|
|
overflow: hidden;
|
||
|
|
|
||
|
|
&:focus {
|
||
|
|
outline: 2px solid $primary-500;
|
||
|
|
outline-offset: 2px;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:disabled {
|
||
|
|
opacity: 0.5;
|
||
|
|
cursor: not-allowed;
|
||
|
|
pointer-events: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Sizes
|
||
|
|
&.btn-sm {
|
||
|
|
padding: $space-2 $space-4;
|
||
|
|
font-size: $text-xs;
|
||
|
|
height: $btn-height-sm;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-md {
|
||
|
|
padding: $space-3 $space-6;
|
||
|
|
font-size: $text-sm;
|
||
|
|
height: $btn-height-md;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-lg {
|
||
|
|
padding: $space-4 $space-8;
|
||
|
|
font-size: $text-base;
|
||
|
|
height: $btn-height-lg;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Variants
|
||
|
|
&.btn-primary {
|
||
|
|
background: $gradient-primary;
|
||
|
|
color: $white;
|
||
|
|
border-color: $primary-600;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: linear-gradient(135deg, $primary-600 0%, $primary-800 100%);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
box-shadow: $shadow-lg;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:active {
|
||
|
|
transform: translateY(0);
|
||
|
|
box-shadow: $shadow-md;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-secondary {
|
||
|
|
background: $white;
|
||
|
|
color: $gray-700;
|
||
|
|
border-color: $gray-300;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: $gray-50;
|
||
|
|
border-color: $gray-400;
|
||
|
|
transform: translateY(-1px);
|
||
|
|
box-shadow: $shadow-md;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-outline {
|
||
|
|
background: transparent;
|
||
|
|
color: $primary-600;
|
||
|
|
border-color: $primary-600;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: $primary-50;
|
||
|
|
border-color: $primary-700;
|
||
|
|
color: $primary-700;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-ghost {
|
||
|
|
background: transparent;
|
||
|
|
color: $gray-600;
|
||
|
|
border-color: transparent;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: $gray-100;
|
||
|
|
color: $gray-900;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-success {
|
||
|
|
background: $gradient-success;
|
||
|
|
color: $white;
|
||
|
|
border-color: $accent-green;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: linear-gradient(135deg, #059669 0%, #047857 100%);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
box-shadow: $shadow-lg;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-warning {
|
||
|
|
background: $gradient-warning;
|
||
|
|
color: $white;
|
||
|
|
border-color: $accent-orange;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: linear-gradient(135deg, #d97706 0%, #b45309 100%);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
box-shadow: $shadow-lg;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-error {
|
||
|
|
background: $gradient-error;
|
||
|
|
color: $white;
|
||
|
|
border-color: $accent-red;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: linear-gradient(135deg, #dc2626 0%, #b91c1c 100%);
|
||
|
|
transform: translateY(-1px);
|
||
|
|
box-shadow: $shadow-lg;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Loading state
|
||
|
|
&.loading {
|
||
|
|
position: relative;
|
||
|
|
color: transparent;
|
||
|
|
|
||
|
|
&::after {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
width: 16px;
|
||
|
|
height: 16px;
|
||
|
|
border: 2px solid transparent;
|
||
|
|
border-top: 2px solid currentColor;
|
||
|
|
border-radius: 50%;
|
||
|
|
animation: spin 1s linear infinite;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes spin {
|
||
|
|
to {
|
||
|
|
transform: rotate(360deg);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Form Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-form-group {
|
||
|
|
margin-bottom: $space-6;
|
||
|
|
|
||
|
|
.form-label {
|
||
|
|
display: block;
|
||
|
|
font-size: $text-sm;
|
||
|
|
font-weight: $font-medium;
|
||
|
|
color: $gray-700;
|
||
|
|
margin-bottom: $space-2;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-input {
|
||
|
|
width: 100%;
|
||
|
|
padding: $space-3 $space-4;
|
||
|
|
font-size: $text-sm;
|
||
|
|
line-height: $leading-normal;
|
||
|
|
color: $gray-900;
|
||
|
|
background: $white;
|
||
|
|
border: 1px solid $input-border;
|
||
|
|
border-radius: $radius-lg;
|
||
|
|
transition: all $duration-200 $ease-out;
|
||
|
|
|
||
|
|
&:focus {
|
||
|
|
outline: none;
|
||
|
|
border-color: $input-border-focus;
|
||
|
|
box-shadow: 0 0 0 3px rgba($primary-500, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
&:disabled {
|
||
|
|
background: $gray-100;
|
||
|
|
color: $gray-500;
|
||
|
|
cursor: not-allowed;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.error {
|
||
|
|
border-color: $input-border-error;
|
||
|
|
box-shadow: 0 0 0 3px rgba($error, 0.1);
|
||
|
|
}
|
||
|
|
|
||
|
|
&::placeholder {
|
||
|
|
color: $gray-400;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-textarea {
|
||
|
|
@extend .form-input;
|
||
|
|
min-height: 120px;
|
||
|
|
resize: vertical;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-select {
|
||
|
|
@extend .form-input;
|
||
|
|
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
|
||
|
|
background-position: right $space-3 center;
|
||
|
|
background-repeat: no-repeat;
|
||
|
|
background-size: 16px 12px;
|
||
|
|
padding-right: $space-10;
|
||
|
|
appearance: none;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-error {
|
||
|
|
margin-top: $space-1;
|
||
|
|
font-size: $text-xs;
|
||
|
|
color: $error;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-help {
|
||
|
|
margin-top: $space-1;
|
||
|
|
font-size: $text-xs;
|
||
|
|
color: $gray-500;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Input Group
|
||
|
|
.input-group {
|
||
|
|
display: flex;
|
||
|
|
align-items: stretch;
|
||
|
|
|
||
|
|
.input-group-prepend {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
padding: $space-3 $space-4;
|
||
|
|
background: $gray-100;
|
||
|
|
border: 1px solid $gray-300;
|
||
|
|
border-right: none;
|
||
|
|
border-radius: $radius-lg 0 0 $radius-lg;
|
||
|
|
color: $gray-600;
|
||
|
|
}
|
||
|
|
|
||
|
|
.input-group-append {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
padding: $space-3 $space-4;
|
||
|
|
background: $gray-100;
|
||
|
|
border: 1px solid $gray-300;
|
||
|
|
border-left: none;
|
||
|
|
border-radius: 0 $radius-lg $radius-lg 0;
|
||
|
|
color: $gray-600;
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-input {
|
||
|
|
border-radius: 0;
|
||
|
|
|
||
|
|
&:first-child {
|
||
|
|
border-radius: $radius-lg 0 0 $radius-lg;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:last-child {
|
||
|
|
border-radius: 0 $radius-lg $radius-lg 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:only-child {
|
||
|
|
border-radius: $radius-lg;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Table Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-table {
|
||
|
|
width: 100%;
|
||
|
|
border-collapse: collapse;
|
||
|
|
background: $white;
|
||
|
|
border-radius: $radius-xl;
|
||
|
|
overflow: hidden;
|
||
|
|
box-shadow: $shadow-lg;
|
||
|
|
|
||
|
|
thead {
|
||
|
|
background: $gray-50;
|
||
|
|
|
||
|
|
th {
|
||
|
|
padding: $space-4 $space-6;
|
||
|
|
text-align: left;
|
||
|
|
font-size: $text-xs;
|
||
|
|
font-weight: $font-semibold;
|
||
|
|
color: $gray-600;
|
||
|
|
text-transform: uppercase;
|
||
|
|
letter-spacing: 0.05em;
|
||
|
|
border-bottom: 1px solid $gray-200;
|
||
|
|
|
||
|
|
&:first-child {
|
||
|
|
padding-left: $space-8;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:last-child {
|
||
|
|
padding-right: $space-8;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
tbody {
|
||
|
|
tr {
|
||
|
|
transition: background-color $duration-150 $ease-out;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: $gray-50;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:not(:last-child) {
|
||
|
|
border-bottom: 1px solid $gray-200;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
td {
|
||
|
|
padding: $space-4 $space-6;
|
||
|
|
font-size: $text-sm;
|
||
|
|
color: $gray-700;
|
||
|
|
|
||
|
|
&:first-child {
|
||
|
|
padding-left: $space-8;
|
||
|
|
}
|
||
|
|
|
||
|
|
&:last-child {
|
||
|
|
padding-right: $space-8;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Badge Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-badge {
|
||
|
|
display: inline-flex;
|
||
|
|
align-items: center;
|
||
|
|
padding: $space-1 $space-3;
|
||
|
|
font-size: $text-xs;
|
||
|
|
font-weight: $font-medium;
|
||
|
|
border-radius: $radius-full;
|
||
|
|
text-transform: uppercase;
|
||
|
|
letter-spacing: 0.05em;
|
||
|
|
|
||
|
|
&.badge-primary {
|
||
|
|
background: $primary-100;
|
||
|
|
color: $primary-800;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.badge-secondary {
|
||
|
|
background: $secondary-100;
|
||
|
|
color: $secondary-800;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.badge-success {
|
||
|
|
background: rgba($accent-green, 0.1);
|
||
|
|
color: $accent-green;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.badge-warning {
|
||
|
|
background: rgba($accent-orange, 0.1);
|
||
|
|
color: $accent-orange;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.badge-error {
|
||
|
|
background: rgba($accent-red, 0.1);
|
||
|
|
color: $accent-red;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.badge-gray {
|
||
|
|
background: $gray-100;
|
||
|
|
color: $gray-700;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Alert Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-alert {
|
||
|
|
padding: $space-4 $space-6;
|
||
|
|
border-radius: $radius-lg;
|
||
|
|
border: 1px solid;
|
||
|
|
margin-bottom: $space-4;
|
||
|
|
display: flex;
|
||
|
|
align-items: flex-start;
|
||
|
|
gap: $space-3;
|
||
|
|
|
||
|
|
.alert-icon {
|
||
|
|
flex-shrink: 0;
|
||
|
|
margin-top: 2px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.alert-content {
|
||
|
|
flex: 1;
|
||
|
|
|
||
|
|
.alert-title {
|
||
|
|
font-weight: $font-semibold;
|
||
|
|
margin-bottom: $space-1;
|
||
|
|
}
|
||
|
|
|
||
|
|
.alert-message {
|
||
|
|
font-size: $text-sm;
|
||
|
|
line-height: $leading-relaxed;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-info {
|
||
|
|
background: rgba($primary-500, 0.05);
|
||
|
|
border-color: rgba($primary-500, 0.2);
|
||
|
|
color: $primary-800;
|
||
|
|
|
||
|
|
.alert-icon {
|
||
|
|
color: $primary-600;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-success {
|
||
|
|
background: rgba($accent-green, 0.05);
|
||
|
|
border-color: rgba($accent-green, 0.2);
|
||
|
|
color: #065f46;
|
||
|
|
|
||
|
|
.alert-icon {
|
||
|
|
color: $accent-green;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-warning {
|
||
|
|
background: rgba($accent-orange, 0.05);
|
||
|
|
border-color: rgba($accent-orange, 0.2);
|
||
|
|
color: #92400e;
|
||
|
|
|
||
|
|
.alert-icon {
|
||
|
|
color: $accent-orange;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-error {
|
||
|
|
background: rgba($accent-red, 0.05);
|
||
|
|
border-color: rgba($accent-red, 0.2);
|
||
|
|
color: #991b1b;
|
||
|
|
|
||
|
|
.alert-icon {
|
||
|
|
color: $accent-red;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Modal Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-modal {
|
||
|
|
.modal-backdrop {
|
||
|
|
position: fixed;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
bottom: 0;
|
||
|
|
background: rgba($black, 0.5);
|
||
|
|
backdrop-filter: $backdrop-blur-sm;
|
||
|
|
z-index: $z-modal-backdrop;
|
||
|
|
animation: fadeIn $duration-200 $ease-out;
|
||
|
|
}
|
||
|
|
|
||
|
|
.modal-dialog {
|
||
|
|
position: fixed;
|
||
|
|
top: 50%;
|
||
|
|
left: 50%;
|
||
|
|
transform: translate(-50%, -50%);
|
||
|
|
background: $white;
|
||
|
|
border-radius: $radius-2xl;
|
||
|
|
box-shadow: $shadow-2xl;
|
||
|
|
z-index: $z-modal;
|
||
|
|
max-width: 90vw;
|
||
|
|
max-height: 90vh;
|
||
|
|
overflow: hidden;
|
||
|
|
animation: slideIn $duration-300 $ease-out;
|
||
|
|
|
||
|
|
.modal-header {
|
||
|
|
padding: $space-6 $space-8;
|
||
|
|
border-bottom: 1px solid $gray-200;
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
justify-content: space-between;
|
||
|
|
|
||
|
|
.modal-title {
|
||
|
|
font-size: $text-xl;
|
||
|
|
font-weight: $font-semibold;
|
||
|
|
color: $gray-900;
|
||
|
|
margin: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.modal-close {
|
||
|
|
background: none;
|
||
|
|
border: none;
|
||
|
|
color: $gray-400;
|
||
|
|
cursor: pointer;
|
||
|
|
padding: $space-2;
|
||
|
|
border-radius: $radius-md;
|
||
|
|
transition: all $duration-200 $ease-out;
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: $gray-100;
|
||
|
|
color: $gray-600;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modal-body {
|
||
|
|
padding: $space-6 $space-8;
|
||
|
|
max-height: 60vh;
|
||
|
|
overflow-y: auto;
|
||
|
|
}
|
||
|
|
|
||
|
|
.modal-footer {
|
||
|
|
padding: $space-6 $space-8;
|
||
|
|
border-top: 1px solid $gray-200;
|
||
|
|
display: flex;
|
||
|
|
justify-content: flex-end;
|
||
|
|
gap: $space-3;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes fadeIn {
|
||
|
|
from {
|
||
|
|
opacity: 0;
|
||
|
|
}
|
||
|
|
to {
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes slideIn {
|
||
|
|
from {
|
||
|
|
opacity: 0;
|
||
|
|
transform: translate(-50%, -60%);
|
||
|
|
}
|
||
|
|
to {
|
||
|
|
opacity: 1;
|
||
|
|
transform: translate(-50%, -50%);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Loading Components
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-spinner {
|
||
|
|
display: inline-block;
|
||
|
|
width: 20px;
|
||
|
|
height: 20px;
|
||
|
|
border: 2px solid $gray-200;
|
||
|
|
border-top: 2px solid $primary-500;
|
||
|
|
border-radius: 50%;
|
||
|
|
animation: spin 1s linear infinite;
|
||
|
|
|
||
|
|
&.spinner-sm {
|
||
|
|
width: 16px;
|
||
|
|
height: 16px;
|
||
|
|
border-width: 1.5px;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.spinner-lg {
|
||
|
|
width: 32px;
|
||
|
|
height: 32px;
|
||
|
|
border-width: 3px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-skeleton {
|
||
|
|
background: linear-gradient(90deg, $gray-200 25%, $gray-100 50%, $gray-200 75%);
|
||
|
|
background-size: 200% 100%;
|
||
|
|
animation: shimmer 1.5s infinite;
|
||
|
|
border-radius: $radius-md;
|
||
|
|
|
||
|
|
&.skeleton-text {
|
||
|
|
height: 1em;
|
||
|
|
margin-bottom: $space-2;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.skeleton-title {
|
||
|
|
height: 1.5em;
|
||
|
|
margin-bottom: $space-4;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.skeleton-avatar {
|
||
|
|
width: 40px;
|
||
|
|
height: 40px;
|
||
|
|
border-radius: 50%;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.skeleton-button {
|
||
|
|
height: 40px;
|
||
|
|
width: 100px;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@keyframes shimmer {
|
||
|
|
0% {
|
||
|
|
background-position: -200% 0;
|
||
|
|
}
|
||
|
|
100% {
|
||
|
|
background-position: 200% 0;
|
||
|
|
}
|
||
|
|
}
|