Skip to content

Commit d58c989

Browse files
committed
add series navigator STILL WRITE TESTS
1 parent e939c36 commit d58c989

File tree

18 files changed

+217
-31
lines changed

18 files changed

+217
-31
lines changed

package-lock.json

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"devDependencies": {
3535
"@cypress/snapshot": "^2.1.7",
3636
"@rollup/plugin-commonjs": "^12.0.0",
37+
"@rollup/plugin-dynamic-import-vars": "^1.1.1",
3738
"@rollup/plugin-node-resolve": "^8.0.0",
3839
"@rollup/plugin-replace": "^2.2.0",
3940
"color-contrast-table-svelte": "^3.0.8",

rollup.config.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { terser } from 'rollup-plugin-terser'
66
import config from 'sapper/config/rollup.js'
77
import pkg from './package.json'
88
import { mdsvex } from 'mdsvex'
9+
import dynamicImportVars from '@rollup/plugin-dynamic-import-vars'
910
import svelteSVG from 'rollup-plugin-svelte-svg'
1011
import { globalStyle, scss } from 'svelte-preprocess'
1112
import copy from 'rollup-plugin-copy'
@@ -43,6 +44,10 @@ const envVars = {
4344
exclude: 'src/routes/**/*.md'
4445
}
4546

47+
const dynamicImportVarsOptions = {
48+
include: `src/routes/**/*.svelte`
49+
}
50+
4651
const preprocess = [
4752
mdsvex({
4853
extension: '.md',
@@ -104,6 +109,7 @@ export default {
104109
dedupe: ['svelte']
105110
}),
106111
commonjs(),
112+
dynamicImportVars(dynamicImportVarsOptions),
107113
svelteSVG({ dev }),
108114
copy({
109115
targets: [
@@ -139,6 +145,7 @@ export default {
139145
dedupe: ['svelte']
140146
}),
141147
commonjs(),
148+
dynamicImportVars(dynamicImportVarsOptions),
142149
svelteSVG({ generate: 'ssr', dev }),
143150
copy({
144151
targets: [
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<script>
2+
import { getContext } from 'svelte'
3+
const series = getContext('series')
4+
let postIndex
5+
let previous
6+
let next
7+
8+
$: if (series) {
9+
postIndex = series.posts.findIndex(post => post.title === $$props.title)
10+
if (series.posts[postIndex - 1]) {
11+
previous = series.posts[postIndex - 1]
12+
}
13+
if (series.posts[postIndex + 1]) {
14+
next = series.posts[postIndex + 1]
15+
}
16+
}
17+
</script>
18+
19+
<style global type='text/scss'>
20+
.series-navigator {
21+
&__title {
22+
color: var(--colorWhite);
23+
background: var(--colorHighlight);
24+
text-align: center;
25+
padding: var(--padding);
26+
a {
27+
color: inherit;
28+
&:not(:hover) {
29+
text-decoration: none;
30+
}
31+
}
32+
}
33+
&__buttons {
34+
background: var(--colorHighlight);
35+
display: flex;
36+
}
37+
&__previous,
38+
&__next {
39+
flex-wrap: wrap;
40+
width: 50%;
41+
&:before {
42+
font-size: .8em;
43+
margin-bottom: calc(.5 * var(--padding));
44+
display: block;
45+
}
46+
}
47+
&__previous {
48+
text-align: right;
49+
margin-right: auto;
50+
&:before {
51+
content: '« previous';
52+
}
53+
}
54+
&__next {
55+
text-align: left;
56+
margin-left: auto;
57+
&:before {
58+
content: 'next »';
59+
}
60+
}
61+
}
62+
</style>
63+
64+
{#if series}
65+
<aside class='series-navigator__title'>
66+
This is post {postIndex + 1} of {series.posts.length} in the <a href={series.slug}>{series.title}</a> series.
67+
</aside>
68+
69+
<slot />
70+
71+
<aside class='series-navigator__buttons'>
72+
{#if previous}
73+
<a href={previous.slug} class='series-navigator__previous button'>
74+
{previous.title}
75+
</a>
76+
{/if}
77+
{#if next}
78+
<a href={next.slug} class='series-navigator__next button'>
79+
{next.title}
80+
</a>
81+
{/if}
82+
</aside>
83+
84+
{:else}
85+
<slot />
86+
{/if}

src/components/layout/seo.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
imageCredit: banner.attribution ? banner.attribution : '',
6161
url: pageUrl.replace('https://www.', '')
6262
})
63-
local && console.log('imageFunctionUrl', `${host}/.netlify/functions/generate-image?${imageParams}`)
63+
// local && console.log('imageFunctionUrl', `${host}/.netlify/functions/generate-image?${imageParams}`)
6464
socialImageUrl = `https://res.cloudinary.com/${process.env.CLOUDINARY_CLOUD}/image/upload/social-images/${slugify(title)}.png`
6565
}
6666
</script>

src/helpers/get-pages.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ const getPosts = ({
5252

5353
return ({
5454
...frontmatter,
55-
slug: `${directory}/${post}`,
55+
// TODO remove _content from this helper method all together
56+
slug: `/${directory.replace('/_content', '')}/${post}`,
5657
html: html
5758
})
5859
})

src/layouts/blog.svelte

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<script>
22
import Page from './page.svelte'
33
import Markdown from '../components/layout/markdown.svelte'
4+
import SeriesNavigator from '../components/blog/series-navigator.svelte'
45
</script>
56

67
<Page {...$$props} >
7-
<Markdown>
8-
<slot />
9-
</Markdown>
8+
<SeriesNavigator {...$$props}>
9+
<Markdown>
10+
<slot />
11+
</Markdown>
12+
</SeriesNavigator>
1013
</Page>

src/layouts/page.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@
3434
#content {
3535
grid-area: content;
3636
width: 100%;
37-
max-height: 100%;
37+
min-height: 100%;
38+
display: flex;
39+
flex-direction: column;
40+
justify-content: space-between;
3841
}
3942
4043
#site-footer {

src/routes/blog/[slug].svelte

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<script context='module'>
2+
export async function preload(page) {
3+
4+
const { slug } = page.params
5+
6+
const component = await import(`./_content/${slug}/index.md`)
7+
8+
const series = await this.fetch(`/blog/series.json`)
9+
.then(response => response.json())
10+
.then(allSeries => allSeries.find(series => {
11+
const postSlugs = series.posts.map(series => series.slug.replace('/blog/', ''))
12+
if (postSlugs.includes(slug)) {
13+
return series
14+
}
15+
}))
16+
17+
return {
18+
page: component.default,
19+
metadata: component.metadata,
20+
series: series
21+
}
22+
}
23+
</script>
24+
25+
<script>
26+
export let page
27+
export let series
28+
import { setContext } from 'svelte'
29+
setContext('series', series)
30+
</script>
31+
32+
<svelte:component this={page} />

src/routes/blog/index.json.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ export function get(_req, res) {
55
'Content-Type': 'application/json'
66
})
77

8-
res.end(JSON.stringify(getPages({directory: 'blog'})))
8+
res.end(JSON.stringify(getPages({directory: 'blog/_content'})))
99
}

0 commit comments

Comments
 (0)