@assistant-ui/docs-theme 0.0.0 → 0.0.3

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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/dist/action-icons.d.ts +5 -0
  4. package/dist/action-icons.d.ts.map +1 -0
  5. package/dist/action-icons.js +52 -0
  6. package/dist/action-icons.js.map +1 -0
  7. package/dist/brand.d.ts +7 -0
  8. package/dist/brand.d.ts.map +1 -0
  9. package/dist/brand.js +37 -0
  10. package/dist/brand.js.map +1 -0
  11. package/dist/config.d.ts +3 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +22 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/header.d.ts +12 -0
  16. package/dist/header.d.ts.map +1 -0
  17. package/dist/header.js +73 -0
  18. package/dist/header.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +48 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/navigation.d.ts +23 -0
  24. package/dist/navigation.d.ts.map +1 -0
  25. package/dist/navigation.js +41 -0
  26. package/dist/navigation.js.map +1 -0
  27. package/dist/next.d.ts +29 -0
  28. package/dist/next.d.ts.map +1 -0
  29. package/dist/next.js +63 -0
  30. package/dist/next.js.map +1 -0
  31. package/dist/page-content.d.ts +12 -0
  32. package/dist/page-content.d.ts.map +1 -0
  33. package/dist/page-content.js +274 -0
  34. package/dist/page-content.js.map +1 -0
  35. package/dist/provider.d.ts +2 -0
  36. package/dist/provider.d.ts.map +1 -0
  37. package/dist/provider.js +1 -0
  38. package/dist/site/constants.d.ts +2 -0
  39. package/dist/site/constants.d.ts.map +1 -0
  40. package/dist/site/constants.js +5 -0
  41. package/dist/site/constants.js.map +1 -0
  42. package/dist/site/footer.d.ts +13 -0
  43. package/dist/site/footer.d.ts.map +1 -0
  44. package/dist/site/footer.js +35 -0
  45. package/dist/site/footer.js.map +1 -0
  46. package/dist/site/header.d.ts +13 -0
  47. package/dist/site/header.d.ts.map +1 -0
  48. package/dist/site/header.js +81 -0
  49. package/dist/site/header.js.map +1 -0
  50. package/dist/site/layout.d.ts +8 -0
  51. package/dist/site/layout.d.ts.map +1 -0
  52. package/dist/site/layout.js +21 -0
  53. package/dist/site/layout.js.map +1 -0
  54. package/dist/site/page.d.ts +9 -0
  55. package/dist/site/page.d.ts.map +1 -0
  56. package/dist/site/page.js +32 -0
  57. package/dist/site/page.js.map +1 -0
  58. package/dist/site/pager.d.ts +13 -0
  59. package/dist/site/pager.d.ts.map +1 -0
  60. package/dist/site/pager.js +36 -0
  61. package/dist/site/pager.js.map +1 -0
  62. package/dist/site/sidebar-navigation.d.ts +13 -0
  63. package/dist/site/sidebar-navigation.d.ts.map +1 -0
  64. package/dist/site/sidebar-navigation.js +185 -0
  65. package/dist/site/sidebar-navigation.js.map +1 -0
  66. package/dist/site/sidebar.d.ts +16 -0
  67. package/dist/site/sidebar.d.ts.map +1 -0
  68. package/dist/site/sidebar.js +46 -0
  69. package/dist/site/sidebar.js.map +1 -0
  70. package/dist/site/toc.d.ts +12 -0
  71. package/dist/site/toc.d.ts.map +1 -0
  72. package/dist/site/toc.js +92 -0
  73. package/dist/site/toc.js.map +1 -0
  74. package/dist/site/tree.d.ts +24 -0
  75. package/dist/site/tree.d.ts.map +1 -0
  76. package/dist/site/tree.js +14 -0
  77. package/dist/site/tree.js.map +1 -0
  78. package/dist/site/utils.d.ts +2 -0
  79. package/dist/site/utils.d.ts.map +1 -0
  80. package/dist/site/utils.js +5 -0
  81. package/dist/site/utils.js.map +1 -0
  82. package/dist/ui.d.ts +10 -0
  83. package/dist/ui.d.ts.map +1 -0
  84. package/dist/ui.js +9 -0
  85. package/package.json +101 -1
  86. package/src/action-icons.tsx +48 -0
  87. package/src/brand.tsx +36 -0
  88. package/src/config.ts +23 -0
  89. package/src/header.test.tsx +41 -0
  90. package/src/header.tsx +94 -0
  91. package/src/index.test.ts +37 -0
  92. package/src/index.ts +38 -0
  93. package/src/layout-hosts.test.tsx +98 -0
  94. package/src/navigation.test.ts +123 -0
  95. package/src/navigation.ts +61 -0
  96. package/src/next.test.tsx +110 -0
  97. package/src/next.tsx +101 -0
  98. package/src/page-content.test.tsx +87 -0
  99. package/src/page-content.tsx +416 -0
  100. package/src/provider.ts +1 -0
  101. package/src/site/constants.ts +1 -0
  102. package/src/site/footer.tsx +59 -0
  103. package/src/site/header.test.tsx +89 -0
  104. package/src/site/header.tsx +117 -0
  105. package/src/site/layout.tsx +33 -0
  106. package/src/site/page.tsx +38 -0
  107. package/src/site/pager.tsx +54 -0
  108. package/src/site/sidebar-navigation.test.tsx +92 -0
  109. package/src/site/sidebar-navigation.tsx +267 -0
  110. package/src/site/sidebar.tsx +77 -0
  111. package/src/site/toc.test.tsx +187 -0
  112. package/src/site/toc.tsx +118 -0
  113. package/src/site/tree.ts +36 -0
  114. package/src/site/utils.ts +2 -0
  115. package/src/ui.ts +19 -0
  116. package/styles/site.css +223 -0
  117. package/styles/theme.css +858 -0
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { cn } from "./utils.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useEffect, useRef, useState } from "react";
5
+ // src/site/toc.tsx
6
+ function headingId(url) {
7
+ const fragment = url.slice(1);
8
+ try {
9
+ return decodeURIComponent(fragment);
10
+ } catch {
11
+ return fragment;
12
+ }
13
+ }
14
+ function DocsTableOfContents({ items, children }) {
15
+ const [activeId, setActiveId] = useState(null);
16
+ const listRef = useRef(null);
17
+ useEffect(() => {
18
+ if (items.length === 0) return;
19
+ const headingIds = items.map((item) => headingId(item.url));
20
+ const viewport = window.matchMedia("(min-width: 1280px)");
21
+ let observer;
22
+ const observeVisibleHeadings = () => {
23
+ observer?.disconnect();
24
+ if (!viewport.matches) return;
25
+ observer = new IntersectionObserver((entries) => {
26
+ for (const entry of entries) if (entry.isIntersecting) {
27
+ setActiveId(entry.target.id);
28
+ break;
29
+ }
30
+ }, {
31
+ rootMargin: "-80px 0px -70% 0px",
32
+ threshold: 0
33
+ });
34
+ for (const id of headingIds) {
35
+ const element = document.getElementById(id);
36
+ if (element) observer.observe(element);
37
+ }
38
+ };
39
+ observeVisibleHeadings();
40
+ viewport.addEventListener("change", observeVisibleHeadings);
41
+ return () => {
42
+ observer?.disconnect();
43
+ viewport.removeEventListener("change", observeVisibleHeadings);
44
+ };
45
+ }, [items]);
46
+ useEffect(() => {
47
+ if (!activeId || !listRef.current) return;
48
+ const activeElement = Array.from(listRef.current.children).find((item) => item.getAttribute("data-toc-id") === activeId);
49
+ if (activeElement) activeElement.scrollIntoView({
50
+ behavior: "smooth",
51
+ block: "nearest"
52
+ });
53
+ }, [activeId]);
54
+ if (items.length === 0) return null;
55
+ return /* @__PURE__ */ jsx("div", {
56
+ className: "docs-toc w-56 max-xl:hidden",
57
+ children: /* @__PURE__ */ jsxs("div", {
58
+ className: "sticky top-[calc(var(--docs-header-height)_+_1rem)] flex max-h-[calc(100vh_-_var(--docs-header-height)_-_1rem)] flex-col pe-4 pt-4 pb-2",
59
+ children: [
60
+ /* @__PURE__ */ jsx("p", {
61
+ className: "text-muted-foreground mb-3 shrink-0 text-xs",
62
+ children: "On this page"
63
+ }),
64
+ /* @__PURE__ */ jsx("ul", {
65
+ ref: listRef,
66
+ className: "flex min-h-0 flex-1 [scrollbar-width:none] flex-col gap-1 overflow-x-hidden overflow-y-auto [&::-webkit-scrollbar]:hidden",
67
+ children: items.map((item) => {
68
+ const id = headingId(item.url);
69
+ const isActive = activeId === id;
70
+ const indent = Math.max(0, item.depth - 2) * 12;
71
+ return /* @__PURE__ */ jsx("li", {
72
+ "data-toc-id": id,
73
+ children: /* @__PURE__ */ jsx("a", {
74
+ href: item.url,
75
+ style: { paddingLeft: indent || void 0 },
76
+ className: cn("block py-1 text-[13px] leading-snug wrap-break-word transition-colors", isActive ? "text-foreground font-medium" : "text-muted-foreground hover:text-foreground"),
77
+ children: item.title
78
+ })
79
+ }, item.url);
80
+ })
81
+ }),
82
+ /* @__PURE__ */ jsx("div", {
83
+ className: "mt-6 shrink-0",
84
+ children
85
+ })
86
+ ]
87
+ })
88
+ });
89
+ }
90
+ export { DocsTableOfContents };
91
+
92
+ //# sourceMappingURL=toc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc.js","names":[],"sources":["../../src/site/toc.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype TOCItem = {\n title: ReactNode;\n url: string;\n depth: number;\n};\n\nfunction headingId(url: string) {\n const fragment = url.slice(1);\n try {\n return decodeURIComponent(fragment);\n } catch {\n return fragment;\n }\n}\n\nexport function DocsTableOfContents({\n items,\n children,\n}: {\n items: TOCItem[];\n children?: ReactNode;\n}) {\n const [activeId, setActiveId] = useState<string | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n useEffect(() => {\n if (items.length === 0) return;\n\n const headingIds = items.map((item) => headingId(item.url));\n\n const viewport = window.matchMedia(\"(min-width: 1280px)\");\n let observer: IntersectionObserver | undefined;\n const observeVisibleHeadings = () => {\n observer?.disconnect();\n if (!viewport.matches) return;\n observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id);\n break;\n }\n }\n },\n { rootMargin: \"-80px 0px -70% 0px\", threshold: 0 },\n );\n for (const id of headingIds) {\n const element = document.getElementById(id);\n if (element) observer.observe(element);\n }\n };\n observeVisibleHeadings();\n viewport.addEventListener(\"change\", observeVisibleHeadings);\n return () => {\n observer?.disconnect();\n viewport.removeEventListener(\"change\", observeVisibleHeadings);\n };\n }, [items]);\n\n useEffect(() => {\n if (!activeId || !listRef.current) return;\n\n const activeElement = Array.from(listRef.current.children).find(\n (item) => item.getAttribute(\"data-toc-id\") === activeId,\n );\n if (activeElement) {\n activeElement.scrollIntoView({\n behavior: \"smooth\",\n block: \"nearest\",\n });\n }\n }, [activeId]);\n\n if (items.length === 0) return null;\n\n return (\n <div className=\"docs-toc w-56 max-xl:hidden\">\n <div className=\"sticky top-[calc(var(--docs-header-height)_+_1rem)] flex max-h-[calc(100vh_-_var(--docs-header-height)_-_1rem)] flex-col pe-4 pt-4 pb-2\">\n <p className=\"text-muted-foreground mb-3 shrink-0 text-xs\">\n On this page\n </p>\n <ul\n ref={listRef}\n className=\"flex min-h-0 flex-1 [scrollbar-width:none] flex-col gap-1 overflow-x-hidden overflow-y-auto [&::-webkit-scrollbar]:hidden\"\n >\n {items.map((item) => {\n const id = headingId(item.url);\n const isActive = activeId === id;\n const indent = Math.max(0, item.depth - 2) * 12;\n\n return (\n <li key={item.url} data-toc-id={id}>\n <a\n href={item.url}\n style={{ paddingLeft: indent || undefined }}\n className={cn(\n \"block py-1 text-[13px] leading-snug wrap-break-word transition-colors\",\n isActive\n ? \"text-foreground font-medium\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n {item.title}\n </a>\n </li>\n );\n })}\n </ul>\n <div className=\"mt-6 shrink-0\">{children}</div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAWA,SAAS,UAAU,KAAa;CAC9B,MAAM,WAAW,IAAI,MAAM,CAAC;CAC5B,IAAI;EACF,OAAO,mBAAmB,QAAQ;CACpC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,oBAAoB,EAClC,OACA,YAIC;CACD,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAC5D,MAAM,UAAU,OAAyB,IAAI;CAE7C,gBAAgB;EACd,IAAI,MAAM,WAAW,GAAG;EAExB,MAAM,aAAa,MAAM,KAAK,SAAS,UAAU,KAAK,GAAG,CAAC;EAE1D,MAAM,WAAW,OAAO,WAAW,qBAAqB;EACxD,IAAI;EACJ,MAAM,+BAA+B;GACnC,UAAU,WAAW;GACrB,IAAI,CAAC,SAAS,SAAS;GACvB,WAAW,IAAI,sBACZ,YAAY;IACX,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,gBAAgB;KACxB,YAAY,MAAM,OAAO,EAAE;KAC3B;IACF;GAEJ,GACA;IAAE,YAAY;IAAsB,WAAW;GAAE,CACnD;GACA,KAAK,MAAM,MAAM,YAAY;IAC3B,MAAM,UAAU,SAAS,eAAe,EAAE;IAC1C,IAAI,SAAS,SAAS,QAAQ,OAAO;GACvC;EACF;EACA,uBAAuB;EACvB,SAAS,iBAAiB,UAAU,sBAAsB;EAC1D,aAAa;GACX,UAAU,WAAW;GACrB,SAAS,oBAAoB,UAAU,sBAAsB;EAC/D;CACF,GAAG,CAAC,KAAK,CAAC;CAEV,gBAAgB;EACd,IAAI,CAAC,YAAY,CAAC,QAAQ,SAAS;EAEnC,MAAM,gBAAgB,MAAM,KAAK,QAAQ,QAAQ,QAAQ,CAAC,CAAC,MACxD,SAAS,KAAK,aAAa,aAAa,MAAM,QACjD;EACA,IAAI,eACF,cAAc,eAAe;GAC3B,UAAU;GACV,OAAO;EACT,CAAC;CAEL,GAAG,CAAC,QAAQ,CAAC;CAEb,IAAI,MAAM,WAAW,GAAG,OAAO;CAE/B,OACE,oBAAC,OAAD;EAAK,WAAU;EACb,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,KAAD;KAAG,WAAU;KAA8C,UAAA;IAExD,CAAA;IACH,oBAAC,MAAD;KACE,KAAK;KACL,WAAU;KAET,UAAA,MAAM,KAAK,SAAS;MACnB,MAAM,KAAK,UAAU,KAAK,GAAG;MAC7B,MAAM,WAAW,aAAa;MAC9B,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC,IAAI;MAE7C,OACE,oBAAC,MAAD;OAAmB,eAAa;OAC9B,UAAA,oBAAC,KAAD;QACE,MAAM,KAAK;QACX,OAAO,EAAE,aAAa,UAAU,KAAA,EAAU;QAC1C,WAAW,GACT,yEACA,WACI,gCACA,6CACN;QAEC,UAAA,KAAK;OACL,CAAA;MACD,GAbK,KAAK,GAaV;KAER,CAAC;IACC,CAAA;IACJ,oBAAC,OAAD;KAAK,WAAU;KAAiB;IAAc,CAAA;GAC3C;;CACF,CAAA;AAET"}
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from "react";
2
+ interface DocsNodeBase {
3
+ $id?: string;
4
+ name?: ReactNode;
5
+ icon?: ReactNode;
6
+ }
7
+ export interface DocsPage extends DocsNodeBase {
8
+ type: "page";
9
+ name: ReactNode;
10
+ url: string;
11
+ }
12
+ export interface DocsFolder extends DocsNodeBase {
13
+ type: "folder";
14
+ name: ReactNode;
15
+ index?: DocsPage;
16
+ children: DocsNode[];
17
+ }
18
+ export interface DocsSeparator extends DocsNodeBase {
19
+ type: "separator";
20
+ }
21
+ export type DocsNode = DocsPage | DocsFolder | DocsSeparator;
22
+ export declare function findActivePath(nodes: readonly DocsNode[], pathname: string): DocsNode[] | null;
23
+ export {};
24
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/site/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AACD,MAAM,WAAW,QAAS,SAAQ,YAAY;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AACD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AACD,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,IAAI,EAAE,WAAW,CAAC;CACnB;AACD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;AAE7D,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,QAAQ,EAAE,MAAM,GACf,QAAQ,EAAE,GAAG,IAAI,CASnB"}
@@ -0,0 +1,14 @@
1
+ // src/site/tree.ts
2
+ function findActivePath(nodes, pathname) {
3
+ for (const node of nodes) {
4
+ if (node.type === "page" && node.url === pathname) return [node];
5
+ if (node.type !== "folder") continue;
6
+ if (node.index?.url === pathname) return [node, node.index];
7
+ const path = findActivePath(node.children, pathname);
8
+ if (path) return [node, ...path];
9
+ }
10
+ return null;
11
+ }
12
+ export { findActivePath };
13
+
14
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","names":[],"sources":["../../src/site/tree.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\n\ninterface DocsNodeBase {\n $id?: string;\n name?: ReactNode;\n icon?: ReactNode;\n}\nexport interface DocsPage extends DocsNodeBase {\n type: \"page\";\n name: ReactNode;\n url: string;\n}\nexport interface DocsFolder extends DocsNodeBase {\n type: \"folder\";\n name: ReactNode;\n index?: DocsPage;\n children: DocsNode[];\n}\nexport interface DocsSeparator extends DocsNodeBase {\n type: \"separator\";\n}\nexport type DocsNode = DocsPage | DocsFolder | DocsSeparator;\n\nexport function findActivePath(\n nodes: readonly DocsNode[],\n pathname: string,\n): DocsNode[] | null {\n for (const node of nodes) {\n if (node.type === \"page\" && node.url === pathname) return [node];\n if (node.type !== \"folder\") continue;\n if (node.index?.url === pathname) return [node, node.index];\n const path = findActivePath(node.children, pathname);\n if (path) return [node, ...path];\n }\n return null;\n}\n"],"mappings":";AAuBA,SAAgB,eACd,OACA,UACmB;CACnB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,KAAK,SAAS,UAAU,KAAK,QAAQ,UAAU,OAAO,CAAC,IAAI;EAC/D,IAAI,KAAK,SAAS,UAAU;EAC5B,IAAI,KAAK,OAAO,QAAQ,UAAU,OAAO,CAAC,MAAM,KAAK,KAAK;EAC1D,MAAM,OAAO,eAAe,KAAK,UAAU,QAAQ;EACnD,IAAI,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI;CACjC;CACA,OAAO;AACT"}
@@ -0,0 +1,2 @@
1
+ export declare const cn: (...values: (string | false | undefined)[]) => string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/site/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,EAAE,GAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,EAAE,WAC1B,CAAC"}
@@ -0,0 +1,5 @@
1
+ // src/site/utils.ts
2
+ const cn = (...values) => values.filter(Boolean).join(" ");
3
+ export { cn };
4
+
5
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/site/utils.ts"],"sourcesContent":["export const cn = (...values: (string | false | undefined)[]) =>\n values.filter(Boolean).join(\" \");\n"],"mappings":";AAAA,MAAa,MAAM,GAAG,WACpB,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export { DocsShell, DocsContent } from "./site/layout.js";
2
+ export { DocsPageShell, DocsBody } from "./site/page.js";
3
+ export { DocsFooter } from "./site/footer.js";
4
+ export { DOCS_SIDEBAR_ID, DocsSidebar, DocsSidebarProvider, useDocsSidebar, } from "./site/sidebar.js";
5
+ export { DocsSidebarNavigation } from "./site/sidebar-navigation.js";
6
+ export { DocsTableOfContents } from "./site/toc.js";
7
+ export type { DocsNode, DocsPage, DocsFolder, DocsSeparator, } from "./site/tree.js";
8
+ export { DocsSiteHeader } from "./site/header.js";
9
+ export { DocsPagerNavigation } from "./site/pager.js";
10
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAsB;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,uBAAoB;AACtD,OAAO,EAAE,UAAU,EAAE,yBAAsB;AAC3C,OAAO,EACL,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,cAAc,GACf,0BAAuB;AACxB,OAAO,EAAE,qBAAqB,EAAE,qCAAkC;AAClE,OAAO,EAAE,mBAAmB,EAAE,sBAAmB;AACjD,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,GACd,uBAAoB;AACrB,OAAO,EAAE,cAAc,EAAE,yBAAsB;AAC/C,OAAO,EAAE,mBAAmB,EAAE,wBAAqB"}
package/dist/ui.js ADDED
@@ -0,0 +1,9 @@
1
+ import { DocsFooter } from "./site/footer.js";
2
+ import { DOCS_SIDEBAR_ID, DocsSidebar, DocsSidebarProvider, useDocsSidebar } from "./site/sidebar.js";
3
+ import { DocsSiteHeader } from "./site/header.js";
4
+ import { DocsContent, DocsShell } from "./site/layout.js";
5
+ import { DocsBody, DocsPageShell } from "./site/page.js";
6
+ import { DocsPagerNavigation } from "./site/pager.js";
7
+ import { DocsSidebarNavigation } from "./site/sidebar-navigation.js";
8
+ import { DocsTableOfContents } from "./site/toc.js";
9
+ export { DOCS_SIDEBAR_ID, DocsBody, DocsContent, DocsFooter, DocsPageShell, DocsPagerNavigation, DocsShell, DocsSidebar, DocsSidebarNavigation, DocsSidebarProvider, DocsSiteHeader, DocsTableOfContents, useDocsSidebar };
package/package.json CHANGED
@@ -1 +1,101 @@
1
- {"name":"@assistant-ui/docs-theme","version":"0.0.0","description":"placeholder","license":"MIT"}
1
+ {
2
+ "name": "@assistant-ui/docs-theme",
3
+ "version": "0.0.3",
4
+ "description": "Composable assistant-ui documentation UI and theme for Next.js",
5
+ "license": "MIT",
6
+ "author": "AgentbaseAI Inc.",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./next": {
16
+ "types": "./dist/next.d.ts",
17
+ "default": "./dist/next.js"
18
+ },
19
+ "./provider": {
20
+ "types": "./dist/provider.d.ts",
21
+ "default": "./dist/provider.js"
22
+ },
23
+ "./styles.css": "./styles/theme.css",
24
+ "./ui": {
25
+ "types": "./dist/ui.d.ts",
26
+ "default": "./dist/ui.js"
27
+ },
28
+ "./site.css": "./styles/site.css"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src",
33
+ "styles",
34
+ "README.md",
35
+ "LICENSE"
36
+ ],
37
+ "sideEffects": [
38
+ "**/*.css"
39
+ ],
40
+ "dependencies": {
41
+ "@radix-ui/react-dropdown-menu": "^2.2.1",
42
+ "lucide-react": "^1.61.0"
43
+ },
44
+ "peerDependencies": {
45
+ "@farming-labs/docs": "0.2.137",
46
+ "@farming-labs/theme": "0.2.137",
47
+ "fumadocs-ui": "16.17.8",
48
+ "next": "^16.0.0",
49
+ "next-themes": "^0.4.0",
50
+ "react": "^19.2.0",
51
+ "react-dom": "^19.2.0",
52
+ "motion": "^14.0.0"
53
+ },
54
+ "devDependencies": {
55
+ "@assistant-ui/x-buildutils": "0.0.32",
56
+ "@farming-labs/docs": "0.2.137",
57
+ "@farming-labs/theme": "0.2.137",
58
+ "@types/node": "^26.6.5",
59
+ "@types/react": "^19.3.0",
60
+ "@types/react-dom": "^19.3.0",
61
+ "@vitest/coverage-v8": "^5.0.5",
62
+ "fumadocs-ui": "16.17.8",
63
+ "jsdom": "^30.1.3",
64
+ "next": "^16.4.3",
65
+ "next-themes": "^0.4.6",
66
+ "react": "^19.3.1",
67
+ "react-dom": "^19.3.1",
68
+ "typescript": "^7.0.2",
69
+ "vitest": "^5.0.5",
70
+ "motion": "^14.6.0"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "repository": {
76
+ "type": "git",
77
+ "url": "git+https://github.com/assistant-ui/assistant-ui.git",
78
+ "directory": "packages/docs-theme"
79
+ },
80
+ "private": false,
81
+ "peerDependenciesMeta": {
82
+ "next": {
83
+ "optional": true
84
+ },
85
+ "next-themes": {
86
+ "optional": true
87
+ },
88
+ "react-dom": {
89
+ "optional": true
90
+ },
91
+ "motion": {
92
+ "optional": true
93
+ }
94
+ },
95
+ "scripts": {
96
+ "build": "aui-build",
97
+ "typecheck": "tsc --noEmit",
98
+ "test": "vitest run",
99
+ "test:coverage": "vitest run --coverage"
100
+ }
101
+ }
@@ -0,0 +1,48 @@
1
+ import type { ComponentProps } from "react";
2
+
3
+ export const ClaudeIcon = (props: ComponentProps<"svg">) => {
4
+ return (
5
+ <svg aria-hidden="true" {...props} viewBox="0 0 24 24" fill="currentColor">
6
+ <path d="m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z" />
7
+ </svg>
8
+ );
9
+ };
10
+
11
+ export const McpIcon = (props: ComponentProps<"svg">) => {
12
+ return (
13
+ <svg aria-hidden="true" {...props} viewBox="0 0 180 180" fill="none">
14
+ <path
15
+ d="M18 84.8528L85.8822 16.9706C95.2548 7.59798 110.451 7.59798 119.823 16.9706C129.196 26.3431 129.196 41.5391 119.823 50.9117L68.5581 102.177"
16
+ stroke="currentColor"
17
+ strokeWidth={12}
18
+ strokeLinecap="round"
19
+ />
20
+ <path
21
+ d="M69.2652 101.47L119.823 50.9117C129.196 41.5391 144.392 41.5391 153.765 50.9117L154.118 51.2652C163.491 60.6378 163.491 75.8338 154.118 85.2063L92.7248 146.6C89.6006 149.724 89.6006 154.789 92.7248 157.913L105.331 170.52"
22
+ stroke="currentColor"
23
+ strokeWidth={12}
24
+ strokeLinecap="round"
25
+ />
26
+ <path
27
+ d="M102.853 33.9411L52.6482 84.1457C43.2756 93.5183 43.2756 108.714 52.6482 118.087C62.0208 127.459 77.2167 127.459 86.5893 118.087L136.794 67.8822"
28
+ stroke="currentColor"
29
+ strokeWidth={12}
30
+ strokeLinecap="round"
31
+ />
32
+ </svg>
33
+ );
34
+ };
35
+
36
+ export const OpenAIIcon = (props: ComponentProps<"svg">) => {
37
+ return (
38
+ <svg
39
+ viewBox="0 0 256 260"
40
+ xmlns="http://www.w3.org/2000/svg"
41
+ fill="currentColor"
42
+ aria-hidden="true"
43
+ {...props}
44
+ >
45
+ <path d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z" />
46
+ </svg>
47
+ );
48
+ };
package/src/brand.tsx ADDED
@@ -0,0 +1,36 @@
1
+ export const DocsBrand = ({ name }: DocsBrand.Props) => {
2
+ return (
3
+ <span className="aui-docs-brand">
4
+ <svg
5
+ aria-hidden="true"
6
+ className="aui-docs-brand-logo"
7
+ viewBox="40 40 24 24"
8
+ fill="none"
9
+ >
10
+ <path
11
+ d="M52.5 44C52.5 43.9005 52.4704 43.8042 52.416 43.7227L52.3535 43.6465C52.2597 43.5527 52.1325 43.5 52 43.5H44C43.7284 43.5 43.5 43.7284 43.5 44V51.3789L44.9395 49.9395L45.0498 49.8398C45.3167 49.6212 45.652 49.5 46 49.5H52C52.1326 49.5 52.2597 49.4473 52.3535 49.3535C52.4473 49.2597 52.5 49.1326 52.5 49V44ZM55.5 49C55.5 49.9283 55.131 50.8182 54.4746 51.4746C53.8182 52.131 52.9282 52.5 52 52.5H46.6211L43.0605 56.0605C42.6315 56.4895 41.9863 56.6179 41.4258 56.3857C40.8654 56.1535 40.5 55.6066 40.5 55V44C40.5 42.0716 42.0716 40.5 44 40.5H52C52.9282 40.5 53.8182 40.869 54.4746 41.5254C55.131 42.1818 55.5 43.0718 55.5 44V49Z"
12
+ fill="currentColor"
13
+ />
14
+ <path
15
+ d="M60.5 51C60.5 50.9006 60.4704 50.8042 60.416 50.7227L60.3535 50.6465C60.2597 50.5527 60.1325 50.5 60 50.5H58C57.1716 50.5 56.5 49.8284 56.5 49C56.5 48.1716 57.1716 47.5 58 47.5H60C60.9282 47.5 61.8182 47.869 62.4746 48.5254C63.131 49.1818 63.5 50.0718 63.5 51V62C63.5 62.6066 63.1346 63.1535 62.5742 63.3857C62.0137 63.6179 61.3685 63.4895 60.9395 63.0605L57.3789 59.5H52C51.0718 59.5 50.1818 59.131 49.5254 58.4746C48.869 57.8182 48.5 56.9282 48.5 56V55C48.5 54.1716 49.1716 53.5 50 53.5C50.8284 53.5 51.5 54.1716 51.5 55V56C51.5 56.1326 51.5527 56.2597 51.6465 56.3535C51.7403 56.4473 51.8674 56.5 52 56.5H58C58.3978 56.5 58.7792 56.6581 59.0605 56.9395L60.5 58.3789V51Z"
16
+ fill="currentColor"
17
+ />
18
+ </svg>
19
+ <span className="aui-docs-brand-source">assistant-ui</span>
20
+ {name && (
21
+ <>
22
+ <span aria-hidden="true" className="aui-docs-brand-slash">
23
+ /
24
+ </span>
25
+ <span className="aui-docs-brand-product">{name}</span>
26
+ </>
27
+ )}
28
+ </span>
29
+ );
30
+ };
31
+
32
+ export namespace DocsBrand {
33
+ export interface Props {
34
+ name?: string;
35
+ }
36
+ }
package/src/config.ts ADDED
@@ -0,0 +1,23 @@
1
+ import {
2
+ defineDocs as defineFarmingDocs,
3
+ type DocsConfig,
4
+ } from "@farming-labs/docs/config";
5
+ import { assistantUi } from "./index";
6
+
7
+ export const withThemeDefaults = (options: DocsConfig): DocsConfig =>
8
+ defineFarmingDocs({
9
+ ...options,
10
+ theme: options.theme ?? assistantUi(),
11
+ sidebar:
12
+ options.sidebar === false
13
+ ? false
14
+ : {
15
+ collapsible: false,
16
+ flat: true,
17
+ folderIndexBehavior: "link",
18
+ ...(typeof options.sidebar === "object" ? options.sidebar : {}),
19
+ },
20
+ breadcrumb: options.breadcrumb ?? { enabled: false },
21
+ lastUpdated: options.lastUpdated ?? false,
22
+ pageActions: { copyMarkdown: false, openDocs: false },
23
+ });
@@ -0,0 +1,41 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { renderToStaticMarkup } from "react-dom/server";
4
+ import { SearchProvider } from "fumadocs-ui/contexts/search";
5
+ import { describe, expect, it } from "vitest";
6
+ import { DocsHeader } from "./header";
7
+
8
+ describe("documentation header", () => {
9
+ it.each(["Ctrl", "⌘"])(
10
+ "displays the configured %s search shortcut",
11
+ (modifier) => {
12
+ const html = renderToStaticMarkup(
13
+ <SearchProvider
14
+ preload={false}
15
+ hotKey={[
16
+ { key: "Control", display: modifier },
17
+ { key: "k", display: "K" },
18
+ ]}
19
+ >
20
+ <DocsHeader
21
+ brand="Project"
22
+ brandSlot={null}
23
+ homeUrl="/"
24
+ docsUrl="/docs"
25
+ name="Project"
26
+ links={[]}
27
+ themeToggle={false}
28
+ />
29
+ </SearchProvider>,
30
+ );
31
+ const container = document.createElement("div");
32
+ container.innerHTML = html;
33
+ expect(container.querySelector("kbd")?.textContent).toBe(`${modifier} K`);
34
+ expect(
35
+ container
36
+ .querySelector('a[href="/docs"]')
37
+ ?.getAttribute("aria-current"),
38
+ ).toBe("true");
39
+ },
40
+ );
41
+ });
package/src/header.tsx ADDED
@@ -0,0 +1,94 @@
1
+ "use client";
2
+
3
+ import type { ReactNode } from "react";
4
+ import Link from "next/link";
5
+ import { Moon, Search, Sun } from "lucide-react";
6
+ import { useTheme } from "next-themes";
7
+ import { useSearchContext } from "fumadocs-ui/contexts/search";
8
+ import type { createDocsLayout } from "./next";
9
+
10
+ export const DocsHeader = ({
11
+ brand,
12
+ brandSlot,
13
+ homeUrl,
14
+ docsUrl,
15
+ name,
16
+ links,
17
+ themeToggle,
18
+ }: {
19
+ brand: ReactNode;
20
+ brandSlot: ReactNode;
21
+ homeUrl: string;
22
+ docsUrl: string;
23
+ name: string;
24
+ links: createDocsLayout.Options["links"];
25
+ themeToggle: boolean;
26
+ }) => {
27
+ const { resolvedTheme, setTheme } = useTheme();
28
+ const { setOpenSearch, hotKey } = useSearchContext();
29
+ return (
30
+ <header className="aui-docs-header">
31
+ {brandSlot ? (
32
+ <div className="aui-docs-header-brand">{brandSlot}</div>
33
+ ) : (
34
+ <Link
35
+ href={homeUrl}
36
+ className="aui-docs-header-brand"
37
+ aria-label={`${name} home`}
38
+ >
39
+ {brand}
40
+ </Link>
41
+ )}
42
+ <div className="aui-docs-header-controls">
43
+ <button
44
+ type="button"
45
+ className="aui-docs-header-search"
46
+ aria-label="Search documentation"
47
+ onClick={() => setOpenSearch(true)}
48
+ >
49
+ <Search aria-hidden="true" />
50
+ <span>Search...</span>
51
+ {hotKey.length > 0 && (
52
+ <kbd aria-hidden="true">
53
+ {hotKey.map((key, index) => (
54
+ <span key={index}>
55
+ {index > 0 && " "}
56
+ {key.display}
57
+ </span>
58
+ ))}
59
+ </kbd>
60
+ )}
61
+ </button>
62
+ <nav className="aui-docs-header-links" aria-label="Site navigation">
63
+ <Link href={docsUrl} aria-current="true">
64
+ Docs
65
+ </Link>
66
+ {links?.map((link) => (
67
+ <a
68
+ key={link.href}
69
+ href={link.href}
70
+ {...(link.external
71
+ ? { target: "_blank", rel: "noreferrer noopener" }
72
+ : {})}
73
+ >
74
+ {link.label}
75
+ </a>
76
+ ))}
77
+ </nav>
78
+ {themeToggle && (
79
+ <button
80
+ type="button"
81
+ className="aui-docs-theme-toggle"
82
+ aria-label="Toggle color theme"
83
+ onClick={() =>
84
+ setTheme(resolvedTheme === "dark" ? "light" : "dark")
85
+ }
86
+ >
87
+ <Sun className="aui-docs-theme-sun" aria-hidden="true" />
88
+ <Moon className="aui-docs-theme-moon" aria-hidden="true" />
89
+ </button>
90
+ )}
91
+ </div>
92
+ </header>
93
+ );
94
+ };
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assistantUi } from "./index";
3
+ import { withThemeDefaults } from "./config";
4
+
5
+ describe("assistant-ui theme configuration", () => {
6
+ it("provides the complete theme and a sidebar without a collapse control", () => {
7
+ const config = withThemeDefaults({ entry: "guide" });
8
+ expect(config.entry).toBe("guide");
9
+ expect(config.theme?.name).toBe("assistant-ui");
10
+ expect(config.sidebar).toMatchObject({ collapsible: false, flat: true });
11
+ expect(config.pageActions).toEqual({
12
+ copyMarkdown: false,
13
+ openDocs: false,
14
+ });
15
+ });
16
+
17
+ it("merges theme overrides without losing unrelated defaults", () => {
18
+ const theme = assistantUi({ ui: { layout: { contentWidth: 960 } } });
19
+ expect(theme.ui?.layout?.contentWidth).toBe(960);
20
+ expect(theme.ui?.layout?.sidebarWidth).toBe(260);
21
+ expect(assistantUi().ui?.layout?.contentWidth).toBe(848);
22
+ });
23
+
24
+ it("preserves consumer configuration and explicit disabled features", () => {
25
+ const config = withThemeDefaults({
26
+ entry: "guide",
27
+ sidebar: false,
28
+ lastUpdated: true,
29
+ github: "https://github.com/example/project",
30
+ nav: { title: "Example", url: "/" },
31
+ });
32
+ expect(config.sidebar).toBe(false);
33
+ expect(config.lastUpdated).toBe(true);
34
+ expect(config.github).toBe("https://github.com/example/project");
35
+ expect(config.nav?.title).toBe("Example");
36
+ });
37
+ });
package/src/index.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { createTheme, type DocsTheme } from "@farming-labs/docs/config";
2
+ import { shadcn } from "@farming-labs/theme/shadcn";
3
+
4
+ const createAssistantTheme = createTheme({
5
+ ...shadcn({
6
+ ui: {
7
+ layout: {
8
+ contentWidth: 848,
9
+ sidebarWidth: 260,
10
+ tocWidth: 224,
11
+ header: { height: 48 },
12
+ },
13
+ typography: {
14
+ font: {
15
+ style: {
16
+ sans: "var(--font-public-sans, ui-sans-serif), system-ui, sans-serif",
17
+ mono: "var(--font-jetbrains-mono, ui-monospace), monospace",
18
+ },
19
+ h1: { size: "1.5rem", weight: 500, letterSpacing: "-0.025em" },
20
+ h2: { size: "1.25rem", weight: 500, letterSpacing: "-0.02em" },
21
+ h3: { size: "1rem", weight: 500, letterSpacing: "-0.01em" },
22
+ body: { size: "0.875rem", lineHeight: "1.7" },
23
+ },
24
+ },
25
+ codeBlock: { showCopyButton: true, showLineNumbers: false },
26
+ },
27
+ }),
28
+ name: "assistant-ui",
29
+ });
30
+
31
+ export const assistantUi = (overrides: assistantUi.Options = {}): DocsTheme =>
32
+ createAssistantTheme(overrides);
33
+
34
+ export namespace assistantUi {
35
+ export interface Options extends Partial<DocsTheme> {}
36
+ }
37
+
38
+ export { DocsBrand } from "./brand";