Leafnode is a JSON WYSIWYG for React, which tries to make viewing and editing content just a little bit more fun.
Try it out: web playground.
-
Tree navigation
- Collapse individual nodes, expand/collapse all, and copy tree as JSON
- Rich type-specific rendering: syntax highlighting, formatted numbers, boolean checkboxes
- Hyperlinked node references (e.g. a
beforeproperty pointing at anid)
-
Document editing
- Double-click to edit keys and values, along with undo/redo
- Add new object properties and array elements
- Drag-and-drop nodes and members to organize your data
-
AI collaboration
- Integrates with agents by requesting precise changes
- Running agents can indicate progress on nodes they're editing
- After agents edit the doc, added/updated nodes are highlighted
// npm/bun-install "@lostintangent/leafnode". And then...
import { Leafnode } from "@lostintangent/leafnode";
<Leafnode
content={json}
onContentChanged={setJson} // Omitting this makes the editor read-only
/>;In order to allow agentic collaboration on the editor, you can pass an agent prop to the component, which is an object with two properites:
-
activePointers- A list of JSON pointers (e.g./settings/0/name) which have an agent actively working on them. Note that you aren't expected to construct this list yourself, but rather, track it based on the requests made by the end-user (see next property). -
onRequest- A callback that is run every time the end-user clicks theAsk Agent...menu item for a node. The callback will receive an object with two properties:pointer(the JSON pointer for the selected node) andvalue(the JSON value for the selected node). You are expected to take the pointer/value/associated file, construct a prompt and then allow the agent to mutate the file as appropriate. And while a request is active, you should pass the providedpointerback into theactivePointersstate so that the editor can track which requests are in flight and display a spinner next to the node.
Note: Take a look at the
/playgroundfor an example of how to implement this contract.
By default, Leafnode comes with a built-in light and dark theme, and will detect the end-users configured color scheme. But if you'd like to customize the theme for your app environment, simply set the theme prop to an object with the following four color tokens:
accent- Hover backgrounds, checkboxes, reference links, and active request spinnersbackground- Background color for the editor and hovers/menusmuted- Expand/collapse buttons, drag handles, node summaries, menu seperators, andnullvaluestext- Text for node keys and menu items
Note: The color for string/number/boolean values are currently fixed, but I can easily added theme tokens for those as needed.