ardo 2.2.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,8 +18,8 @@ var defaultThemeConfig = {
18
18
  };
19
19
  var defaultMarkdownConfig = {
20
20
  theme: {
21
- light: "github-light",
22
- dark: "github-dark"
21
+ light: "github-light-default",
22
+ dark: "github-dark-default"
23
23
  },
24
24
  lineNumbers: false,
25
25
  anchor: true,
@@ -74,4 +74,4 @@ export {
74
74
  resolveConfig,
75
75
  loadConfig
76
76
  };
77
- //# sourceMappingURL=chunk-CGFRUWNJ.js.map
77
+ //# sourceMappingURL=chunk-FGRL2G4S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/index.ts"],"sourcesContent":["import type {\n PressConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n} from \"./types\"\nimport path from \"path\"\n\nexport type {\n PressConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n}\n\nexport function defineConfig(config: PressConfig): PressConfig {\n return config\n}\n\nconst defaultThemeConfig: ThemeConfig = {\n nav: [],\n sidebar: [],\n socialLinks: [],\n search: {\n enabled: true,\n placeholder: \"Search...\",\n },\n outline: {\n level: 2,\n label: \"On this page\",\n },\n}\n\nconst defaultMarkdownConfig: MarkdownConfig = {\n theme: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n lineNumbers: false,\n anchor: true,\n toc: {\n level: [2, 3],\n },\n}\n\nexport function resolveConfig(config: PressConfig, root: string): ResolvedConfig {\n const srcDir = config.srcDir ?? \"content\"\n const contentDir = path.resolve(root, srcDir)\n\n return {\n title: config.title,\n description: config.description ?? \"\",\n base: config.base ?? \"/\",\n srcDir,\n outDir: config.outDir ?? \"dist\",\n lang: config.lang ?? \"en\",\n head: config.head ?? [],\n themeConfig: {\n ...defaultThemeConfig,\n ...config.themeConfig,\n },\n markdown: {\n ...defaultMarkdownConfig,\n ...config.markdown,\n },\n vite: config.vite,\n project: config.project ?? {},\n root,\n contentDir,\n }\n}\n\nexport async function loadConfig(root: string): Promise<ResolvedConfig> {\n const configPath = path.resolve(root, \"press.config.ts\")\n\n try {\n const configModule = await import(configPath)\n const config = configModule.default as PressConfig\n return resolveConfig(config, root)\n } catch {\n return resolveConfig(\n {\n title: \"Ardo\",\n description: \"Documentation powered by Ardo\",\n },\n root\n )\n }\n}\n"],"mappings":";AAeA,OAAO,UAAU;AAkBV,SAAS,aAAa,QAAkC;AAC7D,SAAO;AACT;AAEA,IAAM,qBAAkC;AAAA,EACtC,KAAK,CAAC;AAAA,EACN,SAAS,CAAC;AAAA,EACV,aAAa,CAAC;AAAA,EACd,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAAwC;AAAA,EAC5C,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO,CAAC,GAAG,CAAC;AAAA,EACd;AACF;AAEO,SAAS,cAAc,QAAqB,MAA8B;AAC/E,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,aAAa,KAAK,QAAQ,MAAM,MAAM;AAE5C,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,OAAO,eAAe;AAAA,IACnC,MAAM,OAAO,QAAQ;AAAA,IACrB;AAAA,IACA,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtB,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,MAAM,OAAO;AAAA,IACb,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,MAAuC;AACtE,QAAM,aAAa,KAAK,QAAQ,MAAM,iBAAiB;AAEvD,MAAI;AACF,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,SAAS,aAAa;AAC5B,WAAO,cAAc,QAAQ,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-CGFRUWNJ.js";
3
+ } from "./chunk-FGRL2G4S.js";
4
4
  import {
5
5
  generateApiDocs
6
6
  } from "./chunk-4IRLOOXV.js";
@@ -1259,4 +1259,4 @@ export {
1259
1259
  getPageDataForRoute,
1260
1260
  generateSidebar2 as generateSidebar
1261
1261
  };
1262
- //# sourceMappingURL=chunk-UHOGM3IL.js.map
1262
+ //# sourceMappingURL=chunk-PCMPLBJA.js.map
@@ -2,7 +2,7 @@ import {
2
2
  defineConfig,
3
3
  loadConfig,
4
4
  resolveConfig
5
- } from "../chunk-CGFRUWNJ.js";
5
+ } from "../chunk-FGRL2G4S.js";
6
6
  export {
7
7
  defineConfig,
8
8
  loadConfig,
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { defineConfig, loadConfig, resolveConfig } from './config/index.js';
2
2
  export { ArdoPluginOptions, ardo as ardoPlugin, generateSidebar, getPageDataForRoute, getSlugFromPath, loadAllDocs, loadDoc, transformMarkdown, transformMarkdownToReact } from './vite/index.js';
3
3
  export { H as HeadConfig, M as MarkdownConfig, N as NavItem, P as PageData, a as PageFrontmatter, b as PressConfig, c as ProjectMeta, R as ResolvedConfig, S as SidebarItem, d as SocialLink, T as TOCItem, e as ThemeConfig, f as TypeDocConfig } from './types-tjxB5eh7.js';
4
4
  export { PressProvider, findCurrentSidebarItem, getPrevNextLinks, useConfig, usePageData, usePressContext, useSidebar, useTOC, useThemeConfig } from './runtime/index.js';
5
- export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, H as Header, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, N as Note, w as NoteProps, S as Search, x as Sidebar, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from './Features-DEndhnwl.js';
5
+ export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, H as Header, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, N as Note, w as NoteProps, S as Search, x as Sidebar, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from './Features-BlVr5s_C.js';
6
6
  export { ApiDocHierarchy, ApiDocItem, ApiDocKind, ApiDocParameter, ApiDocReturn, ApiDocSource, ApiDocTag, ApiDocTypeParameter, ApiHierarchy, ApiItem, ApiKindBadge, ApiParametersTable, ApiReturns, ApiSignature, GeneratedApiDoc, TypeDocGenerator, TypeDocPluginOptions, createTypedocWatcher, generateApiDocs, typedocPlugin } from './typedoc/index.js';
7
7
  import 'vite';
8
8
  import 'shiki';
package/dist/index.js CHANGED
@@ -7,12 +7,12 @@ import {
7
7
  loadDoc,
8
8
  transformMarkdown,
9
9
  transformMarkdownToReact
10
- } from "./chunk-UHOGM3IL.js";
10
+ } from "./chunk-PCMPLBJA.js";
11
11
  import {
12
12
  defineConfig,
13
13
  loadConfig,
14
14
  resolveConfig
15
- } from "./chunk-CGFRUWNJ.js";
15
+ } from "./chunk-FGRL2G4S.js";
16
16
  import "./chunk-R2QKY6G3.js";
17
17
  import {
18
18
  DocLayout,
@@ -28,7 +28,7 @@ import {
28
28
  Sidebar,
29
29
  TOC,
30
30
  ThemeToggle
31
- } from "./chunk-6U5CYV74.js";
31
+ } from "./chunk-C4W4YI7C.js";
32
32
  import {
33
33
  ApiHierarchy,
34
34
  ApiItem,
@@ -59,7 +59,7 @@ import {
59
59
  Tabs,
60
60
  Tip,
61
61
  Warning
62
- } from "./chunk-LSNTX2BA.js";
62
+ } from "./chunk-2L4ZS6W2.js";
63
63
  import {
64
64
  PressProvider,
65
65
  findCurrentSidebarItem,
@@ -14,7 +14,7 @@ import {
14
14
  Tabs,
15
15
  Tip,
16
16
  Warning
17
- } from "../chunk-LSNTX2BA.js";
17
+ } from "../chunk-2L4ZS6W2.js";
18
18
  import "../chunk-EOV2OUTW.js";
19
19
 
20
20
  // src/mdx/provider.tsx
@@ -1,4 +1,4 @@
1
- export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, V as DocContent, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, X as FooterCopyrightProps, Y as FooterMessageProps, Z as FooterProps, H as Header, _ as HeaderProps, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, $ as LayoutProps, N as Note, w as NoteProps, S as Search, x as Sidebar, a0 as SidebarGroup, a1 as SidebarGroupProps, a2 as SidebarLink, a3 as SidebarLinkProps, a4 as SidebarProps, a5 as SocialLink, a6 as SocialLinkProps, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from '../Features-DEndhnwl.js';
1
+ export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, V as DocContent, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, X as FooterCopyrightProps, Y as FooterMessageProps, Z as FooterProps, H as Header, _ as HeaderProps, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, $ as LayoutProps, N as Note, w as NoteProps, S as Search, x as Sidebar, a0 as SidebarGroup, a1 as SidebarGroupProps, a2 as SidebarLink, a3 as SidebarLinkProps, a4 as SidebarProps, a5 as SocialLink, a6 as SocialLinkProps, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from '../Features-BlVr5s_C.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import { ReactNode, ComponentProps } from 'react';
4
4
  import { NavLink as NavLink$1 } from 'react-router';
package/dist/ui/index.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  SocialLink,
20
20
  TOC,
21
21
  ThemeToggle
22
- } from "../chunk-6U5CYV74.js";
22
+ } from "../chunk-C4W4YI7C.js";
23
23
  import {
24
24
  CodeBlock,
25
25
  CodeGroup,
@@ -39,7 +39,7 @@ import {
39
39
  Warning,
40
40
  getRegisteredIconNames,
41
41
  registerIcons
42
- } from "../chunk-LSNTX2BA.js";
42
+ } from "../chunk-2L4ZS6W2.js";
43
43
  import "../chunk-EOV2OUTW.js";
44
44
  export {
45
45
  CodeBlock,
@@ -51,9 +51,9 @@
51
51
  --ardo-sidebar-bg: oklch(0.975 0.006 var(--ardo-brand-h));
52
52
  --ardo-sidebar-border: oklch(0.925 0.01 var(--ardo-brand-h));
53
53
 
54
- /* Code block styling - warm cream tone */
55
- --ardo-code-bg: #fdfcfb;
56
- --ardo-code-border: #f0ebe4;
54
+ /* Code block styling - derived from brand hue */
55
+ --ardo-code-bg: oklch(0.985 0.004 var(--ardo-brand-h));
56
+ --ardo-code-border: oklch(0.92 0.008 var(--ardo-brand-h));
57
57
  --ardo-code-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
58
58
 
59
59
  /* ========================================
@@ -142,8 +142,8 @@
142
142
  --ardo-sidebar-bg: oklch(0.18 0.018 var(--ardo-brand-h));
143
143
  --ardo-sidebar-border: oklch(0.28 0.02 var(--ardo-brand-h));
144
144
 
145
- --ardo-code-bg: #1c1917;
146
- --ardo-code-border: #292524;
145
+ --ardo-code-bg: oklch(0.17 0.01 var(--ardo-brand-h));
146
+ --ardo-code-border: oklch(0.25 0.015 var(--ardo-brand-h));
147
147
  --ardo-code-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
148
148
 
149
149
  /* Light text on dark (brand-tinted) */
@@ -184,8 +184,13 @@
184
184
  }
185
185
 
186
186
  html {
187
- scroll-behavior: smooth;
188
- scroll-padding-top: calc(var(--ardo-header-height) + 24px);
187
+ scroll-padding-top: calc(var(--ardo-header-height) + env(safe-area-inset-top) + 24px);
188
+ }
189
+
190
+ @media (prefers-reduced-motion: no-preference) {
191
+ html {
192
+ scroll-behavior: smooth;
193
+ }
189
194
  }
190
195
 
191
196
  body {
@@ -237,7 +242,8 @@ body {
237
242
  top: 0;
238
243
  left: 0;
239
244
  right: 0;
240
- height: var(--ardo-header-height);
245
+ height: calc(var(--ardo-header-height) + env(safe-area-inset-top));
246
+ padding-top: env(safe-area-inset-top);
241
247
  background: oklch(1 0 0 / 0.85);
242
248
  backdrop-filter: blur(12px) saturate(1.5);
243
249
  -webkit-backdrop-filter: blur(12px) saturate(1.5);
@@ -654,6 +660,7 @@ body {
654
660
  padding-bottom: 10px;
655
661
  border-bottom: none;
656
662
  position: relative;
663
+ letter-spacing: -0.02em;
657
664
  }
658
665
 
659
666
  .ardo-content h2::after {
@@ -871,15 +878,12 @@ body {
871
878
  font-size: 12px;
872
879
  font-family: var(--ardo-font-family);
873
880
  color: var(--ardo-c-text-light);
874
- opacity: 0;
881
+ opacity: 0.6;
875
882
  transition: all var(--ardo-transition);
876
883
  }
877
884
 
878
- .ardo-code-wrapper:hover .ardo-copy-button {
879
- opacity: 1;
880
- }
881
-
882
885
  .ardo-copy-button:hover {
886
+ opacity: 1;
883
887
  background: var(--ardo-c-bg-soft);
884
888
  border-color: var(--ardo-c-brand);
885
889
  color: var(--ardo-c-brand);
@@ -1096,7 +1100,13 @@ body {
1096
1100
  border-color: oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.4);
1097
1101
  background: var(--ardo-c-brand-subtle);
1098
1102
  box-shadow: var(--ardo-shadow-md);
1099
- transform: translateY(-2px);
1103
+ }
1104
+
1105
+ @media (hover: hover) {
1106
+ .ardo-prev-link:hover,
1107
+ .ardo-next-link:hover {
1108
+ transform: translateY(-2px);
1109
+ }
1100
1110
  }
1101
1111
 
1102
1112
  .ardo-next-link {
@@ -1555,10 +1565,15 @@ body {
1555
1565
 
1556
1566
  .ardo-hero-action-brand:hover {
1557
1567
  background: var(--ardo-c-brand-dark);
1558
- transform: translateY(-2px);
1559
1568
  box-shadow: 0 6px 20px oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.4);
1560
1569
  }
1561
1570
 
1571
+ @media (hover: hover) {
1572
+ .ardo-hero-action-brand:hover {
1573
+ transform: translateY(-2px);
1574
+ }
1575
+ }
1576
+
1562
1577
  .ardo-hero-action-alt {
1563
1578
  background: var(--ardo-c-bg);
1564
1579
  color: var(--ardo-c-text);
@@ -1621,7 +1636,12 @@ body {
1621
1636
  box-shadow:
1622
1637
  var(--ardo-shadow-md),
1623
1638
  0 0 0 1px oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.1);
1624
- transform: translateY(-3px);
1639
+ }
1640
+
1641
+ @media (hover: hover) {
1642
+ .ardo-feature:hover {
1643
+ transform: translateY(-3px);
1644
+ }
1625
1645
  }
1626
1646
 
1627
1647
  .ardo-feature-icon {
@@ -1632,8 +1652,16 @@ body {
1632
1652
  height: 48px;
1633
1653
  margin-bottom: 16px;
1634
1654
  background: var(--ardo-c-brand-subtle);
1635
- border-radius: var(--ardo-radius);
1655
+ border: 1px solid oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.12);
1656
+ border-radius: 50%;
1636
1657
  color: var(--ardo-c-brand);
1658
+ transition: all var(--ardo-transition);
1659
+ }
1660
+
1661
+ .ardo-feature:hover .ardo-feature-icon {
1662
+ background: var(--ardo-c-brand);
1663
+ color: white;
1664
+ border-color: transparent;
1637
1665
  }
1638
1666
 
1639
1667
  .ardo-feature-title {
@@ -1913,7 +1941,12 @@ body {
1913
1941
 
1914
1942
  .ardo-home-tech-item:hover {
1915
1943
  border-color: var(--ardo-c-brand);
1916
- transform: translateY(-2px);
1944
+ }
1945
+
1946
+ @media (hover: hover) {
1947
+ .ardo-home-tech-item:hover {
1948
+ transform: translateY(-2px);
1949
+ }
1917
1950
  }
1918
1951
 
1919
1952
  .ardo-home-tech-icon {
@@ -1974,10 +2007,15 @@ body {
1974
2007
 
1975
2008
  .ardo-home-cta-primary:hover {
1976
2009
  background: var(--ardo-c-brand-dark);
1977
- transform: translateY(-2px);
1978
2010
  box-shadow: 0 8px 24px oklch(var(--ardo-brand-l) var(--ardo-brand-c) var(--ardo-brand-h) / 0.3);
1979
2011
  }
1980
2012
 
2013
+ @media (hover: hover) {
2014
+ .ardo-home-cta-primary:hover {
2015
+ transform: translateY(-2px);
2016
+ }
2017
+ }
2018
+
1981
2019
  .ardo-home-cta-secondary {
1982
2020
  background: var(--ardo-c-bg);
1983
2021
  color: var(--ardo-c-text);
@@ -2084,12 +2122,12 @@ body {
2084
2122
  .ardo-api-anchor {
2085
2123
  color: var(--ardo-c-text-lighter);
2086
2124
  text-decoration: none;
2087
- opacity: 0;
2125
+ opacity: 0.4;
2088
2126
  transition: opacity var(--ardo-transition-fast);
2089
2127
  }
2090
2128
 
2091
2129
  .ardo-api-item-title:hover .ardo-api-anchor {
2092
- opacity: 1;
2130
+ opacity: 0.8;
2093
2131
  }
2094
2132
 
2095
2133
  .ardo-api-item-description {
@@ -2401,11 +2439,35 @@ body {
2401
2439
  .ardo-feature:hover,
2402
2440
  .ardo-prev-link:hover,
2403
2441
  .ardo-next-link:hover,
2404
- .ardo-hero-action-brand:hover {
2442
+ .ardo-hero-action-brand:hover,
2443
+ .ardo-home-tech-item:hover,
2444
+ .ardo-home-cta-primary:hover {
2405
2445
  transform: none;
2406
2446
  }
2407
2447
  }
2408
2448
 
2449
+ /* ========================================
2450
+ Skip Link - Accessibility
2451
+ ======================================== */
2452
+ .ardo-skip-link {
2453
+ position: absolute;
2454
+ top: -100%;
2455
+ left: 16px;
2456
+ z-index: 200;
2457
+ padding: 12px 24px;
2458
+ background: var(--ardo-c-brand);
2459
+ color: white;
2460
+ font-weight: 600;
2461
+ font-size: 14px;
2462
+ text-decoration: none;
2463
+ border-radius: var(--ardo-radius);
2464
+ box-shadow: var(--ardo-shadow-md);
2465
+ }
2466
+
2467
+ .ardo-skip-link:focus {
2468
+ top: 16px;
2469
+ }
2470
+
2409
2471
  /* ========================================
2410
2472
  Focus States - Accessibility
2411
2473
  ======================================== */
@@ -10,8 +10,8 @@ import {
10
10
  loadDoc,
11
11
  transformMarkdown,
12
12
  transformMarkdownToReact
13
- } from "../chunk-UHOGM3IL.js";
14
- import "../chunk-CGFRUWNJ.js";
13
+ } from "../chunk-PCMPLBJA.js";
14
+ import "../chunk-FGRL2G4S.js";
15
15
  import "../chunk-4IRLOOXV.js";
16
16
  export {
17
17
  ardoPlugin as ardo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ardo",
3
- "version": "2.2.2",
3
+ "version": "2.4.0",
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, 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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/index.ts"],"sourcesContent":["import type {\n PressConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n} from \"./types\"\nimport path from \"path\"\n\nexport type {\n PressConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n}\n\nexport function defineConfig(config: PressConfig): PressConfig {\n return config\n}\n\nconst defaultThemeConfig: ThemeConfig = {\n nav: [],\n sidebar: [],\n socialLinks: [],\n search: {\n enabled: true,\n placeholder: \"Search...\",\n },\n outline: {\n level: 2,\n label: \"On this page\",\n },\n}\n\nconst defaultMarkdownConfig: MarkdownConfig = {\n theme: {\n light: \"github-light\",\n dark: \"github-dark\",\n },\n lineNumbers: false,\n anchor: true,\n toc: {\n level: [2, 3],\n },\n}\n\nexport function resolveConfig(config: PressConfig, root: string): ResolvedConfig {\n const srcDir = config.srcDir ?? \"content\"\n const contentDir = path.resolve(root, srcDir)\n\n return {\n title: config.title,\n description: config.description ?? \"\",\n base: config.base ?? \"/\",\n srcDir,\n outDir: config.outDir ?? \"dist\",\n lang: config.lang ?? \"en\",\n head: config.head ?? [],\n themeConfig: {\n ...defaultThemeConfig,\n ...config.themeConfig,\n },\n markdown: {\n ...defaultMarkdownConfig,\n ...config.markdown,\n },\n vite: config.vite,\n project: config.project ?? {},\n root,\n contentDir,\n }\n}\n\nexport async function loadConfig(root: string): Promise<ResolvedConfig> {\n const configPath = path.resolve(root, \"press.config.ts\")\n\n try {\n const configModule = await import(configPath)\n const config = configModule.default as PressConfig\n return resolveConfig(config, root)\n } catch {\n return resolveConfig(\n {\n title: \"Ardo\",\n description: \"Documentation powered by Ardo\",\n },\n root\n )\n }\n}\n"],"mappings":";AAeA,OAAO,UAAU;AAkBV,SAAS,aAAa,QAAkC;AAC7D,SAAO;AACT;AAEA,IAAM,qBAAkC;AAAA,EACtC,KAAK,CAAC;AAAA,EACN,SAAS,CAAC;AAAA,EACV,aAAa,CAAC;AAAA,EACd,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAAwC;AAAA,EAC5C,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO,CAAC,GAAG,CAAC;AAAA,EACd;AACF;AAEO,SAAS,cAAc,QAAqB,MAA8B;AAC/E,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,aAAa,KAAK,QAAQ,MAAM,MAAM;AAE5C,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,OAAO,eAAe;AAAA,IACnC,MAAM,OAAO,QAAQ;AAAA,IACrB;AAAA,IACA,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtB,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,MAAM,OAAO;AAAA,IACb,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,MAAuC;AACtE,QAAM,aAAa,KAAK,QAAQ,MAAM,iBAAiB;AAEvD,MAAI;AACF,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,SAAS,aAAa;AAC5B,WAAO,cAAc,QAAQ,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}