ardo 3.0.3 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FileTree-K0YVFXhg.d.ts → FileTree-qpT1ZVrW.d.ts} +7 -5
- package/dist/{chunk-UWFMFHRD.js → chunk-QKDVSW6Q.js} +57 -9
- package/dist/{chunk-UWFMFHRD.js.map → chunk-QKDVSW6Q.js.map} +1 -1
- package/dist/{chunk-TDBU2FXP.js → chunk-XK7YZAVP.js} +65 -22
- package/dist/chunk-XK7YZAVP.js.map +1 -0
- package/dist/index.d.ts +3 -6
- package/dist/index.js +2 -44
- package/dist/mdx/provider.js +1 -1
- package/dist/typedoc/index.js +259 -10
- package/dist/typedoc/index.js.map +1 -1
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +2 -2
- package/dist/ui/styles.css +83 -2
- package/dist/vite/index.d.ts +1 -1
- package/dist/vite/index.js +1314 -16
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-TDBU2FXP.js.map +0 -1
- package/dist/chunk-TTOK7CO6.js +0 -1341
- package/dist/chunk-TTOK7CO6.js.map +0 -1
- package/dist/chunk-Y46KCHBO.js +0 -274
- package/dist/chunk-Y46KCHBO.js.map +0 -1
|
@@ -71,6 +71,8 @@ interface HeaderProps {
|
|
|
71
71
|
search?: boolean;
|
|
72
72
|
/** Show theme toggle (default: true) */
|
|
73
73
|
themeToggle?: boolean;
|
|
74
|
+
/** Additional content rendered in the mobile menu (e.g. sidebar) */
|
|
75
|
+
mobileMenuContent?: ReactNode;
|
|
74
76
|
/** Additional CSS classes */
|
|
75
77
|
className?: string;
|
|
76
78
|
}
|
|
@@ -99,7 +101,7 @@ interface HeaderProps {
|
|
|
99
101
|
* />
|
|
100
102
|
* ```
|
|
101
103
|
*/
|
|
102
|
-
declare function Header({ logo, title, nav, actions, search, themeToggle, className, }: HeaderProps): react_jsx_runtime.JSX.Element;
|
|
104
|
+
declare function Header({ logo, title, nav, actions, search, themeToggle, mobileMenuContent, className, }: HeaderProps): react_jsx_runtime.JSX.Element;
|
|
103
105
|
interface SocialLinkProps {
|
|
104
106
|
/** URL to link to */
|
|
105
107
|
href: string;
|
|
@@ -457,8 +459,8 @@ interface TabListProps {
|
|
|
457
459
|
*/
|
|
458
460
|
declare function TabList({ children }: TabListProps): react_jsx_runtime.JSX.Element;
|
|
459
461
|
interface TabProps {
|
|
460
|
-
/** Unique value identifying this tab */
|
|
461
|
-
value
|
|
462
|
+
/** Unique value identifying this tab (optional if tab order matches panels) */
|
|
463
|
+
value?: string;
|
|
462
464
|
/** Tab button label */
|
|
463
465
|
children: ReactNode;
|
|
464
466
|
}
|
|
@@ -467,8 +469,8 @@ interface TabProps {
|
|
|
467
469
|
*/
|
|
468
470
|
declare function Tab({ value, children }: TabProps): react_jsx_runtime.JSX.Element;
|
|
469
471
|
interface TabPanelProps {
|
|
470
|
-
/** Value matching the corresponding Tab */
|
|
471
|
-
value
|
|
472
|
+
/** Value matching the corresponding Tab (optional if panel order matches tabs) */
|
|
473
|
+
value?: string;
|
|
472
474
|
/** Panel content */
|
|
473
475
|
children: ReactNode;
|
|
474
476
|
}
|
|
@@ -263,9 +263,18 @@ function Note({ title, children }) {
|
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
// src/ui/components/Tabs.tsx
|
|
266
|
-
import {
|
|
266
|
+
import {
|
|
267
|
+
Children as Children2,
|
|
268
|
+
isValidElement as isValidElement2,
|
|
269
|
+
useEffect,
|
|
270
|
+
useRef,
|
|
271
|
+
useState as useState3,
|
|
272
|
+
createContext as createContext2,
|
|
273
|
+
useContext as useContext2
|
|
274
|
+
} from "react";
|
|
267
275
|
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
268
276
|
var TabsContext = createContext2(null);
|
|
277
|
+
var AUTO_TAB_PREFIX = "__ardo-tab-";
|
|
269
278
|
function useTabsContext() {
|
|
270
279
|
const context = useContext2(TabsContext);
|
|
271
280
|
if (!context) {
|
|
@@ -274,29 +283,49 @@ function useTabsContext() {
|
|
|
274
283
|
return context;
|
|
275
284
|
}
|
|
276
285
|
function Tabs({ defaultValue, children }) {
|
|
277
|
-
const [activeTab, setActiveTab] = useState3(defaultValue
|
|
278
|
-
|
|
286
|
+
const [activeTab, setActiveTab] = useState3(() => defaultValue ?? findFirstTabValue(children));
|
|
287
|
+
const tabIndexRef = useRef(0);
|
|
288
|
+
const panelIndexRef = useRef(0);
|
|
289
|
+
tabIndexRef.current = 0;
|
|
290
|
+
panelIndexRef.current = 0;
|
|
291
|
+
const getTabValue = (value) => {
|
|
292
|
+
const index = tabIndexRef.current++;
|
|
293
|
+
return value ?? `${AUTO_TAB_PREFIX}${index}`;
|
|
294
|
+
};
|
|
295
|
+
const getPanelValue = (value) => {
|
|
296
|
+
const index = panelIndexRef.current++;
|
|
297
|
+
return value ?? `${AUTO_TAB_PREFIX}${index}`;
|
|
298
|
+
};
|
|
299
|
+
useEffect(() => {
|
|
300
|
+
if (defaultValue !== void 0) {
|
|
301
|
+
setActiveTab(defaultValue);
|
|
302
|
+
}
|
|
303
|
+
}, [defaultValue]);
|
|
304
|
+
return /* @__PURE__ */ jsx7(TabsContext.Provider, { value: { activeTab, setActiveTab, getTabValue, getPanelValue }, children: /* @__PURE__ */ jsx7("div", { className: "ardo-tabs", children }) });
|
|
279
305
|
}
|
|
280
306
|
function TabList({ children }) {
|
|
281
307
|
return /* @__PURE__ */ jsx7("div", { className: "ardo-tab-list", role: "tablist", children });
|
|
282
308
|
}
|
|
283
309
|
function Tab({ value, children }) {
|
|
284
|
-
const { activeTab, setActiveTab } = useTabsContext();
|
|
285
|
-
const
|
|
310
|
+
const { activeTab, setActiveTab, getTabValue } = useTabsContext();
|
|
311
|
+
const resolvedValue = getTabValue(value);
|
|
312
|
+
const isActive = activeTab === resolvedValue;
|
|
286
313
|
return /* @__PURE__ */ jsx7(
|
|
287
314
|
"button",
|
|
288
315
|
{
|
|
316
|
+
type: "button",
|
|
289
317
|
role: "tab",
|
|
290
318
|
"aria-selected": isActive,
|
|
291
319
|
className: ["ardo-tab", isActive && "active"].filter(Boolean).join(" "),
|
|
292
|
-
onClick: () => setActiveTab(
|
|
320
|
+
onClick: () => setActiveTab(resolvedValue),
|
|
293
321
|
children
|
|
294
322
|
}
|
|
295
323
|
);
|
|
296
324
|
}
|
|
297
325
|
function TabPanel({ value, children }) {
|
|
298
|
-
const { activeTab } = useTabsContext();
|
|
299
|
-
const
|
|
326
|
+
const { activeTab, getPanelValue } = useTabsContext();
|
|
327
|
+
const resolvedValue = getPanelValue(value);
|
|
328
|
+
const isActive = activeTab === resolvedValue;
|
|
300
329
|
if (!isActive) {
|
|
301
330
|
return null;
|
|
302
331
|
}
|
|
@@ -305,6 +334,25 @@ function TabPanel({ value, children }) {
|
|
|
305
334
|
function TabPanels({ children }) {
|
|
306
335
|
return /* @__PURE__ */ jsx7("div", { className: "ardo-tab-panels", children });
|
|
307
336
|
}
|
|
337
|
+
function findFirstTabValue(children) {
|
|
338
|
+
for (const child of Children2.toArray(children)) {
|
|
339
|
+
if (!isValidElement2(child)) {
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (child.type === Tab) {
|
|
343
|
+
const tabValue = child.props.value;
|
|
344
|
+
return tabValue ?? `${AUTO_TAB_PREFIX}0`;
|
|
345
|
+
}
|
|
346
|
+
const nestedChildren = child.props.children;
|
|
347
|
+
if (nestedChildren) {
|
|
348
|
+
const nestedValue = findFirstTabValue(nestedChildren);
|
|
349
|
+
if (nestedValue) {
|
|
350
|
+
return nestedValue;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return "";
|
|
355
|
+
}
|
|
308
356
|
|
|
309
357
|
export {
|
|
310
358
|
BareContent,
|
|
@@ -327,4 +375,4 @@ export {
|
|
|
327
375
|
TabPanel,
|
|
328
376
|
TabPanels
|
|
329
377
|
};
|
|
330
|
-
//# sourceMappingURL=chunk-
|
|
378
|
+
//# sourceMappingURL=chunk-QKDVSW6Q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/BareContent.tsx","../src/ui/Content.tsx","../src/ui/components/Icon.tsx","../src/ui/components/CopyButton.tsx","../src/ui/components/CodeBlock.tsx","../src/ui/components/Container.tsx","../src/ui/components/Tabs.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\n\nconst BareContentContext = createContext(false)\n\n/**\n * Wraps imported MDX content to render without the full Content wrapper\n * (article, header, footer, navigation). Only the content body is rendered.\n *\n * ```tsx\n * import MySnippet from \"./snippet.mdx\"\n *\n * <BareContent>\n * <MySnippet />\n * </BareContent>\n * ```\n */\nexport function BareContent({ children }: { children: ReactNode }) {\n return <BareContentContext value={true}>{children}</BareContentContext>\n}\n\nexport function useBareContent(): boolean {\n return useContext(BareContentContext)\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData, useThemeConfig, useSidebar } from \"../runtime/hooks\"\nimport { getPrevNextLinks } from \"../runtime/sidebar-utils\"\nimport { Link, useLocation } from \"react-router\"\nimport { useBareContent } from \"./BareContent\"\n\ninterface ContentProps {\n children: ReactNode\n}\n\nexport function Content({ children }: ContentProps) {\n const isBare = useBareContent()\n const pageData = usePageData()\n const themeConfig = useThemeConfig()\n const sidebar = useSidebar()\n const location = useLocation()\n\n if (isBare) {\n return <div className=\"ardo-content-body ardo-content\">{children}</div>\n }\n\n const { prev, next } = getPrevNextLinks(sidebar, location.pathname)\n\n const showEditLink = pageData?.frontmatter.editLink !== false && themeConfig.editLink?.pattern\n\n const showLastUpdated =\n pageData?.frontmatter.lastUpdated !== false &&\n themeConfig.lastUpdated?.enabled &&\n pageData?.lastUpdated\n\n const editLink = showEditLink\n ? themeConfig.editLink!.pattern.replace(\":path\", pageData?.relativePath || \"\")\n : null\n\n const lastUpdatedText = showLastUpdated\n ? new Date(pageData!.lastUpdated!).toLocaleDateString(\n undefined,\n themeConfig.lastUpdated?.formatOptions ?? {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n }\n )\n : null\n\n return (\n <article className=\"ardo-content-container\">\n {pageData?.frontmatter.title && (\n <header className=\"ardo-content-header\">\n <h1 className=\"ardo-content-title\">{pageData.frontmatter.title}</h1>\n {pageData.frontmatter.description && (\n <p className=\"ardo-content-description\">{pageData.frontmatter.description}</p>\n )}\n </header>\n )}\n\n <div className=\"ardo-content-body ardo-content\">{children}</div>\n\n <footer className=\"ardo-content-footer\">\n {(showEditLink || showLastUpdated) && (\n <div className=\"ardo-content-meta\">\n {showEditLink && (\n <a\n href={editLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ardo-edit-link\"\n >\n {themeConfig.editLink?.text ?? \"Edit this page\"}\n </a>\n )}\n {showLastUpdated && (\n <span className=\"ardo-last-updated\">\n {themeConfig.lastUpdated?.text ?? \"Last updated\"}: {lastUpdatedText}\n </span>\n )}\n </div>\n )}\n\n {(prev || next) && (\n <nav className=\"ardo-prev-next\" aria-label=\"Page navigation\">\n {prev ? (\n <Link to={prev.link!} className=\"ardo-prev-link\">\n <span className=\"ardo-prev-next-label\">Previous</span>\n <span className=\"ardo-prev-next-title\">{prev.text}</span>\n </Link>\n ) : (\n <div />\n )}\n {next ? (\n <Link to={next.link!} className=\"ardo-next-link\">\n <span className=\"ardo-prev-next-label\">Next</span>\n <span className=\"ardo-prev-next-title\">{next.text}</span>\n </Link>\n ) : (\n <div />\n )}\n </nav>\n )}\n </footer>\n </article>\n )\n}\n","import type { ComponentType, SVGAttributes, ReactNode } from \"react\"\n\ntype IconComponent = ComponentType<SVGAttributes<SVGSVGElement> & { size?: number }>\n\nexport interface IconProps extends SVGAttributes<SVGSVGElement> {\n /** Name of the registered icon */\n name: string\n /** Icon size */\n size?: number\n}\n\n// Icon registry - users register only the icons they need\nconst iconRegistry = new Map<string, IconComponent>()\n\n/**\n * Register icons for use with the Icon component.\n * Only registered icons are included in your bundle.\n *\n * @example\n * ```tsx\n * // In your app's entry point or layout:\n * import { registerIcons } from \"ardo/ui\"\n * import { Zap, Rocket, Code } from \"lucide-react\"\n *\n * registerIcons({ Zap, Rocket, Code })\n * ```\n */\nexport function registerIcons(icons: Record<string, IconComponent>): void {\n for (const [name, icon] of Object.entries(icons)) {\n iconRegistry.set(name, icon)\n }\n}\n\n/**\n * Get all registered icon names (useful for documentation).\n */\nexport function getRegisteredIconNames(): string[] {\n return Array.from(iconRegistry.keys())\n}\n\n/**\n * Renders a registered icon by name.\n * Icons must be registered first using `registerIcons()`.\n *\n * @example\n * ```tsx\n * // First register icons in your app:\n * import { registerIcons } from \"ardo/ui\"\n * import { Zap, Rocket } from \"lucide-react\"\n * registerIcons({ Zap, Rocket })\n *\n * // Then use in MDX:\n * <Icon name=\"Zap\" size={24} />\n * <Icon name=\"Rocket\" className=\"text-brand\" />\n * ```\n *\n * @see https://lucide.dev/icons for available icon names\n */\nexport function Icon({ name, ...props }: IconProps): ReactNode {\n const IconComp = iconRegistry.get(name)\n\n if (!IconComp) {\n console.warn(`[Ardo] Icon \"${name}\" not found. Did you register it with registerIcons()?`)\n return null\n }\n\n return <IconComp {...props} />\n}\n","import { useState } from \"react\"\nimport { CopyIcon, CheckIcon } from \"../icons\"\n\ninterface CopyButtonProps {\n code: string\n}\n\nexport function CopyButton({ code }: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n return (\n <button\n className=\"ardo-copy-button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n <span className=\"ardo-copy-text\">{copied ? \"Copied!\" : \"Copy\"}</span>\n </button>\n )\n}\n","import { useState, Children, isValidElement } from \"react\"\nimport { CopyButton } from \"./CopyButton\"\n\n/**\n * Strips leading/trailing blank lines and removes common leading whitespace\n * so that template literals in indented JSX render cleanly.\n */\nfunction outdent(text: string): string {\n // Remove leading/trailing blank lines\n const trimmed = text.replace(/^\\n+/, \"\").replace(/\\n\\s*$/, \"\")\n const lines = trimmed.split(\"\\n\")\n\n // Find minimum indentation (ignoring empty lines)\n const indent = lines.reduce((min, line) => {\n if (line.trim().length === 0) return min\n const match = line.match(/^(\\s*)/)\n return match ? Math.min(min, match[1].length) : min\n }, Infinity)\n\n if (indent === 0 || indent === Infinity) return trimmed\n return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nexport interface CodeBlockProps {\n /** The code to display (as prop or as children string) */\n code?: string\n /** Programming language for syntax highlighting */\n language?: string\n /** Optional title shown above the code */\n title?: string\n /** Show line numbers */\n lineNumbers?: boolean\n /** Line numbers to highlight */\n highlightLines?: number[]\n /** Code as children — supports template literals with auto-outdent */\n children?: React.ReactNode\n /** Pre-rendered Shiki HTML (injected by ardo:codeblock-highlight plugin) */\n __html?: string\n}\n\n/**\n * Syntax-highlighted code block with copy button.\n *\n * Code can be provided via the `code` prop or as children:\n * ```tsx\n * <CodeBlock language=\"typescript\">{`\n * const x = 42\n * `}</CodeBlock>\n * ```\n * When children is a string, leading/trailing blank lines and common\n * indentation are stripped automatically.\n */\nexport function CodeBlock({\n code: codeProp,\n language = \"text\",\n title,\n lineNumbers = false,\n highlightLines = [],\n children,\n __html,\n}: CodeBlockProps) {\n const code = codeProp ?? (typeof children === \"string\" ? outdent(children) : \"\")\n const hasCustomChildren = children != null && typeof children !== \"string\"\n const lines = code.split(\"\\n\")\n\n let content: React.ReactNode\n if (__html) {\n content = <div dangerouslySetInnerHTML={{ __html }} />\n } else if (hasCustomChildren) {\n content = <>{children}</>\n } else {\n content = (\n <pre className={`language-${language}`}>\n <code>\n {lines.map((line, index) => {\n const lineNum = index + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"ardo-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n return (\n <span key={index} className={classes.join(\" \")}>\n {lineNumbers && <span className=\"ardo-line-number\">{lineNum}</span>}\n <span className=\"ardo-line-content\">{line}</span>\n {index < lines.length - 1 && \"\\n\"}\n </span>\n )\n })}\n </code>\n </pre>\n )\n }\n\n return (\n <div className=\"ardo-code-block\" data-lang={language}>\n {title && <div className=\"ardo-code-title\">{title}</div>}\n <div className=\"ardo-code-wrapper\">\n {content}\n <CopyButton code={code} />\n </div>\n </div>\n )\n}\n\nexport interface CodeGroupProps {\n /** CodeBlock components to display as tabs */\n children: React.ReactNode\n /** Comma-separated tab labels */\n labels?: string\n}\n\n/**\n * Tabbed group of code blocks.\n * Labels come from the `labels` prop (set at remark level) or fall back to\n * data-label / title / language props on children.\n */\nexport function CodeGroup({ children, labels: labelsStr }: CodeGroupProps) {\n const [activeTab, setActiveTab] = useState(0)\n\n // Filter to only valid React elements (skip whitespace text nodes)\n const childArray = Children.toArray(children).filter(isValidElement)\n const labelArray = labelsStr ? labelsStr.split(\",\") : []\n const tabs = childArray.map((child, index) => {\n if (labelArray[index]) return labelArray[index]\n const props = child.props as Record<string, unknown>\n return (\n (props[\"data-label\"] as string) ||\n (props.title as string) ||\n (props.language as string) ||\n `Tab ${index + 1}`\n )\n })\n\n return (\n <div className=\"ardo-code-group\">\n <div className=\"ardo-code-group-tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n className={[\"ardo-code-group-tab\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveTab(index)}\n >\n {tab}\n </button>\n ))}\n </div>\n <div className=\"ardo-code-group-panels\">\n {childArray.map((child, index) => (\n <div\n key={index}\n className={[\"ardo-code-group-panel\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ display: index === activeTab ? \"block\" : \"none\" }}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { type ReactNode } from \"react\"\nimport { LightbulbIcon, AlertTriangleIcon, XCircleIcon, InfoIcon, FileTextIcon } from \"../icons\"\n\nexport type ContainerType = \"tip\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n\nexport interface ContainerProps {\n /** Container type determining the style */\n type: ContainerType\n /** Optional custom title */\n title?: string\n /** Content to display inside the container */\n children: ReactNode\n}\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n}\n\nconst icons: Record<ContainerType, ReactNode> = {\n tip: <LightbulbIcon size={18} />,\n warning: <AlertTriangleIcon size={18} />,\n danger: <XCircleIcon size={18} />,\n info: <InfoIcon size={18} />,\n note: <FileTextIcon size={18} />,\n}\n\n/**\n * A styled container for callouts, tips, warnings, etc.\n */\nexport function Container({ type, title, children }: ContainerProps) {\n const displayTitle = title || defaultTitles[type]\n\n return (\n <div className={`ardo-container ardo-container-${type}`}>\n <p className=\"ardo-container-title\">\n <span className=\"ardo-container-icon\">{icons[type]}</span>\n {displayTitle}\n </p>\n <div className=\"ardo-container-content\">{children}</div>\n </div>\n )\n}\n\nexport interface TipProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A tip container for helpful information.\n */\nexport function Tip({ title, children }: TipProps) {\n return (\n <Container type=\"tip\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface WarningProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A warning container for cautionary information.\n */\nexport function Warning({ title, children }: WarningProps) {\n return (\n <Container type=\"warning\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface DangerProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A danger container for critical warnings.\n */\nexport function Danger({ title, children }: DangerProps) {\n return (\n <Container type=\"danger\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface InfoProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * An info container for informational content.\n */\nexport function Info({ title, children }: InfoProps) {\n return (\n <Container type=\"info\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface NoteProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A note container for additional information.\n */\nexport function Note({ title, children }: NoteProps) {\n return (\n <Container type=\"note\" title={title}>\n {children}\n </Container>\n )\n}\n","import { useState, createContext, useContext, type ReactNode } from \"react\"\n\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error(\"Tab components must be used within a Tabs component\")\n }\n return context\n}\n\nexport interface TabsProps {\n /** Default active tab value */\n defaultValue?: string\n /** Tab components (TabList and TabPanels) */\n children: ReactNode\n}\n\n/**\n * Tabs container component for organizing content into tabbed panels.\n */\nexport function Tabs({ defaultValue, children }: TabsProps) {\n const [activeTab, setActiveTab] = useState(defaultValue || \"\")\n\n return (\n <TabsContext.Provider value={{ activeTab, setActiveTab }}>\n <div className=\"ardo-tabs\">{children}</div>\n </TabsContext.Provider>\n )\n}\n\nexport interface TabListProps {\n /** Tab buttons */\n children: ReactNode\n}\n\n/**\n * Container for Tab buttons.\n */\nexport function TabList({ children }: TabListProps) {\n return (\n <div className=\"ardo-tab-list\" role=\"tablist\">\n {children}\n </div>\n )\n}\n\nexport interface TabProps {\n /** Unique value identifying this tab */\n value: string\n /** Tab button label */\n children: ReactNode\n}\n\n/**\n * Individual tab button.\n */\nexport function Tab({ value, children }: TabProps) {\n const { activeTab, setActiveTab } = useTabsContext()\n const isActive = activeTab === value\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={[\"ardo-tab\", isActive && \"active\"].filter(Boolean).join(\" \")}\n onClick={() => setActiveTab(value)}\n >\n {children}\n </button>\n )\n}\n\nexport interface TabPanelProps {\n /** Value matching the corresponding Tab */\n value: string\n /** Panel content */\n children: ReactNode\n}\n\n/**\n * Content panel for a tab.\n */\nexport function TabPanel({ value, children }: TabPanelProps) {\n const { activeTab } = useTabsContext()\n const isActive = activeTab === value\n\n if (!isActive) {\n return null\n }\n\n return (\n <div role=\"tabpanel\" className=\"ardo-tab-panel\">\n {children}\n </div>\n )\n}\n\nexport interface TabPanelsProps {\n /** TabPanel components */\n children: ReactNode\n}\n\n/**\n * Container for TabPanel components.\n */\nexport function TabPanels({ children }: TabPanelsProps) {\n return <div className=\"ardo-tab-panels\">{children}</div>\n}\n"],"mappings":"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","names":["jsx","jsx","icons","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","useState","createContext","useContext","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/BareContent.tsx","../src/ui/Content.tsx","../src/ui/components/Icon.tsx","../src/ui/components/CopyButton.tsx","../src/ui/components/CodeBlock.tsx","../src/ui/components/Container.tsx","../src/ui/components/Tabs.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\n\nconst BareContentContext = createContext(false)\n\n/**\n * Wraps imported MDX content to render without the full Content wrapper\n * (article, header, footer, navigation). Only the content body is rendered.\n *\n * ```tsx\n * import MySnippet from \"./snippet.mdx\"\n *\n * <BareContent>\n * <MySnippet />\n * </BareContent>\n * ```\n */\nexport function BareContent({ children }: { children: ReactNode }) {\n return <BareContentContext value={true}>{children}</BareContentContext>\n}\n\nexport function useBareContent(): boolean {\n return useContext(BareContentContext)\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData, useThemeConfig, useSidebar } from \"../runtime/hooks\"\nimport { getPrevNextLinks } from \"../runtime/sidebar-utils\"\nimport { Link, useLocation } from \"react-router\"\nimport { useBareContent } from \"./BareContent\"\n\ninterface ContentProps {\n children: ReactNode\n}\n\nexport function Content({ children }: ContentProps) {\n const isBare = useBareContent()\n const pageData = usePageData()\n const themeConfig = useThemeConfig()\n const sidebar = useSidebar()\n const location = useLocation()\n\n if (isBare) {\n return <div className=\"ardo-content-body ardo-content\">{children}</div>\n }\n\n const { prev, next } = getPrevNextLinks(sidebar, location.pathname)\n\n const showEditLink = pageData?.frontmatter.editLink !== false && themeConfig.editLink?.pattern\n\n const showLastUpdated =\n pageData?.frontmatter.lastUpdated !== false &&\n themeConfig.lastUpdated?.enabled &&\n pageData?.lastUpdated\n\n const editLink = showEditLink\n ? themeConfig.editLink!.pattern.replace(\":path\", pageData?.relativePath || \"\")\n : null\n\n const lastUpdatedText = showLastUpdated\n ? new Date(pageData!.lastUpdated!).toLocaleDateString(\n undefined,\n themeConfig.lastUpdated?.formatOptions ?? {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n }\n )\n : null\n\n return (\n <article className=\"ardo-content-container\">\n {pageData?.frontmatter.title && (\n <header className=\"ardo-content-header\">\n <h1 className=\"ardo-content-title\">{pageData.frontmatter.title}</h1>\n {pageData.frontmatter.description && (\n <p className=\"ardo-content-description\">{pageData.frontmatter.description}</p>\n )}\n </header>\n )}\n\n <div className=\"ardo-content-body ardo-content\">{children}</div>\n\n <footer className=\"ardo-content-footer\">\n {(showEditLink || showLastUpdated) && (\n <div className=\"ardo-content-meta\">\n {showEditLink && (\n <a\n href={editLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ardo-edit-link\"\n >\n {themeConfig.editLink?.text ?? \"Edit this page\"}\n </a>\n )}\n {showLastUpdated && (\n <span className=\"ardo-last-updated\">\n {themeConfig.lastUpdated?.text ?? \"Last updated\"}: {lastUpdatedText}\n </span>\n )}\n </div>\n )}\n\n {(prev || next) && (\n <nav className=\"ardo-prev-next\" aria-label=\"Page navigation\">\n {prev ? (\n <Link to={prev.link!} className=\"ardo-prev-link\">\n <span className=\"ardo-prev-next-label\">Previous</span>\n <span className=\"ardo-prev-next-title\">{prev.text}</span>\n </Link>\n ) : (\n <div />\n )}\n {next ? (\n <Link to={next.link!} className=\"ardo-next-link\">\n <span className=\"ardo-prev-next-label\">Next</span>\n <span className=\"ardo-prev-next-title\">{next.text}</span>\n </Link>\n ) : (\n <div />\n )}\n </nav>\n )}\n </footer>\n </article>\n )\n}\n","import type { ComponentType, SVGAttributes, ReactNode } from \"react\"\n\ntype IconComponent = ComponentType<SVGAttributes<SVGSVGElement> & { size?: number }>\n\nexport interface IconProps extends SVGAttributes<SVGSVGElement> {\n /** Name of the registered icon */\n name: string\n /** Icon size */\n size?: number\n}\n\n// Icon registry - users register only the icons they need\nconst iconRegistry = new Map<string, IconComponent>()\n\n/**\n * Register icons for use with the Icon component.\n * Only registered icons are included in your bundle.\n *\n * @example\n * ```tsx\n * // In your app's entry point or layout:\n * import { registerIcons } from \"ardo/ui\"\n * import { Zap, Rocket, Code } from \"lucide-react\"\n *\n * registerIcons({ Zap, Rocket, Code })\n * ```\n */\nexport function registerIcons(icons: Record<string, IconComponent>): void {\n for (const [name, icon] of Object.entries(icons)) {\n iconRegistry.set(name, icon)\n }\n}\n\n/**\n * Get all registered icon names (useful for documentation).\n */\nexport function getRegisteredIconNames(): string[] {\n return Array.from(iconRegistry.keys())\n}\n\n/**\n * Renders a registered icon by name.\n * Icons must be registered first using `registerIcons()`.\n *\n * @example\n * ```tsx\n * // First register icons in your app:\n * import { registerIcons } from \"ardo/ui\"\n * import { Zap, Rocket } from \"lucide-react\"\n * registerIcons({ Zap, Rocket })\n *\n * // Then use in MDX:\n * <Icon name=\"Zap\" size={24} />\n * <Icon name=\"Rocket\" className=\"text-brand\" />\n * ```\n *\n * @see https://lucide.dev/icons for available icon names\n */\nexport function Icon({ name, ...props }: IconProps): ReactNode {\n const IconComp = iconRegistry.get(name)\n\n if (!IconComp) {\n console.warn(`[Ardo] Icon \"${name}\" not found. Did you register it with registerIcons()?`)\n return null\n }\n\n return <IconComp {...props} />\n}\n","import { useState } from \"react\"\nimport { CopyIcon, CheckIcon } from \"../icons\"\n\ninterface CopyButtonProps {\n code: string\n}\n\nexport function CopyButton({ code }: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n return (\n <button\n className=\"ardo-copy-button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}\n <span className=\"ardo-copy-text\">{copied ? \"Copied!\" : \"Copy\"}</span>\n </button>\n )\n}\n","import { useState, Children, isValidElement } from \"react\"\nimport { CopyButton } from \"./CopyButton\"\n\n/**\n * Strips leading/trailing blank lines and removes common leading whitespace\n * so that template literals in indented JSX render cleanly.\n */\nfunction outdent(text: string): string {\n // Remove leading/trailing blank lines\n const trimmed = text.replace(/^\\n+/, \"\").replace(/\\n\\s*$/, \"\")\n const lines = trimmed.split(\"\\n\")\n\n // Find minimum indentation (ignoring empty lines)\n const indent = lines.reduce((min, line) => {\n if (line.trim().length === 0) return min\n const match = line.match(/^(\\s*)/)\n return match ? Math.min(min, match[1].length) : min\n }, Infinity)\n\n if (indent === 0 || indent === Infinity) return trimmed\n return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nexport interface CodeBlockProps {\n /** The code to display (as prop or as children string) */\n code?: string\n /** Programming language for syntax highlighting */\n language?: string\n /** Optional title shown above the code */\n title?: string\n /** Show line numbers */\n lineNumbers?: boolean\n /** Line numbers to highlight */\n highlightLines?: number[]\n /** Code as children — supports template literals with auto-outdent */\n children?: React.ReactNode\n /** Pre-rendered Shiki HTML (injected by ardo:codeblock-highlight plugin) */\n __html?: string\n}\n\n/**\n * Syntax-highlighted code block with copy button.\n *\n * Code can be provided via the `code` prop or as children:\n * ```tsx\n * <CodeBlock language=\"typescript\">{`\n * const x = 42\n * `}</CodeBlock>\n * ```\n * When children is a string, leading/trailing blank lines and common\n * indentation are stripped automatically.\n */\nexport function CodeBlock({\n code: codeProp,\n language = \"text\",\n title,\n lineNumbers = false,\n highlightLines = [],\n children,\n __html,\n}: CodeBlockProps) {\n const code = codeProp ?? (typeof children === \"string\" ? outdent(children) : \"\")\n const hasCustomChildren = children != null && typeof children !== \"string\"\n const lines = code.split(\"\\n\")\n\n let content: React.ReactNode\n if (__html) {\n content = <div dangerouslySetInnerHTML={{ __html }} />\n } else if (hasCustomChildren) {\n content = <>{children}</>\n } else {\n content = (\n <pre className={`language-${language}`}>\n <code>\n {lines.map((line, index) => {\n const lineNum = index + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"ardo-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n return (\n <span key={index} className={classes.join(\" \")}>\n {lineNumbers && <span className=\"ardo-line-number\">{lineNum}</span>}\n <span className=\"ardo-line-content\">{line}</span>\n {index < lines.length - 1 && \"\\n\"}\n </span>\n )\n })}\n </code>\n </pre>\n )\n }\n\n return (\n <div className=\"ardo-code-block\" data-lang={language}>\n {title && <div className=\"ardo-code-title\">{title}</div>}\n <div className=\"ardo-code-wrapper\">\n {content}\n <CopyButton code={code} />\n </div>\n </div>\n )\n}\n\nexport interface CodeGroupProps {\n /** CodeBlock components to display as tabs */\n children: React.ReactNode\n /** Comma-separated tab labels */\n labels?: string\n}\n\n/**\n * Tabbed group of code blocks.\n * Labels come from the `labels` prop (set at remark level) or fall back to\n * data-label / title / language props on children.\n */\nexport function CodeGroup({ children, labels: labelsStr }: CodeGroupProps) {\n const [activeTab, setActiveTab] = useState(0)\n\n // Filter to only valid React elements (skip whitespace text nodes)\n const childArray = Children.toArray(children).filter(isValidElement)\n const labelArray = labelsStr ? labelsStr.split(\",\") : []\n const tabs = childArray.map((child, index) => {\n if (labelArray[index]) return labelArray[index]\n const props = child.props as Record<string, unknown>\n return (\n (props[\"data-label\"] as string) ||\n (props.title as string) ||\n (props.language as string) ||\n `Tab ${index + 1}`\n )\n })\n\n return (\n <div className=\"ardo-code-group\">\n <div className=\"ardo-code-group-tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n className={[\"ardo-code-group-tab\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveTab(index)}\n >\n {tab}\n </button>\n ))}\n </div>\n <div className=\"ardo-code-group-panels\">\n {childArray.map((child, index) => (\n <div\n key={index}\n className={[\"ardo-code-group-panel\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ display: index === activeTab ? \"block\" : \"none\" }}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { type ReactNode } from \"react\"\nimport { LightbulbIcon, AlertTriangleIcon, XCircleIcon, InfoIcon, FileTextIcon } from \"../icons\"\n\nexport type ContainerType = \"tip\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n\nexport interface ContainerProps {\n /** Container type determining the style */\n type: ContainerType\n /** Optional custom title */\n title?: string\n /** Content to display inside the container */\n children: ReactNode\n}\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n}\n\nconst icons: Record<ContainerType, ReactNode> = {\n tip: <LightbulbIcon size={18} />,\n warning: <AlertTriangleIcon size={18} />,\n danger: <XCircleIcon size={18} />,\n info: <InfoIcon size={18} />,\n note: <FileTextIcon size={18} />,\n}\n\n/**\n * A styled container for callouts, tips, warnings, etc.\n */\nexport function Container({ type, title, children }: ContainerProps) {\n const displayTitle = title || defaultTitles[type]\n\n return (\n <div className={`ardo-container ardo-container-${type}`}>\n <p className=\"ardo-container-title\">\n <span className=\"ardo-container-icon\">{icons[type]}</span>\n {displayTitle}\n </p>\n <div className=\"ardo-container-content\">{children}</div>\n </div>\n )\n}\n\nexport interface TipProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A tip container for helpful information.\n */\nexport function Tip({ title, children }: TipProps) {\n return (\n <Container type=\"tip\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface WarningProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A warning container for cautionary information.\n */\nexport function Warning({ title, children }: WarningProps) {\n return (\n <Container type=\"warning\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface DangerProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A danger container for critical warnings.\n */\nexport function Danger({ title, children }: DangerProps) {\n return (\n <Container type=\"danger\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface InfoProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * An info container for informational content.\n */\nexport function Info({ title, children }: InfoProps) {\n return (\n <Container type=\"info\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport interface NoteProps {\n /** Optional custom title */\n title?: string\n /** Content to display */\n children: ReactNode\n}\n\n/**\n * A note container for additional information.\n */\nexport function Note({ title, children }: NoteProps) {\n return (\n <Container type=\"note\" title={title}>\n {children}\n </Container>\n )\n}\n","import {\n Children,\n isValidElement,\n useEffect,\n useRef,\n useState,\n createContext,\n useContext,\n type ReactNode,\n} from \"react\"\n\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n getTabValue: (value?: string) => string\n getPanelValue: (value?: string) => string\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\nconst AUTO_TAB_PREFIX = \"__ardo-tab-\"\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error(\"Tab components must be used within a Tabs component\")\n }\n return context\n}\n\nexport interface TabsProps {\n /** Default active tab value */\n defaultValue?: string\n /** Tab components (TabList and TabPanels) */\n children: ReactNode\n}\n\n/**\n * Tabs container component for organizing content into tabbed panels.\n */\nexport function Tabs({ defaultValue, children }: TabsProps) {\n const [activeTab, setActiveTab] = useState(() => defaultValue ?? findFirstTabValue(children))\n const tabIndexRef = useRef(0)\n const panelIndexRef = useRef(0)\n\n tabIndexRef.current = 0\n panelIndexRef.current = 0\n\n const getTabValue = (value?: string) => {\n const index = tabIndexRef.current++\n return value ?? `${AUTO_TAB_PREFIX}${index}`\n }\n\n const getPanelValue = (value?: string) => {\n const index = panelIndexRef.current++\n return value ?? `${AUTO_TAB_PREFIX}${index}`\n }\n\n useEffect(() => {\n if (defaultValue !== undefined) {\n setActiveTab(defaultValue)\n }\n }, [defaultValue])\n\n return (\n <TabsContext.Provider value={{ activeTab, setActiveTab, getTabValue, getPanelValue }}>\n <div className=\"ardo-tabs\">{children}</div>\n </TabsContext.Provider>\n )\n}\n\nexport interface TabListProps {\n /** Tab buttons */\n children: ReactNode\n}\n\n/**\n * Container for Tab buttons.\n */\nexport function TabList({ children }: TabListProps) {\n return (\n <div className=\"ardo-tab-list\" role=\"tablist\">\n {children}\n </div>\n )\n}\n\nexport interface TabProps {\n /** Unique value identifying this tab (optional if tab order matches panels) */\n value?: string\n /** Tab button label */\n children: ReactNode\n}\n\n/**\n * Individual tab button.\n */\nexport function Tab({ value, children }: TabProps) {\n const { activeTab, setActiveTab, getTabValue } = useTabsContext()\n const resolvedValue = getTabValue(value)\n const isActive = activeTab === resolvedValue\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={[\"ardo-tab\", isActive && \"active\"].filter(Boolean).join(\" \")}\n onClick={() => setActiveTab(resolvedValue)}\n >\n {children}\n </button>\n )\n}\n\nexport interface TabPanelProps {\n /** Value matching the corresponding Tab (optional if panel order matches tabs) */\n value?: string\n /** Panel content */\n children: ReactNode\n}\n\n/**\n * Content panel for a tab.\n */\nexport function TabPanel({ value, children }: TabPanelProps) {\n const { activeTab, getPanelValue } = useTabsContext()\n const resolvedValue = getPanelValue(value)\n const isActive = activeTab === resolvedValue\n\n if (!isActive) {\n return null\n }\n\n return (\n <div role=\"tabpanel\" className=\"ardo-tab-panel\">\n {children}\n </div>\n )\n}\n\nexport interface TabPanelsProps {\n /** TabPanel components */\n children: ReactNode\n}\n\n/**\n * Container for TabPanel components.\n */\nexport function TabPanels({ children }: TabPanelsProps) {\n return <div className=\"ardo-tab-panels\">{children}</div>\n}\n\nfunction findFirstTabValue(children: ReactNode): string {\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child)) {\n continue\n }\n\n if (child.type === Tab) {\n const tabValue = (child.props as { value?: string }).value\n return tabValue ?? `${AUTO_TAB_PREFIX}0`\n }\n\n const nestedChildren = (child.props as { children?: ReactNode }).children\n if (nestedChildren) {\n const nestedValue = findFirstTabValue(nestedChildren)\n if (nestedValue) {\n return nestedValue\n }\n }\n }\n\n return \"\"\n}\n"],"mappings":"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","names":["jsx","jsx","icons","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","Children","isValidElement","useState","createContext","useContext","jsx"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Content
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-QKDVSW6Q.js";
|
|
4
4
|
import {
|
|
5
5
|
ChevronDownIcon,
|
|
6
6
|
GithubIcon,
|
|
@@ -59,11 +59,12 @@ function Layout({ header, sidebar, footer, children, className }) {
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// src/ui/ArdoRoot.tsx
|
|
62
|
-
import {
|
|
62
|
+
import { cloneElement, isValidElement as isValidElement2 } from "react";
|
|
63
|
+
import { Outlet, useLocation as useLocation3 } from "react-router";
|
|
63
64
|
|
|
64
65
|
// src/ui/Header.tsx
|
|
65
|
-
import { useState as useState2, lazy, Suspense } from "react";
|
|
66
|
-
import { Link, NavLink as RouterNavLink } from "react-router";
|
|
66
|
+
import { useEffect as useEffect2, useState as useState2, lazy, Suspense } from "react";
|
|
67
|
+
import { Link, NavLink as RouterNavLink, useLocation } from "react-router";
|
|
67
68
|
|
|
68
69
|
// src/ui/components/ThemeToggle.tsx
|
|
69
70
|
import { useState, useEffect } from "react";
|
|
@@ -126,8 +127,10 @@ function Header({
|
|
|
126
127
|
actions,
|
|
127
128
|
search = true,
|
|
128
129
|
themeToggle = true,
|
|
130
|
+
mobileMenuContent,
|
|
129
131
|
className
|
|
130
132
|
}) {
|
|
133
|
+
const location = useLocation();
|
|
131
134
|
const config = useConfig();
|
|
132
135
|
const themeConfig = useThemeConfig();
|
|
133
136
|
const [mobileMenuOpen, setMobileMenuOpen] = useState2(false);
|
|
@@ -135,12 +138,27 @@ function Header({
|
|
|
135
138
|
const resolvedTitle = title ?? (themeConfig.siteTitle !== false ? themeConfig.siteTitle ?? config.title : void 0);
|
|
136
139
|
const resolvedNav = nav ?? (themeConfig.nav?.length ? /* @__PURE__ */ jsx3(AutoNav, { items: themeConfig.nav }) : void 0);
|
|
137
140
|
const resolvedActions = actions ?? (themeConfig.socialLinks?.length ? themeConfig.socialLinks.map((link, i) => /* @__PURE__ */ jsx3(SocialLink, { href: link.link, icon: link.icon, ariaLabel: link.ariaLabel }, i)) : void 0);
|
|
138
|
-
|
|
141
|
+
const hasMobileMenu = Boolean(mobileMenuContent);
|
|
142
|
+
useEffect2(() => {
|
|
143
|
+
setMobileMenuOpen(false);
|
|
144
|
+
}, [location.pathname]);
|
|
145
|
+
const handleMobileMenuClick = (event) => {
|
|
146
|
+
const target = event.target;
|
|
147
|
+
if (target.closest("a")) {
|
|
148
|
+
setMobileMenuOpen(false);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const resolvedClassName = [
|
|
152
|
+
className ?? "ardo-header",
|
|
153
|
+
resolvedNav && "ardo-header-with-mobile-top-nav"
|
|
154
|
+
].filter(Boolean).join(" ");
|
|
155
|
+
return /* @__PURE__ */ jsxs3("header", { className: resolvedClassName, children: [
|
|
139
156
|
/* @__PURE__ */ jsxs3("div", { className: "ardo-header-container", children: [
|
|
140
157
|
/* @__PURE__ */ jsxs3("div", { className: "ardo-header-left", children: [
|
|
141
|
-
/* @__PURE__ */ jsx3(
|
|
158
|
+
hasMobileMenu && /* @__PURE__ */ jsx3(
|
|
142
159
|
"button",
|
|
143
160
|
{
|
|
161
|
+
type: "button",
|
|
144
162
|
className: "ardo-mobile-menu-button",
|
|
145
163
|
onClick: () => setMobileMenuOpen(!mobileMenuOpen),
|
|
146
164
|
"aria-label": "Toggle menu",
|
|
@@ -164,14 +182,22 @@ function Header({
|
|
|
164
182
|
resolvedTitle && /* @__PURE__ */ jsx3("span", { className: "ardo-site-title", children: resolvedTitle })
|
|
165
183
|
] })
|
|
166
184
|
] }),
|
|
167
|
-
resolvedNav && /* @__PURE__ */ jsx3("div", { className: "ardo-nav", children: resolvedNav }),
|
|
185
|
+
resolvedNav && /* @__PURE__ */ jsx3("div", { className: "ardo-desktop-nav", children: resolvedNav }),
|
|
168
186
|
/* @__PURE__ */ jsxs3("div", { className: "ardo-header-right", children: [
|
|
169
187
|
search && /* @__PURE__ */ jsx3(Suspense, { fallback: /* @__PURE__ */ jsx3("span", { className: "ardo-search-placeholder" }), children: /* @__PURE__ */ jsx3(LazySearch, {}) }),
|
|
170
188
|
themeToggle && /* @__PURE__ */ jsx3(ThemeToggle, {}),
|
|
171
189
|
resolvedActions
|
|
172
190
|
] })
|
|
173
191
|
] }),
|
|
174
|
-
|
|
192
|
+
resolvedNav && /* @__PURE__ */ jsx3("div", { className: "ardo-mobile-top-nav", children: /* @__PURE__ */ jsx3("div", { className: "ardo-mobile-top-nav-inner", children: resolvedNav }) }),
|
|
193
|
+
mobileMenuOpen && hasMobileMenu && /* @__PURE__ */ jsx3("div", { className: "ardo-mobile-menu", children: mobileMenuContent && /* @__PURE__ */ jsx3(
|
|
194
|
+
"div",
|
|
195
|
+
{
|
|
196
|
+
className: "ardo-mobile-menu-content ardo-mobile-menu-section",
|
|
197
|
+
onClick: handleMobileMenuClick,
|
|
198
|
+
children: mobileMenuContent
|
|
199
|
+
}
|
|
200
|
+
) })
|
|
175
201
|
] });
|
|
176
202
|
}
|
|
177
203
|
function SocialLink({ href, icon, ariaLabel, className }) {
|
|
@@ -227,14 +253,14 @@ import {
|
|
|
227
253
|
createContext,
|
|
228
254
|
useContext as useContext2
|
|
229
255
|
} from "react";
|
|
230
|
-
import { NavLink, useLocation } from "react-router";
|
|
256
|
+
import { NavLink, useLocation as useLocation2 } from "react-router";
|
|
231
257
|
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
232
258
|
var SidebarContext = createContext({ currentPath: "" });
|
|
233
259
|
function useSidebarContext() {
|
|
234
260
|
return useContext2(SidebarContext);
|
|
235
261
|
}
|
|
236
262
|
function Sidebar({ items, children, className }) {
|
|
237
|
-
const { pathname } =
|
|
263
|
+
const { pathname } = useLocation2();
|
|
238
264
|
const contextSidebar = useSidebar();
|
|
239
265
|
const resolvedItems = items ?? (children ? void 0 : contextSidebar);
|
|
240
266
|
return /* @__PURE__ */ jsx4(SidebarContext.Provider, { value: { currentPath: pathname }, children: /* @__PURE__ */ jsx4("aside", { className: className ?? "ardo-sidebar", children: /* @__PURE__ */ jsx4("nav", { className: "ardo-sidebar-nav", "aria-label": "Main navigation", children: children ? /* @__PURE__ */ jsx4("ul", { className: "ardo-sidebar-list ardo-sidebar-list-0", children }) : resolvedItems?.length ? /* @__PURE__ */ jsx4(SidebarItems, { items: resolvedItems, depth: 0 }) : null }) }) });
|
|
@@ -449,10 +475,17 @@ function ArdoRoot({
|
|
|
449
475
|
className,
|
|
450
476
|
children
|
|
451
477
|
}) {
|
|
452
|
-
const location =
|
|
478
|
+
const location = useLocation3();
|
|
453
479
|
const isHomePage = location.pathname === "/" || location.pathname === "";
|
|
454
|
-
const resolvedHeader = header ?? /* @__PURE__ */ jsx6(Header, { ...headerProps });
|
|
455
480
|
const resolvedSidebar = isHomePage ? void 0 : sidebarContent ?? /* @__PURE__ */ jsx6(Sidebar, { ...sidebarProps });
|
|
481
|
+
const inferredMobileMenuContent = isHomePage ? void 0 : resolvedSidebar;
|
|
482
|
+
const resolvedHeader = header ? enhanceHeaderWithMobileMenuContent(header, inferredMobileMenuContent) : /* @__PURE__ */ jsx6(
|
|
483
|
+
Header,
|
|
484
|
+
{
|
|
485
|
+
...headerProps,
|
|
486
|
+
mobileMenuContent: headerProps?.mobileMenuContent ?? inferredMobileMenuContent
|
|
487
|
+
}
|
|
488
|
+
);
|
|
456
489
|
const resolvedFooter = footer ?? /* @__PURE__ */ jsx6(Footer, { ...footerProps });
|
|
457
490
|
const resolvedClassName = className ?? (isHomePage ? "ardo-layout ardo-home" : "ardo-layout");
|
|
458
491
|
return /* @__PURE__ */ jsx6(ArdoProvider, { config, sidebar, children: /* @__PURE__ */ jsx6(
|
|
@@ -466,6 +499,16 @@ function ArdoRoot({
|
|
|
466
499
|
}
|
|
467
500
|
) });
|
|
468
501
|
}
|
|
502
|
+
function enhanceHeaderWithMobileMenuContent(header, mobileMenuContent) {
|
|
503
|
+
if (!isValidElement2(header) || header.type !== Header) {
|
|
504
|
+
return header;
|
|
505
|
+
}
|
|
506
|
+
const existingMobileMenuContent = header.props.mobileMenuContent;
|
|
507
|
+
if (existingMobileMenuContent !== void 0) {
|
|
508
|
+
return header;
|
|
509
|
+
}
|
|
510
|
+
return cloneElement(header, { mobileMenuContent });
|
|
511
|
+
}
|
|
469
512
|
|
|
470
513
|
// src/ui/Nav.tsx
|
|
471
514
|
import { useState as useState4, createContext as createContext2, useContext as useContext3 } from "react";
|
|
@@ -536,14 +579,14 @@ function NavDropdown({ text, children, className }) {
|
|
|
536
579
|
}
|
|
537
580
|
|
|
538
581
|
// src/ui/TOC.tsx
|
|
539
|
-
import { useState as useState5, useEffect as
|
|
582
|
+
import { useState as useState5, useEffect as useEffect3 } from "react";
|
|
540
583
|
import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
541
584
|
function TOC() {
|
|
542
585
|
const toc = useTOC();
|
|
543
586
|
const themeConfig = useThemeConfig();
|
|
544
587
|
const [activeId, setActiveId] = useState5("");
|
|
545
588
|
const label = themeConfig.outline?.label ?? "On this page";
|
|
546
|
-
|
|
589
|
+
useEffect3(() => {
|
|
547
590
|
if (toc.length === 0) return;
|
|
548
591
|
const headingElements = toc.map((item) => document.getElementById(item.id)).filter(Boolean);
|
|
549
592
|
if (headingElements.length === 0) return;
|
|
@@ -773,14 +816,14 @@ function Steps({ children }) {
|
|
|
773
816
|
// src/ui/components/FileTree.tsx
|
|
774
817
|
import {
|
|
775
818
|
Children as Children2,
|
|
776
|
-
isValidElement as
|
|
777
|
-
cloneElement
|
|
819
|
+
isValidElement as isValidElement3,
|
|
820
|
+
cloneElement as cloneElement2
|
|
778
821
|
} from "react";
|
|
779
822
|
import { jsx as jsx14 } from "react/jsx-runtime";
|
|
780
823
|
function getTextContent(node) {
|
|
781
824
|
if (typeof node === "string") return node;
|
|
782
825
|
if (typeof node === "number") return String(node);
|
|
783
|
-
if (!
|
|
826
|
+
if (!isValidElement3(node)) return "";
|
|
784
827
|
const children = node.props.children;
|
|
785
828
|
if (!children) return "";
|
|
786
829
|
return Children2.toArray(children).map(getTextContent).join("");
|
|
@@ -789,7 +832,7 @@ function isDirectory(node) {
|
|
|
789
832
|
const children = node.props.children;
|
|
790
833
|
const childArray = Children2.toArray(children);
|
|
791
834
|
for (const child of childArray) {
|
|
792
|
-
if (
|
|
835
|
+
if (isValidElement3(child) && (child.type === "ul" || child.type === "ol")) {
|
|
793
836
|
return true;
|
|
794
837
|
}
|
|
795
838
|
}
|
|
@@ -798,16 +841,16 @@ function isDirectory(node) {
|
|
|
798
841
|
}
|
|
799
842
|
function processChildren(children) {
|
|
800
843
|
return Children2.map(children, (child) => {
|
|
801
|
-
if (!
|
|
844
|
+
if (!isValidElement3(child)) return child;
|
|
802
845
|
const props = child.props;
|
|
803
846
|
const el = child;
|
|
804
847
|
if (child.type === "li") {
|
|
805
848
|
const isDir = isDirectory(child);
|
|
806
849
|
const className = [props.className, isDir ? "ardo-filetree-dir" : "ardo-filetree-file"].filter(Boolean).join(" ");
|
|
807
|
-
return
|
|
850
|
+
return cloneElement2(el, { className }, processChildren(props.children));
|
|
808
851
|
}
|
|
809
852
|
if (child.type === "ul" || child.type === "ol") {
|
|
810
|
-
return
|
|
853
|
+
return cloneElement2(el, {}, processChildren(props.children));
|
|
811
854
|
}
|
|
812
855
|
return child;
|
|
813
856
|
});
|
|
@@ -841,4 +884,4 @@ export {
|
|
|
841
884
|
Steps,
|
|
842
885
|
FileTree
|
|
843
886
|
};
|
|
844
|
-
//# sourceMappingURL=chunk-
|
|
887
|
+
//# sourceMappingURL=chunk-XK7YZAVP.js.map
|