mirror of
https://github.com/johannesjo/super-productivity.git
synced 2026-01-23 02:36:05 +00:00
feat(plugin-api): create foundational plugin API package
- Add @super-productivity/plugin-api package with TypeScript definitions - Define core plugin interfaces, types, and manifest structure - Add plugin hooks system for event-driven architecture - Create plugin API type definitions and constants - Add documentation and development guidelines
This commit is contained in:
parent
296f987698
commit
d4d81bf511
248 changed files with 50093 additions and 683 deletions
283
packages/plugin-dev/boilerplate-solid-js/README.md
Normal file
283
packages/plugin-dev/boilerplate-solid-js/README.md
Normal file
|
|
@ -0,0 +1,283 @@
|
|||
# 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
|
||||
|
||||
## 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/johannesjo/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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue