super-productivity/packages/plugin-dev/boilerplate-solid-js/README.md
2026-01-05 14:45:06 +01:00

299 lines
7 KiB
Markdown

# Solid.js Boilerplate Plugin for Super Productivity
A modern, TypeScript-based boilerplate for creating Super Productivity plugins using Solid.js.
## Features
- 🚀 **Solid.js** - Fast, reactive UI framework
- 📘 **TypeScript** - Full type safety with Super Productivity Plugin API
- 🎨 **Modern UI** - Clean, responsive design with dark mode support
- 🔧 **Vite** - Lightning-fast development and build tooling
- 📦 **Ready to Use** - Complete setup with examples for all plugin features
## Getting Started
### Prerequisites
- Node.js 16+
- npm or yarn
- Super Productivity 8.0.0+
### Installation
1. Clone this boilerplate:
```bash
cd packages/plugin-dev
cp -r boilerplate-solid-js my-plugin
cd my-plugin
```
2. Install dependencies:
```bash
npm install
```
3. Update plugin metadata in `src/manifest.json`:
- Change `id` to a unique identifier
- Update `name`, `description`, and `author`
- Modify `permissions` and `hooks` as needed
### Development
Run the development server:
```bash
npm run dev
```
This starts Vite in watch mode. Your plugin will rebuild automatically when you make changes.
### Building
Build the plugin for production:
```bash
npm run build
```
This creates optimized files in the `dist/` directory.
### Packaging
Create a ZIP file for distribution:
```bash
npm run package
```
This will:
1. Build the plugin
2. Create a ZIP file containing all necessary files
3. Place the ZIP in the root directory
### Deployment (for Plugins with HTML UI)
If your plugin has an `index.html` file (for UI components, side panels, etc.), use the deploy command instead:
```bash
npm run deploy
```
This will:
1. Build the plugin
2. Inline all CSS and JavaScript assets into the HTML file
3. Create a ZIP file for distribution
**Note**: The `deploy` command is necessary for any plugin with HTML UI because Super Productivity loads plugin HTML as data URLs, which cannot access external files. The inline-assets script ensures all assets are embedded directly in the HTML.
## Project Structure
```
src/
├── assets/ # Static assets (icons, images)
│ └── icon.svg # Plugin icon
├── app/ # Solid.js application
│ ├── App.tsx # Main app component
│ └── App.css # App styles
├── index.html # Plugin UI entry point
├── index.ts # UI initialization
├── plugin.ts # Plugin logic and API integration
└── manifest.json # Plugin metadata
scripts/ # Build and utility scripts
└── build-plugin.js # Plugin packaging script
dist/ # Build output (gitignored)
├── assets/
├── index.html
├── index.js
├── plugin.js
└── manifest.json
```
## Plugin API Usage
### Basic Setup
The plugin API is exposed through the global `plugin` object in `plugin.ts`:
```typescript
import { PluginInterface } from '@super-productivity/plugin-api';
declare const plugin: PluginInterface;
```
### Common API Methods
#### UI Registration
```typescript
// Register header button
plugin.registerHeaderButton({
icon: 'rocket',
tooltip: 'Open Plugin',
action: () => plugin.showIndexHtmlAsView(),
});
// Register menu entry
plugin.registerMenuEntry({
label: 'My Plugin',
icon: 'rocket',
action: () => plugin.showIndexHtmlAsView(),
});
// Register keyboard shortcut
plugin.registerShortcut({
keys: 'ctrl+shift+m',
label: 'Open My Plugin',
action: () => plugin.showIndexHtmlAsView(),
});
```
#### Data Operations
```typescript
// Get tasks
const tasks = await plugin.getTasks();
const archivedTasks = await plugin.getArchivedTasks();
// Create task
const newTask = await plugin.addTask({
title: 'New Task',
projectId: 'project-id',
});
// Update task
await plugin.updateTask('task-id', {
title: 'Updated Title',
isDone: true,
});
// Get projects and tags
const projects = await plugin.getAllProjects();
const tags = await plugin.getAllTags();
```
#### Event Hooks
```typescript
// Task completion
plugin.on('taskComplete', (task) => {
console.log('Task completed:', task.title);
});
// Task updates
plugin.on('taskUpdate', (task) => {
console.log('Task updated:', task);
});
// Context changes
plugin.on('contextChange', (context) => {
console.log('Context changed:', context);
});
```
#### Communication with UI
In `plugin.ts`:
```typescript
plugin.onMessage('myCommand', async (data) => {
// Handle message from UI
return { result: 'success' };
});
```
In your Solid.js component:
```typescript
const sendMessage = async (type: string, payload?: any) => {
return new Promise((resolve) => {
const messageId = Math.random().toString(36).substr(2, 9);
const handler = (event: MessageEvent) => {
if (event.data.messageId === messageId) {
window.removeEventListener('message', handler);
resolve(event.data.response);
}
};
window.addEventListener('message', handler);
window.parent.postMessage({ type, payload, messageId }, '*');
});
};
// Usage
const result = await sendMessage('myCommand', { foo: 'bar' });
```
## Customization
### Styling
The boilerplate includes:
- CSS custom properties for theming
- Dark mode support
- Responsive design
- Minimal, clean styling
Modify `src/app/App.css` to customize the appearance.
### Adding Features
1. **New UI Components**: Add them in `src/app/` as `.tsx` files
2. **New API Endpoints**: Add handlers in `src/plugin.ts` using `plugin.onMessage()`
3. **New Hooks**: Register them in `manifest.json` and handle in `plugin.ts`
4. **Permissions**: Add required permissions to `manifest.json`
## Best Practices
1. **Type Safety**: Always use TypeScript types from `@super-productivity/plugin-api`
2. **Error Handling**: Wrap async operations in try-catch blocks
3. **Performance**: Use Solid.js signals and effects efficiently
4. **Security**: Never expose sensitive data or operations
5. **User Experience**: Provide loading states and error feedback
## Deployment
1. Build the plugin: `npm run build`
2. Package it: `npm run package`
3. Upload the ZIP file to Super Productivity:
- Open Super Productivity
- Go to Settings → Plugins
- Click "Upload Plugin"
- Select your ZIP file
## Troubleshooting
### Plugin not loading
- Check browser console for errors
- Verify `manifest.json` is valid JSON
- Ensure `minSupVersion` matches your Super Productivity version
### API calls failing
- Check if you have required permissions in `manifest.json`
- Verify Super Productivity is running the correct version
- Look for error messages in the console
### Build errors
- Run `npm run typecheck` to check for TypeScript errors
- Ensure all dependencies are installed
- Clear `node_modules` and reinstall if needed
## Resources
- [Super Productivity Plugin API Documentation](https://github.com/super-productivity/super-productivity)
- [Solid.js Documentation](https://www.solidjs.com/docs/latest)
- [Vite Documentation](https://vitejs.dev/)
## License
This boilerplate is provided as-is for creating Super Productivity plugins. Feel free to modify and distribute your plugins as you see fit.