create-zudo-doc 0.1.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.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/bin/create-zudo-doc.js +2 -0
  4. package/dist/api.d.ts +20 -0
  5. package/dist/api.js +13 -0
  6. package/dist/claude-md-gen.d.ts +2 -0
  7. package/dist/claude-md-gen.js +113 -0
  8. package/dist/cli.d.ts +39 -0
  9. package/dist/cli.js +157 -0
  10. package/dist/compose.d.ts +95 -0
  11. package/dist/compose.js +206 -0
  12. package/dist/constants.d.ts +20 -0
  13. package/dist/constants.js +224 -0
  14. package/dist/features/body-foot-util.d.ts +10 -0
  15. package/dist/features/body-foot-util.js +12 -0
  16. package/dist/features/claude-resources.d.ts +2 -0
  17. package/dist/features/claude-resources.js +6 -0
  18. package/dist/features/design-token-panel.d.ts +14 -0
  19. package/dist/features/design-token-panel.js +27 -0
  20. package/dist/features/doc-history.d.ts +9 -0
  21. package/dist/features/doc-history.js +11 -0
  22. package/dist/features/doc-tags.d.ts +19 -0
  23. package/dist/features/doc-tags.js +33 -0
  24. package/dist/features/footer-taglist.d.ts +14 -0
  25. package/dist/features/footer-taglist.js +17 -0
  26. package/dist/features/footer.d.ts +8 -0
  27. package/dist/features/footer.js +10 -0
  28. package/dist/features/i18n.d.ts +22 -0
  29. package/dist/features/i18n.js +41 -0
  30. package/dist/features/image-enlarge.d.ts +11 -0
  31. package/dist/features/image-enlarge.js +13 -0
  32. package/dist/features/index.d.ts +15 -0
  33. package/dist/features/index.js +53 -0
  34. package/dist/features/llms-txt.d.ts +11 -0
  35. package/dist/features/llms-txt.js +13 -0
  36. package/dist/features/search.d.ts +9 -0
  37. package/dist/features/search.js +11 -0
  38. package/dist/features/sidebar-resizer.d.ts +14 -0
  39. package/dist/features/sidebar-resizer.js +16 -0
  40. package/dist/features/sidebar-toggle.d.ts +13 -0
  41. package/dist/features/sidebar-toggle.js +15 -0
  42. package/dist/features/tag-governance.d.ts +14 -0
  43. package/dist/features/tag-governance.js +16 -0
  44. package/dist/features/tauri-dev.d.ts +2 -0
  45. package/dist/features/tauri-dev.js +25 -0
  46. package/dist/features/tauri.d.ts +11 -0
  47. package/dist/features/tauri.js +52 -0
  48. package/dist/features/versioning.d.ts +27 -0
  49. package/dist/features/versioning.js +43 -0
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +150 -0
  52. package/dist/preset.d.ts +37 -0
  53. package/dist/preset.js +156 -0
  54. package/dist/prompts.d.ts +32 -0
  55. package/dist/prompts.js +248 -0
  56. package/dist/scaffold.d.ts +4 -0
  57. package/dist/scaffold.js +344 -0
  58. package/dist/settings-gen.d.ts +2 -0
  59. package/dist/settings-gen.js +237 -0
  60. package/dist/utils.d.ts +8 -0
  61. package/dist/utils.js +34 -0
  62. package/dist/zfb-config-gen.d.ts +19 -0
  63. package/dist/zfb-config-gen.js +222 -0
  64. package/package.json +65 -0
  65. package/templates/base/.htmlvalidate.json +5 -0
  66. package/templates/base/.zfb/doc-history-meta.json +1 -0
  67. package/templates/base/pages/404.tsx +55 -0
  68. package/templates/base/pages/_data.ts +179 -0
  69. package/templates/base/pages/_mdx-components.ts +249 -0
  70. package/templates/base/pages/docs/[...slug].tsx +448 -0
  71. package/templates/base/pages/index.tsx +158 -0
  72. package/templates/base/pages/lib/_body-end-islands.tsx +201 -0
  73. package/templates/base/pages/lib/_category-nav.tsx +148 -0
  74. package/templates/base/pages/lib/_category-tree-nav.tsx +104 -0
  75. package/templates/base/pages/lib/_compose-meta-title.ts +29 -0
  76. package/templates/base/pages/lib/_details.tsx +30 -0
  77. package/templates/base/pages/lib/_doc-history-area.tsx +178 -0
  78. package/templates/base/pages/lib/_doc-metainfo-area.tsx +100 -0
  79. package/templates/base/pages/lib/_doc-tags-area.tsx +89 -0
  80. package/templates/base/pages/lib/_extract-headings.ts +81 -0
  81. package/templates/base/pages/lib/_footer-with-defaults.tsx +234 -0
  82. package/templates/base/pages/lib/_frontmatter-preview-data.ts +53 -0
  83. package/templates/base/pages/lib/_head-with-defaults.tsx +113 -0
  84. package/templates/base/pages/lib/_header-with-defaults.tsx +386 -0
  85. package/templates/base/pages/lib/_inline-version-switcher.tsx +84 -0
  86. package/templates/base/pages/lib/_math-block.tsx +63 -0
  87. package/templates/base/pages/lib/_nav-source-docs.ts +68 -0
  88. package/templates/base/pages/lib/_preset-generator.tsx +81 -0
  89. package/templates/base/pages/lib/_search-widget-script.ts +388 -0
  90. package/templates/base/pages/lib/_search-widget.tsx +196 -0
  91. package/templates/base/pages/lib/_sidebar-with-defaults.tsx +176 -0
  92. package/templates/base/pages/lib/_site-tree-nav.tsx +128 -0
  93. package/templates/base/pages/lib/locale-merge.ts +58 -0
  94. package/templates/base/pages/lib/route-enumerators.ts +302 -0
  95. package/templates/base/pages/sitemap.xml.tsx +51 -0
  96. package/templates/base/plugins/connect-adapter.mjs +144 -0
  97. package/templates/base/plugins/copy-public-plugin.mjs +50 -0
  98. package/templates/base/plugins/search-index-plugin.mjs +54 -0
  99. package/templates/base/scripts/run-b4push.sh +102 -0
  100. package/templates/base/src/components/ai-chat-modal.tsx +15 -0
  101. package/templates/base/src/components/client-router-bootstrap.tsx +14 -0
  102. package/templates/base/src/components/content/component-map.ts +25 -0
  103. package/templates/base/src/components/content/content-blockquote.tsx +16 -0
  104. package/templates/base/src/components/content/content-code.tsx +117 -0
  105. package/templates/base/src/components/content/content-link.tsx +83 -0
  106. package/templates/base/src/components/content/content-ol.tsx +19 -0
  107. package/templates/base/src/components/content/content-paragraph.tsx +10 -0
  108. package/templates/base/src/components/content/content-strong.tsx +16 -0
  109. package/templates/base/src/components/content/content-table.tsx +18 -0
  110. package/templates/base/src/components/content/content-ul.tsx +18 -0
  111. package/templates/base/src/components/content/heading-h2.tsx +26 -0
  112. package/templates/base/src/components/content/heading-h3.tsx +26 -0
  113. package/templates/base/src/components/content/heading-h4.tsx +26 -0
  114. package/templates/base/src/components/design-token-panel-bootstrap.tsx +15 -0
  115. package/templates/base/src/components/desktop-sidebar-toggle.tsx +15 -0
  116. package/templates/base/src/components/doc-history.tsx +18 -0
  117. package/templates/base/src/components/html-preview/highlighted-code.tsx +74 -0
  118. package/templates/base/src/components/html-preview/html-preview.tsx +108 -0
  119. package/templates/base/src/components/html-preview/preflight.ts +112 -0
  120. package/templates/base/src/components/html-preview/preview-base.tsx +159 -0
  121. package/templates/base/src/components/image-enlarge.tsx +19 -0
  122. package/templates/base/src/components/mobile-toc.tsx +94 -0
  123. package/templates/base/src/components/preset-generator.tsx +14 -0
  124. package/templates/base/src/components/sidebar-toggle.tsx +98 -0
  125. package/templates/base/src/components/sidebar-tree.tsx +543 -0
  126. package/templates/base/src/components/site-tree-nav.tsx +233 -0
  127. package/templates/base/src/components/theme-toggle.tsx +93 -0
  128. package/templates/base/src/components/toc.tsx +63 -0
  129. package/templates/base/src/components/tree-nav-shared.tsx +71 -0
  130. package/templates/base/src/config/color-scheme-utils.ts +182 -0
  131. package/templates/base/src/config/color-schemes.ts +128 -0
  132. package/templates/base/src/config/frontmatter-preview-defaults.ts +24 -0
  133. package/templates/base/src/config/frontmatter-preview-renderers.tsx +46 -0
  134. package/templates/base/src/config/i18n.ts +225 -0
  135. package/templates/base/src/config/settings-types.ts +162 -0
  136. package/templates/base/src/config/sidebars.ts +66 -0
  137. package/templates/base/src/config/tag-vocabulary-types.ts +39 -0
  138. package/templates/base/src/config/tag-vocabulary.ts +20 -0
  139. package/templates/base/src/hooks/use-active-heading.ts +133 -0
  140. package/templates/base/src/plugins/docs-source-map.ts +103 -0
  141. package/templates/base/src/plugins/hast-utils.ts +10 -0
  142. package/templates/base/src/plugins/rehype-code-title.ts +50 -0
  143. package/templates/base/src/plugins/rehype-heading-links.ts +53 -0
  144. package/templates/base/src/plugins/rehype-image-enlarge.ts +113 -0
  145. package/templates/base/src/plugins/rehype-mermaid.ts +41 -0
  146. package/templates/base/src/plugins/rehype-strip-md-extension.ts +58 -0
  147. package/templates/base/src/plugins/remark-admonitions.ts +99 -0
  148. package/templates/base/src/plugins/remark-resolve-markdown-links.ts +127 -0
  149. package/templates/base/src/plugins/url-utils.ts +4 -0
  150. package/templates/base/src/styles/global.css +1066 -0
  151. package/templates/base/src/types/docs-entry.ts +39 -0
  152. package/templates/base/src/types/heading.ts +5 -0
  153. package/templates/base/src/types/locale.ts +10 -0
  154. package/templates/base/src/utils/base.ts +139 -0
  155. package/templates/base/src/utils/content-files.ts +106 -0
  156. package/templates/base/src/utils/dedent.ts +24 -0
  157. package/templates/base/src/utils/docs.ts +335 -0
  158. package/templates/base/src/utils/git-info.ts +70 -0
  159. package/templates/base/src/utils/github.ts +19 -0
  160. package/templates/base/src/utils/header-right-items.ts +38 -0
  161. package/templates/base/src/utils/nav-scope.ts +63 -0
  162. package/templates/base/src/utils/sidebar.ts +104 -0
  163. package/templates/base/src/utils/slug.ts +10 -0
  164. package/templates/base/src/utils/smart-break.tsx +126 -0
  165. package/templates/base/src/utils/tags.ts +126 -0
  166. package/templates/base/tsconfig.json +36 -0
  167. package/templates/features/bodyFootUtil/files/src/utils/github.ts +19 -0
  168. package/templates/features/claudeResources/files/plugins/claude-resources-plugin.mjs +137 -0
  169. package/templates/features/claudeResources/files/src/integrations/claude-resources/__tests__/escape-for-mdx.test.ts +34 -0
  170. package/templates/features/claudeResources/files/src/integrations/claude-resources/__tests__/generate.test.ts +376 -0
  171. package/templates/features/claudeResources/files/src/integrations/claude-resources/escape-for-mdx.ts +93 -0
  172. package/templates/features/claudeResources/files/src/integrations/claude-resources/generate.ts +586 -0
  173. package/templates/features/designTokenPanel/files/src/components/design-token-panel-bootstrap.tsx +15 -0
  174. package/templates/features/designTokenPanel/files/src/config/design-token-panel-config.ts +99 -0
  175. package/templates/features/designTokenPanel/files/src/config/design-tokens-manifest.ts +177 -0
  176. package/templates/features/designTokenPanel/files/src/lib/design-token-panel-bootstrap.ts +50 -0
  177. package/templates/features/docHistory/files/plugins/doc-history-plugin.mjs +99 -0
  178. package/templates/features/docHistory/files/src/components/doc-history.tsx +598 -0
  179. package/templates/features/docHistory/files/src/types/doc-history.ts +23 -0
  180. package/templates/features/docHistory/files/src/utils/doc-history.ts +180 -0
  181. package/templates/features/docTags/files/pages/[locale]/docs/tags/[tag].tsx +116 -0
  182. package/templates/features/docTags/files/pages/[locale]/docs/tags/index.tsx +99 -0
  183. package/templates/features/docTags/files/pages/docs/tags/[tag].tsx +101 -0
  184. package/templates/features/docTags/files/pages/docs/tags/index.tsx +86 -0
  185. package/templates/features/i18n/files/pages/[locale]/docs/[...slug].tsx +467 -0
  186. package/templates/features/i18n/files/pages/[locale]/index.tsx +213 -0
  187. package/templates/features/imageEnlarge/files/src/components/image-enlarge.tsx +248 -0
  188. package/templates/features/llmsTxt/files/plugins/llms-txt-plugin.mjs +74 -0
  189. package/templates/features/sidebarResizer/files/src/scripts/sidebar-resizer.ts +185 -0
  190. package/templates/features/sidebarToggle/files/src/components/desktop-sidebar-toggle.tsx +126 -0
  191. package/templates/features/tagGovernance/files/scripts/tags-audit.ts +576 -0
  192. package/templates/features/tagGovernance/files/scripts/tags-suggest.ts +428 -0
  193. package/templates/features/tauri/files/src/components/find-bar.tsx +122 -0
  194. package/templates/features/tauri/files/src/components/find-in-page-init.tsx +53 -0
  195. package/templates/features/tauri/files/src/utils/find-in-page.ts +175 -0
  196. package/templates/features/tauri/files/src-tauri/Cargo.toml +14 -0
  197. package/templates/features/tauri/files/src-tauri/build.rs +3 -0
  198. package/templates/features/tauri/files/src-tauri/capabilities/default.json +11 -0
  199. package/templates/features/tauri/files/src-tauri/src/main.rs +250 -0
  200. package/templates/features/tauri/files/src-tauri/tauri.conf.json +25 -0
  201. package/templates/features/tauriDev/files/src-tauri-dev/Cargo.toml +15 -0
  202. package/templates/features/tauriDev/files/src-tauri-dev/build.rs +3 -0
  203. package/templates/features/tauriDev/files/src-tauri-dev/capabilities/default.json +7 -0
  204. package/templates/features/tauriDev/files/src-tauri-dev/frontend/index.html +187 -0
  205. package/templates/features/tauriDev/files/src-tauri-dev/icons/icon.png +0 -0
  206. package/templates/features/tauriDev/files/src-tauri-dev/src/main.rs +995 -0
  207. package/templates/features/tauriDev/files/src-tauri-dev/tauri.conf.json +22 -0
  208. package/templates/features/tauriDev/files/src-tauri-dev/test-launch.sh +65 -0
  209. package/templates/features/versioning/files/pages/[locale]/docs/versions.tsx +100 -0
  210. package/templates/features/versioning/files/pages/docs/versions.tsx +78 -0
  211. package/templates/features/versioning/files/pages/v/[version]/docs/[...slug].tsx +451 -0
  212. package/templates/features/versioning/files/pages/v/[version]/ja/docs/[...slug].tsx +490 -0
@@ -0,0 +1,99 @@
1
+ import type { Root, Node as MdastNode } from "mdast";
2
+ import { visit, SKIP } from "unist-util-visit";
3
+
4
+ /**
5
+ * Remark plugin that transforms container directives (`:::note`, `:::info`,
6
+ * etc., parsed by remark-directive) into JSX component nodes (`<Note>`,
7
+ * `<Info>`, etc.) that Astro MDX resolves via the `components` prop.
8
+ *
9
+ * Requires remark-directive to run before this plugin.
10
+ *
11
+ * Usage in MDX:
12
+ * :::note[Custom Title]
13
+ * Content here.
14
+ * :::
15
+ *
16
+ * :::note
17
+ * Content without custom title.
18
+ * :::
19
+ */
20
+
21
+ /** A container directive node produced by remark-directive */
22
+ interface ContainerDirective extends MdastNode {
23
+ type: "containerDirective";
24
+ name: string;
25
+ children: DirectiveChild[];
26
+ data?: Record<string, unknown>;
27
+ attributes?: MdxJsxAttribute[];
28
+ }
29
+
30
+ interface DirectiveChild {
31
+ type: string;
32
+ value?: string;
33
+ children?: DirectiveChild[];
34
+ data?: { directiveLabel?: boolean; [key: string]: unknown };
35
+ }
36
+
37
+ interface MdxJsxAttribute {
38
+ type: "mdxJsxAttribute";
39
+ name: string;
40
+ value: string;
41
+ }
42
+
43
+ const ADMONITION_TYPES = new Set(["note", "tip", "info", "warning", "danger"]);
44
+
45
+ function capitalize(s: string): string {
46
+ return s.charAt(0).toUpperCase() + s.slice(1);
47
+ }
48
+
49
+ /** Recursively extract plain text from an mdast node tree. */
50
+ function extractText(node: DirectiveChild): string {
51
+ if (typeof node.value === "string") return node.value;
52
+ if (Array.isArray(node.children)) {
53
+ return node.children.map(extractText).join("");
54
+ }
55
+ return "";
56
+ }
57
+
58
+ export function remarkAdmonitions() {
59
+ return (tree: Root) => {
60
+ visit(tree, (node: MdastNode) => {
61
+ if (
62
+ node.type === "containerDirective" &&
63
+ "name" in node &&
64
+ ADMONITION_TYPES.has((node as ContainerDirective).name)
65
+ ) {
66
+ const directive = node as ContainerDirective;
67
+ const componentName = capitalize(directive.name);
68
+
69
+ // Extract title from the directive label
70
+ const label = directive.children?.[0];
71
+ const isLabel = label?.data?.directiveLabel === true;
72
+ const title = isLabel ? extractText(label) : "";
73
+
74
+ // Build JSX attributes
75
+ const attributes: MdxJsxAttribute[] = [];
76
+ if (title) {
77
+ attributes.push({
78
+ type: "mdxJsxAttribute",
79
+ name: "title",
80
+ value: title,
81
+ });
82
+ }
83
+
84
+ // Replace the node in-place with an mdxJsxFlowElement
85
+ (directive as unknown as Record<string, unknown>).type = "mdxJsxFlowElement";
86
+ (directive as unknown as Record<string, unknown>).name = componentName;
87
+ directive.attributes = attributes;
88
+ delete directive.data;
89
+
90
+ // Remove the label paragraph from children if consumed as title
91
+ if (isLabel) {
92
+ directive.children = directive.children.slice(1);
93
+ }
94
+
95
+ return SKIP;
96
+ }
97
+ });
98
+ };
99
+ }
@@ -0,0 +1,127 @@
1
+ import type { Root, Link, Definition, Node } from "mdast";
2
+ import { visit } from "unist-util-visit";
3
+ import { resolve, dirname } from "node:path";
4
+ import { buildDocsSourceMap, type DocsSourceMapOptions } from "./docs-source-map";
5
+ import { isExternal } from "./url-utils";
6
+
7
+ export interface ResolveMarkdownLinksOptions extends DocsSourceMapOptions {
8
+ /** Behavior on broken links: 'warn' (default), 'error', 'ignore' */
9
+ onBrokenLinks?: "warn" | "error" | "ignore";
10
+ }
11
+
12
+ /** Check if pathname has a markdown (.md / .mdx) extension. */
13
+ function hasMarkdownExtension(pathname: string): boolean {
14
+ return /\.mdx?$/.test(pathname);
15
+ }
16
+
17
+ /** Parse a URL into pathname, search, and hash parts */
18
+ function parseUrl(url: string): {
19
+ pathname: string;
20
+ search: string;
21
+ hash: string;
22
+ } {
23
+ const hashIdx = url.indexOf("#");
24
+ const searchIdx = url.indexOf("?");
25
+
26
+ let pathname = url;
27
+ let search = "";
28
+ let hash = "";
29
+
30
+ if (hashIdx >= 0) {
31
+ hash = url.slice(hashIdx);
32
+ pathname = url.slice(0, hashIdx);
33
+ }
34
+ if (searchIdx >= 0 && (hashIdx < 0 || searchIdx < hashIdx)) {
35
+ search = hash ? url.slice(searchIdx, hashIdx) : url.slice(searchIdx);
36
+ pathname = url.slice(0, searchIdx);
37
+ }
38
+
39
+ return { pathname, search, hash };
40
+ }
41
+
42
+ /**
43
+ * Build candidate source-file paths for an extensionless URL.
44
+ * Tries ".mdx" / ".md" suffixes first, then index pages for
45
+ * directory-style links such as "./guide/".
46
+ */
47
+ function extensionlessCandidates(basePath: string): string[] {
48
+ return [
49
+ `${basePath}.mdx`,
50
+ `${basePath}.md`,
51
+ `${basePath}/index.mdx`,
52
+ `${basePath}/index.md`,
53
+ ];
54
+ }
55
+
56
+ export function remarkResolveMarkdownLinks(
57
+ options: ResolveMarkdownLinksOptions,
58
+ ) {
59
+ const onBrokenLinks = options.onBrokenLinks ?? "warn";
60
+
61
+ return (tree: Root, file: { path?: string }) => {
62
+ // Rebuild source map on every call so new/removed files are picked up
63
+ // during dev server. The filesystem scan is fast (~1ms for typical doc sites).
64
+ const sourceMap = buildDocsSourceMap(options);
65
+
66
+ const currentFilePath = file.path;
67
+ if (!currentFilePath) return;
68
+
69
+ const currentDir = dirname(currentFilePath);
70
+
71
+ visit(tree, (node: Node) => {
72
+ if (node.type !== "link" && node.type !== "definition") return;
73
+ const linkNode = node as Link | Definition;
74
+ const url = linkNode.url;
75
+
76
+ // Skip: no URL, external URLs, pure anchors
77
+ if (!url || isExternal(url) || url.startsWith("#")) return;
78
+
79
+ const { pathname, search, hash } = parseUrl(url);
80
+
81
+ // Need a non-empty pathname to attempt resolution
82
+ if (!pathname) return;
83
+
84
+ let resolvedPath: string | null = null;
85
+ let extensionlessLookup = false;
86
+
87
+ if (hasMarkdownExtension(pathname)) {
88
+ // Explicit .md / .mdx link — existing behavior, may warn on miss.
89
+ resolvedPath = resolve(currentDir, pathname);
90
+ } else {
91
+ // Extensionless URL — probe likely source paths. This handles:
92
+ // - "./dark-mode-strategies" → dark-mode-strategies.mdx / .md
93
+ // - "./0.1.0" (dotted slug) → 0.1.0.mdx / .md
94
+ // - "./guide/" (dir style) → guide/index.mdx / .md
95
+ // If nothing matches we leave the link alone — it may legitimately
96
+ // point at a public asset, an absolute route, or a non-doc target.
97
+ extensionlessLookup = true;
98
+ const basePath = resolve(currentDir, pathname);
99
+ for (const candidate of extensionlessCandidates(basePath)) {
100
+ if (sourceMap.has(candidate)) {
101
+ resolvedPath = candidate;
102
+ break;
103
+ }
104
+ }
105
+ if (!resolvedPath) return;
106
+ }
107
+
108
+ const resolvedUrl = sourceMap.get(resolvedPath);
109
+
110
+ if (resolvedUrl) {
111
+ linkNode.url = resolvedUrl + search + hash;
112
+ } else if (!extensionlessLookup) {
113
+ // Broken link handling — only reached for explicit .md/.mdx links
114
+ // that did not match anything in the source map.
115
+ const fileRelative = file.path ?? "unknown";
116
+ const message = `Broken markdown link: "${url}" in ${fileRelative} (resolved to ${resolvedPath})`;
117
+
118
+ if (onBrokenLinks === "error") {
119
+ throw new Error(message);
120
+ } else if (onBrokenLinks === "warn") {
121
+ console.warn(`[md-plugins] WARNING: ${message}`);
122
+ }
123
+ // 'ignore' — do nothing
124
+ }
125
+ });
126
+ };
127
+ }
@@ -0,0 +1,4 @@
1
+ /** Check if a URL is external (has a protocol scheme). */
2
+ export function isExternal(url: string): boolean {
3
+ return /^[a-z][a-z0-9+.-]*:/i.test(url);
4
+ }