vue-wswg-editor 0.0.12 → 0.0.13

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/README.md +23 -8
  2. package/dist/style.css +1 -1
  3. package/dist/types/components/BlockEditorFields/BlockEditorFields.vue.d.ts +1 -0
  4. package/dist/types/components/EditorPageRenderer/EditorPageRenderer.vue.d.ts +21 -0
  5. package/dist/types/components/EmptyState/EmptyState.vue.d.ts +2 -8
  6. package/dist/types/components/IframePreview/IframePreview.vue.d.ts +26 -0
  7. package/dist/types/components/IframePreview/iframeContent.d.ts +9 -0
  8. package/dist/types/components/IframePreview/iframePreviewApp.d.ts +36 -0
  9. package/dist/types/components/IframePreview/messageHandler.d.ts +55 -0
  10. package/dist/types/components/IframePreview/types.d.ts +77 -0
  11. package/dist/types/components/PageBuilderSidebar/PageBuilderSidebar.vue.d.ts +2 -0
  12. package/dist/types/components/PageRenderer/PageRenderer.vue.d.ts +2 -0
  13. package/dist/types/components/PageSettings/PageSettings.vue.d.ts +2 -0
  14. package/dist/types/components/{WswgJsonEditor/WswgJsonEditor.vue.d.ts → WswgPageBuilder/WswgPageBuilder.vue.d.ts} +2 -0
  15. package/dist/types/index.d.ts +8 -2
  16. package/dist/types/util/registry.d.ts +2 -0
  17. package/dist/types/util/theme-registry.d.ts +42 -0
  18. package/dist/types/util/validation.d.ts +2 -2
  19. package/dist/vite-plugin.js +33 -29
  20. package/dist/vue-wswg-editor.es.js +2723 -1897
  21. package/package.json +1 -2
  22. package/src/assets/styles/_mixins.scss +15 -0
  23. package/src/components/AddBlockItem/AddBlockItem.vue +13 -4
  24. package/src/components/BlockBrowser/BlockBrowser.vue +5 -5
  25. package/src/components/BlockComponent/BlockComponent.vue +23 -50
  26. package/src/components/BlockEditorFieldNode/BlockEditorFieldNode.vue +12 -10
  27. package/src/components/BlockEditorFields/BlockEditorFields.vue +24 -4
  28. package/src/components/BlockRepeaterFieldNode/BlockRepeaterNode.vue +9 -4
  29. package/src/components/BrowserNavigation/BrowserNavigation.vue +1 -1
  30. package/src/components/EditorPageRenderer/EditorPageRenderer.vue +641 -0
  31. package/src/components/EmptyState/EmptyState.vue +3 -12
  32. package/src/components/IframePreview/IframePreview.vue +211 -0
  33. package/src/components/IframePreview/iframeContent.ts +210 -0
  34. package/src/components/IframePreview/iframePreviewApp.ts +221 -0
  35. package/src/components/IframePreview/messageHandler.ts +219 -0
  36. package/src/components/IframePreview/types.ts +126 -0
  37. package/src/components/PageBlockList/PageBlockList.vue +8 -6
  38. package/src/components/PageBuilderSidebar/PageBuilderSidebar.vue +5 -3
  39. package/src/components/PageRenderer/PageRenderer.vue +9 -33
  40. package/src/components/PageSettings/PageSettings.vue +10 -6
  41. package/src/components/ResizeHandle/ResizeHandle.vue +68 -10
  42. package/src/components/{WswgJsonEditor/WswgJsonEditor.test.ts → WswgPageBuilder/WswgPageBuilder.test.ts} +8 -8
  43. package/src/components/WswgPageBuilder/WswgPageBuilder.vue +375 -0
  44. package/src/index.ts +10 -2
  45. package/src/shims.d.ts +4 -0
  46. package/src/types/Theme.d.ts +15 -0
  47. package/src/util/registry.ts +2 -2
  48. package/src/util/theme-registry.ts +397 -0
  49. package/src/util/validation.ts +102 -11
  50. package/src/vite-plugin.ts +8 -4
  51. package/types/vue-wswg-editor.d.ts +4 -0
  52. package/dist/types/components/PageRenderer/blockModules.d.ts +0 -3
  53. package/dist/types/components/PageRenderer/layoutModules.d.ts +0 -3
  54. package/src/components/PageRenderer/blockModules-alternative.ts.example +0 -9
  55. package/src/components/PageRenderer/blockModules-manual.ts.example +0 -19
  56. package/src/components/PageRenderer/blockModules-runtime.ts.example +0 -23
  57. package/src/components/PageRenderer/blockModules.ts +0 -32
  58. package/src/components/PageRenderer/layoutModules.ts +0 -32
  59. package/src/components/WswgJsonEditor/WswgJsonEditor.vue +0 -595
  60. /package/dist/types/components/{WswgJsonEditor/WswgJsonEditor.test.d.ts → WswgPageBuilder/WswgPageBuilder.test.d.ts} +0 -0
package/README.md CHANGED
@@ -1,4 +1,18 @@
1
- # vue-wswg-editor
1
+ <div align="center">
2
+ <img src="https://raw.githubusercontent.com/sjmc11/vue-wswg-editor/main/docs/public/app-icon-shadow.png" alt="vue-wswg-editor" width="180" height="200">
3
+ <h1>vue-wswg-editor</h1>
4
+ <p>A powerful Vue 3 WYSIWYG JSON editor component library for building visual page builders</p>
5
+
6
+ <p>
7
+ <a href="https://stackblitz.com/edit/vitejs-vite-zwmxyawb">Live Demo</a> •
8
+ <a href="https://sjmc11.github.io/vue-wswg-editor/">Documentation</a> •
9
+ <a href="https://www.npmjs.com/package/vue-wswg-editor">NPM Package</a> •
10
+ <a href="https://github.com/sjmc11/page-builder-starter-kit">Starter Kit</a> •
11
+ <a href="https://github.com/sjmc11/vue-wswg-demos">Demo Project</a>
12
+ </p>
13
+ </div>
14
+
15
+ ---
2
16
 
3
17
  A powerful Vue 3 WYSIWYG JSON editor component library for building visual page builders. Create, edit, and manage page content through an intuitive drag-and-drop interface with a comprehensive sidebar editor for block configuration.
4
18
 
@@ -130,7 +144,7 @@ export default {
130
144
 
131
145
  ```vue
132
146
  <template>
133
- <WswgJsonEditor
147
+ <WswgPageBuilder
134
148
  v-model="pageData"
135
149
  blocksKey="blocks"
136
150
  settingsKey="settings"
@@ -143,7 +157,7 @@ export default {
143
157
 
144
158
  <script setup lang="ts">
145
159
  import { ref } from "vue";
146
- import { WswgJsonEditor } from "vue-wswg-editor";
160
+ import { WswgPageBuilder } from "vue-wswg-editor";
147
161
  import "vue-wswg-editor/style.css";
148
162
 
149
163
  const pageData = ref({
@@ -182,7 +196,7 @@ src/
182
196
 
183
197
  ## API Reference
184
198
 
185
- ### WswgJsonEditor Component
199
+ ### WswgPageBuilder Component
186
200
 
187
201
  The main editor component for building and editing pages.
188
202
 
@@ -212,14 +226,14 @@ The main editor component for building and editing pages.
212
226
  #### Example
213
227
 
214
228
  ```vue
215
- <WswgJsonEditor v-model="pageData" :editable="true" :showBrowserBar="true" defaultBlockMargin="small">
229
+ <WswgPageBuilder v-model="pageData" :editable="true" :showBrowserBar="true" defaultBlockMargin="small">
216
230
  <template #header>
217
231
  <div class="custom-header">My Page Editor</div>
218
232
  </template>
219
233
  <template #toolbar>
220
234
  <button @click="save">Save</button>
221
235
  </template>
222
- </WswgJsonEditor>
236
+ </WswgPageBuilder>
223
237
  ```
224
238
 
225
239
  ### PageRenderer Component
@@ -521,7 +535,7 @@ npm unlink
521
535
  vue-wswg-editor/
522
536
  ├── src/
523
537
  │ ├── components/ # Vue components
524
- │ │ ├── WswgJsonEditor/ # Main editor component
538
+ │ │ ├── WswgPageBuilder/ # Main editor component
525
539
  │ │ ├── PageRenderer/ # Page renderer component
526
540
  │ │ ├── BlockComponent/ # Block wrapper component
527
541
  │ │ └── ... # Other components
@@ -561,4 +575,5 @@ import type { EditorFieldConfig, ValidatorFunction, ValidationResult } from "vue
561
575
 
562
576
  ## Related Projects
563
577
 
564
- - [vue-wswg-demos](https://github.com/your-org/vue-wswg-demos) - Demo project showing how to use vue-wswg-editor
578
+ - [vue-wswg-demos](https://github.com/sjmc11/vue-wswg-demos) - Demo project showing how to use vue-wswg-editor
579
+ - [page-builder-starter-kit](https://github.com/sjmc11/page-builder-starter-kit) - Starter kit with example blocks, layouts, and custom fields
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .resize-handle[data-v-b18db8c1]{position:sticky;top:0;right:0;z-index:14;width:3px;height:var(--editor-height);cursor:col-resize;background-color:#dbdee0;transition:all .2s ease-in-out}.resize-handle[data-v-b18db8c1]:hover{width:3px;background-color:#fcd34d}.resize-handle[data-v-b18db8c1]:active{width:3px;background-color:#fbbf24}.resize-handle[data-v-b18db8c1]:before{position:absolute;top:50%;left:-6px;z-index:50;width:14px;height:40px;content:"";background-color:#fcd34d;border-radius:8px;opacity:0;transform:translateY(-50%);transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.resize-handle[data-v-b18db8c1]:hover:before{opacity:1}.resize-handle[data-v-b18db8c1]:active:before{background-color:#fbbf24;opacity:1}.block-browser[data-v-143f6052]{container-type:inline-size}.available-blocks-grid[data-v-143f6052]{display:grid;grid-template-columns:1fr;gap:.75rem;padding:1.25rem}@container (min-width: 360px){.available-blocks-grid[data-v-143f6052]{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width: 560px){.available-blocks-grid[data-v-143f6052]{grid-template-columns:repeat(3,minmax(0,1fr))}}.repeater-field[data-v-8d4fcedc]{width:100%}.empty-state[data-v-8d4fcedc]{border:2px dashed #e5e7eb;border-radius:.5rem}.repeater-item .repeater-item-fields[data-v-8d4fcedc]{height:0;overflow:hidden}.repeater-item.is-open .repeater-item-fields[data-v-8d4fcedc]{height:auto;padding:1rem;border-top:1px solid #e5e7eb}select.form-control[data-v-a88a6b3c]{padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.image-upload-field[data-v-ec4440b5]{width:100%}.editor-field-node[data-v-82c113da] .form-control:is(input:not([type=checkbox],[type=radio]),textarea,select){width:100%;padding:8px;font-size:14px;color:#333;outline:none;background-color:#fff;border:1px solid #e0e0e0;border-radius:5px;box-shadow:none;transition:border-color .2s}.editor-field-node[data-v-82c113da] .form-control label input[type=checkbox],.editor-field-node[data-v-82c113da] .form-control label input[type=radio]{width:16px;height:16px;padding:8px;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;border:1px solid #e0e0e0;border-radius:5px}.editor-field-node[data-v-82c113da] .form-control label input[type=checkbox]:checked,.editor-field-node[data-v-82c113da] .form-control label input[type=radio]:checked{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.editor-field-node[data-v-82c113da] .form-control label:has(input[type=checkbox]:checked,input[type=radio]:checked){--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.editor-field-node[data-v-82c113da] .form-control label:hover input[type=checkbox]:not(:checked),.editor-field-node[data-v-82c113da] .form-control label:hover input[type=radio]:not(:checked){--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.editor-field-node[data-v-82c113da] .form-control label:has(input[type=checkbox]:disabled,input[type=radio]:disabled){cursor:not-allowed;opacity:.75}.editor-field-node[data-v-82c113da] .form-control label:has(input[type=checkbox]:disabled,input[type=radio]:disabled) input{cursor:not-allowed}.editor-field-node[data-v-82c113da] .form-control:is(select){padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.editor-field-node[data-v-82c113da] .form-control:is(input[type=color]){width:auto;aspect-ratio:1/1;padding:3px;cursor:pointer;background-color:#fff;border:none;border:1px solid #e0e0e0;border-radius:5px}.editor-field-node[data-v-82c113da] .form-control:hover{border-color:#555}.editor-field-node[data-v-82c113da] .form-control:disabled{cursor:not-allowed;background-color:#fff;opacity:.75}select.form-control[data-v-4683b8ff]{padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.page-builder-sidebar[data-v-b65e4579]{min-width:300px;background:#fff}.block-wrapper[data-v-9d8117d8]{position:relative;transition:all .3s ease}.block-wrapper[data-v-9d8117d8]:before,.block-wrapper[data-v-9d8117d8]:after{position:absolute;left:0;display:flex;align-items:center;justify-content:center;width:100%;height:0;font-size:14px;font-weight:500;color:#888017;content:"Spacing";background-color:#f7efac;border:2px dashed #d2c564;border-radius:7px;opacity:0;transform:scaleY(.9) scaleX(.98);transition:all .3s ease}.block-wrapper .block-component[data-v-9d8117d8]{position:relative;cursor:pointer}.block-wrapper .block-component[data-v-9d8117d8]:before{position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;pointer-events:none;outline:2px dashed #638ef1;outline-offset:-2px;content:"";background-color:#9fd0f643;opacity:0}.block-wrapper.active-block .block-component[data-v-9d8117d8]:before{background-color:#9fd0f643;border-color:#638ef1;opacity:1}.block-wrapper.active-block[data-v-9d8117d8]:after,.block-wrapper.active-block[data-v-9d8117d8]:before{opacity:1}.block-wrapper.hovered-block .block-component[data-v-9d8117d8]:before{background-color:#9fd0f643;border-color:#638ef1;opacity:1}.block-wrapper.hovered-block[data-v-9d8117d8]:after,.block-wrapper.hovered-block[data-v-9d8117d8]:before{opacity:1}.block-wrapper.margin-top-sm[data-v-9d8117d8]{padding-top:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-sm[data-v-9d8117d8]:before{top:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-md[data-v-9d8117d8]{padding-top:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-md[data-v-9d8117d8]:before{top:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-lg[data-v-9d8117d8]{padding-top:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-lg[data-v-9d8117d8]:before{top:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-sm[data-v-9d8117d8]{padding-bottom:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-sm[data-v-9d8117d8]:after{bottom:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-md[data-v-9d8117d8]{padding-bottom:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-md[data-v-9d8117d8]:after{bottom:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-lg[data-v-9d8117d8]{padding-bottom:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-lg[data-v-9d8117d8]:after{bottom:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-none[data-v-9d8117d8]:before,.block-wrapper.margin-bottom-none[data-v-9d8117d8]:after{display:none;content:none}.wswg-json-editor{--editor-height: 100vh ;--editor-bg-color: #6a6a6a;position:relative;width:100%;max-width:100vw;height:var(--editor-height);overflow-y:auto}.wswg-json-editor-loading{display:flex;align-items:center;justify-content:center}.wswg-json-editor-body{display:flex;width:100%;background-color:var(--editor-bg-color, #6a6a6a)}.wswg-json-editor-preview{position:relative;display:flex;flex:1;flex-grow:1;flex-shrink:0;flex-direction:column;height:100%;min-height:0;padding:1.5rem}.wswg-json-editor-preview .browser-navigation-bar{position:sticky;top:1.5rem;z-index:30}.wswg-json-editor-preview .browser-navigation-bar:before{position:absolute;top:-1.5rem;left:0;z-index:-1;width:100%;height:100%;content:"";background-color:var(--editor-bg-color, #6a6a6a)}.wswg-json-editor .page-builder-sidebar-wrapper{position:sticky;top:0;z-index:12;height:var(--editor-height);overflow-y:auto}.block-wrapper.margin-top-sm[data-v-46c2dff3]{padding-top:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-sm[data-v-46c2dff3]:before{top:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-md[data-v-46c2dff3]{padding-top:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-md[data-v-46c2dff3]:before{top:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-lg[data-v-46c2dff3]{padding-top:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-lg[data-v-46c2dff3]:before{top:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-sm[data-v-46c2dff3]{padding-bottom:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-sm[data-v-46c2dff3]:after{bottom:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-md[data-v-46c2dff3]{padding-bottom:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-md[data-v-46c2dff3]:after{bottom:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-lg[data-v-46c2dff3]{padding-bottom:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-lg[data-v-46c2dff3]:after{bottom:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-none[data-v-46c2dff3]:before,.block-wrapper.margin-bottom-none[data-v-46c2dff3]:after{display:none;content:none}@layer vue-wswg-editor-library{*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com*/*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.-top-3{top:-.75rem}.left-0{left:0}.right-4{right:1rem}.start-0{inset-inline-start:0px}.top-0{top:0}.z-10{z-index:10}.float-left{float:left}.m-1{margin:.25rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-9{margin-bottom:2.25rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-auto{margin-right:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.size-10{width:2.5rem;height:2.5rem}.size-16{width:4rem;height:4rem}.size-20{width:5rem;height:5rem}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.size-9{width:2.25rem;height:2.25rem}.h-28{height:7rem}.h-7{height:1.75rem}.h-auto{height:auto}.h-full{height:100%}.w-96{width:24rem}.w-auto{width:auto}.w-full{width:100%}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[spin_2000ms_linear_infinite\]{animation:spin 2s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(209 213 219 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-pretty{text-wrap:pretty}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-800\/20{border-color:#1e40af33}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-zinc-200{--tw-border-opacity: 1;border-color:rgb(228 228 231 / var(--tw-border-opacity, 1))}.border-b-transparent{border-bottom-color:transparent}.\!bg-white{--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/80{background-color:#eff6ffcc}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-zinc-100{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.bg-zinc-200{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.bg-zinc-300{--tw-bg-opacity: 1;background-color:rgb(212 212 216 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-zinc-700{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-5{padding:1.25rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.pb-7{padding-bottom:1.75rem}.pt-0{padding-top:0}.pt-3{padding-top:.75rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-zinc-300{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.text-zinc-500{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.text-zinc-600{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.text-zinc-900{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[inset-inline-start\]{transition-property:inset-inline-start;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.\[-webkit-tap-highlight-color\:transparent\]{-webkit-tap-highlight-color:transparent}.\[vue-wswg-editor\:registry\]{vue-wswg-editor:registry}}.first-letter\:uppercase:first-letter{text-transform:uppercase}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-red-200:hover{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.hover\:border-zinc-300:hover{--tw-border-opacity: 1;border-color:rgb(212 212 216 / var(--tw-border-opacity, 1))}.hover\:border-zinc-400:hover{--tw-border-opacity: 1;border-color:rgb(161 161 170 / var(--tw-border-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-400\/75:hover{background-color:#9ca3afbf}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-100:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-200:hover{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-500:hover{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-zinc-600:hover{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.hover\:text-zinc-700:hover{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.hover\:text-zinc-900:hover{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-sm:hover{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.active\:border-blue-600:active{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.active\:bg-blue-50:active{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.active\:text-blue-600:active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.peer:checked~.peer-checked\:start-6{inset-inline-start:1.5rem}@media (min-width: 768px){.md\:p-3{padding:.75rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}}
1
+ .resize-handle-wrapper[data-v-72eeade4]{position:sticky;top:0;right:0;z-index:30;height:var(--editor-height)}.resize-handle[data-v-72eeade4]{width:3px;height:var(--editor-height);cursor:col-resize;background-color:#dbdee0;transition:all .2s ease-in-out}.resize-handle[data-v-72eeade4]:hover{width:3px;background-color:#fcd34d}.resize-handle[data-v-72eeade4]:active{width:3px;background-color:#fbbf24}.resize-handle[data-v-72eeade4]:before{position:absolute;top:50%;left:-6px;z-index:50;width:14px;height:40px;content:"";background-color:#fcd34d;border-radius:8px;opacity:0;transform:translateY(-50%);transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.resize-handle[data-v-72eeade4]:hover:before{opacity:1}.resize-handle[data-v-72eeade4]:active:before{background-color:#fbbf24;opacity:1}.block-browser[data-v-04e632c8]{container-type:inline-size}.available-blocks-grid[data-v-04e632c8]{display:grid;grid-template-columns:1fr;gap:.75rem;padding:1.25rem}@container (min-width: 360px){.available-blocks-grid[data-v-04e632c8]{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (min-width: 560px){.available-blocks-grid[data-v-04e632c8]{grid-template-columns:repeat(3,minmax(0,1fr))}}.repeater-field[data-v-3b8908f4]{width:100%}.empty-state[data-v-3b8908f4]{border:2px dashed #e5e7eb;border-radius:.5rem}.repeater-item .repeater-item-fields[data-v-3b8908f4]{height:0;overflow:hidden}.repeater-item.is-open .repeater-item-fields[data-v-3b8908f4]{height:auto;padding:1rem;border-top:1px solid #e5e7eb}select.form-control[data-v-a88a6b3c]{padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.image-upload-field[data-v-ec4440b5]{width:100%}.editor-field-node[data-v-99e3a7ae] .form-control:is(input:not([type=checkbox],[type=radio]),textarea,select){width:100%;padding:8px;font-size:14px;color:#333;outline:none;background-color:#fff;border:1px solid #e0e0e0;border-radius:5px;box-shadow:none;transition:border-color .2s}.editor-field-node[data-v-99e3a7ae] .form-control label input[type=checkbox],.editor-field-node[data-v-99e3a7ae] .form-control label input[type=radio]{width:16px;height:16px;padding:8px;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;border:1px solid #e0e0e0;border-radius:5px}.editor-field-node[data-v-99e3a7ae] .form-control label input[type=checkbox]:checked,.editor-field-node[data-v-99e3a7ae] .form-control label input[type=radio]:checked{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.editor-field-node[data-v-99e3a7ae] .form-control label:has(input[type=checkbox]:checked,input[type=radio]:checked){--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.editor-field-node[data-v-99e3a7ae] .form-control label:hover input[type=checkbox]:not(:checked),.editor-field-node[data-v-99e3a7ae] .form-control label:hover input[type=radio]:not(:checked){--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.editor-field-node[data-v-99e3a7ae] .form-control label:has(input[type=checkbox]:disabled,input[type=radio]:disabled){cursor:not-allowed;opacity:.75}.editor-field-node[data-v-99e3a7ae] .form-control label:has(input[type=checkbox]:disabled,input[type=radio]:disabled) input{cursor:not-allowed}.editor-field-node[data-v-99e3a7ae] .form-control:is(select){padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.editor-field-node[data-v-99e3a7ae] .form-control:is(input[type=color]){width:auto;aspect-ratio:1/1;padding:3px;cursor:pointer;background-color:#fff;border:none;border:1px solid #e0e0e0;border-radius:5px}.editor-field-node[data-v-99e3a7ae] .form-control:hover{border-color:#555}.editor-field-node[data-v-99e3a7ae] .form-control:disabled{cursor:not-allowed;background-color:#fff;opacity:.75}select.form-control[data-v-ebf4fdcf]{padding-right:32px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;background-size:20px}.page-builder-sidebar[data-v-07ebdb36]{min-width:300px;background:#fff}.block-wrapper[data-v-ec29cb43]{position:relative;transition:all .3s ease}.block-wrapper[data-v-ec29cb43]:before,.block-wrapper[data-v-ec29cb43]:after{position:absolute;left:0;display:flex;align-items:center;justify-content:center;width:100%;height:0;font-size:14px;font-weight:500;color:#888017;content:"Spacing";background-color:var(--margin-color, rgba(250, 246, 213, .8784313725));border:2px dashed var(--margin-border-color, #cbc59c);border-radius:7px;opacity:0;transform:scaleY(.9) scaleX(.98);transition:all .3s ease}.block-wrapper .block-component[data-v-ec29cb43]{position:relative;cursor:pointer}.block-wrapper .editing-badge[data-v-ec29cb43]{background-color:var(--block-badge-color, #638ef1)}.block-wrapper.active-block .block-component[data-v-ec29cb43]{outline:var(--block-border-width, 4px) var(--block-border-style, solid) var(--block-border-color, #638ef1);outline-offset:calc(-1 * var(--block-border-width, 2px));box-shadow:inset 0 0 0 9999px var(--block-backdrop-color, transparent)}.block-wrapper.active-block[data-v-ec29cb43]:after,.block-wrapper.active-block[data-v-ec29cb43]:before{opacity:1}.block-wrapper.hovered-block .block-component[data-v-ec29cb43]{outline:var(--block-border-width, 4px) var(--block-border-style, solid) var(--block-border-color, #638ef1);outline-offset:calc(-1 * var(--block-border-width, 2px));box-shadow:inset 0 0 0 9999px var(--block-backdrop-color, transparent)}.block-wrapper.hovered-block[data-v-ec29cb43]:after,.block-wrapper.hovered-block[data-v-ec29cb43]:before{opacity:1}.block-wrapper.margin-top-sm[data-v-ec29cb43]{padding-top:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-sm[data-v-ec29cb43]:before{top:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-md[data-v-ec29cb43]{padding-top:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-md[data-v-ec29cb43]:before{top:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-lg[data-v-ec29cb43]{padding-top:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-lg[data-v-ec29cb43]:before{top:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-sm[data-v-ec29cb43]{padding-bottom:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-sm[data-v-ec29cb43]:after{bottom:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-md[data-v-ec29cb43]{padding-bottom:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-md[data-v-ec29cb43]:after{bottom:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-lg[data-v-ec29cb43]{padding-bottom:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-lg[data-v-ec29cb43]:after{bottom:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-none[data-v-ec29cb43]:before,.block-wrapper.margin-bottom-none[data-v-ec29cb43]:after{display:none;content:none}.block-wrapper.margin-top-sm[data-v-d3e4c269]{padding-top:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-sm[data-v-d3e4c269]:before{top:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-md[data-v-d3e4c269]{padding-top:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-md[data-v-d3e4c269]:before{top:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-lg[data-v-d3e4c269]{padding-top:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-lg[data-v-d3e4c269]:before{top:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-sm[data-v-d3e4c269]{padding-bottom:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-sm[data-v-d3e4c269]:after{bottom:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-md[data-v-d3e4c269]{padding-bottom:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-md[data-v-d3e4c269]:after{bottom:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-lg[data-v-d3e4c269]{padding-bottom:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-lg[data-v-d3e4c269]:after{bottom:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-none[data-v-d3e4c269]:before,.block-wrapper.margin-bottom-none[data-v-d3e4c269]:after{display:none;content:none}[data-v-d3e4c269] [data-partial]:hover{outline:var(--partial-border-width) var(--partial-border-style) var(--partial-border-color);outline-offset:calc(-1 * var(--block-border-width, 2px));box-shadow:inset 0 0 0 9999px var(--partial-backdrop-color)}[data-v-d3e4c269] [data-partial]{cursor:pointer}.settings-open[data-v-d3e4c269] [data-partial]{outline:var(--partial-border-width) var(--partial-border-style) var(--partial-border-color);outline-offset:calc(-1 * var(--block-border-width, 2px));box-shadow:inset 0 0 0 9999px var(--partial-backdrop-color)}#page-blocks-wrapper[data-v-d3e4c269]{position:relative}#page-blocks-wrapper.drag-over[data-v-d3e4c269]{min-height:100px}.drop-indicator[data-v-d3e4c269]{position:absolute;right:0;left:0;z-index:1000;display:flex;gap:.2rem;align-items:center;width:100%;pointer-events:none;transform:translateY(calc(var(--block-border-width, 4px) * -2));animation:drop-indicator-pulse-d3e4c269 1.5s ease-in-out infinite}.drop-indicator-line[data-v-d3e4c269]{flex:1;height:3px;background:var(--block-border-color, #638ef1)}.drop-indicator-label[data-v-d3e4c269]{padding:.25rem .75rem;font-size:.75rem;font-weight:600;color:#fff;white-space:nowrap;background:var(--block-border-color, #638ef1);border-radius:.375rem}@keyframes drop-indicator-pulse-d3e4c269{0%,to{opacity:1}50%{opacity:.7}}.iframe-preview-container[data-v-24174304]{height:-webkit-fill-available}.iframe-preview-container.mobile-viewport .iframe-preview[data-v-24174304]{max-width:384px;margin:0 auto}.iframe-preview[data-v-24174304]{display:block;width:100%;height:100%;background:#fff;border:none}.hidden-renderer[data-v-24174304]{position:absolute;top:-9999px;left:-9999px;visibility:hidden;width:1px;height:1px;overflow:hidden;pointer-events:none;opacity:0}.wswg-page-builder{position:relative;width:100%;max-width:100vw;height:var(--editor-height);overflow-y:auto}.wswg-page-builder-loading{display:flex;align-items:center;justify-content:center}.wswg-page-builder-body{display:flex;width:100%;background-color:var(--editor-bg-color, #6a6a6a)}.wswg-page-builder-preview{position:relative;display:flex;flex:1;flex-grow:1;flex-shrink:0;flex-direction:column;height:-webkit-fill-available;min-height:0;padding:1.5rem}.wswg-page-builder .page-builder-sidebar-wrapper{position:sticky;top:0;z-index:12;height:var(--editor-height);overflow-y:auto}.block-wrapper.margin-top-sm[data-v-5f367efe]{padding-top:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-sm[data-v-5f367efe]:before{top:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-top-md[data-v-5f367efe]{padding-top:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-md[data-v-5f367efe]:before{top:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-top-lg[data-v-5f367efe]{padding-top:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-lg[data-v-5f367efe]:before{top:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-sm[data-v-5f367efe]{padding-bottom:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-sm[data-v-5f367efe]:after{bottom:0;height:var(--block-margin-sm, 2rem)}.block-wrapper.margin-bottom-md[data-v-5f367efe]{padding-bottom:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-md[data-v-5f367efe]:after{bottom:0;height:var(--block-margin-md, 4rem)}.block-wrapper.margin-bottom-lg[data-v-5f367efe]{padding-bottom:var(--block-margin-lg, 6rem)}.block-wrapper.margin-bottom-lg[data-v-5f367efe]:after{bottom:0;height:var(--block-margin-lg, 6rem)}.block-wrapper.margin-top-none[data-v-5f367efe]:before,.block-wrapper.margin-bottom-none[data-v-5f367efe]:after{display:none;content:none}@layer vue-wswg-editor-library{*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com*/*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.static{position:static}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.left-0{left:0}.right-1{right:.25rem}.right-2{right:.5rem}.start-0{inset-inline-start:0px}.top-0{top:0}.top-1{top:.25rem}.top-2{top:.5rem}.z-10{z-index:10}.z-40{z-index:40}.float-left{float:left}.m-1{margin:.25rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-9{margin-bottom:2.25rem}.ml-1{margin-left:.25rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-auto{margin-right:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.size-10{width:2.5rem;height:2.5rem}.size-16{width:4rem;height:4rem}.size-20{width:5rem;height:5rem}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.size-8{width:2rem;height:2rem}.h-28{height:7rem}.h-7{height:1.75rem}.h-auto{height:auto}.h-full{height:100%}.w-96{width:24rem}.w-auto{width:auto}.w-full{width:100%}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(209 213 219 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-pretty{text-wrap:pretty}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-800\/20{border-color:#1e40af33}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-zinc-200{--tw-border-opacity: 1;border-color:rgb(228 228 231 / var(--tw-border-opacity, 1))}.border-b-transparent{border-bottom-color:transparent}.\!bg-white{--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/80{background-color:#eff6ffcc}.bg-blue-700{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-zinc-100{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.bg-zinc-200{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.bg-zinc-300{--tw-bg-opacity: 1;background-color:rgb(212 212 216 / var(--tw-bg-opacity, 1))}.bg-zinc-50{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-zinc-700{--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-0{padding-left:0;padding-right:0}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.pb-7{padding-bottom:1.75rem}.pt-0{padding-top:0}.pt-3{padding-top:.75rem}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-neutral-900{--tw-text-opacity: 1;color:rgb(23 23 23 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-zinc-300{--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.text-zinc-500{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.text-zinc-600{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.text-zinc-900{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[inset-inline-start\]{transition-property:inset-inline-start;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.\[-webkit-tap-highlight-color\:transparent\]{-webkit-tap-highlight-color:transparent}.\[vue-wswg-editor\:registry\]{vue-wswg-editor:registry}}.first-letter\:uppercase:first-letter{text-transform:uppercase}.hover\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\:border-red-200:hover{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.hover\:border-zinc-300:hover{--tw-border-opacity: 1;border-color:rgb(212 212 216 / var(--tw-border-opacity, 1))}.hover\:border-zinc-400:hover{--tw-border-opacity: 1;border-color:rgb(161 161 170 / var(--tw-border-opacity, 1))}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-400\/75:hover{background-color:#9ca3afbf}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-100:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-200:hover{--tw-bg-opacity: 1;background-color:rgb(228 228 231 / var(--tw-bg-opacity, 1))}.hover\:bg-zinc-500:hover{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-zinc-600:hover{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.hover\:text-zinc-700:hover{--tw-text-opacity: 1;color:rgb(63 63 70 / var(--tw-text-opacity, 1))}.hover\:text-zinc-900:hover{--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-sm:hover{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.active\:border-blue-600:active{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.active\:bg-blue-50:active{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.active\:text-blue-600:active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:start-6{inset-inline-start:1.5rem}.has-\[\:checked\]\:hover\:bg-emerald-800:hover:has(:checked){--tw-bg-opacity: 1;background-color:rgb(6 95 70 / var(--tw-bg-opacity, 1))}@media (min-width: 768px){.md\:p-3{padding:.75rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}}
@@ -4,6 +4,7 @@ type __VLS_Props = {
4
4
  editable: boolean;
5
5
  isLayoutBlock?: boolean;
6
6
  nested?: boolean;
7
+ activeTab?: string;
7
8
  };
8
9
  type __VLS_PublicProps = __VLS_Props & {
9
10
  modelValue?: any;
@@ -0,0 +1,21 @@
1
+ import type { Block } from "../../types/Block";
2
+ type __VLS_Props = {
3
+ blocks: Block[];
4
+ layout?: string;
5
+ settings?: Record<string, any>;
6
+ activeBlock?: Block | null;
7
+ hoveredBlockId?: string | null;
8
+ editable?: boolean;
9
+ settingsOpen?: boolean;
10
+ theme?: string;
11
+ };
12
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
13
+ settings: Record<string, any>;
14
+ editable: boolean;
15
+ hoveredBlockId: string | null;
16
+ layout: string;
17
+ activeBlock: Block | null;
18
+ settingsOpen: boolean;
19
+ theme: string;
20
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
21
+ export default _default;
@@ -1,15 +1,9 @@
1
1
  type __VLS_Props = {
2
2
  editable: boolean;
3
3
  };
4
- type __VLS_PublicProps = __VLS_Props & {
5
- "showAddBlockMenu"?: boolean;
6
- };
7
- declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
8
- "update:showAddBlockMenu": (value: boolean | undefined) => any;
9
- } & {
4
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
10
5
  blockAdded: (blockType: string) => any;
11
- }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
12
- "onUpdate:showAddBlockMenu"?: ((value: boolean | undefined) => any) | undefined;
6
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
13
7
  onBlockAdded?: ((blockType: string) => any) | undefined;
14
8
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
9
  export default _default;
@@ -0,0 +1,26 @@
1
+ import type { Block } from "../../types/Block";
2
+ type __VLS_Props = {
3
+ pageData?: Record<string, any>;
4
+ activeBlock: Block | null;
5
+ hoveredBlockId: string | null;
6
+ viewport: "desktop" | "mobile";
7
+ editable?: boolean;
8
+ blocksKey?: string;
9
+ settingsKey?: string;
10
+ settingsOpen?: boolean;
11
+ theme?: string;
12
+ };
13
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
14
+ "hover-block": (blockId: string | null) => any;
15
+ "click-block": (block: any) => any;
16
+ "block-reorder": (oldIndex: number, newIndex: number) => any;
17
+ "block-add": (blockType: string, index: number) => any;
18
+ "click-partial": (partialValue: string) => any;
19
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ "onHover-block"?: ((blockId: string | null) => any) | undefined;
21
+ "onClick-block"?: ((block: any) => any) | undefined;
22
+ "onBlock-reorder"?: ((oldIndex: number, newIndex: number) => any) | undefined;
23
+ "onBlock-add"?: ((blockType: string, index: number) => any) | undefined;
24
+ "onClick-partial"?: ((partialValue: string) => any) | undefined;
25
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
+ export default _default;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generate HTML content for the iframe
3
+ * This creates a standalone HTML page with a Vue app that will be loaded in the iframe
4
+ * The Vue app uses PageRenderer to render blocks reactively
5
+ *
6
+ * @param iframeAppModuleUrl - URL to the iframe app module bundle
7
+ * This should be obtained using import.meta.url from iframePreviewApp.ts
8
+ */
9
+ export declare function generateIframeHTML(iframeAppModuleUrl?: string): string;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Iframe Preview Vue Application
3
+ *
4
+ * This file creates a Vue application that runs inside the iframe preview.
5
+ * Since the library is consumed as source code, consuming apps' Vite builds
6
+ * will process this file, giving it access to virtual modules (blocks/layouts).
7
+ *
8
+ * Usage in consuming apps:
9
+ * ```ts
10
+ * import { createIframeApp, getIframeAppModuleUrl } from 'vue-wswg-editor/IframePreviewApp'
11
+ * ```
12
+ */
13
+ import { type App } from "vue";
14
+ import type { Block } from "../../types/Block";
15
+ /**
16
+ * Get the URL of this module
17
+ * This can be used to import the module in the iframe HTML
18
+ */
19
+ export declare function getIframeAppModuleUrl(): string;
20
+ export interface IframeAppState {
21
+ pageData: Record<string, any> | null;
22
+ activeBlock: Block | null;
23
+ hoveredBlockId: string | null;
24
+ blocksKey: string;
25
+ settingsKey: string;
26
+ settingsOpen: boolean;
27
+ theme: string;
28
+ }
29
+ export interface IframeAppCallbacks {
30
+ onBlockClick?: (blockId: string, block: Block | null) => void;
31
+ onBlockHover?: (blockId: string | null) => void;
32
+ }
33
+ /**
34
+ * Create and mount the Vue app for the iframe preview
35
+ */
36
+ export declare function createIframeApp(container: HTMLElement): Promise<App>;
@@ -0,0 +1,55 @@
1
+ import type { IframeMessage, ParentMessage } from "./types";
2
+ import type { Block } from "../../types/Block";
3
+ /**
4
+ * Send a message to the iframe
5
+ */
6
+ export declare function sendToIframe(iframe: HTMLIFrameElement | null, message: IframeMessage): void;
7
+ /**
8
+ * Send page data update to iframe
9
+ */
10
+ export declare function sendPageDataUpdate(iframe: HTMLIFrameElement | null, pageData: Record<string, any>, blocksKey: string, settingsKey: string, theme: string): void;
11
+ /**
12
+ * Send rendered HTML to iframe
13
+ */
14
+ export declare function sendHTMLUpdate(iframe: HTMLIFrameElement | null, html: string, pageData?: Record<string, any>, blocksKey?: string, settingsKey?: string): void;
15
+ /**
16
+ * Send active block update to iframe
17
+ */
18
+ export declare function sendActiveBlock(iframe: HTMLIFrameElement | null, block: Block | null): void;
19
+ /**
20
+ * Send hovered block update to iframe
21
+ */
22
+ export declare function sendHoveredBlock(iframe: HTMLIFrameElement | null, blockId: string | null): void;
23
+ /**
24
+ * Send settings open state update to iframe
25
+ */
26
+ export declare function sendSettingsOpen(iframe: HTMLIFrameElement | null, settingsOpen: boolean): void;
27
+ /**
28
+ * Send viewport update to iframe
29
+ */
30
+ export declare function sendViewport(iframe: HTMLIFrameElement | null, viewport: "desktop" | "mobile"): void;
31
+ /**
32
+ * Send scroll to block command to iframe
33
+ */
34
+ export declare function sendScrollToBlock(iframe: HTMLIFrameElement | null, blockId: string): void;
35
+ /**
36
+ * Validate incoming message from iframe
37
+ */
38
+ export declare function isValidParentMessage(message: any): message is ParentMessage;
39
+ /**
40
+ * Handle incoming message from iframe
41
+ */
42
+ export declare function handleIframeMessage(event: MessageEvent, callbacks: {
43
+ onBlockClick?: (blockId: string, block: any) => void;
44
+ onBlockHover?: (blockId: string | null) => void;
45
+ onBlockReorder?: (oldIndex: number, newIndex: number) => void;
46
+ onBlockAdd?: (blockType: string, index: number) => void;
47
+ onPartialClick?: (partialValue: string) => void;
48
+ onIframeReady?: () => void;
49
+ onBlockPosition?: (blockId: string, position: {
50
+ top: number;
51
+ left: number;
52
+ width: number;
53
+ height: number;
54
+ }) => void;
55
+ }): void;
@@ -0,0 +1,77 @@
1
+ import type { Block } from "../../types/Block";
2
+ export type MessageType = "UPDATE_PAGE_DATA" | "UPDATE_HTML" | "SET_ACTIVE_BLOCK" | "SET_HOVERED_BLOCK" | "SET_SETTINGS_OPEN" | "SET_VIEWPORT" | "CLICK_PARTIAL" | "SCROLL_TO_BLOCK" | "BLOCK_CLICK" | "BLOCK_HOVER" | "BLOCK_REORDER" | "BLOCK_ADD" | "IFRAME_READY" | "BLOCK_ELEMENT_POSITION";
3
+ export interface BaseMessage {
4
+ type: MessageType;
5
+ }
6
+ export interface UpdatePageDataMessage extends BaseMessage {
7
+ type: "UPDATE_PAGE_DATA";
8
+ pageData: Record<string, any>;
9
+ blocksKey: string;
10
+ settingsKey: string;
11
+ theme: string;
12
+ }
13
+ export interface UpdateHTMLMessage extends BaseMessage {
14
+ type: "UPDATE_HTML";
15
+ html: string;
16
+ pageData?: Record<string, any>;
17
+ blocksKey?: string;
18
+ settingsKey?: string;
19
+ }
20
+ export interface SetActiveBlockMessage extends BaseMessage {
21
+ type: "SET_ACTIVE_BLOCK";
22
+ block: Block | null;
23
+ }
24
+ export interface SetHoveredBlockMessage extends BaseMessage {
25
+ type: "SET_HOVERED_BLOCK";
26
+ blockId: string | null;
27
+ }
28
+ export interface SetSettingsOpenMessage extends BaseMessage {
29
+ type: "SET_SETTINGS_OPEN";
30
+ settingsOpen: boolean;
31
+ }
32
+ export interface SetViewportMessage extends BaseMessage {
33
+ type: "SET_VIEWPORT";
34
+ viewport: "desktop" | "mobile";
35
+ }
36
+ export interface PartialClickMessage extends BaseMessage {
37
+ type: "CLICK_PARTIAL";
38
+ partial: string;
39
+ }
40
+ export interface ScrollToBlockMessage extends BaseMessage {
41
+ type: "SCROLL_TO_BLOCK";
42
+ blockId: string;
43
+ }
44
+ export interface BlockClickMessage extends BaseMessage {
45
+ type: "BLOCK_CLICK";
46
+ blockId: string;
47
+ block: any;
48
+ }
49
+ export interface BlockHoverMessage extends BaseMessage {
50
+ type: "BLOCK_HOVER";
51
+ blockId: string | null;
52
+ }
53
+ export interface BlockReorderMessage extends BaseMessage {
54
+ type: "BLOCK_REORDER";
55
+ oldIndex: number;
56
+ newIndex: number;
57
+ }
58
+ export interface BlockAddMessage extends BaseMessage {
59
+ type: "BLOCK_ADD";
60
+ blockType: string;
61
+ index: number;
62
+ }
63
+ export interface IframeReadyMessage extends BaseMessage {
64
+ type: "IFRAME_READY";
65
+ }
66
+ export interface BlockElementPositionMessage extends BaseMessage {
67
+ type: "BLOCK_ELEMENT_POSITION";
68
+ blockId: string;
69
+ position: {
70
+ top: number;
71
+ left: number;
72
+ width: number;
73
+ height: number;
74
+ };
75
+ }
76
+ export type IframeMessage = UpdatePageDataMessage | UpdateHTMLMessage | SetActiveBlockMessage | SetHoveredBlockMessage | SetSettingsOpenMessage | SetViewportMessage | ScrollToBlockMessage | PartialClickMessage;
77
+ export type ParentMessage = BlockClickMessage | BlockHoverMessage | BlockReorderMessage | BlockAddMessage | IframeReadyMessage | BlockElementPositionMessage | PartialClickMessage;
@@ -3,6 +3,7 @@ type __VLS_Props = {
3
3
  blocksKey?: string;
4
4
  settingsKey?: string;
5
5
  hasPageSettings?: boolean;
6
+ activeSettingsTab?: string;
6
7
  };
7
8
  type __VLS_PublicProps = __VLS_Props & {
8
9
  modelValue?: any;
@@ -31,5 +32,6 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
31
32
  blocksKey: string;
32
33
  settingsKey: string;
33
34
  hasPageSettings: boolean;
35
+ activeSettingsTab: string;
34
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
35
37
  export default _default;
@@ -4,10 +4,12 @@ type __VLS_Props = {
4
4
  layout?: string;
5
5
  settings?: Record<string, any>;
6
6
  withLayout?: boolean;
7
+ theme?: string;
7
8
  };
8
9
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
9
10
  settings: Record<string, any>;
10
11
  layout: string;
12
+ theme: string;
11
13
  withLayout: boolean;
12
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
15
  export default _default;
@@ -1,5 +1,6 @@
1
1
  type __VLS_Props = {
2
2
  settingsKey?: string;
3
+ activeTab?: string;
3
4
  };
4
5
  type __VLS_PublicProps = __VLS_Props & {
5
6
  modelValue?: any;
@@ -12,6 +13,7 @@ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {},
12
13
  onClose?: (() => any) | undefined;
13
14
  "onUpdate:modelValue"?: ((value: any) => any) | undefined;
14
15
  }>, {
16
+ activeTab: string;
15
17
  settingsKey: string;
16
18
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
19
  export default _default;
@@ -6,6 +6,7 @@ type __VLS_Props = {
6
6
  blocksKey?: string;
7
7
  settingsKey?: string;
8
8
  defaultBlockMargin?: "none" | "small" | "medium" | "large";
9
+ theme?: string;
9
10
  };
10
11
  type __VLS_PublicProps = __VLS_Props & {
11
12
  modelValue?: Record<string, any>;
@@ -23,6 +24,7 @@ declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps,
23
24
  editable: boolean;
24
25
  blocksKey: string;
25
26
  settingsKey: string;
27
+ theme: string;
26
28
  loading: boolean;
27
29
  showBrowserBar: boolean;
28
30
  defaultBlockMargin: "none" | "small" | "medium" | "large";
@@ -1,7 +1,13 @@
1
1
  export { createField } from "./util/fieldConfig";
2
2
  export type { EditorFieldConfig, ValidatorFunction } from "./util/fieldConfig";
3
- export { getLayouts, initialiseRegistry } from "./util/registry";
3
+ export { getLayouts, initialiseRegistry, initialiseLayoutRegistry, initialiseBlockRegistry } from "./util/registry";
4
4
  export { validateField, validateAllFields, type ValidationResult } from "./util/validation";
5
- export { default as WswgJsonEditor } from "./components/WswgJsonEditor/WswgJsonEditor.vue";
5
+ export { getActiveTheme, setActiveTheme, getThemeThumbnail, getThemes } from "./util/theme-registry";
6
+ export type { Theme } from "./types/Theme";
7
+ export type { Layout } from "./types/Layout";
8
+ export type { Block } from "./types/Block";
9
+ export { default as WswgPageBuilder } from "./components/WswgPageBuilder/WswgPageBuilder.vue";
6
10
  export { default as PageRenderer } from "./components/PageRenderer/PageRenderer.vue";
11
+ export { createIframeApp, getIframeAppModuleUrl } from "./components/IframePreview/iframePreviewApp";
12
+ export type { IframeAppState, IframeAppCallbacks } from "./components/IframePreview/iframePreviewApp";
7
13
  import "./style.css";
@@ -22,4 +22,6 @@ export declare function getLayouts(): Record<string, Layout>;
22
22
  export declare function getBlockThumbnailUrl(directory: string | undefined): string | undefined;
23
23
  export declare function getBlockComponent(blockType: string): Block | undefined;
24
24
  export declare function getLayoutFields(layoutName: string): Record<string, EditorFieldConfig>;
25
+ export declare function initialiseLayoutRegistry(): Promise<void>;
26
+ export declare function initialiseBlockRegistry(): Promise<void>;
25
27
  export declare function initialiseRegistry(): Promise<void>;
@@ -0,0 +1,42 @@
1
+ import { type Ref } from "vue";
2
+ import type { Theme } from "../types/Theme";
3
+ import type { Layout } from "../types/Layout";
4
+ import type { Block } from "../types/Block";
5
+ import { EditorFieldConfig } from "./fieldConfig";
6
+ /**
7
+ * Registry of all page builder themes, blocks, layouts, fields & thumbnails
8
+ */
9
+ export declare const pageBuilderThemes: Ref<Record<string, Theme>>;
10
+ export declare const themeLayouts: Ref<Record<string, Layout>>;
11
+ export declare const themeBlocks: Ref<Record<string, Block>>;
12
+ export declare const themeBlockFields: Ref<Record<string, Record<string, EditorFieldConfig>>>;
13
+ export declare const activeThemeId: Ref<string | undefined>;
14
+ /**
15
+ * Extract the default export from a module, handling different module formats
16
+ * Works with both eager and lazy-loaded modules from import.meta.glob
17
+ */
18
+ export declare function getModuleDefault(module: any): any;
19
+ /**************************************************
20
+ * THEMES
21
+ **************************************************/
22
+ export declare function initialiseThemeRegistry(): Promise<void>;
23
+ export declare function getThemes(): Theme[];
24
+ export declare function getActiveTheme(): Theme;
25
+ export declare function setActiveTheme(themeId?: string): Promise<void>;
26
+ export declare function getThemeThumbnail(themeDirectory: string): string | undefined;
27
+ /**************************************************
28
+ * LAYOUTS
29
+ **************************************************/
30
+ export declare function initialiseLayoutRegistry(): Promise<void>;
31
+ export declare function getLayout(layoutType: string): Layout | undefined;
32
+ /**************************************************
33
+ * BLOCKS
34
+ **************************************************/
35
+ export declare function initialiseBlockRegistry(): Promise<void>;
36
+ export declare function getBlock(blockType: string): Block | undefined;
37
+ export declare function getBlockThumbnail(blockDirectory: string): string | undefined;
38
+ /**
39
+ * Initialize the registry with a specific theme
40
+ * @param themeId - The theme ID to load blocks/layouts from
41
+ */
42
+ export declare function initialiseRegistry(themeId?: string, useEditingRegistry?: boolean): Promise<void>;
@@ -1,9 +1,9 @@
1
1
  import type { EditorFieldConfig, ValidatorFunction } from "./fieldConfig";
2
- export declare function validateField(value: any, fieldConfig: EditorFieldConfig): true | Promise<string | boolean>;
2
+ export declare function validateField(value: any, fieldConfig: EditorFieldConfig): Promise<boolean | string | ValidationResult>;
3
3
  export interface ValidationResult {
4
4
  title: string;
5
5
  isValid: boolean;
6
- errors: Record<string, string | boolean>;
6
+ errors: Record<string, string | boolean | ValidationResult>;
7
7
  }
8
8
  /**
9
9
  * Validate all fields in the value