Files
2026-03-25 10:16:39 +01:00

5427 lines
107 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ==========================================================================
MINIMAL BLACK THEME - MAIN STYLESHEET
A minimal, dark-mode first Hugo theme
========================================================================== */
/* Base Styles & Tailwind */
/* ==========================================================================
BASE STYLES
Tailwind imports, CSS variables, theme colors, and base styles
========================================================================== */
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
}
::backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
}
/* ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com */
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/
html,
:host {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
font-variation-settings: normal;
/* 6 */
-webkit-tap-highlight-color: transparent;
/* 7 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-feature-settings: normal;
/* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-feature-settings: inherit;
/* 1 */
font-variation-settings: inherit;
/* 1 */
font-size: 100%;
/* 1 */
font-weight: inherit;
/* 1 */
line-height: inherit;
/* 1 */
letter-spacing: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/
button,
input:where([type='button']),
input:where([type='reset']),
input:where([type='submit']) {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Reset default styling for dialogs.
*/
dialog {
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden]:where(:not([hidden="until-found"])) {
display: none;
}
.container {
width: 100%;
}
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
@media (min-width: 768px) {
.container {
max-width: 768px;
}
}
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
}
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
}
@media (min-width: 1536px) {
.container {
max-width: 1536px;
}
}
.dock {
position: fixed;
right: 1.5rem;
bottom: 1.6rem;
z-index: 50;
}
.dock-inner {
display: inline-flex;
align-items: center;
gap: 0.45rem;
padding: 0.3rem 0.5rem;
border-radius: 9999px;
/* border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-surface) 92%, transparent);
box-shadow: 0 14px 40px rgba(0, 0, 0, 0.55); */
backdrop-filter: blur(16px);
}
.dock-panel {
padding: 0.25rem;
display: inline-flex;
align-items: center;
gap: 0.35rem;
max-width: 0;
opacity: 0;
transform: translateX(6px);
overflow: hidden;
transition: max-width 0.18s ease-out, opacity 0.18s ease-out,
transform 0.18s ease-out;
}
.dock--open .dock-panel {
max-width: 10rem;
opacity: 1;
transform: translateX(0);
}
.dock-divider {
width: 1px;
height: 1.4rem;
background: linear-gradient(
to bottom,
transparent,
color-mix(in srgb, var(--color-border) 80%, transparent),
transparent
);
}
.dock-action {
display: flex;
align-items: center;
justify-content: center;
width: 2rem;
height: 2rem;
border-radius: 9999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 75%, transparent);
color: var(--color-text-muted);
cursor: pointer;
transition: background-color 0.16s ease-out, border-color 0.16s ease-out,
color 0.16s ease-out, transform 0.16s ease-out, box-shadow 0.16s ease-out;
}
.dock-action:hover {
border-color: var(--color-accent);
color: var(--color-accent);
transform: translateY(-1px);
/* box-shadow: 0 8px 26px rgba(0, 0, 0, 0.55); */
}
.dock-toggle {
display: flex;
align-items: center;
justify-content: center;
width: 2.1rem;
height: 2.1rem;
border-radius: 9999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 85%, transparent);
color: var(--color-text-muted);
cursor: pointer;
transition: background-color 0.16s ease-out, border-color 0.16s ease-out,
transform 0.16s ease-out, box-shadow 0.16s ease-out;
}
.dock-toggle:hover {
border-color: var(--color-accent);
color: var(--color-accent);
transform: translateY(-1px);
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.5);
}
.dock-toggle-dots {
position: relative;
display: inline-block;
width: 0.8rem;
height: 0.16rem;
border-radius: 999px;
background-color: var(--color-text-muted);
}
.dock-toggle-dots::before,
.dock-toggle-dots::after {
content: "";
position: absolute;
inset-y: 0;
width: 0.16rem;
border-radius: 999px;
background-color: var(--color-text-muted);
}
.dock-toggle-dots::before {
left: -0.18rem;
}
.dock-toggle-dots::after {
right: -0.18rem;
}
.dock--open .dock-toggle-dots,
.dock--open .dock-toggle-dots::before,
.dock--open .dock-toggle-dots::after {
background-color: var(--color-accent);
}
.btn-primary-sm {
font-size: 0.75rem;
padding: 0.35rem 0.9rem;
border-radius: 999px;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
.visible {
visibility: visible;
}
.collapse {
visibility: collapse;
}
.static {
position: static;
}
.fixed {
position: fixed;
}
.absolute {
position: absolute;
}
.sticky {
position: sticky;
}
.order-first {
order: -9999;
}
.mx-auto {
margin-left: auto;
margin-right: auto;
}
.mb-2 {
margin-bottom: 0.5rem;
}
.mb-8 {
margin-bottom: 2rem;
}
.ml-1 {
margin-left: 0.25rem;
}
.mt-0\.5 {
margin-top: 0.125rem;
}
.mt-1 {
margin-top: 0.25rem;
}
.mt-2 {
margin-top: 0.5rem;
}
.mt-3 {
margin-top: 0.75rem;
}
.mt-4 {
margin-top: 1rem;
}
.mt-6 {
margin-top: 1.5rem;
}
.block {
display: block;
}
.inline {
display: inline;
}
.flex {
display: flex;
}
.inline-flex {
display: inline-flex;
}
.table {
display: table;
}
.grid {
display: grid;
}
.contents {
display: contents;
}
.hidden {
display: none;
}
.h-1\.5 {
height: 0.375rem;
}
.h-24 {
height: 6rem;
}
.h-4 {
height: 1rem;
}
.h-8 {
height: 2rem;
}
.h-full {
height: 100%;
}
.min-h-screen {
min-height: 100vh;
}
.w-1\.5 {
width: 0.375rem;
}
.w-24 {
width: 6rem;
}
.w-4 {
width: 1rem;
}
.w-8 {
width: 2rem;
}
.w-full {
width: 100%;
}
.min-w-0 {
min-width: 0px;
}
.max-w-7xl {
max-width: 80rem;
}
.max-w-xl {
max-width: 36rem;
}
.flex-1 {
flex: 1 1 0%;
}
.flex-shrink {
flex-shrink: 1;
}
.transform {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.list-disc {
list-style-type: disc;
}
.flex-col {
flex-direction: column;
}
.flex-wrap {
flex-wrap: wrap;
}
.items-start {
align-items: flex-start;
}
.items-center {
align-items: center;
}
.items-baseline {
align-items: baseline;
}
.justify-end {
justify-content: flex-end;
}
.justify-center {
justify-content: center;
}
.justify-between {
justify-content: space-between;
}
.gap-1 {
gap: 0.25rem;
}
.gap-1\.5 {
gap: 0.375rem;
}
.gap-2 {
gap: 0.5rem;
}
.gap-3 {
gap: 0.75rem;
}
.gap-4 {
gap: 1rem;
}
.gap-5 {
gap: 1.25rem;
}
.gap-8 {
gap: 2rem;
}
.space-y-1 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
}
.space-y-2 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
}
.space-y-3 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
}
.space-y-4 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(1rem * var(--tw-space-y-reverse));
}
.space-y-5 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(1.25rem * var(--tw-space-y-reverse));
}
.space-y-6 > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
}
.overflow-hidden {
overflow: hidden;
}
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.rounded-2xl {
border-radius: 1rem;
}
.rounded-full {
border-radius: 9999px;
}
.border {
border-width: 1px;
}
.border-b {
border-bottom-width: 1px;
}
.border-border {
border-color: var(--color-border);
}
.bg-bg {
background-color: var(--color-bg);
}
.bg-surface {
background-color: var(--color-surface);
}
.bg-white\/95 {
background-color: rgb(255 255 255 / 0.95);
}
.object-cover {
-o-object-fit: cover;
object-fit: cover;
}
.p-2 {
padding: 0.5rem;
}
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
}
.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
.py-1\.5 {
padding-top: 0.375rem;
padding-bottom: 0.375rem;
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
}
.pb-6 {
padding-bottom: 1.5rem;
}
.pl-4 {
padding-left: 1rem;
}
.pt-10 {
padding-top: 2.5rem;
}
.pt-6 {
padding-top: 1.5rem;
}
.text-2xl {
font-size: 1.5rem;
line-height: 2rem;
}
.text-3xl {
font-size: 1.875rem;
line-height: 2.25rem;
}
.text-\[0\.68rem\] {
font-size: 0.68rem;
}
.text-\[0\.72rem\] {
font-size: 0.72rem;
}
.text-\[0\.75rem\] {
font-size: 0.75rem;
}
.text-\[0\.7rem\] {
font-size: 0.7rem;
}
.text-\[0\.8rem\] {
font-size: 0.8rem;
}
.text-\[1rem\] {
font-size: 1rem;
}
.text-base {
font-size: 1rem;
line-height: 1.5rem;
}
.text-lg {
font-size: 1.125rem;
line-height: 1.75rem;
}
.text-sm {
font-size: 0.875rem;
line-height: 1.25rem;
}
.text-xs {
font-size: 0.75rem;
line-height: 1rem;
}
.font-medium {
font-weight: 500;
}
.font-semibold {
font-weight: 600;
}
.italic {
font-style: italic;
}
.tracking-tight {
letter-spacing: -0.025em;
}
.tracking-wide {
letter-spacing: 0.025em;
}
.text-accent {
color: var(--color-accent);
}
.text-muted {
color: var(--color-text-muted);
}
.text-text {
color: var(--color-text);
}
.antialiased {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.shadow-md {
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-sm {
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.blur {
--tw-blur: blur(8px);
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.filter {
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.backdrop-filter {
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.transition {
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
/* Theme Variables */
:root {
/* LIGHT THEME */
--color-bg: #f9fafb;
--color-surface: #ffffff;
--color-text: #111827;
--color-text-muted: #6b7280;
--color-border: #e5e7eb;
--color-accent: #555555;
}
html[data-theme="dark"] {
/* DARK THEME */
--color-bg: #000000;
/* TRUE BLACK */
--color-surface: #0a0a0a;
--color-text: #f9fafb;
--color-text-muted: #9ca3af;
--color-border: #27272a;
--color-accent: #707070;
}
/* Base Styles */
body {
background: var(--color-bg);
color: var(--color-text);
}
/* Utility Classes */
/* ==========================================================================
UTILITY CLASSES
Color utilities, animations, helper classes
========================================================================== */
.bg-bg {
background-color: var(--color-bg);
}
.bg-surface {
background-color: var(--color-surface);
}
.text-text {
color: var(--color-text);
}
.text-muted {
color: var(--color-text-muted);
}
.text-accent {
color: var(--color-accent);
}
.border-border {
border-color: var(--color-border);
}
.border-accent {
border-color: var(--color-accent);
}
.bg-accent {
background-color: var(--color-accent);
}
.underline-accent {
text-decoration-color: var(--color-accent);
}
/* Simple fade-up animation */
@keyframes fade-up {
0% {
opacity: 0;
transform: translateY(8px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.animate-fade-up {
animation: fade-up 0.45s ease-out both;
}
@keyframes search-panel-in {
0% {
opacity: 0;
transform: translate(-50%, -48%) scale(0.97);
}
100% {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
}
@keyframes search-backdrop-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes search-panel-out {
0% {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
100% {
opacity: 0;
transform: translate(-50%, -48%) scale(0.97);
}
}
@keyframes search-backdrop-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
/* Layout helpers */
/* Components */
/* ==========================================================================
DOCK COMPONENT
Floating action dock with toggle and panel
========================================================================== */
/* ==========================================================================
CARD COMPONENTS
Home cards, project cards, post cards, CTA cards, badges
========================================================================== */
.card-home {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 0.5rem;
background-color: color-mix(in srgb, var(--color-surface) 96%, transparent);
box-shadow: 0 18px 40px rgba(0, 0, 0, 0.55);
}
.card-home--project {
position: relative;
overflow: hidden;
transition:
transform 0.18s ease-out,
box-shadow 0.18s ease-out,
border-color 0.18s ease-out,
background-color 0.18s ease-out;
}
.card-home--project::after {
content: "";
position: absolute;
inset: -40%;
background: radial-gradient(
circle at 120% 50%,
color-mix(in srgb, var(--color-accent) 70%, transparent),
transparent 60%
);
opacity: 0;
transform: translateX(-8px);
transition:
opacity 0.22s ease-out,
transform 0.22s ease-out;
pointer-events: none;
}
.card-home--project:hover {
transform: translateY(-4px) translateX(3px);
border-color: color-mix(in srgb, var(--color-accent) 40%, var(--color-border));
box-shadow:
0 18px 40px rgba(0, 0, 0, 0.7),
16px 0 38px rgba(124, 58, 237, 0.45);
/* purple-ish accent on right */
background-color: color-mix(in srgb, var(--color-surface) 99%, transparent);
}
.card-home--project:hover::after {
opacity: 0.22;
transform: translateX(0);
}
.card-home-body {
display: flex;
flex-direction: column;
gap: 0.5rem;
text-decoration: none;
color: inherit;
}
.card-home--post {
background-color: color-mix(in srgb, var(--color-surface) 94%, transparent);
}
.card-home-header {
display: flex;
align-items: flex-start;
gap: 0.6rem;
}
.card-home-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.1rem;
height: 2.1rem;
border-radius: 999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 92%, transparent);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
font-size: 0.85rem;
}
.card-badge {
margin-left: 0.25rem;
padding: 0.05rem 0.35rem;
border-radius: 999px;
background-color: color-mix(in srgb, var(--color-accent) 22%, transparent);
color: var(--color-accent);
font-size: 0.6rem;
font-weight: 600;
}
.card-home-footer {
margin-top: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
justify-content: space-between;
}
.card-home-footer--buttons {
padding-top: 0.4rem;
border-top: 1px solid color-mix(in srgb, var(--color-border) 80%, transparent);
}
.card-tag-row {
display: flex;
flex-wrap: wrap;
gap: 0.25rem;
}
.card-tag-pill {
padding: 0.1rem 0.45rem;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--color-border) 80%, transparent);
background-color: color-mix(in srgb, var(--color-bg) 92%, transparent);
font-size: 0.65rem;
color: var(--color-text-muted);
}
.card-cta {
display: inline-flex;
align-items: center;
gap: 0.35rem;
font-size: 0.7rem;
color: var(--color-text-muted);
text-decoration: none;
padding: 0.25rem 0.6rem;
border-radius: 999px;
border: 1px solid transparent;
transition:
color 0.15s ease-out,
border-color 0.15s ease-out,
background-color 0.15s ease-out,
transform 0.15s ease-out;
}
.card-cta-btn {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.25rem 0.6rem;
border-radius: 8px;
font-size: 0.68rem;
color: var(--color-text-muted);
background-color: color-mix(in srgb, var(--color-bg) 92%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 80%, transparent);
text-decoration: none;
transition:
color 0.15s ease-out,
background-color 0.15s ease-out,
border-color 0.15s ease-out,
transform 0.15s ease-out,
box-shadow 0.15s ease-out;
}
.card-cta-btn:hover {
color: var(--color-accent);
background-color: color-mix(in srgb, var(--color-surface) 96%, transparent);
border-color: color-mix(in srgb, var(--color-accent) 50%, transparent);
transform: translateY(-1px);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.45);
}
.card-cta-repo {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.25rem 0.7rem;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--color-border) 85%, transparent);
background-color: color-mix(in srgb, var(--color-bg) 94%, transparent);
font-size: 0.7rem;
color: var(--color-text-muted);
text-decoration: none;
transition:
color 0.15s ease-out,
border-color 0.15s ease-out,
background-color 0.15s ease-out,
transform 0.15s ease-out,
box-shadow 0.15s ease-out;
}
.card-cta-repo:hover {
color: var(--color-accent);
border-color: color-mix(in srgb, var(--color-accent) 55%, transparent);
background-color: color-mix(in srgb, var(--color-surface) 96%, transparent);
transform: translateY(-1px);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.5);
}
.card-cta:hover {
color: var(--color-accent);
border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);
background-color: color-mix(in srgb, var(--color-surface) 94%, transparent);
transform: translateY(-1px);
}
.card-home--post {
position: relative;
overflow: hidden;
background-color: color-mix(in srgb, var(--color-surface) 94%, transparent);
border-left-width: 2px;
border-left-color: color-mix(in srgb, var(--color-border) 80%, transparent);
transition:
transform 0.18s ease-out,
box-shadow 0.18s ease-out,
border-color 0.18s ease-out,
background-color 0.18s ease-out;
}
.card-home--post::before {
content: "";
position: absolute;
left: -4px;
top: -20%;
bottom: -20%;
width: 10px;
background: linear-gradient(
to bottom,
transparent,
color-mix(in srgb, var(--color-accent) 70%, transparent),
transparent
);
opacity: 0;
transform: translateX(-6px);
transition:
opacity 0.22s ease-out,
transform 0.22s ease-out;
pointer-events: none;
}
.card-home--post:hover {
transform: translateY(-3px);
background-color: color-mix(in srgb, var(--color-surface) 98%, transparent);
border-left-color: color-mix(in srgb, var(--color-accent) 55%, var(--color-border));
box-shadow: 0 16px 34px rgba(0, 0, 0, 0.65);
}
.card-home--post:hover::before {
opacity: 0.55;
transform: translateX(0);
}
.card-home-icon--post {
background-color: color-mix(in srgb, var(--color-bg) 94%, transparent);
}
.card-badge--soft {
background-color: color-mix(in srgb, var(--color-accent) 16%, transparent);
color: color-mix(in srgb, var(--color-accent) 85%, white);
}
.card {
border-radius: 0.75rem;
transition: all 0.2s ease-out;
}
.card-pad {
padding: 1rem;
}
.card:hover {
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);
}
/* ==========================================================================
LAYOUT & NAVIGATION
Page layouts, headers, footers, navigation links
========================================================================== */
.layout-page {
margin-left: auto;
margin-right: auto;
max-width: 80rem;
padding-left: 1rem;
padding-right: 1rem;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}
@media (min-width: 640px) {
.layout-page {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
@media (min-width: 1024px) {
.layout-page {
padding-top: 3rem;
padding-bottom: 3rem;
}
}
.layout-page-tight {
margin-left: auto;
margin-right: auto;
max-width: 72rem;
padding-left: 1rem;
padding-right: 1rem;
padding-top: 1rem;
padding-bottom: 1rem;
}
@media (min-width: 640px) {
.layout-page-tight {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
}
@media (min-width: 1024px) {
.layout-page-tight {
padding-top: 2.5rem;
padding-bottom: 2.5rem;
}
}
.section-stack > :not([hidden]) ~ :not([hidden]) {
--tw-space-y-reverse: 0;
margin-top: calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));
margin-bottom: calc(2.5rem * var(--tw-space-y-reverse));
}
.section-stack--home > * + * {
margin-top: 1.75rem;
}
.section-stack > div + div.posts-section {
border-top: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
padding-top: 1.5rem;
}
/* Headings */
.heading-page {
font-size: 1.875rem;
line-height: 2.25rem;
font-weight: 600;
letter-spacing: -0.025em;
}
@media (min-width: 640px) {
.heading-page {
font-size: 2.25rem;
line-height: 2.5rem;
}
}
.heading-section {
font-size: 0.875rem;
line-height: 1.25rem;
font-weight: 600;
letter-spacing: -0.025em;
}
.eyebrow {
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.22em;
}
/* Cards */
.card {
border-radius: 0.75rem;
border-width: 1px;
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
background-color: var(--color-surface);
border-color: var(--color-border);
}
.card-pad {
padding: 1rem;
}
@media (min-width: 640px) {
.card-pad {
padding: 1.25rem;
}
}
.card-hover {
transition-property: transform;
transition-property: box-shadow;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
}
.card-hover:hover {
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
transform: translateY(-1px);
border-color: var(--color-accent);
}
/* Buttons */
.btn-primary {
display: inline-flex;
align-items: center;
border-radius: 9999px;
padding-left: 1rem;
padding-right: 1rem;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
font-size: 0.75rem;
line-height: 1rem;
font-weight: 500;
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
transition-property: transform;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
background-color: var(--color-accent);
}
.btn-primary:hover {
transform: translateY(-1px);
}
.btn-ghost {
display: inline-flex;
align-items: center;
font-size: 0.75rem;
line-height: 1rem;
font-weight: 500;
color: var(--color-text-muted);
}
.nav-shell {
border-radius: 9999px;
border-width: 1px;
padding: 0.75rem;
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
--tw-backdrop-blur: blur(8px);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
border-color: var(--color-border);
background-color: color-mix(in srgb, var(--color-surface) 82%, transparent);
}
.nav-shell::before {
content: "";
position: absolute;
inset-inline: 0;
top: 0;
bottom: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent,
color-mix(in srgb, var(--color-accent) 80%, transparent),
transparent
);
opacity: 0.8;
pointer-events: none;
}
.nav-inner {
display: flex;
align-items: center;
justify-content: space-between;
padding-left: 1rem;
padding-right: 1rem;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
@media (min-width: 640px) {
.nav-inner {
padding-left: 1.25rem;
padding-right: 1.25rem;
padding-top: 0.625rem;
padding-bottom: 0.625rem;
}
}
/* Brand logo badge (fallback) */
.logo-badge {
display: flex;
height: 2rem;
width: 2rem;
align-items: center;
justify-content: center;
border-radius: 9999px;
font-size: 0.65rem;
font-weight: 600;
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity, 1));
background-color: var(--color-accent);
}
/* Nav links */
.nav-link {
font-size: 0.78rem;
font-weight: 500;
color: var(--color-text-muted);
}
.nav-link:hover {
color: var(--color-accent);
}
/* Theme toggle */
.theme-toggle {
display: inline-flex;
height: 2rem;
width: 2rem;
align-items: center;
justify-content: center;
border-radius: 9999px;
border-width: 1px;
font-size: 0.7rem;
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
background-color: var(--color-bg);
color: var(--color-text-muted);
border-color: var(--color-border);
transition: background-color 0.15s ease-out, color 0.15s ease-out,
transform 0.15s ease-out;
}
.theme-toggle:hover {
color: var(--color-accent);
transform: translateY(-1px);
}
html[data-theme="dark"] .theme-toggle {
background-color: var(--color-surface);
}
/* Fancy underline link */
.link-underline {
position: relative;
display: inline-block;
}
.link-underline::after {
content: "";
position: absolute;
left: 0;
bottom: -0.15rem;
width: 0;
height: 1px;
background-color: var(--color-accent);
transition: width 0.16s ease-out;
}
.link-underline:hover::after {
width: 100%;
}
/* Footer shell */
.footer-shell {
border-radius: 1rem;
border-width: 1px;
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
--tw-backdrop-blur: blur(8px);
backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
border-color: var(--color-border);
position: relative;
overflow: hidden;
background-color: color-mix(in srgb, var(--color-surface) 86%, transparent);
}
.footer-shell::before {
content: "";
position: absolute;
inset-inline: 0;
top: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent,
color-mix(in srgb, var(--color-accent) 80%, transparent),
transparent
);
opacity: 0.8;
pointer-events: none;
}
.footer-inner {
display: flex;
flex-direction: column;
gap: 0.75rem;
padding-left: 1rem;
padding-right: 1rem;
padding-top: 0.75rem;
padding-bottom: 0.75rem;
font-size: 0.72rem;
}
@media (min-width: 640px) {
.footer-inner {
flex-direction: row;
align-items: center;
justify-content: space-between;
padding-left: 1.25rem;
padding-right: 1.25rem;
}
}
.footer-links {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.75rem;
}
.footer-link {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: 0.75rem;
font-weight: 500;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
color: var(--color-text-muted);
}
.footer-link:hover {
color: var(--color-accent);
}
.footer-small {
font-size: 0.72rem;
line-height: 1.625;
color: var(--color-text-muted);
}
.footer-float:hover {
color: var(--color-accent);
transform: translateY(-1px);
}
.footer-float:hover i {
filter: drop-shadow(
0 0 2px color-mix(in srgb, var(--color-accent) 60%, transparent)
);
}
/* ==========================================================================
SEARCH OVERLAY
Search modal, search results, empty states
========================================================================== */
.search-overlay {
position: fixed;
inset: 0;
z-index: 40;
display: none;
align-items: center;
justify-content: center;
opacity: 0;
pointer-events: none;
transition: opacity 0.18s ease-out;
}
.search-overlay--open {
opacity: 1;
display: block;
pointer-events: auto;
}
.search-overlay-backdrop {
position: absolute;
inset: 0;
background: radial-gradient(
circle at top,
rgba(0, 0, 0, 0.4),
transparent 55%
),
rgba(0, 0, 0, 0.7);
backdrop-filter: blur(12px);
}
.search-panel {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100%;
max-width: 36rem;
margin-inline: 1.5rem;
border-radius: 1.1rem;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 96%, transparent);
box-shadow: 0 26px 70px rgba(0, 0, 0, 0.85);
padding: 0.8rem 0.9rem 0.6rem;
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.search-overlay--open .search-panel {
animation: search-panel-in 0.18s ease-out;
}
.search-overlay-backdrop {
position: absolute;
inset: 0;
background: radial-gradient(
circle at top,
rgba(0, 0, 0, 0.4),
transparent 55%
),
rgba(0, 0, 0, 0.7);
backdrop-filter: blur(12px);
}
.search-overlay .search-overlay--open .search-overlay-backdrop {
animation: search-backdrop-in 0.18s ease-out;
}
.search-overlay--closing .search-panel {
animation: search-panel-out 0.18s ease-in forwards;
}
.search-overlay--closing .search-overlay-backdrop {
animation: search-backdrop-out 0.18s ease-in forwards;
}
.search-panel-header {
display: flex;
align-items: center;
gap: 0.6rem;
}
.search-input-wrap {
flex: 1;
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.45rem 0.8rem;
border-radius: 999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-surface) 96%, transparent);
}
.search-input {
flex: 1;
border: none;
outline: none;
font-size: 0.82rem;
background: transparent;
color: var(--color-text);
}
.search-input::-moz-placeholder {
color: var(--color-text-muted);
}
.search-input::placeholder {
color: var(--color-text-muted);
}
.search-close {
width: 2rem;
height: 2rem;
border-radius: 999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 90%, transparent);
color: var(--color-text-muted);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background-color 0.16s ease-out, border-color 0.16s ease-out,
color 0.16s ease-out, transform 0.16s ease-out;
}
.search-close:hover {
border-color: var(--color-accent);
color: var(--color-accent);
transform: translateY(-1px);
}
.search-panel-body {
border-radius: 0.9rem;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
background-color: color-mix(in srgb, var(--color-surface) 96%, transparent);
padding: 0.5rem 0.4rem 0.4rem;
display: flex;
flex-direction: column;
}
.search-results {
max-height: 18rem;
padding: 0.25rem 0.15rem 0.4rem;
overflow-y: auto;
}
.search-empty-state {
display: flex;
flex-direction: column;
align-items: center;
padding: 1.2rem 0.5rem 1.4rem;
gap: 0.4rem;
}
.search-empty-icon {
width: 2.3rem;
height: 2.3rem;
border-radius: 999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-bg) 92%, transparent);
display: flex;
align-items: center;
justify-content: center;
}
.search-empty-title {
font-size: 0.86rem;
font-weight: 600;
color: var(--color-text);
}
.search-empty-subtitle {
font-size: 0.76rem;
color: var(--color-text-muted);
}
.search-footer-hints {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
border-top: 1px solid
color-mix(in srgb, var(--color-border) 75%, transparent);
padding: 0.4rem 0.5rem 0.1rem;
margin-top: 0.1rem;
}
.search-hint-key {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: 0.68rem;
color: var(--color-text-muted);
}
.search-hint-key span:first-child,
.search-hint-key span:nth-child(2) {
padding: 0.1rem 0.3rem;
border-radius: 0.3rem;
border: 1px solid color-mix(in srgb, var(--color-border) 80%, transparent);
background-color: color-mix(in srgb, var(--color-bg) 96%, transparent);
font-size: 0.65rem;
}
.search-hint-key.search-hint-right {
margin-left: auto;
}
.search-result-item {
display: block;
padding: 0.42rem 0.55rem;
border-radius: 0.6rem;
text-decoration: none;
transition: background-color 0.12s ease-out, transform 0.12s ease-out;
}
.search-result-item:hover {
background-color: color-mix(in srgb, var(--color-surface) 92%, transparent);
transform: translateY(-1px);
}
.search-result-title {
font-size: 0.8rem;
font-weight: 500;
color: var(--color-text);
}
.search-result-meta {
margin-top: 0.15rem;
font-size: 0.7rem;
color: var(--color-text-muted);
}
.search-footer-hints {
display: flex;
flex-wrap: wrap;
gap: 0.45rem;
border-top: 1px solid
color-mix(in srgb, var(--color-border) 75%, transparent);
padding: 0.4rem 0.5rem 0.1rem;
margin-top: 0.1rem;
}
.search-hint-key {
display: inline-flex;
align-items: center;
gap: 0.25rem;
font-size: 0.68rem;
color: var(--color-text-muted);
}
.search-hint-key span:first-child,
.search-hint-key span:nth-child(2) {
padding: 0.1rem 0.3rem;
border-radius: 0.3rem;
border: 1px solid color-mix(in srgb, var(--color-border) 80%, transparent);
background-color: color-mix(in srgb, var(--color-bg) 96%, transparent);
font-size: 0.65rem;
}
.search-hint-key.search-hint-right {
margin-left: auto;
}
.search-result-item {
display: block;
padding: 0.42rem 0.55rem;
border-radius: 0.6rem;
text-decoration: none;
transition: background-color 0.12s ease-out, transform 0.12s ease-out;
}
.search-result-item:hover {
background-color: color-mix(in srgb, var(--color-surface) 92%, transparent);
transform: translateY(-1px);
}
.search-result-title {
font-size: 0.8rem;
font-weight: 500;
color: var(--color-text);
}
.search-result-meta {
margin-top: 0.15rem;
font-size: 0.7rem;
color: var(--color-text-muted);
}
/* ==========================================================================
TECH MARQUEE
Technology carousel/strip component
========================================================================== */
.tech-carousel {
display: flex;
gap: 0.5rem;
padding: 0.3rem 0.1rem 0.1rem;
overflow-x: auto;
scroll-snap-type: x mandatory;
}
.tech-carousel::-webkit-scrollbar {
height: 4px;
}
.tech-carousel::-webkit-scrollbar-thumb {
border-radius: 999px;
background-color: rgba(255, 255, 255, 0.12);
}
.tech-pill {
scroll-snap-align: start;
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.35rem 0.7rem;
border-radius: 999px;
border: 1px solid var(--color-border);
background-color: color-mix(in srgb, var(--color-surface) 92%, transparent);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.28);
white-space: nowrap;
}
.badge-available {
display: inline-flex;
align-items: center;
gap: 0.375rem;
padding: 0.25rem 0.7rem;
border-radius: 999px;
background-color: var(--color-accent);
color: white;
font-size: 0.7rem;
font-weight: 600;
box-shadow: 0 0 0.4rem rgba(0, 0, 0, 0.4);
}
/* --- Tech marquee --- */
.tech-icon {
font-size: 1.5rem;
}
.tech-strip {
position: relative;
overflow: hidden;
padding-block: 0.4rem;
}
.tech-strip-track {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
display: inline-flex;
align-items: center;
white-space: nowrap;
animation-name: tech-marquee;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-play-state: running;
gap: 1.5rem;
}
.tech-strip--wide .tech-strip-track--primary {
animation-duration: 40s;
}
.tech-strip--wide .tech-strip-track--secondary {
animation-duration: 40s;
animation-direction: reverse;
}
.tech-strip--compact .tech-strip-track--primary {
animation-duration: 40s;
}
.tech-strip--compact .tech-strip-track--secondary {
animation-duration: 48s;
animation-direction: reverse;
}
.tech-strip--compact .tech-strip-track {
gap: 1.1rem;
}
/* pause both rows on hover */
.tech-strip:hover .tech-strip-track {
animation-play-state: paused;
}
.tech-strip-item {
display: inline-flex;
align-items: center;
gap: 0.4rem;
opacity: 0.88;
transition: opacity 0.15s ease-out, transform 0.15s ease-out;
}
.tech-strip-item:hover {
opacity: 1;
transform: translateY(-1px);
}
/* Content */
/* ==========================================================================
MARKDOWN CONTENT STYLES
Typography, blockquotes, lists, code blocks, tables, alerts
========================================================================== */
.markdown-body {
max-width: 85ch;
margin-inline: auto;
font-size: 0.95rem;
line-height: 1.75;
color: var(--color-text);
overflow-wrap: break-word;
word-wrap: break-word;
min-width: 0;
}
/* rhythm */
.markdown-body > * {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body > * + * {
margin-top: 1.25rem;
}
/* paragraphs */
.markdown-body p {
color: var(--color-text);
line-height: 1.75;
}
/* headings */
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
color: var(--color-text);
font-weight: 650;
line-height: 1.3;
letter-spacing: -0.01em;
margin-top: 2rem;
margin-bottom: 0.75rem;
}
.markdown-body h1 {
font-size: 2rem;
margin-top: 0;
}
.markdown-body h2 {
font-size: 1.5rem;
padding-bottom: 0.4rem;
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
margin-top: 2.5rem;
}
.markdown-body h3 {
font-size: 1.25rem;
margin-top: 2rem;
}
.markdown-body h4 {
font-size: 1.1rem;
}
.markdown-body h5 {
font-size: 1rem;
}
.markdown-body h6 {
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--color-text-muted);
}
/* links */
.markdown-body a {
color: var(--color-accent);
text-decoration: none;
border-bottom: 1px solid color-mix(in srgb, var(--color-accent) 35%, transparent);
padding-bottom: 0.05rem;
transition: color 0.15s ease-out, border-color 0.15s ease-out;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-word;
}
.markdown-body a:hover {
color: color-mix(in srgb, var(--color-accent) 85%, white);
border-bottom-color: var(--color-accent);
}
/* strong and emphasis */
.markdown-body strong {
font-weight: 650;
color: var(--color-text);
}
.markdown-body em {
font-style: italic;
}
/* lists */
.markdown-body ul,
.markdown-body ol {
padding-left: 1.75rem;
margin-top: 1rem;
margin-bottom: 1rem;
}
.markdown-body li {
margin: 0.5rem 0;
line-height: 1.7;
padding-left: 0.5rem;
position: relative;
transition: background-color 0.15s ease-out;
}
.markdown-body li:hover {
background-color: color-mix(in srgb, var(--color-surface) 30%, transparent);
border-radius: 0.35rem;
}
.markdown-body li > ul,
.markdown-body li > ol {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
}
/* Unordered list markers */
.markdown-body ul li::marker {
color: var(--color-accent);
font-size: 1.1em;
}
.markdown-body ul {
list-style-type: disc;
}
.markdown-body ul ul {
list-style-type: circle;
}
.markdown-body ul ul ul {
list-style-type: square;
}
/* Ordered list markers */
.markdown-body ol {
list-style-type: decimal;
}
.markdown-body ol li::marker {
color: var(--color-accent);
font-weight: 700;
font-size: 0.95em;
}
.markdown-body ol ol {
list-style-type: lower-alpha;
}
.markdown-body ol ol ol {
list-style-type: lower-roman;
}
/* Better spacing for nested lists */
.markdown-body li > p {
margin-top: 0.35rem;
margin-bottom: 0.35rem;
}
.markdown-body li:first-child {
margin-top: 0;
}
.markdown-body li:last-child {
margin-bottom: 0;
}
/* definition lists */
.markdown-body dl {
margin: 1.5rem 0;
padding: 1.25rem;
border-left: 3px solid var(--color-accent);
background: linear-gradient(
to right,
color-mix(in srgb, var(--color-accent) 8%, transparent),
color-mix(in srgb, var(--color-surface) 40%, transparent) 3rem
);
border-radius: 0.6rem;
}
.markdown-body dt {
font-weight: 650;
color: var(--color-text);
margin-top: 1rem;
margin-bottom: 0.5rem;
font-size: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.markdown-body dt:first-child {
margin-top: 0;
}
.markdown-body dt::before {
content: '▸';
color: var(--color-accent);
font-size: 0.9em;
font-weight: bold;
}
.markdown-body dd {
margin-left: 1.5rem;
margin-bottom: 0.75rem;
padding-left: 1rem;
border-left: 2px solid color-mix(in srgb, var(--color-border) 60%, transparent);
color: var(--color-text-muted);
line-height: 1.7;
}
.markdown-body dd:last-child {
margin-bottom: 0;
}
.markdown-body dd > p {
margin: 0.25rem 0;
}
.markdown-body dd > p:first-child {
margin-top: 0;
}
.markdown-body dd > p:last-child {
margin-bottom: 0;
}
/* task lists */
.markdown-body ul.contains-task-list {
list-style: none;
padding-left: 0;
}
.markdown-body .task-list-item {
display: flex;
align-items: flex-start;
gap: 0.65rem;
padding: 0.5rem 0.75rem;
margin: 0.35rem 0;
border-radius: 0.45rem;
transition: all 0.15s ease-out;
background-color: color-mix(in srgb, var(--color-surface) 20%, transparent);
}
.markdown-body .task-list-item:hover {
background-color: color-mix(in srgb, var(--color-surface) 50%, transparent);
transform: translateX(3px);
}
.markdown-body .task-list-item input[type="checkbox"] {
margin-top: 0.35rem;
flex-shrink: 0;
width: 1.1rem;
height: 1.1rem;
cursor: pointer;
accent-color: var(--color-accent);
border-radius: 0.25rem;
}
.markdown-body .task-list-item input[type="checkbox"]:checked {
accent-color: #22c55e;
}
.markdown-body .task-list-item input[type="checkbox"]:checked + * {
color: var(--color-text-muted);
text-decoration: line-through;
text-decoration-color: var(--color-text-muted);
}
/* blockquote */
.markdown-body blockquote,
.markdown-body .md-blockquote {
margin: 1.75rem 0;
padding: 1.25rem 1.5rem;
border-left: 4px solid var(--color-accent);
background: linear-gradient(
to right,
color-mix(in srgb, var(--color-accent) 8%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-radius: 0.6rem;
color: var(--color-text);
font-style: italic;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
position: relative;
}
.markdown-body blockquote::before,
.markdown-body .md-blockquote::before {
content: '"';
position: absolute;
left: 0.75rem;
top: 0.5rem;
font-size: 2.5rem;
line-height: 1;
color: color-mix(in srgb, var(--color-accent) 25%, transparent);
font-family: Georgia, serif;
font-weight: bold;
}
.markdown-body blockquote p,
.markdown-body .md-blockquote p {
color: var(--color-text);
font-size: 0.98rem;
line-height: 1.7;
}
.markdown-body blockquote p + p,
.markdown-body .md-blockquote p + p {
margin-top: 0.85rem;
}
.markdown-body blockquote strong,
.markdown-body .md-blockquote strong {
color: var(--color-text);
font-weight: 650;
}
/* GitHub-style alerts */
.markdown-body .md-alert {
margin: 1.75rem 0;
padding: 1rem 1.25rem 1rem 3rem;
border-radius: 0.6rem;
border-left: 4px solid;
position: relative;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.markdown-body .md-alert::before {
content: '';
position: absolute;
left: 1rem;
top: 1.1rem;
width: 1.25rem;
height: 1.25rem;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.markdown-body .md-alert p:first-child {
margin-top: 0;
}
.markdown-body .md-alert p:last-child {
margin-bottom: 0;
}
/* Note alert (blue) */
.markdown-body .md-alert-note {
background: linear-gradient(
to right,
color-mix(in srgb, #3b82f6 10%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-left-color: #3b82f6;
}
.markdown-body .md-alert-note::before {
content: '';
display: flex;
align-items: center;
justify-content: center;
font-size: 1rem;
font-weight: bold;
color: #3b82f6;
background: none;
}
/* Tip alert (green) */
.markdown-body .md-alert-tip {
background: linear-gradient(
to right,
color-mix(in srgb, #22c55e 10%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-left-color: #22c55e;
}
.markdown-body .md-alert-tip::before {
content: '💡';
font-size: 1.1rem;
}
/* Important alert (purple) */
.markdown-body .md-alert-important {
background: linear-gradient(
to right,
color-mix(in srgb, var(--color-accent) 12%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-left-color: var(--color-accent);
}
.markdown-body .md-alert-important::before {
content: '⚡';
font-size: 1.1rem;
}
/* Warning alert (yellow/orange) */
.markdown-body .md-alert-warning {
background: linear-gradient(
to right,
color-mix(in srgb, #f59e0b 10%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-left-color: #f59e0b;
}
.markdown-body .md-alert-warning::before {
content: '⚠';
display: flex;
align-items: center;
justify-content: center;
font-size: 1.1rem;
color: #f59e0b;
background: none;
}
/* Danger/Caution alert (red) */
.markdown-body .md-alert-danger,
.markdown-body .md-alert-caution {
background: linear-gradient(
to right,
color-mix(in srgb, #ef4444 10%, transparent),
color-mix(in srgb, var(--color-surface) 60%, transparent) 3rem
);
border-left-color: #ef4444;
}
.markdown-body .md-alert-danger::before,
.markdown-body .md-alert-caution::before {
content: '🛑';
font-size: 1.1rem;
}
/* inline code */
.markdown-body :not(pre) > code {
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.88em;
padding: 0.15rem 0.4rem;
border-radius: 0.35rem;
background: color-mix(in srgb, var(--color-surface) 80%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
color: color-mix(in srgb, var(--color-accent) 90%, white);
}
html[data-theme="light"] .markdown-body :not(pre) > code {
background: #f3f4f6;
border-color: #d1d5db;
color: #7c3aed;
}
/* CODE BLOCKS - This is the important part */
.markdown-body pre {
margin: 1.5rem 0;
padding: 0;
overflow: hidden;
overflow-x: auto;
border-radius: 0.75rem;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
max-width: 100%;
}
html[data-theme="light"] .markdown-body pre {
background: #f9fafb;
border-color: #e5e7eb;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.markdown-body pre code {
display: block;
padding: 1.25rem 1.5rem;
overflow-x: auto;
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.88rem;
line-height: 1.6;
color: var(--color-text);
background: transparent;
border: none;
}
/* Code block with header (language badge) */
.markdown-body .highlight {
position: relative;
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
.markdown-body .highlight pre {
margin: 0;
border: none;
border-radius: 0;
box-shadow: none;
}
/* Custom code block wrapper (if you want header with language/copy button) */
.mb-codeblock {
margin: 1.5rem 0;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
border-radius: 0.75rem;
overflow: hidden;
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.mb-codeblock-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem 1rem;
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
background: color-mix(in srgb, var(--color-bg) 50%, transparent);
}
.mb-codeblock-left {
display: flex;
align-items: center;
gap: 0.5rem;
}
.mb-codeblock-label {
color: var(--color-text-muted);
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.02em;
}
.mb-codeblock-badge {
font-size: 0.7rem;
font-weight: 600;
padding: 0.2rem 0.5rem;
border-radius: 0.35rem;
background: color-mix(in srgb, var(--color-accent) 20%, transparent);
color: var(--color-accent);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.mb-codeblock-actions {
display: flex;
gap: 0.25rem;
}
.mb-codeblock-actions button {
background: transparent;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
color: var(--color-text-muted);
cursor: pointer;
font-size: 0.7rem;
padding: 0.3rem 0.6rem;
border-radius: 0.35rem;
transition: all 0.15s ease-out;
display: flex;
align-items: center;
gap: 0.35rem;
}
.mb-codeblock-actions button:hover {
color: var(--color-accent);
background: color-mix(in srgb, var(--color-accent) 15%, transparent);
border-color: var(--color-accent);
}
.mb-codeblock-content {
position: relative;
}
.mb-codeblock-content pre {
margin: 0;
padding: 1.25rem 1.5rem;
overflow-x: auto;
border: none;
border-radius: 0;
background: transparent;
box-shadow: none;
}
.mb-codeblock-content code {
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.88rem;
line-height: 1.6;
}
/* tables */
.markdown-body table {
width: 100%;
margin: 1.5rem 0;
border-collapse: collapse;
font-size: 0.9rem;
border-radius: 0.75rem;
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
}
.markdown-body thead {
background: color-mix(in srgb, var(--color-surface) 60%, transparent);
}
.markdown-body th {
padding: 0.75rem 1rem;
text-align: left;
font-weight: 600;
color: var(--color-text);
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
}
.markdown-body td {
padding: 0.75rem 1rem;
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
}
.markdown-body tbody tr:last-child td {
border-bottom: none;
}
.markdown-body tbody tr:hover {
background: color-mix(in srgb, var(--color-surface) 30%, transparent);
}
/* hr */
.markdown-body hr {
border: 0;
border-top: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
margin: 2rem 0;
}
/* Custom link with external indicator */
.markdown-body .md-link {
position: relative;
}
.markdown-body a.md-link[target="_blank"]::after {
display: inline-block;
margin-left: 0.25rem;
font-size: 0.85em;
opacity: 0.6;
transition: all 0.15s ease-out;
}
.markdown-body a.md-link[target="_blank"]:hover::after {
opacity: 1;
transform: translate(2px, -2px);
}
/* Heading anchors with hover effect */
.markdown-body .md-heading-anchor {
position: relative;
color: inherit;
text-decoration: none;
border-bottom: none;
padding-bottom: 0;
}
.markdown-body .md-heading-anchor::before {
content: '#';
position: absolute;
left: -1.5rem;
opacity: 0;
color: var(--color-accent);
font-weight: 400;
transition: opacity 0.15s ease-out;
}
.markdown-body h1:hover .md-heading-anchor::before,
.markdown-body h2:hover .md-heading-anchor::before,
.markdown-body h3:hover .md-heading-anchor::before,
.markdown-body h4:hover .md-heading-anchor::before,
.markdown-body h5:hover .md-heading-anchor::before,
.markdown-body h6:hover .md-heading-anchor::before {
opacity: 1;
}
.markdown-body .md-heading-anchor:hover {
color: var(--color-accent);
}
/* Table wrapper for horizontal scrolling */
.markdown-body .table-wrap {
margin: 1.75rem 0;
overflow-x: auto;
border-radius: 0.75rem;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.markdown-body .table-wrap table {
margin: 0;
border: none;
border-radius: 0;
}
/* Custom scrollbar for table wrapper */
.markdown-body .table-wrap::-webkit-scrollbar {
height: 8px;
}
.markdown-body .table-wrap::-webkit-scrollbar-track {
background: color-mix(in srgb, var(--color-bg) 30%, transparent);
border-radius: 0 0 0.75rem 0.75rem;
}
.markdown-body .table-wrap::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--color-accent) 50%, transparent);
border-radius: 4px;
}
.markdown-body .table-wrap::-webkit-scrollbar-thumb:hover {
background: var(--color-accent);
}
/* images */
.markdown-body img {
display: block;
max-width: 100%;
height: auto;
margin: 1.5rem auto;
border-radius: 0.75rem;
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
}
.markdown-body figure {
margin: 1.5rem 0;
text-align: center;
}
.markdown-body figcaption {
margin-top: 0.5rem;
font-size: 0.85rem;
color: var(--color-text-muted);
font-style: italic;
}
/* Custom image wrapper with lightbox */
.markdown-body .md-image {
margin: 2rem 0;
text-align: center;
}
.markdown-body .md-image a {
display: inline-block;
position: relative;
overflow: hidden;
border-radius: 0.85rem;
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
transition: all 0.25s ease-out;
border-bottom: none;
padding-bottom: 0;
}
.markdown-body .md-image a::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
color-mix(in srgb, var(--color-accent) 0%, transparent),
color-mix(in srgb, var(--color-accent) 15%, transparent)
);
opacity: 0;
transition: opacity 0.25s ease-out;
pointer-events: none;
z-index: 1;
}
.markdown-body .md-image a::after {
content: '🔍';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0.8);
font-size: 2.5rem;
opacity: 0;
transition: all 0.25s ease-out;
z-index: 2;
pointer-events: none;
filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.5));
}
.markdown-body .md-image a:hover {
transform: translateY(-4px);
box-shadow: 0 12px 28px rgba(0, 0, 0, 0.25);
border-color: color-mix(in srgb, var(--color-accent) 50%, transparent);
}
.markdown-body .md-image a:hover::before {
opacity: 1;
}
.markdown-body .md-image a:hover::after {
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
.markdown-body .md-image img {
margin: 0;
border: none;
border-radius: 0.75rem;
display: block;
transition: all 0.25s ease-out;
}
.markdown-body .md-image a:hover img {
filter: brightness(0.85);
}
.markdown-body .md-image figcaption {
display: none;
}
/* SYNTAX HIGHLIGHTING - Dark theme colors */
/* These will be applied by Hugo's Chroma */
.markdown-body .chroma {
background: transparent;
}
.markdown-body .chroma .err {
color: #f87171;
}
.markdown-body .chroma .lntd {
padding: 0;
}
.markdown-body .chroma .lntable {
border-spacing: 0;
}
/* Chroma syntax colors for dark theme */
html[data-theme="dark"] .markdown-body .chroma .k {
color: #c084fc;
}
/* keyword - purple */
html[data-theme="dark"] .markdown-body .chroma .kc {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .kd {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .kn {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .kp {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .kr {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .kt {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .n {
color: #e5e7eb;
}
html[data-theme="dark"] .markdown-body .chroma .na {
color: #fbbf24;
}
html[data-theme="dark"] .markdown-body .chroma .nb {
color: #60a5fa;
}
html[data-theme="dark"] .markdown-body .chroma .nc {
color: #fbbf24;
}
html[data-theme="dark"] .markdown-body .chroma .nf {
color: #60a5fa;
}
html[data-theme="dark"] .markdown-body .chroma .nn {
color: #fbbf24;
}
html[data-theme="dark"] .markdown-body .chroma .s {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .s1 {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .s2 {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .sb {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .sc {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .sd {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .se {
color: #fbbf24;
}
html[data-theme="dark"] .markdown-body .chroma .si {
color: #fbbf24;
}
html[data-theme="dark"] .markdown-body .chroma .sr {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .ss {
color: #86efac;
}
html[data-theme="dark"] .markdown-body .chroma .m {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .mb {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .mf {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .mh {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .mi {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .mo {
color: #fb923c;
}
html[data-theme="dark"] .markdown-body .chroma .o {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .ow {
color: #c084fc;
}
html[data-theme="dark"] .markdown-body .chroma .c {
color: #6b7280;
font-style: italic;
}
html[data-theme="dark"] .markdown-body .chroma .c1 {
color: #6b7280;
font-style: italic;
}
html[data-theme="dark"] .markdown-body .chroma .cm {
color: #6b7280;
font-style: italic;
}
html[data-theme="dark"] .markdown-body .chroma .p {
color: #9ca3af;
}
html[data-theme="dark"] .markdown-body .chroma .g {
color: #ef4444;
}
html[data-theme="dark"] .markdown-body .chroma .gd {
color: #ef4444;
}
html[data-theme="dark"] .markdown-body .chroma .ge {
font-style: italic;
}
html[data-theme="dark"] .markdown-body .chroma .gi {
color: #22c55e;
}
html[data-theme="dark"] .markdown-body .chroma .gs {
font-weight: bold;
}
/* SYNTAX HIGHLIGHTING - Light theme colors */
html[data-theme="light"] .markdown-body .chroma .k {
color: #7c3aed;
}
/* keyword - purple */
html[data-theme="light"] .markdown-body .chroma .kc {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .kd {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .kn {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .kp {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .kr {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .kt {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .n {
color: #1f2937;
}
html[data-theme="light"] .markdown-body .chroma .na {
color: #d97706;
}
html[data-theme="light"] .markdown-body .chroma .nb {
color: #2563eb;
}
html[data-theme="light"] .markdown-body .chroma .nc {
color: #d97706;
}
html[data-theme="light"] .markdown-body .chroma .nf {
color: #2563eb;
}
html[data-theme="light"] .markdown-body .chroma .nn {
color: #d97706;
}
html[data-theme="light"] .markdown-body .chroma .s {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .s1 {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .s2 {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .sb {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .sc {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .sd {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .se {
color: #d97706;
}
html[data-theme="light"] .markdown-body .chroma .si {
color: #d97706;
}
html[data-theme="light"] .markdown-body .chroma .sr {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .ss {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .m {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .mb {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .mf {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .mh {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .mi {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .mo {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .o {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .ow {
color: #7c3aed;
}
html[data-theme="light"] .markdown-body .chroma .c {
color: #6b7280;
font-style: italic;
}
html[data-theme="light"] .markdown-body .chroma .c1 {
color: #6b7280;
font-style: italic;
}
html[data-theme="light"] .markdown-body .chroma .cm {
color: #6b7280;
font-style: italic;
}
html[data-theme="light"] .markdown-body .chroma .p {
color: #4b5563;
}
html[data-theme="light"] .markdown-body .chroma .g {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .gd {
color: #dc2626;
}
html[data-theme="light"] .markdown-body .chroma .ge {
font-style: italic;
}
html[data-theme="light"] .markdown-body .chroma .gi {
color: #16a34a;
}
html[data-theme="light"] .markdown-body .chroma .gs {
font-weight: bold;
}
.mb-codeblock {
margin: 1.75rem 0;
border: 1px solid color-mix(in srgb, var(--color-border) 65%, transparent);
border-radius: 0.85rem;
overflow: hidden;
background: color-mix(in srgb, var(--color-surface) 35%, transparent);
box-shadow:
0 4px 6px rgba(0, 0, 0, 0.1),
0 10px 20px rgba(0, 0, 0, 0.15);
transition: box-shadow 0.2s ease-out;
}
.mb-codeblock:hover {
box-shadow:
0 4px 6px rgba(0, 0, 0, 0.15),
0 12px 24px rgba(0, 0, 0, 0.2);
}
html[data-theme="light"] .mb-codeblock {
background: #f9fafb;
border-color: #e5e7eb;
box-shadow:
0 2px 4px rgba(0, 0, 0, 0.05),
0 4px 8px rgba(0, 0, 0, 0.08);
}
html[data-theme="light"] .mb-codeblock:hover {
box-shadow:
0 4px 8px rgba(0, 0, 0, 0.08),
0 8px 16px rgba(0, 0, 0, 0.12);
}
.mb-codeblock-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.7rem 1rem;
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 55%, transparent);
background: color-mix(in srgb, var(--color-bg) 45%, transparent);
gap: 1rem;
}
html[data-theme="light"] .mb-codeblock-header {
background: #f3f4f6;
border-bottom-color: #e5e7eb;
}
.mb-codeblock-left {
display: flex;
align-items: center;
gap: 0.6rem;
min-width: 0;
flex: 1;
}
.mb-codeblock-badge {
font-size: 0.68rem;
font-weight: 700;
padding: 0.25rem 0.55rem;
border-radius: 0.35rem;
background: color-mix(in srgb, var(--color-accent) 22%, transparent);
color: var(--color-accent);
text-transform: uppercase;
letter-spacing: 0.06em;
white-space: nowrap;
border: 1px solid color-mix(in srgb, var(--color-accent) 35%, transparent);
}
.mb-codeblock-filename {
display: inline-flex;
align-items: center;
gap: 0.4rem;
color: var(--color-text);
font-size: 0.75rem;
font-weight: 500;
padding: 0.2rem 0.65rem;
border-radius: 0.35rem;
background: color-mix(in srgb, var(--color-bg) 35%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 20rem;
}
.mb-codeblock-actions {
display: flex;
gap: 0.4rem;
flex-shrink: 0;
}
.mb-action-btn {
display: inline-flex;
align-items: center;
gap: 0.35rem;
background: transparent;
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
color: var(--color-text-muted);
cursor: pointer;
font-size: 0.7rem;
font-weight: 500;
padding: 0.35rem 0.7rem;
border-radius: 0.4rem;
transition: all 0.15s ease-out;
font-family: inherit;
white-space: nowrap;
}
.mb-action-btn:hover {
color: var(--color-accent);
background: color-mix(in srgb, var(--color-accent) 12%, transparent);
border-color: var(--color-accent);
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(168, 85, 247, 0.2);
}
.mb-action-btn:active {
transform: translateY(0);
}
.mb-action-btn i {
font-size: 0.7rem;
}
.mb-btn-success {
color: #22c55e !important;
border-color: #22c55e !important;
background: color-mix(in srgb, #22c55e 15%, transparent) !important;
}
.mb-codeblock-content {
position: relative;
background: color-mix(in srgb, var(--color-bg) 20%, transparent);
transition: max-height 0.3s ease-out;
}
html[data-theme="light"] .mb-codeblock-content {
background: #ffffff;
}
.mb-codeblock-content pre {
margin: 0;
padding: 1.25rem 1.5rem;
overflow-x: auto;
background: transparent;
border: none;
}
.mb-codeblock-content pre code {
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 0.88rem;
line-height: 1.65;
font-weight: 400;
}
/* Custom scrollbar for code blocks */
.mb-codeblock-content pre::-webkit-scrollbar {
height: 8px;
}
.mb-codeblock-content pre::-webkit-scrollbar-track {
background: color-mix(in srgb, var(--color-bg) 30%, transparent);
border-radius: 4px;
}
.mb-codeblock-content pre::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--color-border) 70%, transparent);
border-radius: 4px;
}
.mb-codeblock-content pre::-webkit-scrollbar-thumb:hover {
background: var(--color-accent);
}
/* Collapse overlay */
.mb-collapse-overlay {
display: none;
position: absolute;
inset: 0;
background: linear-gradient(
to bottom,
transparent 0%,
rgba(0, 0, 0, 0.25) 35%,
rgba(0, 0, 0, 0.88) 100%
);
align-items: flex-end;
justify-content: center;
padding-bottom: 1.2rem;
cursor: pointer;
z-index: 10;
backdrop-filter: blur(1px);
}
.mb-expand-trigger {
display: inline-flex;
align-items: center;
gap: 0.45rem;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
border: 1px solid var(--color-accent);
background: color-mix(in srgb, var(--color-accent) 18%, transparent);
color: var(--color-accent);
font-size: 0.75rem;
font-weight: 650;
cursor: pointer;
transition: all 0.15s ease-out;
backdrop-filter: blur(10px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.mb-expand-trigger:hover {
background: color-mix(in srgb, var(--color-accent) 28%, transparent);
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(168, 85, 247, 0.35);
border-color: color-mix(in srgb, var(--color-accent) 90%, white);
}
.mb-expand-trigger i {
font-size: 0.7rem;
animation: bounce-icon 1.8s ease-in-out infinite;
}
@keyframes bounce-icon {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(4px);
}
}
.mb-codeblock[data-lang="javascript"] .mb-codeblock-badge,
.mb-codeblock[data-lang="js"] .mb-codeblock-badge {
background: color-mix(in srgb, #f7df1e 28%, transparent);
color: #f7df1e;
border-color: color-mix(in srgb, #f7df1e 40%, transparent);
}
.mb-codeblock[data-lang="typescript"] .mb-codeblock-badge,
.mb-codeblock[data-lang="ts"] .mb-codeblock-badge {
background: color-mix(in srgb, #3178c6 28%, transparent);
color: #60a5fa;
border-color: color-mix(in srgb, #3178c6 40%, transparent);
}
.mb-codeblock[data-lang="python"] .mb-codeblock-badge,
.mb-codeblock[data-lang="py"] .mb-codeblock-badge {
background: color-mix(in srgb, #3776ab 28%, transparent);
color: #60a5fa;
border-color: color-mix(in srgb, #3776ab 40%, transparent);
}
.mb-codeblock[data-lang="go"] .mb-codeblock-badge {
background: color-mix(in srgb, #00add8 28%, transparent);
color: #22d3ee;
border-color: color-mix(in srgb, #00add8 40%, transparent);
}
.mb-codeblock[data-lang="rust"] .mb-codeblock-badge,
.mb-codeblock[data-lang="rs"] .mb-codeblock-badge {
background: color-mix(in srgb, #ce422b 28%, transparent);
color: #fb923c;
border-color: color-mix(in srgb, #ce422b 40%, transparent);
}
.mb-codeblock[data-lang="html"] .mb-codeblock-badge {
background: color-mix(in srgb, #e34c26 28%, transparent);
color: #f87171;
border-color: color-mix(in srgb, #e34c26 40%, transparent);
}
.mb-codeblock[data-lang="css"] .mb-codeblock-badge {
background: color-mix(in srgb, #264de4 28%, transparent);
color: #60a5fa;
border-color: color-mix(in srgb, #264de4 40%, transparent);
}
.mb-codeblock[data-lang="bash"] .mb-codeblock-badge,
.mb-codeblock[data-lang="sh"] .mb-codeblock-badge,
.mb-codeblock[data-lang="shell"] .mb-codeblock-badge {
background: color-mix(in srgb, #4eaa25 28%, transparent);
color: #86efac;
border-color: color-mix(in srgb, #4eaa25 40%, transparent);
}
.mb-codeblock[data-lang="json"] .mb-codeblock-badge {
background: color-mix(in srgb, #888888 28%, transparent);
color: #d1d5db;
border-color: color-mix(in srgb, #888888 40%, transparent);
}
.mb-codeblock[data-lang="yaml"] .mb-codeblock-badge,
.mb-codeblock[data-lang="yml"] .mb-codeblock-badge {
background: color-mix(in srgb, #cb171e 28%, transparent);
color: #fca5a5;
border-color: color-mix(in srgb, #cb171e 40%, transparent);
}
.mb-codeblock[data-lang="java"] .mb-codeblock-badge {
background: color-mix(in srgb, #f89820 28%, transparent);
color: #fbbf24;
border-color: color-mix(in srgb, #f89820 40%, transparent);
}
.mb-codeblock[data-lang="cpp"] .mb-codeblock-badge,
.mb-codeblock[data-lang="c++"] .mb-codeblock-badge {
background: color-mix(in srgb, #00599c 28%, transparent);
color: #60a5fa;
border-color: color-mix(in srgb, #00599c 40%, transparent);
}
.mb-codeblock[data-lang="c"] .mb-codeblock-badge {
background: color-mix(in srgb, #555555 28%, transparent);
color: #9ca3af;
border-color: color-mix(in srgb, #555555 40%, transparent);
}
.mb-codeblock[data-lang="ruby"] .mb-codeblock-badge,
.mb-codeblock[data-lang="rb"] .mb-codeblock-badge {
background: color-mix(in srgb, #cc342d 28%, transparent);
color: #f87171;
border-color: color-mix(in srgb, #cc342d 40%, transparent);
}
.mb-codeblock[data-lang="php"] .mb-codeblock-badge {
background: color-mix(in srgb, #777bb4 28%, transparent);
color: #a78bfa;
border-color: color-mix(in srgb, #777bb4 40%, transparent);
}
.mb-codeblock[data-lang="sql"] .mb-codeblock-badge {
background: color-mix(in srgb, #e38c00 28%, transparent);
color: #fbbf24;
border-color: color-mix(in srgb, #e38c00 40%, transparent);
}
/* Responsive adjustments */
@media (max-width: 640px) {
.mb-codeblock-header {
flex-direction: column;
align-items: flex-start;
gap: 0.6rem;
}
.mb-codeblock-actions {
width: 100%;
justify-content: flex-end;
}
.mb-action-btn span {
display: none;
}
.mb-action-btn {
padding: 0.4rem;
width: 2rem;
height: 2rem;
justify-content: center;
}
.mb-codeblock-filename {
max-width: 100%;
}
}
@keyframes tech-marquee {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
@media (prefers-reduced-motion: reduce) {
.tech-strip-track {
animation: none;
}
}
/* gallery */
.markdown-body .gallery-container {
margin: 2rem 0;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}
@media (max-width: 640px) {
.markdown-body .gallery-container {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 0.75rem;
}
}
.markdown-body .gallery-container a {
display: block;
border: none !important;
padding: 0;
margin: 0;
border-radius: 0.5rem;
overflow: hidden;
transition: all 0.2s ease-out;
position: relative;
cursor: zoom-in;
aspect-ratio: 4/3;
}
.markdown-body .gallery-container a:hover {
transform: translateY(-2px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
.markdown-body .gallery-container img {
display: block;
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
margin: 0;
border: none;
border-radius: 0.5rem;
transition: all 0.2s ease-out;
}
.markdown-body .gallery-container a:hover img {
filter: brightness(0.9);
}
/* ==================== */
/* ABOUT PAGE */
/* ==================== */
/* ==========================================================================
TABLE OF CONTENTS
TOC sidebar, active link tracking, responsive behavior
========================================================================== */
.article-layout {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
position: relative;
min-width: 0;
}
@media (min-width: 1024px) {
.article-layout {
grid-template-columns: 260px 1fr;
gap: 3rem;
}
.article-toc {
order: 1;
}
.article-main {
order: 2;
}
}
.article-main {
min-width: 0;
overflow-x: hidden;
}
.article-toc {
width: 100%;
}
.toc-wrapper {
position: sticky;
top: 2rem;
background: color-mix(in srgb, var(--color-surface) 50%, transparent);
border: 1px solid var(--color-border);
border-radius: 0.85rem;
padding: 1rem;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
backdrop-filter: blur(10px);
transition: all 0.2s ease-out;
max-height: calc(100vh - 24rem);
overflow: hidden;
display: flex;
flex-direction: column;
}
.toc-wrapper:hover {
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);
}
.toc-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.75rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
}
.toc-title {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.85rem;
font-weight: 650;
color: var(--color-text);
margin: 0;
}
.toc-title i {
color: var(--color-accent);
font-size: 0.75rem;
}
.toc-toggle {
display: flex;
background: transparent;
border: 1px solid var(--color-border);
color: var(--color-text-muted);
width: 1.75rem;
height: 1.75rem;
border-radius: 0.4rem;
cursor: pointer;
transition: all 0.15s ease-out;
align-items: center;
justify-content: center;
}
.toc-toggle:hover {
color: var(--color-accent);
border-color: var(--color-accent);
background: color-mix(in srgb, var(--color-accent) 10%, transparent);
}
.toc-toggle i {
font-size: 0.7rem;
transition: transform 0.2s ease-out;
}
.toc-wrapper.collapsed .toc-toggle i {
transform: rotate(-90deg);
}
.toc-wrapper.collapsed .toc-nav {
max-height: 0;
opacity: 0;
overflow: hidden;
}
@media (max-width: 1023px) {
.toc-wrapper {
position: relative;
top: 0;
}
}
.toc-nav {
font-size: 0.8rem;
line-height: 1.6;
transition: all 0.3s ease-out;
overflow-y: auto;
overflow-x: hidden;
flex: 1;
min-height: 0;
}
/* Custom scrollbar for TOC */
.toc-nav::-webkit-scrollbar {
width: 6px;
}
.toc-nav::-webkit-scrollbar-track {
background: color-mix(in srgb, var(--color-bg) 30%, transparent);
border-radius: 3px;
}
.toc-nav::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--color-border) 70%, transparent);
border-radius: 3px;
}
.toc-nav::-webkit-scrollbar-thumb:hover {
background: var(--color-accent);
}
.toc-nav > ul {
list-style: none;
padding-left: 0;
margin: 0;
}
.toc-nav ul {
list-style: none;
margin: 0;
}
.toc-nav ul ul {
padding-left: 1rem;
margin-top: 0.25rem;
border-left: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
}
.toc-nav li {
margin: 0.35rem 0;
padding-left: 0;
}
.toc-nav li:hover {
background: none;
}
.toc-nav a {
display: block;
padding: 0.35rem 0.5rem;
color: var(--color-text-muted);
text-decoration: none;
border-left: 2px solid transparent;
border-radius: 0.35rem;
transition: all 0.15s ease-out;
border-bottom: none;
}
.toc-nav a:hover {
color: var(--color-text);
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
border-left-color: var(--color-accent);
transform: translateX(3px);
}
.toc-nav a.active {
color: var(--color-accent);
background: color-mix(in srgb, var(--color-accent) 12%, transparent);
border-left-color: var(--color-accent);
font-weight: 600;
}
/* Mobile: TOC appears at top */
@media (max-width: 1023px) {
.article-toc {
order: -1;
margin-bottom: 1.5rem;
}
}
/* Pages */
/* ==========================================================================
ABOUT PAGE STYLES
Standard about page with timeline
========================================================================== */
.about-page {
max-width: 900px;
margin-inline: auto;
}
.about-hero {
text-align: center;
padding: 3rem 0 4rem;
position: relative;
}
.about-hero::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 60px;
height: 3px;
background: linear-gradient(
90deg,
transparent,
var(--color-accent),
transparent
);
border-radius: 999px;
}
.about-hero-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 1.5rem;
}
.about-avatar,
.about-avatar-placeholder {
width: 140px;
height: 140px;
border-radius: 50%;
overflow: hidden;
border: 3px solid var(--color-accent);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2),
0 0 0 8px color-mix(in srgb, var(--color-accent) 15%, transparent);
transition: all 0.3s ease-out;
}
.about-avatar:hover,
.about-avatar-placeholder:hover {
transform: translateY(-4px) scale(1.02);
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.3),
0 0 0 12px color-mix(in srgb, var(--color-accent) 20%, transparent);
}
.about-avatar img {
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
}
.about-avatar-placeholder {
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(
135deg,
color-mix(in srgb, var(--color-accent) 20%, transparent),
color-mix(in srgb, var(--color-accent) 10%, transparent)
);
backdrop-filter: blur(10px);
}
.about-avatar-placeholder i {
font-size: 4rem;
color: var(--color-accent);
}
.about-title {
font-size: 2.5rem;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--color-text);
margin: 0;
line-height: 1.2;
}
.about-subtitle {
font-size: 1.1rem;
color: var(--color-text-muted);
max-width: 600px;
line-height: 1.6;
margin: 0;
}
.about-content {
margin-bottom: 4rem;
}
.about-content .card {
background: color-mix(in srgb, var(--color-surface) 60%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
padding: 2rem;
}
.about-content .markdown-body h3 {
display: flex;
align-items: center;
gap: 0.75rem;
margin-top: 2.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid color-mix(in srgb, var(--color-accent) 30%, transparent);
}
.about-content .markdown-body h3::before {
content: '';
display: inline-block;
width: 4px;
height: 1.5rem;
background: var(--color-accent);
border-radius: 999px;
}
/* Timeline */
.timeline {
position: relative;
padding: 2rem 0 1rem 0;
margin-top: 2rem;
}
.timeline::before {
content: '';
position: absolute;
left: 20px;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(
to bottom,
transparent,
var(--color-accent) 10%,
var(--color-accent) 90%,
transparent
);
}
.timeline-item {
position: relative;
padding-left: 60px;
margin-bottom: 3rem;
}
.timeline-item:last-child {
margin-bottom: 0;
}
.timeline-marker {
position: absolute;
left: 0;
top: 8px;
width: 42px;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
}
.timeline-marker::before {
content: '';
position: absolute;
width: 16px;
height: 16px;
background: var(--color-accent);
border-radius: 50%;
border: 3px solid var(--color-bg);
box-shadow:
0 0 0 4px color-mix(in srgb, var(--color-accent) 20%, transparent),
0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease-out;
}
.timeline-item:hover .timeline-marker::before {
transform: scale(1.3);
box-shadow:
0 0 0 6px color-mix(in srgb, var(--color-accent) 30%, transparent),
0 6px 16px rgba(0, 0, 0, 0.4);
}
.timeline-content {
background: color-mix(in srgb, var(--color-surface) 30%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
border-radius: 0.85rem;
padding: 1.5rem;
transition: all 0.3s ease-out;
position: relative;
overflow: hidden;
}
.timeline-content::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background: var(--color-accent);
opacity: 0;
transition: opacity 0.3s ease-out;
}
.timeline-item:hover .timeline-content {
background: color-mix(in srgb, var(--color-surface) 50%, transparent);
border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);
transform: translateX(4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
}
.timeline-item:hover .timeline-content::before {
opacity: 1;
}
.timeline-content > p:first-child {
margin-top: 0;
}
.timeline-content > p:last-child {
margin-bottom: 0;
}
.timeline-content strong {
font-size: 1.1rem;
color: var(--color-text);
display: block;
margin-bottom: 0.25rem;
}
.timeline-content em {
font-size: 0.85rem;
color: var(--color-text-muted);
font-style: normal;
display: block;
margin-bottom: 0.75rem;
}
.timeline-content a {
color: var(--color-accent);
}
/* Remove hr from timeline */
.timeline hr {
display: none;
}
.about-social {
text-align: center;
padding: 3rem 2rem;
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
border-radius: 1.25rem;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
}
.about-social-title {
font-size: 1.25rem;
font-weight: 650;
color: var(--color-text);
margin-bottom: 1.5rem;
}
.about-social-links {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 1rem;
}
.about-social-link {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem;
border-radius: 999px;
background: color-mix(in srgb, var(--color-bg) 60%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 70%, transparent);
color: var(--color-text-muted);
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
transition: all 0.2s ease-out;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.about-social-link:hover {
transform: translateY(-2px);
background: color-mix(in srgb, var(--color-surface) 80%, transparent);
border-color: var(--color-accent);
color: var(--color-accent);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
}
.about-social-link i {
font-size: 1.1rem;
}
/* Responsive about page */
@media (max-width: 640px) {
.about-hero {
padding: 2rem 0 3rem;
}
.about-avatar,
.about-avatar-placeholder {
width: 110px;
height: 110px;
}
.about-avatar-placeholder i {
font-size: 3rem;
}
.about-title {
font-size: 2rem;
}
.about-subtitle {
font-size: 1rem;
}
.about-social {
padding: 2rem 1.25rem;
}
.about-social-links {
flex-direction: column;
align-items: stretch;
}
.about-social-link {
justify-content: center;
}
/* Timeline responsive */
.timeline::before {
left: 12px;
}
.timeline-item {
padding-left: 40px;
}
.timeline-marker {
left: -5px;
width: 34px;
height: 34px;
}
.timeline-marker::before {
width: 12px;
height: 12px;
}
.timeline-content {
padding: 1rem;
}
.timeline-content strong {
font-size: 1rem;
}
.timeline-content em {
font-size: 0.8rem;
}
}
/* ==========================================================================
ABOUT ALTERNATIVE PAGE STYLES
Alternative about page with sidebar profile card
========================================================================== */
.page-int, .about-alt-page {
max-width: 1200px;
margin-inline: auto;
}
.about-alt-layout {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
padding: 2rem 0;
}
@media (min-width: 1024px) {
.about-alt-layout {
grid-template-columns: 320px 1fr;
gap: 3rem;
}
}
/* Profile Card - Left Sidebar */
.about-alt-sidebar {
position: relative;
}
.about-alt-profile-card {
background: linear-gradient(
135deg,
color-mix(in srgb, var(--color-surface) 70%, transparent),
color-mix(in srgb, var(--color-surface) 50%, transparent)
);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
border-radius: 1.5rem;
padding: 2rem;
text-align: center;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
position: sticky;
top: 2rem;
}
.about-alt-avatar,
.about-alt-avatar-placeholder {
width: 120px;
height: 120px;
border-radius: 50%;
margin: 0 auto 1.5rem;
overflow: hidden;
border: 4px solid var(--color-accent);
box-shadow: 0 0 0 8px color-mix(in srgb, var(--color-accent) 15%, transparent);
transition: all 0.3s ease-out;
}
.about-alt-avatar:hover,
.about-alt-avatar-placeholder:hover {
transform: scale(1.05);
box-shadow: 0 0 0 12px color-mix(in srgb, var(--color-accent) 20%, transparent);
}
.about-alt-avatar img {
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
}
.about-alt-avatar-placeholder {
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(
135deg,
color-mix(in srgb, var(--color-accent) 30%, transparent),
color-mix(in srgb, var(--color-accent) 15%, transparent)
);
}
.about-alt-avatar-placeholder i {
font-size: 3rem;
color: var(--color-accent);
}
.about-alt-name {
font-size: 1.75rem;
font-weight: 700;
color: var(--color-text);
margin-bottom: 0.5rem;
}
.about-alt-role {
font-size: 0.9rem;
color: var(--color-text-muted);
line-height: 1.5;
margin-bottom: 1rem;
}
.about-alt-meta {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
font-size: 0.85rem;
color: var(--color-text-muted);
margin-bottom: 1.5rem;
}
.about-alt-meta i {
color: var(--color-accent);
}
/* Stats Grid */
.about-alt-stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
margin: 2rem 0;
padding: 1.5rem 0;
border-top: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
border-bottom: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
}
.about-alt-stat {
text-align: center;
}
.about-alt-stat-value {
font-size: 1.75rem;
font-weight: 700;
color: var(--color-accent);
margin-bottom: 0.25rem;
}
.about-alt-stat-label {
font-size: 0.7rem;
color: var(--color-text-muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Social Icons */
.about-alt-social {
display: flex;
justify-content: center;
gap: 0.75rem;
margin-top: 1.5rem;
}
.about-alt-social-icon {
display: flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
border-radius: 50%;
background: color-mix(in srgb, var(--color-bg) 50%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
color: var(--color-text-muted);
transition: all 0.2s ease-out;
}
.about-alt-social-icon:hover {
background: var(--color-accent);
border-color: var(--color-accent);
color: white;
transform: translateY(-3px);
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3);
}
.about-alt-social-icon i {
font-size: 1rem;
}
/* Content Area */
.about-alt-content {
display: flex;
flex-direction: column;
gap: 2rem;
}
.about-alt-section {
background: color-mix(in srgb, var(--color-surface) 40%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
border-radius: 1.25rem;
padding: 2rem;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
.about-alt-section-title {
display: flex;
align-items: center;
gap: 0.75rem;
font-size: 1.5rem;
font-weight: 700;
color: var(--color-text);
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 2px solid color-mix(in srgb, var(--color-accent) 20%, transparent);
}
.about-alt-section-title i {
color: var(--color-accent);
font-size: 1.25rem;
}
/* Experience Cards Grid */
.about-alt-experience-grid {
display: grid;
gap: 1.5rem;
}
.about-alt-experience-card {
background: color-mix(in srgb, var(--color-bg) 40%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 50%, transparent);
border-left: 4px solid var(--color-accent);
border-radius: 0.85rem;
padding: 1.5rem;
transition: all 0.3s ease-out;
position: relative;
overflow: hidden;
}
.about-alt-experience-card::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 100px;
height: 100px;
background: radial-gradient(
circle at center,
color-mix(in srgb, var(--color-accent) 10%, transparent),
transparent 70%
);
opacity: 0;
transition: opacity 0.3s ease-out;
}
.about-alt-experience-card:hover {
border-left-width: 6px;
transform: translateX(6px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
}
.about-alt-experience-card:hover::before {
opacity: 1;
}
.about-alt-experience-card p:first-child {
margin-top: 0;
}
.about-alt-experience-card p:last-child {
margin-bottom: 0;
}
.about-alt-experience-card strong {
font-size: 1.1rem;
color: var(--color-text);
display: block;
margin-bottom: 0.25rem;
}
.about-alt-experience-card em {
font-size: 0.85rem;
color: var(--color-text-muted);
font-style: normal;
display: block;
margin-bottom: 0.75rem;
}
/* Skills Badge Cloud */
.about-alt-skills {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.about-alt-skill {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
background: color-mix(in srgb, var(--color-bg) 50%, transparent);
border: 1px solid color-mix(in srgb, var(--color-border) 60%, transparent);
border-radius: 999px;
font-size: 0.85rem;
font-weight: 500;
color: var(--color-text);
transition: all 0.2s ease-out;
cursor: default;
}
.about-alt-skill i {
font-size: 1.1em;
opacity: 0.9;
}
.about-alt-skill:hover {
background: var(--color-accent);
border-color: var(--color-accent);
color: white;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.about-alt-skill:hover i {
opacity: 1;
}
/* Responsive */
@media (max-width: 1023px) {
.about-alt-profile-card {
position: relative;
top: 0;
}
.about-alt-layout {
grid-template-columns: 1fr;
}
}
@media (max-width: 640px) {
.about-alt-profile-card {
padding: 1.5rem;
}
.about-alt-avatar,
.about-alt-avatar-placeholder {
width: 100px;
height: 100px;
}
.about-alt-name {
font-size: 1.5rem;
}
.about-alt-stats {
gap: 0.75rem;
}
.about-alt-stat-value {
font-size: 1.5rem;
}
.about-alt-section {
padding: 1.5rem;
}
.about-alt-section-title {
font-size: 1.25rem;
}
.about-alt-experience-card {
padding: 1.25rem;
}
}
/* ==================== */
/* TABLE OF CONTENTS */
/* ==================== */
/* Responsive Styles */
/* ==========================================================================
RESPONSIVE STYLES
Global responsive breakpoints and mobile optimizations
========================================================================== */
/* Mobile - Small screens (up to 640px) */
@media (max-width: 640px) {
.card-pad {
padding: 1.25rem;
}
.layout-page {
padding-inline: 1rem;
padding-block: 1.5rem;
}
.layout-page-tight {
padding-inline: 1rem;
padding-block: 1rem;
}
/* Markdown body */
.markdown-body {
font-size: 0.9rem;
padding: 0;
}
/* Headings - scale down for mobile */
.markdown-body h1 {
font-size: 1.75rem;
}
.markdown-body h2 {
font-size: 1.35rem;
margin-top: 2rem;
}
.markdown-body h3 {
font-size: 1.15rem;
margin-top: 1.5rem;
}
.markdown-body h4 {
font-size: 1rem;
}
.markdown-body h5,
.markdown-body h6 {
font-size: 0.9rem;
}
/* Heading anchors - adjust for smaller screens */
.markdown-body .md-heading-anchor::before {
left: -1rem;
font-size: 0.85em;
}
/* Blockquotes */
.markdown-body blockquote,
.markdown-body .md-blockquote {
margin: 1.25rem 0;
padding: 1rem;
border-left-width: 3px;
}
.markdown-body blockquote::before,
.markdown-body .md-blockquote::before {
font-size: 2rem;
left: 0.5rem;
top: 0.25rem;
}
/* Alerts */
.markdown-body .md-alert {
padding: 0.85rem 1rem 0.85rem 2.5rem;
}
.markdown-body .md-alert::before {
left: 0.75rem;
top: 0.95rem;
font-size: 0.95rem;
}
/* Lists */
.markdown-body ul,
.markdown-body ol {
padding-left: 1.25rem;
}
/* Code blocks */
.markdown-body pre {
margin: 1rem -1rem;
border-radius: 0.5rem;
}
.markdown-body pre code {
font-size: 0.8rem;
padding: 1rem;
}
.mb-codeblock {
margin: 1.25rem -1rem;
border-radius: 0.5rem;
}
.mb-codeblock-content pre {
padding: 1rem;
}
.mb-codeblock-content pre code {
font-size: 0.8rem;
}
/* Inline code */
.markdown-body :not(pre) > code {
font-size: 0.85em;
padding: 0.1rem 0.35rem;
}
/* Tables - full bleed on mobile */
.markdown-body table {
font-size: 0.85rem;
}
.markdown-body th,
.markdown-body td {
padding: 0.5rem 0.65rem;
}
.markdown-body .table-wrap {
margin: 1.25rem -1rem;
border-radius: 0.5rem;
}
/* Images */
.markdown-body img,
.markdown-body .md-image {
margin: 1.25rem 0;
}
.markdown-body .md-image a {
border-radius: 0.5rem;
}
.markdown-body .md-image a::after {
font-size: 2rem;
}
.markdown-body .md-image figcaption {
font-size: 0.82rem;
padding: 0.4rem 0.75rem;
}
/* Page heading */
.heading-page {
font-size: 1.75rem !important;
line-height: 1.2;
}
/* Article header */
.article-main header {
padding: 0;
}
/* TOC on mobile */
.toc-wrapper {
border-radius: 0.75rem;
padding: 0.85rem;
}
.toc-nav {
font-size: 0.85rem;
}
}
/* Tablet - Medium screens (641px to 1023px) */
@media (min-width: 641px) and (max-width: 1023px) {
.article-layout {
display: flex;
flex-wrap: wrap;
}
.article-main {
max-width: -webkit-fill-available;
}
.layout-page {
padding-inline: 1.5rem;
padding-block: 2rem;
}
.markdown-body {
font-size: 0.93rem;
}
.markdown-body h1 {
font-size: 1.85rem;
}
.markdown-body h2 {
font-size: 1.4rem;
}
.markdown-body h3 {
font-size: 1.2rem;
}
}
/* Larger screens - Adjust max-widths */
@media (min-width: 1536px) {
.article-layout {
padding-inline: 2rem;
}
}
/* Ultra-wide screens */
@media (min-width: 1920px) {
.markdown-body {
font-size: 1rem;
}
}
/* Touch device improvements */
@media (hover: none) and (pointer: coarse) {
/* Increase tap targets for touch */
.toc-nav a {
padding: 0.5rem 0.65rem;
margin: 0.15rem 0;
}
.toc-toggle {
width: 2.5rem;
height: 2.5rem;
}
.mb-action-btn {
padding: 0.5rem 0.85rem;
font-size: 0.75rem;
}
/* Remove hover effects on touch devices */
.markdown-body li:hover {
background: none;
}
.card-hover:hover {
transform: none;
box-shadow: none;
}
}
/* Landscape mobile */
@media (max-height: 500px) and (orientation: landscape) {
.toc-wrapper {
position: relative;
top: 0;
}
.layout-page {
padding-block: 1rem;
}
}
.last\:border-0:last-child {
border-width: 0px;
}
.hover\:text-accent:hover {
color: var(--color-accent);
}
.group:hover .group-hover\:text-accent {
color: var(--color-accent);
}
@media (min-width: 640px) {
.sm\:h-28 {
height: 7rem;
}
.sm\:w-28 {
width: 7rem;
}
.sm\:px-6 {
padding-left: 1.5rem;
padding-right: 1.5rem;
}
.sm\:text-3xl {
font-size: 1.875rem;
line-height: 2.25rem;
}
.sm\:text-4xl {
font-size: 2.25rem;
line-height: 2.5rem;
}
}
@media (min-width: 768px) {
.md\:order-none {
order: 0;
}
.md\:flex {
display: flex;
}
.md\:hidden {
display: none;
}
.md\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.md\:grid-cols-\[minmax\(0\2c 2fr\)_minmax\(0\2c 1\.2fr\)\] {
grid-template-columns: minmax(0,2fr) minmax(0,1.2fr);
}
.md\:justify-end {
justify-content: flex-end;
}
}