@emabuild/core 0.3.0 → 0.4.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 (33) hide show
  1. package/dist/canvas/column-renderer.d.ts.map +1 -1
  2. package/dist/canvas/content-renderer.d.ts.map +1 -1
  3. package/dist/canvas/editor-canvas.d.ts +2 -0
  4. package/dist/canvas/editor-canvas.d.ts.map +1 -1
  5. package/dist/canvas/row-renderer.d.ts.map +1 -1
  6. package/dist/{form-tool-C7760Hvm.js → form-tool-DsPgMShR.js} +2 -2
  7. package/dist/{form-tool-C7760Hvm.js.map → form-tool-DsPgMShR.js.map} +1 -1
  8. package/dist/{html-tool-4zZO2hqE.js → html-tool-BxhBGl4L.js} +2 -2
  9. package/dist/{html-tool-4zZO2hqE.js.map → html-tool-BxhBGl4L.js.map} +1 -1
  10. package/dist/{index-zy5NbC2E.js → index-2S5kBS5_.js} +302 -169
  11. package/dist/index-2S5kBS5_.js.map +1 -0
  12. package/dist/index.js +1 -1
  13. package/dist/mail-editor.d.ts.map +1 -1
  14. package/dist/{menu-tool-Cu5D_VYs.js → menu-tool-IZqYp8Vb.js} +2 -2
  15. package/dist/{menu-tool-Cu5D_VYs.js.map → menu-tool-IZqYp8Vb.js.map} +1 -1
  16. package/dist/properties/property-panel.d.ts.map +1 -1
  17. package/dist/properties/widgets/image-upload-widget.d.ts +4 -0
  18. package/dist/properties/widgets/image-upload-widget.d.ts.map +1 -0
  19. package/dist/properties/widgets/index.d.ts +1 -0
  20. package/dist/properties/widgets/index.d.ts.map +1 -1
  21. package/dist/sidebar/editor-sidebar.d.ts.map +1 -1
  22. package/dist/{social-tool-kPuP-4n6.js → social-tool-C1FeCyUm.js} +2 -2
  23. package/dist/{social-tool-kPuP-4n6.js.map → social-tool-C1FeCyUm.js.map} +1 -1
  24. package/dist/state/editor-store.d.ts +6 -1
  25. package/dist/state/editor-store.d.ts.map +1 -1
  26. package/dist/{table-tool-CcWFvTSc.js → table-tool-BD72-Fuj.js} +2 -2
  27. package/dist/{table-tool-CcWFvTSc.js.map → table-tool-BD72-Fuj.js.map} +1 -1
  28. package/dist/{timer-tool-CG1oul_Z.js → timer-tool-Dpw9p0uW.js} +2 -2
  29. package/dist/{timer-tool-CG1oul_Z.js.map → timer-tool-Dpw9p0uW.js.map} +1 -1
  30. package/dist/{video-tool-CttMka8Z.js → video-tool-CHhPfHaS.js} +2 -2
  31. package/dist/{video-tool-CttMka8Z.js.map → video-tool-CHhPfHaS.js.map} +1 -1
  32. package/package.json +26 -13
  33. package/dist/index-zy5NbC2E.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { E as r, a as t, M as E, T as e, f as s, t as l } from "./index-zy5NbC2E.js";
1
+ import { E as r, a as t, M as E, T as e, f as s, t as l } from "./index-2S5kBS5_.js";
2
2
  export {
3
3
  r as EMABUILD_REGISTERED,
4
4
  t as EditorStore,
@@ -1 +1 @@
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
+ {"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,CAoCpB;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;IAKxD,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,5 +1,5 @@
1
1
  import { html as d } from "lit";
2
- import { s as e, j as f, e as m } from "./index-zy5NbC2E.js";
2
+ import { s as e, j as f, e as m } from "./index-2S5kBS5_.js";
3
3
  const n = [
4
4
  { text: "Home", href: "#" },
5
5
  { text: "About", href: "#" },
@@ -59,4 +59,4 @@ const n = [
59
59
  export {
60
60
  h as menuTool
61
61
  };
62
- //# sourceMappingURL=menu-tool-Cu5D_VYs.js.map
62
+ //# sourceMappingURL=menu-tool-IZqYp8Vb.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"menu-tool-IZqYp8Vb.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,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
+ {"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;CAiBrB"}
@@ -0,0 +1,4 @@
1
+ import { TemplateResult } from 'lit';
2
+ /** Render an image URL input with optional upload button */
3
+ export declare function renderImageUpload(value: string, onChange: (v: string) => void, label: string, uploadCallback?: Function): TemplateResult;
4
+ //# sourceMappingURL=image-upload-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-upload-widget.d.ts","sourceRoot":"","sources":["../../../src/properties/widgets/image-upload-widget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAQ,cAAc,EAAW,MAAM,KAAK,CAAC;AAEpD,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC7B,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,QAAQ,GACxB,cAAc,CAgChB"}
@@ -6,4 +6,5 @@ export { renderToggle } from './toggle-widget.js';
6
6
  export { renderTextInput } from './text-input-widget.js';
7
7
  export { renderTextArea } from './textarea-widget.js';
8
8
  export { renderNumberUnit } from './number-unit-widget.js';
9
+ export { renderImageUpload } from './image-upload-widget.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/properties/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/properties/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1 +1 @@
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
+ {"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,0BAiKX;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
1
  import { html as d } from "lit";
2
- import { s as i, j as s, e as x } from "./index-zy5NbC2E.js";
2
+ import { s as i, j as s, e as x } from "./index-2S5kBS5_.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" },
@@ -60,4 +60,4 @@ const l = [
60
60
  export {
61
61
  h as socialTool
62
62
  };
63
- //# sourceMappingURL=social-tool-kPuP-4n6.js.map
63
+ //# sourceMappingURL=social-tool-C1FeCyUm.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"social-tool-C1FeCyUm.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;"}
@@ -22,6 +22,9 @@ export declare class EditorStore {
22
22
  /** Public event emitter for design:loaded, design:updated, etc. */
23
23
  readonly events: EventEmitter;
24
24
  private _mergeTags;
25
+ private _callbacks;
26
+ setCallback(type: string, fn: Function): void;
27
+ getCallback(type: string): Function | undefined;
25
28
  private _a11yIssueIds;
26
29
  get a11yIssueIds(): Set<string>;
27
30
  setA11yIssueIds(ids: Set<string>): void;
@@ -43,7 +46,9 @@ export declare class EditorStore {
43
46
  subscribeChannels(channels: StoreChannel[], fn: StoreSubscriber): () => void;
44
47
  /** @deprecated Use subscribeChannels instead */
45
48
  subscribe(fn: StoreSubscriber): () => void;
46
- /** Notify only subscribers of specific channels */
49
+ /** Batched notification coalesces multiple channels into one rAF cycle */
50
+ private pendingChannels;
51
+ private rafId;
47
52
  private notifyChannels;
48
53
  /** Get the full design document */
49
54
  getDesign(): EmailDesign;
@@ -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,5 +1,5 @@
1
1
  import { html as n } from "lit";
2
- import { s as t, j as g, e as C } from "./index-zy5NbC2E.js";
2
+ import { s as t, j as g, e as C } from "./index-2S5kBS5_.js";
3
3
  const s = [
4
4
  ["Header 1", "Header 2", "Header 3"],
5
5
  ["Cell 1", "Cell 2", "Cell 3"],
@@ -61,4 +61,4 @@ const s = [
61
61
  export {
62
62
  m as tableTool
63
63
  };
64
- //# sourceMappingURL=table-tool-CcWFvTSc.js.map
64
+ //# sourceMappingURL=table-tool-BD72-Fuj.js.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"table-tool-BD72-Fuj.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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"}
@@ -1,5 +1,5 @@
1
1
  import { html as r } from "lit";
2
- import { s as t, e as s } from "./index-zy5NbC2E.js";
2
+ import { s as t, e as s } from "./index-2S5kBS5_.js";
3
3
  const c = {
4
4
  name: "timer",
5
5
  label: "Timer",
@@ -52,4 +52,4 @@ const c = {
52
52
  export {
53
53
  c as timerTool
54
54
  };
55
- //# sourceMappingURL=timer-tool-CG1oul_Z.js.map
55
+ //# sourceMappingURL=timer-tool-Dpw9p0uW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer-tool-CG1oul_Z.js","sources":["../src/tools/built-in/timer-tool.ts"],"sourcesContent":["/**\n * @module timer-tool\n *\n * Countdown timer display block.\n *\n * Email compatibility: Renders as a static styled block.\n * For live countdowns, integrate with a third-party countdown\n * image service (e.g. CountdownMail) in the `endDate` property.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\nexport const timerTool: LitToolDefinition = {\n name: 'timer',\n label: 'Timer',\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=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 11,\n options: {\n timer: {\n title: 'Timer',\n options: {\n endDate: { label: 'End Date (ISO)', defaultValue: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0], widget: 'text' },\n expiredMessage: { label: 'Expired Message', defaultValue: 'This offer has expired', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n backgroundColor: { label: 'Background', defaultValue: '#1f2937', widget: 'color_picker' },\n textColor: { label: 'Text Color', defaultValue: '#ffffff', widget: 'color_picker' },\n fontSize: { label: 'Font Size', defaultValue: '32px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n endDate: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0],\n expiredMessage: 'This offer has expired', textAlign: 'center',\n backgroundColor: '#1f2937', textColor: '#ffffff', fontSize: '32px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n return html`<div style=\"padding:0;\"><div style=\"background:${bg};color:${color};text-align:${align};padding:20px;border-radius:4px;font-family:monospace;font-weight:bold;display:flex;flex-wrap:wrap;justify-content:center;gap:4px;\"><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><div style=\"width:100%;font-size:10px;letter-spacing:6px;opacity:0.5;margin-top:2px;text-align:center;\">DAYS &nbsp; HRS &nbsp; MIN &nbsp; SEC</div></div></div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n const inner = `<table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background-color:${bg};border-radius:4px;\"><tr><td style=\"padding:20px;text-align:${align};font-family:'Courier New',monospace;font-weight:bold;color:${color};font-size:${fontSize};letter-spacing:2px;\">00 <span style=\"opacity:0.4\">:</span> 00 <span style=\"opacity:0.4\">:</span> 00 <span style=\"opacity:0.4\">:</span> 00<div style=\"font-size:10px;letter-spacing:6px;opacity:0.5;margin-top:4px;\">DAYS &nbsp; HRS &nbsp; MIN &nbsp; SEC</div></td></tr></table>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n"],"names":["timerTool","values","str","bg","color","fontSize","align","html","padding","inner","emailTableCell"],"mappings":";;AAgBO,MAAMA,IAA+B;AAAA,EAC1C,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,SAAS,EAAE,OAAO,kBAAkB,cAAc,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAQ,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,OAAA;AAAA,QAC3H,gBAAgB,EAAE,OAAO,mBAAmB,cAAc,0BAA0B,QAAQ,OAAA;AAAA,MAAO;AAAA,IACrG;AAAA,IAEF,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,QACP,WAAW,EAAE,OAAO,SAAS,cAAc,UAAU,QAAQ,YAAA;AAAA,QAC7D,iBAAiB,EAAE,OAAO,cAAc,cAAc,WAAW,QAAQ,eAAA;AAAA,QACzE,WAAW,EAAE,OAAO,cAAc,cAAc,WAAW,QAAQ,eAAA;AAAA,QACnE,UAAU,EAAE,OAAO,aAAa,cAAc,QAAQ,QAAQ,OAAA;AAAA,MAAO;AAAA,IACvE;AAAA,IAEF,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,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAQ,EAAE,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IACvE,gBAAgB;AAAA,IAA0B,WAAW;AAAA,IACrD,iBAAiB;AAAA,IAAW,WAAW;AAAA,IAAW,UAAU;AAAA,IAAQ,kBAAkB;AAAA,EAAA;AAAA,EAExF,UAAU;AAAA,IACR,aAAaC,GAAuC;AAClC,MAAAC,EAAID,GAAQ,oBAAoB,MAAM;AACtD,YAAME,IAAKD,EAAID,GAAQ,mBAAmB,SAAS,GAC7CG,IAAQF,EAAID,GAAQ,aAAa,SAAS,GAC1CI,IAAWH,EAAID,GAAQ,YAAY,MAAM,GACzCK,IAAQJ,EAAID,GAAQ,aAAa,QAAQ;AAE/C,aAAOM,mDAAsDJ,CAAE,UAAUC,CAAK,eAAeE,CAAK,8JAA8JD,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ;AAAA,IACxnB;AAAA,IACA,WAAWJ,GAA+B;AACxC,YAAMO,IAAUN,EAAID,GAAQ,oBAAoB,MAAM,GAChDE,IAAKD,EAAID,GAAQ,mBAAmB,SAAS,GAC7CG,IAAQF,EAAID,GAAQ,aAAa,SAAS,GAC1CI,IAAWH,EAAID,GAAQ,YAAY,MAAM,GACzCK,IAAQJ,EAAID,GAAQ,aAAa,QAAQ,GAEzCQ,IAAQ,8GAA8GN,CAAE,+DAA+DG,CAAK,+DAA+DF,CAAK,cAAcC,CAAQ;AAC5R,aAAOK,EAAeD,GAAO,EAAE,SAAAD,GAAS,OAAAF,GAAO;AAAA,IACjD;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"timer-tool-Dpw9p0uW.js","sources":["../src/tools/built-in/timer-tool.ts"],"sourcesContent":["/**\n * @module timer-tool\n *\n * Countdown timer display block.\n *\n * Email compatibility: Renders as a static styled block.\n * For live countdowns, integrate with a third-party countdown\n * image service (e.g. CountdownMail) in the `endDate` property.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\nexport const timerTool: LitToolDefinition = {\n name: 'timer',\n label: 'Timer',\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=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 11,\n options: {\n timer: {\n title: 'Timer',\n options: {\n endDate: { label: 'End Date (ISO)', defaultValue: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0], widget: 'text' },\n expiredMessage: { label: 'Expired Message', defaultValue: 'This offer has expired', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n backgroundColor: { label: 'Background', defaultValue: '#1f2937', widget: 'color_picker' },\n textColor: { label: 'Text Color', defaultValue: '#ffffff', widget: 'color_picker' },\n fontSize: { label: 'Font Size', defaultValue: '32px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n endDate: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0],\n expiredMessage: 'This offer has expired', textAlign: 'center',\n backgroundColor: '#1f2937', textColor: '#ffffff', fontSize: '32px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n return html`<div style=\"padding:0;\"><div style=\"background:${bg};color:${color};text-align:${align};padding:20px;border-radius:4px;font-family:monospace;font-weight:bold;display:flex;flex-wrap:wrap;justify-content:center;gap:4px;\"><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><span style=\"font-size:${fontSize};opacity:0.4;\">:</span><span style=\"font-size:${fontSize};letter-spacing:2px;\">00</span><div style=\"width:100%;font-size:10px;letter-spacing:6px;opacity:0.5;margin-top:2px;text-align:center;\">DAYS &nbsp; HRS &nbsp; MIN &nbsp; SEC</div></div></div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n const inner = `<table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"background-color:${bg};border-radius:4px;\"><tr><td style=\"padding:20px;text-align:${align};font-family:'Courier New',monospace;font-weight:bold;color:${color};font-size:${fontSize};letter-spacing:2px;\">00 <span style=\"opacity:0.4\">:</span> 00 <span style=\"opacity:0.4\">:</span> 00 <span style=\"opacity:0.4\">:</span> 00<div style=\"font-size:10px;letter-spacing:6px;opacity:0.5;margin-top:4px;\">DAYS &nbsp; HRS &nbsp; MIN &nbsp; SEC</div></td></tr></table>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n"],"names":["timerTool","values","str","bg","color","fontSize","align","html","padding","inner","emailTableCell"],"mappings":";;AAgBO,MAAMA,IAA+B;AAAA,EAC1C,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,SAAS,EAAE,OAAO,kBAAkB,cAAc,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAQ,EAAE,cAAc,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,OAAA;AAAA,QAC3H,gBAAgB,EAAE,OAAO,mBAAmB,cAAc,0BAA0B,QAAQ,OAAA;AAAA,MAAO;AAAA,IACrG;AAAA,IAEF,OAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,QACP,WAAW,EAAE,OAAO,SAAS,cAAc,UAAU,QAAQ,YAAA;AAAA,QAC7D,iBAAiB,EAAE,OAAO,cAAc,cAAc,WAAW,QAAQ,eAAA;AAAA,QACzE,WAAW,EAAE,OAAO,cAAc,cAAc,WAAW,QAAQ,eAAA;AAAA,QACnE,UAAU,EAAE,OAAO,aAAa,cAAc,QAAQ,QAAQ,OAAA;AAAA,MAAO;AAAA,IACvE;AAAA,IAEF,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,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAQ,EAAE,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IACvE,gBAAgB;AAAA,IAA0B,WAAW;AAAA,IACrD,iBAAiB;AAAA,IAAW,WAAW;AAAA,IAAW,UAAU;AAAA,IAAQ,kBAAkB;AAAA,EAAA;AAAA,EAExF,UAAU;AAAA,IACR,aAAaC,GAAuC;AAClC,MAAAC,EAAID,GAAQ,oBAAoB,MAAM;AACtD,YAAME,IAAKD,EAAID,GAAQ,mBAAmB,SAAS,GAC7CG,IAAQF,EAAID,GAAQ,aAAa,SAAS,GAC1CI,IAAWH,EAAID,GAAQ,YAAY,MAAM,GACzCK,IAAQJ,EAAID,GAAQ,aAAa,QAAQ;AAE/C,aAAOM,mDAAsDJ,CAAE,UAAUC,CAAK,eAAeE,CAAK,8JAA8JD,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ,yDAAyDA,CAAQ,iDAAiDA,CAAQ;AAAA,IACxnB;AAAA,IACA,WAAWJ,GAA+B;AACxC,YAAMO,IAAUN,EAAID,GAAQ,oBAAoB,MAAM,GAChDE,IAAKD,EAAID,GAAQ,mBAAmB,SAAS,GAC7CG,IAAQF,EAAID,GAAQ,aAAa,SAAS,GAC1CI,IAAWH,EAAID,GAAQ,YAAY,MAAM,GACzCK,IAAQJ,EAAID,GAAQ,aAAa,QAAQ,GAEzCQ,IAAQ,8GAA8GN,CAAE,+DAA+DG,CAAK,+DAA+DF,CAAK,cAAcC,CAAQ;AAC5R,aAAOK,EAAeD,GAAO,EAAE,SAAAD,GAAS,OAAAF,GAAO;AAAA,IACjD;AAAA,EAAA;AAEJ;"}
@@ -1,5 +1,5 @@
1
1
  import { html as a } from "lit";
2
- import { s as e, e as u } from "./index-zy5NbC2E.js";
2
+ import { s as e, e as u } from "./index-2S5kBS5_.js";
3
3
  function d(t) {
4
4
  const i = t.match(/(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/);
5
5
  return i ? `https://img.youtube.com/vi/${i[1]}/maxresdefault.jpg` : null;
@@ -50,4 +50,4 @@ const m = {
50
50
  export {
51
51
  m as videoTool
52
52
  };
53
- //# sourceMappingURL=video-tool-CttMka8Z.js.map
53
+ //# sourceMappingURL=video-tool-CHhPfHaS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"video-tool-CttMka8Z.js","sources":["../src/tools/built-in/video-tool.ts"],"sourcesContent":["/**\n * @module video-tool\n *\n * Video embed block with thumbnail and play button overlay.\n * Supports YouTube and Vimeo URLs with auto-thumbnail detection.\n *\n * Email compatibility: Video cannot play in email — renders as\n * a linked thumbnail image with a play button overlay.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\n/** Extract YouTube video ID and return thumbnail URL */\nfunction getYouTubeThumbnail(url: string): string | null {\n const match = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]{11})/);\n return match ? `https://img.youtube.com/vi/${match[1]}/maxresdefault.jpg` : null;\n}\n\nexport const videoTool: LitToolDefinition = {\n name: 'video',\n label: 'Video',\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\"><polygon points=\"5 3 19 12 5 21 5 3\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 10,\n options: {\n video: {\n title: 'Video',\n options: {\n url: { label: 'Video URL', defaultValue: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', widget: 'text' },\n thumbnailUrl: { label: 'Thumbnail URL (auto)', defaultValue: '', widget: 'text' },\n alt: { label: 'Alt Text', defaultValue: 'Video', 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 url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnailUrl: '', alt: 'Video', textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const align = str(values, 'textAlign', 'center');\n\n if (!thumbnail) {\n return html`<div style=\"text-align:${align};\"><div style=\"background:#0f172a;border-radius:8px;padding:40px;text-align:center;color:white;font-family:sans-serif;\"><div style=\"font-size:48px;opacity:0.8;\">▶</div><div style=\"font-size:12px;margin-top:8px;opacity:0.6;\">${url || 'Enter video URL'}</div></div></div>`;\n }\n return html`<div style=\"text-align:${align};\"><div style=\"position:relative;display:inline-block;max-width:100%;cursor:pointer;\"><img src=${thumbnail} alt=\"Video thumbnail\" style=\"display:block;max-width:100%;border-radius:4px;\" /><div style=\"position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\"><div style=\"width:60px;height:60px;background:rgba(0,0,0,0.7);border-radius:50%;display:flex;align-items:center;justify-content:center;color:white;font-size:24px;\">▶</div></div></div></div>`;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url', '#');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const alt = str(values, 'alt', 'Video');\n const align = str(values, 'textAlign', 'center');\n\n const imgTag = thumbnail\n ? `<img src=\"${thumbnail}\" alt=\"${alt}\" width=\"${ctx.columnWidth}\" style=\"display:block;max-width:100%;width:${ctx.columnWidth}px;border:0;\" />`\n : `<div style=\"background:#0f172a;padding:40px;text-align:center;color:white;font-family:arial,sans-serif;font-size:16px;\">▶ Watch Video</div>`;\n return emailTableCell(`<a href=\"${url}\" target=\"_blank\" style=\"text-decoration:none;\">${imgTag}</a>`, { padding, align });\n },\n },\n};\n"],"names":["getYouTubeThumbnail","url","match","videoTool","values","str","thumbnail","align","html","ctx","padding","alt","imgTag","emailTableCell"],"mappings":";;AAiBA,SAASA,EAAoBC,GAA4B;AACvD,QAAMC,IAAQD,EAAI,MAAM,kFAAkF;AAC1G,SAAOC,IAAQ,8BAA8BA,EAAM,CAAC,CAAC,uBAAuB;AAC9E;AAEO,MAAMC,IAA+B;AAAA,EAC1C,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,KAAK,EAAE,OAAO,aAAa,cAAc,+CAA+C,QAAQ,OAAA;AAAA,QAChG,cAAc,EAAE,OAAO,wBAAwB,cAAc,IAAI,QAAQ,OAAA;AAAA,QACzE,KAAK,EAAE,OAAO,YAAY,cAAc,SAAS,QAAQ,OAAA;AAAA,MAAO;AAAA,IAClE;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,KAAK;AAAA,IACL,cAAc;AAAA,IAAI,KAAK;AAAA,IAAS,WAAW;AAAA,IAAU,kBAAkB;AAAA,EAAA;AAAA,EAEzE,UAAU;AAAA,IACR,aAAaC,GAAuC;AAClC,MAAAC,EAAID,GAAQ,oBAAoB,MAAM;AACtD,YAAMH,IAAMI,EAAID,GAAQ,KAAK,GACvBE,IAAYD,EAAID,GAAQ,cAAc,KAAKJ,EAAoBC,CAAG,KAAK,IACvEM,IAAQF,EAAID,GAAQ,aAAa,QAAQ;AAE/C,aAAKE,IAGEE,2BAA8BD,CAAK,kGAAkGD,CAAS,kXAF5IE,2BAA8BD,CAAK,mOAAmON,KAAO,iBAAiB;AAAA,IAGzS;AAAA,IACA,WAAWG,GAAuBK,GAAkC;AAClE,YAAMC,IAAUL,EAAID,GAAQ,oBAAoB,MAAM,GAChDH,IAAMI,EAAID,GAAQ,OAAO,GAAG,GAC5BE,IAAYD,EAAID,GAAQ,cAAc,KAAKJ,EAAoBC,CAAG,KAAK,IACvEU,IAAMN,EAAID,GAAQ,OAAO,OAAO,GAChCG,IAAQF,EAAID,GAAQ,aAAa,QAAQ,GAEzCQ,IAASN,IACX,aAAaA,CAAS,UAAUK,CAAG,YAAYF,EAAI,WAAW,+CAA+CA,EAAI,WAAW,qBAC5H;AACJ,aAAOI,EAAe,YAAYZ,CAAG,mDAAmDW,CAAM,QAAQ,EAAE,SAAAF,GAAS,OAAAH,GAAO;AAAA,IAC1H;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"video-tool-CHhPfHaS.js","sources":["../src/tools/built-in/video-tool.ts"],"sourcesContent":["/**\n * @module video-tool\n *\n * Video embed block with thumbnail and play button overlay.\n * Supports YouTube and Vimeo URLs with auto-thumbnail detection.\n *\n * Email compatibility: Video cannot play in email — renders as\n * a linked thumbnail image with a play button overlay.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\n/** Extract YouTube video ID and return thumbnail URL */\nfunction getYouTubeThumbnail(url: string): string | null {\n const match = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]{11})/);\n return match ? `https://img.youtube.com/vi/${match[1]}/maxresdefault.jpg` : null;\n}\n\nexport const videoTool: LitToolDefinition = {\n name: 'video',\n label: 'Video',\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\"><polygon points=\"5 3 19 12 5 21 5 3\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 10,\n options: {\n video: {\n title: 'Video',\n options: {\n url: { label: 'Video URL', defaultValue: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', widget: 'text' },\n thumbnailUrl: { label: 'Thumbnail URL (auto)', defaultValue: '', widget: 'text' },\n alt: { label: 'Alt Text', defaultValue: 'Video', 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 url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnailUrl: '', alt: 'Video', textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const align = str(values, 'textAlign', 'center');\n\n if (!thumbnail) {\n return html`<div style=\"text-align:${align};\"><div style=\"background:#0f172a;border-radius:8px;padding:40px;text-align:center;color:white;font-family:sans-serif;\"><div style=\"font-size:48px;opacity:0.8;\">▶</div><div style=\"font-size:12px;margin-top:8px;opacity:0.6;\">${url || 'Enter video URL'}</div></div></div>`;\n }\n return html`<div style=\"text-align:${align};\"><div style=\"position:relative;display:inline-block;max-width:100%;cursor:pointer;\"><img src=${thumbnail} alt=\"Video thumbnail\" style=\"display:block;max-width:100%;border-radius:4px;\" /><div style=\"position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\"><div style=\"width:60px;height:60px;background:rgba(0,0,0,0.7);border-radius:50%;display:flex;align-items:center;justify-content:center;color:white;font-size:24px;\">▶</div></div></div></div>`;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url', '#');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const alt = str(values, 'alt', 'Video');\n const align = str(values, 'textAlign', 'center');\n\n const imgTag = thumbnail\n ? `<img src=\"${thumbnail}\" alt=\"${alt}\" width=\"${ctx.columnWidth}\" style=\"display:block;max-width:100%;width:${ctx.columnWidth}px;border:0;\" />`\n : `<div style=\"background:#0f172a;padding:40px;text-align:center;color:white;font-family:arial,sans-serif;font-size:16px;\">▶ Watch Video</div>`;\n return emailTableCell(`<a href=\"${url}\" target=\"_blank\" style=\"text-decoration:none;\">${imgTag}</a>`, { padding, align });\n },\n },\n};\n"],"names":["getYouTubeThumbnail","url","match","videoTool","values","str","thumbnail","align","html","ctx","padding","alt","imgTag","emailTableCell"],"mappings":";;AAiBA,SAASA,EAAoBC,GAA4B;AACvD,QAAMC,IAAQD,EAAI,MAAM,kFAAkF;AAC1G,SAAOC,IAAQ,8BAA8BA,EAAM,CAAC,CAAC,uBAAuB;AAC9E;AAEO,MAAMC,IAA+B;AAAA,EAC1C,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,KAAK,EAAE,OAAO,aAAa,cAAc,+CAA+C,QAAQ,OAAA;AAAA,QAChG,cAAc,EAAE,OAAO,wBAAwB,cAAc,IAAI,QAAQ,OAAA;AAAA,QACzE,KAAK,EAAE,OAAO,YAAY,cAAc,SAAS,QAAQ,OAAA;AAAA,MAAO;AAAA,IAClE;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,KAAK;AAAA,IACL,cAAc;AAAA,IAAI,KAAK;AAAA,IAAS,WAAW;AAAA,IAAU,kBAAkB;AAAA,EAAA;AAAA,EAEzE,UAAU;AAAA,IACR,aAAaC,GAAuC;AAClC,MAAAC,EAAID,GAAQ,oBAAoB,MAAM;AACtD,YAAMH,IAAMI,EAAID,GAAQ,KAAK,GACvBE,IAAYD,EAAID,GAAQ,cAAc,KAAKJ,EAAoBC,CAAG,KAAK,IACvEM,IAAQF,EAAID,GAAQ,aAAa,QAAQ;AAE/C,aAAKE,IAGEE,2BAA8BD,CAAK,kGAAkGD,CAAS,kXAF5IE,2BAA8BD,CAAK,mOAAmON,KAAO,iBAAiB;AAAA,IAGzS;AAAA,IACA,WAAWG,GAAuBK,GAAkC;AAClE,YAAMC,IAAUL,EAAID,GAAQ,oBAAoB,MAAM,GAChDH,IAAMI,EAAID,GAAQ,OAAO,GAAG,GAC5BE,IAAYD,EAAID,GAAQ,cAAc,KAAKJ,EAAoBC,CAAG,KAAK,IACvEU,IAAMN,EAAID,GAAQ,OAAO,OAAO,GAChCG,IAAQF,EAAID,GAAQ,aAAa,QAAQ,GAEzCQ,IAASN,IACX,aAAaA,CAAS,UAAUK,CAAG,YAAYF,EAAI,WAAW,+CAA+CA,EAAI,WAAW,qBAC5H;AACJ,aAAOI,EAAe,YAAYZ,CAAG,mDAAmDW,CAAM,QAAQ,EAAE,SAAAF,GAAS,OAAAH,GAAO;AAAA,IAC1H;AAAA,EAAA;AAEJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emabuild/core",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Drag & drop email editor Web Component — embeddable anywhere",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,16 +18,10 @@
18
18
  "custom-elements.json"
19
19
  ],
20
20
  "customElements": "custom-elements.json",
21
- "scripts": {
22
- "build": "vite build",
23
- "dev": "vite build --watch",
24
- "clean": "rm -rf dist",
25
- "prepublishOnly": "pnpm build"
26
- },
27
21
  "dependencies": {
28
- "@emabuild/types": "workspace:*",
29
- "@emabuild/email-renderer": "workspace:*",
30
- "lit": "^3.2.0"
22
+ "lit": "^3.2.0",
23
+ "@emabuild/types": "0.4.0",
24
+ "@emabuild/email-renderer": "0.4.0"
31
25
  },
32
26
  "devDependencies": {
33
27
  "vite": "^6.2.0",
@@ -36,7 +30,26 @@
36
30
  "publishConfig": {
37
31
  "access": "public"
38
32
  },
39
- "keywords": ["email", "editor", "drag-and-drop", "email-builder", "web-component", "lit", "newsletter", "html-email", "wysiwyg", "email-template"],
33
+ "keywords": [
34
+ "email",
35
+ "editor",
36
+ "drag-and-drop",
37
+ "email-builder",
38
+ "web-component",
39
+ "lit",
40
+ "newsletter",
41
+ "html-email",
42
+ "wysiwyg",
43
+ "email-template"
44
+ ],
40
45
  "license": "MIT",
41
- "sideEffects": ["./dist/index.js", "./dist/index-*.js"]
42
- }
46
+ "sideEffects": [
47
+ "./dist/index.js",
48
+ "./dist/index-*.js"
49
+ ],
50
+ "scripts": {
51
+ "build": "vite build",
52
+ "dev": "vite build --watch",
53
+ "clean": "rm -rf dist"
54
+ }
55
+ }