
Security News
The Code You Didn't Write Is Still Yours to Defend
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.
@ixo/editor
Advanced tools
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.
npm install @ixo/editor
# or
yarn add @ixo/editor
# or
pnpm add @ixo/editor
import React from 'react';
import { useCreateIxoEditor, IxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css'; // Complete CSS bundle - no other imports needed!
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')} />;
}
import React from 'react';
import { MantineProvider } from '@mantine/core';
import { useCreateIxoEditor, IxoEditor } from '@ixo/editor/mantine';
import '@ixo/editor/style-mantine.css'; // Complete CSS bundle - no other imports needed!
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>
);
}
The package provides flexible import patterns to suit your needs:
// Shadcn version with complete CSS bundle
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css';
// Mantine version with complete CSS bundle
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor/mantine';
import '@ixo/editor/style-mantine.css';
// Uses Shadcn version by default for backward compatibility
import { IxoEditor, useCreateIxoEditor } from '@ixo/editor';
import '@ixo/editor/style.css';
@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)useCreateIxoEditorThe main hook for creating an IXO editor instance. Available in both UI versions.
const editor = useCreateIxoEditor(options?: IxoEditorOptions);
| Option | Type | Default | Description |
|---|---|---|---|
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 ComponentThe main editor component. Available in both UI versions with identical APIs.
<IxoEditor editor={editor} className="my-custom-class" onChange={() => {}} onSelectionChange={() => {}} />
| Prop | Type | Description |
|---|---|---|
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 |
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;
},
});
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>
);
}
const editor = useCreateIxoEditor({
theme: 'dark',
});
const editor = useCreateIxoEditor({
editable: false,
sideMenu: false,
slashMenu: false,
formattingToolbar: false,
});
The IXO Editor includes custom blocks for working with IXO ecosystem data, available in both UI versions:
The List block displays dynamic data from DID and fragment identifiers, perfect for displaying data from your GraphQL API.
The Overview block provides a comprehensive view of entity data from DID identifiers.
Both blocks can be inserted using the slash menu:
List Block:
/list in the editor/ and search for "List", "data", or "dynamic"Overview Block:
/overview in the editor/ and search for "Overview", "overview-block", or "data-overview"// Insert a list block programmatically
editor.insertBlocks(
[
{
type: 'list',
props: {
title: 'My Data List',
did: 'did:ixo:entity123',
fragmentIdentifier: 'claims-data',
},
},
],
editor.getTextCursorPosition().block,
'after'
);
// Insert an overview block programmatically
editor.insertBlocks(
[
{
type: 'overview',
props: {
did: 'did:ixo:entity123',
},
},
],
editor.getTextCursorPosition().block,
'after'
);
| Feature | Shadcn UI | Mantine UI |
|---|---|---|
| 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) |
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
# Install dependencies
pnpm install
# Build the package (creates all bundles)
pnpm build
# Watch for changes during development
pnpm run dev
# Type checking
pnpm run type-check
For Mantine version:
@mantine/core ^8.0.0 (peer dependency)@mantine/hooks ^8.0.0 (peer dependency)For Shadcn version:
Before (v1.x):
import { IxoEditor } from '@ixo/editor';
import '@blocknote/shadcn/style.css';
import '@ixo/editor/style.css';
After (v2.x) - Recommended:
// Explicit shadcn version with complete CSS bundle
import { IxoEditor } from '@ixo/editor/shadcn';
import '@ixo/editor/style-shadcn.css'; // Single import!
After (v2.x) - Backward compatible:
// Still works! (defaults to shadcn)
import { IxoEditor } from '@ixo/editor';
import '@ixo/editor/style.css'; // Now includes all dependencies
MIT © IXO Team
This package is maintained by the IXO development team. For questions or issues, please contact the team directly through internal channels.
Follow semantic versioning:
This is an internal package. All contributions should go through the standard IXO development workflow and review process.
FAQs
A custom BlockNote editor wrapper for IXO team
We found that @ixo/editor demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers 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
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.