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.
@@ -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 || node.routePath || ''
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.routePath ? encodeURI(node.routeHref || node.routePath) : null
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 = encodeURI(node.routeHref || node.routePath)
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 = ({ Page, ExtraHead, components, ctx }) => {
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?.name || 'Methanol Site'
76
- const title = page?.title || siteName
77
- const currentRoute = page?.routeHref || page?.routePath || ''
78
- const baseHref = page?.routePath === '/404' ? ctx.site?.base || '/' : null
79
- const toc = page?.toc?.length ? renderToc(page.toc) : null
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?.get?.('/') || pages.find((entry) => entry.routePath === '/')
85
- const pageFrontmatter = page?.frontmatter || {}
86
- const rootFrontmatter = rootPage?.frontmatter || {}
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?.logo ?? themeLogo
90
- const favicon = pageFrontmatter.favicon ?? rootFrontmatter.favicon ?? ctx.site?.favicon ?? themeFavIcon
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 = typeof page?.getSiblings === 'function' ? page.getSiblings() : null
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?.routePath || null
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?.pagefind?.enabled !== false
109
- const pagefindOptions = ctx.site?.pagefind?.options || null
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.routePath
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 rel="preload stylesheet" as="style" href="/.methanol_theme_default/style.css" />
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
- <Page />
256
+ <PageContent />
250
257
  {prevPage || nextPage ? (
251
258
  <nav class="page-nav">
252
259
  {prevPage ? (
253
- <a class="page-nav-card prev" href={prevPage.routeHref || prevPage.routePath}>
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.routePath}</span>
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 class="page-nav-card next" href={nextPage.routeHref || nextPage.routePath}>
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.routePath}</span>
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">Updated: {page.updatedAt || '-'}</div>
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;