mirror of
https://github.com/Novattz/creamlinux-installer.git
synced 2026-08-01 19:18:25 -04:00
styling
This commit is contained in:
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
Animations
|
||||||
|
*/
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,11 +3,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Satoshi';
|
font-family: 'Roboto';
|
||||||
src:
|
src: url('../assets/fonts/Roboto.ttf') format('truetype');
|
||||||
url('../assets/fonts/Satoshi.ttf') format('ttf'),
|
|
||||||
url('../assets/fonts/Roboto.ttf') format('ttf'),
|
|
||||||
url('../assets/fonts/WorkSans.ttf') format('ttf');
|
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-display: swap;
|
font-display: swap;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@forward './animations';
|
||||||
@forward './fonts';
|
@forward './fonts';
|
||||||
@forward './layout';
|
@forward './layout';
|
||||||
@forward './mixins';
|
@forward './mixins';
|
||||||
|
|||||||
@@ -14,20 +14,6 @@
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
background-color: var(--primary-bg);
|
background-color: var(--primary-bg);
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
background-image:
|
|
||||||
radial-gradient(circle at 20% 30%, rgba(var(--primary-color), 0.05) 0%, transparent 70%),
|
|
||||||
radial-gradient(circle at 80% 70%, rgba(var(--cream-color), 0.05) 0%, transparent 70%);
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: var(--z-bg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main content area
|
// Main content area
|
||||||
@@ -50,10 +36,8 @@
|
|||||||
margin: 2rem auto;
|
margin: 2rem auto;
|
||||||
max-width: 600px;
|
max-width: 600px;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
background-color: rgba(var(--danger), 0.05);
|
background-color: color-mix(in srgb, var(--danger) 6%, var(--elevated-bg));
|
||||||
border: 1px solid rgb(var(--danger), 0.2);
|
border: 1px solid color-mix(in srgb, var(--danger) 25%, var(--border-soft));
|
||||||
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
|
|
||||||
backdrop-filter: blur(5px);
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@@ -90,12 +74,10 @@
|
|||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
|
transition: background-color var(--duration-normal) var(--easing-ease-out);
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
transform: translateY(-2px);
|
background-color: color-mix(in srgb, black 8%, var(--primary-color));
|
||||||
box-shadow: 0 6px 14px rgba(var(--primary-color), 0.4);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,10 +92,8 @@
|
|||||||
margin: 2rem auto;
|
margin: 2rem auto;
|
||||||
max-width: 600px;
|
max-width: 600px;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
background-color: rgba(var(--danger), 0.05);
|
background-color: color-mix(in srgb, var(--danger) 6%, var(--elevated-bg));
|
||||||
border: 1px solid rgb(var(--danger), 0.2);
|
border: 1px solid color-mix(in srgb, var(--danger) 25%, var(--border-soft));
|
||||||
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
|
|
||||||
backdrop-filter: blur(5px);
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
@@ -137,12 +117,10 @@
|
|||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.5px;
|
||||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
|
transition: background-color var(--duration-normal) var(--easing-ease-out);
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
transform: translateY(-2px);
|
background-color: color-mix(in srgb, black 8%, var(--primary-color));
|
||||||
box-shadow: 0 6px 14px rgba(var(--primary-color), 0.4);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,42 +20,11 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Glass effect for overlay
|
|
||||||
@mixin glass-overlay($opacity: 0.7) {
|
|
||||||
background-color: rgba(var(--primary-bg), var(--opacity));
|
|
||||||
backdrop-filter: blur(8px);
|
|
||||||
border: 1px solid rgba(255, 255, 255, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin gradient-bg($start-color, $end-color, $direction: 135deg) {
|
|
||||||
background: linear-gradient($direction, $start-color, $end-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Basic transition
|
// Basic transition
|
||||||
@mixin transition-standard {
|
@mixin transition-standard {
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition: all var(--duration-normal) var(--easing-ease-out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin shadow-standard {
|
|
||||||
box-shadow: var(--shadow-standard);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin shadow-hover {
|
|
||||||
box-shadow: var(--shadow-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin text-shadow {
|
|
||||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.7);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Simple animation for hover
|
|
||||||
@mixin hover-lift {
|
|
||||||
&:hover {
|
|
||||||
transform: translateY(-5px);
|
|
||||||
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Responsive mixins
|
// Responsive mixins
|
||||||
@mixin media-sm {
|
@mixin media-sm {
|
||||||
@media (min-width: 576px) {
|
@media (min-width: 576px) {
|
||||||
@@ -81,13 +50,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Card base styling
|
// Sets the rendered size of a .spinner-ring SVG (see _loading.scss) the
|
||||||
@mixin card {
|
// ring geometry is fixed by its viewBox, so the stroke scales
|
||||||
background-color: var(--secondary-bg);
|
// proportionally with whatever size is set here.
|
||||||
border-radius: var(--radius-sm);
|
@mixin spinner-size($size) {
|
||||||
@include shadow-standard;
|
width: $size;
|
||||||
overflow: hidden;
|
height: $size;
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom scrollbar
|
// Custom scrollbar
|
||||||
@@ -97,7 +65,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&::-webkit-scrollbar-track {
|
&::-webkit-scrollbar-track {
|
||||||
background: rgba(var(--primary-bg), 0.5);
|
background: var(--primary-bg);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,16 +34,12 @@
|
|||||||
--bold: 700;
|
--bold: 700;
|
||||||
--extrabold: 800;
|
--extrabold: 800;
|
||||||
|
|
||||||
--family: 'Satoshi';
|
|
||||||
|
|
||||||
// Shadows
|
// Shadows
|
||||||
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
|
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
|
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
|
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
|
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-inner: inset 0 2px 4px rgba(0, 0, 0, 0.3);
|
--shadow-inner: inset 0 2px 4px rgba(0, 0, 0, 0.3);
|
||||||
--shadow-standard: 0 10px 25px rgba(0, 0, 0, 0.5);
|
|
||||||
--shadow-hover: 0 15px 30px rgba(0, 0, 0, 0.7);
|
|
||||||
|
|
||||||
// Z-index levels
|
// Z-index levels
|
||||||
--z-bg: 0;
|
--z-bg: 0;
|
||||||
@@ -52,11 +48,3 @@
|
|||||||
--z-modal: 1000;
|
--z-modal: 1000;
|
||||||
--z-tooltip: 1500;
|
--z-tooltip: 1500;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Color variables for SCSS usage
|
|
||||||
$success-color: #55e07a;
|
|
||||||
$danger-color: #ff5252;
|
|
||||||
$primary-color: #4a76c4;
|
|
||||||
$cream-color: #9b7dff;
|
|
||||||
$smoke-color: #fbb13c;
|
|
||||||
$warning-color: #fbb13c;
|
|
||||||
|
|||||||
@@ -24,8 +24,6 @@
|
|||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: var(--success-light);
|
background-color: var(--success-light);
|
||||||
transform: translateY(-2px) scale(1.02);
|
|
||||||
box-shadow: 0px 0px 12px rgba(140, 200, 147, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,22 +32,13 @@
|
|||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: var(--danger-light);
|
background-color: var(--danger-light);
|
||||||
transform: translateY(-2px) scale(1.02);
|
|
||||||
box-shadow: 0px 0px 12px rgba(217, 107, 107, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: scale(0.97);
|
|
||||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
background-color: var(--disabled);
|
background-color: var(--disabled);
|
||||||
transform: none;
|
|
||||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
@@ -85,20 +74,11 @@
|
|||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(255, 255, 255, 0.3);
|
background-color: rgba(255, 255, 255, 0.3);
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: 0 7px 15px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translateY(0);
|
|
||||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
transform: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
}
|
||||||
// Settings icon button variant
|
// Settings icon button variant
|
||||||
&.settings-icon-button {
|
&.settings-icon-button {
|
||||||
|
|||||||
@@ -40,7 +40,6 @@
|
|||||||
&.checked {
|
&.checked {
|
||||||
background-color: var(--primary-color, #ffc896);
|
background-color: var(--primary-color, #ffc896);
|
||||||
border-color: var(--primary-color, #ffc896);
|
border-color: var(--primary-color, #ffc896);
|
||||||
box-shadow: 0 0 10px rgba(255, 200, 150, 0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox-icon {
|
.checkbox-icon {
|
||||||
|
|||||||
@@ -14,25 +14,12 @@
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition: background-color var(--duration-normal) var(--easing-ease-out);
|
||||||
|
|
||||||
// Default states
|
|
||||||
&:hover {
|
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: var(--shadow-hover);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translateY(0);
|
|
||||||
box-shadow: var(--shadow-standard);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled,
|
&:disabled,
|
||||||
&.disabled {
|
&.disabled {
|
||||||
opacity: 0.7;
|
opacity: 0.55;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
transform: none !important;
|
|
||||||
box-shadow: var(--shadow-standard) !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sizing
|
// Sizing
|
||||||
@@ -54,14 +41,30 @@
|
|||||||
gap: 0.6rem;
|
gap: 0.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Variants
|
// Icon-only buttons are square, regardless of size
|
||||||
|
&.btn-icon-only.btn-sm {
|
||||||
|
padding: 0.45rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.btn-icon-only.btn-md {
|
||||||
|
padding: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.btn-icon-only.btn-lg {
|
||||||
|
padding: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variants - flat fill, a plain darken/lighten on hover, no lift or glow
|
||||||
&.btn-primary {
|
&.btn-primary {
|
||||||
background-color: var(--primary-color);
|
background-color: var(--primary-color);
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
|
|
||||||
&:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--primary-color);
|
background-color: color-mix(in srgb, black 8%, var(--primary-color));
|
||||||
box-shadow: 0 6px 14px rgba(var(--primary-color), 0.3);
|
}
|
||||||
|
|
||||||
|
&:active:not(:disabled) {
|
||||||
|
background-color: color-mix(in srgb, black 14%, var(--primary-color));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,9 +72,12 @@
|
|||||||
background-color: var(--border-soft);
|
background-color: var(--border-soft);
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
|
|
||||||
&:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--border);
|
background-color: var(--border);
|
||||||
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.3);
|
}
|
||||||
|
|
||||||
|
&:active:not(:disabled) {
|
||||||
|
background-color: color-mix(in srgb, black 10%, var(--border));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,9 +85,8 @@
|
|||||||
background-color: var(--success);
|
background-color: var(--success);
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
|
|
||||||
&:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--success-light);
|
background-color: color-mix(in srgb, black 8%, var(--success));
|
||||||
box-shadow: 0 6px 14px rgba(var(--success), 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,9 +94,8 @@
|
|||||||
background-color: var(--danger);
|
background-color: var(--danger);
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
|
|
||||||
&:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--danger-light);
|
background-color: color-mix(in srgb, black 8%, var(--danger));
|
||||||
box-shadow: 0 6px 14px rgba(var(--danger), 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,9 +103,8 @@
|
|||||||
background-color: var(--warning);
|
background-color: var(--warning);
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
|
|
||||||
&:hover {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--warning-light);
|
background-color: color-mix(in srgb, black 8%, var(--warning));
|
||||||
box-shadow: 0 6px 14px rgba(var(--warning), 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,13 +118,10 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
|
|
||||||
.spinner {
|
.spinner-ring {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
border: 2px solid rgba(255, 255, 255, 0.3);
|
color: inherit;
|
||||||
border-top-color: currentColor;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 0.8s linear infinite;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,42 +151,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Animation for spinner
|
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rating button on game card
|
// Rating button on game card
|
||||||
.rate-button {
|
.rate-button {
|
||||||
svg {
|
svg {
|
||||||
color: var(--elevated-bg);
|
color: var(--elevated-bg);
|
||||||
transition: transform var(--duration-normal) var(--easing-ease-out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(255, 255, 255, 0.28);
|
background-color: rgba(255, 255, 255, 0.28);
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: 0 7px 15px rgba(0, 0, 0, 0.25);
|
|
||||||
|
|
||||||
svg {
|
|
||||||
transform: scale(1.1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translateY(0);
|
|
||||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
opacity: 0.4;
|
opacity: 0.4;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
transform: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,6 @@
|
|||||||
&:focus {
|
&:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
border-color: var(--primary-color);
|
border-color: var(--primary-color);
|
||||||
box-shadow: 0 0 0 2px rgba(var(--primary-color), 0.2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
@@ -117,7 +116,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.selected {
|
&.selected {
|
||||||
background-color: rgba(var(--primary-color), 0.2);
|
background-color: color-mix(in srgb, var(--primary-color) 16%, transparent);
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
@use '../../themes/index' as *;
|
||||||
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
|
/*
|
||||||
|
EntryList - generic add/remove list of string entries (e.g. file paths).
|
||||||
|
The input row (manual entry + browse button) is pinned below the
|
||||||
|
scrollable entries area, so it's always visible regardless of how many
|
||||||
|
entries there are.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.entry-list-error {
|
||||||
|
color: var(--danger);
|
||||||
|
background-color: var(--danger-soft);
|
||||||
|
border: 1px solid var(--danger-light);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scrolls once entries exceed a handful of rows the input row below stays
|
||||||
|
// put since it lives outside this scrolling box.
|
||||||
|
.entry-list-scroll-area {
|
||||||
|
max-height: 260px;
|
||||||
|
overflow-y: auto;
|
||||||
|
@include custom-scrollbar;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-empty {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem 1rem;
|
||||||
|
color: var(--text-soft);
|
||||||
|
background-color: var(--tertiary-bg);
|
||||||
|
border: 1px solid var(--border-soft);
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
opacity: 0.5;
|
||||||
|
margin-bottom: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-items {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
background-color: var(--tertiary-bg);
|
||||||
|
border: 1px solid var(--border-soft);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
|
||||||
|
.entry-list-item-icon {
|
||||||
|
flex-shrink: 0;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-remove-button {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Truncate from the START so the end of a long path stays visible the
|
||||||
|
// classic RTL trick: flipping the box's inline direction moves where the
|
||||||
|
// overflow ellipsis lands, while individual LTR characters still render
|
||||||
|
// left-to-right within it.
|
||||||
|
.entry-list-item-text {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
direction: rtl;
|
||||||
|
text-align: left;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-input-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-input {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
background-color: var(--tertiary-bg);
|
||||||
|
border: 1px solid var(--border-soft);
|
||||||
|
border-radius: var(--radius-sm);
|
||||||
|
color: var(--text-primary);
|
||||||
|
padding: 0.7rem 1rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-family: monospace;
|
||||||
|
transition: all var(--duration-normal) var(--easing-ease-out);
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border-color: var(--primary-color);
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::placeholder {
|
||||||
|
color: var(--text-soft);
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry-list-browse-button {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
@@ -2,3 +2,4 @@
|
|||||||
@forward './progress_bar';
|
@forward './progress_bar';
|
||||||
@forward './dropdown';
|
@forward './dropdown';
|
||||||
@forward './votes_display';
|
@forward './votes_display';
|
||||||
|
@forward './entry_list';
|
||||||
|
|||||||
@@ -13,9 +13,7 @@
|
|||||||
// Size variations
|
// Size variations
|
||||||
&.loading-small {
|
&.loading-small {
|
||||||
.loading-spinner {
|
.loading-spinner {
|
||||||
width: 20px;
|
@include spinner-size(20px);
|
||||||
height: 20px;
|
|
||||||
border-width: 2px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-dots {
|
.loading-dots {
|
||||||
@@ -29,18 +27,11 @@
|
|||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
margin-top: 0.5rem;
|
margin-top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar-container {
|
|
||||||
height: 6px;
|
|
||||||
width: 100px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.loading-medium {
|
&.loading-medium {
|
||||||
.loading-spinner {
|
.loading-spinner {
|
||||||
width: 30px;
|
@include spinner-size(30px);
|
||||||
height: 30px;
|
|
||||||
border-width: 3px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-dots {
|
.loading-dots {
|
||||||
@@ -54,18 +45,11 @@
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
margin-top: 0.75rem;
|
margin-top: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar-container {
|
|
||||||
height: 8px;
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.loading-large {
|
&.loading-large {
|
||||||
.loading-spinner {
|
.loading-spinner {
|
||||||
width: 50px;
|
@include spinner-size(50px);
|
||||||
height: 50px;
|
|
||||||
border-width: 4px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-dots {
|
.loading-dots {
|
||||||
@@ -79,20 +63,42 @@
|
|||||||
font-size: 1.1rem;
|
font-size: 1.1rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar-container {
|
|
||||||
height: 10px;
|
|
||||||
width: 300px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spinner styles
|
// Windows/Fluent-style ring spinner - an SVG circle with an animated
|
||||||
.loading-spinner {
|
// stroke-dasharray + rotation, rather than a CSS conic-gradient mask.
|
||||||
border-radius: 50%;
|
// Sizing is set per-context (see above); the ring geometry (viewBox +
|
||||||
border: 3px solid rgba(255, 255, 255, 0.1);
|
// circle radius) is fixed, so the stroke scales with it automatically.
|
||||||
border-top-color: var(--primary-color);
|
.spinner-ring {
|
||||||
animation: spin 1s linear infinite;
|
overflow: visible;
|
||||||
|
color: var(--primary-color);
|
||||||
|
|
||||||
|
circle {
|
||||||
|
fill: none;
|
||||||
|
stroke: currentColor;
|
||||||
|
stroke-width: 1.5px;
|
||||||
|
stroke-linecap: round;
|
||||||
|
transform-origin: 50% 50%;
|
||||||
|
animation: spinner-dash 2s linear infinite;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spinner-dash {
|
||||||
|
0% {
|
||||||
|
stroke-dasharray: 0.01px, 43.97px;
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
stroke-dasharray: 21.99px, 21.99px;
|
||||||
|
transform: rotate(450deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
stroke-dasharray: 0.01px, 43.97px;
|
||||||
|
transform: rotate(1080deg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loading dots animation
|
// Loading dots animation
|
||||||
@@ -115,49 +121,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Progress bar styles
|
|
||||||
.loading-progress {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar-container {
|
|
||||||
background-color: var(--border-soft);
|
|
||||||
border-radius: 4px;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 100%;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-bar {
|
|
||||||
height: 100%;
|
|
||||||
background-color: var(--primary-color);
|
|
||||||
border-radius: 4px;
|
|
||||||
transition: width 0.3s ease;
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-percentage {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
color: var(--text-secondary);
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-message {
|
.loading-message {
|
||||||
color: var(--text-secondary);
|
color: var(--text-secondary);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Animations
|
// Animation
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes bounce {
|
@keyframes bounce {
|
||||||
0%,
|
0%,
|
||||||
80%,
|
80%,
|
||||||
|
|||||||
@@ -21,15 +21,6 @@
|
|||||||
background: var(--primary-color);
|
background: var(--primary-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.progress-fill {
|
|
||||||
height: 100%;
|
|
||||||
background: var(--primary-color);
|
|
||||||
transition: width 0.3s ease;
|
|
||||||
border-radius: 4px;
|
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-text {
|
.progress-text {
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
@use '../../themes/index' as *;
|
||||||
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
|
/*
|
||||||
|
API Settings Dialog styles - shared by any unlocker's config dialog
|
||||||
|
(SmokeAPI, ScreamAPI, ...)
|
||||||
|
*/
|
||||||
|
|
||||||
|
.dialog-subtitle {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-weight: 500;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-settings-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-options {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1.5rem;
|
||||||
|
transition: opacity var(--duration-normal) var(--easing-ease-out);
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
opacity: 0.4;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-section {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin: 0;
|
||||||
|
padding-bottom: 0.5rem;
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-option {
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.animated-checkbox {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.checkbox-content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-sublabel {
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -132,13 +132,8 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
|
|
||||||
.loading-spinner {
|
.spinner-ring {
|
||||||
width: 40px;
|
@include spinner-size(40px);
|
||||||
height: 40px;
|
|
||||||
border: 3px solid rgba(255, 255, 255, 0.1);
|
|
||||||
border-top-color: var(--primary-color);
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@@ -254,16 +249,7 @@
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loading animations
|
// Loading animation
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes loading-pulse {
|
@keyframes loading-pulse {
|
||||||
0% {
|
0% {
|
||||||
background-position: 200% 50%;
|
background-position: 200% 50%;
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
@forward './dialog';
|
@forward './dialog';
|
||||||
@forward './dlc_dialog';
|
@forward './dlc_dialog';
|
||||||
@forward './progress_dialog';
|
@forward './progress_dialog';
|
||||||
@forward './settings_dialog';
|
@forward './api_settings_dialog';
|
||||||
@forward './smokeapi_settings_dialog';
|
|
||||||
@forward './conflict_dialog';
|
@forward './conflict_dialog';
|
||||||
@forward './disclaimer_dialog';
|
@forward './disclaimer_dialog';
|
||||||
@forward './unlocker_selection_dialog';
|
@forward './unlocker_selection_dialog';
|
||||||
|
|||||||
@@ -15,13 +15,11 @@
|
|||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar {
|
.progress-dialog-fill {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: var(--primary-color);
|
background-color: var(--primary-color);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
transition: width 0.3s ease;
|
transition: width 0.3s ease;
|
||||||
background: var(--primary-color);
|
|
||||||
box-shadow: 0px 0px 6px rgba(245, 150, 130, 0.3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-percentage {
|
.progress-percentage {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
font-size: 0.95rem;
|
font-size: 0.95rem;
|
||||||
font-weight: var(--bold);
|
font-weight: var(--bold);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition: background-color var(--duration-normal) var(--easing-ease-out);
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
|
|
||||||
&--worked {
|
&--worked {
|
||||||
@@ -48,8 +48,6 @@
|
|||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--success-light);
|
background-color: var(--success-light);
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: 0 6px 14px rgba(140, 200, 147, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,19 +56,12 @@
|
|||||||
|
|
||||||
&:hover:not(:disabled) {
|
&:hover:not(:disabled) {
|
||||||
background-color: var(--danger-light);
|
background-color: var(--danger-light);
|
||||||
transform: translateY(-2px);
|
|
||||||
box-shadow: 0 6px 14px rgba(217, 107, 107, 0.3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active:not(:disabled) {
|
|
||||||
transform: scale(0.97);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
&:disabled {
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
transform: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,12 @@
|
|||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
will-change: opacity, transform;
|
will-change: opacity, transform;
|
||||||
box-shadow: var(--shadow-standard);
|
border: 1px solid var(--border-soft);
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
|
||||||
|
transition:
|
||||||
|
transform var(--duration-normal) var(--easing-ease-out),
|
||||||
|
box-shadow var(--duration-normal) var(--easing-ease-out),
|
||||||
|
border-color var(--duration-normal) var(--easing-ease-out);
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
|
|
||||||
// Simple image loading animation
|
// Simple image loading animation
|
||||||
@@ -20,52 +24,69 @@
|
|||||||
animation: fadeIn 0.5s forwards;
|
animation: fadeIn 0.5s forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hover effects for the card
|
// Hover effects for the card a small lift, plus a soft ambient glow in
|
||||||
|
// whatever status color is most relevant (installed unlocker takes
|
||||||
|
// priority over the base native/proton badge), and each badge itself picks
|
||||||
|
// up a matching glow too.
|
||||||
.game-item-card:hover {
|
.game-item-card:hover {
|
||||||
transform: translateY(-8px) scale(1.02);
|
transform: translateY(-3px);
|
||||||
box-shadow: var(--shadow-hover);
|
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.3);
|
||||||
|
border-color: var(--border);
|
||||||
z-index: 5;
|
z-index: 5;
|
||||||
|
|
||||||
|
&:has(.status-badge.native) {
|
||||||
|
box-shadow:
|
||||||
|
0 6px 18px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 24px rgba(140, 200, 147, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.status-badge.proton) {
|
||||||
|
box-shadow:
|
||||||
|
0 6px 18px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 24px rgba(255, 200, 150, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.status-badge.cream) {
|
||||||
|
box-shadow:
|
||||||
|
0 6px 18px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 24px rgba(128, 180, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.status-badge.smoke) {
|
||||||
|
box-shadow:
|
||||||
|
0 6px 18px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 24px rgba(255, 240, 150, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Epic's own badge color is near-black, so it needs a lighter stand-in
|
||||||
|
// to actually read as a glow
|
||||||
|
&:has(.status-badge.epic) {
|
||||||
|
box-shadow:
|
||||||
|
0 6px 18px rgba(0, 0, 0, 0.3),
|
||||||
|
0 0 24px rgba(120, 140, 165, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
.status-badge.native {
|
.status-badge.native {
|
||||||
box-shadow: 0 0 10px rgba(85, 224, 122, 0.5);
|
box-shadow: 0 0 10px rgba(140, 200, 147, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge.proton {
|
.status-badge.proton {
|
||||||
box-shadow: 0 0 10px rgba(255, 201, 150, 0.5);
|
box-shadow: 0 0 10px rgba(255, 200, 150, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge.cream {
|
.status-badge.cream {
|
||||||
box-shadow: 0 0 10px rgba(128, 181, 255, 0.5);
|
box-shadow: 0 0 10px rgba(128, 180, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge.smoke {
|
.status-badge.smoke {
|
||||||
box-shadow: 0 0 10px rgba(255, 239, 150, 0.5);
|
box-shadow: 0 0 10px rgba(255, 240, 150, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge.epic {
|
.status-badge.epic {
|
||||||
box-shadow: 0 0 10px rgba(15, 25, 35, 0.5);
|
box-shadow: 0 0 10px rgba(120, 140, 165, 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special styling for cards with different statuses
|
|
||||||
.game-item-card:has(.status-badge.cream) {
|
|
||||||
box-shadow:
|
|
||||||
var(--shadow-standard),
|
|
||||||
0 0 15px rgba(128, 181, 255, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
.game-item-card:has(.status-badge.smoke) {
|
|
||||||
box-shadow:
|
|
||||||
var(--shadow-standard),
|
|
||||||
0 0 15px rgba(255, 239, 150, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
.game-item-card:has(.status-badge.epic) {
|
|
||||||
box-shadow:
|
|
||||||
var(--shadow-standard),
|
|
||||||
0 0 15px rgba(15, 25, 35, 0.15);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Game item overlay
|
// Game item overlay
|
||||||
.game-item-overlay {
|
.game-item-overlay {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -85,9 +106,6 @@
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
font-weight: var(--bold);
|
font-weight: var(--bold);
|
||||||
font-family: var(--family);
|
|
||||||
-webkit-font-smoothing: subpixel-antialiased;
|
|
||||||
text-rendering: geometricPrecision;
|
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
@@ -108,13 +126,8 @@
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
font-weight: var(--bold);
|
font-weight: var(--bold);
|
||||||
font-family: var(--family);
|
|
||||||
-webkit-font-smoothing: subpixel-antialiased;
|
|
||||||
text-rendering: geometricPrecision;
|
|
||||||
color: var(--text-heavy);
|
color: var(--text-heavy);
|
||||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
|
transition: box-shadow var(--duration-normal) var(--easing-ease-out);
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
|
||||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-badge.native {
|
.status-badge.native {
|
||||||
@@ -152,8 +165,6 @@
|
|||||||
font-size: 1.6rem;
|
font-size: 1.6rem;
|
||||||
font-weight: var(--bold);
|
font-weight: var(--bold);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
-webkit-font-smoothing: subpixel-antialiased;
|
|
||||||
text-rendering: geometricPrecision;
|
|
||||||
transform: translateZ(0);
|
transform: translateZ(0);
|
||||||
will-change: opacity, transform;
|
will-change: opacity, transform;
|
||||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
|
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
|
||||||
|
|||||||
@@ -17,26 +17,20 @@
|
|||||||
h2 {
|
h2 {
|
||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.3px;
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
padding-bottom: 0.5rem;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 3px;
|
|
||||||
background: linear-gradient(90deg, var(--primary-color), transparent);
|
|
||||||
border-radius: 3px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.game-list-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-bottom: 0.9rem;
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
|
border-bottom: 1px solid var(--border-dark);
|
||||||
|
}
|
||||||
|
|
||||||
// Game grid
|
// Game grid
|
||||||
.game-grid {
|
.game-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
@@ -63,25 +57,8 @@
|
|||||||
color: var(--text-secondary);
|
color: var(--text-secondary);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-radius: var(--radius-lg);
|
border-radius: var(--radius-lg);
|
||||||
background-color: rgba(255, 255, 255, 0.03);
|
background-color: var(--tertiary-bg);
|
||||||
box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.2);
|
border: 1px solid var(--border-soft);
|
||||||
backdrop-filter: blur(5px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-indicator {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: -100%;
|
|
||||||
width: 50%;
|
|
||||||
height: 100%;
|
|
||||||
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.05), transparent);
|
|
||||||
animation: loading-shimmer 2s infinite;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Responsive adjustments
|
// Responsive adjustments
|
||||||
@@ -111,20 +88,19 @@
|
|||||||
width: 44px;
|
width: 44px;
|
||||||
height: 44px;
|
height: 44px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: linear-gradient(
|
background-color: var(--primary-color);
|
||||||
135deg,
|
color: var(--text-heavy);
|
||||||
var(--primary-color),
|
|
||||||
color-mix(in srgb, black 10%, var(--primary-color))
|
|
||||||
);
|
|
||||||
color: var(--text-primary);
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
|
border: 1px solid var(--border-soft);
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateY(20px);
|
transform: translateY(10px);
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition:
|
||||||
|
background-color var(--duration-normal) var(--easing-ease-out),
|
||||||
|
opacity var(--duration-normal) var(--easing-ease-out),
|
||||||
|
transform var(--duration-normal) var(--easing-ease-out);
|
||||||
z-index: var(--z-header);
|
z-index: var(--z-header);
|
||||||
|
|
||||||
&.visible {
|
&.visible {
|
||||||
@@ -133,18 +109,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
transform: translateY(-5px);
|
background-color: color-mix(in srgb, black 8%, var(--primary-color));
|
||||||
box-shadow: 0 8px 20px rgba(var(--primary-color), 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translateY(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loading shimmer animation
|
|
||||||
@keyframes loading-shimmer {
|
|
||||||
to {
|
|
||||||
left: 100%;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
@use '../../themes/index' as *;
|
@use '../../themes/index' as *;
|
||||||
@use '../../abstracts/index' as *;
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Header component styles
|
Header component styles
|
||||||
*/
|
*/
|
||||||
.app-header {
|
.app-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 1rem 2rem;
|
padding: 0 2rem;
|
||||||
background-color: var(--tertiary-bg);
|
background-color: var(--secondary-bg);
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.07);
|
border-bottom: 1px solid var(--border-dark);
|
||||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
|
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: var(--z-header);
|
z-index: var(--z-header);
|
||||||
height: var(--header-height);
|
height: var(--header-height);
|
||||||
@@ -19,47 +18,19 @@
|
|||||||
.app-title {
|
.app-title {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.75rem;
|
gap: 0.65rem;
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 1.5rem;
|
font-size: 1.25rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.2px;
|
||||||
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.7);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-logo-icon {
|
.app-logo-icon {
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 3px;
|
|
||||||
background: linear-gradient(
|
|
||||||
90deg,
|
|
||||||
var(--cream-color),
|
|
||||||
var(--primary-color),
|
|
||||||
var(--smoke-color)
|
|
||||||
);
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 1px;
|
|
||||||
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-controls {
|
.header-controls {
|
||||||
@@ -75,30 +46,28 @@
|
|||||||
|
|
||||||
.search-icon {
|
.search-icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0.8rem;
|
left: 0.85rem;
|
||||||
color: rgba(255, 255, 255, 0.4);
|
color: var(--text-muted);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-input {
|
.search-input {
|
||||||
background-color: var(--border-dark);
|
background-color: var(--tertiary-bg);
|
||||||
border: 1px solid var(--border-soft);
|
border: 1px solid var(--border-soft);
|
||||||
border-radius: 4px;
|
border-radius: var(--radius-md);
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
padding: 0.6rem 1rem 0.6rem 2.5rem;
|
padding: 0.55rem 1rem 0.55rem 2.6rem;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition:
|
||||||
box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.2);
|
border-color var(--duration-normal) var(--easing-ease-out),
|
||||||
min-width: 200px;
|
background-color var(--duration-normal) var(--easing-ease-out);
|
||||||
|
min-width: 220px;
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
border-color: var(--primary-color);
|
border-color: var(--primary-color);
|
||||||
background-color: rgba(255, 255, 255, 0.1);
|
background-color: var(--secondary-bg);
|
||||||
outline: none;
|
outline: none;
|
||||||
box-shadow:
|
|
||||||
0 0 0 2px rgba(var(--primary-color), 0.3),
|
|
||||||
inset 0 2px 5px rgba(0, 0, 0, 0.2);
|
|
||||||
|
|
||||||
& + .search-icon {
|
& + .search-icon {
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
@@ -106,6 +75,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&::placeholder {
|
&::placeholder {
|
||||||
color: rgba(255, 255, 255, 0.4);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
@forward './background';
|
|
||||||
@forward './header';
|
@forward './header';
|
||||||
@forward './loading_screen';
|
@forward './loading_screen';
|
||||||
@forward './sidebar';
|
@forward './sidebar';
|
||||||
|
|||||||
@@ -29,20 +29,14 @@
|
|||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
font-weight: var(--bold);
|
font-weight: var(--bold);
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
text-shadow: 0 2px 10px rgba(var(--primary-color), 0.4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading-animation {
|
.loading-animation {
|
||||||
margin: 1rem 0;
|
margin: 1rem 0;
|
||||||
|
|
||||||
// Spinner styles - thicker border
|
// Spinner styles - thicker ring
|
||||||
.loading-spinner {
|
.spinner-ring {
|
||||||
width: 50px;
|
@include spinner-size(56px);
|
||||||
height: 50px;
|
|
||||||
border-radius: 50%;
|
|
||||||
border: 6px solid rgba(255, 255, 255, 0.1);
|
|
||||||
border-top-color: var(--primary-color);
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +62,7 @@
|
|||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background-color: rgba(var(--primary-color-rgb), 0.1);
|
background-color: color-mix(in srgb, var(--primary-color) 10%, transparent);
|
||||||
|
|
||||||
.status-step {
|
.status-step {
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
@use '../../themes/index' as *;
|
@use '../../themes/index' as *;
|
||||||
@use '../../abstracts/index' as *;
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Sidebar component styles
|
Sidebar component styles
|
||||||
*/
|
*/
|
||||||
.sidebar {
|
.sidebar {
|
||||||
width: var(--sidebar-width);
|
width: var(--sidebar-width);
|
||||||
min-width: var(--sidebar-width);
|
min-width: var(--sidebar-width);
|
||||||
background-color: var(--secondary-bg);
|
background-color: var(--secondary-bg);
|
||||||
border-right: 1px solid rgba(255, 255, 255, 0.05);
|
border-right: 1px solid var(--border-dark);
|
||||||
box-shadow: inset -5px 0 15px rgba(0, 0, 0, 0.2);
|
|
||||||
padding: 1.5rem 1rem;
|
padding: 1.5rem 1rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -21,13 +20,13 @@
|
|||||||
|
|
||||||
.sidebar-header {
|
.sidebar-header {
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
font-size: 1.1rem;
|
font-size: 1.05rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 0.5px;
|
letter-spacing: 0.2px;
|
||||||
opacity: 0.9;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,14 +36,13 @@
|
|||||||
|
|
||||||
.sidebar-section-label {
|
.sidebar-section-label {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 0.65rem;
|
font-size: 0.68rem;
|
||||||
font-weight: 700;
|
font-weight: 600;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 0.6px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
color: var(--text-secondary);
|
color: var(--text-muted);
|
||||||
opacity: 0.6;
|
|
||||||
padding: 0 1rem;
|
padding: 0 1rem;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0.35rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar-section .filter-list {
|
.sidebar-section .filter-list {
|
||||||
@@ -56,34 +54,33 @@
|
|||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
transition: all var(--duration-normal) var(--easing-ease-out);
|
transition:
|
||||||
border-radius: var(--radius-sm);
|
background-color var(--duration-normal) var(--easing-ease-out),
|
||||||
padding: 0.7rem 1rem;
|
color var(--duration-normal) var(--easing-ease-out);
|
||||||
margin-bottom: 0.3rem;
|
border-radius: var(--radius-md);
|
||||||
|
padding: 0.65rem 1rem;
|
||||||
|
margin-bottom: 0.15rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
color: var(--text-secondary);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(255, 255, 255, 0.07);
|
background-color: var(--tertiary-bg);
|
||||||
|
color: var(--text-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.active {
|
&.active {
|
||||||
background: linear-gradient(
|
background-color: color-mix(in srgb, var(--primary-color) 16%, transparent);
|
||||||
135deg,
|
color: var(--primary-color);
|
||||||
var(--primary-color),
|
|
||||||
color-mix(in srgb, black 10%, var(--primary-color))
|
|
||||||
);
|
|
||||||
box-shadow: 0 4px 10px rgba(var(--primary-color), 0.3);
|
|
||||||
color: var(--elevated-bg);
|
|
||||||
|
|
||||||
.filter-icon {
|
.filter-icon {
|
||||||
color: var(--elevated-bg);
|
color: var(--primary-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure icons are white when not active
|
// Ensure icons follow the resting text color when not active
|
||||||
&:not(.active) .filter-icon {
|
&:not(.active) .filter-icon {
|
||||||
color: var(--text-primary);
|
color: var(--text-secondary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,37 +95,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-button {
|
|
||||||
margin-top: auto;
|
|
||||||
|
|
||||||
&.btn.btn-secondary {
|
|
||||||
background-color: transparent;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
color: var(--text-secondary);
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: rgba(255, 255, 255, 0.07);
|
|
||||||
color: var(--text-primary);
|
|
||||||
border-color: var(--border-soft);
|
|
||||||
transform: none;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: scale(0.98);
|
|
||||||
}
|
|
||||||
|
|
||||||
.settings-icon {
|
|
||||||
transition: transform 0.3s ease;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover .settings-icon {
|
|
||||||
transform: rotate(45deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// App logo styles
|
// App logo styles
|
||||||
.app-logo {
|
.app-logo {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -139,6 +105,39 @@
|
|||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
fill: var(--text-primary);
|
fill: var(--text-primary);
|
||||||
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pinned to the bottom of the sidebar via margin-top: auto - version/build
|
||||||
|
// and a repo link, so this doesn't need its own page-section anymore
|
||||||
|
.sidebar-footer {
|
||||||
|
margin-top: auto;
|
||||||
|
padding: 0.85rem 1rem 0.25rem;
|
||||||
|
border-top: 1px solid var(--border-dark);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-footer-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-footer-version {
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-footer-link {
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color var(--duration-normal) var(--easing-ease-out);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--primary-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -197,26 +197,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Animations for toast
|
|
||||||
@keyframes toast-in {
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(30px) scale(0.9);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0) scale(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes toast-out {
|
|
||||||
from {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0) scale(1);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-30px) scale(0.9);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
@forward './shared';
|
||||||
|
@forward './overview';
|
||||||
@@ -0,0 +1,263 @@
|
|||||||
|
@use '../../themes/index' as *;
|
||||||
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Overview page - a hero row for the two library totals, a Native/Proton
|
||||||
|
composition bar for the Steam library, and secondary stats as compact
|
||||||
|
chips (rather than one long row of identical boxes).
|
||||||
|
*/
|
||||||
|
|
||||||
|
.overview-section-label {
|
||||||
|
display: block;
|
||||||
|
font-size: 0.68rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hero numbers - the two headline totals
|
||||||
|
.stat-hero {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-hero-item {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-hero-value {
|
||||||
|
font-size: 2.75rem;
|
||||||
|
font-weight: 800;
|
||||||
|
line-height: 1;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-hero-label {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-hero-divider {
|
||||||
|
width: 1px;
|
||||||
|
height: 42px;
|
||||||
|
background-color: var(--border-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Native/Proton composition bar for the Steam library
|
||||||
|
.library-composition {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.6rem;
|
||||||
|
max-width: 640px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.composition-bar {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 99px;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: var(--tertiary-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.composition-segment {
|
||||||
|
height: 100%;
|
||||||
|
transition: width 0.4s ease;
|
||||||
|
|
||||||
|
&.native {
|
||||||
|
background-color: var(--native);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.proton {
|
||||||
|
background-color: var(--proton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.composition-legend {
|
||||||
|
display: flex;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legend-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legend-dot {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
&.native {
|
||||||
|
background-color: var(--native);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.proton {
|
||||||
|
background-color: var(--proton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.legend-label {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.legend-value {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Secondary stats as compact pill chips
|
||||||
|
.stat-chips {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-chip {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.6rem;
|
||||||
|
padding: 0.6rem 1rem;
|
||||||
|
background-color: var(--elevated-bg);
|
||||||
|
border: 1px solid var(--border-soft);
|
||||||
|
border-radius: 99px;
|
||||||
|
|
||||||
|
.stat-chip-icon {
|
||||||
|
color: var(--icon-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-chip-value {
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.stat-chip-label {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Two side-by-side cards (Recent Activity / System) filling out the rest
|
||||||
|
// of the page stacks on narrow windows.
|
||||||
|
.overview-columns {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 1.5rem;
|
||||||
|
|
||||||
|
.page-section {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 280px;
|
||||||
|
max-width: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-feed {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5rem;
|
||||||
|
max-height: 260px;
|
||||||
|
overflow-y: auto;
|
||||||
|
@include custom-scrollbar;
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.65rem;
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-item-dot {
|
||||||
|
width: 7px;
|
||||||
|
height: 7px;
|
||||||
|
border-radius: 50%;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
&--install {
|
||||||
|
background-color: var(--success);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--uninstall {
|
||||||
|
background-color: var(--danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--update {
|
||||||
|
background-color: var(--info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-item-message {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-primary);
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.activity-item-time {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// System spec sheet - a colored accent bar per field instead of plain
|
||||||
|
// label/value rows, with the value given real typographic weight
|
||||||
|
.system-specs {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-spec {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.2rem;
|
||||||
|
padding-left: 0.85rem;
|
||||||
|
border-left: 3px solid var(--border-soft);
|
||||||
|
|
||||||
|
&--os {
|
||||||
|
border-left-color: var(--info);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--cpu {
|
||||||
|
border-left-color: var(--success);
|
||||||
|
}
|
||||||
|
|
||||||
|
&--gpu {
|
||||||
|
border-left-color: var(--primary-color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-spec-label {
|
||||||
|
font-size: 0.68rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.6px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-spec-value {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-primary);
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.system-spec-sub {
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
@use '../../themes/index' as *;
|
||||||
|
@use '../../abstracts/index' as *;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Shared layout for top-level pages reached via the sidebar (Overview,
|
||||||
|
Settings) - same container treatment as .game-list so switching between
|
||||||
|
them feels consistent.
|
||||||
|
*/
|
||||||
|
.overview-page,
|
||||||
|
.settings-page {
|
||||||
|
padding: 1.5rem;
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1.5rem;
|
||||||
|
@include custom-scrollbar;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
letter-spacing: 0.3px;
|
||||||
|
padding-bottom: 0.9rem;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
border-bottom: 1px solid var(--border-dark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A titled subsection within a page (distinct from dialogs' .settings-section,
|
||||||
|
// which is sized for a modal rather than a full page). Rendered as a single
|
||||||
|
// unified card, the heading, description, and body content all live inside
|
||||||
|
// the same container instead of the body floating below on its own.
|
||||||
|
.page-section {
|
||||||
|
background-color: var(--elevated-bg);
|
||||||
|
border: 1px solid var(--border-soft);
|
||||||
|
border-radius: var(--radius-lg);
|
||||||
|
padding: 1.5rem;
|
||||||
|
max-width: 640px;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-section-description {
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin-bottom: 1.25rem;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Danger Zone - a page-section with a subtle danger-tinted border instead
|
||||||
|
// of the default neutral one, so it reads as "be careful here" without
|
||||||
|
// resorting to a loud red banner
|
||||||
|
.page-section.danger-zone {
|
||||||
|
border-color: color-mix(in srgb, var(--danger) 30%, var(--border-soft));
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
color: var(--danger-light);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.danger-zone-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 1rem;
|
||||||
|
padding: 0.85rem 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.danger-zone-row-text {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.15rem;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.danger-zone-row-label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.danger-zone-row-description {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-info {
|
||||||
|
.info-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0.6rem 0;
|
||||||
|
|
||||||
|
&:not(:last-child) {
|
||||||
|
border-bottom: 1px solid var(--border-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-label {
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-value {
|
||||||
|
color: var(--text-primary);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-link {
|
||||||
|
color: var(--primary-color);
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
transition: color 0.2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--secondary-color);
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,6 +20,9 @@
|
|||||||
/* Dialog components */
|
/* Dialog components */
|
||||||
@use 'components/dialogs/index' as *;
|
@use 'components/dialogs/index' as *;
|
||||||
|
|
||||||
|
/* Page components (Overview, Settings) */
|
||||||
|
@use 'components/pages/index' as *;
|
||||||
|
|
||||||
/* Notification components */
|
/* Notification components */
|
||||||
@use 'components/notifications/index' as *;
|
@use 'components/notifications/index' as *;
|
||||||
|
|
||||||
@@ -28,6 +31,3 @@
|
|||||||
|
|
||||||
/* Common components */
|
/* Common components */
|
||||||
@use 'components/common/index' as *;
|
@use 'components/common/index' as *;
|
||||||
|
|
||||||
/* Page-specific styles */
|
|
||||||
//@use 'pages/home';
|
|
||||||
|
|||||||
Reference in New Issue
Block a user