@takazudo/zudo-doc 2.2.2 → 2.4.0
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/dist/chrome/index.d.ts +1 -0
- package/dist/chrome/index.js +4 -1
- package/dist/doc-content-header/index.d.ts +4 -0
- package/dist/doc-content-header/index.js +8 -0
- package/dist/factory-context/index.d.ts +26 -0
- package/dist/home-page/index.d.ts +51 -0
- package/dist/home-page/index.js +124 -0
- package/dist/home-page/prepare-home-data.d.ts +46 -0
- package/dist/home-page/prepare-home-data.js +37 -0
- package/dist/integrations/doc-history/pre-build.js +11 -33
- package/dist/plugins/routes.js +28 -1
- package/dist/preset.d.ts +9 -0
- package/dist/routes/_chrome.d.ts +1 -1
- package/dist/routes/_chrome.js +6 -2
- package/dist/routes/index.js +6 -109
- package/dist/routes/locale-index.js +6 -117
- package/dist/safelist.css +1 -1
- package/dist/search-widget-script/index.js +8 -27
- package/dist/search-widget-script/scoring.d.ts +16 -0
- package/dist/search-widget-script/scoring.js +25 -0
- package/dist/settings.d.ts +34 -0
- package/dist/sidebar-active-slug/index.d.ts +4 -0
- package/dist/sidebar-active-slug/index.js +15 -0
- package/dist/sidebar-filter/index.d.ts +10 -0
- package/dist/sidebar-filter/index.js +16 -0
- package/dist/sidebar-tree-island/index.js +2 -24
- package/eject/sidebar-tree-island/index.tsx +2 -33
- package/package.json +19 -5
- package/routes-src/_chrome.tsx +16 -0
- package/routes-src/_virtual.d.ts +15 -0
- package/routes-src/index.tsx +11 -117
- package/routes-src/locale-index.tsx +15 -123
package/routes-src/index.tsx
CHANGED
|
@@ -4,131 +4,25 @@
|
|
|
4
4
|
// (A1 #2361). Default-locale (EN) site index: site-map grid + optional tag
|
|
5
5
|
// count, rendered through the package chrome (`_chrome`). Static route — no
|
|
6
6
|
// paths() export.
|
|
7
|
+
//
|
|
8
|
+
// Thin consumer of `HomePageView` (S3 #2502): this file's only job is
|
|
9
|
+
// resolving the default locale and handing `routeCtx` to the shared
|
|
10
|
+
// `prepareHomeData` factory (#2519) for the data-prep sequence, then handing
|
|
11
|
+
// the result to the shared home body factory.
|
|
7
12
|
|
|
8
|
-
import type { JSX
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import type { SidebarNavNode } from "@takazudo/zudo-doc/sidebar";
|
|
13
|
-
import {
|
|
14
|
-
settings,
|
|
15
|
-
defaultLocale,
|
|
16
|
-
t,
|
|
17
|
-
withBase,
|
|
18
|
-
resolveNavSource,
|
|
19
|
-
buildNavTree,
|
|
20
|
-
groupSatelliteNodes,
|
|
21
|
-
getCategoryOrder,
|
|
22
|
-
collectTags,
|
|
23
|
-
docsUrl,
|
|
24
|
-
toRouteSlug,
|
|
25
|
-
} from "./_context.js";
|
|
26
|
-
import type { CategoryMeta } from "./_docs-helpers.js";
|
|
27
|
-
import {
|
|
28
|
-
HeadWithDefaults,
|
|
29
|
-
HeaderWithDefaults,
|
|
30
|
-
FooterWithDefaults,
|
|
31
|
-
BodyEndIslands,
|
|
32
|
-
composeMetaTitle,
|
|
33
|
-
} from "./_chrome.js";
|
|
13
|
+
import type { JSX } from "preact";
|
|
14
|
+
import { defaultLocale, routeCtx } from "./_context.js";
|
|
15
|
+
import { prepareHomeData } from "@takazudo/zudo-doc/home-page";
|
|
16
|
+
import { HomePageView } from "./_chrome.js";
|
|
34
17
|
|
|
35
18
|
export const frontmatter = { title: "Home" };
|
|
36
19
|
|
|
37
20
|
export default function IndexPage(): JSX.Element {
|
|
38
21
|
const locale = defaultLocale;
|
|
39
22
|
|
|
40
|
-
const {
|
|
41
|
-
const tree = buildNavTree(
|
|
42
|
-
navDocs,
|
|
43
|
-
locale,
|
|
44
|
-
categoryMeta as Map<string, CategoryMeta>,
|
|
45
|
-
(slug, loc) => docsUrl(slug, loc),
|
|
46
|
-
);
|
|
47
|
-
const categoryOrder = getCategoryOrder();
|
|
48
|
-
const groupedTree = groupSatelliteNodes(tree, categoryOrder);
|
|
49
|
-
|
|
50
|
-
const tagCount = collectTags(
|
|
51
|
-
navDocs.filter((d) => !d.data.category_no_page),
|
|
52
|
-
(id, data) => data.slug ?? toRouteSlug(id),
|
|
53
|
-
).size;
|
|
54
|
-
|
|
55
|
-
const ctaNav = settings.headerNav[0] ?? null;
|
|
56
|
-
const overview = ctaNav ? withBase(ctaNav.path) : null;
|
|
57
|
-
const logoUrl = withBase("/img/logo.svg");
|
|
23
|
+
const { tree, categoryOrder, tagCount } = prepareHomeData(routeCtx, locale);
|
|
58
24
|
|
|
59
25
|
return (
|
|
60
|
-
<
|
|
61
|
-
title={composeMetaTitle(settings.siteName)}
|
|
62
|
-
head={<HeadWithDefaults title={settings.siteName} />}
|
|
63
|
-
lang={locale}
|
|
64
|
-
noindex={settings.noindex}
|
|
65
|
-
hideSidebar={true}
|
|
66
|
-
hideToc={true}
|
|
67
|
-
sidebarOverride={<></>}
|
|
68
|
-
headerOverride={<HeaderWithDefaults lang={locale} currentPath={withBase("/")} />}
|
|
69
|
-
footerOverride={<FooterWithDefaults lang={locale} />}
|
|
70
|
-
bodyEndComponents={<BodyEndIslands basePath={settings.base ?? "/"} />}
|
|
71
|
-
enableClientRouter={settings.dynamicPageTransition}
|
|
72
|
-
>
|
|
73
|
-
<div class="flex justify-center mb-vsp-xl">
|
|
74
|
-
<div class="flex flex-col items-center text-center gap-hsp-md lg:flex-row lg:text-left lg:gap-hsp-xl">
|
|
75
|
-
<div
|
|
76
|
-
class="w-[320px] max-w-full aspect-[1200/630] bg-fg shrink-0"
|
|
77
|
-
style={{
|
|
78
|
-
WebkitMask: `url(${logoUrl}) center/contain no-repeat`,
|
|
79
|
-
mask: `url(${logoUrl}) center/contain no-repeat`,
|
|
80
|
-
}}
|
|
81
|
-
aria-hidden="true"
|
|
82
|
-
/>
|
|
83
|
-
<div>
|
|
84
|
-
<h1 class="text-heading font-bold mb-vsp-2xs">{settings.siteName}</h1>
|
|
85
|
-
<p class="text-muted text-small mb-vsp-sm">{settings.siteDescription}</p>
|
|
86
|
-
<div class="flex items-center justify-center lg:justify-start gap-hsp-md text-small">
|
|
87
|
-
{overview && (
|
|
88
|
-
<>
|
|
89
|
-
<a href={overview} class="text-fg underline hover:text-accent">
|
|
90
|
-
{t("nav.overview", locale)}
|
|
91
|
-
</a>
|
|
92
|
-
<span class="text-muted">/</span>
|
|
93
|
-
</>
|
|
94
|
-
)}
|
|
95
|
-
{settings.githubUrl && (
|
|
96
|
-
<>
|
|
97
|
-
<a
|
|
98
|
-
href={settings.githubUrl as string}
|
|
99
|
-
class="inline-flex items-center gap-[0.3em] text-fg underline hover:text-accent"
|
|
100
|
-
target="_blank"
|
|
101
|
-
rel="noopener noreferrer"
|
|
102
|
-
>
|
|
103
|
-
GitHub
|
|
104
|
-
</a>
|
|
105
|
-
<span class="text-muted">/</span>
|
|
106
|
-
</>
|
|
107
|
-
)}
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
{Island({
|
|
114
|
-
when: "idle",
|
|
115
|
-
children: (
|
|
116
|
-
<SiteTreeNav
|
|
117
|
-
tree={groupedTree as unknown as SidebarNavNode[]}
|
|
118
|
-
categoryOrder={categoryOrder}
|
|
119
|
-
categoryIgnore={["inbox", "develop"]}
|
|
120
|
-
/>
|
|
121
|
-
),
|
|
122
|
-
}) as unknown as VNode}
|
|
123
|
-
|
|
124
|
-
{settings.docTags && tagCount > 0 && (
|
|
125
|
-
<section class="mt-vsp-xl">
|
|
126
|
-
<h2 class="text-title font-bold mb-vsp-md">{t("doc.allTags", locale)}</h2>
|
|
127
|
-
<a href={withBase("/docs/tags")} class="text-accent underline hover:text-accent-hover">
|
|
128
|
-
{t("doc.allTags", locale)}
|
|
129
|
-
</a>
|
|
130
|
-
</section>
|
|
131
|
-
)}
|
|
132
|
-
</DocLayoutWithDefaults>
|
|
26
|
+
<HomePageView locale={locale} tree={tree} categoryOrder={categoryOrder} tagCount={tagCount} />
|
|
133
27
|
);
|
|
134
28
|
}
|
|
@@ -3,34 +3,19 @@
|
|
|
3
3
|
// Package route entrypoint: /[locale] — package-owned equivalent of
|
|
4
4
|
// pages/[locale]/index.tsx (A1 #2361). One route per non-default locale; the
|
|
5
5
|
// locale-prefixed site index (site-map grid + optional tag count).
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
buildNavTree,
|
|
20
|
-
groupSatelliteNodes,
|
|
21
|
-
getCategoryOrder,
|
|
22
|
-
collectTags,
|
|
23
|
-
docsUrl,
|
|
24
|
-
toRouteSlug,
|
|
25
|
-
} from "./_context.js";
|
|
26
|
-
import type { CategoryMeta } from "./_docs-helpers.js";
|
|
27
|
-
import {
|
|
28
|
-
HeadWithDefaults,
|
|
29
|
-
HeaderWithDefaults,
|
|
30
|
-
FooterWithDefaults,
|
|
31
|
-
BodyEndIslands,
|
|
32
|
-
composeMetaTitle,
|
|
33
|
-
} from "./_chrome.js";
|
|
6
|
+
//
|
|
7
|
+
// Thin consumer of `HomePageView` (S3 #2502): this file's only job is
|
|
8
|
+
// `paths()` (a locale-routing concern) and handing `routeCtx` + the resolved
|
|
9
|
+
// locale param to the shared `prepareHomeData` factory (#2519), which now
|
|
10
|
+
// owns the locale-specific data prep — `resolveNavSource` with the
|
|
11
|
+
// locale-home filter options, `loadCategoryMeta`, and the locale-config
|
|
12
|
+
// guard. The prepared tree / tag count are handed to the shared home body
|
|
13
|
+
// factory, same as the default-locale route.
|
|
14
|
+
|
|
15
|
+
import type { JSX } from "preact";
|
|
16
|
+
import { settings, routeCtx } from "./_context.js";
|
|
17
|
+
import { prepareHomeData } from "@takazudo/zudo-doc/home-page";
|
|
18
|
+
import { HomePageView } from "./_chrome.js";
|
|
34
19
|
|
|
35
20
|
export const frontmatter = { title: "Home" };
|
|
36
21
|
|
|
@@ -48,103 +33,10 @@ interface PageArgs {
|
|
|
48
33
|
|
|
49
34
|
export default function LocaleIndexPage({ params }: PageArgs): JSX.Element {
|
|
50
35
|
const locale = params.locale;
|
|
51
|
-
const cfg = getLocaleConfig(locale);
|
|
52
|
-
if (!cfg) {
|
|
53
|
-
throw new Error(`LocaleIndexPage: locale "${locale}" is not configured in settings.locales`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const { navDocs } = resolveNavSource(locale, undefined, {
|
|
57
|
-
applyDefaultLocaleOnlyFilter: true,
|
|
58
|
-
keepUnlisted: true,
|
|
59
|
-
});
|
|
60
|
-
const categoryMeta = loadCategoryMeta(cfg.dir) as Map<string, CategoryMeta>;
|
|
61
|
-
|
|
62
|
-
const tree = buildNavTree(navDocs, locale, categoryMeta, (slug, loc) => docsUrl(slug, loc));
|
|
63
|
-
const categoryOrder = getCategoryOrder();
|
|
64
|
-
const groupedTree = groupSatelliteNodes(tree, categoryOrder);
|
|
65
36
|
|
|
66
|
-
const tagCount =
|
|
67
|
-
navDocs.filter((d) => !d.data.category_no_page),
|
|
68
|
-
(id, data) => data.slug ?? toRouteSlug(id),
|
|
69
|
-
).size;
|
|
70
|
-
|
|
71
|
-
const ctaNav = settings.headerNav[0] ?? null;
|
|
72
|
-
const overview = ctaNav ? withBase(`/${locale}${ctaNav.path}`) : null;
|
|
73
|
-
const logoUrl = withBase("/img/logo.svg");
|
|
37
|
+
const { tree, categoryOrder, tagCount } = prepareHomeData(routeCtx, locale);
|
|
74
38
|
|
|
75
39
|
return (
|
|
76
|
-
<
|
|
77
|
-
title={composeMetaTitle(settings.siteName)}
|
|
78
|
-
head={<HeadWithDefaults title={settings.siteName} />}
|
|
79
|
-
lang={locale}
|
|
80
|
-
noindex={settings.noindex}
|
|
81
|
-
hideSidebar={true}
|
|
82
|
-
hideToc={true}
|
|
83
|
-
sidebarOverride={<></>}
|
|
84
|
-
headerOverride={<HeaderWithDefaults lang={locale} currentPath={withBase(`/${locale}/`)} />}
|
|
85
|
-
footerOverride={<FooterWithDefaults lang={locale} />}
|
|
86
|
-
bodyEndComponents={<BodyEndIslands basePath={settings.base ?? "/"} />}
|
|
87
|
-
enableClientRouter={settings.dynamicPageTransition}
|
|
88
|
-
>
|
|
89
|
-
<div class="flex justify-center mb-vsp-xl">
|
|
90
|
-
<div class="flex flex-col items-center text-center gap-hsp-md lg:flex-row lg:text-left lg:gap-hsp-xl">
|
|
91
|
-
<div
|
|
92
|
-
class="w-[320px] max-w-full aspect-[1200/630] bg-fg shrink-0"
|
|
93
|
-
style={{
|
|
94
|
-
WebkitMask: `url(${logoUrl}) center/contain no-repeat`,
|
|
95
|
-
mask: `url(${logoUrl}) center/contain no-repeat`,
|
|
96
|
-
}}
|
|
97
|
-
aria-hidden="true"
|
|
98
|
-
/>
|
|
99
|
-
<div>
|
|
100
|
-
<h1 class="text-heading font-bold mb-vsp-2xs">{settings.siteName}</h1>
|
|
101
|
-
<p class="text-muted text-small mb-vsp-sm">{settings.siteDescription}</p>
|
|
102
|
-
<div class="flex items-center justify-center lg:justify-start gap-hsp-md text-small">
|
|
103
|
-
{overview && (
|
|
104
|
-
<>
|
|
105
|
-
<a href={overview} class="text-fg underline hover:text-accent">
|
|
106
|
-
{t("nav.overview", locale)}
|
|
107
|
-
</a>
|
|
108
|
-
<span class="text-muted">/</span>
|
|
109
|
-
</>
|
|
110
|
-
)}
|
|
111
|
-
{settings.githubUrl && (
|
|
112
|
-
<a
|
|
113
|
-
href={settings.githubUrl as string}
|
|
114
|
-
class="inline-flex items-center gap-[0.3em] text-fg underline hover:text-accent"
|
|
115
|
-
target="_blank"
|
|
116
|
-
rel="noopener noreferrer"
|
|
117
|
-
>
|
|
118
|
-
GitHub
|
|
119
|
-
</a>
|
|
120
|
-
)}
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
</div>
|
|
125
|
-
|
|
126
|
-
{Island({
|
|
127
|
-
when: "idle",
|
|
128
|
-
children: (
|
|
129
|
-
<SiteTreeNav
|
|
130
|
-
tree={groupedTree as unknown as SidebarNavNode[]}
|
|
131
|
-
categoryOrder={categoryOrder}
|
|
132
|
-
categoryIgnore={["inbox", "develop"]}
|
|
133
|
-
/>
|
|
134
|
-
),
|
|
135
|
-
}) as unknown as VNode}
|
|
136
|
-
|
|
137
|
-
{settings.docTags && tagCount > 0 && (
|
|
138
|
-
<section class="mt-vsp-xl">
|
|
139
|
-
<h2 class="text-title font-bold mb-vsp-md">{t("doc.allTags", locale)}</h2>
|
|
140
|
-
<a
|
|
141
|
-
href={withBase(`/${locale}/docs/tags`)}
|
|
142
|
-
class="text-accent underline hover:text-accent-hover"
|
|
143
|
-
>
|
|
144
|
-
{t("doc.allTags", locale)}
|
|
145
|
-
</a>
|
|
146
|
-
</section>
|
|
147
|
-
)}
|
|
148
|
-
</DocLayoutWithDefaults>
|
|
40
|
+
<HomePageView locale={locale} tree={tree} categoryOrder={categoryOrder} tagCount={tagCount} />
|
|
149
41
|
);
|
|
150
42
|
}
|