Files
GNX-WEB/gnx-react/public/styles/components/_buttons.scss
Iliyan Angelov f962401565 update
2025-10-10 02:01:46 +03:00

654 lines
13 KiB
SCSS

/* ====
--------- (3.01) buttons styles start ---------
==== */
@use "../abstracts/mixins" as *;
// Base button styles using modern design system
.btn {
@include button-base;
@include focus-visible;
// Legacy styles for backward compatibility
padding: var(--space-4) var(--space-10);
font-weight: var(--font-weight-semibold);
border: 1px solid var(--secondary-300);
border-radius: var(--radius-lg);
color: var(--secondary-600);
position: relative;
overflow: hidden;
text-transform: none;
z-index: 1;
letter-spacing: 0.5px;
&::before {
content: "";
position: absolute;
inset: 0px;
width: 0px;
transition: var(--transition-default);
background-color: var(--primary-600);
z-index: -1;
}
&:hover:not(:disabled) {
border-color: var(--primary-600);
color: var(--white);
transform: translateY(-1px);
box-shadow: var(--shadow-md);
&::before {
width: 100%;
}
}
&:active:not(:disabled) {
transform: translateY(0);
box-shadow: var(--shadow-sm);
}
&:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(var(--primary-600), 0.1);
}
// Button variants
&.btn-primary {
background-color: var(--primary-600);
border-color: var(--primary-600);
color: var(--white);
&::before {
background-color: var(--primary-700);
}
&:hover:not(:disabled) {
background-color: var(--primary-700);
border-color: var(--primary-700);
}
}
&.btn-secondary {
background-color: var(--secondary-100);
border-color: var(--secondary-200);
color: var(--secondary-700);
&::before {
background-color: var(--secondary-200);
}
&:hover:not(:disabled) {
background-color: var(--secondary-200);
border-color: var(--secondary-300);
color: var(--secondary-800);
}
}
&.btn-outline {
background-color: transparent;
border-color: var(--primary-600);
color: var(--primary-600);
&::before {
background-color: var(--primary-600);
}
&:hover:not(:disabled) {
background-color: var(--primary-600);
color: var(--white);
}
}
&.btn-ghost {
background-color: transparent;
border-color: transparent;
color: var(--secondary-600);
&::before {
background-color: var(--secondary-100);
}
&:hover:not(:disabled) {
background-color: var(--secondary-100);
color: var(--secondary-800);
}
}
// Button sizes
&.btn-sm {
padding: var(--space-2) var(--space-4);
font-size: var(--text-xs);
border-radius: var(--radius-md);
}
&.btn-lg {
padding: var(--space-4) var(--space-8);
font-size: var(--text-lg);
border-radius: var(--radius-xl);
}
&.btn-xl {
padding: var(--space-5) var(--space-10);
font-size: var(--text-xl);
border-radius: var(--radius-2xl);
}
// Button states
&.btn-loading {
position: relative;
color: transparent;
&::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 16px;
height: 16px;
margin: -8px 0 0 -8px;
border: 2px solid currentColor;
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s linear infinite;
}
}
&.btn-disabled,
&:disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
}
// Modern animated button with improved accessibility
.btn-anim {
@include flex-center;
@include focus-visible;
width: 170px;
height: 170px;
border: 1px solid var(--white);
border-radius: 50%;
color: var(--white);
font-weight: var(--font-weight-semibold);
position: relative;
overflow: hidden;
gap: var(--space-4);
z-index: 1;
padding: 0;
transition: var(--transition-default);
span {
position: absolute;
z-index: -1;
width: 0;
height: 0;
border-radius: 50%;
background: var(--primary-600);
transform: translate(-50%, -50%);
pointer-events: none;
transition: width 0.7s cubic-bezier(0.4, 0, 0.2, 1),
padding-top 0.7s cubic-bezier(0.4, 0, 0.2, 1);
}
&:hover:not(:disabled) {
color: var(--white);
border-color: var(--primary-600);
transform: scale(1.05);
span {
width: calc(100% * 2.25);
padding-top: calc(100% * 2.25);
}
}
&:active:not(:disabled) {
transform: scale(0.98);
}
// Responsive sizing
@include mobile-only {
width: 140px;
height: 140px;
font-size: var(--text-sm);
}
}
// Alternative button style with modern improvements
.alter-btn {
@include flex-center;
@include focus-visible;
padding: var(--space-16) var(--space-10);
width: 200px;
height: 200px;
border-radius: 50%;
display: inline-flex;
flex-wrap: wrap;
row-gap: var(--space-2);
border: 1px solid var(--white);
color: var(--white);
justify-content: flex-start;
font-weight: var(--font-weight-semibold);
font-size: var(--text-lg);
transition: var(--transition-default);
&:hover:not(:disabled) {
color: var(--secondary-800);
border-color: var(--primary-600);
background-color: var(--white);
transform: scale(1.05);
}
&:active:not(:disabled) {
transform: scale(0.98);
}
// Responsive sizing
@include mobile-only {
width: 160px;
height: 160px;
padding: var(--space-12) var(--space-8);
font-size: var(--text-base);
}
}
// Light variant of animated button
.btn-anim-light {
@include focus-visible;
border: 1px solid var(--secondary-800);
color: var(--secondary-800);
background-color: var(--white);
span {
background-color: var(--primary-600);
}
&:hover:not(:disabled) {
border-color: var(--primary-600);
color: var(--white);
background-color: var(--primary-600);
}
}
// Modern line button with improved animations
.btn-line {
@include focus-visible;
font-weight: var(--font-weight-semibold);
letter-spacing: 0.5px;
color: var(--secondary-600);
position: relative;
background: none;
border: none;
padding: var(--space-2) 0;
cursor: pointer;
transition: var(--transition-colors);
&::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 2px;
background-color: var(--secondary-300);
transition: var(--transition-default);
}
&::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background-color: var(--primary-600);
transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
&:hover:not(:disabled) {
color: var(--primary-600);
&::before {
width: 0;
left: 100%;
}
&::after {
width: 100%;
}
}
&:active:not(:disabled) {
color: var(--primary-700);
}
}
// Modern button variants
.btn-gradient {
@include button-base;
@include focus-visible;
background: linear-gradient(135deg, var(--primary-600), var(--primary-400));
border: none;
color: var(--white);
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
&:hover:not(:disabled) {
background: linear-gradient(135deg, var(--primary-700), var(--primary-500));
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
&::before {
left: 100%;
}
}
}
.btn-glass {
@include button-base;
@include focus-visible;
@include glassmorphism(0.1, 10px);
border: 1px solid rgba(255, 255, 255, 0.2);
color: var(--white);
backdrop-filter: blur(10px);
&:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.3);
transform: translateY(-2px);
}
}
.btn-floating {
@include button-base;
@include focus-visible;
@include shadow-elevation(3);
border-radius: var(--radius-full);
width: 56px;
height: 56px;
padding: 0;
&:hover:not(:disabled) {
@include shadow-elevation(4);
transform: translateY(-4px) scale(1.05);
}
&:active:not(:disabled) {
transform: translateY(-2px) scale(1.02);
}
}
.btn-icon {
@include button-base;
@include focus-visible;
width: 40px;
height: 40px;
padding: 0;
border-radius: var(--radius-lg);
i {
font-size: var(--text-lg);
}
&:hover:not(:disabled) {
transform: scale(1.1);
}
}
// Legacy angle button with modern improvements
.btn-angle {
position: relative;
font-weight: 400;
padding: 6px 24px;
font-size: 16px;
text-align: center;
justify-content: center;
gap: 0px;
&::before {
content: "";
position: absolute;
width: 8px;
height: 8px;
top: 0px;
left: 0px;
border-left: 1px solid white;
border-top: 1px solid white;
transition: var(--transition);
}
&::after {
content: "";
position: absolute;
width: 8px;
height: 8px;
top: 0px;
right: 0px;
border-right: 1px solid white;
border-top: 1px solid white;
transition: var(--transition);
}
span {
display: inline-block;
}
span::after {
content: "";
position: absolute;
width: 8px;
height: 8px;
bottom: 0px;
right: 0px;
border-right: 1px solid white;
border-bottom: 1px solid white;
transition: var(--transition);
}
span::before {
content: "";
position: absolute;
width: 8px;
height: 8px;
bottom: 0px;
left: 0px;
border-left: 1px solid white;
border-bottom: 1px solid white;
transition: var(--transition);
}
&:hover {
&::after,
&::before,
span::after,
span::before {
width: calc(50% + 0px);
height: calc(50% + 0px);
border-color: var(--enterprise-blue);
}
}
}
// scroll to top with progress
.progress-wrap {
position: fixed;
right: 30px;
bottom: 30px;
height: 50px;
width: 50px;
cursor: pointer;
display: block;
border-radius: 50px;
background-color: #1f1f1f;
box-shadow: inset 0 0 0 8px #1f1f1f;
z-index: 10000;
opacity: 0;
visibility: hidden;
transform: translateY(15px);
transition: all 200ms linear;
z-index: 999;
overflow: hidden;
span {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 34px;
height: 34px;
background-color: var(--white);
border-radius: 50%;
overflow: hidden;
&::after {
content: "\f176";
font-family: "Font Awesome 6 Free";
font-weight: 900;
position: absolute;
text-align: center;
line-height: 34px;
font-size: 16px;
border-radius: 50%;
color: var(--black);
left: 50%;
top: 50%;
transform: translate(-50%, 200%);
height: 34px;
width: 34px;
cursor: pointer;
display: block;
z-index: 1;
transition: all 200ms linear;
}
&::before {
content: "\f176";
font-family: "Font Awesome 6 Free";
font-weight: 900;
text-align: center;
line-height: 34px;
position: absolute;
font-size: 16px;
border-radius: 50%;
color: var(--black);
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
height: 34px;
width: 34px;
cursor: pointer;
display: block;
z-index: 2;
transition: all 200ms linear;
}
}
&:hover {
span {
&::before {
transform: translate(-50%, -200%);
}
&::after {
transform: translate(-50%, -50%);
}
}
}
path {
fill: none;
}
.progress-circle {
path {
stroke: var(--enterprise-blue);
stroke-width: 4;
box-sizing: content-box;
}
}
}
.active-progress {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
// Animations
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
// Button group utilities
.btn-group {
display: inline-flex;
border-radius: var(--radius-lg);
overflow: hidden;
.btn {
border-radius: 0;
border-right-width: 0;
&:first-child {
border-top-left-radius: var(--radius-lg);
border-bottom-left-radius: var(--radius-lg);
}
&:last-child {
border-top-right-radius: var(--radius-lg);
border-bottom-right-radius: var(--radius-lg);
border-right-width: 1px;
}
&:only-child {
border-radius: var(--radius-lg);
border-right-width: 1px;
}
}
}
// Responsive button adjustments
@include mobile-only {
.btn {
padding: var(--space-3) var(--space-6);
font-size: var(--text-sm);
}
.btn-anim {
width: 120px;
height: 120px;
font-size: var(--text-sm);
}
.alter-btn {
width: 140px;
height: 140px;
padding: var(--space-8) var(--space-6);
}
}
/* ====
--------- (3.01) buttons styles end ---------
==== */