ardo 3.1.0 → 3.2.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.
Files changed (123) hide show
  1. package/README.md +9 -19
  2. package/dist/DocPage-CIBiCAxZ.js +1010 -0
  3. package/dist/DocPage-CIBiCAxZ.js.map +1 -0
  4. package/dist/assets/src/ui/Breadcrumb.css.ts.vanilla-Dpgq-C_p.css +20 -0
  5. package/dist/assets/src/ui/DocPage.css.ts.vanilla-CXKuz4U-.css +34 -0
  6. package/dist/assets/src/ui/Footer.css.ts.vanilla-BSzPIPt4.css +100 -0
  7. package/dist/assets/src/ui/Header.css.ts.vanilla-8QL0Jzgk.css +156 -0
  8. package/dist/assets/src/ui/Layout.css.ts.vanilla-Bpx_-gJt.css +67 -0
  9. package/dist/assets/src/ui/Nav.css.ts.vanilla-CsAQjogy.css +51 -0
  10. package/dist/assets/src/ui/Sidebar.css.ts.vanilla-D70qXTEr.css +115 -0
  11. package/dist/assets/src/ui/Toc.css.ts.vanilla-CYqcWgvD.css +52 -0
  12. package/dist/assets/src/ui/components/ApiItem.css.ts.vanilla-B_DW-1iJ.css +218 -0
  13. package/dist/assets/src/ui/components/CodeBlock.css.ts.vanilla-lNKqskjQ.css +182 -0
  14. package/dist/assets/src/ui/components/Container.css.ts.vanilla-CUhRUA9t.css +80 -0
  15. package/dist/assets/src/ui/components/CopyButton.css.ts.vanilla-DZZ5jgTM.css +24 -0
  16. package/dist/assets/src/ui/components/Features.css.ts.vanilla-D-pNXM9Q.css +129 -0
  17. package/dist/assets/src/ui/components/Hero.css.ts.vanilla-DHJVZ6GX.css +134 -0
  18. package/dist/assets/src/ui/components/Search.css.ts.vanilla-BYpWHzky.css +135 -0
  19. package/dist/assets/src/ui/components/Steps.css.ts.vanilla-CisaxeNj.css +59 -0
  20. package/dist/assets/src/ui/components/Tabs.css.ts.vanilla-C4-vJSnf.css +30 -0
  21. package/dist/assets/src/ui/components/ThemeToggle.css.ts.vanilla---sSUELC.css +22 -0
  22. package/dist/assets/src/ui/content.css.ts.vanilla-O_RaSPXm.css +106 -0
  23. package/dist/assets/src/ui/theme/animations.css.ts.vanilla-D6ImVUKy.css +10 -0
  24. package/dist/assets/src/ui/theme/dark.css.ts.vanilla-2iJgcpbU.css +87 -0
  25. package/dist/assets/src/ui/theme/light.css.ts.vanilla-CwinfWSf.css +87 -0
  26. package/dist/assets/src/ui/theme/reset.css.ts.vanilla-0Q3pLjfC.css +34 -0
  27. package/dist/brand-icons-DLJKqTun.js +59 -0
  28. package/dist/brand-icons-DLJKqTun.js.map +1 -0
  29. package/dist/config/index.d.ts +5 -5
  30. package/dist/config/index.d.ts.map +1 -0
  31. package/dist/config/index.js +54 -11
  32. package/dist/config/index.js.map +1 -1
  33. package/dist/contract.css-DYvFVCFE.d.ts +105 -0
  34. package/dist/contract.css-DYvFVCFE.d.ts.map +1 -0
  35. package/dist/generator-DPtRXxM_.js +1194 -0
  36. package/dist/generator-DPtRXxM_.js.map +1 -0
  37. package/dist/icons/index.d.ts +22 -1
  38. package/dist/icons/index.d.ts.map +1 -0
  39. package/dist/icons/index.js +2 -2
  40. package/dist/index-BTeHvysI.d.ts +807 -0
  41. package/dist/index-BTeHvysI.d.ts.map +1 -0
  42. package/dist/index-DySzkJlC.d.ts +78 -0
  43. package/dist/index-DySzkJlC.d.ts.map +1 -0
  44. package/dist/index.d.ts +5 -8
  45. package/dist/index.js +6 -100
  46. package/dist/mdx/provider.d.ts +61 -4
  47. package/dist/mdx/provider.d.ts.map +1 -0
  48. package/dist/mdx/provider.js +89 -117
  49. package/dist/mdx/provider.js.map +1 -1
  50. package/dist/runtime/index.d.ts +2 -41
  51. package/dist/runtime/index.js +2 -28
  52. package/dist/sidebar-utils-1Skqle1Q.js +109 -0
  53. package/dist/sidebar-utils-1Skqle1Q.js.map +1 -0
  54. package/dist/theme/index.d.ts +201 -182
  55. package/dist/theme/index.d.ts.map +1 -0
  56. package/dist/theme/index.js +288 -128
  57. package/dist/theme/index.js.map +1 -1
  58. package/dist/typedoc/components/index.d.ts +55 -0
  59. package/dist/typedoc/components/index.d.ts.map +1 -0
  60. package/dist/typedoc/components/index.js +339 -0
  61. package/dist/typedoc/components/index.js.map +1 -0
  62. package/dist/typedoc/index.d.ts +36 -305
  63. package/dist/typedoc/index.d.ts.map +1 -0
  64. package/dist/typedoc/index.js +97 -268
  65. package/dist/typedoc/index.js.map +1 -1
  66. package/dist/types-BCuJBsJu.d.ts +182 -0
  67. package/dist/types-BCuJBsJu.d.ts.map +1 -0
  68. package/dist/types-CTd_mkrv.d.ts +175 -0
  69. package/dist/types-CTd_mkrv.d.ts.map +1 -0
  70. package/dist/ui/index.d.ts +2 -178
  71. package/dist/ui/index.js +3 -95
  72. package/dist/ui/styles.css +1401 -1335
  73. package/dist/ui/styles.d.ts +1 -2
  74. package/dist/ui/styles.js +23 -4
  75. package/dist/ui-3grzJSsq.js +1314 -0
  76. package/dist/ui-3grzJSsq.js.map +1 -0
  77. package/dist/vite/index.d.ts +78 -86
  78. package/dist/vite/index.d.ts.map +1 -0
  79. package/dist/vite/index.js +2931 -1282
  80. package/dist/vite/index.js.map +1 -1
  81. package/package.json +30 -19
  82. package/dist/Features-D_Pt7zpA.d.ts +0 -615
  83. package/dist/Search-DOJMNI2T.css +0 -193
  84. package/dist/Search-DOJMNI2T.css.map +0 -1
  85. package/dist/Search-VYYG3D43.js +0 -10
  86. package/dist/Search-VYYG3D43.js.map +0 -1
  87. package/dist/chunk-4YQE3TNM.js +0 -1
  88. package/dist/chunk-4YQE3TNM.js.map +0 -1
  89. package/dist/chunk-AXLJDGQL.js +0 -1
  90. package/dist/chunk-AXLJDGQL.js.map +0 -1
  91. package/dist/chunk-CZM5NX27.js +0 -909
  92. package/dist/chunk-CZM5NX27.js.map +0 -1
  93. package/dist/chunk-FZP2AVJL.js +0 -43
  94. package/dist/chunk-FZP2AVJL.js.map +0 -1
  95. package/dist/chunk-IEPSORG5.js +0 -444
  96. package/dist/chunk-IEPSORG5.js.map +0 -1
  97. package/dist/chunk-KUWEUO37.js +0 -1
  98. package/dist/chunk-KUWEUO37.js.map +0 -1
  99. package/dist/chunk-NBRHGTR2.js +0 -79
  100. package/dist/chunk-NBRHGTR2.js.map +0 -1
  101. package/dist/chunk-PGHUPTGL.js +0 -1035
  102. package/dist/chunk-PGHUPTGL.js.map +0 -1
  103. package/dist/chunk-PMS3P4MA.js +0 -43
  104. package/dist/chunk-PMS3P4MA.js.map +0 -1
  105. package/dist/chunk-QELSOHIY.js +0 -46
  106. package/dist/chunk-QELSOHIY.js.map +0 -1
  107. package/dist/chunk-R2QKY6G3.js +0 -1
  108. package/dist/chunk-R2QKY6G3.js.map +0 -1
  109. package/dist/chunk-ZPYQQZ7J.js +0 -210
  110. package/dist/chunk-ZPYQQZ7J.js.map +0 -1
  111. package/dist/icons/index.js.map +0 -1
  112. package/dist/index.css +0 -1290
  113. package/dist/index.css.map +0 -1
  114. package/dist/index.js.map +0 -1
  115. package/dist/mdx/provider.css +0 -403
  116. package/dist/mdx/provider.css.map +0 -1
  117. package/dist/runtime/index.js.map +0 -1
  118. package/dist/types-CLkHwCch.d.ts +0 -248
  119. package/dist/ui/index.css +0 -1290
  120. package/dist/ui/index.css.map +0 -1
  121. package/dist/ui/index.js.map +0 -1
  122. package/dist/ui/styles.css.map +0 -1
  123. package/dist/ui/styles.js.map +0 -1
@@ -0,0 +1,1010 @@
1
+ import { d as useArdoSiteConfig, f as useArdoTOC, l as useArdoPageData, n as getPrevNextLinks, r as ArdoContext, u as useArdoSidebar } from "./sidebar-utils-1Skqle1Q.js";
2
+ import { Children, createContext, isValidElement, use, useEffect, useMemo, useRef, useState } from "react";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { Link, Links, Meta, Scripts, ScrollRestoration, useLocation } from "react-router";
5
+ import { Check as CheckIcon, ChevronDown as ChevronDownIcon, CircleX as XCircleIcon, Copy as CopyIcon, FileText as FileTextIcon, Info as InfoIcon, Lightbulb as LightbulbIcon, MessageCircle as MessageCircleIcon, Monitor as MonitorIcon, Moon as MoonIcon, Search as SearchIcon, Sun as SunIcon, TriangleAlert as AlertTriangleIcon, X as XIcon } from "lucide-react";
6
+ import "./assets/src/ui/Footer.css.ts.vanilla-BSzPIPt4.css";
7
+ import "./assets/src/ui/Layout.css.ts.vanilla-Bpx_-gJt.css";
8
+ import "./assets/src/ui/components/CodeBlock.css.ts.vanilla-lNKqskjQ.css";
9
+ import "./assets/src/ui/components/CopyButton.css.ts.vanilla-DZZ5jgTM.css";
10
+ import "./assets/src/ui/components/Container.css.ts.vanilla-CUhRUA9t.css";
11
+ import { createRuntimeFn } from "@vanilla-extract/recipes/createRuntimeFn";
12
+ import "./assets/src/ui/components/Steps.css.ts.vanilla-CisaxeNj.css";
13
+ import "./assets/src/ui/components/Tabs.css.ts.vanilla-C4-vJSnf.css";
14
+ import "./assets/src/ui/Breadcrumb.css.ts.vanilla-Dpgq-C_p.css";
15
+ import "./assets/src/ui/content.css.ts.vanilla-O_RaSPXm.css";
16
+ import "./assets/src/ui/DocPage.css.ts.vanilla-CXKuz4U-.css";
17
+ import "./assets/src/ui/Toc.css.ts.vanilla-CYqcWgvD.css";
18
+ //#region src/ui/Footer.css.ts
19
+ var contentMeta = "_169q00b9";
20
+ var footer = "_169q00b0";
21
+ var footerBuildTime = "_169q00b7";
22
+ var footerContainer = "_169q00b1";
23
+ var footerCopyright = "_169q00b6";
24
+ var footerLink = "_169q00b4";
25
+ var footerMessage = "_169q00b5";
26
+ var footerPrimary = "_169q00b2";
27
+ var footerSeparator = "_169q00b3";
28
+ var nextLink = "_169q00be _169q00bc";
29
+ var prevLink = "_169q00bc";
30
+ var prevNext = "_169q00bb";
31
+ var prevNextLabel = "_169q00bf";
32
+ var prevNextTitle = "_169q00bg";
33
+ //#endregion
34
+ //#region src/ui/Layout.css.ts
35
+ var home = "_8autjm3";
36
+ var homeMain = "_8autjm4";
37
+ var layout = "_8autjm0";
38
+ var layoutContainer = "_8autjm1";
39
+ var main = "_8autjm2";
40
+ var skipLink = "_8autjm5";
41
+ //#endregion
42
+ //#region src/ui/Layout.tsx
43
+ const ARDO_FAVICON = "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20style%3D%22stroke-linecap%3Around%3Bstroke-linejoin%3Around%22%20viewBox%3D%220%200%20600%20600%22%3E%3Cdefs%3E%3Csymbol%20id%3D%22a%22%20overflow%3D%22visible%22%3E%3Cpath%20d%3D%22M300%20300%20151%20128l2%20178-41%2094h93c-35%2032-55%2068-63%20107m63-106%2095%2081m-32-96%2028%2088%22%2F%3E%3Cellipse%20cx%3D%22222%22%20cy%3D%22327%22%20fill%3D%22%2300655a%22%20rx%3D%2220%22%20ry%3D%2233%22%2F%3E%3Ccircle%20cx%3D%22227%22%20cy%3D%22324%22%20r%3D%2271%22%2F%3E%3C%2Fsymbol%3E%3C%2Fdefs%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2300655a%22%20stroke-width%3D%2216%22%3E%3Cpath%20d%3D%22M155%20318c2-70%2066-126%20145-126s143%2056%20145%20126%22%2F%3E%3Ccircle%20cx%3D%22300%22%20cy%3D%22290%22%20r%3D%22270%22%2F%3E%3Cuse%20href%3D%22%23a%22%2F%3E%3Cuse%20href%3D%22%23a%22%20transform%3D%22matrix%28-1%200%200%201%20600%200%29%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E";
44
+ /**
45
+ * Default HTML shell for Ardo sites. Replaces the boilerplate `Layout` export
46
+ * that every root.tsx must define for React Router.
47
+ *
48
+ * @example Basic usage
49
+ * ```tsx
50
+ * // app/root.tsx
51
+ * export { RootLayout as Layout } from "ardo/ui"
52
+ * ```
53
+ *
54
+ * @example With favicon
55
+ * ```tsx
56
+ * import logo from "./assets/logo.svg"
57
+ * export const Layout = (props) => <RootLayout favicon={logo} {...props} />
58
+ * ```
59
+ */
60
+ function ArdoRootLayout({ children, favicon, lang }) {
61
+ const context = use(ArdoContext);
62
+ return /* @__PURE__ */ jsxs("html", {
63
+ lang: lang ?? context?.config.lang ?? "en",
64
+ suppressHydrationWarning: true,
65
+ children: [/* @__PURE__ */ jsxs("head", { children: [
66
+ /* @__PURE__ */ jsx("meta", { charSet: "utf-8" }),
67
+ /* @__PURE__ */ jsx("meta", {
68
+ name: "viewport",
69
+ content: "width=device-width, initial-scale=1"
70
+ }),
71
+ /* @__PURE__ */ jsx("link", {
72
+ rel: "icon",
73
+ type: "image/svg+xml",
74
+ href: favicon ?? ARDO_FAVICON
75
+ }),
76
+ /* @__PURE__ */ jsx(Meta, {}),
77
+ /* @__PURE__ */ jsx(Links, {})
78
+ ] }), /* @__PURE__ */ jsxs("body", {
79
+ suppressHydrationWarning: true,
80
+ children: [
81
+ children,
82
+ /* @__PURE__ */ jsx(ScrollRestoration, {}),
83
+ /* @__PURE__ */ jsx(Scripts, {})
84
+ ]
85
+ })]
86
+ });
87
+ }
88
+ /**
89
+ * Layout component with explicit slot props.
90
+ *
91
+ * @example
92
+ * ```tsx
93
+ * <Layout
94
+ * header={<Header logo="/logo.svg" title="Ardo" nav={...} />}
95
+ * sidebar={<Sidebar>...</Sidebar>}
96
+ * footer={<Footer message="MIT License" />}
97
+ * >
98
+ * <Outlet />
99
+ * </Layout>
100
+ * ```
101
+ */
102
+ function ArdoLayout({ header, sidebar, footer, children, className }) {
103
+ return /* @__PURE__ */ jsxs("div", {
104
+ className: className ?? "_8autjm0",
105
+ children: [
106
+ /* @__PURE__ */ jsx("a", {
107
+ href: "#main-content",
108
+ className: skipLink,
109
+ children: "Skip to content"
110
+ }),
111
+ header,
112
+ /* @__PURE__ */ jsxs("div", {
113
+ className: layoutContainer,
114
+ children: [sidebar, /* @__PURE__ */ jsxs("main", {
115
+ id: "main-content",
116
+ className: main,
117
+ children: [children, footer]
118
+ })]
119
+ })
120
+ ]
121
+ });
122
+ }
123
+ //#endregion
124
+ //#region src/ui/BareContent.tsx
125
+ const BareContentContext = createContext(false);
126
+ /**
127
+ * Wraps imported MDX content to render without the full Content wrapper
128
+ * (article, header, footer, navigation). Only the content body is rendered.
129
+ *
130
+ * ```tsx
131
+ * import MySnippet from "./snippet.mdx"
132
+ *
133
+ * <BareContent>
134
+ * <MySnippet />
135
+ * </BareContent>
136
+ * ```
137
+ */
138
+ function ArdoBareContent({ children }) {
139
+ return /* @__PURE__ */ jsx(BareContentContext, {
140
+ value: true,
141
+ children
142
+ });
143
+ }
144
+ function useBareContent() {
145
+ return use(BareContentContext);
146
+ }
147
+ //#endregion
148
+ //#region src/ui/components/CodeBlock.css.ts
149
+ var codeBlock = "_1l68ra30";
150
+ var codeGroup = "_1l68ra35";
151
+ var codeGroupPanel = "_1l68ra39";
152
+ var codeGroupPanels = "_1l68ra38";
153
+ var codeGroupTab = "_1l68ra37";
154
+ var codeGroupTabs = "_1l68ra36";
155
+ var codeLine = "_1l68ra33";
156
+ var codeTitle = "_1l68ra31";
157
+ var codeWrapper = "_1l68ra32";
158
+ //#endregion
159
+ //#region src/ui/components/CopyButton.css.ts
160
+ var copyButton = "_1flm2ul1";
161
+ var copyText = "_1flm2ul0";
162
+ //#endregion
163
+ //#region src/ui/components/CopyButton.tsx
164
+ function ArdoCopyButton({ code }) {
165
+ const [copied, setCopied] = useState(false);
166
+ const handleCopy = async () => {
167
+ try {
168
+ await navigator.clipboard.writeText(code);
169
+ setCopied(true);
170
+ setTimeout(() => {
171
+ setCopied(false);
172
+ }, 2e3);
173
+ } catch (error) {
174
+ console.error("Failed to copy:", error);
175
+ }
176
+ };
177
+ return /* @__PURE__ */ jsxs("button", {
178
+ type: "button",
179
+ className: copyButton,
180
+ onClick: () => {
181
+ handleCopy();
182
+ },
183
+ "aria-label": copied ? "Copied!" : "Copy code",
184
+ children: [copied ? /* @__PURE__ */ jsx(CheckIcon, { size: 16 }) : /* @__PURE__ */ jsx(CopyIcon, { size: 16 }), /* @__PURE__ */ jsx("span", {
185
+ className: copyText,
186
+ children: copied ? "Copied!" : "Copy"
187
+ })]
188
+ });
189
+ }
190
+ //#endregion
191
+ //#region src/ui/components/CodeBlock.tsx
192
+ const EMPTY_HIGHLIGHT_LINES = [];
193
+ /**
194
+ * Strips leading/trailing blank lines and removes common leading whitespace
195
+ * so that template literals in indented JSX render cleanly.
196
+ */
197
+ function outdent(text) {
198
+ let start = 0;
199
+ while (start < text.length && text[start] === "\n") start++;
200
+ let end = text.length;
201
+ while (end > start && (text[end - 1] === "\n" || text[end - 1] === "\r" || text[end - 1] === " " || text[end - 1] === " ")) end--;
202
+ const trimmed = text.slice(start, end);
203
+ const lines = trimmed.split("\n");
204
+ const indent = lines.reduce((min, line) => {
205
+ if (line.trim().length === 0) return min;
206
+ const match = /^(\s*)/.exec(line);
207
+ return match ? Math.min(min, match[1].length) : min;
208
+ }, Infinity);
209
+ if (indent === 0 || indent === Infinity) return trimmed;
210
+ return lines.map((line) => line.slice(indent)).join("\n");
211
+ }
212
+ function CodeBlockContent({ html, hasHtml, hasCustomChildren, language, lines, highlightLines, lineNumbers, children }) {
213
+ if (hasHtml) return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html ?? "" } });
214
+ if (hasCustomChildren) return /* @__PURE__ */ jsx(Fragment, { children });
215
+ return /* @__PURE__ */ jsx("pre", {
216
+ className: `language-${language}`,
217
+ children: /* @__PURE__ */ jsx("code", { children: lines.map((line, index) => {
218
+ const lineNum = index + 1;
219
+ return /* @__PURE__ */ jsxs("span", {
220
+ className: highlightLines.includes(lineNum) ? `${codeLine} highlighted` : codeLine,
221
+ children: [
222
+ lineNumbers && /* @__PURE__ */ jsx("span", {
223
+ className: "_1l68ra34",
224
+ children: lineNum
225
+ }),
226
+ /* @__PURE__ */ jsx("span", { children: line }),
227
+ index < lines.length - 1 && "\n"
228
+ ]
229
+ }, `${lineNum}-${line}`);
230
+ }) })
231
+ });
232
+ }
233
+ /**
234
+ * Syntax-highlighted code block with copy button.
235
+ *
236
+ * Code can be provided via the `code` prop or as children:
237
+ * ```tsx
238
+ * <CodeBlock language="typescript">{`
239
+ * const x = 42
240
+ * `}</CodeBlock>
241
+ * ```tsx
242
+ * When children is a string, leading/trailing blank lines and common
243
+ * indentation are stripped automatically.
244
+ */
245
+ function ArdoCodeBlock({ code: codeProp, language = "text", title, lineNumbers = false, highlightLines = EMPTY_HIGHLIGHT_LINES, children, __html }) {
246
+ const code = codeProp ?? (typeof children === "string" ? outdent(children) : "");
247
+ const hasCustomChildren = children != null && typeof children !== "string";
248
+ const hasHtml = (__html ?? "") !== "";
249
+ const hasTitle = (title ?? "") !== "";
250
+ const lines = code.split("\n");
251
+ return /* @__PURE__ */ jsxs("div", {
252
+ className: codeBlock,
253
+ "data-lang": language,
254
+ children: [hasTitle && /* @__PURE__ */ jsx("div", {
255
+ className: "_1l68ra31",
256
+ children: title
257
+ }), /* @__PURE__ */ jsxs("div", {
258
+ className: codeWrapper,
259
+ children: [/* @__PURE__ */ jsx(CodeBlockContent, {
260
+ html: __html,
261
+ hasHtml,
262
+ hasCustomChildren,
263
+ language,
264
+ lines,
265
+ highlightLines,
266
+ lineNumbers,
267
+ children
268
+ }), /* @__PURE__ */ jsx(ArdoCopyButton, { code })]
269
+ })]
270
+ });
271
+ }
272
+ /**
273
+ * Tabbed group of code blocks.
274
+ * Labels come from the `labels` prop (set at remark level) or fall back to
275
+ * data-label / title / language props on children.
276
+ */
277
+ function ArdoCodeGroup({ children, labels: labelsStr }) {
278
+ const [activeTab, setActiveTab] = useState(0);
279
+ const hasLabels = (labelsStr ?? "") !== "";
280
+ const childArray = Children.toArray(children).filter((child) => isValidElement(child));
281
+ const labelArray = hasLabels ? (labelsStr ?? "").split(",") : [];
282
+ const tabs = childArray.map((child, index) => {
283
+ if (index < labelArray.length) {
284
+ const explicitLabel = labelArray[index];
285
+ if (explicitLabel !== "") return explicitLabel;
286
+ }
287
+ return readStringProp(child.props, "data-label") ?? readStringProp(child.props, "title") ?? readStringProp(child.props, "language") ?? `Tab ${index + 1}`;
288
+ });
289
+ return /* @__PURE__ */ jsxs("div", {
290
+ className: codeGroup,
291
+ children: [/* @__PURE__ */ jsx("div", {
292
+ className: codeGroupTabs,
293
+ children: tabs.map((tab, index) => /* @__PURE__ */ jsx("button", {
294
+ type: "button",
295
+ className: [codeGroupTab, index === activeTab && "active"].filter(Boolean).join(" "),
296
+ onClick: () => {
297
+ setActiveTab(index);
298
+ },
299
+ children: tab
300
+ }, tab))
301
+ }), /* @__PURE__ */ jsx("div", {
302
+ className: codeGroupPanels,
303
+ children: childArray.map((child, index) => /* @__PURE__ */ jsx("div", {
304
+ className: [codeGroupPanel, index === activeTab && "active"].filter(Boolean).join(" "),
305
+ style: { display: index === activeTab ? "block" : "none" },
306
+ children: child
307
+ }, tabAt(tabs, index)))
308
+ })]
309
+ });
310
+ }
311
+ function readStringProp(props, name) {
312
+ if (!isRecord(props)) return;
313
+ const value = props[name];
314
+ return typeof value === "string" && value !== "" ? value : void 0;
315
+ }
316
+ function isRecord(value) {
317
+ return value != null && typeof value === "object";
318
+ }
319
+ function tabAt(tabs, index) {
320
+ return tabs[index];
321
+ }
322
+ //#endregion
323
+ //#region src/ui/components/Container.css.ts
324
+ var container = createRuntimeFn({
325
+ defaultClassName: "_1l7ew7r0",
326
+ variantClassNames: { type: {
327
+ tip: "_1l7ew7r1",
328
+ warning: "_1l7ew7r2",
329
+ danger: "_1l7ew7r3",
330
+ info: "_1l7ew7r4",
331
+ note: "_1l7ew7r5"
332
+ } },
333
+ defaultVariants: {},
334
+ compoundVariants: []
335
+ });
336
+ var containerBody = "_1l7ew7rc";
337
+ var containerContent = "_1l7ew7rj";
338
+ var containerIcon = createRuntimeFn({
339
+ defaultClassName: "_1l7ew7r6",
340
+ variantClassNames: { type: {
341
+ tip: "_1l7ew7r7",
342
+ warning: "_1l7ew7r8",
343
+ danger: "_1l7ew7r9",
344
+ info: "_1l7ew7ra",
345
+ note: "_1l7ew7rb"
346
+ } },
347
+ defaultVariants: {},
348
+ compoundVariants: []
349
+ });
350
+ var containerTitle = createRuntimeFn({
351
+ defaultClassName: "_1l7ew7rd",
352
+ variantClassNames: { type: {
353
+ tip: "_1l7ew7re",
354
+ warning: "_1l7ew7rf",
355
+ danger: "_1l7ew7rg",
356
+ info: "_1l7ew7rh",
357
+ note: "_1l7ew7ri"
358
+ } },
359
+ defaultVariants: {},
360
+ compoundVariants: []
361
+ });
362
+ //#endregion
363
+ //#region src/ui/components/Container.tsx
364
+ const defaultTitles = {
365
+ tip: "TIP",
366
+ warning: "WARNING",
367
+ danger: "DANGER",
368
+ info: "INFO",
369
+ note: "NOTE"
370
+ };
371
+ const icons = {
372
+ tip: /* @__PURE__ */ jsx(LightbulbIcon, { size: 18 }),
373
+ warning: /* @__PURE__ */ jsx(AlertTriangleIcon, { size: 18 }),
374
+ danger: /* @__PURE__ */ jsx(XCircleIcon, { size: 18 }),
375
+ info: /* @__PURE__ */ jsx(InfoIcon, { size: 18 }),
376
+ note: /* @__PURE__ */ jsx(FileTextIcon, { size: 18 })
377
+ };
378
+ /**
379
+ * A styled container for callouts, tips, warnings, etc.
380
+ */
381
+ function ArdoContainer({ type, title, children }) {
382
+ const hasCustomTitle = title != null && title !== "" && title !== defaultTitles[type];
383
+ return /* @__PURE__ */ jsxs("div", {
384
+ className: container({ type }),
385
+ children: [/* @__PURE__ */ jsx("span", {
386
+ className: containerIcon({ type }),
387
+ children: icons[type]
388
+ }), /* @__PURE__ */ jsxs("div", {
389
+ className: containerBody,
390
+ children: [hasCustomTitle && /* @__PURE__ */ jsx("p", {
391
+ className: containerTitle({ type }),
392
+ children: title
393
+ }), /* @__PURE__ */ jsx("div", {
394
+ className: containerContent,
395
+ children
396
+ })]
397
+ })]
398
+ });
399
+ }
400
+ /**
401
+ * A tip container for helpful information.
402
+ */
403
+ function ArdoTip({ title, children }) {
404
+ return /* @__PURE__ */ jsx(ArdoContainer, {
405
+ type: "tip",
406
+ title,
407
+ children
408
+ });
409
+ }
410
+ /**
411
+ * A warning container for cautionary information.
412
+ */
413
+ function ArdoWarning({ title, children }) {
414
+ return /* @__PURE__ */ jsx(ArdoContainer, {
415
+ type: "warning",
416
+ title,
417
+ children
418
+ });
419
+ }
420
+ /**
421
+ * A danger container for critical warnings.
422
+ */
423
+ function ArdoDanger({ title, children }) {
424
+ return /* @__PURE__ */ jsx(ArdoContainer, {
425
+ type: "danger",
426
+ title,
427
+ children
428
+ });
429
+ }
430
+ /**
431
+ * An info container for informational content.
432
+ */
433
+ function ArdoInfo({ title, children }) {
434
+ return /* @__PURE__ */ jsx(ArdoContainer, {
435
+ type: "info",
436
+ title,
437
+ children
438
+ });
439
+ }
440
+ /**
441
+ * A note container for additional information.
442
+ */
443
+ function ArdoNote({ title, children }) {
444
+ return /* @__PURE__ */ jsx(ArdoContainer, {
445
+ type: "note",
446
+ title,
447
+ children
448
+ });
449
+ }
450
+ //#endregion
451
+ //#region src/ui/components/Icon.tsx
452
+ const iconRegistry = /* @__PURE__ */ new Map();
453
+ /**
454
+ * Register icons for use with the Icon component.
455
+ * Only registered icons are included in your bundle.
456
+ *
457
+ * @example
458
+ * ```tsx
459
+ * // In your app's entry point or layout:
460
+ * import { registerIcons } from "ardo/ui"
461
+ * import { Zap, Rocket, Code } from "lucide-react"
462
+ *
463
+ * registerIcons({ Zap, Rocket, Code })
464
+ * ```
465
+ */
466
+ function registerIcons(icons) {
467
+ for (const [name, icon] of Object.entries(icons)) iconRegistry.set(name, icon);
468
+ }
469
+ /**
470
+ * Get all registered icon names (useful for documentation).
471
+ */
472
+ function getRegisteredIconNames() {
473
+ return [...iconRegistry.keys()];
474
+ }
475
+ /**
476
+ * Renders a registered icon by name.
477
+ * Icons must be registered first using `registerIcons()`.
478
+ *
479
+ * @example
480
+ * ```tsx
481
+ * // First register icons in your app:
482
+ * import { registerIcons } from "ardo/ui"
483
+ * import { Zap, Rocket } from "lucide-react"
484
+ * registerIcons({ Zap, Rocket })
485
+ *
486
+ * // Then use in MDX:
487
+ * <Icon name="Zap" size={24} />
488
+ * <Icon name="Rocket" className="text-brand" />
489
+ * ```
490
+ *
491
+ * @see https://lucide.dev/icons for available icon names
492
+ */
493
+ function ArdoIcon({ name, ...props }) {
494
+ const IconComp = iconRegistry.get(name);
495
+ if (!IconComp) {
496
+ console.warn(`[Ardo] Icon "${name}" not found. Did you register it with registerIcons()?`);
497
+ return null;
498
+ }
499
+ return /* @__PURE__ */ jsx(IconComp, { ...props });
500
+ }
501
+ //#endregion
502
+ //#region src/ui/components/Steps.css.ts
503
+ var steps = "go9pz30";
504
+ //#endregion
505
+ //#region src/ui/components/Steps.tsx
506
+ /**
507
+ * A wrapper for step-by-step instructions rendered as an ordered list.
508
+ *
509
+ * @example
510
+ * ```tsx
511
+ * <ArdoSteps>
512
+ * <ol>
513
+ * <li>Install the package</li>
514
+ * <li>Configure your site</li>
515
+ * <li>Start writing</li>
516
+ * </ol>
517
+ * </ArdoSteps>
518
+ * ```
519
+ */
520
+ function ArdoSteps({ children }) {
521
+ return /* @__PURE__ */ jsx("div", {
522
+ className: steps,
523
+ children
524
+ });
525
+ }
526
+ //#endregion
527
+ //#region src/ui/components/Tabs.css.ts
528
+ var tab = "_1jypr342";
529
+ var tabList = "_1jypr341";
530
+ var tabPanel = "_1jypr343";
531
+ var tabPanels = "_1jypr344";
532
+ var tabs = "_1jypr340";
533
+ //#endregion
534
+ //#region src/ui/components/Tabs.tsx
535
+ const TabsContext = createContext(null);
536
+ const AUTO_TAB_PREFIX = "__ardo-tab-";
537
+ function useTabsContext() {
538
+ const context = use(TabsContext);
539
+ if (!context) throw new Error("Tab components must be used within an ArdoTabs component");
540
+ return context;
541
+ }
542
+ /**
543
+ * Tabs container component for organizing content into tabbed panels.
544
+ */
545
+ function ArdoTabs({ defaultValue, children }) {
546
+ const [activeTab, setActiveTab] = useState(() => defaultValue ?? findFirstTabValue(children));
547
+ const tabIndexRef = useRef(0);
548
+ const panelIndexRef = useRef(0);
549
+ tabIndexRef.current = 0;
550
+ panelIndexRef.current = 0;
551
+ const getTabValue = (value) => {
552
+ const index = tabIndexRef.current++;
553
+ return value ?? `${AUTO_TAB_PREFIX}${index}`;
554
+ };
555
+ const getPanelValue = (value) => {
556
+ const index = panelIndexRef.current++;
557
+ return value ?? `${AUTO_TAB_PREFIX}${index}`;
558
+ };
559
+ const effectiveTab = defaultValue ?? activeTab;
560
+ return /* @__PURE__ */ jsx(TabsContext, {
561
+ value: useMemo(() => ({
562
+ activeTab: effectiveTab,
563
+ setActiveTab,
564
+ getTabValue,
565
+ getPanelValue
566
+ }), [effectiveTab]),
567
+ children: /* @__PURE__ */ jsx("div", {
568
+ className: tabs,
569
+ children
570
+ })
571
+ });
572
+ }
573
+ /**
574
+ * Container for ArdoTab buttons.
575
+ */
576
+ function ArdoTabList({ children }) {
577
+ return /* @__PURE__ */ jsx("div", {
578
+ className: tabList,
579
+ role: "tablist",
580
+ children
581
+ });
582
+ }
583
+ /**
584
+ * Individual tab button.
585
+ */
586
+ function ArdoTab({ value, children }) {
587
+ const { activeTab, setActiveTab, getTabValue } = useTabsContext();
588
+ const resolvedValue = getTabValue(value);
589
+ const isActive = activeTab === resolvedValue;
590
+ return /* @__PURE__ */ jsx("button", {
591
+ type: "button",
592
+ role: "tab",
593
+ "aria-selected": isActive,
594
+ className: [tab, isActive && "active"].filter(Boolean).join(" "),
595
+ onClick: () => {
596
+ setActiveTab(resolvedValue);
597
+ },
598
+ children
599
+ });
600
+ }
601
+ /**
602
+ * Content panel for a tab.
603
+ */
604
+ function ArdoTabPanel({ value, children }) {
605
+ const { activeTab, getPanelValue } = useTabsContext();
606
+ if (!(activeTab === getPanelValue(value))) return null;
607
+ return /* @__PURE__ */ jsx("div", {
608
+ role: "tabpanel",
609
+ className: tabPanel,
610
+ children
611
+ });
612
+ }
613
+ /**
614
+ * Container for ArdoTabPanel components.
615
+ */
616
+ function ArdoTabPanels({ children }) {
617
+ return /* @__PURE__ */ jsx("div", {
618
+ className: tabPanels,
619
+ children
620
+ });
621
+ }
622
+ function findFirstTabValue(children) {
623
+ for (const child of Children.toArray(children)) {
624
+ const tabValue = getFirstTabValueFromChild(child);
625
+ if (tabValue != null) return tabValue;
626
+ }
627
+ return "";
628
+ }
629
+ function getFirstTabValueFromChild(child) {
630
+ if (!isValidElement(child)) return null;
631
+ if (isValidElement(child) && child.type === ArdoTab) return child.props.value ?? `${AUTO_TAB_PREFIX}0`;
632
+ const nestedChildren = child.props.children;
633
+ if (nestedChildren == null) return null;
634
+ const nestedValue = findFirstTabValue(nestedChildren);
635
+ return nestedValue === "" ? null : nestedValue;
636
+ }
637
+ //#endregion
638
+ //#region src/ui/Breadcrumb.css.ts
639
+ var breadcrumb = "_19g8fxh0";
640
+ var breadcrumbCurrent = "_19g8fxh2";
641
+ //#endregion
642
+ //#region src/ui/Breadcrumb.tsx
643
+ function matchInChildren(groupText, items, path) {
644
+ for (const item of items) {
645
+ if (item.link === path) return {
646
+ section: groupText,
647
+ page: item.text
648
+ };
649
+ if (item.items != null) {
650
+ const sub = item.items.find((s) => s.link === path);
651
+ if (sub != null) return {
652
+ section: groupText,
653
+ page: sub.text
654
+ };
655
+ }
656
+ }
657
+ }
658
+ function findBreadcrumb(sidebar, currentPath) {
659
+ for (const group of sidebar) {
660
+ if (group.link === currentPath) return { page: group.text };
661
+ if (group.items != null) {
662
+ const found = matchInChildren(group.text, group.items, currentPath);
663
+ if (found != null) return found;
664
+ }
665
+ }
666
+ return {};
667
+ }
668
+ function ArdoBreadcrumb() {
669
+ const { section, page } = findBreadcrumb(useArdoSidebar(), useLocation().pathname);
670
+ if (page == null || page === "") return null;
671
+ return /* @__PURE__ */ jsxs("nav", {
672
+ className: breadcrumb,
673
+ "aria-label": "Breadcrumb",
674
+ children: [section != null && section !== "" && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: section }), /* @__PURE__ */ jsx("span", {
675
+ className: "_19g8fxh1",
676
+ "aria-hidden": true,
677
+ children: "›"
678
+ })] }), /* @__PURE__ */ jsx("span", {
679
+ className: breadcrumbCurrent,
680
+ children: page
681
+ })]
682
+ });
683
+ }
684
+ //#endregion
685
+ //#region src/ui/content.css.ts
686
+ var ardoContent = "jmxrtm0";
687
+ //#endregion
688
+ //#region src/ui/DocPage.css.ts
689
+ var contentBody = "_1f1m4jr5";
690
+ var contentContainer = "_1f1m4jr1";
691
+ var contentHeader = "_1f1m4jr2";
692
+ var contentTitle = "_1f1m4jr3";
693
+ var docPage = "_1f1m4jr0";
694
+ //#endregion
695
+ //#region src/ui/Content.tsx
696
+ function resolveEditLink(input) {
697
+ const resolved = input.editLink ?? input.siteConfig.editLink;
698
+ const pattern = resolved?.pattern ?? "";
699
+ const relativePath = input.pageData?.relativePath ?? "";
700
+ const show = input.pageData?.frontmatter.editLink !== false && pattern !== "" && input.pageData !== void 0;
701
+ return {
702
+ href: show ? pattern.replace(":path", relativePath) : void 0,
703
+ text: resolved?.text ?? "Edit this page",
704
+ show
705
+ };
706
+ }
707
+ function resolveLastUpdated(input) {
708
+ const resolved = input.lastUpdated ?? input.siteConfig.lastUpdated;
709
+ const value = input.pageData?.lastUpdated;
710
+ const show = input.pageData?.frontmatter.lastUpdated !== false && resolved?.enabled === true && typeof value === "number";
711
+ const formatOptions = resolved?.formatOptions ?? {
712
+ year: "numeric",
713
+ month: "long",
714
+ day: "numeric"
715
+ };
716
+ return {
717
+ label: resolved?.text ?? "Last updated",
718
+ text: show ? new Date(value).toLocaleDateString(void 0, formatOptions) : void 0,
719
+ show
720
+ };
721
+ }
722
+ function ArdoContent({ children, editLink, lastUpdated }) {
723
+ const isBare = useBareContent();
724
+ const pageData = useArdoPageData();
725
+ const siteConfig = useArdoSiteConfig();
726
+ const sidebar = useArdoSidebar();
727
+ const location = useLocation();
728
+ if (isBare) return /* @__PURE__ */ jsx("div", {
729
+ className: `${contentBody} ${ardoContent}`,
730
+ children
731
+ });
732
+ const input = {
733
+ pageData,
734
+ editLink,
735
+ lastUpdated,
736
+ siteConfig
737
+ };
738
+ const edit = resolveEditLink(input);
739
+ const updated = resolveLastUpdated(input);
740
+ const { prev, next } = getPrevNextLinks(sidebar, location.pathname);
741
+ return /* @__PURE__ */ jsxs("article", {
742
+ className: contentContainer,
743
+ children: [
744
+ /* @__PURE__ */ jsx(ArdoBreadcrumb, {}),
745
+ /* @__PURE__ */ jsx(ContentHeader, {
746
+ title: pageData?.frontmatter.title ?? "",
747
+ description: pageData?.frontmatter.description ?? ""
748
+ }),
749
+ /* @__PURE__ */ jsx("div", {
750
+ className: `${contentBody} ${ardoContent}`,
751
+ children
752
+ }),
753
+ /* @__PURE__ */ jsx(ContentMeta, {
754
+ edit,
755
+ updated
756
+ }),
757
+ /* @__PURE__ */ jsx(ContentPrevNext, {
758
+ prev,
759
+ next
760
+ })
761
+ ]
762
+ });
763
+ }
764
+ function ContentHeader({ title, description }) {
765
+ if (title === "") return null;
766
+ return /* @__PURE__ */ jsxs("header", {
767
+ className: contentHeader,
768
+ children: [/* @__PURE__ */ jsx("h1", {
769
+ className: contentTitle,
770
+ children: title
771
+ }), description !== "" && /* @__PURE__ */ jsx("p", {
772
+ className: "_1f1m4jr4",
773
+ children: description
774
+ })]
775
+ });
776
+ }
777
+ function ContentMeta({ edit, updated }) {
778
+ if (!edit.show && !updated.show) return null;
779
+ return /* @__PURE__ */ jsxs("div", {
780
+ className: contentMeta,
781
+ children: [edit.show && /* @__PURE__ */ jsx("a", {
782
+ href: edit.href,
783
+ target: "_blank",
784
+ rel: "noopener noreferrer",
785
+ className: "_169q00ba",
786
+ children: edit.text
787
+ }), updated.show && /* @__PURE__ */ jsxs("span", { children: [
788
+ updated.label,
789
+ ": ",
790
+ updated.text
791
+ ] })]
792
+ });
793
+ }
794
+ function ContentPrevNext({ prev, next }) {
795
+ const prevLink$1 = prev?.link ?? "";
796
+ const nextLink$1 = next?.link ?? "";
797
+ const hasPrev = prevLink$1 !== "";
798
+ const hasNext = nextLink$1 !== "";
799
+ if (!hasPrev && !hasNext) return null;
800
+ return /* @__PURE__ */ jsxs("nav", {
801
+ className: prevNext,
802
+ "aria-label": "Page navigation",
803
+ children: [hasPrev ? /* @__PURE__ */ jsxs(Link, {
804
+ to: prevLink$1,
805
+ className: prevLink,
806
+ children: [/* @__PURE__ */ jsx("span", {
807
+ className: prevNextLabel,
808
+ children: "Previous"
809
+ }), /* @__PURE__ */ jsx("span", {
810
+ className: prevNextTitle,
811
+ children: prev?.text
812
+ })]
813
+ }) : /* @__PURE__ */ jsx("div", {}), hasNext ? /* @__PURE__ */ jsxs(Link, {
814
+ to: nextLink$1,
815
+ className: nextLink,
816
+ children: [/* @__PURE__ */ jsx("span", {
817
+ className: prevNextLabel,
818
+ children: "Next"
819
+ }), /* @__PURE__ */ jsx("span", {
820
+ className: prevNextTitle,
821
+ children: next?.text
822
+ })]
823
+ }) : /* @__PURE__ */ jsx("div", {})]
824
+ });
825
+ }
826
+ //#endregion
827
+ //#region src/ui/Toc.css.ts
828
+ var toc = "_16vvfx80";
829
+ var tocLink = "_16vvfx83";
830
+ var tocList = "_16vvfx82";
831
+ var tocTitle = "_16vvfx81";
832
+ //#endregion
833
+ //#region src/ui/Toc.tsx
834
+ function ArdoTOC({ label: labelProp } = {}) {
835
+ const toc$1 = useArdoTOC();
836
+ const siteConfig = useArdoSiteConfig();
837
+ const [activeId, setActiveId] = useState("");
838
+ const scrollContainerRef = useRef(null);
839
+ const isClickScrolling = useRef(false);
840
+ const label = labelProp ?? siteConfig.tocLabel ?? "On this page";
841
+ useEffect(() => {
842
+ scrollContainerRef.current = document.getElementById("main-content");
843
+ }, []);
844
+ useEffect(() => {
845
+ if (toc$1.length === 0) return;
846
+ const scrollContainer = scrollContainerRef.current;
847
+ if (!scrollContainer) return;
848
+ const headingElements = toc$1.map((item) => document.getElementById(item.id)).filter(Boolean);
849
+ if (headingElements.length === 0) return;
850
+ const observer = new IntersectionObserver((entries) => {
851
+ if (isClickScrolling.current) return;
852
+ for (const entry of entries) if (entry.isIntersecting) {
853
+ setActiveId(entry.target.id);
854
+ break;
855
+ }
856
+ }, {
857
+ root: scrollContainer,
858
+ rootMargin: "-20px 0px -85% 0px",
859
+ threshold: 0
860
+ });
861
+ for (const element of headingElements) if (element !== null) observer.observe(element);
862
+ return () => {
863
+ for (const element of headingElements) if (element !== null) observer.unobserve(element);
864
+ };
865
+ }, [toc$1]);
866
+ const handleClickItem = (id) => {
867
+ setActiveId(id);
868
+ isClickScrolling.current = true;
869
+ const element = document.getElementById(id);
870
+ const container = scrollContainerRef.current;
871
+ if (element) {
872
+ element.scrollIntoView({
873
+ behavior: "smooth",
874
+ block: "start"
875
+ });
876
+ globalThis.history.pushState(null, "", `#${id}`);
877
+ }
878
+ if (container) {
879
+ const onScrollEnd = () => {
880
+ isClickScrolling.current = false;
881
+ container.removeEventListener("scrollend", onScrollEnd);
882
+ };
883
+ container.addEventListener("scrollend", onScrollEnd, { once: true });
884
+ setTimeout(() => {
885
+ isClickScrolling.current = false;
886
+ }, 1e3);
887
+ } else isClickScrolling.current = false;
888
+ };
889
+ if (toc$1.length === 0) return null;
890
+ return /* @__PURE__ */ jsx("aside", {
891
+ className: toc,
892
+ children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
893
+ className: tocTitle,
894
+ children: label
895
+ }), /* @__PURE__ */ jsx("nav", {
896
+ "aria-label": "Table of contents",
897
+ children: /* @__PURE__ */ jsx(TOCItems, {
898
+ items: toc$1,
899
+ activeId,
900
+ onClickItem: handleClickItem
901
+ })
902
+ })] })
903
+ });
904
+ }
905
+ function TOCItems({ items, activeId, onClickItem }) {
906
+ return /* @__PURE__ */ jsx("ul", {
907
+ className: tocList,
908
+ children: items.map((item) => /* @__PURE__ */ jsx(TOCItemComponent, {
909
+ item,
910
+ activeId,
911
+ onClickItem
912
+ }, item.id))
913
+ });
914
+ }
915
+ function TOCItemComponent({ item, activeId, onClickItem }) {
916
+ const isActive = item.id === activeId;
917
+ const hasActiveChild = hasActiveDescendant(item, activeId);
918
+ return /* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("a", {
919
+ href: `#${item.id}`,
920
+ className: [
921
+ tocLink,
922
+ item.level === 3 && "_16vvfx84",
923
+ item.level === 4 && "_16vvfx85",
924
+ isActive && "active",
925
+ hasActiveChild && "child-active"
926
+ ].filter(Boolean).join(" "),
927
+ onClick: (e) => {
928
+ e.preventDefault();
929
+ onClickItem(item.id);
930
+ },
931
+ children: item.text
932
+ }), item.children && item.children.length > 0 && /* @__PURE__ */ jsx(TOCItems, {
933
+ items: item.children,
934
+ activeId,
935
+ onClickItem
936
+ })] });
937
+ }
938
+ function hasActiveDescendant(item, activeId) {
939
+ if (!item.children) return false;
940
+ for (const child of item.children) {
941
+ if (child.id === activeId) return true;
942
+ if (hasActiveDescendant(child, activeId)) return true;
943
+ }
944
+ return false;
945
+ }
946
+ //#endregion
947
+ //#region src/ui/DocPage.tsx
948
+ /**
949
+ * Full documentation page with Layout wrapper.
950
+ * Use this when you don't have a _layout.tsx file.
951
+ *
952
+ * @example
953
+ * ```tsx
954
+ * <DocPage>
955
+ * <Content />
956
+ * </DocPage>
957
+ * ```
958
+ */
959
+ function ArdoDocPage({ children, editLink, lastUpdated, tocLabel }) {
960
+ const hideToc = useArdoPageData()?.frontmatter.outline === false;
961
+ return /* @__PURE__ */ jsx(ArdoLayout, { children: /* @__PURE__ */ jsxs("div", {
962
+ className: docPage,
963
+ children: [/* @__PURE__ */ jsx(ArdoContent, {
964
+ editLink,
965
+ lastUpdated,
966
+ children
967
+ }), !hideToc && /* @__PURE__ */ jsx(ArdoTOC, { label: tocLabel })]
968
+ }) });
969
+ }
970
+ /**
971
+ * Documentation content without Layout wrapper.
972
+ * Use this when you have a _layout.tsx that provides the Layout.
973
+ *
974
+ * @example
975
+ * ```tsx
976
+ * // In _layout.tsx:
977
+ * <Layout>
978
+ * <Header ... />
979
+ * <Sidebar ... />
980
+ * <Outlet />
981
+ * <Footer ... />
982
+ * </Layout>
983
+ *
984
+ * // In page routes:
985
+ * <DocContent>
986
+ * <MarkdownContent />
987
+ * </DocContent>
988
+ * ```
989
+ */
990
+ function ArdoDocContent({ children, editLink, lastUpdated, tocLabel }) {
991
+ const hideToc = useArdoPageData()?.frontmatter.outline === false;
992
+ return /* @__PURE__ */ jsxs("div", {
993
+ className: docPage,
994
+ children: [/* @__PURE__ */ jsx(ArdoContent, {
995
+ editLink,
996
+ lastUpdated,
997
+ children
998
+ }), !hideToc && /* @__PURE__ */ jsx(ArdoTOC, { label: tocLabel })]
999
+ });
1000
+ }
1001
+ /**
1002
+ * @deprecated Use DocPage or DocContent instead
1003
+ */
1004
+ function ArdoDocLayout({ content }) {
1005
+ return /* @__PURE__ */ jsx(ArdoDocPage, { children: content });
1006
+ }
1007
+ //#endregion
1008
+ export { home as A, footerSeparator as B, ArdoCopyButton as C, ArdoBareContent as D, codeWrapper as E, footerContainer as F, SearchIcon as G, MessageCircleIcon as H, footerCopyright as I, SunIcon as K, footerLink as L, layout as M, footer as N, ArdoLayout as O, footerBuildTime as P, footerMessage as R, ArdoCodeGroup as S, codeTitle as T, MonitorIcon as U, ChevronDownIcon as V, MoonIcon as W, ArdoInfo as _, ArdoContent as a, ArdoWarning as b, ArdoTabPanel as c, ArdoSteps as d, ArdoIcon as f, ArdoDanger as g, ArdoContainer as h, ArdoTOC as i, homeMain as j, ArdoRootLayout as k, ArdoTabPanels as l, registerIcons as m, ArdoDocLayout as n, ArdoTab as o, getRegisteredIconNames as p, XIcon as q, ArdoDocPage as r, ArdoTabList as s, ArdoDocContent as t, ArdoTabs as u, ArdoNote as v, codeBlock as w, ArdoCodeBlock as x, ArdoTip as y, footerPrimary as z };
1009
+
1010
+ //# sourceMappingURL=DocPage-CIBiCAxZ.js.map