Skip to content

Commit 13ec17e

Browse files
committed
fix: improve & fix pagination
1 parent 1d2b69b commit 13ec17e

File tree

15 files changed

+56
-45
lines changed

15 files changed

+56
-45
lines changed

.vscode/settings.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"editor.formatOnSave": true,
33
"editor.codeActionsOnSave": {
4-
"source.organizeImports.biome": "explicit"
4+
"source.organizeImports": "explicit"
55
},
66
"files.insertFinalNewline": true,
77
"deno.enable": true,

_config.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ import { config } from './_build.ts'
22

33
import lume from 'lume/mod.ts'
44
import date from 'lume/plugins/date.ts'
5-
import slugify_urls from 'lume/plugins/slugify_urls.ts'
5+
import inline from 'lume/plugins/inline.ts'
66
import jsx from 'lume/plugins/jsx_preact.ts'
7+
import unified from 'lume/plugins/remark.ts'
78
import sass from 'lume/plugins/sass.ts'
8-
import terser from 'lume/plugins/terser.ts'
9-
import inline from 'lume/plugins/inline.ts'
109
import sitemap from 'lume/plugins/sitemap.ts'
11-
import unified from 'lume/plugins/remark.ts'
10+
import slugify_urls from 'lume/plugins/slugify_urls.ts'
11+
import terser from 'lume/plugins/terser.ts'
1212

13-
import remarkPlugins from '#plugins/unified/remark/mod.ts'
14-
import rehypePlugins from '#plugins/unified/rehype/mod.ts'
1513
import atomFeed from '#plugins/atom-feed/mod.ts'
1614
import md5CacheBuster from '#plugins/md5-cache-buster/mod.ts'
15+
import rehypePlugins from '#plugins/unified/rehype/mod.ts'
16+
import remarkPlugins from '#plugins/unified/remark/mod.ts'
1717

1818
const site = lume({
1919
location: config.location,

plugins/_deprecated/sitemap/mod.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// deno-lint-ignore-file -- The plugin is deprecated in favour of: https://lume.land/plugins/sitemap/
22

3-
import { merge } from 'lume/core/utils.ts'
43
import { Page } from 'lume/core/filesystem.ts'
54
import { buildSort } from 'lume/core/searcher.ts'
5+
import { merge } from 'lume/core/utils.ts'
66

77
import type { Site } from 'lume/core.ts'
88
import type { Search } from 'lume/plugins/search.ts'

plugins/atom-feed/mod.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { merge } from 'lume/core/utils.ts'
21
import { Page } from 'lume/core/filesystem.ts'
32
import { buildSort } from 'lume/core/searcher.ts'
3+
import { merge } from 'lume/core/utils.ts'
44

55
import { isString } from '#utils'
66

77
import { XMLFormat } from '#plugins/atom-feed/deps.ts'
88

99
import type { Site } from 'lume/core.ts'
10-
import type { Search } from 'lume/plugins/search.ts'
1110
import type { MetaData } from 'lume/plugins/metas.ts'
11+
import type { Search } from 'lume/plugins/search.ts'
1212

1313
export interface Options {
1414
/** The query to search pages included in the feed. defaults to `type=post` */

plugins/md5-cache-buster/mod.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { Md5 } from './deps.ts'
21
import { merge } from 'lume/core/utils.ts'
32
import modifyUrls from 'lume/plugins/modify_urls.ts'
3+
import { Md5 } from './deps.ts'
44

5-
import type { Message } from './deps.ts'
65
import type { Page, Site } from 'lume/core.ts'
6+
import type { Message } from './deps.ts'
77

88
export interface Options {
99
/** The list of extensions this plugin applies to */

plugins/unified/deps.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ export * as unified from 'npm:[email protected]'
88

99
export { default as readingTime } from 'https://esm.sh/[email protected]?bundle'
1010

11-
export { default as rehypeMinifyWhitespace } from 'npm:rehype-[email protected].0'
11+
export { default as rehypeExtractToc } from 'npm:@stefanprobst/rehype-[email protected].0'
1212
export { default as rehypeCodeTitles } from 'npm:[email protected]'
1313
export { default as rehypeExternalLinks } from 'npm:[email protected]'
14-
export { default as rehypeExtractToc } from 'npm:@stefanprobst/[email protected]'
15-
export { default as rehypePrismPlus } from 'npm:[email protected]'
14+
export { default as rehypeMinifyWhitespace } from 'npm:[email protected]'
1615
export { default as rehypePrismDiff } from 'npm:[email protected]'
16+
export { default as rehypePrismPlus } from 'npm:[email protected]'
1717

1818
export { slug } from 'npm:[email protected]'
19+
export { toString } from 'npm:[email protected]'
1920
export { findAfter } from 'npm:[email protected]'
2021
export { CONTINUE, EXIT, SKIP, visit } from 'npm:[email protected]'
21-
export { toString } from 'npm:[email protected]'
2222

23+
export { default as rehypeImgSize } from 'npm:[email protected]'
24+
export type { Test } from 'npm:[email protected]'
2325
export { default as rehypeCopyCode } from './rehype/rehypeCopyCode.ts'
2426
export { default as rehypeSlugAnchorSectionize } from './rehype/slug.ts'
25-
export type { Test } from 'npm:[email protected]'
26-
export { default as rehypeImgSize } from 'npm:[email protected]'

plugins/unified/rehype/mod.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { dirname, fromFileUrl } from 'https://deno.land/[email protected]/path/mod.ts'
12
import {
23
rehypeCodeTitles,
34
rehypeCopyCode,
@@ -9,7 +10,6 @@ import {
910
rehypePrismPlus,
1011
rehypeSlugAnchorSectionize,
1112
} from '../deps.ts'
12-
import { dirname, fromFileUrl } from 'https://deno.land/[email protected]/path/mod.ts'
1313

1414
const __dirname = dirname(fromFileUrl(import.meta.url))
1515

plugins/unified/rehype/rehypeCopyCode.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { Element, Root } from 'npm:@types/[email protected]'
21
import { unified, visit } from '#plugins/unified/deps.ts'
2+
import type { Element, Root } from 'npm:@types/[email protected]'
33

44
const rehypeCopyCode: unified.Plugin<[], Root> = () => {
55
return (tree: Root) => {

plugins/unified/rehype/slug.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Element, Root } from 'npm:@types/[email protected]'
12
import {
23
findAfter,
34
slug,
@@ -6,7 +7,6 @@ import {
67
unified,
78
visit,
89
} from '../deps.ts'
9-
import type { Element, Root } from 'npm:@types/[email protected]'
1010

1111
export interface RehypeSlugAnchorSectionizeOptions {
1212
/** The heading level depth to sectionize. defaults to `3` */

scripts.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ScriptsConfiguration } from 'https://deno.land/x/[email protected]/mod.ts'
1+
import type { ScriptsConfiguration } from 'https://deno.land/x/[email protected]/mod.ts'
22

33
export default <ScriptsConfiguration> {
44
scripts: {

src/404.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const title = '404: Page Not Found'
55
export const layout = 'layouts/root.tsx'
66
export const url = '/404/'
77

8-
export default (data: PageData, { urlFilter }: PageHelpers) => {
8+
export default (_data: PageData, { urlFilter }: PageHelpers) => {
99
return (
1010
<>
1111
<h1>{title}</h1>

src/_components/blog/pagination.tsx

+22-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { PageData, PageHelpers } from '#types'
2-
32
import { getPaginationPages } from '#utils'
43

54
export default (
@@ -42,21 +41,28 @@ export default (
4241
&nbsp;Prev
4342
</li>
4443
)}
45-
{getPaginationPages(pagination?.totalPages!, pagination?.page!).map((
46-
index,
47-
) => (
48-
<li key={index}>
49-
<a
50-
href={urlFilter!(`/blog${index > 1 && `/${index}` || ``}`)}
51-
className={`pagination__item ${
52-
pagination?.page === index ? 'is-active' : ''
53-
}`}
54-
{...(pagination?.page === index && { ariaCurrent: true })}
55-
>
56-
{index}
57-
</a>
58-
</li>
59-
))}
44+
{pagination &&
45+
getPaginationPages(pagination.totalPages, pagination.page).map((
46+
pageNumber,
47+
idx,
48+
) => {
49+
const isNumber = !isNaN(pageNumber)
50+
const isActive = pagination?.page === pageNumber
51+
52+
return (
53+
<li key={idx}>
54+
<a
55+
{...(isActive && { ariaCurrent: true })}
56+
{...(!isNumber
57+
? { role: 'link', 'aria-disabled': true }
58+
: { href: urlFilter!(`/blog/${pageNumber}`) })}
59+
className={`pagination__item ${isActive ? 'is-active' : ''}`}
60+
>
61+
{isNumber ? pageNumber : '...'}
62+
</a>
63+
</li>
64+
)
65+
})}
6066
{pagination?.next
6167
? (
6268
<li>

src/_includes/scss/components/_pagination.scss

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717
display: flex;
1818
align-items: center;
1919
padding: 0.125rem 0.5rem;
20-
20+
21+
&[aria-disabled="true"] {
22+
pointer-events: none;
23+
cursor: default;
24+
}
25+
2126
&.is-active {
2227
border: map.get($pagination, active-border);
2328
border-radius: map.get($pagination, active-border-radius);

src/_includes/utils/getPaginationPages.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
export function getPaginationPages(
33
maxPages: number,
44
currentPage: number,
5-
): Array<number | string> {
6-
const pages: Array<number | string> = []
5+
): number[] {
6+
const pages: number[] = []
77

88
for (let i = 1; i <= maxPages; i++) {
99
if (
@@ -13,8 +13,8 @@ export function getPaginationPages(
1313
(maxPages - currentPage < 3 && maxPages - i <= 3)
1414
) {
1515
pages.push(i)
16-
} else if (pages[pages.length - 1] !== '...') {
17-
pages.push('...')
16+
} else if (!isNaN(pages[pages.length - 1])) {
17+
pages.push(NaN)
1818
}
1919
}
2020

src/_includes/utils/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export * from './capitalize.ts'
22
export * from './getPaginationPages.ts'
33
export * from './isEmptyArray.ts'
4-
export * from './truncateString.ts'
54
export * from './isString.ts'
5+
export * from './truncateString.ts'

0 commit comments

Comments
 (0)