diff --git a/site/src/routes/blog/[slug].svelte b/site/src/routes/blog/[slug].svelte index c64130efe5..610fb6506b 100644 --- a/site/src/routes/blog/[slug].svelte +++ b/site/src/routes/blog/[slug].svelte @@ -133,6 +133,48 @@ border: 0.8rem solid var(--second); } + /* headers anchors */ + + .post :global(.offset-anchor) { + position: relative; + display: block; + top: calc(-1 * (var(--nav-h) + var(--top-offset) - 1rem)); + width: 0; + height: 0; + } + + .post :global(.anchor) { + position: absolute; + display: block; + background: url(/icons/link.svg) 0 50% no-repeat; + background-size: 1em 1em; + width: 1.4em; + height: 1em; + top: calc((var(--h3) - 24px) / 2); + left: -1.4em; + opacity: 0; + transition: opacity 0.2s; + border: none !important; /* TODO get rid of linkify */ + } + + .post :global(h2):hover :global(.anchor), + .post :global(h3):hover :global(.anchor), + .post :global(h4):hover :global(.anchor), + .post :global(h5):hover :global(.anchor), + .post :global(h6):hover :global(.anchor) { + opacity: 1; + } + + + @media (max-width: 768px) { + .post :global(.anchor) { + transform: scale(0.6); + opacity: 1; + top: calc((1em - 0.6 * 24px) / 2); + left: -1.0em; + } + } + @media (min-width: 910px) { .post :global(.max) { width: calc(100vw - 2 * var(--side-nav)); @@ -164,4 +206,4 @@ height: 640px; } } */ - \ No newline at end of file + diff --git a/site/src/routes/blog/_posts.js b/site/src/routes/blog/_posts.js index b422967af9..d180ebd35e 100644 --- a/site/src/routes/blog/_posts.js +++ b/site/src/routes/blog/_posts.js @@ -2,9 +2,13 @@ import fs from 'fs'; import path from 'path'; import { extract_frontmatter, langs, link_renderer } from '@sveltejs/site-kit/utils/markdown.js'; import marked from 'marked'; +import { makeSlugProcessor } from '../../utils/slug'; +import { SLUG_PRESERVE_UNICODE } from '../../../config'; import PrismJS from 'prismjs'; import 'prismjs/components/prism-bash'; +const makeSlug = makeSlugProcessor(SLUG_PRESERVE_UNICODE); + export default function get_posts() { return fs .readdirSync('content/blog') @@ -39,6 +43,17 @@ export default function get_posts() { return `
${highlighted}
`;
};
+ renderer.heading = (text, level, rawtext) => {
+ const fragment = makeSlug(rawtext);
+
+ return `
+