kritzel-stencil 0.2.2 → 0.2.4

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 (85) hide show
  1. package/dist/cjs/index.cjs.js +1 -1
  2. package/dist/cjs/kritzel-active-users_42.cjs.entry.js +83 -30
  3. package/dist/cjs/{workspace.migrations-BPwtowiJ.js → workspace.migrations-B89-6fP-.js} +42 -8
  4. package/dist/collection/classes/core/core.class.js +9 -2
  5. package/dist/collection/classes/handlers/line-handle.handler.js +1 -0
  6. package/dist/collection/classes/handlers/move.handler.js +2 -0
  7. package/dist/collection/classes/handlers/resize.handler.js +2 -0
  8. package/dist/collection/classes/handlers/rotation.handler.js +2 -0
  9. package/dist/collection/classes/structures/object-map.structure.js +44 -3
  10. package/dist/collection/classes/tools/brush-tool.class.js +2 -0
  11. package/dist/collection/classes/tools/eraser-tool.class.js +22 -8
  12. package/dist/collection/classes/tools/line-tool.class.js +2 -0
  13. package/dist/collection/classes/tools/shape-tool.class.js +1 -0
  14. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +5 -5
  15. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +7 -0
  16. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.css +3 -2
  17. package/dist/collection/components/shared/kritzel-dialog/kritzel-dialog.js +3 -2
  18. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +7 -10
  19. package/dist/collection/components/ui/kritzel-current-user/kritzel-current-user.js +1 -1
  20. package/dist/collection/components/ui/kritzel-current-user-dialog/kritzel-current-user-dialog.js +1 -1
  21. package/dist/collection/components/ui/kritzel-export/kritzel-export.js +1 -1
  22. package/dist/collection/components/ui/kritzel-login-dialog/kritzel-login-dialog.js +1 -1
  23. package/dist/collection/components/ui/kritzel-more-menu/kritzel-more-menu.js +1 -1
  24. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +1 -1
  25. package/dist/collection/components/ui/kritzel-share-dialog/kritzel-share-dialog.js +2 -2
  26. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  27. package/dist/collection/constants/version.js +1 -1
  28. package/dist/collection/themes/dark-theme.js +4 -0
  29. package/dist/collection/themes/light-theme.js +4 -0
  30. package/dist/components/index.js +1 -1
  31. package/dist/components/kritzel-awareness-cursors.js +1 -1
  32. package/dist/components/kritzel-color-palette.js +1 -1
  33. package/dist/components/kritzel-color.js +1 -1
  34. package/dist/components/kritzel-controls.js +1 -1
  35. package/dist/components/kritzel-current-user-dialog.js +1 -1
  36. package/dist/components/kritzel-current-user.js +1 -1
  37. package/dist/components/kritzel-dialog.js +1 -1
  38. package/dist/components/kritzel-editor.js +1 -1
  39. package/dist/components/kritzel-engine.js +1 -1
  40. package/dist/components/kritzel-export.js +1 -1
  41. package/dist/components/kritzel-login-dialog.js +1 -1
  42. package/dist/components/kritzel-more-menu.js +1 -1
  43. package/dist/components/kritzel-settings.js +1 -1
  44. package/dist/components/kritzel-share-dialog.js +1 -1
  45. package/dist/components/kritzel-stroke-size.js +1 -1
  46. package/dist/components/kritzel-tool-config.js +1 -1
  47. package/dist/components/kritzel-utility-panel.js +1 -1
  48. package/dist/components/p-0F9_lw6l.js +1 -0
  49. package/dist/components/{p-DfB7uJ0N.js → p-3YivOJM2.js} +1 -1
  50. package/dist/components/p-B2dVTxsc.js +9 -0
  51. package/dist/components/{p-mYhFNPgz.js → p-BAjrJjMX.js} +1 -1
  52. package/dist/components/{p-R9M5PnAz.js → p-BDOSy6zd.js} +1 -1
  53. package/dist/components/{p-DE2xDwUM.js → p-BabNumqA.js} +1 -1
  54. package/dist/components/{p-574MVXxi.js → p-Be6E_RMf.js} +1 -1
  55. package/dist/components/{p-CoyqJSjT.js → p-BmYsz1bP.js} +1 -1
  56. package/dist/components/p-C-qyWv4d.js +1 -0
  57. package/dist/components/{p-BYOIzv_f.js → p-C1Fv9rVN.js} +1 -1
  58. package/dist/components/{p-Bfa-Amjn.js → p-C2MdRsg6.js} +1 -1
  59. package/dist/components/{p-u-827ZX7.js → p-CsMMZSAP.js} +1 -1
  60. package/dist/components/p-DMYfjC1C.js +1 -0
  61. package/dist/components/{p-Dxb22STM.js → p-DYHF_MSN.js} +1 -1
  62. package/dist/components/{p-BWrxz4mM.js → p-Dg_nGsFe.js} +1 -1
  63. package/dist/components/{p-BtJB7FsW.js → p-DoDI-v-H.js} +1 -1
  64. package/dist/components/p-Dqpa31TI.js +1 -0
  65. package/dist/components/p-R60vdaIY.js +1 -0
  66. package/dist/components/{p-CU6kJPth.js → p-ZpItdhxS.js} +1 -1
  67. package/dist/esm/index.js +2 -2
  68. package/dist/esm/kritzel-active-users_42.entry.js +83 -30
  69. package/dist/esm/{workspace.migrations-C_uxbvuH.js → workspace.migrations-D_y5zlxK.js} +42 -8
  70. package/dist/stencil/index.esm.js +1 -1
  71. package/dist/stencil/p-74898384.entry.js +9 -0
  72. package/dist/stencil/p-D_y5zlxK.js +1 -0
  73. package/dist/stencil/stencil.esm.js +1 -1
  74. package/dist/types/classes/structures/object-map.structure.d.ts +19 -0
  75. package/dist/types/constants/version.d.ts +1 -1
  76. package/dist/types/interfaces/theme.interface.d.ts +5 -5
  77. package/package.json +1 -1
  78. package/dist/components/p-BCzbwL4m.js +0 -1
  79. package/dist/components/p-BfJav4Zz.js +0 -1
  80. package/dist/components/p-BmcAX-1k.js +0 -1
  81. package/dist/components/p-C6Td7I4k.js +0 -1
  82. package/dist/components/p-CqYIRmoh.js +0 -1
  83. package/dist/components/p-DFeyobdy.js +0 -9
  84. package/dist/stencil/p-4d28c496.entry.js +0 -9
  85. package/dist/stencil/p-C_uxbvuH.js +0 -1
@@ -0,0 +1 @@
1
+ import{p as e,H as o,c as r,h as i,d as a,t as s}from"./p-BWj1eE2b.js";import{d as t}from"./p-0F9_lw6l.js";import{d as l}from"./p-A7Ult9iv.js";import{d as c}from"./p-CTj2UdbS.js";const n=e(class extends o{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.toggleIsPublic=r(this,"toggleIsPublic"),this.dialogClosed=r(this,"dialogClosed")}get host(){return this}isPublic=!1;workspaceId=void 0;onIsPublicChange(e){this.internalIsPublic=e}isDialogOpen=!1;internalIsPublic=!1;copySuccess=!1;toggleIsPublic;dialogClosed;async open(){this.internalIsPublic=this.isPublic,this.isDialogOpen=!0}async close(){this.isDialogOpen=!1}handleToggleChange=e=>{const o=e.detail;this.internalIsPublic=o,this.toggleIsPublic.emit(o)};getShareUrl(){if(!this.workspaceId)return"";const e=new URL(this.workspaceId,window.location.origin);return e.searchParams.set("share","true"),e.toString()}handleCopyUrl=async()=>{const e=this.getShareUrl();if(e)try{await navigator.clipboard.writeText(e),this.copySuccess=!0,setTimeout((()=>{this.copySuccess=!1}),2e3)}catch{const o=document.createElement("textarea");o.value=e,document.body.appendChild(o),o.select(),document.execCommand("copy"),document.body.removeChild(o),this.copySuccess=!0,setTimeout((()=>{this.copySuccess=!1}),2e3)}};closeDialog=()=>{this.isDialogOpen=!1,this.dialogClosed.emit()};render(){return i(a,{key:"bd58f146337b3eca96ca34408a3d30621f01765a"},i("kritzel-dialog",{key:"c152f4ec5739a18b265f9a8b161ec8501c1a053b",dialogTitle:"Share Workspace",isOpen:this.isDialogOpen,onDialogClose:this.closeDialog,size:"small"},i("div",{key:"2810061b1c99e4f4644342453de693e1cddf9a27",class:"share-content"},i("div",{key:"bc56de53fd6136c6867018af24019383094cab0d",class:"share-section"},i("div",{key:"43464ffd61e5a19653cc081e823f01c0eb17e454",class:"share-row"},i("div",{key:"ed83ea6684695d09dc6af82b3367fbbff6e4c7e2",class:"share-label-group"},i("label",{key:"fe2eaf501dd80ad0b8d83f93a2dcdd18bc093d3b",class:"share-label"},"Link sharing"),i("p",{key:"738f1a6afc0421380164b9d270920631cefdfd78",class:"share-description"},this.internalIsPublic?"Anyone with the link can access this workspace.":"Link sharing is disabled. Only you can access this workspace.")),i("kritzel-slide-toggle",{key:"60f0200ea8f9c207cd5ee76f5a86f82707bb724b",checked:this.internalIsPublic,onCheckedChange:this.handleToggleChange,label:"Enable link sharing"}))),this.internalIsPublic&&i("div",{key:"83212a2a996b85996eee119d5535203f77d3c8dd",class:"share-section"},i("div",{key:"297031b5aef2018f7aa33c32fd0f8c82f1ddb4cb",class:"share-url-container"},i("input",{key:"467cca4a8c31b75daa82670f64b562730c241f52",type:"text",class:"share-url-input",value:this.getShareUrl(),readOnly:!0,onClick:e=>e.target.select()}),i("button",{key:"fdc0f490339cb7050fb020cb1e83e51f6374b183",class:{"copy-button":!0,"copy-success":this.copySuccess},onClick:this.handleCopyUrl,title:this.copySuccess?"Copied!":"Copy link"},i("kritzel-icon",{key:"5ff1a76d7977c75ea7bc8c339bdf515ba102e511",name:this.copySuccess?"check":"copy",size:18})))))))}static get watchers(){return{isPublic:[{onIsPublicChange:0}]}}static get style(){return":host{display:contents}kritzel-dialog{--kritzel-dialog-width-small:420px}.share-content{display:flex;flex-direction:column;gap:20px}.share-section{display:flex;flex-direction:column;gap:8px}.share-section-revoke{padding-top:12px;border-top:1px solid var(--kritzel-share-dialog-border-color, #e5e5e5)}.share-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.share-label-group{display:flex;flex-direction:column;gap:8px;flex:1}.share-label{font-size:14px;font-weight:600;color:var(--kritzel-share-dialog-label-color, #333333);margin:0}.share-description{font-size:12px;color:var(--kritzel-share-dialog-description-color, #666666);margin:0;line-height:1.4}.share-url-container{display:flex;align-items:center;gap:8px;background:var(--kritzel-share-dialog-input-background, #f5f5f5);border:1px solid var(--kritzel-share-dialog-input-border-color, #e0e0e0);border-radius:6px;padding:4px 4px 4px 12px}.share-url-input{flex:1;border:none;background:transparent;font-size:13px;color:var(--kritzel-share-dialog-input-text-color, #333333);outline:none;min-width:0;padding:8px 0}.share-url-input:focus{outline:none}.share-url-input::selection{background:var(--kritzel-share-dialog-selection-color, #cce5ff)}.copy-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:4px;background:var(--kritzel-share-dialog-copy-button-background, #ffffff);color:var(--kritzel-share-dialog-copy-button-color, #666666);cursor:pointer;transition:all 0.15s ease;flex-shrink:0}.copy-button:hover{background:var(--kritzel-share-dialog-copy-button-hover-background, #e8e8e8);color:var(--kritzel-share-dialog-copy-button-hover-color, #333333)}.copy-button.copy-success{background:var(--kritzel-share-dialog-copy-success-background, #d4edda);color:var(--kritzel-share-dialog-copy-success-color, #28a745)}.revoke-button{align-self:flex-start;padding:8px 16px;border:1px solid var(--kritzel-share-dialog-revoke-button-border-color, #dc3545);border-radius:6px;background:transparent;color:var(--kritzel-share-dialog-revoke-button-color, #dc3545);font-size:13px;font-weight:500;cursor:pointer;transition:all 0.15s ease}.revoke-button:hover{background:var(--kritzel-share-dialog-revoke-button-hover-background, #dc3545);color:var(--kritzel-share-dialog-revoke-button-hover-color, #ffffff)}kritzel-dropdown{--kritzel-dropdown-trigger-padding:8px 12px;--kritzel-dropdown-trigger-font-size:13px}"}},[513,"kritzel-share-dialog",{isPublic:[4,"is-public"],workspaceId:[1,"workspace-id"],isDialogOpen:[32],internalIsPublic:[32],copySuccess:[32],open:[64],close:[64]},void 0,{isPublic:[{onIsPublicChange:0}]}]);function d(){"undefined"!=typeof customElements&&["kritzel-share-dialog","kritzel-dialog","kritzel-icon","kritzel-slide-toggle"].forEach((e=>{switch(e){case"kritzel-share-dialog":customElements.get(s(e))||customElements.define(s(e),n);break;case"kritzel-dialog":customElements.get(s(e))||t();break;case"kritzel-icon":customElements.get(s(e))||l();break;case"kritzel-slide-toggle":customElements.get(s(e))||c()}}))}export{n as K,d}
@@ -1 +1 @@
1
- import{p as i,H as e,c as o,h as t,d as l,t as r}from"./p-BWj1eE2b.js";import{d as s}from"./p-BfJav4Zz.js";import{d as n}from"./p-A7Ult9iv.js";const a=i(class extends e{constructor(i){super(),!1!==i&&this.__registerHost(),this.__attachShadow(),this.providerLogin=o(this,"providerLogin"),this.dialogClosed=o(this,"dialogClosed")}get host(){return this}providers=[];dialogTitle="Sign in";subtitle;isDialogOpen=!1;loadingProvider=null;providerLogin;dialogClosed;async open(){this.loadingProvider=null,this.isDialogOpen=!0}async close(){this.isDialogOpen=!1,this.loadingProvider=null}async setLoading(i){this.loadingProvider=i}handleProviderClick=i=>{this.loadingProvider||(this.loadingProvider=i.name,this.providerLogin.emit({provider:i.name}))};closeDialog=()=>{this.isDialogOpen=!1,this.loadingProvider=null,this.dialogClosed.emit()};render(){return t(l,{key:"8cac83db48fef2531f1669c3f601526b1e5cdefa"},t("kritzel-dialog",{key:"72e0f2eb8e19f3c1081bfd5e1183aa9ed1bc678a",dialogTitle:this.dialogTitle,isOpen:this.isDialogOpen,onDialogClose:this.closeDialog,size:"small"},t("div",{key:"bb17bcf6f3486000c9056b3983810e016b0f05a3",class:"login-content"},this.subtitle&&t("p",{key:"cef17bc6f5078769b8deed6ec1c615a71fe0c611",class:"login-subtitle"},this.subtitle),t("div",{key:"8462ef9a62201cb15f8911432ca188cf49bc8a8d",class:"login-providers"},this.providers.map((i=>t("button",{key:i.name,class:{"provider-button":!0,"is-loading":this.loadingProvider===i.name,"is-disabled":null!==this.loadingProvider&&this.loadingProvider!==i.name},disabled:null!==this.loadingProvider&&this.loadingProvider!==i.name,onClick:()=>this.handleProviderClick(i)},this.loadingProvider===i.name?t("span",{class:"spinner"}):i.icon&&t("kritzel-icon",{name:i.icon,size:20}),t("span",{class:"provider-label"},i.label))))))))}static get style(){return":host{display:contents}kritzel-dialog{--kritzel-dialog-width-small:380px}.login-content{display:flex;flex-direction:column;gap:20px}.login-subtitle{font-size:13px;color:var(--kritzel-login-dialog-subtitle-color, #666666);margin:0;line-height:1.5;text-align:center}.login-providers{display:flex;flex-direction:column;gap:10px}.provider-button{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:12px 16px;border:1px solid var(--kritzel-login-dialog-button-border-color, #e0e0e0);border-radius:8px;background:var(--kritzel-login-dialog-button-background, #ffffff);color:var(--kritzel-login-dialog-button-text-color, #333333);font-size:14px;font-weight:500;font-family:inherit;cursor:var(--kritzel-global-pointer-cursor, pointer);transition:background-color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;-webkit-tap-highlight-color:transparent}.provider-button:hover:not(:disabled){background:var(--kritzel-login-dialog-button-hover-background, #f5f5f5);border-color:var(--kritzel-login-dialog-button-hover-border-color, #cccccc)}.provider-button:active:not(:disabled){background:var(--kritzel-login-dialog-button-active-background, #ebebeb)}.provider-button:focus-visible{outline:revert;outline-offset:revert}.provider-button.is-disabled{opacity:0.5;cursor:default;pointer-events:none}.provider-button.is-loading{cursor:default}.provider-label{flex-shrink:0}.provider-button.is-loading .provider-label{opacity:0.7}@keyframes kritzel-login-spin{to{transform:rotate(360deg)}}.spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-login-dialog-spinner-color, #cccccc);border-top-color:var(--kritzel-login-dialog-spinner-active-color, #333333);border-radius:50%;animation:kritzel-login-spin 0.6s linear infinite}"}},[513,"kritzel-login-dialog",{providers:[16],dialogTitle:[1,"dialog-title"],subtitle:[1],isDialogOpen:[32],loadingProvider:[32],open:[64],close:[64],setLoading:[64]}]);function d(){"undefined"!=typeof customElements&&["kritzel-login-dialog","kritzel-dialog","kritzel-icon"].forEach((i=>{switch(i){case"kritzel-login-dialog":customElements.get(r(i))||customElements.define(r(i),a);break;case"kritzel-dialog":customElements.get(r(i))||s();break;case"kritzel-icon":customElements.get(r(i))||n()}}))}export{a as K,d}
1
+ import{p as i,H as o,c as e,h as t,d as l,t as r}from"./p-BWj1eE2b.js";import{d as s}from"./p-0F9_lw6l.js";import{d as n}from"./p-A7Ult9iv.js";const a=i(class extends o{constructor(i){super(),!1!==i&&this.__registerHost(),this.__attachShadow(),this.providerLogin=e(this,"providerLogin"),this.dialogClosed=e(this,"dialogClosed")}get host(){return this}providers=[];dialogTitle="Sign in";subtitle;isDialogOpen=!1;loadingProvider=null;providerLogin;dialogClosed;async open(){this.loadingProvider=null,this.isDialogOpen=!0}async close(){this.isDialogOpen=!1,this.loadingProvider=null}async setLoading(i){this.loadingProvider=i}handleProviderClick=i=>{this.loadingProvider||(this.loadingProvider=i.name,this.providerLogin.emit({provider:i.name}))};closeDialog=()=>{this.isDialogOpen=!1,this.loadingProvider=null,this.dialogClosed.emit()};render(){return t(l,{key:"1a664868b840030a773f61c2a0f4388dfb014675"},t("kritzel-dialog",{key:"09ece6fb5949fc8b204f29cd931c583e525590e1",dialogTitle:this.dialogTitle,isOpen:this.isDialogOpen,onDialogClose:this.closeDialog,size:"small"},t("div",{key:"57218d7762734929691b82700c31922f5a4991c8",class:"login-content"},this.subtitle&&t("p",{key:"9ee071786f393857cd6a666e395526a139359d60",class:"login-subtitle"},this.subtitle),t("div",{key:"a487687345aabcfb55976437ddc85feb464f0cae",class:"login-providers"},this.providers.map((i=>t("button",{key:i.name,class:{"provider-button":!0,"is-loading":this.loadingProvider===i.name,"is-disabled":null!==this.loadingProvider&&this.loadingProvider!==i.name},disabled:null!==this.loadingProvider&&this.loadingProvider!==i.name,onClick:()=>this.handleProviderClick(i)},this.loadingProvider===i.name?t("span",{class:"spinner"}):i.icon&&t("kritzel-icon",{name:i.icon,size:20}),t("span",{class:"provider-label"},i.label))))))))}static get style(){return":host{display:contents}kritzel-dialog{--kritzel-dialog-width-small:380px}.login-content{display:flex;flex-direction:column;gap:20px}.login-subtitle{font-size:13px;color:var(--kritzel-login-dialog-subtitle-color, #666666);margin:0;line-height:1.5;text-align:center}.login-providers{display:flex;flex-direction:column;gap:10px}.provider-button{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:12px 16px;border:1px solid var(--kritzel-login-dialog-button-border-color, #e0e0e0);border-radius:8px;background:var(--kritzel-login-dialog-button-background, #ffffff);color:var(--kritzel-login-dialog-button-text-color, #333333);font-size:14px;font-weight:500;font-family:inherit;cursor:var(--kritzel-global-pointer-cursor, pointer);transition:background-color 0.15s ease, border-color 0.15s ease, opacity 0.15s ease;-webkit-tap-highlight-color:transparent}.provider-button:hover:not(:disabled){background:var(--kritzel-login-dialog-button-hover-background, #f5f5f5);border-color:var(--kritzel-login-dialog-button-hover-border-color, #cccccc)}.provider-button:active:not(:disabled){background:var(--kritzel-login-dialog-button-active-background, #ebebeb)}.provider-button:focus-visible{outline:revert;outline-offset:revert}.provider-button.is-disabled{opacity:0.5;cursor:default;pointer-events:none}.provider-button.is-loading{cursor:default}.provider-label{flex-shrink:0}.provider-button.is-loading .provider-label{opacity:0.7}@keyframes kritzel-login-spin{to{transform:rotate(360deg)}}.spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-login-dialog-spinner-color, #cccccc);border-top-color:var(--kritzel-login-dialog-spinner-active-color, #333333);border-radius:50%;animation:kritzel-login-spin 0.6s linear infinite}"}},[513,"kritzel-login-dialog",{providers:[16],dialogTitle:[1,"dialog-title"],subtitle:[1],isDialogOpen:[32],loadingProvider:[32],open:[64],close:[64],setLoading:[64]}]);function d(){"undefined"!=typeof customElements&&["kritzel-login-dialog","kritzel-dialog","kritzel-icon"].forEach((i=>{switch(i){case"kritzel-login-dialog":customElements.get(r(i))||customElements.define(r(i),a);break;case"kritzel-dialog":customElements.get(r(i))||s();break;case"kritzel-icon":customElements.get(r(i))||n()}}))}export{a as K,d}
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { H as HocuspocusProvider, a as HocuspocusProviderWebsocket } from './workspace.migrations-C_uxbvuH.js';
2
- export { E as APP_STATE_MIGRATIONS, A as AssetNotFoundError, C as CURRENT_APP_STATE_SCHEMA_VERSION, z as CURRENT_WORKSPACE_SCHEMA_VERSION, v as DEFAULT_ASSET_STORAGE_CONFIG, D as DEFAULT_BRUSH_CONFIG, u as DEFAULT_LINE_TOOL_CONFIG, t as DEFAULT_TEXT_CONFIG, p as IndexedDBAssetProvider, I as IndexedDBSyncProvider, y as KritzelAlignment, r as KritzelAnchorManager, o as KritzelAssetResolver, g as KritzelBrushTool, m as KritzelCursorHelper, i as KritzelEraserTool, e as KritzelGroup, c as KritzelImage, j as KritzelImageTool, d as KritzelLine, h as KritzelLineTool, b as KritzelPath, n as KritzelSelectionTool, f as KritzelShape, l as KritzelShapeTool, K as KritzelText, k as KritzelTextTool, s as KritzelThemeManager, q as KritzelWorkspace, S as ShapeType, W as WORKSPACE_EXPORT_VERSION, F as WORKSPACE_MIGRATIONS, x as darkTheme, w as lightTheme, B as runMigrations } from './workspace.migrations-C_uxbvuH.js';
1
+ import { H as HocuspocusProvider, a as HocuspocusProviderWebsocket } from './workspace.migrations-D_y5zlxK.js';
2
+ export { E as APP_STATE_MIGRATIONS, A as AssetNotFoundError, C as CURRENT_APP_STATE_SCHEMA_VERSION, z as CURRENT_WORKSPACE_SCHEMA_VERSION, v as DEFAULT_ASSET_STORAGE_CONFIG, D as DEFAULT_BRUSH_CONFIG, u as DEFAULT_LINE_TOOL_CONFIG, t as DEFAULT_TEXT_CONFIG, p as IndexedDBAssetProvider, I as IndexedDBSyncProvider, y as KritzelAlignment, r as KritzelAnchorManager, o as KritzelAssetResolver, g as KritzelBrushTool, m as KritzelCursorHelper, i as KritzelEraserTool, e as KritzelGroup, c as KritzelImage, j as KritzelImageTool, d as KritzelLine, h as KritzelLineTool, b as KritzelPath, n as KritzelSelectionTool, f as KritzelShape, l as KritzelShapeTool, K as KritzelText, k as KritzelTextTool, s as KritzelThemeManager, q as KritzelWorkspace, S as ShapeType, W as WORKSPACE_EXPORT_VERSION, F as WORKSPACE_MIGRATIONS, x as darkTheme, w as lightTheme, B as runMigrations } from './workspace.migrations-D_y5zlxK.js';
3
3
  import * as Y from 'yjs';
4
4
  import { WebsocketProvider } from 'y-websocket';
5
5
  import 'y-indexeddb';
@@ -1,5 +1,5 @@
1
1
  import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './index-D9HaikfQ.js';
2
- import { b as KritzelPath, d as KritzelLine, G as KritzelColorHelper, n as KritzelSelectionTool, g as KritzelBrushTool, h as KritzelLineTool, l as KritzelShapeTool, k as KritzelTextTool, J as KritzelDevicesHelper, L as KritzelMouseButton, M as DEFAULT_COLOR_PALETTE, S as ShapeType, I as IndexedDBSyncProvider, D as DEFAULT_BRUSH_CONFIG, i as KritzelEraserTool, u as DEFAULT_LINE_TOOL_CONFIG, t as DEFAULT_TEXT_CONFIG, j as KritzelImageTool, y as KritzelAlignment, v as DEFAULT_ASSET_STORAGE_CONFIG, N as KritzelSelectionGroup, O as KritzelSelectionBox, P as KritzelIconRegistry, Q as KritzelKeyboardHelper, R as KritzelBaseHandler, T as KritzelToolRegistry, U as KritzelBaseObject, q as KritzelWorkspace, e as KritzelGroup, c as KritzelImage, f as KritzelShape, K as KritzelText, B as runMigrations, z as CURRENT_WORKSPACE_SCHEMA_VERSION, F as WORKSPACE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, E as APP_STATE_MIGRATIONS, V as ObjectHelper, m as KritzelCursorHelper, r as KritzelAnchorManager, s as KritzelThemeManager, o as KritzelAssetResolver, X as KritzelClassHelper, Y as KritzelEventHelper, Z as KritzelBaseTool, W as WORKSPACE_EXPORT_VERSION } from './workspace.migrations-C_uxbvuH.js';
2
+ import { b as KritzelPath, d as KritzelLine, G as KritzelColorHelper, n as KritzelSelectionTool, g as KritzelBrushTool, h as KritzelLineTool, l as KritzelShapeTool, k as KritzelTextTool, J as KritzelDevicesHelper, L as KritzelMouseButton, M as DEFAULT_COLOR_PALETTE, S as ShapeType, I as IndexedDBSyncProvider, D as DEFAULT_BRUSH_CONFIG, i as KritzelEraserTool, u as DEFAULT_LINE_TOOL_CONFIG, t as DEFAULT_TEXT_CONFIG, j as KritzelImageTool, y as KritzelAlignment, v as DEFAULT_ASSET_STORAGE_CONFIG, N as KritzelSelectionGroup, O as KritzelSelectionBox, P as KritzelIconRegistry, Q as KritzelKeyboardHelper, R as KritzelBaseHandler, T as KritzelToolRegistry, U as KritzelBaseObject, q as KritzelWorkspace, e as KritzelGroup, c as KritzelImage, f as KritzelShape, K as KritzelText, B as runMigrations, z as CURRENT_WORKSPACE_SCHEMA_VERSION, F as WORKSPACE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, E as APP_STATE_MIGRATIONS, V as ObjectHelper, m as KritzelCursorHelper, r as KritzelAnchorManager, s as KritzelThemeManager, o as KritzelAssetResolver, X as KritzelClassHelper, Y as KritzelEventHelper, Z as KritzelBaseTool, W as WORKSPACE_EXPORT_VERSION } from './workspace.migrations-D_y5zlxK.js';
3
3
  import * as Y from 'yjs';
4
4
  import 'y-indexeddb';
5
5
  import 'y-websocket';
@@ -935,10 +935,7 @@ const KritzelControls = class {
935
935
  }
936
936
  handleDisplayValuesChange = (event) => {
937
937
  const newVal = event.detail;
938
- if (this.displayValues &&
939
- this.displayValues.color === newVal.color &&
940
- this.displayValues.size === newVal.size &&
941
- this.displayValues.fontFamily === newVal.fontFamily) {
938
+ if (this.displayValues && this.displayValues.color === newVal.color && this.displayValues.size === newVal.size && this.displayValues.fontFamily === newVal.fontFamily) {
942
939
  return;
943
940
  }
944
941
  this.displayValues = newVal;
@@ -1070,13 +1067,13 @@ const KritzelControls = class {
1070
1067
  // Separate tool controls from config control
1071
1068
  const toolControls = this.controls.filter(c => c.type === 'tool' || c.type === 'separator');
1072
1069
  const configControl = this.controls.find(c => c.type === 'config' && c.name === this.firstConfig?.name);
1073
- return (h(Host, { key: 'ea5e17d6995c228862b6d3375213b8f4ff05f04b', class: {
1070
+ return (h(Host, { key: '93d08a3268edb67fc4cccb291b6e0aff6cf5a4bd', class: {
1074
1071
  mobile: this.isTouchDevice,
1075
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '3296551d078f9d358efff1438fdcf723349fa5e1', style: {
1072
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '8862ea7e524b3e23d87ffea2929e04df7231bb0c', style: {
1076
1073
  position: 'absolute',
1077
1074
  bottom: '56px',
1078
1075
  left: '12px',
1079
- }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '9cbea189d5875cda4f09dc7228345e0cb268d47d', class: "kritzel-controls" }, h("div", { key: '0df655a7ac5bd6bc164b82703bc212b480058ba2', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'bc16b645b6c6a12ec6bd8420a8d84aee83d2b6d2', class: "kritzel-tools-scroll", ref: el => this.toolsScrollRef = el, onScroll: this.handleToolsScroll }, toolControls.map(control => {
1076
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '2ea2a41ba4cda77f5abde9231d293da181a2a568', class: "kritzel-controls" }, h("div", { key: '6bd4f6d930a0a51d5549b6dbae1e7be14cbe7822', class: { 'scroll-indicator-left': true, 'visible': this.canScrollLeft } }), h("div", { key: 'c712ca502a4ebd244394158b39391a49839bc386', class: "kritzel-tools-scroll", ref: el => (this.toolsScrollRef = el), onScroll: this.handleToolsScroll }, toolControls.map(control => {
1080
1077
  // Check if this control has sub-options (split-button)
1081
1078
  if (control.subOptions?.length) {
1082
1079
  const selectedSubOption = this.getSelectedSubOption(control);
@@ -1106,10 +1103,10 @@ const KritzelControls = class {
1106
1103
  'kritzel-control': true,
1107
1104
  'selected': this.activeControl?.name === control?.name,
1108
1105
  }, key: control.name, "data-testid": `tool-${control.name}`, onClick: _event => this.handleControlClick?.(control) }, h("kritzel-icon", { name: control.icon })));
1109
- })), h("div", { key: '2e0824a991997d52168a3d922c2214ed66f5bf57', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
1106
+ })), h("div", { key: '6ca260915b2880443a324855a1de96d10affd256', class: { 'scroll-indicator-right': true, 'visible': this.canScrollRight && !(configControl && this.activeControl && hasConfigUI) } }), configControl && this.activeControl && (h("div", { class: {
1110
1107
  'kritzel-config-container': true,
1111
1108
  'visible': hasConfigUI,
1112
- }, key: configControl.name }, h("div", { key: 'd2cb554f56ce0f3bfe72e85fcbb506199387c15f', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '39412859a99c71b536e0b2ed0045b671a975af7e', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: '1977ceddd337df53e8636e2bddd1d928aca3a1ff', tool: this.activeControl.tool, theme: this.theme, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: '06bd3bf3558931a0c2317e149d8990f42e77adae', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
1109
+ }, key: configControl.name }, h("div", { key: '984d30bd7f508d2fc56a9e81692fdf05dfb852c9', class: { 'config-gradient-left': true, 'visible': this.needsScrolling } }), h("kritzel-tooltip", { key: '90c59995d229c606b9bf3b625f6eefc0632371c6', anchorElement: this.host.shadowRoot?.querySelector('.kritzel-config-container'), triggerElement: this.configTriggerRef }, h("kritzel-tool-config", { key: 'cdb56f983e1f6840b11d06d166f982a93c07331b', tool: this.activeControl.tool, theme: this.theme, onToolChange: event => this.handleToolChange?.(event), onDisplayValuesChange: this.handleDisplayValuesChange, style: { width: '100%', height: '100%' } })), h("div", { key: 'c79db07dd02995d3ee105e8d7a773f89cd7072a5', tabIndex: hasConfigUI ? 0 : -1, class: "kritzel-config", "data-testid": "tool-config", ref: el => {
1113
1110
  if (el)
1114
1111
  this.configTriggerRef = el;
1115
1112
  }, onKeyDown: event => {
@@ -1118,7 +1115,7 @@ const KritzelControls = class {
1118
1115
  }
1119
1116
  }, style: {
1120
1117
  cursor: 'pointer',
1121
- } }, this.activeControl.tool instanceof KritzelTextTool && this.displayValues ? (h("div", { class: "font-container" }, h("kritzel-font", { fontFamily: this.displayValues.fontFamily, size: this.displayValues.size, color: this.displayValues.color }))) : this.displayValues && (h("div", { class: "color-container" }, h("kritzel-color", { value: this.displayValues.color, theme: this.theme, size: this.displayValues.size, style: {
1118
+ } }, this.displayValues && (h("div", { key: '0573a22c3105076729eb986c98b7e8644392f767', class: "color-container" }, h("kritzel-color", { key: '1e9711c219a5c520873b3206072957f2d406c56c', value: this.displayValues.color, theme: this.theme, size: 18, style: {
1122
1119
  borderRadius: '50%',
1123
1120
  border: 'none',
1124
1121
  } })))))))));
@@ -1153,7 +1150,7 @@ const KritzelCurrentUser = class {
1153
1150
  this.dialogRef?.open();
1154
1151
  };
1155
1152
  render() {
1156
- return (h(Host, { key: 'a735cb9f16f4898fde0b52573affa2d270a8f1de' }, h("kritzel-avatar", { key: 'd449a515182718ab4ef3b26b2277696bbc7ab46f', user: this.user, size: this.avatarSize, onClick: this.handleAvatarClick }), h("kritzel-current-user-dialog", { key: '3542f6df43c9924218e344f70bdc398c74a8eae6', ref: el => (this.dialogRef = el), user: this.user })));
1153
+ return (h(Host, { key: 'c392caf731f8352fd8e2a95918fe48a2f00dd9e5' }, h("kritzel-avatar", { key: 'b3bdce0efa0c0610aa028303386c643d53bc8300', user: this.user, size: this.avatarSize, onClick: this.handleAvatarClick }), h("kritzel-current-user-dialog", { key: '5e7af1aea468028e091ad8f461e4352cb9f9636b', ref: el => (this.dialogRef = el), user: this.user })));
1157
1154
  }
1158
1155
  };
1159
1156
  KritzelCurrentUser.style = kritzelCurrentUserCss();
@@ -1185,7 +1182,7 @@ const KritzelCurrentUserDialog = class {
1185
1182
  }
1186
1183
  render() {
1187
1184
  const displayName = this.getDisplayName();
1188
- return (h(Host, { key: '40c1a1bed0ddf02f9835199b5f7d2363e4d1902b' }, h("kritzel-dialog", { key: '8d10cd2dbdec06c0519f5a8f6f0f113d30b978aa', dialogTitle: "Account", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '24d8267d37fde77ce1a26efb84a9eaa3320dd6b7', class: "user-info" }, h("kritzel-avatar", { key: '282153dea220d8aa4a509764e2dcbcf20a6f2682', user: this.user, size: 80 }), displayName && h("div", { key: '3a908e583a8eb0aca4020eb78d76821b82b1c643', class: "user-name" }, displayName), this.user?.email && h("div", { key: '2aadf821b6f91c6bd76f10ff234d94ab8b79dd9c', class: "user-email" }, this.user.email)))));
1185
+ return (h(Host, { key: 'e1dd44cdfdbaebfe886fed0d9feba2ef232b6615' }, h("kritzel-dialog", { key: '49dd037cca0741cc949f20d9d44cfd028492dc60', dialogTitle: "Account", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'ddcdfb82cc0c896025559888d475ab5c9ad59b4c', class: "user-info" }, h("kritzel-avatar", { key: '4d164b784cde6787d26ac164c7450c0352e6a7cb', user: this.user, size: 80 }), displayName && h("div", { key: '13ad719d8bd90cd608c78438fccbb38ed1d5e5ba', class: "user-name" }, displayName), this.user?.email && h("div", { key: 'df360afd434293d9c9d5fcf114713e0a6925a78e', class: "user-email" }, this.user.email)))));
1189
1186
  }
1190
1187
  };
1191
1188
  KritzelCurrentUserDialog.style = kritzelCurrentUserDialogCss();
@@ -1346,7 +1343,7 @@ class KritzelHTMLHelper {
1346
1343
  }
1347
1344
  }
1348
1345
 
1349
- 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-content.fullscreen-on-mobile .dialog-body{display:flex;flex-direction:column}.dialog-content.fullscreen-on-mobile .dialog-body ::slotted(*){flex:1;min-height: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-global-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;min-height:0;scrollbar-color:var(--kritzel-global-scrollbar-thumb-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}`;
1346
+ 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), (max-height: 576px) and (orientation: landscape){.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-content.fullscreen-on-mobile .dialog-body{display:flex;flex-direction:column}.dialog-content.fullscreen-on-mobile .dialog-body ::slotted(*){flex:1;min-height: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-global-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;min-height:0;scrollbar-color:var(--kritzel-global-scrollbar-thumb-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}`;
1350
1347
 
1351
1348
  const KritzelDialog = class {
1352
1349
  constructor(hostRef) {
@@ -1448,8 +1445,9 @@ const KritzelDialog = class {
1448
1445
  document.body.style.overflow = 'hidden';
1449
1446
  }
1450
1447
  lockMobileViewportHeight() {
1451
- // Only lock height on mobile when fullscreenOnMobile is enabled
1452
- if (!this.fullscreenOnMobile || window.innerWidth > 576) {
1448
+ // Only lock height on mobile when fullscreenOnMobile is enabled.
1449
+ // Use the smaller dimension so landscape phones (wide but short) are also detected.
1450
+ if (!this.fullscreenOnMobile || Math.min(window.innerWidth, window.innerHeight) > 576) {
1453
1451
  this.mobileLockedHeight = null;
1454
1452
  return;
1455
1453
  }
@@ -21425,6 +21423,12 @@ class KritzelObjectMap {
21425
21423
  * redundant full serializations of every child object per frame.
21426
21424
  */
21427
21425
  _localOnlyMode = false;
21426
+ /**
21427
+ * Tracks whether we're currently executing inside a `transaction()`
21428
+ * callback. While true, `markUndoBoundary()` is a no-op so nested
21429
+ * insert/remove calls don't split the in-progress undo step.
21430
+ */
21431
+ _inTransaction = false;
21428
21432
  /**
21429
21433
  * Indicates whether the object map has been initialized and is ready for use.
21430
21434
  * @returns `true` if providers are connected and the map is operational
@@ -21663,9 +21667,12 @@ class KritzelObjectMap {
21663
21667
  }
21664
21668
  this._providers.push(provider);
21665
21669
  }
21666
- // Set up undo/redo manager for this workspace
21670
+ // captureTimeout is effectively infinite undo-step boundaries are
21671
+ // marked explicitly via markUndoBoundary() in insert/remove/reset and
21672
+ // at stroke/gesture boundaries in the tools. This prevents a single
21673
+ // brush stroke from being split when the user pauses after pointerdown.
21667
21674
  this._undoManager = new Y.UndoManager([this._objectsMap], {
21668
- captureTimeout: 200,
21675
+ captureTimeout: Number.MAX_SAFE_INTEGER,
21669
21676
  trackedOrigins: new Set(['local', 'temporary']),
21670
21677
  ignoreRemoteMapChanges: true,
21671
21678
  });
@@ -21983,9 +21990,35 @@ class KritzelObjectMap {
21983
21990
  */
21984
21991
  transaction(callback) {
21985
21992
  if (this._ydoc) {
21986
- this._ydoc.transact(callback, 'local');
21993
+ this._inTransaction = true;
21994
+ try {
21995
+ this._ydoc.transact(callback, 'local');
21996
+ }
21997
+ finally {
21998
+ this._inTransaction = false;
21999
+ }
21987
22000
  }
21988
22001
  }
22002
+ /**
22003
+ * Closes the current undo stack item so the next tracked change starts
22004
+ * a new one. Call at gesture/stroke boundaries (e.g. drag/resize/rotate
22005
+ * end, brush/line/shape stroke end).
22006
+ *
22007
+ * No-op while a transaction() is open.
22008
+ */
22009
+ stopUndoCapturing() {
22010
+ this.markUndoBoundary();
22011
+ }
22012
+ /**
22013
+ * Internal: closes the current undo stack item. No-op while inside a
22014
+ * transaction() so wrapped multi-op work stays a single undo step.
22015
+ */
22016
+ markUndoBoundary() {
22017
+ if (this._inTransaction) {
22018
+ return;
22019
+ }
22020
+ this._undoManager?.stopCapturing();
22021
+ }
21989
22022
  /**
21990
22023
  * Executes a callback where all update() calls only modify local state
21991
22024
  * (quadtree + idMap) without writing to Yjs. This avoids expensive full
@@ -22049,6 +22082,7 @@ class KritzelObjectMap {
22049
22082
  reset() {
22050
22083
  this.quadtree.reset();
22051
22084
  this._idMap.clear();
22085
+ this.markUndoBoundary();
22052
22086
  this._ydoc?.transact(() => {
22053
22087
  this._objectsMap?.clear();
22054
22088
  }, 'local');
@@ -22069,6 +22103,7 @@ class KritzelObjectMap {
22069
22103
  this._idMap.set(object.id, object);
22070
22104
  if (this._objectsMap && this.isPersistable(object)) {
22071
22105
  const serialized = object.serialize();
22106
+ this.markUndoBoundary();
22072
22107
  this._ydoc?.transact(() => {
22073
22108
  this._objectsMap?.set(object.id, serialized);
22074
22109
  }, 'local');
@@ -22113,6 +22148,10 @@ class KritzelObjectMap {
22113
22148
  */
22114
22149
  remove(predicate) {
22115
22150
  const objectsToRemove = this.quadtree.filter(predicate);
22151
+ if (objectsToRemove.length === 0) {
22152
+ return;
22153
+ }
22154
+ this.markUndoBoundary();
22116
22155
  for (const object of objectsToRemove) {
22117
22156
  this.quadtree.remove(o => o.id === object.id);
22118
22157
  this._idMap.delete(object.id);
@@ -23803,8 +23842,15 @@ class KritzelCore {
23803
23842
  if (!selectionGroup) {
23804
23843
  return;
23805
23844
  }
23806
- selectionGroup.objects.forEach(obj => this.removeObject(obj));
23807
- this.removeSelectionGroup();
23845
+ // Seal the selection group's creation into its own undo step so Yjs
23846
+ // doesn't collapse create+delete of the SG into a no-op on undo.
23847
+ this._store.objects.stopUndoCapturing();
23848
+ this._store.objects.transaction(() => {
23849
+ selectionGroup.objects.forEach(obj => this.removeObject(obj));
23850
+ this.removeSelectionGroup();
23851
+ });
23852
+ // Close the deletion step so subsequent unrelated changes start a new step.
23853
+ this._store.objects.stopUndoCapturing();
23808
23854
  this.engine.emitObjectsInViewportChange();
23809
23855
  this.rerender();
23810
23856
  }
@@ -25756,7 +25802,7 @@ async function toPng(node, options = {}) {
25756
25802
  return canvas.toDataURL();
25757
25803
  }
25758
25804
 
25759
- const kritzelEngineCss = () => `:host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.ProseMirror{outline:none}p,h1,h2,h3,h4,h5,h6,blockquote,pre{margin:0;padding:0}.workspace-loading-overlay{position:absolute;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;gap:10px;background-color:var(--kritzel-loading-overlay-background, rgba(255, 255, 255, 0.6));color:var(--kritzel-loading-overlay-color, #333);font-family:var(--kritzel-font-family, sans-serif);font-size:1.25rem;pointer-events:all;animation:workspace-loading-fade-in 200ms ease-out var(--kritzel-loading-overlay-delay, 300ms) forwards;opacity:0}.workspace-loading-spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-loading-overlay-spinner-color, #cccccc);border-top-color:var(--kritzel-loading-overlay-spinner-active-color, #333333);border-radius:50%;animation:workspace-loading-spin 0.6s linear infinite}@keyframes workspace-loading-spin{to{transform:rotate(360deg)}}@keyframes workspace-loading-fade-in{to{opacity:1}}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}.PlaygroundEditorTheme__quote{margin:0;margin-left:20px;margin-bottom:10px;font-size:15px;color:rgb(101, 103, 107);border-left-color:rgb(206, 208, 212);border-left-width:4px;border-left-style:solid;padding-left:16px}`;
25805
+ const kritzelEngineCss = () => `:host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.ProseMirror{outline:none}p,h1,h2,h3,h4,h5,h6,blockquote,pre{margin:0;padding:0}.workspace-loading-overlay{position:absolute;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;gap:10px;background-color:var(--kritzel-engine-loading-overlay-background, rgba(255, 255, 255, 0.6));color:var(--kritzel-engine-loading-overlay-color, #333);font-family:var(--kritzel-font-family, sans-serif);font-size:1.25rem;pointer-events:all;animation:workspace-loading-fade-in 200ms ease-out var(--kritzel-engine-loading-overlay-delay, 300ms) forwards;opacity:0}.workspace-loading-spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-engine-loading-overlay-spinner-color, #cccccc);border-top-color:var(--kritzel-engine-loading-overlay-spinner-active-color, #333333);border-radius:50%;animation:workspace-loading-spin 0.6s linear infinite}@keyframes workspace-loading-spin{to{transform:rotate(360deg)}}@keyframes workspace-loading-fade-in{to{opacity:1}}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}.PlaygroundEditorTheme__quote{margin:0;margin-left:20px;margin-bottom:10px;font-size:15px;color:rgb(101, 103, 107);border-left-color:rgb(206, 208, 212);border-left-width:4px;border-left-style:solid;padding-left:16px}`;
25760
25806
 
25761
25807
  const KritzelEngine = class {
25762
25808
  get host() { return getElement(this); }
@@ -25987,6 +26033,7 @@ const KritzelEngine = class {
25987
26033
  if (this.core.store.isDisabled) {
25988
26034
  return;
25989
26035
  }
26036
+ const wasTracked = this.core.store.state.pointers.has(ev.pointerId);
25990
26037
  this.core.store.state.pointers.delete(ev.pointerId);
25991
26038
  if (this.host.hasPointerCapture(ev.pointerId)) {
25992
26039
  this.host.releasePointerCapture(ev.pointerId);
@@ -25995,6 +26042,12 @@ const KritzelEngine = class {
25995
26042
  if (this.core.store.state.pointers.size === 0) {
25996
26043
  this.core.cursorManager.resetToDefault();
25997
26044
  }
26045
+ // If the corresponding pointerdown was never processed (e.g. consumed by a capture-phase
26046
+ // listener like a tooltip close handler), skip tool logic to avoid spurious interactions
26047
+ // such as a selected text object entering edit mode when clicking to dismiss a popup.
26048
+ if (!wasTracked) {
26049
+ return;
26050
+ }
25998
26051
  this.viewport.handlePointerUp(ev);
25999
26052
  this.core.store.state?.activeTool?.handlePointerUp(ev);
26000
26053
  }
@@ -27846,7 +27899,7 @@ const KritzelExport = class {
27846
27899
  return (h("div", { class: "export-tab-content" }, h("kritzel-input", { label: "Filename", value: this.exportFilename, placeholder: "Enter filename", suffix: ".json", onValueChange: this.handleFilenameChange })));
27847
27900
  }
27848
27901
  render() {
27849
- return (h(Host, { key: 'efeea781325e672e3f4c1579a50da1c928dc88b5' }, h("kritzel-dialog", { key: 'c5e60559a3022eec7d13a73b5ec858edb8e7ce1d', isOpen: this.isDialogOpen, dialogTitle: "Export", closable: true, onDialogClose: this.closeDialog }, h("div", { key: '1508001914a22cbb944502be7d33a04128548842', class: "export-content" }, h("kritzel-pill-tabs", { key: '9b0a21140fef986344d98b688729017cb66da493', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport(), h("button", { key: '70021cadab8b2840bbcf66afcd38c28c419facfe', class: "export-primary-button", onClick: this.handleExport }, "Export")))));
27902
+ return (h(Host, { key: '5178e66f75b94697c771e2dc6fe7ce317e21cd1a' }, h("kritzel-dialog", { key: '01aae6955be6828945b20e8a8a4d7c49eb92b2e2', isOpen: this.isDialogOpen, dialogTitle: "Export", closable: true, onDialogClose: this.closeDialog }, h("div", { key: '57c6f6de2917fb51201d737c4d0e1877f5671466', class: "export-content" }, h("kritzel-pill-tabs", { key: '800b8c058078ba1bba06b5edbaf370c4fa3c6806', tabs: this.tabs, value: this.activeTab, onValueChange: this.handleTabChange }), this.activeTab === 'viewport' && this.renderViewportExport(), this.activeTab === 'workspace' && this.renderWorkspaceExport(), h("button", { key: '99fb3b3d8dc42fdb47a3110e8403dde4e508e6cd', class: "export-primary-button", onClick: this.handleExport }, "Export")))));
27850
27903
  }
27851
27904
  };
27852
27905
  KritzelExport.style = kritzelExportCss();
@@ -28143,7 +28196,7 @@ const KritzelLoginDialog = class {
28143
28196
  this.dialogClosed.emit();
28144
28197
  };
28145
28198
  render() {
28146
- return (h(Host, { key: '8cac83db48fef2531f1669c3f601526b1e5cdefa' }, h("kritzel-dialog", { key: '72e0f2eb8e19f3c1081bfd5e1183aa9ed1bc678a', dialogTitle: this.dialogTitle, isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'bb17bcf6f3486000c9056b3983810e016b0f05a3', class: "login-content" }, this.subtitle && (h("p", { key: 'cef17bc6f5078769b8deed6ec1c615a71fe0c611', class: "login-subtitle" }, this.subtitle)), h("div", { key: '8462ef9a62201cb15f8911432ca188cf49bc8a8d', class: "login-providers" }, this.providers.map(provider => (h("button", { key: provider.name, class: {
28199
+ return (h(Host, { key: '1a664868b840030a773f61c2a0f4388dfb014675' }, h("kritzel-dialog", { key: '09ece6fb5949fc8b204f29cd931c583e525590e1', dialogTitle: this.dialogTitle, isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '57218d7762734929691b82700c31922f5a4991c8', class: "login-content" }, this.subtitle && (h("p", { key: '9ee071786f393857cd6a666e395526a139359d60', class: "login-subtitle" }, this.subtitle)), h("div", { key: 'a487687345aabcfb55976437ddc85feb464f0cae', class: "login-providers" }, this.providers.map(provider => (h("button", { key: provider.name, class: {
28147
28200
  'provider-button': true,
28148
28201
  'is-loading': this.loadingProvider === provider.name,
28149
28202
  'is-disabled': this.loadingProvider !== null && this.loadingProvider !== provider.name,
@@ -28511,7 +28564,7 @@ const KritzelMoreMenu = class {
28511
28564
  this.closeMenu();
28512
28565
  };
28513
28566
  render() {
28514
- return (h(Host, { key: '1bf8b30bc9c958911e544121db01d74948fb2695', class: { mobile: this.isTouchDevice } }, h("div", { key: '3aab8140694f15db066f7c46f243ebc29fb698c1', class: { 'more-menu-wrapper': true, visible: this.visible } }, h("button", { key: '55799f62f7bf72af751362315d38dc8b226c0950', class: "more-menu-button", onClick: this.toggleMenu }, h("kritzel-icon", { key: 'ee627acfcad95a1a978fb3c46d428181bbcb98c1', name: this.icon, size: this.iconSize })), h("kritzel-portal", { key: 'e4116b6583e34dd915ffb46ee3b7377ea2ff10e8', anchor: this.menuAnchor, offsetY: this.offsetY, onClose: this.closeMenu }, h("kritzel-menu", { key: 'a9f50ddf822b14bad8723c67a202dcaa257b817a', items: this.visibleItems, onItemSelect: this.handleMenuItemSelect })))));
28567
+ return (h(Host, { key: '0e12ffc8c72566ec92080e6a19bd1d929795bef9', class: { mobile: this.isTouchDevice } }, h("div", { key: 'cc73b51c5aa39522a7ab7ec23d5c0a2732ed7acc', class: { 'more-menu-wrapper': true, visible: this.visible } }, h("button", { key: 'c35b8c7aa56e5e0e2773fed9fbbbead0b6b01a71', class: "more-menu-button", onClick: this.toggleMenu }, h("kritzel-icon", { key: '8b3261da5a10371a17b2562b71fde48dd0ba8ccd', name: this.icon, size: this.iconSize })), h("kritzel-portal", { key: 'be4a42061f27bbca3d435dec8e4dd25fc78febb0', anchor: this.menuAnchor, offsetY: this.offsetY, onClose: this.closeMenu }, h("kritzel-menu", { key: '763043f4d02819097396ce1baa85f398695e38b5', items: this.visibleItems, onItemSelect: this.handleMenuItemSelect })))));
28515
28568
  }
28516
28569
  };
28517
28570
  KritzelMoreMenu.style = kritzelMoreMenuCss();
@@ -29014,7 +29067,7 @@ const KritzelPortal = class {
29014
29067
  * This file is auto-generated by the version bump scripts.
29015
29068
  * Do not modify manually.
29016
29069
  */
29017
- const KRITZEL_VERSION = '0.2.2';
29070
+ const KRITZEL_VERSION = '0.2.4';
29018
29071
 
29019
29072
  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:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}.shortcuts-list{display:flex;flex-direction:column;gap:24px}.shortcuts-category{display:flex;flex-direction:column;gap:8px}.shortcuts-category-title{font-size:14px;font-weight:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.shortcuts-group{display:flex;flex-direction:column;gap:4px}.shortcut-item{display:flex;justify-content:space-between;align-items:center;padding:6px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-item-bg, rgba(0, 0, 0, 0.02))}.shortcut-label{font-size:14px;color:var(--kritzel-settings-content-text-color, #666666)}.shortcut-key{font-family:monospace;font-size:12px;padding:2px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-key-bg, #f0f0f0);color:var(--kritzel-settings-shortcut-key-color, #333333);border:1px solid var(--kritzel-settings-shortcut-key-border, #ddd)}`;
29020
29073
 
@@ -29209,7 +29262,7 @@ const KritzelSettings = class {
29209
29262
  }
29210
29263
  }
29211
29264
  render() {
29212
- return (h(Host, { key: '33618317a3d4a60cda4369cde1e694cd13116d0a' }, h("kritzel-dialog", { key: '274de12d633d430628c1ac2f1ac9779596d0d249', isOpen: this.isDialogOpen, dialogTitle: "Settings", size: "large", onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: 'd771531248ec5db38b2d711334c74dde28985f91', items: SETTINGS_CATEGORIES, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
29265
+ return (h(Host, { key: '78a4eb80f2a4d9e7ef67d06bb39137dbde3a3301' }, h("kritzel-dialog", { key: '1adf437125186758f75dc085db9a4e0c572fccd9', isOpen: this.isDialogOpen, dialogTitle: "Settings", size: "large", onDialogClose: this.closeDialog }, h("kritzel-master-detail", { key: '68ed27f5c9c03589d0444c02ff0524dfcaa053a3', items: SETTINGS_CATEGORIES, selectedItemId: this.selectedCategoryId, onItemSelect: this.handleCategorySelect }, this.renderCategoryContent()))));
29213
29266
  }
29214
29267
  };
29215
29268
  KritzelSettings.style = kritzelSettingsCss();
@@ -29335,9 +29388,9 @@ const KritzelShareDialog = class {
29335
29388
  this.dialogClosed.emit();
29336
29389
  };
29337
29390
  render() {
29338
- return (h(Host, { key: 'a104c14b2492d97f3ada98c9eaaa845d63074063' }, h("kritzel-dialog", { key: 'ae2155436f9dc7530dadfed5da92b2ae8781c3f5', dialogTitle: "Share Workspace", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: 'd419303e63e8183fec99ad2743d5d377c6b2b642', class: "share-content" }, h("div", { key: '913ee65831ff47e6d4d4ba2e26426892bc583827', class: "share-section" }, h("div", { key: 'c32d489e5f7891d23d133c1677c6022e9fc365ab', class: "share-row" }, h("div", { key: '1aa00b5578c657c20910bd1af44d166806d2fe3d', class: "share-label-group" }, h("label", { key: '2d00004314e0d1141397ee7af4e7f923e3182ebf', class: "share-label" }, "Link sharing"), h("p", { key: 'c698ba01de2b252cf6453e0d339044d78c0a701e', class: "share-description" }, this.internalIsPublic
29391
+ return (h(Host, { key: 'bd58f146337b3eca96ca34408a3d30621f01765a' }, h("kritzel-dialog", { key: 'c152f4ec5739a18b265f9a8b161ec8501c1a053b', dialogTitle: "Share Workspace", isOpen: this.isDialogOpen, onDialogClose: this.closeDialog, size: "small" }, h("div", { key: '2810061b1c99e4f4644342453de693e1cddf9a27', class: "share-content" }, h("div", { key: 'bc56de53fd6136c6867018af24019383094cab0d', class: "share-section" }, h("div", { key: '43464ffd61e5a19653cc081e823f01c0eb17e454', class: "share-row" }, h("div", { key: 'ed83ea6684695d09dc6af82b3367fbbff6e4c7e2', class: "share-label-group" }, h("label", { key: 'fe2eaf501dd80ad0b8d83f93a2dcdd18bc093d3b', class: "share-label" }, "Link sharing"), h("p", { key: '738f1a6afc0421380164b9d270920631cefdfd78', class: "share-description" }, this.internalIsPublic
29339
29392
  ? 'Anyone with the link can access this workspace.'
29340
- : 'Link sharing is disabled. Only you can access this workspace.')), h("kritzel-slide-toggle", { key: 'dcc56bf4644c2c56438115b0e9efae7e74ac77d7', checked: this.internalIsPublic, onCheckedChange: this.handleToggleChange, label: "Enable link sharing" }))), this.internalIsPublic && (h("div", { key: '73c72ec32b5fdd74e333594d37aa9601ce274121', class: "share-section" }, h("div", { key: 'f7cf9d1f4c1680ed35c0751df8abf46fbaec2f52', class: "share-url-container" }, h("input", { key: '971c49e294ecf0d95854f54a42b1d45c6bd2c3ae', type: "text", class: "share-url-input", value: this.getShareUrl(), readOnly: true, onClick: (e) => e.target.select() }), h("button", { key: 'ff40fb3e0cc45b5b9d99b0b7f0ff7c3939f7ecb6', class: { 'copy-button': true, 'copy-success': this.copySuccess }, onClick: this.handleCopyUrl, title: this.copySuccess ? 'Copied!' : 'Copy link' }, h("kritzel-icon", { key: 'b299bb0c2a03f5522134f5b3cee5de6cc1d4df5d', name: this.copySuccess ? 'check' : 'copy', size: 18 })))))))));
29393
+ : 'Link sharing is disabled. Only you can access this workspace.')), h("kritzel-slide-toggle", { key: '60f0200ea8f9c207cd5ee76f5a86f82707bb724b', checked: this.internalIsPublic, onCheckedChange: this.handleToggleChange, label: "Enable link sharing" }))), this.internalIsPublic && (h("div", { key: '83212a2a996b85996eee119d5535203f77d3c8dd', class: "share-section" }, h("div", { key: '297031b5aef2018f7aa33c32fd0f8c82f1ddb4cb', class: "share-url-container" }, h("input", { key: '467cca4a8c31b75daa82670f64b562730c241f52', type: "text", class: "share-url-input", value: this.getShareUrl(), readOnly: true, onClick: (e) => e.target.select() }), h("button", { key: 'fdc0f490339cb7050fb020cb1e83e51f6374b183', class: { 'copy-button': true, 'copy-success': this.copySuccess }, onClick: this.handleCopyUrl, title: this.copySuccess ? 'Copied!' : 'Copy link' }, h("kritzel-icon", { key: '5ff1a76d7977c75ea7bc8c339bdf515ba102e511', name: this.copySuccess ? 'check' : 'copy', size: 18 })))))))));
29341
29394
  }
29342
29395
  static get watchers() { return {
29343
29396
  "isPublic": [{
@@ -29885,7 +29938,7 @@ const KritzelUtilityPanel = class {
29885
29938
  this.redo.emit();
29886
29939
  }
29887
29940
  render() {
29888
- return (h(Host, { key: 'b49f6db6c0e574dc8a5a733c749ecda6f24f9d25' }, h("button", { key: 'f65be4fff352b55087f9cb880b9139802b4969e6', class: "utility-button", "data-testid": "utility-undo", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: 'd58906a4f105923237a98fe2e6b16a53dcccc3f6', name: "undo" })), h("button", { key: '2b7cf2235902920d6b18fe76d0ba2d1d70e4b2c8', class: "utility-button", "data-testid": "utility-redo", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: '9588ded274449358024e16e8783d30ef451a3a7c', name: "redo" })), h("div", { key: '6ab6db05e2ec35aa59524c41ccb7b339819c9d14', class: "utility-separator" }), h("button", { key: '0eb06eebbda95cebc4ea932b9ec45b2c06324f80', class: "utility-button", "data-testid": "utility-delete", onClick: () => this.delete.emit() }, h("kritzel-icon", { key: '10b51caad06e0a7489c6ef7155073891edad4b63', name: "delete" }))));
29941
+ return (h(Host, { key: 'f800ea5843cf73ae132b56396ad05d664043f789' }, h("button", { key: 'd5dd4dc6e91c106eced7551c02d5f12a915b1d22', class: "utility-button", "data-testid": "utility-undo", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '64ac3c8f118c991b50dc99e70d4b952fc759c958', name: "undo" })), h("button", { key: '97a8d694fd999eb505fdcdb532d4476ce369e60d', class: "utility-button", "data-testid": "utility-redo", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'ba22d5c6b246967b00112dc2efeb26920187d88f', name: "redo" })), h("div", { key: 'a4aa6a3202640742826d2217f2bbae9ebd2b84da', class: "utility-separator" }), h("button", { key: '1de2a896a6a70c22f9fa16a21af10f07f4b0303a', class: "utility-button", "data-testid": "utility-delete", onClick: () => this.delete.emit() }, h("kritzel-icon", { key: '202612645c1a3e8ee7e4cc01a0305d4e673874e4', name: "delete" }))));
29889
29942
  }
29890
29943
  };
29891
29944
  KritzelUtilityPanel.style = kritzelUtilityPanelCss();
@@ -14489,6 +14489,10 @@ const lightTheme = {
14489
14489
  },
14490
14490
  engine: {
14491
14491
  backgroundColor: '#ffffff',
14492
+ loadingOverlayBackground: 'rgba(255, 255, 255, 0.85)',
14493
+ loadingOverlayColor: '#333333',
14494
+ loadingOverlaySpinnerActiveColor: '#333333',
14495
+ loadingOverlaySpinnerColor: '#cccccc',
14492
14496
  },
14493
14497
  snap: {
14494
14498
  indicatorFill: 'rgba(59, 130, 246, 0.3)',
@@ -14758,6 +14762,10 @@ const darkTheme = {
14758
14762
  },
14759
14763
  engine: {
14760
14764
  backgroundColor: '#1a1a1a',
14765
+ loadingOverlayBackground: 'rgba(26, 26, 26, 0.85)',
14766
+ loadingOverlayColor: '#e0e0e0',
14767
+ loadingOverlaySpinnerActiveColor: '#e0e0e0',
14768
+ loadingOverlaySpinnerColor: '#555555',
14761
14769
  },
14762
14770
  snap: {
14763
14771
  indicatorFill: 'rgba(10, 132, 255, 0.35)',
@@ -19649,6 +19657,7 @@ class KritzelBrushTool extends KritzelBaseTool {
19649
19657
  }
19650
19658
  this._core.store.objects?.setActiveDrawingObject(null);
19651
19659
  this._currentPathId = null;
19660
+ this._core.store.objects?.stopUndoCapturing();
19652
19661
  }
19653
19662
  }
19654
19663
  }
@@ -19665,6 +19674,7 @@ class KritzelBrushTool extends KritzelBaseTool {
19665
19674
  }
19666
19675
  this._core.store.objects?.setActiveDrawingObject(null);
19667
19676
  this._currentPathId = null;
19677
+ this._core.store.objects?.stopUndoCapturing();
19668
19678
  }
19669
19679
  }
19670
19680
  }
@@ -20496,6 +20506,7 @@ class KritzelLineTool extends KritzelBaseTool {
20496
20506
  }
20497
20507
  this._core.store.objects?.setActiveDrawingObject(null);
20498
20508
  this._currentLineId = null;
20509
+ this._core.store.objects?.stopUndoCapturing();
20499
20510
  }
20500
20511
  }
20501
20512
  }
@@ -20514,6 +20525,7 @@ class KritzelLineTool extends KritzelBaseTool {
20514
20525
  }
20515
20526
  this._core.store.objects?.setActiveDrawingObject(null);
20516
20527
  this._currentLineId = null;
20528
+ this._core.store.objects?.stopUndoCapturing();
20517
20529
  }
20518
20530
  }
20519
20531
  }
@@ -20620,17 +20632,24 @@ class KritzelEraserTool extends KritzelBaseTool {
20620
20632
  if (event.pointerType === 'mouse') {
20621
20633
  if (this._core.store.state.isErasing) {
20622
20634
  const objectsToRemove = this._core.store.allObjects.filter(object => object.markedForRemoval);
20623
- objectsToRemove.forEach(object => {
20624
- object.markedForRemoval = false;
20625
- this._core.removeObject(object);
20626
- });
20627
20635
  if (objectsToRemove.length > 0) {
20636
+ // Seal the previous undo step so create+delete of the same object
20637
+ // (e.g. just-drawn shape) don't collapse into a no-op on undo.
20638
+ this._core.store.objects.stopUndoCapturing();
20639
+ // Group all removals from this sweep into a single undo step.
20640
+ this._core.store.objects.transaction(() => {
20641
+ objectsToRemove.forEach(object => {
20642
+ object.markedForRemoval = false;
20643
+ this._core.removeObject(object);
20644
+ });
20645
+ });
20628
20646
  this._core.rerender();
20629
20647
  }
20630
20648
  this._core.store.state.isErasing = false;
20631
20649
  this._core.engine.emitObjectsChange();
20632
20650
  if (objectsToRemove.length > 0) {
20633
20651
  this._core.engine.emitObjectsRemoved(objectsToRemove);
20652
+ this._core.store.objects.stopUndoCapturing();
20634
20653
  }
20635
20654
  }
20636
20655
  }
@@ -20638,17 +20657,24 @@ class KritzelEraserTool extends KritzelBaseTool {
20638
20657
  clearTimeout(this.touchStartTimeout);
20639
20658
  if (this._core.store.state.isErasing) {
20640
20659
  const objectsToRemove = this._core.store.allObjects.filter(object => object.markedForRemoval);
20641
- objectsToRemove.forEach(object => {
20642
- object.markedForRemoval = false;
20643
- this._core.removeObject(object);
20644
- });
20645
20660
  if (objectsToRemove.length > 0) {
20661
+ // Seal the previous undo step so create+delete of the same object
20662
+ // (e.g. just-drawn shape) don't collapse into a no-op on undo.
20663
+ this._core.store.objects.stopUndoCapturing();
20664
+ // Group all removals from this sweep into a single undo step.
20665
+ this._core.store.objects.transaction(() => {
20666
+ objectsToRemove.forEach(object => {
20667
+ object.markedForRemoval = false;
20668
+ this._core.removeObject(object);
20669
+ });
20670
+ });
20646
20671
  this._core.rerender();
20647
20672
  }
20648
20673
  this._core.store.state.isErasing = false;
20649
20674
  this._core.engine.emitObjectsChange();
20650
20675
  if (objectsToRemove.length > 0) {
20651
20676
  this._core.engine.emitObjectsRemoved(objectsToRemove);
20677
+ this._core.store.objects.stopUndoCapturing();
20652
20678
  }
20653
20679
  }
20654
20680
  }
@@ -21253,6 +21279,7 @@ class KritzelShapeTool extends KritzelBaseTool {
21253
21279
  this.isDrawing = false;
21254
21280
  this._core.store.objects?.setActiveDrawingObject(null);
21255
21281
  this.currentShape = null;
21282
+ this._core.store.objects?.stopUndoCapturing();
21256
21283
  this._core.rerender();
21257
21284
  }
21258
21285
  }
@@ -21662,6 +21689,7 @@ class KritzelMoveHandler extends KritzelBaseHandler {
21662
21689
  this._core.store.selectionGroup.update();
21663
21690
  this._core.engine.emitObjectsChange();
21664
21691
  this._core.store.state.hasObjectsChanged = true;
21692
+ this._core.store.objects.stopUndoCapturing();
21665
21693
  }
21666
21694
  }
21667
21695
  }
@@ -21673,6 +21701,7 @@ class KritzelMoveHandler extends KritzelBaseHandler {
21673
21701
  this._core.store.selectionGroup.update();
21674
21702
  this._core.engine.emitObjectsChange();
21675
21703
  this._core.store.state.hasObjectsChanged = true;
21704
+ this._core.store.objects.stopUndoCapturing();
21676
21705
  }
21677
21706
  }
21678
21707
  }
@@ -22025,6 +22054,7 @@ class KritzelResizeHandler extends KritzelBaseHandler {
22025
22054
  this._core.store.selectionGroup.update();
22026
22055
  this._core.engine.emitObjectsChange();
22027
22056
  this._core.store.state.hasObjectsChanged = true;
22057
+ this._core.store.objects.stopUndoCapturing();
22028
22058
  }
22029
22059
  this.reset();
22030
22060
  }
@@ -22036,6 +22066,7 @@ class KritzelResizeHandler extends KritzelBaseHandler {
22036
22066
  this._core.store.selectionGroup.update();
22037
22067
  this._core.engine.emitObjectsChange();
22038
22068
  this._core.store.state.hasObjectsChanged = true;
22069
+ this._core.store.objects.stopUndoCapturing();
22039
22070
  }
22040
22071
  this.reset();
22041
22072
  const timeout = this._core.store.state.longTouchTimeout;
@@ -22187,6 +22218,7 @@ class KritzelRotationHandler extends KritzelBaseHandler {
22187
22218
  this._core.engine.emitObjectsChange();
22188
22219
  this._core.store.state.isRotating = false;
22189
22220
  this._core.store.state.hasObjectsChanged = true;
22221
+ this._core.store.objects.stopUndoCapturing();
22190
22222
  this.reset();
22191
22223
  }
22192
22224
  }
@@ -22196,6 +22228,7 @@ class KritzelRotationHandler extends KritzelBaseHandler {
22196
22228
  this._core.engine.emitObjectsChange();
22197
22229
  this._core.store.state.isRotating = false;
22198
22230
  this._core.store.state.hasObjectsChanged = true;
22231
+ this._core.store.objects.stopUndoCapturing();
22199
22232
  this.reset();
22200
22233
  const timeout = this._core.store.state.longTouchTimeout;
22201
22234
  if (timeout) {
@@ -23213,6 +23246,7 @@ class KritzelLineHandleHandler extends KritzelBaseHandler {
23213
23246
  this._core.engine.emitObjectsChange();
23214
23247
  this._core.store.state.hasObjectsChanged = true;
23215
23248
  }
23249
+ this._core.store.objects.stopUndoCapturing();
23216
23250
  }
23217
23251
  this._core.store.state.isLineHandleDragging = false;
23218
23252
  this.reset();