dragble-angular-editor 1.0.4 → 1.0.5

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.
Files changed (2) hide show
  1. package/README.md +45 -40
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -167,25 +167,27 @@ import {
167
167
  selector: "app-advanced-email-builder",
168
168
  standalone: true,
169
169
  imports: [DragbleEditorComponent],
170
- styles: [`
171
- .advanced-email-builder {
172
- height: 100vh;
173
- display: flex;
174
- flex-direction: column;
175
- }
176
-
177
- .toolbar {
178
- padding: 12px;
179
- border-bottom: 1px solid #ddd;
180
- display: flex;
181
- gap: 8px;
182
- align-items: center;
183
- }
184
-
185
- .dirty-indicator {
186
- color: orange;
187
- }
188
- `],
170
+ styles: [
171
+ `
172
+ .advanced-email-builder {
173
+ height: 100vh;
174
+ display: flex;
175
+ flex-direction: column;
176
+ }
177
+
178
+ .toolbar {
179
+ padding: 12px;
180
+ border-bottom: 1px solid #ddd;
181
+ display: flex;
182
+ gap: 8px;
183
+ align-items: center;
184
+ }
185
+
186
+ .dirty-indicator {
187
+ color: orange;
188
+ }
189
+ `,
190
+ ],
189
191
  template: `
190
192
  <div class="advanced-email-builder">
191
193
  <div class="toolbar">
@@ -195,7 +197,9 @@ import {
195
197
  Preview
196
198
  </button>
197
199
  <button type="button" (click)="handleExportHtml()">Export HTML</button>
198
- <button type="button" (click)="handleExportImage()">Export Image</button>
200
+ <button type="button" (click)="handleExportImage()">
201
+ Export Image
202
+ </button>
199
203
  <span *ngIf="isDirty" class="dirty-indicator">Unsaved changes</span>
200
204
  </div>
201
205
 
@@ -326,11 +330,10 @@ export class EditorComponent {
326
330
  // const id = "alice123-campaign-summer-2026";
327
331
  //
328
332
  // Format rules: 8-128 chars, only letters/digits/hyphens/underscores.
329
- const userIdFromAuth = "alice123"; // from your auth/session
333
+ const userIdFromAuth = "alice123"; // from your auth/session
330
334
  const docIdFromRoute = "campaign-summer"; // from your URL or DB row
331
335
  const id = `${userIdFromAuth}-${docIdFromRoute}`;
332
- const { sessionId } =
333
- await this.editor.editor!.connectMCP({ id });
336
+ const { sessionId } = await this.editor.editor!.connectMCP({ id });
334
337
  // Pass sessionId to your backend — it calls MCP tools with your mcp_key
335
338
  }
336
339
  }
@@ -374,21 +377,23 @@ This prevents two AI controllers from conflicting on the same design.
374
377
  The `id` you pass to `connectMCP()` is a **Bring Your Own ID (BYOI)** that maps to your domain entities. It is NOT a random token — it is how Dragble identifies the session across browser refreshes, server restarts, and device switches.
375
378
 
376
379
  **Rules:**
380
+
377
381
  - 8–128 characters long
378
382
  - Only letters, numbers, hyphens, and underscores (`a-z A-Z 0-9 - _`)
379
383
  - Must be deterministic — the same user editing the same document should always produce the same `id`
380
384
 
381
385
  **Why these rules?**
386
+
382
387
  - The `id` is used in database lookups, URL paths, and storage keys — special characters or extreme lengths would break routing
383
388
  - Same `id` = resume the same session. Random UUIDs mean every page refresh creates a new session and loses AI context
384
389
  - Short IDs (< 8 chars) are too easy to guess, long IDs (> 128 chars) waste storage
385
390
 
386
391
  ```typescript
387
392
  // Recommended: derive from your domain — concrete examples
388
- editor.connectMCP({ id: "alice123-campaign-summer-2026" }); // user + doc
393
+ editor.connectMCP({ id: "alice123-campaign-summer-2026" }); // user + doc
389
394
  editor.connectMCP({ id: "workspace_acme_template_welcome" }); // workspace + template
390
- editor.connectMCP({ id: "org-uber-eats-promo-q4-2026" }); // org + campaign
391
- editor.connectMCP({ id: "tenant_42_invoice_template_v3" }); // tenant + entity
395
+ editor.connectMCP({ id: "org-uber-eats-promo-q4-2026" }); // org + campaign
396
+ editor.connectMCP({ id: "tenant_42_invoice_template_v3" }); // tenant + entity
392
397
 
393
398
  // Valid but NOT recommended — random IDs break session continuity
394
399
  // (every page refresh creates a brand new session, AI loses context)
@@ -399,16 +404,16 @@ editor.connectMCP({ id: crypto.randomUUID() });
399
404
 
400
405
  Choose how much of the session lives on Dragble's servers:
401
406
 
402
- | Mode | Persistence | Use case |
403
- |---|---|---|
407
+ | Mode | Persistence | Use case |
408
+ | ---------------- | ------------------------- | ------------------------------------------------------- |
404
409
  | `full` (default) | Metadata + design content | Standard SaaS; survives refresh, restart, device switch |
405
- | `metadata-only` | Metadata only | Audit logs without storing customer content |
406
- | `memory-only` | None — RAM only | HIPAA / SOC2 / strict data residency |
410
+ | `metadata-only` | Metadata only | Audit logs without storing customer content |
411
+ | `memory-only` | None — RAM only | HIPAA / SOC2 / strict data residency |
407
412
 
408
413
  ```typescript
409
414
  editor.connectMCP({
410
415
  id: "user-42-doc-99",
411
- storage: "full", // default — best UX, refresh + cross-device resume
416
+ storage: "full", // default — best UX, refresh + cross-device resume
412
417
  // "metadata-only" // audit metadata only, no design content persisted
413
418
  // "memory-only" // nothing persisted (HIPAA / SOC2 / data residency)
414
419
  });
@@ -425,7 +430,7 @@ const { destroyed } = await editor.disconnectMCP();
425
430
  Your backend can also force-destroy a session server-side (e.g., when a user's subscription ends):
426
431
 
427
432
  ```bash
428
- curl -X DELETE https://mcp.dragble.io/sessions/user-42-doc-99 \
433
+ curl -X DELETE https://mcp.dragble.com/sessions/user-42-doc-99 \
429
434
  -H "X-API-Key: db_mcp_your_key_here"
430
435
  ```
431
436
 
@@ -433,14 +438,14 @@ Idle sessions are reaped after 2 hours of inactivity. Active sessions never expi
433
438
 
434
439
  ### MCP method reference
435
440
 
436
- | Method | Returns |
437
- |---|---|
438
- | `editor.connectMCP({ id, storage?, editorMode? })` | `{ sessionId, storageMode?, resumed? }` |
439
- | `editor.disconnectMCP()` | `{ destroyed }` — permanently deletes session |
440
- | `editor.getPairingCode()` | `{ code, expiresAt }` — generate a pairing code for end-user AI clients |
441
- | `editor.endPairing()` | `{ revoked }` — invalidate the active pairing code |
442
- | `editor.getMCPStatus()` | `{ paired: true, sessionId } \| { paired: false, reason? }` |
443
- | `editor.onAIToolFired(cb)` | unsubscribe fn — fires when AI calls any tool |
441
+ | Method | Returns |
442
+ | -------------------------------------------------- | ----------------------------------------------------------------------- |
443
+ | `editor.connectMCP({ id, storage?, editorMode? })` | `{ sessionId, storageMode?, resumed? }` |
444
+ | `editor.disconnectMCP()` | `{ destroyed }` — permanently deletes session |
445
+ | `editor.getPairingCode()` | `{ code, expiresAt }` — generate a pairing code for end-user AI clients |
446
+ | `editor.endPairing()` | `{ revoked }` — invalidate the active pairing code |
447
+ | `editor.getMCPStatus()` | `{ paired: true, sessionId } \| { paired: false, reason? }` |
448
+ | `editor.onAIToolFired(cb)` | unsubscribe fn — fires when AI calls any tool |
444
449
 
445
450
  ### Full documentation
446
451
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dragble-angular-editor",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "AI-powered Angular email editor component. Drag-and-drop email builder for creating responsive email templates and newsletters. Build HTML emails visually with Dragble.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",