@emabuild/core 0.2.0 → 0.3.0

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 (60) hide show
  1. package/dist/canvas/column-renderer.d.ts.map +1 -1
  2. package/dist/canvas/content-renderer.d.ts +1 -1
  3. package/dist/canvas/content-renderer.d.ts.map +1 -1
  4. package/dist/canvas/editor-canvas.d.ts +11 -0
  5. package/dist/canvas/editor-canvas.d.ts.map +1 -1
  6. package/dist/canvas/inline-toolbar.d.ts +8 -0
  7. package/dist/canvas/inline-toolbar.d.ts.map +1 -1
  8. package/dist/canvas/row-renderer.d.ts +2 -0
  9. package/dist/canvas/row-renderer.d.ts.map +1 -1
  10. package/dist/compat/unlayer-adapter.d.ts +33 -0
  11. package/dist/compat/unlayer-adapter.d.ts.map +1 -0
  12. package/dist/dnd/drag-manager.d.ts +1 -0
  13. package/dist/dnd/drag-manager.d.ts.map +1 -1
  14. package/dist/dnd/drag-state.d.ts +10 -3
  15. package/dist/dnd/drag-state.d.ts.map +1 -1
  16. package/dist/{form-tool-DdFDrS3b.js → form-tool-C7760Hvm.js} +10 -9
  17. package/dist/{form-tool-DdFDrS3b.js.map → form-tool-C7760Hvm.js.map} +1 -1
  18. package/dist/{html-tool-DMtmrF3n.js → html-tool-4zZO2hqE.js} +2 -2
  19. package/dist/{html-tool-DMtmrF3n.js.map → html-tool-4zZO2hqE.js.map} +1 -1
  20. package/dist/index-zy5NbC2E.js +4303 -0
  21. package/dist/index-zy5NbC2E.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +7 -5
  25. package/dist/mail-editor.d.ts +13 -2
  26. package/dist/mail-editor.d.ts.map +1 -1
  27. package/dist/{menu-tool-CJcQdpcP.js → menu-tool-Cu5D_VYs.js} +14 -13
  28. package/dist/{menu-tool-CJcQdpcP.js.map → menu-tool-Cu5D_VYs.js.map} +1 -1
  29. package/dist/properties/property-panel.d.ts.map +1 -1
  30. package/dist/register-elements.d.ts.map +1 -1
  31. package/dist/sidebar/a11y-checker.d.ts +27 -0
  32. package/dist/sidebar/a11y-checker.d.ts.map +1 -0
  33. package/dist/sidebar/body-settings.d.ts +2 -0
  34. package/dist/sidebar/body-settings.d.ts.map +1 -1
  35. package/dist/sidebar/editor-sidebar.d.ts +5 -2
  36. package/dist/sidebar/editor-sidebar.d.ts.map +1 -1
  37. package/dist/{social-tool-CRY3-_sU.js → social-tool-kPuP-4n6.js} +13 -12
  38. package/dist/{social-tool-CRY3-_sU.js.map → social-tool-kPuP-4n6.js.map} +1 -1
  39. package/dist/state/editor-store.d.ts +30 -28
  40. package/dist/state/editor-store.d.ts.map +1 -1
  41. package/dist/{table-tool-DeIQci5z.js → table-tool-CcWFvTSc.js} +13 -12
  42. package/dist/{table-tool-DeIQci5z.js.map → table-tool-CcWFvTSc.js.map} +1 -1
  43. package/dist/timer-tool-CG1oul_Z.js +55 -0
  44. package/dist/timer-tool-CG1oul_Z.js.map +1 -0
  45. package/dist/tools/built-in/button-tool.d.ts.map +1 -1
  46. package/dist/tools/built-in/divider-tool.d.ts.map +1 -1
  47. package/dist/tools/built-in/heading-tool.d.ts.map +1 -1
  48. package/dist/tools/built-in/image-tool.d.ts.map +1 -1
  49. package/dist/tools/built-in/paragraph-tool.d.ts.map +1 -1
  50. package/dist/tools/built-in/shared-options.d.ts +105 -0
  51. package/dist/tools/built-in/shared-options.d.ts.map +1 -0
  52. package/dist/tools/built-in/text-tool.d.ts.map +1 -1
  53. package/dist/tools/tool-registry.d.ts.map +1 -1
  54. package/dist/{video-tool-g1fIoCWW.js → video-tool-CttMka8Z.js} +7 -6
  55. package/dist/{video-tool-g1fIoCWW.js.map → video-tool-CttMka8Z.js.map} +1 -1
  56. package/package.json +13 -26
  57. package/dist/index-CpMbWdgn.js +0 -3092
  58. package/dist/index-CpMbWdgn.js.map +0 -1
  59. package/dist/timer-tool-BVE1shO1.js +0 -54
  60. package/dist/timer-tool-BVE1shO1.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -3,5 +3,6 @@ export { MailEditorElement } from './mail-editor.js';
3
3
  export { EditorStore } from './state/editor-store.js';
4
4
  export { ToolRegistry } from './tools/tool-registry.js';
5
5
  export type { LitToolDefinition } from './tools/tool-registry.js';
6
+ export { fromUnlayer, toUnlayer } from './compat/unlayer-adapter.js';
6
7
  export type { EmailDesign, DesignBody, DesignRow, DesignColumn, DesignContent, MailEditorConfig, ExportResult, ExportOptions, ToolDefinition, ToolPropertyGroup, ToolProperty, } from '@emabuild/types';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,YAAY,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAGrE,YAAY,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,8 +1,10 @@
1
- import { E as a, a as r, M as t, T as e } from "./index-CpMbWdgn.js";
1
+ import { E as r, a as t, M as E, T as e, f as s, t as l } from "./index-zy5NbC2E.js";
2
2
  export {
3
- a as EMABUILD_REGISTERED,
4
- r as EditorStore,
5
- t as MailEditorElement,
6
- e as ToolRegistry
3
+ r as EMABUILD_REGISTERED,
4
+ t as EditorStore,
5
+ E as MailEditorElement,
6
+ e as ToolRegistry,
7
+ s as fromUnlayer,
8
+ l as toUnlayer
7
9
  };
8
10
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { LitElement } from 'lit';
2
- import { EmailDesign, MailEditorConfig, ExportResult, ExportOptions, PropertyEditorDefinition, CustomTabDefinition } from '@emabuild/types';
2
+ import { EmailDesign, MailEditorConfig, MergeTagGroup, ExportResult, ExportOptions, PropertyEditorDefinition, CustomTabDefinition } from '@emabuild/types';
3
3
  import { LitToolDefinition } from './tools/tool-registry.js';
4
4
  export declare class MailEditorElement extends LitElement {
5
5
  static styles: import('lit').CSSResult;
@@ -9,12 +9,23 @@ export declare class MailEditorElement extends LitElement {
9
9
  private dragManager;
10
10
  private callbacks;
11
11
  private unsubscribe;
12
+ private sidebarCollapsed;
13
+ private a11yHasErrors;
14
+ private a11yHasWarnings;
15
+ private a11yHasInfos;
16
+ private a11yDebounceTimer;
17
+ private updateA11yState;
18
+ private toggleSidebar;
12
19
  connectedCallback(): void;
13
20
  firstUpdated(): void;
14
21
  private _handleKeydown;
15
22
  disconnectedCallback(): void;
16
23
  loadDesign(design: EmailDesign): void;
24
+ /** Load an Unlayer design JSON, converting it to Emabuild format */
25
+ loadUnlayerDesign(unlayerJson: Record<string, unknown>): void;
17
26
  saveDesign(callback: (design: EmailDesign) => void): void;
27
+ /** Save the design as Unlayer-compatible JSON */
28
+ saveUnlayerDesign(callback: (design: Record<string, unknown>) => void): void;
18
29
  exportHtml(callback: (result: ExportResult) => void, options?: ExportOptions): void;
19
30
  private doExport;
20
31
  exportHtmlAsync(options?: ExportOptions): Promise<ExportResult>;
@@ -22,7 +33,7 @@ export declare class MailEditorElement extends LitElement {
22
33
  registerPropertyEditor(_name: string, _editor: PropertyEditorDefinition): void;
23
34
  registerTab(_tab: CustomTabDefinition): void;
24
35
  registerCallback(type: string, callback: Function): void;
25
- setMergeTags(_tags: unknown[]): void;
36
+ setMergeTags(tags: MergeTagGroup[]): void;
26
37
  undo(): void;
27
38
  redo(): void;
28
39
  setBodyValues(values: Record<string, unknown>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"mail-editor.d.ts","sourceRoot":"","sources":["../src/mail-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAa,EAEb,wBAAwB,EACxB,mBAAmB,EAIpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMhF,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,gCAAgC,CAAC;AAExC,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,MAAM,CAAC,MAAM,0BAcX;IAE0B,OAAO,EAAE,gBAAgB,CAAM;IAE3D,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA6B;IAEhD,iBAAiB;IAQjB,YAAY;IAoBZ,OAAO,CAAC,cAAc,CA6BpB;IAEF,oBAAoB;IAYpB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIrC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIzD,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAuBnF,OAAO,CAAC,QAAQ;IAQV,eAAe,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrE,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAI9E,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAI5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIxD,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAIpC,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAIZ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQpD;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,YAAY;IAMpB,MAAM;CAgBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,iBAAiB,CAAC;KAClC;CACF"}
1
+ {"version":3,"file":"mail-editor.d.ts","sourceRoot":"","sources":["../src/mail-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EAEb,YAAY,EACZ,aAAa,EAEb,wBAAwB,EACxB,mBAAmB,EAIpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAOhF,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,gCAAgC,CAAC;AAExC,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,MAAM,CAAC,MAAM,0BAsIX;IAE0B,OAAO,EAAE,gBAAgB,CAAM;IAE3D,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA6B;IACvC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAEtC,OAAO,CAAC,iBAAiB,CAA8C;IAEvE,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,aAAa;IAMrB,iBAAiB;IAQjB,YAAY;IAwBZ,OAAO,CAAC,cAAc,CA6BpB;IAEF,oBAAoB;IAYpB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIrC,oEAAoE;IACpE,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI7D,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIzD,iDAAiD;IACjD,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI;IAI5E,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAuBnF,OAAO,CAAC,QAAQ;IAQV,eAAe,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrE,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAI9E,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAI5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIxD,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI;IAIzC,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAIZ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQpD;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,YAAY;IAapB,MAAM;CA+BP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,iBAAiB,CAAC;KAClC;CACF"}
@@ -1,6 +1,6 @@
1
- import { html as p } from "lit";
2
- import { s as e, j as g, e as m } from "./index-CpMbWdgn.js";
3
- const i = [
1
+ import { html as d } from "lit";
2
+ import { s as e, j as f, e as m } from "./index-zy5NbC2E.js";
3
+ const n = [
4
4
  { text: "Home", href: "#" },
5
5
  { text: "About", href: "#" },
6
6
  { text: "Contact", href: "#" }
@@ -13,7 +13,7 @@ const i = [
13
13
  options: {
14
14
  menu: {
15
15
  title: "Menu",
16
- options: { items: { label: "Items (JSON)", defaultValue: JSON.stringify(i), widget: "rich_text" } }
16
+ options: { items: { label: "Items (JSON)", defaultValue: JSON.stringify(n), widget: "rich_text" } }
17
17
  },
18
18
  style: {
19
19
  title: "Style",
@@ -31,7 +31,7 @@ const i = [
31
31
  }
32
32
  },
33
33
  defaultValues: {
34
- items: JSON.stringify(i),
34
+ items: JSON.stringify(n),
35
35
  textAlign: "center",
36
36
  fontSize: "14px",
37
37
  color: "#333333",
@@ -41,21 +41,22 @@ const i = [
41
41
  },
42
42
  renderer: {
43
43
  renderEditor(t) {
44
- const d = e(t, "containerPadding", "10px"), o = e(t, "textAlign", "center"), a = e(t, "fontSize", "14px"), l = e(t, "color", "#333333"), c = e(t, "separator", "|"), s = e(t, "separatorColor", "#cccccc"), x = g(t.items, i);
45
- return p`
46
- <div style="text-align:${o};font-size:${a};font-family:arial,sans-serif;">
47
- ${x.map((n, r) => p`${r > 0 ? p`<span style="color:${s};padding:0 8px;">${c}</span>` : ""}
48
- <a href=${n.href} style="color:${l};text-decoration:none;">${n.text}</a>`)}
44
+ e(t, "containerPadding", "10px");
45
+ const r = e(t, "textAlign", "center"), o = e(t, "fontSize", "14px"), i = e(t, "color", "#333333"), a = e(t, "separator", "|"), l = e(t, "separatorColor", "#cccccc"), c = f(t.items, n);
46
+ return d`
47
+ <div style="text-align:${r};font-size:${o};font-family:arial,sans-serif;">
48
+ ${c.map((s, p) => d`${p > 0 ? d`<span style="color:${l};padding:0 8px;">${a}</span>` : ""}
49
+ <a href=${s.href} style="color:${i};text-decoration:none;">${s.text}</a>`)}
49
50
  </div>
50
51
  `;
51
52
  },
52
53
  renderHtml(t) {
53
- const d = e(t, "containerPadding", "10px"), o = e(t, "textAlign", "center"), a = e(t, "fontSize", "14px"), l = e(t, "color", "#333333"), c = e(t, "separator", "|"), s = e(t, "separatorColor", "#cccccc"), n = g(t.items, i).map((r, f) => `${f > 0 ? `<span style="color:${s};padding:0 8px;">${c}</span>` : ""}<a href="${r.href}" target="_blank" style="color:${l};text-decoration:none;font-family:arial,helvetica,sans-serif;font-size:${a};">${r.text}</a>`).join("");
54
- return m(`<div style="text-align:${o};">${n}</div>`, { padding: d, align: o });
54
+ const r = e(t, "containerPadding", "10px"), o = e(t, "textAlign", "center"), i = e(t, "fontSize", "14px"), a = e(t, "color", "#333333"), l = e(t, "separator", "|"), c = e(t, "separatorColor", "#cccccc"), p = f(t.items, n).map((x, g) => `${g > 0 ? `<span style="color:${c};padding:0 8px;">${l}</span>` : ""}<a href="${x.href}" target="_blank" style="color:${a};text-decoration:none;font-family:arial,helvetica,sans-serif;font-size:${i};">${x.text}</a>`).join("");
55
+ return m(`<div style="text-align:${o};">${p}</div>`, { padding: r, align: o });
55
56
  }
56
57
  }
57
58
  };
58
59
  export {
59
60
  h as menuTool
60
61
  };
61
- //# sourceMappingURL=menu-tool-CJcQdpcP.js.map
62
+ //# sourceMappingURL=menu-tool-Cu5D_VYs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu-tool-CJcQdpcP.js","sources":["../src/tools/built-in/menu-tool.ts"],"sourcesContent":["/**\n * @module menu-tool\n *\n * Horizontal navigation menu with separator characters.\n *\n * Email compatibility: Uses inline `<a>` tags with text separators.\n * All styles are inline for cross-client rendering.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { MenuItem } from '../helpers/types.js';\n\nconst DEFAULT_ITEMS: MenuItem[] = [\n { text: 'Home', href: '#' },\n { text: 'About', href: '#' },\n { text: 'Contact', href: '#' },\n];\n\nexport const menuTool: LitToolDefinition = {\n name: 'menu',\n label: 'Menu',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 9,\n options: {\n menu: {\n title: 'Menu',\n options: { items: { label: 'Items (JSON)', defaultValue: JSON.stringify(DEFAULT_ITEMS), widget: 'rich_text' } },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n color: { label: 'Text Color', defaultValue: '#333333', widget: 'color_picker' },\n separator: { label: 'Separator', defaultValue: '|', widget: 'text' },\n separatorColor: { label: 'Separator Color', defaultValue: '#cccccc', widget: 'color_picker' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n items: JSON.stringify(DEFAULT_ITEMS), textAlign: 'center', fontSize: '14px',\n color: '#333333', separator: '|', separatorColor: '#cccccc', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n return html`\n <div style=\"text-align:${align};font-size:${fontSize};font-family:arial,sans-serif;\">\n ${items.map((item, i) => html`${i > 0 ? html`<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : ''}\n <a href=${item.href} style=\"color:${color};text-decoration:none;\">${item.text}</a>`)}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n const links = items.map((item, i) => {\n const prefix = i > 0 ? `<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : '';\n return `${prefix}<a href=\"${item.href}\" target=\"_blank\" style=\"color:${color};text-decoration:none;font-family:arial,helvetica,sans-serif;font-size:${fontSize};\">${item.text}</a>`;\n }).join('');\n\n return emailTableCell(`<div style=\"text-align:${align};\">${links}</div>`, { padding, align });\n },\n },\n};\n"],"names":["DEFAULT_ITEMS","menuTool","values","padding","str","align","fontSize","color","sep","sepColor","items","jsonParse","html","item","i","links","emailTableCell"],"mappings":"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"}
1
+ {"version":3,"file":"menu-tool-Cu5D_VYs.js","sources":["../src/tools/built-in/menu-tool.ts"],"sourcesContent":["/**\n * @module menu-tool\n *\n * Horizontal navigation menu with separator characters.\n *\n * Email compatibility: Uses inline `<a>` tags with text separators.\n * All styles are inline for cross-client rendering.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { MenuItem } from '../helpers/types.js';\n\nconst DEFAULT_ITEMS: MenuItem[] = [\n { text: 'Home', href: '#' },\n { text: 'About', href: '#' },\n { text: 'Contact', href: '#' },\n];\n\nexport const menuTool: LitToolDefinition = {\n name: 'menu',\n label: 'Menu',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 9,\n options: {\n menu: {\n title: 'Menu',\n options: { items: { label: 'Items (JSON)', defaultValue: JSON.stringify(DEFAULT_ITEMS), widget: 'rich_text' } },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n color: { label: 'Text Color', defaultValue: '#333333', widget: 'color_picker' },\n separator: { label: 'Separator', defaultValue: '|', widget: 'text' },\n separatorColor: { label: 'Separator Color', defaultValue: '#cccccc', widget: 'color_picker' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n items: JSON.stringify(DEFAULT_ITEMS), textAlign: 'center', fontSize: '14px',\n color: '#333333', separator: '|', separatorColor: '#cccccc', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n return html`\n <div style=\"text-align:${align};font-size:${fontSize};font-family:arial,sans-serif;\">\n ${items.map((item, i) => html`${i > 0 ? html`<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : ''}\n <a href=${item.href} style=\"color:${color};text-decoration:none;\">${item.text}</a>`)}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n const links = items.map((item, i) => {\n const prefix = i > 0 ? `<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : '';\n return `${prefix}<a href=\"${item.href}\" target=\"_blank\" style=\"color:${color};text-decoration:none;font-family:arial,helvetica,sans-serif;font-size:${fontSize};\">${item.text}</a>`;\n }).join('');\n\n return emailTableCell(`<div style=\"text-align:${align};\">${links}</div>`, { padding, align });\n },\n },\n};\n"],"names":["DEFAULT_ITEMS","menuTool","values","str","align","fontSize","color","sep","sepColor","items","jsonParse","html","item","i","padding","links","emailTableCell"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"property-panel.d.ts","sourceRoot":"","sources":["../../src/properties/property-panel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,0BAiCX;IAEF,OAAO,CAAC,SAAS,CAAsD;IAEvE,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1B,YAAY,EAAG,YAAY,CAAC;IAE5D,8EAA8E;IAC9E,OAAO,CAAC,QAAQ;IAMhB,MAAM;IAyBN,OAAO,CAAC,WAAW;IAanB,kFAAkF;IAClF,OAAO,CAAC,YAAY;CAgBrB"}
1
+ {"version":3,"file":"property-panel.d.ts","sourceRoot":"","sources":["../../src/properties/property-panel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAQ9D,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,0BA6EX;IAEF,OAAO,CAAC,SAAS,CAAsD;IAEvE,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1B,YAAY,EAAG,YAAY,CAAC;IAE5D,8EAA8E;IAC9E,OAAO,CAAC,QAAQ;IAMhB,MAAM;IAuBN,OAAO,CAAC,WAAW;IAanB,kFAAkF;IAClF,OAAO,CAAC,YAAY;CAgBrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"register-elements.d.ts","sourceRoot":"","sources":["../src/register-elements.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH,eAAO,MAAM,mBAAmB,SAAkD,CAAC"}
1
+ {"version":3,"file":"register-elements.d.ts","sourceRoot":"","sources":["../src/register-elements.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,eAAO,MAAM,mBAAmB,SAAkD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { LitElement } from 'lit';
2
+ import { EditorStore } from '../state/editor-store.js';
3
+ import { ToolRegistry } from '../tools/tool-registry.js';
4
+ export interface A11yIssue {
5
+ severity: 'error' | 'warning' | 'info';
6
+ rule: string;
7
+ message: string;
8
+ element?: string;
9
+ elementId?: string;
10
+ }
11
+ export declare class A11yChecker extends LitElement {
12
+ static styles: import('lit').CSSResult;
13
+ private storeCtrl;
14
+ set store(s: EditorStore);
15
+ get store(): EditorStore;
16
+ toolRegistry: ToolRegistry;
17
+ private checkAccessibility;
18
+ private handleIssueClick;
19
+ private handleIssueHover;
20
+ private handleFixPreheader;
21
+ private handleFixHeading;
22
+ render(): import('lit').TemplateResult<1>;
23
+ private renderIssue;
24
+ }
25
+ /** Standalone a11y check — used by both the A11yChecker component and the sidebar tab badge */
26
+ export declare function checkA11y(store: EditorStore): A11yIssue[];
27
+ //# sourceMappingURL=a11y-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-checker.d.ts","sourceRoot":"","sources":["../../src/sidebar/a11y-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8ED,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAsGX;IAEF,OAAO,CAAC,SAAS,CAAyC;IAE1D,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1B,YAAY,EAAG,YAAY,CAAC;IAE5D,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,gBAAgB;IAWxB,MAAM;IA6CN,OAAO,CAAC,WAAW;CAmBpB;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,CA4HzD"}
@@ -5,6 +5,8 @@ export declare class BodySettings extends LitElement {
5
5
  private storeCtrl;
6
6
  set store(s: EditorStore);
7
7
  get store(): EditorStore;
8
+ /** Scroll to preheader field, focus it, and pulse highlight */
9
+ highlightPreheader(): void;
8
10
  private update_;
9
11
  private updateLinkStyle;
10
12
  private updateFontFamily;
@@ -1 +1 @@
1
- {"version":3,"file":"body-settings.d.ts","sourceRoot":"","sources":["../../src/sidebar/body-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA0B5D,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BAwBX;IAEF,OAAO,CAAC,SAAS,CAAyC;IAE1D,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1D,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAkBxB,MAAM;IAwDN,gDAAgD;IAChD,OAAO,CAAC,gBAAgB;CAWzB"}
1
+ {"version":3,"file":"body-settings.d.ts","sourceRoot":"","sources":["../../src/sidebar/body-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA0B5D,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BAgCX;IAEF,OAAO,CAAC,SAAS,CAAyC;IAE1D,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1D,+DAA+D;IAC/D,kBAAkB;IAWlB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAkBxB,MAAM;IAwDN,gDAAgD;IAChD,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -7,13 +7,16 @@ export declare class EditorSidebar extends LitElement {
7
7
  set store(s: EditorStore);
8
8
  get store(): EditorStore;
9
9
  toolRegistry: ToolRegistry;
10
+ private searchQuery;
11
+ private getA11ySeverities;
10
12
  private handleDragStart;
11
13
  private handleLayoutDragStart;
12
14
  private addRowWithLayout;
13
15
  render(): import('lit').TemplateResult<1>;
14
- private renderContentTab;
16
+ private renderElementsTab;
17
+ private renderA11yBadge;
18
+ private renderToolItem;
15
19
  private renderLayoutOption;
16
- private renderBlocksTab;
17
20
  private renderBodyTab;
18
21
  }
19
22
  //# sourceMappingURL=editor-sidebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-sidebar.d.ts","sourceRoot":"","sources":["../../src/sidebar/editor-sidebar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAmC,MAAM,2BAA2B,CAAC;AAG/F,OAAO,oBAAoB,CAAC;AAE5B,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,0BAqIX;IAEF,OAAO,CAAC,SAAS,CAA4C;IAE7D,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1B,YAAY,EAAG,YAAY,CAAC;IAE5D,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAKxB,MAAM;IAmBN,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;CAGtB"}
1
+ {"version":3,"file":"editor-sidebar.d.ts","sourceRoot":"","sources":["../../src/sidebar/editor-sidebar.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,2BAA2B,CAAC;AAG5E,OAAO,oBAAoB,CAAC;AAW5B,qBACa,aAAc,SAAQ,UAAU;IAC3C,MAAM,CAAC,MAAM,0BA4JX;IAEF,OAAO,CAAC,SAAS,CAAsD;IAEvE,IACI,KAAK,CAAC,CAAC,EAAE,WAAW,EAAiC;IACzD,IAAI,KAAK,IAAI,WAAW,CAAkC;IAE1B,YAAY,EAAG,YAAY,CAAC;IAEnD,OAAO,CAAC,WAAW,CAAM;IAElC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAKxB,MAAM;IAmBN,OAAO,CAAC,iBAAiB;IA8EzB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,aAAa;CAGtB"}
@@ -1,5 +1,5 @@
1
- import { html as s } from "lit";
2
- import { s as t, j as g, e as x } from "./index-CpMbWdgn.js";
1
+ import { html as d } from "lit";
2
+ import { s as i, j as s, e as x } from "./index-zy5NbC2E.js";
3
3
  const l = [
4
4
  { name: "Facebook", url: "https://facebook.com/", icon: "f", color: "#1877F2" },
5
5
  { name: "Twitter", url: "https://twitter.com/", icon: "𝕏", color: "#000000" },
@@ -38,25 +38,26 @@ const l = [
38
38
  },
39
39
  renderer: {
40
40
  renderEditor(n) {
41
- const r = t(n, "containerPadding", "10px"), o = t(n, "textAlign", "center"), i = t(n, "iconSize", "32px"), c = t(n, "iconSpacing", "8px"), d = g(n.icons, l);
42
- return s`
43
- <div style="text-align:${o};">
44
- ${d.map((e) => s`
45
- <a href=${e.url} target="_blank" style="display:inline-block;width:${i};height:${i};line-height:${i};text-align:center;background:${e.color};color:white;border-radius:50%;text-decoration:none;font-size:14px;font-weight:bold;margin:0 ${c};font-family:arial,sans-serif;vertical-align:middle;">${e.icon}</a>
41
+ i(n, "containerPadding", "10px");
42
+ const c = i(n, "textAlign", "center"), e = i(n, "iconSize", "32px"), t = i(n, "iconSpacing", "8px"), a = s(n.icons, l);
43
+ return d`
44
+ <div style="text-align:${c};">
45
+ ${a.map((o) => d`
46
+ <a href=${o.url} target="_blank" style="display:inline-block;width:${e};height:${e};line-height:${e};text-align:center;background:${o.color};color:white;border-radius:50%;text-decoration:none;font-size:14px;font-weight:bold;margin:0 ${t};font-family:arial,sans-serif;vertical-align:middle;">${o.icon}</a>
46
47
  `)}
47
48
  </div>
48
49
  `;
49
50
  },
50
51
  renderHtml(n) {
51
- const r = t(n, "containerPadding", "10px"), o = t(n, "textAlign", "center"), i = t(n, "iconSize", "32"), c = t(n, "iconSpacing", "8px"), e = g(n.icons, l).map(
52
- (a) => `<td align="center" valign="middle" style="padding:0 ${c};"><a href="${a.url}" target="_blank" style="text-decoration:none;"><table role="presentation" cellpadding="0" cellspacing="0" border="0"><tr><td width="${i}" height="${i}" align="center" valign="middle" style="width:${i}px;height:${i}px;background:${a.color};border-radius:50%;color:#fff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;">${a.icon}</td></tr></table></a></td>`
52
+ const c = i(n, "containerPadding", "10px"), e = i(n, "textAlign", "center"), t = i(n, "iconSize", "32"), a = i(n, "iconSpacing", "8px"), g = s(n.icons, l).map(
53
+ (r) => `<td align="center" valign="middle" style="padding:0 ${a};"><a href="${r.url}" target="_blank" style="text-decoration:none;"><table role="presentation" cellpadding="0" cellspacing="0" border="0"><tr><td width="${t}" height="${t}" align="center" valign="middle" style="width:${t}px;height:${t}px;background:${r.color};border-radius:50%;color:#fff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;">${r.icon}</td></tr></table></a></td>`
53
54
  ).join(`
54
- `), p = `<table role="presentation" cellpadding="0" cellspacing="0" border="0" align="${o}"><tr>${e}</tr></table>`;
55
- return x(p, { padding: r, align: o });
55
+ `), p = `<table role="presentation" cellpadding="0" cellspacing="0" border="0" align="${e}"><tr>${g}</tr></table>`;
56
+ return x(p, { padding: c, align: e });
56
57
  }
57
58
  }
58
59
  };
59
60
  export {
60
61
  h as socialTool
61
62
  };
62
- //# sourceMappingURL=social-tool-CRY3-_sU.js.map
63
+ //# sourceMappingURL=social-tool-kPuP-4n6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"social-tool-CRY3-_sU.js","sources":["../src/tools/built-in/social-tool.ts"],"sourcesContent":["/**\n * @module social-tool\n *\n * Social media icon links (Facebook, Twitter, Instagram, LinkedIn, etc.).\n *\n * Email compatibility: Uses nested tables for icon layout.\n * Each icon is a colored circle with centered text, rendered\n * as a table cell for cross-client consistency.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { SocialIcon } from '../helpers/types.js';\n\nconst DEFAULT_ICONS: SocialIcon[] = [\n { name: 'Facebook', url: 'https://facebook.com/', icon: 'f', color: '#1877F2' },\n { name: 'Twitter', url: 'https://twitter.com/', icon: '𝕏', color: '#000000' },\n { name: 'Instagram', url: 'https://instagram.com/', icon: '📷', color: '#E4405F' },\n { name: 'LinkedIn', url: 'https://linkedin.com/', icon: 'in', color: '#0A66C2' },\n];\n\nexport const socialTool: LitToolDefinition = {\n name: 'social',\n label: 'Social',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"12\" r=\"3\"/><circle cx=\"18\" cy=\"19\" r=\"3\"/><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 8,\n options: {\n icons: {\n title: 'Social Icons',\n options: {\n icons: { label: 'Icons (JSON)', defaultValue: JSON.stringify(DEFAULT_ICONS), widget: 'rich_text' },\n iconSize: { label: 'Icon Size', defaultValue: '32px', widget: 'text' },\n iconSpacing: { label: 'Spacing', defaultValue: '8px', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: { textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' } },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n icons: JSON.stringify(DEFAULT_ICONS), iconSize: '32px', iconSpacing: '8px',\n textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32px');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n return html`\n <div style=\"text-align:${align};\">\n ${icons.map((s) => html`\n <a href=${s.url} target=\"_blank\" style=\"display:inline-block;width:${iconSize};height:${iconSize};line-height:${iconSize};text-align:center;background:${s.color};color:white;border-radius:50%;text-decoration:none;font-size:14px;font-weight:bold;margin:0 ${spacing};font-family:arial,sans-serif;vertical-align:middle;\">${s.icon}</a>\n `)}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n const cells = icons.map((s) =>\n `<td align=\"center\" valign=\"middle\" style=\"padding:0 ${spacing};\"><a href=\"${s.url}\" target=\"_blank\" style=\"text-decoration:none;\"><table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"${iconSize}\" height=\"${iconSize}\" align=\"center\" valign=\"middle\" style=\"width:${iconSize}px;height:${iconSize}px;background:${s.color};border-radius:50%;color:#fff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;\">${s.icon}</td></tr></table></a></td>`\n ).join('\\n');\n\n const inner = `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"${align}\"><tr>${cells}</tr></table>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n"],"names":["DEFAULT_ICONS","socialTool","values","padding","str","align","iconSize","spacing","icons","jsonParse","html","s","cells","inner","emailTableCell"],"mappings":";;AAiBA,MAAMA,IAA8B;AAAA,EAClC,EAAE,MAAM,YAAY,KAAK,yBAAyB,MAAM,KAAK,OAAO,UAAA;AAAA,EACpE,EAAE,MAAM,WAAW,KAAK,wBAAwB,MAAM,MAAM,OAAO,UAAA;AAAA,EACnE,EAAE,MAAM,aAAa,KAAK,0BAA0B,MAAM,MAAM,OAAO,UAAA;AAAA,EACvE,EAAE,MAAM,YAAY,KAAK,yBAAyB,MAAM,MAAM,OAAO,UAAA;AACvE,GAEaC,IAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,uBAAuB,CAAC,SAAS,KAAK;AAAA,EACtC,UAAU;AAAA,EACV,SAAS;AAAA,IACP,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,QACP,OAAO,EAAE,OAAO,gBAAgB,cAAc,KAAK,UAAUD,CAAa,GAAG,QAAQ,YAAA;AAAA,QACrF,UAAU,EAAE,OAAO,aAAa,cAAc,QAAQ,QAAQ,OAAA;AAAA,QAC9D,aAAa,EAAE,OAAO,WAAW,cAAc,OAAO,QAAQ,OAAA;AAAA,MAAO;AAAA,IACvE;AAAA,IAEF,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS,EAAE,WAAW,EAAE,OAAO,SAAS,cAAc,UAAU,QAAQ,YAAA,EAAY;AAAA,IAAE;AAAA,IAExF,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS,EAAE,kBAAkB,EAAE,OAAO,WAAW,cAAc,QAAQ,QAAQ,UAAA,EAAU;AAAA,IAAE;AAAA,EAC7F;AAAA,EAEF,eAAe;AAAA,IACb,OAAO,KAAK,UAAUA,CAAa;AAAA,IAAG,UAAU;AAAA,IAAQ,aAAa;AAAA,IACrE,WAAW;AAAA,IAAU,kBAAkB;AAAA,EAAA;AAAA,EAEzC,UAAU;AAAA,IACR,aAAaE,GAAuC;AAClD,YAAMC,IAAUC,EAAIF,GAAQ,oBAAoB,MAAM,GAChDG,IAAQD,EAAIF,GAAQ,aAAa,QAAQ,GACzCI,IAAWF,EAAIF,GAAQ,YAAY,MAAM,GACzCK,IAAUH,EAAIF,GAAQ,eAAe,KAAK,GAC1CM,IAAQC,EAAwBP,EAAO,OAAOF,CAAa;AAEjE,aAAOU;AAAA,iCACoBL,CAAK;AAAA,YAC1BG,EAAM,IAAI,CAACG,MAAMD;AAAA,sBACPC,EAAE,GAAG,sDAAsDL,CAAQ,WAAWA,CAAQ,gBAAgBA,CAAQ,iCAAiCK,EAAE,KAAK,gGAAgGJ,CAAO,yDAAyDI,EAAE,IAAI;AAAA,WACvU,CAAC;AAAA;AAAA;AAAA,IAGR;AAAA,IACA,WAAWT,GAA+B;AACxC,YAAMC,IAAUC,EAAIF,GAAQ,oBAAoB,MAAM,GAChDG,IAAQD,EAAIF,GAAQ,aAAa,QAAQ,GACzCI,IAAWF,EAAIF,GAAQ,YAAY,IAAI,GACvCK,IAAUH,EAAIF,GAAQ,eAAe,KAAK,GAG1CU,IAFQH,EAAwBP,EAAO,OAAOF,CAAa,EAE7C;AAAA,QAAI,CAACW,MACvB,uDAAuDJ,CAAO,eAAeI,EAAE,GAAG,wIAAwIL,CAAQ,aAAaA,CAAQ,iDAAiDA,CAAQ,aAAaA,CAAQ,iBAAiBK,EAAE,KAAK,gGAAgGA,EAAE,IAAI;AAAA,MAAA,EACnc,KAAK;AAAA,CAAI,GAELE,IAAQ,gFAAgFR,CAAK,SAASO,CAAK;AACjH,aAAOE,EAAeD,GAAO,EAAE,SAAAV,GAAS,OAAAE,GAAO;AAAA,IACjD;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"social-tool-kPuP-4n6.js","sources":["../src/tools/built-in/social-tool.ts"],"sourcesContent":["/**\n * @module social-tool\n *\n * Social media icon links (Facebook, Twitter, Instagram, LinkedIn, etc.).\n *\n * Email compatibility: Uses nested tables for icon layout.\n * Each icon is a colored circle with centered text, rendered\n * as a table cell for cross-client consistency.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { SocialIcon } from '../helpers/types.js';\n\nconst DEFAULT_ICONS: SocialIcon[] = [\n { name: 'Facebook', url: 'https://facebook.com/', icon: 'f', color: '#1877F2' },\n { name: 'Twitter', url: 'https://twitter.com/', icon: '𝕏', color: '#000000' },\n { name: 'Instagram', url: 'https://instagram.com/', icon: '📷', color: '#E4405F' },\n { name: 'LinkedIn', url: 'https://linkedin.com/', icon: 'in', color: '#0A66C2' },\n];\n\nexport const socialTool: LitToolDefinition = {\n name: 'social',\n label: 'Social',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"12\" r=\"3\"/><circle cx=\"18\" cy=\"19\" r=\"3\"/><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 8,\n options: {\n icons: {\n title: 'Social Icons',\n options: {\n icons: { label: 'Icons (JSON)', defaultValue: JSON.stringify(DEFAULT_ICONS), widget: 'rich_text' },\n iconSize: { label: 'Icon Size', defaultValue: '32px', widget: 'text' },\n iconSpacing: { label: 'Spacing', defaultValue: '8px', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: { textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' } },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n icons: JSON.stringify(DEFAULT_ICONS), iconSize: '32px', iconSpacing: '8px',\n textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32px');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n return html`\n <div style=\"text-align:${align};\">\n ${icons.map((s) => html`\n <a href=${s.url} target=\"_blank\" style=\"display:inline-block;width:${iconSize};height:${iconSize};line-height:${iconSize};text-align:center;background:${s.color};color:white;border-radius:50%;text-decoration:none;font-size:14px;font-weight:bold;margin:0 ${spacing};font-family:arial,sans-serif;vertical-align:middle;\">${s.icon}</a>\n `)}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n const cells = icons.map((s) =>\n `<td align=\"center\" valign=\"middle\" style=\"padding:0 ${spacing};\"><a href=\"${s.url}\" target=\"_blank\" style=\"text-decoration:none;\"><table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"${iconSize}\" height=\"${iconSize}\" align=\"center\" valign=\"middle\" style=\"width:${iconSize}px;height:${iconSize}px;background:${s.color};border-radius:50%;color:#fff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;\">${s.icon}</td></tr></table></a></td>`\n ).join('\\n');\n\n const inner = `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"${align}\"><tr>${cells}</tr></table>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n"],"names":["DEFAULT_ICONS","socialTool","values","str","align","iconSize","spacing","icons","jsonParse","html","s","padding","cells","inner","emailTableCell"],"mappings":";;AAiBA,MAAMA,IAA8B;AAAA,EAClC,EAAE,MAAM,YAAY,KAAK,yBAAyB,MAAM,KAAK,OAAO,UAAA;AAAA,EACpE,EAAE,MAAM,WAAW,KAAK,wBAAwB,MAAM,MAAM,OAAO,UAAA;AAAA,EACnE,EAAE,MAAM,aAAa,KAAK,0BAA0B,MAAM,MAAM,OAAO,UAAA;AAAA,EACvE,EAAE,MAAM,YAAY,KAAK,yBAAyB,MAAM,MAAM,OAAO,UAAA;AACvE,GAEaC,IAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,uBAAuB,CAAC,SAAS,KAAK;AAAA,EACtC,UAAU;AAAA,EACV,SAAS;AAAA,IACP,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,QACP,OAAO,EAAE,OAAO,gBAAgB,cAAc,KAAK,UAAUD,CAAa,GAAG,QAAQ,YAAA;AAAA,QACrF,UAAU,EAAE,OAAO,aAAa,cAAc,QAAQ,QAAQ,OAAA;AAAA,QAC9D,aAAa,EAAE,OAAO,WAAW,cAAc,OAAO,QAAQ,OAAA;AAAA,MAAO;AAAA,IACvE;AAAA,IAEF,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS,EAAE,WAAW,EAAE,OAAO,SAAS,cAAc,UAAU,QAAQ,YAAA,EAAY;AAAA,IAAE;AAAA,IAExF,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS,EAAE,kBAAkB,EAAE,OAAO,WAAW,cAAc,QAAQ,QAAQ,UAAA,EAAU;AAAA,IAAE;AAAA,EAC7F;AAAA,EAEF,eAAe;AAAA,IACb,OAAO,KAAK,UAAUA,CAAa;AAAA,IAAG,UAAU;AAAA,IAAQ,aAAa;AAAA,IACrE,WAAW;AAAA,IAAU,kBAAkB;AAAA,EAAA;AAAA,EAEzC,UAAU;AAAA,IACR,aAAaE,GAAuC;AAClC,MAAAC,EAAID,GAAQ,oBAAoB,MAAM;AACtD,YAAME,IAAQD,EAAID,GAAQ,aAAa,QAAQ,GACzCG,IAAWF,EAAID,GAAQ,YAAY,MAAM,GACzCI,IAAUH,EAAID,GAAQ,eAAe,KAAK,GAC1CK,IAAQC,EAAwBN,EAAO,OAAOF,CAAa;AAEjE,aAAOS;AAAA,iCACoBL,CAAK;AAAA,YAC1BG,EAAM,IAAI,CAACG,MAAMD;AAAA,sBACPC,EAAE,GAAG,sDAAsDL,CAAQ,WAAWA,CAAQ,gBAAgBA,CAAQ,iCAAiCK,EAAE,KAAK,gGAAgGJ,CAAO,yDAAyDI,EAAE,IAAI;AAAA,WACvU,CAAC;AAAA;AAAA;AAAA,IAGR;AAAA,IACA,WAAWR,GAA+B;AACxC,YAAMS,IAAUR,EAAID,GAAQ,oBAAoB,MAAM,GAChDE,IAAQD,EAAID,GAAQ,aAAa,QAAQ,GACzCG,IAAWF,EAAID,GAAQ,YAAY,IAAI,GACvCI,IAAUH,EAAID,GAAQ,eAAe,KAAK,GAG1CU,IAFQJ,EAAwBN,EAAO,OAAOF,CAAa,EAE7C;AAAA,QAAI,CAACU,MACvB,uDAAuDJ,CAAO,eAAeI,EAAE,GAAG,wIAAwIL,CAAQ,aAAaA,CAAQ,iDAAiDA,CAAQ,aAAaA,CAAQ,iBAAiBK,EAAE,KAAK,gGAAgGA,EAAE,IAAI;AAAA,MAAA,EACnc,KAAK;AAAA,CAAI,GAELG,IAAQ,gFAAgFT,CAAK,SAASQ,CAAK;AACjH,aAAOE,EAAeD,GAAO,EAAE,SAAAF,GAAS,OAAAP,GAAO;AAAA,IACjD;AAAA,EAAA;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { EmailDesign, DesignBody, DesignRow, DesignColumn, DesignContent, BodyValues, RowValues, ColumnValues, ContentValues } from '@emabuild/types';
1
+ import { EmailDesign, DesignBody, DesignRow, DesignColumn, DesignContent, BodyValues, RowValues, ColumnValues, ContentValues, MergeTagGroup } from '@emabuild/types';
2
2
  import { EventEmitter } from '../utils/event-emitter.js';
3
3
  export type StoreSubscriber = () => void;
4
4
  /**
@@ -17,19 +17,19 @@ export declare class EditorStore {
17
17
  private design;
18
18
  private history;
19
19
  private counterManager;
20
- /** Legacy: subscribers that listen to ALL changes */
21
- private subscribers;
22
20
  /** Channel-based subscribers: only notified on specific changes */
23
21
  private channelSubscribers;
24
22
  /** Public event emitter for design:loaded, design:updated, etc. */
25
23
  readonly events: EventEmitter;
24
+ private _mergeTags;
25
+ private _a11yIssueIds;
26
+ get a11yIssueIds(): Set<string>;
27
+ setA11yIssueIds(ids: Set<string>): void;
26
28
  private _selectedId;
27
29
  private _hoveredId;
28
30
  private _viewMode;
29
31
  private _activeTab;
30
32
  constructor();
31
- /** Subscribe to ALL state changes (legacy). Returns an unsubscribe function. */
32
- subscribe(fn: StoreSubscriber): () => void;
33
33
  /**
34
34
  * Subscribe to specific channels only. The callback is invoked only
35
35
  * when one of the listed channels fires. Returns an unsubscribe function.
@@ -41,9 +41,9 @@ export declare class EditorStore {
41
41
  * ```
42
42
  */
43
43
  subscribeChannels(channels: StoreChannel[], fn: StoreSubscriber): () => void;
44
- /** Notify legacy (all) subscribers */
45
- private notify;
46
- /** Notify only subscribers of specific channels + legacy subscribers */
44
+ /** @deprecated Use subscribeChannels instead */
45
+ subscribe(fn: StoreSubscriber): () => void;
46
+ /** Notify only subscribers of specific channels */
47
47
  private notifyChannels;
48
48
  /** Get the full design document */
49
49
  getDesign(): EmailDesign;
@@ -57,40 +57,42 @@ export declare class EditorStore {
57
57
  get hoveredId(): string | null;
58
58
  get viewMode(): 'desktop' | 'mobile';
59
59
  get activeTab(): string;
60
+ get mergeTags(): MergeTagGroup[];
60
61
  get canUndo(): boolean;
61
62
  get canRedo(): boolean;
62
63
  /** Load a design document, resetting history and selection */
63
64
  loadDesign(design: EmailDesign): void;
64
65
  undo(): void;
65
66
  redo(): void;
67
+ setMergeTags(tags: MergeTagGroup[]): void;
66
68
  select(id: string | null): void;
67
69
  hover(id: string | null): void;
68
70
  setViewMode(mode: 'desktop' | 'mobile'): void;
69
71
  setActiveTab(tab: string): void;
70
- /** Add a row at the given index (or at the end) */
71
- addRow(row: DesignRow, index?: number): void;
72
- /** Remove a row by ID */
73
- removeRow(rowId: string): void;
74
- /** Move a row from one index to another */
75
- moveRow(fromIndex: number, toIndex: number): void;
72
+ /** Add a row at the given index (or at the end). Returns the inserted row. */
73
+ addRow(row: DesignRow, index?: number): DesignRow;
74
+ /** Remove a row by ID. Returns true if removed. */
75
+ removeRow(rowId: string): boolean;
76
+ /** Move a row from one index to another. Returns true if moved. */
77
+ moveRow(fromIndex: number, toIndex: number): boolean;
76
78
  /** Duplicate a row, assigning fresh IDs to all nested elements */
77
- duplicateRow(rowId: string): void;
79
+ duplicateRow(rowId: string): DesignRow | undefined;
78
80
  /** Get the index of a row */
79
81
  getRowIndex(rowId: string): number;
80
- /** Update row-level values */
81
- updateRowValues(rowId: string, patch: Partial<RowValues>): void;
82
- /** Update column-level values */
83
- updateColumnValues(columnId: string, patch: Partial<ColumnValues>): void;
84
- /** Add content to a column at the given index */
85
- addContent(columnId: string, content: DesignContent, index?: number): void;
86
- /** Remove a content block by ID */
87
- removeContent(contentId: string): void;
88
- /** Update content values by ID */
89
- updateContentValues(contentId: string, patch: Partial<ContentValues>): void;
90
- /** Move a content block to a different column at a given index */
91
- moveContent(contentId: string, targetColumnId: string, targetIndex: number): void;
82
+ /** Update row-level values. Returns true if updated. */
83
+ updateRowValues(rowId: string, patch: Partial<RowValues>): boolean;
84
+ /** Update column-level values. Returns true if updated. */
85
+ updateColumnValues(columnId: string, patch: Partial<ColumnValues>): boolean;
86
+ /** Add content to a column at the given index. Returns the inserted content. */
87
+ addContent(columnId: string, content: DesignContent, index?: number): DesignContent | undefined;
88
+ /** Remove a content block by ID. Returns true if removed. */
89
+ removeContent(contentId: string): boolean;
90
+ /** Update content values by ID. Returns true if updated. */
91
+ updateContentValues(contentId: string, patch: Partial<ContentValues>): boolean;
92
+ /** Move a content block to a different column at a given index. Returns true if moved. */
93
+ moveContent(contentId: string, targetColumnId: string, targetIndex: number): boolean;
92
94
  /** Duplicate a content block, inserting the copy right after the original */
93
- duplicateContent(contentId: string): void;
95
+ duplicateContent(contentId: string): DesignContent | undefined;
94
96
  /** Update body-level values (background, fonts, etc.) */
95
97
  updateBodyValues(patch: Partial<BodyValues>): void;
96
98
  findRow(rowId: string): DesignRow | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"editor-store.d.ts","sourceRoot":"","sources":["../../src/state/editor-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor-store.d.ts","sourceRoot":"","sources":["../../src/state/editor-store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { html as i } from "lit";
2
- import { s as t, j as f, e as C } from "./index-CpMbWdgn.js";
3
- const n = [
1
+ import { html as n } from "lit";
2
+ import { s as t, j as g, e as C } from "./index-zy5NbC2E.js";
3
+ const s = [
4
4
  ["Header 1", "Header 2", "Header 3"],
5
5
  ["Cell 1", "Cell 2", "Cell 3"],
6
6
  ["Cell 4", "Cell 5", "Cell 6"]
@@ -13,7 +13,7 @@ const n = [
13
13
  options: {
14
14
  table: {
15
15
  title: "Table",
16
- options: { tableData: { label: "Table Data (JSON)", defaultValue: JSON.stringify(n), widget: "rich_text" } }
16
+ options: { tableData: { label: "Table Data (JSON)", defaultValue: JSON.stringify(s), widget: "rich_text" } }
17
17
  },
18
18
  style: {
19
19
  title: "Style",
@@ -31,7 +31,7 @@ const n = [
31
31
  }
32
32
  },
33
33
  defaultValues: {
34
- tableData: JSON.stringify(n),
34
+ tableData: JSON.stringify(s),
35
35
  headerBg: "#f3f4f6",
36
36
  headerColor: "#111827",
37
37
  borderColor: "#e5e7eb",
@@ -41,23 +41,24 @@ const n = [
41
41
  },
42
42
  renderer: {
43
43
  renderEditor(e) {
44
- const b = t(e, "containerPadding", "10px"), s = t(e, "headerBg", "#f3f4f6"), p = t(e, "headerColor", "#111827"), l = t(e, "borderColor", "#e5e7eb"), a = t(e, "cellPadding", "8px 12px"), r = t(e, "fontSize", "14px"), d = f(e.tableData, n);
45
- return i`
44
+ t(e, "containerPadding", "10px");
45
+ const p = t(e, "headerBg", "#f3f4f6"), c = t(e, "headerColor", "#111827"), d = t(e, "borderColor", "#e5e7eb"), l = t(e, "cellPadding", "8px 12px"), r = t(e, "fontSize", "14px"), a = g(e.tableData, s);
46
+ return n`
46
47
  <div style="overflow-x:auto;">
47
48
  <table style="width:100%;border-collapse:collapse;font-size:${r};font-family:arial,sans-serif;">
48
- <thead><tr>${d[0]?.map((o) => i`<th style="padding:${a};background:${s};color:${p};border:1px solid ${l};text-align:left;font-weight:600;">${o}</th>`)}</tr></thead>
49
- <tbody>${d.slice(1).map((o) => i`<tr>${o.map((c) => i`<td style="padding:${a};border:1px solid ${l};">${c}</td>`)}</tr>`)}</tbody>
49
+ <thead><tr>${a[0]?.map((o) => n`<th style="padding:${l};background:${p};color:${c};border:1px solid ${d};text-align:left;font-weight:600;">${o}</th>`)}</tr></thead>
50
+ <tbody>${a.slice(1).map((o) => n`<tr>${o.map((i) => n`<td style="padding:${l};border:1px solid ${d};">${i}</td>`)}</tr>`)}</tbody>
50
51
  </table>
51
52
  </div>
52
53
  `;
53
54
  },
54
55
  renderHtml(e) {
55
- const b = t(e, "containerPadding", "10px"), s = t(e, "headerBg", "#f3f4f6"), p = t(e, "headerColor", "#111827"), l = t(e, "borderColor", "#e5e7eb"), a = t(e, "cellPadding", "8px 12px"), r = t(e, "fontSize", "14px"), d = f(e.tableData, n), o = "font-family:arial,helvetica,sans-serif;", c = (d[0] || []).map((g) => `<th style="padding:${a};background-color:${s};color:${p};border:1px solid ${l};text-align:left;font-weight:600;${o}font-size:${r};">${g}</th>`).join(""), h = d.slice(1).map((g) => `<tr>${g.map(($) => `<td style="padding:${a};border:1px solid ${l};${o}font-size:${r};">${$}</td>`).join("")}</tr>`).join(""), x = `<table cellpadding="0" cellspacing="0" width="100%" border="0" style="border-collapse:collapse;"><thead><tr>${c}</tr></thead><tbody>${h}</tbody></table>`;
56
- return C(x, { padding: b });
56
+ const p = t(e, "containerPadding", "10px"), c = t(e, "headerBg", "#f3f4f6"), d = t(e, "headerColor", "#111827"), l = t(e, "borderColor", "#e5e7eb"), r = t(e, "cellPadding", "8px 12px"), a = t(e, "fontSize", "14px"), o = g(e.tableData, s), i = "font-family:arial,helvetica,sans-serif;", f = (o[0] || []).map((b) => `<th style="padding:${r};background-color:${c};color:${d};border:1px solid ${l};text-align:left;font-weight:600;${i}font-size:${a};">${b}</th>`).join(""), h = o.slice(1).map((b) => `<tr>${b.map(($) => `<td style="padding:${r};border:1px solid ${l};${i}font-size:${a};">${$}</td>`).join("")}</tr>`).join(""), x = `<table cellpadding="0" cellspacing="0" width="100%" border="0" style="border-collapse:collapse;"><thead><tr>${f}</tr></thead><tbody>${h}</tbody></table>`;
57
+ return C(x, { padding: p });
57
58
  }
58
59
  }
59
60
  };
60
61
  export {
61
62
  m as tableTool
62
63
  };
63
- //# sourceMappingURL=table-tool-DeIQci5z.js.map
64
+ //# sourceMappingURL=table-tool-CcWFvTSc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-tool-DeIQci5z.js","sources":["../src/tools/built-in/table-tool.ts"],"sourcesContent":["/**\n * @module table-tool\n *\n * Data table with configurable header styling and borders.\n *\n * Email compatibility: Uses standard HTML `<table>` with inline styles.\n * All borders, padding, and colors are inline for cross-client support.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\nconst DEFAULT_DATA = [\n ['Header 1', 'Header 2', 'Header 3'],\n ['Cell 1', 'Cell 2', 'Cell 3'],\n ['Cell 4', 'Cell 5', 'Cell 6'],\n];\n\nexport const tableTool: LitToolDefinition = {\n name: 'table',\n label: 'Table',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/><path d=\"M9 3v18\"/><path d=\"M15 3v18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 12,\n options: {\n table: {\n title: 'Table',\n options: { tableData: { label: 'Table Data (JSON)', defaultValue: JSON.stringify(DEFAULT_DATA), widget: 'rich_text' } },\n },\n style: {\n title: 'Style',\n options: {\n headerBg: { label: 'Header Background', defaultValue: '#f3f4f6', widget: 'color_picker' },\n headerColor: { label: 'Header Text Color', defaultValue: '#111827', widget: 'color_picker' },\n borderColor: { label: 'Border Color', defaultValue: '#e5e7eb', widget: 'color_picker' },\n cellPadding: { label: 'Cell Padding', defaultValue: '8px 12px', widget: 'text' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n tableData: JSON.stringify(DEFAULT_DATA), headerBg: '#f3f4f6', headerColor: '#111827',\n borderColor: '#e5e7eb', cellPadding: '8px 12px', fontSize: '14px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n\n return html`\n <div style=\"overflow-x:auto;\">\n <table style=\"width:100%;border-collapse:collapse;font-size:${fSize};font-family:arial,sans-serif;\">\n <thead><tr>${data[0]?.map((c) => html`<th style=\"padding:${cPad};background:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;\">${c}</th>`)}</tr></thead>\n <tbody>${data.slice(1).map((row) => html`<tr>${row.map((c) => html`<td style=\"padding:${cPad};border:1px solid ${bColor};\">${c}</td>`)}</tr>`)}</tbody>\n </table>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n const font = 'font-family:arial,helvetica,sans-serif;';\n\n const hCells = (data[0] || []).map((c) => `<th style=\"padding:${cPad};background-color:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;${font}font-size:${fSize};\">${c}</th>`).join('');\n const bRows = data.slice(1).map((row) => `<tr>${row.map((c) => `<td style=\"padding:${cPad};border:1px solid ${bColor};${font}font-size:${fSize};\">${c}</td>`).join('')}</tr>`).join('');\n const inner = `<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"border-collapse:collapse;\"><thead><tr>${hCells}</tr></thead><tbody>${bRows}</tbody></table>`;\n return emailTableCell(inner, { padding });\n },\n },\n};\n"],"names":["DEFAULT_DATA","tableTool","values","padding","str","hBg","hColor","bColor","cPad","fSize","data","jsonParse","html","c","row","font","hCells","bRows","inner","emailTableCell"],"mappings":"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"}
1
+ {"version":3,"file":"table-tool-CcWFvTSc.js","sources":["../src/tools/built-in/table-tool.ts"],"sourcesContent":["/**\n * @module table-tool\n *\n * Data table with configurable header styling and borders.\n *\n * Email compatibility: Uses standard HTML `<table>` with inline styles.\n * All borders, padding, and colors are inline for cross-client support.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\nconst DEFAULT_DATA = [\n ['Header 1', 'Header 2', 'Header 3'],\n ['Cell 1', 'Cell 2', 'Cell 3'],\n ['Cell 4', 'Cell 5', 'Cell 6'],\n];\n\nexport const tableTool: LitToolDefinition = {\n name: 'table',\n label: 'Table',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/><path d=\"M9 3v18\"/><path d=\"M15 3v18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 12,\n options: {\n table: {\n title: 'Table',\n options: { tableData: { label: 'Table Data (JSON)', defaultValue: JSON.stringify(DEFAULT_DATA), widget: 'rich_text' } },\n },\n style: {\n title: 'Style',\n options: {\n headerBg: { label: 'Header Background', defaultValue: '#f3f4f6', widget: 'color_picker' },\n headerColor: { label: 'Header Text Color', defaultValue: '#111827', widget: 'color_picker' },\n borderColor: { label: 'Border Color', defaultValue: '#e5e7eb', widget: 'color_picker' },\n cellPadding: { label: 'Cell Padding', defaultValue: '8px 12px', widget: 'text' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n tableData: JSON.stringify(DEFAULT_DATA), headerBg: '#f3f4f6', headerColor: '#111827',\n borderColor: '#e5e7eb', cellPadding: '8px 12px', fontSize: '14px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n\n return html`\n <div style=\"overflow-x:auto;\">\n <table style=\"width:100%;border-collapse:collapse;font-size:${fSize};font-family:arial,sans-serif;\">\n <thead><tr>${data[0]?.map((c) => html`<th style=\"padding:${cPad};background:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;\">${c}</th>`)}</tr></thead>\n <tbody>${data.slice(1).map((row) => html`<tr>${row.map((c) => html`<td style=\"padding:${cPad};border:1px solid ${bColor};\">${c}</td>`)}</tr>`)}</tbody>\n </table>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n const font = 'font-family:arial,helvetica,sans-serif;';\n\n const hCells = (data[0] || []).map((c) => `<th style=\"padding:${cPad};background-color:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;${font}font-size:${fSize};\">${c}</th>`).join('');\n const bRows = data.slice(1).map((row) => `<tr>${row.map((c) => `<td style=\"padding:${cPad};border:1px solid ${bColor};${font}font-size:${fSize};\">${c}</td>`).join('')}</tr>`).join('');\n const inner = `<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"border-collapse:collapse;\"><thead><tr>${hCells}</tr></thead><tbody>${bRows}</tbody></table>`;\n return emailTableCell(inner, { padding });\n },\n },\n};\n"],"names":["DEFAULT_DATA","tableTool","values","str","hBg","hColor","bColor","cPad","fSize","data","jsonParse","html","c","row","padding","font","hCells","bRows","inner","emailTableCell"],"mappings":"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"}