portfolio-page/src/scss/mixins.scss

111 lines
1.9 KiB
SCSS

@use 'variables' as *;
// Button base mixin
@mixin button-base {
display: inline-flex;
align-items: center;
justify-content: center;
font-weight: 500;
text-decoration: none;
border: none;
cursor: pointer;
transition: all 0.3s ease;
border-radius: $border-radius-sm;
&:focus {
outline: none;
box-shadow: var(--box-shadow-sm);
}
}
// Card hover effect mixin
@mixin card-hover {
transition: all 0.3s ease;
&:hover {
transform: translateY(-2px);
box-shadow: var(--box-shadow-lg);
}
}
// Gradient text mixin
@mixin gradient-text($gradient) {
background: $gradient;
background-clip: text;
-webkit-background-clip: text;
color: transparent;
-webkit-text-fill-color: transparent;
}
// Flex center mixin
@mixin flex-center {
display: flex;
align-items: center;
justify-content: center;
}
// Aspect ratio mixin
@mixin aspect-ratio($ratio: 1) {
aspect-ratio: $ratio;
@supports not (aspect-ratio: 1) {
&::before {
content: '';
float: left;
padding-top: calc(100% / #{$ratio});
}
&::after {
content: '';
display: table;
clear: both;
}
}
}
// Responsive breakpoint mixins
@mixin mobile-only {
@media (max-width: $mobile-breakpoint) {
@content;
}
}
@mixin desktop-only {
@media (min-width: $desktop-breakpoint) {
@content;
}
}
// Common section patterns
@mixin section-container {
max-width: 80rem;
margin: 0 auto;
padding: 0 1rem;
@include desktop-only {
padding: 0 1.5rem;
}
}
@mixin section-header {
text-align: center;
margin-bottom: 4rem;
}
@mixin section-title {
font-size: 1.875rem;
font-weight: bold;
margin-bottom: 1rem;
color: var(--color-text);
@include desktop-only {
font-size: 2.25rem;
}
}
@mixin section-subtitle {
font-size: 1.25rem;
color: var(--color-text-muted);
max-width: 48rem;
margin: 0 auto;
}