specra 0.1.13 → 0.2.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/LICENSE.MD +25 -4
- package/README.md +67 -58
- package/config/specra.config.schema.json +16 -0
- package/config/svelte-config.js +63 -0
- package/dist/api-parser.types.d.ts +59 -0
- package/dist/api-parser.types.js +5 -0
- package/dist/api.types.d.ts +137 -0
- package/dist/api.types.js +5 -0
- package/dist/category.d.ts +21 -0
- package/dist/category.js +48 -0
- package/dist/components/ConfigProvider.svelte +13 -0
- package/dist/components/ConfigProvider.svelte.d.ts +31 -0
- package/dist/components/docs/Accordion.svelte +18 -0
- package/dist/components/docs/Accordion.svelte.d.ts +10 -0
- package/dist/components/docs/AccordionItem.svelte +41 -0
- package/dist/components/docs/AccordionItem.svelte.d.ts +10 -0
- package/dist/components/docs/Badge.svelte +28 -0
- package/dist/components/docs/Badge.svelte.d.ts +9 -0
- package/dist/components/docs/Breadcrumb.svelte +80 -0
- package/dist/components/docs/Breadcrumb.svelte.d.ts +8 -0
- package/dist/components/docs/Callout.svelte +96 -0
- package/dist/components/docs/Callout.svelte.d.ts +10 -0
- package/dist/components/docs/Card.svelte +63 -0
- package/dist/components/docs/Card.svelte.d.ts +12 -0
- package/dist/components/docs/CardGrid.svelte +24 -0
- package/dist/components/docs/CardGrid.svelte.d.ts +8 -0
- package/dist/components/docs/CategoryIndex.svelte +110 -0
- package/dist/components/docs/CategoryIndex.svelte.d.ts +29 -0
- package/dist/components/docs/CodeBlock.svelte +172 -0
- package/dist/components/docs/CodeBlock.svelte.d.ts +8 -0
- package/dist/components/docs/Column.svelte +25 -0
- package/dist/components/docs/Column.svelte.d.ts +8 -0
- package/dist/components/docs/Columns.svelte +38 -0
- package/dist/components/docs/Columns.svelte.d.ts +13 -0
- package/dist/components/docs/DevModeBadge.svelte +15 -0
- package/dist/components/docs/DevModeBadge.svelte.d.ts +18 -0
- package/dist/components/docs/DocBadge.svelte +28 -0
- package/dist/components/docs/DocBadge.svelte.d.ts +9 -0
- package/dist/components/docs/DocLayout.svelte +107 -0
- package/dist/components/docs/DocLayout.svelte.d.ts +32 -0
- package/dist/components/docs/DocLoading.svelte +53 -0
- package/dist/components/docs/DocLoading.svelte.d.ts +18 -0
- package/dist/components/docs/DocMetadata.svelte +106 -0
- package/dist/components/docs/DocMetadata.svelte.d.ts +18 -0
- package/dist/components/docs/DocNavigation.svelte +56 -0
- package/dist/components/docs/DocNavigation.svelte.d.ts +12 -0
- package/dist/components/docs/DocTags.svelte +22 -0
- package/dist/components/docs/DocTags.svelte.d.ts +6 -0
- package/dist/components/docs/DraftBadge.svelte +10 -0
- package/dist/components/docs/DraftBadge.svelte.d.ts +18 -0
- package/dist/components/docs/Footer.svelte +72 -0
- package/dist/components/docs/Footer.svelte.d.ts +7 -0
- package/dist/components/docs/Frame.svelte +27 -0
- package/dist/components/docs/Frame.svelte.d.ts +9 -0
- package/dist/components/docs/Header.svelte +123 -0
- package/dist/components/docs/Header.svelte.d.ts +9 -0
- package/dist/components/docs/HeaderWithMenu.svelte +34 -0
- package/dist/components/docs/HeaderWithMenu.svelte.d.ts +17 -0
- package/dist/components/docs/HotReloadIndicator.svelte +44 -0
- package/dist/components/docs/HotReloadIndicator.svelte.d.ts +3 -0
- package/dist/components/docs/Icon.svelte +103 -0
- package/dist/components/docs/Icon.svelte.d.ts +11 -0
- package/dist/components/docs/Image.svelte +88 -0
- package/dist/components/docs/Image.svelte.d.ts +11 -0
- package/dist/components/docs/ImageCard.svelte +91 -0
- package/dist/components/docs/ImageCard.svelte.d.ts +12 -0
- package/dist/components/docs/ImageCardGrid.svelte +25 -0
- package/dist/components/docs/ImageCardGrid.svelte.d.ts +8 -0
- package/dist/components/docs/LayoutProviders.svelte +57 -0
- package/dist/components/docs/LayoutProviders.svelte.d.ts +9 -0
- package/dist/components/docs/Logo.svelte +25 -0
- package/dist/components/docs/Logo.svelte.d.ts +11 -0
- package/dist/components/docs/Math.svelte +54 -0
- package/dist/components/docs/Math.svelte.d.ts +7 -0
- package/dist/components/docs/MdxContent.svelte +41 -0
- package/dist/components/docs/MdxHotReload.svelte +78 -0
- package/dist/components/docs/MdxHotReload.svelte.d.ts +9 -0
- package/dist/components/docs/MdxLayout.svelte +16 -0
- package/dist/components/docs/MdxLayout.svelte.d.ts +6 -0
- package/dist/components/docs/Mermaid.svelte +88 -0
- package/dist/components/docs/Mermaid.svelte.d.ts +7 -0
- package/dist/components/docs/MobileDocLayout.svelte +211 -0
- package/dist/components/docs/MobileDocLayout.svelte.d.ts +35 -0
- package/dist/components/docs/MobileSidebar.svelte +122 -0
- package/dist/components/docs/MobileSidebar.svelte.d.ts +31 -0
- package/dist/components/docs/MobileSidebarWrapper.svelte +122 -0
- package/dist/components/docs/MobileSidebarWrapper.svelte.d.ts +32 -0
- package/dist/components/docs/NotFoundContent.svelte +40 -0
- package/dist/components/docs/NotFoundContent.svelte.d.ts +6 -0
- package/dist/components/docs/SearchHighlight.svelte +116 -0
- package/dist/components/docs/SearchHighlight.svelte.d.ts +3 -0
- package/dist/components/docs/SearchModal.svelte +239 -0
- package/dist/components/docs/SearchModal.svelte.d.ts +9 -0
- package/dist/components/docs/Sidebar.svelte +69 -0
- package/dist/components/docs/Sidebar.svelte.d.ts +31 -0
- package/dist/components/docs/SidebarMenuItems.svelte +344 -0
- package/dist/components/docs/SidebarMenuItems.svelte.d.ts +33 -0
- package/dist/components/docs/SidebarSkeleton.svelte +50 -0
- package/dist/components/docs/SidebarSkeleton.svelte.d.ts +18 -0
- package/dist/components/docs/SiteBanner.svelte +92 -0
- package/dist/components/docs/SiteBanner.svelte.d.ts +7 -0
- package/dist/components/docs/Step.svelte +44 -0
- package/dist/components/docs/Step.svelte.d.ts +8 -0
- package/dist/components/docs/Steps.svelte +15 -0
- package/dist/components/docs/Steps.svelte.d.ts +7 -0
- package/dist/components/docs/Tab.svelte +40 -0
- package/dist/components/docs/Tab.svelte.d.ts +8 -0
- package/dist/components/docs/TabGroups.svelte +183 -0
- package/dist/components/docs/TabGroups.svelte.d.ts +25 -0
- package/dist/components/docs/TableOfContents.svelte +100 -0
- package/dist/components/docs/TableOfContents.svelte.d.ts +9 -0
- package/dist/components/docs/Tabs.svelte +69 -0
- package/dist/components/docs/Tabs.svelte.d.ts +8 -0
- package/dist/components/docs/ThemeToggle.svelte +16 -0
- package/dist/components/docs/ThemeToggle.svelte.d.ts +18 -0
- package/dist/components/docs/Tooltip.svelte +44 -0
- package/dist/components/docs/Tooltip.svelte.d.ts +10 -0
- package/dist/components/docs/VersionSwitcher.svelte +95 -0
- package/dist/components/docs/VersionSwitcher.svelte.d.ts +7 -0
- package/dist/components/docs/Video.svelte +84 -0
- package/dist/components/docs/Video.svelte.d.ts +12 -0
- package/dist/components/docs/api/ApiEndpoint.svelte +61 -0
- package/dist/components/docs/api/ApiEndpoint.svelte.d.ts +11 -0
- package/dist/components/docs/api/ApiParams.svelte +80 -0
- package/dist/components/docs/api/ApiParams.svelte.d.ts +14 -0
- package/dist/components/docs/api/ApiPlayground.svelte +259 -0
- package/dist/components/docs/api/ApiPlayground.svelte.d.ts +16 -0
- package/dist/components/docs/api/ApiReference.svelte +278 -0
- package/dist/components/docs/api/ApiReference.svelte.d.ts +23 -0
- package/dist/components/docs/api/ApiResponse.svelte +66 -0
- package/dist/components/docs/api/ApiResponse.svelte.d.ts +9 -0
- package/dist/components/docs/api/index.d.ts +5 -0
- package/dist/components/docs/api/index.js +5 -0
- package/dist/components/docs/componentTextProps.d.ts +3 -0
- package/dist/components/docs/componentTextProps.js +61 -0
- package/dist/components/docs/index.d.ts +54 -0
- package/dist/components/docs/index.js +56 -0
- package/dist/components/global/VersionNotFound.svelte +48 -0
- package/dist/components/global/VersionNotFound.svelte.d.ts +7 -0
- package/dist/components/global/index.d.ts +1 -0
- package/dist/components/global/index.js +1 -0
- package/dist/components/index.d.ts +6 -822
- package/dist/components/index.js +11 -3854
- package/dist/components/ui/Badge.svelte +48 -0
- package/dist/components/ui/Badge.svelte.d.ts +15 -0
- package/dist/components/ui/Button.svelte +58 -0
- package/dist/components/ui/Button.svelte.d.ts +17 -0
- package/dist/components/ui/Dialog.svelte +16 -0
- package/dist/components/ui/Dialog.svelte.d.ts +9 -0
- package/dist/components/ui/DialogClose.svelte +16 -0
- package/dist/components/ui/DialogClose.svelte.d.ts +9 -0
- package/dist/components/ui/DialogContent.svelte +43 -0
- package/dist/components/ui/DialogContent.svelte.d.ts +10 -0
- package/dist/components/ui/DialogDescription.svelte +21 -0
- package/dist/components/ui/DialogDescription.svelte.d.ts +9 -0
- package/dist/components/ui/DialogFooter.svelte +20 -0
- package/dist/components/ui/DialogFooter.svelte.d.ts +9 -0
- package/dist/components/ui/DialogHeader.svelte +20 -0
- package/dist/components/ui/DialogHeader.svelte.d.ts +9 -0
- package/dist/components/ui/DialogTitle.svelte +21 -0
- package/dist/components/ui/DialogTitle.svelte.d.ts +9 -0
- package/dist/components/ui/Input.svelte +23 -0
- package/dist/components/ui/Input.svelte.d.ts +8 -0
- package/dist/components/ui/Textarea.svelte +19 -0
- package/dist/components/ui/Textarea.svelte.d.ts +7 -0
- package/dist/components/ui/index.d.ts +11 -0
- package/dist/components/ui/index.js +11 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -0
- package/dist/config.schema.json +471 -0
- package/dist/config.server.d.ts +46 -0
- package/dist/config.server.js +149 -0
- package/dist/{mdx-ColN3Cyg.d.mts → config.types.d.ts} +22 -75
- package/dist/config.types.js +39 -0
- package/dist/dev-utils.d.ts +29 -0
- package/dist/dev-utils.js +63 -0
- package/dist/index.d.ts +19 -4
- package/dist/index.js +25 -4861
- package/dist/mdx-cache.d.ts +41 -0
- package/dist/mdx-cache.js +160 -0
- package/dist/mdx-components.js +50 -1931
- package/dist/mdx-security.d.ts +76 -0
- package/dist/mdx-security.js +217 -0
- package/dist/mdx.d.ts +73 -0
- package/dist/mdx.js +1099 -0
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/security.d.ts +22 -47
- package/dist/middleware/security.js +111 -137
- package/dist/parsers/base-parser.d.ts +14 -0
- package/dist/parsers/base-parser.js +1 -0
- package/dist/parsers/index.d.ts +16 -0
- package/dist/parsers/index.js +51 -0
- package/dist/parsers/openapi-parser.d.ts +18 -0
- package/dist/parsers/openapi-parser.js +209 -0
- package/dist/parsers/postman-parser.d.ts +20 -0
- package/dist/parsers/postman-parser.js +260 -0
- package/dist/parsers/specra-parser.d.ts +10 -0
- package/dist/parsers/specra-parser.js +18 -0
- package/dist/redirects.d.ts +12 -0
- package/dist/redirects.js +30 -0
- package/dist/remark-code-meta.d.ts +6 -0
- package/dist/remark-code-meta.js +21 -0
- package/dist/sidebar-utils.d.ts +59 -0
- package/dist/sidebar-utils.js +144 -0
- package/dist/stores/config.d.ts +20 -0
- package/dist/stores/config.js +45 -0
- package/dist/stores/index.d.ts +4 -0
- package/dist/stores/index.js +4 -0
- package/dist/stores/sidebar.d.ts +7 -0
- package/dist/stores/sidebar.js +12 -0
- package/dist/stores/tabs.d.ts +6 -0
- package/dist/stores/tabs.js +41 -0
- package/dist/stores/theme.d.ts +7 -0
- package/dist/stores/theme.js +75 -0
- package/dist/{styles.css → styles/globals.css} +136 -6
- package/dist/toc.d.ts +9 -0
- package/dist/toc.js +15 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +30 -0
- package/package.json +47 -90
- package/dist/app/api/mdx-watch/route.d.mts +0 -10
- package/dist/app/api/mdx-watch/route.d.ts +0 -10
- package/dist/app/api/mdx-watch/route.js +0 -118
- package/dist/app/api/mdx-watch/route.js.map +0 -1
- package/dist/app/api/mdx-watch/route.mjs +0 -91
- package/dist/app/api/mdx-watch/route.mjs.map +0 -1
- package/dist/chunk-6S3EJVEO.mjs +0 -259
- package/dist/chunk-6S3EJVEO.mjs.map +0 -1
- package/dist/chunk-BE7EROIW.mjs +0 -212
- package/dist/chunk-BE7EROIW.mjs.map +0 -1
- package/dist/chunk-CWHRZHZO.mjs +0 -168
- package/dist/chunk-CWHRZHZO.mjs.map +0 -1
- package/dist/chunk-D5VDVYFY.mjs +0 -1325
- package/dist/chunk-D5VDVYFY.mjs.map +0 -1
- package/dist/chunk-WMCO2UX5.mjs +0 -585
- package/dist/chunk-WMCO2UX5.mjs.map +0 -1
- package/dist/chunk-XEMGCPZZ.mjs +0 -475
- package/dist/chunk-XEMGCPZZ.mjs.map +0 -1
- package/dist/components/index.d.mts +0 -822
- package/dist/components/index.js.map +0 -1
- package/dist/components/index.mjs +0 -3741
- package/dist/components/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -4
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -1897
- package/dist/index.mjs.map +0 -1
- package/dist/layouts/index.d.mts +0 -34
- package/dist/layouts/index.d.ts +0 -34
- package/dist/layouts/index.js +0 -453
- package/dist/layouts/index.js.map +0 -1
- package/dist/layouts/index.mjs +0 -173
- package/dist/layouts/index.mjs.map +0 -1
- package/dist/lib/index.d.mts +0 -583
- package/dist/lib/index.d.ts +0 -583
- package/dist/lib/index.js +0 -1595
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/index.mjs +0 -111
- package/dist/lib/index.mjs.map +0 -1
- package/dist/mdx-ColN3Cyg.d.ts +0 -352
- package/dist/mdx-components.d.mts +0 -86
- package/dist/mdx-components.d.ts +0 -86
- package/dist/mdx-components.js.map +0 -1
- package/dist/mdx-components.mjs +0 -206
- package/dist/mdx-components.mjs.map +0 -1
- package/dist/middleware/security.d.mts +0 -82
- package/dist/middleware/security.js.map +0 -1
- package/dist/middleware/security.mjs +0 -84
- package/dist/middleware/security.mjs.map +0 -1
- package/dist/styles.css.map +0 -1
- package/dist/styles.d.mts +0 -2
- package/dist/styles.d.ts +0 -2
- package/dist/styles.js +0 -2
- package/dist/styles.js.map +0 -1
- package/dist/styles.mjs +0 -1
- package/dist/styles.mjs.map +0 -1
package/dist/layouts/index.js
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __export = (target, all) => {
|
|
9
|
-
for (var name in all)
|
|
10
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
// src/layouts/index.ts
|
|
31
|
-
var layouts_exports = {};
|
|
32
|
-
__export(layouts_exports, {
|
|
33
|
-
CategoryIndex: () => CategoryIndex,
|
|
34
|
-
DocLayout: () => DocLayout
|
|
35
|
-
});
|
|
36
|
-
module.exports = __toCommonJS(layouts_exports);
|
|
37
|
-
|
|
38
|
-
// src/components/docs/doc-layout.tsx
|
|
39
|
-
var import_lucide_react6 = require("lucide-react");
|
|
40
|
-
var import_rsc = require("next-mdx-remote/rsc");
|
|
41
|
-
var import_remark_gfm = __toESM(require("remark-gfm"));
|
|
42
|
-
var import_rehype_slug = __toESM(require("rehype-slug"));
|
|
43
|
-
|
|
44
|
-
// src/lib/remark-code-meta.ts
|
|
45
|
-
function remarkCodeMeta() {
|
|
46
|
-
return (tree) => {
|
|
47
|
-
const visit = (node) => {
|
|
48
|
-
if (node.type === "code" && node.meta) {
|
|
49
|
-
node.data = node.data || {};
|
|
50
|
-
node.data.hProperties = node.data.hProperties || {};
|
|
51
|
-
node.data.hProperties.meta = node.meta;
|
|
52
|
-
}
|
|
53
|
-
if (node.children) {
|
|
54
|
-
node.children.forEach(visit);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
visit(tree);
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// src/components/docs/doc-navigation.tsx
|
|
62
|
-
var import_link = __toESM(require("next/link"));
|
|
63
|
-
var import_lucide_react = require("lucide-react");
|
|
64
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
65
|
-
function DocNavigation({ previousDoc, nextDoc, version }) {
|
|
66
|
-
if (!previousDoc && !nextDoc) return null;
|
|
67
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-12 pt-8 border-t border-border grid grid-cols-2 gap-4", children: [
|
|
68
|
-
previousDoc ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
69
|
-
import_link.default,
|
|
70
|
-
{
|
|
71
|
-
href: `/docs/${version}/${previousDoc.slug}`,
|
|
72
|
-
className: "group flex flex-col gap-2 p-4 rounded-xl border border-border hover:border-primary/50 hover:bg-muted/50 transition-all",
|
|
73
|
-
style: {
|
|
74
|
-
textDecoration: "none !important"
|
|
75
|
-
},
|
|
76
|
-
children: [
|
|
77
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
78
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronLeft, { className: "h-4 w-4" }),
|
|
79
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Previous" })
|
|
80
|
-
] }),
|
|
81
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-base font-medium text-foreground group-hover:text-primary transition-colors", children: previousDoc.title })
|
|
82
|
-
]
|
|
83
|
-
}
|
|
84
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {}),
|
|
85
|
-
nextDoc ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
86
|
-
import_link.default,
|
|
87
|
-
{
|
|
88
|
-
href: `/docs/${version}/${nextDoc.slug}`,
|
|
89
|
-
className: "group flex flex-col gap-2 p-4 rounded-xl border border-border hover:border-primary/50 hover:bg-muted/50 transition-all text-right",
|
|
90
|
-
style: {
|
|
91
|
-
textDecoration: "none !important"
|
|
92
|
-
},
|
|
93
|
-
children: [
|
|
94
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-end gap-2 text-sm text-muted-foreground", children: [
|
|
95
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Next" }),
|
|
96
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronRight, { className: "h-4 w-4" })
|
|
97
|
-
] }),
|
|
98
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-base font-medium text-foreground group-hover:text-primary transition-colors", children: nextDoc.title })
|
|
99
|
-
]
|
|
100
|
-
}
|
|
101
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {})
|
|
102
|
-
] });
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// src/components/docs/breadcrumb.tsx
|
|
106
|
-
var import_link2 = __toESM(require("next/link"));
|
|
107
|
-
var import_lucide_react2 = require("lucide-react");
|
|
108
|
-
|
|
109
|
-
// src/lib/config.types.ts
|
|
110
|
-
var defaultConfig = {
|
|
111
|
-
site: {
|
|
112
|
-
title: "Documentation",
|
|
113
|
-
description: "Project documentation",
|
|
114
|
-
baseUrl: "/",
|
|
115
|
-
language: "en"
|
|
116
|
-
},
|
|
117
|
-
theme: {
|
|
118
|
-
defaultMode: "system",
|
|
119
|
-
respectPrefersColorScheme: true
|
|
120
|
-
},
|
|
121
|
-
navigation: {
|
|
122
|
-
showSidebar: true,
|
|
123
|
-
collapsibleSidebar: true,
|
|
124
|
-
showBreadcrumbs: true,
|
|
125
|
-
showTableOfContents: true,
|
|
126
|
-
tocPosition: "right",
|
|
127
|
-
tocMaxDepth: 3
|
|
128
|
-
},
|
|
129
|
-
search: {
|
|
130
|
-
enabled: true,
|
|
131
|
-
provider: "local",
|
|
132
|
-
placeholder: "Search documentation..."
|
|
133
|
-
},
|
|
134
|
-
features: {
|
|
135
|
-
showLastUpdated: true,
|
|
136
|
-
showReadingTime: true,
|
|
137
|
-
showAuthors: false,
|
|
138
|
-
showTags: true,
|
|
139
|
-
versioning: true,
|
|
140
|
-
i18n: false
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// src/lib/config.server.ts
|
|
145
|
-
function deepMerge(target, source) {
|
|
146
|
-
const result = { ...target };
|
|
147
|
-
for (const key in source) {
|
|
148
|
-
const sourceValue = source[key];
|
|
149
|
-
const targetValue = result[key];
|
|
150
|
-
if (sourceValue && typeof sourceValue === "object" && !Array.isArray(sourceValue)) {
|
|
151
|
-
result[key] = deepMerge(
|
|
152
|
-
targetValue && typeof targetValue === "object" ? targetValue : {},
|
|
153
|
-
sourceValue
|
|
154
|
-
);
|
|
155
|
-
} else if (sourceValue !== void 0) {
|
|
156
|
-
result[key] = sourceValue;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return result;
|
|
160
|
-
}
|
|
161
|
-
function loadConfig(userConfig) {
|
|
162
|
-
try {
|
|
163
|
-
const config = deepMerge(defaultConfig, userConfig);
|
|
164
|
-
return config;
|
|
165
|
-
} catch (error) {
|
|
166
|
-
console.error(`\u274C Error loading configuration:`, error);
|
|
167
|
-
console.warn("Using default configuration.");
|
|
168
|
-
return defaultConfig;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
function replaceEnvVariables(text, config) {
|
|
172
|
-
const cfg = config || loadConfig({});
|
|
173
|
-
const envVars = cfg.env || {};
|
|
174
|
-
let result = text;
|
|
175
|
-
result = result.replace(/\$\{([^}]+)\}/g, (match, varName) => {
|
|
176
|
-
return envVars[varName] || match;
|
|
177
|
-
});
|
|
178
|
-
result = result.replace(/\{\{([^}]+)\}\}/g, (match, varName) => {
|
|
179
|
-
return envVars[varName] || match;
|
|
180
|
-
});
|
|
181
|
-
return result;
|
|
182
|
-
}
|
|
183
|
-
function processContentWithEnv(content, config) {
|
|
184
|
-
return replaceEnvVariables(content, config);
|
|
185
|
-
}
|
|
186
|
-
var configInstance = null;
|
|
187
|
-
function getConfig() {
|
|
188
|
-
if (!configInstance) {
|
|
189
|
-
configInstance = loadConfig({});
|
|
190
|
-
}
|
|
191
|
-
return configInstance;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// src/components/docs/breadcrumb.tsx
|
|
195
|
-
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
196
|
-
function Breadcrumb({ version, slug, title }) {
|
|
197
|
-
const config = getConfig();
|
|
198
|
-
const i18n = config.features?.i18n;
|
|
199
|
-
const locales = typeof i18n === "object" ? i18n.locales : i18n ? ["en"] : [];
|
|
200
|
-
const defaultLocale = typeof i18n === "object" ? i18n.defaultLocale : "en";
|
|
201
|
-
const parts = slug.split("/");
|
|
202
|
-
const potentialLocale = parts[0];
|
|
203
|
-
const isLc = locales.includes(potentialLocale);
|
|
204
|
-
const isDefaultLc = potentialLocale === defaultLocale;
|
|
205
|
-
const homeHref = isLc ? `/docs/${version}/${potentialLocale}` : `/docs/${version}`;
|
|
206
|
-
const breadcrumbs = [
|
|
207
|
-
{ label: "Docs", href: homeHref }
|
|
208
|
-
];
|
|
209
|
-
let currentPath = "";
|
|
210
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
211
|
-
const part = parts[i];
|
|
212
|
-
currentPath += (currentPath ? "/" : "") + part;
|
|
213
|
-
if (i === 0 && isLc) {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
breadcrumbs.push({
|
|
217
|
-
label: part.replace(/-/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()),
|
|
218
|
-
href: `/docs/${version}/${currentPath}`
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
breadcrumbs.push({
|
|
222
|
-
label: title,
|
|
223
|
-
href: `/docs/${version}/${slug}`
|
|
224
|
-
});
|
|
225
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("nav", { className: "flex items-center gap-2 text-sm text-muted-foreground mb-4", "aria-label": "Breadcrumb", children: breadcrumbs.map((crumb, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
226
|
-
index > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react2.ChevronRight, { className: "h-4 w-4" }),
|
|
227
|
-
index === breadcrumbs.length - 1 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "text-foreground font-medium", children: crumb.label }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
228
|
-
import_link2.default,
|
|
229
|
-
{
|
|
230
|
-
href: crumb.href,
|
|
231
|
-
className: "hover:text-foreground transition-colors",
|
|
232
|
-
children: crumb.label
|
|
233
|
-
}
|
|
234
|
-
)
|
|
235
|
-
] }, crumb.href)) });
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// src/components/docs/doc-metadata.tsx
|
|
239
|
-
var import_lucide_react3 = require("lucide-react");
|
|
240
|
-
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
241
|
-
function DocMetadata({ meta, config }) {
|
|
242
|
-
const showReadingTime = config.features?.showReadingTime && meta.reading_time;
|
|
243
|
-
const showLastUpdated = config.features?.showLastUpdated && meta.last_updated;
|
|
244
|
-
const showAuthors = config.features?.showAuthors && meta.authors?.length;
|
|
245
|
-
const hasMetadata = showReadingTime || showLastUpdated || showAuthors;
|
|
246
|
-
if (!hasMetadata) {
|
|
247
|
-
return null;
|
|
248
|
-
}
|
|
249
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-wrap items-center gap-4 text-sm text-muted-foreground border-b border-border pb-4 mb-6", children: [
|
|
250
|
-
showReadingTime && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
251
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react3.Clock, { className: "h-4 w-4" }),
|
|
252
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { children: [
|
|
253
|
-
meta.reading_time,
|
|
254
|
-
" min read"
|
|
255
|
-
] })
|
|
256
|
-
] }),
|
|
257
|
-
showLastUpdated && meta.last_updated && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
258
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react3.Calendar, { className: "h-4 w-4" }),
|
|
259
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { children: [
|
|
260
|
-
"Updated ",
|
|
261
|
-
new Date(meta.last_updated).toLocaleDateString(meta.locale || "en")
|
|
262
|
-
] })
|
|
263
|
-
] }),
|
|
264
|
-
showAuthors && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-1.5", children: [
|
|
265
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react3.User, { className: "h-4 w-4" }),
|
|
266
|
-
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: meta.authors.map((author, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { children: [
|
|
267
|
-
author.name || author.id,
|
|
268
|
-
idx < meta.authors.length - 1 && ", "
|
|
269
|
-
] }, author.id)) })
|
|
270
|
-
] })
|
|
271
|
-
] });
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// src/components/docs/draft-badge.tsx
|
|
275
|
-
var import_lucide_react4 = require("lucide-react");
|
|
276
|
-
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
277
|
-
function DraftBadge() {
|
|
278
|
-
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-md bg-yellow-500/10 border border-yellow-500/20 text-yellow-600 dark:text-yellow-400 text-sm font-medium mb-4", children: [
|
|
279
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_lucide_react4.FileWarning, { className: "h-4 w-4" }),
|
|
280
|
-
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { children: "Draft - Not visible in production" })
|
|
281
|
-
] });
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// src/components/docs/doc-tags.tsx
|
|
285
|
-
var import_lucide_react5 = require("lucide-react");
|
|
286
|
-
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
287
|
-
function DocTags({ tags }) {
|
|
288
|
-
if (!tags || tags.length === 0) {
|
|
289
|
-
return null;
|
|
290
|
-
}
|
|
291
|
-
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-wrap items-center gap-2 mt-6 pt-6 border-t border-border", children: [
|
|
292
|
-
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react5.Tag, { className: "h-4 w-4 text-muted-foreground" }),
|
|
293
|
-
tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
294
|
-
"span",
|
|
295
|
-
{
|
|
296
|
-
className: "inline-flex items-center px-2.5 py-0.5 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20",
|
|
297
|
-
children: tag
|
|
298
|
-
},
|
|
299
|
-
tag
|
|
300
|
-
))
|
|
301
|
-
] });
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// src/components/docs/doc-layout.tsx
|
|
305
|
-
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
306
|
-
function DocLayout({ content, meta, previousDoc, nextDoc, version, slug, config, mdxComponents }) {
|
|
307
|
-
const isDevelopment = process.env.NODE_ENV === "development";
|
|
308
|
-
const processedContent = processContentWithEnv(content, config);
|
|
309
|
-
const editUrl = config.features?.editUrl && typeof config.features.editUrl === "string" ? `${config.features.editUrl}/${version}/${slug}.mdx` : null;
|
|
310
|
-
return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("article", { className: "flex-1 min-w-0", children: [
|
|
311
|
-
config.navigation?.showBreadcrumbs && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Breadcrumb, { version, slug, title: meta.title }),
|
|
312
|
-
isDevelopment && meta.draft && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DraftBadge, {}),
|
|
313
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mb-8", children: [
|
|
314
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h1", { className: "text-4xl font-bold tracking-tight mb-3 text-foreground", children: meta.title }),
|
|
315
|
-
meta.description && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-lg text-muted-foreground leading-relaxed", children: meta.description })
|
|
316
|
-
] }),
|
|
317
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DocMetadata, { meta, config }),
|
|
318
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "prose prose-slate dark:prose-invert max-w-none prose-headings:scroll-mt-24 prose-headings:font-semibold prose-h1:text-4xl prose-h2:text-3xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:text-2xl prose-h3:mt-8 prose-h3:mb-3 prose-p:text-base prose-p:leading-7 prose-p:text-muted-foreground prose-p:mb-4 prose-a:font-normal prose-a:transition-all prose-code:text-primary prose-code:bg-muted/50 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded-md prose-code:text-[13px] prose-code:font-mono prose-code:border prose-code:border-border/50 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-transparent prose-pre:p-0 prose-ul:list-disc prose-ul:list-inside prose-ul:space-y-2 prose-ul:mb-4 prose-ol:list-decimal prose-ol:list-inside prose-ol:space-y-2 prose-ol:mb-4 prose-li:leading-7 prose-li:text-muted-foreground prose-strong:text-foreground prose-strong:font-semibold", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
319
|
-
import_rsc.MDXRemote,
|
|
320
|
-
{
|
|
321
|
-
source: processedContent,
|
|
322
|
-
options: {
|
|
323
|
-
parseFrontmatter: false,
|
|
324
|
-
mdxOptions: {
|
|
325
|
-
remarkPlugins: [import_remark_gfm.default, remarkCodeMeta],
|
|
326
|
-
rehypePlugins: [import_rehype_slug.default],
|
|
327
|
-
development: false
|
|
328
|
-
}
|
|
329
|
-
},
|
|
330
|
-
components: mdxComponents
|
|
331
|
-
}
|
|
332
|
-
) }),
|
|
333
|
-
config.features?.showTags && meta.tags && meta.tags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DocTags, { tags: meta.tags }),
|
|
334
|
-
(editUrl || config.social?.github) && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "mt-12 pt-6 border-t border-border flex items-center justify-between", children: [
|
|
335
|
-
editUrl ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
336
|
-
"a",
|
|
337
|
-
{
|
|
338
|
-
href: editUrl,
|
|
339
|
-
target: "_blank",
|
|
340
|
-
rel: "noopener noreferrer",
|
|
341
|
-
className: "flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors",
|
|
342
|
-
children: [
|
|
343
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react6.FileEdit, { className: "h-4 w-4" }),
|
|
344
|
-
"Edit this page"
|
|
345
|
-
]
|
|
346
|
-
}
|
|
347
|
-
) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", {}),
|
|
348
|
-
config.social?.github && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
|
|
349
|
-
"a",
|
|
350
|
-
{
|
|
351
|
-
href: `${config.social.github}/issues/new`,
|
|
352
|
-
target: "_blank",
|
|
353
|
-
rel: "noopener noreferrer",
|
|
354
|
-
className: "flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors",
|
|
355
|
-
children: [
|
|
356
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_lucide_react6.ExternalLink, { className: "h-4 w-4" }),
|
|
357
|
-
"Report an issue"
|
|
358
|
-
]
|
|
359
|
-
}
|
|
360
|
-
)
|
|
361
|
-
] }),
|
|
362
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DocNavigation, { previousDoc, nextDoc, version })
|
|
363
|
-
] });
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
// src/components/docs/category-index.tsx
|
|
367
|
-
var import_link3 = __toESM(require("next/link"));
|
|
368
|
-
var import_lucide_react7 = require("lucide-react");
|
|
369
|
-
var import_rsc2 = require("next-mdx-remote/rsc");
|
|
370
|
-
var import_remark_gfm2 = __toESM(require("remark-gfm"));
|
|
371
|
-
var import_rehype_slug2 = __toESM(require("rehype-slug"));
|
|
372
|
-
|
|
373
|
-
// src/lib/sidebar-utils.ts
|
|
374
|
-
function sortSidebarItems(items) {
|
|
375
|
-
return [...items].sort((a, b) => {
|
|
376
|
-
const posA = a.sidebar_position ?? a.meta?.sidebar_position ?? a.meta?.order ?? 999;
|
|
377
|
-
const posB = b.sidebar_position ?? b.meta?.sidebar_position ?? b.meta?.order ?? 999;
|
|
378
|
-
return posA - posB;
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
// src/components/docs/category-index.tsx
|
|
383
|
-
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
384
|
-
function CategoryIndex({ categoryPath, version, allDocs, title, description, content, config, mdxComponents }) {
|
|
385
|
-
const childDocs = allDocs.filter((doc) => {
|
|
386
|
-
const parts = doc.slug.split("/");
|
|
387
|
-
const docParent = parts.slice(0, -1).join("/");
|
|
388
|
-
return docParent === categoryPath && doc.slug !== categoryPath;
|
|
389
|
-
});
|
|
390
|
-
const processedContent = () => {
|
|
391
|
-
if (content) {
|
|
392
|
-
return processContentWithEnv(content, config);
|
|
393
|
-
}
|
|
394
|
-
return "";
|
|
395
|
-
};
|
|
396
|
-
const sortedDocs = sortSidebarItems(childDocs);
|
|
397
|
-
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
398
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mb-8", children: [
|
|
399
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h1", { className: "text-4xl font-bold tracking-tight mb-3 text-foreground", children: title }),
|
|
400
|
-
description && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-lg text-muted-foreground leading-relaxed", children: description }),
|
|
401
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "prose prose-slate dark:prose-invert max-w-none prose-headings:scroll-mt-24 prose-headings:font-semibold prose-h1:text-4xl prose-h2:text-3xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:text-2xl prose-h3:mt-8 prose-h3:mb-3 prose-p:text-base prose-p:leading-7 prose-p:text-muted-foreground prose-p:mb-4 prose-a:font-normal prose-a:transition-all prose-code:text-primary prose-code:bg-muted/50 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded-md prose-code:text-[13px] prose-code:font-mono prose-code:border prose-code:border-border/50 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-transparent prose-pre:p-0 prose-ul:list-disc prose-ul:list-inside prose-ul:space-y-2 prose-ul:mb-4 prose-ol:list-decimal prose-ol:list-inside prose-ol:space-y-2 prose-ol:mb-4 prose-li:leading-7 prose-li:text-muted-foreground prose-strong:text-foreground prose-strong:font-semibold", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
402
|
-
import_rsc2.MDXRemote,
|
|
403
|
-
{
|
|
404
|
-
source: processedContent(),
|
|
405
|
-
options: {
|
|
406
|
-
parseFrontmatter: false,
|
|
407
|
-
mdxOptions: {
|
|
408
|
-
remarkPlugins: [import_remark_gfm2.default, remarkCodeMeta],
|
|
409
|
-
rehypePlugins: [import_rehype_slug2.default],
|
|
410
|
-
development: false
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
components: mdxComponents
|
|
414
|
-
}
|
|
415
|
-
) })
|
|
416
|
-
] }),
|
|
417
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-3 gap-4", children: sortedDocs.map((doc) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
418
|
-
import_link3.default,
|
|
419
|
-
{
|
|
420
|
-
href: `/docs/${version}/${doc.slug}`,
|
|
421
|
-
className: "group block p-5 rounded-xl border border-border bg-card hover:bg-accent hover:border-primary/50 transition-all duration-200",
|
|
422
|
-
style: {
|
|
423
|
-
textDecoration: "none !important"
|
|
424
|
-
},
|
|
425
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-start justify-between gap-4", children: [
|
|
426
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
427
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
428
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react7.FileText, { className: "h-6 w-6 text-primary shrink-0" }),
|
|
429
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: "text-lg font-semibold text-foreground group-hover:text-primary transition-colors", children: doc.meta.title || doc.title })
|
|
430
|
-
] }),
|
|
431
|
-
doc.meta.description && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-sm text-muted-foreground line-clamp-2", children: doc.meta.description }),
|
|
432
|
-
doc.meta.reading_time && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("p", { className: "text-xs text-muted-foreground mt-2", children: [
|
|
433
|
-
doc.meta.reading_time,
|
|
434
|
-
" min read"
|
|
435
|
-
] })
|
|
436
|
-
] }),
|
|
437
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react7.ChevronRight, { className: "h-5 w-5 text-muted-foreground group-hover:text-primary group-hover:translate-x-1 transition-all flex-shrink-0 mt-1" })
|
|
438
|
-
] })
|
|
439
|
-
},
|
|
440
|
-
doc.slug
|
|
441
|
-
)) }),
|
|
442
|
-
sortedDocs.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "text-center py-12 text-muted-foreground", children: [
|
|
443
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react7.FileText, { className: "h-12 w-12 mx-auto mb-3 opacity-50" }),
|
|
444
|
-
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { children: "No documents found in this category." })
|
|
445
|
-
] })
|
|
446
|
-
] });
|
|
447
|
-
}
|
|
448
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
449
|
-
0 && (module.exports = {
|
|
450
|
-
CategoryIndex,
|
|
451
|
-
DocLayout
|
|
452
|
-
});
|
|
453
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/layouts/index.ts","../../src/components/docs/doc-layout.tsx","../../src/lib/remark-code-meta.ts","../../src/components/docs/doc-navigation.tsx","../../src/components/docs/breadcrumb.tsx","../../src/lib/config.types.ts","../../src/lib/config.server.ts","../../src/components/docs/doc-metadata.tsx","../../src/components/docs/draft-badge.tsx","../../src/components/docs/doc-tags.tsx","../../src/components/docs/category-index.tsx","../../src/lib/sidebar-utils.ts"],"sourcesContent":["// Server-side layout components\n// These components should NOT have \"use client\" directive as they render async server components\nexport { DocLayout } from \"../components/docs/doc-layout\"\nexport { CategoryIndex } from \"../components/docs/category-index\"\n","import { ExternalLink, FileEdit } from \"lucide-react\"\nimport { MDXRemote } from \"next-mdx-remote/rsc\"\nimport remarkGfm from \"remark-gfm\"\nimport rehypeSlug from \"rehype-slug\"\nimport { remarkCodeMeta } from \"@/lib/remark-code-meta\"\n// import { mdxComponents } from \"./mdx-components\"\nimport { DocNavigation } from \"./doc-navigation\"\nimport { Breadcrumb } from \"./breadcrumb\"\nimport { DocMetadata } from \"./doc-metadata\"\nimport { DraftBadge } from \"./draft-badge\"\nimport { DocTags } from \"./doc-tags\"\nimport type { DocMeta } from \"@/lib/mdx\"\nimport { processContentWithEnv, type SpecraConfig } from \"@/lib/config\"\n\ninterface DocLayoutProps {\n meta: DocMeta\n content: string\n previousDoc?: {\n title: string\n slug: string\n }\n nextDoc?: {\n title: string\n slug: string\n }\n version: string\n slug: string\n config: SpecraConfig\n mdxComponents: Record<string, React.ComponentType<any>>\n}\n\n\n\nexport function DocLayout({ content, meta, previousDoc, nextDoc, version, slug, config, mdxComponents }: DocLayoutProps) {\n const isDevelopment = process.env.NODE_ENV === \"development\"\n // const config = getConfig()\n\n // Process content with environment variables\n const processedContent = processContentWithEnv(content, config)\n\n // Build edit URL if configured\n const editUrl = config.features?.editUrl && typeof config.features.editUrl === 'string'\n ? `${config.features.editUrl}/${version}/${slug}.mdx`\n : null\n\n return (\n <article className=\"flex-1 min-w-0\">\n {config.navigation?.showBreadcrumbs && (\n <Breadcrumb version={version} slug={slug} title={meta.title} />\n )}\n\n {isDevelopment && meta.draft && <DraftBadge />}\n\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold tracking-tight mb-3 text-foreground\">{meta.title}</h1>\n {meta.description && <p className=\"text-lg text-muted-foreground leading-relaxed\">{meta.description}</p>}\n </div>\n\n <DocMetadata meta={meta} config={config} />\n\n <div className=\"prose prose-slate dark:prose-invert max-w-none prose-headings:scroll-mt-24 prose-headings:font-semibold prose-h1:text-4xl prose-h2:text-3xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:text-2xl prose-h3:mt-8 prose-h3:mb-3 prose-p:text-base prose-p:leading-7 prose-p:text-muted-foreground prose-p:mb-4 prose-a:font-normal prose-a:transition-all prose-code:text-primary prose-code:bg-muted/50 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded-md prose-code:text-[13px] prose-code:font-mono prose-code:border prose-code:border-border/50 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-transparent prose-pre:p-0 prose-ul:list-disc prose-ul:list-inside prose-ul:space-y-2 prose-ul:mb-4 prose-ol:list-decimal prose-ol:list-inside prose-ol:space-y-2 prose-ol:mb-4 prose-li:leading-7 prose-li:text-muted-foreground prose-strong:text-foreground prose-strong:font-semibold\">\n <MDXRemote\n source={processedContent}\n options={{\n parseFrontmatter: false,\n mdxOptions: {\n remarkPlugins: [remarkGfm, remarkCodeMeta],\n rehypePlugins: [rehypeSlug],\n development: false,\n },\n }}\n components={mdxComponents as any}\n />\n </div>\n\n {config.features?.showTags && meta.tags && meta.tags.length > 0 && <DocTags tags={meta.tags} />}\n\n {(editUrl || config.social?.github) && (\n <div className=\"mt-12 pt-6 border-t border-border flex items-center justify-between\">\n {editUrl ? (\n <a\n href={editUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <FileEdit className=\"h-4 w-4\" />\n Edit this page\n </a>\n ) : <div />}\n {config.social?.github && (\n <a\n href={`${config.social.github}/issues/new`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n Report an issue\n </a>\n )}\n </div>\n )}\n\n <DocNavigation previousDoc={previousDoc} nextDoc={nextDoc} version={version} />\n </article>\n )\n}\n","/**\n * Remark plugin to extract code block meta strings and pass them as props\n * Converts: ```js filename.js\n * Into props: { language: 'js', meta: 'filename.js' }\n */\nexport function remarkCodeMeta() {\n return (tree: any) => {\n const visit = (node: any) => {\n if (node.type === 'code' && node.meta) {\n // Store the meta string in the node's data\n node.data = node.data || {}\n node.data.hProperties = node.data.hProperties || {}\n node.data.hProperties.meta = node.meta\n }\n \n if (node.children) {\n node.children.forEach(visit)\n }\n }\n \n visit(tree)\n }\n}\n","import Link from \"next/link\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\n\ninterface DocNavigationProps {\n previousDoc?: {\n title: string\n slug: string\n }\n nextDoc?: {\n title: string\n slug: string\n }\n version: string\n}\n\nexport function DocNavigation({ previousDoc, nextDoc, version }: DocNavigationProps) {\n if (!previousDoc && !nextDoc) return null\n\n return (\n <div className=\"mt-12 pt-8 border-t border-border grid grid-cols-2 gap-4\">\n {previousDoc ? (\n <Link\n href={`/docs/${version}/${previousDoc.slug}`}\n className=\"group flex flex-col gap-2 p-4 rounded-xl border border-border hover:border-primary/50 hover:bg-muted/50 transition-all\"\n style={{\n textDecoration: \"none !important\"\n }}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </div>\n <div className=\"text-base font-medium text-foreground group-hover:text-primary transition-colors\">\n {previousDoc.title}\n </div>\n </Link>\n ) : (\n <div />\n )}\n\n {nextDoc ? (\n <Link\n href={`/docs/${version}/${nextDoc.slug}`}\n className=\"group flex flex-col gap-2 p-4 rounded-xl border border-border hover:border-primary/50 hover:bg-muted/50 transition-all text-right\"\n style={{\n textDecoration: \"none !important\"\n }}\n >\n <div className=\"flex items-center justify-end gap-2 text-sm text-muted-foreground\">\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </div>\n <div className=\"text-base font-medium text-foreground group-hover:text-primary transition-colors\">\n {nextDoc.title}\n </div>\n </Link>\n ) : (\n <div />\n )}\n </div>\n )\n}\n","import Link from \"next/link\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { getConfig } from \"@/lib/config\"\n\ninterface BreadcrumbProps {\n version: string\n slug: string\n title: string\n}\n\nexport function Breadcrumb({ version, slug, title }: BreadcrumbProps) {\n const config = getConfig()\n const i18n = config.features?.i18n\n const locales = typeof i18n === 'object' ? i18n.locales : (i18n ? ['en'] : [])\n const defaultLocale = typeof i18n === 'object' ? i18n.defaultLocale : 'en'\n\n const parts = slug.split(\"/\")\n\n // Check if first part is a locale\n const potentialLocale = parts[0]\n const isLc = locales.includes(potentialLocale)\n const isDefaultLc = potentialLocale === defaultLocale\n\n // If slug starts with locale, we might want to skip showing it as a breadcrumb item\n // But we want the \"Docs\" home link to point to it (if it's not default provided we prefix default?)\n\n const homeHref = isLc\n ? `/docs/${version}/${potentialLocale}`\n : `/docs/${version}`\n\n const breadcrumbs = [\n { label: \"Docs\", href: homeHref },\n ]\n\n // Build breadcrumb path\n let currentPath = \"\"\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n currentPath += (currentPath ? \"/\" : \"\") + part\n\n // Skip the locale part in the breadcrumb visual trail if it's the first part\n if (i === 0 && isLc) {\n continue\n }\n\n breadcrumbs.push({\n label: part.replace(/-/g, \" \").replace(/\\b\\w/g, (l) => l.toUpperCase()),\n href: `/docs/${version}/${currentPath}`,\n })\n }\n\n // Add current page\n breadcrumbs.push({\n label: title,\n href: `/docs/${version}/${slug}`,\n })\n\n return (\n <nav className=\"flex items-center gap-2 text-sm text-muted-foreground mb-4\" aria-label=\"Breadcrumb\">\n {breadcrumbs.map((crumb, index) => (\n <div key={crumb.href} className=\"flex items-center gap-2\">\n {index > 0 && <ChevronRight className=\"h-4 w-4\" />}\n {index === breadcrumbs.length - 1 ? (\n <span className=\"text-foreground font-medium\">{crumb.label}</span>\n ) : (\n <Link\n href={crumb.href}\n className=\"hover:text-foreground transition-colors\"\n >\n {crumb.label}\n </Link>\n )}\n </div>\n ))}\n </nav>\n )\n}\n","/**\n * Configuration schema for Specra documentation system\n */\n\n/**\n * Site metadata and branding\n */\nexport interface SiteConfig {\n /** The title of the documentation site */\n title: string\n /** Short description of the documentation */\n description?: string\n /** URL where the documentation is hosted */\n url?: string\n /** Base URL path for the documentation (e.g., '/docs') */\n baseUrl?: string\n /** Path to the site logo - can be a string or an object with light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Path to the favicon */\n favicon?: string\n /** Default language for the documentation */\n language?: string\n /** Organization or author name */\n organizationName?: string\n /** Project name */\n projectName?: string\n /** Active/default version for the documentation */\n activeVersion?: string\n /** Whether to hide the site title in the header */\n hideTitle?: boolean\n /** Whether to hide the site logo in the header */\n hideLogo?: boolean\n}\n\n/**\n * Theme and appearance settings\n */\nexport interface ThemeConfig {\n /** Primary color for the theme */\n primaryColor?: string\n /** Default theme mode */\n defaultMode?: \"light\" | \"dark\" | \"system\"\n /** Whether to respect system preferences */\n respectPrefersColorScheme?: boolean\n /** Custom CSS file path */\n customCss?: string\n}\n\n/**\n * Tab group for organizing documentation\n */\nexport interface TabGroup {\n /** Unique identifier for the tab group */\n id: string\n /** Display label for the tab */\n label: string\n /** Optional icon name (lucide-react icon) */\n icon?: string\n}\n\n/**\n * Navigation and sidebar configuration\n */\nexport interface NavigationConfig {\n /** Whether to show the sidebar by default */\n showSidebar?: boolean\n /** Whether the sidebar is collapsible */\n collapsibleSidebar?: boolean\n /** Whether to show breadcrumbs */\n showBreadcrumbs?: boolean\n /** Whether to show table of contents */\n showTableOfContents?: boolean\n /** Position of table of contents */\n tocPosition?: \"left\" | \"right\"\n /** Maximum depth for table of contents */\n tocMaxDepth?: number\n /** Tab groups for organizing documentation sections */\n tabGroups?: TabGroup[]\n}\n\n/**\n * Social and external links\n */\nexport interface SocialLinks {\n /** GitHub repository URL */\n github?: string\n /** Twitter/X handle or URL */\n twitter?: string\n /** Discord invite URL */\n discord?: string\n /** LinkedIn profile or company page */\n linkedin?: string\n /** YouTube channel URL */\n youtube?: string\n /** Custom social links */\n custom?: Array<{\n label: string\n url: string\n icon?: string\n }>\n}\n\n/**\n * Search configuration\n */\nexport interface SearchConfig {\n /** Enable/disable search functionality */\n enabled?: boolean\n /** Placeholder text for search input */\n placeholder?: string\n /** Search provider type */\n provider?: \"meilisearch\" | \"algolia\" | \"local\"\n /** Meilisearch configuration */\n meilisearch?: {\n /** Meilisearch server URL */\n host: string\n /** API key for Meilisearch */\n apiKey?: string\n /** Index name */\n indexName: string\n }\n}\n\n/**\n * Analytics configuration\n */\nexport interface AnalyticsConfig {\n /** Google Analytics tracking ID */\n googleAnalytics?: string\n /** Google Tag Manager ID */\n googleTagManager?: string\n /** Plausible Analytics domain */\n plausible?: string\n /** Custom analytics scripts */\n custom?: Array<{\n src: string\n async?: boolean\n defer?: boolean\n }>\n}\n\n/**\n * Footer branding configuration\n */\nexport interface FooterBranding {\n /** Whether to show the branding */\n showBranding?: boolean\n /** Logo for the branding - can be a string or an object with light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Title text for the branding */\n title?: string\n /** URL to link to when branding is clicked */\n url?: string\n}\n\n/**\n * Footer configuration\n */\nexport interface FooterConfig {\n /** Copyright text */\n copyright?: string\n /** Footer links organized by columns */\n links?: Array<{\n title: string\n items: Array<{\n label: string\n href: string\n }>\n }>\n /** Custom footer content */\n customContent?: string\n /** Branding configuration for \"Powered by\" section */\n branding?: FooterBranding\n}\n\n/**\n * Documentation features\n */\nexport interface FeaturesConfig {\n /**\n * Enable/disable edit this page links.\n * Provide a URL template (e.g., \"https://github.com/user/repo/edit/main/docs\") or false to disable\n */\n editUrl?: string | boolean\n /** Show last updated timestamp */\n showLastUpdated?: boolean\n /** Show reading time estimate */\n showReadingTime?: boolean\n /** Show author information */\n showAuthors?: boolean\n /** Show tags */\n showTags?: boolean\n /** Enable version dropdown */\n versioning?: boolean\n /** \n * Internationalization (i18n) configuration\n * Set to true to enable with defaults, or provide configuration object\n */\n i18n?: boolean | I18nConfig\n}\n\n/**\n * Internationalization configuration\n */\nexport interface I18nConfig {\n /** The default locale (e.g. 'en') - used when no locale is present in URL */\n defaultLocale: string\n /** List of supported locales (e.g. ['en', 'fr', 'es']) */\n locales: string[]\n /** Map of locale codes to display names (e.g. { en: \"English\", fr: \"Français\" }) */\n localeNames?: Record<string, string>\n /** Whether to use locale subpaths for default locale (default: false) */\n prefixDefault?: boolean\n}\n\n/**\n * Site-wide banner configuration\n */\nexport interface BannerConfig {\n /** Whether the banner is enabled */\n enabled?: boolean\n /** Banner message */\n message?: string\n /** Banner type */\n type?: \"info\" | \"warning\" | \"success\" | \"error\"\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n}\n\n/**\n * Environment variables that can be used in documentation\n * These will be replaced at build time or runtime\n */\nexport interface EnvironmentVariables {\n /** API base URL */\n API_BASE_URL?: string\n /** API version */\n API_VERSION?: string\n /** CDN URL */\n CDN_URL?: string\n /** Custom environment variables */\n [key: string]: string | undefined\n}\n\n/**\n * Deployment configuration for different hosting scenarios\n */\nexport interface DeploymentConfig {\n /**\n * Deployment target\n * - 'vercel': For Vercel or similar Node.js hosting (uses 'standalone' output)\n * - 'github-pages': For GitHub Pages static hosting (uses 'export' output)\n * - 'static': For any static hosting like Netlify, Cloudflare Pages, etc.\n * - 'custom-domain-static': For static hosting with custom domain (no basePath needed)\n */\n target?: \"vercel\" | \"github-pages\" | \"static\" | \"custom-domain-static\"\n\n /**\n * Base path for assets when deploying to GitHub Pages without custom domain\n * This should be your repository name (e.g., 'my-repo')\n * Only used when target is 'github-pages' and no custom domain is configured\n */\n basePath?: string\n\n /**\n * Whether a custom domain is configured\n * When true, basePath will be ignored even for GitHub Pages\n */\n customDomain?: boolean\n}\n\n/**\n * Main configuration interface\n */\nexport interface SpecraConfig {\n /** JSON Schema reference (for IDE support) */\n $schema?: string\n /** Site metadata and branding */\n site: SiteConfig\n /** Theme and appearance settings */\n theme?: ThemeConfig\n /** Navigation and sidebar configuration */\n navigation?: NavigationConfig\n /** Social and external links */\n social?: SocialLinks\n /** Search configuration */\n search?: SearchConfig\n /** Analytics configuration */\n analytics?: AnalyticsConfig\n /** Footer configuration */\n footer?: FooterConfig\n /** Site-wide banner */\n banner?: BannerConfig\n /** Documentation features */\n features?: FeaturesConfig\n /** Environment variables for use in docs */\n env?: EnvironmentVariables\n /** Deployment configuration */\n deployment?: DeploymentConfig\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: SpecraConfig = {\n site: {\n title: \"Documentation\",\n description: \"Project documentation\",\n baseUrl: \"/\",\n language: \"en\",\n },\n theme: {\n defaultMode: \"system\",\n respectPrefersColorScheme: true,\n },\n navigation: {\n showSidebar: true,\n collapsibleSidebar: true,\n showBreadcrumbs: true,\n showTableOfContents: true,\n tocPosition: \"right\",\n tocMaxDepth: 3,\n },\n search: {\n enabled: true,\n provider: \"local\",\n placeholder: \"Search documentation...\",\n },\n features: {\n showLastUpdated: true,\n showReadingTime: true,\n showAuthors: false,\n showTags: true,\n versioning: true,\n i18n: false,\n },\n}\n","import { SpecraConfig, defaultConfig } from \"./config.types\"\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n\n for (const key in source) {\n const sourceValue = source[key]\n const targetValue = result[key]\n\n if (sourceValue && typeof sourceValue === \"object\" && !Array.isArray(sourceValue)) {\n result[key] = deepMerge(\n targetValue && typeof targetValue === \"object\" ? targetValue : {},\n sourceValue,\n ) as T[Extract<keyof T, string>]\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[Extract<keyof T, string>]\n }\n }\n\n return result\n}\n\n/**\n * Load and parse the Specra configuration file\n * Falls back to default configuration if file doesn't exist or is invalid\n */\nexport function loadConfig(userConfig: Partial<SpecraConfig>): SpecraConfig {\n try {\n // const userConfig = specraConfigJson as unknown as Partial<SpecraConfig>\n\n // Merge user config with defaults \n const config = deepMerge(defaultConfig, userConfig)\n\n return config\n } catch (error) {\n console.error(`❌ Error loading configuration:`, error)\n console.warn(\"Using default configuration.\")\n return defaultConfig\n }\n}\n\n/**\n * Get a specific configuration value by path (SERVER ONLY)\n * Example: getConfigValue('site.title') or getConfigValue('theme.defaultMode')\n */\nexport function getConfigValue<T = any>(path: string, config?: SpecraConfig): T | undefined {\n const cfg = config || loadConfig({})\n const keys = path.split(\".\")\n let value: any = cfg\n\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = value[key]\n } else {\n return undefined\n }\n }\n\n return value as T\n}\n\n/**\n * Replace environment variables in a string (SERVER ONLY)\n * Supports ${ENV_VAR} and {{ENV_VAR}} syntax\n */\nexport function replaceEnvVariables(text: string, config?: SpecraConfig): string {\n const cfg = config || loadConfig({})\n const envVars = cfg.env || {}\n\n let result = text\n\n // Replace ${VAR} syntax\n result = result.replace(/\\$\\{([^}]+)\\}/g, (match, varName) => {\n return envVars[varName] || match\n })\n\n // Replace {{VAR}} syntax\n result = result.replace(/\\{\\{([^}]+)\\}\\}/g, (match, varName) => {\n return envVars[varName] || match\n })\n\n return result\n}\n\n/**\n * Process content and replace all environment variables (SERVER ONLY)\n */\nexport function processContentWithEnv(content: string, config?: SpecraConfig): string {\n return replaceEnvVariables(content, config)\n}\n\n/**\n * Validate configuration (basic validation) (SERVER ONLY)\n */\nexport function validateConfig(config: SpecraConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = []\n\n // Required fields\n if (!config.site?.title) {\n errors.push(\"site.title is required\")\n }\n\n // URL validation\n if (config.site?.url) {\n try {\n new URL(config.site.url)\n } catch {\n errors.push(\"site.url must be a valid URL\")\n }\n }\n\n // Social links validation\n if (config.social) {\n const socialKeys = [\"github\", \"twitter\", \"discord\", \"linkedin\", \"youtube\"] as const\n for (const key of socialKeys) {\n const url = config.social[key]\n if (url) {\n try {\n new URL(url)\n } catch {\n errors.push(`social.${key} must be a valid URL`)\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n }\n}\n\n// Singleton instance\nlet configInstance: SpecraConfig | null = null\n\n/**\n * Initialize the Specra configuration\n * Can be called multiple times - subsequent calls will update the config\n * @param userConfig - Partial configuration to merge with defaults\n * @returns The initialized configuration\n */\nexport function initConfig(userConfig: Partial<SpecraConfig>): SpecraConfig {\n configInstance = loadConfig(userConfig)\n return configInstance\n}\n\n/**\n * Get the configuration instance (cached) (SERVER ONLY)\n * If not initialized, returns default config\n */\nexport function getConfig(): SpecraConfig {\n if (!configInstance) {\n // Auto-initialize with defaults if not already initialized\n configInstance = loadConfig({})\n }\n return configInstance\n}\n\n/**\n * Reload the configuration (useful for development) (SERVER ONLY)\n */\nexport function reloadConfig(userConfig: Partial<SpecraConfig>): SpecraConfig {\n configInstance = loadConfig(userConfig)\n return configInstance\n}\n\n/**\n * Export the loaded config as default (SERVER ONLY)\n */\n// export default getConfig()\n","import { Clock, Calendar, User } from \"lucide-react\"\nimport type { DocMeta } from \"@/lib/mdx\"\nimport { getConfig, SpecraConfig } from \"@/lib/config\"\n\ninterface DocMetadataProps {\n meta: DocMeta\n config: SpecraConfig\n}\n\nexport function DocMetadata({ meta, config }: DocMetadataProps) {\n // Server component - can use getConfig directly\n // const config = getConfig()\n\n const showReadingTime = config.features?.showReadingTime && meta.reading_time\n const showLastUpdated = config.features?.showLastUpdated && meta.last_updated\n const showAuthors = config.features?.showAuthors && meta.authors?.length\n\n const hasMetadata = showReadingTime || showLastUpdated || showAuthors\n\n if (!hasMetadata) {\n return null\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-4 text-sm text-muted-foreground border-b border-border pb-4 mb-6\">\n {showReadingTime && (\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{meta.reading_time} min read</span>\n </div>\n )}\n\n {showLastUpdated && meta.last_updated && (\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>Updated {new Date(meta.last_updated).toLocaleDateString(meta.locale || 'en')}</span>\n </div>\n )}\n\n {showAuthors && (\n <div className=\"flex items-center gap-1.5\">\n <User className=\"h-4 w-4\" />\n <span>\n {meta.authors!.map((author, idx) => (\n <span key={author.id}>\n {author.name || author.id}\n {idx < meta.authors!.length - 1 && \", \"}\n </span>\n ))}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import { FileWarning } from \"lucide-react\"\n\nexport function DraftBadge() {\n return (\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-md bg-yellow-500/10 border border-yellow-500/20 text-yellow-600 dark:text-yellow-400 text-sm font-medium mb-4\">\n <FileWarning className=\"h-4 w-4\" />\n <span>Draft - Not visible in production</span>\n </div>\n )\n}\n","import { Tag } from \"lucide-react\"\n\ninterface DocTagsProps {\n tags: string[]\n}\n\nexport function DocTags({ tags }: DocTagsProps) {\n if (!tags || tags.length === 0) {\n return null\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 mt-6 pt-6 border-t border-border\">\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center px-2.5 py-0.5 rounded-md text-xs font-medium bg-primary/10 text-primary border border-primary/20\"\n >\n {tag}\n </span>\n ))}\n </div>\n )\n}\n","import Link from \"next/link\"\nimport { ChevronRight, FileText } from \"lucide-react\"\nimport type { Doc } from \"@/lib/mdx\"\nimport { MDXRemote } from \"next-mdx-remote/rsc\"\nimport remarkGfm from \"remark-gfm\"\nimport { remarkCodeMeta } from \"@/lib/remark-code-meta\"\nimport rehypeSlug from \"rehype-slug\"\nimport { processContentWithEnv, SpecraConfig } from \"@/lib/config\"\nimport { sortSidebarItems } from \"@/lib/sidebar-utils\"\n\ninterface CategoryIndexProps {\n categoryPath: string\n version: string\n allDocs: Doc[]\n title: string\n description?: string\n content?: string\n config: SpecraConfig\n mdxComponents: Record<string, React.ComponentType<any>>\n}\n\nexport function CategoryIndex({ categoryPath, version, allDocs, title, description, content , config, mdxComponents }: CategoryIndexProps) {\n // Find all docs that are direct children of this category\n const childDocs = allDocs.filter((doc) => {\n // Get the parent path of the doc\n const parts = doc.slug.split(\"/\")\n const docParent = parts.slice(0, -1).join(\"/\")\n\n // Check if this doc is a direct child of the category\n return docParent === categoryPath && doc.slug !== categoryPath\n })\n\n // const config = getConfig();\n const processedContent = () => {\n if(content){\n return processContentWithEnv(content, config);\n }\n return \"\";\n };\n\n // Sort by sidebar_position using unified sorting function\n const sortedDocs = sortSidebarItems(childDocs)\n\n return (\n <div className=\"flex-1 min-w-0\">\n <div className=\"mb-8\">\n <h1 className=\"text-4xl font-bold tracking-tight mb-3 text-foreground\">{title}</h1>\n {description && <p className=\"text-lg text-muted-foreground leading-relaxed\">{description}</p>}\n\n <div className=\"prose prose-slate dark:prose-invert max-w-none prose-headings:scroll-mt-24 prose-headings:font-semibold prose-h1:text-4xl prose-h2:text-3xl prose-h2:mt-12 prose-h2:mb-4 prose-h3:text-2xl prose-h3:mt-8 prose-h3:mb-3 prose-p:text-base prose-p:leading-7 prose-p:text-muted-foreground prose-p:mb-4 prose-a:font-normal prose-a:transition-all prose-code:text-primary prose-code:bg-muted/50 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded-md prose-code:text-[13px] prose-code:font-mono prose-code:border prose-code:border-border/50 prose-code:before:content-none prose-code:after:content-none prose-pre:bg-transparent prose-pre:p-0 prose-ul:list-disc prose-ul:list-inside prose-ul:space-y-2 prose-ul:mb-4 prose-ol:list-decimal prose-ol:list-inside prose-ol:space-y-2 prose-ol:mb-4 prose-li:leading-7 prose-li:text-muted-foreground prose-strong:text-foreground prose-strong:font-semibold\">\n <MDXRemote\n source={processedContent()}\n options={{\n parseFrontmatter: false,\n mdxOptions: {\n remarkPlugins: [remarkGfm, remarkCodeMeta],\n rehypePlugins: [rehypeSlug],\n development: false,\n },\n }}\n components={mdxComponents as any}\n />\n </div>\n\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {sortedDocs.map((doc) => (\n <Link\n key={doc.slug}\n href={`/docs/${version}/${doc.slug}`}\n className=\"group block p-5 rounded-xl border border-border bg-card hover:bg-accent hover:border-primary/50 transition-all duration-200\"\n style={{\n textDecoration: \"none !important\"\n }}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-2\">\n <FileText className=\"h-6 w-6 text-primary shrink-0\" />\n <h3 className=\"text-lg font-semibold text-foreground group-hover:text-primary transition-colors\">\n {doc.meta.title || doc.title}\n </h3>\n </div>\n {doc.meta.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-2\">\n {doc.meta.description}\n </p>\n )}\n {doc.meta.reading_time && (\n <p className=\"text-xs text-muted-foreground mt-2\">\n {doc.meta.reading_time} min read\n </p>\n )}\n </div>\n <ChevronRight className=\"h-5 w-5 text-muted-foreground group-hover:text-primary group-hover:translate-x-1 transition-all flex-shrink-0 mt-1\" />\n </div>\n </Link>\n ))}\n </div>\n\n {sortedDocs.length === 0 && (\n <div className=\"text-center py-12 text-muted-foreground\">\n <FileText className=\"h-12 w-12 mx-auto mb-3 opacity-50\" />\n <p>No documents found in this category.</p>\n </div>\n )}\n </div>\n )\n}\n","/**\n * Unified sidebar sorting and structure building utilities\n * This module provides consistent sidebar logic across the application\n * to ensure ordering is handled the same way everywhere.\n */\n\nexport interface SidebarGroup {\n label: string\n path: string\n icon?: string\n items: any[]\n position: number\n collapsible: boolean\n defaultCollapsed: boolean\n children: Record<string, SidebarGroup>\n}\n\n/**\n * Sort sidebar items by their position.\n * Items with explicit sidebar_position come first (sorted numerically),\n * followed by items without position (sorted by their original order).\n *\n * @param items - Array of items with optional sidebar_position\n * @returns Sorted array of items\n */\nexport function sortSidebarItems<T extends { sidebar_position?: number; meta?: any }>(items: T[]): T[] {\n return [...items].sort((a, b) => {\n const posA = a.sidebar_position ?? a.meta?.sidebar_position ?? a.meta?.order ?? 999\n const posB = b.sidebar_position ?? b.meta?.sidebar_position ?? b.meta?.order ?? 999\n return posA - posB\n })\n}\n\n/**\n * Sort sidebar groups by their position.\n * Groups with explicit position come first (sorted numerically),\n * followed by groups without position at the end (sorted by their original order).\n *\n * @param groups - Record of group key to group object with position\n * @returns Sorted array of [key, group] tuples\n */\nexport function sortSidebarGroups<T extends { position: number }>(\n groups: Record<string, T>\n): [string, T][] {\n return Object.entries(groups).sort(([, a], [, b]) => {\n const posA = a.position ?? 999\n const posB = b.position ?? 999\n return posA - posB\n })\n}\n\n/**\n * Build hierarchical sidebar structure from flat list of documents\n * This is the single source of truth for sidebar structure used by both\n * the sidebar component and navigation (prev/next) links.\n *\n * @param docs - Array of documents with metadata\n * @returns Object containing root groups and standalone items\n */\nexport function buildSidebarStructure<T extends {\n filePath: string\n slug: string\n categoryLabel?: string\n categoryPosition?: number\n categoryIcon?: string\n categoryCollapsible?: boolean\n categoryCollapsed?: boolean\n meta: any\n}>(docs: T[]): {\n rootGroups: Record<string, SidebarGroup>\n standalone: T[]\n} {\n const rootGroups: Record<string, SidebarGroup> = {}\n const standalone: T[] = []\n\n // First pass: collect category metadata from all docs to build complete folder structure\n const categoryMetadata = new Map<string, {\n label?: string\n position?: number\n icon?: string\n collapsible?: boolean\n collapsed?: boolean\n }>()\n\n docs.forEach((doc) => {\n const pathParts = doc.filePath.split(\"/\")\n const folderPath = pathParts.length > 1 ? pathParts.slice(0, -1).join(\"/\") : \"\"\n\n if (folderPath && doc.categoryLabel) {\n categoryMetadata.set(folderPath, {\n label: doc.categoryLabel,\n position: doc.categoryPosition,\n icon: doc.categoryIcon,\n collapsible: doc.categoryCollapsible,\n collapsed: doc.categoryCollapsed\n })\n }\n })\n\n docs.forEach((doc) => {\n const pathParts = doc.filePath.split(\"/\")\n const isIndexFile = doc.filePath.endsWith(\"/index\") ||\n doc.filePath === \"index\" ||\n (pathParts.length > 1 && doc.slug === pathParts.slice(0, -1).join(\"/\"))\n\n const customGroup = doc.meta.sidebar || doc.meta.group\n\n if (customGroup) {\n const groupName = customGroup.charAt(0).toUpperCase() + customGroup.slice(1)\n if (!rootGroups[groupName]) {\n rootGroups[groupName] = {\n label: groupName,\n path: customGroup,\n items: [],\n position: 999,\n collapsible: doc.categoryCollapsible ?? true,\n defaultCollapsed: doc.categoryCollapsed ?? false,\n children: {}\n }\n }\n if (isIndexFile) {\n // Use categoryPosition if available (from _category_.json), otherwise sidebar_position from frontmatter\n rootGroups[groupName].position = doc.categoryPosition ?? doc.meta.sidebar_position ?? 999\n rootGroups[groupName].icon = doc.categoryIcon\n } else {\n rootGroups[groupName].items.push(doc)\n }\n return\n }\n\n if (pathParts.length > 1) {\n const folderParts = pathParts.slice(0, -1)\n let currentLevel = rootGroups\n let currentPath = \"\"\n\n for (let i = 0; i < folderParts.length; i++) {\n const folder = folderParts[i]\n currentPath = currentPath ? `${currentPath}/${folder}` : folder\n const folderLabel = folder.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \")\n\n // Get metadata for this specific folder path\n const metadata = categoryMetadata.get(currentPath)\n\n if (!currentLevel[folder]) {\n currentLevel[folder] = {\n label: metadata?.label ?? folderLabel,\n path: currentPath,\n icon: metadata?.icon,\n items: [],\n position: metadata?.position ?? 999,\n collapsible: metadata?.collapsible ?? true,\n defaultCollapsed: metadata?.collapsed ?? false,\n children: {}\n }\n }\n\n if (i === folderParts.length - 1) {\n if (isIndexFile) {\n // Update position, label, and icon if this is the index file for this folder\n currentLevel[folder].position = doc.categoryPosition ?? doc.meta.sidebar_position ?? currentLevel[folder].position\n if (doc.categoryLabel) {\n currentLevel[folder].label = doc.categoryLabel\n }\n if (doc.categoryIcon) {\n currentLevel[folder].icon = doc.categoryIcon\n }\n if (doc.categoryCollapsible !== undefined) {\n currentLevel[folder].collapsible = doc.categoryCollapsible\n }\n if (doc.categoryCollapsed !== undefined) {\n currentLevel[folder].defaultCollapsed = doc.categoryCollapsed\n }\n } else {\n currentLevel[folder].items.push(doc)\n }\n }\n\n currentLevel = currentLevel[folder].children\n }\n } else {\n if (!isIndexFile) {\n standalone.push(doc)\n }\n }\n })\n\n return { rootGroups, standalone }\n}\n"],"mappings":"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","names":["import_lucide_react","Link","import_link","import_lucide_react","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","remarkGfm","rehypeSlug","import_link","import_lucide_react","import_rsc","import_remark_gfm","import_rehype_slug","import_jsx_runtime","remarkGfm","rehypeSlug","Link"]}
|