methanol 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/package.json +1 -1
- package/src/assets.js +1 -1
- package/src/build-system.js +2 -1
- package/src/config.js +122 -4
- package/src/dev-server.js +49 -27
- package/src/main.js +3 -1
- package/src/mdx.js +31 -32
- package/src/pages.js +85 -76
- package/src/preview-server.js +1 -1
- package/src/rehype-plugins/link-resolve.js +0 -1
- package/src/state.js +2 -0
- package/src/utils.js +9 -0
- package/src/virtual-module/inject.js +3 -4
- package/src/virtual-module/{pagefind.js → pagefind-loader.js} +23 -2
- package/src/vite-plugins.js +50 -6
- package/themes/default/components/ThemeSearchBox.client.jsx +9 -2
- package/themes/default/page.jsx +54 -26
- package/themes/default/sources/style.css +5 -1
package/themes/default/page.jsx
CHANGED
|
@@ -27,11 +27,11 @@ const renderPageTree = (nodes = [], currentRoute, depth = 0) => {
|
|
|
27
27
|
const items = []
|
|
28
28
|
let hasActive = false
|
|
29
29
|
for (const node of nodes) {
|
|
30
|
-
const nodeRoute = node.routeHref ||
|
|
30
|
+
const nodeRoute = node.routeHref || ''
|
|
31
31
|
if (node.type === 'directory') {
|
|
32
32
|
const label = node.title || node.name
|
|
33
33
|
const isActive = nodeRoute === currentRoute
|
|
34
|
-
const href = node.
|
|
34
|
+
const href = node.routeHref
|
|
35
35
|
const childResult = renderPageTree(node.children || [], currentRoute, depth + 1)
|
|
36
36
|
const isOpen = depth < 1 || isActive || childResult.hasActive
|
|
37
37
|
if (isOpen) hasActive = true
|
|
@@ -55,7 +55,7 @@ const renderPageTree = (nodes = [], currentRoute, depth = 0) => {
|
|
|
55
55
|
const label = node.title || (node.isIndex ? 'Home' : node.name)
|
|
56
56
|
const isActive = nodeRoute === currentRoute
|
|
57
57
|
if (isActive) hasActive = true
|
|
58
|
-
const href =
|
|
58
|
+
const href = node.routeHref
|
|
59
59
|
items.push(
|
|
60
60
|
<li>
|
|
61
61
|
<a class={isActive ? 'active' : null} href={href}>
|
|
@@ -67,27 +67,27 @@ const renderPageTree = (nodes = [], currentRoute, depth = 0) => {
|
|
|
67
67
|
return { items, hasActive }
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
const PAGE_TEMPLATE = ({
|
|
70
|
+
const PAGE_TEMPLATE = ({ PageContent, ExtraHead, components, ctx }) => {
|
|
71
71
|
const page = ctx.page
|
|
72
72
|
const pagesByRoute = ctx.pagesByRoute
|
|
73
73
|
const pages = ctx.pages || []
|
|
74
74
|
const pagesTree = ctx.pagesTree || []
|
|
75
|
-
const siteName = ctx.site
|
|
76
|
-
const title = page
|
|
77
|
-
const currentRoute = page
|
|
78
|
-
const baseHref = page
|
|
79
|
-
const toc = page
|
|
75
|
+
const siteName = ctx.site.name || 'Methanol Site'
|
|
76
|
+
const title = page.title || siteName
|
|
77
|
+
const currentRoute = page.routeHref || ''
|
|
78
|
+
const baseHref = page.routeHref === '/404' ? ctx.site.base || '/' : null
|
|
79
|
+
const toc = page.toc?.length ? renderToc(page.toc) : null
|
|
80
80
|
const hasToc = Boolean(toc)
|
|
81
81
|
const layoutClass = hasToc ? 'layout-container' : 'layout-container no-toc'
|
|
82
82
|
const tree = renderPageTree(pagesTree, currentRoute, 0)
|
|
83
83
|
const { ThemeSearchBox, ThemeColorSwitch, ThemeAccentSwitch, ThemeToCContainer } = components
|
|
84
|
-
const rootPage = pagesByRoute
|
|
85
|
-
const pageFrontmatter = page
|
|
86
|
-
const rootFrontmatter = rootPage
|
|
84
|
+
const rootPage = pagesByRoute.get('/') || pages.find((entry) => entry.routeHref === '/')
|
|
85
|
+
const pageFrontmatter = page.frontmatter || {}
|
|
86
|
+
const rootFrontmatter = rootPage.frontmatter || {}
|
|
87
87
|
const themeLogo = '/logo.png'
|
|
88
88
|
const themeFavIcon = '/favicon.png'
|
|
89
|
-
const logo = pageFrontmatter.logo ?? rootFrontmatter.logo ?? ctx.site
|
|
90
|
-
const favicon = pageFrontmatter.favicon ?? rootFrontmatter.favicon ?? ctx.site
|
|
89
|
+
const logo = pageFrontmatter.logo ?? rootFrontmatter.logo ?? ctx.site.logo ?? themeLogo
|
|
90
|
+
const favicon = pageFrontmatter.favicon ?? rootFrontmatter.favicon ?? ctx.site.favicon ?? themeFavIcon
|
|
91
91
|
const excerpt = pageFrontmatter.excerpt ?? `${title} | ${siteName} - Powered by Methanol`
|
|
92
92
|
const _ogTitle = pageFrontmatter.ogTitle ?? title ?? null
|
|
93
93
|
const ogTitle = _ogTitle ? `${_ogTitle} | ${siteName}` : null
|
|
@@ -98,15 +98,18 @@ const PAGE_TEMPLATE = ({ Page, ExtraHead, components, ctx }) => {
|
|
|
98
98
|
const twitterDescription = pageFrontmatter.twitterDescription ?? ogDescription ?? excerpt
|
|
99
99
|
const twitterImage = pageFrontmatter.twitterImage ?? ogImage
|
|
100
100
|
const twitterCard = pageFrontmatter.twitterCard ?? (twitterImage ? 'summary_large_image' : null)
|
|
101
|
-
const siblings =
|
|
101
|
+
const siblings = page.getSiblings()
|
|
102
102
|
const prevPage = siblings?.prev || null
|
|
103
103
|
const nextPage = siblings?.next || null
|
|
104
104
|
const languages = Array.isArray(ctx.languages) ? ctx.languages : []
|
|
105
|
-
const currentLanguageHref = ctx.language?.href || ctx.language?.
|
|
105
|
+
const currentLanguageHref = ctx.language?.href || ctx.language?.routeHref || null
|
|
106
106
|
const languageCode = pageFrontmatter.langCode ?? rootFrontmatter.langCode ?? ctx.language?.code ?? 'en'
|
|
107
107
|
const htmlLang = typeof languageCode === 'string' && languageCode.trim() ? languageCode : 'en'
|
|
108
|
-
const pagefindEnabled = ctx.site
|
|
109
|
-
const pagefindOptions = ctx.site
|
|
108
|
+
const pagefindEnabled = ctx.site.pagefind?.enabled !== false
|
|
109
|
+
const pagefindOptions = ctx.site.pagefind?.options || null
|
|
110
|
+
const repoBase = ctx.site.repoBase
|
|
111
|
+
const sourceUrl = pageFrontmatter.sourceURL
|
|
112
|
+
const editUrl = sourceUrl || (repoBase && page.relativePath ? new URL(page.relativePath, repoBase).href : null)
|
|
110
113
|
const languageSelector = languages.length ? (
|
|
111
114
|
<div class="lang-switch-wrapper">
|
|
112
115
|
<select
|
|
@@ -116,7 +119,7 @@ const PAGE_TEMPLATE = ({ Page, ExtraHead, components, ctx }) => {
|
|
|
116
119
|
value={currentLanguageHref || undefined}
|
|
117
120
|
>
|
|
118
121
|
{languages.map((lang) => {
|
|
119
|
-
const optionValue = lang.href || lang.
|
|
122
|
+
const optionValue = lang.href || lang.routeHref
|
|
120
123
|
const isSelected = optionValue && optionValue === currentLanguageHref
|
|
121
124
|
return (
|
|
122
125
|
<option value={optionValue} selected={isSelected ? true : null}>
|
|
@@ -165,7 +168,11 @@ const PAGE_TEMPLATE = ({ Page, ExtraHead, components, ctx }) => {
|
|
|
165
168
|
{twitterDescription ? <meta name="twitter:description" content={twitterDescription} /> : null}
|
|
166
169
|
{twitterImage ? <meta name="twitter:image" content={twitterImage} /> : null}
|
|
167
170
|
<ExtraHead />
|
|
168
|
-
<link
|
|
171
|
+
<link
|
|
172
|
+
rel="preload stylesheet"
|
|
173
|
+
as="style"
|
|
174
|
+
href="/.methanol_theme_default/style.css"
|
|
175
|
+
/>
|
|
169
176
|
<script src="/theme-prepare.js"></script>
|
|
170
177
|
</head>
|
|
171
178
|
<body>
|
|
@@ -246,28 +253,49 @@ const PAGE_TEMPLATE = ({ Page, ExtraHead, components, ctx }) => {
|
|
|
246
253
|
</div>
|
|
247
254
|
</aside>
|
|
248
255
|
<main class="main-content" data-pagefind-body={pagefindEnabled ? '' : null}>
|
|
249
|
-
<
|
|
256
|
+
<PageContent />
|
|
250
257
|
{prevPage || nextPage ? (
|
|
251
258
|
<nav class="page-nav">
|
|
252
259
|
{prevPage ? (
|
|
253
|
-
<a
|
|
260
|
+
<a
|
|
261
|
+
class="page-nav-card prev"
|
|
262
|
+
href={prevPage.routeHref}
|
|
263
|
+
>
|
|
254
264
|
<span class="page-nav-label">Previous</span>
|
|
255
|
-
<span class="page-nav-title">{prevPage.title || prevPage.
|
|
265
|
+
<span class="page-nav-title">{prevPage.title || prevPage.routeHref}</span>
|
|
256
266
|
</a>
|
|
257
267
|
) : (
|
|
258
268
|
<div class="page-nav-spacer"></div>
|
|
259
269
|
)}
|
|
260
270
|
{nextPage ? (
|
|
261
|
-
<a
|
|
271
|
+
<a
|
|
272
|
+
class="page-nav-card next"
|
|
273
|
+
href={nextPage.routeHref}
|
|
274
|
+
>
|
|
262
275
|
<span class="page-nav-label">Next</span>
|
|
263
|
-
<span class="page-nav-title">{nextPage.title || nextPage.
|
|
276
|
+
<span class="page-nav-title">{nextPage.title || nextPage.routeHref}</span>
|
|
264
277
|
</a>
|
|
265
278
|
) : null}
|
|
266
279
|
</nav>
|
|
267
280
|
) : null}
|
|
268
281
|
{page ? (
|
|
269
282
|
<footer class="page-meta">
|
|
270
|
-
<div class="page-meta-item">
|
|
283
|
+
<div class="page-meta-item">
|
|
284
|
+
{editUrl ? (
|
|
285
|
+
<>
|
|
286
|
+
<a
|
|
287
|
+
href={editUrl}
|
|
288
|
+
target="_blank"
|
|
289
|
+
rel="noopener noreferrer"
|
|
290
|
+
class="page-meta-link"
|
|
291
|
+
>
|
|
292
|
+
Edit this page
|
|
293
|
+
</a>
|
|
294
|
+
<span style="margin: 0 0.5rem; opacity: 0.5;">•</span>
|
|
295
|
+
</>
|
|
296
|
+
) : null}
|
|
297
|
+
Updated: {page.updatedAt || '-'}
|
|
298
|
+
</div>
|
|
271
299
|
<div class="page-meta-item">
|
|
272
300
|
Powered by{' '}
|
|
273
301
|
<a
|
|
@@ -1374,11 +1374,11 @@ a {
|
|
|
1374
1374
|
align-items: center;
|
|
1375
1375
|
}
|
|
1376
1376
|
|
|
1377
|
+
.page-meta-link,
|
|
1377
1378
|
.methanol-link {
|
|
1378
1379
|
font-weight: 600;
|
|
1379
1380
|
color: var(--text);
|
|
1380
1381
|
text-decoration: none !important;
|
|
1381
|
-
margin-left: 0.25rem;
|
|
1382
1382
|
transition: all 0.2s ease;
|
|
1383
1383
|
border-bottom: 1px solid transparent;
|
|
1384
1384
|
|
|
@@ -1388,6 +1388,10 @@ a {
|
|
|
1388
1388
|
}
|
|
1389
1389
|
}
|
|
1390
1390
|
|
|
1391
|
+
.methanol-link {
|
|
1392
|
+
margin-left: 0.25rem;
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1391
1395
|
@media (max-width: 640px) {
|
|
1392
1396
|
.page-meta {
|
|
1393
1397
|
flex-direction: column;
|