kritzel-stencil 0.1.12 → 0.1.14

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 (52) hide show
  1. package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +22 -28
  2. package/dist/collection/classes/core/core.class.js +6 -0
  3. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +1 -2
  4. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.css +4 -8
  5. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.js +1 -7
  6. package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.css +4 -8
  7. package/dist/collection/components/shared/kritzel-master-detail/kritzel-master-detail.js +5 -11
  8. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.css +5 -0
  9. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +5 -0
  10. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +2 -0
  11. package/dist/collection/components/ui/kritzel-export/kritzel-export.css +5 -0
  12. package/dist/collection/constants/version.js +1 -1
  13. package/dist/collection/helpers/html.helper.js +2 -1
  14. package/dist/components/index.js +1 -1
  15. package/dist/components/kritzel-controls.js +1 -1
  16. package/dist/components/kritzel-dialog.js +1 -1
  17. package/dist/components/kritzel-editor.js +1 -1
  18. package/dist/components/kritzel-engine.js +1 -1
  19. package/dist/components/kritzel-export.js +1 -1
  20. package/dist/components/kritzel-master-detail.js +1 -1
  21. package/dist/components/kritzel-menu-item.js +1 -1
  22. package/dist/components/kritzel-menu.js +1 -1
  23. package/dist/components/kritzel-more-menu.js +1 -1
  24. package/dist/components/kritzel-portal.js +1 -1
  25. package/dist/components/kritzel-settings.js +1 -1
  26. package/dist/components/kritzel-split-button.js +1 -1
  27. package/dist/components/kritzel-tooltip.js +1 -1
  28. package/dist/components/kritzel-workspace-manager.js +1 -1
  29. package/dist/components/p-9VVxMmQY.js +1 -0
  30. package/dist/components/{p--aa4aJEU.js → p-B6UZznNo.js} +1 -1
  31. package/dist/components/p-BML28BJR.js +1 -0
  32. package/dist/components/p-BtGrZ0-u.js +1 -0
  33. package/dist/components/{p-Csm0Kf0_.js → p-BtTXKrNq.js} +1 -1
  34. package/dist/components/{p-zoMPunTt.js → p-C2cNCqzd.js} +1 -1
  35. package/dist/components/{p-BVGy2ETQ.js → p-C40Eqc_i.js} +1 -1
  36. package/dist/components/p-C7GNWyf2.js +1 -0
  37. package/dist/components/{p-BvoIoyaZ.js → p-C8jozyvo.js} +1 -1
  38. package/dist/components/{p-CXGqvg3q.js → p-CEYFDak6.js} +1 -1
  39. package/dist/components/{p-DB-e1jRv.js → p-CSWxqKCC.js} +1 -1
  40. package/dist/components/{p-BbC4EJrJ.js → p-CpfCNRr2.js} +1 -1
  41. package/dist/components/{p-Dm9n3RrJ.js → p-DgMrqt6e.js} +1 -1
  42. package/dist/esm/kritzel-back-to-content_32.entry.js +22 -28
  43. package/dist/stencil/p-1e78ba5f.entry.js +9 -0
  44. package/dist/stencil/stencil.esm.js +1 -1
  45. package/dist/types/components/shared/kritzel-dialog/kritzel-dialog.d.ts +0 -1
  46. package/dist/types/constants/version.d.ts +1 -1
  47. package/package.json +1 -1
  48. package/dist/components/p-6yo07JPM.js +0 -1
  49. package/dist/components/p-Bz_LzbTD.js +0 -1
  50. package/dist/components/p-C6qB08BS.js +0 -1
  51. package/dist/components/p-DCFa1WDS.js +0 -1
  52. package/dist/stencil/p-b740c167.entry.js +0 -9
@@ -536,7 +536,7 @@ class KritzelToolConfigHelper {
536
536
  }
537
537
  }
538
538
 
539
- const kritzelControlsCss = () => `:host{display:flex;flex-direction:column;user-select:none;max-width:calc(100vw - 16px)}:host(.mobile){--kritzel-controls-control-hover-background-color:transparent;--kritzel-controls-control-active-background-color:transparent}.kritzel-controls{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--kritzel-controls-gap, 8px);height:100%;padding:var(--kritzel-controls-padding, 8px);background-color:var(--kritzel-controls-background-color, #ffffff);border-radius:var(--kritzel-controls-border-radius, 16px);box-shadow:var(--kritzel-controls-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-controls-border, 1px solid #ebebeb);z-index:10000;position:relative;max-width:100%;overflow:hidden}.kritzel-tools-scroll{display:flex;flex-direction:row;align-items:center;gap:var(--kritzel-controls-gap, 8px);overflow-x:auto;overflow-y:hidden;flex:1 1 auto;min-width:0;scrollbar-width:none;-ms-overflow-style:none}.kritzel-tools-scroll::-webkit-scrollbar{display:none}.scroll-indicator-left,.scroll-indicator-right{position:absolute;top:0;bottom:0;width:32px;pointer-events:none;opacity:0;transition:opacity 0.2s ease-out;z-index:1}.scroll-indicator-left{left:0;background:linear-gradient(to right, var(--kritzel-controls-background-color, #ffffff), transparent);border-radius:var(--kritzel-controls-border-radius, 16px) 0 0 var(--kritzel-controls-border-radius, 16px)}.scroll-indicator-right{right:0;background:linear-gradient(to left, var(--kritzel-controls-background-color, #ffffff), transparent);border-radius:0 var(--kritzel-controls-border-radius, 16px) var(--kritzel-controls-border-radius, 16px) 0}.scroll-indicator-left.visible,.scroll-indicator-right.visible{opacity:1}.kritzel-control{display:flex;justify-content:center;align-items:center;color:var(--kritzel-controls-control-color, #000000);border-radius:var(--kritzel-controls-control-border-radius, 12px);padding:var(--kritzel-controls-control-padding, 8px);border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;font-weight:bold}.kritzel-control:focus,.kritzel-control:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control.selected,.kritzel-control.selected:hover,.kritzel-control.selected:active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control.selected:focus{background-color:var(--kritzel-controls-control-selected-background-color, #007bffe3) !important}.kritzel-control-split{position:relative;display:flex;align-items:center;border-radius:var(--kritzel-controls-control-border-radius, 12px);color:var(--kritzel-controls-control-color, #000000)}.kritzel-control-split .kritzel-control-main{display:flex;justify-content:center;align-items:center;padding:var(--kritzel-controls-control-padding, 8px);border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;border-radius:var(--kritzel-controls-control-border-radius, 12px);color:inherit}.kritzel-control-split.selected .kritzel-control-main{border-radius:var(--kritzel-controls-control-border-radius, 12px) 0 0 var(--kritzel-controls-control-border-radius, 12px)}.kritzel-control-split .kritzel-control-dropdown{display:flex;justify-content:center;align-items:center;align-self:stretch;border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;border-radius:0 var(--kritzel-controls-control-border-radius, 12px) var(--kritzel-controls-control-border-radius, 12px) 0;color:inherit;width:0;padding:0;opacity:0;overflow:hidden;pointer-events:none;transition:width 0.15s ease-out, padding 0.15s ease-out, opacity 0.15s ease-out}.kritzel-control-split .kritzel-control-dropdown.visible{width:auto;padding:0 6px;opacity:1;pointer-events:auto}.kritzel-control-split .kritzel-control-main:focus,.kritzel-control-split .kritzel-control-main:hover,.kritzel-control-split .kritzel-control-dropdown:focus,.kritzel-control-split .kritzel-control-dropdown:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control-split .kritzel-control-main:active,.kritzel-control-split .kritzel-control-dropdown:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control-split.selected{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control-split.selected .kritzel-control-main:hover,.kritzel-control-split.selected .kritzel-control-dropdown:hover{background-color:rgba(255, 255, 255, 0.15)}.kritzel-submenu-content{display:flex;flex-direction:column;gap:var(--kritzel-submenu-gap, 4px);min-width:140px}.kritzel-submenu-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);border-radius:8px;color:var(--kritzel-controls-control-color, #000000);font-size:14px;text-align:left;white-space:nowrap;-webkit-tap-highlight-color:transparent}.kritzel-submenu-item:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-submenu-item.active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF);color:var(--kritzel-controls-control-selected-color, #ffffff)}.kritzel-submenu-item.active:hover{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF)}.kritzel-config-container{position:relative;display:flex;justify-content:center;align-items:center;height:40px;box-sizing:border-box;-webkit-tap-highlight-color:transparent;flex-shrink:0;width:0;opacity:0;overflow:hidden;pointer-events:none;margin-left:calc(-1 * var(--kritzel-controls-gap, 8px));transition:width 0.2s ease-out, opacity 0.2s ease-out, margin-left 0.2s ease-out}.kritzel-config-container.visible{width:40px;opacity:1;pointer-events:auto;margin-left:0;overflow:visible}.config-gradient-left{position:absolute;top:0;bottom:0;left:-32px;width:32px;background:linear-gradient(to right, transparent, var(--kritzel-controls-background-color, #ffffff));pointer-events:none;z-index:1;opacity:0;transition:opacity 0.2s ease-out}.config-gradient-left.visible{opacity:1}.kritzel-config{display:flex;justify-content:center;align-items:center;cursor:var(--kritzel-pointer-cursor, pointer);border-radius:50%}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:var(--kritzel-pointer-cursor, pointer);border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.font-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:var(--kritzel-pointer-cursor, pointer);border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.no-config{height:24px;width:24px;border-radius:50%;border:1px dashed gray}kritzel-tooltip{z-index:10001}`;
539
+ const kritzelControlsCss = () => `:host{display:flex;flex-direction:column;user-select:none;max-width:calc(100vw - 16px)}:host(.mobile){--kritzel-controls-control-hover-background-color:transparent;--kritzel-controls-control-active-background-color:transparent}.kritzel-controls{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--kritzel-controls-gap, 8px);height:100%;padding:var(--kritzel-controls-padding, 8px);background-color:var(--kritzel-controls-background-color, #ffffff);border-radius:var(--kritzel-controls-border-radius, 16px);box-shadow:var(--kritzel-controls-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-controls-border, 1px solid #ebebeb);z-index:10000;position:relative;max-width:100%;overflow:hidden}.kritzel-tools-scroll{display:flex;flex-direction:row;align-items:center;gap:var(--kritzel-controls-gap, 8px);overflow-x:auto;overflow-y:hidden;flex:1 1 auto;min-width:0;padding:4px;margin:-4px;scrollbar-width:none;-ms-overflow-style:none}.kritzel-tools-scroll::-webkit-scrollbar{display:none}.scroll-indicator-left,.scroll-indicator-right{position:absolute;top:0;bottom:0;width:32px;pointer-events:none;opacity:0;transition:opacity 0.2s ease-out;z-index:1}.scroll-indicator-left{left:0;background:linear-gradient(to right, var(--kritzel-controls-background-color, #ffffff), transparent);border-radius:var(--kritzel-controls-border-radius, 16px) 0 0 var(--kritzel-controls-border-radius, 16px)}.scroll-indicator-right{right:0;background:linear-gradient(to left, var(--kritzel-controls-background-color, #ffffff), transparent);border-radius:0 var(--kritzel-controls-border-radius, 16px) var(--kritzel-controls-border-radius, 16px) 0}.scroll-indicator-left.visible,.scroll-indicator-right.visible{opacity:1}.kritzel-control{display:flex;justify-content:center;align-items:center;color:var(--kritzel-controls-control-color, #000000);border-radius:var(--kritzel-controls-control-border-radius, 12px);padding:var(--kritzel-controls-control-padding, 8px);border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;font-weight:bold}.kritzel-control:focus,.kritzel-control:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control.selected,.kritzel-control.selected:hover,.kritzel-control.selected:active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control.selected:focus{background-color:var(--kritzel-controls-control-selected-background-color, #007bffe3) !important}.kritzel-control-split{position:relative;display:flex;align-items:center;border-radius:var(--kritzel-controls-control-border-radius, 12px);color:var(--kritzel-controls-control-color, #000000)}.kritzel-control-split .kritzel-control-main{display:flex;justify-content:center;align-items:center;padding:var(--kritzel-controls-control-padding, 8px);border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;border-radius:var(--kritzel-controls-control-border-radius, 12px);color:inherit}.kritzel-control-split.selected .kritzel-control-main{border-radius:var(--kritzel-controls-control-border-radius, 12px) 0 0 var(--kritzel-controls-control-border-radius, 12px)}.kritzel-control-split .kritzel-control-dropdown{display:flex;justify-content:center;align-items:center;align-self:stretch;border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);-webkit-tap-highlight-color:transparent;border-radius:0 var(--kritzel-controls-control-border-radius, 12px) var(--kritzel-controls-control-border-radius, 12px) 0;color:inherit;width:0;padding:0;opacity:0;overflow:hidden;pointer-events:none;transition:width 0.15s ease-out, padding 0.15s ease-out, opacity 0.15s ease-out}.kritzel-control-split .kritzel-control-dropdown.visible{width:auto;padding:0 6px;opacity:1;pointer-events:auto}.kritzel-control-split .kritzel-control-main:focus,.kritzel-control-split .kritzel-control-main:hover,.kritzel-control-split .kritzel-control-dropdown:focus,.kritzel-control-split .kritzel-control-dropdown:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control-split .kritzel-control-main:active,.kritzel-control-split .kritzel-control-dropdown:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control-split.selected{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control-split.selected .kritzel-control-main:hover,.kritzel-control-split.selected .kritzel-control-dropdown:hover{background-color:rgba(255, 255, 255, 0.15)}.kritzel-submenu-content{display:flex;flex-direction:column;gap:var(--kritzel-submenu-gap, 4px);min-width:140px}.kritzel-submenu-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border:none;background:none;cursor:var(--kritzel-pointer-cursor, pointer);border-radius:8px;color:var(--kritzel-controls-control-color, #000000);font-size:14px;text-align:left;white-space:nowrap;-webkit-tap-highlight-color:transparent}.kritzel-submenu-item:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-submenu-item.active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF);color:var(--kritzel-controls-control-selected-color, #ffffff)}.kritzel-submenu-item.active:hover{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF)}.kritzel-config-container{position:relative;display:flex;justify-content:center;align-items:center;height:40px;box-sizing:border-box;-webkit-tap-highlight-color:transparent;flex-shrink:0;width:0;opacity:0;overflow:hidden;pointer-events:none;margin-left:calc(-1 * var(--kritzel-controls-gap, 8px));transition:width 0.2s ease-out, opacity 0.2s ease-out, margin-left 0.2s ease-out}.kritzel-config-container.visible{width:40px;opacity:1;pointer-events:auto;margin-left:0;overflow:visible}.config-gradient-left{position:absolute;top:0;bottom:0;left:-32px;width:32px;background:linear-gradient(to right, transparent, var(--kritzel-controls-background-color, #ffffff));pointer-events:none;z-index:1;opacity:0;transition:opacity 0.2s ease-out}.config-gradient-left.visible{opacity:1}.kritzel-config{display:flex;justify-content:center;align-items:center;cursor:var(--kritzel-pointer-cursor, pointer);border-radius:50%}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:var(--kritzel-pointer-cursor, pointer);border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.font-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:var(--kritzel-pointer-cursor, pointer);border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.no-config{height:24px;width:24px;border-radius:50%;border:1px dashed gray}kritzel-tooltip{z-index:10001}`;
540
540
 
541
541
  const KritzelControls = class {
542
542
  constructor(hostRef) {
@@ -954,7 +954,8 @@ class KritzelHTMLHelper {
954
954
  const focusableElements = [];
955
955
  const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details, [tabindex]:not([tabindex="-1"])';
956
956
  const isVisible = (el) => {
957
- return el.offsetParent !== null;
957
+ const style = window.getComputedStyle(el);
958
+ return style.display !== 'none' && style.visibility !== 'hidden';
958
959
  };
959
960
  const find = (element) => {
960
961
  // Check if the element itself is focusable
@@ -979,7 +980,7 @@ class KritzelHTMLHelper {
979
980
  }
980
981
  }
981
982
 
982
- const kritzelDialogCss = () => `:host{display:contents}.backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10002;display:flex;align-items:center;justify-content:center;background-color:var(--kritzel-dialog-backdrop-color, rgba(0, 0, 0, 0.5));opacity:1;transition:opacity 150ms ease-out}.backdrop.is-animating{opacity:0}.dialog-content{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-dialog-background-color, #ffffff);border-radius:var(--kritzel-dialog-border-radius, 12px);box-shadow:var(--kritzel-dialog-box-shadow, 0 4px 20px rgba(0, 0, 0, 0.15));border:var(--kritzel-dialog-border, 1px solid #ebebeb);max-height:var(--kritzel-dialog-max-height, 90vh);max-width:var(--kritzel-dialog-max-width, 90vw);overflow:hidden;transform:scale(1);opacity:1;transition:transform 200ms ease-out, opacity 200ms ease-out;font-family:var(--kritzel-dialog-font-family, sans-serif)}.dialog-content.is-animating{transform:scale(0.95);opacity:0}.dialog-content.size-small{width:var(--kritzel-dialog-width-small, 320px);height:var(--kritzel-dialog-height-small, auto)}.dialog-content.size-medium{width:var(--kritzel-dialog-width-medium, 480px);height:var(--kritzel-dialog-height-medium, auto)}.dialog-content.size-large{width:var(--kritzel-dialog-width-large, 640px);height:var(--kritzel-dialog-height-large, auto)}.dialog-content.size-fullscreen{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}@media (max-width: 576px){.backdrop:has(.fullscreen-on-mobile){background-color:transparent}.dialog-content.fullscreen-on-mobile{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--kritzel-dialog-header-padding, 16px 20px);border-bottom:var(--kritzel-dialog-header-border, 1px solid #ebebeb);gap:12px}.dialog-title{margin:0;font-size:var(--kritzel-dialog-title-font-size, 18px);font-weight:var(--kritzel-dialog-title-font-weight, 600);color:var(--kritzel-dialog-title-color, #1a1a1a);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.close-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--kritzel-dialog-close-button-border-radius, 6px);background-color:var(--kritzel-dialog-close-button-background, transparent);color:var(--kritzel-dialog-close-button-color, #666666);cursor:var(--kritzel-pointer-cursor, pointer);transition:background-color 150ms ease, color 150ms ease;flex-shrink:0;-webkit-tap-highlight-color:transparent}.close-button:hover{background-color:var(--kritzel-dialog-close-button-hover-background, #f5f5f5);color:var(--kritzel-dialog-close-button-hover-color, #1a1a1a)}.close-button:focus{outline:none}.close-button:focus-visible{outline:2px solid var(--kritzel-dialog-focus-ring-color, #0066cc);outline-offset:2px}.close-button:active{background-color:var(--kritzel-dialog-close-button-active-background, #ebebeb)}.dialog-body{padding:var(--kritzel-dialog-body-padding, 20px);overflow-y:auto;flex:1;scrollbar-color:#ebebeb transparent;scrollbar-width:thin}.dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--kritzel-dialog-footer-gap, 8px);padding:var(--kritzel-dialog-footer-padding, 16px 20px);border-top:var(--kritzel-dialog-footer-border, 1px solid #ebebeb)}::slotted([slot='header']){flex:1}::slotted([slot='footer']){display:contents}`;
983
+ const kritzelDialogCss = () => `:host{display:contents}.backdrop{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10002;display:flex;align-items:center;justify-content:center;background-color:var(--kritzel-dialog-backdrop-color, rgba(0, 0, 0, 0.5));opacity:1;transition:opacity 150ms ease-out}.backdrop.is-animating{opacity:0}.dialog-content{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-dialog-background-color, #ffffff);border-radius:var(--kritzel-dialog-border-radius, 12px);box-shadow:var(--kritzel-dialog-box-shadow, 0 4px 20px rgba(0, 0, 0, 0.15));border:var(--kritzel-dialog-border, 1px solid #ebebeb);max-height:var(--kritzel-dialog-max-height, 90vh);max-width:var(--kritzel-dialog-max-width, 90vw);overflow:hidden;transform:scale(1);opacity:1;transition:transform 200ms ease-out, opacity 200ms ease-out;font-family:var(--kritzel-dialog-font-family, sans-serif)}.dialog-content.is-animating{transform:scale(0.95);opacity:0}.dialog-content.size-small{width:var(--kritzel-dialog-width-small, 320px);height:var(--kritzel-dialog-height-small, auto)}.dialog-content.size-medium{width:var(--kritzel-dialog-width-medium, 480px);height:var(--kritzel-dialog-height-medium, auto)}.dialog-content.size-large{width:var(--kritzel-dialog-width-large, 640px);height:var(--kritzel-dialog-height-large, auto)}.dialog-content.size-fullscreen{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}@media (max-width: 576px){.backdrop:has(.fullscreen-on-mobile){background-color:transparent}.dialog-content.fullscreen-on-mobile{width:100vw;height:100vh;height:100dvh;max-width:100vw;max-height:100vh;max-height:100dvh;border-radius:0}}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:var(--kritzel-dialog-header-padding, 16px 20px);border-bottom:var(--kritzel-dialog-header-border, 1px solid #ebebeb);gap:12px}.dialog-title{margin:0;font-size:var(--kritzel-dialog-title-font-size, 18px);font-weight:var(--kritzel-dialog-title-font-weight, 600);color:var(--kritzel-dialog-title-color, #1a1a1a);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.close-button{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--kritzel-dialog-close-button-border-radius, 6px);background-color:var(--kritzel-dialog-close-button-background, transparent);color:var(--kritzel-dialog-close-button-color, #666666);cursor:var(--kritzel-pointer-cursor, pointer);transition:background-color 150ms ease, color 150ms ease;flex-shrink:0;-webkit-tap-highlight-color:transparent}.close-button:hover{background-color:var(--kritzel-dialog-close-button-hover-background, #f5f5f5);color:var(--kritzel-dialog-close-button-hover-color, #1a1a1a)}.close-button:active{background-color:var(--kritzel-dialog-close-button-active-background, #ebebeb)}.close-button:focus-visible{outline:revert;outline-offset:revert}.dialog-body{padding:var(--kritzel-dialog-body-padding, 20px);overflow-y:auto;flex:1;scrollbar-color:#ebebeb transparent;scrollbar-width:thin}.dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--kritzel-dialog-footer-gap, 8px);padding:var(--kritzel-dialog-footer-padding, 16px 20px);border-top:var(--kritzel-dialog-footer-border, 1px solid #ebebeb)}::slotted([slot='header']){flex:1}::slotted([slot='footer']){display:contents}`;
983
984
 
984
985
  const KritzelDialog = class {
985
986
  constructor(hostRef) {
@@ -1105,19 +1106,13 @@ const KritzelDialog = class {
1105
1106
  slots.forEach(slot => {
1106
1107
  const assigned = slot.assignedElements({ flatten: true });
1107
1108
  assigned.forEach(el => {
1109
+ // Use KritzelHTMLHelper to find focusable elements including those in nested shadow DOMs
1108
1110
  const elements = KritzelHTMLHelper.getFocusableElements(el);
1109
1111
  focusable.push(...elements);
1110
- if (this.isFocusable(el)) {
1111
- focusable.push(el);
1112
- }
1113
1112
  });
1114
1113
  });
1115
1114
  return focusable;
1116
1115
  }
1117
- isFocusable(el) {
1118
- const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details, [tabindex]:not([tabindex="-1"])';
1119
- return el.matches(focusableSelector);
1120
- }
1121
1116
  handleTabKey(event) {
1122
1117
  const focusableElements = this.getSlottedFocusableElements();
1123
1118
  const closeButton = this.host.shadowRoot?.querySelector('.close-button');
@@ -1710,7 +1705,6 @@ const KritzelEditor = class {
1710
1705
  this.undoState = event.detail;
1711
1706
  }
1712
1707
  handleObjectsInViewportChange(event) {
1713
- console.log(event.detail.length);
1714
1708
  const hasVisibleObjects = event.detail.length > 0;
1715
1709
  this.isBackToContentButtonVisible = !hasVisibleObjects;
1716
1710
  }
@@ -1766,7 +1760,7 @@ const KritzelEditor = class {
1766
1760
  }
1767
1761
  }
1768
1762
  render() {
1769
- return (index.h(index.Host, { key: '18113021f28ed340017ed15b3db83f275a1a45e0' }, index.h("div", { key: '75c4fc6fb48133edc3b9b2152c09d1b77dc3efc6', class: "top-left-buttons" }, index.h("kritzel-workspace-manager", { key: 'c6a68abaf70ebcf37af1870b832c9a2bd2c984fb', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), index.h("kritzel-back-to-content", { key: 'e2be6fadb0a44dd6cc7a061767bc25b11dde5bf3', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), index.h("kritzel-engine", { key: '16c19e74e9a3bd61845fa3542a5a84a12a3c8a05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), index.h("kritzel-controls", { key: 'bb328c89b4ebbcce215e6ddf710126e7a71b5d30', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), index.h("div", { key: 'e7fd78379d8acc4715605c267aa352430633f6ac', class: "top-right-buttons" }, index.h("kritzel-settings", { key: '13db94ca32cabfbd2d6664c58f55e30fcbf99221', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), index.h("kritzel-export", { key: 'a7aa9b6ada8b0d47edf418c392d6d04598d36925', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), index.h("kritzel-more-menu", { key: '70a1a954f678e6b634d5965b23f570f79824af43', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
1763
+ return (index.h(index.Host, { key: 'e239e70c120784d4331d3fdfadfd7fb2623a73f0' }, index.h("div", { key: '4e4a1db1d4e89a6ba4e0042413aa36a26b61e665', class: "top-left-buttons" }, index.h("kritzel-workspace-manager", { key: '102f3e93167dda9abdcf4ca058b053eb5fe4f670', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), index.h("kritzel-back-to-content", { key: '37e0d96e16f84a12aa346d508e8d9f5790942b0a', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), index.h("kritzel-engine", { key: '3983972874985b2e157e9c55511e462e8b569b05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), index.h("kritzel-controls", { key: 'ea8b2465b097f03303909814e678d6c4a5338979', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), index.h("div", { key: '412f719a47092ce40427bccece81e97b6a0e92d4', class: "top-right-buttons" }, index.h("kritzel-settings", { key: 'f1f742106784d2e1635ecfe1319e6b96b47b7166', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), index.h("kritzel-export", { key: '2aebe55d30b4dbc1b05ea6b5614c0dabc4729c3b', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), index.h("kritzel-more-menu", { key: '9a41d3e54d3864f7ac8d9774221097ae0126818b', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
1770
1764
  }
1771
1765
  static get watchers() { return {
1772
1766
  "isEngineReady": [{
@@ -20484,6 +20478,7 @@ class KritzelCore {
20484
20478
  deleteWorkspace(workspace) {
20485
20479
  // If deleting the active workspace, need to handle ObjectMap cleanup
20486
20480
  if (this._store.state.activeWorkspace?.id === workspace.id) {
20481
+ this.engine.viewport?.cancelPendingUpdates();
20487
20482
  this._store.state.objects?.destroy();
20488
20483
  }
20489
20484
  this.deleteWorkspaceFromAppState(workspace.id);
@@ -20497,6 +20492,11 @@ class KritzelCore {
20497
20492
  if (!activeWorkspace) {
20498
20493
  return;
20499
20494
  }
20495
+ // Check if the workspace is still valid (not deleted)
20496
+ const isValid = this._store.state.workspaces.some(w => w.id === activeWorkspace.id);
20497
+ if (!isValid) {
20498
+ return;
20499
+ }
20500
20500
  activeWorkspace.viewport = { translateX, translateY, scale };
20501
20501
  activeWorkspace.updatedAt = new Date();
20502
20502
  this.saveWorkspaceToAppState(activeWorkspace);
@@ -22701,7 +22701,7 @@ const KritzelEngine = class {
22701
22701
  };
22702
22702
  KritzelEngine.style = kritzelEngineCss();
22703
22703
 
22704
- const kritzelExportCss = () => `:host{display:block}.export-content{display:flex;flex-direction:column;gap:16px;padding:16px 0}.preview-container{width:100%;display:flex;justify-content:center;align-items:center;box-sizing:border-box;margin-bottom:8px}.preview-container img{max-width:100%;max-height:250px;object-fit:contain;box-shadow:0 4px 8px rgba(0, 0, 0, 0.15);border-radius:4px;border:1px solid var(--kritzel-border-color, #dbdbdb)}.export-content p{margin:0;color:var(--kritzel-text-secondary, #666)}.export-options{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px}.export-button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border:1px solid var(--kritzel-border-color, #dbdbdb);border-radius:8px;background-color:transparent;cursor:pointer;transition:all 0.2s ease;color:var(--kritzel-text-primary, #333)}.export-button:hover{background-color:var(--kritzel-hover-background, #f5f5f5);border-color:var(--kritzel-primary-color, #007bff);color:var(--kritzel-primary-color, #007bff)}.export-button .icon-container{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background-color:var(--kritzel-background-secondary, #f0f0f0)}.export-button span{font-weight:500;font-size:14px}`;
22704
+ const kritzelExportCss = () => `:host{display:block}.export-content{display:flex;flex-direction:column;gap:16px;padding:16px 0}.preview-container{width:100%;display:flex;justify-content:center;align-items:center;box-sizing:border-box;margin-bottom:8px}.preview-container img{max-width:100%;max-height:250px;object-fit:contain;box-shadow:0 4px 8px rgba(0, 0, 0, 0.15);border-radius:4px;border:1px solid var(--kritzel-border-color, #dbdbdb)}.export-content p{margin:0;color:var(--kritzel-text-secondary, #666)}.export-options{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:8px}.export-button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border:1px solid var(--kritzel-border-color, #dbdbdb);border-radius:8px;background-color:transparent;cursor:pointer;transition:all 0.2s ease;color:var(--kritzel-text-primary, #333)}.export-button:hover{background-color:var(--kritzel-hover-background, #f5f5f5);border-color:var(--kritzel-primary-color, #007bff);color:var(--kritzel-primary-color, #007bff)}.export-button:focus-visible{outline:revert;outline-offset:revert}.export-button .icon-container{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background-color:var(--kritzel-background-secondary, #f0f0f0)}.export-button span{font-weight:500;font-size:14px}`;
22705
22705
 
22706
22706
  const KritzelExport = class {
22707
22707
  constructor(hostRef) {
@@ -22936,7 +22936,7 @@ const KritzelLineEndings = class {
22936
22936
  };
22937
22937
  KritzelLineEndings.style = kritzelLineEndingsCss();
22938
22938
 
22939
- const kritzelMasterDetailCss = () => `:host{display:block;width:100%;height:100%}.master-detail-container{display:flex;width:100%;height:100%;min-height:var(--kritzel-master-detail-min-height, 300px);gap:var(--kritzel-master-detail-gap, 0);background-color:var(--kritzel-master-detail-background-color, transparent)}.master-menu{display:flex;flex-direction:column;width:var(--kritzel-master-detail-menu-width, 200px);min-width:var(--kritzel-master-detail-menu-min-width, 160px);padding:var(--kritzel-master-detail-menu-padding, 8px);background-color:var(--kritzel-master-detail-menu-background-color, #ffffff);border-right:var(--kritzel-master-detail-menu-border-right, 1px solid #ebebeb);gap:var(--kritzel-master-detail-menu-gap, 4px);overflow-y:auto}.menu-item{display:flex;align-items:center;gap:var(--kritzel-master-detail-menu-item-gap, 10px);padding:var(--kritzel-master-detail-menu-item-padding, 10px 12px);border:none;border-radius:var(--kritzel-master-detail-menu-item-border-radius, 6px);background-color:var(--kritzel-master-detail-menu-item-background-color, transparent);color:var(--kritzel-master-detail-menu-item-color, #333333);font-family:inherit;font-size:var(--kritzel-master-detail-menu-item-font-size, 14px);font-weight:var(--kritzel-master-detail-menu-item-font-weight, 400);text-align:left;cursor:var(--kritzel-pointer-cursor, pointer);transition:background-color 150ms ease, color 150ms ease;-webkit-tap-highlight-color:transparent}.menu-item:hover:not(.is-disabled){background-color:var(--kritzel-master-detail-menu-item-hover-background-color, #ebebeb)}.menu-item:active:not(.is-disabled){background-color:var(--kritzel-master-detail-menu-item-active-background-color, #e0e0e0)}.menu-item.is-selected{background-color:var(--kritzel-master-detail-menu-item-selected-background-color, #0066cc);color:var(--kritzel-master-detail-menu-item-selected-color, #ffffff);font-weight:var(--kritzel-master-detail-menu-item-selected-font-weight, 500)}.menu-item.is-selected:hover{background-color:var(--kritzel-master-detail-menu-item-selected-hover-background-color, #0052a3)}.menu-item.is-disabled{color:var(--kritzel-master-detail-menu-item-disabled-color, #999999);cursor:not-allowed;opacity:0.6}.menu-item:focus-visible{outline:var(--kritzel-master-detail-menu-item-focus-outline, 2px solid #0066cc);outline-offset:var(--kritzel-master-detail-menu-item-focus-outline-offset, -2px)}.menu-item.is-selected:focus-visible{outline-color:var(--kritzel-master-detail-menu-item-selected-focus-outline-color, #ffffff)}.menu-item-icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.detail-panel{flex:1;min-height:0;padding:var(--kritzel-master-detail-detail-padding, 16px);background-color:var(--kritzel-master-detail-detail-background-color, #ffffff);overflow-y:auto;-webkit-overflow-scrolling:touch;scrollbar-color:#ebebeb transparent;scrollbar-width:thin}.detail-panel:focus{outline:none}.detail-panel:focus-visible{outline:var(--kritzel-master-detail-detail-focus-outline, 2px solid #0066cc);outline-offset:var(--kritzel-master-detail-detail-focus-outline-offset, -2px)}.mobile-back-button{display:none;align-items:center;gap:8px;background:none;border:none;padding:0 0 16px 0;cursor:pointer;color:var(--kritzel-master-detail-back-button-color, #333333);font-weight:500;font-size:14px;font-family:inherit}.mobile-back-icon{display:flex;align-items:center;flex-shrink:0}.menu-item-chevron{display:none;flex-shrink:0;margin-left:auto;color:var(--kritzel-master-detail-menu-item-chevron-color, #999999)}.menu-item-chevron svg{width:16px;height:16px;stroke:currentColor}@media (max-width: 768px){.master-menu{width:100%;border-right:none}.detail-panel{display:none;width:100%}.master-detail-container.is-mobile-detail-visible .master-menu{display:none}.master-detail-container.is-mobile-detail-visible .detail-panel{display:block}.mobile-back-button{display:flex}.menu-item.is-selected{background-color:transparent;color:var(--kritzel-master-detail-menu-item-color, #333333);font-weight:var(--kritzel-master-detail-menu-item-font-weight, 400)}.menu-item.is-selected:hover{background-color:var(--kritzel-master-detail-menu-item-hover-background-color, #ebebeb)}.menu-item-chevron{display:flex;align-items:center}}`;
22939
+ const kritzelMasterDetailCss = () => `:host{display:block;width:100%;height:100%}.master-detail-container{display:flex;width:100%;height:100%;min-height:var(--kritzel-master-detail-min-height, 300px);gap:var(--kritzel-master-detail-gap, 0);background-color:var(--kritzel-master-detail-background-color, transparent)}.master-menu{display:flex;flex-direction:column;width:var(--kritzel-master-detail-menu-width, 200px);min-width:var(--kritzel-master-detail-menu-min-width, 160px);padding:var(--kritzel-master-detail-menu-padding, 8px);background-color:var(--kritzel-master-detail-menu-background-color, #ffffff);border-right:var(--kritzel-master-detail-menu-border-right, 1px solid #ebebeb);gap:var(--kritzel-master-detail-menu-gap, 4px);overflow-y:auto}.menu-item{display:flex;align-items:center;gap:var(--kritzel-master-detail-menu-item-gap, 10px);padding:var(--kritzel-master-detail-menu-item-padding, 10px 12px);border:none;border-radius:var(--kritzel-master-detail-menu-item-border-radius, 6px);background-color:var(--kritzel-master-detail-menu-item-background-color, transparent);color:var(--kritzel-master-detail-menu-item-color, #333333);font-family:inherit;font-size:var(--kritzel-master-detail-menu-item-font-size, 14px);font-weight:var(--kritzel-master-detail-menu-item-font-weight, 400);text-align:left;cursor:var(--kritzel-pointer-cursor, pointer);transition:background-color 150ms ease, color 150ms ease;-webkit-tap-highlight-color:transparent}.menu-item:hover:not(.is-disabled){background-color:var(--kritzel-master-detail-menu-item-hover-background-color, #ebebeb)}.menu-item:active:not(.is-disabled){background-color:var(--kritzel-master-detail-menu-item-active-background-color, #e0e0e0)}.menu-item.is-selected{background-color:var(--kritzel-master-detail-menu-item-selected-background-color, #0066cc);color:var(--kritzel-master-detail-menu-item-selected-color, #ffffff);font-weight:var(--kritzel-master-detail-menu-item-selected-font-weight, 500)}.menu-item.is-selected:hover{background-color:var(--kritzel-master-detail-menu-item-selected-hover-background-color, #0052a3)}.menu-item.is-disabled{color:var(--kritzel-master-detail-menu-item-disabled-color, #999999);cursor:not-allowed;opacity:0.6}.menu-item:focus-visible{outline:var(--kritzel-master-detail-menu-item-focus-outline, revert);outline-offset:var(--kritzel-master-detail-menu-item-focus-outline-offset, revert)}.menu-item-icon{flex-shrink:0;display:flex;align-items:center;justify-content:center}.menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.detail-panel{flex:1;min-height:0;padding:var(--kritzel-master-detail-detail-padding, 16px);background-color:var(--kritzel-master-detail-detail-background-color, #ffffff);overflow-y:auto;-webkit-overflow-scrolling:touch;scrollbar-color:#ebebeb transparent;scrollbar-width:thin}.detail-panel:focus{outline:none}.detail-panel:focus-visible{outline:var(--kritzel-master-detail-detail-focus-outline, revert);outline-offset:var(--kritzel-master-detail-detail-focus-outline-offset, revert)}.mobile-back-button{display:none;align-items:center;gap:8px;background:none;border:none;padding:0 0 16px 0;cursor:pointer;color:var(--kritzel-master-detail-back-button-color, #333333);font-weight:500;font-size:14px;font-family:inherit}.mobile-back-icon{display:flex;align-items:center;flex-shrink:0}.menu-item-chevron{display:none;flex-shrink:0;margin-left:auto;color:var(--kritzel-master-detail-menu-item-chevron-color, #999999)}.menu-item-chevron svg{width:16px;height:16px;stroke:currentColor}@media (max-width: 768px){.master-menu{width:100%;border-right:none}.detail-panel{display:none;width:100%}.master-detail-container.is-mobile-detail-visible .master-menu{display:none}.master-detail-container.is-mobile-detail-visible .detail-panel{display:block}.mobile-back-button{display:flex}.menu-item.is-selected{background-color:transparent;color:var(--kritzel-master-detail-menu-item-color, #333333);font-weight:var(--kritzel-master-detail-menu-item-font-weight, 400)}.menu-item.is-selected:hover{background-color:var(--kritzel-master-detail-menu-item-hover-background-color, #ebebeb)}.menu-item-chevron{display:flex;align-items:center}}`;
22940
22940
 
22941
22941
  const KritzelMasterDetail = class {
22942
22942
  constructor(hostRef) {
@@ -23024,30 +23024,24 @@ const KritzelMasterDetail = class {
23024
23024
  this.tabRefs[index] = el;
23025
23025
  }
23026
23026
  };
23027
- getTabIndex(item, index) {
23027
+ getTabIndex(item, _index) {
23028
23028
  if (item.disabled)
23029
23029
  return -1;
23030
- // If there's a selected item, only that one gets tabindex 0
23031
- if (this.selectedItemId) {
23032
- return item.id === this.selectedItemId ? 0 : -1;
23033
- }
23034
- // Otherwise, first enabled item gets tabindex 0
23035
- const firstEnabledIndex = this.items.findIndex(it => !it.disabled);
23036
- return index === firstEnabledIndex ? 0 : -1;
23030
+ return 0;
23037
23031
  }
23038
23032
  render() {
23039
23033
  const selectedItem = this.items.find(item => item.id === this.selectedItemId);
23040
23034
  const panelId = 'master-detail-panel';
23041
23035
  const selectedTabId = selectedItem ? `tab-${selectedItem.id}` : undefined;
23042
- return (index.h(index.Host, { key: '80d604db70f6986a0a88d057b22a3c82f9d19713' }, index.h("div", { key: 'a6269c03c1018bf8318ede1eb1699429e62ec85d', class: {
23036
+ return (index.h(index.Host, { key: '28b34d09819dca22b9edff8367a838e5d161132a' }, index.h("div", { key: '53107e6781946c406c9fccae465d003ef6571cfd', class: {
23043
23037
  'master-detail-container': true,
23044
23038
  'is-mobile-detail-visible': this.showMobileDetail,
23045
- } }, index.h("nav", { key: '843182b43e4b2f83488b1a3406d8deb0e5ee929f', class: "master-menu", role: "tablist", "aria-orientation": "vertical", "aria-label": "Settings categories" }, this.items.map((item, index$1) => (index.h("button", { key: item.id, id: `tab-${item.id}`, ref: el => this.setTabRef(el, index$1), class: {
23039
+ } }, index.h("nav", { key: 'd496f8b5975250a2a0ed7007dfeac3875a980e09', class: "master-menu", role: "tablist", "aria-orientation": "vertical", "aria-label": "Settings categories" }, this.items.map((item, index$1) => (index.h("button", { key: item.id, id: `tab-${item.id}`, ref: el => this.setTabRef(el, index$1), class: {
23046
23040
  'menu-item': true,
23047
23041
  'is-selected': item.id === this.selectedItemId,
23048
23042
  'is-disabled': !!item.disabled,
23049
23043
  'is-focused': index$1 === this.focusedIndex,
23050
- }, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index$1), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index$1), onFocus: () => this.handleFocus(index$1), onBlur: this.handleBlur }, item.icon && (index.h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), index.h("span", { class: "menu-item-label" }, item.label), index.h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, index.h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("path", { d: "m9 18 6-6-6-6" }))))))), index.h("div", { key: '800c82b7558ca7d5c65b24e0439fe6c5fd988063', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId, tabIndex: 0 }, index.h("button", { key: 'ab522c8b0bff8082ae6a5e85f6ea1ef3b36f37f6', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, index.h("kritzel-icon", { key: '6028f75e3ccf5356f06f8a62f1f609f64c536cb1', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), index.h("slot", { key: '82353e43a8fde77c9ca9972593de3461876642f1' })))));
23044
+ }, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index$1), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index$1), onFocus: () => this.handleFocus(index$1), onBlur: this.handleBlur }, item.icon && (index.h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), index.h("span", { class: "menu-item-label" }, item.label), index.h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, index.h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, index.h("path", { d: "m9 18 6-6-6-6" }))))))), index.h("div", { key: '8cad78be4c26bd85903caa9debf14517fb6f5f75', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId }, index.h("button", { key: 'f185a12b0c60bac5bdd4b6992bd9f6cb653d3253', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, index.h("kritzel-icon", { key: '333e675a242b9d075aaa78f4ee005539b563a6b9', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), index.h("slot", { key: 'ccdf01882b30eea4227eb0da23fccc80fee1937e' })))));
23051
23045
  }
23052
23046
  static get watchers() { return {
23053
23047
  "selectedItemId": [{
@@ -23057,7 +23051,7 @@ const KritzelMasterDetail = class {
23057
23051
  };
23058
23052
  KritzelMasterDetail.style = kritzelMasterDetailCss();
23059
23053
 
23060
- const kritzelMenuCss = () => `:host{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-menu-background-color, #ffffff);width:var(--kritzel-menu-width, 200px);padding:var(--kritzel-menu-padding, 8px);border-radius:var(--kritzel-menu-border-radius, 12px);box-shadow:var(--kritzel-menu-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-menu-border, 1px solid #ebebeb);z-index:2;gap:var(--kritzel-menu-gap, 4px);overflow-y:auto;scrollbar-color:#ebebeb transparent;scrollbar-width:thin;max-height:var(--kritzel-portal-max-height, 300px);box-sizing:border-box}.has-open-child-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3}`;
23054
+ const kritzelMenuCss = () => `:host{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-menu-background-color, #ffffff);width:var(--kritzel-menu-width, 200px);padding:var(--kritzel-menu-padding, 8px);border-radius:var(--kritzel-menu-border-radius, 12px);box-shadow:var(--kritzel-menu-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-menu-border, 1px solid #ebebeb);z-index:2;gap:var(--kritzel-menu-gap, 4px);overflow-y:auto;scrollbar-color:#ebebeb transparent;scrollbar-width:thin;max-height:var(--kritzel-portal-max-height, 300px);box-sizing:border-box;-webkit-tap-highlight-color:transparent;outline:none}:host:focus-visible{outline:auto}.has-open-child-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3}`;
23061
23055
 
23062
23056
  const KritzelMenu = class {
23063
23057
  constructor(hostRef) {
@@ -23125,7 +23119,7 @@ const KritzelMenu = class {
23125
23119
  };
23126
23120
  KritzelMenu.style = kritzelMenuCss();
23127
23121
 
23128
- const kritzelMenuItemCss = () => `:host{position:relative;display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--kritzel-menu-item-padding, 8px);box-sizing:border-box;gap:16px;height:var(--kritzel-menu-item-height, 40px);min-height:var(--kritzel-menu-item-min-height, 40px);font-family:sans-serif;font-size:var(--kritzel-menu-item-font-size, 14px);color:var(--kritzel-menu-item-color, #333333);border-radius:var(--kritzel-menu-item-border-radius, 12px)}:host(:hover) .menu-item-overlay,:host(:focus-within) .menu-item-overlay{background-color:var(--kritzel-menu-item-overlay-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff);color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected.editing){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}:host(.selected) .edit-input{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-selected-color, #ffffff)}kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-color, #333333)}:host(.selected) .edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, rgba(255, 255, 255, 0.16))}:host(.editing){background-color:var(--kritzel-menu-item-editing-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.disabled){opacity:0.5;pointer-events:none !important}:host(.child-open){background-color:var(--kritzel-menu-item-child-open-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.child-open.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}.menu-item-overlay{position:absolute;inset:0;background-color:transparent;z-index:0;pointer-events:none;border-radius:var(--kritzel-menu-item-border-radius, 12px)}.menu-item-content{display:flex;align-items:center;gap:8px;position:relative;z-index:1;height:100%}.left{justify-content:flex-start;flex:1;min-width:0}.left>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.right{justify-content:flex-end}.edit-input{flex:1;height:var(--kritzel-menu-item-input-height, 24px);padding:0;background-color:transparent;border-radius:0;border:none;border-bottom:1px solid var(--kritzel-menu-item-input-border, #ccc);font-size:var(--kritzel-context-menu-item-font-size, 14px);width:100%;min-width:0;box-sizing:border-box;outline:none}.edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, #007bff);color:var(--kritzel-menu-item-input-selection-text-color, #ffffff)}.action-button{padding:4px;border-radius:8px;border:none;cursor:var(--kritzel-pointer-cursor, pointer);display:flex;align-items:center;justify-content:center;background-color:transparent;background:transparent;-webkit-tap-highlight-color:transparent}.action-button:hover,.action-button:focus{background-color:var(--kritzel-menu-item-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.action-button.disabled{pointer-events:none;opacity:0.5}`;
23122
+ const kritzelMenuItemCss = () => `:host{position:relative;display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--kritzel-menu-item-padding, 8px);box-sizing:border-box;gap:16px;height:var(--kritzel-menu-item-height, 40px);min-height:var(--kritzel-menu-item-min-height, 40px);font-family:sans-serif;font-size:var(--kritzel-menu-item-font-size, 14px);color:var(--kritzel-menu-item-color, #333333);border-radius:var(--kritzel-menu-item-border-radius, 12px);-webkit-tap-highlight-color:transparent}:host:focus:not(:focus-visible){outline:none}:host(:hover) .menu-item-overlay,:host(:focus-within) .menu-item-overlay{background-color:var(--kritzel-menu-item-overlay-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff);color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected.editing){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}:host(.selected) .edit-input{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-selected-color, #ffffff)}kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-color, #333333)}:host(.selected) .edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, rgba(255, 255, 255, 0.16))}:host(.editing){background-color:var(--kritzel-menu-item-editing-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.disabled){opacity:0.5;pointer-events:none !important}:host(.child-open){background-color:var(--kritzel-menu-item-child-open-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.child-open.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}.menu-item-overlay{position:absolute;inset:0;background-color:transparent;z-index:0;pointer-events:none;border-radius:var(--kritzel-menu-item-border-radius, 12px)}.menu-item-content{display:flex;align-items:center;gap:8px;position:relative;z-index:1;height:100%}.left{justify-content:flex-start;flex:1;min-width:0}.left>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.right{justify-content:flex-end}.edit-input{flex:1;height:var(--kritzel-menu-item-input-height, 24px);padding:0;background-color:transparent;border-radius:0;border:none;border-bottom:1px solid var(--kritzel-menu-item-input-border, #ccc);font-size:var(--kritzel-context-menu-item-font-size, 14px);width:100%;min-width:0;box-sizing:border-box;outline:none}.edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, #007bff);color:var(--kritzel-menu-item-input-selection-text-color, #ffffff)}.action-button{padding:4px;border-radius:8px;border:none;cursor:var(--kritzel-pointer-cursor, pointer);display:flex;align-items:center;justify-content:center;background-color:transparent;background:transparent;-webkit-tap-highlight-color:transparent}.action-button:hover,.action-button:focus{background-color:var(--kritzel-menu-item-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.action-button.disabled{pointer-events:none;opacity:0.5}`;
23129
23123
 
23130
23124
  const KritzelMenuItem = class {
23131
23125
  constructor(hostRef) {
@@ -23649,7 +23643,7 @@ const KritzelPortal = class {
23649
23643
  * This file is auto-generated by the version bump scripts.
23650
23644
  * Do not modify manually.
23651
23645
  */
23652
- const KRITZEL_VERSION = '0.1.12';
23646
+ const KRITZEL_VERSION = '0.1.14';
23653
23647
 
23654
23648
  const kritzelSettingsCss = () => `:host{display:contents}kritzel-dialog{--kritzel-dialog-body-padding:0;--kritzel-dialog-width-large:800px;--kritzel-dialog-height-large:500px}.footer-button{padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px}.cancel-button{border:1px solid #ebebeb;background:#fff;color:inherit}.cancel-button:hover{background:#f5f5f5}.settings-content{padding:0}.settings-content h3{margin:0 0 16px 0;font-size:18px;font-weight:600;color:var(--kritzel-settings-content-heading-color, #333333)}.settings-content p{margin:0;font-size:14px;color:var(--kritzel-settings-content-text-color, #666666);line-height:1.5}.settings-group{display:flex;flex-direction:column;gap:24px}.settings-item{display:flex;flex-direction:column;gap:8px}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.settings-label{font-size:14px;font-weight:500;color:var(--kritzel-settings-label-color, #333333);margin:0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}`;
23655
23649
 
@@ -178,6 +178,7 @@ export class KritzelCore {
178
178
  deleteWorkspace(workspace) {
179
179
  // If deleting the active workspace, need to handle ObjectMap cleanup
180
180
  if (this._store.state.activeWorkspace?.id === workspace.id) {
181
+ this.engine.viewport?.cancelPendingUpdates();
181
182
  this._store.state.objects?.destroy();
182
183
  }
183
184
  this.deleteWorkspaceFromAppState(workspace.id);
@@ -191,6 +192,11 @@ export class KritzelCore {
191
192
  if (!activeWorkspace) {
192
193
  return;
193
194
  }
195
+ // Check if the workspace is still valid (not deleted)
196
+ const isValid = this._store.state.workspaces.some(w => w.id === activeWorkspace.id);
197
+ if (!isValid) {
198
+ return;
199
+ }
194
200
  activeWorkspace.viewport = { translateX, translateY, scale };
195
201
  activeWorkspace.updatedAt = new Date();
196
202
  this.saveWorkspaceToAppState(activeWorkspace);
@@ -258,7 +258,6 @@ export class KritzelEditor {
258
258
  this.undoState = event.detail;
259
259
  }
260
260
  handleObjectsInViewportChange(event) {
261
- console.log(event.detail.length);
262
261
  const hasVisibleObjects = event.detail.length > 0;
263
262
  this.isBackToContentButtonVisible = !hasVisibleObjects;
264
263
  }
@@ -314,7 +313,7 @@ export class KritzelEditor {
314
313
  }
315
314
  }
316
315
  render() {
317
- return (h(Host, { key: '18113021f28ed340017ed15b3db83f275a1a45e0' }, h("div", { key: '75c4fc6fb48133edc3b9b2152c09d1b77dc3efc6', class: "top-left-buttons" }, h("kritzel-workspace-manager", { key: 'c6a68abaf70ebcf37af1870b832c9a2bd2c984fb', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-back-to-content", { key: 'e2be6fadb0a44dd6cc7a061767bc25b11dde5bf3', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), h("kritzel-engine", { key: '16c19e74e9a3bd61845fa3542a5a84a12a3c8a05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), h("kritzel-controls", { key: 'bb328c89b4ebbcce215e6ddf710126e7a71b5d30', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: 'e7fd78379d8acc4715605c267aa352430633f6ac', class: "top-right-buttons" }, h("kritzel-settings", { key: '13db94ca32cabfbd2d6664c58f55e30fcbf99221', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: 'a7aa9b6ada8b0d47edf418c392d6d04598d36925', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), h("kritzel-more-menu", { key: '70a1a954f678e6b634d5965b23f570f79824af43', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
316
+ return (h(Host, { key: 'e239e70c120784d4331d3fdfadfd7fb2623a73f0' }, h("div", { key: '4e4a1db1d4e89a6ba4e0042413aa36a26b61e665', class: "top-left-buttons" }, h("kritzel-workspace-manager", { key: '102f3e93167dda9abdcf4ca058b053eb5fe4f670', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-back-to-content", { key: '37e0d96e16f84a12aa346d508e8d9f5790942b0a', visible: this.isBackToContentButtonVisible, onBackToContent: () => this.backToContent() })), h("kritzel-engine", { key: '3983972874985b2e157e9c55511e462e8b569b05', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, lockDrawingScale: this.lockDrawingScale, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event), onObjectsInViewportChange: event => this.handleObjectsInViewportChange(event) }), h("kritzel-controls", { key: 'ea8b2465b097f03303909814e678d6c4a5338979', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) }), h("div", { key: '412f719a47092ce40427bccece81e97b6a0e92d4', class: "top-right-buttons" }, h("kritzel-settings", { key: 'f1f742106784d2e1635ecfe1319e6b96b47b7166', ref: el => (this.settingsRef = el), onSettingsChange: event => this.handleSettingsChange(event) }), h("kritzel-export", { key: '2aebe55d30b4dbc1b05ea6b5614c0dabc4729c3b', ref: el => (this.exportRef = el), onExportPng: () => this.engineRef.exportViewportAsPng(), onExportSvg: () => this.engineRef.exportViewportAsSvg() }), h("kritzel-more-menu", { key: '9a41d3e54d3864f7ac8d9774221097ae0126818b', onItemSelect: event => this.handleMoreMenuItemSelect(event) }))));
318
317
  }
319
318
  static get is() { return "kritzel-editor"; }
320
319
  static get originalStyleUrls() {
@@ -132,17 +132,13 @@
132
132
  color: var(--kritzel-dialog-close-button-hover-color, #1a1a1a);
133
133
  }
134
134
 
135
- .close-button:focus {
136
- outline: none;
135
+ .close-button:active {
136
+ background-color: var(--kritzel-dialog-close-button-active-background, #ebebeb);
137
137
  }
138
138
 
139
139
  .close-button:focus-visible {
140
- outline: 2px solid var(--kritzel-dialog-focus-ring-color, #0066cc);
141
- outline-offset: 2px;
142
- }
143
-
144
- .close-button:active {
145
- background-color: var(--kritzel-dialog-close-button-active-background, #ebebeb);
140
+ outline: revert;
141
+ outline-offset: revert;
146
142
  }
147
143
 
148
144
  .dialog-body {
@@ -119,19 +119,13 @@ export class KritzelDialog {
119
119
  slots.forEach(slot => {
120
120
  const assigned = slot.assignedElements({ flatten: true });
121
121
  assigned.forEach(el => {
122
+ // Use KritzelHTMLHelper to find focusable elements including those in nested shadow DOMs
122
123
  const elements = KritzelHTMLHelper.getFocusableElements(el);
123
124
  focusable.push(...elements);
124
- if (this.isFocusable(el)) {
125
- focusable.push(el);
126
- }
127
125
  });
128
126
  });
129
127
  return focusable;
130
128
  }
131
- isFocusable(el) {
132
- const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details, [tabindex]:not([tabindex="-1"])';
133
- return el.matches(focusableSelector);
134
- }
135
129
  handleTabKey(event) {
136
130
  const focusableElements = this.getSlottedFocusableElements();
137
131
  const closeButton = this.host.shadowRoot?.querySelector('.close-button');
@@ -70,12 +70,8 @@
70
70
  }
71
71
 
72
72
  .menu-item:focus-visible {
73
- outline: var(--kritzel-master-detail-menu-item-focus-outline, 2px solid #0066cc);
74
- outline-offset: var(--kritzel-master-detail-menu-item-focus-outline-offset, -2px);
75
- }
76
-
77
- .menu-item.is-selected:focus-visible {
78
- outline-color: var(--kritzel-master-detail-menu-item-selected-focus-outline-color, #ffffff);
73
+ outline: var(--kritzel-master-detail-menu-item-focus-outline, revert);
74
+ outline-offset: var(--kritzel-master-detail-menu-item-focus-outline-offset, revert);
79
75
  }
80
76
 
81
77
  /* Menu Item Icon */
@@ -111,8 +107,8 @@
111
107
  }
112
108
 
113
109
  .detail-panel:focus-visible {
114
- outline: var(--kritzel-master-detail-detail-focus-outline, 2px solid #0066cc);
115
- outline-offset: var(--kritzel-master-detail-detail-focus-outline-offset, -2px);
110
+ outline: var(--kritzel-master-detail-detail-focus-outline, revert);
111
+ outline-offset: var(--kritzel-master-detail-detail-focus-outline-offset, revert);
116
112
  }
117
113
 
118
114
  /* Mobile Back Button */
@@ -81,30 +81,24 @@ export class KritzelMasterDetail {
81
81
  this.tabRefs[index] = el;
82
82
  }
83
83
  };
84
- getTabIndex(item, index) {
84
+ getTabIndex(item, _index) {
85
85
  if (item.disabled)
86
86
  return -1;
87
- // If there's a selected item, only that one gets tabindex 0
88
- if (this.selectedItemId) {
89
- return item.id === this.selectedItemId ? 0 : -1;
90
- }
91
- // Otherwise, first enabled item gets tabindex 0
92
- const firstEnabledIndex = this.items.findIndex(it => !it.disabled);
93
- return index === firstEnabledIndex ? 0 : -1;
87
+ return 0;
94
88
  }
95
89
  render() {
96
90
  const selectedItem = this.items.find(item => item.id === this.selectedItemId);
97
91
  const panelId = 'master-detail-panel';
98
92
  const selectedTabId = selectedItem ? `tab-${selectedItem.id}` : undefined;
99
- return (h(Host, { key: '80d604db70f6986a0a88d057b22a3c82f9d19713' }, h("div", { key: 'a6269c03c1018bf8318ede1eb1699429e62ec85d', class: {
93
+ return (h(Host, { key: '28b34d09819dca22b9edff8367a838e5d161132a' }, h("div", { key: '53107e6781946c406c9fccae465d003ef6571cfd', class: {
100
94
  'master-detail-container': true,
101
95
  'is-mobile-detail-visible': this.showMobileDetail,
102
- } }, h("nav", { key: '843182b43e4b2f83488b1a3406d8deb0e5ee929f', class: "master-menu", role: "tablist", "aria-orientation": "vertical", "aria-label": "Settings categories" }, this.items.map((item, index) => (h("button", { key: item.id, id: `tab-${item.id}`, ref: el => this.setTabRef(el, index), class: {
96
+ } }, h("nav", { key: 'd496f8b5975250a2a0ed7007dfeac3875a980e09', class: "master-menu", role: "tablist", "aria-orientation": "vertical", "aria-label": "Settings categories" }, this.items.map((item, index) => (h("button", { key: item.id, id: `tab-${item.id}`, ref: el => this.setTabRef(el, index), class: {
103
97
  'menu-item': true,
104
98
  'is-selected': item.id === this.selectedItemId,
105
99
  'is-disabled': !!item.disabled,
106
100
  'is-focused': index === this.focusedIndex,
107
- }, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index), onFocus: () => this.handleFocus(index), onBlur: this.handleBlur }, item.icon && (h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), h("span", { class: "menu-item-label" }, item.label), h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "m9 18 6-6-6-6" }))))))), h("div", { key: '800c82b7558ca7d5c65b24e0439fe6c5fd988063', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId, tabIndex: 0 }, h("button", { key: 'ab522c8b0bff8082ae6a5e85f6ea1ef3b36f37f6', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, h("kritzel-icon", { key: '6028f75e3ccf5356f06f8a62f1f609f64c536cb1', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), h("slot", { key: '82353e43a8fde77c9ca9972593de3461876642f1' })))));
101
+ }, role: "tab", "aria-selected": item.id === this.selectedItemId ? 'true' : 'false', "aria-controls": panelId, "aria-disabled": item.disabled ? 'true' : undefined, tabIndex: this.getTabIndex(item, index), disabled: item.disabled, onClick: () => this.handleItemClick(item), onKeyDown: e => this.handleKeyDown(e, item, index), onFocus: () => this.handleFocus(index), onBlur: this.handleBlur }, item.icon && (h("kritzel-icon", { name: item.icon, size: 20, class: "menu-item-icon" })), h("span", { class: "menu-item-label" }, item.label), h("span", { class: "menu-item-chevron", "aria-hidden": "true" }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "stroke-linecap": "round", "stroke-linejoin": "round" }, h("path", { d: "m9 18 6-6-6-6" }))))))), h("div", { key: '8cad78be4c26bd85903caa9debf14517fb6f5f75', id: panelId, class: "detail-panel", role: "tabpanel", "aria-labelledby": selectedTabId }, h("button", { key: 'f185a12b0c60bac5bdd4b6992bd9f6cb653d3253', class: "mobile-back-button", onClick: this.handleBackClick, "aria-label": "Back to menu" }, h("kritzel-icon", { key: '333e675a242b9d075aaa78f4ee005539b563a6b9', name: "chevron-left", size: 20, class: "mobile-back-icon" }), "Back"), h("slot", { key: 'ccdf01882b30eea4227eb0da23fccc80fee1937e' })))));
108
102
  }
109
103
  static get is() { return "kritzel-master-detail"; }
110
104
  static get encapsulation() { return "shadow"; }
@@ -15,8 +15,13 @@
15
15
  scrollbar-width: thin;
16
16
  max-height: var(--kritzel-portal-max-height, 300px);
17
17
  box-sizing: border-box;
18
+ -webkit-tap-highlight-color: transparent;
19
+ outline: none;
18
20
  }
19
21
 
22
+ :host:focus-visible {
23
+ outline: auto;
24
+ }
20
25
 
21
26
  .has-open-child-overlay {
22
27
  position: absolute;
@@ -13,6 +13,11 @@
13
13
  font-size: var(--kritzel-menu-item-font-size, 14px);
14
14
  color: var(--kritzel-menu-item-color, #333333);
15
15
  border-radius: var(--kritzel-menu-item-border-radius, 12px);
16
+ -webkit-tap-highlight-color: transparent;
17
+ }
18
+
19
+ :host:focus:not(:focus-visible) {
20
+ outline: none;
16
21
  }
17
22
 
18
23
  :host(:hover) .menu-item-overlay,
@@ -37,6 +37,8 @@
37
37
  overflow-y: hidden;
38
38
  flex: 1 1 auto;
39
39
  min-width: 0;
40
+ padding: 4px;
41
+ margin: -4px;
40
42
 
41
43
  /* Hide scrollbar for all browsers */
42
44
  scrollbar-width: none;
@@ -63,6 +63,11 @@
63
63
  color: var(--kritzel-primary-color, #007bff);
64
64
  }
65
65
 
66
+ .export-button:focus-visible {
67
+ outline: revert;
68
+ outline-offset: revert;
69
+ }
70
+
66
71
  .export-button .icon-container {
67
72
  display: flex;
68
73
  align-items: center;
@@ -3,4 +3,4 @@
3
3
  * This file is auto-generated by the version bump scripts.
4
4
  * Do not modify manually.
5
5
  */
6
- export const KRITZEL_VERSION = '0.1.12';
6
+ export const KRITZEL_VERSION = '0.1.14';
@@ -37,7 +37,8 @@ export class KritzelHTMLHelper {
37
37
  const focusableElements = [];
38
38
  const focusableSelector = 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details, [tabindex]:not([tabindex="-1"])';
39
39
  const isVisible = (el) => {
40
- return el.offsetParent !== null;
40
+ const style = window.getComputedStyle(el);
41
+ return style.display !== 'none' && style.visibility !== 'hidden';
41
42
  };
42
43
  const find = (element) => {
43
44
  // Check if the element itself is focusable
@@ -1 +1 @@
1
- export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-CuifaWTr.js";import{w as t,a as i,t as o,r as n,b as l,e as u,c as m,d as p,f as z,g as C,s as k,h as x,i as y,v as S,j,o as w,k as T,l as v,m as P,O as M,n as B,p as W,q as U,u as H,x as A,y as L,z as O,A as _,B as N,C as $,H as R,D as Y}from"./p-Csm0Kf0_.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-Csm0Kf0_.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class q{doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=z();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=C(new Uint8Array(e));switch(n(s)){case 0:const e=l(s);m(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=l(s),r=u(this.doc,n);if(r.length>0){const e=z();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=z();t(e,2),i(e,p(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const X=new Map,Q="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:y(t.newValue||"")}),w(this._onChange)}postMessage(e){S.setItem(this.room,j(T(e)))}close(){v(this._onChange)}}:BroadcastChannel,V=e=>k(X,e,(()=>{const t=x(),s=new Q(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),Z=(e,t,s=null)=>{const i=V(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},ee=(e,s)=>{t(e,0);const o=p(s);i(e,o)},te=(e,s,o)=>{t(e,1),i(e,u(s,o))},se=(e,t,s,i)=>{try{m(t,l(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},ie=se;class oe extends M{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=W();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&ne(this,t,"timeout")}),B(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:W()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),U(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const ne=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:W()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},re=(e,s,i=e.states)=>{const n=s.length,r=z();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),H(r,JSON.stringify(l))}return o(r)},le=[];le[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{te(t,s,l(e))})(e,t,s);break;case 1:se(e,s,i,o);break;case 2:ie(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},le[3]=(e,s,o)=>{t(e,1),i(e,re(o.awareness,Array.from(o.awareness.getStates().keys())))},le[1]=(e,t,s)=>{((e,t,s)=>{const i=C(t),o=W(),r=[],l=[],a=[],c=[],d=n(i);for(let t=0;t<d;t++){const t=n(i);let s=n(i);const d=JSON.parse(P(i)),h=e.meta.get(t),u=e.states.get(t),m=void 0===h?0:h.clock;(m<s||m===s&&null===d&&e.states.has(t))&&(null===d?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,d),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===h&&null!==d?r.push(t):void 0!==h&&null===d?c.push(t):null!==d&&(U(d,u)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,l(t),s)},le[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ae(s,t)))};const ae=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),ce=(e,t,s)=>{const i=C(t),o=z(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},de=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,ne(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(he,N(100*$(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},he=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=W();const i=ce(e,new Uint8Array(t.data),!0);O(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{de(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=W(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=z();if(t(n,0),ee(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=z();t(n,1),i(n,re(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},ue=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&Z(e.bcChannel,t,e)};class me extends L{constructor(e,s,n,{connect:r=!0,awareness:l=new oe(n),params:a={},protocols:c=[],WebSocketPolyfill:d=WebSocket,resyncInterval:h=-1,maxBackoffTime:u=2500,disableBc:m=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=u,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=d,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=m,this.wsUnsuccessfulReconnects=0,this.messageHandlers=le.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,h>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=z();t(e,0),ee(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=ce(this,new Uint8Array(e),!1);O(t)>1&&Z(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=z();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),ue(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=z();t(a,1),i(a,re(l,r)),ue(this,o(a))},this._exitHandler=()=>{ne(this.awareness,[n.clientID],"app closed")},_&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<W()-this.wsLastMessageReceived&&de(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>A(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),_&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{V(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=z();t(e,0),ee(e,this.doc),Z(this.bcChannel,o(e),this);const s=z();t(s,0),te(s,this.doc),Z(this.bcChannel,o(s),this);const n=z();t(n,3),Z(this.bcChannel,o(n),this);const r=z();t(r,1),i(r,re(this.awareness,[this.doc.clientID])),Z(this.bcChannel,o(r),this)}disconnectBc(){const e=z();t(e,1),i(e,re(this.awareness,[this.doc.clientID],new Map)),ue(this,o(e)),this.bcconnected&&(((e,t)=>{const s=V(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),X.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&de(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(he(this),this.connectBc())}}class fe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new me(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new fe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class pe{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||pe.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new R(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new R(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(pe.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),pe.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),pe.sharedWebSocketProvider=new Y(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),pe.sharedWebSocketProvider}static destroySharedWebSocket(){pe.sharedWebSocketProvider&&(pe.sharedWebSocketProvider.destroy(),pe.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return pe.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new pe(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{q as BroadcastSyncProvider,pe as HocuspocusSyncProvider,fe as WebSocketSyncProvider}
1
+ export{g as getAssetPath,r as render,s as setAssetPath,a as setNonce,b as setPlatformOptions}from"./p-Cj-I2_Og.js";export{e as KritzelBrushTool,d as KritzelGroup,b as KritzelImage,c as KritzelLine,f as KritzelLineTool,a as KritzelPath,h as KritzelSelectionTool,K as KritzelText,g as KritzelTextTool}from"./p-CuifaWTr.js";import{w as t,a as i,t as o,r as n,b as l,e as u,c as m,d as p,f as z,g as C,s as k,h as x,i as y,v as S,j,o as T,k as w,l as v,m as P,O as B,n as M,p as W,q as U,u as H,x as A,y as L,z as O,A as N,B as _,C as $,H as R,D as q}from"./p-BtTXKrNq.js";export{I as IndexedDBSyncProvider,J as KritzelAnchorManager,G as KritzelAppStateMap,F as KritzelCursorHelper,K as KritzelEraserTool,E as KritzelImageTool}from"./p-BtTXKrNq.js";export{K as KritzelWorkspace}from"./p-n789Y3S-.js";export{D as DEFAULT_BRUSH_CONFIG,b as DEFAULT_LINE_TOOL_CONFIG,a as DEFAULT_TEXT_CONFIG,KritzelEditor,defineCustomElement as defineCustomElementKritzelEditor}from"./kritzel-editor.js";export{KritzelBackToContent,defineCustomElement as defineCustomElementKritzelBackToContent}from"./kritzel-back-to-content.js";export{KritzelBrushStyle,defineCustomElement as defineCustomElementKritzelBrushStyle}from"./kritzel-brush-style.js";export{KritzelColor,defineCustomElement as defineCustomElementKritzelColor}from"./kritzel-color.js";export{KritzelColorPalette,defineCustomElement as defineCustomElementKritzelColorPalette}from"./kritzel-color-palette.js";export{KritzelContextMenu,defineCustomElement as defineCustomElementKritzelContextMenu}from"./kritzel-context-menu.js";export{KritzelControls,defineCustomElement as defineCustomElementKritzelControls}from"./kritzel-controls.js";export{KritzelCursorTrail,defineCustomElement as defineCustomElementKritzelCursorTrail}from"./kritzel-cursor-trail.js";export{KritzelDialog,defineCustomElement as defineCustomElementKritzelDialog}from"./kritzel-dialog.js";export{KritzelDropdown,defineCustomElement as defineCustomElementKritzelDropdown}from"./kritzel-dropdown.js";export{KritzelEngine,defineCustomElement as defineCustomElementKritzelEngine}from"./kritzel-engine.js";export{KritzelExport,defineCustomElement as defineCustomElementKritzelExport}from"./kritzel-export.js";export{KritzelFont,defineCustomElement as defineCustomElementKritzelFont}from"./kritzel-font.js";export{KritzelFontFamily,defineCustomElement as defineCustomElementKritzelFontFamily}from"./kritzel-font-family.js";export{KritzelFontSize,defineCustomElement as defineCustomElementKritzelFontSize}from"./kritzel-font-size.js";export{KritzelIcon,defineCustomElement as defineCustomElementKritzelIcon}from"./kritzel-icon.js";export{KritzelLineEndings,defineCustomElement as defineCustomElementKritzelLineEndings}from"./kritzel-line-endings.js";export{KritzelMasterDetail,defineCustomElement as defineCustomElementKritzelMasterDetail}from"./kritzel-master-detail.js";export{KritzelMenu,defineCustomElement as defineCustomElementKritzelMenu}from"./kritzel-menu.js";export{KritzelMenuItem,defineCustomElement as defineCustomElementKritzelMenuItem}from"./kritzel-menu-item.js";export{KritzelMoreMenu,defineCustomElement as defineCustomElementKritzelMoreMenu}from"./kritzel-more-menu.js";export{KritzelNumericInput,defineCustomElement as defineCustomElementKritzelNumericInput}from"./kritzel-numeric-input.js";export{KritzelOpacitySlider,defineCustomElement as defineCustomElementKritzelOpacitySlider}from"./kritzel-opacity-slider.js";export{KritzelPortal,defineCustomElement as defineCustomElementKritzelPortal}from"./kritzel-portal.js";export{KritzelSettings,defineCustomElement as defineCustomElementKritzelSettings}from"./kritzel-settings.js";export{KritzelShapeFill,defineCustomElement as defineCustomElementKritzelShapeFill}from"./kritzel-shape-fill.js";export{KritzelSlideToggle,defineCustomElement as defineCustomElementKritzelSlideToggle}from"./kritzel-slide-toggle.js";export{KritzelSplitButton,defineCustomElement as defineCustomElementKritzelSplitButton}from"./kritzel-split-button.js";export{KritzelStrokeSize,defineCustomElement as defineCustomElementKritzelStrokeSize}from"./kritzel-stroke-size.js";export{KritzelToolConfig,defineCustomElement as defineCustomElementKritzelToolConfig}from"./kritzel-tool-config.js";export{KritzelTooltip,defineCustomElement as defineCustomElementKritzelTooltip}from"./kritzel-tooltip.js";export{KritzelUtilityPanel,defineCustomElement as defineCustomElementKritzelUtilityPanel}from"./kritzel-utility-panel.js";export{KritzelWorkspaceManager,defineCustomElement as defineCustomElementKritzelWorkspaceManager}from"./kritzel-workspace-manager.js";class X{doc;channel;_synced=!1;constructor(e,t,s){this.doc=t,this.channel=new BroadcastChannel(e),this.channel.onmessage=e=>{this.handleMessage(e.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),console.info("BroadcastChannel Provider initialized: "+e)}handleDocUpdate=(e,s)=>{if(s!==this){const s=z();t(s,0),i(s,e),this.channel.postMessage(o(s))}};handleMessage(e){const s=C(new Uint8Array(e));switch(n(s)){case 0:const e=l(s);m(this.doc,e,this);break;case 1:this.broadcastSync();break;case 2:const n=l(s),r=u(this.doc,n);if(r.length>0){const e=z();t(e,0),i(e,r),this.channel.postMessage(o(e))}}}broadcastSync(){const e=z();t(e,2),i(e,p(this.doc)),this.channel.postMessage(o(e))}async connect(){if(!this._synced)return new Promise((e=>{const t=()=>{this._synced?e():setTimeout(t,50)};t()}))}disconnect(){}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}const Y=new Map,Q="undefined"==typeof BroadcastChannel?class{constructor(e){this.room=e,this.onmessage=null,this._onChange=t=>t.key===e&&null!==this.onmessage&&this.onmessage({data:y(t.newValue||"")}),T(this._onChange)}postMessage(e){S.setItem(this.room,j(w(e)))}close(){v(this._onChange)}}:BroadcastChannel,V=e=>k(Y,e,(()=>{const t=x(),s=new Q(e);return s.onmessage=e=>t.forEach((t=>t(e.data,"broadcastchannel"))),{bc:s,subs:t}})),Z=(e,t,s=null)=>{const i=V(e);i.bc.postMessage(t),i.subs.forEach((e=>e(t,s)))},ee=(e,s)=>{t(e,0);const o=p(s);i(e,o)},te=(e,s,o)=>{t(e,1),i(e,u(s,o))},se=(e,t,s,i)=>{try{m(t,l(e),s)}catch(e){null!=i&&i(e),console.error("Caught error while handling a Yjs update",e)}},ie=se;class oe extends B{constructor(e){super(),this.doc=e,this.clientID=e.clientID,this.states=new Map,this.meta=new Map,this._checkInterval=setInterval((()=>{const e=W();null!==this.getLocalState()&&15e3<=e-this.meta.get(this.clientID).lastUpdated&&this.setLocalState(this.getLocalState());const t=[];this.meta.forEach(((s,i)=>{i!==this.clientID&&3e4<=e-s.lastUpdated&&this.states.has(i)&&t.push(i)})),t.length>0&&ne(this,t,"timeout")}),M(3e3)),e.on("destroy",(()=>{this.destroy()})),this.setLocalState({})}destroy(){this.emit("destroy",[this]),this.setLocalState(null),super.destroy(),clearInterval(this._checkInterval)}getLocalState(){return this.states.get(this.clientID)||null}setLocalState(e){const t=this.clientID,s=this.meta.get(t),i=void 0===s?0:s.clock+1,o=this.states.get(t);null===e?this.states.delete(t):this.states.set(t,e),this.meta.set(t,{clock:i,lastUpdated:W()});const n=[],r=[],l=[],a=[];null===e?a.push(t):null==o?null!=e&&n.push(t):(r.push(t),U(o,e)||l.push(t)),(n.length>0||l.length>0||a.length>0)&&this.emit("change",[{added:n,updated:l,removed:a},"local"]),this.emit("update",[{added:n,updated:r,removed:a},"local"])}setLocalStateField(e,t){const s=this.getLocalState();null!==s&&this.setLocalState({...s,[e]:t})}getStates(){return this.states}}const ne=(e,t,s)=>{const i=[];for(let s=0;s<t.length;s++){const o=t[s];if(e.states.has(o)){if(e.states.delete(o),o===e.clientID){const t=e.meta.get(o);e.meta.set(o,{clock:t.clock+1,lastUpdated:W()})}i.push(o)}}i.length>0&&(e.emit("change",[{added:[],updated:[],removed:i},s]),e.emit("update",[{added:[],updated:[],removed:i},s]))},re=(e,s,i=e.states)=>{const n=s.length,r=z();t(r,n);for(let o=0;o<n;o++){const n=s[o],l=i.get(n)||null,a=e.meta.get(n).clock;t(r,n),t(r,a),H(r,JSON.stringify(l))}return o(r)},le=[];le[0]=(e,s,i,o)=>{t(e,0);const r=((e,t,s,i,o)=>{const r=n(e);switch(r){case 0:((e,t,s)=>{te(t,s,l(e))})(e,t,s);break;case 1:se(e,s,i,o);break;case 2:ie(e,s,i,o);break;default:throw Error("Unknown message type")}return r})(s,e,i.doc,i);o&&1===r&&!i.synced&&(i.synced=!0)},le[3]=(e,s,o)=>{t(e,1),i(e,re(o.awareness,Array.from(o.awareness.getStates().keys())))},le[1]=(e,t,s)=>{((e,t,s)=>{const i=C(t),o=W(),r=[],l=[],a=[],c=[],d=n(i);for(let t=0;t<d;t++){const t=n(i);let s=n(i);const d=JSON.parse(P(i)),h=e.meta.get(t),u=e.states.get(t),m=void 0===h?0:h.clock;(m<s||m===s&&null===d&&e.states.has(t))&&(null===d?t===e.clientID&&null!=e.getLocalState()?s++:e.states.delete(t):e.states.set(t,d),e.meta.set(t,{clock:s,lastUpdated:o}),void 0===h&&null!==d?r.push(t):void 0!==h&&null===d?c.push(t):null!==d&&(U(d,u)||a.push(t),l.push(t)))}(r.length>0||a.length>0||c.length>0)&&e.emit("change",[{added:r,updated:a,removed:c},s]),(r.length>0||l.length>0||c.length>0)&&e.emit("update",[{added:r,updated:l,removed:c},s])})(s.awareness,l(t),s)},le[2]=(e,t,s)=>{((e,t,s)=>{0===n(e)&&s(0,P(e))})(t,0,((e,t)=>ae(s,t)))};const ae=(e,t)=>console.warn(`Permission denied to access ${e.url}.\n${t}`),ce=(e,t,s)=>{const i=C(t),o=z(),r=n(i),l=e.messageHandlers[r];return l?l(o,i,e,s,r):console.error("Unable to compute message"),o},de=(e,t,s)=>{t===e.ws&&(e.emit("connection-close",[s,e]),e.ws=null,t.close(),e.wsconnecting=!1,e.wsconnected?(e.wsconnected=!1,e.synced=!1,ne(e.awareness,Array.from(e.awareness.getStates().keys()).filter((t=>t!==e.doc.clientID)),e),e.emit("status",[{status:"disconnected"}])):e.wsUnsuccessfulReconnects++,setTimeout(he,_(100*$(2,e.wsUnsuccessfulReconnects),e.maxBackoffTime),e))},he=e=>{if(e.shouldConnect&&null===e.ws){const s=new e._WS(e.url,e.protocols);s.binaryType="arraybuffer",e.ws=s,e.wsconnecting=!0,e.wsconnected=!1,e.synced=!1,s.onmessage=t=>{e.wsLastMessageReceived=W();const i=ce(e,new Uint8Array(t.data),!0);O(i)>1&&s.send(o(i))},s.onerror=t=>{e.emit("connection-error",[t,e])},s.onclose=t=>{de(e,s,t)},s.onopen=()=>{e.wsLastMessageReceived=W(),e.wsconnecting=!1,e.wsconnected=!0,e.wsUnsuccessfulReconnects=0,e.emit("status",[{status:"connected"}]);const n=z();if(t(n,0),ee(n,e.doc),s.send(o(n)),null!==e.awareness.getLocalState()){const n=z();t(n,1),i(n,re(e.awareness,[e.doc.clientID])),s.send(o(n))}},e.emit("status",[{status:"connecting"}])}},ue=(e,t)=>{const s=e.ws;e.wsconnected&&s&&s.readyState===s.OPEN&&s.send(t),e.bcconnected&&Z(e.bcChannel,t,e)};class me extends L{constructor(e,s,n,{connect:r=!0,awareness:l=new oe(n),params:a={},protocols:c=[],WebSocketPolyfill:d=WebSocket,resyncInterval:h=-1,maxBackoffTime:u=2500,disableBc:m=!1}={}){for(super();"/"===e[e.length-1];)e=e.slice(0,e.length-1);this.serverUrl=e,this.bcChannel=e+"/"+s,this.maxBackoffTime=u,this.params=a,this.protocols=c,this.roomname=s,this.doc=n,this._WS=d,this.awareness=l,this.wsconnected=!1,this.wsconnecting=!1,this.bcconnected=!1,this.disableBc=m,this.wsUnsuccessfulReconnects=0,this.messageHandlers=le.slice(),this._synced=!1,this.ws=null,this.wsLastMessageReceived=0,this.shouldConnect=r,this._resyncInterval=0,h>0&&(this._resyncInterval=setInterval((()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){const e=z();t(e,0),ee(e,n),this.ws.send(o(e))}}),h)),this._bcSubscriber=(e,t)=>{if(t!==this){const t=ce(this,new Uint8Array(e),!1);O(t)>1&&Z(this.bcChannel,o(t),this)}},this._updateHandler=(e,s)=>{if(s!==this){const s=z();t(s,0),((e,s)=>{t(e,2),i(e,s)})(s,e),ue(this,o(s))}},this.doc.on("update",this._updateHandler),this._awarenessUpdateHandler=({added:e,updated:s,removed:n})=>{const r=e.concat(s).concat(n),a=z();t(a,1),i(a,re(l,r)),ue(this,o(a))},this._exitHandler=()=>{ne(this.awareness,[n.clientID],"app closed")},N&&"undefined"!=typeof process&&process.on("exit",this._exitHandler),l.on("update",this._awarenessUpdateHandler),this._checkInterval=setInterval((()=>{this.wsconnected&&3e4<W()-this.wsLastMessageReceived&&de(this,this.ws,null)}),3e3),r&&this.connect()}get url(){const e=(()=>A(this.params,((e,t)=>`${encodeURIComponent(t)}=${encodeURIComponent(e)}`)).join("&"))();return this.serverUrl+"/"+this.roomname+(0===e.length?"":"?"+e)}get synced(){return this._synced}set synced(e){this._synced!==e&&(this._synced=e,this.emit("synced",[e]),this.emit("sync",[e]))}destroy(){0!==this._resyncInterval&&clearInterval(this._resyncInterval),clearInterval(this._checkInterval),this.disconnect(),N&&"undefined"!=typeof process&&process.off("exit",this._exitHandler),this.awareness.off("update",this._awarenessUpdateHandler),this.doc.off("update",this._updateHandler),super.destroy()}connectBc(){if(this.disableBc)return;this.bcconnected||(((e,t)=>{V(this.bcChannel).subs.add(t)})(0,this._bcSubscriber),this.bcconnected=!0);const e=z();t(e,0),ee(e,this.doc),Z(this.bcChannel,o(e),this);const s=z();t(s,0),te(s,this.doc),Z(this.bcChannel,o(s),this);const n=z();t(n,3),Z(this.bcChannel,o(n),this);const r=z();t(r,1),i(r,re(this.awareness,[this.doc.clientID])),Z(this.bcChannel,o(r),this)}disconnectBc(){const e=z();t(e,1),i(e,re(this.awareness,[this.doc.clientID],new Map)),ue(this,o(e)),this.bcconnected&&(((e,t)=>{const s=V(e);s.subs.delete(t)&&0===s.subs.size&&(s.bc.close(),Y.delete(e))})(this.bcChannel,this._bcSubscriber),this.bcconnected=!1)}disconnect(){this.shouldConnect=!1,this.disconnectBc(),null!==this.ws&&de(this,this.ws,null)}connect(){this.shouldConnect=!0,this.wsconnected||null!==this.ws||(he(this),this.connectBc())}}class fe{provider;isConnected=!1;constructor(e,t,s){const i=s?.url||"ws://localhost:1234",o=s?.roomName||e;this.provider=new me(i,o,t,{params:s?.params,protocols:s?.protocols,WebSocketPolyfill:s?.WebSocketPolyfill,awareness:s?.awareness,maxBackoffTime:s?.maxBackoffTime,disableBc:!0}),this.setupEventListeners(),console.info(`WebSocket Provider initialized: ${i}/${o}`)}static with(e){return{create:(t,s)=>new fe(t,s,e)}}setupEventListeners(){this.provider.on("status",(({status:e})=>{"connected"===e?(this.isConnected=!0,console.info("WebSocket connected")):"disconnected"===e&&(this.isConnected=!1,console.info("WebSocket disconnected"))})),this.provider.on("sync",(e=>{e&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("WebSocket connection timeout"))}),1e4),i=({status:t})=>{"connected"===t&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(s),this.provider.off("status",i),this.isConnected=!0,e())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}class pe{provider;isConnected=!1;isSynced=!1;usesSharedSocket=!1;static sharedWebSocketProvider=null;constructor(e,t,s){const i=s?.name||e,o=s?.url||"ws://localhost:1234",n=s?.websocketProvider||pe.sharedWebSocketProvider;if(n){this.usesSharedSocket=!0;const e={websocketProvider:n,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),this.provider=new R(e),this.provider.attach(),s?.quiet||console.info("Hocuspocus Provider initialized (multiplexed): "+i)}else{this.usesSharedSocket=!1;const e={url:o,name:i,document:t,token:s?.token||null,onConnect:()=>{this.isConnected=!0,s?.quiet||console.info("Hocuspocus connected: "+i),s?.onConnect&&s.onConnect()},onDisconnect:()=>{this.isConnected=!1,this.isSynced=!1,s?.quiet||console.info("Hocuspocus disconnected: "+i),s?.onDisconnect&&s.onDisconnect()},onSynced:()=>{this.isSynced=!0,s?.quiet||console.info("Hocuspocus synced: "+i),s?.onSynced&&s.onSynced()}};void 0!==s?.forceSyncInterval&&(e.forceSyncInterval=s.forceSyncInterval),s?.onAuthenticationFailed&&(e.onAuthenticationFailed=s.onAuthenticationFailed),s?.onStatus&&(e.onStatus=s.onStatus),s?.WebSocketPolyfill&&(e.WebSocketPolyfill=s.WebSocketPolyfill),this.provider=new R(e),s?.quiet||console.info(`Hocuspocus Provider initialized: ${o}/${i}`)}}static createSharedWebSocket(e){if(pe.sharedWebSocketProvider)return console.warn("Shared WebSocket already exists. Returning existing instance."),pe.sharedWebSocketProvider;const t={url:e.url};return e.WebSocketPolyfill&&(t.WebSocketPolyfill=e.WebSocketPolyfill),e.onConnect&&(t.onConnect=e.onConnect),e.onDisconnect&&(t.onDisconnect=e.onDisconnect),e.onStatus&&(t.onStatus=e.onStatus),pe.sharedWebSocketProvider=new q(t),console.info("Shared Hocuspocus WebSocket created: "+e.url),pe.sharedWebSocketProvider}static destroySharedWebSocket(){pe.sharedWebSocketProvider&&(pe.sharedWebSocketProvider.destroy(),pe.sharedWebSocketProvider=null,console.info("Shared Hocuspocus WebSocket destroyed"))}static getSharedWebSocket(){return pe.sharedWebSocketProvider}static with(e){return{create:(t,s)=>new pe(t,s,e)}}async connect(){if(!this.isSynced)return new Promise(((e,t)=>{const s=setTimeout((()=>{t(Error("Hocuspocus connection timeout"))}),1e4),i=()=>{clearTimeout(s),this.provider.off("synced",i),e()};if(this.provider.on("synced",i),this.provider.isSynced)return clearTimeout(s),this.provider.off("synced",i),void e();this.isConnected||this.usesSharedSocket||this.provider.connect()}))}disconnect(){this.provider&&(this.usesSharedSocket?this.provider.detach():this.provider.disconnect()),this.isConnected=!1,this.isSynced=!1}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1,this.isSynced=!1}}export{X as BroadcastSyncProvider,pe as HocuspocusSyncProvider,fe as WebSocketSyncProvider}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-BvoIoyaZ.js";const a=o,p=s;export{a as KritzelControls,p as defineCustomElement}
1
+ import{K as o,d as s}from"./p-C8jozyvo.js";const p=o,r=s;export{p as KritzelControls,r as defineCustomElement}
@@ -1 +1 @@
1
- import{K as o,d as s}from"./p-DCFa1WDS.js";const a=o,p=s;export{a as KritzelDialog,p as defineCustomElement}
1
+ import{K as o,d as r}from"./p-BtGrZ0-u.js";const s=o,t=r;export{s as KritzelDialog,t as defineCustomElement}