diff --git a/content/_index.md b/content/_index.md
index 6a33080..8e7cd7f 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -2,16 +2,16 @@
title = "Phel: A Functional Lisp Dialect for PHP Developers"
+++
-**Phel** is a functional programming language that compiles down to PHP. It's a modern Lisp dialect inspired by [Clojure](https://clojure.org/) and [Janet](https://janet-lang.org/), tailored to bring functional elegance and expressive code to the world of PHP development.
+
-
+**Phel** is a functional programming language that compiles to PHP — a modern Lisp dialect inspired by [Clojure](https://clojure.org/) and [Janet](https://janet-lang.org/), bringing functional elegance and expressive code to PHP development.
-
+
Try Phel with Docker
-
+
Read Documentation
diff --git a/content/documentation/getting-started.md b/content/documentation/getting-started.md
index ab26f44..4f3717f 100644
--- a/content/documentation/getting-started.md
+++ b/content/documentation/getting-started.md
@@ -110,7 +110,7 @@ vendor/bin/phel test --filter foo
## Editor Support
-- [VSCode](https://github.com/phel-lang/phel-vs-code-extension)
- [PhpStorm](https://github.com/phel-lang/phel-intellij-plugin)
+- [VSCode](https://github.com/phel-lang/phel-vs-code-extension)
- [Emacs](https://codeberg.org/mmontone/interactive-lang-tools)
- [Vim](https://github.com/danirod/phel.vim)
diff --git a/css/base.css b/css/base.css
index c3e9c63..bfcc8f3 100644
--- a/css/base.css
+++ b/css/base.css
@@ -1,428 +1,421 @@
-@layer base {
- /* Root & HTML Setup */
- :root {
- box-sizing: border-box;
- font-family: var(--font-primary);
- line-height: var(--leading-relaxed);
- background-color: var(--color-light-bg);
- color: var(--color-light-text-primary);
- font-size: var(--font-size);
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- }
-
- html {
- @apply scroll-smooth bg-white;
- -webkit-text-size-adjust: 100%;
- -moz-tab-size: 4;
- tab-size: 4;
- scroll-behavior: smooth;
- }
-
- *,
- ::after,
- ::before {
- @apply box-border border-0 border-solid;
- border-color: var(--color-light-border);
- }
-
- body {
- @apply m-0 min-h-screen antialiased;
- font-family: var(--font-primary);
- background-color: var(--color-light-bg);
- color: var(--color-light-text-primary);
- font-size: var(--font-size);
- line-height: var(--leading-relaxed);
- padding-top: var(--header-height);
- overflow-x: hidden;
- transition: background-color var(--duration-normal) var(--ease-out),
- color var(--duration-normal) var(--ease-out);
- }
-
- /* Reset spacing */
- * + * {
- margin-top: 1.5em;
- }
-
- li,
- kbd,
- div,
- input,
- option,
- select,
- a,
- textarea,
- body,
- span,
- dd,
- code,
- label,
- [column] {
- margin: 0;
- }
-
- /* Modern Link Styling */
- a {
- color: var(--color-light-link);
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
- border-radius: var(--radius-sm);
- position: relative;
- }
-
- a:hover {
- color: var(--color-light-link);
- text-decoration: none;
- }
-
- a:focus-visible {
- outline: 2px solid var(--color-light-link);
- outline-offset: 3px;
- }
-
- /* Modern link underline effect */
- a:not([class])::after {
- content: '';
- position: absolute;
- bottom: -2px;
- left: 0;
- width: 0;
- height: 2px;
- background: var(--color-light-link);
- transition: width var(--duration-normal) var(--ease-out);
- }
-
- a:not([class]):hover::after {
- width: 100%;
- }
-
- /* Touch-friendly tap targets */
- a,
- area,
- button,
- input,
- label,
- select,
- textarea,
- [tabindex] {
- -ms-touch-action: manipulation;
- touch-action: manipulation;
- }
-
- /* Modern Heading Typography */
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- color: var(--color-light-text-primary);
- font-family: var(--font-secondary);
- font-weight: 700;
- line-height: 1.2;
- letter-spacing: -0.02em;
- transition: color var(--duration-normal) var(--ease-out);
- }
-
- h1 {
- font-size: clamp(2rem, 5vw, 2.5rem);
- margin: 1em 0 0.5em;
- }
-
- h2 {
- font-size: clamp(1.75rem, 4vw, 2rem);
- margin: 1em 0 0.5em;
- }
-
- h3 {
- font-size: clamp(1.5rem, 3.5vw, 1.75rem);
- margin: 1em 0 0.5em;
- }
-
- h4 {
- font-size: clamp(1.25rem, 3vw, 1.5rem);
- margin: 1em 0 0.5em;
- }
-
- h5 {
- font-size: clamp(1.125rem, 2.5vw, 1.25rem);
- margin: 1em 0 0.5em;
- }
-
- h6 {
- font-size: clamp(1rem, 2vw, 1.125rem);
- margin: 1em 0 0.5em;
- }
-
- /* Heading links */
- h1 a,
- h2 a,
- h3 a {
- color: inherit;
- }
-
- h1 a::after,
- h2 a::after,
- h3 a::after {
- display: none;
- }
-
- h1 a:hover,
- h1 a:focus,
- h2 a:hover,
- h2 a:focus,
- h3 a:hover,
- h3 a:focus {
- color: var(--color-light-link);
- text-decoration: none;
- }
-
- /* Modern HR with gradient */
- hr {
- background: linear-gradient(
- 90deg,
- transparent,
- var(--color-light-border) 20%,
- var(--color-light-border) 80%,
- transparent
- );
- height: 1px;
- border: 0;
- margin: 2.5em 0;
- }
-
- /* Navigation */
- nav ol,
- nav ul {
- padding-left: 0;
- }
-
- nav li {
- list-style: none;
- }
-
- /* Paragraph styling */
- p {
- @apply mb-4;
- line-height: var(--leading-relaxed);
- color: var(--color-light-text-secondary);
- }
-
- /* Modern List Styling */
- ul,
- ol {
- padding-left: 1.5em;
- line-height: var(--leading-relaxed);
- }
-
- ul {
- list-style-type: none;
- }
-
- ul li {
- position: relative;
- padding-left: 1.5em;
- }
-
- ul li::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0.65em;
- width: 0.5em;
- height: 0.5em;
- background: var(--color-light-link);
- border-radius: 50%;
- }
-
- ul ol,
- ul ul,
- ol ol,
- ol ul {
- padding-left: 1.5em;
- margin-top: 0.5em;
- }
-
- /* Modern numbered lists */
- ol {
- counter-reset: item;
- }
-
- ol li {
- list-style: none;
- position: relative;
- }
-
- ol li:before {
- content: counter(item) '.';
- counter-increment: item;
- position: absolute;
- left: -1.5em;
- font-weight: 700;
- color: var(--color-light-link);
- }
-
- /* Images with modern styling */
- img {
- max-width: 100%;
- height: auto;
- border-radius: var(--radius-lg);
- }
-
- /* Modern Blockquote */
- blockquote {
- position: relative;
- background: var(--color-light-blockquote-bg);
- margin: 2em 0;
- padding: var(--space-md) var(--space-lg);
- padding-left: calc(var(--space-lg) + 2em);
- border-left: 3px solid var(--color-light-blockquote-border);
- border-radius: var(--radius-lg);
- box-shadow: var(--shadow-sm);
- font-style: italic;
- color: var(--color-light-text-secondary);
- display: flex;
- align-items: center;
- min-height: 3em;
- }
-
- blockquote::before {
- content: '"';
- position: absolute;
- left: 1.7rem;
- top: 50%;
- transform: translateY(-50%);
- font-size: 2.5em;
- color: var(--color-light-blockquote-border);
- opacity: 0.3;
- font-family: Georgia, serif;
- line-height: 1;
- }
-
- blockquote p {
- margin-bottom: 0;
- }
-
- /* Separator */
- .separator {
- @apply mx-auto my-12 border-t-8 border-dotted;
- width: 20%;
- border-color: var(--color-light-border);
- opacity: 0.5;
- }
-
- /* Modern Code Blocks */
- pre {
- padding: 1.5em;
- font-size: var(--font-size-code);
- font-family: var(--font-mono);
- background: var(--color-light-code-bg);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-lg);
- overflow-x: auto;
- max-width: 100%;
- box-shadow: var(--shadow-sm);
- line-height: 1.6;
- position: relative;
- }
-
- pre::-webkit-scrollbar {
- height: 8px;
- }
-
- pre::-webkit-scrollbar-track {
- background: transparent;
- }
-
- pre::-webkit-scrollbar-thumb {
- background: var(--color-light-border);
- border-radius: var(--radius-full);
- }
-
- pre::-webkit-scrollbar-thumb:hover {
- background: var(--color-gray-base);
- }
-
- /* Inline code with modern badge style */
- p code,
- li code {
- padding: 0.2em 0.5em;
- margin: 0;
- font-size: 0.9em;
- font-family: var(--font-mono);
- background-color: var(--color-light-code-inline-bg);
- color: var(--color-light-link);
- border-radius: var(--radius-sm);
- border: 1px solid var(--color-light-border);
- font-weight: 500;
- }
-
- /* Modern Selection */
- ::selection {
- background: rgba(99, 102, 241, 0.2);
- color: inherit;
- }
-
- ::-moz-selection {
- background: rgba(99, 102, 241, 0.2);
- color: inherit;
- }
-
- /* Focus visible states */
- :root {
- --border: var(--color-light-border);
- }
-
- .dark {
- --border: var(--color-dark-border);
- }
-
- button:focus-visible {
- outline: 2px solid var(--color-light-link);
- outline-offset: 3px;
- border-radius: var(--radius-md);
- }
-
- /* Tables with modern styling */
- table {
- width: 100%;
- max-width: 100%;
- border-collapse: separate;
- border-spacing: 0;
- margin: 2em 0;
- border-radius: var(--radius-lg);
- overflow: hidden;
- box-shadow: var(--shadow-sm);
- display: block;
- overflow-x: auto;
- }
-
- th {
- background: var(--color-light-bg-secondary);
- padding: 0.75em 1em;
- text-align: left;
- font-weight: 600;
- color: var(--color-light-text-primary);
- border-bottom: 2px solid var(--color-light-link);
- }
-
- td {
- padding: 0.75em 1em;
- border-bottom: 1px solid var(--color-light-border);
- }
-
- tr:last-child td {
- border-bottom: none;
- }
-
- tr:hover {
- background: var(--color-light-surface-hover);
- transition: background var(--duration-fast) var(--ease-out);
- }
-
- /* Smooth scrolling with offset for fixed header */
- [id] {
- scroll-margin-top: calc(var(--header-height) + 2rem);
- }
+/* Root & HTML Setup */
+:root {
+ box-sizing: border-box;
+ font-family: var(--font-primary);
+ line-height: var(--leading-relaxed);
+ background-color: var(--color-light-bg);
+ color: var(--color-light-text-primary);
+ font-size: var(--font-size);
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+html {
+ scroll-behavior: smooth;
+ background-color: white;
+ -webkit-text-size-adjust: 100%;
+ -moz-tab-size: 4;
+ tab-size: 4;
+}
+
+*,
+::after,
+::before {
+ box-sizing: border-box;
+ border: 0;
+ border-style: solid;
+ border-color: var(--color-light-border);
+}
+
+body {
+ margin: 0;
+ min-height: 100vh;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ background-color: var(--color-light-bg);
+ color: var(--color-light-text-primary);
+ font-size: var(--font-size);
+ line-height: var(--leading-relaxed);
+ padding-top: var(--header-height);
+ overflow-x: hidden;
+ transition: background-color var(--duration-normal) var(--ease-out),
+ color var(--duration-normal) var(--ease-out);
+}
+
+/* Reset spacing */
+* + * {
+ margin-top: 1.5em;
+}
+
+li,
+kbd,
+div,
+input,
+option,
+select,
+a,
+textarea,
+body,
+span,
+dd,
+code,
+label,
+[column] {
+ margin: 0;
+}
+
+/* Modern Link Styling */
+a {
+ color: var(--color-light-link);
+ text-decoration: none;
+ transition: all var(--duration-fast) var(--ease-out);
+ border-radius: var(--radius-sm);
+ position: relative;
+}
+
+a:hover {
+ color: var(--color-light-link);
+ text-decoration: none;
+}
+
+a:focus-visible {
+ outline: 2px solid var(--color-light-link);
+ outline-offset: 3px;
+}
+
+/* Modern link underline effect */
+a:not([class])::after {
+ content: '';
+ position: absolute;
+ bottom: -2px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: var(--color-light-link);
+ transition: width var(--duration-normal) var(--ease-out);
+}
+
+a:not([class]):hover::after {
+ width: 100%;
+}
+
+/* Touch-friendly tap targets */
+a,
+area,
+button,
+input,
+label,
+select,
+textarea,
+[tabindex] {
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+}
+
+/* Modern Heading Typography */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: var(--color-light-text-primary);
+ font-weight: 700;
+ line-height: 1.2;
+ letter-spacing: -0.02em;
+ transition: color var(--duration-normal) var(--ease-out);
+}
+
+h1 {
+ font-size: clamp(2rem, 5vw, 2.5rem);
+ margin: 1em 0 0.5em;
+}
+
+h2 {
+ font-size: clamp(1.75rem, 4vw, 2rem);
+ margin: 1em 0 0.5em;
+}
+
+h3 {
+ font-size: clamp(1.5rem, 3.5vw, 1.75rem);
+ margin: 1em 0 0.5em;
+}
+
+h4 {
+ font-size: clamp(1.25rem, 3vw, 1.5rem);
+ margin: 1em 0 0.5em;
+}
+
+h5 {
+ font-size: clamp(1.125rem, 2.5vw, 1.25rem);
+ margin: 1em 0 0.5em;
+}
+
+h6 {
+ font-size: clamp(1rem, 2vw, 1.125rem);
+ margin: 1em 0 0.5em;
+}
+
+/* Heading links */
+h1 a,
+h2 a,
+h3 a {
+ color: inherit;
+}
+
+h1 a::after,
+h2 a::after,
+h3 a::after {
+ display: none;
+}
+
+h1 a:hover,
+h1 a:focus,
+h2 a:hover,
+h2 a:focus,
+h3 a:hover,
+h3 a:focus {
+ color: var(--color-light-link);
+ text-decoration: none;
+}
+
+/* Modern HR with gradient */
+hr {
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ var(--color-light-border) 20%,
+ var(--color-light-border) 80%,
+ transparent
+ );
+ height: 1px;
+ border: 0;
+ margin: 2.5em 0;
+}
+
+/* Navigation */
+nav ol,
+nav ul {
+ padding-left: 0;
+}
+
+nav li {
+ list-style: none;
+}
+
+/* Paragraph styling */
+p {
+ margin-bottom: 1rem;
+ line-height: var(--leading-relaxed);
+ color: var(--color-light-text-secondary);
+}
+
+/* Modern List Styling */
+ul,
+ol {
+ padding-left: 1.5em;
+ line-height: var(--leading-relaxed);
+}
+
+ul {
+ list-style-type: none;
+}
+
+ul li {
+ position: relative;
+ padding-left: 1.5em;
+}
+
+ul li::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0.65em;
+ width: 0.5em;
+ height: 0.5em;
+ background: var(--color-light-link);
+ border-radius: 50%;
+}
+
+ul ol,
+ul ul,
+ol ol,
+ol ul {
+ padding-left: 1.5em;
+ margin-top: 0.5em;
+}
+
+/* Modern numbered lists */
+ol {
+ counter-reset: item;
+}
+
+ol li {
+ list-style: none;
+ position: relative;
+}
+
+ol li:before {
+ content: counter(item) '.';
+ counter-increment: item;
+ position: absolute;
+ left: -1.5em;
+ font-weight: 700;
+ color: var(--color-light-link);
+}
+
+/* Images with modern styling */
+img {
+ max-width: 100%;
+ height: auto;
+ border-radius: var(--radius-lg);
+}
+
+/* Modern Blockquote */
+blockquote {
+ position: relative;
+ background: var(--color-light-blockquote-bg);
+ margin: 2em 0;
+ padding: var(--space-md) var(--space-lg);
+ padding-left: calc(var(--space-lg) + 2em);
+ border-left: 3px solid var(--color-light-blockquote-border);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ font-style: italic;
+ color: var(--color-light-text-secondary);
+ display: flex;
+ align-items: center;
+ min-height: 3em;
+}
+
+blockquote::before {
+ content: '"';
+ position: absolute;
+ left: 1.7rem;
+ top: 50%;
+ transform: translateY(-50%);
+ font-size: 2.5em;
+ color: var(--color-light-blockquote-border);
+ opacity: 0.3;
+ font-family: Georgia, serif;
+ line-height: 1;
+}
+
+blockquote p {
+ margin-bottom: 0;
+}
+
+/* Modern Code Blocks */
+pre {
+ padding: 1.5em;
+ font-size: var(--font-size-code);
+ font-family: var(--font-mono);
+ background: var(--color-light-code-bg);
+ border: 1px solid var(--color-light-border);
+ border-radius: var(--radius-lg);
+ overflow-x: auto;
+ max-width: 100%;
+ box-shadow: var(--shadow-sm);
+ line-height: 1.6;
+ position: relative;
+}
+
+pre::-webkit-scrollbar {
+ height: 8px;
+}
+
+pre::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+pre::-webkit-scrollbar-thumb {
+ background: var(--color-light-border);
+ border-radius: var(--radius-full);
+}
+
+pre::-webkit-scrollbar-thumb:hover {
+ background: var(--color-gray-base);
+}
+
+/* Inline code with modern badge style */
+p code,
+li code {
+ padding: 0.2em 0.5em;
+ margin: 0;
+ font-size: 0.9em;
+ font-family: var(--font-mono);
+ background-color: var(--color-light-code-inline-bg);
+ color: var(--color-light-link);
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--color-light-border);
+ font-weight: 500;
+}
+
+/* Modern Selection */
+::selection {
+ background: rgba(99, 102, 241, 0.2);
+ color: inherit;
+}
+
+::-moz-selection {
+ background: rgba(99, 102, 241, 0.2);
+ color: inherit;
+}
+
+/* Focus visible states */
+:root {
+ --border: var(--color-light-border);
+}
+
+.dark {
+ --border: var(--color-dark-border);
+}
+
+button:focus-visible {
+ outline: 2px solid var(--color-light-link);
+ outline-offset: 3px;
+ border-radius: var(--radius-md);
+}
+
+/* Tables with modern styling */
+table {
+ width: 100%;
+ max-width: 100%;
+ border-collapse: separate;
+ border-spacing: 0;
+ margin: 2em 0;
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ box-shadow: var(--shadow-sm);
+ display: block;
+ overflow-x: auto;
+}
+
+th {
+ background: var(--color-light-bg-secondary);
+ padding: 0.75em 1em;
+ text-align: left;
+ font-weight: 600;
+ color: var(--color-light-text-primary);
+ border-bottom: 2px solid var(--color-light-link);
+}
+
+td {
+ padding: 0.75em 1em;
+ border-bottom: 1px solid var(--color-light-border);
+}
+
+tr:last-child td {
+ border-bottom: none;
+}
+
+tr:hover {
+ background: var(--color-light-surface-hover);
+ transition: background var(--duration-fast) var(--ease-out);
+}
+
+/* Smooth scrolling with offset for fixed header */
+[id] {
+scroll-margin-top: calc(var(--header-height) + 2rem);
}
diff --git a/css/components/animations.css b/css/components/animations.css
new file mode 100644
index 0000000..35afac7
--- /dev/null
+++ b/css/components/animations.css
@@ -0,0 +1,49 @@
+/* ========================================
+ ANIMATIONS
+ Global keyframe animations
+ ======================================== */
+
+/* Fade animations */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* Slide animations */
+@keyframes slideInDown {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* Scale animations */
+@keyframes expandSearch {
+ from {
+ transform: scale(0.95);
+ opacity: 0.8;
+ }
+ to {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
diff --git a/css/components/api.css b/css/components/api.css
new file mode 100644
index 0000000..663ba41
--- /dev/null
+++ b/css/components/api.css
@@ -0,0 +1,431 @@
+.api-index {
+ list-style: none;
+ padding: 0;
+ margin: var(--space-2xl) 0;
+}
+
+.api-index li {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.api-index li::before {
+ display: none;
+}
+
+.api-index__entry {
+ margin: var(--space-3xl) 0;
+ max-width: 100%;
+ padding: 0;
+ width: 100%;
+}
+
+/* API Namespace Toggle */
+.api-namespace__toggle {
+ align-items: flex-end;
+ background: 0 0;
+ border: none;
+ border-bottom: 2px solid var(--color-light-border);
+ cursor: default;
+ display: flex;
+ justify-content: space-between;
+ padding: 0 0 var(--space-sm);
+ text-align: left;
+ transition: all var(--duration-fast) var(--ease-out);
+ width: 100%;
+}
+
+.api-namespace__title {
+ color: var(--color-light-link);
+ font-size: var(--text-2xl);
+ font-weight: 600;
+ letter-spacing: -.02em;
+ line-height: 1;
+ margin: 0;
+ padding: 0;
+}
+
+.api-namespace__toggle-indicator {
+ align-items: flex-end;
+ display: flex;
+ flex-direction: row;
+ flex-shrink: 0;
+ gap: var(--space-sm);
+}
+
+/* Hide indicator for namespaces without overflow */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content:not(.has-overflow) ~ * .api-namespace__toggle-indicator,
+.api-index__entry:has(.api-namespace__content:not(.has-overflow)) .api-namespace__toggle-indicator {
+ display: none;
+}
+
+.api-index__entry:has(.api-namespace__content.has-overflow) .api-namespace__toggle {
+ cursor: pointer;
+}
+
+.api-namespace__toggle-text {
+ color: var(--color-light-link);
+ opacity: 0.8;
+ font-size: var(--text-sm);
+ font-weight: 600;
+ transition: opacity var(--duration-fast) var(--ease-out);
+}
+
+.api-namespace__icon {
+ color: var(--color-light-link);
+ flex-shrink: 0;
+ height: 18px;
+ opacity: .8;
+ transition: transform var(--duration-normal) var(--ease-out);
+ width: 18px;
+}
+
+.api-namespace__toggle:hover .api-namespace__toggle-text,
+.api-namespace__toggle:hover .api-namespace__icon {
+ opacity: 1;
+ color: var(--color-light-link);
+}
+
+.api-namespace__toggle[aria-expanded="true"] .api-namespace__icon {
+ transform: rotate(180deg);
+}
+
+/* API Namespace Content */
+.api-namespace__content {
+ box-sizing: border-box;
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-sm);
+ list-style: none;
+ margin: 0;
+ max-height: 5000px;
+ max-width: 100%;
+ overflow: visible;
+ padding: 0;
+ position: relative;
+ transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1),
+ opacity 0.3s ease-out;
+ width: 100%;
+ opacity: 1;
+}
+
+/* Only collapse if has overflow */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content {
+ margin-bottom: var(--space-lg);
+ max-height: 160px;
+ overflow: hidden;
+}
+
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow {
+ border-radius: var(--radius-lg);
+ cursor: pointer;
+ width: calc(100% + var(--space-md) * 2);
+}
+
+/* Pills Container */
+.api-index__entry > ul {
+ margin-bottom: var(--space-lg);
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-sm);
+ list-style: none;
+ padding: var(--space-lg) 0;
+}
+
+.api-index__entry > ul li {
+ flex-shrink: 0;
+}
+
+.api-index__entry > ul a {
+ display: inline-block;
+ padding: var(--space-xs) var(--space-md);
+ background: var(--color-light-bg-secondary);
+ color: var(--color-light-text-secondary);
+ border: 1px solid var(--color-light-border);
+ border-radius: var(--radius-lg);
+ text-decoration: none;
+ font-size: var(--text-sm);
+ font-weight: 500;
+ transition: all var(--duration-fast) var(--ease-out);
+ box-shadow: var(--shadow-sm);
+}
+
+.api-index__entry > ul a::after {
+ display: none;
+}
+
+.api-index__entry > ul a:hover {
+ background: var(--color-light-link);
+ color: white;
+ border-color: var(--color-light-link);
+ box-shadow: var(--shadow-md);
+ transform: translateY(-1px);
+}
+
+/* Collapsed State with Fade - ONLY for items with overflow */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 120px;
+ background: linear-gradient(to bottom, transparent 0%, var(--color-light-bg) 100%);
+ pointer-events: none;
+ opacity: 0;
+ animation: fadeInGradient 0.3s ease-out 0.1s forwards;
+}
+
+@keyframes fadeInGradient {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+/* Hide fade when expanded */
+.api-namespace__toggle[aria-expanded="true"] + .api-namespace__content.has-overflow::after {
+ opacity: 0;
+ animation: none;
+}
+
+/* Expand Button */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow::before {
+ content: 'Expand';
+ position: absolute;
+ top: 65%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ padding: var(--space-sm) var(--space-lg);
+ background: var(--color-light-link);
+ color: #fff;
+ border: 1px solid var(--color-light-link);
+ border-radius: var(--radius-lg);
+ font-size: var(--text-sm);
+ font-weight: 600;
+ z-index: 10;
+ box-shadow: none;
+ opacity: 0;
+ pointer-events: none;
+ animation: fadeInButton 0.3s ease-out 0.2s forwards;
+}
+
+@keyframes fadeInButton {
+ from {
+ opacity: 0;
+ transform: translate(-50%, -40%);
+ }
+ to {
+ opacity: 0.8;
+ transform: translate(-50%, -50%);
+ }
+}
+
+/* Hide button when expanded */
+.api-namespace__toggle[aria-expanded="true"] + .api-namespace__content.has-overflow::before {
+ opacity: 0;
+ animation: none;
+}
+
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow:hover::before {
+ opacity: 1;
+}
+
+/* Namespaces without overflow should not have pointer cursor on toggle */
+.api-index__entry:has(.api-namespace__content:not(.has-overflow)) .api-namespace__toggle {
+ cursor: default;
+}
+
+/* Disable all interaction with pills when collapsed */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow a {
+ pointer-events: none;
+ cursor: default;
+}
+
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow a:hover {
+ background: var(--color-light-bg-secondary) !important;
+ color: var(--color-light-text-secondary) !important;
+ border-color: var(--color-light-border) !important;
+ box-shadow: var(--shadow-sm) !important;
+ transform: none !important;
+}
+
+/* Enable interaction when expanded */
+.api-namespace__toggle[aria-expanded="true"] + .api-namespace__content a {
+ pointer-events: auto;
+}
+
+/* When hovering over collapsed area */
+.api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow:hover ~ .api-namespace__toggle .api-namespace__toggle-text,
+.api-index__entry:has(.api-namespace__content.has-overflow:hover) .api-namespace__toggle-text {
+ opacity: 1;
+ color: var(--color-light-link);
+}
+
+.api-index__entry:has(.api-namespace__content.has-overflow:hover) .api-namespace__icon {
+ opacity: 1;
+ color: var(--color-light-link);
+}
+
+/* Mobile responsiveness */
+@media (max-width: 767px) {
+ .api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow {
+ width: 100%;
+ }
+}
+
+/* API Documentation Page */
+.api-doc {
+ margin: var(--space-2xl) 0;
+}
+
+.api-doc__header {
+ display: flex;
+ align-items: baseline;
+ gap: var(--space-md);
+ margin-bottom: var(--space-lg);
+}
+
+.api-doc__name {
+ font-size: var(--text-2xl);
+ font-weight: 700;
+ color: var(--color-light-text-primary);
+}
+
+.api-doc__type {
+ font-size: var(--text-sm);
+ color: var(--color-light-text-secondary);
+ background: var(--color-light-surface);
+ padding: var(--space-xs) var(--space-sm);
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--color-light-border);
+}
+
+.api-doc__description {
+ padding: 0 var(--space-lg);
+ color: var(--color-light-text-secondary);
+ line-height: var(--leading-relaxed);
+}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .site-navigation-title {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .site-navigation__entry a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .site-navigation__entry a:hover {
+ background: var(--color-dark-surface-hover);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .site-navigation__entry.active a {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
+.dark .page-toc {
+ border-bottom-color: var(--color-dark-border);
+}
+
+.dark .page-toc h2 {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .page-toc a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .page-toc a:hover {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
+.dark .page-toc a.active {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
+.dark .api-namespace__toggle {
+ border-bottom-color: var(--color-dark-border);
+}
+
+.dark .api-namespace__title {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .api-namespace__toggle-text {
+ color: #bfa4ff;
+ opacity: 0.8;
+}
+
+.dark .api-namespace__toggle:hover .api-namespace__toggle-text {
+ opacity: 1;
+ color: #c2acf5;
+}
+
+.dark .api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow:hover ~ .api-namespace__toggle .api-namespace__toggle-text,
+.dark .api-index__entry:has(.api-namespace__content.has-overflow:hover) .api-namespace__toggle-text {
+ opacity: 1;
+ color: #c2acf5;
+}
+
+.dark .api-namespace__icon {
+ color: #bfa4ff;
+ opacity: 0.8;
+}
+
+.dark .api-namespace__toggle:hover .api-namespace__icon {
+ opacity: 1;
+ color: #c2acf5;
+}
+
+.dark .api-index__entry:has(.api-namespace__content.has-overflow:hover) .api-namespace__icon {
+ opacity: 1;
+ color: #c2acf5;
+}
+
+.dark .api-namespace__toggle[aria-expanded="false"] + .api-namespace__content::after {
+ background: linear-gradient(to bottom,
+ transparent 0%,
+ var(--color-dark-bg) 100%);
+}
+
+.dark .api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow::before {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ border: 1px solid var(--color-dark-text-accent);
+ box-shadow: none;
+}
+
+.dark .api-index__entry > ul a {
+ background: var(--color-dark-surface);
+ color: var(--color-dark-text-secondary);
+ border-color: var(--color-dark-border);
+ box-shadow: var(--shadow-dark-sm);
+}
+
+.dark .api-index__entry > ul a:hover {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ border-color: var(--color-dark-text-accent);
+ box-shadow: var(--shadow-dark-md);
+}
+
+/* Disable hover effects on pills when collapsed - Dark Mode */
+.dark .api-namespace__toggle[aria-expanded="false"] + .api-namespace__content.has-overflow a:hover {
+ background: var(--color-dark-surface) !important;
+ color: var(--color-dark-text-secondary) !important;
+ border-color: var(--color-dark-border) !important;
+ box-shadow: var(--shadow-dark-sm) !important;
+ transform: none !important;
+}
+
diff --git a/css/components/blog.css b/css/components/blog.css
index 21f0fa8..a6cfd8b 100644
--- a/css/components/blog.css
+++ b/css/components/blog.css
@@ -1,5 +1,10 @@
-/* Blog post list */
-@utility post-list {
+.blog-intro {
+ font-size: var(--text-lg);
+ color: var(--color-light-text-secondary);
+ margin-bottom: var(--space-2xl);
+}
+
+.post-list {
list-style: none;
padding: 0;
margin: 0;
@@ -22,10 +27,10 @@
.post-list li a::after {
content: '';
position: absolute;
- bottom: 0;
+ bottom: -2px;
left: 0;
width: 0;
- height: 1px;
+ height: 2px;
background: var(--color-light-link);
transition: width var(--duration-normal) var(--ease-out);
}
@@ -35,7 +40,7 @@
}
/* Pagination */
-@utility pagination {
+.pagination {
display: flex;
justify-content: center;
align-items: center;
@@ -43,55 +48,51 @@
margin: var(--space-3xl) 0;
}
-.pagination a {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- min-width: 40px;
- height: 40px;
- padding: var(--space-sm) var(--space-md);
- background: var(--color-light-surface);
+.pagination .btn {
color: var(--color-light-link);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-md);
- font-weight: 600;
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
}
-.pagination a::after {
- display: none;
+.pagination__btn--previous {
+ margin-right: auto;
}
-.pagination a.active {
- background: var(--color-light-link);
- color: white;
- border-color: var(--color-light-link);
+.pagination__btn--next {
+ margin-left: auto;
}
-.pagination a.previous {
- margin-right: auto;
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .blog-intro {
+ color: var(--color-dark-text-secondary);
}
-.pagination a.next {
- margin-left: auto;
+.dark .post-list li a {
+ border-bottom-color: var(--color-dark-border);
}
-.pagination a.next::after {
- content: ' →';
- margin-left: var(--space-xs);
+.dark .post-list li a::after {
+ background: var(--color-dark-text-accent);
}
-/* Featured post highlight */
-/*.post-list li.featured a {*/
-/* border: 2px solid var(--color-light-link);*/
-/* background: linear-gradient(*/
-/* 135deg,*/
-/* rgba(99, 102, 241, 0.05),*/
-/* transparent*/
-/* );*/
-/*}*/
+.dark .post-list li a h2 {
+ color: var(--color-dark-text-primary);
+}
-/*.post-list li.featured a::before {*/
-/* transform: scaleY(1);*/
-/*}*/
+.dark .post-list li a:hover h2 {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .post-list li a .meta {
+ color: var(--color-dark-text-muted);
+}
+
+.dark .post-list li a .excerpt {
+ color: var(--color-dark-text-secondary);
+}
+
+/* Pagination dark mode - inherit from .btn-secondary, add link color */
+.dark .pagination .btn {
+ color: var(--color-dark-text-accent);
+}
diff --git a/css/components/code-block.css b/css/components/code-block.css
index 9d5008f..ad6a635 100644
--- a/css/components/code-block.css
+++ b/css/components/code-block.css
@@ -51,11 +51,37 @@
}
.copy-code-button.copied {
- background-color: var(--color-phel-primary);
- border-color: var(--color-phel-primary);
+ background-color: var(--color-light-link);
+ border-color: var(--color-light-link);
}
.copy-code-button.copied svg {
stroke: white;
}
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .copy-code-button {
+ background-color: rgba(42, 49, 60, 0.95);
+ border-color: #475569;
+}
+
+.dark .copy-code-button svg {
+ stroke: #cbd5e1;
+}
+
+.dark .copy-code-button:hover {
+ background-color: #2f3741;
+}
+
+.dark .copy-code-button.copied {
+ background-color: var(--color-dark-text-accent);
+ border-color: var(--color-dark-text-accent);
+}
+
+.dark .copy-code-button.copied svg {
+ stroke: white;
+}
+
diff --git a/css/components/dark-mode.css b/css/components/dark-mode.css
index e25fc41..8e433ce 100644
--- a/css/components/dark-mode.css
+++ b/css/components/dark-mode.css
@@ -31,177 +31,6 @@
background-color: var(--color-dark-bg);
}
-/* Modern Dark Header with glassmorphism */
-.dark .site-header {
- background: var(--color-dark-header-bg);
- backdrop-filter: blur(var(--backdrop-blur-header)) saturate(180%);
- -webkit-backdrop-filter: blur(var(--backdrop-blur-header)) saturate(180%);
- border-bottom-color: var(--color-dark-header-footer-border);
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3),
- 0 2px 4px -1px rgba(0, 0, 0, 0.2);
-}
-
-.dark .site-header.scrolled {
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
-}
-
-/* Dark logo styling */
-.dark .site-header__logo .phel-logo {
- stroke: var(--color-dark-text-primary);
- filter: drop-shadow(0 2px 4px rgba(241, 245, 249, 0.1));
-}
-
-.dark .site-header__logo .logo-text {
- color: var(--color-dark-text-primary);
-}
-
-
-/* Dark navigation */
-.dark .site-header__navigation a {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .site-header__navigation a::after {
- background: var(--color-dark-text-accent);
-}
-
-.dark .site-header__navigation a:hover {
- color: var(--color-dark-text-accent);
-}
-
-.dark .site-header__navigation li.active a {
- color: var(--color-dark-text-accent);
-}
-
-/* Mobile hamburger icon dark mode */
-.dark .site-header__mobile-menu .hamburger-icon span {
- background: var(--color-dark-text-primary);
-}
-
-.dark .site-header__mobile-menu .hamburger-icon:hover {
- background: rgba(191, 164, 255, 0.15);
-}
-
-/* Mobile navigation overlay dark */
-@media (max-width: 1039px) {
- .dark .mobile-menu-overlay {
- background: var(--color-dark-header-bg);
- backdrop-filter: blur(var(--backdrop-blur-lg));
- -webkit-backdrop-filter: blur(var(--backdrop-blur-lg));
- }
-
- .dark .mobile-menu-nav a {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
- }
-
- .dark .mobile-menu-nav a:hover,
- .dark .mobile-menu-nav a:active {
- background: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- }
-
- .dark .mobile-menu-link {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
- }
-
- .dark .mobile-menu-link:hover,
- .dark .mobile-menu-link:active {
- background: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- }
-
- .dark .mobile-menu-actions {
- border-top-color: var(--color-dark-border);
- }
-
- .dark .mobile-dark-mode-toggle {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
- }
-
- .dark .mobile-dark-mode-toggle:hover {
- background: rgba(191, 164, 255, 0.15);
- border-color: var(--color-dark-text-accent);
- }
-
- .dark .mobile-menu-toggle span {
- background: var(--color-dark-text-primary);
- }
-
- .dark .mobile-menu-toggle:hover {
- background: rgba(191, 164, 255, 0.15);
- }
-}
-
-/* Dark search input with modern styling */
-.dark #search {
- background-color: var(--color-dark-bg-secondary);
- color: var(--color-dark-text-primary);
- border-color: #3a3a3a;
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23666666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
-}
-
-.dark #search:hover {
- border-color: #4a4a4a;
- box-shadow: var(--shadow-dark-sm);
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23888888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
-}
-
-.dark #search:focus {
- border-color: #5a5a5a;
- background-color: var(--color-dark-surface);
- box-shadow: 0 0 0 3px rgba(90, 90, 90, 0.3),
- var(--shadow-dark-sm);
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23999999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
-}
-
-.dark #search::placeholder {
- color: var(--color-dark-text-muted);
-}
-
-/* Dark mode clear button */
-.dark #search::-webkit-search-cancel-button {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23999999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
- opacity: 0.8;
-}
-
-.dark #search::-webkit-search-cancel-button:hover {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23cccccc' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
- opacity: 1;
-}
-
-/* Dark search results scrollbar */
-.dark .search-results::-webkit-scrollbar-thumb {
- background: var(--color-dark-border);
-}
-
-.dark .search-results::-webkit-scrollbar-thumb:hover {
- background: var(--color-dark-border-subtle);
-}
-
-/* Dark action buttons */
-.dark .site-header__actions {
- color: var(--color-dark-text-primary);
-}
-
-.dark .site-header__link,
-.dark .dark-mode-toggle {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .site-header__link:hover,
-.dark .dark-mode-toggle:hover {
- color: var(--color-dark-text-accent);
- background: rgba(191, 164, 255, 0.15);
-}
-
/* Dark typography */
.dark h1,
.dark h2,
@@ -237,7 +66,7 @@
color: var(--color-dark-text-accent);
}
-/* Dark images - no animations */
+/* Dark images */
.dark img {
opacity: 1;
}
@@ -312,461 +141,12 @@
);
}
-/* Dark separator */
-.dark .separator {
- border-color: var(--color-dark-border);
-}
-
/* Dark layout components */
.dark .one-column-layout,
.dark .two-column-layout {
background: transparent;
}
-@media (min-width: 1040px) {
- .dark .two-column-layout__sidebar {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- box-shadow: var(--shadow-dark-sm);
- }
-}
-
-@media (max-width: 1039px) {
- .dark .two-column-layout__sidebar {
- background: transparent;
- border-bottom-color: var(--color-dark-border);
- }
-}
-
-/* Dark mode for sidebar toggle */
-.dark .sidebar-toggle {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-text-secondary);
- color: var(--color-dark-text-primary);
-}
-
-.dark .sidebar-toggle:hover {
- background: var(--color-dark-surface-hover);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-text-accent);
-}
-
-/* Dark mode for sidebar accordion open state */
-.dark .two-column-layout__sidebar:has(.sidebar-content.active) {
- border-bottom-color: var(--color-dark-border);
-}
-
-.dark .two-column-layout__sidebar::-webkit-scrollbar-thumb {
- background: var(--color-dark-border);
- background-clip: padding-box;
-}
-
-.dark .two-column-layout__sidebar::-webkit-scrollbar-thumb:hover {
- background: var(--color-gray-base);
- background-clip: padding-box;
-}
-
-/* Dark TOC */
-.dark .page-toc {
- border-bottom-color: var(--color-dark-border);
-}
-
-.dark .page-toc h2 {
- color: var(--color-dark-text-primary);
-}
-
-/* Dark site navigation title */
-.dark .site-navigation-title {
- color: var(--color-dark-text-primary);
-}
-
-/* Dark mode anchor links */
-.dark .zola-anchor,
-.dark .zola-anchor:hover {
- color: var(--color-dark-anchor);
-}
-
-/* Dark mode solution toggle */
-.dark .solution label {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
-}
-
-.dark .solution label:hover {
- background: var(--color-dark-surface-hover);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-text-accent);
-}
-
-.dark .solution input[type="checkbox"]:checked ~ label {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border-color: var(--color-dark-text-accent);
-}
-
-/* Dark mode navigation */
-.dark .site-navigation__entry a {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .site-navigation__entry a:hover {
- background: var(--color-dark-surface-hover);
- color: var(--color-dark-text-accent);
-}
-
-.dark .site-navigation__entry.active a {
- color: var(--color-dark-text-accent);
- background: var(--color-dark-surface-hover);
-}
-
-/* Dark mode blog styling */
-.dark .post-list li a {
- border-bottom-color: var(--color-dark-border);
-}
-
-.dark .post-list li a::after {
- background: var(--color-dark-text-accent);
-}
-
-.dark .post-list li a h2 {
- color: var(--color-dark-text-primary);
-}
-
-.dark .post-list li a:hover h2 {
- color: var(--color-dark-text-accent);
-}
-
-.dark .post-list li a .meta {
- color: var(--color-dark-text-muted);
-}
-
-.dark .post-list li a .excerpt {
- color: var(--color-dark-text-secondary);
-}
-
-/* Dark mode blog pagination */
-.dark .pagination a {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
-}
-
-.dark .pagination a:hover {
- background: var(--color-dark-surface-hover);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-text-accent);
-}
-
-.dark .pagination a.active {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border-color: var(--color-dark-text-accent);
-}
-
-/* Dark mode blog tags */
-.dark .blog-tag {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-secondary);
-}
-
-.dark .blog-tag:hover {
- background: var(--color-dark-surface-hover);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-text-accent);
-}
-
-/* Dark API Index Pills */
-.dark .api-namespace-toggle {
- border-bottom-color: var(--color-dark-border);
-}
-
-.dark .api-namespace-title {
- color: var(--color-dark-text-accent);
-}
-
-.dark .api-namespace-toggle-text {
- color: #bfa4ff;
- opacity: 0.8;
-}
-
-.dark .api-namespace-toggle:hover .api-namespace-toggle-text {
- opacity: 1;
- color: #c2acf5;
-}
-
-/* When hovering over collapsed area in dark mode */
-.dark .api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow:hover ~ .api-namespace-toggle .api-namespace-toggle-text,
-.dark .api-index__entry:has(.api-namespace-content.has-overflow:hover) .api-namespace-toggle-text {
- opacity: 1;
- color: #c2acf5;
-}
-
-.dark .api-namespace-icon {
- color: #bfa4ff;
- opacity: 0.8;
-}
-
-.dark .api-namespace-toggle:hover .api-namespace-icon {
- opacity: 1;
- color: #c2acf5;
-}
-
-/* When hovering over collapsed area in dark mode */
-.dark .api-index__entry:has(.api-namespace-content.has-overflow:hover) .api-namespace-icon {
- opacity: 1;
- color: #c2acf5;
-}
-
-.dark .api-namespace-toggle[aria-expanded="false"] + .api-namespace-content::after {
- background: linear-gradient(to bottom,
- transparent 0%,
- var(--color-dark-bg) 100%);
-}
-
-.dark .api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow::before {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border: 1px solid var(--color-dark-text-accent);
- box-shadow: none;
-}
-
-.dark .api-index__entry > ul a {
- background: var(--color-dark-surface);
- color: var(--color-dark-text-secondary);
- border-color: var(--color-dark-border);
- box-shadow: var(--shadow-dark-sm);
-}
-
-.dark .api-index__entry > ul a:hover {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border-color: var(--color-dark-text-accent);
- box-shadow: var(--shadow-dark-md);
-}
-
-.dark .page-toc a {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .page-toc a:hover {
- color: var(--color-dark-text-accent);
- background: var(--color-dark-surface-hover);
-}
-
-.dark .page-toc a.active {
- color: var(--color-dark-text-accent);
- background: var(--color-dark-surface-hover);
-}
-
-/* Dark cards and navigation */
-.dark .related-container {
- background: transparent;
- border: none;
- box-shadow: none;
-}
-
-.dark .related-container .link {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-accent);
-}
-
-.dark .related-container .link:hover {
- border-color: var(--color-dark-text-accent);
- background: var(--color-dark-surface-hover);
-}
-
-.dark .related-container .link .link-title {
- color: var(--color-dark-text-accent);
-}
-
-.dark .related-container .link > span:not(.link-title) {
- color: var(--color-dark-text-accent);
-}
-
-/* Dark card */
-.dark .card {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- box-shadow: var(--shadow-dark-sm);
-}
-
-.dark .card:hover {
- box-shadow: var(--shadow-dark-lg);
- border-color: var(--color-dark-text-accent);
-}
-
-/* Dark badges */
-.dark .badge-primary {
- background: rgba(191, 164, 255, 0.2);
- color: var(--color-dark-text-accent);
-}
-
-.dark .badge-warning {
- background: rgba(245, 158, 11, 0.2);
- color: #fbbf24;
-}
-
-.dark .badge-error {
- background: rgba(239, 68, 68, 0.2);
- color: #f87171;
-}
-
-/* Dark buttons */
-.dark .btn-primary {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- box-shadow: var(--shadow-dark-sm);
-}
-
-.dark .btn-primary:hover {
- background: #c2acf5;
- box-shadow: var(--shadow-dark-md);
-}
-
-.dark .btn-secondary {
- background: var(--color-dark-surface);
- color: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
-}
-
-.dark .btn-secondary:hover {
- background: rgba(191, 164, 255, 0.15);
-}
-
-/* Dark back to top button */
-.dark .back-to-top-button,
-.dark #back-to-top-button {
- background: var(--color-dark-surface);
- color: var(--color-dark-text-primary);
- border: 1px solid var(--color-dark-border);
-}
-
-.dark .back-to-top-button:hover,
-.dark #back-to-top-button:hover {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border-color: var(--color-dark-text-accent);
-}
-
-/* Dark search results */
-.dark .search-results {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- box-shadow: var(--shadow-dark-lg);
- color: var(--color-dark-text-primary);
-}
-
-.dark .search-results__item {
- border-bottom-color: var(--color-dark-border);
- opacity: 0.7;
-}
-
-.dark .search-result-link {
- color: var(--color-dark-text-primary);
-}
-
-.dark .search-results__item:hover {
- background: var(--color-dark-surface-hover);
- opacity: 0.8;
-}
-
-.dark .result-type-badge--api {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
- border: 1px solid var(--color-dark-text-accent);
-}
-
-.dark .search-results__item .fn-name {
- color: var(--color-dark-text-accent);
-}
-
-.dark .search-results__item .fn-signature {
- color: var(--color-dark-text-accent);
-}
-
-.dark .search-results__item strong {
- color: var(--color-dark-text-accent);
-}
-
-.dark .search-results__item .title {
- color: var(--color-dark-text-primary);
-}
-
-.dark .search-results__item .desc {
- color: var(--color-dark-text-primary);
-}
-
-.dark .search-results__item mark {
- background: rgba(191, 164, 255, 0.3);
- color: var(--color-dark-text-accent);
-}
-
-/* Dark footer */
-.dark .site-footer {
- background: var(--color-dark-header-bg);
- border-top-color: var(--color-dark-header-footer-border);
-}
-
-.dark .footer-logo .phel-logo {
- stroke: white;
-}
-
-.dark .footer-logo .logo-text {
- color: var(--color-dark-text-primary);
-}
-
-.dark .footer-description {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .footer-social a {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
-}
-
-.dark .footer-social a:hover {
- background: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
-}
-
-.dark .footer-column h3 {
- color: var(--color-dark-text-primary);
-}
-
-.dark .footer-column ul li a {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .footer-column ul li a:hover {
- color: var(--color-dark-text-accent);
-}
-
-.dark .footer-bottom {
- border-top-color: var(--color-dark-border);
-}
-
-.dark .footer-copyright {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .footer-badge {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .footer-badge-separator {
- color: var(--color-dark-text-muted);
-}
-
-.dark .footer-badge-version {
- background: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
-}
-
/* Dark focus states */
.dark a:focus-visible,
.dark button:focus-visible {
@@ -781,107 +161,3 @@
.dark ::-moz-selection {
background: rgba(191, 164, 255, 0.3);
}
-
-/* Dark mode code block copy button */
-.dark .copy-code-button {
- background-color: rgba(42, 49, 60, 0.95);
- border-color: #475569;
-}
-
-.dark .copy-code-button svg {
- stroke: #cbd5e1;
-}
-
-.dark .copy-code-button:hover {
- background-color: #2f3741;
-}
-
-.dark .copy-code-button.copied {
- background-color: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
-}
-
-.dark .copy-code-button.copied svg {
- stroke: white;
-}
-
-/* Homepage Title Accent - Dark Mode */
-.dark .homepage-title-accent {
- color: var(--color-dark-text-accent);
-}
-
-.dark .homepage-content > p:first-of-type {
- color: var(--color-dark-text-primary);
-}
-
-.dark .why-card {
- background: var(--color-dark-bg);
- border-color: var(--color-dark-border);
- color: var(--color-dark-text-primary);
-}
-
-.dark .why-card:hover {
- border-color: var(--color-dark-text-accent);
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
-}
-
-.dark .why-card-icon {
- color: var(--color-dark-text-accent);
-}
-
-/* Homepage Code Section - Dark Mode */
-.dark .homepage-code-section {
- background: rgba(191, 164, 255, 0.05);
-}
-
-/* Homepage CTA Buttons - Dark Mode */
-.dark .homepage-cta-primary {
- background: var(--color-dark-text-accent);
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-bg);
-}
-
-.dark .homepage-cta-primary:hover {
- background: #c2acf5;
- border-color: #c2acf5;
- color: var(--color-dark-bg);;
-}
-
-.dark .homepage-cta-secondary {
- background: transparent;
- color: var(--color-dark-text-primary);
- border-color: var(--color-dark-border);
-}
-
-.dark .homepage-cta-secondary:hover {
- border-color: var(--color-dark-text-accent);
- color: var(--color-dark-text-accent);
-}
-
-/* Features Grid - Dark Mode */
-.dark .feature-card {
- background: var(--color-dark-surface);
- border-color: var(--color-dark-border);
-}
-
-.dark .feature-card:hover {
- border-color: var(--color-dark-text-accent);
- box-shadow: var(--shadow-dark-sm);
-}
-
-.dark .feature-icon {
- color: var(--color-dark-text-accent);
-}
-
-.dark .feature-title {
- color: var(--color-dark-text-primary);
-}
-
-.dark .feature-description {
- color: var(--color-dark-text-secondary);
-}
-
-.dark .feature-items p,
-.dark .feature-items li {
- color: var(--color-dark-text-secondary);
-}
diff --git a/css/components/documentation.css b/css/components/documentation.css
index 9189ce0..f837df9 100644
--- a/css/components/documentation.css
+++ b/css/components/documentation.css
@@ -1,529 +1,51 @@
-/* Documentation navigation in sidebar */
-@utility docs-nav {
+/* Documentation Navigation */
+.docs-nav {
padding: 0;
margin: 0;
-}
-
-.docs-nav ul {
list-style: none;
- padding: 0;
- margin: 0;
}
.docs-nav li {
- margin: 0;
- padding: 0;
-}
-
-.docs-nav li::before {
- display: none;
-}
-
-.docs-nav > ul > li {
- margin-bottom: var(--space-md);
-}
-
-.docs-nav a {
- display: block;
- padding: var(--space-sm) var(--space-md);
- color: var(--color-light-text-secondary);
- font-size: var(--text-sm);
- font-weight: 500;
- border-radius: var(--radius-md);
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
- position: relative;
-}
-
-.docs-nav a::after {
- display: none;
-}
-
-.docs-nav a:hover {
- color: var(--color-light-link);
- background: var(--color-light-surface-hover);
- transform: translateX(4px);
-}
-
-.docs-nav a.active,
-.docs-nav a[aria-current='page'] {
- color: var(--color-light-link);
- background: var(--color-light-surface-hover);
- font-weight: 600;
- border-left: 3px solid var(--color-light-link);
- padding-left: calc(var(--space-md) - 3px);
-}
-
-/* Nested navigation */
-.docs-nav ul ul {
- margin-top: var(--space-sm);
- margin-left: var(--space-md);
- padding-left: var(--space-md);
- border-left: 1px solid var(--color-light-border);
-}
-
-.docs-nav ul ul a {
- font-size: var(--text-xs);
- padding: var(--space-xs) var(--space-sm);
-}
-
-/* Documentation section headers */
-.docs-nav > ul > li > span {
- display: block;
- padding: var(--space-sm) var(--space-md);
- color: var(--color-gray-base);
- font-size: var(--text-xs);
- font-weight: 700;
- letter-spacing: 0.05em;
- text-transform: uppercase;
- margin-bottom: var(--space-xs);
-}
-
-/* Table of contents */
-@utility page-toc {
- display: none;
- margin-bottom: var(--space-2xl);
- padding-bottom: var(--space-xl);
- border-bottom: 2px solid var(--color-light-border);
-}
-
-@media (min-width: 1040px) {
- .page-toc {
- display: block;
- }
-}
-
-.page-toc h2 {
- font-size: var(--text-sm);
- font-weight: 700;
- color: var(--color-light-text-primary);
- margin: 0 0 var(--space-md) 0;
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.page-toc ul {
list-style: none;
- padding: 0;
- margin: 0;
-}
-
-.page-toc li {
margin: 0;
padding: 0;
}
-.page-toc li::before {
- display: none;
-}
-
-.page-toc a {
- display: block;
- padding: var(--space-xs) var(--space-sm);
- color: var(--color-light-text-secondary);
- font-size: var(--text-sm);
- line-height: 1.6;
- text-decoration: none;
- border-radius: var(--radius-sm);
- transition: all var(--duration-fast) var(--ease-out);
-}
-
-.page-toc a::after {
+.docs-nav li::before {
display: none;
}
-.page-toc a:hover {
- color: var(--color-light-link);
- background: var(--color-light-surface-hover);
-}
-
-.page-toc a.active {
- color: var(--color-light-link);
- font-weight: 600;
- background: var(--color-light-surface-hover);
-}
-
-.page-toc ul ul {
- margin-left: var(--space-md);
- margin-top: var(--space-xs);
-}
-
-.page-toc ul ul a {
- font-size: var(--text-xs);
-}
-
-/* Custom scrollbar for TOC */
-.page-toc::-webkit-scrollbar {
- width: 4px;
-}
-
-.page-toc::-webkit-scrollbar-track {
- background: transparent;
-}
-
-.page-toc::-webkit-scrollbar-thumb {
- background: var(--color-light-border);
- border-radius: var(--radius-full);
-}
-
-/* API Index - Pill Style */
-@utility api-index {
- list-style: none;
- padding: 0;
- margin: var(--space-2xl) 0;
- width: 100%;
- max-width: 100%;
-}
-
-@media (max-width: 767px) {
- .api-index {
- padding: 0;
- margin: var(--space-xl) 0;
- max-width: 100%;
- }
-}
-
-.api-index__entry {
- margin: var(--space-3xl) 0;
- padding: 0;
- width: 100%;
+/* Documentation Content */
+.documentation-content {
max-width: 100%;
}
-@media (max-width: 767px) {
- .api-index__entry {
- margin: var(--space-xl) 0;
- max-width: 100%;
- }
-}
-
-.api-index__entry::before {
- display: none;
-}
-
-.api-namespace-toggle {
- width: 100%;
- display: flex;
- align-items: center;
- justify-content: space-between;
- background: none;
- border: none;
- padding: 0;
- cursor: default;
- text-align: left;
- transition: all var(--duration-fast) var(--ease-out);
- border-bottom: 2px solid var(--color-light-border);
- padding-bottom: var(--space-sm);
- margin-bottom: var(--space-lg);
-}
-
-/* Only make it interactive when there's overflow */
-.api-index__entry:has(.api-namespace-content.has-overflow) .api-namespace-toggle {
- cursor: pointer;
+.documentation-content h1 {
+ font-size: var(--text-3xl);
+ margin-bottom: var(--space-xl);
}
-.api-namespace-title {
+.documentation-content h2 {
font-size: var(--text-2xl);
- font-weight: 600;
- color: var(--color-light-link);
- margin: 0;
- padding: 0;
- letter-spacing: -0.02em;
- line-height: 1;
-}
-
-.api-namespace-toggle-indicator {
- display: none;
- align-items: flex-end;
- gap: var(--space-sm);
- flex-shrink: 0;
-}
-
-/* Only show indicator when there's overflow */
-.api-index__entry:has(.api-namespace-content.has-overflow) .api-namespace-toggle-indicator {
- display: flex;
-}
-
-.api-namespace-toggle-text {
- font-size: var(--text-sm);
- font-weight: 600;
- color: var(--color-phel-primary);
- opacity: 0.8;
- transition: opacity var(--duration-fast) var(--ease-out);
-}
-
-.api-namespace-toggle:hover .api-namespace-toggle-text {
- opacity: 1;
- color: var(--color-phel-primary);
-}
-
-/* When hovering over collapsed area, highlight the toggle text */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow:hover ~ .api-namespace-toggle .api-namespace-toggle-text,
-.api-index__entry:has(.api-namespace-content.has-overflow:hover) .api-namespace-toggle-text {
- opacity: 1;
- color: var(--color-phel-primary);
-}
-
-/* Update text content based on state */
-.api-namespace-toggle[aria-expanded="true"] .api-namespace-toggle-text::before {
- content: "Show less";
-}
-
-.api-namespace-toggle[aria-expanded="false"] .api-namespace-toggle-text::before {
- content: "Show all";
-}
-
-.api-namespace-icon {
- flex-shrink: 0;
- color: var(--color-phel-primary);
- transition: transform var(--duration-normal) var(--ease-out);
- opacity: 0.8;
- width: 24px;
- height: 24px;
-}
-
-.api-namespace-toggle:hover .api-namespace-icon {
- opacity: 1;
- color: var(--color-phel-primary);
-}
-
-/* When hovering over collapsed area, highlight the icon */
-.api-index__entry:has(.api-namespace-content.has-overflow:hover) .api-namespace-icon {
- opacity: 1;
- color: var(--color-phel-primary);
-}
-
-/* Collapsed (closed) = chevron down (V), Expanded (open) = chevron up (^) */
-.api-namespace-toggle[aria-expanded="true"] .api-namespace-icon {
- transform: rotate(180deg);
-}
-
-.api-namespace-content {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-sm);
- list-style: none;
- padding: 0;
- margin: 0;
- position: relative;
- max-height: 5000px;
- overflow: visible;
- transition: max-height var(--duration-normal) var(--ease-out);
- width: 100%;
- max-width: 100%;
- box-sizing: border-box;
-}
-
-@media (max-width: 767px) {
- .api-namespace-content {
- gap: var(--space-xs);
- max-width: 100%;
- padding: 0;
- }
-
- .api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow {
- width: 100%;
- }
-}
-
-/* Collapsed state - show preview with fade */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content {
- max-height: 160px;
- overflow: hidden;
+ margin-top: var(--space-2xl);
margin-bottom: var(--space-lg);
+ padding-bottom: var(--space-sm);
+ border-bottom: 2px solid var(--color-light-border);
}
-/* Make entire collapsed area clickable */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow {
- cursor: pointer;
- border-radius: var(--radius-lg);
- width: calc(100% + var(--space-md) * 2);
-}
-
-/* Disable pill interactions when collapsed and has overflow */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow a {
- pointer-events: none;
- cursor: pointer;
-}
-
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content::after {
- content: '';
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 120px;
- background: linear-gradient(to bottom,
- transparent 0%,
- var(--color-light-bg) 100%);
- pointer-events: none;
- opacity: 0;
- transition: opacity var(--duration-fast) var(--ease-out);
-}
-
-/* Only show fade when content is taller than max-height */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow::after {
- opacity: 1;
-}
-
-/* Expand overlay for collapsed sections with overflow */
-.api-namespace-toggle[aria-expanded="false"] + .api-namespace-content.has-overflow::before {
- content: 'Expand';
- position: absolute;
- top: 65%;
- left: 50%;
- transform: translate(-50%, -50%);
- padding: var(--space-sm) var(--space-lg);
- background: var(--color-light-link);
- color: white;
- border: 1px solid var(--color-light-link);
- border-radius: var(--radius-lg);
- font-size: var(--text-sm);
- font-weight: 600;
- box-shadow: none;
- opacity: 0.8;
- pointer-events: none;
- transition: opacity var(--duration-normal) var(--ease-in);
- z-index: 10;
-}
-
-/* Expanded state - show all */
-.api-namespace-toggle[aria-expanded="true"] + .api-namespace-content {
- max-height: 5000px;
-}
-
-.api-namespace-toggle[aria-expanded="true"] + .api-namespace-content::after {
- display: none;
-}
-
-.api-index__entry > ul li {
- margin: 0;
- padding: 0;
-}
-
-.api-index__entry > ul li::before {
- display: none;
-}
-
-.api-index__entry > ul a {
- display: inline-block;
- padding: var(--space-xs) var(--space-md);
- background: var(--color-light-bg-secondary);
- color: var(--color-light-text-secondary);
- font-size: var(--text-sm);
- font-weight: 500;
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-lg);
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
- box-shadow: var(--shadow-xs);
- max-width: 100%;
- word-break: break-word;
- overflow-wrap: break-word;
-}
-
-.api-index__entry > ul a::after {
- display: none;
-}
-
-.api-index__entry > ul a:hover {
- background: var(--color-light-link);
- color: white;
- border-color: var(--color-light-link);
- box-shadow: var(--shadow-sm);
- transform: translateY(-1px);
-}
-
-/* Mobile-specific pill constraints */
-@media (max-width: 767px) {
- .api-index__entry > ul a {
- padding: var(--space-xs) var(--space-sm);
- font-size: 0.75rem;
- max-width: 100%;
- flex-shrink: 1;
- min-width: 0;
- }
-}
-
-/* Documentation content enhancements */
-.documentation-content {
- font-size: var(--text-body);
- line-height: var(--leading-relaxed);
-}
-
-/* Exercise Solution Toggle */
-.solution {
- margin: var(--space-xl) 0;
-}
-
-.solution input[type="checkbox"] {
- display: none;
-}
-
-.solution label {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- padding: var(--space-sm) var(--space-md);
- background: var(--color-light-surface);
- color: var(--color-light-link);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-md);
- cursor: pointer;
- font-size: var(--text-sm);
- font-weight: 600;
- transition: all var(--duration-fast) var(--ease-out);
+.documentation-content h3 {
+ font-size: var(--text-xl);
+ margin-top: var(--space-xl);
margin-bottom: var(--space-md);
}
-.solution label:hover {
- border-color: var(--color-light-link);
- background: var(--color-light-surface-hover);
-}
-
-/* Hide solution content by default */
-.solution input[type="checkbox"] ~ * {
- display: none;
-}
-
-.solution input[type="checkbox"] ~ label {
- display: inline-block;
-}
-
-/* Show solution when checkbox is checked */
-.solution input[type="checkbox"]:checked ~ * {
- display: block;
-}
-
-.solution input[type="checkbox"]:checked ~ label {
- display: inline-flex;
- background: var(--color-light-link);
- color: white;
- border-color: var(--color-light-link);
-}
-
-.solution input[type="checkbox"]:checked ~ label::before {
- content: '← Hide solution';
-}
-
-.solution input[type="checkbox"]:not(:checked) ~ label::before {
- content: '→ Show solution';
-}
-
-/* Remove default label text */
-.solution label {
- font-size: 0;
-}
-
-.solution label::before {
- font-size: var(--text-sm);
-}
-
-/* Add space between heading text and anchor link */
+/* Anchor Links */
.zola-anchor {
margin-left: var(--space-sm);
- color: var(--color-light-anchor);
opacity: 0;
+ color: var(--color-light-anchor);
+ text-decoration: none;
+ font-weight: 400;
transition: opacity var(--duration-fast) var(--ease-out);
}
@@ -536,97 +58,19 @@ h6:hover .zola-anchor {
opacity: 1;
}
-/* API documentation specific */
-.api-doc {
- margin: var(--space-2xl) 0;
-}
-
-.api-doc-header {
- display: flex;
- align-items: baseline;
- gap: var(--space-md);
- padding: var(--space-lg);
- background: var(--color-light-bg-secondary);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-lg);
- margin-bottom: var(--space-md);
-}
-
-.api-doc-name {
- font-family: var(--font-mono);
- font-size: var(--text-lg);
- font-weight: 700;
- color: var(--color-light-link);
-}
-
-.api-doc-type {
- padding: var(--space-xs) var(--space-sm);
- font-size: var(--text-xs);
- font-weight: 600;
- background: var(--color-light-surface-hover);
- color: var(--color-light-link);
- border-radius: var(--radius-sm);
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-.api-doc-description {
- padding: 0 var(--space-lg);
- color: var(--color-light-text-secondary);
- line-height: var(--leading-relaxed);
-}
-
-/* Code examples with header */
-.code-block-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: var(--space-sm) var(--space-lg);
- background: var(--color-light-bg-secondary);
- border: 1px solid var(--color-light-border);
- border-bottom: none;
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
- font-size: var(--text-sm);
- font-weight: 600;
- color: var(--color-light-text-secondary);
-}
-
-.code-block-header + pre {
- border-radius: 0 0 var(--radius-lg) var(--radius-lg);
-}
-
-.copy-code-button:active {
- transform: translateY(0);
-}
-
-/* Breadcrumbs */
-.breadcrumbs {
- display: flex;
- align-items: center;
- gap: var(--space-sm);
- margin-bottom: var(--space-xl);
- padding: var(--space-md);
- background: var(--color-light-bg-secondary);
- border-radius: var(--radius-lg);
- font-size: var(--text-sm);
-}
-
-.breadcrumbs a {
+.zola-anchor:hover {
color: var(--color-light-link);
- text-decoration: none;
- transition: color var(--duration-fast) var(--ease-out);
}
-.breadcrumbs a::after {
- display: none;
-}
+/* ========================================
+ DARK MODE
+ ======================================== */
-.breadcrumbs a:hover {
- color: var(--color-light-link);
+.dark .documentation-content h2 {
+ border-bottom-color: var(--color-dark-border);
}
-.breadcrumbs span:not(:last-child)::after {
- content: '→';
- margin-left: var(--space-sm);
- color: var(--color-gray-light);
+.dark .zola-anchor,
+.dark .zola-anchor:hover {
+ color: var(--color-dark-anchor);
}
diff --git a/css/components/exercises.css b/css/components/exercises.css
new file mode 100644
index 0000000..51d1f41
--- /dev/null
+++ b/css/components/exercises.css
@@ -0,0 +1,40 @@
+.solution {
+ margin: var(--space-xl) 0;
+}
+
+.solution input[type="checkbox"] {
+ display: none;
+}
+
+.solution .btn::before {
+ content: '→ Show solution';
+}
+
+.solution input[type="checkbox"]:checked ~ .btn.btn-secondary {
+ background: var(--color-light-link) !important;
+ color: white !important;
+ border-color: var(--color-light-link) !important;
+}
+
+.solution input[type="checkbox"]:checked ~ .btn::before {
+ content: '← Hide solution';
+}
+
+.solution .solution-content {
+ display: none;
+}
+
+.solution input[type="checkbox"]:checked ~ .solution-content {
+ display: block;
+}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .solution input[type="checkbox"]:checked ~ .btn.btn-secondary {
+ background: var(--color-dark-text-accent) !important;
+ color: var(--color-dark-bg) !important;
+ border-color: var(--color-dark-text-accent) !important;
+}
+
diff --git a/css/components/footer.css b/css/components/footer.css
index 00f831c..c806a17 100644
--- a/css/components/footer.css
+++ b/css/components/footer.css
@@ -1,4 +1,3 @@
-/* Footer Styles */
.site-footer {
background: var(--color-light-bg-secondary);
border-top: 1px solid var(--color-light-border);
@@ -302,3 +301,69 @@
margin-top: var(--space-3xl);
}
}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .site-footer {
+ background: var(--color-dark-header-bg);
+ border-top-color: var(--color-dark-header-footer-border);
+}
+
+.dark .footer-logo .phel-logo {
+ stroke: white;
+}
+
+.dark .footer-logo .logo-text {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .footer-description {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .footer-social a {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ color: var(--color-dark-text-primary);
+}
+
+.dark .footer-social a:hover {
+ background: var(--color-dark-text-accent);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+}
+
+.dark .footer-column h3 {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .footer-column ul li a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .footer-column ul li a:hover {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .footer-bottom {
+ border-top-color: var(--color-dark-border);
+}
+
+.dark .footer-copyright {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .footer-badge {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .footer-badge-separator {
+ color: var(--color-dark-text-muted);
+}
+
+.dark .footer-badge-version {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+}
diff --git a/css/components/header.css b/css/components/header.css
index fa9847b..4b1bbca 100644
--- a/css/components/header.css
+++ b/css/components/header.css
@@ -1,5 +1,5 @@
/* Header Container */
-@utility site-header {
+.site-header {
position: fixed;
top: 0;
left: 0;
@@ -94,7 +94,7 @@
LOGO
======================================== */
-@utility site-header__logo {
+.site-header__logo {
display: flex;
align-items: center;
flex-shrink: 0;
@@ -130,7 +130,7 @@
DESKTOP NAVIGATION
======================================== */
-@utility site-header__navigation {
+.site-header__navigation {
display: none;
flex: 0 1 auto;
align-items: center;
@@ -203,158 +203,11 @@
}
}
-/* ========================================
- SEARCH
- ======================================== */
-
-@utility site-header__search {
- position: relative;
- margin-left: auto;
- flex: 1;
- max-width: 370px;
- transition: max-width var(--duration-normal) var(--ease-out);
-}
-
-@media (min-width: 1040px) {
- .site-header__search:focus-within {
- max-width: 600px;
- }
-}
-
-#search {
- width: 100%;
- padding: var(--space-sm) var(--space-md);
- padding-left: 36px;
- font-size: var(--text-sm);
- font-family: var(--font-primary);
- color: var(--color-light-text-primary);
- background-color: var(--color-light-bg-secondary);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-full);
- outline: none;
- transition: all var(--duration-normal) var(--ease-out);
- box-shadow: var(--shadow-xs);
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236366f1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
- background-repeat: no-repeat;
- background-position: 10px center;
- background-size: 16px;
-}
-
-#search:hover {
- border-color: var(--color-light-link);
- box-shadow: var(--shadow-sm);
-}
-
-#search:focus {
- border-color: var(--color-light-link);
- background-color: var(--color-light-surface);
- box-shadow: 0 0 0 3px var(--color-light-surface-hover),
- var(--shadow-md);
-}
-
-#search::placeholder {
- color: var(--color-gray-light);
-}
-
-/* Custom clear button for search input */
-#search::-webkit-search-cancel-button {
- -webkit-appearance: none;
- appearance: none;
- height: 18px;
- width: 18px;
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23666666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
- background-size: 18px 18px;
- background-repeat: no-repeat;
- background-position: center;
- cursor: pointer;
- opacity: 0.8;
- transition: opacity var(--duration-fast) var(--ease-out);
-}
-
-#search::-webkit-search-cancel-button:hover {
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23333333' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
- opacity: 1;
-}
-
-/* Mobile search adjustments */
-@media (max-width: 1039px) {
- .site-header__search {
- flex: 0 0 auto;
- width: 50%;
- min-width: 180px;
- max-width: 360px;
- transition: all var(--duration-normal) var(--ease-out);
- }
-
- #search {
- font-size: max(var(--text-sm), 16px);
- padding: var(--space-sm) var(--space-md);
- padding-left: 36px;
- background-size: 16px;
- background-position: 10px center;
- width: 100%;
- border: 1px solid var(--color-light-border);
- transition: all var(--duration-normal) var(--ease-out);
- }
-
- #search::placeholder {
- opacity: 1;
- transition: opacity var(--duration-fast) var(--ease-out);
- }
-
- /* When search is expanded on mobile, hide other elements */
- .site-header__container.search-expanded {
- gap: 0;
- padding-left: var(--space-md);
- padding-right: var(--space-md);
- }
-
- .site-header__container.search-expanded .mobile-menu-toggle,
- .site-header__container.search-expanded .site-header__logo {
- opacity: 0;
- pointer-events: none;
- width: 0;
- min-width: 0;
- margin: 0;
- padding: 0;
- overflow: hidden;
- transition: all var(--duration-normal) var(--ease-out);
- }
-
- .site-header__container.search-expanded .site-header__search {
- flex: 1 1 100%;
- width: 100%;
- max-width: none;
- margin: 0;
- }
-
- .site-header__container.search-expanded #search {
- width: 100%;
- border-color: var(--color-light-link);
- animation: expandSearch var(--duration-normal) var(--ease-out);
- }
-
- .site-header__container.search-expanded #search::placeholder {
- opacity: 1;
- }
-}
-
-@keyframes expandSearch {
- from {
- transform: scale(0.95);
- opacity: 0.8;
- }
- to {
- transform: scale(1);
- opacity: 1;
- }
-}
-
/* ========================================
DESKTOP ACTIONS (Dark Mode, Social)
======================================== */
-@utility site-header__actions {
+.site-header__actions {
display: none;
}
@@ -367,7 +220,7 @@
}
}
-@utility site-header__link {
+.site-header__link {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -389,7 +242,7 @@
height: 20px;
}
-@utility dark-mode-toggle {
+.dark-mode-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
@@ -440,11 +293,11 @@
opacity: 1 !important;
}
-.mobile-menu-nav {
+.mobile-menu__nav {
padding: var(--space-xl) var(--space-lg);
}
-.mobile-menu-nav ul {
+.mobile-menu__nav ul {
list-style: none;
padding: 0;
margin: 0;
@@ -453,19 +306,19 @@
gap: var(--space-md);
}
-.mobile-menu-nav li {
+.mobile-menu__nav li {
margin: 0;
width: 100%;
}
-.mobile-menu-nav li::before {
+.mobile-menu__nav li::before {
display: none;
}
-.mobile-menu-nav a {
+.mobile-menu__nav a {
display: block;
width: 100%;
- padding: var(--space-sm) var(--space-md);
+ padding: 0.4rem var(--space-md);
font-size: var(--text-xl);
font-weight: 600;
color: var(--color-light-text-primary);
@@ -478,12 +331,12 @@
box-sizing: border-box;
}
-.mobile-menu-nav a::after {
+.mobile-menu__nav a::after {
display: none;
}
-.mobile-menu-nav a:hover,
-.mobile-menu-nav a:active {
+.mobile-menu__nav a:hover,
+.mobile-menu__nav a:active {
background: var(--color-light-link);
color: white;
border-color: var(--color-light-link);
@@ -491,7 +344,7 @@
}
/* Mobile menu social links */
-.mobile-menu-link {
+.mobile-menu__link {
display: flex;
align-items: center;
justify-content: center;
@@ -511,30 +364,37 @@
margin-top: var(--space-md);
}
-.mobile-menu-link::after {
+.mobile-menu__link::after {
display: none;
}
-.mobile-menu-link:hover,
-.mobile-menu-link:active {
+.mobile-menu__link:hover,
+.mobile-menu__link:active {
background: var(--color-light-link);
color: white;
border-color: var(--color-light-link);
transform: scale(1.02);
}
-.mobile-menu-link svg {
+.mobile-menu__link svg {
flex-shrink: 0;
}
-/* Mobile menu actions (Dark mode toggle) */
-.mobile-menu-actions {
- margin-top: var(--space-2xl);
- padding-top: var(--space-xl);
+/* Mobile menu actions (Social links + Dark mode toggle) */
+.mobile-menu__actions {
+ margin-top: var(--space-xl);
+ padding-top: var(--space-sm);
border-top: 2px solid var(--color-light-border);
}
-.mobile-dark-mode-toggle {
+.mobile-menu__social-links {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: var(--space-md);
+ margin-bottom: var(--space-lg);
+}
+
+.mobile-menu__dark-mode-toggle {
display: flex;
align-items: center;
justify-content: center;
@@ -549,15 +409,14 @@
border-radius: var(--radius-xl);
cursor: pointer;
transition: all var(--duration-fast) var(--ease-out);
- font-family: var(--font-primary);
}
-.mobile-dark-mode-toggle:hover {
+.mobile-menu__dark-mode-toggle:hover {
background: var(--color-light-surface-hover);
border-color: var(--color-light-link);
}
-.mobile-dark-mode-toggle svg {
+.mobile-menu__dark-mode-toggle svg {
width: 24px;
height: 24px;
}
@@ -575,14 +434,124 @@ body.menu-open {
}
/* ========================================
- ANIMATIONS
+ DARK MODE
======================================== */
-@keyframes fadeIn {
- from {
- opacity: 0;
+.dark .site-header {
+ background: var(--color-dark-header-bg);
+ backdrop-filter: blur(var(--backdrop-blur-header)) saturate(180%);
+ -webkit-backdrop-filter: blur(var(--backdrop-blur-header)) saturate(180%);
+ border-bottom-color: var(--color-dark-header-footer-border);
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3),
+ 0 2px 4px -1px rgba(0, 0, 0, 0.2);
+}
+
+.dark .site-header.scrolled {
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
+}
+
+.dark .site-header__logo .phel-logo {
+ stroke: var(--color-dark-text-primary);
+ filter: drop-shadow(0 2px 4px rgba(241, 245, 249, 0.1));
+}
+
+.dark .site-header__logo .logo-text {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .site-header__navigation a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .site-header__navigation a::after {
+ background: var(--color-dark-text-accent);
+}
+
+.dark .site-header__navigation a:hover {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .site-header__navigation li.active a {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .site-header__mobile-menu .hamburger-icon span {
+ background: var(--color-dark-text-primary);
+}
+
+.dark .site-header__mobile-menu .hamburger-icon:hover {
+ background: rgba(191, 164, 255, 0.15);
+}
+
+.dark .site-header__actions {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .site-header__link,
+.dark .dark-mode-toggle {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .site-header__link:hover,
+.dark .dark-mode-toggle:hover {
+ color: var(--color-dark-text-accent);
+ background: rgba(191, 164, 255, 0.15);
+}
+
+/* Mobile menu dark mode */
+@media (max-width: 1039px) {
+ .dark .mobile-menu-overlay {
+ background: var(--color-dark-header-bg);
+ backdrop-filter: blur(var(--backdrop-blur-lg));
+ -webkit-backdrop-filter: blur(var(--backdrop-blur-lg));
+ }
+
+ .dark .mobile-menu__nav a {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ color: var(--color-dark-text-primary);
+ }
+
+ .dark .mobile-menu__nav a:hover,
+ .dark .mobile-menu__nav a:active {
+ background: var(--color-dark-text-accent);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
}
- to {
- opacity: 1;
+
+ .dark .mobile-menu__link {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ color: var(--color-dark-text-primary);
+ }
+
+ .dark .mobile-menu__link:hover,
+ .dark .mobile-menu__link:active {
+ background: var(--color-dark-text-accent);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ }
+
+ .dark .mobile-menu__actions {
+ border-top-color: var(--color-dark-border);
+ }
+
+ .dark .mobile-menu__dark-mode-toggle {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ color: var(--color-dark-text-primary);
+ }
+
+ .dark .mobile-menu__dark-mode-toggle:hover {
+ background: rgba(191, 164, 255, 0.15);
+ border-color: var(--color-dark-text-accent);
+ }
+
+ .dark .mobile-menu-toggle span {
+ background: var(--color-dark-text-primary);
+ }
+
+ .dark .mobile-menu-toggle:hover {
+ background: rgba(191, 164, 255, 0.15);
}
}
diff --git a/css/components/features.css b/css/components/homepage.css
similarity index 73%
rename from css/components/features.css
rename to css/components/homepage.css
index ab8b157..a6cb83c 100644
--- a/css/components/features.css
+++ b/css/components/homepage.css
@@ -1,28 +1,4 @@
-/* Homepage Content */
-.homepage-content h1 {
- font-size: 2.5rem;
- font-weight: 800;
- line-height: 1.1;
- margin: var(--space-3xl) 0 var(--space-lg);
- text-align: center;
-}
-
-.homepage-title-accent {
- color: var(--color-phel-primary);
-}
-
-@media (min-width: 640px) {
- .homepage-content h1 {
- font-size: 3rem;
- }
-}
-
-@media (min-width: 1024px) {
- .homepage-content h1 {
- font-size: 3.5rem;
- }
-}
-
+/* Homepage Content Container */
.homepage-content h2 {
text-align: center;
font-size: var(--text-3xl);
@@ -42,7 +18,7 @@
.homepage-content > p:first-of-type {
font-size: var(--text-lg);
color: var(--color-light-text-secondary);
- margin-bottom: var(--space-2xl);
+ margin-bottom: var(--space-xl);
max-width: 50rem;
margin-left: auto;
margin-right: auto;
@@ -50,9 +26,7 @@
.homepage-content img {
display: block;
- margin-left: auto;
- margin-right: auto;
- margin-bottom: var(--space-3xl);
+ margin: var(--space-2xl) auto;
user-select: none;
-webkit-user-drag: none;
pointer-events: none;
@@ -131,12 +105,12 @@
}
.why-card:hover {
- border-color: var(--color-phel-primary);
+ border-color: var(--color-light-link);
box-shadow: var(--shadow-sm);
}
.why-card-icon {
- color: var(--color-phel-primary);
+ color: var(--color-light-link);
}
.why-card-icon svg {
@@ -212,14 +186,15 @@
}
.homepage-cta-primary {
- background: var(--color-phel-primary);
+ background: var(--color-light-link);
color: white;
- border: 2px solid var(--color-phel-primary);
+ border: 2px solid var(--color-light-link);
}
.homepage-cta-primary:hover {
background: #6d3fc2;
border-color: #6d3fc2;
+ color: white;
}
.homepage-cta-secondary {
@@ -229,8 +204,8 @@
}
.homepage-cta-secondary:hover {
- border-color: var(--color-phel-primary);
- color: var(--color-phel-primary);
+ border-color: var(--color-light-link);
+ color: var(--color-light-link);
}
.homepage-cta-icon {
@@ -277,12 +252,12 @@
}
.feature-card:hover {
- border-color: var(--color-phel-primary);
+ border-color: var(--color-light-link);
box-shadow: var(--shadow-sm);
}
.feature-icon {
- color: var(--color-phel-primary);
+ color: var(--color-light-link);
margin-bottom: var(--space-sm);
}
@@ -342,3 +317,80 @@
display: none;
}
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .homepage-content > p:first-of-type {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .homepage-code-section {
+ background: rgba(191, 164, 255, 0.05);
+}
+
+.dark .why-card {
+ background: var(--color-dark-bg);
+ border-color: var(--color-dark-border);
+ color: var(--color-dark-text-primary);
+}
+
+.dark .why-card:hover {
+ border-color: var(--color-dark-text-accent);
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
+}
+
+.dark .why-card-icon {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .homepage-cta-primary {
+ background: var(--color-dark-text-accent);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+}
+
+.dark .homepage-cta-primary:hover {
+ background: #c2acf5;
+ border-color: #c2acf5;
+ color: var(--color-dark-bg);
+}
+
+.dark .homepage-cta-secondary {
+ background: transparent;
+ color: var(--color-dark-text-primary);
+ border-color: var(--color-dark-border);
+}
+
+.dark .homepage-cta-secondary:hover {
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .feature-card {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+}
+
+.dark .feature-card:hover {
+ border-color: var(--color-dark-text-accent);
+ box-shadow: var(--shadow-dark-sm);
+}
+
+.dark .feature-icon {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .feature-title {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .feature-description {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .feature-items p,
+.dark .feature-items li {
+ color: var(--color-dark-text-secondary);
+}
+
diff --git a/css/components/layout.css b/css/components/layout.css
index 06fb7f7..94e3920 100644
--- a/css/components/layout.css
+++ b/css/components/layout.css
@@ -1,5 +1,5 @@
/* Layout Container with smooth transitions */
-@utility layout-container {
+.layout-container {
min-height: 100vh;
display: flex;
flex-direction: column;
@@ -8,7 +8,7 @@
}
/* One Column Layout - Modern Content */
-@utility one-column-layout {
+.one-column-layout {
margin: 0 auto;
width: 100%;
max-width: var(--container-content);
@@ -23,10 +23,9 @@
}
/* Two Column Layout - Modern Documentation */
-@utility two-column-layout {
+.two-column-layout {
display: grid;
grid-template-columns: minmax(0, 1fr);
- gap: var(--space-md);
max-width: var(--container-wide);
width: 100%;
margin: 0 auto;
@@ -52,7 +51,7 @@
}
/* Sidebar with modern sticky behavior */
-@utility two-column-layout__sidebar {
+.two-column-layout__sidebar {
order: -1;
}
@@ -62,13 +61,13 @@
align-items: center;
justify-content: center;
width: 100%;
- padding: var(--space-md);
+ padding: 0.7rem;
background: var(--color-light-bg-secondary);
border: 1px solid var(--color-light-border);
border-radius: var(--radius-lg);
color: var(--color-light-text-primary);
cursor: pointer;
- margin: var(--space-xl) 0;
+ margin: var(--space-xl) 0 var(--space-sm);
transition: all var(--duration-fast) var(--ease-out);
position: relative;
z-index: 10;
@@ -111,7 +110,7 @@
/* Add bottom border to sidebar when accordion is open on mobile */
.two-column-layout__sidebar:has(.sidebar-content.active) {
- padding-bottom: var(--space-xl);
+ padding-bottom: var(--space-md);
border-bottom: 2px solid var(--color-light-border);
}
@@ -127,16 +126,15 @@
.two-column-layout__sidebar {
order: -1;
margin-bottom: 0;
- padding-bottom: 0;
- padding: var(--space-xl);
- border-bottom: none;
+ padding: var(--space-xl) var(--space-xl) 0 var(--space-xl);
+ /*border-bottom: none;*/
+ border: 1px solid var(--color-light-border);
position: sticky;
top: calc(var(--header-height) + var(--space-xl));
align-self: start;
max-height: calc(100vh - var(--header-height) - var(--space-2xl));
overflow-y: auto;
background: var(--color-light-surface);
- border: 1px solid var(--color-light-border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-sm);
transition: all var(--duration-normal) var(--ease-out);
@@ -175,7 +173,7 @@
}
/* Main content area */
-@utility two-column-layout__main {
+.two-column-layout__main {
order: 1;
min-width: 0;
width: 100%;
@@ -192,7 +190,7 @@
}
/* Modern Page Navigation (Previous/Next) */
-@utility related-container {
+.related-container {
display: flex;
justify-content: space-between;
gap: var(--space-lg);
@@ -206,42 +204,21 @@
}
}
-.related-container .link {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: var(--space-sm);
- min-width: 40px;
- height: 40px;
- padding: var(--space-sm) var(--space-md);
- background: var(--color-light-surface);
+/* Related navigation buttons now use .btn from utilities */
+.related-container .btn {
color: var(--color-light-link);
- border: 1px solid var(--color-light-border);
- border-radius: var(--radius-md);
- font-weight: 600;
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
}
-.related-container .link:hover {
- border-color: var(--color-light-link);
- background: var(--color-light-surface-hover);
-}
-
-.related-container .link::after {
- display: none;
-}
-
-.related-container .link .link-title {
+.related-container .link__title {
flex: 1;
}
-.related-container .link > span:not(.link-title) {
+.related-container .link > span:not(.link__title) {
flex-shrink: 0;
}
/* Back to Top Button */
-@utility back-to-top-button {
+.back-to-top-button {
position: fixed;
bottom: var(--space-2xl);
right: var(--space-xl);
@@ -280,34 +257,77 @@
transform: scale(0.95);
}
-/* Animation keyframes */
-@keyframes fadeInUp {
- from {
- opacity: 0;
- transform: translateY(30px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+@media (min-width: 1040px) {
+ .dark .two-column-layout__sidebar {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ box-shadow: var(--shadow-dark-sm);
}
}
-@keyframes slideInRight {
- from {
- opacity: 0;
- transform: translateX(-30px);
- }
- to {
- opacity: 1;
- transform: translateX(0);
+@media (max-width: 1039px) {
+ .dark .two-column-layout__sidebar {
+ background: transparent;
+ border-bottom-color: var(--color-dark-border);
}
}
-@keyframes pulse {
- 0%, 100% {
- opacity: 1;
- }
- 50% {
- opacity: 0.8;
- }
+.dark .sidebar-toggle {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-text-secondary);
+ color: var(--color-dark-text-primary);
+}
+
+.dark .sidebar-toggle:hover {
+ background: var(--color-dark-surface-hover);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .two-column-layout__sidebar:has(.sidebar-content.active) {
+ border-bottom-color: var(--color-dark-border);
+}
+
+.dark .two-column-layout__sidebar::-webkit-scrollbar-thumb {
+ background: var(--color-dark-border);
+ border: 2px solid transparent;
+ background-clip: padding-box;
+}
+
+.dark .two-column-layout__sidebar::-webkit-scrollbar-thumb:hover {
+ background: var(--color-gray-base);
+ background-clip: padding-box;
+}
+
+.dark .related-container {
+ background: transparent;
+ border: none;
+ box-shadow: none;
+}
+
+/* Related container dark mode - btn styles inherited, add link color */
+.dark .related-container .btn {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .related-container .link > span:not(.link-title) {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .back-to-top-button,
+.dark #back-to-top-button {
+ background: var(--color-dark-surface);
+ color: var(--color-dark-text-primary);
+ border: 1px solid var(--color-dark-border);
+}
+
+.dark .back-to-top-button:hover,
+.dark #back-to-top-button:hover {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ border-color: var(--color-dark-text-accent);
}
diff --git a/css/components/navigation.css b/css/components/navigation.css
index b9a8602..506bfd6 100644
--- a/css/components/navigation.css
+++ b/css/components/navigation.css
@@ -16,73 +16,3 @@
.top-navigation li::before {
display: none;
}
-
-@media (min-width: 1040px) {
- .top-navigation__item--github,
- .top-navigation__item--x {
- display: none;
- }
-}
-
-/* Site Navigation (sidebar) */
-.site-navigation-title {
- font-size: var(--text-sm);
- font-weight: 700;
- color: var(--color-light-text-primary);
- margin: 0 0 var(--space-md) 0;
- text-transform: uppercase;
- letter-spacing: 0.05em;
-}
-
-@media (min-width: 1040px) {
- .site-navigation-title {
- margin-top: 0;
- }
-}
-
-.site-navigation {
- list-style: none;
- padding: 0;
- margin: 0;
-}
-
-.site-navigation li {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-.site-navigation li::before {
- display: none;
-}
-
-.site-navigation__entry {
- margin: var(--space-xs) 0;
-}
-
-.site-navigation__entry a {
- display: block;
- padding: var(--space-sm) var(--space-md);
- color: var(--color-light-text-secondary);
- font-size: var(--text-sm);
- font-weight: 500;
- border-radius: var(--radius-md);
- text-decoration: none;
- transition: all var(--duration-fast) var(--ease-out);
-}
-
-.site-navigation__entry a::after {
- display: none;
-}
-
-.site-navigation__entry a:hover {
- color: var(--color-light-link);
- background: var(--color-light-surface-hover);
-}
-
-.site-navigation__entry.active a {
- color: var(--color-light-link);
- background: var(--color-light-surface-hover);
- font-weight: 600;
-}
-
diff --git a/css/components/search.css b/css/components/search.css
index 6d9a25e..94d2ccc 100644
--- a/css/components/search.css
+++ b/css/components/search.css
@@ -1,5 +1,136 @@
+.site-header__search {
+ position: relative;
+ margin-left: auto;
+ flex: 1;
+ max-width: 370px;
+ transition: max-width var(--duration-normal) var(--ease-out);
+}
+
+@media (min-width: 1040px) {
+ .site-header__search:focus-within {
+ max-width: 600px;
+ }
+}
+
+#search {
+ width: 100%;
+ padding: var(--space-sm) var(--space-md);
+ padding-left: 36px;
+ font-size: var(--text-sm);
+ color: var(--color-light-text-primary);
+ background-color: var(--color-light-bg-secondary);
+ border: 1px solid var(--color-light-border);
+ border-radius: var(--radius-full);
+ outline: none;
+ transition: all var(--duration-normal) var(--ease-out);
+ box-shadow: var(--shadow-xs);
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236366f1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: 10px center;
+ background-size: 16px;
+}
+
+#search:hover {
+ border-color: var(--color-light-link);
+ box-shadow: var(--shadow-sm);
+}
+
+#search:focus {
+ border-color: var(--color-light-link);
+ background-color: var(--color-light-surface);
+ box-shadow: 0 0 0 3px var(--color-light-surface-hover),
+ var(--shadow-md);
+}
+
+#search::placeholder {
+ color: var(--color-gray-light);
+}
+
+/* Custom clear button for search input */
+#search::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+ appearance: none;
+ height: 18px;
+ width: 18px;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23666666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
+ background-size: 18px 18px;
+ background-repeat: no-repeat;
+ background-position: center;
+ cursor: pointer;
+ opacity: 0.8;
+ transition: opacity var(--duration-fast) var(--ease-out);
+}
+
+#search::-webkit-search-cancel-button:hover {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23333333' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
+ opacity: 1;
+}
+
+/* Mobile search adjustments */
+@media (max-width: 1039px) {
+ .site-header__search {
+ flex: 0 0 auto;
+ width: 50%;
+ min-width: 180px;
+ max-width: 360px;
+ transition: all var(--duration-normal) var(--ease-out);
+ }
+
+ #search {
+ font-size: max(var(--text-sm), 16px);
+ padding: var(--space-sm) var(--space-md);
+ padding-left: 36px;
+ background-size: 16px;
+ background-position: 10px center;
+ width: 100%;
+ border: 1px solid var(--color-light-border);
+ transition: all var(--duration-normal) var(--ease-out);
+ }
+
+ #search::placeholder {
+ opacity: 1;
+ transition: opacity var(--duration-fast) var(--ease-out);
+ }
+
+ /* When search is expanded on mobile, hide other elements */
+ .site-header__container.search-expanded {
+ gap: 0;
+ padding-left: var(--space-md);
+ padding-right: var(--space-md);
+ }
+
+ .site-header__container.search-expanded .mobile-menu-toggle,
+ .site-header__container.search-expanded .site-header__logo {
+ opacity: 0;
+ pointer-events: none;
+ width: 0;
+ min-width: 0;
+ margin: 0;
+ padding: 0;
+ overflow: hidden;
+ transition: all var(--duration-normal) var(--ease-out);
+ }
+
+ .site-header__container.search-expanded .site-header__search {
+ flex: 1 1 100%;
+ width: 100%;
+ max-width: none;
+ margin: 0;
+ }
+
+ .site-header__container.search-expanded #search {
+ width: 100%;
+ border-color: var(--color-light-link);
+ animation: expandSearch var(--duration-normal) var(--ease-out);
+ }
+
+ .site-header__container.search-expanded #search::placeholder {
+ opacity: 1;
+ }
+}
+
/* Search results dropdown with glassmorphism */
-@utility search-results {
+.search-results {
position: absolute;
top: calc(100% + var(--space-sm));
left: 0;
@@ -57,7 +188,7 @@
}
/* Search results list */
-@utility search-results__items {
+.search-results__items {
list-style: none;
padding: var(--space-sm);
margin: 0;
@@ -73,7 +204,7 @@
}
/* Individual search result item */
-@utility search-results__item {
+.search-results__item {
display: flex;
flex-direction: column;
gap: var(--space-md);
@@ -91,7 +222,7 @@
opacity: 0.9;
}
-.search-result-link {
+.search-results__link {
display: block;
text-decoration: none;
color: var(--color-light-text-primary);
@@ -113,7 +244,7 @@
min-width: 0;
}
-.result-type-badge {
+.search-results__badge {
display: inline-flex;
align-items: center;
padding: 3px 8px;
@@ -127,12 +258,12 @@
line-height: 1.2;
}
-.result-type-badge--api {
+.search-results__badge--api {
background: var(--color-light-link);
color: white;
}
-.result-type-badge--docs {
+.search-results__badge--docs {
background: var(--color-light-text-accent);
color: white;
}
@@ -217,30 +348,6 @@
border-left: 3px solid var(--color-light-link);
}
-/* Category badges in search results */
-.search-results__item .category {
- display: inline-block;
- padding: var(--space-xs) var(--space-sm);
- font-size: var(--text-xs);
- font-weight: 600;
- border-radius: var(--radius-full);
- background: var(--color-light-surface-hover);
- color: var(--color-light-link);
- margin-top: var(--space-sm);
-}
-
-/* Animation keyframes */
-@keyframes slideInDown {
- from {
- opacity: 0;
- transform: translateY(-10px);
- }
- to {
- opacity: 1;
- transform: translateY(0);
- }
-}
-
/* Mobile responsive */
@media (max-width: 1039px) {
.search-results {
@@ -252,3 +359,108 @@
padding: var(--space-md);
}
}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark #search {
+ background-color: #1d232f;
+ color: var(--color-dark-text-primary);
+ border-color: #3a3a3a;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23666666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
+}
+
+.dark #search:hover {
+ border-color: #4a4a4a;
+ box-shadow: var(--shadow-dark-sm);
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23888888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
+}
+
+.dark #search:focus {
+ border-color: #5a5a5a;
+ background-color: var(--color-dark-surface);
+ box-shadow: 0 0 0 3px rgba(90, 90, 90, 0.3),
+ var(--shadow-dark-sm);
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23999999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cpath d='m21 21-4.35-4.35'%3E%3C/path%3E%3C/svg%3E");
+}
+
+.dark #search::placeholder {
+ color: var(--color-dark-text-muted);
+}
+
+.dark #search::-webkit-search-cancel-button {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23999999' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
+ opacity: 0.8;
+}
+
+.dark #search::-webkit-search-cancel-button:hover {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23cccccc' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='15' y1='9' x2='9' y2='15'%3E%3C/line%3E%3Cline x1='9' y1='9' x2='15' y2='15'%3E%3C/line%3E%3C/svg%3E");
+ opacity: 1;
+}
+
+.dark .search-results {
+ background: var(--color-dark-surface);
+ border-color: var(--color-dark-border);
+ box-shadow: var(--shadow-dark-lg);
+ color: var(--color-dark-text-primary);
+}
+
+.dark .search-results__item {
+ border-bottom-color: var(--color-dark-border);
+ opacity: 0.7;
+}
+
+.dark .search-results__link {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .search-results__item:hover {
+ background: var(--color-dark-surface-hover);
+ opacity: 0.8;
+}
+
+.dark .search-results__badge--api {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ border: 1px solid var(--color-dark-text-accent);
+}
+
+.dark .search-results__badge--docs {
+ background: var(--color-dark-link);
+ color: var(--color-dark-bg);
+ border: 1px solid var(--color-dark-link);
+}
+
+.dark .search-results__item .fn-name {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .search-results__item .fn-signature {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .search-results__item strong {
+ color: var(--color-dark-text-accent);
+}
+
+.dark .search-results__item .title {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .search-results__item .desc {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .search-results__item mark {
+ background: rgba(191, 164, 255, 0.3);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .search-results::-webkit-scrollbar-thumb {
+ background: var(--color-dark-border);
+}
+
+.dark .search-results::-webkit-scrollbar-thumb:hover {
+ background: var(--color-dark-border-subtle);
+}
diff --git a/css/components/sidebar.css b/css/components/sidebar.css
new file mode 100644
index 0000000..de14170
--- /dev/null
+++ b/css/components/sidebar.css
@@ -0,0 +1,180 @@
+/* Sidebar Title */
+.site-navigation__title {
+ font-size: var(--text-sm);
+ font-weight: 700;
+ color: var(--color-light-text-primary);
+ margin: var(--space-lg) 0 var(--space-md) 0;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+@media (min-width: 1040px) {
+ .site-navigation__title {
+ margin-top: 0;
+ }
+}
+
+/* Site Navigation */
+.site-navigation {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.site-navigation li {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.site-navigation li::before {
+ display: none;
+}
+
+.site-navigation__entry {
+ margin: var(--space-xs) 0;
+}
+
+.site-navigation__entry a {
+ display: block;
+ padding: var(--space-sm) var(--space-md);
+ color: var(--color-light-text-secondary);
+ font-size: var(--text-sm);
+ font-weight: 500;
+ border-radius: var(--radius-md);
+ text-decoration: none;
+ transition: all var(--duration-fast) var(--ease-out);
+}
+
+.site-navigation__entry a::after {
+ display: none;
+}
+
+.site-navigation__entry a:hover {
+ color: var(--color-light-link);
+ background: var(--color-light-surface-hover);
+}
+
+.site-navigation__entry.active a {
+ color: var(--color-light-link);
+ background: var(--color-light-surface-hover);
+ font-weight: 600;
+}
+
+/* Page TOC */
+.page-toc {
+ display: none;
+ margin-bottom: var(--space-2xl);
+ padding-bottom: var(--space-lg);
+ border-bottom: 2px solid var(--color-light-border);
+}
+
+@media (min-width: 1040px) {
+ .page-toc {
+ display: block;
+ }
+}
+
+.page-toc h2 {
+ font-size: var(--text-sm);
+ font-weight: 700;
+ color: var(--color-light-text-primary);
+ margin: 0 0 var(--space-md) 0;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.page-toc ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.page-toc li {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.page-toc li::before {
+ display: none;
+}
+
+.page-toc a {
+ display: block;
+ padding: var(--space-xs) var(--space-md);
+ font-size: var(--text-sm);
+ color: var(--color-light-text-secondary);
+ text-decoration: none;
+ border-radius: var(--radius-md);
+ transition: all var(--duration-fast) var(--ease-out);
+}
+
+.page-toc a::after {
+ display: none;
+}
+
+.page-toc a:hover {
+ color: var(--color-light-link);
+ background: var(--color-light-surface-hover);
+}
+
+.page-toc a.active {
+ color: var(--color-light-link);
+ background: var(--color-light-surface-hover);
+ font-weight: 600;
+}
+
+.page-toc ul ul {
+ margin-left: var(--space-md);
+}
+
+.page-toc ul ul a {
+ font-size: var(--text-xs);
+ padding-left: var(--space-sm);
+}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .site-navigation__title {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .site-navigation__entry a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .site-navigation__entry a:hover {
+ background: var(--color-dark-surface-hover);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .site-navigation__entry.active a {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
+.dark .page-toc {
+ border-bottom-color: var(--color-dark-border);
+}
+
+.dark .page-toc h2 {
+ color: var(--color-dark-text-primary);
+}
+
+.dark .page-toc a {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .page-toc a:hover {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
+.dark .page-toc a.active {
+ color: var(--color-dark-text-accent);
+ background: var(--color-dark-surface-hover);
+}
+
diff --git a/css/components/utilities.css b/css/components/utilities.css
new file mode 100644
index 0000000..8162b55
--- /dev/null
+++ b/css/components/utilities.css
@@ -0,0 +1,319 @@
+/* ========================================
+ UTILITY CLASSES
+ Base classes for common patterns
+ ======================================== */
+
+/* ========================================
+ BUTTONS
+ ======================================== */
+
+/* Base button styles */
+.btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: var(--space-sm);
+ padding: var(--space-sm) var(--space-md);
+ font-size: var(--text-sm);
+ font-weight: 600;
+ text-decoration: none;
+ border-radius: var(--radius-md);
+ cursor: pointer;
+ transition: all var(--duration-fast) var(--ease-out);
+ user-select: none;
+ border: 1px solid transparent;
+}
+
+/* Button variants */
+.btn-primary {
+ background: var(--color-light-link);
+ color: white;
+ border-color: var(--color-light-link);
+}
+
+.btn-primary:hover {
+ background: var(--color-light-link-hover, #5a5fcf);
+ border-color: var(--color-light-link-hover, #5a5fcf);
+}
+
+.btn-secondary {
+ background: var(--color-light-surface);
+ color: var(--color-light-text-primary);
+ border-color: var(--color-light-border);
+}
+
+.btn-secondary:hover {
+ background: var(--color-light-surface-hover);
+ border-color: var(--color-light-link);
+ color: var(--color-light-link);
+}
+
+.btn-ghost {
+ background: transparent;
+ color: var(--color-gray-dark);
+ border-color: transparent;
+}
+
+.btn-ghost:hover {
+ background: var(--color-light-surface-hover);
+ color: var(--color-light-link);
+}
+
+/* Button sizes */
+.btn-sm {
+ min-width: 40px;
+ height: 40px;
+ padding: var(--space-xs) var(--space-sm);
+ font-size: var(--text-xs);
+}
+
+.btn-md {
+ min-width: 40px;
+ height: 40px;
+ padding: var(--space-sm) var(--space-md);
+}
+
+.btn-lg {
+ padding: var(--space-md) var(--space-lg);
+ font-size: var(--text-base);
+}
+
+/* Button shapes */
+.btn-rounded {
+ border-radius: var(--radius-lg);
+}
+
+.btn-pill {
+ border-radius: var(--radius-full);
+}
+
+.btn-square {
+ width: 40px;
+ height: 40px;
+ padding: 0;
+}
+
+/* ========================================
+ BADGES
+ ======================================== */
+
+.badge {
+ display: inline-flex;
+ align-items: center;
+ padding: 3px 8px;
+ font-size: 0.65rem;
+ font-weight: 600;
+ border-radius: var(--radius-full);
+ white-space: nowrap;
+ flex-shrink: 0;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.badge-primary {
+ background: var(--color-light-link);
+ color: white;
+}
+
+.badge-secondary {
+ background: var(--color-light-surface);
+ color: var(--color-light-text-secondary);
+ border: 1px solid var(--color-light-border);
+}
+
+/* ========================================
+ FLEX UTILITIES
+ ======================================== */
+
+.flex {
+ display: flex;
+}
+
+.flex-center {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.flex-between {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.flex-col {
+ display: flex;
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.gap-sm {
+ gap: var(--space-sm);
+}
+
+.gap-md {
+ gap: var(--space-md);
+}
+
+.gap-lg {
+ gap: var(--space-lg);
+}
+
+/* ========================================
+ SPACING UTILITIES
+ ======================================== */
+
+.m-0 {
+ margin: 0;
+}
+
+.mt-sm {
+ margin-top: var(--space-sm);
+}
+
+.mt-md {
+ margin-top: var(--space-md);
+}
+
+.mt-lg {
+ margin-top: var(--space-lg);
+}
+
+.mb-sm {
+ margin-bottom: var(--space-sm);
+}
+
+.mb-md {
+ margin-bottom: var(--space-md);
+}
+
+.mb-lg {
+ margin-bottom: var(--space-lg);
+}
+
+/* ========================================
+ TEXT UTILITIES
+ ======================================== */
+
+.text-center {
+ text-align: center;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+/* ========================================
+ DISPLAY UTILITIES
+ ======================================== */
+
+.hidden {
+ display: none;
+}
+
+.block {
+ display: block;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+/* ========================================
+ SIZE UTILITIES
+ ======================================== */
+
+.w-full {
+ width: 100%;
+}
+
+.w-auto {
+ width: auto;
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-auto {
+ height: auto;
+}
+
+.max-w-full {
+ max-width: 100%;
+}
+
+.min-w-0 {
+ min-width: 0;
+}
+
+/* ========================================
+ DARK MODE
+ ======================================== */
+
+.dark .btn-primary {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+ border-color: var(--color-dark-text-accent);
+}
+
+.dark .btn-primary:hover {
+ background: #c2acf5;
+ border-color: #c2acf5;
+}
+
+.dark .btn-secondary {
+ background: var(--color-dark-surface);
+ color: var(--color-dark-text-primary);
+ border-color: var(--color-dark-border);
+}
+
+.dark .btn-secondary:hover {
+ background: var(--color-dark-surface-hover);
+ border-color: var(--color-dark-text-accent);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .btn-ghost {
+ color: var(--color-dark-text-secondary);
+}
+
+.dark .btn-ghost:hover {
+ background: rgba(191, 164, 255, 0.15);
+ color: var(--color-dark-text-accent);
+}
+
+.dark .badge-primary {
+ background: var(--color-dark-text-accent);
+ color: var(--color-dark-bg);
+}
+
+.dark .badge-secondary {
+ background: var(--color-dark-surface);
+ color: var(--color-dark-text-secondary);
+ border-color: var(--color-dark-border);
+}
+
diff --git a/css/theme.css b/css/theme.css
index 452f0d5..a8e2a00 100644
--- a/css/theme.css
+++ b/css/theme.css
@@ -1,4 +1,4 @@
-@import 'tailwindcss';
+@import 'tailwindcss/theme' layer(theme);
@source '../content/**/*.md';
@@ -15,7 +15,6 @@
--color-light-link: #512da8;
--color-light-border: #e2e8f0;
--color-light-border-subtle: #f1f5f9;
- --color-phel-primary: #512da8;
/* Modern Color Palette - Dark Mode */
--color-dark-bg: #212830;
@@ -24,7 +23,7 @@
--color-dark-text-secondary: #cbd5e1;
--color-dark-text-muted: #94a3b8;
--color-dark-text-accent: #bfa4ff;
- --color-dark-link: #bfa4ff;
+ --color-dark-link: #d1c7e5;
--color-dark-border: #3a3a3a;
--color-dark-border-subtle: #2a2a2a;
--color-dark-header-footer-border: #151a24;
@@ -36,7 +35,7 @@
--color-dark-surface: #2a313c;
--color-dark-surface-hover: #262c36;
- /* Code & Catalogue */
+ /* Code */
--color-light-code-bg: #f1f5f9;
--color-light-code-inline-bg: #e2e8f0;
--color-dark-code-bg: #262c36;
@@ -54,33 +53,14 @@
/* Extended Color Palette */
- --color-blue-darker: #1e40af;
- --color-blue-dark: #2563eb;
- --color-blue-base: #3b82f6;
- --color-blue-light: #60a5fa;
- --color-blue-lighter: #93c5fd;
-
- --color-green-darker: #047857;
- --color-green-dark: #059669;
- --color-green-base: #10b981;
- --color-green-light: #34d399;
- --color-green-lighter: #6ee7b7;
-
- --color-red-darker: #b91c1c;
- --color-red-dark: #dc2626;
- --color-red-base: #ef4444;
- --color-red-light: #f87171;
- --color-red-lighter: #fca5a5;
-
--color-gray-darker: #252525;
--color-gray-dark: #475569;
--color-gray-base: #64748b;
--color-gray-light: #94a3b8;
--color-gray-lighter: #cbd5e1;
- /* Modern Typography */
+ /* Typography */
--font-primary: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
- --font-secondary: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--font-mono: 'Fira Code', 'JetBrains Mono', 'Cascadia Code', 'Consolas', 'Monaco', monospace;
--font-inter: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif;
diff --git a/scripts/concat-tailwind.js b/scripts/concat-tailwind.js
index 19209de..5f89058 100644
--- a/scripts/concat-tailwind.js
+++ b/scripts/concat-tailwind.js
@@ -6,17 +6,33 @@ const outFile = path.join(projectRoot, 'css', 'tailwind.entry.css');
// Define concatenation order (top → bottom)
const parts = [
+ // 1. Foundation
'css/theme.css',
'css/base.css',
- 'css/components/footer.css',
+ 'css/components/utilities.css',
+
+ // 2. Layout & Structure
+ 'css/components/layout.css',
'css/components/header.css',
+ 'css/components/footer.css',
'css/components/navigation.css',
- 'css/components/layout.css',
- 'css/components/search.css',
- 'css/components/documentation.css',
+ 'css/components/sidebar.css',
+
+ // 3. Pages
+ 'css/components/homepage.css',
'css/components/blog.css',
- 'css/components/features.css',
+ 'css/components/documentation.css',
+ 'css/components/api.css',
+ 'css/components/exercises.css',
+
+ // 4. Features
+ 'css/components/search.css',
'css/components/code-block.css',
+
+ // 5. Animations
+ 'css/components/animations.css',
+
+ // 6. Dark Mode (last to override)
'css/components/dark-mode.css',
];
diff --git a/static/api-accordion.js b/static/api-accordion.js
index 2e3705d..6d82a93 100644
--- a/static/api-accordion.js
+++ b/static/api-accordion.js
@@ -1,14 +1,24 @@
// API Namespace Accordion
document.addEventListener('DOMContentLoaded', function() {
- const toggleButtons = document.querySelectorAll('.api-namespace-toggle');
+ const toggleButtons = document.querySelectorAll('.api-namespace__toggle');
toggleButtons.forEach(function(button) {
// Check if content has overflow
const content = button.nextElementSibling;
- if (content && content.classList.contains('api-namespace-content')) {
+ const toggleText = button.querySelector('.api-namespace__toggle-text');
+
+ if (content && content.classList.contains('api-namespace__content')) {
// Check if content height exceeds the collapsed max-height (160px)
if (content.scrollHeight > 160) {
content.classList.add('has-overflow');
+
+ // Set initial text based on aria-expanded state
+ updateToggleText(button, toggleText);
+ } else {
+ // Hide toggle text if no overflow
+ if (toggleText) {
+ toggleText.style.display = 'none';
+ }
}
// Click on content area when collapsed expands it
@@ -17,15 +27,28 @@ document.addEventListener('DOMContentLoaded', function() {
if (isCollapsed && content.classList.contains('has-overflow')) {
e.preventDefault();
button.setAttribute('aria-expanded', 'true');
+ updateToggleText(button, toggleText);
}
});
}
- // Toggle functionality on button click
+ // Toggle functionality on button click - ONLY for items with overflow
button.addEventListener('click', function() {
- const isExpanded = this.getAttribute('aria-expanded') === 'true';
- this.setAttribute('aria-expanded', !isExpanded);
+ const content = this.nextElementSibling;
+ if (content && content.classList.contains('has-overflow')) {
+ const isExpanded = this.getAttribute('aria-expanded') === 'true';
+ this.setAttribute('aria-expanded', !isExpanded);
+ updateToggleText(this, toggleText);
+ }
});
});
+
+ // Helper function to update toggle text
+ function updateToggleText(button, toggleText) {
+ if (!toggleText) return;
+
+ const isExpanded = button.getAttribute('aria-expanded') === 'true';
+ toggleText.textContent = isExpanded ? 'Show less' : 'Show all';
+ }
});
diff --git a/static/mobile-menu.js b/static/mobile-menu.js
index ac36266..655ba91 100644
--- a/static/mobile-menu.js
+++ b/static/mobile-menu.js
@@ -64,7 +64,7 @@ if (document.readyState !== 'loading') {
// Mobile dark mode toggle (separate initialization)
document.addEventListener('DOMContentLoaded', function() {
- const mobileDarkToggle = document.querySelector('.mobile-dark-mode-toggle');
+ const mobileDarkToggle = document.querySelector('.mobile-menu__dark-mode-toggle');
const mainDarkToggle = document.getElementById('dark-mode-toggle');
if (mobileDarkToggle && mainDarkToggle) {
diff --git a/static/search.js b/static/search.js
index 4878ecd..f9f4ec9 100644
--- a/static/search.js
+++ b/static/search.js
@@ -276,23 +276,23 @@ function createMenuItem(result, index) {
function formatSearchResultItem(item) {
if (item.type === "documentation") {
- return `
`
+ return ` `
+ ``
+ ``
+ `${item.content} `
+ `
`;
} else {
- return `
`
+ return ` `
+ ``
+ ``
+ `${item.desc} `
+ `
`;
diff --git a/templates/blog-entry.html b/templates/blog-entry.html
index 00e3eb5..ae44820 100644
--- a/templates/blog-entry.html
+++ b/templates/blog-entry.html
@@ -14,15 +14,15 @@
{{page.title}}