
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
@ainativekit/ui
Advanced tools
Extension components for ChatGPT Apps SDK - Maps, Albums, Carousels and more. Built on @openai/apps-sdk-ui.
Production-ready pattern components for ChatGPT Apps
100% compatible with @openai/apps-sdk-ui. Use their primitives + our patterns = ship faster.
| Without this library | With @ainativekit/ui |
|---|---|
| Build card layouts from scratch | <SummaryCard {...data} /> |
| Wire up carousels manually | <Carousel>{items}</Carousel> |
| Create map components yourself | <CompactMap locations={...} /> |
| Write ChatGPT integration hooks | useTheme(), useDisplayMode(), useWidgetState() |
Fully compatible with apps-sdk-ui - use their 700+ icons, buttons, badges, and design tokens alongside our pattern components.
┌─────────────────────────────────────────┐
│ Your ChatGPT App │
├─────────────────────────────────────────┤
│ @ainativekit/ui (Pattern Components) │
│ Card, Album, Carousel, List, Map │
├─────────────────────────────────────────┤
│ @openai/apps-sdk-ui (Primitives) │
│ Button, Badge, Icon, Alert, Avatar │
└─────────────────────────────────────────┘
| Category | Components |
|---|---|
| Cards | Card, SummaryCard, ImageCard, ListCard |
| Media | Album, Carousel, PhotoCarousel |
| Lists | List, ListItem, AvatarList |
| Maps | CompactMap, FullscreenMap, MapPlaceCard |
| Feedback | Modal, Sidebar, Skeleton, Overlay |
| ChatGPT Hooks | useTheme, useDisplayMode, useMaxHeight, useWidgetState |
npm install @ainativekit/ui @openai/apps-sdk-ui
import '@openai/apps-sdk-ui/css';
import '@ainativekit/ui/styles';
import { SummaryCard } from '@ainativekit/ui';
import { StarFilled, Clock } from '@openai/apps-sdk-ui/components/Icon';
function RestaurantCard({ data }) {
return (
<SummaryCard
images={data.images}
title={data.name}
subtitle={data.address}
badge={data.rating}
description={data.description}
metadata={[
{ icon: <StarFilled />, label: data.rating },
{ icon: <Clock />, label: 'Open now' }
]}
buttonText="Reserve"
onButtonClick={() => {}}
/>
);
}
import { Card, SummaryCard, ImageCard, ListCard } from '@ainativekit/ui';
// Compound card for custom layouts
<Card elevationLevel={1} interactive>
<Card.Image src="..." />
<Card.Body>
<Card.Title>Title</Card.Title>
<Card.Description>Description</Card.Description>
</Card.Body>
<Card.Footer>
<Card.ActionButton>Action</Card.ActionButton>
</Card.Footer>
</Card>
// Pre-composed cards
<SummaryCard images={...} title="..." description="..." />
<ImageCard images={...} title="..." />
<ListCard items={...} />
import { Carousel } from '@ainativekit/ui';
<Carousel>
{items.map(item => (
<SummaryCard key={item.id} {...item} />
))}
</Carousel>
import { List, ListItem } from '@ainativekit/ui';
import { StarFilled } from '@openai/apps-sdk-ui/components/Icon';
<List
header={{ title: 'Top Places', subtitle: 'Based on ratings' }}
items={places}
renderItem={(place, index) => (
<ListItem
rank={index + 1}
title={place.name}
metadata={place.city}
media={place.thumbnail}
features={[{ icon: <StarFilled />, label: place.rating }]}
/>
)}
/>
import { Album } from '@ainativekit/ui';
<Album
albums={[
{
id: '1',
title: 'Photos',
cover: '...',
photos: [{ id: '1', url: '...', title: '...' }]
}
]}
onAlbumSelect={setSelectedAlbum}
selectedAlbum={selectedAlbum}
/>
import { CompactMap } from '@ainativekit/ui';
import { StarFilled } from '@openai/apps-sdk-ui/components/Icon';
<CompactMap
locations={[
{
id: '1',
name: 'Restaurant',
coords: [37.7749, -122.4194],
features: [{ icon: <StarFilled />, label: '4.8' }]
}
]}
onLocationSelect={setSelected}
/>
Hooks for integrating with the ChatGPT Apps SDK runtime - these are unique to @ainativekit/ui:
import {
useTheme,
useDisplayMode,
useMaxHeight,
useWidgetState,
useOpenAiGlobal,
} from '@ainativekit/ui';
function MyWidget() {
const { theme } = useTheme(); // 'light' | 'dark'
const displayMode = useDisplayMode(); // 'inline' | 'pip' | 'fullscreen'
const maxHeight = useMaxHeight(); // number | null
const [state, setState] = useWidgetState(() => ({ count: 0 }));
return (
<div style={{ maxHeight: maxHeight ?? 600 }}>
{/* widget content */}
</div>
);
}
| Hook | Description |
|---|---|
useTheme() | Get current theme from ChatGPT |
useDisplayMode() | Get display mode (inline/pip/fullscreen) |
useMaxHeight() | Get max height constraint |
useWidgetState() | Persistent state across re-renders |
useWidgetProps() | Access tool input/output |
useOpenAiGlobal(key) | Access any window.openai property |
Icons, buttons, and other primitives come from @openai/apps-sdk-ui:
// 700+ Icons
import { StarFilled, Clock, MapPin } from '@openai/apps-sdk-ui/components/Icon';
// Buttons (also re-exported from @ainativekit/ui)
import { Button } from '@openai/apps-sdk-ui/components/Button';
// Badges (also re-exported from @ainativekit/ui)
import { Badge } from '@openai/apps-sdk-ui/components/Badge';
// Breakpoints hook
import { useBreakpoint } from '@openai/apps-sdk-ui/hooks/useBreakpoints';
Full TypeScript support with window.openai types:
import type { Theme, DisplayMode, LocationData } from '@ainativekit/ui';
// window.openai is fully typed when you import @ainativekit/ui
const theme = window.openai?.theme; // 'light' | 'dark' | undefined
MIT
FAQs
Extension components for ChatGPT Apps SDK - Maps, Albums, Carousels and more. Built on @openai/apps-sdk-ui.
We found that @ainativekit/ui demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.