Widgets Ui

by inference-sh0aabdc6f47f7No license763 starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated 2 days ago

Declarative UI widgets from JSON for React/Next.js from ui.inference.sh. Render rich interactive UIs from structured agent responses. Capabilities: forms, buttons, cards, layouts, inputs, selects, checkboxes. Use for: agent-generated UIs, dynamic forms, data display, interactive cards. Triggers: widgets, declarative ui, json ui, widget renderer, agent widgets, dynamic ui, form widgets, card widgets, shadcn widgets, structured output ui

AI-generated overview

Renders declarative JSON widget trees as interactive React/Next.js UI components such as forms, cards and layouts.

What it does
This skill documents a WidgetRenderer component that turns structured JSON widget definitions into interactive React/Next.js interfaces. It covers layout, typography, interactive and display widget types, including rows, columns, boxes, buttons, inputs, selects, checkboxes, badges, icons and images. It also shows how to handle widget actions such as submit and click, and lists available gradient backgrounds. The deliverable is front-end code and JSON schemas for agent-generated interfaces.
When to use it
Use it when an agent needs to render structured output as a rich interactive UI rather than plain text. It suits dynamic forms, data display cards and other agent-generated interfaces in React or Next.js projects. It is also relevant when wiring widget actions back to application handlers.
Requirements
A React or Next.js project with the shadcn CLI available for installing the widget registry component. The documentation references an external registry and documentation site, so network access is needed to fetch them. No scripts ship with the skill; it is instructions and code examples only.

Install the belt CLI skill: npx skills add belt-sh/cli

Widget Renderer

Declarative UI from JSON via ui.inference.sh.

[Widget Renderer]

Quick Start

bash
npx shadcn@latest add https://ui.inference.sh/r/widgets.json

Basic Usage

tsx
import { WidgetRenderer } from "@/registry/blocks/widgets/widget-renderer"import type { Widget, WidgetAction } from "@/registry/blocks/widgets/types"
const widget: Widget = {  type: 'ui',  title: 'My Widget',  children: [    { type: 'text', value: 'Hello World' },    { type: 'button', label: 'Click me', onClickAction: { type: 'click' } },  ],}
<WidgetRenderer  widget={widget}  onAction={(action, formData) => console.log(action, formData)}/>

Widget Types

Layout

json
{ "type": "row", "gap": 2, "children": [...] }{ "type": "col", "gap": 2, "children": [...] }{ "type": "box", "background": "gradient-ocean", "padding": 4, "radius": "lg", "children": [...] }

Typography

json
{ "type": "title", "value": "Heading", "size": "2xl", "weight": "bold" }{ "type": "text", "value": "Body text", "variant": "bold" }{ "type": "caption", "value": "Small text" }{ "type": "label", "value": "Field label", "fieldName": "email" }

Interactive

json
{ "type": "button", "label": "Submit", "variant": "default", "onClickAction": { "type": "submit" } }{ "type": "input", "name": "email", "placeholder": "Enter email" }{ "type": "textarea", "name": "message", "placeholder": "Your message" }{ "type": "select", "name": "plan", "options": [{ "value": "pro", "label": "Pro" }] }{ "type": "checkbox", "name": "agree", "label": "I agree", "defaultChecked": false }

Display

json
{ "type": "badge", "label": "New", "variant": "secondary" }{ "type": "icon", "iconName": "check", "size": "lg" }{ "type": "image", "src": "https://...", "alt": "Image", "width": 100, "height": 100 }{ "type": "divider" }

Example: Flight Card

tsx
const flightWidget: Widget = {  type: 'ui',  children: [    {      type: 'box', background: 'gradient-ocean', padding: 4, radius: 'lg', children: [        {          type: 'row', justify: 'between', children: [            {              type: 'col', gap: 1, children: [                { type: 'caption', value: 'departure' },                { type: 'title', value: 'SFO', size: '2xl', weight: 'bold' },              ]            },            { type: 'icon', iconName: 'plane', size: 'lg' },            {              type: 'col', gap: 1, align: 'end', children: [                { type: 'caption', value: 'arrival' },                { type: 'title', value: 'JFK', size: '2xl', weight: 'bold' },              ]            },          ]        },      ]    },  ],}

Example: Form

tsx
const formWidget: Widget = {  type: 'ui',  title: 'Contact Form',  asForm: true,  children: [    {      type: 'col', gap: 3, children: [        { type: 'input', name: 'name', placeholder: 'Your name' },        { type: 'input', name: 'email', placeholder: 'Email address' },        { type: 'textarea', name: 'message', placeholder: 'Message' },        { type: 'button', label: 'Send', variant: 'default', onClickAction: { type: 'submit' } },      ]    },  ],}

Gradients

NameDescription
gradient-oceanBlue teal gradient
gradient-sunsetOrange pink gradient
gradient-purplePurple gradient
gradient-coolCool blue gradient
gradient-midnightDark blue gradient

Handling Actions

tsx
const handleAction = (action: WidgetAction, formData?: WidgetFormData) => {  switch (action.type) {    case 'submit':      console.log('Form data:', formData)      break    case 'click':      console.log('Button clicked')      break  }}

Related Skills

bash
# Full agent componentnpx skills add inference-sh/skills@agent-ui
# Chat UI blocksnpx skills add inference-sh/skills@chat-ui
# Tool UInpx skills add inference-sh/skills@tools-ui

Documentation

Component docs: ui.inference.sh/blocks/widgets

Source and attribution

Source:inference-sh/skillsinui/widgets-uiat commit0aabdc6

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal