Files
authsec_angularClarity_modern/frontend/angular-clarity-master/src/styles/_components.scss

710 lines
13 KiB
SCSS
Raw Normal View History

2025-09-27 16:23:30 +05:30
// ========================================
// 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;
}
}