boltdocs 1.0.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 (137) hide show
  1. package/dist/CodeBlock-37XMKCYY.mjs +7 -0
  2. package/dist/PackageManagerTabs-4NWXLXQO.mjs +314 -0
  3. package/dist/Playground-OE2OE6B6.mjs +7 -0
  4. package/dist/SearchDialog-FTOQZ763.mjs +187 -0
  5. package/dist/SearchDialog-ZAZXYIFX.css +2147 -0
  6. package/dist/Video-I6QY4X7J.mjs +7 -0
  7. package/dist/chunk-2YRDWM6O.mjs +56 -0
  8. package/dist/chunk-PN4GCTYG.mjs +67 -0
  9. package/dist/chunk-X2TDGMTR.mjs +64 -0
  10. package/dist/chunk-X6BYQHVC.mjs +12 -0
  11. package/dist/chunk-Z7JHYNAS.mjs +57 -0
  12. package/dist/chunk-ZFCOLEXN.mjs +1644 -0
  13. package/dist/client/index.css +2147 -0
  14. package/dist/client/index.d.mts +298 -0
  15. package/dist/client/index.d.ts +298 -0
  16. package/dist/client/index.js +2793 -0
  17. package/dist/client/index.mjs +63 -0
  18. package/dist/client/ssr.css +2147 -0
  19. package/dist/client/ssr.d.mts +25 -0
  20. package/dist/client/ssr.d.ts +25 -0
  21. package/dist/client/ssr.js +2727 -0
  22. package/dist/client/ssr.mjs +32 -0
  23. package/dist/config-D2XmHJYe.d.mts +122 -0
  24. package/dist/config-D2XmHJYe.d.ts +122 -0
  25. package/dist/index-CRQKWAeo.d.mts +82 -0
  26. package/dist/index-CRQKWAeo.d.ts +82 -0
  27. package/dist/node/cli/index.d.mts +1 -0
  28. package/dist/node/cli/index.d.ts +1 -0
  29. package/dist/node/cli/index.js +199 -0
  30. package/dist/node/cli/index.mjs +154 -0
  31. package/dist/node/index.d.mts +79 -0
  32. package/dist/node/index.d.ts +79 -0
  33. package/dist/node/index.js +797 -0
  34. package/dist/node/index.mjs +719 -0
  35. package/package.json +79 -0
  36. package/src/client/app/index.tsx +422 -0
  37. package/src/client/app/preload.tsx +56 -0
  38. package/src/client/index.ts +40 -0
  39. package/src/client/ssr.tsx +50 -0
  40. package/src/client/theme/components/CodeBlock/CodeBlock.tsx +76 -0
  41. package/src/client/theme/components/CodeBlock/index.ts +1 -0
  42. package/src/client/theme/components/PackageManagerTabs/PackageManagerTabs.tsx +154 -0
  43. package/src/client/theme/components/PackageManagerTabs/index.ts +1 -0
  44. package/src/client/theme/components/PackageManagerTabs/pkg-tabs.css +64 -0
  45. package/src/client/theme/components/Playground/Playground.tsx +86 -0
  46. package/src/client/theme/components/Playground/index.ts +1 -0
  47. package/src/client/theme/components/Playground/playground.css +168 -0
  48. package/src/client/theme/components/Video/Video.tsx +84 -0
  49. package/src/client/theme/components/Video/index.ts +1 -0
  50. package/src/client/theme/components/Video/video.css +41 -0
  51. package/src/client/theme/components/mdx/Admonition.tsx +80 -0
  52. package/src/client/theme/components/mdx/Badge.tsx +31 -0
  53. package/src/client/theme/components/mdx/Button.tsx +50 -0
  54. package/src/client/theme/components/mdx/Card.tsx +80 -0
  55. package/src/client/theme/components/mdx/List.tsx +57 -0
  56. package/src/client/theme/components/mdx/Tabs.tsx +94 -0
  57. package/src/client/theme/components/mdx/index.ts +18 -0
  58. package/src/client/theme/components/mdx/mdx-components.css +405 -0
  59. package/src/client/theme/icons/bun.tsx +62 -0
  60. package/src/client/theme/icons/deno.tsx +20 -0
  61. package/src/client/theme/icons/discord.tsx +12 -0
  62. package/src/client/theme/icons/github.tsx +15 -0
  63. package/src/client/theme/icons/npm.tsx +13 -0
  64. package/src/client/theme/icons/pnpm.tsx +72 -0
  65. package/src/client/theme/icons/twitter.tsx +12 -0
  66. package/src/client/theme/styles/home.css +60 -0
  67. package/src/client/theme/styles/markdown.css +343 -0
  68. package/src/client/theme/styles/variables.css +162 -0
  69. package/src/client/theme/styles.css +38 -0
  70. package/src/client/theme/ui/BackgroundGradient/BackgroundGradient.tsx +10 -0
  71. package/src/client/theme/ui/BackgroundGradient/index.ts +1 -0
  72. package/src/client/theme/ui/Breadcrumbs/Breadcrumbs.tsx +68 -0
  73. package/src/client/theme/ui/Breadcrumbs/index.ts +1 -0
  74. package/src/client/theme/ui/Footer/footer.css +32 -0
  75. package/src/client/theme/ui/Head/Head.tsx +69 -0
  76. package/src/client/theme/ui/Head/index.ts +1 -0
  77. package/src/client/theme/ui/LanguageSwitcher/LanguageSwitcher.tsx +125 -0
  78. package/src/client/theme/ui/LanguageSwitcher/index.ts +1 -0
  79. package/src/client/theme/ui/LanguageSwitcher/language-switcher.css +98 -0
  80. package/src/client/theme/ui/Layout/Layout.tsx +213 -0
  81. package/src/client/theme/ui/Layout/base.css +76 -0
  82. package/src/client/theme/ui/Layout/index.ts +2 -0
  83. package/src/client/theme/ui/Layout/pagination.css +72 -0
  84. package/src/client/theme/ui/Layout/responsive.css +40 -0
  85. package/src/client/theme/ui/Link/Link.tsx +202 -0
  86. package/src/client/theme/ui/Link/index.ts +2 -0
  87. package/src/client/theme/ui/Loading/Loading.tsx +10 -0
  88. package/src/client/theme/ui/Loading/index.ts +1 -0
  89. package/src/client/theme/ui/Loading/loading.css +30 -0
  90. package/src/client/theme/ui/Navbar/GithubStars.tsx +27 -0
  91. package/src/client/theme/ui/Navbar/Navbar.tsx +145 -0
  92. package/src/client/theme/ui/Navbar/index.ts +2 -0
  93. package/src/client/theme/ui/Navbar/navbar.css +233 -0
  94. package/src/client/theme/ui/NotFound/NotFound.tsx +20 -0
  95. package/src/client/theme/ui/NotFound/index.ts +1 -0
  96. package/src/client/theme/ui/NotFound/not-found.css +64 -0
  97. package/src/client/theme/ui/OnThisPage/OnThisPage.tsx +192 -0
  98. package/src/client/theme/ui/OnThisPage/index.ts +1 -0
  99. package/src/client/theme/ui/OnThisPage/toc.css +132 -0
  100. package/src/client/theme/ui/PoweredBy/PoweredBy.tsx +18 -0
  101. package/src/client/theme/ui/PoweredBy/index.ts +1 -0
  102. package/src/client/theme/ui/PoweredBy/powered-by.css +76 -0
  103. package/src/client/theme/ui/SearchDialog/SearchDialog.tsx +199 -0
  104. package/src/client/theme/ui/SearchDialog/index.ts +1 -0
  105. package/src/client/theme/ui/SearchDialog/search.css +152 -0
  106. package/src/client/theme/ui/Sidebar/Sidebar.tsx +200 -0
  107. package/src/client/theme/ui/Sidebar/index.ts +1 -0
  108. package/src/client/theme/ui/Sidebar/sidebar.css +269 -0
  109. package/src/client/theme/ui/ThemeToggle/ThemeToggle.tsx +69 -0
  110. package/src/client/theme/ui/ThemeToggle/index.ts +1 -0
  111. package/src/client/theme/ui/VersionSwitcher/VersionSwitcher.tsx +136 -0
  112. package/src/client/theme/ui/VersionSwitcher/index.ts +1 -0
  113. package/src/client/utils.ts +26 -0
  114. package/src/node/cache.ts +94 -0
  115. package/src/node/cli/commands/config.ts +15 -0
  116. package/src/node/cli/commands/generate-css.ts +24 -0
  117. package/src/node/cli/constants.ts +70 -0
  118. package/src/node/cli/index.ts +22 -0
  119. package/src/node/config.ts +185 -0
  120. package/src/node/index.ts +21 -0
  121. package/src/node/mdx.ts +41 -0
  122. package/src/node/plugin/entry.ts +58 -0
  123. package/src/node/plugin/html.ts +55 -0
  124. package/src/node/plugin/index.ts +190 -0
  125. package/src/node/plugin/types.ts +11 -0
  126. package/src/node/routes/cache.ts +24 -0
  127. package/src/node/routes/index.ts +152 -0
  128. package/src/node/routes/parser.ts +127 -0
  129. package/src/node/routes/sorter.ts +42 -0
  130. package/src/node/routes/types.ts +49 -0
  131. package/src/node/ssg/index.ts +110 -0
  132. package/src/node/ssg/meta.ts +34 -0
  133. package/src/node/ssg/options.ts +13 -0
  134. package/src/node/ssg/sitemap.ts +54 -0
  135. package/src/node/utils.ts +134 -0
  136. package/tsconfig.json +20 -0
  137. package/tsup.config.ts +22 -0
@@ -0,0 +1,202 @@
1
+ import React from "react";
2
+ import {
3
+ Link as RouterLink,
4
+ NavLink as RouterNavLink,
5
+ LinkProps as RouterLinkProps,
6
+ NavLinkProps as RouterNavLinkProps,
7
+ useLocation,
8
+ } from "react-router-dom";
9
+ import { usePreload } from "../../../app/preload";
10
+ import { useConfig } from "../../../app";
11
+
12
+ function useLocalizedTo(to: RouterLinkProps["to"]) {
13
+ const location = useLocation();
14
+ const config = useConfig();
15
+ if (!config || typeof to !== "string") return to;
16
+ if (!config.i18n && !config.versions) return to;
17
+
18
+ const basePath = "/docs";
19
+ if (!to.startsWith(basePath)) return to;
20
+
21
+ // 1. Detect current context from location
22
+ const curSub = location.pathname.substring(basePath.length);
23
+ const curParts = curSub.split("/").filter(Boolean);
24
+
25
+ let currentVersion = config.versions?.defaultVersion;
26
+ let currentLocale = config.i18n?.defaultLocale;
27
+
28
+ let cIdx = 0;
29
+ if (
30
+ config.versions &&
31
+ curParts.length > cIdx &&
32
+ config.versions.versions[curParts[cIdx]]
33
+ ) {
34
+ currentVersion = curParts[cIdx];
35
+ cIdx++;
36
+ }
37
+ if (
38
+ config.i18n &&
39
+ curParts.length > cIdx &&
40
+ config.i18n.locales[curParts[cIdx]]
41
+ ) {
42
+ currentLocale = curParts[cIdx];
43
+ }
44
+
45
+ // 2. Parse the target `to` path
46
+ const toSub = to.substring(basePath.length);
47
+ const toParts = toSub.split("/").filter(Boolean);
48
+
49
+ let tIdx = 0;
50
+ let hasVersion = false;
51
+ let hasLocale = false;
52
+
53
+ if (
54
+ config.versions &&
55
+ toParts.length > tIdx &&
56
+ config.versions.versions[toParts[tIdx]]
57
+ ) {
58
+ hasVersion = true;
59
+ tIdx++;
60
+ }
61
+ if (
62
+ config.i18n &&
63
+ toParts.length > tIdx &&
64
+ config.i18n.locales[toParts[tIdx]]
65
+ ) {
66
+ hasLocale = true;
67
+ tIdx++;
68
+ }
69
+
70
+ // Extract just the actual route parts
71
+ const routeParts = toParts.slice(tIdx);
72
+
73
+ // Reconstruct path
74
+ const finalParts = [];
75
+ if (config.versions) {
76
+ if (hasVersion) {
77
+ finalParts.push(toParts[0]);
78
+ } else if (currentVersion) {
79
+ finalParts.push(currentVersion);
80
+ }
81
+ }
82
+ if (config.i18n) {
83
+ if (hasLocale) {
84
+ finalParts.push(toParts[hasVersion ? 1 : 0]);
85
+ } else if (currentLocale) {
86
+ finalParts.push(currentLocale);
87
+ }
88
+ }
89
+
90
+ finalParts.push(...routeParts);
91
+
92
+ let finalPath = `${basePath}/${finalParts.join("/")}`;
93
+ if (finalPath.endsWith("/")) {
94
+ finalPath = finalPath.slice(0, -1);
95
+ }
96
+ return finalPath === basePath ? basePath : finalPath;
97
+ }
98
+
99
+ export interface LinkProps extends Omit<RouterLinkProps, "prefetch"> {
100
+ /** Should prefetch the page on hover? Options: 'hover' | 'none'. Default 'hover' */
101
+ boltdocsPrefetch?: "hover" | "none";
102
+ }
103
+
104
+ export const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
105
+ (props, ref) => {
106
+ const {
107
+ boltdocsPrefetch = "hover",
108
+ onMouseEnter,
109
+ onFocus,
110
+ to,
111
+ ...rest
112
+ } = props;
113
+ const localizedTo = useLocalizedTo(to);
114
+ const { preload } = usePreload();
115
+
116
+ const handleMouseEnter = (e: React.MouseEvent<HTMLAnchorElement>) => {
117
+ onMouseEnter?.(e);
118
+ if (
119
+ boltdocsPrefetch === "hover" &&
120
+ typeof localizedTo === "string" &&
121
+ localizedTo.startsWith("/")
122
+ ) {
123
+ preload(localizedTo);
124
+ }
125
+ };
126
+
127
+ const handleFocus = (e: React.FocusEvent<HTMLAnchorElement>) => {
128
+ onFocus?.(e);
129
+ if (
130
+ boltdocsPrefetch === "hover" &&
131
+ typeof localizedTo === "string" &&
132
+ localizedTo.startsWith("/")
133
+ ) {
134
+ preload(localizedTo);
135
+ }
136
+ };
137
+
138
+ return (
139
+ <RouterLink
140
+ ref={ref}
141
+ to={localizedTo}
142
+ onMouseEnter={handleMouseEnter}
143
+ onFocus={handleFocus}
144
+ {...rest}
145
+ />
146
+ );
147
+ },
148
+ );
149
+ Link.displayName = "Link";
150
+
151
+ export interface NavLinkProps extends Omit<RouterNavLinkProps, "prefetch"> {
152
+ /** Should prefetch the page on hover? Options: 'hover' | 'none'. Default 'hover' */
153
+ boltdocsPrefetch?: "hover" | "none";
154
+ }
155
+
156
+ export const NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(
157
+ (props, ref) => {
158
+ const {
159
+ boltdocsPrefetch = "hover",
160
+ onMouseEnter,
161
+ onFocus,
162
+ to,
163
+ ...rest
164
+ } = props;
165
+
166
+ const localizedTo = useLocalizedTo(to);
167
+ const { preload } = usePreload();
168
+
169
+ const handleMouseEnter = (e: React.MouseEvent<HTMLAnchorElement>) => {
170
+ onMouseEnter?.(e);
171
+ if (
172
+ boltdocsPrefetch === "hover" &&
173
+ typeof localizedTo === "string" &&
174
+ localizedTo.startsWith("/")
175
+ ) {
176
+ preload(localizedTo);
177
+ }
178
+ };
179
+
180
+ const handleFocus = (e: React.FocusEvent<HTMLAnchorElement>) => {
181
+ onFocus?.(e);
182
+ if (
183
+ boltdocsPrefetch === "hover" &&
184
+ typeof localizedTo === "string" &&
185
+ localizedTo.startsWith("/")
186
+ ) {
187
+ preload(localizedTo);
188
+ }
189
+ };
190
+
191
+ return (
192
+ <RouterNavLink
193
+ ref={ref}
194
+ to={localizedTo}
195
+ onMouseEnter={handleMouseEnter}
196
+ onFocus={handleFocus}
197
+ {...rest}
198
+ />
199
+ );
200
+ },
201
+ );
202
+ NavLink.displayName = "NavLink";
@@ -0,0 +1,2 @@
1
+ export { Link, NavLink } from "./Link";
2
+ export type { LinkProps, NavLinkProps } from "./Link";
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+
3
+ export function Loading() {
4
+ return (
5
+ <div className="boltdocs-loading">
6
+ <div className="loading-spinner" />
7
+ <p className="loading-text">Loading...</p>
8
+ </div>
9
+ );
10
+ }
@@ -0,0 +1 @@
1
+ export { Loading } from "./Loading";
@@ -0,0 +1,30 @@
1
+ /* ─── Loading ─────────────────────────────────────────────── */
2
+ .boltdocs-loading {
3
+ display: flex;
4
+ flex-direction: column;
5
+ align-items: center;
6
+ justify-content: center;
7
+ min-height: 40vh;
8
+ gap: 1rem;
9
+ }
10
+
11
+ .loading-spinner {
12
+ width: 2.5rem;
13
+ height: 2.5rem;
14
+ border: 3px solid var(--ld-border-subtle);
15
+ border-top-color: var(--ld-color-primary);
16
+ border-radius: 50%;
17
+ animation: boltdocs-spin 0.7s linear infinite;
18
+ }
19
+
20
+ @keyframes boltdocs-spin {
21
+ to {
22
+ transform: rotate(360deg);
23
+ }
24
+ }
25
+
26
+ .loading-text {
27
+ font-size: 0.875rem;
28
+ color: var(--ld-text-dim);
29
+ margin: 0;
30
+ }
@@ -0,0 +1,27 @@
1
+ import { useEffect, useState } from "react";
2
+ import { GitHub } from "../../icons/github";
3
+ import { getStarsRepo } from "../../../utils";
4
+
5
+ export function GithubStars({ repo }: { repo: string }) {
6
+ const [stars, setStars] = useState<string | null>(null);
7
+
8
+ useEffect(() => {
9
+ if (repo) {
10
+ getStarsRepo(repo)
11
+ .then((stars) => setStars(stars))
12
+ .catch(() => setStars("0"));
13
+ }
14
+ }, [repo]);
15
+
16
+ return (
17
+ <a
18
+ href={`https://github.com/${repo}`}
19
+ target="_blank"
20
+ rel="noopener noreferrer"
21
+ className="navbar-github-stars"
22
+ >
23
+ <GitHub />
24
+ {stars && <span>{stars}</span>}
25
+ </a>
26
+ );
27
+ }
@@ -0,0 +1,145 @@
1
+ import React, { useEffect, useState } from "react";
2
+ import { Link } from "../Link";
3
+ import { Book, ChevronDown } from "lucide-react";
4
+ import { BoltdocsConfig } from "../../../../node/config";
5
+ import { ComponentRoute } from "../../../app";
6
+ import { LanguageSwitcher } from "../LanguageSwitcher";
7
+ import { VersionSwitcher } from "../VersionSwitcher";
8
+ import { ThemeToggle } from "../ThemeToggle";
9
+ import { getStarsRepo } from "../../../utils";
10
+ import { Discord } from "../../icons/discord";
11
+ import { XformerlyTwitter } from "../../icons/twitter";
12
+ import { GithubStars } from "./GithubStars";
13
+
14
+ const SearchDialog = React.lazy(() =>
15
+ import("../SearchDialog").then((m) => ({ default: m.SearchDialog })),
16
+ );
17
+
18
+ const ICON_MAP: Record<string, React.FC> = {
19
+ discord: Discord,
20
+ x: XformerlyTwitter,
21
+ };
22
+
23
+ function formatStars(stars: number) {
24
+ if (stars >= 1000) {
25
+ return (stars / 1000).toFixed(1) + "K";
26
+ }
27
+ return stars.toString();
28
+ }
29
+
30
+ /**
31
+ * The top navigation bar of the documentation site.
32
+ */
33
+ export function Navbar({
34
+ config,
35
+ routes,
36
+ allRoutes,
37
+ currentLocale,
38
+ currentVersion,
39
+ }: {
40
+ config: BoltdocsConfig;
41
+ routes?: ComponentRoute[];
42
+ allRoutes?: ComponentRoute[];
43
+ currentLocale?: string;
44
+ currentVersion?: string;
45
+ }) {
46
+ const title = config.themeConfig?.title || "Boltdocs";
47
+ const navItems = config.themeConfig?.navbar || [];
48
+ const socialLinks = config.themeConfig?.socialLinks || [];
49
+
50
+ return (
51
+ <header className="boltdocs-navbar">
52
+ <div className="navbar-container">
53
+ {/* LEFT SECTION */}
54
+ <div className="navbar-left">
55
+ <div className="navbar-logo">
56
+ <Link to="/">
57
+ {config.themeConfig?.logo ? (
58
+ config.themeConfig.logo.trim().startsWith("<svg") ? (
59
+ <span
60
+ className="navbar-logo-svg"
61
+ dangerouslySetInnerHTML={{
62
+ __html: config.themeConfig.logo,
63
+ }}
64
+ />
65
+ ) : (
66
+ <img
67
+ src={config.themeConfig.logo}
68
+ alt={title}
69
+ className="navbar-logo-img"
70
+ />
71
+ )
72
+ ) : null}
73
+ {title}
74
+ </Link>
75
+ </div>
76
+
77
+ {config.versions && currentVersion && allRoutes ? (
78
+ <VersionSwitcher
79
+ versions={config.versions}
80
+ currentVersion={currentVersion}
81
+ currentLocale={currentLocale}
82
+ allRoutes={allRoutes}
83
+ />
84
+ ) : config.themeConfig?.version ? (
85
+ <div className="navbar-version">
86
+ {config.themeConfig.version} <ChevronDown size={14} />
87
+ </div>
88
+ ) : null}
89
+
90
+ <nav className="navbar-links" aria-label="Top Navigation">
91
+ {navItems.map((item, i) => (
92
+ <Link key={i} to={item.link}>
93
+ {item.text}
94
+ </Link>
95
+ ))}
96
+ </nav>
97
+ </div>
98
+
99
+ {/* RIGHT SECTION */}
100
+ <div className="navbar-right">
101
+ <React.Suspense
102
+ fallback={<div className="navbar-search-placeholder" />}
103
+ >
104
+ <SearchDialog routes={routes || []} />
105
+ </React.Suspense>
106
+
107
+ {config.i18n && currentLocale && allRoutes && (
108
+ <LanguageSwitcher
109
+ i18n={config.i18n}
110
+ currentLocale={currentLocale}
111
+ allRoutes={allRoutes}
112
+ />
113
+ )}
114
+
115
+ <ThemeToggle />
116
+
117
+ {config.themeConfig?.githubRepo && (
118
+ <GithubStars repo={config.themeConfig.githubRepo} />
119
+ )}
120
+
121
+ {/* Optional Divider if both groups have items */}
122
+ {socialLinks.length > 0 && <div className="navbar-divider" />}
123
+
124
+ <div className="navbar-icons">
125
+ {socialLinks.map((link, i) => {
126
+ const IconComp = ICON_MAP[link.icon.toLowerCase()];
127
+ return (
128
+ <a
129
+ key={i}
130
+ href={link.link}
131
+ target="_blank"
132
+ rel="noopener noreferrer"
133
+ className="navbar-icon-btn"
134
+ aria-label={link.icon}
135
+ >
136
+ {IconComp ? <IconComp /> : <span>{link.icon}</span>}
137
+ </a>
138
+ );
139
+ })}
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </header>
144
+ );
145
+ }
@@ -0,0 +1,2 @@
1
+ export { Navbar } from "./Navbar";
2
+ export { GithubStars } from "./GithubStars";
@@ -0,0 +1,233 @@
1
+ /* ═══════════════════════════════════════════════════════════
2
+ NAVBAR
3
+ ═══════════════════════════════════════════════════════════ */
4
+ .boltdocs-navbar {
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ height: var(--ld-navbar-height);
9
+ padding: 0; /* Padding moved to container */
10
+ background-color: var(--ld-navbar-bg);
11
+ backdrop-filter: blur(var(--ld-navbar-blur));
12
+ -webkit-backdrop-filter: blur(var(--ld-navbar-blur));
13
+ border-bottom: 1px solid var(--ld-border-subtle);
14
+ position: sticky;
15
+ top: 0;
16
+ z-index: 100;
17
+ }
18
+
19
+ .navbar-container {
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: space-between;
23
+ width: 100%;
24
+ max-width: 1440px;
25
+ margin: 0 auto;
26
+ padding: 0 1.5rem; /* Aligned exactly with main-container */
27
+ }
28
+
29
+ .navbar-logo {
30
+ flex: 1;
31
+ }
32
+
33
+ .navbar-logo a {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: 0.5rem;
37
+ font-weight: 700;
38
+ font-size: 1.15rem;
39
+ color: var(--ld-text-main);
40
+ text-decoration: none;
41
+ letter-spacing: -0.01em;
42
+ }
43
+
44
+ .navbar-logo a:hover {
45
+ color: var(--ld-text-main);
46
+ }
47
+
48
+ .navbar-logo-img {
49
+ height: 20px;
50
+ width: auto;
51
+ object-fit: contain;
52
+ display: block;
53
+ }
54
+
55
+ .navbar-logo-svg {
56
+ display: flex;
57
+ align-items: center;
58
+ }
59
+
60
+ .navbar-logo-svg svg {
61
+ height: 36px;
62
+ width: auto;
63
+ fill: currentColor;
64
+ display: block;
65
+ }
66
+
67
+ .navbar-left {
68
+ display: flex;
69
+ align-items: center;
70
+ gap: 1.25rem;
71
+ }
72
+
73
+ .navbar-version {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 0.2rem;
77
+ font-size: 0.75rem;
78
+ font-weight: 500;
79
+ color: var(--ld-text-muted);
80
+ background-color: var(--ld-bg-soft);
81
+ padding: 0.25rem 0.5rem;
82
+ border-radius: var(--ld-radius-md);
83
+ border: 1px solid var(--ld-border-subtle);
84
+ cursor: pointer;
85
+ transition: all 0.2s;
86
+ }
87
+
88
+ .navbar-version:hover {
89
+ background-color: var(--ld-bg-mute);
90
+ color: var(--ld-text-main);
91
+ border-color: var(--ld-border-strong);
92
+ }
93
+
94
+ .navbar-right {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 0.75rem;
98
+ }
99
+
100
+ .navbar-links {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 0.25rem;
104
+ }
105
+
106
+ .navbar-links a {
107
+ position: relative;
108
+ padding: 0.4rem 0.75rem;
109
+ color: var(--ld-text-muted);
110
+ text-decoration: none;
111
+ font-weight: 500;
112
+ font-size: 0.875rem;
113
+ border-radius: var(--ld-radius-md);
114
+ transition:
115
+ color 0.2s,
116
+ background-color 0.2s;
117
+ }
118
+
119
+ .navbar-links a:hover {
120
+ color: var(--ld-text-main);
121
+ background-color: var(--ld-color-primary-muted);
122
+ }
123
+
124
+ .navbar-links a.active {
125
+ color: var(--ld-color-primary);
126
+ }
127
+
128
+ .navbar-search {
129
+ display: flex;
130
+ align-items: center;
131
+ gap: 0.5rem;
132
+ padding: 0.35rem 0.75rem;
133
+ background-color: transparent; /* Cleaner flat base */
134
+ border: 1px solid transparent; /* Invisible border initially */
135
+ border-radius: var(--ld-radius-full);
136
+ backdrop-filter: blur(12px);
137
+ -webkit-backdrop-filter: blur(12px);
138
+ color: var(--ld-text-dim);
139
+ font-size: 0.8125rem;
140
+ min-width: 220px;
141
+ cursor: pointer;
142
+ transition: all 0.2s;
143
+ }
144
+
145
+ .navbar-search:hover {
146
+ background-color: var(--ld-bg-mute);
147
+ color: var(--ld-text-muted);
148
+ }
149
+
150
+ .navbar-search svg {
151
+ width: 15px;
152
+ height: 15px;
153
+ opacity: 0.7;
154
+ }
155
+
156
+ .navbar-search kbd {
157
+ margin-left: auto;
158
+ padding: 0.15rem 0.4rem;
159
+ font-family: var(--ld-font-sans);
160
+ font-weight: 500;
161
+ font-size: 0.65rem;
162
+ background-color: var(--ld-bg-mute);
163
+ border: 1px solid var(--ld-border-strong);
164
+ border-radius: var(--ld-radius-md);
165
+ color: var(--ld-text-dim);
166
+ }
167
+
168
+ /* ─── Github Stars Pill ────────────────────────────────── */
169
+ .navbar-github-stars {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 0.35rem;
173
+ padding: 0.3rem 0.65rem;
174
+ border-radius: var(--ld-radius-full);
175
+ border: 1px solid var(--ld-border-subtle);
176
+ background: var(--ld-bg-soft);
177
+ color: var(--ld-text-muted);
178
+ text-decoration: none;
179
+ font-size: 0.8rem;
180
+ font-weight: 500;
181
+ transition: all 0.2s;
182
+ }
183
+
184
+ .navbar-github-stars:hover {
185
+ color: var(--ld-text-main);
186
+ background: var(--ld-bg-mute);
187
+ border-color: var(--ld-border-strong);
188
+ }
189
+
190
+ .navbar-github-stars svg {
191
+ width: 15px;
192
+ height: 15px;
193
+ }
194
+
195
+ .navbar-divider {
196
+ width: 1px;
197
+ height: 18px;
198
+ background-color: var(--ld-border-subtle);
199
+ margin: 0 0.25rem;
200
+ }
201
+
202
+ .navbar-icons {
203
+ display: flex;
204
+ align-items: center;
205
+ gap: 0.25rem;
206
+ }
207
+
208
+ .navbar-icon-btn {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: center;
212
+ width: 2.15rem;
213
+ height: 2.15rem;
214
+ background: transparent;
215
+ border: none;
216
+ cursor: pointer;
217
+ border-radius: var(--ld-radius-full);
218
+ color: var(--ld-text-muted);
219
+ text-decoration: none;
220
+ transition:
221
+ color 0.2s,
222
+ background-color 0.2s;
223
+ }
224
+
225
+ .navbar-icon-btn:hover {
226
+ color: var(--ld-text-main);
227
+ background-color: var(--ld-bg-mute);
228
+ }
229
+
230
+ .navbar-icon-btn svg {
231
+ width: 18px;
232
+ height: 18px;
233
+ }
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { Link } from "../Link";
3
+ import { ArrowLeft } from "lucide-react";
4
+
5
+ export function NotFound() {
6
+ return (
7
+ <div className="boltdocs-not-found">
8
+ <div className="not-found-content">
9
+ <span className="not-found-code">404</span>
10
+ <h1 className="not-found-title">Page Not Found</h1>
11
+ <p className="not-found-text">
12
+ The page you're looking for doesn't exist or has been moved.
13
+ </p>
14
+ <Link to="/" className="not-found-link">
15
+ <ArrowLeft size={16} /> Go to Home
16
+ </Link>
17
+ </div>
18
+ </div>
19
+ );
20
+ }
@@ -0,0 +1 @@
1
+ export { NotFound } from "./NotFound";