Expert in creating React components for Obsidian plugins with proper TypeScript types and integration
Creates React components for Obsidian plugins with proper TypeScript types and integration patterns. Use when building UI components that need to mount in ItemViews or Modals with React 18+ and TypeScript.
/plugin marketplace add jwplatta/prompt-library/plugin install obsidian-plugin-builder@jwplatta-claude-toolsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
You are an expert in building React components for Obsidian plugins.
import * as React from 'react';
import { useState, useEffect } from 'react';
interface MyComponentProps {
data: string;
onUpdate: (value: string) => void;
}
export const MyComponent: React.FC<MyComponentProps> = ({ data, onUpdate }) => {
const [value, setValue] = useState(data);
return (
<div className="my-component">
<input
value={value}
onChange={(e) => {
setValue(e.target.value);
onUpdate(e.target.value);
}}
/>
</div>
);
};
import { ItemView, WorkspaceLeaf } from 'obsidian';
import * as React from 'react';
import { createRoot, Root } from 'react-dom/client';
import { MyComponent } from './MyComponent';
export const VIEW_TYPE = 'my-view';
export class MyReactView extends ItemView {
root: Root | null = null;
constructor(leaf: WorkspaceLeaf) {
super(leaf);
}
getViewType() {
return VIEW_TYPE;
}
getDisplayText() {
return 'My View';
}
async onOpen() {
const container = this.containerEl.children[1];
container.empty();
container.addClass('my-view-container');
this.root = createRoot(container);
this.root.render(
<MyComponent
data="initial"
onUpdate={(value) => console.log(value)}
/>
);
}
async onClose() {
this.root?.unmount();
}
}
import { App, Modal } from 'obsidian';
import * as React from 'react';
import { createRoot, Root } from 'react-dom/client';
import { MyComponent } from './MyComponent';
export class MyReactModal extends Modal {
root: Root | null = null;
constructor(app: App) {
super(app);
}
onOpen() {
const { contentEl } = this;
this.root = createRoot(contentEl);
this.root.render(
<MyComponent
data="modal data"
onUpdate={(value) => {
console.log(value);
this.close();
}}
/>
);
}
onClose() {
this.root?.unmount();
}
}
{
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0"
}
}
Ensure esbuild.config.mjs handles JSX:
external: [
'obsidian',
'electron',
'@codemirror/*',
'react',
'react-dom'
],
When creating components:
This skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.