ardo 2.1.0 → 2.1.1

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.
@@ -134,22 +134,26 @@ function SystemIcon() {
134
134
 
135
135
  // src/ui/components/Search.tsx
136
136
  import { useState as useState2, useEffect as useEffect2, useRef, useMemo } from "react";
137
- import { Link } from "react-router";
137
+ import { Link, useNavigate } from "react-router";
138
138
  import MiniSearch from "minisearch";
139
139
  import searchDocs from "virtual:ardo/search-index";
140
- import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
140
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
141
141
  function Search() {
142
+ const navigate = useNavigate();
142
143
  const [isOpen, setIsOpen] = useState2(false);
143
144
  const [query, setQuery] = useState2("");
144
145
  const [results, setResults] = useState2([]);
145
146
  const [selectedIndex, setSelectedIndex] = useState2(0);
147
+ const containerRef = useRef(null);
146
148
  const inputRef = useRef(null);
147
149
  const themeConfig = useThemeConfig();
150
+ const hasQuery = query.trim().length > 0;
148
151
  const placeholder = themeConfig.search?.placeholder ?? "Search...";
149
152
  useEffect2(() => {
150
153
  const handleKeyDown2 = (e) => {
151
154
  if ((e.metaKey || e.ctrlKey) && e.key === "k") {
152
155
  e.preventDefault();
156
+ inputRef.current?.focus();
153
157
  setIsOpen(true);
154
158
  }
155
159
  if (e.key === "Escape") {
@@ -166,10 +170,19 @@ function Search() {
166
170
  }, [isOpen]);
167
171
  useEffect2(() => {
168
172
  if (!isOpen) {
169
- setQuery("");
170
- setResults([]);
171
- setSelectedIndex(0);
173
+ return;
172
174
  }
175
+ const handleOutsideClick = (e) => {
176
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
177
+ setIsOpen(false);
178
+ }
179
+ };
180
+ document.addEventListener("mousedown", handleOutsideClick);
181
+ document.addEventListener("touchstart", handleOutsideClick);
182
+ return () => {
183
+ document.removeEventListener("mousedown", handleOutsideClick);
184
+ document.removeEventListener("touchstart", handleOutsideClick);
185
+ };
173
186
  }, [isOpen]);
174
187
  const searchIndex = useMemo(() => {
175
188
  const index = new MiniSearch({
@@ -188,95 +201,118 @@ function Search() {
188
201
  setQuery(searchQuery);
189
202
  if (!searchQuery.trim()) {
190
203
  setResults([]);
204
+ setIsOpen(false);
205
+ setSelectedIndex(0);
191
206
  return;
192
207
  }
193
208
  const searchResults = searchIndex.search(searchQuery).slice(0, 10);
194
209
  setResults(searchResults);
195
210
  setSelectedIndex(0);
211
+ setIsOpen(true);
196
212
  };
197
213
  const handleKeyDown = (e) => {
198
- if (e.key === "ArrowDown") {
214
+ if (e.key === "ArrowDown" && results.length > 0) {
199
215
  e.preventDefault();
200
216
  setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1));
201
- } else if (e.key === "ArrowUp") {
217
+ } else if (e.key === "ArrowUp" && results.length > 0) {
202
218
  e.preventDefault();
203
219
  setSelectedIndex((prev) => Math.max(prev - 1, 0));
204
220
  } else if (e.key === "Enter" && results[selectedIndex]) {
205
221
  e.preventDefault();
206
222
  const result = results[selectedIndex];
207
- window.location.href = result.path;
223
+ navigate(result.path);
224
+ setIsOpen(false);
225
+ } else if (e.key === "Escape") {
208
226
  setIsOpen(false);
227
+ inputRef.current?.blur();
209
228
  }
210
229
  };
211
- return /* @__PURE__ */ jsxs3(Fragment, { children: [
212
- /* @__PURE__ */ jsxs3("button", { className: "ardo-search-button", onClick: () => setIsOpen(true), "aria-label": "Search", children: [
213
- /* @__PURE__ */ jsx3(SearchIcon, {}),
214
- /* @__PURE__ */ jsx3("span", { className: "ardo-search-button-text", children: placeholder }),
215
- /* @__PURE__ */ jsxs3("span", { className: "ardo-search-kbd", children: [
216
- /* @__PURE__ */ jsx3("kbd", { children: "\u2318" }),
217
- /* @__PURE__ */ jsx3("kbd", { children: "K" })
218
- ] })
219
- ] }),
220
- isOpen && /* @__PURE__ */ jsx3("div", { className: "ardo-search-modal", onClick: () => setIsOpen(false), children: /* @__PURE__ */ jsxs3("div", { className: "ardo-search-dialog", onClick: (e) => e.stopPropagation(), children: [
221
- /* @__PURE__ */ jsxs3("div", { className: "ardo-search-input-wrapper", children: [
222
- /* @__PURE__ */ jsx3(SearchIcon, {}),
223
- /* @__PURE__ */ jsx3(
224
- "input",
225
- {
226
- ref: inputRef,
227
- type: "text",
228
- className: "ardo-search-input",
229
- placeholder,
230
- value: query,
231
- onChange: (e) => handleSearch(e.target.value),
232
- onKeyDown: handleKeyDown
233
- }
234
- ),
235
- query && /* @__PURE__ */ jsx3(
236
- "button",
237
- {
238
- className: "ardo-search-clear",
239
- onClick: () => handleSearch(""),
240
- "aria-label": "Clear search",
241
- children: "\xD7"
242
- }
243
- )
244
- ] }),
245
- results.length > 0 && /* @__PURE__ */ jsx3("ul", { className: "ardo-search-results", children: results.map((result, index) => /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsxs3(
246
- Link,
247
- {
248
- to: result.path,
249
- className: ["ardo-search-result", index === selectedIndex && "selected"].filter(Boolean).join(" "),
250
- onClick: () => setIsOpen(false),
251
- children: [
252
- /* @__PURE__ */ jsx3("span", { className: "ardo-search-result-title", children: result.title }),
253
- result.section && /* @__PURE__ */ jsx3("span", { className: "ardo-search-result-section", children: result.section })
254
- ]
255
- }
256
- ) }, result.id)) }),
257
- query && results.length === 0 && /* @__PURE__ */ jsxs3("div", { className: "ardo-search-no-results", children: [
258
- 'No results found for "',
259
- query,
260
- '"'
261
- ] }),
262
- /* @__PURE__ */ jsxs3("div", { className: "ardo-search-footer", children: [
263
- /* @__PURE__ */ jsxs3("span", { children: [
264
- /* @__PURE__ */ jsx3("kbd", { children: "\u2191" }),
265
- " ",
266
- /* @__PURE__ */ jsx3("kbd", { children: "\u2193" }),
267
- " to navigate"
268
- ] }),
269
- /* @__PURE__ */ jsxs3("span", { children: [
270
- /* @__PURE__ */ jsx3("kbd", { children: "\u21B5" }),
271
- " to select"
230
+ return /* @__PURE__ */ jsxs3(
231
+ "div",
232
+ {
233
+ className: "ardo-search",
234
+ ref: containerRef,
235
+ "data-expanded": isOpen || hasQuery ? "true" : "false",
236
+ onClick: () => inputRef.current?.focus(),
237
+ children: [
238
+ /* @__PURE__ */ jsxs3("div", { className: "ardo-search-field", children: [
239
+ /* @__PURE__ */ jsx3(SearchIcon, {}),
240
+ /* @__PURE__ */ jsx3(
241
+ "input",
242
+ {
243
+ ref: inputRef,
244
+ type: "text",
245
+ className: "ardo-search-input",
246
+ placeholder,
247
+ value: query,
248
+ onChange: (e) => handleSearch(e.target.value),
249
+ onKeyDown: handleKeyDown,
250
+ onFocus: () => {
251
+ if (hasQuery) {
252
+ setIsOpen(true);
253
+ }
254
+ },
255
+ "aria-expanded": isOpen,
256
+ "aria-label": "Search"
257
+ }
258
+ ),
259
+ query && /* @__PURE__ */ jsx3(
260
+ "button",
261
+ {
262
+ type: "button",
263
+ className: "ardo-search-clear",
264
+ onClick: (e) => {
265
+ e.stopPropagation();
266
+ handleSearch("");
267
+ inputRef.current?.focus();
268
+ },
269
+ "aria-label": "Clear search",
270
+ children: "\xD7"
271
+ }
272
+ ),
273
+ /* @__PURE__ */ jsxs3("span", { className: "ardo-search-kbd", children: [
274
+ /* @__PURE__ */ jsx3("kbd", { children: "\u2318" }),
275
+ /* @__PURE__ */ jsx3("kbd", { children: "K" })
276
+ ] })
272
277
  ] }),
273
- /* @__PURE__ */ jsxs3("span", { children: [
274
- /* @__PURE__ */ jsx3("kbd", { children: "esc" }),
275
- " to close"
278
+ isOpen && hasQuery && /* @__PURE__ */ jsxs3("div", { className: "ardo-search-popover", children: [
279
+ results.length > 0 && /* @__PURE__ */ jsx3("ul", { className: "ardo-search-results", children: results.map((result, index) => /* @__PURE__ */ jsx3("li", { children: /* @__PURE__ */ jsxs3(
280
+ Link,
281
+ {
282
+ to: result.path,
283
+ className: ["ardo-search-result", index === selectedIndex && "selected"].filter(Boolean).join(" "),
284
+ onClick: () => setIsOpen(false),
285
+ children: [
286
+ /* @__PURE__ */ jsx3("span", { className: "ardo-search-result-title", children: result.title }),
287
+ result.section && /* @__PURE__ */ jsx3("span", { className: "ardo-search-result-section", children: result.section })
288
+ ]
289
+ }
290
+ ) }, result.id)) }),
291
+ query && results.length === 0 && /* @__PURE__ */ jsxs3("div", { className: "ardo-search-no-results", children: [
292
+ 'No results found for "',
293
+ query,
294
+ '"'
295
+ ] }),
296
+ /* @__PURE__ */ jsxs3("div", { className: "ardo-search-footer", children: [
297
+ /* @__PURE__ */ jsxs3("span", { children: [
298
+ /* @__PURE__ */ jsx3("kbd", { children: "\u2191" }),
299
+ " ",
300
+ /* @__PURE__ */ jsx3("kbd", { children: "\u2193" }),
301
+ " to navigate"
302
+ ] }),
303
+ /* @__PURE__ */ jsxs3("span", { children: [
304
+ /* @__PURE__ */ jsx3("kbd", { children: "\u21B5" }),
305
+ " to select"
306
+ ] }),
307
+ /* @__PURE__ */ jsxs3("span", { children: [
308
+ /* @__PURE__ */ jsx3("kbd", { children: "esc" }),
309
+ " to close"
310
+ ] })
311
+ ] })
276
312
  ] })
277
- ] })
278
- ] }) })
279
- ] });
313
+ ]
314
+ }
315
+ );
280
316
  }
281
317
  function SearchIcon() {
282
318
  return /* @__PURE__ */ jsxs3(
@@ -530,13 +566,13 @@ function checkChildrenActive(children, currentPath) {
530
566
  }
531
567
 
532
568
  // src/ui/Footer.tsx
533
- import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
569
+ import { Fragment, jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
534
570
  function Footer({ message, copyright, children, className }) {
535
571
  const hasContent = message || copyright || children;
536
572
  if (!hasContent) {
537
573
  return null;
538
574
  }
539
- return /* @__PURE__ */ jsx6("footer", { className: className ?? "ardo-footer", children: /* @__PURE__ */ jsx6("div", { className: "ardo-footer-container", children: children ?? /* @__PURE__ */ jsxs6(Fragment2, { children: [
575
+ return /* @__PURE__ */ jsx6("footer", { className: className ?? "ardo-footer", children: /* @__PURE__ */ jsx6("div", { className: "ardo-footer-container", children: children ?? /* @__PURE__ */ jsxs6(Fragment, { children: [
540
576
  message && /* @__PURE__ */ jsx6("p", { className: "ardo-footer-message", dangerouslySetInnerHTML: { __html: message } }),
541
577
  copyright && /* @__PURE__ */ jsx6(
542
578
  "p",
@@ -859,4 +895,4 @@ export {
859
895
  FeatureCard,
860
896
  Features
861
897
  };
862
- //# sourceMappingURL=chunk-QC2JA663.js.map
898
+ //# sourceMappingURL=chunk-6U5CYV74.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/Layout.tsx","../src/ui/Header.tsx","../src/ui/components/ThemeToggle.tsx","../src/ui/components/Search.tsx","../src/ui/Sidebar.tsx","../src/ui/Footer.tsx","../src/ui/Nav.tsx","../src/ui/TOC.tsx","../src/ui/DocPage.tsx","../src/ui/HomePage.tsx","../src/ui/components/Hero.tsx","../src/ui/components/Features.tsx"],"sourcesContent":["import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Layout Component\n// =============================================================================\n\nexport interface LayoutProps {\n /** Header content */\n header?: ReactNode\n /** Sidebar content */\n sidebar?: ReactNode\n /** Footer content */\n footer?: ReactNode\n /** Main content */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Layout component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Layout\n * header={<Header logo=\"/logo.svg\" title=\"Ardo\" nav={...} />}\n * sidebar={<Sidebar>...</Sidebar>}\n * footer={<Footer message=\"MIT License\" />}\n * >\n * <Outlet />\n * </Layout>\n * ```\n */\nexport function Layout({ header, sidebar, footer, children, className }: LayoutProps) {\n return (\n <div className={className ?? \"ardo-layout\"}>\n {header}\n <div className=\"ardo-layout-container\">\n {sidebar}\n <main className=\"ardo-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\nimport { ThemeToggle } from \"./components/ThemeToggle\"\nimport { Search } from \"./components/Search\"\n\n// =============================================================================\n// Header Component\n// =============================================================================\n\nexport interface HeaderProps {\n /** Logo image URL or light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Site title displayed next to logo */\n title?: string\n /** Navigation content (Nav component or custom) */\n nav?: ReactNode\n /** Actions/right side content (social links, custom buttons) */\n actions?: ReactNode\n /** Show search (default: true) */\n search?: boolean\n /** Show theme toggle (default: true) */\n themeToggle?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Header component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Header\n * logo=\"/logo.svg\"\n * title=\"Ardo\"\n * nav={\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * </Nav>\n * }\n * actions={\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * }\n * />\n * ```\n */\nexport function Header({\n logo,\n title,\n nav,\n actions,\n search = true,\n themeToggle = true,\n className,\n}: HeaderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <header className={className ?? \"ardo-header\"}>\n <div className=\"ardo-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"ardo-header-left\">\n <button\n className=\"ardo-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"ardo-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"ardo-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"ardo-logo\"\n />\n )}\n {title && <span className=\"ardo-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"ardo-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"ardo-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"ardo-mobile-menu\">\n <nav className=\"ardo-mobile-nav\" onClick={() => setMobileMenuOpen(false)}>\n {nav}\n </nav>\n </div>\n )}\n </header>\n )\n}\n\n// =============================================================================\n// SocialLink Component\n// =============================================================================\n\nexport interface SocialLinkProps {\n /** URL to link to */\n href: string\n /** Social icon type */\n icon: \"github\" | \"twitter\" | \"discord\" | \"linkedin\" | \"youtube\" | \"npm\"\n /** Accessible label */\n ariaLabel?: string\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Social media link with icon.\n *\n * @example\n * ```tsx\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * ```\n */\nexport function SocialLink({ href, icon, ariaLabel, className }: SocialLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className ?? \"ardo-social-link\"}\n aria-label={ariaLabel ?? icon}\n >\n <SocialIcon icon={icon} />\n </a>\n )\n}\n\n// =============================================================================\n// Social Icon Component (internal)\n// =============================================================================\n\nfunction SocialIcon({ icon }: { icon: string }) {\n const icons: Record<string, string> = {\n github:\n \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.604-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.163 22 16.418 22 12c0-5.523-4.477-10-10-10z\",\n twitter:\n \"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\",\n discord:\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\n linkedin:\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\n youtube:\n \"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\n npm: \"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\",\n }\n\n const path = icons[icon] || icons.github\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d={path} />\n </svg>\n )\n}\n","import { useState, useEffect } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<Theme>(\"system\")\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const stored = localStorage.getItem(\"ardo-theme\") as Theme | null\n if (stored) {\n setTheme(stored)\n applyTheme(stored)\n } else {\n applyTheme(\"system\")\n }\n }, [])\n\n const toggleTheme = () => {\n const nextTheme: Theme = theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"\n setTheme(nextTheme)\n localStorage.setItem(\"ardo-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"ardo-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"ardo-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"ardo-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"ardo-theme-icon\">\n {theme === \"light\" && <SunIcon />}\n {theme === \"dark\" && <MoonIcon />}\n {theme === \"system\" && <SystemIcon />}\n </span>\n </button>\n )\n}\n\nfunction applyTheme(theme: Theme) {\n const root = document.documentElement\n\n if (theme === \"system\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n root.classList.toggle(\"dark\", isDark)\n root.classList.toggle(\"light\", !isDark)\n } else {\n root.classList.toggle(\"dark\", theme === \"dark\")\n root.classList.toggle(\"light\", theme === \"light\")\n }\n}\n\nfunction SunIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n )\n}\n\nfunction MoonIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n )\n}\n\nfunction SystemIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\"\nimport { Link, useNavigate } from \"react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\nimport searchDocs from \"virtual:ardo/search-index\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nexport function Search() {\n const navigate = useNavigate()\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchResult[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\n const hasQuery = query.trim().length > 0\n\n const placeholder = themeConfig.search?.placeholder ?? \"Search...\"\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n inputRef.current?.focus()\n setIsOpen(true)\n }\n\n if (e.key === \"Escape\") {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"mousedown\", handleOutsideClick)\n document.addEventListener(\"touchstart\", handleOutsideClick)\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick)\n document.removeEventListener(\"touchstart\", handleOutsideClick)\n }\n }, [isOpen])\n\n // Build search index from virtual module data\n const searchIndex = useMemo(() => {\n const index = new MiniSearch<SearchDoc>({\n fields: [\"title\", \"content\", \"section\"],\n storeFields: [\"title\", \"path\", \"section\"],\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n })\n index.addAll(searchDocs as SearchDoc[])\n return index\n }, [])\n\n const handleSearch = (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n setIsOpen(false)\n setSelectedIndex(0)\n return\n }\n\n const searchResults = searchIndex.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n setIsOpen(true)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n } else if (e.key === \"Enter\" && results[selectedIndex]) {\n e.preventDefault()\n const result = results[selectedIndex]\n navigate(result.path as string)\n setIsOpen(false)\n } else if (e.key === \"Escape\") {\n setIsOpen(false)\n inputRef.current?.blur()\n }\n }\n\n return (\n <div\n className=\"ardo-search\"\n ref={containerRef}\n data-expanded={isOpen || hasQuery ? \"true\" : \"false\"}\n onClick={() => inputRef.current?.focus()}\n >\n <div className=\"ardo-search-field\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"ardo-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (hasQuery) {\n setIsOpen(true)\n }\n }}\n aria-expanded={isOpen}\n aria-label=\"Search\"\n />\n {query && (\n <button\n type=\"button\"\n className=\"ardo-search-clear\"\n onClick={(e) => {\n e.stopPropagation()\n handleSearch(\"\")\n inputRef.current?.focus()\n }}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n <span className=\"ardo-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </div>\n\n {isOpen && hasQuery && (\n <div className=\"ardo-search-popover\">\n {results.length > 0 && (\n <ul className=\"ardo-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"ardo-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"ardo-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"ardo-search-result-section\">{result.section as string}</span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"ardo-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"ardo-search-footer\">\n <span>\n <kbd>↑</kbd> <kbd>↓</kbd> to navigate\n </span>\n <span>\n <kbd>↵</kbd> to select\n </span>\n <span>\n <kbd>esc</kbd> to close\n </span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction SearchIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n","import {\n useState,\n type ReactNode,\n type ComponentProps,\n Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof NavLink>[\"to\"]\n\n// =============================================================================\n// Sidebar Context\n// =============================================================================\n\ninterface SidebarContextValue {\n currentPath: string\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({ currentPath: \"\" })\n\nfunction useSidebarContext() {\n return useContext(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface SidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n// =============================================================================\n// Sidebar Main Component\n// =============================================================================\n\n/**\n * Sidebar component supporting both data-driven and JSX composition patterns.\n *\n * @example Data-driven (items prop)\n * ```tsx\n * <Sidebar items={[\n * { text: 'Introduction', link: '/intro' },\n * { text: 'Guide', items: [\n * { text: 'Getting Started', link: '/guide/getting-started' }\n * ]}\n * ]} />\n * ```\n *\n * @example JSX composition\n * ```tsx\n * <Sidebar>\n * <SidebarLink to=\"/intro\">Introduction</SidebarLink>\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * </SidebarGroup>\n * </Sidebar>\n * ```\n */\nexport function Sidebar({ items, children, className }: SidebarProps) {\n const { pathname } = useLocation()\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"ardo-sidebar\"}>\n <nav className=\"ardo-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-0\">{children}</ul>\n )}\n </nav>\n </aside>\n </SidebarContext.Provider>\n )\n}\n\n// =============================================================================\n// SidebarGroup Component\n// =============================================================================\n\nexport interface SidebarGroupProps {\n /** Group title */\n title: string\n /** Optional link for the group title */\n to?: string\n /** Initial collapsed state (default: false) */\n collapsed?: boolean\n /** Whether group is collapsible (default: true if has children) */\n collapsible?: boolean\n /** Children (SidebarLink, nested SidebarGroup) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Group component for organizing sidebar links.\n *\n * @example\n * ```tsx\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/intro\">Introduction</SidebarLink>\n * <SidebarLink to=\"/guide/setup\">Setup</SidebarLink>\n * </SidebarGroup>\n * ```\n *\n * @example With collapsible state\n * ```tsx\n * <SidebarGroup title=\"Advanced\" collapsed>\n * <SidebarLink to=\"/advanced/config\">Configuration</SidebarLink>\n * </SidebarGroup>\n * ```\n */\nexport function SidebarGroup({\n title,\n to,\n collapsed: initialCollapsed = false,\n collapsible = true,\n children,\n className,\n}: SidebarGroupProps) {\n const [collapsed, setCollapsed] = useState(initialCollapsed)\n const { currentPath } = useSidebarContext()\n\n // Check if any child is active\n const isChildActive = checkChildrenActive(children, currentPath)\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const hasChildren = Children.count(children) > 0\n\n return (\n <li className={className ?? \"ardo-sidebar-item\"}>\n <div className=\"ardo-sidebar-item-header\">\n {to ? (\n <NavLink\n to={to}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {title}\n </NavLink>\n ) : (\n <span\n className={textClassName}\n onClick={() => collapsible && hasChildren && setCollapsed(!collapsed)}\n style={collapsible && hasChildren ? { cursor: \"pointer\" } : undefined}\n >\n {title}\n </span>\n )}\n\n {collapsible && hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to: RoutePath\n /** Link text */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Sidebar navigation link.\n *\n * @example\n * ```tsx\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * ```\n */\nexport function SidebarLink({ to, children, className }: SidebarLinkProps) {\n const baseClassName = className ?? \"ardo-sidebar-link\"\n return (\n <li className=\"ardo-sidebar-item\">\n <NavLink\n to={to}\n className={({ isActive }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {children}\n </NavLink>\n </li>\n )\n}\n\n// =============================================================================\n// Internal: Data-driven sidebar rendering\n// =============================================================================\n\ninterface SidebarItemsProps {\n items: SidebarItemType[]\n depth: number\n}\n\nfunction SidebarItems({ items, depth }: SidebarItemsProps) {\n return (\n <ul className={`ardo-sidebar-list ardo-sidebar-list-${depth}`}>\n {items.map((item, index) => (\n <SidebarItemComponent key={index} item={item} depth={depth} />\n ))}\n </ul>\n )\n}\n\ninterface SidebarItemComponentProps {\n item: SidebarItemType\n depth: number\n}\n\nfunction SidebarItemComponent({ item, depth }: SidebarItemComponentProps) {\n const { currentPath } = useSidebarContext()\n const [collapsed, setCollapsed] = useState(item.collapsed ?? false)\n\n const hasChildren = item.items && item.items.length > 0\n\n const isChildActive =\n hasChildren &&\n item.items!.some(\n (child) =>\n child.link === currentPath ||\n (child.items && child.items.some((grandchild) => grandchild.link === currentPath))\n )\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"ardo-sidebar-item\">\n <div className=\"ardo-sidebar-item-header\">\n {item.link ? (\n <NavLink\n to={item.link}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </NavLink>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && <SidebarItems items={item.items!} depth={depth + 1} />}\n </li>\n )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction checkChildrenActive(children: ReactNode, currentPath: string): boolean {\n let isActive = false\n\n Children.forEach(children, (child) => {\n if (isActive) return\n\n if (isValidElement(child)) {\n // Check SidebarLink\n if (child.type === SidebarLink && (child.props as SidebarLinkProps).to === currentPath) {\n isActive = true\n return\n }\n\n // Check nested SidebarGroup\n if (child.type === SidebarGroup) {\n const groupProps = child.props as SidebarGroupProps\n if (groupProps.to === currentPath) {\n isActive = true\n return\n }\n if (groupProps.children && checkChildrenActive(groupProps.children, currentPath)) {\n isActive = true\n return\n }\n }\n }\n })\n\n return isActive\n}\n","import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Footer Component\n// =============================================================================\n\nexport interface FooterProps {\n /** Footer message (supports HTML string) */\n message?: string\n /** Copyright text (supports HTML string) */\n copyright?: string\n /** Custom content (overrides message/copyright) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Footer component with message and copyright props.\n *\n * @example Simple usage\n * ```tsx\n * <Footer message=\"MIT License\" copyright=\"2026 Sebastian Software\" />\n * ```\n *\n * @example With HTML\n * ```tsx\n * <Footer\n * message=\"Built with <a href='...'>Ardo</a>\"\n * copyright=\"Copyright &copy; 2026\"\n * />\n * ```\n *\n * @example Custom content\n * ```tsx\n * <Footer>\n * <CustomFooterContent />\n * </Footer>\n * ```\n */\nexport function Footer({ message, copyright, children, className }: FooterProps) {\n const hasContent = message || copyright || children\n\n if (!hasContent) {\n return null\n }\n\n return (\n <footer className={className ?? \"ardo-footer\"}>\n <div className=\"ardo-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"ardo-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"ardo-footer-copyright\"\n dangerouslySetInnerHTML={{ __html: copyright }}\n />\n )}\n </>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface FooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface FooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { type ReactNode, type ComponentProps, useState, createContext, useContext } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof RouterNavLink>[\"to\"]\n\n// Nav context for shared state\ninterface NavContextValue {\n mobileMenuOpen: boolean\n setMobileMenuOpen: (open: boolean) => void\n}\n\nconst NavContext = createContext<NavContextValue | null>(null)\n\nfunction useNavContext() {\n return useContext(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface NavProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Navigation container component for composing navigation links.\n *\n * @example\n * ```tsx\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * </Nav>\n * ```\n */\nexport function Nav({ children, className }: NavProps) {\n return <nav className={className ?? \"ardo-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to?: RoutePath\n /** External URL (uses anchor tag) */\n href?: string\n /** Link text or children */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Active state match pattern */\n activeMatch?: string\n}\n\n/**\n * Navigation link component supporting both internal routes and external URLs.\n *\n * @example\n * ```tsx\n * // Internal link\n * <NavLink to=\"/guide\">Guide</NavLink>\n *\n * // External link\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * ```\n */\nexport function NavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"ardo-nav-link\"\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (href) {\n return (\n <a\n href={href}\n className={baseClassName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n >\n {children}\n </a>\n )\n }\n\n // Internal link\n if (to) {\n return (\n <RouterNavLink\n to={to}\n className={({ isActive }: { isActive: boolean }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n onClick={handleClick}\n >\n {children}\n </RouterNavLink>\n )\n }\n\n // Text-only (no link)\n return <span className={baseClassName}>{children}</span>\n}\n\n// =============================================================================\n// NavDropdown Component\n// =============================================================================\n\nexport interface NavDropdownProps {\n /** Dropdown trigger text */\n text: string\n /** Dropdown items */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Dropdown navigation menu for grouping related links.\n *\n * @example\n * ```tsx\n * <NavDropdown text=\"Resources\">\n * <NavLink to=\"/docs\">Documentation</NavLink>\n * <NavLink to=\"/blog\">Blog</NavLink>\n * </NavDropdown>\n * ```\n */\nexport function NavDropdown({ text, children, className }: NavDropdownProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <div\n className={className ?? \"ardo-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"ardo-nav-dropdown-button\">\n {text}\n <span className=\"ardo-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"ardo-nav-dropdown-menu\">{children}</div>}\n </div>\n )\n}\n\n// =============================================================================\n// NavProvider Component\n// =============================================================================\n\nexport interface NavProviderProps {\n children: ReactNode\n}\n\n/**\n * Provider for Nav context (mobile menu state).\n * Used internally by Header component.\n */\nexport function NavProvider({ children }: NavProviderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <NavContext.Provider value={{ mobileMenuOpen, setMobileMenuOpen }}>\n {children}\n </NavContext.Provider>\n )\n}\n\n// Export context hook for external use\nexport { useNavContext }\n","import { useState, useEffect } from \"react\"\nimport { useTOC, useThemeConfig } from \"../runtime/hooks\"\nimport type { TOCItem } from \"../config/types\"\n\nexport function TOC() {\n const toc = useTOC()\n const themeConfig = useThemeConfig()\n const [activeId, setActiveId] = useState<string>(\"\")\n\n const label = themeConfig.outline?.label ?? \"On this page\"\n\n useEffect(() => {\n if (toc.length === 0) return\n\n const headingElements = toc.map((item) => document.getElementById(item.id)).filter(Boolean)\n\n if (headingElements.length === 0) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n break\n }\n }\n },\n {\n rootMargin: \"-80px 0px -80% 0px\",\n threshold: 0,\n }\n )\n\n headingElements.forEach((el) => el && observer.observe(el))\n\n return () => {\n headingElements.forEach((el) => el && observer.unobserve(el))\n }\n }, [toc])\n\n if (toc.length === 0) {\n return null\n }\n\n return (\n <aside className=\"ardo-toc\">\n <div className=\"ardo-toc-container\">\n <h3 className=\"ardo-toc-title\">{label}</h3>\n <nav className=\"ardo-toc-nav\">\n <TOCItems items={toc} activeId={activeId} />\n </nav>\n </div>\n </aside>\n )\n}\n\ninterface TOCItemsProps {\n items: TOCItem[]\n activeId: string\n}\n\nfunction TOCItems({ items, activeId }: TOCItemsProps) {\n return (\n <ul className=\"ardo-toc-list\">\n {items.map((item) => (\n <TOCItemComponent key={item.id} item={item} activeId={activeId} />\n ))}\n </ul>\n )\n}\n\ninterface TOCItemComponentProps {\n item: TOCItem\n activeId: string\n}\n\nfunction TOCItemComponent({ item, activeId }: TOCItemComponentProps) {\n const isActive = item.id === activeId\n const hasActiveChild = hasActiveDescendant(item, activeId)\n\n return (\n <li className=\"ardo-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `ardo-toc-link ardo-toc-link-${item.level}`,\n isActive && \"active\",\n hasActiveChild && \"child-active\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.preventDefault()\n const element = document.getElementById(item.id)\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" })\n window.history.pushState(null, \"\", `#${item.id}`)\n }\n }}\n >\n {item.text}\n </a>\n {item.children && item.children.length > 0 && (\n <TOCItems items={item.children} activeId={activeId} />\n )}\n </li>\n )\n}\n\nfunction hasActiveDescendant(item: TOCItem, activeId: string): boolean {\n if (!item.children) return false\n\n for (const child of item.children) {\n if (child.id === activeId) return true\n if (hasActiveDescendant(child, activeId)) return true\n }\n\n return false\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData } from \"../runtime/hooks\"\nimport { Layout } from \"./Layout\"\nimport { Content } from \"./Content\"\nimport { TOC } from \"./TOC\"\n\n// =============================================================================\n// DocPage Component (includes Layout - for backwards compatibility)\n// =============================================================================\n\ninterface DocPageProps {\n children: ReactNode\n}\n\n/**\n * Full documentation page with Layout wrapper.\n * Use this when you don't have a _layout.tsx file.\n *\n * @example\n * ```tsx\n * <DocPage>\n * <Content />\n * </DocPage>\n * ```\n */\nexport function DocPage({ children }: DocPageProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <Layout>\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n </Layout>\n )\n}\n\n// =============================================================================\n// DocContent Component (without Layout - for use with _layout.tsx)\n// =============================================================================\n\ninterface DocContentProps {\n children: ReactNode\n}\n\n/**\n * Documentation content without Layout wrapper.\n * Use this when you have a _layout.tsx that provides the Layout.\n *\n * @example\n * ```tsx\n * // In _layout.tsx:\n * <Layout>\n * <Header ... />\n * <Sidebar ... />\n * <Outlet />\n * <Footer ... />\n * </Layout>\n *\n * // In page routes:\n * <DocContent>\n * <MarkdownContent />\n * </DocContent>\n * ```\n */\nexport function DocContent({ children }: DocContentProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n )\n}\n\n// =============================================================================\n// DocLayout Component (legacy alias)\n// =============================================================================\n\ninterface DocLayoutProps {\n content: ReactNode\n}\n\n/**\n * @deprecated Use DocPage or DocContent instead\n */\nexport function DocLayout({ content }: DocLayoutProps) {\n return <DocPage>{content}</DocPage>\n}\n","import { Link } from \"react-router\"\nimport { usePageData, useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport { Header, SocialLink } from \"./Header\"\nimport { Footer } from \"./Footer\"\nimport { Nav, NavLink } from \"./Nav\"\n\nexport function HomePage() {\n const pageData = usePageData()\n const config = useConfig()\n const themeConfig = useThemeConfig()\n\n const hero = pageData?.frontmatter.hero\n const features = pageData?.frontmatter.features\n\n return (\n <div className=\"ardo-home\">\n <Header\n logo={themeConfig.logo}\n title={themeConfig.siteTitle !== false ? config.title : undefined}\n nav={\n themeConfig.nav && themeConfig.nav.length > 0 ? (\n <Nav>\n {themeConfig.nav.map((item, index) => (\n <NavLink key={index} to={item.link}>\n {item.text}\n </NavLink>\n ))}\n </Nav>\n ) : undefined\n }\n actions={themeConfig.socialLinks?.map((link, index) => (\n <SocialLink key={index} href={link.link} icon={link.icon} ariaLabel={link.ariaLabel} />\n ))}\n />\n\n <main className=\"ardo-home-main\">\n {hero && (\n <section className=\"ardo-hero\">\n <div className=\"ardo-hero-container\">\n {hero.image && (\n <div className=\"ardo-hero-image\">\n <img\n src={typeof hero.image === \"string\" ? hero.image : hero.image.light}\n alt={hero.name || config.title}\n />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {hero.name && <h1 className=\"ardo-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"ardo-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"ardo-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`}\n >\n {action.text}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {features && features.length > 0 && (\n <section className=\"ardo-features\">\n <div className=\"ardo-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"ardo-feature\">\n {feature.icon && <div className=\"ardo-feature-icon\">{feature.icon}</div>}\n <h3 className=\"ardo-feature-title\">{feature.title}</h3>\n <p className=\"ardo-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"ardo-feature-link\">\n {feature.linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n ))}\n </div>\n </section>\n )}\n </main>\n\n <Footer />\n </div>\n )\n}\n","import { type ComponentProps } from \"react\"\nimport { Link } from \"react-router\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\n/** External URL starting with http:// or https:// */\ntype ExternalUrl = `http://${string}` | `https://${string}`\n\nexport interface HeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath | ExternalUrl\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"brand\" | \"alt\"\n}\n\nexport interface HeroImage {\n /** Image for light mode */\n light: string\n /** Image for dark mode */\n dark?: string\n /** Alt text for the image */\n alt?: string\n}\n\nexport interface HeroProps {\n /** Large title displayed prominently */\n name?: string\n /** Secondary text below the name */\n text?: string\n /** Descriptive tagline */\n tagline?: string\n /** Hero image - can be a string URL or an object with light/dark variants */\n image?: string | HeroImage\n /** Call-to-action buttons */\n actions?: HeroAction[]\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Hero section component for landing pages.\n *\n * @example\n * ```tsx\n * <Hero\n * name=\"Ardo\"\n * text=\"React-first Documentation\"\n * tagline=\"Build beautiful documentation sites with React.\"\n * image=\"/logo.svg\"\n * actions={[\n * { text: \"Get Started\", link: \"/guide/getting-started\", theme: \"brand\" },\n * { text: \"GitHub\", link: \"https://github.com/...\", theme: \"alt\" }\n * ]}\n * />\n * ```\n */\nexport function Hero({ name, text, tagline, image, actions, className }: HeroProps) {\n const imageUrl = typeof image === \"string\" ? image : image?.light\n const imageAlt = typeof image === \"string\" ? name : (image?.alt ?? name)\n\n return (\n <section className={className ?? \"ardo-hero\"}>\n <div className=\"ardo-hero-container ardo-hero-animate\">\n {image && (\n <div className=\"ardo-hero-image\">\n <img src={imageUrl} alt={imageAlt} />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {name && <h1 className=\"ardo-hero-name\">{name}</h1>}\n {text && <p className=\"ardo-hero-text\">{text}</p>}\n {tagline && <p className=\"ardo-hero-tagline\">{tagline}</p>}\n\n {actions && actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {actions.map((action, index) => {\n const link = action.link\n const isExternal =\n typeof link === \"string\" &&\n (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const className = `ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`\n\n if (isExternal) {\n return (\n <a\n key={index}\n href={link}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {action.text}\n </a>\n )\n }\n\n return (\n <Link key={index} to={link} className={className}>\n {action.text}\n </Link>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import { Link } from \"react-router\"\nimport type { CSSProperties, ReactNode } from \"react\"\n\nexport interface FeatureItem {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description */\n details: string\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\n}\n\nexport interface FeaturesProps {\n /** Array of feature items to display */\n items: FeatureItem[]\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface FeatureCardProps extends FeatureItem {\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Individual feature card component.\n *\n * @example\n * ```tsx\n * import { Zap } from \"lucide-react\"\n *\n * // Using emoji\n * <FeatureCard title=\"Fast\" icon=\"⚡\" details=\"Lightning fast.\" />\n *\n * // Using Lucide icon (tree-shakeable)\n * <FeatureCard title=\"Fast\" icon={<Zap size={28} />} details=\"Lightning fast.\" />\n * ```\n */\nexport function FeatureCard({\n title,\n icon,\n details,\n link,\n linkText,\n className,\n style,\n}: FeatureCardProps & { style?: CSSProperties }) {\n return (\n <div className={className ?? \"ardo-feature\"} style={style}>\n {icon && <div className=\"ardo-feature-icon\">{icon}</div>}\n <h3 className=\"ardo-feature-title\">{title}</h3>\n <p className=\"ardo-feature-details\">{details}</p>\n {link && (\n <Link to={link} className=\"ardo-feature-link\">\n {linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <Features\n * title=\"Key Features\"\n * subtitle=\"Everything you need to build great docs\"\n * items={[\n * { title: \"React-First\", icon: \"⚛️\", details: \"Built on React.\" },\n * { title: \"Fast\", icon: \"⚡\", details: \"Powered by Vite.\" },\n * { title: \"Type-Safe\", icon: \"📝\", details: \"Full TypeScript support.\" },\n * ]}\n * />\n * ```\n */\nexport function Features({ items, title, subtitle, className }: FeaturesProps) {\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <section className={className ?? \"ardo-features\"}>\n {(title || subtitle) && (\n <div className=\"ardo-features-header\">\n {title && <h2 className=\"ardo-features-title\">{title}</h2>}\n {subtitle && <p className=\"ardo-features-subtitle\">{subtitle}</p>}\n </div>\n )}\n <div className=\"ardo-features-container\">\n {items.map((feature, index) => (\n <FeatureCard key={index} {...feature} style={{ animationDelay: `${index * 80}ms` }} />\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","useState","jsx","jsxs","jsx","jsxs","useState","createContext","useContext","jsx","jsxs","NavLink","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","Link","jsx","jsxs","NavLink","Link","Link","jsx","jsxs","className","Link","jsx","jsxs"]}
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import {
28
28
  Sidebar,
29
29
  TOC,
30
30
  ThemeToggle
31
- } from "./chunk-QC2JA663.js";
31
+ } from "./chunk-6U5CYV74.js";
32
32
  import {
33
33
  ApiHierarchy,
34
34
  ApiItem,
package/dist/ui/index.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  SocialLink,
20
20
  TOC,
21
21
  ThemeToggle
22
- } from "../chunk-QC2JA663.js";
22
+ } from "../chunk-6U5CYV74.js";
23
23
  import {
24
24
  CodeBlock,
25
25
  CodeGroup,
@@ -1147,37 +1147,40 @@ body {
1147
1147
  /* ========================================
1148
1148
  Search
1149
1149
  ======================================== */
1150
- .ardo-search-button {
1150
+ .ardo-search {
1151
+ position: relative;
1152
+ width: clamp(220px, 30vw, 360px);
1153
+ max-width: 100%;
1154
+ transition: width var(--ardo-transition-fast);
1155
+ }
1156
+
1157
+ .ardo-search-field {
1151
1158
  display: flex;
1152
1159
  align-items: center;
1153
1160
  gap: 8px;
1154
- padding: 8px 14px;
1161
+ min-height: 40px;
1162
+ padding: 8px 12px;
1155
1163
  background: var(--ardo-c-bg-soft);
1156
1164
  border: 1px solid var(--ardo-c-border);
1157
1165
  border-radius: var(--ardo-radius);
1158
- cursor: pointer;
1159
1166
  color: var(--ardo-c-text-lighter);
1160
- font-size: 14px;
1161
- transition: all var(--ardo-transition-fast);
1167
+ cursor: text;
1168
+ transition:
1169
+ border-color var(--ardo-transition-fast),
1170
+ box-shadow var(--ardo-transition-fast),
1171
+ color var(--ardo-transition-fast);
1162
1172
  }
1163
1173
 
1164
- .ardo-search-button:hover {
1174
+ .ardo-search:hover .ardo-search-field,
1175
+ .ardo-search:focus-within .ardo-search-field {
1165
1176
  border-color: var(--ardo-c-brand);
1166
1177
  color: var(--ardo-c-text-light);
1167
- }
1168
-
1169
- .ardo-search-button-text {
1170
- display: none;
1171
- }
1172
-
1173
- @media (min-width: 768px) {
1174
- .ardo-search-button-text {
1175
- display: inline;
1176
- }
1178
+ box-shadow: 0 0 0 3px oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.14);
1177
1179
  }
1178
1180
 
1179
1181
  .ardo-search-kbd {
1180
1182
  display: none;
1183
+ margin-left: 4px;
1181
1184
  }
1182
1185
 
1183
1186
  @media (min-width: 768px) {
@@ -1196,47 +1199,44 @@ body {
1196
1199
  font-family: var(--ardo-font-family);
1197
1200
  }
1198
1201
 
1199
- .ardo-search-modal {
1200
- position: fixed;
1201
- inset: 0;
1202
- background: oklch(0 0 0 / 0.4);
1203
- backdrop-filter: blur(4px);
1204
- -webkit-backdrop-filter: blur(4px);
1205
- display: flex;
1206
- align-items: flex-start;
1207
- justify-content: center;
1208
- padding-top: 100px;
1209
- z-index: 200;
1202
+ .ardo-search-input {
1203
+ flex: 1;
1204
+ min-width: 0;
1205
+ border: none;
1206
+ outline: none;
1207
+ font-size: 14px;
1208
+ background: none;
1209
+ color: var(--ardo-c-text);
1210
1210
  }
1211
1211
 
1212
- .ardo-search-dialog {
1213
- width: 100%;
1214
- max-width: 560px;
1212
+ .ardo-search-input::placeholder {
1213
+ color: var(--ardo-c-text-lighter);
1214
+ }
1215
+
1216
+ .ardo-search-input:focus-visible {
1217
+ outline: none;
1218
+ }
1219
+
1220
+ .ardo-search-popover {
1221
+ position: absolute;
1222
+ top: calc(100% + 10px);
1223
+ right: 0;
1224
+ width: min(560px, calc(100vw - 24px));
1215
1225
  background: var(--ardo-c-bg);
1216
1226
  border-radius: 16px;
1217
1227
  border: 1px solid var(--ardo-c-border);
1218
1228
  box-shadow: var(--ardo-shadow-lg);
1219
1229
  overflow: hidden;
1220
- }
1221
-
1222
- .ardo-search-input-wrapper {
1223
- display: flex;
1224
- align-items: center;
1225
- gap: 12px;
1226
- padding: 16px 20px;
1227
- border-bottom: 1px solid var(--ardo-c-border);
1228
- }
1229
-
1230
- .ardo-search-input {
1231
- flex: 1;
1232
- border: none;
1233
- outline: none;
1234
- font-size: 16px;
1235
- background: none;
1236
- color: var(--ardo-c-text);
1230
+ z-index: 210;
1237
1231
  }
1238
1232
 
1239
1233
  .ardo-search-clear {
1234
+ display: inline-flex;
1235
+ align-items: center;
1236
+ justify-content: center;
1237
+ width: 24px;
1238
+ height: 24px;
1239
+ flex-shrink: 0;
1240
1240
  background: none;
1241
1241
  border: none;
1242
1242
  cursor: pointer;
@@ -1313,6 +1313,63 @@ body {
1313
1313
  margin-right: 4px;
1314
1314
  }
1315
1315
 
1316
+ @media (max-width: 768px) {
1317
+ .ardo-search {
1318
+ width: 40px;
1319
+ }
1320
+
1321
+ .ardo-search-field {
1322
+ width: 40px;
1323
+ gap: 0;
1324
+ padding: 8px;
1325
+ }
1326
+
1327
+ .ardo-search-input {
1328
+ flex: 0 0 auto;
1329
+ width: 0;
1330
+ opacity: 0;
1331
+ pointer-events: none;
1332
+ }
1333
+
1334
+ .ardo-search-clear,
1335
+ .ardo-search-kbd {
1336
+ display: none;
1337
+ }
1338
+
1339
+ .ardo-search[data-expanded="true"],
1340
+ .ardo-search:focus-within {
1341
+ width: min(360px, calc(100vw - 20px));
1342
+ }
1343
+
1344
+ .ardo-search[data-expanded="true"] .ardo-search-field,
1345
+ .ardo-search:focus-within .ardo-search-field {
1346
+ width: 100%;
1347
+ gap: 8px;
1348
+ padding: 8px 12px;
1349
+ }
1350
+
1351
+ .ardo-search[data-expanded="true"] .ardo-search-input,
1352
+ .ardo-search:focus-within .ardo-search-input {
1353
+ flex: 1;
1354
+ opacity: 1;
1355
+ pointer-events: auto;
1356
+ }
1357
+
1358
+ .ardo-search[data-expanded="true"] .ardo-search-clear,
1359
+ .ardo-search:focus-within .ardo-search-clear {
1360
+ display: inline-flex;
1361
+ }
1362
+
1363
+ .ardo-search-popover {
1364
+ right: 0;
1365
+ width: min(420px, calc(100vw - 20px));
1366
+ }
1367
+
1368
+ .ardo-search-footer {
1369
+ display: none;
1370
+ }
1371
+ }
1372
+
1316
1373
  /* Theme toggle */
1317
1374
  .ardo-theme-toggle {
1318
1375
  display: flex;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ardo",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "React-first Static Documentation Framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/Layout.tsx","../src/ui/Header.tsx","../src/ui/components/ThemeToggle.tsx","../src/ui/components/Search.tsx","../src/ui/Sidebar.tsx","../src/ui/Footer.tsx","../src/ui/Nav.tsx","../src/ui/TOC.tsx","../src/ui/DocPage.tsx","../src/ui/HomePage.tsx","../src/ui/components/Hero.tsx","../src/ui/components/Features.tsx"],"sourcesContent":["import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Layout Component\n// =============================================================================\n\nexport interface LayoutProps {\n /** Header content */\n header?: ReactNode\n /** Sidebar content */\n sidebar?: ReactNode\n /** Footer content */\n footer?: ReactNode\n /** Main content */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Layout component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Layout\n * header={<Header logo=\"/logo.svg\" title=\"Ardo\" nav={...} />}\n * sidebar={<Sidebar>...</Sidebar>}\n * footer={<Footer message=\"MIT License\" />}\n * >\n * <Outlet />\n * </Layout>\n * ```\n */\nexport function Layout({ header, sidebar, footer, children, className }: LayoutProps) {\n return (\n <div className={className ?? \"ardo-layout\"}>\n {header}\n <div className=\"ardo-layout-container\">\n {sidebar}\n <main className=\"ardo-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\nimport { ThemeToggle } from \"./components/ThemeToggle\"\nimport { Search } from \"./components/Search\"\n\n// =============================================================================\n// Header Component\n// =============================================================================\n\nexport interface HeaderProps {\n /** Logo image URL or light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Site title displayed next to logo */\n title?: string\n /** Navigation content (Nav component or custom) */\n nav?: ReactNode\n /** Actions/right side content (social links, custom buttons) */\n actions?: ReactNode\n /** Show search (default: true) */\n search?: boolean\n /** Show theme toggle (default: true) */\n themeToggle?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Header component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Header\n * logo=\"/logo.svg\"\n * title=\"Ardo\"\n * nav={\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * </Nav>\n * }\n * actions={\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * }\n * />\n * ```\n */\nexport function Header({\n logo,\n title,\n nav,\n actions,\n search = true,\n themeToggle = true,\n className,\n}: HeaderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <header className={className ?? \"ardo-header\"}>\n <div className=\"ardo-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"ardo-header-left\">\n <button\n className=\"ardo-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"ardo-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"ardo-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"ardo-logo\"\n />\n )}\n {title && <span className=\"ardo-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"ardo-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"ardo-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"ardo-mobile-menu\">\n <nav className=\"ardo-mobile-nav\" onClick={() => setMobileMenuOpen(false)}>\n {nav}\n </nav>\n </div>\n )}\n </header>\n )\n}\n\n// =============================================================================\n// SocialLink Component\n// =============================================================================\n\nexport interface SocialLinkProps {\n /** URL to link to */\n href: string\n /** Social icon type */\n icon: \"github\" | \"twitter\" | \"discord\" | \"linkedin\" | \"youtube\" | \"npm\"\n /** Accessible label */\n ariaLabel?: string\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Social media link with icon.\n *\n * @example\n * ```tsx\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * ```\n */\nexport function SocialLink({ href, icon, ariaLabel, className }: SocialLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className ?? \"ardo-social-link\"}\n aria-label={ariaLabel ?? icon}\n >\n <SocialIcon icon={icon} />\n </a>\n )\n}\n\n// =============================================================================\n// Social Icon Component (internal)\n// =============================================================================\n\nfunction SocialIcon({ icon }: { icon: string }) {\n const icons: Record<string, string> = {\n github:\n \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.604-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.163 22 16.418 22 12c0-5.523-4.477-10-10-10z\",\n twitter:\n \"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\",\n discord:\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\n linkedin:\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\n youtube:\n \"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\n npm: \"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\",\n }\n\n const path = icons[icon] || icons.github\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d={path} />\n </svg>\n )\n}\n","import { useState, useEffect } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<Theme>(\"system\")\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const stored = localStorage.getItem(\"ardo-theme\") as Theme | null\n if (stored) {\n setTheme(stored)\n applyTheme(stored)\n } else {\n applyTheme(\"system\")\n }\n }, [])\n\n const toggleTheme = () => {\n const nextTheme: Theme = theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"\n setTheme(nextTheme)\n localStorage.setItem(\"ardo-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"ardo-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"ardo-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"ardo-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"ardo-theme-icon\">\n {theme === \"light\" && <SunIcon />}\n {theme === \"dark\" && <MoonIcon />}\n {theme === \"system\" && <SystemIcon />}\n </span>\n </button>\n )\n}\n\nfunction applyTheme(theme: Theme) {\n const root = document.documentElement\n\n if (theme === \"system\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n root.classList.toggle(\"dark\", isDark)\n root.classList.toggle(\"light\", !isDark)\n } else {\n root.classList.toggle(\"dark\", theme === \"dark\")\n root.classList.toggle(\"light\", theme === \"light\")\n }\n}\n\nfunction SunIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n )\n}\n\nfunction MoonIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n )\n}\n\nfunction SystemIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\"\nimport { Link } from \"react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\nimport searchDocs from \"virtual:ardo/search-index\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nexport function Search() {\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchResult[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\n\n const placeholder = themeConfig.search?.placeholder ?? \"Search...\"\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n setIsOpen(true)\n }\n\n if (e.key === \"Escape\") {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) {\n setQuery(\"\")\n setResults([])\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n // Build search index from virtual module data\n const searchIndex = useMemo(() => {\n const index = new MiniSearch<SearchDoc>({\n fields: [\"title\", \"content\", \"section\"],\n storeFields: [\"title\", \"path\", \"section\"],\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n })\n index.addAll(searchDocs as SearchDoc[])\n return index\n }, [])\n\n const handleSearch = (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n return\n }\n\n const searchResults = searchIndex.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n } else if (e.key === \"Enter\" && results[selectedIndex]) {\n e.preventDefault()\n const result = results[selectedIndex]\n window.location.href = result.path as string\n setIsOpen(false)\n }\n }\n\n return (\n <>\n <button className=\"ardo-search-button\" onClick={() => setIsOpen(true)} aria-label=\"Search\">\n <SearchIcon />\n <span className=\"ardo-search-button-text\">{placeholder}</span>\n <span className=\"ardo-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </button>\n\n {isOpen && (\n <div className=\"ardo-search-modal\" onClick={() => setIsOpen(false)}>\n <div className=\"ardo-search-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"ardo-search-input-wrapper\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"ardo-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {query && (\n <button\n className=\"ardo-search-clear\"\n onClick={() => handleSearch(\"\")}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n </div>\n\n {results.length > 0 && (\n <ul className=\"ardo-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"ardo-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"ardo-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"ardo-search-result-section\">\n {result.section as string}\n </span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"ardo-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"ardo-search-footer\">\n <span>\n <kbd>↑</kbd> <kbd>↓</kbd> to navigate\n </span>\n <span>\n <kbd>↵</kbd> to select\n </span>\n <span>\n <kbd>esc</kbd> to close\n </span>\n </div>\n </div>\n </div>\n )}\n </>\n )\n}\n\nfunction SearchIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n","import {\n useState,\n type ReactNode,\n type ComponentProps,\n Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof NavLink>[\"to\"]\n\n// =============================================================================\n// Sidebar Context\n// =============================================================================\n\ninterface SidebarContextValue {\n currentPath: string\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({ currentPath: \"\" })\n\nfunction useSidebarContext() {\n return useContext(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface SidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n// =============================================================================\n// Sidebar Main Component\n// =============================================================================\n\n/**\n * Sidebar component supporting both data-driven and JSX composition patterns.\n *\n * @example Data-driven (items prop)\n * ```tsx\n * <Sidebar items={[\n * { text: 'Introduction', link: '/intro' },\n * { text: 'Guide', items: [\n * { text: 'Getting Started', link: '/guide/getting-started' }\n * ]}\n * ]} />\n * ```\n *\n * @example JSX composition\n * ```tsx\n * <Sidebar>\n * <SidebarLink to=\"/intro\">Introduction</SidebarLink>\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * </SidebarGroup>\n * </Sidebar>\n * ```\n */\nexport function Sidebar({ items, children, className }: SidebarProps) {\n const { pathname } = useLocation()\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"ardo-sidebar\"}>\n <nav className=\"ardo-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-0\">{children}</ul>\n )}\n </nav>\n </aside>\n </SidebarContext.Provider>\n )\n}\n\n// =============================================================================\n// SidebarGroup Component\n// =============================================================================\n\nexport interface SidebarGroupProps {\n /** Group title */\n title: string\n /** Optional link for the group title */\n to?: string\n /** Initial collapsed state (default: false) */\n collapsed?: boolean\n /** Whether group is collapsible (default: true if has children) */\n collapsible?: boolean\n /** Children (SidebarLink, nested SidebarGroup) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Group component for organizing sidebar links.\n *\n * @example\n * ```tsx\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/intro\">Introduction</SidebarLink>\n * <SidebarLink to=\"/guide/setup\">Setup</SidebarLink>\n * </SidebarGroup>\n * ```\n *\n * @example With collapsible state\n * ```tsx\n * <SidebarGroup title=\"Advanced\" collapsed>\n * <SidebarLink to=\"/advanced/config\">Configuration</SidebarLink>\n * </SidebarGroup>\n * ```\n */\nexport function SidebarGroup({\n title,\n to,\n collapsed: initialCollapsed = false,\n collapsible = true,\n children,\n className,\n}: SidebarGroupProps) {\n const [collapsed, setCollapsed] = useState(initialCollapsed)\n const { currentPath } = useSidebarContext()\n\n // Check if any child is active\n const isChildActive = checkChildrenActive(children, currentPath)\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const hasChildren = Children.count(children) > 0\n\n return (\n <li className={className ?? \"ardo-sidebar-item\"}>\n <div className=\"ardo-sidebar-item-header\">\n {to ? (\n <NavLink\n to={to}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {title}\n </NavLink>\n ) : (\n <span\n className={textClassName}\n onClick={() => collapsible && hasChildren && setCollapsed(!collapsed)}\n style={collapsible && hasChildren ? { cursor: \"pointer\" } : undefined}\n >\n {title}\n </span>\n )}\n\n {collapsible && hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to: RoutePath\n /** Link text */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Sidebar navigation link.\n *\n * @example\n * ```tsx\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * ```\n */\nexport function SidebarLink({ to, children, className }: SidebarLinkProps) {\n const baseClassName = className ?? \"ardo-sidebar-link\"\n return (\n <li className=\"ardo-sidebar-item\">\n <NavLink\n to={to}\n className={({ isActive }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {children}\n </NavLink>\n </li>\n )\n}\n\n// =============================================================================\n// Internal: Data-driven sidebar rendering\n// =============================================================================\n\ninterface SidebarItemsProps {\n items: SidebarItemType[]\n depth: number\n}\n\nfunction SidebarItems({ items, depth }: SidebarItemsProps) {\n return (\n <ul className={`ardo-sidebar-list ardo-sidebar-list-${depth}`}>\n {items.map((item, index) => (\n <SidebarItemComponent key={index} item={item} depth={depth} />\n ))}\n </ul>\n )\n}\n\ninterface SidebarItemComponentProps {\n item: SidebarItemType\n depth: number\n}\n\nfunction SidebarItemComponent({ item, depth }: SidebarItemComponentProps) {\n const { currentPath } = useSidebarContext()\n const [collapsed, setCollapsed] = useState(item.collapsed ?? false)\n\n const hasChildren = item.items && item.items.length > 0\n\n const isChildActive =\n hasChildren &&\n item.items!.some(\n (child) =>\n child.link === currentPath ||\n (child.items && child.items.some((grandchild) => grandchild.link === currentPath))\n )\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"ardo-sidebar-item\">\n <div className=\"ardo-sidebar-item-header\">\n {item.link ? (\n <NavLink\n to={item.link}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </NavLink>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && <SidebarItems items={item.items!} depth={depth + 1} />}\n </li>\n )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction checkChildrenActive(children: ReactNode, currentPath: string): boolean {\n let isActive = false\n\n Children.forEach(children, (child) => {\n if (isActive) return\n\n if (isValidElement(child)) {\n // Check SidebarLink\n if (child.type === SidebarLink && (child.props as SidebarLinkProps).to === currentPath) {\n isActive = true\n return\n }\n\n // Check nested SidebarGroup\n if (child.type === SidebarGroup) {\n const groupProps = child.props as SidebarGroupProps\n if (groupProps.to === currentPath) {\n isActive = true\n return\n }\n if (groupProps.children && checkChildrenActive(groupProps.children, currentPath)) {\n isActive = true\n return\n }\n }\n }\n })\n\n return isActive\n}\n","import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Footer Component\n// =============================================================================\n\nexport interface FooterProps {\n /** Footer message (supports HTML string) */\n message?: string\n /** Copyright text (supports HTML string) */\n copyright?: string\n /** Custom content (overrides message/copyright) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Footer component with message and copyright props.\n *\n * @example Simple usage\n * ```tsx\n * <Footer message=\"MIT License\" copyright=\"2026 Sebastian Software\" />\n * ```\n *\n * @example With HTML\n * ```tsx\n * <Footer\n * message=\"Built with <a href='...'>Ardo</a>\"\n * copyright=\"Copyright &copy; 2026\"\n * />\n * ```\n *\n * @example Custom content\n * ```tsx\n * <Footer>\n * <CustomFooterContent />\n * </Footer>\n * ```\n */\nexport function Footer({ message, copyright, children, className }: FooterProps) {\n const hasContent = message || copyright || children\n\n if (!hasContent) {\n return null\n }\n\n return (\n <footer className={className ?? \"ardo-footer\"}>\n <div className=\"ardo-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"ardo-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"ardo-footer-copyright\"\n dangerouslySetInnerHTML={{ __html: copyright }}\n />\n )}\n </>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface FooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface FooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { type ReactNode, type ComponentProps, useState, createContext, useContext } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof RouterNavLink>[\"to\"]\n\n// Nav context for shared state\ninterface NavContextValue {\n mobileMenuOpen: boolean\n setMobileMenuOpen: (open: boolean) => void\n}\n\nconst NavContext = createContext<NavContextValue | null>(null)\n\nfunction useNavContext() {\n return useContext(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface NavProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Navigation container component for composing navigation links.\n *\n * @example\n * ```tsx\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * </Nav>\n * ```\n */\nexport function Nav({ children, className }: NavProps) {\n return <nav className={className ?? \"ardo-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to?: RoutePath\n /** External URL (uses anchor tag) */\n href?: string\n /** Link text or children */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Active state match pattern */\n activeMatch?: string\n}\n\n/**\n * Navigation link component supporting both internal routes and external URLs.\n *\n * @example\n * ```tsx\n * // Internal link\n * <NavLink to=\"/guide\">Guide</NavLink>\n *\n * // External link\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * ```\n */\nexport function NavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"ardo-nav-link\"\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (href) {\n return (\n <a\n href={href}\n className={baseClassName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n >\n {children}\n </a>\n )\n }\n\n // Internal link\n if (to) {\n return (\n <RouterNavLink\n to={to}\n className={({ isActive }: { isActive: boolean }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n onClick={handleClick}\n >\n {children}\n </RouterNavLink>\n )\n }\n\n // Text-only (no link)\n return <span className={baseClassName}>{children}</span>\n}\n\n// =============================================================================\n// NavDropdown Component\n// =============================================================================\n\nexport interface NavDropdownProps {\n /** Dropdown trigger text */\n text: string\n /** Dropdown items */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Dropdown navigation menu for grouping related links.\n *\n * @example\n * ```tsx\n * <NavDropdown text=\"Resources\">\n * <NavLink to=\"/docs\">Documentation</NavLink>\n * <NavLink to=\"/blog\">Blog</NavLink>\n * </NavDropdown>\n * ```\n */\nexport function NavDropdown({ text, children, className }: NavDropdownProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <div\n className={className ?? \"ardo-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"ardo-nav-dropdown-button\">\n {text}\n <span className=\"ardo-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"ardo-nav-dropdown-menu\">{children}</div>}\n </div>\n )\n}\n\n// =============================================================================\n// NavProvider Component\n// =============================================================================\n\nexport interface NavProviderProps {\n children: ReactNode\n}\n\n/**\n * Provider for Nav context (mobile menu state).\n * Used internally by Header component.\n */\nexport function NavProvider({ children }: NavProviderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <NavContext.Provider value={{ mobileMenuOpen, setMobileMenuOpen }}>\n {children}\n </NavContext.Provider>\n )\n}\n\n// Export context hook for external use\nexport { useNavContext }\n","import { useState, useEffect } from \"react\"\nimport { useTOC, useThemeConfig } from \"../runtime/hooks\"\nimport type { TOCItem } from \"../config/types\"\n\nexport function TOC() {\n const toc = useTOC()\n const themeConfig = useThemeConfig()\n const [activeId, setActiveId] = useState<string>(\"\")\n\n const label = themeConfig.outline?.label ?? \"On this page\"\n\n useEffect(() => {\n if (toc.length === 0) return\n\n const headingElements = toc.map((item) => document.getElementById(item.id)).filter(Boolean)\n\n if (headingElements.length === 0) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n break\n }\n }\n },\n {\n rootMargin: \"-80px 0px -80% 0px\",\n threshold: 0,\n }\n )\n\n headingElements.forEach((el) => el && observer.observe(el))\n\n return () => {\n headingElements.forEach((el) => el && observer.unobserve(el))\n }\n }, [toc])\n\n if (toc.length === 0) {\n return null\n }\n\n return (\n <aside className=\"ardo-toc\">\n <div className=\"ardo-toc-container\">\n <h3 className=\"ardo-toc-title\">{label}</h3>\n <nav className=\"ardo-toc-nav\">\n <TOCItems items={toc} activeId={activeId} />\n </nav>\n </div>\n </aside>\n )\n}\n\ninterface TOCItemsProps {\n items: TOCItem[]\n activeId: string\n}\n\nfunction TOCItems({ items, activeId }: TOCItemsProps) {\n return (\n <ul className=\"ardo-toc-list\">\n {items.map((item) => (\n <TOCItemComponent key={item.id} item={item} activeId={activeId} />\n ))}\n </ul>\n )\n}\n\ninterface TOCItemComponentProps {\n item: TOCItem\n activeId: string\n}\n\nfunction TOCItemComponent({ item, activeId }: TOCItemComponentProps) {\n const isActive = item.id === activeId\n const hasActiveChild = hasActiveDescendant(item, activeId)\n\n return (\n <li className=\"ardo-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `ardo-toc-link ardo-toc-link-${item.level}`,\n isActive && \"active\",\n hasActiveChild && \"child-active\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.preventDefault()\n const element = document.getElementById(item.id)\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" })\n window.history.pushState(null, \"\", `#${item.id}`)\n }\n }}\n >\n {item.text}\n </a>\n {item.children && item.children.length > 0 && (\n <TOCItems items={item.children} activeId={activeId} />\n )}\n </li>\n )\n}\n\nfunction hasActiveDescendant(item: TOCItem, activeId: string): boolean {\n if (!item.children) return false\n\n for (const child of item.children) {\n if (child.id === activeId) return true\n if (hasActiveDescendant(child, activeId)) return true\n }\n\n return false\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData } from \"../runtime/hooks\"\nimport { Layout } from \"./Layout\"\nimport { Content } from \"./Content\"\nimport { TOC } from \"./TOC\"\n\n// =============================================================================\n// DocPage Component (includes Layout - for backwards compatibility)\n// =============================================================================\n\ninterface DocPageProps {\n children: ReactNode\n}\n\n/**\n * Full documentation page with Layout wrapper.\n * Use this when you don't have a _layout.tsx file.\n *\n * @example\n * ```tsx\n * <DocPage>\n * <Content />\n * </DocPage>\n * ```\n */\nexport function DocPage({ children }: DocPageProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <Layout>\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n </Layout>\n )\n}\n\n// =============================================================================\n// DocContent Component (without Layout - for use with _layout.tsx)\n// =============================================================================\n\ninterface DocContentProps {\n children: ReactNode\n}\n\n/**\n * Documentation content without Layout wrapper.\n * Use this when you have a _layout.tsx that provides the Layout.\n *\n * @example\n * ```tsx\n * // In _layout.tsx:\n * <Layout>\n * <Header ... />\n * <Sidebar ... />\n * <Outlet />\n * <Footer ... />\n * </Layout>\n *\n * // In page routes:\n * <DocContent>\n * <MarkdownContent />\n * </DocContent>\n * ```\n */\nexport function DocContent({ children }: DocContentProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n )\n}\n\n// =============================================================================\n// DocLayout Component (legacy alias)\n// =============================================================================\n\ninterface DocLayoutProps {\n content: ReactNode\n}\n\n/**\n * @deprecated Use DocPage or DocContent instead\n */\nexport function DocLayout({ content }: DocLayoutProps) {\n return <DocPage>{content}</DocPage>\n}\n","import { Link } from \"react-router\"\nimport { usePageData, useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport { Header, SocialLink } from \"./Header\"\nimport { Footer } from \"./Footer\"\nimport { Nav, NavLink } from \"./Nav\"\n\nexport function HomePage() {\n const pageData = usePageData()\n const config = useConfig()\n const themeConfig = useThemeConfig()\n\n const hero = pageData?.frontmatter.hero\n const features = pageData?.frontmatter.features\n\n return (\n <div className=\"ardo-home\">\n <Header\n logo={themeConfig.logo}\n title={themeConfig.siteTitle !== false ? config.title : undefined}\n nav={\n themeConfig.nav && themeConfig.nav.length > 0 ? (\n <Nav>\n {themeConfig.nav.map((item, index) => (\n <NavLink key={index} to={item.link}>\n {item.text}\n </NavLink>\n ))}\n </Nav>\n ) : undefined\n }\n actions={themeConfig.socialLinks?.map((link, index) => (\n <SocialLink key={index} href={link.link} icon={link.icon} ariaLabel={link.ariaLabel} />\n ))}\n />\n\n <main className=\"ardo-home-main\">\n {hero && (\n <section className=\"ardo-hero\">\n <div className=\"ardo-hero-container\">\n {hero.image && (\n <div className=\"ardo-hero-image\">\n <img\n src={typeof hero.image === \"string\" ? hero.image : hero.image.light}\n alt={hero.name || config.title}\n />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {hero.name && <h1 className=\"ardo-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"ardo-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"ardo-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`}\n >\n {action.text}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {features && features.length > 0 && (\n <section className=\"ardo-features\">\n <div className=\"ardo-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"ardo-feature\">\n {feature.icon && <div className=\"ardo-feature-icon\">{feature.icon}</div>}\n <h3 className=\"ardo-feature-title\">{feature.title}</h3>\n <p className=\"ardo-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"ardo-feature-link\">\n {feature.linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n ))}\n </div>\n </section>\n )}\n </main>\n\n <Footer />\n </div>\n )\n}\n","import { type ComponentProps } from \"react\"\nimport { Link } from \"react-router\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\n/** External URL starting with http:// or https:// */\ntype ExternalUrl = `http://${string}` | `https://${string}`\n\nexport interface HeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath | ExternalUrl\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"brand\" | \"alt\"\n}\n\nexport interface HeroImage {\n /** Image for light mode */\n light: string\n /** Image for dark mode */\n dark?: string\n /** Alt text for the image */\n alt?: string\n}\n\nexport interface HeroProps {\n /** Large title displayed prominently */\n name?: string\n /** Secondary text below the name */\n text?: string\n /** Descriptive tagline */\n tagline?: string\n /** Hero image - can be a string URL or an object with light/dark variants */\n image?: string | HeroImage\n /** Call-to-action buttons */\n actions?: HeroAction[]\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Hero section component for landing pages.\n *\n * @example\n * ```tsx\n * <Hero\n * name=\"Ardo\"\n * text=\"React-first Documentation\"\n * tagline=\"Build beautiful documentation sites with React.\"\n * image=\"/logo.svg\"\n * actions={[\n * { text: \"Get Started\", link: \"/guide/getting-started\", theme: \"brand\" },\n * { text: \"GitHub\", link: \"https://github.com/...\", theme: \"alt\" }\n * ]}\n * />\n * ```\n */\nexport function Hero({ name, text, tagline, image, actions, className }: HeroProps) {\n const imageUrl = typeof image === \"string\" ? image : image?.light\n const imageAlt = typeof image === \"string\" ? name : (image?.alt ?? name)\n\n return (\n <section className={className ?? \"ardo-hero\"}>\n <div className=\"ardo-hero-container ardo-hero-animate\">\n {image && (\n <div className=\"ardo-hero-image\">\n <img src={imageUrl} alt={imageAlt} />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {name && <h1 className=\"ardo-hero-name\">{name}</h1>}\n {text && <p className=\"ardo-hero-text\">{text}</p>}\n {tagline && <p className=\"ardo-hero-tagline\">{tagline}</p>}\n\n {actions && actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {actions.map((action, index) => {\n const link = action.link\n const isExternal =\n typeof link === \"string\" &&\n (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const className = `ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`\n\n if (isExternal) {\n return (\n <a\n key={index}\n href={link}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {action.text}\n </a>\n )\n }\n\n return (\n <Link key={index} to={link} className={className}>\n {action.text}\n </Link>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import { Link } from \"react-router\"\nimport type { CSSProperties, ReactNode } from \"react\"\n\nexport interface FeatureItem {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description */\n details: string\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\n}\n\nexport interface FeaturesProps {\n /** Array of feature items to display */\n items: FeatureItem[]\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface FeatureCardProps extends FeatureItem {\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Individual feature card component.\n *\n * @example\n * ```tsx\n * import { Zap } from \"lucide-react\"\n *\n * // Using emoji\n * <FeatureCard title=\"Fast\" icon=\"⚡\" details=\"Lightning fast.\" />\n *\n * // Using Lucide icon (tree-shakeable)\n * <FeatureCard title=\"Fast\" icon={<Zap size={28} />} details=\"Lightning fast.\" />\n * ```\n */\nexport function FeatureCard({\n title,\n icon,\n details,\n link,\n linkText,\n className,\n style,\n}: FeatureCardProps & { style?: CSSProperties }) {\n return (\n <div className={className ?? \"ardo-feature\"} style={style}>\n {icon && <div className=\"ardo-feature-icon\">{icon}</div>}\n <h3 className=\"ardo-feature-title\">{title}</h3>\n <p className=\"ardo-feature-details\">{details}</p>\n {link && (\n <Link to={link} className=\"ardo-feature-link\">\n {linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <Features\n * title=\"Key Features\"\n * subtitle=\"Everything you need to build great docs\"\n * items={[\n * { title: \"React-First\", icon: \"⚛️\", details: \"Built on React.\" },\n * { title: \"Fast\", icon: \"⚡\", details: \"Powered by Vite.\" },\n * { title: \"Type-Safe\", icon: \"📝\", details: \"Full TypeScript support.\" },\n * ]}\n * />\n * ```\n */\nexport function Features({ items, title, subtitle, className }: FeaturesProps) {\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <section className={className ?? \"ardo-features\"}>\n {(title || subtitle) && (\n <div className=\"ardo-features-header\">\n {title && <h2 className=\"ardo-features-title\">{title}</h2>}\n {subtitle && <p className=\"ardo-features-subtitle\">{subtitle}</p>}\n </div>\n )}\n <div className=\"ardo-features-container\">\n {items.map((feature, index) => (\n <FeatureCard key={index} {...feature} style={{ animationDelay: `${index * 80}ms` }} />\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":";;;;;;;;;;;AAqCM,SAEE,KAFF;AAJC,SAAS,OAAO,EAAE,QAAQ,SAAS,QAAQ,UAAU,UAAU,GAAgB;AACpF,SACE,qBAAC,SAAI,WAAW,aAAa,eAC1B;AAAA;AAAA,IACD,qBAAC,SAAI,WAAU,yBACZ;AAAA;AAAA,MACD,oBAAC,UAAK,WAAU,aAAa,UAAS;AAAA,OACxC;AAAA,IACC;AAAA,KACH;AAEJ;;;AC5CA,SAAS,YAAAA,iBAAgC;AACzC,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,UAAU,iBAAiB;AA+B1B,gBAAAC,MAYJ,QAAAC,aAZI;AA3BH,SAAS,cAAc;AAC5B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,QAAQ;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,YAAU,MAAM;AACd,eAAW,IAAI;AAEf,UAAM,SAAS,aAAa,QAAQ,YAAY;AAChD,QAAI,QAAQ;AACV,eAAS,MAAM;AACf,iBAAW,MAAM;AAAA,IACnB,OAAO;AACL,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM;AACxB,UAAM,YAAmB,UAAU,UAAU,SAAS,UAAU,SAAS,WAAW;AACpF,aAAS,SAAS;AAClB,iBAAa,QAAQ,cAAc,SAAS;AAC5C,eAAW,SAAS;AAAA,EACtB;AAEA,MAAI,CAAC,SAAS;AACZ,WACE,gBAAAD,KAAC,YAAO,WAAU,qBAAoB,cAAW,gBAC/C,0BAAAA,KAAC,UAAK,WAAU,mBACd,0BAAAA,KAAC,WAAQ,GACX,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,cAAY,aAAa,UAAU,UAAU,SAAS,UAAU,SAAS,WAAW,OAAO;AAAA,MAE3F,0BAAAC,MAAC,UAAK,WAAU,mBACb;AAAA,kBAAU,WAAW,gBAAAD,KAAC,WAAQ;AAAA,QAC9B,UAAU,UAAU,gBAAAA,KAAC,YAAS;AAAA,QAC9B,UAAU,YAAY,gBAAAA,KAAC,cAAW;AAAA,SACrC;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW,OAAc;AAChC,QAAM,OAAO,SAAS;AAEtB,MAAI,UAAU,UAAU;AACtB,UAAM,SAAS,OAAO,WAAW,8BAA8B,EAAE;AACjE,SAAK,UAAU,OAAO,QAAQ,MAAM;AACpC,SAAK,UAAU,OAAO,SAAS,CAAC,MAAM;AAAA,EACxC,OAAO;AACL,SAAK,UAAU,OAAO,QAAQ,UAAU,MAAM;AAC9C,SAAK,UAAU,OAAO,SAAS,UAAU,OAAO;AAAA,EAClD;AACF;AAEA,SAAS,UAAU;AACjB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,QACpC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACtC,gBAAAA,KAAC,UAAK,IAAG,QAAO,IAAG,QAAO,IAAG,QAAO,IAAG,QAAO;AAAA,QAC9C,gBAAAA,KAAC,UAAK,IAAG,SAAQ,IAAG,SAAQ,IAAG,SAAQ,IAAG,SAAQ;AAAA,QAClD,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACtC,gBAAAA,KAAC,UAAK,IAAG,QAAO,IAAG,SAAQ,IAAG,QAAO,IAAG,SAAQ;AAAA,QAChD,gBAAAA,KAAC,UAAK,IAAG,SAAQ,IAAG,QAAO,IAAG,SAAQ,IAAG,QAAO;AAAA;AAAA;AAAA,EAClD;AAEJ;AAEA,SAAS,WAAW;AAClB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ,0BAAAA,KAAC,UAAK,GAAE,mDAAkD;AAAA;AAAA,EAC5D;AAEJ;AAEA,SAAS,aAAa;AACpB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvD,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACrC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,EACxC;AAEJ;;;ACtHA,SAAS,YAAAE,WAAU,aAAAC,YAAW,QAAQ,eAAe;AACrD,SAAS,YAAY;AAErB,OAAO,gBAAuC;AAC9C,OAAO,gBAAgB;AA8FnB,mBAEI,OAAAC,MAEA,QAAAC,aAJJ;AApFG,SAAS,SAAS;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAyB,CAAC,CAAC;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AACpD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,cAAc,eAAe;AAEnC,QAAM,cAAc,YAAY,QAAQ,eAAe;AAEvD,EAAAC,WAAU,MAAM;AACd,UAAMC,iBAAgB,CAAC,MAAqB;AAC1C,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAC7C,UAAE,eAAe;AACjB,kBAAU,IAAI;AAAA,MAChB;AAEA,UAAI,EAAE,QAAQ,UAAU;AACtB,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAWA,cAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAWA,cAAa;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,EAAAD,WAAU,MAAM;AACd,QAAI,UAAU,SAAS,SAAS;AAC9B,eAAS,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,eAAS,EAAE;AACX,iBAAW,CAAC,CAAC;AACb,uBAAiB,CAAC;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,cAAc,QAAQ,MAAM;AAChC,UAAM,QAAQ,IAAI,WAAsB;AAAA,MACtC,QAAQ,CAAC,SAAS,WAAW,SAAS;AAAA,MACtC,aAAa,CAAC,SAAS,QAAQ,SAAS;AAAA,MACxC,eAAe;AAAA,QACb,OAAO,EAAE,OAAO,EAAE;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AACD,UAAM,OAAO,UAAyB;AACtC,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,CAAC,gBAAwB;AAC5C,aAAS,WAAW;AAEpB,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB,iBAAW,CAAC,CAAC;AACb;AAAA,IACF;AAEA,UAAM,gBAAgB,YAAY,OAAO,WAAW,EAAE,MAAM,GAAG,EAAE;AACjE,eAAW,aAAa;AACxB,qBAAiB,CAAC;AAAA,EACpB;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAe;AACjB,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AAAA,IACnE,WAAW,EAAE,QAAQ,WAAW;AAC9B,QAAE,eAAe;AACjB,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAClD,WAAW,EAAE,QAAQ,WAAW,QAAQ,aAAa,GAAG;AACtD,QAAE,eAAe;AACjB,YAAM,SAAS,QAAQ,aAAa;AACpC,aAAO,SAAS,OAAO,OAAO;AAC9B,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,SACE,gBAAAF,MAAA,YACE;AAAA,oBAAAA,MAAC,YAAO,WAAU,sBAAqB,SAAS,MAAM,UAAU,IAAI,GAAG,cAAW,UAChF;AAAA,sBAAAD,KAAC,cAAW;AAAA,MACZ,gBAAAA,KAAC,UAAK,WAAU,2BAA2B,uBAAY;AAAA,MACvD,gBAAAC,MAAC,UAAK,WAAU,mBACd;AAAA,wBAAAD,KAAC,SAAI,oBAAC;AAAA,QACN,gBAAAA,KAAC,SAAI,eAAC;AAAA,SACR;AAAA,OACF;AAAA,IAEC,UACC,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,SAAS,MAAM,UAAU,KAAK,GAC/D,0BAAAC,MAAC,SAAI,WAAU,sBAAqB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GACpE;AAAA,sBAAAA,MAAC,SAAI,WAAU,6BACb;AAAA,wBAAAD,KAAC,cAAW;AAAA,QACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAU;AAAA,YACV;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,WAAW;AAAA;AAAA,QACb;AAAA,QACC,SACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,aAAa,EAAE;AAAA,YAC9B,cAAW;AAAA,YACZ;AAAA;AAAA,QAED;AAAA,SAEJ;AAAA,MAEC,QAAQ,SAAS,KAChB,gBAAAA,KAAC,QAAG,WAAU,uBACX,kBAAQ,IAAI,CAAC,QAAQ,UACpB,gBAAAA,KAAC,QACC,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,OAAO;AAAA,UACX,WAAW,CAAC,sBAAsB,UAAU,iBAAiB,UAAU,EACpE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,UAAU,KAAK;AAAA,UAE9B;AAAA,4BAAAD,KAAC,UAAK,WAAU,4BAA4B,iBAAO,OAAgB;AAAA,YAClE,OAAO,WACN,gBAAAA,KAAC,UAAK,WAAU,8BACb,iBAAO,SACV;AAAA;AAAA;AAAA,MAEJ,KAdO,OAAO,EAehB,CACD,GACH;AAAA,MAGD,SAAS,QAAQ,WAAW,KAC3B,gBAAAC,MAAC,SAAI,WAAU,0BAAyB;AAAA;AAAA,QAAuB;AAAA,QAAM;AAAA,SAAC;AAAA,MAGxE,gBAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,wBAAAA,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,UAAC,gBAAAA,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,WAC3B;AAAA,QACA,gBAAAC,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,WACd;AAAA,QACA,gBAAAC,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,iBAAG;AAAA,UAAM;AAAA,WAChB;AAAA,SACF;AAAA,OACF,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,aAAa;AACpB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAQ;AAAA;AAAA;AAAA,EAC9C;AAEJ;;;AF5HY,SACE,OAAAK,MADF,QAAAC,aAAA;AAtBL,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAAA,EACd;AACF,GAAgB;AACd,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAS,KAAK;AAE1D,SACE,gBAAAD,MAAC,YAAO,WAAW,aAAa,eAC9B;AAAA,oBAAAA,MAAC,SAAI,WAAU,yBAEb;AAAA,sBAAAA,MAAC,SAAI,WAAU,oBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,kBAAkB,CAAC,cAAc;AAAA,YAChD,cAAW;AAAA,YACX,iBAAe;AAAA,YAEf,0BAAAC,MAAC,UAAK,WAAU,kBACd;AAAA,8BAAAD,KAAC,UAAK;AAAA,cACN,gBAAAA,KAAC,UAAK;AAAA,cACN,gBAAAA,KAAC,UAAK;AAAA,eACR;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,MAACE,OAAA,EAAK,IAAG,KAAI,WAAU,kBACpB;AAAA,kBACC,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,OAAO,SAAS,WAAW,OAAO,KAAK;AAAA,cAC5C,KAAK,SAAS;AAAA,cACd,WAAU;AAAA;AAAA,UACZ;AAAA,UAED,SAAS,gBAAAA,KAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,WACrD;AAAA,SACF;AAAA,MAGC,OAAO,gBAAAA,KAAC,SAAI,WAAU,YAAY,eAAI;AAAA,MAGvC,gBAAAC,MAAC,SAAI,WAAU,qBACZ;AAAA,kBAAU,gBAAAD,KAAC,UAAO;AAAA,QAClB,eAAe,gBAAAA,KAAC,eAAY;AAAA,QAC5B;AAAA,SACH;AAAA,OACF;AAAA,IAGC,kBACC,gBAAAA,KAAC,SAAI,WAAU,oBACb,0BAAAA,KAAC,SAAI,WAAU,mBAAkB,SAAS,MAAM,kBAAkB,KAAK,GACpE,eACH,GACF;AAAA,KAEJ;AAEJ;AAyBO,SAAS,WAAW,EAAE,MAAM,MAAM,WAAW,UAAU,GAAoB;AAChF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAW,aAAa;AAAA,MACxB,cAAY,aAAa;AAAA,MAEzB,0BAAAA,KAAC,cAAW,MAAY;AAAA;AAAA,EAC1B;AAEJ;AAMA,SAAS,WAAW,EAAE,KAAK,GAAqB;AAC9C,QAAM,QAAgC;AAAA,IACpC,QACE;AAAA,IACF,SACE;AAAA,IACF,SACE;AAAA,IACF,UACE;AAAA,IACF,SACE;AAAA,IACF,KAAK;AAAA,EACP;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK,MAAM;AAElC,SACE,gBAAAA,KAAC,SAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,gBACnD,0BAAAA,KAAC,UAAK,GAAG,MAAM,GACjB;AAEJ;;;AG7KA;AAAA,EACE,YAAAI;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,mBAAmB;AAoEzB,gBAAAC,MAyEN,QAAAC,aAzEM;AAtDZ,IAAM,iBAAiB,cAAmC,EAAE,aAAa,GAAG,CAAC;AAE7E,SAAS,oBAAoB;AAC3B,SAAO,WAAW,cAAc;AAClC;AA0CO,SAAS,QAAQ,EAAE,OAAO,UAAU,UAAU,GAAiB;AACpE,QAAM,EAAE,SAAS,IAAI,YAAY;AAEjC,SACE,gBAAAD,KAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,aAAa,SAAS,GACtD,0BAAAA,KAAC,WAAM,WAAW,aAAa,gBAC7B,0BAAAA,KAAC,SAAI,WAAU,oBACZ,kBACC,gBAAAA,KAAC,gBAAa,OAAc,OAAO,GAAG,IAEtC,gBAAAA,KAAC,QAAG,WAAU,yCAAyC,UAAS,GAEpE,GACF,GACF;AAEJ;AAuCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW,mBAAmB;AAAA,EAC9B,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,gBAAgB;AAC3D,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAG1C,QAAM,gBAAgB,oBAAoB,UAAU,WAAW;AAE/D,QAAM,gBAAgB,CAAC,qBAAqB,iBAAiB,cAAc,EACxE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,gBAAgB,CAAC,qBAAqB,iBAAiB,cAAc,EACxE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,cAAc,SAAS,MAAM,QAAQ,IAAI;AAE/C,SACE,gBAAAE,MAAC,QAAG,WAAW,aAAa,qBAC1B;AAAA,oBAAAA,MAAC,SAAI,WAAU,4BACZ;AAAA,WACC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW,CAAC,EAAE,SAAS,MACrB,CAAC,eAAe,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAG/D;AAAA;AAAA,MACH,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,SAAS,MAAM,eAAe,eAAe,aAAa,CAAC,SAAS;AAAA,UACpE,OAAO,eAAe,cAAc,EAAE,QAAQ,UAAU,IAAI;AAAA,UAE3D;AAAA;AAAA,MACH;AAAA,MAGD,eAAe,eACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,yBAAyB,aAAa,WAAW,EAC1D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,UACtC,cAAY,YAAY,WAAW;AAAA,UAEnC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,QAAO;AAAA,cACP,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cAEZ,0BAAAA,KAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,UACzB;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAEC,eAAe,CAAC,aACf,gBAAAA,KAAC,QAAG,WAAU,yCAAyC,UAAS;AAAA,KAEpE;AAEJ;AAuBO,SAAS,YAAY,EAAE,IAAI,UAAU,UAAU,GAAqB;AACzE,QAAM,gBAAgB,aAAa;AACnC,SACE,gBAAAA,KAAC,QAAG,WAAU,qBACZ,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,CAAC,EAAE,SAAS,MACrB,CAAC,eAAe,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAG/D;AAAA;AAAA,EACH,GACF;AAEJ;AAWA,SAAS,aAAa,EAAE,OAAO,MAAM,GAAsB;AACzD,SACE,gBAAAA,KAAC,QAAG,WAAW,uCAAuC,KAAK,IACxD,gBAAM,IAAI,CAAC,MAAM,UAChB,gBAAAA,KAAC,wBAAiC,MAAY,SAAnB,KAAiC,CAC7D,GACH;AAEJ;AAOA,SAAS,qBAAqB,EAAE,MAAM,MAAM,GAA8B;AACxE,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,KAAK,aAAa,KAAK;AAElE,QAAM,cAAc,KAAK,SAAS,KAAK,MAAM,SAAS;AAEtD,QAAM,gBACJ,eACA,KAAK,MAAO;AAAA,IACV,CAAC,UACC,MAAM,SAAS,eACd,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC,eAAe,WAAW,SAAS,WAAW;AAAA,EACpF;AAEF,QAAM,gBAAgB,CAAC,qBAAqB,iBAAiB,cAAc,EACxE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,gBAAgB,CAAC,qBAAqB,iBAAiB,cAAc,EACxE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAE,MAAC,QAAG,WAAU,qBACZ;AAAA,oBAAAA,MAAC,SAAI,WAAU,4BACZ;AAAA,WAAK,OACJ,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,KAAK;AAAA,UACT,WAAW,CAAC,EAAE,SAAS,MACrB,CAAC,eAAe,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAG/D,eAAK;AAAA;AAAA,MACR,IAEA,gBAAAA,KAAC,UAAK,WAAW,eAAe,SAAS,MAAM,eAAe,aAAa,CAAC,SAAS,GAClF,eAAK,MACR;AAAA,MAGD,eACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,yBAAyB,aAAa,WAAW,EAC1D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,UACtC,cAAY,YAAY,WAAW;AAAA,UAEnC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,QAAO;AAAA,cACP,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cAEZ,0BAAAA,KAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,UACzB;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAEC,eAAe,CAAC,aAAa,gBAAAA,KAAC,gBAAa,OAAO,KAAK,OAAQ,OAAO,QAAQ,GAAG;AAAA,KACpF;AAEJ;AAMA,SAAS,oBAAoB,UAAqB,aAA8B;AAC9E,MAAI,WAAW;AAEf,WAAS,QAAQ,UAAU,CAAC,UAAU;AACpC,QAAI,SAAU;AAEd,QAAI,eAAe,KAAK,GAAG;AAEzB,UAAI,MAAM,SAAS,eAAgB,MAAM,MAA2B,OAAO,aAAa;AACtF,mBAAW;AACX;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,cAAc;AAC/B,cAAM,aAAa,MAAM;AACzB,YAAI,WAAW,OAAO,aAAa;AACjC,qBAAW;AACX;AAAA,QACF;AACA,YAAI,WAAW,YAAY,oBAAoB,WAAW,UAAU,WAAW,GAAG;AAChF,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACrTU,qBAAAE,WAEI,OAAAC,MAFJ,QAAAC,aAAA;AAXH,SAAS,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU,GAAgB;AAC/E,QAAM,aAAa,WAAW,aAAa;AAE3C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,KAAC,YAAO,WAAW,aAAa,eAC9B,0BAAAA,KAAC,SAAI,WAAU,yBACZ,sBACC,gBAAAC,MAAAF,WAAA,EACG;AAAA,eACC,gBAAAC,KAAC,OAAE,WAAU,uBAAsB,yBAAyB,EAAE,QAAQ,QAAQ,GAAG;AAAA,IAElF,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,yBAAyB,EAAE,QAAQ,UAAU;AAAA;AAAA,IAC/C;AAAA,KAEJ,GAEJ,GACF;AAEJ;;;AClEA,SAA8C,YAAAE,WAAU,iBAAAC,gBAAe,cAAAC,mBAAkB;AACzF,SAAS,WAAW,qBAAqB;AAuChC,gBAAAC,MAkHH,QAAAC,aAlHG;AA5BT,IAAM,aAAaH,eAAsC,IAAI;AAE7D,SAAS,gBAAgB;AACvB,SAAOC,YAAW,UAAU;AAC9B;AAuBO,SAAS,IAAI,EAAE,UAAU,UAAU,GAAa;AACrD,SAAO,gBAAAC,KAAC,SAAI,WAAW,aAAa,YAAa,UAAS;AAC5D;AA+BO,SAASE,SAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAiB;AACf,QAAM,aAAa,cAAc;AACjC,QAAM,gBAAgB,aAAa;AAGnC,QAAM,cAAc,MAAM;AACxB,gBAAY,kBAAkB,KAAK;AAAA,EACrC;AAGA,MAAI,MAAM;AACR,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,SAAS;AAAA,QAER;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,MAAI,IAAI;AACN,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,CAAC,EAAE,SAAS,MACrB,CAAC,eAAe,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAEhE,SAAS;AAAA,QAER;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,SAAO,gBAAAA,KAAC,UAAK,WAAW,eAAgB,UAAS;AACnD;AA0BO,SAAS,YAAY,EAAE,MAAM,UAAU,UAAU,GAAqB;AAC3E,QAAM,CAAC,MAAM,OAAO,IAAIH,UAAS,KAAK;AAEtC,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,aAAa;AAAA,MACxB,cAAc,MAAM,QAAQ,IAAI;AAAA,MAChC,cAAc,MAAM,QAAQ,KAAK;AAAA,MAEjC;AAAA,wBAAAA,MAAC,YAAO,WAAU,4BACf;AAAA;AAAA,UACD,gBAAAD,KAAC,UAAK,WAAU,0BAAyB,oBAAC;AAAA,WAC5C;AAAA,QACC,QAAQ,gBAAAA,KAAC,SAAI,WAAU,0BAA0B,UAAS;AAAA;AAAA;AAAA,EAC7D;AAEJ;;;ACjKA,SAAS,YAAAG,WAAU,aAAAC,kBAAiB;AA8C9B,SACE,OAAAC,MADF,QAAAC,aAAA;AA1CC,SAAS,MAAM;AACpB,QAAM,MAAM,OAAO;AACnB,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAiB,EAAE;AAEnD,QAAM,QAAQ,YAAY,SAAS,SAAS;AAE5C,EAAAC,WAAU,MAAM;AACd,QAAI,IAAI,WAAW,EAAG;AAEtB,UAAM,kBAAkB,IAAI,IAAI,CAAC,SAAS,SAAS,eAAe,KAAK,EAAE,CAAC,EAAE,OAAO,OAAO;AAE1F,QAAI,gBAAgB,WAAW,EAAG;AAElC,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,mBAAW,SAAS,SAAS;AAC3B,cAAI,MAAM,gBAAgB;AACxB,wBAAY,MAAM,OAAO,EAAE;AAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AAEA,oBAAgB,QAAQ,CAAC,OAAO,MAAM,SAAS,QAAQ,EAAE,CAAC;AAE1D,WAAO,MAAM;AACX,sBAAgB,QAAQ,CAAC,OAAO,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAH,KAAC,WAAM,WAAU,YACf,0BAAAC,MAAC,SAAI,WAAU,sBACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,kBAAkB,iBAAM;AAAA,IACtC,gBAAAA,KAAC,SAAI,WAAU,gBACb,0BAAAA,KAAC,YAAS,OAAO,KAAK,UAAoB,GAC5C;AAAA,KACF,GACF;AAEJ;AAOA,SAAS,SAAS,EAAE,OAAO,SAAS,GAAkB;AACpD,SACE,gBAAAA,KAAC,QAAG,WAAU,iBACX,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,oBAA+B,MAAY,YAArB,KAAK,EAAoC,CACjE,GACH;AAEJ;AAOA,SAAS,iBAAiB,EAAE,MAAM,SAAS,GAA0B;AACnE,QAAM,WAAW,KAAK,OAAO;AAC7B,QAAM,iBAAiB,oBAAoB,MAAM,QAAQ;AAEzD,SACE,gBAAAC,MAAC,QAAG,WAAU,iBACZ;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,IAAI,KAAK,EAAE;AAAA,QACjB,WAAW;AAAA,UACT,+BAA+B,KAAK,KAAK;AAAA,UACzC,YAAY;AAAA,UACZ,kBAAkB;AAAA,QACpB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,SAAS,CAAC,MAAM;AACd,YAAE,eAAe;AACjB,gBAAM,UAAU,SAAS,eAAe,KAAK,EAAE;AAC/C,cAAI,SAAS;AACX,oBAAQ,eAAe,EAAE,UAAU,SAAS,CAAC;AAC7C,mBAAO,QAAQ,UAAU,MAAM,IAAI,IAAI,KAAK,EAAE,EAAE;AAAA,UAClD;AAAA,QACF;AAAA,QAEC,eAAK;AAAA;AAAA,IACR;AAAA,IACC,KAAK,YAAY,KAAK,SAAS,SAAS,KACvC,gBAAAA,KAAC,YAAS,OAAO,KAAK,UAAU,UAAoB;AAAA,KAExD;AAEJ;AAEA,SAAS,oBAAoB,MAAe,UAA2B;AACrE,MAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,OAAO,SAAU,QAAO;AAClC,QAAI,oBAAoB,OAAO,QAAQ,EAAG,QAAO;AAAA,EACnD;AAEA,SAAO;AACT;;;ACtFM,SACE,OAAAI,MADF,QAAAC,aAAA;AAPC,SAAS,QAAQ,EAAE,SAAS,GAAiB;AAClD,QAAM,WAAW,YAAY;AAC7B,QAAM,UACJ,UAAU,YAAY,YAAY,SAAS,UAAU,OAAO,SAAS,IAAI,SAAS;AAEpF,SACE,gBAAAD,KAAC,UACC,0BAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,oBAAAD,KAAC,WAAS,UAAS;AAAA,IAClB,WAAW,gBAAAA,KAAC,OAAI;AAAA,KACnB,GACF;AAEJ;AA8BO,SAAS,WAAW,EAAE,SAAS,GAAoB;AACxD,QAAM,WAAW,YAAY;AAC7B,QAAM,UACJ,UAAU,YAAY,YAAY,SAAS,UAAU,OAAO,SAAS,IAAI,SAAS;AAEpF,SACE,gBAAAC,MAAC,SAAI,WAAU,iBACb;AAAA,oBAAAD,KAAC,WAAS,UAAS;AAAA,IAClB,WAAW,gBAAAA,KAAC,OAAI;AAAA,KACnB;AAEJ;AAaO,SAAS,UAAU,EAAE,QAAQ,GAAmB;AACrD,SAAO,gBAAAA,KAAC,WAAS,mBAAQ;AAC3B;;;AC9FA,SAAS,QAAAE,aAAY;AAuBL,gBAAAC,OAyBF,QAAAC,cAzBE;AAjBT,SAAS,WAAW;AACzB,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,eAAe;AAEnC,QAAM,OAAO,UAAU,YAAY;AACnC,QAAM,WAAW,UAAU,YAAY;AAEvC,SACE,gBAAAA,OAAC,SAAI,WAAU,aACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,YAAY;AAAA,QAClB,OAAO,YAAY,cAAc,QAAQ,OAAO,QAAQ;AAAA,QACxD,KACE,YAAY,OAAO,YAAY,IAAI,SAAS,IAC1C,gBAAAA,MAAC,OACE,sBAAY,IAAI,IAAI,CAAC,MAAM,UAC1B,gBAAAA,MAACE,UAAA,EAAoB,IAAI,KAAK,MAC3B,eAAK,QADM,KAEd,CACD,GACH,IACE;AAAA,QAEN,SAAS,YAAY,aAAa,IAAI,CAAC,MAAM,UAC3C,gBAAAF,MAAC,cAAuB,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,WAAW,KAAK,aAAzD,KAAoE,CACtF;AAAA;AAAA,IACH;AAAA,IAEA,gBAAAC,OAAC,UAAK,WAAU,kBACb;AAAA,cACC,gBAAAD,MAAC,aAAQ,WAAU,aACjB,0BAAAC,OAAC,SAAI,WAAU,uBACZ;AAAA,aAAK,SACJ,gBAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM;AAAA,YAC9D,KAAK,KAAK,QAAQ,OAAO;AAAA;AAAA,QAC3B,GACF;AAAA,QAGF,gBAAAC,OAAC,SAAI,WAAU,qBACZ;AAAA,eAAK,QAAQ,gBAAAD,MAAC,QAAG,WAAU,kBAAkB,eAAK,MAAK;AAAA,UACvD,KAAK,QAAQ,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,eAAK,MAAK;AAAA,UACtD,KAAK,WAAW,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,eAAK,SAAQ;AAAA,UAE/D,KAAK,WAAW,KAAK,QAAQ,SAAS,KACrC,gBAAAA,MAAC,SAAI,WAAU,qBACZ,eAAK,QAAQ,IAAI,CAAC,QAAQ,UACzB,gBAAAA;AAAA,YAACG;AAAA,YAAA;AAAA,cAEC,IAAI,OAAO;AAAA,cACX,WAAW,qCAAqC,OAAO,SAAS,OAAO;AAAA,cAEtE,iBAAO;AAAA;AAAA,YAJH;AAAA,UAKP,CACD,GACH;AAAA,WAEJ;AAAA,SACF,GACF;AAAA,MAGD,YAAY,SAAS,SAAS,KAC7B,gBAAAH,MAAC,aAAQ,WAAU,iBACjB,0BAAAA,MAAC,SAAI,WAAU,2BACZ,mBAAS,IAAI,CAAC,SAAS,UACtB,gBAAAC,OAAC,SAAgB,WAAU,gBACxB;AAAA,gBAAQ,QAAQ,gBAAAD,MAAC,SAAI,WAAU,qBAAqB,kBAAQ,MAAK;AAAA,QAClE,gBAAAA,MAAC,QAAG,WAAU,sBAAsB,kBAAQ,OAAM;AAAA,QAClD,gBAAAA,MAAC,OAAE,WAAU,wBAAwB,kBAAQ,SAAQ;AAAA,QACpD,QAAQ,QACP,gBAAAA,MAACG,OAAA,EAAK,IAAI,QAAQ,MAAM,WAAU,qBAC/B,kBAAQ,YAAY,cACvB;AAAA,WAPM,KASV,CACD,GACH,GACF;AAAA,OAEJ;AAAA,IAEA,gBAAAH,MAAC,UAAO;AAAA,KACV;AAEJ;;;AC7FA,SAAS,QAAAI,aAAY;AAmET,gBAAAC,OAIJ,QAAAC,cAJI;AATL,SAAS,KAAK,EAAE,MAAM,MAAM,SAAS,OAAO,SAAS,UAAU,GAAc;AAClF,QAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,OAAO;AAC5D,QAAM,WAAW,OAAO,UAAU,WAAW,OAAQ,OAAO,OAAO;AAEnE,SACE,gBAAAD,MAAC,aAAQ,WAAW,aAAa,aAC/B,0BAAAC,OAAC,SAAI,WAAU,yCACZ;AAAA,aACC,gBAAAD,MAAC,SAAI,WAAU,mBACb,0BAAAA,MAAC,SAAI,KAAK,UAAU,KAAK,UAAU,GACrC;AAAA,IAGF,gBAAAC,OAAC,SAAI,WAAU,qBACZ;AAAA,cAAQ,gBAAAD,MAAC,QAAG,WAAU,kBAAkB,gBAAK;AAAA,MAC7C,QAAQ,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,gBAAK;AAAA,MAC5C,WAAW,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,mBAAQ;AAAA,MAErD,WAAW,QAAQ,SAAS,KAC3B,gBAAAA,MAAC,SAAI,WAAU,qBACZ,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM,OAAO,OAAO;AACpB,cAAM,aACJ,OAAO,SAAS,aACf,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU;AAC3D,cAAME,aAAY,qCAAqC,OAAO,SAAS,OAAO;AAE9E,YAAI,YAAY;AACd,iBACE,gBAAAF;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM;AAAA,cACN,WAAWE;AAAA,cACX,QAAO;AAAA,cACP,KAAI;AAAA,cAEH,iBAAO;AAAA;AAAA,YANH;AAAA,UAOP;AAAA,QAEJ;AAEA,eACE,gBAAAF,MAACD,OAAA,EAAiB,IAAI,MAAM,WAAWG,YACpC,iBAAO,QADC,KAEX;AAAA,MAEJ,CAAC,GACH;AAAA,OAEJ;AAAA,KACF,GACF;AAEJ;;;AChHA,SAAS,QAAAC,aAAY;AAwDjB,SACW,OAAAC,OADX,QAAAC,cAAA;AAVG,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,SACE,gBAAAA,OAAC,SAAI,WAAW,aAAa,gBAAgB,OAC1C;AAAA,YAAQ,gBAAAD,MAAC,SAAI,WAAU,qBAAqB,gBAAK;AAAA,IAClD,gBAAAA,MAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,IAC1C,gBAAAA,MAAC,OAAE,WAAU,wBAAwB,mBAAQ;AAAA,IAC5C,QACC,gBAAAA,MAACD,OAAA,EAAK,IAAI,MAAM,WAAU,qBACvB,sBAAY,cACf;AAAA,KAEJ;AAEJ;AAkBO,SAAS,SAAS,EAAE,OAAO,OAAO,UAAU,UAAU,GAAkB;AAC7E,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SACE,gBAAAE,OAAC,aAAQ,WAAW,aAAa,iBAC7B;AAAA,cAAS,aACT,gBAAAA,OAAC,SAAI,WAAU,wBACZ;AAAA,eAAS,gBAAAD,MAAC,QAAG,WAAU,uBAAuB,iBAAM;AAAA,MACpD,YAAY,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,oBAAS;AAAA,OAC/D;AAAA,IAEF,gBAAAA,MAAC,SAAI,WAAU,2BACZ,gBAAM,IAAI,CAAC,SAAS,UACnB,gBAAAA,MAAC,eAAyB,GAAG,SAAS,OAAO,EAAE,gBAAgB,GAAG,QAAQ,EAAE,KAAK,KAA/D,KAAkE,CACrF,GACH;AAAA,KACF;AAEJ;","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","createContext","useContext","jsx","jsxs","NavLink","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","Link","jsx","jsxs","NavLink","Link","Link","jsx","jsxs","className","Link","jsx","jsxs"]}