@notehub.md/cli 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notehub.md/cli",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "CLI tool for building Notehub plugins",
5
5
  "type": "module",
6
6
  "repository": {
@@ -276,19 +276,18 @@ const theme = await ctx.invokeApi<string>('theme:get-current');
276
276
  const themes = await ctx.invokeApi<string[]>('theme:list');
277
277
  ```
278
278
 
279
- ## Editor Widget API
279
+ ## Editor Portal API
280
280
 
281
281
  ```typescript
282
- // Register widget
283
- await ctx.invokeApi(
284
- 'editor:register-widget',
285
- 'my-plugin:progress-bar',
286
- /\[progress:(\d+)\]/g,
287
- ProgressBarComponent
288
- );
282
+ // Register portal (inline widget)
283
+ await ctx.invokeApi('editor:register-portal', {
284
+ id: 'my-plugin:progress-bar',
285
+ regex: /\[progress:(\d+)\]/g,
286
+ component: ProgressBarComponent
287
+ });
289
288
 
290
- // Unregister (optional - auto-cleaned)
291
- await ctx.invokeApi('editor:unregister-widget', 'my-plugin:progress-bar');
289
+ // Unregister (optional - auto-cleaned on plugin unload)
290
+ await ctx.invokeApi('editor:unregister-portal', 'my-plugin:progress-bar');
292
291
  ```
293
292
 
294
293
  ## Settings API
@@ -407,14 +406,15 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
407
406
  );
408
407
  };
409
408
 
409
+ // Plugin
410
410
  export default class ProgressBarPlugin extends NotehubPlugin {
411
411
  async onload(ctx: PluginContext): Promise<void> {
412
- await ctx.invokeApi(
413
- 'editor:register-widget',
414
- 'progress-bar',
415
- /\[progress:(\d+)\]/g,
416
- ProgressBar
417
- );
412
+ // Match: [progress:XX] where XX is a number
413
+ await ctx.invokeApi('editor:register-portal', {
414
+ id: 'progress-bar',
415
+ regex: /\[progress:(\d+)\]/g,
416
+ component: ProgressBar
417
+ });
418
418
  }
419
419
 
420
420
  async onunload(): Promise<void> {}
@@ -523,12 +523,11 @@ const WordCounter: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
523
523
  };
524
524
 
525
525
  // Register with pattern: {{count: your text here}}
526
- await ctx.invokeApi(
527
- 'editor:register-widget',
528
- 'word-counter',
529
- /\{\{count:\s*(.+?)\}\}/g,
530
- WordCounter
531
- );
526
+ await ctx.invokeApi('editor:register-portal', {
527
+ id: 'word-counter',
528
+ regex: /\{\{count:\s*(.+?)\}\}/g,
529
+ component: WordCounter
530
+ });
532
531
  ```
533
532
 
534
533
  ## Full-Featured Plugin
@@ -276,19 +276,18 @@ const theme = await ctx.invokeApi<string>('theme:get-current');
276
276
  const themes = await ctx.invokeApi<string[]>('theme:list');
277
277
  ```
278
278
 
279
- ## Editor Widget API
279
+ ## Editor Portal API
280
280
 
281
281
  ```typescript
282
- // Регистрация виджета
283
- await ctx.invokeApi(
284
- 'editor:register-widget',
285
- 'my-plugin:progress-bar',
286
- /\[progress:(\d+)\]/g,
287
- ProgressBarComponent
288
- );
282
+ // Регистрация портала (инлайн-виджета)
283
+ await ctx.invokeApi('editor:register-portal', {
284
+ id: 'my-plugin:progress-bar',
285
+ regex: /\[progress:(\d+)\]/g,
286
+ component: ProgressBarComponent
287
+ });
289
288
 
290
289
  // Отмена регистрации (опционально - очищается автоматически)
291
- await ctx.invokeApi('editor:unregister-widget', 'my-plugin:progress-bar');
290
+ await ctx.invokeApi('editor:unregister-portal', 'my-plugin:progress-bar');
292
291
  ```
293
292
 
294
293
  ## Settings API
@@ -407,14 +406,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
407
406
  );
408
407
  };
409
408
 
409
+ // Плагин
410
410
  export default class ProgressBarPlugin extends NotehubPlugin {
411
411
  async onload(ctx: PluginContext): Promise<void> {
412
- await ctx.invokeApi(
413
- 'editor:register-widget',
414
- 'progress-bar',
415
- /\[progress:(\d+)\]/g,
416
- ProgressBar
417
- );
412
+ // Совпадение: [progress:XX] где XX — число
413
+ await ctx.invokeApi('editor:register-portal', {
414
+ id: 'progress-bar',
415
+ regex: /\[progress:(\d+)\]/g,
416
+ component: ProgressBar
417
+ });
418
+
419
+ await ctx.invokeApi('logger:info', 'ProgressBar', 'Портал зарегистрирован');
418
420
  }
419
421
 
420
422
  async onunload(): Promise<void> {}
@@ -523,12 +525,11 @@ const WordCounter: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
523
525
  };
524
526
 
525
527
  // Регистрация с паттерном: {{count: ваш текст здесь}}
526
- await ctx.invokeApi(
527
- 'editor:register-widget',
528
- 'word-counter',
529
- /\{\{count:\s*(.+?)\}\}/g,
530
- WordCounter
531
- );
528
+ await ctx.invokeApi('editor:register-portal', {
529
+ id: 'word-counter',
530
+ regex: /\{\{count:\s*(.+?)\}\}/g,
531
+ component: WordCounter
532
+ });
532
533
  ```
533
534
 
534
535
  ## Полноценный плагин
@@ -14,17 +14,16 @@ View Mode: [████████░░] 80% ← Your rendered compon
14
14
  Edit Mode: [progress:80] ← Source text visible when cursor inside
15
15
  ```
16
16
 
17
- ## Registering a Widget
17
+ ## Registering a Portal
18
18
 
19
- Use the `editor:register-widget` API:
19
+ Use the `editor:register-portal` API:
20
20
 
21
21
  ```typescript
22
- await ctx.invokeApi(
23
- 'editor:register-widget',
24
- 'unique-id', // Unique identifier
25
- /regex-pattern/g, // Pattern to match (MUST have global flag 'g')
26
- ReactComponent // Component to render
27
- );
22
+ await ctx.invokeApi('editor:register-portal', {
23
+ id: 'unique-id', // Unique identifier
24
+ regex: /regex-pattern/g, // Pattern to match (MUST have global flag 'g')
25
+ component: ReactComponent // Component to render
26
+ });
28
27
  ```
29
28
 
30
29
  ## Component Props
@@ -87,18 +86,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
87
86
  export default class ProgressBarPlugin extends NotehubPlugin {
88
87
  async onload(ctx: PluginContext): Promise<void> {
89
88
  // Match: [progress:XX] where XX is a number
90
- await ctx.invokeApi(
91
- 'editor:register-widget',
92
- 'progress-bar',
93
- /\[progress:(\d+)\]/g,
94
- ProgressBar
95
- );
89
+ await ctx.invokeApi('editor:register-portal', {
90
+ id: 'progress-bar',
91
+ regex: /\[progress:(\d+)\]/g,
92
+ component: ProgressBar
93
+ });
96
94
 
97
- await ctx.invokeApi('logger:info', 'ProgressBar', 'Widget registered');
95
+ await ctx.invokeApi('logger:info', 'ProgressBar', 'Portal registered');
98
96
  }
99
97
 
100
98
  async onunload(): Promise<void> {
101
- // Widget is automatically unregistered!
99
+ // Portal is automatically unregistered!
102
100
  }
103
101
  }
104
102
  ```
@@ -142,12 +140,11 @@ const ButtonWidget: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
142
140
  };
143
141
 
144
142
  // Register
145
- await ctx.invokeApi(
146
- 'editor:register-widget',
147
- 'btn-widget',
148
- /\[btn:([^\]:]+):([^\]]+)\]/g,
149
- ButtonWidget
150
- );
143
+ await ctx.invokeApi('editor:register-portal', {
144
+ id: 'btn-widget',
145
+ regex: /\[btn:([^\]:]+):([^\]]+)\]/g,
146
+ component: ButtonWidget
147
+ });
151
148
  ```
152
149
 
153
150
  **Usage:**
@@ -185,12 +182,11 @@ const StatusBadge: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
185
182
  );
186
183
  };
187
184
 
188
- await ctx.invokeApi(
189
- 'editor:register-widget',
190
- 'status-badge',
191
- /\[status:([^\]]+)\]/g,
192
- StatusBadge
193
- );
185
+ await ctx.invokeApi('editor:register-portal', {
186
+ id: 'status-badge',
187
+ regex: /\[status:([^\]]+)\]/g,
188
+ component: StatusBadge
189
+ });
194
190
  ```
195
191
 
196
192
  **Usage:**
@@ -305,12 +301,12 @@ onClick={(e) => {
305
301
 
306
302
  ## Unregistering Widgets
307
303
 
308
- Widgets are **automatically unregistered** when your plugin unloads.
304
+ Portals are **automatically unregistered** when your plugin unloads.
309
305
 
310
306
  For manual unregistration:
311
307
 
312
308
  ```typescript
313
- await ctx.invokeApi('editor:unregister-widget', 'my-widget-id');
309
+ await ctx.invokeApi('editor:unregister-portal', 'my-portal-id');
314
310
  ```
315
311
 
316
312
  ---
@@ -14,17 +14,16 @@
14
14
  Режим редактирования: [progress:80] ← Исходный текст виден когда курсор внутри
15
15
  ```
16
16
 
17
- ## Регистрация виджета
17
+ ## Регистрация портала
18
18
 
19
- Используйте API `editor:register-widget`:
19
+ Используйте API `editor:register-portal`:
20
20
 
21
21
  ```typescript
22
- await ctx.invokeApi(
23
- 'editor:register-widget',
24
- 'unique-id', // Уникальный идентификатор
25
- /regex-pattern/g, // Паттерн для поиска (ДОЛЖЕН иметь флаг 'g')
26
- ReactComponent // Компонент для рендеринга
27
- );
22
+ await ctx.invokeApi('editor:register-portal', {
23
+ id: 'unique-id', // Уникальный идентификатор
24
+ regex: /regex-pattern/g, // Паттерн для поиска (ДОЛЖЕН иметь флаг 'g')
25
+ component: ReactComponent // Компонент для рендеринга
26
+ });
28
27
  ```
29
28
 
30
29
  ## Пропсы компонента
@@ -87,18 +86,17 @@ const ProgressBar: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
87
86
  export default class ProgressBarPlugin extends NotehubPlugin {
88
87
  async onload(ctx: PluginContext): Promise<void> {
89
88
  // Совпадение: [progress:XX] где XX — число
90
- await ctx.invokeApi(
91
- 'editor:register-widget',
92
- 'progress-bar',
93
- /\[progress:(\d+)\]/g,
94
- ProgressBar
95
- );
89
+ await ctx.invokeApi('editor:register-portal', {
90
+ id: 'progress-bar',
91
+ regex: /\[progress:(\d+)\]/g,
92
+ component: ProgressBar
93
+ });
96
94
 
97
- await ctx.invokeApi('logger:info', 'ProgressBar', 'Виджет зарегистрирован');
95
+ await ctx.invokeApi('logger:info', 'ProgressBar', 'Портал зарегистрирован');
98
96
  }
99
97
 
100
98
  async onunload(): Promise<void> {
101
- // Виджет автоматически отменяет регистрацию!
99
+ // Портал автоматически отменяет регистрацию!
102
100
  }
103
101
  }
104
102
  ```
@@ -140,12 +138,11 @@ const ButtonWidget: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
140
138
  };
141
139
 
142
140
  // Регистрация
143
- await ctx.invokeApi(
144
- 'editor:register-widget',
145
- 'btn-widget',
146
- /\[btn:([^\]:]+):([^\]]+)\]/g,
147
- ButtonWidget
148
- );
141
+ await ctx.invokeApi('editor:register-portal', {
142
+ id: 'btn-widget',
143
+ regex: /\[btn:([^\]:]+):([^\]]+)\]/g,
144
+ component: ButtonWidget
145
+ });
149
146
  ```
150
147
 
151
148
  **Использование:**
@@ -183,12 +180,11 @@ const StatusBadge: React.FC<{ match: RegExpExecArray }> = ({ match }) => {
183
180
  );
184
181
  };
185
182
 
186
- await ctx.invokeApi(
187
- 'editor:register-widget',
188
- 'status-badge',
189
- /\[status:([^\]]+)\]/g,
190
- StatusBadge
191
- );
183
+ await ctx.invokeApi('editor:register-portal', {
184
+ id: 'status-badge',
185
+ regex: /\[status:([^\]]+)\]/g,
186
+ component: StatusBadge
187
+ });
192
188
  ```
193
189
 
194
190
  **Использование:**
@@ -276,12 +272,12 @@ style={{
276
272
 
277
273
  ## Отмена регистрации виджетов
278
274
 
279
- Виджеты **автоматически отменяют регистрацию** при выгрузке вашего плагина.
275
+ Порталы **автоматически отменяют регистрацию** при выгрузке вашего плагина.
280
276
 
281
277
  Для ручной отмены:
282
278
 
283
279
  ```typescript
284
- await ctx.invokeApi('editor:unregister-widget', 'my-widget-id');
280
+ await ctx.invokeApi('editor:unregister-portal', 'my-portal-id');
285
281
  ```
286
282
 
287
283
  ---