Files
eapim-portal/src/main/resources/static/sass/components/_buttons.scss
T

610 lines
12 KiB
SCSS

@use '../abstracts/variables' as *;
@use '../abstracts/color-functions' as *;
@use '../abstracts/mixins' as *;
// -----------------------------------------------------------------------------
// Button styles - Modern vibrant design
// -----------------------------------------------------------------------------
// Base button
.btn {
@include button-base;
position: relative;
overflow: hidden;
// Button sizes
&-sm {
padding: $spacing-sm $spacing-md;
font-size: $font-size-sm;
}
&-md {
padding: $spacing-md $spacing-lg;
font-size: $font-size-base;
}
&-lg {
padding: $spacing-md $spacing-xl;
font-size: $font-size-md;
}
&-xl {
padding: $spacing-lg $spacing-2xl;
font-size: $font-size-lg;
}
// Button variants
&-primary {
background: $primary-blue;
color: $white;
box-shadow: $shadow-md;
&:hover {
transform: translateY(-3px);
box-shadow: $shadow-xl;
}
&:active {
transform: translateY(-1px);
}
}
&-secondary {
background: #E5E7EB;
color: #5F666C;
&:hover {
background: $light-bg;
transform: translateY(-3px);
}
}
&-accent {
color: $white;
box-shadow: $shadow-md;
&:hover {
transform: translateY(-3px);
box-shadow: $shadow-xl;
}
}
&-warm {
color: $white;
box-shadow: $shadow-md;
&:hover {
transform: translateY(-3px);
box-shadow: $shadow-xl;
}
}
&-success {
background: $accent-green;
color: $white;
&:hover {
background: darken($accent-green, 10%);
transform: translateY(-3px);
}
}
&-danger {
background: $accent-orange;
color: $white;
&:hover {
background: darken($accent-orange, 10%);
transform: translateY(-3px);
}
}
&-ghost {
background: transparent;
color: $primary-blue;
border: 2px solid transparent;
&:hover {
background: rgba($primary-blue, 0.1);
border-color: $primary-blue;
}
}
&-outline {
background: transparent;
color: $text-dark;
border: 2px solid $border-gray;
&:hover {
border-color: $primary-blue;
color: $primary-blue;
transform: translateY(-3px);
}
}
// Button states
&:disabled,
&.disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
&.loading {
color: transparent;
pointer-events: none;
&::after {
content: '';
position: absolute;
width: 16px;
height: 16px;
@include absolute-center;
border: 2px solid $white;
border-radius: 50%;
border-top-color: transparent;
animation: spin 0.6s linear infinite;
}
}
// Button with icon
&-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
padding: 0;
border-radius: $border-radius-circle;
&.btn-sm {
width: 32px;
height: 32px;
}
&.btn-lg {
width: 56px;
height: 56px;
}
}
// Full width button
&-block {
width: 100%;
justify-content: center;
}
// Button group
&-group {
display: inline-flex;
gap: -1px;
.btn {
border-radius: 0;
&:first-child {
border-top-left-radius: $border-radius-lg;
border-bottom-left-radius: $border-radius-lg;
}
&:last-child {
border-top-right-radius: $border-radius-lg;
border-bottom-right-radius: $border-radius-lg;
}
}
}
}
// Floating action button
.fab {
position: fixed;
bottom: $spacing-xl;
right: $spacing-xl;
width: 60px;
height: 60px;
border: none;
border-radius: $border-radius-circle;
color: $white;
font-size: $font-size-xl;
cursor: pointer;
box-shadow: $shadow-lg;
transition: $transition-base;
z-index: $z-index-fixed;
@include flex-center;
&:hover {
transform: scale(1.1);
box-shadow: $shadow-xl;
.fab-label {
opacity: 1;
transform: translateX(-10px);
}
}
.fab-label {
position: absolute;
right: 70px;
top: 50%;
transform: translateY(-50%);
background: $text-dark;
color: $white;
padding: $spacing-sm $spacing-md;
border-radius: $border-radius-md;
font-size: $font-size-sm;
white-space: nowrap;
opacity: 0;
transition: $transition-base;
pointer-events: none;
}
}
// CTA buttons
.btn-cta {
&-primary {
@include button-base;
background: $white;
color: $primary-blue;
padding: $spacing-md $spacing-2xl;
font-size: $font-size-md;
box-shadow: $shadow-lg;
&:hover {
transform: translateY(-3px);
box-shadow: $shadow-xl;
}
}
&-secondary {
@include button-base;
background: transparent;
color: $white;
border: 2px solid $white;
padding: $spacing-md $spacing-2xl;
font-size: $font-size-md;
&:hover {
background: rgba($white, 0.1);
transform: translateY(-3px);
}
}
}
// -----------------------------------------------------------------------------
// Action Buttons - Unified button system for all pages
// -----------------------------------------------------------------------------
// Base action button styles
.action-btn,
.action-btn-new,
.action-btn-primary,
.action-btn-secondary,
.action-btn-edit,
.action-btn-delete {
padding: $spacing-md $spacing-2xl;
border-radius: $border-radius-md;
font-size: $font-size-base;
font-weight: $font-weight-medium;
text-decoration: none;
transition: $transition-base;
display: inline-flex;
align-items: center;
justify-content: center;
gap: $spacing-sm;
cursor: pointer;
border: none;
@media (max-width: $breakpoint-sm) {
padding: $spacing-md $spacing-lg;
font-size: $font-size-sm;
}
i {
font-size: 16px;
}
}
// Primary action buttons (new, submit, confirm)
.action-btn-new,
.action-btn-primary {
color: $white;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
}
&:active {
transform: translateY(0);
}
}
// Secondary action button (cancel, back, list)
.action-btn-secondary {
background: $white;
color: $text-dark;
border: 1px solid $border-gray;
&:hover {
background: $gray-bg;
border-color: $primary-blue;
color: $primary-blue;
}
&:active {
transform: scale(0.98);
}
}
// Edit button
.action-btn-edit {
background: $primary-blue;
color: $white;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
background: $secondary-blue;
}
&:active {
transform: translateY(0);
}
}
// Delete button
.action-btn-delete {
background: $accent-orange;
color: $white;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
background: darken($accent-orange, 5%);
}
&:active {
transform: translateY(0);
}
}
// Notice page specific button variants
.action-btn {
&.btn-list {
background: $white;
color: $text-dark;
border: 1px solid $border-gray;
&:hover {
background: $gray-bg;
border-color: $primary-blue;
color: $primary-blue;
}
}
&.btn-edit {
color: $white;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
}
}
&.btn-delete {
background: $accent-orange;
color: $white;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
}
}
}
// API Key page specific buttons
.btn-copy {
padding: $spacing-sm $spacing-md;
background: rgba($primary-blue, 0.1);
color: $primary-blue;
border: 1px solid rgba($primary-blue, 0.2);
border-radius: $border-radius-sm;
font-size: $font-size-xs;
font-weight: $font-weight-medium;
cursor: pointer;
transition: $transition-base;
display: inline-flex;
align-items: center;
gap: $spacing-xs;
&:hover {
background: rgba($primary-blue, 0.2);
border-color: $primary-blue;
}
i {
font-size: 12px;
}
}
.btn-action {
padding: $spacing-sm $spacing-lg;
color: $white;
border: none;
border-radius: $border-radius-md;
font-size: $font-size-sm;
font-weight: $font-weight-medium;
cursor: pointer;
transition: $transition-base;
display: inline-flex;
align-items: center;
gap: $spacing-xs;
&:hover {
transform: translateY(-2px);
box-shadow: $shadow-md;
}
i {
font-size: 14px;
}
}
.btn-cancel {
padding: $spacing-sm $spacing-lg;
background: $white;
color: $text-gray;
border: 1px solid $border-gray;
border-radius: $border-radius-md;
font-size: $font-size-sm;
font-weight: $font-weight-medium;
cursor: pointer;
transition: $transition-base;
display: inline-flex;
align-items: center;
gap: $spacing-xs;
&:hover {
border-color: $primary-blue;
color: $primary-blue;
}
i {
font-size: 14px;
}
}
// -----------------------------------------------------------------------------
// Input Action Button - Figma Design (node 985:1649)
// Button at the end of input field (변경, 인증번호 받기, etc.)
// -----------------------------------------------------------------------------
.btn-input-action {
flex-shrink: 0;
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 172px;
height: 60px;
padding: 10px $spacing-lg;
border: none;
border-radius: $border-radius-lg;
font-size: $font-size-lg;
font-weight: $font-weight-bold;
color: $white;
cursor: pointer;
transition: $transition-base;
white-space: nowrap;
// "변경" button style - light blue (#a4d6ea)
&.btn-change {
background: #a4d6ea;
&:hover {
background: darken(#a4d6ea, 10%);
transform: translateY(-2px);
box-shadow: $shadow-md;
}
&:active {
transform: translateY(0);
}
}
// "인증번호 받기/확인" button style - primary blue
&.btn-auth {
background: #A4D6EA;
&:hover {
background: $secondary-blue;
transform: translateY(-2px);
box-shadow: $shadow-md;
}
&:active {
transform: translateY(0);
}
&:disabled {
background: $border-gray;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
}
@media (max-width: $breakpoint-sm) {
width: 100%;
min-width: auto;
height: 52px;
font-size: $font-size-base;
}
}
// -----------------------------------------------------------------------------
// Upload Button - File upload trigger button
// Used in: Icon upload, file attachment areas
// -----------------------------------------------------------------------------
.btn-upload {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
height: 40px;
padding: 8px 16px;
background-color: #3ba4ed;
color: $white;
border: none;
border-radius: $border-radius-md;
font-size: 14px;
font-weight: $font-weight-semibold;
cursor: pointer;
transition: background-color 0.2s ease;
&:hover {
background-color: #2b94dd;
}
@include respond-to('md') {
font-size: 13px;
height: 36px;
}
}
// -----------------------------------------------------------------------------
// Action Call Button (e.g. Signup, CTA)
// -----------------------------------------------------------------------------
.btn-action-primary {
display: inline-flex;
align-items: center;
justify-content: center;
background: #2a69de;
color: #fff;
font-size: 20px;
font-weight: 700;
padding: 16px 48px;
border-radius: 10px;
text-decoration: none;
transition: background 0.2s, transform 0.2s;
cursor: pointer;
border: none;
&:hover {
background: darken(#2a69de, 10%);
transform: translateY(-2px);
color: #fff;
}
&.md {
font-size: 14px;
padding: 11px 45px;
}
@include respond-to('sm') {
font-size: 15px;
}
}