
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.
@sciphergfx/json-fields
Advanced tools
UI-agnostic React component for generating Form Fields from JSON with support for Chakra UI, Tailwind CSS, and shadcn/ui
UI-agnostic React component for JSON → Form Fields, with support for Chakra UI, Tailwind CSS, and shadcn/ui.
mode per component (works with Chakra)This package now provides a headless core with no UI library dependency. You style via classNames and styles, or override primitives with renderers.
classNames: slot-to-class mapping, e.g. { container, heading, sectionHeader, fieldLabel, input, textarea, chip, chipClose, button, secondaryButton, list, row, icon, label }.styles: per-slot inline styles, same keys as classNames.renderers: override primitives like { Container, Box, Button, Input, Select, Textarea, Text, Heading, VStack, HStack, Card, Alert, Label }.Chakra/shadcn/Tailwind can be used externally by supplying classes or renderers. The previous uiLibrary prop is deprecated for the core path.
npm install @sciphergfx/json-fields
npm install react react-dom
For Chakra UI support:
npm install @chakra-ui/react @emotion/react
import { Fields } from '@sciphergfx/json-fields'
const MyForm = () => {
const handleSave = (nestedData, flatData) => {
console.log('Form data:', nestedData)
}
return (
<Fields
uiLibrary="shadcn"
// Group fields into collapsible sections (optional)
sections={[
{
id: 'profile',
title: 'Profile',
description: 'Basic info',
fields: ['name', 'email', 'website', 'role', 'joinDate'],
collapsible: true,
defaultOpen: true,
},
{
id: 'preferences',
title: 'Preferences',
fields: ['preferences.theme', 'preferences.notifications', 'isActive'],
collapsible: true,
defaultOpen: true,
},
{
id: 'security',
title: 'Security',
fields: ['password'],
collapsible: true,
defaultOpen: false,
},
{
id: 'about',
title: 'About',
fields: ['bio', 'skills', 'tags'],
collapsible: true,
defaultOpen: true,
},
]}
includeUnsectioned
onSave={handleSave}
onCancel={() => console.log('Form cancelled')}
onFieldChange={(key, value, fullData) => {
console.log(`Field ${key} changed:`, value)
}}
initialJson={JSON.stringify({
user: {
name: 'John Doe',
email: 'john@example.com',
preferences: {
theme: 'dark',
notifications: true,
},
},
skills: ['React', 'TypeScript'],
tags: ['dev', 'ui'], // Arrays of strings render as pill chips with add/delete
})}
showJsonInput={false} // Hide JSON input, show only form
/>
)
}
| Prop | Type | Default | Description |
|---|---|---|---|
uiLibrary | 'chakra' | 'tailwind' | 'shadcn' | 'chakra' | UI library to use for styling |
onSave | (nestedData, flatData) => void | - | Callback when save button is clicked |
onCancel | () => void | - | Callback when cancel button is clicked |
onFieldChange | (key, value, fullData) => void | - | Callback when any field changes |
saveButtonText | string | 'Save Changes' | Text for the save button |
cancelButtonText | string | 'Reset Form' | Text for the cancel button |
initialJson | string | '' | Initial JSON string to load |
customStyles | object | {} | Custom styles object |
showControls | boolean | true | Whether to show save/cancel buttons |
showJsonInput | boolean | true | Whether to show JSON input textarea |
sections | Array<{ id?, title, description?, fields: string[], collapsible?, defaultOpen? }> | null | Group fields into sections |
includeUnsectioned | boolean | false | Show fields not in sections under an "Other" section |
unsectionedTitle | string | 'Other' | Title for unsectioned fields section |
When using uiLibrary="tailwind", the components output Tailwind utility classes. This package does not bundle Tailwind.
Requirements:
Quick setup:
<Fields /> so classes are not purged.uiLibrary="tailwind" in <Fields />.When using uiLibrary="chakra", the components will use Chakra UI components. Make sure you have Chakra UI set up with your theme provider.
When using uiLibrary="shadcn", the components output class names compatible with shadcn/ui. This package does not bundle shadcn/ui or Tailwind.
Requirements:
bg-primary, text-muted-foreground, etc.).Quick setup:
uiLibrary="shadcn" in <Fields />.You can override styles using the customStyles prop:
<Fields
uiLibrary="tailwind"
customStyles={{
container: { maxWidth: '800px' },
input: { borderRadius: '8px' },
button: { backgroundColor: '#007bff' },
}}
/>
The package also exports utility functions for working with JSON:
import {
flattenObject,
unflattenObject,
parseJsonSafely,
getInputType,
} from '@sciphergfx/json-fields'
// Flatten nested objects
const flat = flattenObject({ user: { name: 'John' } })
// Result: { 'user.name': 'John' }
// Unflatten back to nested
const nested = unflattenObject({ 'user.name': 'John' })
// Result: { user: { name: 'John' } }
// Safe JSON parsing
const result = parseJsonSafely('{"name": "John"}')
// Result: { success: true, data: { name: 'John' } }
The package includes full TypeScript definitions:
import { FieldsProps } from '@sciphergfx/json-fields'
const MyComponent: React.FC<FieldsProps> = (props) => {
// Your component logic
}
<Fields
uiLibrary="tailwind"
customStyles={{
container: { padding: '2rem' },
formCard: { border: '2px solid #e2e8f0' },
input: { borderRadius: '8px' },
button: { backgroundColor: '#3b82f6' },
}}
onSave={(data) => console.log('Saved:', data)}
/>
Seyi K. Ogunbowale
MIT
Contributions are welcome! Please feel free to submit a Pull Request.
FAQs
UI-agnostic React component for generating Form Fields from JSON with support for Chakra UI, Tailwind CSS, and shadcn/ui
We found that @sciphergfx/json-fields 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.