IXO Editor
A custom BlockNote editor wrapper built specifically for the IXO team's needs. This package provides a highly customized rich text editing experience built on top of BlockNote with support for both Shadcn UI and Mantine UI.
Note: This package is designed for internal IXO team use and is not intended for public consumption, though it is hosted publicly.
Features
- šØ Multi-UI Support: Choose between Shadcn UI or Mantine UI components.
- š§ Simplified API: Wrapped BlockNote functionality with sensible defaults
- š Rich Text Editing: Full support for headings, lists, code blocks, tables, and more
- š Custom Blocks: Built-in custom blocks including dynamic List block for DID data
- š¼ļø Media Support: Image and file upload handling
- šÆ TypeScript: Full TypeScript support with exported types
- š¤ Collaboration Ready: Built-in Matrix-based collaborative editing with real-time synchronization
- š± Responsive: Mobile-friendly editor experience
- š Complete CSS Bundles: Self-contained CSS with all dependencies included
Installation
npm install @ixo/editor
yarn add @ixo/editor
pnpm add @ixo/editor
Quick Start
Shadcn UI Version (Default)
import React from 'react';
import { useCreateIxoEditor, IxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css';
function MyEditor() {
const editor = useCreateIxoEditor({
theme: 'light',
initialContent: [
{
type: 'heading',
content: 'Welcome to IXO Editor',
props: { level: 1 },
},
{
type: 'paragraph',
content: 'Start typing to create amazing content!',
},
],
});
return <IxoEditor editor={editor} onChange={() => console.log('Content changed')} />;
}
Mantine UI Version
import React from 'react';
import { MantineProvider } from '@mantine/core';
import { useCreateIxoEditor, IxoEditor } from '@ixo/editor/mantine';
import '@ixo/editor/style-mantine.css';
function MyEditor() {
const editor = useCreateIxoEditor({
theme: 'light',
initialContent: [
{
type: 'heading',
content: 'Welcome to IXO Editor',
props: { level: 1 },
},
],
});
return (
<MantineProvider>
<IxoEditor editor={editor} onChange={() => console.log('Content changed')} />
</MantineProvider>
);
}
Import Options
The package provides flexible import patterns to suit your needs:
Option 1: UI-Specific Imports (Recommended)
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css';
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor/mantine';
import '@ixo/editor/style-mantine.css';
Option 2: Default Import (Shadcn)
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor';
import '@ixo/editor/style.css';
CSS Bundle Options
@ixo/editor/style-shadcn.css - Complete bundle: Inter fonts + Shadcn + IXO styles
@ixo/editor/style-mantine.css - Complete bundle: Inter fonts + Mantine + IXO styles
@ixo/editor/style.css - Default bundle (same as shadcn)
@ixo/editor/style-core.css - Only IXO custom styles (for advanced users)
API Reference
useCreateIxoEditor
The main hook for creating an IXO editor instance. Available in both UI versions.
const editor = useCreateIxoEditor(options?: IxoEditorOptions);
Options
theme | 'light' | 'dark' | 'light' | Editor color theme |
uploadFile | (file: File) => Promise<string> | Data URL converter | File upload handler |
initialContent | PartialBlock[] | undefined | Initial editor content |
editable | boolean | true | Whether editor is editable |
sideMenu | boolean | true | Show side menu (drag handle, plus button) |
slashMenu | boolean | true | Enable slash commands menu |
formattingToolbar | boolean | true | Show formatting toolbar |
linkToolbar | boolean | true | Show link toolbar |
filePanel | boolean | true | Show file panel |
tableHandles | boolean | true | Show table manipulation handles |
IxoEditor Component
The main editor component. Available in both UI versions with identical APIs.
<IxoEditor editor={editor} className="my-custom-class" onChange={() => {}} onSelectionChange={() => {}} />
Props
editor | BlockNoteEditor | undefined | Editor instance from useCreateIxoEditor |
className | string | Additional CSS classes |
onChange | () => void | Callback when content changes |
onSelectionChange | () => void | Callback when selection changes |
children | React.ReactNode | Custom child components |
Advanced Usage
Custom File Upload
const editor = useCreateIxoEditor({
uploadFile: async (file: File) => {
const formData = new FormData();
formData.append('file', file);
const response = await fetch('/api/upload', {
method: 'POST',
body: formData,
});
const { url } = await response.json();
return url;
},
});
Collaborative Editing
For real-time collaborative editing, use the useCreateCollaborativeIxoEditor hook with Matrix protocol:
import { useCreateCollaborativeIxoEditor, IxoEditor } from '@ixo/editor/shadcn';
function CollaborativeEditor() {
const { editor, connectionStatus } = useCreateCollaborativeIxoEditor({
theme: 'light',
user: {
id: 'user-123',
name: 'John Doe',
color: '#FF5733',
accessToken: 'your-matrix-access-token',
address: 'your-user-address',
},
matrixClient: matrixClient,
roomId: '!roomId:matrix.org',
});
return (
<div>
<div>Connection: {connectionStatus}</div>
<IxoEditor editor={editor} />
</div>
);
}
Dark Theme
const editor = useCreateIxoEditor({
theme: 'dark',
});
Read-Only Mode
const editor = useCreateIxoEditor({
editable: false,
sideMenu: false,
slashMenu: false,
formattingToolbar: false,
});
Custom Blocks
The IXO Editor includes custom blocks for working with IXO ecosystem data, available in both UI versions:
List Block
The List block displays dynamic data from DID and fragment identifiers, perfect for displaying data from your GraphQL API.
Overview Block
The Overview block provides a comprehensive view of entity data from DID identifiers.
Usage
Both blocks can be inserted using the slash menu:
List Block:
- Type
/list in the editor
- Or type
/ and search for "List", "data", or "dynamic"
- Configure the DID and fragment identifier in the settings
Overview Block:
- Type
/overview in the editor
- Or type
/ and search for "Overview", "overview-block", or "data-overview"
- Configure the DID in the settings
Programmatic Usage
editor.insertBlocks(
[
{
type: 'list',
props: {
title: 'My Data List',
did: 'did:ixo:entity123',
fragmentIdentifier: 'claims-data',
},
},
],
editor.getTextCursorPosition().block,
'after'
);
editor.insertBlocks(
[
{
type: 'overview',
props: {
did: 'did:ixo:entity123',
},
},
],
editor.getTextCursorPosition().block,
'after'
);
UI Library Comparison
| Bundle Size | ~46KB CSS | ~173KB CSS |
| Custom Blocks | Full-featured | Minimal (expandable) |
| Theming | Tailwind-based | CSS-in-JS |
| Dependencies | Radix UI primitives | Mantine ecosystem |
| Customization | High (CSS variables) | High (theme provider) |
When to Choose Shadcn UI
- ā
You're already using Tailwind CSS
- ā
You prefer smaller bundle sizes
- ā
You want the full-featured custom blocks
- ā
You like CSS variable-based theming
When to Choose Mantine UI
- ā
You're already using Mantine in your app
- ā
You prefer component-based theming
- ā
You want consistent Mantine design language
- ā
You plan to enhance the minimal blocks with Mantine components
Development
Project Structure
ixo-editor/
āāā src/
ā āāā core/ # Shared infrastructure
ā ā āāā types.ts # Shared types
ā ā āāā hooks/ # Matrix provider
ā ā āāā lib/ # GraphQL client & utilities
ā āāā shadcn/ # Shadcn UI implementation
ā ā āāā IxoEditor.tsx
ā ā āāā blocks/ # Full-featured custom blocks
ā ā āāā components/ # Shadcn UI components
ā ā āāā hooks/ # Editor hooks
ā ā āāā index.ts # Shadcn exports
ā āāā mantine/ # Mantine UI implementation
ā ā āāā IxoEditor.tsx
ā ā āāā blocks/ # Minimal custom blocks
ā ā āāā hooks/ # Editor hooks
ā ā āāā index.ts # Mantine exports
ā āāā styles/ # Source CSS
ā ā āāā ixo-editor.css
ā āāā index.ts # Main entry (defaults to shadcn)
āāā fonts/ # Inter font files
āāā dist/ # Built JavaScript
ā āāā index.js # Main bundle
ā āāā shadcn/ # Shadcn bundle
ā āāā mantine/ # Mantine bundle
āāā style*.css # CSS bundles
āāā package.json
Building the Package
pnpm install
pnpm build
pnpm run dev
pnpm run type-check
Requirements
- React 18.0.0 or higher
- React DOM 18.0.0 or higher
- Modern browser with ES2020 support
- For collaborative editing: Matrix server access
Additional Requirements by UI Library
For Mantine version:
@mantine/core ^8.0.0 (peer dependency)
@mantine/hooks ^8.0.0 (peer dependency)
For Shadcn version:
- Works with existing Tailwind CSS setup
- No additional peer dependencies
Migration Guide
From v1.x to v2.x (Multi-UI)
Before (v1.x):
import { IxoEditor } from '@ixo/editor';
import '@blocknote/shadcn/style.css';
import '@ixo/editor/style.css';
After (v2.x) - Recommended:
import { IxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css';
After (v2.x) - Backward compatible:
import { IxoEditor } from '@ixo/editor';
import '@ixo/editor/style.css';
License
MIT Ā© IXO Team
Internal Notes
This package is maintained by the IXO development team. For questions or issues, please contact the team directly through internal channels.
Version Management
Follow semantic versioning:
- Patch releases (0.0.x): Bug fixes and minor updates
- Minor releases (0.x.0): New features that are backward compatible
- Major releases (x.0.0): Breaking changes (like the multi-UI restructure)
Contributing
This is an internal package. All contributions should go through the standard IXO development workflow and review process.