@import url("https://fonts.cdnfonts.com/css/thegoodmonolith");
/* =========================
RESET + TOKENS (Black UI)
========================= */
*,
*::after,
*::before {
box-sizing: border-box;
}
:root {
color-scheme: dark;
/* Base */
--color-text: rgba(255, 255, 255, 0.92);
--color-muted: rgba(255, 255, 255, 0.68);
--color-dim: rgba(255, 255, 255, 0.48);
/* Black palette */
--bg: #060607;
--bg-2: #0b0c0f;
--panel: rgba(10, 10, 12, 0.62);
--panel-2: rgba(0, 0, 0, 0.55);
/* Accents (still “black UI”, but usable) */
--stroke: rgba(255, 255, 255, 0.14);
--stroke-2: rgba(255, 255, 255, 0.08);
--glow: rgba(255, 255, 255, 0.10);
/* Radius + shadow */
--r-lg: 18px;
--r-md: 14px;
--shadow-1: 0 18px 60px rgba(0, 0, 0, 0.55);
--shadow-2: 0 10px 30px rgba(0, 0, 0, 0.45);
/* Sizes */
--thumb-width: 120px;
--thumb-height: 80px;
/* Lines */
--line-spacing: 10px;
--line-base-height: 15px;
--line-max-height: 50px;
/* Motion */
--ease-out: cubic-bezier(0.22, 1, 0.36, 1);
--ease-soft: cubic-bezier(0.2, 0.7, 0.2, 1);
}
/* =========================
BASE
========================= */
html,
body {
height: 100%;
}
body {
margin: 0;
color: var(--color-text);
background: radial-gradient(1200px 800px at 50% 20%, rgba(255, 255, 255, 0.05), transparent 55%),
radial-gradient(900px 650px at 20% 80%, rgba(255, 255, 255, 0.03), transparent 60%),
var(--bg);
font-family: "TheGoodMonolith", system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
overflow-x: hidden;
min-height: 100%;
-webkit-font-smoothing: antialiased;
text-rendering: geometricPrecision;
}
/* Selection */
::selection {
background: rgba(255, 255, 255, 0.16);
color: rgba(255, 255, 255, 0.95);
}
/* Focus ring (accessible) */
:where(a, button, [role="button"], input, textarea, select):focus-visible {
outline: 2px solid rgba(255, 255, 255, 0.35);
outline-offset: 3px;
border-radius: 10px;
}
/* =========================
SLIDES
========================= */
.slides {
width: 100%;
min-height: 100dvh;
overflow: hidden;
display: grid;
grid-template-rows: 100%;
grid-template-columns: 100%;
place-items: center;
margin-top: 60px;
position: relative;
}
.slide {
width: 100%;
height: 100%;
grid-area: 1 / 1 / -1 / -1;
pointer-events: none;
opacity: 0;
overflow: hidden;
position: relative;
display: grid;
place-items: center;
will-change: transform, opacity;
}
.slide--current {
pointer-events: auto;
opacity: 1;
}
/* Image layer */
.slide__img {
width: 100%;
height: 100%;
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
will-change: transform, opacity, filter;
position: relative;
}
/* Dark overlay for readability (keeps "black UI" consistent) */
.slide__img::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
to bottom,
rgba(0, 0, 0, 0.62) 0%,
rgba(0, 0, 0, 0.22) 35%,
rgba(0, 0, 0, 0.70) 100%
);
pointer-events: none;
}
/* =========================
HINT
========================= */
.scroll-hint {
position: absolute;
top: 1rem;
right: 1rem;
z-index: 30;
color: var(--color-text);
font-size: 0.9rem;
letter-spacing: 0.4px;
padding: 0.55rem 0.75rem;
border-radius: 999px;
background: rgba(0, 0, 0, 0.35);
border: 1px solid var(--stroke);
box-shadow: var(--shadow-2);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
/* =========================
BOTTOM UI (polished panel)
========================= */
.bottom-ui-container {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: max(env(safe-area-inset-bottom), 14px);
width: min(760px, 100%);
z-index: 40;
padding: 0 1rem;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
pointer-events: auto;
overflow-x: hidden;
/* breathing space vs thumbs */
margin-bottom: 140px;
}
/* Main glass panel wrapper feel */
.bottom-ui-container::before {
content: "";
position: absolute;
inset: -10px -10px -12px -10px;
border-radius: calc(var(--r-lg) + 10px);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02));
border: 1px solid var(--stroke-2);
box-shadow: var(--shadow-1);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
pointer-events: none;
z-index: 0;
}
.bottom-ui-container > * {
position: relative;
z-index: 1;
}
/* =========================
TYPO / BLOCKS
========================= */
.slide-section {
width: 100%;
text-align: center;
color: var(--color-text);
font-size: clamp(1.15rem, 2vw + 0.6rem, 1.9rem);
font-weight: 800;
letter-spacing: 1.2px;
opacity: 0.95;
margin-bottom: 18px;
text-shadow: 0 8px 30px rgba(0, 0, 0, 0.55);
}
.slide-counter {
display: flex;
align-items: center;
width: 100%;
justify-content: space-between;
gap: 0.75rem;
color: var(--color-muted);
font-size: 0.88rem;
padding: 0.6rem 0.75rem;
border-radius: var(--r-md);
background: rgba(0, 0, 0, 0.28);
border: 1px solid var(--stroke-2);
}
.counter-display {
display: flex;
align-items: center;
gap: 10px;
}
.counter-divider {
opacity: 0.6;
font-size: 0.85rem;
}
.counter-nav {
width: 22px;
cursor: pointer;
opacity: 0.75;
transition: opacity 220ms var(--ease-soft), transform 220ms var(--ease-soft), filter 220ms var(--ease-soft);
filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.55));
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
}
.counter-nav:hover {
opacity: 1;
transform: translateY(-1px);
}
.counter-nav:active {
transform: translateY(0);
opacity: 0.95;
}
/* Title with smoother motion */
.slide-title-container {
width: 100%;
text-align: center;
height: 32px;
overflow: hidden;
margin-bottom: 10px;
position: relative;
border-radius: var(--r-md);
background: rgba(0, 0, 0, 0.22);
border: 1px solid var(--stroke-2);
padding: 0.45rem 0.75rem;
}
.slide-title {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: var(--color-text);
font-size: 1.03rem;
letter-spacing: 0.6px;
opacity: 0.9;
transition: transform 520ms var(--ease-out), opacity 520ms var(--ease-out);
}
.slide-title.exit-up {
transform: translateY(-38px);
opacity: 0;
}
.slide-title.enter-up {
transform: translateY(38px);
opacity: 0;
}
/* =========================
DRAG INDICATOR
========================= */
.drag-indicator {
width: 100%;
height: 52px;
pointer-events: none;
margin-bottom: 6px;
position: relative;
border-radius: var(--r-md);
background: rgba(0, 0, 0, 0.18);
border: 1px solid var(--stroke-2);
overflow: hidden;
}
.drag-indicator::after {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(450px 80px at 50% 100%, rgba(255, 255, 255, 0.05), transparent 60%);
pointer-events: none;
}
.lines-container {
display: flex;
height: 100%;
width: 100%;
position: relative;
align-items: flex-end;
justify-content: space-between;
gap: var(--line-spacing);
padding: 10px 12px;
}
.drag-line {
width: 2px;
height: var(--line-base-height);
border-radius: 99px;
background-color: rgba(255, 255, 255, 0.22);
transform-origin: bottom center;
transition: height 600ms var(--ease-out), background-color 600ms var(--ease-out);
box-shadow: 0 0 18px rgba(255, 255, 255, 0.06);
}
/* Optional: when active (if you toggle a class in JS) */
.drag-indicator.is-active .drag-line {
background-color: rgba(255, 255, 255, 0.34);
}
/* =========================
THUMBS (real black “dock”)
========================= */
.thumbs-container {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border-radius: var(--r-lg);
background: rgba(0, 0, 0, 0.38);
border: 1px solid var(--stroke);
box-shadow: var(--shadow-2);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
/* nicer scroll */
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
}
.thumbs-container::-webkit-scrollbar {
height: 10px;
}
.thumbs-container::-webkit-scrollbar-track {
background: transparent;
}
.thumbs-container::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.16);
border-radius: 999px;
}
.slide-thumbs {
display: flex;
position: relative;
padding: 0.45rem 0.35rem;
z-index: 11;
gap: 0.35rem;
width: max-content;
}
.frost-bg {
display: none;
}
.slide-thumb {
width: var(--thumb-width);
height: var(--thumb-height);
flex: 0 0 auto;
background-size: cover;
background-position: center center;
cursor: pointer;
opacity: 0.58;
transform: translateY(0);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.10);
outline: none;
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45);
transition: opacity 220ms var(--ease-soft), transform 220ms var(--ease-soft), border-color 220ms var(--ease-soft), filter 220ms var(--ease-soft);
position: relative;
overflow: hidden;
}
.slide-thumb::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0.10), rgba(0, 0, 0, 0.55));
pointer-events: none;
}
.slide-thumb:hover {
opacity: 0.82;
transform: translateY(-2px);
border-color: rgba(255, 255, 255, 0.18);
}
.slide-thumb.active {
opacity: 1;
transform: translateY(-3px);
border-color: rgba(255, 255, 255, 0.28);
filter: saturate(1.05) contrast(1.03);
}
/* Tiny notch / indicator on active thumb */
.slide-thumb.active::before {
content: "";
position: absolute;
left: 12px;
right: 12px;
bottom: 8px;
height: 2px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.45);
box-shadow: 0 0 22px rgba(255, 255, 255, 0.10);
}
/* =========================
RESPONSIVE
========================= */
@media (max-width: 1024px) {
:root {
--thumb-width: 96px;
--thumb-height: 72px;
--line-spacing: 8px;
--line-base-height: 12px;
--line-max-height: 40px;
}
.slide-title {
font-size: 0.98rem;
}
.slide-counter {
font-size: 0.84rem;
}
}
@media (max-width: 768px) {
:root {
--thumb-width: 84px;
--thumb-height: 64px;
--line-spacing: 6px;
--line-base-height: 10px;
--line-max-height: 34px;
}
.bottom-ui-container {
margin: 1.1rem auto 2rem;
padding: 0 0.75rem 1.5rem;
margin-bottom: 120px;
}
.scroll-hint {
font-size: 0.84rem;
top: 0.75rem;
right: 0.75rem;
}
}
@media (max-width: 480px) {
:root {
--thumb-width: 72px;
--thumb-height: 56px;
--line-spacing: 4px;
--line-base-height: 8px;
--line-max-height: 28px;
}
.slide-section {
font-size: clamp(1rem, 4.5vw, 1.28rem);
margin-bottom: 14px;
}
.slide-title-container {
height: 30px;
}
.slide-title {
font-size: 0.95rem;
}
.counter-nav {
width: 20px;
}
.counter-divider {
font-size: 0.8rem;
}
}
/* =========================
REDUCED MOTION
========================= */
@media (prefers-reduced-motion: reduce) {
* {
transition-duration: 0.001ms !important;
animation-duration: 0.001ms !important;
scroll-behavior: auto !important;
}
}
2 respuestas
Te gusta este post? Compártelo!!
I learned a lot from this. Thank you.