refactor: remove blog and markdown test pages, update navigation links

- Deleted blog.html and associated blog post files (markdown-test, testddd, node-graphs, welcome).
- Updated index.html to use dynamic navigation links from navLinks.js.
- Enhanced MarkdownRenderer to include new heading pin elements.
- Implemented SVG bezier splines for blog post navigation.
- Adjusted CSS styles for blog layout and new elements.
This commit is contained in:
2026-05-10 23:29:02 +10:00
parent fabbb0539a
commit ba36cdd05b
13 changed files with 446 additions and 340 deletions

View File

@@ -691,7 +691,7 @@ body.blog-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
justify-content: flex-start;
padding: 110px 16px 36px;
}
@@ -718,15 +718,150 @@ body.blog-page {
border: 1px solid rgba(205, 214, 244, 0.14);
border-radius: 16px;
box-shadow: 0 20px 70px rgba(0, 0, 0, 0.35);
padding: 22px 24px 28px;
padding: 22px 24px 28px 48px;
}
.blog-post-header {
border-bottom: 1px solid rgba(205, 214, 244, 0.12);
padding-bottom: 14px;
margin-bottom: 16px;
margin-bottom: 0;
}
/* ─── Post layout with prev/next peek cards ───────────────────────────────────── */
.blog-post-layout {
width: min(900px, 100%);
margin: 0 auto;
position: relative;
overflow: visible;
isolation: isolate;
}
.blog-post-peek-wrapper {
position: absolute;
top: 0;
width: 160px;
height: 0;
pointer-events: none;
overflow: visible;
}
.blog-post-peek-wrapper--prev {
right: calc(100% + 100px);
}
.blog-post-peek-wrapper--next {
left: calc(100% + 100px);
}
.blog-post-peek {
width: 160px;
background: var(--node-bg);
border: 1px solid var(--node-border);
border-radius: 8px;
box-shadow: 0 8px 18px rgba(0, 0, 0, 0.35);
display: flex;
flex-direction: column;
overflow: hidden;
opacity: 0.7;
transition: opacity 0.2s ease, border-color 0.2s ease;
text-decoration: none;
position: sticky;
top: 80px;
pointer-events: auto;
margin-top: 121px;
}
.blog-post-peek:hover {
opacity: 1;
border-color: rgba(250, 179, 135, 0.35);
}
.blog-post-peek--empty {
pointer-events: none;
background: transparent;
border-color: transparent;
box-shadow: none;
}
.blog-post-peek-header {
background: linear-gradient(90deg, var(--ctp-base), var(--ctp-surface0));
border-bottom: 1px solid var(--node-border);
padding: 6px 8px;
display: flex;
align-items: center;
gap: 6px;
}
.blog-post-peek-direction {
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--ctp-overlay2);
flex: 1;
}
.blog-post-peek-body {
padding: 8px;
display: flex;
flex-direction: column;
gap: 4px;
}
.blog-post-peek-title {
font-size: 0.78rem;
font-weight: 600;
color: var(--ctp-text);
line-height: 1.3;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.blog-post-peek-date {
font-size: 0.68rem;
color: var(--ctp-subtext0);
}
/* exec pin dot on peek cards */
.blog-post-peek-pin {
width: 14px;
height: 14px;
flex-shrink: 0;
background: #ffffff;
clip-path: polygon(0% 0%, 60% 0%, 100% 50%, 60% 100%, 0% 100%);
}
.blog-post-peek--next {
margin-top: 221px;
}
.blog-post-peek--next .blog-post-peek-pin {
}
/* spline SVG overlay */
.blog-post-splines {
position: absolute;
inset: 0;
pointer-events: none;
overflow: visible;
z-index: 10;
}
.blog-post-layout > .blog-card {
position: relative;
}
@media (max-width: 1100px) {
.blog-post-peek {
display: none;
}
.blog-post-splines {
display: none;
}
}
.blog-post-title {
margin: 0;
color: var(--ctp-text);
@@ -771,6 +906,57 @@ body.blog-page {
user-select: text;
}
.blog-post-content .md-hr,
.blog-card > .md-hr {
border: none;
margin: 2em -8px;
width: calc(100% + 16px);
display: flex;
align-items: center;
gap: 0;
height: 14px;
position: relative;
}
.blog-card > .md-hr {
margin: 14px -8px 16px;
width: calc(100% + 16px);
}
.blog-post-content .md-hr::before,
.blog-card > .md-hr::before {
content: '';
display: block;
flex-shrink: 0;
width: 14px;
height: 14px;
background: var(--ctp-text);
clip-path: polygon(0% 0%, 60% 0%, 100% 50%, 60% 100%, 0% 100%);
}
.blog-post-content .md-hr::after,
.blog-card > .md-hr::after {
content: none;
}
.md-hr-line {
display: block;
flex: 1;
height: 3px;
background: var(--ctp-text);
opacity: 0.4;
}
.md-hr-arrow {
display: block;
flex-shrink: 0;
width: 14px;
height: 14px;
background: var(--ctp-text);
clip-path: polygon(0% 0%, 60% 0%, 100% 50%, 60% 100%, 0% 100%);
opacity: 0.4;
}
.blog-post-content .md-h1,
.blog-post-content .md-h2,
.blog-post-content .md-h3,
@@ -783,8 +969,60 @@ body.blog-page {
line-height: 1.3;
}
.blog-post-content .md-h1 { font-size: 1.9rem; }
.blog-post-content .md-h2 { font-size: 1.55rem; }
.blog-post-content .md-h1 {
font-size: 1.9rem;
position: relative;
}
.md-h1-pin {
display: inline-flex;
flex-shrink: 0;
width: 18px;
height: 18px;
border-radius: 50%;
border: 2px solid var(--node-border);
background: var(--ctp-surface0);
color: #3ee581;
position: absolute;
left: -37px;
top: 50%;
transform: translateY(-50%);
}
.md-h1-pin::after {
content: '';
position: absolute;
inset: 3px;
border-radius: 50%;
background: currentColor;
}
.blog-post-content .md-h2 {
font-size: 1.55rem;
position: relative;
}
.md-h2-pin {
display: inline-flex;
flex-shrink: 0;
width: 18px;
height: 18px;
border-radius: 50%;
border: 2px solid var(--node-border);
background: var(--ctp-surface0);
color: #ff66ff;
position: absolute;
left: -37px;
top: 50%;
transform: translateY(-50%);
}
.md-h2-pin::after {
content: '';
position: absolute;
inset: 3px;
border-radius: 50%;
background: currentColor;
}
.blog-post-content .md-h3 { font-size: 1.3rem; }
.blog-post-content .md-h4 { font-size: 1.1rem; }