diff --git a/.vscode/settings.json b/.vscode/settings.json index fa51da6..9193781 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.organizeImports.biome": "explicit" + "source.organizeImports": "explicit" }, "files.insertFinalNewline": true, "deno.enable": true, diff --git a/_config.ts b/_config.ts index 49dde55..7b565b1 100644 --- a/_config.ts +++ b/_config.ts @@ -2,18 +2,18 @@ import { config } from './_build.ts' import lume from 'lume/mod.ts' import date from 'lume/plugins/date.ts' -import slugify_urls from 'lume/plugins/slugify_urls.ts' +import inline from 'lume/plugins/inline.ts' import jsx from 'lume/plugins/jsx_preact.ts' +import unified from 'lume/plugins/remark.ts' import sass from 'lume/plugins/sass.ts' -import terser from 'lume/plugins/terser.ts' -import inline from 'lume/plugins/inline.ts' import sitemap from 'lume/plugins/sitemap.ts' -import unified from 'lume/plugins/remark.ts' +import slugify_urls from 'lume/plugins/slugify_urls.ts' +import terser from 'lume/plugins/terser.ts' -import remarkPlugins from '#plugins/unified/remark/mod.ts' -import rehypePlugins from '#plugins/unified/rehype/mod.ts' import atomFeed from '#plugins/atom-feed/mod.ts' import md5CacheBuster from '#plugins/md5-cache-buster/mod.ts' +import rehypePlugins from '#plugins/unified/rehype/mod.ts' +import remarkPlugins from '#plugins/unified/remark/mod.ts' const site = lume({ location: config.location, diff --git a/plugins/_deprecated/sitemap/mod.ts b/plugins/_deprecated/sitemap/mod.ts index cfb4a4a..6c23b5d 100644 --- a/plugins/_deprecated/sitemap/mod.ts +++ b/plugins/_deprecated/sitemap/mod.ts @@ -1,8 +1,8 @@ // deno-lint-ignore-file -- The plugin is deprecated in favour of: https://lume.land/plugins/sitemap/ -import { merge } from 'lume/core/utils.ts' import { Page } from 'lume/core/filesystem.ts' import { buildSort } from 'lume/core/searcher.ts' +import { merge } from 'lume/core/utils.ts' import type { Site } from 'lume/core.ts' import type { Search } from 'lume/plugins/search.ts' diff --git a/plugins/atom-feed/mod.ts b/plugins/atom-feed/mod.ts index a5bc863..8c65afa 100644 --- a/plugins/atom-feed/mod.ts +++ b/plugins/atom-feed/mod.ts @@ -1,14 +1,14 @@ -import { merge } from 'lume/core/utils.ts' import { Page } from 'lume/core/filesystem.ts' import { buildSort } from 'lume/core/searcher.ts' +import { merge } from 'lume/core/utils.ts' import { isString } from '#utils' import { XMLFormat } from '#plugins/atom-feed/deps.ts' import type { Site } from 'lume/core.ts' -import type { Search } from 'lume/plugins/search.ts' import type { MetaData } from 'lume/plugins/metas.ts' +import type { Search } from 'lume/plugins/search.ts' export interface Options { /** The query to search pages included in the feed. defaults to `type=post` */ diff --git a/plugins/md5-cache-buster/mod.ts b/plugins/md5-cache-buster/mod.ts index 934fc62..07214ca 100644 --- a/plugins/md5-cache-buster/mod.ts +++ b/plugins/md5-cache-buster/mod.ts @@ -1,9 +1,9 @@ -import { Md5 } from './deps.ts' import { merge } from 'lume/core/utils.ts' import modifyUrls from 'lume/plugins/modify_urls.ts' +import { Md5 } from './deps.ts' -import type { Message } from './deps.ts' import type { Page, Site } from 'lume/core.ts' +import type { Message } from './deps.ts' export interface Options { /** The list of extensions this plugin applies to */ diff --git a/plugins/unified/deps.ts b/plugins/unified/deps.ts index 7f2898b..bda9e0f 100644 --- a/plugins/unified/deps.ts +++ b/plugins/unified/deps.ts @@ -8,19 +8,19 @@ export * as unified from 'npm:unified@11.0.3' export { default as readingTime } from 'https://esm.sh/remark-reading-time@2.0.1?bundle' -export { default as rehypeMinifyWhitespace } from 'npm:rehype-minify-whitespace@6.0.0' +export { default as rehypeExtractToc } from 'npm:@stefanprobst/rehype-extract-toc@2.2.0' export { default as rehypeCodeTitles } from 'npm:rehype-code-titles@1.2.0' export { default as rehypeExternalLinks } from 'npm:rehype-external-links@3.0.0' -export { default as rehypeExtractToc } from 'npm:@stefanprobst/rehype-extract-toc@2.2.0' -export { default as rehypePrismPlus } from 'npm:rehype-prism-plus@1.6.3' +export { default as rehypeMinifyWhitespace } from 'npm:rehype-minify-whitespace@6.0.0' export { default as rehypePrismDiff } from 'npm:rehype-prism-diff@1.1.2' +export { default as rehypePrismPlus } from 'npm:rehype-prism-plus@1.6.3' export { slug } from 'npm:github-slugger@2.0.0' +export { toString } from 'npm:hast-util-to-string@3.0.0' export { findAfter } from 'npm:unist-util-find-after@5.0.0' export { CONTINUE, EXIT, SKIP, visit } from 'npm:unist-util-visit@5.0.0' -export { toString } from 'npm:hast-util-to-string@3.0.0' +export { default as rehypeImgSize } from 'npm:rehype-img-size@1.0.1' +export type { Test } from 'npm:unist-util-is@6.0.0' export { default as rehypeCopyCode } from './rehype/rehypeCopyCode.ts' export { default as rehypeSlugAnchorSectionize } from './rehype/slug.ts' -export type { Test } from 'npm:unist-util-is@6.0.0' -export { default as rehypeImgSize } from 'npm:rehype-img-size@1.0.1' diff --git a/plugins/unified/rehype/mod.ts b/plugins/unified/rehype/mod.ts index a10942b..1c71ea1 100644 --- a/plugins/unified/rehype/mod.ts +++ b/plugins/unified/rehype/mod.ts @@ -1,3 +1,4 @@ +import { dirname, fromFileUrl } from 'https://deno.land/std@0.203.0/path/mod.ts' import { rehypeCodeTitles, rehypeCopyCode, @@ -9,7 +10,6 @@ import { rehypePrismPlus, rehypeSlugAnchorSectionize, } from '../deps.ts' -import { dirname, fromFileUrl } from 'https://deno.land/std@0.203.0/path/mod.ts' const __dirname = dirname(fromFileUrl(import.meta.url)) diff --git a/plugins/unified/rehype/rehypeCopyCode.ts b/plugins/unified/rehype/rehypeCopyCode.ts index e0651e8..a66ee0c 100644 --- a/plugins/unified/rehype/rehypeCopyCode.ts +++ b/plugins/unified/rehype/rehypeCopyCode.ts @@ -1,5 +1,5 @@ -import type { Element, Root } from 'npm:@types/hast@3.0.1' import { unified, visit } from '#plugins/unified/deps.ts' +import type { Element, Root } from 'npm:@types/hast@3.0.1' const rehypeCopyCode: unified.Plugin<[], Root> = () => { return (tree: Root) => { diff --git a/plugins/unified/rehype/slug.ts b/plugins/unified/rehype/slug.ts index a002012..7bd6b30 100644 --- a/plugins/unified/rehype/slug.ts +++ b/plugins/unified/rehype/slug.ts @@ -1,3 +1,4 @@ +import type { Element, Root } from 'npm:@types/hast@3.0.1' import { findAfter, slug, @@ -6,7 +7,6 @@ import { unified, visit, } from '../deps.ts' -import type { Element, Root } from 'npm:@types/hast@3.0.1' export interface RehypeSlugAnchorSectionizeOptions { /** The heading level depth to sectionize. defaults to `3` */ diff --git a/scripts.ts b/scripts.ts index d3082ad..034751e 100644 --- a/scripts.ts +++ b/scripts.ts @@ -1,4 +1,4 @@ -import { ScriptsConfiguration } from 'https://deno.land/x/velociraptor@1.5.0/mod.ts' +import type { ScriptsConfiguration } from 'https://deno.land/x/velociraptor@1.5.0/mod.ts' export default { scripts: { diff --git a/src/404.tsx b/src/404.tsx index d08c164..75cdda7 100644 --- a/src/404.tsx +++ b/src/404.tsx @@ -5,7 +5,7 @@ export const title = '404: Page Not Found' export const layout = 'layouts/root.tsx' export const url = '/404/' -export default (data: PageData, { urlFilter }: PageHelpers) => { +export default (_data: PageData, { urlFilter }: PageHelpers) => { return ( <>

{title}

diff --git a/src/_components/blog/pagination.tsx b/src/_components/blog/pagination.tsx index eef6cbb..9b0fa57 100644 --- a/src/_components/blog/pagination.tsx +++ b/src/_components/blog/pagination.tsx @@ -1,5 +1,4 @@ import type { PageData, PageHelpers } from '#types' - import { getPaginationPages } from '#utils' export default ( @@ -42,21 +41,28 @@ export default (  Prev )} - {getPaginationPages(pagination?.totalPages!, pagination?.page!).map(( - index, - ) => ( -
  • - 1 && `/${index}` || ``}`)} - className={`pagination__item ${ - pagination?.page === index ? 'is-active' : '' - }`} - {...(pagination?.page === index && { ariaCurrent: true })} - > - {index} - -
  • - ))} + {pagination && + getPaginationPages(pagination.totalPages, pagination.page).map(( + pageNumber, + idx, + ) => { + const isNumber = !isNaN(pageNumber) + const isActive = pagination?.page === pageNumber + + return ( +
  • + + {isNumber ? pageNumber : '...'} + +
  • + ) + })} {pagination?.next ? (
  • diff --git a/src/_includes/scss/components/_pagination.scss b/src/_includes/scss/components/_pagination.scss index 08e28c1..c0ce550 100644 --- a/src/_includes/scss/components/_pagination.scss +++ b/src/_includes/scss/components/_pagination.scss @@ -17,7 +17,12 @@ display: flex; align-items: center; padding: 0.125rem 0.5rem; - + + &[aria-disabled="true"] { + pointer-events: none; + cursor: default; + } + &.is-active { border: map.get($pagination, active-border); border-radius: map.get($pagination, active-border-radius); diff --git a/src/_includes/utils/getPaginationPages.ts b/src/_includes/utils/getPaginationPages.ts index 123c6b3..e6d0d66 100644 --- a/src/_includes/utils/getPaginationPages.ts +++ b/src/_includes/utils/getPaginationPages.ts @@ -2,8 +2,8 @@ export function getPaginationPages( maxPages: number, currentPage: number, -): Array { - const pages: Array = [] +): number[] { + const pages: number[] = [] for (let i = 1; i <= maxPages; i++) { if ( @@ -13,8 +13,8 @@ export function getPaginationPages( (maxPages - currentPage < 3 && maxPages - i <= 3) ) { pages.push(i) - } else if (pages[pages.length - 1] !== '...') { - pages.push('...') + } else if (!isNaN(pages[pages.length - 1])) { + pages.push(NaN) } } diff --git a/src/_includes/utils/index.ts b/src/_includes/utils/index.ts index b2581f7..d27f598 100644 --- a/src/_includes/utils/index.ts +++ b/src/_includes/utils/index.ts @@ -1,5 +1,5 @@ export * from './capitalize.ts' export * from './getPaginationPages.ts' export * from './isEmptyArray.ts' -export * from './truncateString.ts' export * from './isString.ts' +export * from './truncateString.ts'