Core Components API Reference
This page documents all core components available in Adaptly, including their props, usage examples, and implementation details.
AdaptlyProvider
The main provider component that wraps your application and provides AI-powered adaptive UI functionality.
Props
interface AdaptlyProviderProps {
// Required props
apiKey: string;
components: Record<string, React.ComponentType<any>>;
adaptlyConfig: AdaptlyJsonConfig;
// Optional props
icons?: Record<string, React.ComponentType<any>>;
model?: string;
provider?: "google" | "openai" | "anthropic";
defaultLayout?: Partial<UIAdaptation>;
className?: string;
style?: React.CSSProperties;
// Command bar customization
aiSuggestions?: Array<{
value: string;
label: string;
icon?: React.ComponentType<unknown>;
description?: string;
}>;
showAISuggestions?: boolean;
showUtilityCommands?: boolean;
// Custom loader
customLoader?: CustomLoaderComponent;
// Storage options
enableStorage?: boolean;
storageKey?: string;
storageVersion?: string;
// Children
children?: React.ReactNode;
}
Required Props
apiKey
- Type:
string - Description: API key for the LLM provider
- Example:
process.env.NEXT_PUBLIC_GOOGLE_GENERATIVE_AI_API_KEY!
components
- Type:
Record<string, React.ComponentType<any>> - Description: Registry of React components available to the AI
- Example:
{ MetricCard, SalesChart, TeamMembers }
adaptlyConfig
- Type:
AdaptlyJsonConfig - Description: Component registry configuration from adaptly.json
- Example:
import adaptlyConfig from "./adaptly.json"
Optional Props
icons
- Type:
Record<string, React.ComponentType<any>> - Default:
undefined - Description: Registry of icon components
- Example:
{ DollarSign, Users, ShoppingCart }
model
- Type:
string - Default:
"gemini-2.0-flash-exp" - Description: LLM model to use
- Examples:
- Google:
"gemini-2.0-flash-exp","gemini-1.5-pro" - OpenAI:
"gpt-4o","gpt-4o-mini" - Anthropic:
"claude-3-5-sonnet-20241022"
- Google:
provider
- Type:
"google" | "openai" | "anthropic" - Default:
"google" - Description: LLM provider to use
defaultLayout
- Type:
Partial<UIAdaptation> - Default:
undefined - Description: Default UI layout when no saved state exists
className
- Type:
string - Default:
"" - Description: CSS class name for the container
style
- Type:
React.CSSProperties - Default:
{} - Description: Inline styles for the container
aiSuggestions
- Type:
Array<{ value: string; label: string; icon?: React.ComponentType<unknown>; description?: string; }> - Default:
undefined - Description: Custom AI suggestions for the command bar
showAISuggestions
- Type:
boolean - Default:
true - Description: Whether to show AI suggestions in the command bar
showUtilityCommands
- Type:
boolean - Default:
true - Description: Whether to show utility commands (reset, etc.)
customLoader
- Type:
CustomLoaderComponent - Default:
undefined - Description: Custom loading overlay component
enableStorage
- Type:
boolean - Default:
true - Description: Whether to enable persistent storage
storageKey
- Type:
string - Default:
"adaptly-ui" - Description: Key prefix for localStorage
storageVersion
- Type:
string - Default:
"1.0.0" - Description: Version for data migration
children
- Type:
React.ReactNode - Default:
undefined - Description: Child components
Usage Examples
Basic Usage
import { AdaptlyProvider } from "adaptly";
import { MetricCard, SalesChart } from "./components";
import adaptlyConfig from "./adaptly.json";
<AdaptlyProvider
apiKey={process.env.NEXT_PUBLIC_GOOGLE_GENERATIVE_AI_API_KEY!}
provider="google"
model="gemini-2.0-flash-exp"
components={{ MetricCard, SalesChart }}
adaptlyConfig={adaptlyConfig}
/>
Advanced Configuration
<AdaptlyProvider
apiKey={apiKey}
provider="openai"
model="gpt-4o"
components={{ MetricCard, SalesChart, TeamMembers }}
icons={{ DollarSign, Users, ShoppingCart }}
adaptlyConfig={adaptlyConfig}
defaultLayout={{
components: [
{
id: "welcome",
type: "EmptyCard",
props: { title: "Welcome!", description: "Press ⌘K to start" },
position: { x: 0, y: 0, w: 6, h: 2 },
visible: true
}
],
layout: "grid",
spacing: 6,
columns: 6
}}
enableStorage={true}
storageKey="my-dashboard"
storageVersion="1.0.0"
className="h-full"
style={{ minHeight: "100vh" }}
/>
Custom AI Suggestions
const customSuggestions = [
{
value: "Create a sales dashboard",
label: "📊 Create a sales dashboard",
description: "Generate a dashboard with sales metrics"
},
{
value: "Show user analytics",
label: "👥 Show user analytics",
description: "Display user engagement metrics"
}
];
<AdaptlyProvider
apiKey={apiKey}
components={components}
adaptlyConfig={adaptlyConfig}
aiSuggestions={customSuggestions}
showAISuggestions={true}
showUtilityCommands={true}
/>
Custom Loader
function MyCustomLoader({ isVisible, message, subMessage }) {
if (!isVisible) return null;
return (
<div className="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
<div className="bg-white p-8 rounded-lg shadow-lg">
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div>
<h3>{message}</h3>
<p>{subMessage}</p>
</div>
</div>
);
}
<AdaptlyProvider
apiKey={apiKey}
components={components}
adaptlyConfig={adaptlyConfig}
customLoader={MyCustomLoader}
/>
AdaptiveUIProvider
Lower-level provider component for advanced usage. Use this when you need more control over the configuration.
Props
interface AdaptiveUIProviderProps {
children: React.ReactNode;
config?: AdaptlyConfig;
}
Usage
import { AdaptiveUIProvider } from "adaptly";
const config: AdaptlyConfig = {
enableLLM: true,
llm: {
provider: "google",
apiKey: process.env.NEXT_PUBLIC_GOOGLE_GENERATIVE_AI_API_KEY!,
model: "gemini-2.0-flash-exp"
},
adaptlyJson: adaptlyConfig,
storage: {
enabled: true,
key: "my-app",
version: "1.0.0"
}
};
<AdaptiveUIProvider config={config}>
<MyApp />
</AdaptiveUIProvider>
AdaptiveLayout
Renders the adaptive UI layout using the component registry.
Props
interface AdaptiveLayoutProps {
componentRegistry: ComponentRegistry;
iconRegistry?: IconRegistry;
className?: string;
style?: React.CSSProperties;
}
Usage
import { AdaptiveLayout } from "adaptly";
<AdaptiveLayout
componentRegistry={{ MetricCard, SalesChart }}
iconRegistry={{ DollarSign, Users }}
className="grid-layout"
style={{ gap: "1rem" }}
/>
AdaptiveCommand
Command bar component for natural language input.
Props
interface AdaptiveCommandProps {
keyPress?: string;
config?: CommandConfig;
handler?: CommandHandler;
className?: string;
style?: React.CSSProperties;
aiSuggestions?: Array<{
value: string;
label: string;
icon?: React.ComponentType<{ className?: string }>;
description?: string;
}>;
showAISuggestions?: boolean;
showUtilityCommands?: boolean;
}
Usage
import { AdaptiveCommand } from "adaptly";
<AdaptiveCommand
keyPress="k"
aiSuggestions={customSuggestions}
showAISuggestions={true}
showUtilityCommands={true}
className="command-bar"
/>
AdaptiveCommandWrapper
Wrapper component that provides command bar functionality with default configuration.
Props
interface AdaptiveCommandWrapperProps {
aiSuggestions?: Array<{
value: string;
label: string;
icon?: React.ComponentType<{ className?: string }>;
description?: string;
}>;
showAISuggestions?: boolean;
showUtilityCommands?: boolean;
}
Usage
import { AdaptiveCommandWrapper } from "adaptly";
<AdaptiveCommandWrapper
aiSuggestions={customSuggestions}
showAISuggestions={true}
showUtilityCommands={true}
/>
LoadingOverlay
Loading overlay component that appears during AI processing.
Props
interface LoadingOverlayProps {
isVisible: boolean;
message?: string;
subMessage?: string;
className?: string;
style?: React.CSSProperties;
}
Usage
import { LoadingOverlay } from "adaptly";
<LoadingOverlay
isVisible={isProcessing}
message="AI is generating your layout..."
subMessage="Creating components and arranging them for you"
className="loading-overlay"
/>
Component Implementation Details
AdaptlyProvider Implementation
The AdaptlyProvider component:
- Validates Configuration: Checks that adaptly.json is properly configured
- Initializes Services: Sets up LLM and storage services
- Renders Layout: Uses AdaptiveLayout to render components
- Provides Context: Makes adaptive UI functionality available via useAdaptiveUI hook
export function AdaptlyProvider({
apiKey,
components,
adaptlyConfig,
// ... other props
}) {
// Validate configuration
const validatedConfig = validateAdaptlyConfig(adaptlyConfig);
// Create configuration object
const config: AdaptlyConfig = {
enableLLM: true,
llm: { provider, apiKey, model },
adaptlyJson: validatedConfig,
storage: { enabled: enableStorage, key: storageKey, version: storageVersion },
// ... other config
};
return (
<AdaptiveUIProvider config={config}>
<div className={`adaptly-container ${className}`} style={style}>
<AdaptiveLayout componentRegistry={components} iconRegistry={icons} />
<AdaptiveCommandWrapper
aiSuggestions={aiSuggestions}
showAISuggestions={showAISuggestions}
showUtilityCommands={showUtilityCommands}
/>
{children}
</div>
</AdaptiveUIProvider>
);
}
AdaptiveLayout Implementation
The AdaptiveLayout component:
- Renders Components: Maps over the adaptation components
- Handles Missing Components: Shows error for missing components
- Applies Grid Layout: Uses CSS Grid for positioning
- Filters Props: Removes problematic props before passing to components
export function AdaptiveLayout({ adaptation, componentRegistry }) {
const renderComponent = useCallback((component) => {
const Component = componentRegistry[component.type];
if (!Component) {
return <div>Component {component.type} not found</div>;
}
// Filter props to remove problematic objects
const safeProps = { ...component.props };
// ... prop filtering logic
return <Component {...safeProps} />;
}, [componentRegistry]);
return (
<div className="adaptive-layout" style={gridStyle}>
{adaptation.components.map(renderComponent)}
</div>
);
}
Error Handling
Component Not Found
When a component type is not found in the registry:
// Shows error message
<div className="p-4 bg-red-50 border border-red-200 rounded-lg">
<p className="text-red-600 text-sm">
Component {component.type} not found
</p>
</div>
Invalid Configuration
When adaptly.json is invalid:
// Throws error during initialization
throw new Error("adaptly.json must define at least one component");
Missing API Key
When API key is not provided:
// LLM service will not initialize
if (!apiKey) {
console.warn("API key is required for LLM functionality");
}
Performance Considerations
Component Memoization
Memoize expensive components to prevent unnecessary re-renders:
const MemoizedMetricCard = React.memo(MetricCard);
<AdaptlyProvider
components={{ MetricCard: MemoizedMetricCard }}
// ... other props
/>
Lazy Loading
Load components lazily to reduce initial bundle size:
const LazyChart = React.lazy(() => import("./components/Chart"));
<AdaptlyProvider
components={{
MetricCard,
Chart: LazyChart
}}
// ... other props
/>
Best Practices
1. Component Registry
// ✅ Good - descriptive component names
const components = {
MetricCard,
SalesChart,
TeamMembers,
DataTable: OrdersTable
};
// ❌ Avoid - generic names
const components = {
Card,
Chart,
List
};
2. Icon Registry
// ✅ Good - semantic icon names
const icons = {
DollarSign,
Users,
ShoppingCart,
Activity
};
// ❌ Avoid - generic names
const icons = {
Icon1,
Icon2,
Icon3
};
3. Configuration
// ✅ Good - complete configuration
<AdaptlyProvider
apiKey={apiKey}
provider="google"
model="gemini-2.0-flash-exp"
components={components}
adaptlyConfig={adaptlyConfig}
enableStorage={true}
storageKey="my-app"
storageVersion="1.0.0"
/>
// ❌ Avoid - missing required props
<AdaptlyProvider
apiKey={apiKey}
components={components}
// Missing adaptlyConfig
/>
Related Documentation
- Hooks API - useAdaptiveUI hook documentation
- Services API - Service documentation
- Types API - TypeScript interfaces
Ready for hooks documentation? Check out the Hooks API for complete documentation of the useAdaptiveUI hook and other React hooks!