// hikari-extra-components/styles/components/zoom_controls.scss
// Zoom controls styles with
@use '../../../hikari-theme/styles/mixins.scss' as *;
// ============================================
// Zoom Controls Container
// ============================================
.hi-zoom-controls {
display: flex;
align-items: center;
gap: $hikari-spacing-xs;
padding: $hikari-spacing-sm;
background-color: rgba(var(--hi-color-surface), 0.95);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-lg;
box-shadow: $hikari-shadow-lg;
backdrop-filter: blur(8px);
transition: all $hikari-transition-base;
// glow on hover
&:hover {
border-color: var(--hi-color-primary);
box-shadow:
$hikari-shadow-xl,
0 0 20px rgba(59, 130, 246, 0.3);
}
// Compact variant
&.hi-zoom-compact {
padding: $hikari-spacing-xs;
gap: 0;
}
}
// ============================================
// Zoom Buttons
// ============================================
.hi-zoom-button {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
background-color: var(--hi-color-surface);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md;
color: var(--hi-color-text-primary);
cursor: pointer;
transition: all $hikari-transition-fast;
user-select: none;
// glow effect on hover
&:hover:not(:disabled) {
background-color: rgba(59, 130, 246, 0.1);
border-color: var(--hi-color-primary);
color: var(--hi-color-primary);
box-shadow:
0 0 15px rgba(59, 130, 246, 0.4),
inset 0 0 10px rgba(59, 130, 246, 0.1);
transform: translateY(-2px);
}
&:active:not(:disabled) {
transform: translateY(0) scale(0.95);
}
&:disabled {
@include disabled;
opacity: 0.4;
}
// Active state
&.hi-zoom-button-active {
background-color: var(--hi-color-primary);
border-color: var(--hi-color-primary);
color: var(--hi-color-text-primary);
// Enhanced glow
box-shadow:
0 0 20px rgba(59, 130, 246, 0.5),
inset 0 0 10px rgba(255, 255, 255, 0.1);
}
}
.hi-zoom-button-icon {
width: 18px;
height: 18px;
stroke-width: 2;
}
// ============================================
// Zoom Display
// ============================================
.hi-zoom-display {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 60px;
padding: $hikari-spacing-xs $hikari-spacing-sm;
background-color: rgba(0, 0, 0, 0.2);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-md;
font-family: $hikari-font-family-mono;
font-size: $hikari-font-size-sm;
font-weight: 600;
color: var(--hi-color-text-primary);
user-select: none;
transition: all $hikari-transition-fast;
// glow
&.hi-zoom-display-active {
border-color: var(--hi-color-accent);
color: var(--hi-color-accent);
box-shadow: 0 0 15px rgba(245, 158, 11, 0.3);
}
}
// ============================================
// Zoom Slider
// ============================================
.hi-zoom-slider-container {
display: flex;
align-items: center;
padding: 0 $hikari-spacing-sm;
}
.hi-zoom-slider {
-webkit-appearance: none;
appearance: none;
width: 100px;
height: 4px;
background-color: var(--hi-color-border);
border-radius: $hikari-radius-full;
outline: none;
cursor: pointer;
transition: all $hikari-transition-fast;
// Track styling
&::-webkit-slider-runnable-track {
height: 4px;
background: linear-gradient(
90deg,
var(--hi-color-primary),
var(--hi-color-secondary)
);
border-radius: $hikari-radius-full;
}
&::-moz-range-track {
height: 4px;
background: linear-gradient(
90deg,
var(--hi-color-primary),
var(--hi-color-secondary)
);
border-radius: $hikari-radius-full;
}
// Thumb styling
&::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
background-color: var(--hi-color-surface);
border: 2px solid var(--hi-color-primary);
border-radius: 50%;
cursor: grab;
transition: all $hikari-transition-fast;
// glow
box-shadow: 0 0 10px rgba(59, 130, 246, 0.5);
&:hover {
transform: scale(1.2);
box-shadow: 0 0 20px rgba(59, 130, 246, 0.8);
}
&:active {
cursor: grabbing;
transform: scale(1.1);
}
}
&::-moz-range-thumb {
width: 16px;
height: 16px;
background-color: var(--hi-color-surface);
border: 2px solid var(--hi-color-primary);
border-radius: 50%;
cursor: grab;
transition: all $hikari-transition-fast;
box-shadow: 0 0 10px rgba(59, 130, 246, 0.5);
&:hover {
transform: scale(1.2);
box-shadow: 0 0 20px rgba(59, 130, 246, 0.8);
}
&:active {
cursor: grabbing;
}
}
&:hover {
&::-webkit-slider-runnable-track {
background: linear-gradient(
90deg,
var(--hi-color-primary),
var(--hi-color-accent)
);
}
&::-moz-range-track {
background: linear-gradient(
90deg,
var(--hi-color-primary),
var(--hi-color-accent)
);
}
}
}
// ============================================
// Zoom Presets
// ============================================
.hi-zoom-presets {
display: flex;
gap: $hikari-spacing-xs;
padding-left: $hikari-spacing-sm;
border-left: 1px solid var(--hi-color-border);
}
.hi-zoom-preset {
padding: $hikari-spacing-xs $hikari-spacing-sm;
background-color: transparent;
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-sm;
font-family: $hikari-font-family-mono;
font-size: $hikari-font-size-xs;
font-weight: 600;
color: var(--hi-color-text-secondary);
cursor: pointer;
transition: all $hikari-transition-fast;
user-select: none;
&:hover {
background-color: rgba(59, 130, 246, 0.1);
border-color: var(--hi-color-primary);
color: var(--hi-color-primary);
}
&:active {
transform: scale(0.95);
}
&.hi-zoom-preset-active {
background-color: var(--hi-color-primary);
border-color: var(--hi-color-primary);
color: var(--hi-color-text-primary);
// glow
box-shadow: 0 0 15px rgba(59, 130, 246, 0.4);
}
}
// ============================================
// Position Variants
// ============================================
// Top-left
.hi-zoom-controls-top-left {
position: absolute;
top: $hikari-spacing-md;
left: $hikari-spacing-md;
}
// Top-right
.hi-zoom-controls-top-right {
position: absolute;
top: $hikari-spacing-md;
right: $hikari-spacing-md;
}
// Bottom-left
.hi-zoom-controls-bottom-left {
position: absolute;
bottom: $hikari-spacing-md;
left: $hikari-spacing-md;
}
// Bottom-right
.hi-zoom-controls-bottom-right {
position: absolute;
bottom: $hikari-spacing-md;
right: $hikari-spacing-md;
}
// Center
.hi-zoom-controls-center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
// ============================================
// Size Variants
// ============================================
.hi-zoom-controls-sm {
.hi-zoom-button {
width: 28px;
height: 28px;
}
.hi-zoom-button-icon {
width: 14px;
height: 14px;
}
.hi-zoom-display {
min-width: 50px;
font-size: $hikari-font-size-xs;
padding: $hikari-spacing-xs;
}
.hi-zoom-slider {
width: 80px;
}
}
.hi-zoom-controls-lg {
.hi-zoom-button {
width: 44px;
height: 44px;
}
.hi-zoom-button-icon {
width: 22px;
height: 22px;
}
.hi-zoom-display {
min-width: 70px;
font-size: $hikari-font-size-base;
padding: $hikari-spacing-sm;
}
.hi-zoom-slider {
width: 120px;
}
}
// ============================================
// Orientation Variants
// ============================================
.hi-zoom-controls-horizontal {
flex-direction: row;
}
.hi-zoom-controls-vertical {
flex-direction: column;
padding: $hikari-spacing-sm;
.hi-zoom-presets {
flex-direction: column;
padding-left: 0;
padding-top: $hikari-spacing-sm;
border-left: none;
border-top: 1px solid var(--hi-color-border);
}
.hi-zoom-slider-container {
padding: $hikari-spacing-sm 0;
}
.hi-zoom-slider {
width: 4px;
height: 100px;
&::-webkit-slider-runnable-track {
width: 4px;
height: 100px;
background: linear-gradient(
180deg,
var(--hi-color-primary),
var(--hi-color-secondary)
);
}
&::-moz-range-track {
width: 4px;
height: 100px;
background: linear-gradient(
180deg,
var(--hi-color-primary),
var(--hi-color-secondary)
);
}
}
}
// ============================================
// Style Variants
// ============================================
// Minimal variant
.hi-zoom-controls-minimal {
background-color: transparent;
border: none;
box-shadow: none;
.hi-zoom-button {
background-color: rgba(var(--hi-color-surface), 0.8);
backdrop-filter: blur(4px);
}
}
// variant (enhanced glow effects)
.hi-zoom-controls-fui {
position: relative;
overflow: hidden;
// Animated gradient border
&::before {
content: '';
position: absolute;
inset: -2px;
border-radius: inherit;
padding: 2px;
background: linear-gradient(
135deg,
var(--hi-color-primary),
var(--hi-color-secondary),
var(--hi-color-accent),
var(--hi-color-primary)
);
background-size: 300% 300%;
animation: hikari-zoom-gradient-shift 4s ease infinite;
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
opacity: 0.6;
}
.hi-zoom-button {
position: relative;
z-index: 1;
}
}
// ============================================
// Tooltip Support
// ============================================
.hi-zoom-button[data-tooltip],
.hi-zoom-preset[data-tooltip] {
position: relative;
&::after {
content: attr(data-tooltip);
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%) translateY(-8px);
padding: $hikari-spacing-xs $hikari-spacing-sm;
background-color: var(--hi-color-background);
border: 1px solid var(--hi-color-border);
border-radius: $hikari-radius-sm;
font-size: $hikari-font-size-xs;
color: var(--hi-color-text-primary);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity $hikari-transition-fast;
z-index: 100;
// glow
box-shadow: 0 0 15px rgba(59, 130, 246, 0.3);
}
&:hover::after {
opacity: 1;
}
}
// ============================================
// Animation States
// ============================================
// Zoom in animation - use utility class
.hi-zoom-controls-enter {
animation: hi-zoom-in 0.3s ease-out forwards;
}
// Pulse animation for active zoom - use utility class
.hi-zoom-display-pulse {
animation: hi-pulse 2s ease-in-out infinite;
}
// ============================================
// Responsive Design
// ============================================
@include mobile {
.hi-zoom-controls {
padding: $hikari-spacing-xs;
gap: 0;
}
.hi-zoom-button {
width: 32px;
height: 32px;
}
.hi-zoom-button-icon {
width: 16px;
height: 16px;
}
.hi-zoom-display {
min-width: 50px;
font-size: $hikari-font-size-xs;
}
.hi-zoom-slider {
width: 60px;
}
.hi-zoom-presets {
display: none; // Hide presets on mobile
}
.hi-zoom-button[data-tooltip]::after {
display: none; // Hide tooltips on mobile
}
}