diff --git a/docs/app/(home)/layout.tsx b/docs/app/(home)/layout.tsx
index b88e7e3f0..bc9442c11 100644
--- a/docs/app/(home)/layout.tsx
+++ b/docs/app/(home)/layout.tsx
@@ -1,12 +1,11 @@
-import { WebsiteThemeProvider } from "@/components/website-theme-provider";
import "./globals.css";
import { Navbar } from "./sections/Navbar/Navbar";
export default function Layout({ children }: { children: React.ReactNode }) {
return (
-
+ <>
{children}
-
+ >
);
}
diff --git a/docs/app/blog/fumadocs.css b/docs/app/blog/fumadocs.css
new file mode 100644
index 000000000..81d999ee3
--- /dev/null
+++ b/docs/app/blog/fumadocs.css
@@ -0,0 +1,2 @@
+@reference "../global.css";
+@import "fumadocs-ui/css/preset.css";
diff --git a/docs/app/blog/layout.tsx b/docs/app/blog/layout.tsx
index 184c4659a..a461173ca 100644
--- a/docs/app/blog/layout.tsx
+++ b/docs/app/blog/layout.tsx
@@ -1,7 +1,8 @@
-import "../(home)/globals.css";
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
import type { Metadata } from "next";
+import "../(home)/globals.css";
import { BlogNavbar } from "./components/BlogNavbar";
+import "./fumadocs.css";
export const metadata: Metadata = {
alternates: {
diff --git a/docs/app/chat/_components/agent-surfaces/cloud-agent-surface.tsx b/docs/app/chat/_components/agent-surfaces/cloud-agent-surface.tsx
index 16125deb7..58ec05d9b 100644
--- a/docs/app/chat/_components/agent-surfaces/cloud-agent-surface.tsx
+++ b/docs/app/chat/_components/agent-surfaces/cloud-agent-surface.tsx
@@ -4,7 +4,7 @@ import { createCloudChatLLM } from "@/lib/openui-cloud/chat-llm";
import { DEFAULT_MODEL } from "@/lib/openui-cloud/models";
import { CLOUD_USER_ID_HEADER, getOrCreateCloudUserId } from "@/lib/openui-cloud/user-id";
import { defineArtifactCategories } from "@openuidev/react-headless";
-import { AgentInterface } from "@openuidev/react-ui";
+import { AgentInterface } from "@openuidev/react-ui/AgentInterface";
import {
chatLibrary,
presentationArtifactRenderer,
diff --git a/docs/app/chat/_components/agent-surfaces/cloud-model-switcher.tsx b/docs/app/chat/_components/agent-surfaces/cloud-model-switcher.tsx
index 8014f7e27..c0c1d9586 100644
--- a/docs/app/chat/_components/agent-surfaces/cloud-model-switcher.tsx
+++ b/docs/app/chat/_components/agent-surfaces/cloud-model-switcher.tsx
@@ -8,7 +8,7 @@ import {
SelectItem,
SelectLabel,
SelectTrigger,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Select";
import { useMemo } from "react";
import styles from "../../chat-page.module.css";
diff --git a/docs/app/chat/_components/agent-surfaces/oss-agent-surface.tsx b/docs/app/chat/_components/agent-surfaces/oss-agent-surface.tsx
index 0ad98166d..afabe2cf3 100644
--- a/docs/app/chat/_components/agent-surfaces/oss-agent-surface.tsx
+++ b/docs/app/chat/_components/agent-surfaces/oss-agent-surface.tsx
@@ -1,12 +1,8 @@
"use client";
import { isDemoCreditsErrorPayload } from "@/lib/demo-credits";
-import {
- AgentInterface,
- openAIAdapter,
- openAIMessageFormat,
- type ChatLLM,
-} from "@openuidev/react-ui";
+import { openAIAdapter, openAIMessageFormat, type ChatLLM } from "@openuidev/react-headless";
+import { AgentInterface } from "@openuidev/react-ui/AgentInterface";
import { openuiChatLibrary } from "@openuidev/react-ui/genui-lib";
import { useMemo } from "react";
diff --git a/docs/app/chat/_components/chat-page-client.tsx b/docs/app/chat/_components/chat-page-client.tsx
index 64d711e5a..9531b0ceb 100644
--- a/docs/app/chat/_components/chat-page-client.tsx
+++ b/docs/app/chat/_components/chat-page-client.tsx
@@ -5,10 +5,17 @@ import { OPENUI_CLOUD_UNAVAILABLE_MESSAGE } from "@/lib/openui-cloud/errors";
import dynamic from "next/dynamic";
import { Component, useCallback, useState, type ReactNode } from "react";
import styles from "../chat-page.module.css";
-import { OssAgentSurface } from "./agent-surfaces/oss-agent-surface";
import { ChatPageHeader } from "./chat-page-header";
import type { ChatMode } from "./chat-types";
+const OssAgentSurface = dynamic(
+ () => import("./agent-surfaces/oss-agent-surface").then((module) => module.OssAgentSurface),
+ {
+ ssr: false,
+ loading: () => ,
+ },
+);
+
const CloudAgentSurface = dynamic(
() => import("./agent-surfaces/cloud-agent-surface").then((module) => module.CloudAgentSurface),
{
diff --git a/docs/app/chat/layout.tsx b/docs/app/chat/layout.tsx
index 87e87c6a8..481d32697 100644
--- a/docs/app/chat/layout.tsx
+++ b/docs/app/chat/layout.tsx
@@ -1,4 +1,6 @@
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
+import "@openuidev/react-ui/styles/index.css";
+import "@openuidev/thesys/styles.css";
import type { ReactNode } from "react";
export default function ChatLayout({ children }: { children: ReactNode }) {
diff --git a/docs/app/compare/_components/agent-surfaces/cloud-agent-surface.tsx b/docs/app/compare/_components/agent-surfaces/cloud-agent-surface.tsx
index fd65d8217..bb8f5f309 100644
--- a/docs/app/compare/_components/agent-surfaces/cloud-agent-surface.tsx
+++ b/docs/app/compare/_components/agent-surfaces/cloud-agent-surface.tsx
@@ -2,7 +2,7 @@
import { createCloudChatLLM } from "@/lib/openui-cloud/chat-llm";
import { CLOUD_USER_ID_HEADER, getOrCreateCloudUserId } from "@/lib/openui-cloud/user-id";
-import { AgentInterface } from "@openuidev/react-ui";
+import { AgentInterface } from "@openuidev/react-ui/AgentInterface";
import { artifactRenderers, chatLibrary, useOpenuiCloudStorage } from "@openuidev/thesys";
import { useMemo, useState } from "react";
import type { ComparisonControllerRegistry } from "../comparison-mode-controller";
diff --git a/docs/app/compare/_components/agent-surfaces/markdown-agent-surface.tsx b/docs/app/compare/_components/agent-surfaces/markdown-agent-surface.tsx
index 4ecb0e523..6b6b4e1e2 100644
--- a/docs/app/compare/_components/agent-surfaces/markdown-agent-surface.tsx
+++ b/docs/app/compare/_components/agent-surfaces/markdown-agent-surface.tsx
@@ -1,6 +1,6 @@
"use client";
-import { AgentInterface } from "@openuidev/react-ui";
+import { AgentInterface } from "@openuidev/react-ui/AgentInterface";
import type { ComparisonControllerRegistry } from "../comparison-mode-controller";
import { ComparisonModeControllerBridge } from "../comparison-mode-controller";
import { ComparisonSurfaceWelcome } from "./comparison-surface-welcome";
diff --git a/docs/app/compare/_components/agent-surfaces/oss-agent-surface.tsx b/docs/app/compare/_components/agent-surfaces/oss-agent-surface.tsx
index 20ef99a7b..1ef633cbc 100644
--- a/docs/app/compare/_components/agent-surfaces/oss-agent-surface.tsx
+++ b/docs/app/compare/_components/agent-surfaces/oss-agent-surface.tsx
@@ -1,6 +1,6 @@
"use client";
-import { AgentInterface } from "@openuidev/react-ui";
+import { AgentInterface } from "@openuidev/react-ui/AgentInterface";
import { openuiChatLibrary } from "@openuidev/react-ui/genui-lib";
import type { ComparisonControllerRegistry } from "../comparison-mode-controller";
import { ComparisonModeControllerBridge } from "../comparison-mode-controller";
diff --git a/docs/app/compare/_components/agent-surfaces/use-comparison-chat-llm.ts b/docs/app/compare/_components/agent-surfaces/use-comparison-chat-llm.ts
index 0272e39bb..c9b098175 100644
--- a/docs/app/compare/_components/agent-surfaces/use-comparison-chat-llm.ts
+++ b/docs/app/compare/_components/agent-surfaces/use-comparison-chat-llm.ts
@@ -1,7 +1,7 @@
"use client";
import { isDemoCreditsErrorPayload } from "@/lib/demo-credits";
-import { openAIAdapter, openAIMessageFormat, type ChatLLM } from "@openuidev/react-ui";
+import { openAIAdapter, openAIMessageFormat, type ChatLLM } from "@openuidev/react-headless";
import { useMemo } from "react";
type ComparisonResponseMode = "markdown" | "openui";
diff --git a/docs/app/compare/_components/compare-page-client.tsx b/docs/app/compare/_components/compare-page-client.tsx
index 5d6059246..e9540418c 100644
--- a/docs/app/compare/_components/compare-page-client.tsx
+++ b/docs/app/compare/_components/compare-page-client.tsx
@@ -14,7 +14,6 @@ import {
} from "react";
import styles from "../chat-page.module.css";
import { MarkdownAgentSurface } from "./agent-surfaces/markdown-agent-surface";
-import { OssAgentSurface } from "./agent-surfaces/oss-agent-surface";
import { ChatPageHeader } from "./chat-page-header";
import {
COMPARISON_MODE_LABELS,
@@ -36,6 +35,14 @@ import {
const ALL_MODES = ["markdown", "oss", "cloud"] as const;
+const OssAgentSurface = dynamic(
+ () => import("./agent-surfaces/oss-agent-surface").then((module) => module.OssAgentSurface),
+ {
+ ssr: false,
+ loading: () => ,
+ },
+);
+
const CloudAgentSurface = dynamic(
() => import("./agent-surfaces/cloud-agent-surface").then((module) => module.CloudAgentSurface),
{
diff --git a/docs/app/compare/layout.tsx b/docs/app/compare/layout.tsx
index 62d083a86..9e99f49ec 100644
--- a/docs/app/compare/layout.tsx
+++ b/docs/app/compare/layout.tsx
@@ -1,4 +1,6 @@
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
+import "@openuidev/react-ui/styles/index.css";
+import "@openuidev/thesys/styles.css";
import type { ReactNode } from "react";
export default function CompareLayout({ children }: { children: ReactNode }) {
diff --git a/docs/app/components/blocks/accordion/page.tsx b/docs/app/components/blocks/accordion/page.tsx
index 262644945..b5fa8ccc9 100644
--- a/docs/app/components/blocks/accordion/page.tsx
+++ b/docs/app/components/blocks/accordion/page.tsx
@@ -6,12 +6,14 @@ import {
AccordionContent,
AccordionItem,
AccordionTrigger,
+} from "@openuidev/react-ui/Accordion";
+import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Select";
import { useState } from "react";
import styles from "./page.module.css";
diff --git a/docs/app/components/blocks/button-group/page.tsx b/docs/app/components/blocks/button-group/page.tsx
index bdac44a10..59016616d 100644
--- a/docs/app/components/blocks/button-group/page.tsx
+++ b/docs/app/components/blocks/button-group/page.tsx
@@ -6,16 +6,16 @@ import {
PreviewSection,
SegmentedToggle,
} from "@components/components/preview";
+import { Button } from "@openuidev/react-ui/Button";
+import { Buttons } from "@openuidev/react-ui/Buttons";
+import { IconButton } from "@openuidev/react-ui/IconButton";
import {
- Button,
- Buttons,
- IconButton,
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Select";
import { useState } from "react";
import styles from "./page.module.css";
diff --git a/docs/app/components/blocks/callout/page.tsx b/docs/app/components/blocks/callout/page.tsx
index c4f8a1caf..bda20cc81 100644
--- a/docs/app/components/blocks/callout/page.tsx
+++ b/docs/app/components/blocks/callout/page.tsx
@@ -7,8 +7,8 @@ import {
SelectItem,
SelectTrigger,
SelectValue,
- TextCallout,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Select";
+import { TextCallout } from "@openuidev/react-ui/TextCallout";
import { useState } from "react";
type CalloutVariant = "neutral" | "info" | "warning" | "success" | "danger";
diff --git a/docs/app/components/blocks/charts/area/page.tsx b/docs/app/components/blocks/charts/area/page.tsx
index 521cf57e4..047940cfb 100644
--- a/docs/app/components/blocks/charts/area/page.tsx
+++ b/docs/app/components/blocks/charts/area/page.tsx
@@ -2,7 +2,16 @@
import ClientOnly from "@components/blocks/_components/ClientOnly";
import { BlockVariantPreview, PreviewPage, PreviewSection } from "@components/components/preview";
-import { AreaChart, AreaChartCondensed } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const AreaChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.AreaChart),
+ { ssr: false },
+);
+const AreaChartCondensed = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.AreaChartCondensed),
+ { ssr: false },
+);
const areaData = [
{ month: "Jan", desktop: 150, mobile: 90 },
diff --git a/docs/app/components/blocks/charts/bar/page.tsx b/docs/app/components/blocks/charts/bar/page.tsx
index 811a83052..79f678405 100644
--- a/docs/app/components/blocks/charts/bar/page.tsx
+++ b/docs/app/components/blocks/charts/bar/page.tsx
@@ -2,7 +2,16 @@
import ClientOnly from "@components/blocks/_components/ClientOnly";
import { BlockVariantPreview, PreviewPage, PreviewSection } from "@components/components/preview";
-import { BarChart, BarChartCondensed } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const BarChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.BarChart),
+ { ssr: false },
+);
+const BarChartCondensed = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.BarChartCondensed),
+ { ssr: false },
+);
const barData = [
{ month: "Jan", desktop: 150, mobile: 90 },
diff --git a/docs/app/components/blocks/charts/donut/page.tsx b/docs/app/components/blocks/charts/donut/page.tsx
index 59af6b50c..5666ea08b 100644
--- a/docs/app/components/blocks/charts/donut/page.tsx
+++ b/docs/app/components/blocks/charts/donut/page.tsx
@@ -2,7 +2,12 @@
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
import ClientOnly from "@components/blocks/_components/ClientOnly";
-import { PieChart } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const PieChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.PieChart),
+ { ssr: false },
+);
const donutData = [
{ category: "January", value: 1250 },
diff --git a/docs/app/components/blocks/charts/line/page.tsx b/docs/app/components/blocks/charts/line/page.tsx
index 3c56d8c08..4e4fe5a6a 100644
--- a/docs/app/components/blocks/charts/line/page.tsx
+++ b/docs/app/components/blocks/charts/line/page.tsx
@@ -2,7 +2,16 @@
import ClientOnly from "@components/blocks/_components/ClientOnly";
import { BlockVariantPreview, PreviewPage, PreviewSection } from "@components/components/preview";
-import { LineChart, LineChartCondensed } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const LineChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.LineChart),
+ { ssr: false },
+);
+const LineChartCondensed = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.LineChartCondensed),
+ { ssr: false },
+);
const lineData = [
{ month: "Jan", desktop: 150, mobile: 90 },
diff --git a/docs/app/components/blocks/charts/pie/page.tsx b/docs/app/components/blocks/charts/pie/page.tsx
index 6b511208b..e2372159d 100644
--- a/docs/app/components/blocks/charts/pie/page.tsx
+++ b/docs/app/components/blocks/charts/pie/page.tsx
@@ -2,7 +2,12 @@
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
import ClientOnly from "@components/blocks/_components/ClientOnly";
-import { PieChart } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const PieChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.PieChart),
+ { ssr: false },
+);
const pieData = [
{ category: "January", value: 1250 },
diff --git a/docs/app/components/blocks/charts/radial/page.tsx b/docs/app/components/blocks/charts/radial/page.tsx
index 6bcf6989b..e32be7355 100644
--- a/docs/app/components/blocks/charts/radial/page.tsx
+++ b/docs/app/components/blocks/charts/radial/page.tsx
@@ -2,7 +2,12 @@
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
import ClientOnly from "@components/blocks/_components/ClientOnly";
-import { RadialChart } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const RadialChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.RadialChart),
+ { ssr: false },
+);
const radialData = [
{ month: "January", value: 1250 },
diff --git a/docs/app/components/blocks/charts/scatter/page.tsx b/docs/app/components/blocks/charts/scatter/page.tsx
index d8abd6c5b..d30b081ba 100644
--- a/docs/app/components/blocks/charts/scatter/page.tsx
+++ b/docs/app/components/blocks/charts/scatter/page.tsx
@@ -2,7 +2,12 @@
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
import ClientOnly from "@components/blocks/_components/ClientOnly";
-import { ScatterChart } from "@openuidev/react-ui";
+import dynamic from "next/dynamic";
+
+const ScatterChart = dynamic(
+ () => import("@openuidev/react-ui/Charts").then((module) => module.ScatterChart),
+ { ssr: false },
+);
const scatterData = [
{
diff --git a/docs/app/components/blocks/checkbox-group/page.tsx b/docs/app/components/blocks/checkbox-group/page.tsx
index ee9b71871..2ef4fad41 100644
--- a/docs/app/components/blocks/checkbox-group/page.tsx
+++ b/docs/app/components/blocks/checkbox-group/page.tsx
@@ -1,7 +1,8 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { CheckBoxGroup, CheckBoxItem } from "@openuidev/react-ui";
+import { CheckBoxGroup } from "@openuidev/react-ui/CheckBoxGroup";
+import { CheckBoxItem } from "@openuidev/react-ui/CheckBoxItem";
function CheckboxGroupPreview() {
return (
diff --git a/docs/app/components/blocks/date-picker/page.tsx b/docs/app/components/blocks/date-picker/page.tsx
index 61f749a56..79ce6f15f 100644
--- a/docs/app/components/blocks/date-picker/page.tsx
+++ b/docs/app/components/blocks/date-picker/page.tsx
@@ -1,7 +1,7 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { DatePicker } from "@openuidev/react-ui";
+import { DatePicker } from "@openuidev/react-ui/DatePicker";
function DatePickerPreview() {
return ;
diff --git a/docs/app/components/blocks/image-items/page.tsx b/docs/app/components/blocks/image-items/page.tsx
index 88f86f559..e1fb4b13e 100644
--- a/docs/app/components/blocks/image-items/page.tsx
+++ b/docs/app/components/blocks/image-items/page.tsx
@@ -1,7 +1,7 @@
"use client";
import { BlockVariantPreview, PreviewPage, PreviewSection } from "@components/components/preview";
-import { ImageBlock } from "@openuidev/react-ui";
+import { ImageBlock } from "@openuidev/react-ui/ImageBlock";
import styles from "./page.module.css";
const DEFAULT_IMAGE =
diff --git a/docs/app/components/blocks/input-field/page.tsx b/docs/app/components/blocks/input-field/page.tsx
index 81c789160..26d927ee1 100644
--- a/docs/app/components/blocks/input-field/page.tsx
+++ b/docs/app/components/blocks/input-field/page.tsx
@@ -1,7 +1,7 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { Input } from "@openuidev/react-ui";
+import { Input } from "@openuidev/react-ui/Input";
function InputFieldPreview() {
return ;
diff --git a/docs/app/components/blocks/lists/page.tsx b/docs/app/components/blocks/lists/page.tsx
index 8e07c26ce..71d3a51f3 100644
--- a/docs/app/components/blocks/lists/page.tsx
+++ b/docs/app/components/blocks/lists/page.tsx
@@ -6,7 +6,8 @@ import {
PreviewSection,
SegmentedToggle,
} from "@components/components/preview";
-import { ListBlock, ListItem } from "@openuidev/react-ui";
+import { ListBlock } from "@openuidev/react-ui/ListBlock";
+import { ListItem } from "@openuidev/react-ui/ListItem";
import { ChevronRight, FileText, Globe, LayoutPanelTop } from "lucide-react";
import { useMemo, useState } from "react";
import styles from "./page.module.css";
diff --git a/docs/app/components/blocks/radio-button-group/page.tsx b/docs/app/components/blocks/radio-button-group/page.tsx
index 3b0010613..1a6047838 100644
--- a/docs/app/components/blocks/radio-button-group/page.tsx
+++ b/docs/app/components/blocks/radio-button-group/page.tsx
@@ -1,7 +1,8 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { RadioGroup, RadioItem } from "@openuidev/react-ui";
+import { RadioGroup } from "@openuidev/react-ui/RadioGroup";
+import { RadioItem } from "@openuidev/react-ui/RadioItem";
function RadioButtonGroupPreview() {
return (
diff --git a/docs/app/components/blocks/select/page.tsx b/docs/app/components/blocks/select/page.tsx
index cde712be4..5cdd47bec 100644
--- a/docs/app/components/blocks/select/page.tsx
+++ b/docs/app/components/blocks/select/page.tsx
@@ -10,7 +10,7 @@ import {
SelectSeparator,
SelectTrigger,
SelectValue,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Select";
function SelectPreview() {
return (
diff --git a/docs/app/components/blocks/tables/page.tsx b/docs/app/components/blocks/tables/page.tsx
index 5f97aa359..d078e5075 100644
--- a/docs/app/components/blocks/tables/page.tsx
+++ b/docs/app/components/blocks/tables/page.tsx
@@ -8,8 +8,8 @@ import {
TableHead,
TableHeader,
TableRow,
- Tag,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Table";
+import { Tag } from "@openuidev/react-ui/Tag";
function TablePreview() {
return (
diff --git a/docs/app/components/blocks/tabs/page.tsx b/docs/app/components/blocks/tabs/page.tsx
index d4f3fcf0f..575622286 100644
--- a/docs/app/components/blocks/tabs/page.tsx
+++ b/docs/app/components/blocks/tabs/page.tsx
@@ -6,7 +6,7 @@ import {
PreviewSection,
SegmentedToggle,
} from "@components/components/preview";
-import { Tabs, TabsList, TabsTrigger } from "@openuidev/react-ui";
+import { Tabs, TabsList, TabsTrigger } from "@openuidev/react-ui/Tabs";
import { useState } from "react";
import styles from "./page.module.css";
diff --git a/docs/app/components/blocks/tag-item/page.tsx b/docs/app/components/blocks/tag-item/page.tsx
index 0f20ed377..005c288cd 100644
--- a/docs/app/components/blocks/tag-item/page.tsx
+++ b/docs/app/components/blocks/tag-item/page.tsx
@@ -1,7 +1,7 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { Tag } from "@openuidev/react-ui";
+import { Tag } from "@openuidev/react-ui/Tag";
function TagItemPreview() {
const tags = [
diff --git a/docs/app/components/blocks/toggle-group/page.tsx b/docs/app/components/blocks/toggle-group/page.tsx
index 2c5de58b6..77606633c 100644
--- a/docs/app/components/blocks/toggle-group/page.tsx
+++ b/docs/app/components/blocks/toggle-group/page.tsx
@@ -1,7 +1,8 @@
"use client";
import BlocksDocPage from "@components/blocks/_components/BlocksDocPage";
-import { SwitchGroup, SwitchItem } from "@openuidev/react-ui";
+import { SwitchGroup } from "@openuidev/react-ui/SwitchGroup";
+import { SwitchItem } from "@openuidev/react-ui/SwitchItem";
function ToggleGroupPreview() {
return (
diff --git a/docs/app/components/components/ProAccessBanner/ProAccessBanner.tsx b/docs/app/components/components/ProAccessBanner/ProAccessBanner.tsx
index 6be64f5cf..919fbadef 100644
--- a/docs/app/components/components/ProAccessBanner/ProAccessBanner.tsx
+++ b/docs/app/components/components/ProAccessBanner/ProAccessBanner.tsx
@@ -1,6 +1,6 @@
"use client";
-import { Button } from "@openuidev/react-ui";
+import { Button } from "@openuidev/react-ui/Button";
import styles from "./ProAccessBanner.module.css";
interface ProAccessBannerProps {
diff --git a/docs/app/components/components/ThemeBuilder/ChartsSection.tsx b/docs/app/components/components/ThemeBuilder/ChartsSection.tsx
index de7d2d738..da88598bd 100644
--- a/docs/app/components/components/ThemeBuilder/ChartsSection.tsx
+++ b/docs/app/components/components/ThemeBuilder/ChartsSection.tsx
@@ -7,7 +7,7 @@ import {
PieChart,
RadialChart,
ScatterChart,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Charts";
import styles from "./realBlocksCanvas.module.css";
const MONTHLY_DATA = [
diff --git a/docs/app/components/components/ThemeBuilder/realBlocksCanvas.tsx b/docs/app/components/components/ThemeBuilder/realBlocksCanvas.tsx
index 1c1d60c51..af7ab12a1 100644
--- a/docs/app/components/components/ThemeBuilder/realBlocksCanvas.tsx
+++ b/docs/app/components/components/ThemeBuilder/realBlocksCanvas.tsx
@@ -5,35 +5,37 @@ import {
AccordionContent,
AccordionItem,
AccordionTrigger,
- Button,
- Buttons,
- CheckBoxGroup,
- CheckBoxItem,
- DatePicker,
- IconButton,
- ImageBlock,
- Input,
- RadioGroup,
- RadioItem,
+} from "@openuidev/react-ui/Accordion";
+import { Button } from "@openuidev/react-ui/Button";
+import { Buttons } from "@openuidev/react-ui/Buttons";
+import { CheckBoxGroup } from "@openuidev/react-ui/CheckBoxGroup";
+import { CheckBoxItem } from "@openuidev/react-ui/CheckBoxItem";
+import { DatePicker } from "@openuidev/react-ui/DatePicker";
+import { IconButton } from "@openuidev/react-ui/IconButton";
+import { ImageBlock } from "@openuidev/react-ui/ImageBlock";
+import { Input } from "@openuidev/react-ui/Input";
+import { RadioGroup } from "@openuidev/react-ui/RadioGroup";
+import { RadioItem } from "@openuidev/react-ui/RadioItem";
+import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
- SwitchGroup,
- SwitchItem,
+} from "@openuidev/react-ui/Select";
+import { SwitchGroup } from "@openuidev/react-ui/SwitchGroup";
+import { SwitchItem } from "@openuidev/react-ui/SwitchItem";
+import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
- Tabs,
- TabsList,
- TabsTrigger,
- Tag,
- TextCallout,
-} from "@openuidev/react-ui";
+} from "@openuidev/react-ui/Table";
+import { Tabs, TabsList, TabsTrigger } from "@openuidev/react-ui/Tabs";
+import { Tag } from "@openuidev/react-ui/Tag";
+import { TextCallout } from "@openuidev/react-ui/TextCallout";
import dynamic from "next/dynamic";
import { useState } from "react";
import styles from "./realBlocksCanvas.module.css";
diff --git a/docs/app/components/components/preview/PromptCopyButton.tsx b/docs/app/components/components/preview/PromptCopyButton.tsx
index 8317e2816..d2b140d00 100644
--- a/docs/app/components/components/preview/PromptCopyButton.tsx
+++ b/docs/app/components/components/preview/PromptCopyButton.tsx
@@ -1,6 +1,6 @@
"use client";
-import { IconButton } from "@openuidev/react-ui";
+import { IconButton } from "@openuidev/react-ui/IconButton";
import { Check, Copy } from "lucide-react";
import { useEffect, useState } from "react";
diff --git a/docs/app/components/theme-builder/page.tsx b/docs/app/components/theme-builder/page.tsx
index 13fb9b5aa..a141a590b 100644
--- a/docs/app/components/theme-builder/page.tsx
+++ b/docs/app/components/theme-builder/page.tsx
@@ -1,7 +1,13 @@
"use client";
import { useAppTheme } from "@components/components/AppThemeProvider/AppThemeProvider";
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@openuidev/react-ui";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@openuidev/react-ui/Select";
import {
ThemeProvider,
swatch,
diff --git a/docs/app/demo/github/components/ConversationPanel/ConversationPanel.tsx b/docs/app/demo/github/components/ConversationPanel/ConversationPanel.tsx
index 63bb44b66..5090ecb2e 100644
--- a/docs/app/demo/github/components/ConversationPanel/ConversationPanel.tsx
+++ b/docs/app/demo/github/components/ConversationPanel/ConversationPanel.tsx
@@ -1,6 +1,6 @@
"use client";
-import { IconButton } from "@openuidev/react-ui";
+import { IconButton } from "@openuidev/react-ui/IconButton";
import { MarkDownRenderer } from "@openuidev/react-ui/MarkDownRenderer";
import { ChevronRight, MessageSquare, Send, Square } from "lucide-react";
import { useEffect, useRef, useState } from "react";
diff --git a/docs/app/demo/github/components/GitHubConnect/GitHubConnect.tsx b/docs/app/demo/github/components/GitHubConnect/GitHubConnect.tsx
index 4b4c20f14..caf94ca3c 100644
--- a/docs/app/demo/github/components/GitHubConnect/GitHubConnect.tsx
+++ b/docs/app/demo/github/components/GitHubConnect/GitHubConnect.tsx
@@ -1,7 +1,7 @@
"use client";
import { GitHubIcon } from "@/components/brand-logo";
-import { Button } from "@openuidev/react-ui";
+import { Button } from "@openuidev/react-ui/Button";
import {
Activity,
Check,
diff --git a/docs/app/demo/github/components/Modal/Modal.tsx b/docs/app/demo/github/components/Modal/Modal.tsx
index 47b5d784d..e1ceca0d8 100644
--- a/docs/app/demo/github/components/Modal/Modal.tsx
+++ b/docs/app/demo/github/components/Modal/Modal.tsx
@@ -1,4 +1,4 @@
-import { IconButton } from "@openuidev/react-ui";
+import { IconButton } from "@openuidev/react-ui/IconButton";
import { X } from "lucide-react";
import type { ReactNode } from "react";
import { useCallback, useEffect } from "react";
diff --git a/docs/app/demo/github/components/PreviewPanel/PreviewPanel.tsx b/docs/app/demo/github/components/PreviewPanel/PreviewPanel.tsx
index 78bfbf79c..7031afee2 100644
--- a/docs/app/demo/github/components/PreviewPanel/PreviewPanel.tsx
+++ b/docs/app/demo/github/components/PreviewPanel/PreviewPanel.tsx
@@ -1,6 +1,8 @@
import type { ActionEvent, ParseResult } from "@openuidev/react-lang";
import { Renderer } from "@openuidev/react-lang";
-import { IconButton, openuiLibrary, ThemeProvider } from "@openuidev/react-ui";
+import { openuiLibrary } from "@openuidev/react-ui/genui-lib";
+import { IconButton } from "@openuidev/react-ui/IconButton";
+import { ThemeProvider } from "@openuidev/react-ui/ThemeProvider";
import { Loader2, Maximize2, Monitor } from "lucide-react";
import { useCallback, useState } from "react";
import { Modal } from "../Modal/Modal";
diff --git a/docs/app/demo/github/layout.tsx b/docs/app/demo/github/layout.tsx
index 76adb44c1..6b4a79cf9 100644
--- a/docs/app/demo/github/layout.tsx
+++ b/docs/app/demo/github/layout.tsx
@@ -1,5 +1,6 @@
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
import { createPageMetadata } from "@/lib/page-metadata";
+import "@openuidev/react-ui/styles/index.css";
import type { ReactNode } from "react";
import "./layout.css";
diff --git a/docs/app/demo/github/page.tsx b/docs/app/demo/github/page.tsx
index de85d4c22..a3180600f 100644
--- a/docs/app/demo/github/page.tsx
+++ b/docs/app/demo/github/page.tsx
@@ -3,7 +3,7 @@
import { DemoCreditsDialog } from "@/components/DemoCreditsDialog";
import { isDemoCreditsErrorPayload } from "@/lib/demo-credits";
import { mergeStatements } from "@openuidev/react-lang";
-import { Button } from "@openuidev/react-ui";
+import { Button } from "@openuidev/react-ui/Button";
import { encode } from "gpt-tokenizer";
import {
Activity,
@@ -18,12 +18,12 @@ import {
type LucideIcon,
} from "lucide-react";
import { useTheme } from "next-themes";
+import dynamic from "next/dynamic";
import { Highlight, themes } from "prism-react-renderer";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { ConversationPanel } from "./components/ConversationPanel/ConversationPanel";
import { GitHubConnect } from "./components/GitHubConnect/GitHubConnect";
import { Header } from "./components/Header/Header";
-import { PreviewPanel } from "./components/PreviewPanel/PreviewPanel";
import { SavedSidebar } from "./components/SavedSidebar/SavedSidebar";
import {
GITHUB_DEMO_MODEL_LABEL,
@@ -44,6 +44,11 @@ import {
type SavedDashboard,
} from "./saved/store";
+const PreviewPanel = dynamic(
+ () => import("./components/PreviewPanel/PreviewPanel").then((module) => module.PreviewPanel),
+ { ssr: false },
+);
+
// ── Helpers ─────────────────────────────────────────────────────────────────
function extractCodeOnly(response: string): string | null {
diff --git a/docs/app/demos/components/CatalogPanel/CatalogPanel.tsx b/docs/app/demos/components/CatalogPanel/CatalogPanel.tsx
index 0c8d392e2..f1a2e5da7 100644
--- a/docs/app/demos/components/CatalogPanel/CatalogPanel.tsx
+++ b/docs/app/demos/components/CatalogPanel/CatalogPanel.tsx
@@ -1,7 +1,7 @@
"use client";
import type { ComponentGroup } from "@openuidev/react-lang";
-import { openuiLibrary } from "@openuidev/react-ui";
+import { openuiLibrary } from "@openuidev/react-ui/genui-lib";
import { ChevronLeft, ChevronRight, LayoutList } from "lucide-react";
import { useState } from "react";
import "./CatalogPanel.css";
diff --git a/docs/app/demos/components/PreviewPanel/PreviewPanel.tsx b/docs/app/demos/components/PreviewPanel/PreviewPanel.tsx
index 022f95fca..9c92ac9d6 100644
--- a/docs/app/demos/components/PreviewPanel/PreviewPanel.tsx
+++ b/docs/app/demos/components/PreviewPanel/PreviewPanel.tsx
@@ -1,6 +1,7 @@
import type { ParseResult } from "@openuidev/react-lang";
import { Renderer } from "@openuidev/react-lang";
-import { openuiLibrary, ThemeProvider } from "@openuidev/react-ui";
+import { openuiLibrary } from "@openuidev/react-ui/genui-lib";
+import { ThemeProvider } from "@openuidev/react-ui/ThemeProvider";
import { Loader2, Maximize2, Monitor } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import type { Theme } from "../../constants";
diff --git a/docs/app/demos/layout.tsx b/docs/app/demos/layout.tsx
index d061b81dc..1b17411a3 100644
--- a/docs/app/demos/layout.tsx
+++ b/docs/app/demos/layout.tsx
@@ -1,5 +1,6 @@
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
import { createPageMetadata } from "@/lib/page-metadata";
+import "@openuidev/react-ui/styles/index.css";
import type { ReactNode } from "react";
import "./layout.css";
diff --git a/docs/app/demos/page.tsx b/docs/app/demos/page.tsx
index d1c3cb970..91a17ea46 100644
--- a/docs/app/demos/page.tsx
+++ b/docs/app/demos/page.tsx
@@ -4,12 +4,17 @@ import { DemoCreditsDialog } from "@/components/DemoCreditsDialog";
import { isDemoCreditsErrorPayload } from "@/lib/demo-credits";
import { Send, Square } from "lucide-react";
import { useTheme } from "next-themes";
+import dynamic from "next/dynamic";
import { useCallback, useRef, useState } from "react";
import { CodePanel } from "./components/CodePanel/CodePanel";
import { Header } from "./components/Header/Header";
-import { PreviewPanel } from "./components/PreviewPanel/PreviewPanel";
import { MODELS, STARTER_PROMPTS, type Model, type Status, type Theme } from "./constants";
+const PreviewPanel = dynamic(
+ () => import("./components/PreviewPanel/PreviewPanel").then((module) => module.PreviewPanel),
+ { ssr: false },
+);
+
export default function DemosPage() {
const { theme, setTheme } = useTheme();
const [prompt, setPrompt] = useState("");
diff --git a/docs/app/docs/fumadocs.css b/docs/app/docs/fumadocs.css
new file mode 100644
index 000000000..81d999ee3
--- /dev/null
+++ b/docs/app/docs/fumadocs.css
@@ -0,0 +1,2 @@
+@reference "../global.css";
+@import "fumadocs-ui/css/preset.css";
diff --git a/docs/app/docs/layout.tsx b/docs/app/docs/layout.tsx
index b17771b80..45fe82380 100644
--- a/docs/app/docs/layout.tsx
+++ b/docs/app/docs/layout.tsx
@@ -1,11 +1,15 @@
import { DocsRouteLayout } from "@/components/docs-route-layout";
import { WebsiteThemeProvider } from "@/components/website-theme-provider";
import { source } from "@/lib/source";
+import { RootProvider } from "fumadocs-ui/provider/next";
+import "./fumadocs.css";
export default function Layout({ children }: LayoutProps<"/docs">) {
return (
-
- {children}
-
+
+
+ {children}
+
+
);
}
diff --git a/docs/app/global.css b/docs/app/global.css
index 109d40605..d6c464953 100644
--- a/docs/app/global.css
+++ b/docs/app/global.css
@@ -1,12 +1,40 @@
-@import url("https://fonts.googleapis.com/css2?family=Playwrite+US+Trad&family=Geist:wght@400;500;600;700&display=swap");
@import "tailwindcss";
@import "fumadocs-ui/css/neutral.css";
-@import "fumadocs-ui/css/preset.css";
@import "../shared/design-system/styles/variables/index.css";
-@import "@openuidev/react-ui/styles/index.css";
-@import "@openuidev/thesys/styles.css";
body {
+ /* Static aliases cover routes that only consume design tokens. Interactive
+ component-library routes can still override them with ThemeProvider. */
+ --openui-background: var(--background);
+ --openui-foreground: var(--foreground);
+ --openui-highlight-subtle: var(--highlight-subtle);
+ --openui-highlight: var(--highlight);
+ --openui-highlight-strong: var(--highlight-strong);
+ --openui-inverted-background: var(--inverted-background);
+ --openui-text-neutral-primary: var(--text-neutral-primary);
+ --openui-text-neutral-secondary: var(--text-neutral-secondary);
+ --openui-text-neutral-tertiary: var(--text-neutral-tertiary);
+ --openui-text-accent-primary: var(--text-accent-primary);
+ --openui-text-info-primary: var(--text-info-primary);
+ --openui-text-info-inverted: var(--text-info-inverted);
+ --openui-text-white: var(--text-white);
+ --openui-text-black: var(--text-black);
+ --openui-border-default: var(--border-default);
+ --openui-border-interactive: var(--border-interactive);
+ --openui-border-accent: var(--border-accent);
+ --openui-border-accent-emphasis: var(--border-accent-emphasis);
+ --openui-radius-s: var(--radius-s);
+ --openui-radius-4xl: var(--radius-4xl);
+ --openui-radius-full: var(--radius-full);
+ --openui-shadow-s: var(--shadow-s);
+ --openui-shadow-m: var(--shadow-m);
+ --openui-shadow-l: var(--shadow-l);
+ --openui-font-body: var(--font-body);
+ --openui-font-code: var(--font-code);
+ --openui-font-heading: var(--font-heading);
+ --openui-font-label: var(--font-label);
+ --openui-font-numbers: var(--font-numbers);
+
--color-fd-background: var(--openui-background);
--color-fd-foreground: var(--openui-text-neutral-primary);
--color-fd-muted: var(--openui-highlight-subtle);
diff --git a/docs/app/layout.tsx b/docs/app/layout.tsx
index 7f8afaff8..09da1e061 100644
--- a/docs/app/layout.tsx
+++ b/docs/app/layout.tsx
@@ -1,20 +1,15 @@
-import { RootProvider } from "fumadocs-ui/provider/next";
import type { Metadata } from "next";
-import { Geist_Mono, Inter } from "next/font/google";
+import { Inter } from "next/font/google";
import Script from "next/script";
import { BASE_URL } from "../lib/source";
import "./global.css";
import { PHProvider } from "./providers";
+import { SiteThemeProvider } from "./site-theme-provider";
const inter = Inter({
subsets: ["latin"],
});
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
- subsets: ["latin"],
-});
-
const SITE_TITLE = "OpenUI - The Open Standard for Generative UI";
const SITE_DESCRIPTION =
"Full-stack, renderer-agnostic Generative UI with a streaming-first language, official React support, community integrations, and up to 67% fewer tokens than JSON.";
@@ -84,13 +79,11 @@ export const metadata: Metadata = {
export default function Layout({ children }: LayoutProps<"/">) {
return (
-
+
-
-
- {children}
-
-
+
+ {children}
+